From 892f054b3fa2a3ee233cd64384f1847029273e48 Mon Sep 17 00:00:00 2001 From: Dillon Varone Date: Fri, 20 Sep 2024 16:56:20 -0400 Subject: [PATCH 0001/2211] drm/amd/display: Configure DTBCLK_P with OPTC only for dcn401 [ Upstream commit 3c6c8d1a1e3f033f1abf84d6d54c268c35b0fcdd ] [WHY] DTBCLK_P is used to generate virtual pixel clock, and to drive the HPO stream encoder clock. Programming the required clock when enabling/disabling both components can cause issues. For example, if HPO is being disabled and clock source is changed to REFCLK, virtual pixel rate will then be wrong, causing issues in CRTC. [HOW] Only program the DTBCLK_P when programming CRTC, as its expected it will be enabled prior to HPO, and disabled after HPO in all valid cases. Reviewed-by: Alvin Lee Signed-off-by: Dillon Varone Signed-off-by: Fangzhi Zuo Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Stable-dep-of: 874697e12793 ("drm/amd/display: Defer BW-optimization-blocked DRR adjustments") Signed-off-by: Sasha Levin --- .../amd/display/dc/dccg/dcn401/dcn401_dccg.c | 3 - .../amd/display/dc/hwss/dcn401/dcn401_hwseq.c | 135 +++++++++++++++++- .../amd/display/dc/hwss/dcn401/dcn401_hwseq.h | 7 + .../amd/display/dc/hwss/dcn401/dcn401_init.c | 4 +- 4 files changed, 142 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c b/drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c index 0b889004509ad..62402c7be0a5e 100644 --- a/drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c +++ b/drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c @@ -580,9 +580,6 @@ static void dccg401_set_dpstreamclk( int otg_inst, int dp_hpo_inst) { - /* set the dtbclk_p source */ - dccg401_set_dtbclk_p_src(dccg, src, otg_inst); - /* enabled to select one of the DTBCLKs for pipe */ if (src == REFCLK) dccg401_disable_dpstreamclk(dccg, dp_hpo_inst); diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c index 62f1e597787e6..b6b333a2461f8 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c @@ -844,6 +844,13 @@ enum dc_status dcn401_enable_stream_timing( odm_slice_width, last_odm_slice_width); } + /* set DTBCLK_P */ + if (dc->res_pool->dccg->funcs->set_dtbclk_p_src) { + if (dc_is_dp_signal(stream->signal) || dc_is_virtual_signal(stream->signal)) { + dc->res_pool->dccg->funcs->set_dtbclk_p_src(dc->res_pool->dccg, DPREFCLK, pipe_ctx->stream_res.tg->inst); + } + } + /* HW program guide assume display already disable * by unplug sequence. OTG assume stop. */ @@ -1007,8 +1014,6 @@ void dcn401_enable_stream(struct pipe_ctx *pipe_ctx) dccg->funcs->enable_symclk32_se(dccg, dp_hpo_inst, phyd32clk); } } else { - /* need to set DTBCLK_P source to DPREFCLK for DP8B10B */ - dccg->funcs->set_dtbclk_p_src(dccg, DPREFCLK, tg->inst); dccg->funcs->enable_symclk_se(dccg, stream_enc->stream_enc_inst, link_enc->transmitter - TRANSMITTER_UNIPHY_A); } @@ -1773,3 +1778,129 @@ void dcn401_program_outstanding_updates(struct dc *dc, if (hubbub->funcs->program_compbuf_segments) hubbub->funcs->program_compbuf_segments(hubbub, context->bw_ctx.bw.dcn.arb_regs.compbuf_size, true); } + +void dcn401_reset_back_end_for_pipe( + struct dc *dc, + struct pipe_ctx *pipe_ctx, + struct dc_state *context) +{ + int i; + struct dc_link *link = pipe_ctx->stream->link; + const struct link_hwss *link_hwss = get_link_hwss(link, &pipe_ctx->link_res); + + DC_LOGGER_INIT(dc->ctx->logger); + if (pipe_ctx->stream_res.stream_enc == NULL) { + pipe_ctx->stream = NULL; + return; + } + + /* DPMS may already disable or */ + /* dpms_off status is incorrect due to fastboot + * feature. When system resume from S4 with second + * screen only, the dpms_off would be true but + * VBIOS lit up eDP, so check link status too. + */ + if (!pipe_ctx->stream->dpms_off || link->link_status.link_active) + dc->link_srv->set_dpms_off(pipe_ctx); + else if (pipe_ctx->stream_res.audio) + dc->hwss.disable_audio_stream(pipe_ctx); + + /* free acquired resources */ + if (pipe_ctx->stream_res.audio) { + /*disable az_endpoint*/ + pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio); + + /*free audio*/ + if (dc->caps.dynamic_audio == true) { + /*we have to dynamic arbitrate the audio endpoints*/ + /*we free the resource, need reset is_audio_acquired*/ + update_audio_usage(&dc->current_state->res_ctx, dc->res_pool, + pipe_ctx->stream_res.audio, false); + pipe_ctx->stream_res.audio = NULL; + } + } + + /* by upper caller loop, parent pipe: pipe0, will be reset last. + * back end share by all pipes and will be disable only when disable + * parent pipe. + */ + if (pipe_ctx->top_pipe == NULL) { + + dc->hwss.set_abm_immediate_disable(pipe_ctx); + + pipe_ctx->stream_res.tg->funcs->disable_crtc(pipe_ctx->stream_res.tg); + + pipe_ctx->stream_res.tg->funcs->enable_optc_clock(pipe_ctx->stream_res.tg, false); + if (pipe_ctx->stream_res.tg->funcs->set_odm_bypass) + pipe_ctx->stream_res.tg->funcs->set_odm_bypass( + pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing); + + if (pipe_ctx->stream_res.tg->funcs->set_drr) + pipe_ctx->stream_res.tg->funcs->set_drr( + pipe_ctx->stream_res.tg, NULL); + /* TODO - convert symclk_ref_cnts for otg to a bit map to solve + * the case where the same symclk is shared across multiple otg + * instances + */ + if (dc_is_hdmi_tmds_signal(pipe_ctx->stream->signal)) + link->phy_state.symclk_ref_cnts.otg = 0; + if (link->phy_state.symclk_state == SYMCLK_ON_TX_OFF) { + link_hwss->disable_link_output(link, + &pipe_ctx->link_res, pipe_ctx->stream->signal); + link->phy_state.symclk_state = SYMCLK_OFF_TX_OFF; + } + + /* reset DTBCLK_P */ + if (dc->res_pool->dccg->funcs->set_dtbclk_p_src) + dc->res_pool->dccg->funcs->set_dtbclk_p_src(dc->res_pool->dccg, REFCLK, pipe_ctx->stream_res.tg->inst); + } + + for (i = 0; i < dc->res_pool->pipe_count; i++) + if (&dc->current_state->res_ctx.pipe_ctx[i] == pipe_ctx) + break; + + if (i == dc->res_pool->pipe_count) + return; + +/* + * In case of a dangling plane, setting this to NULL unconditionally + * causes failures during reset hw ctx where, if stream is NULL, + * it is expected that the pipe_ctx pointers to pipes and plane are NULL. + */ + pipe_ctx->stream = NULL; + DC_LOG_DEBUG("Reset back end for pipe %d, tg:%d\n", + pipe_ctx->pipe_idx, pipe_ctx->stream_res.tg->inst); +} + +void dcn401_reset_hw_ctx_wrap( + struct dc *dc, + struct dc_state *context) +{ + int i; + struct dce_hwseq *hws = dc->hwseq; + + /* Reset Back End*/ + for (i = dc->res_pool->pipe_count - 1; i >= 0 ; i--) { + struct pipe_ctx *pipe_ctx_old = + &dc->current_state->res_ctx.pipe_ctx[i]; + struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; + + if (!pipe_ctx_old->stream) + continue; + + if (pipe_ctx_old->top_pipe || pipe_ctx_old->prev_odm_pipe) + continue; + + if (!pipe_ctx->stream || + pipe_need_reprogram(pipe_ctx_old, pipe_ctx)) { + struct clock_source *old_clk = pipe_ctx_old->clock_source; + + if (hws->funcs.reset_back_end_for_pipe) + hws->funcs.reset_back_end_for_pipe(dc, pipe_ctx_old, dc->current_state); + if (hws->funcs.enable_stream_gating) + hws->funcs.enable_stream_gating(dc, pipe_ctx_old); + if (old_clk) + old_clk->funcs->cs_power_down(old_clk); + } + } +} diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h index a27e62081685d..6256429c8a4f6 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h @@ -84,4 +84,11 @@ void adjust_hotspot_between_slices_for_2x_magnify(uint32_t cursor_width, struct void dcn401_wait_for_det_buffer_update(struct dc *dc, struct dc_state *context, struct pipe_ctx *otg_master); void dcn401_interdependent_update_lock(struct dc *dc, struct dc_state *context, bool lock); void dcn401_program_outstanding_updates(struct dc *dc, struct dc_state *context); +void dcn401_reset_back_end_for_pipe( + struct dc *dc, + struct pipe_ctx *pipe_ctx, + struct dc_state *context); +void dcn401_reset_hw_ctx_wrap( + struct dc *dc, + struct dc_state *context); #endif /* __DC_HWSS_DCN401_H__ */ diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_init.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_init.c index a2ca07235c83d..d6f36b8e1a261 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_init.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_init.c @@ -111,7 +111,7 @@ static const struct hwseq_private_funcs dcn401_private_funcs = { .power_down = dce110_power_down, .enable_display_power_gating = dcn10_dummy_display_power_gating, .blank_pixel_data = dcn20_blank_pixel_data, - .reset_hw_ctx_wrap = dcn20_reset_hw_ctx_wrap, + .reset_hw_ctx_wrap = dcn401_reset_hw_ctx_wrap, .enable_stream_timing = dcn401_enable_stream_timing, .edp_backlight_control = dce110_edp_backlight_control, .setup_vupdate_interrupt = dcn20_setup_vupdate_interrupt, @@ -136,7 +136,7 @@ static const struct hwseq_private_funcs dcn401_private_funcs = { .update_mall_sel = dcn32_update_mall_sel, .calculate_dccg_k1_k2_values = NULL, .apply_single_controller_ctx_to_hw = dce110_apply_single_controller_ctx_to_hw, - .reset_back_end_for_pipe = dcn20_reset_back_end_for_pipe, + .reset_back_end_for_pipe = dcn401_reset_back_end_for_pipe, .populate_mcm_luts = NULL, }; -- GitLab From 839b2350b861faa8a791f5330e366624512213d7 Mon Sep 17 00:00:00 2001 From: Danny Wang Date: Thu, 13 Feb 2025 16:18:34 +0800 Subject: [PATCH 0002/2211] drm/amd/display: Do not enable replay when vtotal update is pending. [ Upstream commit bd00b29b5f236dce677089319176dee5872b5a7a ] [Why&How] Vtotal is not applied to HW when handling vsync interrupt. Make sure vtotal is aligned before enable replay. Reviewed-by: Anthony Koo Reviewed-by: Robin Chen Signed-off-by: Danny Wang Signed-off-by: Zhongwei Zhang Signed-off-by: Tom Chung Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Stable-dep-of: 874697e12793 ("drm/amd/display: Defer BW-optimization-blocked DRR adjustments") Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/core/dc.c | 9 +++++++-- .../gpu/drm/amd/display/dc/core/dc_hw_sequencer.c | 15 +++++++++++++++ drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 1 + .../drm/amd/display/dc/hwss/dce110/dce110_hwseq.c | 7 ++----- .../drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c | 7 ++----- .../drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c | 8 ++------ .../drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.c | 4 +--- .../drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c | 3 +-- .../drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c | 10 +++------- .../gpu/drm/amd/display/dc/hwss/hw_sequencer.h | 6 ++++++ 10 files changed, 40 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index 216b525bd75e7..3392746f1d420 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -452,6 +452,7 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc, if (dc->caps.max_v_total != 0 && (adjust->v_total_max > dc->caps.max_v_total || adjust->v_total_min > dc->caps.max_v_total)) { + stream->adjust.timing_adjust_pending = false; if (adjust->allow_otg_v_count_halt) return set_long_vtotal(dc, stream, adjust); else @@ -465,7 +466,7 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc, dc->hwss.set_drr(&pipe, 1, *adjust); - + stream->adjust.timing_adjust_pending = false; return true; } } @@ -2975,8 +2976,12 @@ static void copy_stream_update_to_stream(struct dc *dc, if (update->vrr_active_fixed) stream->vrr_active_fixed = *update->vrr_active_fixed; - if (update->crtc_timing_adjust) + if (update->crtc_timing_adjust) { + if (stream->adjust.v_total_min != update->crtc_timing_adjust->v_total_min || + stream->adjust.v_total_max != update->crtc_timing_adjust->v_total_max) + stream->adjust.timing_adjust_pending = true; stream->adjust = *update->crtc_timing_adjust; + } if (update->dpms_off) stream->dpms_off = *update->dpms_off; diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c index bb766c2a74176..fdcba960e1e6f 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c @@ -554,6 +554,21 @@ void set_p_state_switch_method( } } +void set_drr_and_clear_adjust_pending( + struct pipe_ctx *pipe_ctx, + struct dc_stream_state *stream, + struct drr_params *params) +{ + /* params can be null.*/ + if (pipe_ctx && pipe_ctx->stream_res.tg && + pipe_ctx->stream_res.tg->funcs->set_drr) + pipe_ctx->stream_res.tg->funcs->set_drr( + pipe_ctx->stream_res.tg, params); + + if (stream) + stream->adjust.timing_adjust_pending = false; +} + void get_fams2_visual_confirm_color( struct dc *dc, struct dc_state *context, diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h index c10567ec1c819..0ded4bc7825b0 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h +++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h @@ -1000,6 +1000,7 @@ struct dc_crtc_timing_adjust { uint32_t v_total_mid; uint32_t v_total_mid_frame_num; uint32_t allow_otg_v_count_halt; + uint8_t timing_adjust_pending; }; diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c index 4fbed0298adfa..1e76524d116dc 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c @@ -1653,9 +1653,7 @@ enum dc_status dce110_apply_single_controller_ctx_to_hw( params.vertical_total_min = stream->adjust.v_total_min; params.vertical_total_max = stream->adjust.v_total_max; - if (pipe_ctx->stream_res.tg->funcs->set_drr) - pipe_ctx->stream_res.tg->funcs->set_drr( - pipe_ctx->stream_res.tg, ¶ms); + set_drr_and_clear_adjust_pending(pipe_ctx, stream, ¶ms); // DRR should set trigger event to monitor surface update event if (stream->adjust.v_total_min != 0 && stream->adjust.v_total_max != 0) @@ -2103,8 +2101,7 @@ static void set_drr(struct pipe_ctx **pipe_ctx, struct timing_generator *tg = pipe_ctx[i]->stream_res.tg; if ((tg != NULL) && tg->funcs) { - if (tg->funcs->set_drr) - tg->funcs->set_drr(tg, ¶ms); + set_drr_and_clear_adjust_pending(pipe_ctx[i], pipe_ctx[i]->stream, ¶ms); if (adjust.v_total_max != 0 && adjust.v_total_min != 0) if (tg->funcs->set_static_screen_control) tg->funcs->set_static_screen_control( diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c index d725af14af371..00be0b26689d3 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c @@ -1112,9 +1112,7 @@ static void dcn10_reset_back_end_for_pipe( pipe_ctx->stream_res.tg->funcs->disable_crtc(pipe_ctx->stream_res.tg); pipe_ctx->stream_res.tg->funcs->enable_optc_clock(pipe_ctx->stream_res.tg, false); - if (pipe_ctx->stream_res.tg->funcs->set_drr) - pipe_ctx->stream_res.tg->funcs->set_drr( - pipe_ctx->stream_res.tg, NULL); + set_drr_and_clear_adjust_pending(pipe_ctx, pipe_ctx->stream, NULL); if (dc_is_hdmi_tmds_signal(pipe_ctx->stream->signal)) pipe_ctx->stream->link->phy_state.symclk_ref_cnts.otg = 0; } @@ -3217,8 +3215,7 @@ void dcn10_set_drr(struct pipe_ctx **pipe_ctx, struct timing_generator *tg = pipe_ctx[i]->stream_res.tg; if ((tg != NULL) && tg->funcs) { - if (tg->funcs->set_drr) - tg->funcs->set_drr(tg, ¶ms); + set_drr_and_clear_adjust_pending(pipe_ctx[i], pipe_ctx[i]->stream, ¶ms); if (adjust.v_total_max != 0 && adjust.v_total_min != 0) if (tg->funcs->set_static_screen_control) tg->funcs->set_static_screen_control( diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c index f5f1ccd8303cf..9c5cdb3b80b5d 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c @@ -952,9 +952,7 @@ enum dc_status dcn20_enable_stream_timing( params.vertical_total_max = stream->adjust.v_total_max; params.vertical_total_mid = stream->adjust.v_total_mid; params.vertical_total_mid_frame_num = stream->adjust.v_total_mid_frame_num; - if (pipe_ctx->stream_res.tg->funcs->set_drr) - pipe_ctx->stream_res.tg->funcs->set_drr( - pipe_ctx->stream_res.tg, ¶ms); + set_drr_and_clear_adjust_pending(pipe_ctx, stream, ¶ms); // DRR should set trigger event to monitor surface update event if (stream->adjust.v_total_min != 0 && stream->adjust.v_total_max != 0) @@ -2822,9 +2820,7 @@ void dcn20_reset_back_end_for_pipe( pipe_ctx->stream_res.tg->funcs->set_odm_bypass( pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing); - if (pipe_ctx->stream_res.tg->funcs->set_drr) - pipe_ctx->stream_res.tg->funcs->set_drr( - pipe_ctx->stream_res.tg, NULL); + set_drr_and_clear_adjust_pending(pipe_ctx, pipe_ctx->stream, NULL); /* TODO - convert symclk_ref_cnts for otg to a bit map to solve * the case where the same symclk is shared across multiple otg * instances diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.c index 3d4b31bd99469..9aa925a0b3b43 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.c @@ -528,9 +528,7 @@ static void dcn31_reset_back_end_for_pipe( if (dc_is_hdmi_tmds_signal(pipe_ctx->stream->signal)) pipe_ctx->stream->link->phy_state.symclk_ref_cnts.otg = 0; - if (pipe_ctx->stream_res.tg->funcs->set_drr) - pipe_ctx->stream_res.tg->funcs->set_drr( - pipe_ctx->stream_res.tg, NULL); + set_drr_and_clear_adjust_pending(pipe_ctx, pipe_ctx->stream, NULL); link = pipe_ctx->stream->link; /* DPMS may already disable or */ diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c index 38755ca771401..ca446e08f6a27 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c @@ -1452,8 +1452,7 @@ void dcn35_set_drr(struct pipe_ctx **pipe_ctx, num_frames = 2 * (frame_rate % 60); } } - if (tg->funcs->set_drr) - tg->funcs->set_drr(tg, ¶ms); + set_drr_and_clear_adjust_pending(pipe_ctx[i], pipe_ctx[i]->stream, ¶ms); if (adjust.v_total_max != 0 && adjust.v_total_min != 0) if (tg->funcs->set_static_screen_control) tg->funcs->set_static_screen_control( diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c index b6b333a2461f8..3279f347660cb 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c @@ -902,10 +902,7 @@ enum dc_status dcn401_enable_stream_timing( } hws->funcs.wait_for_blank_complete(pipe_ctx->stream_res.opp); - - if (pipe_ctx->stream_res.tg->funcs->set_drr) - pipe_ctx->stream_res.tg->funcs->set_drr( - pipe_ctx->stream_res.tg, ¶ms); + set_drr_and_clear_adjust_pending(pipe_ctx, stream, ¶ms); /* Event triggers and num frames initialized for DRR, but can be * later updated for PSR use. Note DRR trigger events are generated @@ -1835,9 +1832,8 @@ void dcn401_reset_back_end_for_pipe( pipe_ctx->stream_res.tg->funcs->set_odm_bypass( pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing); - if (pipe_ctx->stream_res.tg->funcs->set_drr) - pipe_ctx->stream_res.tg->funcs->set_drr( - pipe_ctx->stream_res.tg, NULL); + set_drr_and_clear_adjust_pending(pipe_ctx, pipe_ctx->stream, NULL); + /* TODO - convert symclk_ref_cnts for otg to a bit map to solve * the case where the same symclk is shared across multiple otg * instances diff --git a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h index ac92056256233..9ae6259f2db17 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h +++ b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h @@ -46,6 +46,7 @@ struct dce_hwseq; struct link_resource; struct dc_dmub_cmd; struct pg_block_update; +struct drr_params; struct subvp_pipe_control_lock_fast_params { struct dc *dc; @@ -509,6 +510,11 @@ void set_p_state_switch_method( struct dc_state *context, struct pipe_ctx *pipe_ctx); +void set_drr_and_clear_adjust_pending( + struct pipe_ctx *pipe_ctx, + struct dc_stream_state *stream, + struct drr_params *params); + void hwss_execute_sequence(struct dc *dc, struct block_sequence block_sequence[], int num_steps); -- GitLab From 5f05863810cfd6df3704d91ad6d6e32a39be3211 Mon Sep 17 00:00:00 2001 From: Zhongwei Zhang Date: Fri, 28 Feb 2025 10:35:23 +0800 Subject: [PATCH 0003/2211] drm/amd/display: Correct timing_adjust_pending flag setting. [ Upstream commit 34935701b7ed1a1ef449310ba041f10964b23cf4 ] [Why&How] stream->adjust will be overwritten by update->crtc_timing_adjust. We should set update->crtc_timing_adjust->timing_adjust_pending and then overwrite stream->adjust. Reset update->crtc_timing_adjust->timing_adjust_pending after the assignment. Reviewed-by: Charlene Liu Signed-off-by: Zhongwei Zhang Signed-off-by: Tom Chung Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Stable-dep-of: 874697e12793 ("drm/amd/display: Defer BW-optimization-blocked DRR adjustments") Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/core/dc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index 3392746f1d420..a76e6fc3fef78 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -2979,8 +2979,9 @@ static void copy_stream_update_to_stream(struct dc *dc, if (update->crtc_timing_adjust) { if (stream->adjust.v_total_min != update->crtc_timing_adjust->v_total_min || stream->adjust.v_total_max != update->crtc_timing_adjust->v_total_max) - stream->adjust.timing_adjust_pending = true; + update->crtc_timing_adjust->timing_adjust_pending = true; stream->adjust = *update->crtc_timing_adjust; + update->crtc_timing_adjust->timing_adjust_pending = false; } if (update->dpms_off) -- GitLab From 4fa55c5230f4c93e385c5a078486ac8a67b2adf2 Mon Sep 17 00:00:00 2001 From: John Olender Date: Wed, 16 Apr 2025 02:54:26 -0400 Subject: [PATCH 0004/2211] drm/amd/display: Defer BW-optimization-blocked DRR adjustments [ Upstream commit 874697e127931bf50a37ce9d96ee80f3a08a0c38 ] [Why & How] Instead of dropping DRR updates, defer them. This fixes issues where monitor continues to see incorrect refresh rate after VRR was turned off by userspace. Fixes: 32953485c558 ("drm/amd/display: Do not update DRR while BW optimizations pending") Link: https://gitlab.freedesktop.org/drm/amd/-/issues/3546 Reviewed-by: Sun peng Li Signed-off-by: John Olender Signed-off-by: Aurabindo Pillai Signed-off-by: Ray Wu Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher (cherry picked from commit 53761b7ecd83e6fbb9f2206f8c980a6aa308c844) Cc: stable@vger.kernel.org Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 ++ drivers/gpu/drm/amd/display/dc/core/dc.c | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index ff33760aa4fae..17c03b89abb31 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -365,6 +365,8 @@ get_crtc_by_otg_inst(struct amdgpu_device *adev, static inline bool is_dc_timing_adjust_needed(struct dm_crtc_state *old_state, struct dm_crtc_state *new_state) { + if (new_state->stream->adjust.timing_adjust_pending) + return true; if (new_state->freesync_config.state == VRR_STATE_ACTIVE_FIXED) return true; else if (amdgpu_dm_crtc_vrr_active(old_state) != amdgpu_dm_crtc_vrr_active(new_state)) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index a76e6fc3fef78..dd4b131fac6cb 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -438,9 +438,12 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc, * Don't adjust DRR while there's bandwidth optimizations pending to * avoid conflicting with firmware updates. */ - if (dc->ctx->dce_version > DCE_VERSION_MAX) - if (dc->optimized_required || dc->wm_optimized_required) + if (dc->ctx->dce_version > DCE_VERSION_MAX) { + if (dc->optimized_required || dc->wm_optimized_required) { + stream->adjust.timing_adjust_pending = true; return false; + } + } dc_exit_ips_for_hw_access(dc); @@ -2978,7 +2981,8 @@ static void copy_stream_update_to_stream(struct dc *dc, if (update->crtc_timing_adjust) { if (stream->adjust.v_total_min != update->crtc_timing_adjust->v_total_min || - stream->adjust.v_total_max != update->crtc_timing_adjust->v_total_max) + stream->adjust.v_total_max != update->crtc_timing_adjust->v_total_max || + stream->adjust.timing_adjust_pending) update->crtc_timing_adjust->timing_adjust_pending = true; stream->adjust = *update->crtc_timing_adjust; update->crtc_timing_adjust->timing_adjust_pending = false; -- GitLab From 0d1002c60cd47fe84cfed9d5724286c114520fb6 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Wed, 25 Sep 2024 15:44:19 +0300 Subject: [PATCH 0005/2211] i2c: designware: Use temporary variable for struct device [ Upstream commit d2f94dccab8319063dd1fbc1738b4a280c2e4009 ] Use temporary variable for struct device to make code neater. Reviewed-by: Mario Limonciello Reviewed-by: Andi Shyti Signed-off-by: Andy Shevchenko Acked-by: Jarkko Nikula Signed-off-by: Andi Shyti Stable-dep-of: 1cfe51ef07ca ("i2c: designware: Fix an error handling path in i2c_dw_pci_probe()") Signed-off-by: Sasha Levin --- drivers/i2c/busses/i2c-designware-pcidrv.c | 29 ++++++------- drivers/i2c/busses/i2c-designware-platdrv.c | 48 ++++++++++----------- 2 files changed, 37 insertions(+), 40 deletions(-) diff --git a/drivers/i2c/busses/i2c-designware-pcidrv.c b/drivers/i2c/busses/i2c-designware-pcidrv.c index 7b2c5d71a7fce..433cb285d3b20 100644 --- a/drivers/i2c/busses/i2c-designware-pcidrv.c +++ b/drivers/i2c/busses/i2c-designware-pcidrv.c @@ -207,6 +207,7 @@ static const struct software_node dgpu_node = { static int i2c_dw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { + struct device *device = &pdev->dev; struct dw_i2c_dev *dev; struct i2c_adapter *adap; int r; @@ -214,25 +215,22 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev, struct dw_scl_sda_cfg *cfg; if (id->driver_data >= ARRAY_SIZE(dw_pci_controllers)) - return dev_err_probe(&pdev->dev, -EINVAL, - "Invalid driver data %ld\n", + return dev_err_probe(device, -EINVAL, "Invalid driver data %ld\n", id->driver_data); controller = &dw_pci_controllers[id->driver_data]; r = pcim_enable_device(pdev); if (r) - return dev_err_probe(&pdev->dev, r, - "Failed to enable I2C PCI device\n"); + return dev_err_probe(device, r, "Failed to enable I2C PCI device\n"); pci_set_master(pdev); r = pcim_iomap_regions(pdev, 1 << 0, pci_name(pdev)); if (r) - return dev_err_probe(&pdev->dev, r, - "I/O memory remapping failed\n"); + return dev_err_probe(device, r, "I/O memory remapping failed\n"); - dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); + dev = devm_kzalloc(device, sizeof(*dev), GFP_KERNEL); if (!dev) return -ENOMEM; @@ -242,7 +240,7 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev, dev->get_clk_rate_khz = controller->get_clk_rate_khz; dev->base = pcim_iomap_table(pdev)[0]; - dev->dev = &pdev->dev; + dev->dev = device; dev->irq = pci_irq_vector(pdev, 0); dev->flags |= controller->flags; @@ -281,14 +279,14 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev, if ((dev->flags & MODEL_MASK) == MODEL_AMD_NAVI_GPU) { dev->slave = i2c_new_ccgx_ucsi(&dev->adapter, dev->irq, &dgpu_node); if (IS_ERR(dev->slave)) - return dev_err_probe(dev->dev, PTR_ERR(dev->slave), + return dev_err_probe(device, PTR_ERR(dev->slave), "register UCSI failed\n"); } - pm_runtime_set_autosuspend_delay(&pdev->dev, 1000); - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_put_autosuspend(&pdev->dev); - pm_runtime_allow(&pdev->dev); + pm_runtime_set_autosuspend_delay(device, 1000); + pm_runtime_use_autosuspend(device); + pm_runtime_put_autosuspend(device); + pm_runtime_allow(device); return 0; } @@ -296,11 +294,12 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev, static void i2c_dw_pci_remove(struct pci_dev *pdev) { struct dw_i2c_dev *dev = pci_get_drvdata(pdev); + struct device *device = &pdev->dev; i2c_dw_disable(dev); - pm_runtime_forbid(&pdev->dev); - pm_runtime_get_noresume(&pdev->dev); + pm_runtime_forbid(device); + pm_runtime_get_noresume(device); i2c_del_adapter(&dev->adapter); } diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index 2d0c7348e4917..a3e86930bf418 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c @@ -205,6 +205,7 @@ static void i2c_dw_remove_lock_support(struct dw_i2c_dev *dev) static int dw_i2c_plat_probe(struct platform_device *pdev) { + struct device *device = &pdev->dev; struct i2c_adapter *adap; struct dw_i2c_dev *dev; int irq, ret; @@ -213,15 +214,15 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) if (irq < 0) return irq; - dev = devm_kzalloc(&pdev->dev, sizeof(struct dw_i2c_dev), GFP_KERNEL); + dev = devm_kzalloc(device, sizeof(*dev), GFP_KERNEL); if (!dev) return -ENOMEM; - dev->flags = (uintptr_t)device_get_match_data(&pdev->dev); - if (device_property_present(&pdev->dev, "wx,i2c-snps-model")) + dev->flags = (uintptr_t)device_get_match_data(device); + if (device_property_present(device, "wx,i2c-snps-model")) dev->flags = MODEL_WANGXUN_SP | ACCESS_POLLING; - dev->dev = &pdev->dev; + dev->dev = device; dev->irq = irq; platform_set_drvdata(pdev, dev); @@ -229,7 +230,7 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) if (ret) return ret; - dev->rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL); + dev->rst = devm_reset_control_get_optional_exclusive(device, NULL); if (IS_ERR(dev->rst)) return PTR_ERR(dev->rst); @@ -246,13 +247,13 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) i2c_dw_configure(dev); /* Optional interface clock */ - dev->pclk = devm_clk_get_optional(&pdev->dev, "pclk"); + dev->pclk = devm_clk_get_optional(device, "pclk"); if (IS_ERR(dev->pclk)) { ret = PTR_ERR(dev->pclk); goto exit_reset; } - dev->clk = devm_clk_get_optional(&pdev->dev, NULL); + dev->clk = devm_clk_get_optional(device, NULL); if (IS_ERR(dev->clk)) { ret = PTR_ERR(dev->clk); goto exit_reset; @@ -280,28 +281,24 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) I2C_CLASS_HWMON : I2C_CLASS_DEPRECATED; adap->nr = -1; - if (dev->flags & ACCESS_NO_IRQ_SUSPEND) { - dev_pm_set_driver_flags(&pdev->dev, - DPM_FLAG_SMART_PREPARE); - } else { - dev_pm_set_driver_flags(&pdev->dev, - DPM_FLAG_SMART_PREPARE | - DPM_FLAG_SMART_SUSPEND); - } + if (dev->flags & ACCESS_NO_IRQ_SUSPEND) + dev_pm_set_driver_flags(device, DPM_FLAG_SMART_PREPARE); + else + dev_pm_set_driver_flags(device, DPM_FLAG_SMART_PREPARE | DPM_FLAG_SMART_SUSPEND); - device_enable_async_suspend(&pdev->dev); + device_enable_async_suspend(device); /* The code below assumes runtime PM to be disabled. */ - WARN_ON(pm_runtime_enabled(&pdev->dev)); + WARN_ON(pm_runtime_enabled(device)); - pm_runtime_set_autosuspend_delay(&pdev->dev, 1000); - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_active(&pdev->dev); + pm_runtime_set_autosuspend_delay(device, 1000); + pm_runtime_use_autosuspend(device); + pm_runtime_set_active(device); if (dev->shared_with_punit) - pm_runtime_get_noresume(&pdev->dev); + pm_runtime_get_noresume(device); - pm_runtime_enable(&pdev->dev); + pm_runtime_enable(device); ret = i2c_dw_probe(dev); if (ret) @@ -319,15 +316,16 @@ exit_reset: static void dw_i2c_plat_remove(struct platform_device *pdev) { struct dw_i2c_dev *dev = platform_get_drvdata(pdev); + struct device *device = &pdev->dev; - pm_runtime_get_sync(&pdev->dev); + pm_runtime_get_sync(device); i2c_del_adapter(&dev->adapter); i2c_dw_disable(dev); - pm_runtime_dont_use_autosuspend(&pdev->dev); - pm_runtime_put_sync(&pdev->dev); + pm_runtime_dont_use_autosuspend(device); + pm_runtime_put_sync(device); dw_i2c_plat_pm_cleanup(dev); i2c_dw_remove_lock_support(dev); -- GitLab From 0abae7dc42f2189a97a1f751e2a44d7b8e5d588d Mon Sep 17 00:00:00 2001 From: Christophe JAILLET Date: Tue, 13 May 2025 19:56:41 +0200 Subject: [PATCH 0006/2211] i2c: designware: Fix an error handling path in i2c_dw_pci_probe() [ Upstream commit 1cfe51ef07ca3286581d612debfb0430eeccbb65 ] If navi_amd_register_client() fails, the previous i2c_dw_probe() call should be undone by a corresponding i2c_del_adapter() call, as already done in the remove function. Fixes: 17631e8ca2d3 ("i2c: designware: Add driver support for AMD NAVI GPU") Signed-off-by: Christophe JAILLET Cc: # v5.13+ Acked-by: Jarkko Nikula Signed-off-by: Andi Shyti Link: https://lore.kernel.org/r/fcd9651835a32979df8802b2db9504c523a8ebbb.1747158983.git.christophe.jaillet@wanadoo.fr Signed-off-by: Sasha Levin --- drivers/i2c/busses/i2c-designware-pcidrv.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-designware-pcidrv.c b/drivers/i2c/busses/i2c-designware-pcidrv.c index 433cb285d3b20..5ea6d40373e7e 100644 --- a/drivers/i2c/busses/i2c-designware-pcidrv.c +++ b/drivers/i2c/busses/i2c-designware-pcidrv.c @@ -278,9 +278,11 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev, if ((dev->flags & MODEL_MASK) == MODEL_AMD_NAVI_GPU) { dev->slave = i2c_new_ccgx_ucsi(&dev->adapter, dev->irq, &dgpu_node); - if (IS_ERR(dev->slave)) + if (IS_ERR(dev->slave)) { + i2c_del_adapter(&dev->adapter); return dev_err_probe(device, PTR_ERR(dev->slave), "register UCSI failed\n"); + } } pm_runtime_set_autosuspend_delay(device, 1000); -- GitLab From 64cf5b896fd39212f33715839f6d62e420c74548 Mon Sep 17 00:00:00 2001 From: Claudiu Beznea Date: Wed, 7 May 2025 15:50:29 +0300 Subject: [PATCH 0007/2211] phy: renesas: rcar-gen3-usb2: Move IRQ request in probe [ Upstream commit de76809f60cc938d3580bbbd5b04b7d12af6ce3a ] Commit 08b0ad375ca6 ("phy: renesas: rcar-gen3-usb2: move IRQ registration to init") moved the IRQ request operation from probe to struct phy_ops::phy_init API to avoid triggering interrupts (which lead to register accesses) while the PHY clocks (enabled through runtime PM APIs) are not active. If this happens, it results in a synchronous abort. One way to reproduce this issue is by enabling CONFIG_DEBUG_SHIRQ, which calls free_irq() on driver removal. Move the IRQ request and free operations back to probe, and take the runtime PM state into account in IRQ handler. This commit is preparatory for the subsequent fixes in this series. Reviewed-by: Yoshihiro Shimoda Tested-by: Yoshihiro Shimoda Reviewed-by: Lad Prabhakar Signed-off-by: Claudiu Beznea Link: https://lore.kernel.org/r/20250507125032.565017-3-claudiu.beznea.uj@bp.renesas.com Signed-off-by: Vinod Koul Stable-dep-of: 9ce71e85b29e ("phy: renesas: rcar-gen3-usb2: Assert PLL reset on PHY power off") Signed-off-by: Sasha Levin --- drivers/phy/renesas/phy-rcar-gen3-usb2.c | 46 +++++++++++++----------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/drivers/phy/renesas/phy-rcar-gen3-usb2.c b/drivers/phy/renesas/phy-rcar-gen3-usb2.c index 513fd35dcaa95..4cd1b6e677482 100644 --- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c +++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c @@ -120,7 +120,6 @@ struct rcar_gen3_chan { struct work_struct work; struct mutex lock; /* protects rphys[...].powered */ enum usb_dr_mode dr_mode; - int irq; u32 obint_enable_bits; bool extcon_host; bool is_otg_channel; @@ -428,16 +427,25 @@ static irqreturn_t rcar_gen3_phy_usb2_irq(int irq, void *_ch) { struct rcar_gen3_chan *ch = _ch; void __iomem *usb2_base = ch->base; - u32 status = readl(usb2_base + USB2_OBINTSTA); + struct device *dev = ch->dev; irqreturn_t ret = IRQ_NONE; + u32 status; + pm_runtime_get_noresume(dev); + + if (pm_runtime_suspended(dev)) + goto rpm_put; + + status = readl(usb2_base + USB2_OBINTSTA); if (status & ch->obint_enable_bits) { - dev_vdbg(ch->dev, "%s: %08x\n", __func__, status); + dev_vdbg(dev, "%s: %08x\n", __func__, status); writel(ch->obint_enable_bits, usb2_base + USB2_OBINTSTA); rcar_gen3_device_recognition(ch); ret = IRQ_HANDLED; } +rpm_put: + pm_runtime_put_noidle(dev); return ret; } @@ -447,17 +455,6 @@ static int rcar_gen3_phy_usb2_init(struct phy *p) struct rcar_gen3_chan *channel = rphy->ch; void __iomem *usb2_base = channel->base; u32 val; - int ret; - - if (!rcar_gen3_is_any_rphy_initialized(channel) && channel->irq >= 0) { - INIT_WORK(&channel->work, rcar_gen3_phy_usb2_work); - ret = request_irq(channel->irq, rcar_gen3_phy_usb2_irq, - IRQF_SHARED, dev_name(channel->dev), channel); - if (ret < 0) { - dev_err(channel->dev, "No irq handler (%d)\n", channel->irq); - return ret; - } - } /* Initialize USB2 part */ val = readl(usb2_base + USB2_INT_ENABLE); @@ -493,9 +490,6 @@ static int rcar_gen3_phy_usb2_exit(struct phy *p) val &= ~USB2_INT_ENABLE_UCOM_INTEN; writel(val, usb2_base + USB2_INT_ENABLE); - if (channel->irq >= 0 && !rcar_gen3_is_any_rphy_initialized(channel)) - free_irq(channel->irq, channel); - return 0; } @@ -701,7 +695,7 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct rcar_gen3_chan *channel; struct phy_provider *provider; - int ret = 0, i; + int ret = 0, i, irq; if (!dev->of_node) { dev_err(dev, "This driver needs device tree\n"); @@ -717,8 +711,6 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev) return PTR_ERR(channel->base); channel->obint_enable_bits = USB2_OBINT_BITS; - /* get irq number here and request_irq for OTG in phy_init */ - channel->irq = platform_get_irq_optional(pdev, 0); channel->dr_mode = rcar_gen3_get_dr_mode(dev->of_node); if (channel->dr_mode != USB_DR_MODE_UNKNOWN) { channel->is_otg_channel = true; @@ -787,6 +779,20 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev) channel->vbus = NULL; } + irq = platform_get_irq_optional(pdev, 0); + if (irq < 0 && irq != -ENXIO) { + ret = irq; + goto error; + } else if (irq > 0) { + INIT_WORK(&channel->work, rcar_gen3_phy_usb2_work); + ret = devm_request_irq(dev, irq, rcar_gen3_phy_usb2_irq, + IRQF_SHARED, dev_name(dev), channel); + if (ret < 0) { + dev_err(dev, "Failed to request irq (%d)\n", irq); + goto error; + } + } + provider = devm_of_phy_provider_register(dev, rcar_gen3_phy_usb2_xlate); if (IS_ERR(provider)) { dev_err(dev, "Failed to register PHY provider\n"); -- GitLab From 918d43686271ed94af6d67706ee7775d952a04e0 Mon Sep 17 00:00:00 2001 From: Claudiu Beznea Date: Wed, 7 May 2025 15:50:30 +0300 Subject: [PATCH 0008/2211] phy: renesas: rcar-gen3-usb2: Lock around hardware registers and driver data [ Upstream commit 55a387ebb9219cbe4edfa8ba9996ccb0e7ad4932 ] The phy-rcar-gen3-usb2 driver exposes four individual PHYs that are requested and configured by PHY users. The struct phy_ops APIs access the same set of registers to configure all PHYs. Additionally, PHY settings can be modified through sysfs or an IRQ handler. While some struct phy_ops APIs are protected by a driver-wide mutex, others rely on individual PHY-specific mutexes. This approach can lead to various issues, including: 1/ the IRQ handler may interrupt PHY settings in progress, racing with hardware configuration protected by a mutex lock 2/ due to msleep(20) in rcar_gen3_init_otg(), while a configuration thread suspends to wait for the delay, another thread may try to configure another PHY (with phy_init() + phy_power_on()); re-running the phy_init() goes to the exact same configuration code, re-running the same hardware configuration on the same set of registers (and bits) which might impact the result of the msleep for the 1st configuring thread 3/ sysfs can configure the hardware (though role_store()) and it can still race with the phy_init()/phy_power_on() APIs calling into the drivers struct phy_ops To address these issues, add a spinlock to protect hardware register access and driver private data structures (e.g., calls to rcar_gen3_is_any_rphy_initialized()). Checking driver-specific data remains necessary as all PHY instances share common settings. With this change, the existing mutex protection is removed and the cleanup.h helpers are used. While at it, to keep the code simpler, do not skip regulator_enable()/regulator_disable() APIs in rcar_gen3_phy_usb2_power_on()/rcar_gen3_phy_usb2_power_off() as the regulators enable/disable operations are reference counted anyway. Fixes: f3b5a8d9b50d ("phy: rcar-gen3-usb2: Add R-Car Gen3 USB2 PHY driver") Cc: stable@vger.kernel.org Reviewed-by: Yoshihiro Shimoda Tested-by: Yoshihiro Shimoda Reviewed-by: Lad Prabhakar Signed-off-by: Claudiu Beznea Link: https://lore.kernel.org/r/20250507125032.565017-4-claudiu.beznea.uj@bp.renesas.com Signed-off-by: Vinod Koul Stable-dep-of: 9ce71e85b29e ("phy: renesas: rcar-gen3-usb2: Assert PLL reset on PHY power off") Signed-off-by: Sasha Levin --- drivers/phy/renesas/phy-rcar-gen3-usb2.c | 49 +++++++++++++----------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/drivers/phy/renesas/phy-rcar-gen3-usb2.c b/drivers/phy/renesas/phy-rcar-gen3-usb2.c index 4cd1b6e677482..188e903445aeb 100644 --- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c +++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c @@ -9,6 +9,7 @@ * Copyright (C) 2014 Cogent Embedded, Inc. */ +#include #include #include #include @@ -118,7 +119,7 @@ struct rcar_gen3_chan { struct regulator *vbus; struct reset_control *rstc; struct work_struct work; - struct mutex lock; /* protects rphys[...].powered */ + spinlock_t lock; /* protects access to hardware and driver data structure. */ enum usb_dr_mode dr_mode; u32 obint_enable_bits; bool extcon_host; @@ -348,6 +349,8 @@ static ssize_t role_store(struct device *dev, struct device_attribute *attr, bool is_b_device; enum phy_mode cur_mode, new_mode; + guard(spinlock_irqsave)(&ch->lock); + if (!ch->is_otg_channel || !rcar_gen3_is_any_otg_rphy_initialized(ch)) return -EIO; @@ -415,7 +418,7 @@ static void rcar_gen3_init_otg(struct rcar_gen3_chan *ch) val = readl(usb2_base + USB2_ADPCTRL); writel(val | USB2_ADPCTRL_IDPULLUP, usb2_base + USB2_ADPCTRL); } - msleep(20); + mdelay(20); writel(0xffffffff, usb2_base + USB2_OBINTSTA); writel(ch->obint_enable_bits, usb2_base + USB2_OBINTEN); @@ -436,12 +439,14 @@ static irqreturn_t rcar_gen3_phy_usb2_irq(int irq, void *_ch) if (pm_runtime_suspended(dev)) goto rpm_put; - status = readl(usb2_base + USB2_OBINTSTA); - if (status & ch->obint_enable_bits) { - dev_vdbg(dev, "%s: %08x\n", __func__, status); - writel(ch->obint_enable_bits, usb2_base + USB2_OBINTSTA); - rcar_gen3_device_recognition(ch); - ret = IRQ_HANDLED; + scoped_guard(spinlock, &ch->lock) { + status = readl(usb2_base + USB2_OBINTSTA); + if (status & ch->obint_enable_bits) { + dev_vdbg(dev, "%s: %08x\n", __func__, status); + writel(ch->obint_enable_bits, usb2_base + USB2_OBINTSTA); + rcar_gen3_device_recognition(ch); + ret = IRQ_HANDLED; + } } rpm_put: @@ -456,6 +461,8 @@ static int rcar_gen3_phy_usb2_init(struct phy *p) void __iomem *usb2_base = channel->base; u32 val; + guard(spinlock_irqsave)(&channel->lock); + /* Initialize USB2 part */ val = readl(usb2_base + USB2_INT_ENABLE); val |= USB2_INT_ENABLE_UCOM_INTEN | rphy->int_enable_bits; @@ -482,6 +489,8 @@ static int rcar_gen3_phy_usb2_exit(struct phy *p) void __iomem *usb2_base = channel->base; u32 val; + guard(spinlock_irqsave)(&channel->lock); + rphy->initialized = false; val = readl(usb2_base + USB2_INT_ENABLE); @@ -501,16 +510,17 @@ static int rcar_gen3_phy_usb2_power_on(struct phy *p) u32 val; int ret = 0; - mutex_lock(&channel->lock); - if (!rcar_gen3_are_all_rphys_power_off(channel)) - goto out; - if (channel->vbus) { ret = regulator_enable(channel->vbus); if (ret) - goto out; + return ret; } + guard(spinlock_irqsave)(&channel->lock); + + if (!rcar_gen3_are_all_rphys_power_off(channel)) + goto out; + val = readl(usb2_base + USB2_USBCTR); val |= USB2_USBCTR_PLL_RST; writel(val, usb2_base + USB2_USBCTR); @@ -520,7 +530,6 @@ static int rcar_gen3_phy_usb2_power_on(struct phy *p) out: /* The powered flag should be set for any other phys anyway */ rphy->powered = true; - mutex_unlock(&channel->lock); return 0; } @@ -531,18 +540,12 @@ static int rcar_gen3_phy_usb2_power_off(struct phy *p) struct rcar_gen3_chan *channel = rphy->ch; int ret = 0; - mutex_lock(&channel->lock); - rphy->powered = false; - - if (!rcar_gen3_are_all_rphys_power_off(channel)) - goto out; + scoped_guard(spinlock_irqsave, &channel->lock) + rphy->powered = false; if (channel->vbus) ret = regulator_disable(channel->vbus); -out: - mutex_unlock(&channel->lock); - return ret; } @@ -753,7 +756,7 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev) if (phy_data->no_adp_ctrl) channel->obint_enable_bits = USB2_OBINT_IDCHG_EN; - mutex_init(&channel->lock); + spin_lock_init(&channel->lock); for (i = 0; i < NUM_OF_PHYS; i++) { channel->rphys[i].phy = devm_phy_create(dev, NULL, phy_data->phy_usb2_ops); -- GitLab From c000fc26c431e40a4e5e6d7a9e42ef0aa06331cf Mon Sep 17 00:00:00 2001 From: Claudiu Beznea Date: Wed, 7 May 2025 15:50:31 +0300 Subject: [PATCH 0009/2211] phy: renesas: rcar-gen3-usb2: Assert PLL reset on PHY power off [ Upstream commit 9ce71e85b29eb63e48e294479742e670513f03a0 ] Assert PLL reset on PHY power off. This saves power. Fixes: f3b5a8d9b50d ("phy: rcar-gen3-usb2: Add R-Car Gen3 USB2 PHY driver") Cc: stable@vger.kernel.org Reviewed-by: Yoshihiro Shimoda Tested-by: Yoshihiro Shimoda Reviewed-by: Lad Prabhakar Signed-off-by: Claudiu Beznea Link: https://lore.kernel.org/r/20250507125032.565017-5-claudiu.beznea.uj@bp.renesas.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/phy/renesas/phy-rcar-gen3-usb2.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/phy/renesas/phy-rcar-gen3-usb2.c b/drivers/phy/renesas/phy-rcar-gen3-usb2.c index 188e903445aeb..b45aee8f59644 100644 --- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c +++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c @@ -540,9 +540,17 @@ static int rcar_gen3_phy_usb2_power_off(struct phy *p) struct rcar_gen3_chan *channel = rphy->ch; int ret = 0; - scoped_guard(spinlock_irqsave, &channel->lock) + scoped_guard(spinlock_irqsave, &channel->lock) { rphy->powered = false; + if (rcar_gen3_are_all_rphys_power_off(channel)) { + u32 val = readl(channel->base + USB2_USBCTR); + + val |= USB2_USBCTR_PLL_RST; + writel(val, channel->base + USB2_USBCTR); + } + } + if (channel->vbus) ret = regulator_disable(channel->vbus); -- GitLab From 3fc60952271b601ceee34dcf6f72c1de660172e1 Mon Sep 17 00:00:00 2001 From: Pengyu Luo Date: Sat, 5 Apr 2025 00:42:19 +0800 Subject: [PATCH 0010/2211] cpufreq: Add SM8650 to cpufreq-dt-platdev blocklist [ Upstream commit fc5414a4774e14e51a93499a6adfdc45f2de82e0 ] SM8650 have already been supported by qcom-cpufreq-hw driver, but never been added to cpufreq-dt-platdev. This makes noise [ 0.388525] cpufreq-dt cpufreq-dt: failed register driver: -17 [ 0.388537] cpufreq-dt cpufreq-dt: probe with driver cpufreq-dt failed with error -17 So adding it to the cpufreq-dt-platdev driver's blocklist to fix it. Signed-off-by: Pengyu Luo Signed-off-by: Viresh Kumar Signed-off-by: Sasha Levin --- drivers/cpufreq/cpufreq-dt-platdev.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c index 78ad3221fe077..67bac12d4d55b 100644 --- a/drivers/cpufreq/cpufreq-dt-platdev.c +++ b/drivers/cpufreq/cpufreq-dt-platdev.c @@ -172,6 +172,7 @@ static const struct of_device_id blocklist[] __initconst = { { .compatible = "qcom,sm8350", }, { .compatible = "qcom,sm8450", }, { .compatible = "qcom,sm8550", }, + { .compatible = "qcom,sm8650", }, { .compatible = "st,stih407", }, { .compatible = "st,stih410", }, -- GitLab From 49b4e88b559cdc03283b093db600bdad36ddccea Mon Sep 17 00:00:00 2001 From: Heiko Stuebner Date: Fri, 11 Apr 2025 12:22:39 +0100 Subject: [PATCH 0011/2211] nvmem: rockchip-otp: Move read-offset into variant-data [ Upstream commit 6907e8093b3070d877ee607e5ceede60cfd08bde ] The RK3588 has an offset into the OTP area where the readable area begins and automatically adds this to the start address. Other variants are very much similar to rk3588, just with a different offset, so move that value into variant-data. To match the size in bytes, store this value also in bytes and not in number of blocks. Signed-off-by: Heiko Stuebner Tested-by: Nicolas Frattaroli Signed-off-by: Srinivas Kandagatla Link: https://lore.kernel.org/r/20250411112251.68002-2-srinivas.kandagatla@linaro.org Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/nvmem/rockchip-otp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/nvmem/rockchip-otp.c b/drivers/nvmem/rockchip-otp.c index ebc3f0b24166b..3edfbfc2d7220 100644 --- a/drivers/nvmem/rockchip-otp.c +++ b/drivers/nvmem/rockchip-otp.c @@ -59,7 +59,6 @@ #define RK3588_OTPC_AUTO_EN 0x08 #define RK3588_OTPC_INT_ST 0x84 #define RK3588_OTPC_DOUT0 0x20 -#define RK3588_NO_SECURE_OFFSET 0x300 #define RK3588_NBYTES 4 #define RK3588_BURST_NUM 1 #define RK3588_BURST_SHIFT 8 @@ -69,6 +68,7 @@ struct rockchip_data { int size; + int read_offset; const char * const *clks; int num_clks; nvmem_reg_read_t reg_read; @@ -196,7 +196,7 @@ static int rk3588_otp_read(void *context, unsigned int offset, addr_start = round_down(offset, RK3588_NBYTES) / RK3588_NBYTES; addr_end = round_up(offset + bytes, RK3588_NBYTES) / RK3588_NBYTES; addr_len = addr_end - addr_start; - addr_start += RK3588_NO_SECURE_OFFSET; + addr_start += otp->data->read_offset / RK3588_NBYTES; buf = kzalloc(array_size(addr_len, RK3588_NBYTES), GFP_KERNEL); if (!buf) @@ -280,6 +280,7 @@ static const char * const rk3588_otp_clocks[] = { static const struct rockchip_data rk3588_data = { .size = 0x400, + .read_offset = 0xc00, .clks = rk3588_otp_clocks, .num_clks = ARRAY_SIZE(rk3588_otp_clocks), .reg_read = rk3588_otp_read, -- GitLab From d6abe0f6ade98dbc410855d75cbc21fe345b80a9 Mon Sep 17 00:00:00 2001 From: Heiko Stuebner Date: Fri, 11 Apr 2025 12:22:42 +0100 Subject: [PATCH 0012/2211] nvmem: rockchip-otp: add rk3576 variant data [ Upstream commit 50d75a13a9ce880a5ef07a4ccc63ba561cc2e69a ] The variant works very similar to the rk3588, just with a different read-offset and size. Signed-off-by: Heiko Stuebner Tested-by: Nicolas Frattaroli Signed-off-by: Srinivas Kandagatla Link: https://lore.kernel.org/r/20250411112251.68002-5-srinivas.kandagatla@linaro.org Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/nvmem/rockchip-otp.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/nvmem/rockchip-otp.c b/drivers/nvmem/rockchip-otp.c index 3edfbfc2d7220..d88f12c532426 100644 --- a/drivers/nvmem/rockchip-otp.c +++ b/drivers/nvmem/rockchip-otp.c @@ -274,6 +274,14 @@ static const struct rockchip_data px30_data = { .reg_read = px30_otp_read, }; +static const struct rockchip_data rk3576_data = { + .size = 0x100, + .read_offset = 0x700, + .clks = px30_otp_clocks, + .num_clks = ARRAY_SIZE(px30_otp_clocks), + .reg_read = rk3588_otp_read, +}; + static const char * const rk3588_otp_clocks[] = { "otp", "apb_pclk", "phy", "arb", }; @@ -295,6 +303,10 @@ static const struct of_device_id rockchip_otp_match[] = { .compatible = "rockchip,rk3308-otp", .data = &px30_data, }, + { + .compatible = "rockchip,rk3576-otp", + .data = &rk3576_data, + }, { .compatible = "rockchip,rk3588-otp", .data = &rk3588_data, -- GitLab From a4f865ecdbdd2b466f7914c293246c3c13654fc4 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Fri, 11 Apr 2025 12:22:46 +0100 Subject: [PATCH 0013/2211] nvmem: core: fix bit offsets of more than one byte [ Upstream commit 7a06ef75107799675ea6e4d73b9df37e18e352a8 ] If the NVMEM specifies a stride to access data, reading particular cell might require bit offset that is bigger than one byte. Rework NVMEM core code to support bit offsets of more than 8 bits. Signed-off-by: Dmitry Baryshkov Signed-off-by: Srinivas Kandagatla Link: https://lore.kernel.org/r/20250411112251.68002-9-srinivas.kandagatla@linaro.org Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/nvmem/core.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index d00a3b015635c..8af2a569c23aa 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -824,7 +824,9 @@ static int nvmem_add_cells_from_dt(struct nvmem_device *nvmem, struct device_nod if (addr && len == (2 * sizeof(u32))) { info.bit_offset = be32_to_cpup(addr++); info.nbits = be32_to_cpup(addr); - if (info.bit_offset >= BITS_PER_BYTE || info.nbits < 1) { + if (info.bit_offset >= BITS_PER_BYTE * info.bytes || + info.nbits < 1 || + info.bit_offset + info.nbits > BITS_PER_BYTE * info.bytes) { dev_err(dev, "nvmem: invalid bits on %pOF\n", child); of_node_put(child); return -EINVAL; @@ -1617,21 +1619,29 @@ EXPORT_SYMBOL_GPL(nvmem_cell_put); static void nvmem_shift_read_buffer_in_place(struct nvmem_cell_entry *cell, void *buf) { u8 *p, *b; - int i, extra, bit_offset = cell->bit_offset; + int i, extra, bytes_offset; + int bit_offset = cell->bit_offset; p = b = buf; - if (bit_offset) { + + bytes_offset = bit_offset / BITS_PER_BYTE; + b += bytes_offset; + bit_offset %= BITS_PER_BYTE; + + if (bit_offset % BITS_PER_BYTE) { /* First shift */ - *b++ >>= bit_offset; + *p = *b++ >> bit_offset; /* setup rest of the bytes if any */ for (i = 1; i < cell->bytes; i++) { /* Get bits from next byte and shift them towards msb */ - *p |= *b << (BITS_PER_BYTE - bit_offset); + *p++ |= *b << (BITS_PER_BYTE - bit_offset); - p = b; - *b++ >>= bit_offset; + *p = *b++ >> bit_offset; } + } else if (p != b) { + memmove(p, b, cell->bytes - bytes_offset); + p += cell->bytes - 1; } else { /* point to the msb */ p += cell->bytes - 1; -- GitLab From 4327479e559c05fd31483a58e4df1f0c6c3fbd64 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Fri, 11 Apr 2025 12:22:47 +0100 Subject: [PATCH 0014/2211] nvmem: core: verify cell's raw_len [ Upstream commit 13bcd440f2ff38cd7e42a179c223d4b833158b33 ] Check that the NVMEM cell's raw_len is a aligned to word_size. Otherwise Otherwise drivers might face incomplete read while accessing the last part of the NVMEM cell. Signed-off-by: Dmitry Baryshkov Signed-off-by: Srinivas Kandagatla Link: https://lore.kernel.org/r/20250411112251.68002-10-srinivas.kandagatla@linaro.org Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/nvmem/core.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index 8af2a569c23aa..3671d156c7c33 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -592,6 +592,18 @@ static int nvmem_cell_info_to_nvmem_cell_entry_nodup(struct nvmem_device *nvmem, return -EINVAL; } + if (!IS_ALIGNED(cell->raw_len, nvmem->word_size)) { + dev_err(&nvmem->dev, + "cell %s raw len %zd unaligned to nvmem word size %d\n", + cell->name ?: "", cell->raw_len, + nvmem->word_size); + + if (info->raw_len) + return -EINVAL; + + cell->raw_len = ALIGN(cell->raw_len, nvmem->word_size); + } + return 0; } -- GitLab From 410f8b72e02c64c4bd6e8566663c77e7aeb8bc45 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Fri, 11 Apr 2025 12:22:48 +0100 Subject: [PATCH 0015/2211] nvmem: core: update raw_len if the bit reading is required [ Upstream commit 6786484223d5705bf7f919c1e5055d478ebeec32 ] If NVMEM cell uses bit offset or specifies bit truncation, update raw_len manually (following the cell->bytes update), ensuring that the NVMEM access is still word-aligned. Signed-off-by: Dmitry Baryshkov Signed-off-by: Srinivas Kandagatla Link: https://lore.kernel.org/r/20250411112251.68002-11-srinivas.kandagatla@linaro.org Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/nvmem/core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index 3671d156c7c33..d1869e6de3844 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -581,9 +581,11 @@ static int nvmem_cell_info_to_nvmem_cell_entry_nodup(struct nvmem_device *nvmem, cell->nbits = info->nbits; cell->np = info->np; - if (cell->nbits) + if (cell->nbits) { cell->bytes = DIV_ROUND_UP(cell->nbits + cell->bit_offset, BITS_PER_BYTE); + cell->raw_len = ALIGN(cell->bytes, nvmem->word_size); + } if (!IS_ALIGNED(cell->offset, nvmem->stride)) { dev_err(&nvmem->dev, -- GitLab From 1603a34b80ffb7c52acce5d80cf7465eb56104c8 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Fri, 11 Apr 2025 12:22:49 +0100 Subject: [PATCH 0016/2211] nvmem: qfprom: switch to 4-byte aligned reads [ Upstream commit 3566a737db87a9bf360c2fd36433c5149f805f2e ] All platforms since Snapdragon 8 Gen1 (SM8450) require using 4-byte reads to access QFPROM data. While older platforms were more than happy with 1-byte reads, change the qfprom driver to use 4-byte reads for all the platforms. Specify stride and word size of 4 bytes. To retain compatibility with the existing DT and to simplify porting data from vendor kernels, use fixup_dt_cell_info in order to bump alignment requirements. Signed-off-by: Dmitry Baryshkov Signed-off-by: Srinivas Kandagatla Link: https://lore.kernel.org/r/20250411112251.68002-12-srinivas.kandagatla@linaro.org Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/nvmem/qfprom.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/drivers/nvmem/qfprom.c b/drivers/nvmem/qfprom.c index 116a39e804c70..a872c640b8c5a 100644 --- a/drivers/nvmem/qfprom.c +++ b/drivers/nvmem/qfprom.c @@ -321,19 +321,32 @@ static int qfprom_reg_read(void *context, unsigned int reg, void *_val, size_t bytes) { struct qfprom_priv *priv = context; - u8 *val = _val; - int i = 0, words = bytes; + u32 *val = _val; void __iomem *base = priv->qfpcorrected; + int words = DIV_ROUND_UP(bytes, sizeof(u32)); + int i; if (read_raw_data && priv->qfpraw) base = priv->qfpraw; - while (words--) - *val++ = readb(base + reg + i++); + for (i = 0; i < words; i++) + *val++ = readl(base + reg + i * sizeof(u32)); return 0; } +/* Align reads to word boundary */ +static void qfprom_fixup_dt_cell_info(struct nvmem_device *nvmem, + struct nvmem_cell_info *cell) +{ + unsigned int byte_offset = cell->offset % sizeof(u32); + + cell->bit_offset += byte_offset * BITS_PER_BYTE; + cell->offset -= byte_offset; + if (byte_offset && !cell->nbits) + cell->nbits = cell->bytes * BITS_PER_BYTE; +} + static void qfprom_runtime_disable(void *data) { pm_runtime_disable(data); @@ -358,10 +371,11 @@ static int qfprom_probe(struct platform_device *pdev) struct nvmem_config econfig = { .name = "qfprom", .add_legacy_fixed_of_cells = true, - .stride = 1, - .word_size = 1, + .stride = 4, + .word_size = 4, .id = NVMEM_DEVID_AUTO, .reg_read = qfprom_reg_read, + .fixup_dt_cell_info = qfprom_fixup_dt_cell_info, }; struct device *dev = &pdev->dev; struct resource *res; -- GitLab From 87389bff743c55b6b85282de91109391f43e0814 Mon Sep 17 00:00:00 2001 From: Dmitry Bogdanov Date: Tue, 24 Dec 2024 13:17:57 +0300 Subject: [PATCH 0017/2211] scsi: target: iscsi: Fix timeout on deleted connection [ Upstream commit 7f533cc5ee4c4436cee51dc58e81dfd9c3384418 ] NOPIN response timer may expire on a deleted connection and crash with such logs: Did not receive response to NOPIN on CID: 0, failing connection for I_T Nexus (null),i,0x00023d000125,iqn.2017-01.com.iscsi.target,t,0x3d BUG: Kernel NULL pointer dereference on read at 0x00000000 NIP strlcpy+0x8/0xb0 LR iscsit_fill_cxn_timeout_err_stats+0x5c/0xc0 [iscsi_target_mod] Call Trace: iscsit_handle_nopin_response_timeout+0xfc/0x120 [iscsi_target_mod] call_timer_fn+0x58/0x1f0 run_timer_softirq+0x740/0x860 __do_softirq+0x16c/0x420 irq_exit+0x188/0x1c0 timer_interrupt+0x184/0x410 That is because nopin response timer may be re-started on nopin timer expiration. Stop nopin timer before stopping the nopin response timer to be sure that no one of them will be re-started. Signed-off-by: Dmitry Bogdanov Link: https://lore.kernel.org/r/20241224101757.32300-1-d.bogdanov@yadro.com Reviewed-by: Maurizio Lombardi Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/target/iscsi/iscsi_target.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 6002283cbebab..68bbdf3ee101d 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c @@ -4317,8 +4317,8 @@ int iscsit_close_connection( spin_unlock(&iscsit_global->ts_bitmap_lock); iscsit_stop_timers_for_cmds(conn); - iscsit_stop_nopin_response_timer(conn); iscsit_stop_nopin_timer(conn); + iscsit_stop_nopin_response_timer(conn); if (conn->conn_transport->iscsit_wait_conn) conn->conn_transport->iscsit_wait_conn(conn); -- GitLab From 7aea1517fb6c978e32124a479a14249ca6c0b4c2 Mon Sep 17 00:00:00 2001 From: Manish Pandey Date: Fri, 11 Apr 2025 17:46:30 +0530 Subject: [PATCH 0018/2211] scsi: ufs: Introduce quirk to extend PA_HIBERN8TIME for UFS devices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 569330a34a31a52c904239439984a59972c11d28 ] Samsung UFS devices require additional time in hibern8 mode before exiting, beyond the negotiated handshaking phase between the host and device. Introduce a quirk to increase the PA_HIBERN8TIME parameter by 100 µs, a value derived from experiments, to ensure a proper hibernation process. Signed-off-by: Manish Pandey Link: https://lore.kernel.org/r/20250411121630.21330-3-quic_mapa@quicinc.com Reviewed-by: Bean Huo Reviewed-by: Manivannan Sadhasivam Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/ufs/core/ufshcd.c | 29 +++++++++++++++++++++++++++++ include/ufs/ufs_quirks.h | 6 ++++++ 2 files changed, 35 insertions(+) diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index a9b032d2f4a8d..247e425428c88 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -278,6 +278,7 @@ static const struct ufs_dev_quirk ufs_fixups[] = { .model = UFS_ANY_MODEL, .quirk = UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM | UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE | + UFS_DEVICE_QUIRK_PA_HIBER8TIME | UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS }, { .wmanufacturerid = UFS_VENDOR_SKHYNIX, .model = UFS_ANY_MODEL, @@ -8459,6 +8460,31 @@ out: return ret; } +/** + * ufshcd_quirk_override_pa_h8time - Ensures proper adjustment of PA_HIBERN8TIME. + * @hba: per-adapter instance + * + * Some UFS devices require specific adjustments to the PA_HIBERN8TIME parameter + * to ensure proper hibernation timing. This function retrieves the current + * PA_HIBERN8TIME value and increments it by 100us. + */ +static void ufshcd_quirk_override_pa_h8time(struct ufs_hba *hba) +{ + u32 pa_h8time; + int ret; + + ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_HIBERN8TIME), &pa_h8time); + if (ret) { + dev_err(hba->dev, "Failed to get PA_HIBERN8TIME: %d\n", ret); + return; + } + + /* Increment by 1 to increase hibernation time by 100 µs */ + ret = ufshcd_dme_set(hba, UIC_ARG_MIB(PA_HIBERN8TIME), pa_h8time + 1); + if (ret) + dev_err(hba->dev, "Failed updating PA_HIBERN8TIME: %d\n", ret); +} + static void ufshcd_tune_unipro_params(struct ufs_hba *hba) { ufshcd_vops_apply_dev_quirks(hba); @@ -8469,6 +8495,9 @@ static void ufshcd_tune_unipro_params(struct ufs_hba *hba) if (hba->dev_quirks & UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE) ufshcd_quirk_tune_host_pa_tactivate(hba); + + if (hba->dev_quirks & UFS_DEVICE_QUIRK_PA_HIBER8TIME) + ufshcd_quirk_override_pa_h8time(hba); } static void ufshcd_clear_dbg_ufs_stats(struct ufs_hba *hba) diff --git a/include/ufs/ufs_quirks.h b/include/ufs/ufs_quirks.h index 41ff44dfa1db3..f52de5ed1b3b6 100644 --- a/include/ufs/ufs_quirks.h +++ b/include/ufs/ufs_quirks.h @@ -107,4 +107,10 @@ struct ufs_dev_quirk { */ #define UFS_DEVICE_QUIRK_DELAY_AFTER_LPM (1 << 11) +/* + * Some ufs devices may need more time to be in hibern8 before exiting. + * Enable this quirk to give it an additional 100us. + */ +#define UFS_DEVICE_QUIRK_PA_HIBER8TIME (1 << 12) + #endif /* UFS_QUIRKS_H_ */ -- GitLab From b730cb109633c455ce8a7cd6934986c6a16d88d8 Mon Sep 17 00:00:00 2001 From: Zhongqiu Han Date: Wed, 12 Mar 2025 21:04:12 +0800 Subject: [PATCH 0019/2211] virtio_ring: Fix data race by tagging event_triggered as racy for KCSAN [ Upstream commit 2e2f925fe737576df2373931c95e1a2b66efdfef ] syzbot reports a data-race when accessing the event_triggered, here is the simplified stack when the issue occurred: ================================================================== BUG: KCSAN: data-race in virtqueue_disable_cb / virtqueue_enable_cb_delayed write to 0xffff8881025bc452 of 1 bytes by task 3288 on cpu 0: virtqueue_enable_cb_delayed+0x42/0x3c0 drivers/virtio/virtio_ring.c:2653 start_xmit+0x230/0x1310 drivers/net/virtio_net.c:3264 __netdev_start_xmit include/linux/netdevice.h:5151 [inline] netdev_start_xmit include/linux/netdevice.h:5160 [inline] xmit_one net/core/dev.c:3800 [inline] read to 0xffff8881025bc452 of 1 bytes by interrupt on cpu 1: virtqueue_disable_cb_split drivers/virtio/virtio_ring.c:880 [inline] virtqueue_disable_cb+0x92/0x180 drivers/virtio/virtio_ring.c:2566 skb_xmit_done+0x5f/0x140 drivers/net/virtio_net.c:777 vring_interrupt+0x161/0x190 drivers/virtio/virtio_ring.c:2715 __handle_irq_event_percpu+0x95/0x490 kernel/irq/handle.c:158 handle_irq_event_percpu kernel/irq/handle.c:193 [inline] value changed: 0x01 -> 0x00 ================================================================== When the data race occurs, the function virtqueue_enable_cb_delayed() sets event_triggered to false, and virtqueue_disable_cb_split/packed() reads it as false due to the race condition. Since event_triggered is an unreliable hint used for optimization, this should only cause the driver temporarily suggest that the device not send an interrupt notification when the event index is used. Fix this KCSAN reported data-race issue by explicitly tagging the access as data_racy. Reported-by: syzbot+efe683d57990864b8c8e@syzkaller.appspotmail.com Closes: https://lore.kernel.org/all/67c7761a.050a0220.15b4b9.0018.GAE@google.com/ Signed-off-by: Zhongqiu Han Message-Id: <20250312130412.3516307-1-quic_zhonhan@quicinc.com> Signed-off-by: Michael S. Tsirkin Acked-by: Jason Wang Signed-off-by: Sasha Levin --- drivers/virtio/virtio_ring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 1f8a322eb00be..147926c8bae09 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -2530,7 +2530,7 @@ bool virtqueue_enable_cb_delayed(struct virtqueue *_vq) struct vring_virtqueue *vq = to_vvq(_vq); if (vq->event_triggered) - vq->event_triggered = false; + data_race(vq->event_triggered = false); return vq->packed_ring ? virtqueue_enable_cb_delayed_packed(_vq) : virtqueue_enable_cb_delayed_split(_vq); -- GitLab From 299881317756d8c6831e373e422b3be2b671362e Mon Sep 17 00:00:00 2001 From: Balbir Singh Date: Mon, 14 Apr 2025 21:37:52 +1000 Subject: [PATCH 0020/2211] dma/mapping.c: dev_dbg support for dma_addressing_limited MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 2042c352e21d19eaf5f9e22fb6afce72293ef28c ] In the debug and resolution of an issue involving forced use of bounce buffers, 7170130e4c72 ("x86/mm/init: Handle the special case of device private pages in add_pages(), to not increase max_pfn and trigger dma_addressing_limited() bounce buffers"). It would have been easier to debug the issue if dma_addressing_limited() had debug information about the device not being able to address all of memory and thus forcing all accesses through a bounce buffer. Please see[2] Implement dev_dbg to debug the potential use of bounce buffers when we hit the condition. When swiotlb is used, dma_addressing_limited() is used to determine the size of maximum dma buffer size in dma_direct_max_mapping_size(). The debug prints could be triggered in that check as well (when enabled). Link: https://lore.kernel.org/lkml/20250401000752.249348-1-balbirs@nvidia.com/ [1] Link: https://lore.kernel.org/lkml/20250310112206.4168-1-spasswolf@web.de/ [2] Cc: Marek Szyprowski Cc: Robin Murphy Cc: "Christian König" Cc: Ingo Molnar Cc: Kees Cook Cc: Bjorn Helgaas Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Andy Lutomirski Cc: Alex Deucher Cc: Bert Karwatzki Cc: Christoph Hellwig Signed-off-by: Balbir Singh Reviewed-by: Christoph Hellwig Signed-off-by: Marek Szyprowski Link: https://lore.kernel.org/r/20250414113752.3298276-1-balbirs@nvidia.com Signed-off-by: Sasha Levin --- kernel/dma/mapping.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 864a1121bf086..f7366083b4d00 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -905,7 +905,7 @@ EXPORT_SYMBOL(dma_set_coherent_mask); * the system, else %false. Lack of addressing bits is the prime reason for * bounce buffering, but might not be the only one. */ -bool dma_addressing_limited(struct device *dev) +static bool __dma_addressing_limited(struct device *dev) { const struct dma_map_ops *ops = get_dma_ops(dev); @@ -917,6 +917,15 @@ bool dma_addressing_limited(struct device *dev) return false; return !dma_direct_all_ram_mapped(dev); } + +bool dma_addressing_limited(struct device *dev) +{ + if (!__dma_addressing_limited(dev)) + return false; + + dev_dbg(dev, "device is DMA addressing limited\n"); + return true; +} EXPORT_SYMBOL_GPL(dma_addressing_limited); size_t dma_max_mapping_size(struct device *dev) -- GitLab From de8c0b93a63cf8eb3dbd234617cdc1daef951843 Mon Sep 17 00:00:00 2001 From: Lorenzo Stoakes Date: Mon, 31 Mar 2025 13:56:08 +0100 Subject: [PATCH 0021/2211] intel_th: avoid using deprecated page->mapping, index fields [ Upstream commit 8e553520596bbd5ce832e26e9d721e6a0c797b8b ] The struct page->mapping, index fields are deprecated and soon to be only available as part of a folio. It is likely the intel_th code which sets page->mapping, index is was implemented out of concern that some aspect of the page fault logic may encounter unexpected problems should they not. However, the appropriate interface for inserting kernel-allocated memory is vm_insert_page() in a VM_MIXEDMAP. By using the helper function vmf_insert_mixed() we can do this with minimal churn in the existing fault handler. By doing so, we bypass the remainder of the faulting logic. The pages are still pinned so there is no possibility of anything unexpected being done with the pages once established. It would also be reasonable to pre-map everything on fault, however to minimise churn we retain the fault handler. We also eliminate all code which clears page->mapping on teardown as this has now become unnecessary. The MSU code relies on faulting to function correctly, so is by definition dependent on CONFIG_MMU. We avoid spurious reports about compilation failure for unsupported platforms by making this requirement explicit in Kconfig as part of this change too. Signed-off-by: Lorenzo Stoakes Acked-by: Alexander Shishkin Link: https://lore.kernel.org/r/20250331125608.60300-1-lorenzo.stoakes@oracle.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/hwtracing/intel_th/Kconfig | 1 + drivers/hwtracing/intel_th/msu.c | 31 +++++++----------------------- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/drivers/hwtracing/intel_th/Kconfig b/drivers/hwtracing/intel_th/Kconfig index 4b6359326ede9..4f7d2b6d79e29 100644 --- a/drivers/hwtracing/intel_th/Kconfig +++ b/drivers/hwtracing/intel_th/Kconfig @@ -60,6 +60,7 @@ config INTEL_TH_STH config INTEL_TH_MSU tristate "Intel(R) Trace Hub Memory Storage Unit" + depends on MMU help Memory Storage Unit (MSU) trace output device enables storing STP traces to system memory. It supports single diff --git a/drivers/hwtracing/intel_th/msu.c b/drivers/hwtracing/intel_th/msu.c index 66123d684ac9e..93b65a9731d72 100644 --- a/drivers/hwtracing/intel_th/msu.c +++ b/drivers/hwtracing/intel_th/msu.c @@ -19,6 +19,7 @@ #include #include #include +#include #ifdef CONFIG_X86 #include @@ -967,7 +968,6 @@ static void msc_buffer_contig_free(struct msc *msc) for (off = 0; off < msc->nr_pages << PAGE_SHIFT; off += PAGE_SIZE) { struct page *page = virt_to_page(msc->base + off); - page->mapping = NULL; __free_page(page); } @@ -1149,9 +1149,6 @@ static void __msc_buffer_win_free(struct msc *msc, struct msc_window *win) int i; for_each_sg(win->sgt->sgl, sg, win->nr_segs, i) { - struct page *page = msc_sg_page(sg); - - page->mapping = NULL; dma_free_coherent(msc_dev(win->msc)->parent->parent, PAGE_SIZE, sg_virt(sg), sg_dma_address(sg)); } @@ -1592,22 +1589,10 @@ static void msc_mmap_close(struct vm_area_struct *vma) { struct msc_iter *iter = vma->vm_file->private_data; struct msc *msc = iter->msc; - unsigned long pg; if (!atomic_dec_and_mutex_lock(&msc->mmap_count, &msc->buf_mutex)) return; - /* drop page _refcounts */ - for (pg = 0; pg < msc->nr_pages; pg++) { - struct page *page = msc_buffer_get_page(msc, pg); - - if (WARN_ON_ONCE(!page)) - continue; - - if (page->mapping) - page->mapping = NULL; - } - /* last mapping -- drop user_count */ atomic_dec(&msc->user_count); mutex_unlock(&msc->buf_mutex); @@ -1617,16 +1602,14 @@ static vm_fault_t msc_mmap_fault(struct vm_fault *vmf) { struct msc_iter *iter = vmf->vma->vm_file->private_data; struct msc *msc = iter->msc; + struct page *page; - vmf->page = msc_buffer_get_page(msc, vmf->pgoff); - if (!vmf->page) + page = msc_buffer_get_page(msc, vmf->pgoff); + if (!page) return VM_FAULT_SIGBUS; - get_page(vmf->page); - vmf->page->mapping = vmf->vma->vm_file->f_mapping; - vmf->page->index = vmf->pgoff; - - return 0; + get_page(page); + return vmf_insert_mixed(vmf->vma, vmf->address, page_to_pfn_t(page)); } static const struct vm_operations_struct msc_mmap_ops = { @@ -1667,7 +1650,7 @@ out: atomic_dec(&msc->user_count); vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - vm_flags_set(vma, VM_DONTEXPAND | VM_DONTCOPY); + vm_flags_set(vma, VM_DONTEXPAND | VM_DONTCOPY | VM_MIXEDMAP); vma->vm_ops = &msc_mmap_ops; return ret; } -- GitLab From a8dd6b7b391d9b33ea42b06b0621381ae9e320d3 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Tue, 18 Mar 2025 15:12:03 +0100 Subject: [PATCH 0022/2211] mei: vsc: Use struct vsc_tp_packet as vsc-tp tx_buf and rx_buf type [ Upstream commit f88c0c72ffb014e5eba676ee337c4eb3b1d6a119 ] vsc_tp.tx_buf and vsc_tp.rx_buf point to a struct vsc_tp_packet, use the correct type instead of "void *" and use sizeof(*ptr) when allocating memory for these buffers. Signed-off-by: Hans de Goede Reviewed-by: Alexander Usyskin Reviewed-by: Sakari Ailus Link: https://lore.kernel.org/r/20250318141203.94342-3-hdegoede@redhat.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/misc/mei/vsc-tp.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/misc/mei/vsc-tp.c b/drivers/misc/mei/vsc-tp.c index eb51fbe8d92fb..ad7c7f1573191 100644 --- a/drivers/misc/mei/vsc-tp.c +++ b/drivers/misc/mei/vsc-tp.c @@ -71,8 +71,8 @@ struct vsc_tp { u32 seq; /* command buffer */ - void *tx_buf; - void *rx_buf; + struct vsc_tp_packet *tx_buf; + struct vsc_tp_packet *rx_buf; atomic_t assert_cnt; wait_queue_head_t xfer_wait; @@ -164,7 +164,7 @@ static int vsc_tp_xfer_helper(struct vsc_tp *tp, struct vsc_tp_packet *pkt, { int ret, offset = 0, cpy_len, src_len, dst_len = sizeof(struct vsc_tp_packet_hdr); int next_xfer_len = VSC_TP_PACKET_SIZE(pkt) + VSC_TP_XFER_TIMEOUT_BYTES; - u8 *src, *crc_src, *rx_buf = tp->rx_buf; + u8 *src, *crc_src, *rx_buf = (u8 *)tp->rx_buf; int count_down = VSC_TP_MAX_XFER_COUNT; u32 recv_crc = 0, crc = ~0; struct vsc_tp_packet_hdr ack; @@ -324,7 +324,7 @@ int vsc_tp_rom_xfer(struct vsc_tp *tp, const void *obuf, void *ibuf, size_t len) guard(mutex)(&tp->mutex); /* rom xfer is big endian */ - cpu_to_be32_array(tp->tx_buf, obuf, words); + cpu_to_be32_array((u32 *)tp->tx_buf, obuf, words); ret = read_poll_timeout(gpiod_get_value_cansleep, ret, !ret, VSC_TP_ROM_XFER_POLL_DELAY_US, @@ -340,7 +340,7 @@ int vsc_tp_rom_xfer(struct vsc_tp *tp, const void *obuf, void *ibuf, size_t len) return ret; if (ibuf) - be32_to_cpu_array(ibuf, tp->rx_buf, words); + be32_to_cpu_array(ibuf, (u32 *)tp->rx_buf, words); return ret; } @@ -496,11 +496,11 @@ static int vsc_tp_probe(struct spi_device *spi) if (!tp) return -ENOMEM; - tp->tx_buf = devm_kzalloc(dev, VSC_TP_MAX_XFER_SIZE, GFP_KERNEL); + tp->tx_buf = devm_kzalloc(dev, sizeof(*tp->tx_buf), GFP_KERNEL); if (!tp->tx_buf) return -ENOMEM; - tp->rx_buf = devm_kzalloc(dev, VSC_TP_MAX_XFER_SIZE, GFP_KERNEL); + tp->rx_buf = devm_kzalloc(dev, sizeof(*tp->rx_buf), GFP_KERNEL); if (!tp->rx_buf) return -ENOMEM; -- GitLab From 3eec42a17ad4d09dde8e981076e8cbc17073d35b Mon Sep 17 00:00:00 2001 From: Marek Szyprowski Date: Tue, 15 Apr 2025 09:56:59 +0200 Subject: [PATCH 0023/2211] dma-mapping: avoid potential unused data compilation warning [ Upstream commit c9b19ea63036fc537a69265acea1b18dabd1cbd3 ] When CONFIG_NEED_DMA_MAP_STATE is not defined, dma-mapping clients might report unused data compilation warnings for dma_unmap_*() calls arguments. Redefine macros for those calls to let compiler to notice that it is okay when the provided arguments are not used. Reported-by: Andy Shevchenko Suggested-by: Jakub Kicinski Signed-off-by: Marek Szyprowski Tested-by: Andy Shevchenko Link: https://lore.kernel.org/r/20250415075659.428549-1-m.szyprowski@samsung.com Signed-off-by: Sasha Levin --- include/linux/dma-mapping.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 1524da363734a..22b9099927fad 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -633,10 +633,14 @@ static inline int dma_mmap_wc(struct device *dev, #else #define DEFINE_DMA_UNMAP_ADDR(ADDR_NAME) #define DEFINE_DMA_UNMAP_LEN(LEN_NAME) -#define dma_unmap_addr(PTR, ADDR_NAME) (0) -#define dma_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) -#define dma_unmap_len(PTR, LEN_NAME) (0) -#define dma_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) +#define dma_unmap_addr(PTR, ADDR_NAME) \ + ({ typeof(PTR) __p __maybe_unused = PTR; 0; }) +#define dma_unmap_addr_set(PTR, ADDR_NAME, VAL) \ + do { typeof(PTR) __p __maybe_unused = PTR; } while (0) +#define dma_unmap_len(PTR, LEN_NAME) \ + ({ typeof(PTR) __p __maybe_unused = PTR; 0; }) +#define dma_unmap_len_set(PTR, LEN_NAME, VAL) \ + do { typeof(PTR) __p __maybe_unused = PTR; } while (0) #endif #endif /* _LINUX_DMA_MAPPING_H */ -- GitLab From 97edaa0ec64c5354e7dd794560201b1c98761d9c Mon Sep 17 00:00:00 2001 From: gaoxu Date: Thu, 17 Apr 2025 07:30:00 +0000 Subject: [PATCH 0024/2211] cgroup: Fix compilation issue due to cgroup_mutex not being exported MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 87c259a7a359e73e6c52c68fcbec79988999b4e6 ] When adding folio_memcg function call in the zram module for Android16-6.12, the following error occurs during compilation: ERROR: modpost: "cgroup_mutex" [../soc-repo/zram.ko] undefined! This error is caused by the indirect call to lockdep_is_held(&cgroup_mutex) within folio_memcg. The export setting for cgroup_mutex is controlled by the CONFIG_PROVE_RCU macro. If CONFIG_LOCKDEP is enabled while CONFIG_PROVE_RCU is not, this compilation error will occur. To resolve this issue, add a parallel macro CONFIG_LOCKDEP control to ensure cgroup_mutex is properly exported when needed. Signed-off-by: gao xu Acked-by: Michal Koutný Signed-off-by: Tejun Heo Signed-off-by: Sasha Levin --- kernel/cgroup/cgroup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index e63d6f3b00470..62933468aaf46 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -90,7 +90,7 @@ DEFINE_MUTEX(cgroup_mutex); DEFINE_SPINLOCK(css_set_lock); -#ifdef CONFIG_PROVE_RCU +#if (defined CONFIG_PROVE_RCU || defined CONFIG_LOCKDEP) EXPORT_SYMBOL_GPL(cgroup_mutex); EXPORT_SYMBOL_GPL(css_set_lock); #endif -- GitLab From f93675793bdcddbae139cb409d91f26037664283 Mon Sep 17 00:00:00 2001 From: Stefano Garzarella Date: Thu, 27 Mar 2025 13:44:35 +0100 Subject: [PATCH 0025/2211] vhost_task: fix vhost_task_create() documentation [ Upstream commit fec0abf52609c20279243699d08b660c142ce0aa ] Commit cb380909ae3b ("vhost: return task creation error instead of NULL") changed the return value of vhost_task_create(), but did not update the documentation. Reflect the change in the documentation: on an error, vhost_task_create() returns an ERR_PTR() and no longer NULL. Signed-off-by: Stefano Garzarella Message-Id: <20250327124435.142831-1-sgarzare@redhat.com> Signed-off-by: Michael S. Tsirkin Signed-off-by: Sasha Levin --- kernel/vhost_task.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/vhost_task.c b/kernel/vhost_task.c index 2ef2e1b800916..2f844c279a3e0 100644 --- a/kernel/vhost_task.c +++ b/kernel/vhost_task.c @@ -111,7 +111,7 @@ EXPORT_SYMBOL_GPL(vhost_task_stop); * @arg: data to be passed to fn and handled_kill * @name: the thread's name * - * This returns a specialized task for use by the vhost layer or NULL on + * This returns a specialized task for use by the vhost layer or ERR_PTR() on * failure. The returned task is inactive, and the caller must fire it up * through vhost_task_start(). */ -- GitLab From bd8c9404e44adb9f6219c09b3409a61ab7ce3427 Mon Sep 17 00:00:00 2001 From: Dongli Zhang Date: Wed, 2 Apr 2025 23:29:46 -0700 Subject: [PATCH 0026/2211] vhost-scsi: protect vq->log_used with vq->mutex [ Upstream commit f591cf9fce724e5075cc67488c43c6e39e8cbe27 ] The vhost-scsi completion path may access vq->log_base when vq->log_used is already set to false. vhost-thread QEMU-thread vhost_scsi_complete_cmd_work() -> vhost_add_used() -> vhost_add_used_n() if (unlikely(vq->log_used)) QEMU disables vq->log_used via VHOST_SET_VRING_ADDR. mutex_lock(&vq->mutex); vq->log_used = false now! mutex_unlock(&vq->mutex); QEMU gfree(vq->log_base) log_used() -> log_write(vq->log_base) Assuming the VMM is QEMU. The vq->log_base is from QEMU userpace and can be reclaimed via gfree(). As a result, this causes invalid memory writes to QEMU userspace. The control queue path has the same issue. Signed-off-by: Dongli Zhang Acked-by: Jason Wang Reviewed-by: Mike Christie Message-Id: <20250403063028.16045-2-dongli.zhang@oracle.com> Signed-off-by: Michael S. Tsirkin Signed-off-by: Sasha Levin --- drivers/vhost/scsi.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c index 35a03306d1345..ecad2f53b7635 100644 --- a/drivers/vhost/scsi.c +++ b/drivers/vhost/scsi.c @@ -571,6 +571,9 @@ static void vhost_scsi_complete_cmd_work(struct vhost_work *work) int ret; llnode = llist_del_all(&svq->completion_list); + + mutex_lock(&svq->vq.mutex); + llist_for_each_entry_safe(cmd, t, llnode, tvc_completion_list) { se_cmd = &cmd->tvc_se_cmd; @@ -604,6 +607,8 @@ static void vhost_scsi_complete_cmd_work(struct vhost_work *work) vhost_scsi_release_cmd_res(se_cmd); } + mutex_unlock(&svq->vq.mutex); + if (signal) vhost_signal(&svq->vs->dev, &svq->vq); } @@ -1346,8 +1351,11 @@ static void vhost_scsi_tmf_resp_work(struct vhost_work *work) else resp_code = VIRTIO_SCSI_S_FUNCTION_REJECTED; + mutex_lock(&tmf->svq->vq.mutex); vhost_scsi_send_tmf_resp(tmf->vhost, &tmf->svq->vq, tmf->in_iovs, tmf->vq_desc, &tmf->resp_iov, resp_code); + mutex_unlock(&tmf->svq->vq.mutex); + vhost_scsi_release_tmf_res(tmf); } -- GitLab From 523c08f630a3d436ff5143df80e66dcafb14f4cf Mon Sep 17 00:00:00 2001 From: Ranjan Kumar Date: Tue, 15 Apr 2025 15:45:46 +0530 Subject: [PATCH 0027/2211] scsi: mpi3mr: Add level check to control event logging [ Upstream commit b0b7ee3b574a72283399b9232f6190be07f220c0 ] Ensure event logs are only generated when the debug logging level MPI3_DEBUG_EVENT is enabled. This prevents unnecessary logging. Signed-off-by: Ranjan Kumar Link: https://lore.kernel.org/r/20250415101546.204018-1-ranjan.kumar@broadcom.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/mpi3mr/mpi3mr_fw.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c index c0a372868e1d7..f6d3db3fd0d8e 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_fw.c +++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c @@ -174,6 +174,9 @@ static void mpi3mr_print_event_data(struct mpi3mr_ioc *mrioc, char *desc = NULL; u16 event; + if (!(mrioc->logging_level & MPI3_DEBUG_EVENT)) + return; + event = event_reply->event; switch (event) { -- GitLab From 7f7f70c31697654d8c9c3189ba8b8f540f7a5a46 Mon Sep 17 00:00:00 2001 From: Vladimir Oltean Date: Thu, 17 Apr 2025 15:00:04 +0300 Subject: [PATCH 0028/2211] net: enetc: refactor bulk flipping of RX buffers to separate function [ Upstream commit 1d587faa5be7e9785b682cc5f58ba8f4100c13ea ] This small snippet of code ensures that we do something with the array of RX software buffer descriptor elements after passing the skb to the stack. In this case, we see if the other half of the page is reusable, and if so, we "turn around" the buffers, making them directly usable by enetc_refill_rx_ring() without going to enetc_new_page(). We will need to perform this kind of buffer flipping from a new code path, i.e. from XDP_PASS. Currently, enetc_build_skb() does it there buffer by buffer, but in a subsequent change we will stop using enetc_build_skb() for XDP_PASS. Signed-off-by: Vladimir Oltean Reviewed-by: Wei Fang Link: https://patch.msgid.link/20250417120005.3288549-3-vladimir.oltean@nxp.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/freescale/enetc/enetc.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c index f662a5d54986c..d8272b7a55fcb 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc.c +++ b/drivers/net/ethernet/freescale/enetc/enetc.c @@ -1572,6 +1572,16 @@ static void enetc_xdp_drop(struct enetc_bdr *rx_ring, int rx_ring_first, } } +static void enetc_bulk_flip_buff(struct enetc_bdr *rx_ring, int rx_ring_first, + int rx_ring_last) +{ + while (rx_ring_first != rx_ring_last) { + enetc_flip_rx_buff(rx_ring, + &rx_ring->rx_swbd[rx_ring_first]); + enetc_bdr_idx_inc(rx_ring, &rx_ring_first); + } +} + static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring, struct napi_struct *napi, int work_limit, struct bpf_prog *prog) @@ -1687,11 +1697,7 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring, enetc_xdp_drop(rx_ring, orig_i, i); rx_ring->stats.xdp_redirect_failures++; } else { - while (orig_i != i) { - enetc_flip_rx_buff(rx_ring, - &rx_ring->rx_swbd[orig_i]); - enetc_bdr_idx_inc(rx_ring, &orig_i); - } + enetc_bulk_flip_buff(rx_ring, orig_i, i); xdp_redirect_frm_cnt++; rx_ring->stats.xdp_redirect++; } -- GitLab From e22034cbee52b6c42e81960a09c6b2cef41187ed Mon Sep 17 00:00:00 2001 From: Balbir Singh Date: Tue, 22 Apr 2025 21:40:34 +1000 Subject: [PATCH 0029/2211] dma-mapping: Fix warning reported for missing prototype [ Upstream commit cae5572ec9261f752af834cdaaf5a0ba0afcf256 ] lkp reported a warning about missing prototype for a recent patch. The kernel-doc style comments are out of sync, move them to the right function. Cc: Marek Szyprowski Cc: Christoph Hellwig Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202504190615.g9fANxHw-lkp@intel.com/ Signed-off-by: Balbir Singh [mszyprow: reformatted subject] Signed-off-by: Marek Szyprowski Link: https://lore.kernel.org/r/20250422114034.3535515-1-balbirs@nvidia.com Signed-off-by: Sasha Levin --- kernel/dma/mapping.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index f7366083b4d00..74d453ec750a1 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -897,14 +897,6 @@ int dma_set_coherent_mask(struct device *dev, u64 mask) } EXPORT_SYMBOL(dma_set_coherent_mask); -/** - * dma_addressing_limited - return if the device is addressing limited - * @dev: device to check - * - * Return %true if the devices DMA mask is too small to address all memory in - * the system, else %false. Lack of addressing bits is the prime reason for - * bounce buffering, but might not be the only one. - */ static bool __dma_addressing_limited(struct device *dev) { const struct dma_map_ops *ops = get_dma_ops(dev); @@ -918,6 +910,14 @@ static bool __dma_addressing_limited(struct device *dev) return !dma_direct_all_ram_mapped(dev); } +/** + * dma_addressing_limited - return if the device is addressing limited + * @dev: device to check + * + * Return %true if the devices DMA mask is too small to address all memory in + * the system, else %false. Lack of addressing bits is the prime reason for + * bounce buffering, but might not be the only one. + */ bool dma_addressing_limited(struct device *dev) { if (!__dma_addressing_limited(dev)) -- GitLab From 836917e7a65cd47d2d7cc2d46305573a155ffd5d Mon Sep 17 00:00:00 2001 From: Frederick Lawler Date: Thu, 27 Mar 2025 11:09:11 -0500 Subject: [PATCH 0030/2211] ima: process_measurement() needlessly takes inode_lock() on MAY_READ [ Upstream commit 30d68cb0c37ebe2dc63aa1d46a28b9163e61caa2 ] On IMA policy update, if a measure rule exists in the policy, IMA_MEASURE is set for ima_policy_flags which makes the violation_check variable always true. Coupled with a no-action on MAY_READ for a FILE_CHECK call, we're always taking the inode_lock(). This becomes a performance problem for extremely heavy read-only workloads. Therefore, prevent this only in the case there's no action to be taken. Signed-off-by: Frederick Lawler Acked-by: Roberto Sassu Signed-off-by: Mimi Zohar Signed-off-by: Sasha Levin --- security/integrity/ima/ima_main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c index a9aab10bebcaa..2f3f267e72167 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c @@ -245,7 +245,9 @@ static int process_measurement(struct file *file, const struct cred *cred, &allowed_algos); violation_check = ((func == FILE_CHECK || func == MMAP_CHECK || func == MMAP_CHECK_REQPROT) && - (ima_policy_flag & IMA_MEASURE)); + (ima_policy_flag & IMA_MEASURE) && + ((action & IMA_MEASURE) || + (file->f_mode & FMODE_WRITE))); if (!action && !violation_check) return 0; -- GitLab From 4f5553a08fb74745f6ae6034adf251a2d4219de5 Mon Sep 17 00:00:00 2001 From: Davidlohr Bueso Date: Thu, 17 Apr 2025 18:59:15 -0700 Subject: [PATCH 0031/2211] fs/buffer: split locking for pagecache lookups [ Upstream commit 7ffe3de53a885dbb5836541c2178bd07d1bad7df ] Callers of __find_get_block() may or may not allow for blocking semantics, and is currently assumed that it will not. Layout two paths based on this. The the private_lock scheme will continued to be used for atomic contexts. Otherwise take the folio lock instead, which protects the buffers, such as vs migration and try_to_free_buffers(). Per the "hack idea", the latter can alleviate contention on the private_lock for bdev mappings. For reasons of determinism and avoid making bugs hard to reproduce, the trylocking is not attempted. No change in semantics. All lookup users still take the spinlock. Reviewed-by: Jan Kara Signed-off-by: Davidlohr Bueso Link: https://kdevops.org/ext4/v6.15-rc2.html # [0] Link: https://lore.kernel.org/all/aAAEvcrmREWa1SKF@bombadil.infradead.org/ # [1] Link: https://lore.kernel.org/20250418015921.132400-2-dave@stgolabs.net Tested-by: kdevops@lists.linux.dev Reviewed-by: Luis Chamberlain Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/buffer.c | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/fs/buffer.c b/fs/buffer.c index 32bd0f4c42236..ba464c2002061 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -176,18 +176,8 @@ void end_buffer_write_sync(struct buffer_head *bh, int uptodate) } EXPORT_SYMBOL(end_buffer_write_sync); -/* - * Various filesystems appear to want __find_get_block to be non-blocking. - * But it's the page lock which protects the buffers. To get around this, - * we get exclusion from try_to_free_buffers with the blockdev mapping's - * i_private_lock. - * - * Hack idea: for the blockdev mapping, i_private_lock contention - * may be quite high. This code could TryLock the page, and if that - * succeeds, there is no need to take i_private_lock. - */ static struct buffer_head * -__find_get_block_slow(struct block_device *bdev, sector_t block) +__find_get_block_slow(struct block_device *bdev, sector_t block, bool atomic) { struct address_space *bd_mapping = bdev->bd_mapping; const int blkbits = bd_mapping->host->i_blkbits; @@ -204,7 +194,16 @@ __find_get_block_slow(struct block_device *bdev, sector_t block) if (IS_ERR(folio)) goto out; - spin_lock(&bd_mapping->i_private_lock); + /* + * Folio lock protects the buffers. Callers that cannot block + * will fallback to serializing vs try_to_free_buffers() via + * the i_private_lock. + */ + if (atomic) + spin_lock(&bd_mapping->i_private_lock); + else + folio_lock(folio); + head = folio_buffers(folio); if (!head) goto out_unlock; @@ -236,7 +235,10 @@ __find_get_block_slow(struct block_device *bdev, sector_t block) 1 << blkbits); } out_unlock: - spin_unlock(&bd_mapping->i_private_lock); + if (atomic) + spin_unlock(&bd_mapping->i_private_lock); + else + folio_unlock(folio); folio_put(folio); out: return ret; @@ -1394,14 +1396,15 @@ lookup_bh_lru(struct block_device *bdev, sector_t block, unsigned size) * it in the LRU and mark it as accessed. If it is not present then return * NULL */ -struct buffer_head * -__find_get_block(struct block_device *bdev, sector_t block, unsigned size) +static struct buffer_head * +find_get_block_common(struct block_device *bdev, sector_t block, + unsigned size, bool atomic) { struct buffer_head *bh = lookup_bh_lru(bdev, block, size); if (bh == NULL) { /* __find_get_block_slow will mark the page accessed */ - bh = __find_get_block_slow(bdev, block); + bh = __find_get_block_slow(bdev, block, atomic); if (bh) bh_lru_install(bh); } else @@ -1409,6 +1412,12 @@ __find_get_block(struct block_device *bdev, sector_t block, unsigned size) return bh; } + +struct buffer_head * +__find_get_block(struct block_device *bdev, sector_t block, unsigned size) +{ + return find_get_block_common(bdev, block, size, true); +} EXPORT_SYMBOL(__find_get_block); /** -- GitLab From e138fc2316c321271fd990e3f3bdd550fac37f9b Mon Sep 17 00:00:00 2001 From: Davidlohr Bueso Date: Thu, 17 Apr 2025 18:59:16 -0700 Subject: [PATCH 0032/2211] fs/buffer: introduce sleeping flavors for pagecache lookups [ Upstream commit 2814a7d3d2ff5d2cdd22936f641f758fdb971fa0 ] Add __find_get_block_nonatomic() and sb_find_get_block_nonatomic() calls for which users will be converted where safe. These versions will take the folio lock instead of the mapping's private_lock. Reviewed-by: Jan Kara Signed-off-by: Davidlohr Bueso Link: https://kdevops.org/ext4/v6.15-rc2.html # [0] Link: https://lore.kernel.org/all/aAAEvcrmREWa1SKF@bombadil.infradead.org/ # [1] Link: https://lore.kernel.org/20250418015921.132400-3-dave@stgolabs.net Tested-by: kdevops@lists.linux.dev Reviewed-by: Luis Chamberlain Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/buffer.c | 9 +++++++++ include/linux/buffer_head.h | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/fs/buffer.c b/fs/buffer.c index ba464c2002061..b04705eb6cc57 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -1420,6 +1420,15 @@ __find_get_block(struct block_device *bdev, sector_t block, unsigned size) } EXPORT_SYMBOL(__find_get_block); +/* same as __find_get_block() but allows sleeping contexts */ +struct buffer_head * +__find_get_block_nonatomic(struct block_device *bdev, sector_t block, + unsigned size) +{ + return find_get_block_common(bdev, block, size, false); +} +EXPORT_SYMBOL(__find_get_block_nonatomic); + /** * bdev_getblk - Get a buffer_head in a block device's buffer cache. * @bdev: The block device. diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 932139c5d46f5..ffcd76d977703 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -223,6 +223,8 @@ void __wait_on_buffer(struct buffer_head *); wait_queue_head_t *bh_waitq_head(struct buffer_head *bh); struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block, unsigned size); +struct buffer_head *__find_get_block_nonatomic(struct block_device *bdev, + sector_t block, unsigned size); struct buffer_head *bdev_getblk(struct block_device *bdev, sector_t block, unsigned size, gfp_t gfp); void __brelse(struct buffer_head *); @@ -398,6 +400,12 @@ sb_find_get_block(struct super_block *sb, sector_t block) return __find_get_block(sb->s_bdev, block, sb->s_blocksize); } +static inline struct buffer_head * +sb_find_get_block_nonatomic(struct super_block *sb, sector_t block) +{ + return __find_get_block_nonatomic(sb->s_bdev, block, sb->s_blocksize); +} + static inline void map_bh(struct buffer_head *bh, struct super_block *sb, sector_t block) { -- GitLab From a49a4a87cea36bf28de262338f7e9edf36cf944f Mon Sep 17 00:00:00 2001 From: Davidlohr Bueso Date: Thu, 17 Apr 2025 18:59:17 -0700 Subject: [PATCH 0033/2211] fs/buffer: use sleeping version of __find_get_block() [ Upstream commit 5b67d43976828dea2394eae2556b369bb7a61f64 ] Convert to the new nonatomic flavor to benefit from potential performance benefits and adapt in the future vs migration such that semantics are kept. Convert write_boundary_block() which already takes the buffer lock as well as bdev_getblk() depending on the respective gpf flags. There are no changes in semantics. Suggested-by: Jan Kara Reviewed-by: Jan Kara Signed-off-by: Davidlohr Bueso Link: https://kdevops.org/ext4/v6.15-rc2.html # [0] Link: https://lore.kernel.org/all/aAAEvcrmREWa1SKF@bombadil.infradead.org/ # [1] Link: https://lore.kernel.org/20250418015921.132400-4-dave@stgolabs.net Tested-by: kdevops@lists.linux.dev # [0] [1] Reviewed-by: Luis Chamberlain Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/buffer.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/buffer.c b/fs/buffer.c index b04705eb6cc57..e9e84512a027a 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -658,7 +658,9 @@ EXPORT_SYMBOL(generic_buffers_fsync); void write_boundary_block(struct block_device *bdev, sector_t bblock, unsigned blocksize) { - struct buffer_head *bh = __find_get_block(bdev, bblock + 1, blocksize); + struct buffer_head *bh; + + bh = __find_get_block_nonatomic(bdev, bblock + 1, blocksize); if (bh) { if (buffer_dirty(bh)) write_dirty_buffer(bh, 0); @@ -1446,7 +1448,12 @@ EXPORT_SYMBOL(__find_get_block_nonatomic); struct buffer_head *bdev_getblk(struct block_device *bdev, sector_t block, unsigned size, gfp_t gfp) { - struct buffer_head *bh = __find_get_block(bdev, block, size); + struct buffer_head *bh; + + if (gfpflags_allow_blocking(gfp)) + bh = __find_get_block_nonatomic(bdev, block, size); + else + bh = __find_get_block(bdev, block, size); might_alloc(gfp); if (bh) -- GitLab From aafc270531431c7851b003300ddf4ee21f9f49be Mon Sep 17 00:00:00 2001 From: Davidlohr Bueso Date: Thu, 17 Apr 2025 18:59:18 -0700 Subject: [PATCH 0034/2211] fs/ocfs2: use sleeping version of __find_get_block() [ Upstream commit a0b5ff07491010789fcb012bc8f9dad9d26f9a8b ] This is a path that allows for blocking as it does IO. Convert to the new nonatomic flavor to benefit from potential performance benefits and adapt in the future vs migration such that semantics are kept. Suggested-by: Jan Kara Reviewed-by: Jan Kara Signed-off-by: Davidlohr Bueso Link: https://kdevops.org/ext4/v6.15-rc2.html # [0] Link: https://lore.kernel.org/all/aAAEvcrmREWa1SKF@bombadil.infradead.org/ # [1] Link: https://lore.kernel.org/20250418015921.132400-5-dave@stgolabs.net Tested-by: kdevops@lists.linux.dev Reviewed-by: Luis Chamberlain Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/ocfs2/journal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c index 2ebee1dced1b2..c2a73bfb16aa4 100644 --- a/fs/ocfs2/journal.c +++ b/fs/ocfs2/journal.c @@ -1271,7 +1271,7 @@ static int ocfs2_force_read_journal(struct inode *inode) } for (i = 0; i < p_blocks; i++, p_blkno++) { - bh = __find_get_block(osb->sb->s_bdev, p_blkno, + bh = __find_get_block_nonatomic(osb->sb->s_bdev, p_blkno, osb->sb->s_blocksize); /* block not cached. */ if (!bh) -- GitLab From f1c5aa614b5c251f93a6a4c8c26001d5e9e53fd6 Mon Sep 17 00:00:00 2001 From: Davidlohr Bueso Date: Thu, 17 Apr 2025 18:59:19 -0700 Subject: [PATCH 0035/2211] fs/jbd2: use sleeping version of __find_get_block() [ Upstream commit f76d4c28a46a9260d85e00dafc8f46d369365d33 ] Convert to the new nonatomic flavor to benefit from potential performance benefits and adapt in the future vs migration such that semantics are kept. - jbd2_journal_revoke(): can sleep (has might_sleep() in the beginning) - jbd2_journal_cancel_revoke(): only used from do_get_write_access() and do_get_create_access() which do sleep. So can sleep. - jbd2_clear_buffer_revoked_flags() - only called from journal commit code which sleeps. So can sleep. Suggested-by: Jan Kara Reviewed-by: Jan Kara Signed-off-by: Davidlohr Bueso Link: https://kdevops.org/ext4/v6.15-rc2.html # [0] Link: https://lore.kernel.org/all/aAAEvcrmREWa1SKF@bombadil.infradead.org/ # [1] Link: https://lore.kernel.org/20250418015921.132400-6-dave@stgolabs.net Tested-by: kdevops@lists.linux.dev Reviewed-by: Luis Chamberlain Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/jbd2/revoke.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/fs/jbd2/revoke.c b/fs/jbd2/revoke.c index ce63d5fde9c3a..f68fc8c255f00 100644 --- a/fs/jbd2/revoke.c +++ b/fs/jbd2/revoke.c @@ -345,7 +345,8 @@ int jbd2_journal_revoke(handle_t *handle, unsigned long long blocknr, bh = bh_in; if (!bh) { - bh = __find_get_block(bdev, blocknr, journal->j_blocksize); + bh = __find_get_block_nonatomic(bdev, blocknr, + journal->j_blocksize); if (bh) BUFFER_TRACE(bh, "found on hash"); } @@ -355,7 +356,8 @@ int jbd2_journal_revoke(handle_t *handle, unsigned long long blocknr, /* If there is a different buffer_head lying around in * memory anywhere... */ - bh2 = __find_get_block(bdev, blocknr, journal->j_blocksize); + bh2 = __find_get_block_nonatomic(bdev, blocknr, + journal->j_blocksize); if (bh2) { /* ... and it has RevokeValid status... */ if (bh2 != bh && buffer_revokevalid(bh2)) @@ -466,7 +468,8 @@ int jbd2_journal_cancel_revoke(handle_t *handle, struct journal_head *jh) * state machine will get very upset later on. */ if (need_cancel) { struct buffer_head *bh2; - bh2 = __find_get_block(bh->b_bdev, bh->b_blocknr, bh->b_size); + bh2 = __find_get_block_nonatomic(bh->b_bdev, bh->b_blocknr, + bh->b_size); if (bh2) { if (bh2 != bh) clear_buffer_revoked(bh2); @@ -495,9 +498,9 @@ void jbd2_clear_buffer_revoked_flags(journal_t *journal) struct jbd2_revoke_record_s *record; struct buffer_head *bh; record = (struct jbd2_revoke_record_s *)list_entry; - bh = __find_get_block(journal->j_fs_dev, - record->blocknr, - journal->j_blocksize); + bh = __find_get_block_nonatomic(journal->j_fs_dev, + record->blocknr, + journal->j_blocksize); if (bh) { clear_buffer_revoked(bh); __brelse(bh); -- GitLab From 9ece099e951a56f4de07a3a45d7cedf739abe598 Mon Sep 17 00:00:00 2001 From: Davidlohr Bueso Date: Thu, 17 Apr 2025 18:59:20 -0700 Subject: [PATCH 0036/2211] fs/ext4: use sleeping version of sb_find_get_block() [ Upstream commit 6e8f57fd09c9fb569d10b2ccc3878155b702591a ] Enable ext4_free_blocks() to use it, which has a cond_resched to begin with. Convert to the new nonatomic flavor to benefit from potential performance benefits and adapt in the future vs migration such that semantics are kept. Suggested-by: Jan Kara Reviewed-by: Jan Kara Signed-off-by: Davidlohr Bueso Link: https://kdevops.org/ext4/v6.15-rc2.html # [0] Link: https://lore.kernel.org/all/aAAEvcrmREWa1SKF@bombadil.infradead.org/ # [1] Link: https://lore.kernel.org/20250418015921.132400-7-dave@stgolabs.net Tested-by: kdevops@lists.linux.dev Reviewed-by: Luis Chamberlain Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/ext4/mballoc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 92f49d7eb3c00..109cf88e7caac 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -6644,7 +6644,8 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode, for (i = 0; i < count; i++) { cond_resched(); if (is_metadata) - bh = sb_find_get_block(inode->i_sb, block + i); + bh = sb_find_get_block_nonatomic(inode->i_sb, + block + i); ext4_forget(handle, is_metadata, inode, bh, block + i); } } -- GitLab From 36cb568f559addbace05ea97f3a5dc076945e97e Mon Sep 17 00:00:00 2001 From: Nicholas Susanto Date: Wed, 2 Apr 2025 15:04:08 -0400 Subject: [PATCH 0037/2211] drm/amd/display: Enable urgent latency adjustment on DCN35 [ Upstream commit 756c85e4d0ddc497b4ad5b1f41ad54e838e06188 ] [Why] Urgent latency adjustment was disabled on DCN35 due to issues with P0 enablement on some platforms. Without urgent latency, underflows occur when doing certain high timing configurations. After testing, we found that reenabling urgent latency didn't reintroduce p0 support on multiple platforms. [How] renable urgent latency on DCN35 and setting it to 3000 Mhz. This reverts commit 3412860cc4c0c484f53f91b371483e6e4440c3e5. Reviewed-by: Charlene Liu Signed-off-by: Nicholas Susanto Signed-off-by: Zaeem Mohamed Tested-by: Mark Broadworth Signed-off-by: Alex Deucher (cherry picked from commit cd74ce1f0cddffb3f36d0995d0f61e89f0010738) Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c index 47d785204f29c..beed7adbbd43e 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c @@ -195,9 +195,9 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_5_soc = { .dcn_downspread_percent = 0.5, .gpuvm_min_page_size_bytes = 4096, .hostvm_min_page_size_bytes = 4096, - .do_urgent_latency_adjustment = 0, + .do_urgent_latency_adjustment = 1, .urgent_latency_adjustment_fabric_clock_component_us = 0, - .urgent_latency_adjustment_fabric_clock_reference_mhz = 0, + .urgent_latency_adjustment_fabric_clock_reference_mhz = 3000, }; void dcn35_build_wm_range_table_fpu(struct clk_mgr *clk_mgr) -- GitLab From cd39fae34f0949104045fdeac522829491c6d6b0 Mon Sep 17 00:00:00 2001 From: Felix Kuehling Date: Wed, 16 Apr 2025 00:19:13 -0400 Subject: [PATCH 0038/2211] drm/amdgpu: Allow P2P access through XGMI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit a92741e72f91b904c1d8c3d409ed8dbe9c1f2b26 ] If peer memory is accessible through XGMI, allow leaving it in VRAM rather than forcing its migration to GTT on DMABuf attachment. Signed-off-by: Felix Kuehling Tested-by: Hao (Claire) Zhou Reviewed-by: Christian König Signed-off-by: Alex Deucher (cherry picked from commit 372c8d72c3680fdea3fbb2d6b089f76b4a6d596a) Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 30 ++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c index 2f90fff1b9ddc..e63a32c214475 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c @@ -42,6 +42,29 @@ #include #include +static const struct dma_buf_attach_ops amdgpu_dma_buf_attach_ops; + +/** + * dma_buf_attach_adev - Helper to get adev of an attachment + * + * @attach: attachment + * + * Returns: + * A struct amdgpu_device * if the attaching device is an amdgpu device or + * partition, NULL otherwise. + */ +static struct amdgpu_device *dma_buf_attach_adev(struct dma_buf_attachment *attach) +{ + if (attach->importer_ops == &amdgpu_dma_buf_attach_ops) { + struct drm_gem_object *obj = attach->importer_priv; + struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); + + return amdgpu_ttm_adev(bo->tbo.bdev); + } + + return NULL; +} + /** * amdgpu_dma_buf_attach - &dma_buf_ops.attach implementation * @@ -53,11 +76,13 @@ static int amdgpu_dma_buf_attach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach) { + struct amdgpu_device *attach_adev = dma_buf_attach_adev(attach); struct drm_gem_object *obj = dmabuf->priv; struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); - if (pci_p2pdma_distance(adev->pdev, attach->dev, false) < 0) + if (!amdgpu_dmabuf_is_xgmi_accessible(attach_adev, bo) && + pci_p2pdma_distance(adev->pdev, attach->dev, false) < 0) attach->peer2peer = false; return 0; @@ -456,6 +481,9 @@ bool amdgpu_dmabuf_is_xgmi_accessible(struct amdgpu_device *adev, struct drm_gem_object *obj = &bo->tbo.base; struct drm_gem_object *gobj; + if (!adev) + return false; + if (obj->import_attach) { struct dma_buf *dma_buf = obj->import_attach->dmabuf; -- GitLab From e9f646f089bc37c350da6cbc78e61abfa0fa5673 Mon Sep 17 00:00:00 2001 From: Ihor Solodrai Date: Wed, 16 Apr 2025 10:02:46 -0700 Subject: [PATCH 0039/2211] selftests/bpf: Mitigate sockmap_ktls disconnect_after_delete failure [ Upstream commit f2858f308131a09e33afb766cd70119b5b900569 ] "sockmap_ktls disconnect_after_delete" test has been failing on BPF CI after recent merges from netdev: * https://github.com/kernel-patches/bpf/actions/runs/14458537639 * https://github.com/kernel-patches/bpf/actions/runs/14457178732 It happens because disconnect has been disabled for TLS [1], and it renders the test case invalid. Removing all the test code creates a conflict between bpf and bpf-next, so for now only remove the offending assert [2]. The test will be removed later on bpf-next. [1] https://lore.kernel.org/netdev/20250404180334.3224206-1-kuba@kernel.org/ [2] https://lore.kernel.org/bpf/cfc371285323e1a3f3b006bfcf74e6cf7ad65258@linux.dev/ Signed-off-by: Ihor Solodrai Signed-off-by: Andrii Nakryiko Reviewed-by: Jiayuan Chen Link: https://lore.kernel.org/bpf/20250416170246.2438524-1-ihor.solodrai@linux.dev Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- tools/testing/selftests/bpf/prog_tests/sockmap_ktls.c | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/testing/selftests/bpf/prog_tests/sockmap_ktls.c b/tools/testing/selftests/bpf/prog_tests/sockmap_ktls.c index 2d0796314862a..0a99fd404f6dc 100644 --- a/tools/testing/selftests/bpf/prog_tests/sockmap_ktls.c +++ b/tools/testing/selftests/bpf/prog_tests/sockmap_ktls.c @@ -68,7 +68,6 @@ static void test_sockmap_ktls_disconnect_after_delete(int family, int map) goto close_cli; err = disconnect(cli); - ASSERT_OK(err, "disconnect"); close_cli: close(cli); -- GitLab From 64f505b08e0cfd8163491c8c082d4f47a88e51d4 Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Wed, 23 Apr 2025 12:53:42 -0700 Subject: [PATCH 0040/2211] block: fix race between set_blocksize and read paths [ Upstream commit c0e473a0d226479e8e925d5ba93f751d8df628e9 ] With the new large sector size support, it's now the case that set_blocksize can change i_blksize and the folio order in a manner that conflicts with a concurrent reader and causes a kernel crash. Specifically, let's say that udev-worker calls libblkid to detect the labels on a block device. The read call can create an order-0 folio to read the first 4096 bytes from the disk. But then udev is preempted. Next, someone tries to mount an 8k-sectorsize filesystem from the same block device. The filesystem calls set_blksize, which sets i_blksize to 8192 and the minimum folio order to 1. Now udev resumes, still holding the order-0 folio it allocated. It then tries to schedule a read bio and do_mpage_readahead tries to create bufferheads for the folio. Unfortunately, blocks_per_folio == 0 because the page size is 4096 but the blocksize is 8192 so no bufferheads are attached and the bh walk never sets bdev. We then submit the bio with a NULL block device and crash. Therefore, truncate the page cache after flushing but before updating i_blksize. However, that's not enough -- we also need to lock out file IO and page faults during the update. Take both the i_rwsem and the invalidate_lock in exclusive mode for invalidations, and in shared mode for read/write operations. I don't know if this is the correct fix, but xfs/259 found it. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig Reviewed-by: Luis Chamberlain Tested-by: Shin'ichiro Kawasaki Link: https://lore.kernel.org/r/174543795699.4139148.2086129139322431423.stgit@frogsfrogsfrogs Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- block/bdev.c | 17 +++++++++++++++++ block/blk-zoned.c | 5 ++++- block/fops.c | 16 ++++++++++++++++ block/ioctl.c | 6 ++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/block/bdev.c b/block/bdev.c index 738e3c8457e7f..e7daca6565ea6 100644 --- a/block/bdev.c +++ b/block/bdev.c @@ -168,9 +168,26 @@ int set_blocksize(struct file *file, int size) /* Don't change the size if it is same as current */ if (inode->i_blkbits != blksize_bits(size)) { + /* + * Flush and truncate the pagecache before we reconfigure the + * mapping geometry because folio sizes are variable now. If a + * reader has already allocated a folio whose size is smaller + * than the new min_order but invokes readahead after the new + * min_order becomes visible, readahead will think there are + * "zero" blocks per folio and crash. Take the inode and + * invalidation locks to avoid racing with + * read/write/fallocate. + */ + inode_lock(inode); + filemap_invalidate_lock(inode->i_mapping); + sync_blockdev(bdev); + kill_bdev(bdev); + inode->i_blkbits = blksize_bits(size); kill_bdev(bdev); + filemap_invalidate_unlock(inode->i_mapping); + inode_unlock(inode); } return 0; } diff --git a/block/blk-zoned.c b/block/blk-zoned.c index c11db5be25324..414118435240a 100644 --- a/block/blk-zoned.c +++ b/block/blk-zoned.c @@ -347,6 +347,7 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode, op = REQ_OP_ZONE_RESET; /* Invalidate the page cache, including dirty pages. */ + inode_lock(bdev->bd_mapping->host); filemap_invalidate_lock(bdev->bd_mapping); ret = blkdev_truncate_zone_range(bdev, mode, &zrange); if (ret) @@ -368,8 +369,10 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode, ret = blkdev_zone_mgmt(bdev, op, zrange.sector, zrange.nr_sectors); fail: - if (cmd == BLKRESETZONE) + if (cmd == BLKRESETZONE) { filemap_invalidate_unlock(bdev->bd_mapping); + inode_unlock(bdev->bd_mapping->host); + } return ret; } diff --git a/block/fops.c b/block/fops.c index 43983be5a2b3b..d4b1d942f2700 100644 --- a/block/fops.c +++ b/block/fops.c @@ -721,7 +721,14 @@ static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from) ret = direct_write_fallback(iocb, from, ret, blkdev_buffered_write(iocb, from)); } else { + /* + * Take i_rwsem and invalidate_lock to avoid racing with + * set_blocksize changing i_blkbits/folio order and punching + * out the pagecache. + */ + inode_lock_shared(bd_inode); ret = blkdev_buffered_write(iocb, from); + inode_unlock_shared(bd_inode); } if (ret > 0) @@ -732,6 +739,7 @@ static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from) static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to) { + struct inode *bd_inode = bdev_file_inode(iocb->ki_filp); struct block_device *bdev = I_BDEV(iocb->ki_filp->f_mapping->host); loff_t size = bdev_nr_bytes(bdev); loff_t pos = iocb->ki_pos; @@ -768,7 +776,13 @@ static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to) goto reexpand; } + /* + * Take i_rwsem and invalidate_lock to avoid racing with set_blocksize + * changing i_blkbits/folio order and punching out the pagecache. + */ + inode_lock_shared(bd_inode); ret = filemap_read(iocb, to, ret); + inode_unlock_shared(bd_inode); reexpand: if (unlikely(shorted)) @@ -811,6 +825,7 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start, if ((start | len) & (bdev_logical_block_size(bdev) - 1)) return -EINVAL; + inode_lock(inode); filemap_invalidate_lock(inode->i_mapping); /* @@ -843,6 +858,7 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start, fail: filemap_invalidate_unlock(inode->i_mapping); + inode_unlock(inode); return error; } diff --git a/block/ioctl.c b/block/ioctl.c index 6554b728bae6a..919066b4bb49c 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -141,6 +141,7 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode, if (err) return err; + inode_lock(bdev->bd_mapping->host); filemap_invalidate_lock(bdev->bd_mapping); err = truncate_bdev_range(bdev, mode, start, start + len - 1); if (err) @@ -173,6 +174,7 @@ out_unplug: blk_finish_plug(&plug); fail: filemap_invalidate_unlock(bdev->bd_mapping); + inode_unlock(bdev->bd_mapping->host); return err; } @@ -198,12 +200,14 @@ static int blk_ioctl_secure_erase(struct block_device *bdev, blk_mode_t mode, end > bdev_nr_bytes(bdev)) return -EINVAL; + inode_lock(bdev->bd_mapping->host); filemap_invalidate_lock(bdev->bd_mapping); err = truncate_bdev_range(bdev, mode, start, end - 1); if (!err) err = blkdev_issue_secure_erase(bdev, start >> 9, len >> 9, GFP_KERNEL); filemap_invalidate_unlock(bdev->bd_mapping); + inode_unlock(bdev->bd_mapping->host); return err; } @@ -235,6 +239,7 @@ static int blk_ioctl_zeroout(struct block_device *bdev, blk_mode_t mode, return -EINVAL; /* Invalidate the page cache, including dirty pages */ + inode_lock(bdev->bd_mapping->host); filemap_invalidate_lock(bdev->bd_mapping); err = truncate_bdev_range(bdev, mode, start, end); if (err) @@ -245,6 +250,7 @@ static int blk_ioctl_zeroout(struct block_device *bdev, blk_mode_t mode, fail: filemap_invalidate_unlock(bdev->bd_mapping); + inode_unlock(bdev->bd_mapping->host); return err; } -- GitLab From 218c838d0356a4305a5705fa4599b682d6312144 Mon Sep 17 00:00:00 2001 From: Pavel Begunkov Date: Thu, 24 Apr 2025 12:28:39 +0100 Subject: [PATCH 0041/2211] io_uring: don't duplicate flushing in io_req_post_cqe [ Upstream commit 5e16f1a68d28965c12b6fa227a306fef8a680f84 ] io_req_post_cqe() sets submit_state.cq_flush so that *flush_completions() can take care of batch commiting CQEs. Don't commit it twice by using __io_cq_unlock_post(). Signed-off-by: Pavel Begunkov Link: https://lore.kernel.org/r/41c416660c509cee676b6cad96081274bcb459f3.1745493861.git.asml.silence@gmail.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- io_uring/io_uring.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index 8ef0603c07f11..985c87ea09a90 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -874,10 +874,15 @@ bool io_req_post_cqe(struct io_kiocb *req, s32 res, u32 cflags) lockdep_assert(!io_wq_current_is_worker()); lockdep_assert_held(&ctx->uring_lock); - __io_cq_lock(ctx); - posted = io_fill_cqe_aux(ctx, req->cqe.user_data, res, cflags); + if (!ctx->lockless_cq) { + spin_lock(&ctx->completion_lock); + posted = io_fill_cqe_aux(ctx, req->cqe.user_data, res, cflags); + spin_unlock(&ctx->completion_lock); + } else { + posted = io_fill_cqe_aux(ctx, req->cqe.user_data, res, cflags); + } + ctx->submit_state.cq_flush = true; - __io_cq_unlock_post(ctx); return posted; } -- GitLab From 8014d3e56ec0c662a1bc059b3e6b46b6103879d4 Mon Sep 17 00:00:00 2001 From: Brandon Kammerdiener Date: Thu, 24 Apr 2025 11:32:51 -0400 Subject: [PATCH 0042/2211] bpf: fix possible endless loop in BPF map iteration [ Upstream commit 75673fda0c557ae26078177dd14d4857afbf128d ] The _safe variant used here gets the next element before running the callback, avoiding the endless loop condition. Signed-off-by: Brandon Kammerdiener Link: https://lore.kernel.org/r/20250424153246.141677-2-brandon.kammerdiener@intel.com Signed-off-by: Alexei Starovoitov Acked-by: Hou Tao Signed-off-by: Sasha Levin --- kernel/bpf/hashtab.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c index bb3ba8ebaf3d2..570e2f7231443 100644 --- a/kernel/bpf/hashtab.c +++ b/kernel/bpf/hashtab.c @@ -2223,7 +2223,7 @@ static long bpf_for_each_hash_elem(struct bpf_map *map, bpf_callback_t callback_ b = &htab->buckets[i]; rcu_read_lock(); head = &b->head; - hlist_nulls_for_each_entry_rcu(elem, n, head, hash_node) { + hlist_nulls_for_each_entry_safe(elem, n, head, hash_node) { key = elem->key; if (is_percpu) { /* current cpu value for percpu map */ -- GitLab From dac9d6ad5eaf76a05e5a7367c7d8e7af41e700dd Mon Sep 17 00:00:00 2001 From: Haoran Jiang Date: Fri, 25 Apr 2025 17:50:42 +0800 Subject: [PATCH 0043/2211] samples/bpf: Fix compilation failure for samples/bpf on LoongArch Fedora [ Upstream commit 548762f05d19c5542db7590bcdfb9be1fb928376 ] When building the latest samples/bpf on LoongArch Fedora make M=samples/bpf There are compilation errors as follows: In file included from ./linux/samples/bpf/sockex2_kern.c:2: In file included from ./include/uapi/linux/in.h:25: In file included from ./include/linux/socket.h:8: In file included from ./include/linux/uio.h:9: In file included from ./include/linux/thread_info.h:60: In file included from ./arch/loongarch/include/asm/thread_info.h:15: In file included from ./arch/loongarch/include/asm/processor.h:13: In file included from ./arch/loongarch/include/asm/cpu-info.h:11: ./arch/loongarch/include/asm/loongarch.h:13:10: fatal error: 'larchintrin.h' file not found ^~~~~~~~~~~~~~~ 1 error generated. larchintrin.h is included in /usr/lib64/clang/14.0.6/include, and the header file location is specified at compile time. Test on LoongArch Fedora: https://github.com/fedora-remix-loongarch/releases-info Signed-off-by: Haoran Jiang Signed-off-by: zhangxi Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250425095042.838824-1-jianghaoran@kylinos.cn Signed-off-by: Sasha Levin --- samples/bpf/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index 7afe040cf43b3..f06f88b26183c 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -400,7 +400,7 @@ $(obj)/%.o: $(src)/%.c @echo " CLANG-bpf " $@ $(Q)$(CLANG) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(BPF_EXTRA_CFLAGS) \ -I$(obj) -I$(srctree)/tools/testing/selftests/bpf/ \ - -I$(LIBBPF_INCLUDE) \ + -I$(LIBBPF_INCLUDE) $(CLANG_SYS_INCLUDES) \ -D__KERNEL__ -D__BPF_TRACING__ -Wno-unused-value -Wno-pointer-sign \ -D__TARGET_ARCH_$(SRCARCH) -Wno-compare-distinct-pointer-types \ -Wno-gnu-variable-sized-type-not-at-end \ -- GitLab From 192b02f8c7ba824d65945cb40ae4199bc6cef744 Mon Sep 17 00:00:00 2001 From: Daniel Gomez Date: Fri, 28 Mar 2025 14:28:37 +0000 Subject: [PATCH 0044/2211] kconfig: merge_config: use an empty file as initfile [ Upstream commit a26fe287eed112b4e21e854f173c8918a6a8596d ] The scripts/kconfig/merge_config.sh script requires an existing $INITFILE (or the $1 argument) as a base file for merging Kconfig fragments. However, an empty $INITFILE can serve as an initial starting point, later referenced by the KCONFIG_ALLCONFIG Makefile variable if -m is not used. This variable can point to any configuration file containing preset config symbols (the merged output) as stated in Documentation/kbuild/kconfig.rst. When -m is used $INITFILE will contain just the merge output requiring the user to run make (i.e. KCONFIG_ALLCONFIG=<$INITFILE> make or make olddefconfig). Instead of failing when `$INITFILE` is missing, create an empty file and use it as the starting point for merges. Signed-off-by: Daniel Gomez Signed-off-by: Masahiro Yamada Signed-off-by: Sasha Levin --- scripts/kconfig/merge_config.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/kconfig/merge_config.sh b/scripts/kconfig/merge_config.sh index 0b7952471c18f..79c09b378be81 100755 --- a/scripts/kconfig/merge_config.sh +++ b/scripts/kconfig/merge_config.sh @@ -112,8 +112,8 @@ INITFILE=$1 shift; if [ ! -r "$INITFILE" ]; then - echo "The base file '$INITFILE' does not exist. Exit." >&2 - exit 1 + echo "The base file '$INITFILE' does not exist. Creating one..." >&2 + touch "$INITFILE" fi MERGE_LIST=$* -- GitLab From c42f740a07eea4807e98d2d8febc549c957a7b49 Mon Sep 17 00:00:00 2001 From: "Xin Li (Intel)" Date: Tue, 1 Apr 2025 00:57:27 -0700 Subject: [PATCH 0045/2211] x86/fred: Fix system hang during S4 resume with FRED enabled [ Upstream commit e5f1e8af9c9e151ecd665f6d2e36fb25fec3b110 ] Upon a wakeup from S4, the restore kernel starts and initializes the FRED MSRs as needed from its perspective. It then loads a hibernation image, including the image kernel, and attempts to load image pages directly into their original page frames used before hibernation unless those frames are currently in use. Once all pages are moved to their original locations, it jumps to a "trampoline" page in the image kernel. At this point, the image kernel takes control, but the FRED MSRs still contain values set by the restore kernel, which may differ from those set by the image kernel before hibernation. Therefore, the image kernel must ensure the FRED MSRs have the same values as before hibernation. Since these values depend only on the location of the kernel text and data, they can be recomputed from scratch. Reported-by: Xi Pardee Reported-by: Todd Brandt Tested-by: Todd Brandt Suggested-by: H. Peter Anvin (Intel) Signed-off-by: Xin Li (Intel) Signed-off-by: Ingo Molnar Reviewed-by: Rafael J. Wysocki Reviewed-by: H. Peter Anvin (Intel) Cc: Andy Lutomirski Cc: Brian Gerst Cc: Juergen Gross Cc: Linus Torvalds Link: https://lore.kernel.org/r/20250401075728.3626147-1-xin@zytor.com Signed-off-by: Sasha Levin --- arch/x86/power/cpu.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c index 63230ff8cf4f0..08e76a5ca1553 100644 --- a/arch/x86/power/cpu.c +++ b/arch/x86/power/cpu.c @@ -27,6 +27,7 @@ #include #include #include +#include #ifdef CONFIG_X86_32 __visible unsigned long saved_context_ebx; @@ -231,6 +232,19 @@ static void notrace __restore_processor_state(struct saved_context *ctxt) */ #ifdef CONFIG_X86_64 wrmsrl(MSR_GS_BASE, ctxt->kernelmode_gs_base); + + /* + * Reinitialize FRED to ensure the FRED MSRs contain the same values + * as before hibernation. + * + * Note, the setup of FRED RSPs requires access to percpu data + * structures. Therefore, FRED reinitialization can only occur after + * the percpu access pointer (i.e., MSR_GS_BASE) is restored. + */ + if (ctxt->cr4 & X86_CR4_FRED) { + cpu_init_fred_exceptions(); + cpu_init_fred_rsps(); + } #else loadsegment(fs, __KERNEL_PERCPU); #endif -- GitLab From 100b452e0eedabd3b30a2b4df998e207e516864e Mon Sep 17 00:00:00 2001 From: Anthony Krowiak Date: Tue, 11 Mar 2025 06:32:57 -0400 Subject: [PATCH 0046/2211] s390/vfio-ap: Fix no AP queue sharing allowed message written to kernel log [ Upstream commit d33d729afcc8ad2148d99f9bc499b33fd0c0d73b ] An erroneous message is written to the kernel log when either of the following actions are taken by a user: 1. Assign an adapter or domain to a vfio_ap mediated device via its sysfs assign_adapter or assign_domain attributes that would result in one or more AP queues being assigned that are already assigned to a different mediated device. Sharing of queues between mdevs is not allowed. 2. Reserve an adapter or domain for the host device driver via the AP bus driver's sysfs apmask or aqmask attribute that would result in providing host access to an AP queue that is in use by a vfio_ap mediated device. Reserving a queue for a host driver that is in use by an mdev is not allowed. In both cases, the assignment will return an error; however, a message like the following is written to the kernel log: vfio_ap_mdev e1839397-51a0-4e3c-91e0-c3b9c3d3047d: Userspace may not re-assign queue 00.0028 already assigned to \ e1839397-51a0-4e3c-91e0-c3b9c3d3047d Notice the mdev reporting the error is the same as the mdev identified in the message as the one to which the queue is being assigned. It is perfectly okay to assign a queue to an mdev to which it is already assigned; the assignment is simply ignored by the vfio_ap device driver. This patch logs more descriptive and accurate messages for both 1 and 2 above to the kernel log: Example for 1: vfio_ap_mdev 0fe903a0-a323-44db-9daf-134c68627d61: Userspace may not assign queue 00.0033 to mdev: already assigned to \ 62177883-f1bb-47f0-914d-32a22e3a8804 Example for 2: vfio_ap_mdev 62177883-f1bb-47f0-914d-32a22e3a8804: Can not reserve queue 00.0033 for host driver: in use by mdev Signed-off-by: Anthony Krowiak Link: https://lore.kernel.org/r/20250311103304.1539188-1-akrowiak@linux.ibm.com Signed-off-by: Heiko Carstens Signed-off-by: Vasily Gorbik Signed-off-by: Sasha Levin --- drivers/s390/crypto/vfio_ap_ops.c | 72 ++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_ap_ops.c index 9f76f2d7b66e5..3bac163057d89 100644 --- a/drivers/s390/crypto/vfio_ap_ops.c +++ b/drivers/s390/crypto/vfio_ap_ops.c @@ -851,48 +851,66 @@ static void vfio_ap_mdev_remove(struct mdev_device *mdev) vfio_put_device(&matrix_mdev->vdev); } -#define MDEV_SHARING_ERR "Userspace may not re-assign queue %02lx.%04lx " \ - "already assigned to %s" +#define MDEV_SHARING_ERR "Userspace may not assign queue %02lx.%04lx to mdev: already assigned to %s" -static void vfio_ap_mdev_log_sharing_err(struct ap_matrix_mdev *matrix_mdev, - unsigned long *apm, - unsigned long *aqm) +#define MDEV_IN_USE_ERR "Can not reserve queue %02lx.%04lx for host driver: in use by mdev" + +static void vfio_ap_mdev_log_sharing_err(struct ap_matrix_mdev *assignee, + struct ap_matrix_mdev *assigned_to, + unsigned long *apm, unsigned long *aqm) { unsigned long apid, apqi; - const struct device *dev = mdev_dev(matrix_mdev->mdev); - const char *mdev_name = dev_name(dev); - for_each_set_bit_inv(apid, apm, AP_DEVICES) + for_each_set_bit_inv(apid, apm, AP_DEVICES) { + for_each_set_bit_inv(apqi, aqm, AP_DOMAINS) { + dev_warn(mdev_dev(assignee->mdev), MDEV_SHARING_ERR, + apid, apqi, dev_name(mdev_dev(assigned_to->mdev))); + } + } +} + +static void vfio_ap_mdev_log_in_use_err(struct ap_matrix_mdev *assignee, + unsigned long *apm, unsigned long *aqm) +{ + unsigned long apid, apqi; + + for_each_set_bit_inv(apid, apm, AP_DEVICES) { for_each_set_bit_inv(apqi, aqm, AP_DOMAINS) - dev_warn(dev, MDEV_SHARING_ERR, apid, apqi, mdev_name); + dev_warn(mdev_dev(assignee->mdev), MDEV_IN_USE_ERR, apid, apqi); + } } /** * vfio_ap_mdev_verify_no_sharing - verify APQNs are not shared by matrix mdevs * + * @assignee: the matrix mdev to which @mdev_apm and @mdev_aqm are being + * assigned; or, NULL if this function was called by the AP bus + * driver in_use callback to verify none of the APQNs being reserved + * for the host device driver are in use by a vfio_ap mediated device * @mdev_apm: mask indicating the APIDs of the APQNs to be verified * @mdev_aqm: mask indicating the APQIs of the APQNs to be verified * - * Verifies that each APQN derived from the Cartesian product of a bitmap of - * AP adapter IDs and AP queue indexes is not configured for any matrix - * mediated device. AP queue sharing is not allowed. + * Verifies that each APQN derived from the Cartesian product of APIDs + * represented by the bits set in @mdev_apm and the APQIs of the bits set in + * @mdev_aqm is not assigned to a mediated device other than the mdev to which + * the APQN is being assigned (@assignee). AP queue sharing is not allowed. * * Return: 0 if the APQNs are not shared; otherwise return -EADDRINUSE. */ -static int vfio_ap_mdev_verify_no_sharing(unsigned long *mdev_apm, +static int vfio_ap_mdev_verify_no_sharing(struct ap_matrix_mdev *assignee, + unsigned long *mdev_apm, unsigned long *mdev_aqm) { - struct ap_matrix_mdev *matrix_mdev; + struct ap_matrix_mdev *assigned_to; DECLARE_BITMAP(apm, AP_DEVICES); DECLARE_BITMAP(aqm, AP_DOMAINS); - list_for_each_entry(matrix_mdev, &matrix_dev->mdev_list, node) { + list_for_each_entry(assigned_to, &matrix_dev->mdev_list, node) { /* - * If the input apm and aqm are fields of the matrix_mdev - * object, then move on to the next matrix_mdev. + * If the mdev to which the mdev_apm and mdev_aqm is being + * assigned is the same as the mdev being verified */ - if (mdev_apm == matrix_mdev->matrix.apm && - mdev_aqm == matrix_mdev->matrix.aqm) + if (assignee == assigned_to) continue; memset(apm, 0, sizeof(apm)); @@ -902,15 +920,16 @@ static int vfio_ap_mdev_verify_no_sharing(unsigned long *mdev_apm, * We work on full longs, as we can only exclude the leftover * bits in non-inverse order. The leftover is all zeros. */ - if (!bitmap_and(apm, mdev_apm, matrix_mdev->matrix.apm, - AP_DEVICES)) + if (!bitmap_and(apm, mdev_apm, assigned_to->matrix.apm, AP_DEVICES)) continue; - if (!bitmap_and(aqm, mdev_aqm, matrix_mdev->matrix.aqm, - AP_DOMAINS)) + if (!bitmap_and(aqm, mdev_aqm, assigned_to->matrix.aqm, AP_DOMAINS)) continue; - vfio_ap_mdev_log_sharing_err(matrix_mdev, apm, aqm); + if (assignee) + vfio_ap_mdev_log_sharing_err(assignee, assigned_to, apm, aqm); + else + vfio_ap_mdev_log_in_use_err(assigned_to, apm, aqm); return -EADDRINUSE; } @@ -939,7 +958,8 @@ static int vfio_ap_mdev_validate_masks(struct ap_matrix_mdev *matrix_mdev) matrix_mdev->matrix.aqm)) return -EADDRNOTAVAIL; - return vfio_ap_mdev_verify_no_sharing(matrix_mdev->matrix.apm, + return vfio_ap_mdev_verify_no_sharing(matrix_mdev, + matrix_mdev->matrix.apm, matrix_mdev->matrix.aqm); } @@ -2467,7 +2487,7 @@ int vfio_ap_mdev_resource_in_use(unsigned long *apm, unsigned long *aqm) mutex_lock(&matrix_dev->guests_lock); mutex_lock(&matrix_dev->mdevs_lock); - ret = vfio_ap_mdev_verify_no_sharing(apm, aqm); + ret = vfio_ap_mdev_verify_no_sharing(NULL, apm, aqm); mutex_unlock(&matrix_dev->mdevs_lock); mutex_unlock(&matrix_dev->guests_lock); -- GitLab From 6ebb9d54eccc8026b386e76eff69364d33373da5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Mon, 9 Dec 2024 20:44:23 +0100 Subject: [PATCH 0047/2211] cifs: Add fallback for SMB2 CREATE without FILE_READ_ATTRIBUTES MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit e255612b5ed9f179abe8196df7c2ba09dd227900 ] Some operations, like WRITE, does not require FILE_READ_ATTRIBUTES access. So when FILE_READ_ATTRIBUTES is not explicitly requested for smb2_open_file() then first try to do SMB2 CREATE with FILE_READ_ATTRIBUTES access (like it was before) and then fallback to SMB2 CREATE without FILE_READ_ATTRIBUTES access (less common case). This change allows to complete WRITE operation to a file when it does not grant FILE_READ_ATTRIBUTES permission and its parent directory does not grant READ_DATA permission (parent directory READ_DATA is implicit grant of child FILE_READ_ATTRIBUTES permission). Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/smb2file.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/smb2file.c b/fs/smb/client/smb2file.c index e836bc2193ddd..b313c128ffbab 100644 --- a/fs/smb/client/smb2file.c +++ b/fs/smb/client/smb2file.c @@ -107,16 +107,25 @@ int smb2_open_file(const unsigned int xid, struct cifs_open_parms *oparms, __u32 int err_buftype = CIFS_NO_BUFFER; struct cifs_fid *fid = oparms->fid; struct network_resiliency_req nr_ioctl_req; + bool retry_without_read_attributes = false; smb2_path = cifs_convert_path_to_utf16(oparms->path, oparms->cifs_sb); if (smb2_path == NULL) return -ENOMEM; - oparms->desired_access |= FILE_READ_ATTRIBUTES; + if (!(oparms->desired_access & FILE_READ_ATTRIBUTES)) { + oparms->desired_access |= FILE_READ_ATTRIBUTES; + retry_without_read_attributes = true; + } smb2_oplock = SMB2_OPLOCK_LEVEL_BATCH; rc = SMB2_open(xid, oparms, smb2_path, &smb2_oplock, smb2_data, NULL, &err_iov, &err_buftype); + if (rc == -EACCES && retry_without_read_attributes) { + oparms->desired_access &= ~FILE_READ_ATTRIBUTES; + rc = SMB2_open(xid, oparms, smb2_path, &smb2_oplock, smb2_data, NULL, &err_iov, + &err_buftype); + } if (rc && data) { struct smb2_hdr *hdr = err_iov.iov_base; -- GitLab From 0705b6d5bc328d6fa422763b1adc94d38d4cfc55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Sat, 28 Dec 2024 21:09:54 +0100 Subject: [PATCH 0048/2211] cifs: Fix querying and creating MF symlinks over SMB1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 4236ac9fe5b8b42756070d4abfb76fed718e87c2 ] Old SMB1 servers without CAP_NT_SMBS do not support CIFS_open() function and instead SMBLegacyOpen() needs to be used. This logic is already handled in cifs_open_file() function, which is server->ops->open callback function. So for querying and creating MF symlinks use open callback function instead of CIFS_open() function directly. This change fixes querying and creating new MF symlinks on Windows 98. Currently cifs_query_mf_symlink() is not able to detect MF symlink and cifs_create_mf_symlink() is failing with EIO error. Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/link.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/smb/client/link.c b/fs/smb/client/link.c index 47ddeb7fa1116..aa45ef6ae99a6 100644 --- a/fs/smb/client/link.c +++ b/fs/smb/client/link.c @@ -257,7 +257,7 @@ cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, struct cifs_open_parms oparms; struct cifs_io_parms io_parms = {0}; int buf_type = CIFS_NO_BUFFER; - FILE_ALL_INFO file_info; + struct cifs_open_info_data query_data; oparms = (struct cifs_open_parms) { .tcon = tcon, @@ -269,11 +269,11 @@ cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, .fid = &fid, }; - rc = CIFS_open(xid, &oparms, &oplock, &file_info); + rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, &query_data); if (rc) return rc; - if (file_info.EndOfFile != cpu_to_le64(CIFS_MF_SYMLINK_FILE_SIZE)) { + if (query_data.fi.EndOfFile != cpu_to_le64(CIFS_MF_SYMLINK_FILE_SIZE)) { rc = -ENOENT; /* it's not a symlink */ goto out; @@ -312,7 +312,7 @@ cifs_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, .fid = &fid, }; - rc = CIFS_open(xid, &oparms, &oplock, NULL); + rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL); if (rc) return rc; -- GitLab From 150f38eddefc43addbbc92c3db8345beca993a39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Sat, 2 Nov 2024 20:06:50 +0100 Subject: [PATCH 0049/2211] cifs: Fix negotiate retry functionality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit e94e882a6d69525c07589222cf3a6ff57ad12b5b ] SMB negotiate retry functionality in cifs_negotiate() is currently broken and does not work when doing socket reconnect. Caller of this function, which is cifs_negotiate_protocol() requires that tcpStatus after successful execution of negotiate callback stay in CifsInNegotiate. But if the CIFSSMBNegotiate() called from cifs_negotiate() fails due to connection issues then tcpStatus is changed as so repeated CIFSSMBNegotiate() call does not help. Fix this problem by moving retrying code from negotiate callback (which is either cifs_negotiate() or smb2_negotiate()) to cifs_negotiate_protocol() which is caller of those callbacks. This allows to properly handle and implement correct transistions between tcpStatus states as function cifs_negotiate_protocol() already handles it. With this change, cifs_negotiate_protocol() now handles also -EAGAIN error set by the RFC1002_NEGATIVE_SESSION_RESPONSE processing after reconnecting with NetBIOS session. Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/connect.c | 10 ++++++++++ fs/smb/client/smb1ops.c | 7 ------- fs/smb/client/smb2ops.c | 3 --- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index 112057c7ca11c..3b4c2e59f1799 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -3957,11 +3957,13 @@ int cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses, struct TCP_Server_Info *server) { + bool in_retry = false; int rc = 0; if (!server->ops->need_neg || !server->ops->negotiate) return -ENOSYS; +retry: /* only send once per connect */ spin_lock(&server->srv_lock); if (server->tcpStatus != CifsGood && @@ -3981,6 +3983,14 @@ cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses, spin_unlock(&server->srv_lock); rc = server->ops->negotiate(xid, ses, server); + if (rc == -EAGAIN) { + /* Allow one retry attempt */ + if (!in_retry) { + in_retry = true; + goto retry; + } + rc = -EHOSTDOWN; + } if (rc == 0) { spin_lock(&server->srv_lock); if (server->tcpStatus == CifsInNegotiate) diff --git a/fs/smb/client/smb1ops.c b/fs/smb/client/smb1ops.c index 55cceb8229323..a2dbebd13720b 100644 --- a/fs/smb/client/smb1ops.c +++ b/fs/smb/client/smb1ops.c @@ -426,13 +426,6 @@ cifs_negotiate(const unsigned int xid, { int rc; rc = CIFSSMBNegotiate(xid, ses, server); - if (rc == -EAGAIN) { - /* retry only once on 1st time connection */ - set_credits(server, 1); - rc = CIFSSMBNegotiate(xid, ses, server); - if (rc == -EAGAIN) - rc = -EHOSTDOWN; - } return rc; } diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 590b70d71694b..ff50cdfde5fe4 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -464,9 +464,6 @@ smb2_negotiate(const unsigned int xid, server->CurrentMid = 0; spin_unlock(&server->mid_lock); rc = SMB2_negotiate(xid, ses, server); - /* BB we probably don't need to retry with modern servers */ - if (rc == -EAGAIN) - rc = -EHOSTDOWN; return rc; } -- GitLab From c9a508b6bbd2f5da31a0ccde1ed68190fa0bff91 Mon Sep 17 00:00:00 2001 From: Wang Zhaolong Date: Mon, 31 Mar 2025 21:33:14 +0800 Subject: [PATCH 0050/2211] smb: client: Store original IO parameters and prevent zero IO sizes [ Upstream commit 287906b20035a04a234d1a3c64f760a5678387be ] During mount option processing and negotiation with the server, the original user-specified rsize/wsize values were being modified directly. This makes it impossible to recover these values after a connection reset, leading to potential degraded performance after reconnection. The other problem is that When negotiating read and write sizes, there are cases where the negotiated values might calculate to zero, especially during reconnection when server->max_read or server->max_write might be reset. In general, these values come from the negotiation response. According to MS-SMB2 specification, these values should be at least 65536 bytes. This patch improves IO parameter handling: 1. Adds vol_rsize and vol_wsize fields to store the original user-specified values separately from the negotiated values 2. Uses got_rsize/got_wsize flags to determine if values were user-specified rather than checking for non-zero values, which is more reliable 3. Adds a prevent_zero_iosize() helper function to ensure IO sizes are never negotiated down to zero, which could happen in edge cases like when server->max_read/write is zero The changes make the CIFS client more resilient to unusual server responses and reconnection scenarios, preventing potential failures when IO sizes are calculated to be zero. Signed-off-by: Wang Zhaolong Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/fs_context.c | 2 ++ fs/smb/client/fs_context.h | 3 +++ fs/smb/client/smb1ops.c | 6 +++--- fs/smb/client/smb2ops.c | 27 +++++++++++++++++++-------- fs/smb/common/smb2pdu.h | 3 +++ 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/fs/smb/client/fs_context.c b/fs/smb/client/fs_context.c index 69cca4f17dbaa..b015a4f997cb6 100644 --- a/fs/smb/client/fs_context.c +++ b/fs/smb/client/fs_context.c @@ -1267,6 +1267,7 @@ static int smb3_fs_context_parse_param(struct fs_context *fc, case Opt_rsize: ctx->rsize = result.uint_32; ctx->got_rsize = true; + ctx->vol_rsize = ctx->rsize; break; case Opt_wsize: ctx->wsize = result.uint_32; @@ -1282,6 +1283,7 @@ static int smb3_fs_context_parse_param(struct fs_context *fc, ctx->wsize, PAGE_SIZE); } } + ctx->vol_wsize = ctx->wsize; break; case Opt_acregmax: if (result.uint_32 > CIFS_MAX_ACTIMEO / HZ) { diff --git a/fs/smb/client/fs_context.h b/fs/smb/client/fs_context.h index ac6baa774ad3a..c7e00025518f7 100644 --- a/fs/smb/client/fs_context.h +++ b/fs/smb/client/fs_context.h @@ -263,6 +263,9 @@ struct smb3_fs_context { bool use_client_guid:1; /* reuse existing guid for multichannel */ u8 client_guid[SMB2_CLIENT_GUID_SIZE]; + /* User-specified original r/wsize value */ + unsigned int vol_rsize; + unsigned int vol_wsize; unsigned int bsize; unsigned int rasize; unsigned int rsize; diff --git a/fs/smb/client/smb1ops.c b/fs/smb/client/smb1ops.c index a2dbebd13720b..71fe5aa52630d 100644 --- a/fs/smb/client/smb1ops.c +++ b/fs/smb/client/smb1ops.c @@ -437,8 +437,8 @@ cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) unsigned int wsize; /* start with specified wsize, or default */ - if (ctx->wsize) - wsize = ctx->wsize; + if (ctx->got_wsize) + wsize = ctx->vol_wsize; else if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_WRITE_CAP)) wsize = CIFS_DEFAULT_IOSIZE; else @@ -490,7 +490,7 @@ cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) else defsize = server->maxBuf - sizeof(READ_RSP); - rsize = ctx->rsize ? ctx->rsize : defsize; + rsize = ctx->got_rsize ? ctx->vol_rsize : defsize; /* * no CAP_LARGE_READ_X? Then MS-CIFS states that we must limit this to diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index ff50cdfde5fe4..74bcc51ccd32f 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -467,6 +467,17 @@ smb2_negotiate(const unsigned int xid, return rc; } +static inline unsigned int +prevent_zero_iosize(unsigned int size, const char *type) +{ + if (size == 0) { + cifs_dbg(VFS, "SMB: Zero %ssize calculated, using minimum value %u\n", + type, CIFS_MIN_DEFAULT_IOSIZE); + return CIFS_MIN_DEFAULT_IOSIZE; + } + return size; +} + static unsigned int smb2_negotiate_wsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) { @@ -474,12 +485,12 @@ smb2_negotiate_wsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) unsigned int wsize; /* start with specified wsize, or default */ - wsize = ctx->wsize ? ctx->wsize : CIFS_DEFAULT_IOSIZE; + wsize = ctx->got_wsize ? ctx->vol_wsize : CIFS_DEFAULT_IOSIZE; wsize = min_t(unsigned int, wsize, server->max_write); if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) wsize = min_t(unsigned int, wsize, SMB2_MAX_BUFFER_SIZE); - return wsize; + return prevent_zero_iosize(wsize, "w"); } static unsigned int @@ -489,7 +500,7 @@ smb3_negotiate_wsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) unsigned int wsize; /* start with specified wsize, or default */ - wsize = ctx->wsize ? ctx->wsize : SMB3_DEFAULT_IOSIZE; + wsize = ctx->got_wsize ? ctx->vol_wsize : SMB3_DEFAULT_IOSIZE; wsize = min_t(unsigned int, wsize, server->max_write); #ifdef CONFIG_CIFS_SMB_DIRECT if (server->rdma) { @@ -511,7 +522,7 @@ smb3_negotiate_wsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) wsize = min_t(unsigned int, wsize, SMB2_MAX_BUFFER_SIZE); - return wsize; + return prevent_zero_iosize(wsize, "w"); } static unsigned int @@ -521,13 +532,13 @@ smb2_negotiate_rsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) unsigned int rsize; /* start with specified rsize, or default */ - rsize = ctx->rsize ? ctx->rsize : CIFS_DEFAULT_IOSIZE; + rsize = ctx->got_rsize ? ctx->vol_rsize : CIFS_DEFAULT_IOSIZE; rsize = min_t(unsigned int, rsize, server->max_read); if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) rsize = min_t(unsigned int, rsize, SMB2_MAX_BUFFER_SIZE); - return rsize; + return prevent_zero_iosize(rsize, "r"); } static unsigned int @@ -537,7 +548,7 @@ smb3_negotiate_rsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) unsigned int rsize; /* start with specified rsize, or default */ - rsize = ctx->rsize ? ctx->rsize : SMB3_DEFAULT_IOSIZE; + rsize = ctx->got_rsize ? ctx->vol_rsize : SMB3_DEFAULT_IOSIZE; rsize = min_t(unsigned int, rsize, server->max_read); #ifdef CONFIG_CIFS_SMB_DIRECT if (server->rdma) { @@ -560,7 +571,7 @@ smb3_negotiate_rsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) rsize = min_t(unsigned int, rsize, SMB2_MAX_BUFFER_SIZE); - return rsize; + return prevent_zero_iosize(rsize, "r"); } /* diff --git a/fs/smb/common/smb2pdu.h b/fs/smb/common/smb2pdu.h index 9f272cc8f5660..0a4ca286f4169 100644 --- a/fs/smb/common/smb2pdu.h +++ b/fs/smb/common/smb2pdu.h @@ -95,6 +95,9 @@ */ #define SMB3_DEFAULT_IOSIZE (4 * 1024 * 1024) +/* According to MS-SMB2 specification The minimum recommended value is 65536.*/ +#define CIFS_MIN_DEFAULT_IOSIZE (65536) + /* * SMB2 Header Definition * -- GitLab From d40ca27602eab144a16fa1a1595fb2228eb7b522 Mon Sep 17 00:00:00 2001 From: Matt Johnston Date: Fri, 14 Feb 2025 09:17:53 +0800 Subject: [PATCH 0051/2211] fuse: Return EPERM rather than ENOSYS from link() [ Upstream commit 8344213571b2ac8caf013cfd3b37bc3467c3a893 ] link() is documented to return EPERM when a filesystem doesn't support the operation, return that instead. Link: https://github.com/libfuse/libfuse/issues/925 Signed-off-by: Matt Johnston Signed-off-by: Miklos Szeredi Signed-off-by: Sasha Levin --- fs/fuse/dir.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index a1e86ec07c38b..ff543dc09130e 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1133,6 +1133,8 @@ static int fuse_link(struct dentry *entry, struct inode *newdir, else if (err == -EINTR) fuse_invalidate_attr(inode); + if (err == -ENOSYS) + err = -EPERM; return err; } -- GitLab From bab0bd138910e234dc2c8d3e9e8e9bfdd5bd7f6a Mon Sep 17 00:00:00 2001 From: Sungjong Seo Date: Thu, 27 Mar 2025 00:01:16 +0900 Subject: [PATCH 0052/2211] exfat: call bh_read in get_block only when necessary [ Upstream commit c73e680d1f84059e1b1ea82a537f6ccc1c563eb4 ] With commit 11a347fb6cef ("exfat: change to get file size from DataLength"), exfat_get_block() can now handle valid_size. However, most partial unwritten blocks that could be mapped with other blocks are being inefficiently processed separately as individual blocks. Except for partial unwritten blocks that require independent processing, let's handle them simply as before. Signed-off-by: Sungjong Seo Reviewed-by: Yuezhang Mo Signed-off-by: Namjae Jeon Signed-off-by: Sasha Levin --- fs/exfat/inode.c | 159 +++++++++++++++++++++++------------------------ 1 file changed, 77 insertions(+), 82 deletions(-) diff --git a/fs/exfat/inode.c b/fs/exfat/inode.c index 3801516ac5071..cc4dcb7a32b57 100644 --- a/fs/exfat/inode.c +++ b/fs/exfat/inode.c @@ -274,9 +274,11 @@ static int exfat_get_block(struct inode *inode, sector_t iblock, sector_t last_block; sector_t phys = 0; sector_t valid_blks; + loff_t i_size; mutex_lock(&sbi->s_lock); - last_block = EXFAT_B_TO_BLK_ROUND_UP(i_size_read(inode), sb); + i_size = i_size_read(inode); + last_block = EXFAT_B_TO_BLK_ROUND_UP(i_size, sb); if (iblock >= last_block && !create) goto done; @@ -305,102 +307,95 @@ static int exfat_get_block(struct inode *inode, sector_t iblock, if (buffer_delay(bh_result)) clear_buffer_delay(bh_result); - if (create) { + /* + * In most cases, we just need to set bh_result to mapped, unmapped + * or new status as follows: + * 1. i_size == valid_size + * 2. write case (create == 1) + * 3. direct_read (!bh_result->b_folio) + * -> the unwritten part will be zeroed in exfat_direct_IO() + * + * Otherwise, in the case of buffered read, it is necessary to take + * care the last nested block if valid_size is not equal to i_size. + */ + if (i_size == ei->valid_size || create || !bh_result->b_folio) valid_blks = EXFAT_B_TO_BLK_ROUND_UP(ei->valid_size, sb); + else + valid_blks = EXFAT_B_TO_BLK(ei->valid_size, sb); - if (iblock + max_blocks < valid_blks) { - /* The range has been written, map it */ - goto done; - } else if (iblock < valid_blks) { - /* - * The range has been partially written, - * map the written part. - */ - max_blocks = valid_blks - iblock; - goto done; - } + /* The range has been fully written, map it */ + if (iblock + max_blocks < valid_blks) + goto done; - /* The area has not been written, map and mark as new. */ - set_buffer_new(bh_result); + /* The range has been partially written, map the written part */ + if (iblock < valid_blks) { + max_blocks = valid_blks - iblock; + goto done; + } + /* The area has not been written, map and mark as new for create case */ + if (create) { + set_buffer_new(bh_result); ei->valid_size = EXFAT_BLK_TO_B(iblock + max_blocks, sb); mark_inode_dirty(inode); - } else { - valid_blks = EXFAT_B_TO_BLK(ei->valid_size, sb); + goto done; + } - if (iblock + max_blocks < valid_blks) { - /* The range has been written, map it */ - goto done; - } else if (iblock < valid_blks) { - /* - * The area has been partially written, - * map the written part. - */ - max_blocks = valid_blks - iblock; + /* + * The area has just one block partially written. + * In that case, we should read and fill the unwritten part of + * a block with zero. + */ + if (bh_result->b_folio && iblock == valid_blks && + (ei->valid_size & (sb->s_blocksize - 1))) { + loff_t size, pos; + void *addr; + + max_blocks = 1; + + /* + * No buffer_head is allocated. + * (1) bmap: It's enough to set blocknr without I/O. + * (2) read: The unwritten part should be filled with zero. + * If a folio does not have any buffers, + * let's returns -EAGAIN to fallback to + * block_read_full_folio() for per-bh IO. + */ + if (!folio_buffers(bh_result->b_folio)) { + err = -EAGAIN; goto done; - } else if (iblock == valid_blks && - (ei->valid_size & (sb->s_blocksize - 1))) { - /* - * The block has been partially written, - * zero the unwritten part and map the block. - */ - loff_t size, pos; - void *addr; - - max_blocks = 1; - - /* - * For direct read, the unwritten part will be zeroed in - * exfat_direct_IO() - */ - if (!bh_result->b_folio) - goto done; - - /* - * No buffer_head is allocated. - * (1) bmap: It's enough to fill bh_result without I/O. - * (2) read: The unwritten part should be filled with 0 - * If a folio does not have any buffers, - * let's returns -EAGAIN to fallback to - * per-bh IO like block_read_full_folio(). - */ - if (!folio_buffers(bh_result->b_folio)) { - err = -EAGAIN; - goto done; - } + } - pos = EXFAT_BLK_TO_B(iblock, sb); - size = ei->valid_size - pos; - addr = folio_address(bh_result->b_folio) + - offset_in_folio(bh_result->b_folio, pos); + pos = EXFAT_BLK_TO_B(iblock, sb); + size = ei->valid_size - pos; + addr = folio_address(bh_result->b_folio) + + offset_in_folio(bh_result->b_folio, pos); - /* Check if bh->b_data points to proper addr in folio */ - if (bh_result->b_data != addr) { - exfat_fs_error_ratelimit(sb, + /* Check if bh->b_data points to proper addr in folio */ + if (bh_result->b_data != addr) { + exfat_fs_error_ratelimit(sb, "b_data(%p) != folio_addr(%p)", bh_result->b_data, addr); - err = -EINVAL; - goto done; - } - - /* Read a block */ - err = bh_read(bh_result, 0); - if (err < 0) - goto done; + err = -EINVAL; + goto done; + } - /* Zero unwritten part of a block */ - memset(bh_result->b_data + size, 0, - bh_result->b_size - size); + /* Read a block */ + err = bh_read(bh_result, 0); + if (err < 0) + goto done; - err = 0; - } else { - /* - * The range has not been written, clear the mapped flag - * to only zero the cache and do not read from disk. - */ - clear_buffer_mapped(bh_result); - } + /* Zero unwritten part of a block */ + memset(bh_result->b_data + size, 0, bh_result->b_size - size); + err = 0; + goto done; } + + /* + * The area has not been written, clear mapped for read/bmap cases. + * If so, it will be filled with zero without reading from disk. + */ + clear_buffer_mapped(bh_result); done: bh_result->b_size = EXFAT_BLK_TO_B(max_blocks, sb); if (err < 0) -- GitLab From 01677e7ee12f2f6a379f82e35909119f11d554d0 Mon Sep 17 00:00:00 2001 From: Pavel Begunkov Date: Fri, 28 Mar 2025 23:11:50 +0000 Subject: [PATCH 0053/2211] io_uring/msg: initialise msg request opcode [ Upstream commit 9cc0bbdaba2a66ad90bc6ce45163b7745baffe98 ] It's risky to have msg request opcode set to garbage, so at least initialise it to nop. Later we might want to add a user inaccessible opcode for such cases. Signed-off-by: Pavel Begunkov Link: https://lore.kernel.org/r/9afe650fcb348414a4529d89f52eb8969ba06efd.1743190078.git.asml.silence@gmail.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- io_uring/msg_ring.c | 1 + 1 file changed, 1 insertion(+) diff --git a/io_uring/msg_ring.c b/io_uring/msg_ring.c index 7fd9badcfaf81..35b1b585e9cbe 100644 --- a/io_uring/msg_ring.c +++ b/io_uring/msg_ring.c @@ -94,6 +94,7 @@ static int io_msg_remote_post(struct io_ring_ctx *ctx, struct io_kiocb *req, kmem_cache_free(req_cachep, req); return -EOWNERDEAD; } + req->opcode = IORING_OP_NOP; req->cqe.user_data = user_data; io_req_set_res(req, res, cflags); percpu_ref_get(&ctx->refs); -- GitLab From 46a47dc10fa78163bff86d54529c9c9fcbd02e90 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Thu, 27 Mar 2025 19:20:53 -0400 Subject: [PATCH 0054/2211] NFSv4: Check for delegation validity in nfs_start_delegation_return_locked() [ Upstream commit 9e8f324bd44c1fe026b582b75213de4eccfa1163 ] Check that the delegation is still attached after taking the spin lock in nfs_start_delegation_return_locked(). Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- fs/nfs/delegation.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c index 325ba0663a6de..8bdbc4dca89ca 100644 --- a/fs/nfs/delegation.c +++ b/fs/nfs/delegation.c @@ -307,7 +307,8 @@ nfs_start_delegation_return_locked(struct nfs_inode *nfsi) if (delegation == NULL) goto out; spin_lock(&delegation->lock); - if (!test_and_set_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) { + if (delegation->inode && + !test_and_set_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) { clear_bit(NFS_DELEGATION_RETURN_DELAYED, &delegation->flags); /* Refcount matched in nfs_end_delegation_return() */ ret = nfs_get_delegation(delegation); -- GitLab From ac83bf58f687693c20df74e993921acacd3acdf1 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Fri, 28 Mar 2025 13:19:18 -0400 Subject: [PATCH 0055/2211] NFS: Don't allow waiting for exiting tasks [ Upstream commit 8d3ca331026a7f9700d3747eed59a67b8f828cdc ] Once a task calls exit_signals() it can no longer be signalled. So do not allow it to do killable waits. Reviewed-by: Jeff Layton Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- fs/nfs/inode.c | 2 ++ fs/nfs/internal.h | 5 +++++ fs/nfs/nfs3proc.c | 2 +- fs/nfs/nfs4proc.c | 9 +++++++-- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 596f351701372..330273cf94531 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -74,6 +74,8 @@ nfs_fattr_to_ino_t(struct nfs_fattr *fattr) int nfs_wait_bit_killable(struct wait_bit_key *key, int mode) { + if (unlikely(nfs_current_task_exiting())) + return -EINTR; schedule(); if (signal_pending_state(mode, current)) return -ERESTARTSYS; diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 8b568a514fd1c..1be4be3d4a2b6 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -901,6 +901,11 @@ static inline u32 nfs_stateid_hash(const nfs4_stateid *stateid) NFS4_STATEID_OTHER_SIZE); } +static inline bool nfs_current_task_exiting(void) +{ + return (current->flags & PF_EXITING) != 0; +} + static inline bool nfs_error_is_fatal(int err) { switch (err) { diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c index 1566163c6d85b..88b0fb343ae04 100644 --- a/fs/nfs/nfs3proc.c +++ b/fs/nfs/nfs3proc.c @@ -39,7 +39,7 @@ nfs3_rpc_wrapper(struct rpc_clnt *clnt, struct rpc_message *msg, int flags) __set_current_state(TASK_KILLABLE|TASK_FREEZABLE_UNSAFE); schedule_timeout(NFS_JUKEBOX_RETRY_TIME); res = -ERESTARTSYS; - } while (!fatal_signal_pending(current)); + } while (!fatal_signal_pending(current) && !nfs_current_task_exiting()); return res; } diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index ca01f79c82e4a..11f2b5cb3b06b 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -434,6 +434,8 @@ static int nfs4_delay_killable(long *timeout) { might_sleep(); + if (unlikely(nfs_current_task_exiting())) + return -EINTR; __set_current_state(TASK_KILLABLE|TASK_FREEZABLE_UNSAFE); schedule_timeout(nfs4_update_delay(timeout)); if (!__fatal_signal_pending(current)) @@ -445,6 +447,8 @@ static int nfs4_delay_interruptible(long *timeout) { might_sleep(); + if (unlikely(nfs_current_task_exiting())) + return -EINTR; __set_current_state(TASK_INTERRUPTIBLE|TASK_FREEZABLE_UNSAFE); schedule_timeout(nfs4_update_delay(timeout)); if (!signal_pending(current)) @@ -1765,7 +1769,8 @@ static void nfs_set_open_stateid_locked(struct nfs4_state *state, rcu_read_unlock(); trace_nfs4_open_stateid_update_wait(state->inode, stateid, 0); - if (!fatal_signal_pending(current)) { + if (!fatal_signal_pending(current) && + !nfs_current_task_exiting()) { if (schedule_timeout(5*HZ) == 0) status = -EAGAIN; else @@ -3569,7 +3574,7 @@ static bool nfs4_refresh_open_old_stateid(nfs4_stateid *dst, write_sequnlock(&state->seqlock); trace_nfs4_close_stateid_update_wait(state->inode, dst, 0); - if (fatal_signal_pending(current)) + if (fatal_signal_pending(current) || nfs_current_task_exiting()) status = -EINTR; else if (schedule_timeout(5*HZ) != 0) -- GitLab From 1a9b696a003ae3d723710b707515a3af17b0904f Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Fri, 28 Mar 2025 12:52:52 -0400 Subject: [PATCH 0056/2211] SUNRPC: Don't allow waiting for exiting tasks [ Upstream commit 14e41b16e8cb677bb440dca2edba8b041646c742 ] Once a task calls exit_signals() it can no longer be signalled. So do not allow it to do killable waits. Reviewed-by: Jeff Layton Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- net/sunrpc/sched.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index 9b45fbdc90cab..73bc39281ef5f 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c @@ -276,6 +276,8 @@ EXPORT_SYMBOL_GPL(rpc_destroy_wait_queue); static int rpc_wait_bit_killable(struct wait_bit_key *key, int mode) { + if (unlikely(current->flags & PF_EXITING)) + return -EINTR; schedule(); if (signal_pending_state(mode, current)) return -ERESTARTSYS; -- GitLab From e506751b7dd986fd6c48f70c7a98ec7a985b6515 Mon Sep 17 00:00:00 2001 From: Jinqian Yang Date: Tue, 25 Mar 2025 22:19:00 +0800 Subject: [PATCH 0057/2211] arm64: Add support for HIP09 Spectre-BHB mitigation [ Upstream commit e18c09b204e81702ea63b9f1a81ab003b72e3174 ] The HIP09 processor is vulnerable to the Spectre-BHB (Branch History Buffer) attack, which can be exploited to leak information through branch prediction side channels. This commit adds the MIDR of HIP09 to the list for software mitigation. Signed-off-by: Jinqian Yang Link: https://lore.kernel.org/r/20250325141900.2057314-1-yangjinqian1@huawei.com Signed-off-by: Catalin Marinas Signed-off-by: Sasha Levin --- arch/arm64/include/asm/cputype.h | 2 ++ arch/arm64/kernel/proton-pack.c | 1 + 2 files changed, 3 insertions(+) diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h index 8a6b7feca3e42..d92a0203e5a93 100644 --- a/arch/arm64/include/asm/cputype.h +++ b/arch/arm64/include/asm/cputype.h @@ -132,6 +132,7 @@ #define FUJITSU_CPU_PART_A64FX 0x001 #define HISI_CPU_PART_TSV110 0xD01 +#define HISI_CPU_PART_HIP09 0xD02 #define APPLE_CPU_PART_M1_ICESTORM 0x022 #define APPLE_CPU_PART_M1_FIRESTORM 0x023 @@ -208,6 +209,7 @@ #define MIDR_NVIDIA_CARMEL MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_CARMEL) #define MIDR_FUJITSU_A64FX MIDR_CPU_MODEL(ARM_CPU_IMP_FUJITSU, FUJITSU_CPU_PART_A64FX) #define MIDR_HISI_TSV110 MIDR_CPU_MODEL(ARM_CPU_IMP_HISI, HISI_CPU_PART_TSV110) +#define MIDR_HISI_HIP09 MIDR_CPU_MODEL(ARM_CPU_IMP_HISI, HISI_CPU_PART_HIP09) #define MIDR_APPLE_M1_ICESTORM MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_ICESTORM) #define MIDR_APPLE_M1_FIRESTORM MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_FIRESTORM) #define MIDR_APPLE_M1_ICESTORM_PRO MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_ICESTORM_PRO) diff --git a/arch/arm64/kernel/proton-pack.c b/arch/arm64/kernel/proton-pack.c index 8ef3335ecff72..31eaf15d2079a 100644 --- a/arch/arm64/kernel/proton-pack.c +++ b/arch/arm64/kernel/proton-pack.c @@ -904,6 +904,7 @@ static u8 spectre_bhb_loop_affected(void) MIDR_ALL_VERSIONS(MIDR_CORTEX_A77), MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1), MIDR_ALL_VERSIONS(MIDR_QCOM_KRYO_4XX_GOLD), + MIDR_ALL_VERSIONS(MIDR_HISI_HIP09), {}, }; static const struct midr_range spectre_bhb_k11_list[] = { -- GitLab From b4c11dd41c40cb2ba877f77c68d6b5db350c65f3 Mon Sep 17 00:00:00 2001 From: Yi Liu Date: Fri, 21 Mar 2025 11:01:42 -0700 Subject: [PATCH 0058/2211] iommufd: Extend IOMMU_GET_HW_INFO to report PASID capability [ Upstream commit 803f97298e7de9242eb677a1351dcafbbcc9117e ] PASID usage requires PASID support in both device and IOMMU. Since the iommu drivers always enable the PASID capability for the device if it is supported, this extends the IOMMU_GET_HW_INFO to report the PASID capability to userspace. Also, enhances the selftest accordingly. Link: https://patch.msgid.link/r/20250321180143.8468-5-yi.l.liu@intel.com Cc: Bjorn Helgaas Reviewed-by: Kevin Tian Reviewed-by: Jason Gunthorpe Tested-by: Zhangfei Gao #aarch64 platform Tested-by: Nicolin Chen Signed-off-by: Yi Liu Signed-off-by: Jason Gunthorpe Signed-off-by: Sasha Levin --- drivers/iommu/iommufd/device.c | 34 +++++++++++++++++++++++++++++++++- drivers/pci/ats.c | 33 +++++++++++++++++++++++++++++++++ include/linux/pci-ats.h | 3 +++ include/uapi/linux/iommufd.h | 14 +++++++++++++- 4 files changed, 82 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/iommufd/device.c b/drivers/iommu/iommufd/device.c index 3fd8920e79ffb..74480ae6bfc0b 100644 --- a/drivers/iommu/iommufd/device.c +++ b/drivers/iommu/iommufd/device.c @@ -3,6 +3,7 @@ */ #include #include +#include #include #include @@ -1304,7 +1305,8 @@ int iommufd_get_hw_info(struct iommufd_ucmd *ucmd) void *data; int rc; - if (cmd->flags || cmd->__reserved) + if (cmd->flags || cmd->__reserved[0] || cmd->__reserved[1] || + cmd->__reserved[2]) return -EOPNOTSUPP; idev = iommufd_get_device(ucmd, cmd->dev_id); @@ -1361,6 +1363,36 @@ int iommufd_get_hw_info(struct iommufd_ucmd *ucmd) if (device_iommu_capable(idev->dev, IOMMU_CAP_DIRTY_TRACKING)) cmd->out_capabilities |= IOMMU_HW_CAP_DIRTY_TRACKING; + cmd->out_max_pasid_log2 = 0; + /* + * Currently, all iommu drivers enable PASID in the probe_device() + * op if iommu and device supports it. So the max_pasids stored in + * dev->iommu indicates both PASID support and enable status. A + * non-zero dev->iommu->max_pasids means PASID is supported and + * enabled. The iommufd only reports PASID capability to userspace + * if it's enabled. + */ + if (idev->dev->iommu->max_pasids) { + cmd->out_max_pasid_log2 = ilog2(idev->dev->iommu->max_pasids); + + if (dev_is_pci(idev->dev)) { + struct pci_dev *pdev = to_pci_dev(idev->dev); + int ctrl; + + ctrl = pci_pasid_status(pdev); + + WARN_ON_ONCE(ctrl < 0 || + !(ctrl & PCI_PASID_CTRL_ENABLE)); + + if (ctrl & PCI_PASID_CTRL_EXEC) + cmd->out_capabilities |= + IOMMU_HW_CAP_PCI_PASID_EXEC; + if (ctrl & PCI_PASID_CTRL_PRIV) + cmd->out_capabilities |= + IOMMU_HW_CAP_PCI_PASID_PRIV; + } + } + rc = iommufd_ucmd_respond(ucmd, sizeof(*cmd)); out_free: kfree(data); diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c index 6afff1f1b1430..c331b108e71de 100644 --- a/drivers/pci/ats.c +++ b/drivers/pci/ats.c @@ -538,4 +538,37 @@ int pci_max_pasids(struct pci_dev *pdev) return (1 << FIELD_GET(PCI_PASID_CAP_WIDTH, supported)); } EXPORT_SYMBOL_GPL(pci_max_pasids); + +/** + * pci_pasid_status - Check the PASID status + * @pdev: PCI device structure + * + * Returns a negative value when no PASID capability is present. + * Otherwise the value of the control register is returned. + * Status reported are: + * + * PCI_PASID_CTRL_ENABLE - PASID enabled + * PCI_PASID_CTRL_EXEC - Execute permission enabled + * PCI_PASID_CTRL_PRIV - Privileged mode enabled + */ +int pci_pasid_status(struct pci_dev *pdev) +{ + int pasid; + u16 ctrl; + + if (pdev->is_virtfn) + pdev = pci_physfn(pdev); + + pasid = pdev->pasid_cap; + if (!pasid) + return -EINVAL; + + pci_read_config_word(pdev, pasid + PCI_PASID_CTRL, &ctrl); + + ctrl &= PCI_PASID_CTRL_ENABLE | PCI_PASID_CTRL_EXEC | + PCI_PASID_CTRL_PRIV; + + return ctrl; +} +EXPORT_SYMBOL_GPL(pci_pasid_status); #endif /* CONFIG_PCI_PASID */ diff --git a/include/linux/pci-ats.h b/include/linux/pci-ats.h index 0e8b74e63767a..75c6c86cf09dc 100644 --- a/include/linux/pci-ats.h +++ b/include/linux/pci-ats.h @@ -42,6 +42,7 @@ int pci_enable_pasid(struct pci_dev *pdev, int features); void pci_disable_pasid(struct pci_dev *pdev); int pci_pasid_features(struct pci_dev *pdev); int pci_max_pasids(struct pci_dev *pdev); +int pci_pasid_status(struct pci_dev *pdev); #else /* CONFIG_PCI_PASID */ static inline int pci_enable_pasid(struct pci_dev *pdev, int features) { return -EINVAL; } @@ -50,6 +51,8 @@ static inline int pci_pasid_features(struct pci_dev *pdev) { return -EINVAL; } static inline int pci_max_pasids(struct pci_dev *pdev) { return -EINVAL; } +static inline int pci_pasid_status(struct pci_dev *pdev) +{ return -EINVAL; } #endif /* CONFIG_PCI_PASID */ #endif /* LINUX_PCI_ATS_H */ diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h index 8c4470742dcd9..41048271a0667 100644 --- a/include/uapi/linux/iommufd.h +++ b/include/uapi/linux/iommufd.h @@ -504,9 +504,17 @@ enum iommu_hw_info_type { * IOMMU_HWPT_GET_DIRTY_BITMAP * IOMMU_HWPT_SET_DIRTY_TRACKING * + * @IOMMU_HW_CAP_PCI_PASID_EXEC: Execute Permission Supported, user ignores it + * when the struct + * iommu_hw_info::out_max_pasid_log2 is zero. + * @IOMMU_HW_CAP_PCI_PASID_PRIV: Privileged Mode Supported, user ignores it + * when the struct + * iommu_hw_info::out_max_pasid_log2 is zero. */ enum iommufd_hw_capabilities { IOMMU_HW_CAP_DIRTY_TRACKING = 1 << 0, + IOMMU_HW_CAP_PCI_PASID_EXEC = 1 << 1, + IOMMU_HW_CAP_PCI_PASID_PRIV = 1 << 2, }; /** @@ -522,6 +530,9 @@ enum iommufd_hw_capabilities { * iommu_hw_info_type. * @out_capabilities: Output the generic iommu capability info type as defined * in the enum iommu_hw_capabilities. + * @out_max_pasid_log2: Output the width of PASIDs. 0 means no PASID support. + * PCI devices turn to out_capabilities to check if the + * specific capabilities is supported or not. * @__reserved: Must be 0 * * Query an iommu type specific hardware information data from an iommu behind @@ -545,7 +556,8 @@ struct iommu_hw_info { __u32 data_len; __aligned_u64 data_uptr; __u32 out_data_type; - __u32 __reserved; + __u8 out_max_pasid_log2; + __u8 __reserved[3]; __aligned_u64 out_capabilities; }; #define IOMMU_GET_HW_INFO _IO(IOMMUFD_TYPE, IOMMUFD_CMD_GET_HW_INFO) -- GitLab From 4f427ca9edf897302ef20762d6c776840cfb5708 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Fri, 21 Mar 2025 16:40:49 +0200 Subject: [PATCH 0059/2211] tracing: Mark binary printing functions with __printf() attribute MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 196a062641fe68d9bfe0ad36b6cd7628c99ad22c ] Binary printing functions are using printf() type of format, and compiler is not happy about them as is: kernel/trace/trace.c:3292:9: error: function ‘trace_vbprintk’ might be a candidate for ‘gnu_printf’ format attribute [-Werror=suggest-attribute=format] kernel/trace/trace_seq.c:182:9: error: function ‘trace_seq_bprintf’ might be a candidate for ‘gnu_printf’ format attribute [-Werror=suggest-attribute=format] Fix the compilation errors by adding __printf() attribute. While at it, move existing __printf() attributes from the implementations to the declarations. IT also fixes incorrect attribute parameters that are used for trace_array_printk(). Signed-off-by: Andy Shevchenko Reviewed-by: Kees Cook Reviewed-by: Petr Mladek Link: https://lore.kernel.org/r/20250321144822.324050-4-andriy.shevchenko@linux.intel.com Signed-off-by: Petr Mladek Signed-off-by: Sasha Levin --- include/linux/trace.h | 4 ++-- include/linux/trace_seq.h | 8 ++++---- kernel/trace/trace.c | 11 +++-------- kernel/trace/trace.h | 16 +++++++++------- 4 files changed, 18 insertions(+), 21 deletions(-) diff --git a/include/linux/trace.h b/include/linux/trace.h index fdcd76b7be83d..7eaad857dee04 100644 --- a/include/linux/trace.h +++ b/include/linux/trace.h @@ -72,8 +72,8 @@ static inline int unregister_ftrace_export(struct trace_export *export) static inline void trace_printk_init_buffers(void) { } -static inline int trace_array_printk(struct trace_array *tr, unsigned long ip, - const char *fmt, ...) +static inline __printf(3, 4) +int trace_array_printk(struct trace_array *tr, unsigned long ip, const char *fmt, ...) { return 0; } diff --git a/include/linux/trace_seq.h b/include/linux/trace_seq.h index 1ef95c0287f05..a93ed5ac32265 100644 --- a/include/linux/trace_seq.h +++ b/include/linux/trace_seq.h @@ -88,8 +88,8 @@ extern __printf(2, 3) void trace_seq_printf(struct trace_seq *s, const char *fmt, ...); extern __printf(2, 0) void trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args); -extern void -trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary); +extern __printf(2, 0) +void trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary); extern int trace_print_seq(struct seq_file *m, struct trace_seq *s); extern int trace_seq_to_user(struct trace_seq *s, char __user *ubuf, int cnt); @@ -113,8 +113,8 @@ static inline __printf(2, 3) void trace_seq_printf(struct trace_seq *s, const char *fmt, ...) { } -static inline void -trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary) +static inline __printf(2, 0) +void trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary) { } diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 06104c2c66ab2..e773b0adcfc0a 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -3343,10 +3343,9 @@ out_nobuffer: } EXPORT_SYMBOL_GPL(trace_vbprintk); -__printf(3, 0) -static int -__trace_array_vprintk(struct trace_buffer *buffer, - unsigned long ip, const char *fmt, va_list args) +static __printf(3, 0) +int __trace_array_vprintk(struct trace_buffer *buffer, + unsigned long ip, const char *fmt, va_list args) { struct trace_event_call *call = &event_print; struct ring_buffer_event *event; @@ -3399,7 +3398,6 @@ out_nobuffer: return len; } -__printf(3, 0) int trace_array_vprintk(struct trace_array *tr, unsigned long ip, const char *fmt, va_list args) { @@ -3429,7 +3427,6 @@ int trace_array_vprintk(struct trace_array *tr, * Note, trace_array_init_printk() must be called on @tr before this * can be used. */ -__printf(3, 0) int trace_array_printk(struct trace_array *tr, unsigned long ip, const char *fmt, ...) { @@ -3474,7 +3471,6 @@ int trace_array_init_printk(struct trace_array *tr) } EXPORT_SYMBOL_GPL(trace_array_init_printk); -__printf(3, 4) int trace_array_printk_buf(struct trace_buffer *buffer, unsigned long ip, const char *fmt, ...) { @@ -3490,7 +3486,6 @@ int trace_array_printk_buf(struct trace_buffer *buffer, return ret; } -__printf(2, 0) int trace_vprintk(unsigned long ip, const char *fmt, va_list args) { return trace_array_vprintk(printk_trace, ip, fmt, args); diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 04ea327198ba8..82da3ac140242 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -818,13 +818,15 @@ static inline void __init disable_tracing_selftest(const char *reason) extern void *head_page(struct trace_array_cpu *data); extern unsigned long long ns2usecs(u64 nsec); -extern int -trace_vbprintk(unsigned long ip, const char *fmt, va_list args); -extern int -trace_vprintk(unsigned long ip, const char *fmt, va_list args); -extern int -trace_array_vprintk(struct trace_array *tr, - unsigned long ip, const char *fmt, va_list args); + +__printf(2, 0) +int trace_vbprintk(unsigned long ip, const char *fmt, va_list args); +__printf(2, 0) +int trace_vprintk(unsigned long ip, const char *fmt, va_list args); +__printf(3, 0) +int trace_array_vprintk(struct trace_array *tr, + unsigned long ip, const char *fmt, va_list args); +__printf(3, 4) int trace_array_printk_buf(struct trace_buffer *buffer, unsigned long ip, const char *fmt, ...); void trace_printk_seq(struct trace_seq *s); -- GitLab From 2eb8f4701961b22ade6a17c417024d2020fa012b Mon Sep 17 00:00:00 2001 From: Diogo Ivo Date: Mon, 17 Mar 2025 10:55:07 +0000 Subject: [PATCH 0060/2211] ACPI: PNP: Add Intel OC Watchdog IDs to non-PNP device list [ Upstream commit f06777cf2bbc21dd8c71d6e3906934e56b4e18e4 ] Intel Over-Clocking Watchdogs are described in ACPI tables by both the generic PNP0C02 _CID and their ACPI _HID. The presence of the _CID then causes the PNP scan handler to attach to the watchdog, preventing the actual watchdog driver from binding. Address this by adding the ACPI _HIDs to the list of non-PNP devices, so that the PNP scan handler is bypassed. Note that these watchdogs can be described by multiple _HIDs for what seems to be identical hardware. This commit is not a complete list of all the possible watchdog ACPI _HIDs. Signed-off-by: Diogo Ivo Link: https://patch.msgid.link/20250317-ivo-intel_oc_wdt-v3-2-32c396f4eefd@siemens.com Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/acpi_pnp.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/acpi/acpi_pnp.c b/drivers/acpi/acpi_pnp.c index 01abf26764b00..3f5a1840f5733 100644 --- a/drivers/acpi/acpi_pnp.c +++ b/drivers/acpi/acpi_pnp.c @@ -355,8 +355,10 @@ static bool acpi_pnp_match(const char *idstr, const struct acpi_device_id **matc * device represented by it. */ static const struct acpi_device_id acpi_nonpnp_device_ids[] = { + {"INT3F0D"}, {"INTC1080"}, {"INTC1081"}, + {"INTC1099"}, {""}, }; -- GitLab From 2d21895e77c6446f8cb5005e15c0cc63dad9c14e Mon Sep 17 00:00:00 2001 From: Jonathan McDowell Date: Fri, 7 Mar 2025 10:56:44 +0000 Subject: [PATCH 0061/2211] tpm: Convert warn to dbg in tpm2_start_auth_session() [ Upstream commit 6359691b4fbcaf3ed86f53043a1f7c6cc54c09be ] TPM2 sessions have been flushed lazily since commit df745e25098dc ("tpm: Lazily flush the auth session"). If /dev/tpm{rm}0 is not accessed in-between two in-kernel calls, it is possible that a TPM2 session is re-started before the previous one has been completed. This causes a spurios warning in a legit run-time condition, which is also correctly addressed with a fast return path: [ 2.944047] tpm tpm0: auth session is active Address the issue by changing dev_warn_once() call to a dev_dbg_once() call. [jarkko: Rewrote the commit message, and instead of dropping converted to a debug message.] Signed-off-by: Jonathan McDowell Signed-off-by: Jarkko Sakkinen Signed-off-by: Sasha Levin --- drivers/char/tpm/tpm2-sessions.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/char/tpm/tpm2-sessions.c b/drivers/char/tpm/tpm2-sessions.c index ecea089157301..cf0b831540447 100644 --- a/drivers/char/tpm/tpm2-sessions.c +++ b/drivers/char/tpm/tpm2-sessions.c @@ -974,7 +974,7 @@ int tpm2_start_auth_session(struct tpm_chip *chip) int rc; if (chip->auth) { - dev_warn_once(&chip->dev, "auth session is active\n"); + dev_dbg_once(&chip->dev, "auth session is active\n"); return 0; } -- GitLab From 2c80f975e94d548a580932f22f211098f76e315c Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Thu, 13 Mar 2025 15:28:51 +0000 Subject: [PATCH 0062/2211] mailbox: pcc: Use acpi_os_ioremap() instead of ioremap() [ Upstream commit d181acea5b864e91f38f5771b8961215ce5017ae ] The Platform Communication Channel (PCC) mailbox driver currently uses ioremap() to map channel shared memory regions. However it is preferred to use acpi_os_ioremap(), which is mapping function specific to EFI/ACPI defined memory regions. It ensures that the correct memory attributes are applied when mapping ACPI-provided regions. While at it, also add checks for handling any errors with the mapping. Acked-by: Huisong Li Tested-by: Huisong Li Tested-by: Adam Young Signed-off-by: Sudeep Holla Signed-off-by: Jassi Brar Signed-off-by: Sasha Levin --- drivers/mailbox/pcc.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/mailbox/pcc.c b/drivers/mailbox/pcc.c index f8215a8f656a4..49254d99a8ad6 100644 --- a/drivers/mailbox/pcc.c +++ b/drivers/mailbox/pcc.c @@ -419,8 +419,12 @@ int pcc_mbox_ioremap(struct mbox_chan *chan) return -1; pchan_info = chan->con_priv; pcc_mbox_chan = &pchan_info->chan; - pcc_mbox_chan->shmem = ioremap(pcc_mbox_chan->shmem_base_addr, - pcc_mbox_chan->shmem_size); + + pcc_mbox_chan->shmem = acpi_os_ioremap(pcc_mbox_chan->shmem_base_addr, + pcc_mbox_chan->shmem_size); + if (!pcc_mbox_chan->shmem) + return -ENXIO; + return 0; } EXPORT_SYMBOL_GPL(pcc_mbox_ioremap); -- GitLab From 15787ab82a46192ad3d9feff98f804696f873928 Mon Sep 17 00:00:00 2001 From: Tudor Ambarus Date: Mon, 24 Feb 2025 08:27:13 +0000 Subject: [PATCH 0063/2211] mailbox: use error ret code of of_parse_phandle_with_args() [ Upstream commit 24fdd5074b205cfb0ef4cd0751a2d03031455929 ] In case of error, of_parse_phandle_with_args() returns -EINVAL when the passed index is negative, or -ENOENT when the index is for an empty phandle. The mailbox core overwrote the error return code with a less precise -ENODEV. Use the error returned code from of_parse_phandle_with_args(). Signed-off-by: Tudor Ambarus Signed-off-by: Jassi Brar Signed-off-by: Sasha Levin --- drivers/mailbox/mailbox.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c index d3d26a2c98956..cb174e788a96c 100644 --- a/drivers/mailbox/mailbox.c +++ b/drivers/mailbox/mailbox.c @@ -415,11 +415,12 @@ struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index) mutex_lock(&con_mutex); - if (of_parse_phandle_with_args(dev->of_node, "mboxes", - "#mbox-cells", index, &spec)) { + ret = of_parse_phandle_with_args(dev->of_node, "mboxes", "#mbox-cells", + index, &spec); + if (ret) { dev_dbg(dev, "%s: can't parse \"mboxes\" property\n", __func__); mutex_unlock(&con_mutex); - return ERR_PTR(-ENODEV); + return ERR_PTR(ret); } chan = ERR_PTR(-EPROBE_DEFER); -- GitLab From 6427b5c0f0aae93577fdcfb647884515cc9d9264 Mon Sep 17 00:00:00 2001 From: Samuel Holland Date: Sat, 26 Oct 2024 10:13:54 -0700 Subject: [PATCH 0064/2211] riscv: Allow NOMMU kernels to access all of RAM [ Upstream commit 2c0391b29b27f315c1b4c29ffde66f50b29fab99 ] NOMMU kernels currently cannot access memory below the kernel link address. Remove this restriction by setting PAGE_OFFSET to the actual start of RAM, as determined from the devicetree. The kernel link address must be a constant, so keep using CONFIG_PAGE_OFFSET for that purpose. Signed-off-by: Samuel Holland Reviewed-by: Jesse Taube Link: https://lore.kernel.org/r/20241026171441.3047904-3-samuel.holland@sifive.com Signed-off-by: Palmer Dabbelt Signed-off-by: Sasha Levin --- arch/riscv/include/asm/page.h | 12 ++++-------- arch/riscv/include/asm/pgtable.h | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/arch/riscv/include/asm/page.h b/arch/riscv/include/asm/page.h index febf820d50583..e8beadc2bffda 100644 --- a/arch/riscv/include/asm/page.h +++ b/arch/riscv/include/asm/page.h @@ -26,12 +26,9 @@ * When not using MMU this corresponds to the first free page in * physical memory (aligned on a page boundary). */ -#ifdef CONFIG_64BIT #ifdef CONFIG_MMU +#ifdef CONFIG_64BIT #define PAGE_OFFSET kernel_map.page_offset -#else -#define PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) -#endif /* * By default, CONFIG_PAGE_OFFSET value corresponds to SV57 address space so * define the PAGE_OFFSET value for SV48 and SV39. @@ -41,6 +38,9 @@ #else #define PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) #endif /* CONFIG_64BIT */ +#else +#define PAGE_OFFSET ((unsigned long)phys_ram_base) +#endif /* CONFIG_MMU */ #ifndef __ASSEMBLY__ @@ -97,11 +97,7 @@ typedef struct page *pgtable_t; #define MIN_MEMBLOCK_ADDR 0 #endif -#ifdef CONFIG_MMU #define ARCH_PFN_OFFSET (PFN_DOWN((unsigned long)phys_ram_base)) -#else -#define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) -#endif /* CONFIG_MMU */ struct kernel_mapping { unsigned long page_offset; diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h index c0866ada5bbc4..479550cdb440f 100644 --- a/arch/riscv/include/asm/pgtable.h +++ b/arch/riscv/include/asm/pgtable.h @@ -12,7 +12,7 @@ #include #ifndef CONFIG_MMU -#define KERNEL_LINK_ADDR PAGE_OFFSET +#define KERNEL_LINK_ADDR _AC(CONFIG_PAGE_OFFSET, UL) #define KERN_VIRT_SIZE (UL(-1)) #else -- GitLab From 230abe5d3f68b4edca589992ca1b17a7a709cdc6 Mon Sep 17 00:00:00 2001 From: Shixiong Ou Date: Mon, 10 Mar 2025 09:54:31 +0800 Subject: [PATCH 0065/2211] fbdev: fsl-diu-fb: add missing device_remove_file() [ Upstream commit 86d16cd12efa547ed43d16ba7a782c1251c80ea8 ] Call device_remove_file() when driver remove. Signed-off-by: Shixiong Ou Signed-off-by: Helge Deller Signed-off-by: Sasha Levin --- drivers/video/fbdev/fsl-diu-fb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/video/fbdev/fsl-diu-fb.c b/drivers/video/fbdev/fsl-diu-fb.c index 5ac8201c35337..b71d15794ce8b 100644 --- a/drivers/video/fbdev/fsl-diu-fb.c +++ b/drivers/video/fbdev/fsl-diu-fb.c @@ -1827,6 +1827,7 @@ static void fsl_diu_remove(struct platform_device *pdev) int i; data = dev_get_drvdata(&pdev->dev); + device_remove_file(&pdev->dev, &data->dev_attr); disable_lcdc(&data->fsl_diu_info[0]); free_irq(data->irq, data->diu_reg); -- GitLab From 8c912c0a6860c3283afcb793a94d483c688e8e99 Mon Sep 17 00:00:00 2001 From: Zsolt Kajtar Date: Sun, 2 Feb 2025 21:33:46 +0100 Subject: [PATCH 0066/2211] fbcon: Use correct erase colour for clearing in fbcon [ Upstream commit 892c788d73fe4a94337ed092cb998c49fa8ecaf4 ] The erase colour calculation for fbcon clearing should use get_color instead of attr_col_ec, like everything else. The latter is similar but is not correct. For example it's missing the depth dependent remapping and doesn't care about blanking. The problem can be reproduced by setting up the background colour to grey (vt.color=0x70) and having an fbcon console set to 2bpp (4 shades of gray). Now the background attribute should be 1 (dark gray) on the console. If the screen is scrolled when pressing enter in a shell prompt at the bottom line then the new line is cleared using colour 7 instead of 1. That's not something fillrect likes (at 2bbp it expect 0-3) so the result is interesting. This patch switches to get_color with vc_video_erase_char to determine the erase colour from attr_col_ec. That makes the latter function redundant as no other users were left. Use correct erase colour for clearing in fbcon Signed-off-by: Zsolt Kajtar Signed-off-by: Helge Deller Signed-off-by: Sasha Levin --- drivers/video/fbdev/core/bitblit.c | 5 ++-- drivers/video/fbdev/core/fbcon.c | 10 +++++--- drivers/video/fbdev/core/fbcon.h | 38 +--------------------------- drivers/video/fbdev/core/fbcon_ccw.c | 5 ++-- drivers/video/fbdev/core/fbcon_cw.c | 5 ++-- drivers/video/fbdev/core/fbcon_ud.c | 5 ++-- drivers/video/fbdev/core/tileblit.c | 8 +++--- 7 files changed, 18 insertions(+), 58 deletions(-) diff --git a/drivers/video/fbdev/core/bitblit.c b/drivers/video/fbdev/core/bitblit.c index 3ff1b2a8659e8..f9475c14f7339 100644 --- a/drivers/video/fbdev/core/bitblit.c +++ b/drivers/video/fbdev/core/bitblit.c @@ -59,12 +59,11 @@ static void bit_bmove(struct vc_data *vc, struct fb_info *info, int sy, } static void bit_clear(struct vc_data *vc, struct fb_info *info, int sy, - int sx, int height, int width) + int sx, int height, int width, int fg, int bg) { - int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; struct fb_fillrect region; - region.color = attr_bgcol_ec(bgshift, vc, info); + region.color = bg; region.dx = sx * vc->vc_font.width; region.dy = sy * vc->vc_font.height; region.width = width * vc->vc_font.width; diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c index e8b4e8c119b5c..07d127110ca4c 100644 --- a/drivers/video/fbdev/core/fbcon.c +++ b/drivers/video/fbdev/core/fbcon.c @@ -1258,7 +1258,7 @@ static void __fbcon_clear(struct vc_data *vc, unsigned int sy, unsigned int sx, { struct fb_info *info = fbcon_info_from_console(vc->vc_num); struct fbcon_ops *ops = info->fbcon_par; - + int fg, bg; struct fbcon_display *p = &fb_display[vc->vc_num]; u_int y_break; @@ -1279,16 +1279,18 @@ static void __fbcon_clear(struct vc_data *vc, unsigned int sy, unsigned int sx, fbcon_clear_margins(vc, 0); } + fg = get_color(vc, info, vc->vc_video_erase_char, 1); + bg = get_color(vc, info, vc->vc_video_erase_char, 0); /* Split blits that cross physical y_wrap boundary */ y_break = p->vrows - p->yscroll; if (sy < y_break && sy + height - 1 >= y_break) { u_int b = y_break - sy; - ops->clear(vc, info, real_y(p, sy), sx, b, width); + ops->clear(vc, info, real_y(p, sy), sx, b, width, fg, bg); ops->clear(vc, info, real_y(p, sy + b), sx, height - b, - width); + width, fg, bg); } else - ops->clear(vc, info, real_y(p, sy), sx, height, width); + ops->clear(vc, info, real_y(p, sy), sx, height, width, fg, bg); } static void fbcon_clear(struct vc_data *vc, unsigned int sy, unsigned int sx, diff --git a/drivers/video/fbdev/core/fbcon.h b/drivers/video/fbdev/core/fbcon.h index df70ea5ec5b37..4d97e6d8a16a2 100644 --- a/drivers/video/fbdev/core/fbcon.h +++ b/drivers/video/fbdev/core/fbcon.h @@ -55,7 +55,7 @@ struct fbcon_ops { void (*bmove)(struct vc_data *vc, struct fb_info *info, int sy, int sx, int dy, int dx, int height, int width); void (*clear)(struct vc_data *vc, struct fb_info *info, int sy, - int sx, int height, int width); + int sx, int height, int width, int fb, int bg); void (*putcs)(struct vc_data *vc, struct fb_info *info, const unsigned short *s, int count, int yy, int xx, int fg, int bg); @@ -116,42 +116,6 @@ static inline int mono_col(const struct fb_info *info) return (~(0xfff << max_len)) & 0xff; } -static inline int attr_col_ec(int shift, struct vc_data *vc, - struct fb_info *info, int is_fg) -{ - int is_mono01; - int col; - int fg; - int bg; - - if (!vc) - return 0; - - if (vc->vc_can_do_color) - return is_fg ? attr_fgcol(shift,vc->vc_video_erase_char) - : attr_bgcol(shift,vc->vc_video_erase_char); - - if (!info) - return 0; - - col = mono_col(info); - is_mono01 = info->fix.visual == FB_VISUAL_MONO01; - - if (attr_reverse(vc->vc_video_erase_char)) { - fg = is_mono01 ? col : 0; - bg = is_mono01 ? 0 : col; - } - else { - fg = is_mono01 ? 0 : col; - bg = is_mono01 ? col : 0; - } - - return is_fg ? fg : bg; -} - -#define attr_bgcol_ec(bgshift, vc, info) attr_col_ec(bgshift, vc, info, 0) -#define attr_fgcol_ec(fgshift, vc, info) attr_col_ec(fgshift, vc, info, 1) - /* * Scroll Method */ diff --git a/drivers/video/fbdev/core/fbcon_ccw.c b/drivers/video/fbdev/core/fbcon_ccw.c index f9b794ff7d396..89ef4ba7e8672 100644 --- a/drivers/video/fbdev/core/fbcon_ccw.c +++ b/drivers/video/fbdev/core/fbcon_ccw.c @@ -78,14 +78,13 @@ static void ccw_bmove(struct vc_data *vc, struct fb_info *info, int sy, } static void ccw_clear(struct vc_data *vc, struct fb_info *info, int sy, - int sx, int height, int width) + int sx, int height, int width, int fg, int bg) { struct fbcon_ops *ops = info->fbcon_par; struct fb_fillrect region; - int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; u32 vyres = GETVYRES(ops->p, info); - region.color = attr_bgcol_ec(bgshift,vc,info); + region.color = bg; region.dx = sy * vc->vc_font.height; region.dy = vyres - ((sx + width) * vc->vc_font.width); region.height = width * vc->vc_font.width; diff --git a/drivers/video/fbdev/core/fbcon_cw.c b/drivers/video/fbdev/core/fbcon_cw.c index 903f6fc174e14..b9dac7940fb77 100644 --- a/drivers/video/fbdev/core/fbcon_cw.c +++ b/drivers/video/fbdev/core/fbcon_cw.c @@ -63,14 +63,13 @@ static void cw_bmove(struct vc_data *vc, struct fb_info *info, int sy, } static void cw_clear(struct vc_data *vc, struct fb_info *info, int sy, - int sx, int height, int width) + int sx, int height, int width, int fg, int bg) { struct fbcon_ops *ops = info->fbcon_par; struct fb_fillrect region; - int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; u32 vxres = GETVXRES(ops->p, info); - region.color = attr_bgcol_ec(bgshift,vc,info); + region.color = bg; region.dx = vxres - ((sy + height) * vc->vc_font.height); region.dy = sx * vc->vc_font.width; region.height = width * vc->vc_font.width; diff --git a/drivers/video/fbdev/core/fbcon_ud.c b/drivers/video/fbdev/core/fbcon_ud.c index 594331936fd3c..0af7913a2abdc 100644 --- a/drivers/video/fbdev/core/fbcon_ud.c +++ b/drivers/video/fbdev/core/fbcon_ud.c @@ -64,15 +64,14 @@ static void ud_bmove(struct vc_data *vc, struct fb_info *info, int sy, } static void ud_clear(struct vc_data *vc, struct fb_info *info, int sy, - int sx, int height, int width) + int sx, int height, int width, int fg, int bg) { struct fbcon_ops *ops = info->fbcon_par; struct fb_fillrect region; - int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; u32 vyres = GETVYRES(ops->p, info); u32 vxres = GETVXRES(ops->p, info); - region.color = attr_bgcol_ec(bgshift,vc,info); + region.color = bg; region.dy = vyres - ((sy + height) * vc->vc_font.height); region.dx = vxres - ((sx + width) * vc->vc_font.width); region.width = width * vc->vc_font.width; diff --git a/drivers/video/fbdev/core/tileblit.c b/drivers/video/fbdev/core/tileblit.c index eff7ec4da1671..45b0828fad1cf 100644 --- a/drivers/video/fbdev/core/tileblit.c +++ b/drivers/video/fbdev/core/tileblit.c @@ -32,16 +32,14 @@ static void tile_bmove(struct vc_data *vc, struct fb_info *info, int sy, } static void tile_clear(struct vc_data *vc, struct fb_info *info, int sy, - int sx, int height, int width) + int sx, int height, int width, int fg, int bg) { struct fb_tilerect rect; - int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; - int fgshift = (vc->vc_hi_font_mask) ? 9 : 8; rect.index = vc->vc_video_erase_char & ((vc->vc_hi_font_mask) ? 0x1ff : 0xff); - rect.fg = attr_fgcol_ec(fgshift, vc, info); - rect.bg = attr_bgcol_ec(bgshift, vc, info); + rect.fg = fg; + rect.bg = bg; rect.sx = sx; rect.sy = sy; rect.width = width; -- GitLab From ff968e486e420c6b5b56efad64685ddab59655ed Mon Sep 17 00:00:00 2001 From: Zsolt Kajtar Date: Sat, 1 Feb 2025 09:18:09 +0100 Subject: [PATCH 0067/2211] fbdev: core: tileblit: Implement missing margin clearing for tileblit [ Upstream commit 76d3ca89981354e1f85a3e0ad9ac4217d351cc72 ] I was wondering why there's garbage at the bottom of the screen when tile blitting is used with an odd mode like 1080, 600 or 200. Sure there's only space for half a tile but the same area is clean when the buffer is bitmap. Then later I found that it's supposed to be cleaned but that's not implemented. So I took what's in bitblit and adapted it for tileblit. This implementation was tested for both the horizontal and vertical case, and now does the same as what's done for bitmap buffers. If anyone is interested to reproduce the problem then I could bet that'd be on a S3 or Ark. Just set up a mode with an odd line count and make sure that the virtual size covers the complete tile at the bottom. E.g. for 600 lines that's 608 virtual lines for a 16 tall tile. Then the bottom area should be cleaned. For the right side it's more difficult as there the drivers won't let an odd size happen, unless the code is modified. But once it reports back a few pixel columns short then fbcon won't use the last column. With the patch that column is now clean. Btw. the virtual size should be rounded up by the driver for both axes (not only the horizontal) so that it's dividable by the tile size. That's a driver bug but correcting it is not in scope for this patch. Implement missing margin clearing for tileblit Signed-off-by: Zsolt Kajtar Signed-off-by: Helge Deller Signed-off-by: Sasha Levin --- drivers/video/fbdev/core/tileblit.c | 37 ++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/drivers/video/fbdev/core/tileblit.c b/drivers/video/fbdev/core/tileblit.c index 45b0828fad1cf..d342b90c42b7f 100644 --- a/drivers/video/fbdev/core/tileblit.c +++ b/drivers/video/fbdev/core/tileblit.c @@ -74,7 +74,42 @@ static void tile_putcs(struct vc_data *vc, struct fb_info *info, static void tile_clear_margins(struct vc_data *vc, struct fb_info *info, int color, int bottom_only) { - return; + unsigned int cw = vc->vc_font.width; + unsigned int ch = vc->vc_font.height; + unsigned int rw = info->var.xres - (vc->vc_cols*cw); + unsigned int bh = info->var.yres - (vc->vc_rows*ch); + unsigned int rs = info->var.xres - rw; + unsigned int bs = info->var.yres - bh; + unsigned int vwt = info->var.xres_virtual / cw; + unsigned int vht = info->var.yres_virtual / ch; + struct fb_tilerect rect; + + rect.index = vc->vc_video_erase_char & + ((vc->vc_hi_font_mask) ? 0x1ff : 0xff); + rect.fg = color; + rect.bg = color; + + if ((int) rw > 0 && !bottom_only) { + rect.sx = (info->var.xoffset + rs + cw - 1) / cw; + rect.sy = 0; + rect.width = (rw + cw - 1) / cw; + rect.height = vht; + if (rect.width + rect.sx > vwt) + rect.width = vwt - rect.sx; + if (rect.sx < vwt) + info->tileops->fb_tilefill(info, &rect); + } + + if ((int) bh > 0) { + rect.sx = info->var.xoffset / cw; + rect.sy = (info->var.yoffset + bs) / ch; + rect.width = rs / cw; + rect.height = (bh + ch - 1) / ch; + if (rect.height + rect.sy > vht) + rect.height = vht - rect.sy; + if (rect.sy < vht) + info->tileops->fb_tilefill(info, &rect); + } } static void tile_cursor(struct vc_data *vc, struct fb_info *info, bool enable, -- GitLab From 15c961d7a9e5f16dd6b7490568e6040d19a46f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Sun, 27 Oct 2024 12:10:52 +0100 Subject: [PATCH 0068/2211] cifs: Set default Netbios RFC1001 server name to hostname in UNC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit be786e509c1af9b2dcf25c3d601f05c8c251f482 ] Windows SMB servers (including SMB2+) which are working over RFC1001 require that Netbios server name specified in RFC1001 Session Request packet is same as the UNC host name. Netbios server name can be already specified manually via -o servern= option. With this change the RFC1001 server name is set automatically by extracting the hostname from the mount source. Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/fs_context.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/fs/smb/client/fs_context.c b/fs/smb/client/fs_context.c index b015a4f997cb6..8b70d92f48458 100644 --- a/fs/smb/client/fs_context.c +++ b/fs/smb/client/fs_context.c @@ -1058,6 +1058,7 @@ static int smb3_fs_context_parse_param(struct fs_context *fc, int i, opt; bool is_smb3 = !strcmp(fc->fs_type->name, "smb3"); bool skip_parsing = false; + char *hostname; cifs_dbg(FYI, "CIFS: parsing cifs mount option '%s'\n", param->key); @@ -1390,6 +1391,16 @@ static int smb3_fs_context_parse_param(struct fs_context *fc, cifs_errorf(fc, "OOM when copying UNC string\n"); goto cifs_parse_mount_err; } + hostname = extract_hostname(ctx->UNC); + if (IS_ERR(hostname)) { + cifs_errorf(fc, "Cannot extract hostname from UNC string\n"); + goto cifs_parse_mount_err; + } + /* last byte, type, is 0x20 for servr type */ + memset(ctx->target_rfc1001_name, 0x20, RFC1001_NAME_LEN_WITH_NULL); + for (i = 0; i < RFC1001_NAME_LEN && hostname[i] != 0; i++) + ctx->target_rfc1001_name[i] = toupper(hostname[i]); + kfree(hostname); break; case Opt_user: kfree(ctx->username); -- GitLab From 51d44dba94e79dad9c64e4181392b11986934adf Mon Sep 17 00:00:00 2001 From: Namjae Jeon Date: Wed, 12 Feb 2025 17:52:19 +0900 Subject: [PATCH 0069/2211] cifs: add validation check for the fields in smb_aces [ Upstream commit eeb827f2922eb07ffbf7d53569cc95b38272646f ] cifs.ko is missing validation check when accessing smb_aces. This patch add validation check for the fields in smb_aces. Signed-off-by: Namjae Jeon Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/cifsacl.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/cifsacl.c b/fs/smb/client/cifsacl.c index e36f0e2d7d21e..9a73478e00688 100644 --- a/fs/smb/client/cifsacl.c +++ b/fs/smb/client/cifsacl.c @@ -811,7 +811,23 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl, return; for (i = 0; i < num_aces; ++i) { + if (end_of_acl - acl_base < acl_size) + break; + ppace[i] = (struct smb_ace *) (acl_base + acl_size); + acl_base = (char *)ppace[i]; + acl_size = offsetof(struct smb_ace, sid) + + offsetof(struct smb_sid, sub_auth); + + if (end_of_acl - acl_base < acl_size || + ppace[i]->sid.num_subauth == 0 || + ppace[i]->sid.num_subauth > SID_MAX_SUB_AUTHORITIES || + (end_of_acl - acl_base < + acl_size + sizeof(__le32) * ppace[i]->sid.num_subauth) || + (le16_to_cpu(ppace[i]->size) < + acl_size + sizeof(__le32) * ppace[i]->sid.num_subauth)) + break; + #ifdef CONFIG_CIFS_DEBUG2 dump_ace(ppace[i], end_of_acl); #endif @@ -855,7 +871,6 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl, (void *)ppace[i], sizeof(struct smb_ace)); */ - acl_base = (char *)ppace[i]; acl_size = le16_to_cpu(ppace[i]->size); } -- GitLab From 1e317f578116085950469c35d6c9d27ee4ccddb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Wed, 30 Oct 2024 22:46:20 +0100 Subject: [PATCH 0070/2211] cifs: Fix establishing NetBIOS session for SMB2+ connection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 781802aa5a5950f99899f13ff9d760f5db81d36d ] Function ip_rfc1001_connect() which establish NetBIOS session for SMB connections, currently uses smb_send() function for sending NetBIOS Session Request packet. This function expects that the passed buffer is SMB packet and for SMB2+ connections it mangles packet header, which breaks prepared NetBIOS Session Request packet. Result is that this function send garbage packet for SMB2+ connection, which SMB2+ server cannot parse. That function is not mangling packets for SMB1 connections, so it somehow works for SMB1. Fix this problem and instead of smb_send(), use smb_send_kvec() function which does not mangle prepared packet, this function send them as is. Just API of this function takes struct msghdr (kvec) instead of packet buffer. [MS-SMB2] specification allows SMB2 protocol to use NetBIOS as a transport protocol. NetBIOS can be used over TCP via port 139. So this is a valid configuration, just not so common. And even recent Windows versions (e.g. Windows Server 2022) still supports this configuration: SMB over TCP port 139, including for modern SMB2 and SMB3 dialects. This change fixes SMB2 and SMB3 connections over TCP port 139 which requires establishing of NetBIOS session. Tested that this change fixes establishing of SMB2 and SMB3 connections with Windows Server 2022. Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/cifsproto.h | 3 +++ fs/smb/client/connect.c | 20 +++++++++++++++----- fs/smb/client/transport.c | 2 +- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index 90b7b30abfbd8..306386e5c171f 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -31,6 +31,9 @@ extern void cifs_small_buf_release(void *); extern void free_rsp_buf(int, void *); extern int smb_send(struct TCP_Server_Info *, struct smb_hdr *, unsigned int /* length */); +extern int smb_send_kvec(struct TCP_Server_Info *server, + struct msghdr *msg, + size_t *sent); extern unsigned int _get_xid(void); extern void _free_xid(unsigned int); #define get_xid() \ diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index 3b4c2e59f1799..8260d0e07a628 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -3063,8 +3063,10 @@ ip_rfc1001_connect(struct TCP_Server_Info *server) * sessinit is sent but no second negprot */ struct rfc1002_session_packet req = {}; - struct smb_hdr *smb_buf = (struct smb_hdr *)&req; + struct msghdr msg = {}; + struct kvec iov = {}; unsigned int len; + size_t sent; req.trailer.session_req.called_len = sizeof(req.trailer.session_req.called_name); @@ -3093,10 +3095,18 @@ ip_rfc1001_connect(struct TCP_Server_Info *server) * As per rfc1002, @len must be the number of bytes that follows the * length field of a rfc1002 session request payload. */ - len = sizeof(req) - offsetof(struct rfc1002_session_packet, trailer.session_req); + len = sizeof(req.trailer.session_req); + req.type = RFC1002_SESSION_REQUEST; + req.flags = 0; + req.length = cpu_to_be16(len); + len += offsetof(typeof(req), trailer.session_req); + iov.iov_base = &req; + iov.iov_len = len; + iov_iter_kvec(&msg.msg_iter, ITER_SOURCE, &iov, 1, len); + rc = smb_send_kvec(server, &msg, &sent); + if (rc < 0 || len != sent) + return (rc == -EINTR || rc == -EAGAIN) ? rc : -ECONNABORTED; - smb_buf->smb_buf_length = cpu_to_be32((RFC1002_SESSION_REQUEST << 24) | len); - rc = smb_send(server, smb_buf, len); /* * RFC1001 layer in at least one server requires very short break before * negprot presumably because not expecting negprot to follow so fast. @@ -3105,7 +3115,7 @@ ip_rfc1001_connect(struct TCP_Server_Info *server) */ usleep_range(1000, 2000); - return rc; + return 0; } static int diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index 91812150186c0..9f13a705f7f67 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -179,7 +179,7 @@ delete_mid(struct mid_q_entry *mid) * Our basic "send data to server" function. Should be called with srv_mutex * held. The caller is responsible for handling the results. */ -static int +int smb_send_kvec(struct TCP_Server_Info *server, struct msghdr *smb_msg, size_t *sent) { -- GitLab From 71e07bb1556c725b105a275d411373d6191f2150 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Mon, 24 Mar 2025 20:35:33 -0400 Subject: [PATCH 0071/2211] NFSv4: Treat ENETUNREACH errors as fatal for state recovery [ Upstream commit 0af5fb5ed3d2fd9e110c6112271f022b744a849a ] If a containerised process is killed and causes an ENETUNREACH or ENETDOWN error to be propagated to the state manager, then mark the nfs_client as being dead so that we don't loop in functions that are expecting recovery to succeed. Reviewed-by: Jeff Layton Reviewed-by: Benjamin Coddington Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- fs/nfs/nfs4state.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index dafd61186557f..397a86011878f 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c @@ -2740,7 +2740,15 @@ out_error: pr_warn_ratelimited("NFS: state manager%s%s failed on NFSv4 server %s" " with error %d\n", section_sep, section, clp->cl_hostname, -status); - ssleep(1); + switch (status) { + case -ENETDOWN: + case -ENETUNREACH: + nfs_mark_client_ready(clp, -EIO); + break; + default: + ssleep(1); + break; + } out_drain: memalloc_nofs_restore(memflags); nfs4_end_drain_session(clp); -- GitLab From 984d8a392f6b3f254cef7a7edc0a9830c434d7bb Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Mon, 24 Mar 2025 19:35:01 -0400 Subject: [PATCH 0072/2211] SUNRPC: rpc_clnt_set_transport() must not change the autobind setting [ Upstream commit bf9be373b830a3e48117da5d89bb6145a575f880 ] The autobind setting was supposed to be determined in rpc_create(), since commit c2866763b402 ("SUNRPC: use sockaddr + size when creating remote transport endpoints"). Reviewed-by: Jeff Layton Reviewed-by: Benjamin Coddington Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- net/sunrpc/clnt.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 0090162ee8c35..17a4de75bfaf6 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -270,9 +270,6 @@ static struct rpc_xprt *rpc_clnt_set_transport(struct rpc_clnt *clnt, old = rcu_dereference_protected(clnt->cl_xprt, lockdep_is_held(&clnt->cl_lock)); - if (!xprt_bound(xprt)) - clnt->cl_autobind = 1; - clnt->cl_timeout = timeout; rcu_assign_pointer(clnt->cl_xprt, xprt); spin_unlock(&clnt->cl_lock); -- GitLab From dac9e6af5328fd1228356cb41d95be4b7d1a968b Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Mon, 24 Mar 2025 19:05:48 -0400 Subject: [PATCH 0073/2211] SUNRPC: rpcbind should never reset the port to the value '0' [ Upstream commit 214c13e380ad7636631279f426387f9c4e3c14d9 ] If we already had a valid port number for the RPC service, then we should not allow the rpcbind client to set it to the invalid value '0'. Reviewed-by: Jeff Layton Reviewed-by: Benjamin Coddington Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- net/sunrpc/rpcb_clnt.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c index 102c3818bc54d..53bcca365fb1c 100644 --- a/net/sunrpc/rpcb_clnt.c +++ b/net/sunrpc/rpcb_clnt.c @@ -820,9 +820,10 @@ static void rpcb_getport_done(struct rpc_task *child, void *data) } trace_rpcb_setport(child, map->r_status, map->r_port); - xprt->ops->set_port(xprt, map->r_port); - if (map->r_port) + if (map->r_port) { + xprt->ops->set_port(xprt, map->r_port); xprt_set_bound(xprt); + } } /* -- GitLab From ace57bd1fb49d193edec5f6a1f255f48dd5fca90 Mon Sep 17 00:00:00 2001 From: Luis de Arquer Date: Fri, 21 Mar 2025 13:57:53 +0100 Subject: [PATCH 0074/2211] spi-rockchip: Fix register out of bounds access [ Upstream commit 7a874e8b54ea21094f7fd2d428b164394c6cb316 ] Do not write native chip select stuff for GPIO chip selects. GPIOs can be numbered much higher than native CS. Also, it makes no sense. Signed-off-by: Luis de Arquer Link: https://patch.msgid.link/365ccddfba110549202b3520f4401a6a936e82a8.camel@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-rockchip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c index 40a64a598a749..5008489d6fac8 100644 --- a/drivers/spi/spi-rockchip.c +++ b/drivers/spi/spi-rockchip.c @@ -547,7 +547,7 @@ static int rockchip_spi_config(struct rockchip_spi *rs, cr0 |= (spi->mode & 0x3U) << CR0_SCPH_OFFSET; if (spi->mode & SPI_LSB_FIRST) cr0 |= CR0_FBM_LSB << CR0_FBM_OFFSET; - if (spi->mode & SPI_CS_HIGH) + if ((spi->mode & SPI_CS_HIGH) && !(spi_get_csgpiod(spi, 0))) cr0 |= BIT(spi_get_chipselect(spi, 0)) << CR0_SOI_OFFSET; if (xfer->rx_buf && xfer->tx_buf) -- GitLab From 780699001b8e2c167779858cb72f0449cf248278 Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Wed, 12 Mar 2025 20:25:00 +0100 Subject: [PATCH 0075/2211] ASoC: codecs: wsa884x: Correct VI sense channel mask [ Upstream commit 060fac202eb8e5c83961f0e0bf6dad8ab6e46643 ] VI sense port on WSA883x speaker takes only one channel, so use 0x1 as channel mask. This fixes garbage being recorded by the speaker when testing the VI sense feedback path. Cc: Srinivas Kandagatla Signed-off-by: Krzysztof Kozlowski Link: https://patch.msgid.link/20250312-asoc-wsa88xx-visense-v1-2-9ca705881122@linaro.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/wsa884x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/codecs/wsa884x.c b/sound/soc/codecs/wsa884x.c index 560a2c04b6955..18b0ee8f15a55 100644 --- a/sound/soc/codecs/wsa884x.c +++ b/sound/soc/codecs/wsa884x.c @@ -891,7 +891,7 @@ static const struct sdw_port_config wsa884x_pconfig[WSA884X_MAX_SWR_PORTS] = { }, [WSA884X_PORT_VISENSE] = { .num = WSA884X_PORT_VISENSE + 1, - .ch_mask = 0x3, + .ch_mask = 0x1, }, [WSA884X_PORT_CPS] = { .num = WSA884X_PORT_CPS + 1, -- GitLab From c0d63ee0dd06334c3224c1719b730b2345cc51cd Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Wed, 12 Mar 2025 20:24:59 +0100 Subject: [PATCH 0076/2211] ASoC: codecs: wsa883x: Correct VI sense channel mask [ Upstream commit ed3b274abc4008efffebf1997968a3f2720a86d3 ] VI sense port on WSA883x speaker takes only one channel, so use 0x1 as channel mask. This fixes garbage being recorded by the speaker when testing the VI sense feedback path. Cc: Srinivas Kandagatla Signed-off-by: Krzysztof Kozlowski Link: https://patch.msgid.link/20250312-asoc-wsa88xx-visense-v1-1-9ca705881122@linaro.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/wsa883x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/codecs/wsa883x.c b/sound/soc/codecs/wsa883x.c index 47da5674d7c92..e31b7fb104e6c 100644 --- a/sound/soc/codecs/wsa883x.c +++ b/sound/soc/codecs/wsa883x.c @@ -529,7 +529,7 @@ static const struct sdw_port_config wsa883x_pconfig[WSA883X_MAX_SWR_PORTS] = { }, [WSA883X_PORT_VISENSE] = { .num = WSA883X_PORT_VISENSE + 1, - .ch_mask = 0x3, + .ch_mask = 0x1, }, }; -- GitLab From 9e542640c2e59e849b76bfef5b8274d57e1264de Mon Sep 17 00:00:00 2001 From: Daniel Hsu Date: Tue, 25 Mar 2025 16:10:08 +0800 Subject: [PATCH 0077/2211] mctp: Fix incorrect tx flow invalidation condition in mctp-i2c [ Upstream commit 70facbf978ac90c6da17a3de2a8dd111b06f1bac ] Previously, the condition for invalidating the tx flow in mctp_i2c_invalidate_tx_flow() checked if `rc` was nonzero. However, this could incorrectly trigger the invalidation even when `rc > 0` was returned as a success status. This patch updates the condition to explicitly check for `rc < 0`, ensuring that only error cases trigger the invalidation. Signed-off-by: Daniel Hsu Reviewed-by: Jeremy Kerr Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/mctp/mctp-i2c.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/mctp/mctp-i2c.c b/drivers/net/mctp/mctp-i2c.c index 6622de48fc9e7..503a9174321c6 100644 --- a/drivers/net/mctp/mctp-i2c.c +++ b/drivers/net/mctp/mctp-i2c.c @@ -538,7 +538,7 @@ static void mctp_i2c_xmit(struct mctp_i2c_dev *midev, struct sk_buff *skb) rc = __i2c_transfer(midev->adapter, &msg, 1); /* on tx errors, the flow can no longer be considered valid */ - if (rc) + if (rc < 0) mctp_i2c_invalidate_tx_flow(midev, skb); break; -- GitLab From b07ba838aded8b710c65706018da148aa405f070 Mon Sep 17 00:00:00 2001 From: Hans-Frieder Vogt Date: Sat, 22 Mar 2025 11:45:58 +0100 Subject: [PATCH 0078/2211] net: tn40xx: add pci-id of the aqr105-based Tehuti TN4010 cards [ Upstream commit 53377b5c2952097527b01ce2f1d9a9332f042f70 ] Add the PCI-ID of the AQR105-based Tehuti TN4010 cards to allow loading of the tn40xx driver on these cards. Here, I chose the detailed definition with the subvendor ID similar to the QT2025 cards with the PCI-ID TEHUTI:0x4022, because there is a card with an AQ2104 hiding amongst the AQR105 cards, and they all come with the same PCI-ID (TEHUTI:0x4025). But the AQ2104 is currently not supported. Signed-off-by: Hans-Frieder Vogt Reviewed-by: Andrew Lunn Link: https://patch.msgid.link/20250322-tn9510-v3a-v7-7-672a9a3d8628@gmx.net Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/tehuti/tn40.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/ethernet/tehuti/tn40.c b/drivers/net/ethernet/tehuti/tn40.c index 259bdac24cf21..a6965258441c4 100644 --- a/drivers/net/ethernet/tehuti/tn40.c +++ b/drivers/net/ethernet/tehuti/tn40.c @@ -1832,6 +1832,10 @@ static const struct pci_device_id tn40_id_table[] = { PCI_VENDOR_ID_ASUSTEK, 0x8709) }, { PCI_DEVICE_SUB(PCI_VENDOR_ID_TEHUTI, 0x4022, PCI_VENDOR_ID_EDIMAX, 0x8103) }, + { PCI_DEVICE_SUB(PCI_VENDOR_ID_TEHUTI, PCI_DEVICE_ID_TEHUTI_TN9510, + PCI_VENDOR_ID_TEHUTI, 0x3015) }, + { PCI_DEVICE_SUB(PCI_VENDOR_ID_TEHUTI, PCI_DEVICE_ID_TEHUTI_TN9510, + PCI_VENDOR_ID_EDIMAX, 0x8102) }, { } }; -- GitLab From 7b32d4e62c87115bf878f9d4b64624eccb336819 Mon Sep 17 00:00:00 2001 From: Hans-Frieder Vogt Date: Sat, 22 Mar 2025 11:45:56 +0100 Subject: [PATCH 0079/2211] net: tn40xx: create swnode for mdio and aqr105 phy and add to mdiobus [ Upstream commit 25b6a6d29d4082f6ac231c056ac321a996eb55c9 ] In case of an AQR105-based device, create a software node for the mdio function, with a child node for the Aquantia AQR105 PHY, providing a firmware-name (and a bit more, which may be used for future checks) to allow the PHY to load a MAC specific firmware from the file system. The name of the PHY software node follows the naming convention suggested in the patch for the mdiobus_scan function (in the same patch series). Signed-off-by: Hans-Frieder Vogt Reviewed-by: Andrew Lunn Link: https://patch.msgid.link/20250322-tn9510-v3a-v7-5-672a9a3d8628@gmx.net Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/tehuti/tn40.c | 5 +- drivers/net/ethernet/tehuti/tn40.h | 33 ++++++++++ drivers/net/ethernet/tehuti/tn40_mdio.c | 82 ++++++++++++++++++++++++- 3 files changed, 117 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/tehuti/tn40.c b/drivers/net/ethernet/tehuti/tn40.c index a6965258441c4..558b791a97edd 100644 --- a/drivers/net/ethernet/tehuti/tn40.c +++ b/drivers/net/ethernet/tehuti/tn40.c @@ -1778,7 +1778,7 @@ static int tn40_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ret = tn40_phy_register(priv); if (ret) { dev_err(&pdev->dev, "failed to set up PHY.\n"); - goto err_free_irq; + goto err_cleanup_swnodes; } ret = tn40_priv_init(priv); @@ -1795,6 +1795,8 @@ static int tn40_probe(struct pci_dev *pdev, const struct pci_device_id *ent) return 0; err_unregister_phydev: tn40_phy_unregister(priv); +err_cleanup_swnodes: + tn40_swnodes_cleanup(priv); err_free_irq: pci_free_irq_vectors(pdev); err_unset_drvdata: @@ -1816,6 +1818,7 @@ static void tn40_remove(struct pci_dev *pdev) unregister_netdev(ndev); tn40_phy_unregister(priv); + tn40_swnodes_cleanup(priv); pci_free_irq_vectors(priv->pdev); pci_set_drvdata(pdev, NULL); iounmap(priv->regs); diff --git a/drivers/net/ethernet/tehuti/tn40.h b/drivers/net/ethernet/tehuti/tn40.h index 490781fe51205..25da8686d4691 100644 --- a/drivers/net/ethernet/tehuti/tn40.h +++ b/drivers/net/ethernet/tehuti/tn40.h @@ -4,10 +4,13 @@ #ifndef _TN40_H_ #define _TN40_H_ +#include #include "tn40_regs.h" #define TN40_DRV_NAME "tn40xx" +#define PCI_DEVICE_ID_TEHUTI_TN9510 0x4025 + #define TN40_MDIO_SPEED_1MHZ (1) #define TN40_MDIO_SPEED_6MHZ (6) @@ -102,10 +105,39 @@ struct tn40_txdb { int size; /* Number of elements in the db */ }; +#define NODE_PROP(_NAME, _PROP) ( \ + (const struct software_node) { \ + .name = _NAME, \ + .properties = _PROP, \ + }) + +#define NODE_PAR_PROP(_NAME, _PAR, _PROP) ( \ + (const struct software_node) { \ + .name = _NAME, \ + .parent = _PAR, \ + .properties = _PROP, \ + }) + +enum tn40_swnodes { + SWNODE_MDIO, + SWNODE_PHY, + SWNODE_MAX +}; + +struct tn40_nodes { + char phy_name[32]; + char mdio_name[32]; + struct property_entry phy_props[3]; + struct software_node swnodes[SWNODE_MAX]; + const struct software_node *group[SWNODE_MAX + 1]; +}; + struct tn40_priv { struct net_device *ndev; struct pci_dev *pdev; + struct tn40_nodes nodes; + struct napi_struct napi; /* RX FIFOs: 1 for data (full) descs, and 2 for free descs */ struct tn40_rxd_fifo rxd_fifo0; @@ -225,6 +257,7 @@ static inline void tn40_write_reg(struct tn40_priv *priv, u32 reg, u32 val) int tn40_set_link_speed(struct tn40_priv *priv, u32 speed); +void tn40_swnodes_cleanup(struct tn40_priv *priv); int tn40_mdiobus_init(struct tn40_priv *priv); int tn40_phy_register(struct tn40_priv *priv); diff --git a/drivers/net/ethernet/tehuti/tn40_mdio.c b/drivers/net/ethernet/tehuti/tn40_mdio.c index af18615d64a8a..5bb0cbc87d064 100644 --- a/drivers/net/ethernet/tehuti/tn40_mdio.c +++ b/drivers/net/ethernet/tehuti/tn40_mdio.c @@ -14,6 +14,8 @@ (FIELD_PREP(TN40_MDIO_PRTAD_MASK, (port)))) #define TN40_MDIO_CMD_READ BIT(15) +#define AQR105_FIRMWARE "tehuti/aqr105-tn40xx.cld" + static void tn40_mdio_set_speed(struct tn40_priv *priv, u32 speed) { void __iomem *regs = priv->regs; @@ -111,6 +113,56 @@ static int tn40_mdio_write_c45(struct mii_bus *mii_bus, int addr, int devnum, return tn40_mdio_write(mii_bus->priv, addr, devnum, regnum, val); } +/* registers an mdio node and an aqr105 PHY at address 1 + * tn40_mdio-%id { + * ethernet-phy@1 { + * compatible = "ethernet-phy-id03a1.b4a3"; + * reg = <1>; + * firmware-name = AQR105_FIRMWARE; + * }; + * }; + */ +static int tn40_swnodes_register(struct tn40_priv *priv) +{ + struct tn40_nodes *nodes = &priv->nodes; + struct pci_dev *pdev = priv->pdev; + struct software_node *swnodes; + u32 id; + + id = pci_dev_id(pdev); + + snprintf(nodes->phy_name, sizeof(nodes->phy_name), "ethernet-phy@1"); + snprintf(nodes->mdio_name, sizeof(nodes->mdio_name), "tn40_mdio-%x", + id); + + swnodes = nodes->swnodes; + + swnodes[SWNODE_MDIO] = NODE_PROP(nodes->mdio_name, NULL); + + nodes->phy_props[0] = PROPERTY_ENTRY_STRING("compatible", + "ethernet-phy-id03a1.b4a3"); + nodes->phy_props[1] = PROPERTY_ENTRY_U32("reg", 1); + nodes->phy_props[2] = PROPERTY_ENTRY_STRING("firmware-name", + AQR105_FIRMWARE); + swnodes[SWNODE_PHY] = NODE_PAR_PROP(nodes->phy_name, + &swnodes[SWNODE_MDIO], + nodes->phy_props); + + nodes->group[SWNODE_PHY] = &swnodes[SWNODE_PHY]; + nodes->group[SWNODE_MDIO] = &swnodes[SWNODE_MDIO]; + return software_node_register_node_group(nodes->group); +} + +void tn40_swnodes_cleanup(struct tn40_priv *priv) +{ + /* cleanup of swnodes is only needed for AQR105-based cards */ + if (priv->pdev->device == PCI_DEVICE_ID_TEHUTI_TN9510) { + fwnode_handle_put(dev_fwnode(&priv->mdio->dev)); + device_remove_software_node(&priv->mdio->dev); + software_node_unregister_node_group(priv->nodes.group); + } +} + int tn40_mdiobus_init(struct tn40_priv *priv) { struct pci_dev *pdev = priv->pdev; @@ -129,14 +181,40 @@ int tn40_mdiobus_init(struct tn40_priv *priv) bus->read_c45 = tn40_mdio_read_c45; bus->write_c45 = tn40_mdio_write_c45; + priv->mdio = bus; + + /* provide swnodes for AQR105-based cards only */ + if (pdev->device == PCI_DEVICE_ID_TEHUTI_TN9510) { + ret = tn40_swnodes_register(priv); + if (ret) { + pr_err("swnodes failed\n"); + return ret; + } + + ret = device_add_software_node(&bus->dev, + priv->nodes.group[SWNODE_MDIO]); + if (ret) { + dev_err(&pdev->dev, + "device_add_software_node failed: %d\n", ret); + goto err_swnodes_unregister; + } + } ret = devm_mdiobus_register(&pdev->dev, bus); if (ret) { dev_err(&pdev->dev, "failed to register mdiobus %d %u %u\n", ret, bus->state, MDIOBUS_UNREGISTERED); - return ret; + goto err_swnodes_cleanup; } tn40_mdio_set_speed(priv, TN40_MDIO_SPEED_6MHZ); - priv->mdio = bus; return 0; + +err_swnodes_unregister: + software_node_unregister_node_group(priv->nodes.group); + return ret; +err_swnodes_cleanup: + tn40_swnodes_cleanup(priv); + return ret; } + +MODULE_FIRMWARE(AQR105_FIRMWARE); -- GitLab From c347928320080be70e389a6daf7c28322ea24238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=ADcolas=20F=2E=20R=2E=20A=2E=20Prado?= Date: Mon, 13 Jan 2025 10:27:15 -0300 Subject: [PATCH 0080/2211] thermal/drivers/mediatek/lvts: Start sensor interrupts disabled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 2738fb3ec6838a10d2c4ce65cefdb3b90b11bd61 ] Interrupts are enabled per sensor in lvts_update_irq_mask() as needed, there's no point in enabling all of them during initialization. Change the MONINT register initial value so all sensor interrupts start disabled. Reviewed-by: AngeloGioacchino Del Regno Signed-off-by: Nícolas F. R. A. Prado Link: https://lore.kernel.org/r/20250113-mt8192-lvts-filtered-suspend-fix-v2-4-07a25200c7c6@collabora.com Signed-off-by: Daniel Lezcano Signed-off-by: Sasha Levin --- drivers/thermal/mediatek/lvts_thermal.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/thermal/mediatek/lvts_thermal.c b/drivers/thermal/mediatek/lvts_thermal.c index 4b3225377e8f8..3295b27ab70d2 100644 --- a/drivers/thermal/mediatek/lvts_thermal.c +++ b/drivers/thermal/mediatek/lvts_thermal.c @@ -65,7 +65,6 @@ #define LVTS_HW_FILTER 0x0 #define LVTS_TSSEL_CONF 0x13121110 #define LVTS_CALSCALE_CONF 0x300 -#define LVTS_MONINT_CONF 0x0300318C #define LVTS_MONINT_OFFSET_SENSOR0 0xC #define LVTS_MONINT_OFFSET_SENSOR1 0x180 @@ -929,7 +928,7 @@ static int lvts_irq_init(struct lvts_ctrl *lvts_ctrl) * The LVTS_MONINT register layout is the same as the LVTS_MONINTSTS * register, except we set the bits to enable the interrupt. */ - writel(LVTS_MONINT_CONF, LVTS_MONINT(lvts_ctrl->base)); + writel(0, LVTS_MONINT(lvts_ctrl->base)); return 0; } -- GitLab From 7cfde2a48280086a23e4ec59bfb591ed2942061a Mon Sep 17 00:00:00 2001 From: Alice Guo Date: Mon, 9 Dec 2024 11:48:59 -0500 Subject: [PATCH 0081/2211] thermal/drivers/qoriq: Power down TMU on system suspend [ Upstream commit 229f3feb4b0442835b27d519679168bea2de96c2 ] Enable power-down of TMU (Thermal Management Unit) for TMU version 2 during system suspend to save power. Save approximately 4.3mW on VDD_ANA_1P8 on i.MX93 platforms. Signed-off-by: Alice Guo Signed-off-by: Frank Li Link: https://lore.kernel.org/r/20241209164859.3758906-2-Frank.Li@nxp.com Signed-off-by: Daniel Lezcano Signed-off-by: Sasha Levin --- drivers/thermal/qoriq_thermal.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/thermal/qoriq_thermal.c b/drivers/thermal/qoriq_thermal.c index 52e26be8c53df..aed2729f63d06 100644 --- a/drivers/thermal/qoriq_thermal.c +++ b/drivers/thermal/qoriq_thermal.c @@ -18,6 +18,7 @@ #define SITES_MAX 16 #define TMR_DISABLE 0x0 #define TMR_ME 0x80000000 +#define TMR_CMD BIT(29) #define TMR_ALPF 0x0c000000 #define TMR_ALPF_V2 0x03000000 #define TMTMIR_DEFAULT 0x0000000f @@ -356,6 +357,12 @@ static int qoriq_tmu_suspend(struct device *dev) if (ret) return ret; + if (data->ver > TMU_VER1) { + ret = regmap_set_bits(data->regmap, REGS_TMR, TMR_CMD); + if (ret) + return ret; + } + clk_disable_unprepare(data->clk); return 0; @@ -370,6 +377,12 @@ static int qoriq_tmu_resume(struct device *dev) if (ret) return ret; + if (data->ver > TMU_VER1) { + ret = regmap_clear_bits(data->regmap, REGS_TMR, TMR_CMD); + if (ret) + return ret; + } + /* Enable monitoring */ return regmap_update_bits(data->regmap, REGS_TMR, TMR_ME, TMR_ME); } -- GitLab From 7ec409ee15ac18f3518be17d99ac6e16c3f70f60 Mon Sep 17 00:00:00 2001 From: Sean Wang Date: Tue, 11 Mar 2025 18:25:22 -0700 Subject: [PATCH 0082/2211] Bluetooth: btmtksdio: Prevent enabling interrupts after IRQ handler removal [ Upstream commit 6ac4233afb9a389a7629b7f812395d1d1eca5a83 ] Ensure interrupts are not re-enabled when the IRQ handler has already been removed. This prevents unexpected IRQ handler execution due to stale or unhandled interrupts. Modify btmtksdio_txrx_work to check if bdev->func->irq_handler exists before calling sdio_writel to enable interrupts. Co-developed-by: Pedro Tsai Signed-off-by: Pedro Tsai Co-developed-by: Felix Freimann Signed-off-by: Felix Freimann Signed-off-by: Sean Wang Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- drivers/bluetooth/btmtksdio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/bluetooth/btmtksdio.c b/drivers/bluetooth/btmtksdio.c index 11d33cd7b08fc..d4ea1ff07b3e7 100644 --- a/drivers/bluetooth/btmtksdio.c +++ b/drivers/bluetooth/btmtksdio.c @@ -610,7 +610,8 @@ static void btmtksdio_txrx_work(struct work_struct *work) } while (int_status || time_is_before_jiffies(txrx_timeout)); /* Enable interrupt */ - sdio_writel(bdev->func, C_INT_EN_SET, MTK_REG_CHLPCR, NULL); + if (bdev->func->irq_handler) + sdio_writel(bdev->func, C_INT_EN_SET, MTK_REG_CHLPCR, NULL); sdio_release_host(bdev->func); -- GitLab From f48ee562c095e552a30b8d9cc0566a267b410f8a Mon Sep 17 00:00:00 2001 From: Pedro Nishiyama Date: Sat, 1 Mar 2025 03:23:00 -0300 Subject: [PATCH 0083/2211] Bluetooth: Disable SCO support if READ_VOICE_SETTING is unsupported/broken [ Upstream commit 14d17c78a4b1660c443bae9d38c814edea506f62 ] A SCO connection without the proper voice_setting can cause the controller to lock up. Signed-off-by: Pedro Nishiyama Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- net/bluetooth/hci_event.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index bc5b42fce2b80..8894633403519 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -932,6 +932,9 @@ static u8 hci_cc_read_buffer_size(struct hci_dev *hdev, void *data, hdev->sco_pkts = 8; } + if (!read_voice_setting_capable(hdev)) + hdev->sco_pkts = 0; + hdev->acl_cnt = hdev->acl_pkts; hdev->sco_cnt = hdev->sco_pkts; -- GitLab From 44b79041c44aed132b504c6045541649677fb3f4 Mon Sep 17 00:00:00 2001 From: Jing Su Date: Wed, 19 Mar 2025 16:57:51 +0800 Subject: [PATCH 0084/2211] dql: Fix dql->limit value when reset. [ Upstream commit 3a17f23f7c36bac3a3584aaf97d3e3e0b2790396 ] Executing dql_reset after setting a non-zero value for limit_min can lead to an unreasonable situation where dql->limit is less than dql->limit_min. For instance, after setting /sys/class/net/eth*/queues/tx-0/byte_queue_limits/limit_min, an ifconfig down/up operation might cause the ethernet driver to call netdev_tx_reset_queue, which in turn invokes dql_reset. In this case, dql->limit is reset to 0 while dql->limit_min remains non-zero value, which is unexpected. The limit should always be greater than or equal to limit_min. Signed-off-by: Jing Su Link: https://patch.msgid.link/Z9qHD1s/NEuQBdgH@pilot-ThinkCentre-M930t-N000 Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- lib/dynamic_queue_limits.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dynamic_queue_limits.c b/lib/dynamic_queue_limits.c index e49deddd3de9f..7d1dfbb99b397 100644 --- a/lib/dynamic_queue_limits.c +++ b/lib/dynamic_queue_limits.c @@ -190,7 +190,7 @@ EXPORT_SYMBOL(dql_completed); void dql_reset(struct dql *dql) { /* Reset all dynamic values */ - dql->limit = 0; + dql->limit = dql->min_limit; dql->num_queued = 0; dql->num_completed = 0; dql->last_obj_cnt = 0; -- GitLab From ac30595154da094de222f3648243ad000596a421 Mon Sep 17 00:00:00 2001 From: Ryo Takakura Date: Fri, 21 Mar 2025 07:33:22 -0700 Subject: [PATCH 0085/2211] lockdep: Fix wait context check on softirq for PREEMPT_RT [ Upstream commit 61c39d8c83e2077f33e0a2c8980a76a7f323f0ce ] Since: 0c1d7a2c2d32 ("lockdep: Remove softirq accounting on PREEMPT_RT.") the wait context test for mutex usage within "in softirq context" fails as it references @softirq_context: | wait context tests | -------------------------------------------------------------------------- | rcu | raw | spin |mutex | -------------------------------------------------------------------------- in hardirq context: ok | ok | ok | ok | in hardirq context (not threaded): ok | ok | ok | ok | in softirq context: ok | ok | ok |FAILED| As a fix, add lockdep map for BH disabled section. This fixes the issue by letting us catch cases when local_bh_disable() gets called with preemption disabled where local_lock doesn't get acquired. In the case of "in softirq context" selftest, local_bh_disable() was being called with preemption disable as it's early in the boot. [ boqun: Move the lockdep annotations into __local_bh_*() to avoid false positives because of unpaired local_bh_disable() reported by Borislav Petkov and Peter Zijlstra, and make bh_lock_map only exist for PREEMPT_RT. ] [ mingo: Restored authorship and improved the bh_lock_map definition. ] Signed-off-by: Ryo Takakura Signed-off-by: Boqun Feng Signed-off-by: Ingo Molnar Link: https://lore.kernel.org/r/20250321143322.79651-1-boqun.feng@gmail.com Signed-off-by: Sasha Levin --- kernel/softirq.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/kernel/softirq.c b/kernel/softirq.c index 8c4524ce65faf..00ff176350413 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -126,6 +126,18 @@ static DEFINE_PER_CPU(struct softirq_ctrl, softirq_ctrl) = { .lock = INIT_LOCAL_LOCK(softirq_ctrl.lock), }; +#ifdef CONFIG_DEBUG_LOCK_ALLOC +static struct lock_class_key bh_lock_key; +struct lockdep_map bh_lock_map = { + .name = "local_bh", + .key = &bh_lock_key, + .wait_type_outer = LD_WAIT_FREE, + .wait_type_inner = LD_WAIT_CONFIG, /* PREEMPT_RT makes BH preemptible. */ + .lock_type = LD_LOCK_PERCPU, +}; +EXPORT_SYMBOL_GPL(bh_lock_map); +#endif + /** * local_bh_blocked() - Check for idle whether BH processing is blocked * @@ -148,6 +160,8 @@ void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) WARN_ON_ONCE(in_hardirq()); + lock_map_acquire_read(&bh_lock_map); + /* First entry of a task into a BH disabled section? */ if (!current->softirq_disable_cnt) { if (preemptible()) { @@ -211,6 +225,8 @@ void __local_bh_enable_ip(unsigned long ip, unsigned int cnt) WARN_ON_ONCE(in_hardirq()); lockdep_assert_irqs_enabled(); + lock_map_release(&bh_lock_map); + local_irq_save(flags); curcnt = __this_cpu_read(softirq_ctrl.cnt); @@ -261,6 +277,8 @@ static inline void ksoftirqd_run_begin(void) /* Counterpart to ksoftirqd_run_begin() */ static inline void ksoftirqd_run_end(void) { + /* pairs with the lock_map_acquire_read() in ksoftirqd_run_begin() */ + lock_map_release(&bh_lock_map); __local_bh_enable(SOFTIRQ_OFFSET, true); WARN_ON_ONCE(in_interrupt()); local_irq_enable(); -- GitLab From c0c59a1f776654aded96a9237398bf1a00f31faf Mon Sep 17 00:00:00 2001 From: Josh Poimboeuf Date: Mon, 24 Mar 2025 14:55:58 -0700 Subject: [PATCH 0086/2211] objtool: Properly disable uaccess validation [ Upstream commit e1a9dda74dbffbc3fa2069ff418a1876dc99fb14 ] If opts.uaccess isn't set, the uaccess validation is disabled, but only partially: it doesn't read the uaccess_safe_builtin list but still tries to do the validation. Disable it completely to prevent false warnings. Signed-off-by: Josh Poimboeuf Signed-off-by: Ingo Molnar Cc: Linus Torvalds Link: https://lore.kernel.org/r/0e95581c1d2107fb5f59418edf2b26bba38b0cbb.1742852846.git.jpoimboe@kernel.org Signed-off-by: Sasha Levin --- tools/objtool/check.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tools/objtool/check.c b/tools/objtool/check.c index bea6461ac340d..0757b98b0a445 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -3353,7 +3353,7 @@ static int handle_insn_ops(struct instruction *insn, if (update_cfi_state(insn, next_insn, &state->cfi, op)) return 1; - if (!insn->alt_group) + if (!opts.uaccess || !insn->alt_group) continue; if (op->dest.type == OP_DEST_PUSHF) { @@ -3820,6 +3820,9 @@ static int validate_branch(struct objtool_file *file, struct symbol *func, return 0; case INSN_STAC: + if (!opts.uaccess) + break; + if (state.uaccess) { WARN_INSN(insn, "recursive UACCESS enable"); return 1; @@ -3829,6 +3832,9 @@ static int validate_branch(struct objtool_file *file, struct symbol *func, break; case INSN_CLAC: + if (!opts.uaccess) + break; + if (!state.uaccess && func) { WARN_INSN(insn, "redundant UACCESS disable"); return 1; @@ -4304,7 +4310,8 @@ static int validate_symbol(struct objtool_file *file, struct section *sec, if (!insn || insn->ignore || insn->visited) return 0; - state->uaccess = sym->uaccess_safe; + if (opts.uaccess) + state->uaccess = sym->uaccess_safe; ret = validate_branch(file, insn_func(insn), insn, *state); if (ret) -- GitLab From e63b634806a1d64bb2c8ca15b0c75d13d861c4de Mon Sep 17 00:00:00 2001 From: Frank Li Date: Sat, 15 Mar 2025 15:15:46 -0500 Subject: [PATCH 0087/2211] PCI: dwc: ep: Ensure proper iteration over outbound map windows [ Upstream commit f3e1dccba0a0833fc9a05fb838ebeb6ea4ca0e1a ] Most systems' PCIe outbound map windows have non-zero physical addresses, but the possibility of encountering zero increased after following commit ("PCI: dwc: Use parent_bus_offset"). 'ep->outbound_addr[n]', representing 'parent_bus_address', might be 0 on some hardware, which trims high address bits through bus fabric before sending to the PCIe controller. Replace the iteration logic with 'for_each_set_bit()' to ensure only allocated map windows are iterated when determining the ATU index from a given address. Link: https://lore.kernel.org/r/20250315201548.858189-12-helgaas@kernel.org Signed-off-by: Frank Li Signed-off-by: Bjorn Helgaas Signed-off-by: Sasha Levin --- drivers/pci/controller/dwc/pcie-designware-ep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c index dea19250598a6..9e7e94f32b436 100644 --- a/drivers/pci/controller/dwc/pcie-designware-ep.c +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c @@ -280,7 +280,7 @@ static int dw_pcie_find_index(struct dw_pcie_ep *ep, phys_addr_t addr, u32 index; struct dw_pcie *pci = to_dw_pcie_from_ep(ep); - for (index = 0; index < pci->num_ob_windows; index++) { + for_each_set_bit(index, ep->ob_window_map, pci->num_ob_windows) { if (ep->outbound_addr[index] != addr) continue; *atu_index = index; -- GitLab From 2780aa8394415df0a69e3b908d6dd8c79e1d1bcc Mon Sep 17 00:00:00 2001 From: ChunHao Lin Date: Tue, 18 Mar 2025 16:37:21 +0800 Subject: [PATCH 0088/2211] r8169: disable RTL8126 ZRX-DC timeout [ Upstream commit b48688ea3c9ac8d5d910c6e91fb7f80d846581f0 ] Disable it due to it dose not meet ZRX-DC specification. If it is enabled, device will exit L1 substate every 100ms. Disable it for saving more power in L1 substate. Signed-off-by: ChunHao Lin Reviewed-by: Heiner Kallweit Link: https://patch.msgid.link/20250318083721.4127-3-hau@realtek.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/realtek/r8169_main.c | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c index 5ed2818bac257..3420b6cf8189f 100644 --- a/drivers/net/ethernet/realtek/r8169_main.c +++ b/drivers/net/ethernet/realtek/r8169_main.c @@ -2850,6 +2850,32 @@ static u32 rtl_csi_read(struct rtl8169_private *tp, int addr) RTL_R32(tp, CSIDR) : ~0; } +static void rtl_disable_zrxdc_timeout(struct rtl8169_private *tp) +{ + struct pci_dev *pdev = tp->pci_dev; + u32 csi; + int rc; + u8 val; + +#define RTL_GEN3_RELATED_OFF 0x0890 +#define RTL_GEN3_ZRXDC_NONCOMPL 0x1 + if (pdev->cfg_size > RTL_GEN3_RELATED_OFF) { + rc = pci_read_config_byte(pdev, RTL_GEN3_RELATED_OFF, &val); + if (rc == PCIBIOS_SUCCESSFUL) { + val &= ~RTL_GEN3_ZRXDC_NONCOMPL; + rc = pci_write_config_byte(pdev, RTL_GEN3_RELATED_OFF, + val); + if (rc == PCIBIOS_SUCCESSFUL) + return; + } + } + + netdev_notice_once(tp->dev, + "No native access to PCI extended config space, falling back to CSI\n"); + csi = rtl_csi_read(tp, RTL_GEN3_RELATED_OFF); + rtl_csi_write(tp, RTL_GEN3_RELATED_OFF, csi & ~RTL_GEN3_ZRXDC_NONCOMPL); +} + static void rtl_set_aspm_entry_latency(struct rtl8169_private *tp, u8 val) { struct pci_dev *pdev = tp->pci_dev; @@ -3816,6 +3842,7 @@ static void rtl_hw_start_8125b(struct rtl8169_private *tp) static void rtl_hw_start_8126a(struct rtl8169_private *tp) { + rtl_disable_zrxdc_timeout(tp); rtl_set_def_aspm_entry_latency(tp); rtl_hw_start_8125_common(tp); } -- GitLab From a1596965a7c828cca581df4cbf178d405d440671 Mon Sep 17 00:00:00 2001 From: Ian Rogers Date: Tue, 11 Mar 2025 14:36:23 -0700 Subject: [PATCH 0089/2211] tools/build: Don't pass test log files to linker [ Upstream commit 935e7cb5bb80106ff4f2fe39640f430134ef8cd8 ] Separate test log files from object files. Depend on test log output but don't pass to the linker. Reviewed-by: James Clark Signed-off-by: Ian Rogers Link: https://lore.kernel.org/r/20250311213628.569562-2-irogers@google.com Signed-off-by: Namhyung Kim Signed-off-by: Sasha Levin --- tools/build/Makefile.build | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/build/Makefile.build b/tools/build/Makefile.build index 5fb3fb3d97e0f..ffe988867703b 100644 --- a/tools/build/Makefile.build +++ b/tools/build/Makefile.build @@ -149,6 +149,10 @@ objprefix := $(subst ./,,$(OUTPUT)$(dir)/) obj-y := $(addprefix $(objprefix),$(obj-y)) subdir-obj-y := $(addprefix $(objprefix),$(subdir-obj-y)) +# Separate out test log files from real build objects. +test-y := $(filter %_log, $(obj-y)) +obj-y := $(filter-out %_log, $(obj-y)) + # Final '$(obj)-in.o' object in-target := $(objprefix)$(obj)-in.o @@ -159,7 +163,7 @@ $(subdir-y): $(sort $(subdir-obj-y)): $(subdir-y) ; -$(in-target): $(obj-y) FORCE +$(in-target): $(obj-y) $(test-y) FORCE $(call rule_mkdir) $(call if_changed,$(host)ld_multi) -- GitLab From 1630224189cc43768669d60412460118ebcb74b4 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Thu, 20 Mar 2025 12:45:01 -0400 Subject: [PATCH 0090/2211] pNFS/flexfiles: Report ENETDOWN as a connection error [ Upstream commit aa42add73ce9b9e3714723d385c254b75814e335 ] If the client should see an ENETDOWN when trying to connect to the data server, it might still be able to talk to the metadata server through another NIC. If so, report the error. Signed-off-by: Trond Myklebust Reviewed-by: Jeff Layton Tested-by: Jeff Layton Acked-by: Chuck Lever Signed-off-by: Sasha Levin --- fs/nfs/flexfilelayout/flexfilelayout.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index a1cfe4cc60c4b..8f7ea4076653d 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c @@ -1263,6 +1263,7 @@ static void ff_layout_io_track_ds_error(struct pnfs_layout_segment *lseg, case -ECONNRESET: case -EHOSTDOWN: case -EHOSTUNREACH: + case -ENETDOWN: case -ENETUNREACH: case -EADDRINUSE: case -ENOBUFS: -- GitLab From 98e38fe7d355765f6665013d6379b4415d56b897 Mon Sep 17 00:00:00 2001 From: Flora Cui Date: Thu, 27 Feb 2025 10:39:27 +0800 Subject: [PATCH 0091/2211] drm/amdgpu/discovery: check ip_discovery fw file available [ Upstream commit 017fbb6690c2245b1b4ef39b66c79d2990fe63dd ] Signed-off-by: Flora Cui Reviewed-by: Alex Deucher Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c index ca8091fd3a24f..018240a2ab96a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c @@ -111,8 +111,7 @@ #include "amdgpu_isp.h" #endif -#define FIRMWARE_IP_DISCOVERY "amdgpu/ip_discovery.bin" -MODULE_FIRMWARE(FIRMWARE_IP_DISCOVERY); +MODULE_FIRMWARE("amdgpu/ip_discovery.bin"); #define mmIP_DISCOVERY_VERSION 0x16A00 #define mmRCC_CONFIG_MEMSIZE 0xde3 @@ -295,21 +294,13 @@ static int amdgpu_discovery_read_binary_from_mem(struct amdgpu_device *adev, return ret; } -static int amdgpu_discovery_read_binary_from_file(struct amdgpu_device *adev, uint8_t *binary) +static int amdgpu_discovery_read_binary_from_file(struct amdgpu_device *adev, + uint8_t *binary, + const char *fw_name) { const struct firmware *fw; - const char *fw_name; int r; - switch (amdgpu_discovery) { - case 2: - fw_name = FIRMWARE_IP_DISCOVERY; - break; - default: - dev_warn(adev->dev, "amdgpu_discovery is not set properly\n"); - return -EINVAL; - } - r = request_firmware(&fw, fw_name, adev->dev); if (r) { dev_err(adev->dev, "can't load firmware \"%s\"\n", @@ -402,10 +393,19 @@ static int amdgpu_discovery_verify_npsinfo(struct amdgpu_device *adev, return 0; } +static const char *amdgpu_discovery_get_fw_name(struct amdgpu_device *adev) +{ + if (amdgpu_discovery == 2) + return "amdgpu/ip_discovery.bin"; + + return NULL; +} + static int amdgpu_discovery_init(struct amdgpu_device *adev) { struct table_info *info; struct binary_header *bhdr; + const char *fw_name; uint16_t offset; uint16_t size; uint16_t checksum; @@ -417,9 +417,10 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev) return -ENOMEM; /* Read from file if it is the preferred option */ - if (amdgpu_discovery == 2) { + fw_name = amdgpu_discovery_get_fw_name(adev); + if (fw_name != NULL) { dev_info(adev->dev, "use ip discovery information from file"); - r = amdgpu_discovery_read_binary_from_file(adev, adev->mman.discovery_bin); + r = amdgpu_discovery_read_binary_from_file(adev, adev->mman.discovery_bin, fw_name); if (r) { dev_err(adev->dev, "failed to read ip discovery binary from file\n"); -- GitLab From 8b80fd3f76f2a641c76fbda45b9ca4e1eddfc763 Mon Sep 17 00:00:00 2001 From: Jonathan Kim Date: Fri, 14 Mar 2025 11:08:21 -0400 Subject: [PATCH 0092/2211] drm/amdkfd: set precise mem ops caps to disabled for gfx 11 and 12 [ Upstream commit f82d27dcff939d3cbecbc60e1b71e2518c37e81d ] Clause instructions with precise memory enabled currently hang the shader so set capabilities flag to disabled since it's unsafe to use for debugging. Signed-off-by: Jonathan Kim Tested-by: Lancelot Six Reviewed-by: Harish Kasiviswanathan Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c index 3871591c9aec9..bcb5cdc4a9d81 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c @@ -2002,10 +2002,6 @@ static void kfd_topology_set_capabilities(struct kfd_topology_device *dev) dev->node_props.debug_prop |= HSA_DBG_WATCH_ADDR_MASK_LO_BIT_GFX10 | HSA_DBG_WATCH_ADDR_MASK_HI_BIT; - if (KFD_GC_VERSION(dev->gpu) >= IP_VERSION(11, 0, 0)) - dev->node_props.capability |= - HSA_CAP_TRAP_DEBUG_PRECISE_MEMORY_OPERATIONS_SUPPORTED; - if (KFD_GC_VERSION(dev->gpu) >= IP_VERSION(12, 0, 0)) dev->node_props.capability |= HSA_CAP_TRAP_DEBUG_PRECISE_ALU_OPERATIONS_SUPPORTED; -- GitLab From 2a8bedeb963f04d13b782e099c7db3d2f62a056e Mon Sep 17 00:00:00 2001 From: Roger Pau Monne Date: Wed, 19 Feb 2025 10:20:56 +0100 Subject: [PATCH 0093/2211] PCI: vmd: Disable MSI remapping bypass under Xen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 6c4d5aadf5df31ea0ac025980670eee9beaf466b ] MSI remapping bypass (directly configuring MSI entries for devices on the VMD bus) won't work under Xen, as Xen is not aware of devices in such bus, and hence cannot configure the entries using the pIRQ interface in the PV case, and in the PVH case traps won't be setup for MSI entries for such devices. Until Xen is aware of devices in the VMD bus prevent the VMD_FEAT_CAN_BYPASS_MSI_REMAP capability from being used when running as any kind of Xen guest. The MSI remapping bypass is an optional feature of VMD bridges, and hence when running under Xen it will be masked and devices will be forced to redirect its interrupts from the VMD bridge. That mode of operation must always be supported by VMD bridges and works when Xen is not aware of devices behind the VMD bridge. Signed-off-by: Roger Pau Monné Acked-by: Bjorn Helgaas Message-ID: <20250219092059.90850-3-roger.pau@citrix.com> Signed-off-by: Juergen Gross Signed-off-by: Sasha Levin --- drivers/pci/controller/vmd.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index 94ceec50a2b94..8df064b62a2ff 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -17,6 +17,8 @@ #include #include +#include + #include #define VMD_CFGBAR 0 @@ -970,6 +972,24 @@ static int vmd_probe(struct pci_dev *dev, const struct pci_device_id *id) struct vmd_dev *vmd; int err; + if (xen_domain()) { + /* + * Xen doesn't have knowledge about devices in the VMD bus + * because the config space of devices behind the VMD bridge is + * not known to Xen, and hence Xen cannot discover or configure + * them in any way. + * + * Bypass of MSI remapping won't work in that case as direct + * write by Linux to the MSI entries won't result in functional + * interrupts, as Xen is the entity that manages the host + * interrupt controller and must configure interrupts. However + * multiplexing of interrupts by the VMD bridge will work under + * Xen, so force the usage of that mode which must always be + * supported by VMD bridges. + */ + features &= ~VMD_FEAT_CAN_BYPASS_MSI_REMAP; + } + if (resource_size(&dev->resource[VMD_CFGBAR]) < (1 << 20)) return -ENOMEM; -- GitLab From 3e10592b477ec6e8ea49d8a6c0d52dcb57fa79d0 Mon Sep 17 00:00:00 2001 From: Roger Pau Monne Date: Wed, 19 Feb 2025 10:20:55 +0100 Subject: [PATCH 0094/2211] xen/pci: Do not register devices with segments >= 0x10000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 5ccf1b8ae76ddf348e02a0d1564ff9baf8b6c415 ] The current hypercall interface for doing PCI device operations always uses a segment field that has a 16 bit width. However on Linux there are buses like VMD that hook up devices into the PCI hierarchy at segment >= 0x10000, after the maximum possible segment enumerated in ACPI. Attempting to register or manage those devices with Xen would result in errors at best, or overlaps with existing devices living on the truncated equivalent segment values. Note also that the VMD segment numbers are arbitrarily assigned by the OS, and hence there would need to be some negotiation between Xen and the OS to agree on how to enumerate VMD segments and devices behind them. Skip notifying Xen about those devices. Given how VMD bridges can multiplex interrupts on behalf of devices behind them there's no need for Xen to be aware of such devices for them to be usable by Linux. Signed-off-by: Roger Pau Monné Acked-by: Juergen Gross Message-ID: <20250219092059.90850-2-roger.pau@citrix.com> Signed-off-by: Juergen Gross Signed-off-by: Sasha Levin --- drivers/xen/pci.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/xen/pci.c b/drivers/xen/pci.c index 416f231809cb6..bfe07adb3e3a6 100644 --- a/drivers/xen/pci.c +++ b/drivers/xen/pci.c @@ -43,6 +43,18 @@ static int xen_add_device(struct device *dev) pci_mcfg_reserved = true; } #endif + + if (pci_domain_nr(pci_dev->bus) >> 16) { + /* + * The hypercall interface is limited to 16bit PCI segment + * values, do not attempt to register devices with Xen in + * segments greater or equal than 0x10000. + */ + dev_info(dev, + "not registering with Xen: invalid PCI segment\n"); + return 0; + } + if (pci_seg_supported) { DEFINE_RAW_FLEX(struct physdev_pci_device_add, add, optarr, 1); @@ -149,6 +161,16 @@ static int xen_remove_device(struct device *dev) int r; struct pci_dev *pci_dev = to_pci_dev(dev); + if (pci_domain_nr(pci_dev->bus) >> 16) { + /* + * The hypercall interface is limited to 16bit PCI segment + * values. + */ + dev_info(dev, + "not unregistering with Xen: invalid PCI segment\n"); + return 0; + } + if (pci_seg_supported) { struct physdev_pci_device device = { .seg = pci_domain_nr(pci_dev->bus), @@ -182,6 +204,16 @@ int xen_reset_device(const struct pci_dev *dev) .flags = PCI_DEVICE_RESET_FLR, }; + if (pci_domain_nr(dev->bus) >> 16) { + /* + * The hypercall interface is limited to 16bit PCI segment + * values. + */ + dev_info(&dev->dev, + "unable to notify Xen of device reset: invalid PCI segment\n"); + return 0; + } + return HYPERVISOR_physdev_op(PHYSDEVOP_pci_device_reset, &device); } EXPORT_SYMBOL_GPL(xen_reset_device); -- GitLab From 37ac2434aae16b4a36fec163edc2928a7acf599c Mon Sep 17 00:00:00 2001 From: Nicolas Bretz Date: Wed, 19 Mar 2025 11:10:11 -0600 Subject: [PATCH 0095/2211] ext4: on a remount, only log the ro or r/w state when it has changed [ Upstream commit d7b0befd09320e3356a75cb96541c030515e7f5f ] A user complained that a message such as: EXT4-fs (nvme0n1p3): re-mounted UUID ro. Quota mode: none. implied that the file system was previously mounted read/write and was now remounted read-only, when it could have been some other mount state that had changed by the "mount -o remount" operation. Fix this by only logging "ro"or "r/w" when it has changed. https://bugzilla.kernel.org/show_bug.cgi?id=219132 Signed-off-by: Nicolas Bretz Link: https://patch.msgid.link/20250319171011.8372-1-bretznic@gmail.com Signed-off-by: Theodore Ts'o Signed-off-by: Sasha Levin --- fs/ext4/super.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 4291ab3c20be6..473909c4a3784 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -6744,6 +6744,7 @@ static int ext4_reconfigure(struct fs_context *fc) { struct super_block *sb = fc->root->d_sb; int ret; + bool old_ro = sb_rdonly(sb); fc->s_fs_info = EXT4_SB(sb); @@ -6755,9 +6756,9 @@ static int ext4_reconfigure(struct fs_context *fc) if (ret < 0) return ret; - ext4_msg(sb, KERN_INFO, "re-mounted %pU %s. Quota mode: %s.", - &sb->s_uuid, sb_rdonly(sb) ? "ro" : "r/w", - ext4_quota_mode(sb)); + ext4_msg(sb, KERN_INFO, "re-mounted %pU%s.", + &sb->s_uuid, + (old_ro != sb_rdonly(sb)) ? (sb_rdonly(sb) ? " ro" : " r/w") : ""); return 0; } -- GitLab From 1d1e1efad1cf049e888bf175a5c6be85d792620c Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Thu, 20 Mar 2025 12:22:22 +0100 Subject: [PATCH 0096/2211] libnvdimm/labels: Fix divide error in nd_label_data_init() [ Upstream commit ef1d3455bbc1922f94a91ed58d3d7db440652959 ] If a faulty CXL memory device returns a broken zero LSA size in its memory device information (Identify Memory Device (Opcode 4000h), CXL spec. 3.1, 8.2.9.9.1.1), a divide error occurs in the libnvdimm driver: Oops: divide error: 0000 [#1] PREEMPT SMP NOPTI RIP: 0010:nd_label_data_init+0x10e/0x800 [libnvdimm] Code and flow: 1) CXL Command 4000h returns LSA size = 0 2) config_size is assigned to zero LSA size (CXL pmem driver): drivers/cxl/pmem.c: .config_size = mds->lsa_size, 3) max_xfer is set to zero (nvdimm driver): drivers/nvdimm/label.c: max_xfer = min_t(size_t, ndd->nsarea.max_xfer, config_size); 4) A subsequent DIV_ROUND_UP() causes a division by zero: drivers/nvdimm/label.c: /* Make our initial read size a multiple of max_xfer size */ drivers/nvdimm/label.c: read_size = min(DIV_ROUND_UP(read_size, max_xfer) * max_xfer, drivers/nvdimm/label.c- config_size); Fix this by checking the config size parameter by extending an existing check. Signed-off-by: Robert Richter Reviewed-by: Pankaj Gupta Reviewed-by: Ira Weiny Link: https://patch.msgid.link/20250320112223.608320-1-rrichter@amd.com Signed-off-by: Ira Weiny Signed-off-by: Sasha Levin --- drivers/nvdimm/label.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c index 082253a3a9560..04f4a049599a1 100644 --- a/drivers/nvdimm/label.c +++ b/drivers/nvdimm/label.c @@ -442,7 +442,8 @@ int nd_label_data_init(struct nvdimm_drvdata *ndd) if (ndd->data) return 0; - if (ndd->nsarea.status || ndd->nsarea.max_xfer == 0) { + if (ndd->nsarea.status || ndd->nsarea.max_xfer == 0 || + ndd->nsarea.config_size == 0) { dev_dbg(ndd->dev, "failed to init config data area: (%u:%u)\n", ndd->nsarea.max_xfer, ndd->nsarea.config_size); return -ENXIO; -- GitLab From 123bcd8f42b7ecc6cb81ed295dbea76840e649e6 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Thu, 20 Mar 2025 14:24:08 +0100 Subject: [PATCH 0097/2211] pidfs: improve multi-threaded exec and premature thread-group leader exit polling [ Upstream commit 0fb482728ba1ee2130eaa461bf551f014447997c ] This is another attempt trying to make pidfd polling for multi-threaded exec and premature thread-group leader exit consistent. A quick recap of these two cases: (1) During a multi-threaded exec by a subthread, i.e., non-thread-group leader thread, all other threads in the thread-group including the thread-group leader are killed and the struct pid of the thread-group leader will be taken over by the subthread that called exec. IOW, two tasks change their TIDs. (2) A premature thread-group leader exit means that the thread-group leader exited before all of the other subthreads in the thread-group have exited. Both cases lead to inconsistencies for pidfd polling with PIDFD_THREAD. Any caller that holds a PIDFD_THREAD pidfd to the current thread-group leader may or may not see an exit notification on the file descriptor depending on when poll is performed. If the poll is performed before the exec of the subthread has concluded an exit notification is generated for the old thread-group leader. If the poll is performed after the exec of the subthread has concluded no exit notification is generated for the old thread-group leader. The correct behavior would be to simply not generate an exit notification on the struct pid of a subhthread exec because the struct pid is taken over by the subthread and thus remains alive. But this is difficult to handle because a thread-group may exit prematurely as mentioned in (2). In that case an exit notification is reliably generated but the subthreads may continue to run for an indeterminate amount of time and thus also may exec at some point. So far there was no way to distinguish between (1) and (2) internally. This tiny series tries to address this problem by discarding PIDFD_THREAD notification on premature thread-group leader exit. If that works correctly then no exit notifications are generated for a PIDFD_THREAD pidfd for a thread-group leader until all subthreads have been reaped. If a subthread should exec aftewards no exit notification will be generated until that task exits or it creates subthreads and repeates the cycle. Co-Developed-by: Oleg Nesterov Signed-off-by: Oleg Nesterov Link: https://lore.kernel.org/r/20250320-work-pidfs-thread_group-v4-1-da678ce805bf@kernel.org Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/pidfs.c | 9 +++++---- kernel/exit.c | 6 +++--- kernel/signal.c | 3 +-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fs/pidfs.c b/fs/pidfs.c index 80675b6bf8845..52b7e4f767327 100644 --- a/fs/pidfs.c +++ b/fs/pidfs.c @@ -95,20 +95,21 @@ static void pidfd_show_fdinfo(struct seq_file *m, struct file *f) static __poll_t pidfd_poll(struct file *file, struct poll_table_struct *pts) { struct pid *pid = pidfd_pid(file); - bool thread = file->f_flags & PIDFD_THREAD; struct task_struct *task; __poll_t poll_flags = 0; poll_wait(file, &pid->wait_pidfd, pts); /* - * Depending on PIDFD_THREAD, inform pollers when the thread - * or the whole thread-group exits. + * Don't wake waiters if the thread-group leader exited + * prematurely. They either get notified when the last subthread + * exits or not at all if one of the remaining subthreads execs + * and assumes the struct pid of the old thread-group leader. */ guard(rcu)(); task = pid_task(pid, PIDTYPE_PID); if (!task) poll_flags = EPOLLIN | EPOLLRDNORM | EPOLLHUP; - else if (task->exit_state && (thread || thread_group_empty(task))) + else if (task->exit_state && !delay_group_leader(task)) poll_flags = EPOLLIN | EPOLLRDNORM; return poll_flags; diff --git a/kernel/exit.c b/kernel/exit.c index 619f0014c33be..56b8bd9487b4b 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -742,10 +742,10 @@ static void exit_notify(struct task_struct *tsk, int group_dead) tsk->exit_state = EXIT_ZOMBIE; /* - * sub-thread or delay_group_leader(), wake up the - * PIDFD_THREAD waiters. + * Ignore thread-group leaders that exited before all + * subthreads did. */ - if (!thread_group_empty(tsk)) + if (!delay_group_leader(tsk)) do_notify_pidfd(tsk); if (unlikely(tsk->ptrace)) { diff --git a/kernel/signal.c b/kernel/signal.c index 2ae45e6eb6bb8..468b589c39e69 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -2063,8 +2063,7 @@ bool do_notify_parent(struct task_struct *tsk, int sig) WARN_ON_ONCE(!tsk->ptrace && (tsk->group_leader != tsk || !thread_group_empty(tsk))); /* - * tsk is a group leader and has no threads, wake up the - * non-PIDFD_THREAD waiters. + * Notify for thread-group leaders without subthreads. */ if (thread_group_empty(tsk)) do_notify_pidfd(tsk); -- GitLab From 4005036642a27463b875f3b03d3b06cf953d0e30 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Sun, 9 Mar 2025 13:50:13 +0100 Subject: [PATCH 0098/2211] staging: vchiq_arm: Create keep-alive thread during probe [ Upstream commit 86bc8821700665ad3962f3ef0d93667f59cf7031 ] Creating the keep-alive thread in vchiq_platform_init_state have the following advantages: - abort driver probe if kthread_create fails (more consistent behavior) - make resource release process easier Since vchiq_keepalive_thread_func is defined below vchiq_platform_init_state, the latter must be moved. Signed-off-by: Stefan Wahren Link: https://lore.kernel.org/r/20250309125014.37166-5-wahrenst@gmx.net Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- .../interface/vchiq_arm/vchiq_arm.c | 69 +++++++++---------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c index 97787002080a1..1a9432646b70a 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c @@ -588,29 +588,6 @@ static int vchiq_platform_init(struct platform_device *pdev, struct vchiq_state return 0; } -int -vchiq_platform_init_state(struct vchiq_state *state) -{ - struct vchiq_arm_state *platform_state; - - platform_state = devm_kzalloc(state->dev, sizeof(*platform_state), GFP_KERNEL); - if (!platform_state) - return -ENOMEM; - - rwlock_init(&platform_state->susp_res_lock); - - init_completion(&platform_state->ka_evt); - atomic_set(&platform_state->ka_use_count, 0); - atomic_set(&platform_state->ka_use_ack_count, 0); - atomic_set(&platform_state->ka_release_count, 0); - - platform_state->state = state; - - state->platform_state = (struct opaque_platform_state *)platform_state; - - return 0; -} - static struct vchiq_arm_state *vchiq_platform_get_arm_state(struct vchiq_state *state) { return (struct vchiq_arm_state *)state->platform_state; @@ -1358,6 +1335,39 @@ exit: return 0; } +int +vchiq_platform_init_state(struct vchiq_state *state) +{ + struct vchiq_arm_state *platform_state; + char threadname[16]; + + platform_state = devm_kzalloc(state->dev, sizeof(*platform_state), GFP_KERNEL); + if (!platform_state) + return -ENOMEM; + + snprintf(threadname, sizeof(threadname), "vchiq-keep/%d", + state->id); + platform_state->ka_thread = kthread_create(&vchiq_keepalive_thread_func, + (void *)state, threadname); + if (IS_ERR(platform_state->ka_thread)) { + dev_err(state->dev, "couldn't create thread %s\n", threadname); + return PTR_ERR(platform_state->ka_thread); + } + + rwlock_init(&platform_state->susp_res_lock); + + init_completion(&platform_state->ka_evt); + atomic_set(&platform_state->ka_use_count, 0); + atomic_set(&platform_state->ka_use_ack_count, 0); + atomic_set(&platform_state->ka_release_count, 0); + + platform_state->state = state; + + state->platform_state = (struct opaque_platform_state *)platform_state; + + return 0; +} + int vchiq_use_internal(struct vchiq_state *state, struct vchiq_service *service, enum USE_TYPE_E use_type) @@ -1678,7 +1688,6 @@ void vchiq_platform_conn_state_changed(struct vchiq_state *state, enum vchiq_connstate newstate) { struct vchiq_arm_state *arm_state = vchiq_platform_get_arm_state(state); - char threadname[16]; dev_dbg(state->dev, "suspend: %d: %s->%s\n", state->id, get_conn_state_name(oldstate), get_conn_state_name(newstate)); @@ -1693,17 +1702,7 @@ void vchiq_platform_conn_state_changed(struct vchiq_state *state, arm_state->first_connect = 1; write_unlock_bh(&arm_state->susp_res_lock); - snprintf(threadname, sizeof(threadname), "vchiq-keep/%d", - state->id); - arm_state->ka_thread = kthread_create(&vchiq_keepalive_thread_func, - (void *)state, - threadname); - if (IS_ERR(arm_state->ka_thread)) { - dev_err(state->dev, "suspend: Couldn't create thread %s\n", - threadname); - } else { - wake_up_process(arm_state->ka_thread); - } + wake_up_process(arm_state->ka_thread); } static const struct of_device_id vchiq_of_match[] = { -- GitLab From 67bb2175095eb1510c0282ae3ebc0079722a8cbc Mon Sep 17 00:00:00 2001 From: Erick Shepherd Date: Fri, 14 Mar 2025 14:50:21 -0500 Subject: [PATCH 0099/2211] mmc: host: Wait for Vdd to settle on card power off [ Upstream commit 31e75ed964582257f59156ce6a42860e1ae4cc39 ] The SD spec version 6.0 section 6.4.1.5 requires that Vdd must be lowered to less than 0.5V for a minimum of 1 ms when powering off a card. Increase wait to 15 ms so that voltage has time to drain down to 0.5V and cards can power off correctly. Issues with voltage drain time were only observed on Apollo Lake and Bay Trail host controllers so this fix is limited to those devices. Signed-off-by: Erick Shepherd Acked-by: Adrian Hunter Link: https://lore.kernel.org/r/20250314195021.1588090-1-erick.shepherd@ni.com Signed-off-by: Ulf Hansson Signed-off-by: Sasha Levin --- drivers/mmc/host/sdhci-pci-core.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c index 2e2e15e2d8fb8..b0b1d403f3527 100644 --- a/drivers/mmc/host/sdhci-pci-core.c +++ b/drivers/mmc/host/sdhci-pci-core.c @@ -609,8 +609,12 @@ static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode, sdhci_set_power(host, mode, vdd); - if (mode == MMC_POWER_OFF) + if (mode == MMC_POWER_OFF) { + if (slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_APL_SD || + slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_BYT_SD) + usleep_range(15000, 17500); return; + } /* * Bus power might not enable after D3 -> D0 transition due to the -- GitLab From dca76ee1f02ae896a3e6d869fa26551b2ef78154 Mon Sep 17 00:00:00 2001 From: Victor Skvortsov Date: Mon, 17 Mar 2025 09:32:13 -0400 Subject: [PATCH 0100/2211] drm/amdgpu: Skip pcie_replay_count sysfs creation for VF [ Upstream commit 9c05636ca72a2dbf41bf0900380f438a0de47319 ] VFs cannot read the NAK_COUNTER register. This information is only available through PMFW metrics. Signed-off-by: Victor Skvortsov Reviewed-by: Lijo Lazar Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 27 ++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index cb102ee71d04c..081c0e45779fc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -170,6 +170,24 @@ static ssize_t amdgpu_device_get_pcie_replay_count(struct device *dev, static DEVICE_ATTR(pcie_replay_count, 0444, amdgpu_device_get_pcie_replay_count, NULL); +static int amdgpu_device_attr_sysfs_init(struct amdgpu_device *adev) +{ + int ret = 0; + + if (!amdgpu_sriov_vf(adev)) + ret = sysfs_create_file(&adev->dev->kobj, + &dev_attr_pcie_replay_count.attr); + + return ret; +} + +static void amdgpu_device_attr_sysfs_fini(struct amdgpu_device *adev) +{ + if (!amdgpu_sriov_vf(adev)) + sysfs_remove_file(&adev->dev->kobj, + &dev_attr_pcie_replay_count.attr); +} + static ssize_t amdgpu_sysfs_reg_state_get(struct file *f, struct kobject *kobj, struct bin_attribute *attr, char *buf, loff_t ppos, size_t count) @@ -4030,11 +4048,6 @@ static bool amdgpu_device_check_iommu_remap(struct amdgpu_device *adev) } #endif -static const struct attribute *amdgpu_dev_attributes[] = { - &dev_attr_pcie_replay_count.attr, - NULL -}; - static void amdgpu_device_set_mcbp(struct amdgpu_device *adev) { if (amdgpu_mcbp == 1) @@ -4477,7 +4490,7 @@ fence_driver_init: } else adev->ucode_sysfs_en = true; - r = sysfs_create_files(&adev->dev->kobj, amdgpu_dev_attributes); + r = amdgpu_device_attr_sysfs_init(adev); if (r) dev_err(adev->dev, "Could not create amdgpu device attr\n"); @@ -4614,7 +4627,7 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev) amdgpu_pm_sysfs_fini(adev); if (adev->ucode_sysfs_en) amdgpu_ucode_sysfs_fini(adev); - sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes); + amdgpu_device_attr_sysfs_fini(adev); amdgpu_fru_sysfs_fini(adev); amdgpu_reg_state_sysfs_fini(adev); -- GitLab From 8f82cf305efd6bf32e9e9d6579e11321dc9c10c5 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 19 Mar 2025 00:13:30 -0700 Subject: [PATCH 0101/2211] cgroup/rstat: avoid disabling irqs for O(num_cpu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 0efc297a3c4974dbd609ee36fc6345720b6ca735 ] cgroup_rstat_flush_locked() grabs the irq safe cgroup_rstat_lock while iterating all possible cpus. It only drops the lock if there is scheduler or spin lock contention. If neither, then interrupts can be disabled for a long time. On large machines this can disable interrupts for a long enough time to drop network packets. On 400+ CPU machines I've seen interrupt disabled for over 40 msec. Prevent rstat from disabling interrupts while processing all possible cpus. Instead drop and reacquire cgroup_rstat_lock for each cpu. This approach was previously discussed in https://lore.kernel.org/lkml/ZBz%2FV5a7%2F6PZeM7S@slm.duckdns.org/, though this was in the context of an non-irq rstat spin lock. Benchmark this change with: 1) a single stat_reader process with 400 threads, each reading a test memcg's memory.stat repeatedly for 10 seconds. 2) 400 memory hog processes running in the test memcg and repeatedly charging memory until oom killed. Then they repeat charging and oom killing. v6.14-rc6 with CONFIG_IRQSOFF_TRACER with stat_reader and hogs, finds interrupts are disabled by rstat for 45341 usec: # => started at: _raw_spin_lock_irq # => ended at: cgroup_rstat_flush # # # _------=> CPU# # / _-----=> irqs-off/BH-disabled # | / _----=> need-resched # || / _---=> hardirq/softirq # ||| / _--=> preempt-depth # |||| / _-=> migrate-disable # ||||| / delay # cmd pid |||||| time | caller # \ / |||||| \ | / stat_rea-96532 52d.... 0us*: _raw_spin_lock_irq stat_rea-96532 52d.... 45342us : cgroup_rstat_flush stat_rea-96532 52d.... 45342us : tracer_hardirqs_on <-cgroup_rstat_flush stat_rea-96532 52d.... 45343us : => memcg1_stat_format => memory_stat_format => memory_stat_show => seq_read_iter => vfs_read => ksys_read => do_syscall_64 => entry_SYSCALL_64_after_hwframe With this patch the CONFIG_IRQSOFF_TRACER doesn't find rstat to be the longest holder. The longest irqs-off holder has irqs disabled for 4142 usec, a huge reduction from previous 45341 usec rstat finding. Running stat_reader memory.stat reader for 10 seconds: - without memory hogs: 9.84M accesses => 12.7M accesses - with memory hogs: 9.46M accesses => 11.1M accesses The throughput of memory.stat access improves. The mode of memory.stat access latency after grouping by of 2 buckets: - without memory hogs: 64 usec => 16 usec - with memory hogs: 64 usec => 8 usec The memory.stat latency improves. Signed-off-by: Eric Dumazet Signed-off-by: Greg Thelen Tested-by: Greg Thelen Acked-by: Michal Koutný Reviewed-by: Yosry Ahmed Signed-off-by: Tejun Heo Signed-off-by: Sasha Levin --- kernel/cgroup/rstat.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c index 3e01781aeb7bd..c4ce2f5a9745f 100644 --- a/kernel/cgroup/rstat.c +++ b/kernel/cgroup/rstat.c @@ -323,13 +323,11 @@ static void cgroup_rstat_flush_locked(struct cgroup *cgrp) rcu_read_unlock(); } - /* play nice and yield if necessary */ - if (need_resched() || spin_needbreak(&cgroup_rstat_lock)) { - __cgroup_rstat_unlock(cgrp, cpu); - if (!cond_resched()) - cpu_relax(); - __cgroup_rstat_lock(cgrp, cpu); - } + /* play nice and avoid disabling interrupts for a long time */ + __cgroup_rstat_unlock(cgrp, cpu); + if (!cond_resched()) + cpu_relax(); + __cgroup_rstat_lock(cgrp, cpu); } } -- GitLab From fa6c05122fb82a9dd5d24a5f7c0e70ee31f872d5 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 11 Mar 2025 11:36:43 +0100 Subject: [PATCH 0102/2211] wifi: mt76: only mark tx-status-failed frames as ACKed on mt76x0/2 [ Upstream commit 0c5a89ceddc1728a40cb3313948401dd70e3c649 ] The interrupt status polling is unreliable, which can cause status events to get lost. On all newer chips, txs-timeout is an indication that the packet was either never sent, or never acked. Fixes issues with inactivity polling. Link: https://patch.msgid.link/20250311103646.43346-6-nbd@nbd.name Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + drivers/net/wireless/mediatek/mt76/mt76x0/pci.c | 3 ++- drivers/net/wireless/mediatek/mt76/mt76x0/usb.c | 3 ++- drivers/net/wireless/mediatek/mt76/mt76x2/pci.c | 3 ++- drivers/net/wireless/mediatek/mt76/mt76x2/usb.c | 3 ++- drivers/net/wireless/mediatek/mt76/tx.c | 3 ++- 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h index e2e9b5ece74e2..a6ac8e5512eba 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76.h +++ b/drivers/net/wireless/mediatek/mt76/mt76.h @@ -489,6 +489,7 @@ struct mt76_hw_cap { #define MT_DRV_RX_DMA_HDR BIT(3) #define MT_DRV_HW_MGMT_TXQ BIT(4) #define MT_DRV_AMSDU_OFFLOAD BIT(5) +#define MT_DRV_IGNORE_TXS_FAILED BIT(6) struct mt76_driver_ops { u32 drv_flags; diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c index 1eb955f3ca130..911e162a45980 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c +++ b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c @@ -156,7 +156,8 @@ mt76x0e_probe(struct pci_dev *pdev, const struct pci_device_id *id) static const struct mt76_driver_ops drv_ops = { .txwi_size = sizeof(struct mt76x02_txwi), .drv_flags = MT_DRV_TX_ALIGNED4_SKBS | - MT_DRV_SW_RX_AIRTIME, + MT_DRV_SW_RX_AIRTIME | + MT_DRV_IGNORE_TXS_FAILED, .survey_flags = SURVEY_INFO_TIME_TX, .update_survey = mt76x02_update_channel, .set_channel = mt76x0_set_channel, diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c b/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c index b031c500b7415..90e5666c0857d 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c +++ b/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c @@ -214,7 +214,8 @@ static int mt76x0u_probe(struct usb_interface *usb_intf, const struct usb_device_id *id) { static const struct mt76_driver_ops drv_ops = { - .drv_flags = MT_DRV_SW_RX_AIRTIME, + .drv_flags = MT_DRV_SW_RX_AIRTIME | + MT_DRV_IGNORE_TXS_FAILED, .survey_flags = SURVEY_INFO_TIME_TX, .update_survey = mt76x02_update_channel, .set_channel = mt76x0_set_channel, diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c b/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c index 67c9d1caa0bd6..55f076231bdc5 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c +++ b/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c @@ -22,7 +22,8 @@ mt76x2e_probe(struct pci_dev *pdev, const struct pci_device_id *id) static const struct mt76_driver_ops drv_ops = { .txwi_size = sizeof(struct mt76x02_txwi), .drv_flags = MT_DRV_TX_ALIGNED4_SKBS | - MT_DRV_SW_RX_AIRTIME, + MT_DRV_SW_RX_AIRTIME | + MT_DRV_IGNORE_TXS_FAILED, .survey_flags = SURVEY_INFO_TIME_TX, .update_survey = mt76x02_update_channel, .set_channel = mt76x2e_set_channel, diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c b/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c index a4f4d12f904e7..84ef80ab4afbf 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c +++ b/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c @@ -30,7 +30,8 @@ static int mt76x2u_probe(struct usb_interface *intf, const struct usb_device_id *id) { static const struct mt76_driver_ops drv_ops = { - .drv_flags = MT_DRV_SW_RX_AIRTIME, + .drv_flags = MT_DRV_SW_RX_AIRTIME | + MT_DRV_IGNORE_TXS_FAILED, .survey_flags = SURVEY_INFO_TIME_TX, .update_survey = mt76x02_update_channel, .set_channel = mt76x2u_set_channel, diff --git a/drivers/net/wireless/mediatek/mt76/tx.c b/drivers/net/wireless/mediatek/mt76/tx.c index ce193e625666b..065a1e4537457 100644 --- a/drivers/net/wireless/mediatek/mt76/tx.c +++ b/drivers/net/wireless/mediatek/mt76/tx.c @@ -100,7 +100,8 @@ __mt76_tx_status_skb_done(struct mt76_dev *dev, struct sk_buff *skb, u8 flags, return; /* Tx status can be unreliable. if it fails, mark the frame as ACKed */ - if (flags & MT_TX_CB_TXS_FAILED) { + if (flags & MT_TX_CB_TXS_FAILED && + (dev->drv->drv_flags & MT_DRV_IGNORE_TXS_FAILED)) { info->status.rates[0].count = 0; info->status.rates[0].idx = -1; info->flags |= IEEE80211_TX_STAT_ACK; -- GitLab From 1d58321192052a66a8dddfbd3d829ea52a9fb094 Mon Sep 17 00:00:00 2001 From: Rex Lu Date: Tue, 11 Mar 2025 11:36:39 +0100 Subject: [PATCH 0103/2211] wifi: mt76: mt7996: fix SER reset trigger on WED reset [ Upstream commit 8d38abdf6c182225c5c0a81451fa51b7b36a635d ] The firmware needs a specific trigger when WED is being reset due to an ethernet reset condition. This helps prevent further L1 SER failure. Signed-off-by: Rex Lu Link: https://patch.msgid.link/20250311103646.43346-2-nbd@nbd.name Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt7996/mcu.h | 3 ++- drivers/net/wireless/mediatek/mt76/mt7996/mmio.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.h index 43468bcaffc6d..a75e1c9435bb0 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.h +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.h @@ -908,7 +908,8 @@ enum { UNI_CMD_SER_SET_RECOVER_L3_TX_DISABLE, UNI_CMD_SER_SET_RECOVER_L3_BF, UNI_CMD_SER_SET_RECOVER_L4_MDP, - UNI_CMD_SER_SET_RECOVER_FULL, + UNI_CMD_SER_SET_RECOVER_FROM_ETH, + UNI_CMD_SER_SET_RECOVER_FULL = 8, UNI_CMD_SER_SET_SYSTEM_ASSERT, /* action */ UNI_CMD_SER_ENABLE = 1, diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mmio.c b/drivers/net/wireless/mediatek/mt76/mt7996/mmio.c index 442f72450352b..b6209ed1cfe01 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mmio.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mmio.c @@ -281,7 +281,7 @@ static int mt7996_mmio_wed_reset(struct mtk_wed_device *wed) if (test_and_set_bit(MT76_STATE_WED_RESET, &mphy->state)) return -EBUSY; - ret = mt7996_mcu_set_ser(dev, UNI_CMD_SER_TRIGGER, UNI_CMD_SER_SET_RECOVER_L1, + ret = mt7996_mcu_set_ser(dev, UNI_CMD_SER_TRIGGER, UNI_CMD_SER_SET_RECOVER_FROM_ETH, mphy->band_idx); if (ret) goto out; -- GitLab From c9c64da88e38df74d04cd148a04949a796c4fe9f Mon Sep 17 00:00:00 2001 From: Benjamin Lin Date: Tue, 11 Mar 2025 11:36:38 +0100 Subject: [PATCH 0104/2211] wifi: mt76: mt7996: revise TXS size [ Upstream commit 593c829b4326f7b3b15a69e97c9044ecbad3c319 ] Size of MPDU/PPDU TXS is 12 DWs. In mt7996/mt7992, last 4 DWs are reserved, so TXS size was mistakenly considered to be 8 DWs. However, in mt7990, 9th DW of TXS starts to be used. Signed-off-by: Benjamin Lin Link: https://patch.msgid.link/20250311103646.43346-1-nbd@nbd.name Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.h | 3 +++ drivers/net/wireless/mediatek/mt76/mt7996/mac.c | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.h index db0c29e65185c..487ad716f872a 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.h +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.h @@ -314,6 +314,9 @@ enum tx_frag_idx { #define MT_TXFREE_INFO_COUNT GENMASK(27, 24) #define MT_TXFREE_INFO_STAT GENMASK(29, 28) +#define MT_TXS_HDR_SIZE 4 /* Unit: DW */ +#define MT_TXS_SIZE 12 /* Unit: DW */ + #define MT_TXS0_BW GENMASK(31, 29) #define MT_TXS0_TID GENMASK(28, 26) #define MT_TXS0_AMPDU BIT(25) diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c index f590902fdeea3..ef2d7eaaaffdd 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c @@ -1399,7 +1399,7 @@ bool mt7996_rx_check(struct mt76_dev *mdev, void *data, int len) mt7996_mac_tx_free(dev, data, len); return false; case PKT_TYPE_TXS: - for (rxd += 4; rxd + 8 <= end; rxd += 8) + for (rxd += MT_TXS_HDR_SIZE; rxd + MT_TXS_SIZE <= end; rxd += MT_TXS_SIZE) mt7996_mac_add_txs(dev, rxd); return false; case PKT_TYPE_RX_FW_MONITOR: @@ -1442,7 +1442,7 @@ void mt7996_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, mt7996_mcu_rx_event(dev, skb); break; case PKT_TYPE_TXS: - for (rxd += 4; rxd + 8 <= end; rxd += 8) + for (rxd += MT_TXS_HDR_SIZE; rxd + MT_TXS_SIZE <= end; rxd += MT_TXS_SIZE) mt7996_mac_add_txs(dev, rxd); dev_kfree_skb(skb); break; -- GitLab From 8b526e4d944ae8ad95d48e39cb6a53b2201bd6e9 Mon Sep 17 00:00:00 2001 From: Ming Yen Hsieh Date: Tue, 4 Mar 2025 19:36:44 +0800 Subject: [PATCH 0105/2211] wifi: mt76: mt7925: load the appropriate CLC data based on hardware type [ Upstream commit f2027ef3f733d3f0bb7f27fa3343784058f946ab ] Read the EEPROM to determine the hardware type and uses this to load the correct CLC data. Signed-off-by: Ming Yen Hsieh Link: https://patch.msgid.link/20250304113649.867387-1-mingyen.hsieh@mediatek.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- .../net/wireless/mediatek/mt76/mt7925/mcu.c | 61 ++++++++++++++++++- .../wireless/mediatek/mt76/mt7925/mt7925.h | 3 + 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c index 8476f9caa98db..5b14bf434df36 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c @@ -616,6 +616,54 @@ int mt7925_mcu_uni_rx_ba(struct mt792x_dev *dev, return ret; } +static int mt7925_mcu_read_eeprom(struct mt792x_dev *dev, u32 offset, u8 *val) +{ + struct { + u8 rsv[4]; + + __le16 tag; + __le16 len; + + __le32 addr; + __le32 valid; + u8 data[MT7925_EEPROM_BLOCK_SIZE]; + } __packed req = { + .tag = cpu_to_le16(1), + .len = cpu_to_le16(sizeof(req) - 4), + .addr = cpu_to_le32(round_down(offset, + MT7925_EEPROM_BLOCK_SIZE)), + }; + struct evt { + u8 rsv[4]; + + __le16 tag; + __le16 len; + + __le32 ver; + __le32 addr; + __le32 valid; + __le32 size; + __le32 magic_num; + __le32 type; + __le32 rsv1[4]; + u8 data[32]; + } __packed *res; + struct sk_buff *skb; + int ret; + + ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_WM_UNI_CMD_QUERY(EFUSE_CTRL), + &req, sizeof(req), true, &skb); + if (ret) + return ret; + + res = (struct evt *)skb->data; + *val = res->data[offset % MT7925_EEPROM_BLOCK_SIZE]; + + dev_kfree_skb(skb); + + return 0; +} + static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name) { const struct mt76_connac2_fw_trailer *hdr; @@ -624,13 +672,20 @@ static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name) struct mt76_dev *mdev = &dev->mt76; struct mt792x_phy *phy = &dev->phy; const struct firmware *fw; + u8 *clc_base = NULL, hw_encap = 0; int ret, i, len, offset = 0; - u8 *clc_base = NULL; if (mt7925_disable_clc || mt76_is_usb(&dev->mt76)) return 0; + if (mt76_is_mmio(&dev->mt76)) { + ret = mt7925_mcu_read_eeprom(dev, MT_EE_HW_TYPE, &hw_encap); + if (ret) + return ret; + hw_encap = u8_get_bits(hw_encap, MT_EE_HW_TYPE_ENCAP); + } + ret = request_firmware(&fw, fw_name, mdev->dev); if (ret) return ret; @@ -675,6 +730,10 @@ static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name) if (phy->clc[clc->idx]) continue; + /* header content sanity */ + if (u8_get_bits(clc->type, MT_EE_HW_TYPE_ENCAP) != hw_encap) + continue; + phy->clc[clc->idx] = devm_kmemdup(mdev->dev, clc, le32_to_cpu(clc->len), GFP_KERNEL); diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h b/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h index df3c705d1cb3f..4ad779329b8f0 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h @@ -147,9 +147,12 @@ enum mt7925_eeprom_field { MT_EE_CHIP_ID = 0x000, MT_EE_VERSION = 0x002, MT_EE_MAC_ADDR = 0x004, + MT_EE_HW_TYPE = 0xa71, __MT_EE_MAX = 0x9ff }; +#define MT_EE_HW_TYPE_ENCAP GENMASK(1, 0) + enum { TXPWR_USER, TXPWR_EEPROM, -- GitLab From ac3af695c4b001b0dfdb311f2b4cfb81b1d3d54c Mon Sep 17 00:00:00 2001 From: Quan Zhou Date: Tue, 14 Jan 2025 13:06:22 +0800 Subject: [PATCH 0106/2211] wifi: mt76: mt7925: fix fails to enter low power mode in suspend state [ Upstream commit 2d5630b0c9466ac6549495828aa7dce7424a272a ] The mt7925 sometimes fails to enter low power mode during suspend. This is caused by the chip firmware sending an additional ACK event to the host after processing the suspend command. Due to timing issues, this event may not reach the host, causing the chip to get stuck. To resolve this, the ACK flag in the suspend command is removed, as it is not needed in the MT7925 architecture. This prevents the firmware from sending the additional ACK event, ensuring the device can reliably enter low power mode during suspend. Signed-off-by: Quan Zhou Link: https://patch.msgid.link/d056938144a3a0336c3a4e3cec6f271899f32bf7.1736775666.git.quan.zhou@mediatek.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c index 5b14bf434df36..2396e1795fe17 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c @@ -3287,6 +3287,9 @@ int mt7925_mcu_fill_message(struct mt76_dev *mdev, struct sk_buff *skb, else uni_txd->option = MCU_CMD_UNI_EXT_ACK; + if (cmd == MCU_UNI_CMD(HIF_CTRL)) + uni_txd->option &= ~MCU_CMD_ACK; + goto exit; } -- GitLab From 63b7dade892b605af3df7be0ce195b6f4bc5fbe7 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Mon, 10 Mar 2025 11:42:56 +0100 Subject: [PATCH 0107/2211] x86/headers: Replace __ASSEMBLY__ with __ASSEMBLER__ in UAPI headers [ Upstream commit 8a141be3233af7d4f7014ebc44d5452d46b2b1be ] __ASSEMBLY__ is only defined by the Makefile of the kernel, so this is not really useful for UAPI headers (unless the userspace Makefile defines it, too). Let's switch to __ASSEMBLER__ which gets set automatically by the compiler when compiling assembly code. Signed-off-by: Thomas Huth Signed-off-by: Ingo Molnar Cc: "H. Peter Anvin" Cc: Linus Torvalds Cc: Kees Cook Cc: Brian Gerst Link: https://lore.kernel.org/r/20250310104256.123527-1-thuth@redhat.com Signed-off-by: Sasha Levin --- arch/x86/include/uapi/asm/bootparam.h | 4 ++-- arch/x86/include/uapi/asm/e820.h | 4 ++-- arch/x86/include/uapi/asm/ldt.h | 4 ++-- arch/x86/include/uapi/asm/msr.h | 4 ++-- arch/x86/include/uapi/asm/ptrace-abi.h | 6 +++--- arch/x86/include/uapi/asm/ptrace.h | 4 ++-- arch/x86/include/uapi/asm/setup_data.h | 4 ++-- arch/x86/include/uapi/asm/signal.h | 8 ++++---- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/arch/x86/include/uapi/asm/bootparam.h b/arch/x86/include/uapi/asm/bootparam.h index 9b82eebd7add5..dafbf581c515d 100644 --- a/arch/x86/include/uapi/asm/bootparam.h +++ b/arch/x86/include/uapi/asm/bootparam.h @@ -26,7 +26,7 @@ #define XLF_5LEVEL_ENABLED (1<<6) #define XLF_MEM_ENCRYPTION (1<<7) -#ifndef __ASSEMBLY__ +#ifndef __ASSEMBLER__ #include #include @@ -210,6 +210,6 @@ enum x86_hardware_subarch { X86_NR_SUBARCHS, }; -#endif /* __ASSEMBLY__ */ +#endif /* __ASSEMBLER__ */ #endif /* _ASM_X86_BOOTPARAM_H */ diff --git a/arch/x86/include/uapi/asm/e820.h b/arch/x86/include/uapi/asm/e820.h index 2f491efe3a126..55bc668671560 100644 --- a/arch/x86/include/uapi/asm/e820.h +++ b/arch/x86/include/uapi/asm/e820.h @@ -54,7 +54,7 @@ */ #define E820_RESERVED_KERN 128 -#ifndef __ASSEMBLY__ +#ifndef __ASSEMBLER__ #include struct e820entry { __u64 addr; /* start of memory segment */ @@ -76,7 +76,7 @@ struct e820map { #define BIOS_ROM_BASE 0xffe00000 #define BIOS_ROM_END 0xffffffff -#endif /* __ASSEMBLY__ */ +#endif /* __ASSEMBLER__ */ #endif /* _UAPI_ASM_X86_E820_H */ diff --git a/arch/x86/include/uapi/asm/ldt.h b/arch/x86/include/uapi/asm/ldt.h index d62ac5db093b4..a82c039d8e6a7 100644 --- a/arch/x86/include/uapi/asm/ldt.h +++ b/arch/x86/include/uapi/asm/ldt.h @@ -12,7 +12,7 @@ /* The size of each LDT entry. */ #define LDT_ENTRY_SIZE 8 -#ifndef __ASSEMBLY__ +#ifndef __ASSEMBLER__ /* * Note on 64bit base and limit is ignored and you cannot set DS/ES/CS * not to the default values if you still want to do syscalls. This @@ -44,5 +44,5 @@ struct user_desc { #define MODIFY_LDT_CONTENTS_STACK 1 #define MODIFY_LDT_CONTENTS_CODE 2 -#endif /* !__ASSEMBLY__ */ +#endif /* !__ASSEMBLER__ */ #endif /* _ASM_X86_LDT_H */ diff --git a/arch/x86/include/uapi/asm/msr.h b/arch/x86/include/uapi/asm/msr.h index e7516b402a00f..4b8917ca28fe7 100644 --- a/arch/x86/include/uapi/asm/msr.h +++ b/arch/x86/include/uapi/asm/msr.h @@ -2,7 +2,7 @@ #ifndef _UAPI_ASM_X86_MSR_H #define _UAPI_ASM_X86_MSR_H -#ifndef __ASSEMBLY__ +#ifndef __ASSEMBLER__ #include #include @@ -10,5 +10,5 @@ #define X86_IOC_RDMSR_REGS _IOWR('c', 0xA0, __u32[8]) #define X86_IOC_WRMSR_REGS _IOWR('c', 0xA1, __u32[8]) -#endif /* __ASSEMBLY__ */ +#endif /* __ASSEMBLER__ */ #endif /* _UAPI_ASM_X86_MSR_H */ diff --git a/arch/x86/include/uapi/asm/ptrace-abi.h b/arch/x86/include/uapi/asm/ptrace-abi.h index 16074b9c93bb5..5823584dea132 100644 --- a/arch/x86/include/uapi/asm/ptrace-abi.h +++ b/arch/x86/include/uapi/asm/ptrace-abi.h @@ -25,7 +25,7 @@ #else /* __i386__ */ -#if defined(__ASSEMBLY__) || defined(__FRAME_OFFSETS) +#if defined(__ASSEMBLER__) || defined(__FRAME_OFFSETS) /* * C ABI says these regs are callee-preserved. They aren't saved on kernel entry * unless syscall needs a complete, fully filled "struct pt_regs". @@ -57,7 +57,7 @@ #define EFLAGS 144 #define RSP 152 #define SS 160 -#endif /* __ASSEMBLY__ */ +#endif /* __ASSEMBLER__ */ /* top of stack page */ #define FRAME_SIZE 168 @@ -87,7 +87,7 @@ #define PTRACE_SINGLEBLOCK 33 /* resume execution until next branch */ -#ifndef __ASSEMBLY__ +#ifndef __ASSEMBLER__ #include #endif diff --git a/arch/x86/include/uapi/asm/ptrace.h b/arch/x86/include/uapi/asm/ptrace.h index 85165c0edafc8..e0b5b4f6226b1 100644 --- a/arch/x86/include/uapi/asm/ptrace.h +++ b/arch/x86/include/uapi/asm/ptrace.h @@ -7,7 +7,7 @@ #include -#ifndef __ASSEMBLY__ +#ifndef __ASSEMBLER__ #ifdef __i386__ /* this struct defines the way the registers are stored on the @@ -81,6 +81,6 @@ struct pt_regs { -#endif /* !__ASSEMBLY__ */ +#endif /* !__ASSEMBLER__ */ #endif /* _UAPI_ASM_X86_PTRACE_H */ diff --git a/arch/x86/include/uapi/asm/setup_data.h b/arch/x86/include/uapi/asm/setup_data.h index b111b0c185449..50c45ead4e7c9 100644 --- a/arch/x86/include/uapi/asm/setup_data.h +++ b/arch/x86/include/uapi/asm/setup_data.h @@ -18,7 +18,7 @@ #define SETUP_INDIRECT (1<<31) #define SETUP_TYPE_MAX (SETUP_ENUM_MAX | SETUP_INDIRECT) -#ifndef __ASSEMBLY__ +#ifndef __ASSEMBLER__ #include @@ -78,6 +78,6 @@ struct ima_setup_data { __u64 size; } __attribute__((packed)); -#endif /* __ASSEMBLY__ */ +#endif /* __ASSEMBLER__ */ #endif /* _UAPI_ASM_X86_SETUP_DATA_H */ diff --git a/arch/x86/include/uapi/asm/signal.h b/arch/x86/include/uapi/asm/signal.h index f777346450ec3..1067efabf18b5 100644 --- a/arch/x86/include/uapi/asm/signal.h +++ b/arch/x86/include/uapi/asm/signal.h @@ -2,7 +2,7 @@ #ifndef _UAPI_ASM_X86_SIGNAL_H #define _UAPI_ASM_X86_SIGNAL_H -#ifndef __ASSEMBLY__ +#ifndef __ASSEMBLER__ #include #include @@ -16,7 +16,7 @@ struct siginfo; typedef unsigned long sigset_t; #endif /* __KERNEL__ */ -#endif /* __ASSEMBLY__ */ +#endif /* __ASSEMBLER__ */ #define SIGHUP 1 @@ -68,7 +68,7 @@ typedef unsigned long sigset_t; #include -#ifndef __ASSEMBLY__ +#ifndef __ASSEMBLER__ # ifndef __KERNEL__ @@ -106,6 +106,6 @@ typedef struct sigaltstack { __kernel_size_t ss_size; } stack_t; -#endif /* __ASSEMBLY__ */ +#endif /* __ASSEMBLER__ */ #endif /* _UAPI_ASM_X86_SIGNAL_H */ -- GitLab From 44e041675383b198e4050177df372361a872147b Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Wed, 12 Mar 2025 12:48:49 +0100 Subject: [PATCH 0108/2211] x86/stackprotector/64: Only export __ref_stack_chk_guard on CONFIG_SMP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 91d5451d97ce35cbd510277fa3b7abf9caa4e34d ] The __ref_stack_chk_guard symbol doesn't exist on UP: :4:15: error: ‘__ref_stack_chk_guard’ undeclared here (not in a function) Fix the #ifdef around the entry.S export. Signed-off-by: Ingo Molnar Cc: Brian Gerst Cc: Ard Biesheuvel Cc: Uros Bizjak Link: https://lore.kernel.org/r/20250123190747.745588-8-brgerst@gmail.com Signed-off-by: Sasha Levin --- arch/x86/entry/entry.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/entry/entry.S b/arch/x86/entry/entry.S index 58e3124ee2b42..5b96249734ada 100644 --- a/arch/x86/entry/entry.S +++ b/arch/x86/entry/entry.S @@ -63,7 +63,7 @@ THUNK warn_thunk_thunk, __warn_thunk * entirely in the C code, and use an alias emitted by the linker script * instead. */ -#ifdef CONFIG_STACKPROTECTOR +#if defined(CONFIG_STACKPROTECTOR) && defined(CONFIG_SMP) EXPORT_SYMBOL(__ref_stack_chk_guard); #endif #endif -- GitLab From 8973fb71c9269f54f4ea4b218c8466b5adea8a97 Mon Sep 17 00:00:00 2001 From: Sohil Mehta Date: Wed, 19 Feb 2025 18:41:28 +0000 Subject: [PATCH 0109/2211] x86/smpboot: Fix INIT delay assignment for extended Intel Families [ Upstream commit 7a2ad752746bfb13e89a83984ecc52a48bae4969 ] Some old crusty CPUs need an extra delay that slows down booting. See the comment above 'init_udelay' for details. Newer CPUs don't need the delay. Right now, for Intel, Family 6 and only Family 6 skips the delay. That leaves out both the Family 15 (Pentium 4s) and brand new Family 18/19 models. The omission of Family 15 (Pentium 4s) seems like an oversight and 18/19 do not need the delay. Skip the delay on all Intel processors Family 6 and beyond. Signed-off-by: Sohil Mehta Signed-off-by: Ingo Molnar Link: https://lore.kernel.org/r/20250219184133.816753-11-sohil.mehta@intel.com Signed-off-by: Sasha Levin --- arch/x86/kernel/smpboot.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index f1fac08fdef28..2c451de702c87 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c @@ -681,9 +681,9 @@ static void __init smp_quirk_init_udelay(void) return; /* if modern processor, use no delay */ - if (((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && (boot_cpu_data.x86 == 6)) || - ((boot_cpu_data.x86_vendor == X86_VENDOR_HYGON) && (boot_cpu_data.x86 >= 0x18)) || - ((boot_cpu_data.x86_vendor == X86_VENDOR_AMD) && (boot_cpu_data.x86 >= 0xF))) { + if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && boot_cpu_data.x86_vfm >= INTEL_PENTIUM_PRO) || + (boot_cpu_data.x86_vendor == X86_VENDOR_HYGON && boot_cpu_data.x86 >= 0x18) || + (boot_cpu_data.x86_vendor == X86_VENDOR_AMD && boot_cpu_data.x86 >= 0xF)) { init_udelay = 0; return; } -- GitLab From d0f987525744098061e6093dbc266b841b5cf1bb Mon Sep 17 00:00:00 2001 From: Sohil Mehta Date: Wed, 19 Feb 2025 18:41:21 +0000 Subject: [PATCH 0110/2211] x86/microcode: Update the Intel processor flag scan check [ Upstream commit 7e6b0a2e4152f4046af95eeb46f8b4f9b2a7398d ] The Family model check to read the processor flag MSR is misleading and potentially incorrect. It doesn't consider Family while comparing the model number. The original check did have a Family number but it got lost/moved during refactoring. intel_collect_cpu_info() is called through multiple paths such as early initialization, CPU hotplug as well as IFS image load. Some of these flows would be error prone due to the ambiguous check. Correct the processor flag scan check to use a Family number and update it to a VFM based one to make it more readable. Signed-off-by: Sohil Mehta Signed-off-by: Ingo Molnar Acked-by: Dave Hansen Link: https://lore.kernel.org/r/20250219184133.816753-4-sohil.mehta@intel.com Signed-off-by: Sasha Levin --- arch/x86/include/asm/intel-family.h | 1 + arch/x86/kernel/cpu/microcode/intel.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/intel-family.h b/arch/x86/include/asm/intel-family.h index 62d8b9448dc5c..c6198fbcc1d77 100644 --- a/arch/x86/include/asm/intel-family.h +++ b/arch/x86/include/asm/intel-family.h @@ -46,6 +46,7 @@ #define INTEL_ANY IFM(X86_FAMILY_ANY, X86_MODEL_ANY) #define INTEL_PENTIUM_PRO IFM(6, 0x01) +#define INTEL_PENTIUM_III_DESCHUTES IFM(6, 0x05) #define INTEL_CORE_YONAH IFM(6, 0x0E) diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c index df5650eb3f088..362cc71bbc866 100644 --- a/arch/x86/kernel/cpu/microcode/intel.c +++ b/arch/x86/kernel/cpu/microcode/intel.c @@ -74,7 +74,7 @@ void intel_collect_cpu_info(struct cpu_signature *sig) sig->pf = 0; sig->rev = intel_get_microcode_revision(); - if (x86_model(sig->sig) >= 5 || x86_family(sig->sig) > 6) { + if (IFM(x86_family(sig->sig), x86_model(sig->sig)) >= INTEL_PENTIUM_III_DESCHUTES) { unsigned int val[2]; /* get processor flags from MSR 0x17 */ -- GitLab From c6f2694c580c27dca0cf7546ee9b4bfa6b940e38 Mon Sep 17 00:00:00 2001 From: Philip Redkin Date: Fri, 15 Nov 2024 20:36:59 +0300 Subject: [PATCH 0111/2211] x86/mm: Check return value from memblock_phys_alloc_range() [ Upstream commit 631ca8909fd5c62b9fda9edda93924311a78a9c4 ] At least with CONFIG_PHYSICAL_START=0x100000, if there is < 4 MiB of contiguous free memory available at this point, the kernel will crash and burn because memblock_phys_alloc_range() returns 0 on failure, which leads memblock_phys_free() to throw the first 4 MiB of physical memory to the wolves. At a minimum it should fail gracefully with a meaningful diagnostic, but in fact everything seems to work fine without the weird reserve allocation. Signed-off-by: Philip Redkin Signed-off-by: Ingo Molnar Cc: Dave Hansen Cc: Rik van Riel Cc: "H. Peter Anvin" Link: https://lore.kernel.org/r/94b3e98f-96a7-3560-1f76-349eb95ccf7f@rarity.fan Signed-off-by: Sasha Levin --- arch/x86/mm/init.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index 101725c149c42..9cbc1e6057d3c 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c @@ -645,8 +645,13 @@ static void __init memory_map_top_down(unsigned long map_start, */ addr = memblock_phys_alloc_range(PMD_SIZE, PMD_SIZE, map_start, map_end); - memblock_phys_free(addr, PMD_SIZE); - real_end = addr + PMD_SIZE; + if (!addr) { + pr_warn("Failed to release memory for alloc_low_pages()"); + real_end = max(map_start, ALIGN_DOWN(map_end, PMD_SIZE)); + } else { + memblock_phys_free(addr, PMD_SIZE); + real_end = addr + PMD_SIZE; + } /* step_size need to be small so pgt_buf from BRK could cover it */ step_size = PMD_SIZE; -- GitLab From 3b9cf1c0fafa2cb0ca40ffd9786e1c83175bbef9 Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Tue, 28 Nov 2023 10:48:37 +0100 Subject: [PATCH 0112/2211] i2c: qup: Vote for interconnect bandwidth to DRAM [ Upstream commit d4f35233a6345f62637463ef6e0708f44ffaa583 ] When the I2C QUP controller is used together with a DMA engine it needs to vote for the interconnect path to the DRAM. Otherwise it may be unable to access the memory quickly enough. The requested peak bandwidth is dependent on the I2C core clock. To avoid sending votes too often the bandwidth is always requested when a DMA transfer starts, but dropped only on runtime suspend. Runtime suspend should only happen if no transfer is active. After resumption we can defer the next vote until the first DMA transfer actually happens. The implementation is largely identical to the one introduced for spi-qup in commit ecdaa9473019 ("spi: qup: Vote for interconnect bandwidth to DRAM") since both drivers represent the same hardware block. Signed-off-by: Stephan Gerhold Signed-off-by: Andi Shyti Link: https://lore.kernel.org/r/20231128-i2c-qup-dvfs-v1-3-59a0e3039111@kernkonzept.com Signed-off-by: Sasha Levin --- drivers/i2c/busses/i2c-qup.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/drivers/i2c/busses/i2c-qup.c b/drivers/i2c/busses/i2c-qup.c index d480162a4d394..eb97abcb4cd33 100644 --- a/drivers/i2c/busses/i2c-qup.c +++ b/drivers/i2c/busses/i2c-qup.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -150,6 +151,8 @@ /* TAG length for DATA READ in RX FIFO */ #define READ_RX_TAGS_LEN 2 +#define QUP_BUS_WIDTH 8 + static unsigned int scl_freq; module_param_named(scl_freq, scl_freq, uint, 0444); MODULE_PARM_DESC(scl_freq, "SCL frequency override"); @@ -227,6 +230,7 @@ struct qup_i2c_dev { int irq; struct clk *clk; struct clk *pclk; + struct icc_path *icc_path; struct i2c_adapter adap; int clk_ctl; @@ -255,6 +259,10 @@ struct qup_i2c_dev { /* To configure when bus is in run state */ u32 config_run; + /* bandwidth votes */ + u32 src_clk_freq; + u32 cur_bw_clk_freq; + /* dma parameters */ bool is_dma; /* To check if the current transfer is using DMA */ @@ -453,6 +461,23 @@ static int qup_i2c_bus_active(struct qup_i2c_dev *qup, int len) return ret; } +static int qup_i2c_vote_bw(struct qup_i2c_dev *qup, u32 clk_freq) +{ + u32 needed_peak_bw; + int ret; + + if (qup->cur_bw_clk_freq == clk_freq) + return 0; + + needed_peak_bw = Bps_to_icc(clk_freq * QUP_BUS_WIDTH); + ret = icc_set_bw(qup->icc_path, 0, needed_peak_bw); + if (ret) + return ret; + + qup->cur_bw_clk_freq = clk_freq; + return 0; +} + static void qup_i2c_write_tx_fifo_v1(struct qup_i2c_dev *qup) { struct qup_i2c_block *blk = &qup->blk; @@ -838,6 +863,10 @@ static int qup_i2c_bam_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, int ret = 0; int idx = 0; + ret = qup_i2c_vote_bw(qup, qup->src_clk_freq); + if (ret) + return ret; + enable_irq(qup->irq); ret = qup_i2c_req_dma(qup); @@ -1643,6 +1672,7 @@ static void qup_i2c_disable_clocks(struct qup_i2c_dev *qup) config = readl(qup->base + QUP_CONFIG); config |= QUP_CLOCK_AUTO_GATE; writel(config, qup->base + QUP_CONFIG); + qup_i2c_vote_bw(qup, 0); clk_disable_unprepare(qup->pclk); } @@ -1743,6 +1773,11 @@ static int qup_i2c_probe(struct platform_device *pdev) goto fail_dma; } qup->is_dma = true; + + qup->icc_path = devm_of_icc_get(&pdev->dev, NULL); + if (IS_ERR(qup->icc_path)) + return dev_err_probe(&pdev->dev, PTR_ERR(qup->icc_path), + "failed to get interconnect path\n"); } nodma: @@ -1791,6 +1826,7 @@ nodma: qup_i2c_enable_clocks(qup); src_clk_freq = clk_get_rate(qup->clk); } + qup->src_clk_freq = src_clk_freq; /* * Bootloaders might leave a pending interrupt on certain QUP's, -- GitLab From 477a412a2f6cc411a40d79293448a9345689e6a0 Mon Sep 17 00:00:00 2001 From: Vitalii Mordan Date: Wed, 12 Feb 2025 20:28:03 +0300 Subject: [PATCH 0113/2211] i2c: pxa: fix call balance of i2c->clk handling routines [ Upstream commit be7113d2e2a6f20cbee99c98d261a1fd6fd7b549 ] If the clock i2c->clk was not enabled in i2c_pxa_probe(), it should not be disabled in any path. Found by Linux Verification Center (linuxtesting.org) with Klever. Signed-off-by: Vitalii Mordan Signed-off-by: Andi Shyti Link: https://lore.kernel.org/r/20250212172803.1422136-1-mordan@ispras.ru Signed-off-by: Sasha Levin --- drivers/i2c/busses/i2c-pxa.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index 4d76e71cdd4be..afc1a8171f59e 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c @@ -1503,7 +1503,10 @@ static int i2c_pxa_probe(struct platform_device *dev) i2c->adap.name); } - clk_prepare_enable(i2c->clk); + ret = clk_prepare_enable(i2c->clk); + if (ret) + return dev_err_probe(&dev->dev, ret, + "failed to enable clock\n"); if (i2c->use_pio) { i2c->adap.algo = &i2c_pxa_pio_algorithm; -- GitLab From 1144874b41dcd69ef33704454175bfdd060b28fc Mon Sep 17 00:00:00 2001 From: Boris Burkov Date: Mon, 3 Mar 2025 15:01:05 -0800 Subject: [PATCH 0114/2211] btrfs: make btrfs_discard_workfn() block_group ref explicit [ Upstream commit 895c6721d310c036dcfebb5ab845822229fa35eb ] Currently, the async discard machinery owns a ref to the block_group when the block_group is queued on a discard list. However, to handle races with discard cancellation and the discard workfn, we have a specific logic to detect that the block_group is *currently* running in the workfn, to protect the workfn's usage amidst cancellation. As far as I can tell, this doesn't have any overt bugs (though finish_discard_pass() and remove_from_discard_list() racing can have a surprising outcome for the caller of remove_from_discard_list() in that it is again added at the end). But it is needlessly complicated to rely on locking and the nullity of discard_ctl->block_group. Simplify this significantly by just taking a refcount while we are in the workfn and unconditionally drop it in both the remove and workfn paths, regardless of if they race. Reviewed-by: Filipe Manana Signed-off-by: Boris Burkov Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/discard.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/fs/btrfs/discard.c b/fs/btrfs/discard.c index e9cdc1759dada..de23c4b3515e5 100644 --- a/fs/btrfs/discard.c +++ b/fs/btrfs/discard.c @@ -168,13 +168,7 @@ static bool remove_from_discard_list(struct btrfs_discard_ctl *discard_ctl, block_group->discard_eligible_time = 0; queued = !list_empty(&block_group->discard_list); list_del_init(&block_group->discard_list); - /* - * If the block group is currently running in the discard workfn, we - * don't want to deref it, since it's still being used by the workfn. - * The workfn will notice this case and deref the block group when it is - * finished. - */ - if (queued && !running) + if (queued) btrfs_put_block_group(block_group); spin_unlock(&discard_ctl->lock); @@ -273,9 +267,10 @@ again: block_group->discard_cursor = block_group->start; block_group->discard_state = BTRFS_DISCARD_EXTENTS; } - discard_ctl->block_group = block_group; } if (block_group) { + btrfs_get_block_group(block_group); + discard_ctl->block_group = block_group; *discard_state = block_group->discard_state; *discard_index = block_group->discard_index; } @@ -506,9 +501,20 @@ static void btrfs_discard_workfn(struct work_struct *work) block_group = peek_discard_list(discard_ctl, &discard_state, &discard_index, now); - if (!block_group || !btrfs_run_discard_work(discard_ctl)) + if (!block_group) return; + if (!btrfs_run_discard_work(discard_ctl)) { + spin_lock(&discard_ctl->lock); + btrfs_put_block_group(block_group); + discard_ctl->block_group = NULL; + spin_unlock(&discard_ctl->lock); + return; + } if (now < block_group->discard_eligible_time) { + spin_lock(&discard_ctl->lock); + btrfs_put_block_group(block_group); + discard_ctl->block_group = NULL; + spin_unlock(&discard_ctl->lock); btrfs_discard_schedule_work(discard_ctl, false); return; } @@ -560,15 +566,7 @@ static void btrfs_discard_workfn(struct work_struct *work) spin_lock(&discard_ctl->lock); discard_ctl->prev_discard = trimmed; discard_ctl->prev_discard_time = now; - /* - * If the block group was removed from the discard list while it was - * running in this workfn, then we didn't deref it, since this function - * still owned that reference. But we set the discard_ctl->block_group - * back to NULL, so we can use that condition to know that now we need - * to deref the block_group. - */ - if (discard_ctl->block_group == NULL) - btrfs_put_block_group(block_group); + btrfs_put_block_group(block_group); discard_ctl->block_group = NULL; __btrfs_discard_schedule_work(discard_ctl, now, false); spin_unlock(&discard_ctl->lock); -- GitLab From a4840945f514c227d9cb8925f06c230c71b90d3c Mon Sep 17 00:00:00 2001 From: Mark Harmstone Date: Thu, 6 Mar 2025 10:58:46 +0000 Subject: [PATCH 0115/2211] btrfs: avoid linker error in btrfs_find_create_tree_block() [ Upstream commit 7ef3cbf17d2734ca66c4ed8573be45f4e461e7ee ] The inline function btrfs_is_testing() is hardcoded to return 0 if CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set. Currently we're relying on the compiler optimizing out the call to alloc_test_extent_buffer() in btrfs_find_create_tree_block(), as it's not been defined (it's behind an #ifdef). Add a stub version of alloc_test_extent_buffer() to avoid linker errors on non-standard optimization levels. This problem was seen on GCC 14 with -O0 and is helps to see symbols that would be otherwise optimized out. Reviewed-by: Qu Wenruo Signed-off-by: Mark Harmstone Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/extent_io.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index e263d4b0546fa..d322cf82783f9 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2826,10 +2826,10 @@ struct extent_buffer *find_extent_buffer(struct btrfs_fs_info *fs_info, return eb; } -#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info, u64 start) { +#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS struct extent_buffer *eb, *exists = NULL; int ret; @@ -2865,8 +2865,11 @@ again: free_eb: btrfs_release_extent_buffer(eb); return exists; -} +#else + /* Stub to avoid linker error when compiled with optimizations turned off. */ + return NULL; #endif +} static struct extent_buffer *grab_extent_buffer( struct btrfs_fs_info *fs_info, struct page *page) -- GitLab From 8629f9d9a92e8e64a426b0492630f45a8eef89e5 Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Fri, 7 Mar 2025 14:36:10 +1030 Subject: [PATCH 0116/2211] btrfs: run btrfs_error_commit_super() early [ Upstream commit df94a342efb451deb0e32b495d1d6cd4bb3a1648 ] [BUG] Even after all the error fixes related the "ASSERT(list_empty(&fs_info->delayed_iputs));" in close_ctree(), I can still hit it reliably with my experimental 2K block size. [CAUSE] In my case, all the error is triggered after the fs is already in error status. I find the following call trace to be the cause of race: Main thread | endio_write_workers ---------------------------------------------+--------------------------- close_ctree() | |- btrfs_error_commit_super() | | |- btrfs_cleanup_transaction() | | | |- btrfs_destroy_all_ordered_extents() | | | |- btrfs_wait_ordered_roots() | | |- btrfs_run_delayed_iputs() | | | btrfs_finish_ordered_io() | | |- btrfs_put_ordered_extent() | | |- btrfs_add_delayed_iput() |- ASSERT(list_empty(delayed_iputs)) | !!! Triggered !!! The root cause is that, btrfs_wait_ordered_roots() only wait for ordered extents to finish their IOs, not to wait for them to finish and removed. [FIX] Since btrfs_error_commit_super() will flush and wait for all ordered extents, it should be executed early, before we start flushing the workqueues. And since btrfs_error_commit_super() now runs early, there is no need to run btrfs_run_delayed_iputs() inside it, so just remove the btrfs_run_delayed_iputs() call from btrfs_error_commit_super(). Reviewed-by: Filipe Manana Signed-off-by: Qu Wenruo Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/disk-io.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 19e5f8eaae772..e0e740e4d7c75 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -4254,6 +4254,14 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info) /* clear out the rbtree of defraggable inodes */ btrfs_cleanup_defrag_inodes(fs_info); + /* + * Handle the error fs first, as it will flush and wait for all ordered + * extents. This will generate delayed iputs, thus we want to handle + * it first. + */ + if (unlikely(BTRFS_FS_ERROR(fs_info))) + btrfs_error_commit_super(fs_info); + /* * Wait for any fixup workers to complete. * If we don't wait for them here and they are still running by the time @@ -4343,9 +4351,6 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info) btrfs_err(fs_info, "commit super ret %d", ret); } - if (BTRFS_FS_ERROR(fs_info)) - btrfs_error_commit_super(fs_info); - kthread_stop(fs_info->transaction_kthread); kthread_stop(fs_info->cleaner_kthread); @@ -4468,10 +4473,6 @@ static void btrfs_error_commit_super(struct btrfs_fs_info *fs_info) /* cleanup FS via transaction */ btrfs_cleanup_transaction(fs_info); - mutex_lock(&fs_info->cleaner_mutex); - btrfs_run_delayed_iputs(fs_info); - mutex_unlock(&fs_info->cleaner_mutex); - down_write(&fs_info->cleanup_work_sem); up_write(&fs_info->cleanup_work_sem); } -- GitLab From 0058c61d47ee15778caaa4a487d00c63b39265d4 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Thu, 6 Mar 2025 14:25:38 +0000 Subject: [PATCH 0117/2211] btrfs: fix non-empty delayed iputs list on unmount due to async workers [ Upstream commit cda76788f8b0f7de3171100e3164ec1ce702292e ] At close_ctree() after we have ran delayed iputs either explicitly through calling btrfs_run_delayed_iputs() or later during the call to btrfs_commit_super() or btrfs_error_commit_super(), we assert that the delayed iputs list is empty. We have (another) race where this assertion might fail because we have queued an async write into the fs_info->workers workqueue. Here's how it happens: 1) We are submitting a data bio for an inode that is not the data relocation inode, so we call btrfs_wq_submit_bio(); 2) btrfs_wq_submit_bio() submits a work for the fs_info->workers queue that will run run_one_async_done(); 3) We enter close_ctree(), flush several work queues except fs_info->workers, explicitly run delayed iputs with a call to btrfs_run_delayed_iputs() and then again shortly after by calling btrfs_commit_super() or btrfs_error_commit_super(), which also run delayed iputs; 4) run_one_async_done() is executed in the work queue, and because there was an IO error (bio->bi_status is not 0) it calls btrfs_bio_end_io(), which drops the final reference on the associated ordered extent by calling btrfs_put_ordered_extent() - and that adds a delayed iput for the inode; 5) At close_ctree() we find that after stopping the cleaner and transaction kthreads the delayed iputs list is not empty, failing the following assertion: ASSERT(list_empty(&fs_info->delayed_iputs)); Fix this by flushing the fs_info->workers workqueue before running delayed iputs at close_ctree(). David reported this when running generic/648, which exercises IO error paths by using the DM error table. Reported-by: David Sterba Reviewed-by: Qu Wenruo Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/disk-io.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index e0e740e4d7c75..147c50ef912ac 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -4282,6 +4282,19 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info) */ btrfs_flush_workqueue(fs_info->delalloc_workers); + /* + * We can have ordered extents getting their last reference dropped from + * the fs_info->workers queue because for async writes for data bios we + * queue a work for that queue, at btrfs_wq_submit_bio(), that runs + * run_one_async_done() which calls btrfs_bio_end_io() in case the bio + * has an error, and that later function can do the final + * btrfs_put_ordered_extent() on the ordered extent attached to the bio, + * which adds a delayed iput for the inode. So we must flush the queue + * so that we don't have delayed iputs after committing the current + * transaction below and stopping the cleaner and transaction kthreads. + */ + btrfs_flush_workqueue(fs_info->workers); + /* * When finishing a compressed write bio we schedule a work queue item * to finish an ordered extent - btrfs_finish_compressed_write_work() -- GitLab From c4845a09a1edd1d4b629770f9d937c345ce65362 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Fri, 21 Feb 2025 16:12:15 +0000 Subject: [PATCH 0118/2211] btrfs: get zone unusable bytes while holding lock at btrfs_reclaim_bgs_work() [ Upstream commit 1283b8c125a83bf7a7dbe90c33d3472b6d7bf612 ] At btrfs_reclaim_bgs_work(), we are grabbing a block group's zone unusable bytes while not under the protection of the block group's spinlock, so this can trigger race reports from KCSAN (or similar tools) since that field is typically updated while holding the lock, such as at __btrfs_add_free_space_zoned() for example. Fix this by grabbing the zone unusable bytes while we are still in the critical section holding the block group's spinlock, which is right above where we are currently grabbing it. Reviewed-by: Johannes Thumshirn Signed-off-by: Filipe Manana Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/block-group.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 4423d8b716a58..aa8656c8b7e7e 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1891,6 +1891,17 @@ void btrfs_reclaim_bgs_work(struct work_struct *work) up_write(&space_info->groups_sem); goto next; } + + /* + * Cache the zone_unusable value before turning the block group + * to read only. As soon as the block group is read only it's + * zone_unusable value gets moved to the block group's read-only + * bytes and isn't available for calculations anymore. We also + * cache it before unlocking the block group, to prevent races + * (reports from KCSAN and such tools) with tasks updating it. + */ + zone_unusable = bg->zone_unusable; + spin_unlock(&bg->lock); spin_unlock(&space_info->lock); @@ -1907,13 +1918,6 @@ void btrfs_reclaim_bgs_work(struct work_struct *work) goto next; } - /* - * Cache the zone_unusable value before turning the block group - * to read only. As soon as the blog group is read only it's - * zone_unusable value gets moved to the block group's read-only - * bytes and isn't available for calculations anymore. - */ - zone_unusable = bg->zone_unusable; ret = inc_block_group_ro(bg, 0); up_write(&space_info->groups_sem); if (ret < 0) -- GitLab From c60f8684a81181a7b8efb25abf65831b7fb4bffe Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Wed, 5 Feb 2025 13:09:25 +0000 Subject: [PATCH 0119/2211] btrfs: send: return -ENAMETOOLONG when attempting a path that is too long [ Upstream commit a77749b3e21813566cea050bbb3414ae74562eba ] When attempting to build a too long path we are currently returning -ENOMEM, which is very odd and misleading. So update fs_path_ensure_buf() to return -ENAMETOOLONG instead. Also, while at it, move the WARN_ON() into the if statement's expression, as it makes it clear what is being tested and also has the effect of adding 'unlikely' to the statement, which allows the compiler to generate better code as this condition is never expected to happen. Signed-off-by: Filipe Manana Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/send.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index b1015f383f75e..c843b4aefb8ac 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c @@ -487,10 +487,8 @@ static int fs_path_ensure_buf(struct fs_path *p, int len) if (p->buf_len >= len) return 0; - if (len > PATH_MAX) { - WARN_ON(1); - return -ENOMEM; - } + if (WARN_ON(len > PATH_MAX)) + return -ENAMETOOLONG; path_len = p->end - p->start; old_buf_len = p->buf_len; -- GitLab From a5a507fa5f223ad46766d3cca60ab5d819c71c4a Mon Sep 17 00:00:00 2001 From: Chen Linxuan Date: Mon, 17 Mar 2025 10:29:24 +0800 Subject: [PATCH 0120/2211] blk-cgroup: improve policy registration error handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit e1a0202c6bfda24002a3ae2115154fa90104c649 ] This patch improve the returned error code of blkcg_policy_register(). 1. Move the validation check for cpd/pd_alloc_fn and cpd/pd_free_fn function pairs to the start of blkcg_policy_register(). This ensures we immediately return -EINVAL if the function pairs are not correctly provided, rather than returning -ENOSPC after locking and unlocking mutexes unnecessarily. Those locks should not contention any problems, as error of policy registration is a super cold path. 2. Return -ENOMEM when cpd_alloc_fn() failed. Co-authored-by: Wen Tao Signed-off-by: Wen Tao Signed-off-by: Chen Linxuan Reviewed-by: Michal Koutný Acked-by: Tejun Heo Reviewed-by: Yu Kuai Link: https://lore.kernel.org/r/3E333A73B6B6DFC0+20250317022924.150907-1-chenlinxuan@uniontech.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- block/blk-cgroup.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index f1cf7f2909f3a..643d6bf66522e 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c @@ -1725,27 +1725,27 @@ int blkcg_policy_register(struct blkcg_policy *pol) struct blkcg *blkcg; int i, ret; + /* + * Make sure cpd/pd_alloc_fn and cpd/pd_free_fn in pairs, and policy + * without pd_alloc_fn/pd_free_fn can't be activated. + */ + if ((!pol->cpd_alloc_fn ^ !pol->cpd_free_fn) || + (!pol->pd_alloc_fn ^ !pol->pd_free_fn)) + return -EINVAL; + mutex_lock(&blkcg_pol_register_mutex); mutex_lock(&blkcg_pol_mutex); /* find an empty slot */ - ret = -ENOSPC; for (i = 0; i < BLKCG_MAX_POLS; i++) if (!blkcg_policy[i]) break; if (i >= BLKCG_MAX_POLS) { pr_warn("blkcg_policy_register: BLKCG_MAX_POLS too small\n"); + ret = -ENOSPC; goto err_unlock; } - /* - * Make sure cpd/pd_alloc_fn and cpd/pd_free_fn in pairs, and policy - * without pd_alloc_fn/pd_free_fn can't be activated. - */ - if ((!pol->cpd_alloc_fn ^ !pol->cpd_free_fn) || - (!pol->pd_alloc_fn ^ !pol->pd_free_fn)) - goto err_unlock; - /* register @pol */ pol->plid = i; blkcg_policy[pol->plid] = pol; @@ -1756,8 +1756,10 @@ int blkcg_policy_register(struct blkcg_policy *pol) struct blkcg_policy_data *cpd; cpd = pol->cpd_alloc_fn(GFP_KERNEL); - if (!cpd) + if (!cpd) { + ret = -ENOMEM; goto err_free_cpds; + } blkcg->cpd[pol->plid] = cpd; cpd->blkcg = blkcg; -- GitLab From ca8fcb8bcef33aa2a624ee42cd373dc68294682b Mon Sep 17 00:00:00 2001 From: Flora Cui Date: Fri, 14 Mar 2025 10:27:55 +0800 Subject: [PATCH 0121/2211] drm/amdgpu: release xcp_mgr on exit [ Upstream commit b5aaa82e2b12feaaa6958f7fa0917ddcc03c24ee ] Free on driver cleanup. Reviewed-by: Lijo Lazar Signed-off-by: Flora Cui Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 081c0e45779fc..ca0411c9500e7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -4677,6 +4677,9 @@ void amdgpu_device_fini_sw(struct amdgpu_device *adev) kfree(adev->fru_info); adev->fru_info = NULL; + kfree(adev->xcp_mgr); + adev->xcp_mgr = NULL; + px = amdgpu_device_supports_px(adev_to_drm(adev)); if (px || (!dev_is_removable(&adev->pdev->dev) && -- GitLab From 85bda883a634c1efcb7b0392461ce5103196ee18 Mon Sep 17 00:00:00 2001 From: Jing Zhou Date: Tue, 4 Mar 2025 23:15:56 +0800 Subject: [PATCH 0122/2211] drm/amd/display: Guard against setting dispclk low for dcn31x [ Upstream commit 9c2f4ae64bb6f6d83a54d88b9ee0f369cdbb9fa8 ] [WHY] We should never apply a minimum dispclk value while in prepare_bandwidth or while displays are active. This is always an optimizaiton for when all displays are disabled. [HOW] Defer dispclk optimization until safe_to_lower = true and display_count reaches 0. Since 0 has a special value in this logic (ie. no dispclk required) we also need adjust the logic that clamps it for the actual request to PMFW. Reviewed-by: Charlene Liu Reviewed-by: Chris Park Reviewed-by: Eric Yang Signed-off-by: Jing Zhou Signed-off-by: Nicholas Kazlauskas Signed-off-by: Alex Hung Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../dc/clk_mgr/dcn315/dcn315_clk_mgr.c | 20 +++++++++++-------- .../dc/clk_mgr/dcn316/dcn316_clk_mgr.c | 13 +++++++++--- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c index a0fb4481d2f1b..827b24b3442ad 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c @@ -130,7 +130,7 @@ static void dcn315_update_clocks(struct clk_mgr *clk_mgr_base, struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base); struct dc_clocks *new_clocks = &context->bw_ctx.bw.dcn.clk; struct dc *dc = clk_mgr_base->ctx->dc; - int display_count; + int display_count = 0; bool update_dppclk = false; bool update_dispclk = false; bool dpp_clock_lowered = false; @@ -204,15 +204,19 @@ static void dcn315_update_clocks(struct clk_mgr *clk_mgr_base, update_dppclk = true; } - if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, clk_mgr_base->clks.dispclk_khz)) { - /* No need to apply the w/a if we haven't taken over from bios yet */ - if (clk_mgr_base->clks.dispclk_khz) - dcn315_disable_otg_wa(clk_mgr_base, context, true); + if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, clk_mgr_base->clks.dispclk_khz) && + (new_clocks->dispclk_khz > 0 || (safe_to_lower && display_count == 0))) { + int requested_dispclk_khz = new_clocks->dispclk_khz; + dcn315_disable_otg_wa(clk_mgr_base, context, true); + + /* Clamp the requested clock to PMFW based on their limit. */ + if (dc->debug.min_disp_clk_khz > 0 && requested_dispclk_khz < dc->debug.min_disp_clk_khz) + requested_dispclk_khz = dc->debug.min_disp_clk_khz; + + dcn315_smu_set_dispclk(clk_mgr, requested_dispclk_khz); clk_mgr_base->clks.dispclk_khz = new_clocks->dispclk_khz; - dcn315_smu_set_dispclk(clk_mgr, clk_mgr_base->clks.dispclk_khz); - if (clk_mgr_base->clks.dispclk_khz) - dcn315_disable_otg_wa(clk_mgr_base, context, false); + dcn315_disable_otg_wa(clk_mgr_base, context, false); update_dispclk = true; } diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c index c3e50c3aaa609..37c39756fece4 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c @@ -140,7 +140,7 @@ static void dcn316_update_clocks(struct clk_mgr *clk_mgr_base, struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base); struct dc_clocks *new_clocks = &context->bw_ctx.bw.dcn.clk; struct dc *dc = clk_mgr_base->ctx->dc; - int display_count; + int display_count = 0; bool update_dppclk = false; bool update_dispclk = false; bool dpp_clock_lowered = false; @@ -211,11 +211,18 @@ static void dcn316_update_clocks(struct clk_mgr *clk_mgr_base, update_dppclk = true; } - if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, clk_mgr_base->clks.dispclk_khz)) { + if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, clk_mgr_base->clks.dispclk_khz) && + (new_clocks->dispclk_khz > 0 || (safe_to_lower && display_count == 0))) { + int requested_dispclk_khz = new_clocks->dispclk_khz; + dcn316_disable_otg_wa(clk_mgr_base, context, safe_to_lower, true); + /* Clamp the requested clock to PMFW based on their limit. */ + if (dc->debug.min_disp_clk_khz > 0 && requested_dispclk_khz < dc->debug.min_disp_clk_khz) + requested_dispclk_khz = dc->debug.min_disp_clk_khz; + + dcn316_smu_set_dispclk(clk_mgr, requested_dispclk_khz); clk_mgr_base->clks.dispclk_khz = new_clocks->dispclk_khz; - dcn316_smu_set_dispclk(clk_mgr, clk_mgr_base->clks.dispclk_khz); dcn316_disable_otg_wa(clk_mgr_base, context, safe_to_lower, false); update_dispclk = true; -- GitLab From 94206e0d72f7a6e0232ba4770912ac5569956098 Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Thu, 13 Mar 2025 20:52:38 -0400 Subject: [PATCH 0123/2211] drm/amdgpu: adjust drm_firmware_drivers_only() handling [ Upstream commit e00e5c223878a60e391e5422d173c3382d378f87 ] Move to probe so we can check the PCI device type and only apply the drm_firmware_drivers_only() check for PCI DISPLAY classes. Also add a module parameter to override the nomodeset kernel parameter as a workaround for platforms that have this hardcoded on their kernel command lines. Reviewed-by: Kent Russell Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 1b479bd851354..93c3de2d27d3a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -172,6 +172,7 @@ uint amdgpu_sdma_phase_quantum = 32; char *amdgpu_disable_cu; char *amdgpu_virtual_display; bool enforce_isolation; +int amdgpu_modeset = -1; /* Specifies the default granularity for SVM, used in buffer * migration and restoration of backing memory when handling @@ -1037,6 +1038,13 @@ module_param_named(user_partt_mode, amdgpu_user_partt_mode, uint, 0444); module_param(enforce_isolation, bool, 0444); MODULE_PARM_DESC(enforce_isolation, "enforce process isolation between graphics and compute . enforce_isolation = on"); +/** + * DOC: modeset (int) + * Override nomodeset (1 = override, -1 = auto). The default is -1 (auto). + */ +MODULE_PARM_DESC(modeset, "Override nomodeset (1 = enable, -1 = auto)"); +module_param_named(modeset, amdgpu_modeset, int, 0444); + /** * DOC: seamless (int) * Seamless boot will keep the image on the screen during the boot process. @@ -2248,6 +2256,12 @@ static int amdgpu_pci_probe(struct pci_dev *pdev, int ret, retry = 0, i; bool supports_atomic = false; + if ((pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA || + (pdev->class >> 8) == PCI_CLASS_DISPLAY_OTHER) { + if (drm_firmware_drivers_only() && amdgpu_modeset == -1) + return -EINVAL; + } + /* skip devices which are owned by radeon */ for (i = 0; i < ARRAY_SIZE(amdgpu_unsupported_pciidlist); i++) { if (amdgpu_unsupported_pciidlist[i] == pdev->device) -- GitLab From 1ea4653cff35c29d1dd0b14ad9c8245e7318f337 Mon Sep 17 00:00:00 2001 From: Stanley Chu Date: Tue, 18 Mar 2025 13:36:06 +0800 Subject: [PATCH 0124/2211] i3c: master: svc: Fix missing STOP for master request [ Upstream commit 0430bf9bc1ac068c8b8c540eb93e5751872efc51 ] The controller driver nacked the master request but didn't emit a STOP to end the transaction. The driver shall refuse the unsupported requests and return the controller state to IDLE by emitting a STOP. Signed-off-by: Stanley Chu Reviewed-by: Frank Li Link: https://lore.kernel.org/r/20250318053606.3087121-4-yschu@nuvoton.com Signed-off-by: Alexandre Belloni Signed-off-by: Sasha Levin --- drivers/i3c/master/svc-i3c-master.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c index 7911814ad82ac..6ffe022dbb5b4 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -511,6 +511,7 @@ static void svc_i3c_master_ibi_work(struct work_struct *work) queue_work(master->base.wq, &master->hj_work); break; case SVC_I3C_MSTATUS_IBITYPE_MASTER_REQUEST: + svc_i3c_master_emit_stop(master); default: break; } -- GitLab From f3ea633a111e0aba37ddb369b573386ec75fbad7 Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Mon, 10 Mar 2025 12:42:59 +0100 Subject: [PATCH 0125/2211] s390/tlb: Use mm_has_pgste() instead of mm_alloc_pgste() [ Upstream commit 9291ea091b29bb3e37c4b3416c7c1e49e472c7d5 ] An mm has pgstes only after s390_enable_sie() has been called, while mm_alloc_pgste() may be always true (e.g. via sysctl setting). Limit the calls to gmap_unlink() in pte_free_tlb() to those cases where there might be something to unlink. Reviewed-by: Alexander Gordeev Signed-off-by: Heiko Carstens Signed-off-by: Vasily Gorbik Signed-off-by: Sasha Levin --- arch/s390/include/asm/tlb.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/s390/include/asm/tlb.h b/arch/s390/include/asm/tlb.h index e95b2c8081eb8..793afe236df07 100644 --- a/arch/s390/include/asm/tlb.h +++ b/arch/s390/include/asm/tlb.h @@ -85,7 +85,7 @@ static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, tlb->mm->context.flush_mm = 1; tlb->freed_tables = 1; tlb->cleared_pmds = 1; - if (mm_alloc_pgste(tlb->mm)) + if (mm_has_pgste(tlb->mm)) gmap_unlink(tlb->mm, (unsigned long *)pte, address); tlb_remove_ptdesc(tlb, pte); } -- GitLab From 39ff1903246aa5f47c5cf741c705d649623a7103 Mon Sep 17 00:00:00 2001 From: Heming Zhao Date: Mon, 10 Mar 2025 15:36:21 +0800 Subject: [PATCH 0126/2211] dlm: make tcp still work in multi-link env [ Upstream commit 03d2b62208a336a3bb984b9465ef6d89a046ea22 ] This patch bypasses multi-link errors in TCP mode, allowing dlm to operate on the first tcp link. Signed-off-by: Heming Zhao Signed-off-by: David Teigland Signed-off-by: Sasha Levin --- fs/dlm/lowcomms.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index f2d88a3581695..10461451185e8 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c @@ -1826,8 +1826,8 @@ static int dlm_tcp_listen_validate(void) { /* We don't support multi-homed hosts */ if (dlm_local_count > 1) { - log_print("TCP protocol can't handle multi-homed hosts, try SCTP"); - return -EINVAL; + log_print("Detect multi-homed hosts but use only the first IP address."); + log_print("Try SCTP, if you want to enable multi-link."); } return 0; -- GitLab From 7790a9449cf4391b664775d444657deb2fa06b48 Mon Sep 17 00:00:00 2001 From: Nick Hu Date: Wed, 19 Feb 2025 19:41:35 +0800 Subject: [PATCH 0127/2211] clocksource/drivers/timer-riscv: Stop stimecmp when cpu hotplug [ Upstream commit 70c93b026ed07078e933583591aa9ca6701cd9da ] Stop the timer when the cpu is going to be offline otherwise the timer interrupt may be pending while performing power-down. Suggested-by: Anup Patel Link: https://lore.kernel.org/lkml/20240829033904.477200-3-nick.hu@sifive.com/T/#u Signed-off-by: Nick Hu Reviewed-by: Anup Patel Acked-by: Daniel Lezcano Link: https://lore.kernel.org/r/20250219114135.27764-3-nick.hu@sifive.com Signed-off-by: Alexandre Ghiti Signed-off-by: Sasha Levin --- drivers/clocksource/timer-riscv.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/clocksource/timer-riscv.c b/drivers/clocksource/timer-riscv.c index 48ce50c5f5e68..4d7cf338824a3 100644 --- a/drivers/clocksource/timer-riscv.c +++ b/drivers/clocksource/timer-riscv.c @@ -126,7 +126,13 @@ static int riscv_timer_starting_cpu(unsigned int cpu) static int riscv_timer_dying_cpu(unsigned int cpu) { + /* + * Stop the timer when the cpu is going to be offline otherwise + * the timer interrupt may be pending while performing power-down. + */ + riscv_clock_event_stop(); disable_percpu_irq(riscv_clock_event_irq); + return 0; } -- GitLab From d6d2f664cbf3b9bb99e5e5c41d32c567aa9cebd1 Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Mon, 24 Feb 2025 19:18:19 +0100 Subject: [PATCH 0128/2211] um: Store full CSGSFS and SS register from mcontext [ Upstream commit cef721e0d53d2b64f2ba177c63a0dfdd7c0daf17 ] Doing this allows using registers as retrieved from an mcontext to be pushed to a process using PTRACE_SETREGS. It is not entirely clear to me why CSGSFS was masked. Doing so creates issues when using the mcontext as process state in seccomp and simply copying the register appears to work perfectly fine for ptrace. Signed-off-by: Benjamin Berg Link: https://patch.msgid.link/20250224181827.647129-2-benjamin@sipsolutions.net Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- arch/x86/um/os-Linux/mcontext.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/arch/x86/um/os-Linux/mcontext.c b/arch/x86/um/os-Linux/mcontext.c index e80ab7d281177..1b0d95328b2c7 100644 --- a/arch/x86/um/os-Linux/mcontext.c +++ b/arch/x86/um/os-Linux/mcontext.c @@ -27,7 +27,6 @@ void get_regs_from_mc(struct uml_pt_regs *regs, mcontext_t *mc) COPY(RIP); COPY2(EFLAGS, EFL); COPY2(CS, CSGSFS); - regs->gp[CS / sizeof(unsigned long)] &= 0xffff; - regs->gp[CS / sizeof(unsigned long)] |= 3; + regs->gp[SS / sizeof(unsigned long)] = mc->gregs[REG_CSGSFS] >> 48; #endif } -- GitLab From 728945c962695ec5db95e44e9449f6b3edcccbcf Mon Sep 17 00:00:00 2001 From: Tiwei Bie Date: Fri, 21 Feb 2025 12:18:55 +0800 Subject: [PATCH 0129/2211] um: Update min_low_pfn to match changes in uml_reserved [ Upstream commit e82cf3051e6193f61e03898f8dba035199064d36 ] When uml_reserved is updated, min_low_pfn must also be updated accordingly. Otherwise, min_low_pfn will not accurately reflect the lowest available PFN. Signed-off-by: Tiwei Bie Link: https://patch.msgid.link/20250221041855.1156109-1-tiwei.btw@antgroup.com Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- arch/um/kernel/mem.c | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c index a5b4fe2ad9315..6ca9ea4a230bc 100644 --- a/arch/um/kernel/mem.c +++ b/arch/um/kernel/mem.c @@ -70,6 +70,7 @@ void __init mem_init(void) map_memory(brk_end, __pa(brk_end), uml_reserved - brk_end, 1, 1, 0); memblock_free((void *)brk_end, uml_reserved - brk_end); uml_reserved = brk_end; + min_low_pfn = PFN_UP(__pa(uml_reserved)); /* this will put all low memory onto the freelists */ memblock_free_all(); -- GitLab From 34253084291cb210b251d64657958b8041ce4ab1 Mon Sep 17 00:00:00 2001 From: Jeff Chen Date: Fri, 14 Mar 2025 17:42:38 +0800 Subject: [PATCH 0130/2211] wifi: mwifiex: Fix HT40 bandwidth issue. [ Upstream commit 4fcfcbe457349267fe048524078e8970807c1a5b ] This patch addresses an issue where, despite the AP supporting 40MHz bandwidth, the connection was limited to 20MHz. Without this fix, even if the access point supports 40MHz, the bandwidth after connection remains at 20MHz. This issue is not a regression. Signed-off-by: Jeff Chen Reviewed-by: Francesco Dolcini Link: https://patch.msgid.link/20250314094238.2097341-1-jeff.chen_1@nxp.com Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/marvell/mwifiex/11n.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/marvell/mwifiex/11n.c b/drivers/net/wireless/marvell/mwifiex/11n.c index 66f0f5377ac18..738bafc3749b0 100644 --- a/drivers/net/wireless/marvell/mwifiex/11n.c +++ b/drivers/net/wireless/marvell/mwifiex/11n.c @@ -403,12 +403,14 @@ mwifiex_cmd_append_11n_tlv(struct mwifiex_private *priv, if (sband->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 && bss_desc->bcn_ht_oper->ht_param & - IEEE80211_HT_PARAM_CHAN_WIDTH_ANY) + IEEE80211_HT_PARAM_CHAN_WIDTH_ANY) { + chan_list->chan_scan_param[0].radio_type |= + CHAN_BW_40MHZ << 2; SET_SECONDARYCHAN(chan_list->chan_scan_param[0]. radio_type, (bss_desc->bcn_ht_oper->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET)); - + } *buffer += struct_size(chan_list, chan_scan_param, 1); ret_len += struct_size(chan_list, chan_scan_param, 1); } -- GitLab From 5cdd304662d548c0c171524baa9fab1cd0b25dd5 Mon Sep 17 00:00:00 2001 From: shantiprasad shettar Date: Mon, 10 Mar 2025 11:31:26 -0700 Subject: [PATCH 0131/2211] bnxt_en: Query FW parameters when the CAPS_CHANGE bit is set [ Upstream commit a6c81e32aeacbfd530d576fa401edd506ec966ef ] Newer FW can set the CAPS_CHANGE flag during ifup if some capabilities or configurations have changed. For example, the CoS queue configurations may have changed. Support this new flag by treating it almost like FW reset. The driver will essentially rediscover all features and capabilities, reconfigure all backing store context memory, reset everything to default, and reserve all resources. Reviewed-by: Somnath Kotur Reviewed-by: Pavan Chebbi Signed-off-by: shantiprasad shettar Signed-off-by: Michael Chan Link: https://patch.msgid.link/20250310183129.3154117-5-michael.chan@broadcom.com Reviewed-by: Jacob Keller Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 12b61a6fcda42..2bb1fce350dbb 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -11783,6 +11783,7 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up) struct hwrm_func_drv_if_change_input *req; bool fw_reset = !bp->irq_tbl; bool resc_reinit = false; + bool caps_change = false; int rc, retry = 0; u32 flags = 0; @@ -11838,8 +11839,11 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up) set_bit(BNXT_STATE_ABORT_ERR, &bp->state); return -ENODEV; } - if (resc_reinit || fw_reset) { - if (fw_reset) { + if (flags & FUNC_DRV_IF_CHANGE_RESP_FLAGS_CAPS_CHANGE) + caps_change = true; + + if (resc_reinit || fw_reset || caps_change) { + if (fw_reset || caps_change) { set_bit(BNXT_STATE_FW_RESET_DET, &bp->state); if (!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) bnxt_ulp_irq_stop(bp); -- GitLab From a55ebe30f17a008773f024def37cf6c2595210ab Mon Sep 17 00:00:00 2001 From: Alexandre Ghiti Date: Mon, 13 Jan 2025 15:24:24 +0100 Subject: [PATCH 0132/2211] riscv: Call secondary mmu notifier when flushing the tlb MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit d9be2b9b60497a82aeceec3a98d8b37fdd2960f2 ] This is required to allow the IOMMU driver to correctly flush its own TLB. Reviewed-by: Clément Léger Reviewed-by: Samuel Holland Link: https://lore.kernel.org/r/20250113142424.30487-1-alexghiti@rivosinc.com Signed-off-by: Alexandre Ghiti Signed-off-by: Sasha Levin --- arch/riscv/mm/tlbflush.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/arch/riscv/mm/tlbflush.c b/arch/riscv/mm/tlbflush.c index 9b6e86ce38674..bb77607c87aa2 100644 --- a/arch/riscv/mm/tlbflush.c +++ b/arch/riscv/mm/tlbflush.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -78,10 +79,17 @@ static void __ipi_flush_tlb_range_asid(void *info) local_flush_tlb_range_asid(d->start, d->size, d->stride, d->asid); } -static void __flush_tlb_range(const struct cpumask *cmask, unsigned long asid, +static inline unsigned long get_mm_asid(struct mm_struct *mm) +{ + return mm ? cntx2asid(atomic_long_read(&mm->context.id)) : FLUSH_TLB_NO_ASID; +} + +static void __flush_tlb_range(struct mm_struct *mm, + const struct cpumask *cmask, unsigned long start, unsigned long size, unsigned long stride) { + unsigned long asid = get_mm_asid(mm); unsigned int cpu; if (cpumask_empty(cmask)) @@ -105,30 +113,26 @@ static void __flush_tlb_range(const struct cpumask *cmask, unsigned long asid, } put_cpu(); -} -static inline unsigned long get_mm_asid(struct mm_struct *mm) -{ - return cntx2asid(atomic_long_read(&mm->context.id)); + if (mm) + mmu_notifier_arch_invalidate_secondary_tlbs(mm, start, start + size); } void flush_tlb_mm(struct mm_struct *mm) { - __flush_tlb_range(mm_cpumask(mm), get_mm_asid(mm), - 0, FLUSH_TLB_MAX_SIZE, PAGE_SIZE); + __flush_tlb_range(mm, mm_cpumask(mm), 0, FLUSH_TLB_MAX_SIZE, PAGE_SIZE); } void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start, unsigned long end, unsigned int page_size) { - __flush_tlb_range(mm_cpumask(mm), get_mm_asid(mm), - start, end - start, page_size); + __flush_tlb_range(mm, mm_cpumask(mm), start, end - start, page_size); } void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr) { - __flush_tlb_range(mm_cpumask(vma->vm_mm), get_mm_asid(vma->vm_mm), + __flush_tlb_range(vma->vm_mm, mm_cpumask(vma->vm_mm), addr, PAGE_SIZE, PAGE_SIZE); } @@ -161,13 +165,13 @@ void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, } } - __flush_tlb_range(mm_cpumask(vma->vm_mm), get_mm_asid(vma->vm_mm), + __flush_tlb_range(vma->vm_mm, mm_cpumask(vma->vm_mm), start, end - start, stride_size); } void flush_tlb_kernel_range(unsigned long start, unsigned long end) { - __flush_tlb_range(cpu_online_mask, FLUSH_TLB_NO_ASID, + __flush_tlb_range(NULL, cpu_online_mask, start, end - start, PAGE_SIZE); } @@ -175,7 +179,7 @@ void flush_tlb_kernel_range(unsigned long start, unsigned long end) void flush_pmd_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end) { - __flush_tlb_range(mm_cpumask(vma->vm_mm), get_mm_asid(vma->vm_mm), + __flush_tlb_range(vma->vm_mm, mm_cpumask(vma->vm_mm), start, end - start, PMD_SIZE); } #endif @@ -189,7 +193,10 @@ void arch_tlbbatch_add_pending(struct arch_tlbflush_unmap_batch *batch, struct mm_struct *mm, unsigned long uaddr) { + unsigned long start = uaddr & PAGE_MASK; + cpumask_or(&batch->cpumask, &batch->cpumask, mm_cpumask(mm)); + mmu_notifier_arch_invalidate_secondary_tlbs(mm, start, start + PAGE_SIZE); } void arch_flush_tlb_batched_pending(struct mm_struct *mm) @@ -199,7 +206,7 @@ void arch_flush_tlb_batched_pending(struct mm_struct *mm) void arch_tlbbatch_flush(struct arch_tlbflush_unmap_batch *batch) { - __flush_tlb_range(&batch->cpumask, FLUSH_TLB_NO_ASID, 0, - FLUSH_TLB_MAX_SIZE, PAGE_SIZE); + __flush_tlb_range(NULL, &batch->cpumask, + 0, FLUSH_TLB_MAX_SIZE, PAGE_SIZE); cpumask_clear(&batch->cpumask); } -- GitLab From 94c3cbc69abbb14c22392fc9914917f01ef43b99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Sun, 2 Mar 2025 17:06:39 +0100 Subject: [PATCH 0133/2211] ext4: reorder capability check last MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 1b419c889c0767a5b66d0a6c566cae491f1cb0f7 ] capable() calls refer to enabled LSMs whether to permit or deny the request. This is relevant in connection with SELinux, where a capability check results in a policy decision and by default a denial message on insufficient permission is issued. It can lead to three undesired cases: 1. A denial message is generated, even in case the operation was an unprivileged one and thus the syscall succeeded, creating noise. 2. To avoid the noise from 1. the policy writer adds a rule to ignore those denial messages, hiding future syscalls, where the task performs an actual privileged operation, leading to hidden limited functionality of that task. 3. To avoid the noise from 1. the policy writer adds a rule to permit the task the requested capability, while it does not need it, violating the principle of least privilege. Signed-off-by: Christian Göttsche Reviewed-by: Serge Hallyn Reviewed-by: Jan Kara Link: https://patch.msgid.link/20250302160657.127253-2-cgoettsche@seltendoof.de Signed-off-by: Theodore Ts'o Signed-off-by: Sasha Levin --- fs/ext4/balloc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index 8042ad8738089..c48fd36b2d74c 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c @@ -649,8 +649,8 @@ static int ext4_has_free_clusters(struct ext4_sb_info *sbi, /* Hm, nope. Are (enough) root reserved clusters available? */ if (uid_eq(sbi->s_resuid, current_fsuid()) || (!gid_eq(sbi->s_resgid, GLOBAL_ROOT_GID) && in_group_p(sbi->s_resgid)) || - capable(CAP_SYS_RESOURCE) || - (flags & EXT4_MB_USE_ROOT_BLOCKS)) { + (flags & EXT4_MB_USE_ROOT_BLOCKS) || + capable(CAP_SYS_RESOURCE)) { if (free_clusters >= (nclusters + dirty_clusters + resv_clusters)) -- GitLab From 853a4e7439ef1e2fea72e7eaa31ef9d11bf7e138 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Mon, 17 Mar 2025 22:06:04 -0400 Subject: [PATCH 0134/2211] hypfs_create_cpu_files(): add missing check for hypfs_mkdir() failure [ Upstream commit 00cdfdcfa0806202aea56b02cedbf87ef1e75df8 ] Signed-off-by: Al Viro Signed-off-by: Sasha Levin --- arch/s390/hypfs/hypfs_diag_fs.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/s390/hypfs/hypfs_diag_fs.c b/arch/s390/hypfs/hypfs_diag_fs.c index 00a6d370a2803..280266a74f378 100644 --- a/arch/s390/hypfs/hypfs_diag_fs.c +++ b/arch/s390/hypfs/hypfs_diag_fs.c @@ -208,6 +208,8 @@ static int hypfs_create_cpu_files(struct dentry *cpus_dir, void *cpu_info) snprintf(buffer, TMP_SIZE, "%d", cpu_info__cpu_addr(diag204_get_info_type(), cpu_info)); cpu_dir = hypfs_mkdir(cpus_dir, buffer); + if (IS_ERR(cpu_dir)) + return PTR_ERR(cpu_dir); rc = hypfs_create_u64(cpu_dir, "mgmtime", cpu_info__acc_time(diag204_get_info_type(), cpu_info) - cpu_info__lp_time(diag204_get_info_type(), cpu_info)); -- GitLab From c6d366f8d24ffb94f4e5a88e4ad1edfed8f7ff63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20M=C3=A4kisara?= Date: Tue, 11 Mar 2025 13:25:16 +0200 Subject: [PATCH 0135/2211] scsi: st: Tighten the page format heuristics with MODE SELECT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 8db816c6f176321e42254badd5c1a8df8bfcfdb4 ] In the days when SCSI-2 was emerging, some drives did claim SCSI-2 but did not correctly implement it. The st driver first tries MODE SELECT with the page format bit set to set the block descriptor. If not successful, the non-page format is tried. The test only tests the sense code and this triggers also from illegal parameter in the parameter list. The test is limited to "old" devices and made more strict to remove false alarms. Signed-off-by: Kai Mäkisara Link: https://lore.kernel.org/r/20250311112516.5548-4-Kai.Makisara@kolumbus.fi Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/st.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index a17441635ff3a..1c0951168f646 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -3081,7 +3081,9 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon cmd_in == MTSETDRVBUFFER || cmd_in == SET_DENS_AND_BLK) { if (cmdstatp->sense_hdr.sense_key == ILLEGAL_REQUEST && - !(STp->use_pf & PF_TESTED)) { + cmdstatp->sense_hdr.asc == 0x24 && + (STp->device)->scsi_level <= SCSI_2 && + !(STp->use_pf & PF_TESTED)) { /* Try the other possible state of Page Format if not already tried */ STp->use_pf = (STp->use_pf ^ USE_PF) | PF_TESTED; -- GitLab From 0268f485aa69fe0814305c4f2a12a31c2f25c019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20M=C3=A4kisara?= Date: Tue, 11 Mar 2025 13:25:15 +0200 Subject: [PATCH 0136/2211] scsi: st: ERASE does not change tape location MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit ad77cebf97bd42c93ab4e3bffd09f2b905c1959a ] The SCSI ERASE command erases from the current position onwards. Don't clear the position variables. Signed-off-by: Kai Mäkisara Link: https://lore.kernel.org/r/20250311112516.5548-3-Kai.Makisara@kolumbus.fi Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/st.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 1c0951168f646..1cfd7e71dcdde 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -2894,7 +2894,6 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon timeout = STp->long_timeout * 8; DEBC_printk(STp, "Erasing tape.\n"); - fileno = blkno = at_sm = 0; break; case MTSETBLK: /* Set block length */ case MTSETDENSITY: /* Set tape density */ -- GitLab From 66e8f1d64b1b06c458f0aee28c726ba229e8f87c Mon Sep 17 00:00:00 2001 From: Alex Williamson Date: Tue, 11 Mar 2025 17:06:21 -0600 Subject: [PATCH 0137/2211] vfio/pci: Handle INTx IRQ_NOTCONNECTED [ Upstream commit 860be250fc32de9cb24154bf21b4e36f40925707 ] Some systems report INTx as not routed by setting pdev->irq to IRQ_NOTCONNECTED, resulting in a -ENOTCONN error when trying to setup eventfd signaling. Include this in the set of conditions for which the PIN register is virtualized to zero. Additionally consolidate vfio_pci_get_irq_count() to use this virtualized value in reporting INTx support via ioctl and sanity checking ioctl paths since pdev->irq is re-used when the device is in MSI mode. The combination of these results in both the config space of the device and the ioctl interface behaving as if the device does not support INTx. Reviewed-by: Kevin Tian Link: https://lore.kernel.org/r/20250311230623.1264283-1-alex.williamson@redhat.com Signed-off-by: Alex Williamson Signed-off-by: Sasha Levin --- drivers/vfio/pci/vfio_pci_config.c | 3 ++- drivers/vfio/pci/vfio_pci_core.c | 10 +--------- drivers/vfio/pci/vfio_pci_intrs.c | 2 +- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c index ea2745c1ac5e6..8ea38e7421df4 100644 --- a/drivers/vfio/pci/vfio_pci_config.c +++ b/drivers/vfio/pci/vfio_pci_config.c @@ -1813,7 +1813,8 @@ int vfio_config_init(struct vfio_pci_core_device *vdev) cpu_to_le16(PCI_COMMAND_MEMORY); } - if (!IS_ENABLED(CONFIG_VFIO_PCI_INTX) || vdev->nointx) + if (!IS_ENABLED(CONFIG_VFIO_PCI_INTX) || vdev->nointx || + vdev->pdev->irq == IRQ_NOTCONNECTED) vconfig[PCI_INTERRUPT_PIN] = 0; ret = vfio_cap_init(vdev); diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c index c9eaba2276365..087c273a547fa 100644 --- a/drivers/vfio/pci/vfio_pci_core.c +++ b/drivers/vfio/pci/vfio_pci_core.c @@ -727,15 +727,7 @@ EXPORT_SYMBOL_GPL(vfio_pci_core_finish_enable); static int vfio_pci_get_irq_count(struct vfio_pci_core_device *vdev, int irq_type) { if (irq_type == VFIO_PCI_INTX_IRQ_INDEX) { - u8 pin; - - if (!IS_ENABLED(CONFIG_VFIO_PCI_INTX) || - vdev->nointx || vdev->pdev->is_virtfn) - return 0; - - pci_read_config_byte(vdev->pdev, PCI_INTERRUPT_PIN, &pin); - - return pin ? 1 : 0; + return vdev->vconfig[PCI_INTERRUPT_PIN] ? 1 : 0; } else if (irq_type == VFIO_PCI_MSI_IRQ_INDEX) { u8 pos; u16 flags; diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c index 8382c58343356..565966351dfad 100644 --- a/drivers/vfio/pci/vfio_pci_intrs.c +++ b/drivers/vfio/pci/vfio_pci_intrs.c @@ -259,7 +259,7 @@ static int vfio_intx_enable(struct vfio_pci_core_device *vdev, if (!is_irq_none(vdev)) return -EINVAL; - if (!pdev->irq) + if (!pdev->irq || pdev->irq == IRQ_NOTCONNECTED) return -ENODEV; name = kasprintf(GFP_KERNEL_ACCOUNT, "vfio-intx(%s)", pci_name(pdev)); -- GitLab From e658f2d94a74cd4b4fc54875d89e34c68c318274 Mon Sep 17 00:00:00 2001 From: Mykyta Yatsenko Date: Mon, 17 Mar 2025 17:40:37 +0000 Subject: [PATCH 0138/2211] bpf: Return prog btf_id without capable check [ Upstream commit 07651ccda9ff10a8ca427670cdd06ce2c8e4269c ] Return prog's btf_id from bpf_prog_get_info_by_fd regardless of capable check. This patch enables scenario, when freplace program, running from user namespace, requires to query target prog's btf. Signed-off-by: Mykyta Yatsenko Signed-off-by: Andrii Nakryiko Acked-by: Yonghong Song Link: https://lore.kernel.org/bpf/20250317174039.161275-3-mykyta.yatsenko5@gmail.com Signed-off-by: Sasha Levin --- kernel/bpf/syscall.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 977c084577565..fc048d3c0e69f 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -4606,6 +4606,8 @@ static int bpf_prog_get_info_by_fd(struct file *file, info.recursion_misses = stats.misses; info.verified_insns = prog->aux->verified_insns; + if (prog->aux->btf) + info.btf_id = btf_obj_id(prog->aux->btf); if (!bpf_capable()) { info.jited_prog_len = 0; @@ -4752,8 +4754,6 @@ static int bpf_prog_get_info_by_fd(struct file *file, } } - if (prog->aux->btf) - info.btf_id = btf_obj_id(prog->aux->btf); info.attach_btf_id = prog->aux->attach_btf_id; if (attach_btf) info.attach_btf_obj_id = btf_obj_id(attach_btf); -- GitLab From e2520cc19b7589819ae3614aaf07389910a9606b Mon Sep 17 00:00:00 2001 From: Frank Li Date: Sat, 15 Mar 2025 15:15:36 -0500 Subject: [PATCH 0139/2211] PCI: dwc: Use resource start as ioremap() input in dw_pcie_pme_turn_off() [ Upstream commit 8f4a489b370e6612700aa16b9e4373b2d85d7503 ] The msg_res region translates writes into PCIe Message TLPs. Previously we mapped this region using atu.cpu_addr, the input address programmed into the ATU. "cpu_addr" is a misnomer because when a bus fabric translates addresses between the CPU and the ATU, the ATU input address is different from the CPU address. A future patch will rename "cpu_addr" and correct the value to be the ATU input address instead of the CPU physical address. Map the msg_res region before writing to it using the msg_res resource start, a CPU physical address. Link: https://lore.kernel.org/r/20250315201548.858189-2-helgaas@kernel.org Signed-off-by: Frank Li Signed-off-by: Bjorn Helgaas Signed-off-by: Sasha Levin --- drivers/pci/controller/dwc/pcie-designware-host.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c index 120e2aca5164a..d428457d9c432 100644 --- a/drivers/pci/controller/dwc/pcie-designware-host.c +++ b/drivers/pci/controller/dwc/pcie-designware-host.c @@ -902,7 +902,7 @@ static int dw_pcie_pme_turn_off(struct dw_pcie *pci) if (ret) return ret; - mem = ioremap(atu.cpu_addr, pci->region_align); + mem = ioremap(pci->pp.msg_res->start, pci->region_align); if (!mem) return -ENOMEM; -- GitLab From 50452704ecbad35a3e9239d88c3e48d438d3cc25 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Thu, 6 Feb 2025 10:46:59 +0100 Subject: [PATCH 0140/2211] jbd2: do not try to recover wiped journal [ Upstream commit a662f3c03b754e1f97a2781fa242e95bdb139798 ] If a journal is wiped, we will set journal->j_tail to 0. However if 'write' argument is not set (as it happens for read-only device or for ocfs2), the on-disk superblock is not updated accordingly and thus jbd2_journal_recover() cat try to recover the wiped journal. Fix the check in jbd2_journal_recover() to use journal->j_tail for checking empty journal instead. Signed-off-by: Jan Kara Reviewed-by: Zhang Yi Link: https://patch.msgid.link/20250206094657.20865-4-jack@suse.cz Signed-off-by: Theodore Ts'o Signed-off-by: Sasha Levin --- fs/jbd2/recovery.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c index 667f67342c522..f85f401526c54 100644 --- a/fs/jbd2/recovery.c +++ b/fs/jbd2/recovery.c @@ -287,19 +287,20 @@ static int fc_do_one_pass(journal_t *journal, int jbd2_journal_recover(journal_t *journal) { int err, err2; - journal_superblock_t * sb; - struct recovery_info info; memset(&info, 0, sizeof(info)); - sb = journal->j_superblock; /* * The journal superblock's s_start field (the current log head) * is always zero if, and only if, the journal was cleanly - * unmounted. + * unmounted. We use its in-memory version j_tail here because + * jbd2_journal_wipe() could have updated it without updating journal + * superblock. */ - if (!sb->s_start) { + if (!journal->j_tail) { + journal_superblock_t *sb = journal->j_superblock; + jbd2_debug(1, "No recovery required, last transaction %d, head block %u\n", be32_to_cpu(sb->s_sequence), be32_to_cpu(sb->s_head)); journal->j_transaction_sequence = be32_to_cpu(sb->s_sequence) + 1; -- GitLab From dab35f4921f854ba9ab92135c3cee56cfe2fb043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= Date: Wed, 5 Mar 2025 23:38:41 +0100 Subject: [PATCH 0141/2211] tcp: reorganize tcp_in_ack_event() and tcp_count_delivered() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 149dfb31615e22271d2525f078c95ea49bc4db24 ] - Move tcp_count_delivered() earlier and split tcp_count_delivered_ce() out of it - Move tcp_in_ack_event() later - While at it, remove the inline from tcp_in_ack_event() and let the compiler to decide Accurate ECN's heuristics does not know if there is going to be ACE field based CE counter increase or not until after rtx queue has been processed. Only then the number of ACKed bytes/pkts is available. As CE or not affects presence of FLAG_ECE, that information for tcp_in_ack_event is not yet available in the old location of the call to tcp_in_ack_event(). Signed-off-by: Ilpo Järvinen Signed-off-by: Chia-Yu Chang Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/ipv4/tcp_input.c | 56 +++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index d93a5a89c5692..d29219e067b7f 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -419,6 +419,20 @@ static bool tcp_ecn_rcv_ecn_echo(const struct tcp_sock *tp, const struct tcphdr return false; } +static void tcp_count_delivered_ce(struct tcp_sock *tp, u32 ecn_count) +{ + tp->delivered_ce += ecn_count; +} + +/* Updates the delivered and delivered_ce counts */ +static void tcp_count_delivered(struct tcp_sock *tp, u32 delivered, + bool ece_ack) +{ + tp->delivered += delivered; + if (ece_ack) + tcp_count_delivered_ce(tp, delivered); +} + /* Buffer size and advertised window tuning. * * 1. Tuning sk->sk_sndbuf, when connection enters established state. @@ -1154,15 +1168,6 @@ void tcp_mark_skb_lost(struct sock *sk, struct sk_buff *skb) } } -/* Updates the delivered and delivered_ce counts */ -static void tcp_count_delivered(struct tcp_sock *tp, u32 delivered, - bool ece_ack) -{ - tp->delivered += delivered; - if (ece_ack) - tp->delivered_ce += delivered; -} - /* This procedure tags the retransmission queue when SACKs arrive. * * We have three tag bits: SACKED(S), RETRANS(R) and LOST(L). @@ -3862,12 +3867,23 @@ static void tcp_process_tlp_ack(struct sock *sk, u32 ack, int flag) } } -static inline void tcp_in_ack_event(struct sock *sk, u32 flags) +static void tcp_in_ack_event(struct sock *sk, int flag) { const struct inet_connection_sock *icsk = inet_csk(sk); - if (icsk->icsk_ca_ops->in_ack_event) - icsk->icsk_ca_ops->in_ack_event(sk, flags); + if (icsk->icsk_ca_ops->in_ack_event) { + u32 ack_ev_flags = 0; + + if (flag & FLAG_WIN_UPDATE) + ack_ev_flags |= CA_ACK_WIN_UPDATE; + if (flag & FLAG_SLOWPATH) { + ack_ev_flags |= CA_ACK_SLOWPATH; + if (flag & FLAG_ECE) + ack_ev_flags |= CA_ACK_ECE; + } + + icsk->icsk_ca_ops->in_ack_event(sk, ack_ev_flags); + } } /* Congestion control has updated the cwnd already. So if we're in @@ -3984,12 +4000,8 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) tcp_snd_una_update(tp, ack); flag |= FLAG_WIN_UPDATE; - tcp_in_ack_event(sk, CA_ACK_WIN_UPDATE); - NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPHPACKS); } else { - u32 ack_ev_flags = CA_ACK_SLOWPATH; - if (ack_seq != TCP_SKB_CB(skb)->end_seq) flag |= FLAG_DATA; else @@ -4001,19 +4013,12 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una, &sack_state); - if (tcp_ecn_rcv_ecn_echo(tp, tcp_hdr(skb))) { + if (tcp_ecn_rcv_ecn_echo(tp, tcp_hdr(skb))) flag |= FLAG_ECE; - ack_ev_flags |= CA_ACK_ECE; - } if (sack_state.sack_delivered) tcp_count_delivered(tp, sack_state.sack_delivered, flag & FLAG_ECE); - - if (flag & FLAG_WIN_UPDATE) - ack_ev_flags |= CA_ACK_WIN_UPDATE; - - tcp_in_ack_event(sk, ack_ev_flags); } /* This is a deviation from RFC3168 since it states that: @@ -4040,6 +4045,8 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) tcp_rack_update_reo_wnd(sk, &rs); + tcp_in_ack_event(sk, flag); + if (tp->tlp_high_seq) tcp_process_tlp_ack(sk, ack, flag); @@ -4071,6 +4078,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) return 1; no_queue: + tcp_in_ack_event(sk, flag); /* If data was DSACKed, see if we can undo a cwnd reduction. */ if (flag & FLAG_DSACKING_ACK) { tcp_fastretrans_alert(sk, prior_snd_una, num_dupack, &flag, -- GitLab From a0d34b9be2bee42ae21d59153d21b3d1bf5b0d72 Mon Sep 17 00:00:00 2001 From: Alexandre Belloni Date: Thu, 6 Mar 2025 22:42:41 +0100 Subject: [PATCH 0142/2211] rtc: rv3032: fix EERD location [ Upstream commit b0f9cb4a0706b0356e84d67e48500b77b343debe ] EERD is bit 2 in CTRL1 Link: https://lore.kernel.org/r/20250306214243.1167692-1-alexandre.belloni@bootlin.com Signed-off-by: Alexandre Belloni Signed-off-by: Sasha Levin --- drivers/rtc/rtc-rv3032.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/rtc/rtc-rv3032.c b/drivers/rtc/rtc-rv3032.c index 35b2e36b426a0..cb01038a2e27f 100644 --- a/drivers/rtc/rtc-rv3032.c +++ b/drivers/rtc/rtc-rv3032.c @@ -69,7 +69,7 @@ #define RV3032_CLKOUT2_FD_MSK GENMASK(6, 5) #define RV3032_CLKOUT2_OS BIT(7) -#define RV3032_CTRL1_EERD BIT(3) +#define RV3032_CTRL1_EERD BIT(2) #define RV3032_CTRL1_WADA BIT(5) #define RV3032_CTRL2_STOP BIT(0) -- GitLab From 2585e6cbd96eb01ff3874b14512cb6d72abd8b64 Mon Sep 17 00:00:00 2001 From: Josh Poimboeuf Date: Fri, 14 Mar 2025 12:29:00 -0700 Subject: [PATCH 0143/2211] objtool: Fix error handling inconsistencies in check() [ Upstream commit b745962cb97569aad026806bb0740663cf813147 ] Make sure all fatal errors are funneled through the 'out' label with a negative ret. Signed-off-by: Josh Poimboeuf Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Brendan Jackman Link: https://lore.kernel.org/r/0f49d6a27a080b4012e84e6df1e23097f44cc082.1741975349.git.jpoimboe@kernel.org Signed-off-by: Sasha Levin --- tools/objtool/check.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 0757b98b0a445..4fce0074076f3 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -4758,8 +4758,10 @@ int check(struct objtool_file *file) init_cfi_state(&force_undefined_cfi); force_undefined_cfi.force_undefined = true; - if (!cfi_hash_alloc(1UL << (file->elf->symbol_bits - 3))) + if (!cfi_hash_alloc(1UL << (file->elf->symbol_bits - 3))) { + ret = -1; goto out; + } cfi_hash_add(&init_cfi); cfi_hash_add(&func_cfi); @@ -4776,7 +4778,7 @@ int check(struct objtool_file *file) if (opts.retpoline) { ret = validate_retpoline(file); if (ret < 0) - return ret; + goto out; warnings += ret; } @@ -4812,7 +4814,7 @@ int check(struct objtool_file *file) */ ret = validate_unrets(file); if (ret < 0) - return ret; + goto out; warnings += ret; } @@ -4875,7 +4877,7 @@ int check(struct objtool_file *file) if (opts.prefix) { ret = add_prefix_symbols(file); if (ret < 0) - return ret; + goto out; warnings += ret; } -- GitLab From c8c643809f4a167cb2ec8cb80a768ac86b5433c5 Mon Sep 17 00:00:00 2001 From: Mika Westerberg Date: Wed, 5 Mar 2025 14:56:20 +0200 Subject: [PATCH 0144/2211] thunderbolt: Do not add non-active NVM if NVM upgrade is disabled for retimer [ Upstream commit ad79c278e478ca8c1a3bf8e7a0afba8f862a48a1 ] This is only used to write a new NVM in order to upgrade the retimer firmware. It does not make sense to expose it if upgrade is disabled. This also makes it consistent with the router NVM upgrade. Signed-off-by: Mika Westerberg Signed-off-by: Sasha Levin --- drivers/thunderbolt/retimer.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/thunderbolt/retimer.c b/drivers/thunderbolt/retimer.c index eeb64433ebbca..3488be7620674 100644 --- a/drivers/thunderbolt/retimer.c +++ b/drivers/thunderbolt/retimer.c @@ -93,9 +93,11 @@ static int tb_retimer_nvm_add(struct tb_retimer *rt) if (ret) goto err_nvm; - ret = tb_nvm_add_non_active(nvm, nvm_write); - if (ret) - goto err_nvm; + if (!rt->no_nvm_upgrade) { + ret = tb_nvm_add_non_active(nvm, nvm_write); + if (ret) + goto err_nvm; + } rt->nvm = nvm; dev_dbg(&rt->dev, "NVM version %x.%x\n", nvm->major, nvm->minor); -- GitLab From b35ccfdc8573e4f130fcb4573e5980bc0ac5c4be Mon Sep 17 00:00:00 2001 From: Gao Xiang Date: Mon, 17 Mar 2025 13:48:40 +0800 Subject: [PATCH 0145/2211] erofs: initialize decompression early [ Upstream commit fe1e57d44d7f106df9048e815e4862cf63921220 ] - Rename erofs_init_managed_cache() to z_erofs_init_super(); - Move the initialization of managed_pslots into z_erofs_init_super() too; - Move z_erofs_init_super() and packed inode preparation upwards, before the root inode initialization. Therefore, the root directory can also be compressible. Signed-off-by: Gao Xiang Acked-by: Chao Yu Link: https://lore.kernel.org/r/20250317054840.3483000-1-hsiangkao@linux.alibaba.com Signed-off-by: Sasha Levin --- fs/erofs/internal.h | 4 ++-- fs/erofs/super.c | 46 ++++++++++++++++++++++----------------------- fs/erofs/zdata.c | 4 ++-- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index edbabb3256c9a..2c11e8f3048e9 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -453,6 +453,7 @@ int __init erofs_init_shrinker(void); void erofs_exit_shrinker(void); int __init z_erofs_init_subsystem(void); void z_erofs_exit_subsystem(void); +int z_erofs_init_super(struct super_block *sb); unsigned long z_erofs_shrink_scan(struct erofs_sb_info *sbi, unsigned long nr_shrink); int z_erofs_map_blocks_iter(struct inode *inode, struct erofs_map_blocks *map, @@ -462,7 +463,6 @@ void z_erofs_put_gbuf(void *ptr); int z_erofs_gbuf_growsize(unsigned int nrpages); int __init z_erofs_gbuf_init(void); void z_erofs_gbuf_exit(void); -int erofs_init_managed_cache(struct super_block *sb); int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb); #else static inline void erofs_shrinker_register(struct super_block *sb) {} @@ -471,7 +471,7 @@ static inline int erofs_init_shrinker(void) { return 0; } static inline void erofs_exit_shrinker(void) {} static inline int z_erofs_init_subsystem(void) { return 0; } static inline void z_erofs_exit_subsystem(void) {} -static inline int erofs_init_managed_cache(struct super_block *sb) { return 0; } +static inline int z_erofs_init_super(struct super_block *sb) { return 0; } #endif /* !CONFIG_EROFS_FS_ZIP */ #ifdef CONFIG_EROFS_FS_BACKED_BY_FILE diff --git a/fs/erofs/super.c b/fs/erofs/super.c index 5b279977c9d5d..3421448fef0e3 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -664,9 +664,16 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc) else sb->s_flags &= ~SB_POSIXACL; -#ifdef CONFIG_EROFS_FS_ZIP - xa_init(&sbi->managed_pslots); -#endif + err = z_erofs_init_super(sb); + if (err) + return err; + + if (erofs_sb_has_fragments(sbi) && sbi->packed_nid) { + inode = erofs_iget(sb, sbi->packed_nid); + if (IS_ERR(inode)) + return PTR_ERR(inode); + sbi->packed_inode = inode; + } inode = erofs_iget(sb, sbi->root_nid); if (IS_ERR(inode)) @@ -678,24 +685,11 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc) iput(inode); return -EINVAL; } - sb->s_root = d_make_root(inode); if (!sb->s_root) return -ENOMEM; erofs_shrinker_register(sb); - if (erofs_sb_has_fragments(sbi) && sbi->packed_nid) { - sbi->packed_inode = erofs_iget(sb, sbi->packed_nid); - if (IS_ERR(sbi->packed_inode)) { - err = PTR_ERR(sbi->packed_inode); - sbi->packed_inode = NULL; - return err; - } - } - err = erofs_init_managed_cache(sb); - if (err) - return err; - err = erofs_xattr_prefixes_init(sb); if (err) return err; @@ -831,6 +825,16 @@ static int erofs_init_fs_context(struct fs_context *fc) return 0; } +static void erofs_drop_internal_inodes(struct erofs_sb_info *sbi) +{ + iput(sbi->packed_inode); + sbi->packed_inode = NULL; +#ifdef CONFIG_EROFS_FS_ZIP + iput(sbi->managed_cache); + sbi->managed_cache = NULL; +#endif +} + static void erofs_kill_sb(struct super_block *sb) { struct erofs_sb_info *sbi = EROFS_SB(sb); @@ -840,6 +844,7 @@ static void erofs_kill_sb(struct super_block *sb) kill_anon_super(sb); else kill_block_super(sb); + erofs_drop_internal_inodes(sbi); fs_put_dax(sbi->dif0.dax_dev, NULL); erofs_fscache_unregister_fs(sb); erofs_sb_free(sbi); @@ -850,17 +855,10 @@ static void erofs_put_super(struct super_block *sb) { struct erofs_sb_info *const sbi = EROFS_SB(sb); - DBG_BUGON(!sbi); - erofs_unregister_sysfs(sb); erofs_shrinker_unregister(sb); erofs_xattr_prefixes_cleanup(sb); -#ifdef CONFIG_EROFS_FS_ZIP - iput(sbi->managed_cache); - sbi->managed_cache = NULL; -#endif - iput(sbi->packed_inode); - sbi->packed_inode = NULL; + erofs_drop_internal_inodes(sbi); erofs_free_dev_context(sbi->devs); sbi->devs = NULL; erofs_fscache_unregister_fs(sb); diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c index e5e94afc5af88..74521d7dbee1d 100644 --- a/fs/erofs/zdata.c +++ b/fs/erofs/zdata.c @@ -663,18 +663,18 @@ static const struct address_space_operations z_erofs_cache_aops = { .invalidate_folio = z_erofs_cache_invalidate_folio, }; -int erofs_init_managed_cache(struct super_block *sb) +int z_erofs_init_super(struct super_block *sb) { struct inode *const inode = new_inode(sb); if (!inode) return -ENOMEM; - set_nlink(inode, 1); inode->i_size = OFFSET_MAX; inode->i_mapping->a_ops = &z_erofs_cache_aops; mapping_set_gfp_mask(inode->i_mapping, GFP_KERNEL); EROFS_SB(sb)->managed_cache = inode; + xa_init(&EROFS_SB(sb)->managed_pslots); return 0; } -- GitLab From 0076b0423b2cd799cccd527d6d2dd4824f03be70 Mon Sep 17 00:00:00 2001 From: Sergio Perez Gonzalez Date: Sat, 15 Mar 2025 23:46:06 -0600 Subject: [PATCH 0146/2211] spi: spi-mux: Fix coverity issue, unchecked return value [ Upstream commit 5a5fc308418aca275a898d638bc38c093d101855 ] The return value of spi_setup() is not captured within spi_mux_select() and it is assumed to be always success. CID: 1638374 Signed-off-by: Sergio Perez Gonzalez Link: https://patch.msgid.link/20250316054651.13242-1-sperezglz@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-mux.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/spi/spi-mux.c b/drivers/spi/spi-mux.c index c02c4204442f5..0eb35c4e3987e 100644 --- a/drivers/spi/spi-mux.c +++ b/drivers/spi/spi-mux.c @@ -68,9 +68,7 @@ static int spi_mux_select(struct spi_device *spi) priv->current_cs = spi_get_chipselect(spi, 0); - spi_setup(priv->spi); - - return 0; + return spi_setup(priv->spi); } static int spi_mux_setup(struct spi_device *spi) -- GitLab From e8358aa00ea7b7da60b840a5d817d56d5ee70d4a Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Wed, 12 Mar 2025 14:31:52 +0100 Subject: [PATCH 0147/2211] ASoC: pcm6240: Drop bogus code handling IRQ as GPIO [ Upstream commit 17fdf318f5fbe5c27353ae917c0c5a2899d9c259 ] The current code for the IRQ in pcm6240 makes no sense: it looks up an IRQ with of_irq_get(), treat it as a GPIO by issuing gpio_request(), gpio_direction_input() and gpio_to_irq() on it. This is just wrong, if the device tree assigns the IRQ from a GPIO number this is just incorrect: it is clearly stated that GPIO providers and IRQ providers are orthogonal. It is possible to look up an IRQ to a corresponding GPIO line but this is taking an IRQ and pretending it's a GPIO, which is just semantically wrong. Drop the offending code and treat the IRQ that we get from the device tree as any other IRQ, see for example other codec drivers. The DT bindings for this codec does not have any in-tree DTS files, which may explain why things are weird. As a bonus, this moves the driver away from the legacy include. Signed-off-by: Linus Walleij Link: https://patch.msgid.link/20250312-pcm-codecs-v1-3-41ffc4f8fc5c@linaro.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/pcm6240.c | 28 +++++++--------------------- sound/soc/codecs/pcm6240.h | 7 +------ 2 files changed, 8 insertions(+), 27 deletions(-) diff --git a/sound/soc/codecs/pcm6240.c b/sound/soc/codecs/pcm6240.c index 5d99877f88397..e59bb77edf091 100644 --- a/sound/soc/codecs/pcm6240.c +++ b/sound/soc/codecs/pcm6240.c @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include #include @@ -2035,10 +2035,8 @@ static const struct regmap_config pcmdevice_i2c_regmap = { static void pcmdevice_remove(struct pcmdevice_priv *pcm_dev) { - if (gpio_is_valid(pcm_dev->irq_info.gpio)) { - gpio_free(pcm_dev->irq_info.gpio); - free_irq(pcm_dev->irq_info.nmb, pcm_dev); - } + if (pcm_dev->irq) + free_irq(pcm_dev->irq, pcm_dev); mutex_destroy(&pcm_dev->codec_lock); } @@ -2110,7 +2108,7 @@ static int pcmdevice_i2c_probe(struct i2c_client *i2c) ndev = 1; dev_addrs[0] = i2c->addr; } - pcm_dev->irq_info.gpio = of_irq_get(np, 0); + pcm_dev->irq = of_irq_get(np, 0); for (i = 0; i < ndev; i++) pcm_dev->addr[i] = dev_addrs[i]; @@ -2133,22 +2131,10 @@ static int pcmdevice_i2c_probe(struct i2c_client *i2c) if (pcm_dev->chip_id == PCM1690) goto skip_interrupt; - if (gpio_is_valid(pcm_dev->irq_info.gpio)) { - dev_dbg(pcm_dev->dev, "irq-gpio = %d", pcm_dev->irq_info.gpio); - - ret = gpio_request(pcm_dev->irq_info.gpio, "PCMDEV-IRQ"); - if (!ret) { - int gpio = pcm_dev->irq_info.gpio; - - gpio_direction_input(gpio); - pcm_dev->irq_info.nmb = gpio_to_irq(gpio); - - } else - dev_err(pcm_dev->dev, "%s: GPIO %d request error\n", - __func__, pcm_dev->irq_info.gpio); + if (pcm_dev->irq) { + dev_dbg(pcm_dev->dev, "irq = %d", pcm_dev->irq); } else - dev_err(pcm_dev->dev, "Looking up irq-gpio failed %d\n", - pcm_dev->irq_info.gpio); + dev_err(pcm_dev->dev, "No irq provided\n"); skip_interrupt: ret = devm_snd_soc_register_component(&i2c->dev, diff --git a/sound/soc/codecs/pcm6240.h b/sound/soc/codecs/pcm6240.h index 1e125bb972860..2d8f9e798139a 100644 --- a/sound/soc/codecs/pcm6240.h +++ b/sound/soc/codecs/pcm6240.h @@ -208,11 +208,6 @@ struct pcmdevice_regbin { struct pcmdevice_config_info **cfg_info; }; -struct pcmdevice_irqinfo { - int gpio; - int nmb; -}; - struct pcmdevice_priv { struct snd_soc_component *component; struct i2c_client *client; @@ -221,7 +216,7 @@ struct pcmdevice_priv { struct gpio_desc *hw_rst; struct regmap *regmap; struct pcmdevice_regbin regbin; - struct pcmdevice_irqinfo irq_info; + int irq; unsigned int addr[PCMDEVICE_MAX_I2C_DEVICES]; unsigned int chip_id; int cur_conf; -- GitLab From 6c303960b14434bb029fb511a1e0fdf8758819d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=ADcolas=20F=2E=20R=2E=20A=2E=20Prado?= Date: Thu, 6 Mar 2025 16:52:17 -0300 Subject: [PATCH 0148/2211] ASoC: mediatek: mt6359: Add stub for mt6359_accdet_enable_jack_detect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 0116a7d84b32537a10d9bea1fd1bfc06577ef527 ] Add a stub for mt6359_accdet_enable_jack_detect() to prevent linker failures in the machine sound drivers calling it when CONFIG_SND_SOC_MT6359_ACCDET is not enabled. Suggested-by: AngeloGioacchino Del Regno Signed-off-by: Nícolas F. R. A. Prado Link: https://patch.msgid.link/20250306-mt8188-accdet-v3-3-7828e835ff4b@collabora.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/mt6359-accdet.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sound/soc/codecs/mt6359-accdet.h b/sound/soc/codecs/mt6359-accdet.h index c234f2f4276a1..78ada3a5bfae5 100644 --- a/sound/soc/codecs/mt6359-accdet.h +++ b/sound/soc/codecs/mt6359-accdet.h @@ -123,6 +123,15 @@ struct mt6359_accdet { struct workqueue_struct *jd_workqueue; }; +#if IS_ENABLED(CONFIG_SND_SOC_MT6359_ACCDET) int mt6359_accdet_enable_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *jack); +#else +static inline int +mt6359_accdet_enable_jack_detect(struct snd_soc_component *component, + struct snd_soc_jack *jack) +{ + return -EOPNOTSUPP; +} +#endif #endif -- GitLab From 555c0b713ca83968d3c843cb15485b9ba3367b1b Mon Sep 17 00:00:00 2001 From: Yonghong Song Date: Mon, 24 Feb 2025 15:01:16 -0800 Subject: [PATCH 0149/2211] bpf: Allow pre-ordering for bpf cgroup progs [ Upstream commit 4b82b181a26cff8bf7adc3a85a88d121d92edeaf ] Currently for bpf progs in a cgroup hierarchy, the effective prog array is computed from bottom cgroup to upper cgroups (post-ordering). For example, the following cgroup hierarchy root cgroup: p1, p2 subcgroup: p3, p4 have BPF_F_ALLOW_MULTI for both cgroup levels. The effective cgroup array ordering looks like p3 p4 p1 p2 and at run time, progs will execute based on that order. But in some cases, it is desirable to have root prog executes earlier than children progs (pre-ordering). For example, - prog p1 intends to collect original pkt dest addresses. - prog p3 will modify original pkt dest addresses to a proxy address for security reason. The end result is that prog p1 gets proxy address which is not what it wants. Putting p1 to every child cgroup is not desirable either as it will duplicate itself in many child cgroups. And this is exactly a use case we are encountering in Meta. To fix this issue, let us introduce a flag BPF_F_PREORDER. If the flag is specified at attachment time, the prog has higher priority and the ordering with that flag will be from top to bottom (pre-ordering). For example, in the above example, root cgroup: p1, p2 subcgroup: p3, p4 Let us say p2 and p4 are marked with BPF_F_PREORDER. The final effective array ordering will be p2 p4 p3 p1 Suggested-by: Andrii Nakryiko Acked-by: Andrii Nakryiko Signed-off-by: Yonghong Song Link: https://lore.kernel.org/r/20250224230116.283071-1-yonghong.song@linux.dev Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- include/linux/bpf-cgroup.h | 1 + include/uapi/linux/bpf.h | 1 + kernel/bpf/cgroup.c | 33 +++++++++++++++++++++++++-------- kernel/bpf/syscall.c | 3 ++- tools/include/uapi/linux/bpf.h | 1 + 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/include/linux/bpf-cgroup.h b/include/linux/bpf-cgroup.h index ce91d9b2acb9f..7e029c82ae45f 100644 --- a/include/linux/bpf-cgroup.h +++ b/include/linux/bpf-cgroup.h @@ -111,6 +111,7 @@ struct bpf_prog_list { struct bpf_prog *prog; struct bpf_cgroup_link *link; struct bpf_cgroup_storage *storage[MAX_BPF_CGROUP_STORAGE_TYPE]; + u32 flags; }; int cgroup_bpf_inherit(struct cgroup *cgrp); diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 4a939c90dc2e4..552fd633f8200 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -1206,6 +1206,7 @@ enum bpf_perf_event_type { #define BPF_F_BEFORE (1U << 3) #define BPF_F_AFTER (1U << 4) #define BPF_F_ID (1U << 5) +#define BPF_F_PREORDER (1U << 6) #define BPF_F_LINK BPF_F_LINK /* 1 << 13 */ /* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c index 025d7e2214aeb..c0d606c40195d 100644 --- a/kernel/bpf/cgroup.c +++ b/kernel/bpf/cgroup.c @@ -369,7 +369,7 @@ static struct bpf_prog *prog_list_prog(struct bpf_prog_list *pl) /* count number of elements in the list. * it's slow but the list cannot be long */ -static u32 prog_list_length(struct hlist_head *head) +static u32 prog_list_length(struct hlist_head *head, int *preorder_cnt) { struct bpf_prog_list *pl; u32 cnt = 0; @@ -377,6 +377,8 @@ static u32 prog_list_length(struct hlist_head *head) hlist_for_each_entry(pl, head, node) { if (!prog_list_prog(pl)) continue; + if (preorder_cnt && (pl->flags & BPF_F_PREORDER)) + (*preorder_cnt)++; cnt++; } return cnt; @@ -400,7 +402,7 @@ static bool hierarchy_allows_attach(struct cgroup *cgrp, if (flags & BPF_F_ALLOW_MULTI) return true; - cnt = prog_list_length(&p->bpf.progs[atype]); + cnt = prog_list_length(&p->bpf.progs[atype], NULL); WARN_ON_ONCE(cnt > 1); if (cnt == 1) return !!(flags & BPF_F_ALLOW_OVERRIDE); @@ -423,12 +425,12 @@ static int compute_effective_progs(struct cgroup *cgrp, struct bpf_prog_array *progs; struct bpf_prog_list *pl; struct cgroup *p = cgrp; - int cnt = 0; + int i, j, cnt = 0, preorder_cnt = 0, fstart, bstart, init_bstart; /* count number of effective programs by walking parents */ do { if (cnt == 0 || (p->bpf.flags[atype] & BPF_F_ALLOW_MULTI)) - cnt += prog_list_length(&p->bpf.progs[atype]); + cnt += prog_list_length(&p->bpf.progs[atype], &preorder_cnt); p = cgroup_parent(p); } while (p); @@ -439,20 +441,34 @@ static int compute_effective_progs(struct cgroup *cgrp, /* populate the array with effective progs */ cnt = 0; p = cgrp; + fstart = preorder_cnt; + bstart = preorder_cnt - 1; do { if (cnt > 0 && !(p->bpf.flags[atype] & BPF_F_ALLOW_MULTI)) continue; + init_bstart = bstart; hlist_for_each_entry(pl, &p->bpf.progs[atype], node) { if (!prog_list_prog(pl)) continue; - item = &progs->items[cnt]; + if (pl->flags & BPF_F_PREORDER) { + item = &progs->items[bstart]; + bstart--; + } else { + item = &progs->items[fstart]; + fstart++; + } item->prog = prog_list_prog(pl); bpf_cgroup_storages_assign(item->cgroup_storage, pl->storage); cnt++; } + + /* reverse pre-ordering progs at this cgroup level */ + for (i = bstart + 1, j = init_bstart; i < j; i++, j--) + swap(progs->items[i], progs->items[j]); + } while ((p = cgroup_parent(p))); *array = progs; @@ -663,7 +679,7 @@ static int __cgroup_bpf_attach(struct cgroup *cgrp, */ return -EPERM; - if (prog_list_length(progs) >= BPF_CGROUP_MAX_PROGS) + if (prog_list_length(progs, NULL) >= BPF_CGROUP_MAX_PROGS) return -E2BIG; pl = find_attach_entry(progs, prog, link, replace_prog, @@ -698,6 +714,7 @@ static int __cgroup_bpf_attach(struct cgroup *cgrp, pl->prog = prog; pl->link = link; + pl->flags = flags; bpf_cgroup_storages_assign(pl->storage, storage); cgrp->bpf.flags[atype] = saved_flags; @@ -1073,7 +1090,7 @@ static int __cgroup_bpf_query(struct cgroup *cgrp, const union bpf_attr *attr, lockdep_is_held(&cgroup_mutex)); total_cnt += bpf_prog_array_length(effective); } else { - total_cnt += prog_list_length(&cgrp->bpf.progs[atype]); + total_cnt += prog_list_length(&cgrp->bpf.progs[atype], NULL); } } @@ -1105,7 +1122,7 @@ static int __cgroup_bpf_query(struct cgroup *cgrp, const union bpf_attr *attr, u32 id; progs = &cgrp->bpf.progs[atype]; - cnt = min_t(int, prog_list_length(progs), total_cnt); + cnt = min_t(int, prog_list_length(progs, NULL), total_cnt); i = 0; hlist_for_each_entry(pl, progs, node) { prog = prog_list_prog(pl); diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index fc048d3c0e69f..ab74a226e3d6d 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -4042,7 +4042,8 @@ static int bpf_prog_attach_check_attach_type(const struct bpf_prog *prog, #define BPF_F_ATTACH_MASK_BASE \ (BPF_F_ALLOW_OVERRIDE | \ BPF_F_ALLOW_MULTI | \ - BPF_F_REPLACE) + BPF_F_REPLACE | \ + BPF_F_PREORDER) #define BPF_F_ATTACH_MASK_MPROG \ (BPF_F_REPLACE | \ diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 4a939c90dc2e4..552fd633f8200 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -1206,6 +1206,7 @@ enum bpf_perf_event_type { #define BPF_F_BEFORE (1U << 3) #define BPF_F_AFTER (1U << 4) #define BPF_F_ID (1U << 5) +#define BPF_F_PREORDER (1U << 6) #define BPF_F_LINK BPF_F_LINK /* 1 << 13 */ /* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the -- GitLab From 61d7c8a75344588af1b7d2cb22150d2b1261e07a Mon Sep 17 00:00:00 2001 From: Seyediman Seyedarab Date: Sat, 1 Mar 2025 17:21:37 -0500 Subject: [PATCH 0150/2211] kbuild: fix argument parsing in scripts/config [ Upstream commit f757f6011c92b5a01db742c39149bed9e526478f ] The script previously assumed --file was always the first argument, which caused issues when it appeared later. This patch updates the parsing logic to scan all arguments to find --file, sets the config file correctly, and resets the argument list with the remaining commands. It also fixes --refresh to respect --file by passing KCONFIG_CONFIG=$FN to make oldconfig. Signed-off-by: Seyediman Seyedarab Signed-off-by: Masahiro Yamada Signed-off-by: Sasha Levin --- scripts/config | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/scripts/config b/scripts/config index ff88e2faefd35..ea475c07de283 100755 --- a/scripts/config +++ b/scripts/config @@ -32,6 +32,7 @@ commands: Disable option directly after other option --module-after|-M beforeopt option Turn option into module directly after other option + --refresh Refresh the config using old settings commands can be repeated multiple times @@ -124,16 +125,22 @@ undef_var() { txt_delete "^# $name is not set" "$FN" } -if [ "$1" = "--file" ]; then - FN="$2" - if [ "$FN" = "" ] ; then - usage +FN=.config +CMDS=() +while [[ $# -gt 0 ]]; do + if [ "$1" = "--file" ]; then + if [ "$2" = "" ]; then + usage + fi + FN="$2" + shift 2 + else + CMDS+=("$1") + shift fi - shift 2 -else - FN=.config -fi +done +set -- "${CMDS[@]}" if [ "$1" = "" ] ; then usage fi @@ -217,9 +224,8 @@ while [ "$1" != "" ] ; do set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A" ;; - # undocumented because it ignores --file (fixme) --refresh) - yes "" | make oldconfig + yes "" | make oldconfig KCONFIG_CONFIG=$FN ;; *) -- GitLab From 572ed3fb99c4ea267fe7afdd96fab2263e49cc7f Mon Sep 17 00:00:00 2001 From: Masahiro Yamada Date: Sat, 8 Feb 2025 03:41:55 +0900 Subject: [PATCH 0151/2211] kconfig: do not clear SYMBOL_VALID when reading include/config/auto.conf [ Upstream commit 226ac19c217f24f0927d0a73cf9ee613971a188d ] When conf_read_simple() is called with S_DEF_AUTO, it is meant to read previous symbol values from include/config/auto.conf to determine which include/config/* files should be touched. This process should not modify the current symbol status in any way. However, conf_touch_deps() currently invalidates all symbol values and recalculates them, which is totally unneeded. Signed-off-by: Masahiro Yamada Signed-off-by: Sasha Levin --- scripts/kconfig/confdata.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 3b55e7a4131d9..ac95661a1c9dd 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -385,7 +385,7 @@ load: def_flags = SYMBOL_DEF << def; for_all_symbols(sym) { - sym->flags &= ~(def_flags|SYMBOL_VALID); + sym->flags &= ~def_flags; switch (sym->type) { case S_INT: case S_HEX: @@ -398,7 +398,11 @@ load: } } - expr_invalidate_all(); + if (def == S_DEF_USER) { + for_all_symbols(sym) + sym->flags &= ~SYMBOL_VALID; + expr_invalidate_all(); + } while (getline_stripped(&line, &line_asize, in) != -1) { struct menu *choice; @@ -464,6 +468,9 @@ load: if (conf_set_sym_val(sym, def, def_flags, val)) continue; + if (def != S_DEF_USER) + continue; + /* * If this is a choice member, give it the highest priority. * If conflicting CONFIG options are given from an input file, @@ -967,10 +974,8 @@ static int conf_touch_deps(void) depfile_path[depfile_prefix_len] = 0; conf_read_simple(name, S_DEF_AUTO); - sym_calc_value(modules_sym); for_all_symbols(sym) { - sym_calc_value(sym); if (sym_is_choice(sym)) continue; if (sym->flags & SYMBOL_WRITE) { @@ -1084,12 +1089,12 @@ int conf_write_autoconf(int overwrite) if (ret) return -1; - if (conf_touch_deps()) - return 1; - for_all_symbols(sym) sym_calc_value(sym); + if (conf_touch_deps()) + return 1; + ret = __conf_write_autoconf(conf_get_autoheader_name(), print_symbol_for_c, &comment_style_c); -- GitLab From ee87fc3a1271fa50a1b6cb5523bc10f4f5d9ad38 Mon Sep 17 00:00:00 2001 From: Shashank Gupta Date: Wed, 5 Mar 2025 13:27:05 +0530 Subject: [PATCH 0152/2211] crypto: octeontx2 - suppress auth failure screaming due to negative tests [ Upstream commit 64b7871522a4cba99d092e1c849d6f9092868aaa ] This patch addresses an issue where authentication failures were being erroneously reported due to negative test failures in the "ccm(aes)" selftest. pr_debug suppress unnecessary screaming of these tests. Signed-off-by: Shashank Gupta Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- drivers/crypto/marvell/octeontx2/otx2_cptvf_reqmgr.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/crypto/marvell/octeontx2/otx2_cptvf_reqmgr.c b/drivers/crypto/marvell/octeontx2/otx2_cptvf_reqmgr.c index 5387c68f3c9df..4262441070372 100644 --- a/drivers/crypto/marvell/octeontx2/otx2_cptvf_reqmgr.c +++ b/drivers/crypto/marvell/octeontx2/otx2_cptvf_reqmgr.c @@ -264,9 +264,10 @@ static int cpt_process_ccode(struct otx2_cptlfs_info *lfs, break; } - dev_err(&pdev->dev, - "Request failed with software error code 0x%x\n", - cpt_status->s.uc_compcode); + pr_debug("Request failed with software error code 0x%x: algo = %s driver = %s\n", + cpt_status->s.uc_compcode, + info->req->areq->tfm->__crt_alg->cra_name, + info->req->areq->tfm->__crt_alg->cra_driver_name); otx2_cpt_dump_sg_list(pdev, info->req); break; } -- GitLab From 174dedce648aaad39e4a9d514a7d73dc06786b64 Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Fri, 14 Mar 2025 13:51:32 +0100 Subject: [PATCH 0153/2211] dm: restrict dm device size to 2^63-512 bytes [ Upstream commit 45fc728515c14f53f6205789de5bfd72a95af3b8 ] The devices with size >= 2^63 bytes can't be used reliably by userspace because the type off_t is a signed 64-bit integer. Therefore, we limit the maximum size of a device mapper device to 2^63-512 bytes. Signed-off-by: Mikulas Patocka Signed-off-by: Sasha Levin --- drivers/md/dm-table.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 3dc5bc3d29d64..883f01e78324f 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -698,6 +698,10 @@ int dm_table_add_target(struct dm_table *t, const char *type, DMERR("%s: zero-length target", dm_device_name(t->md)); return -EINVAL; } + if (start + len < start || start + len > LLONG_MAX >> SECTOR_SHIFT) { + DMERR("%s: too large device", dm_device_name(t->md)); + return -EINVAL; + } ti->type = dm_get_target_type(type); if (!ti->type) { -- GitLab From 8ef935698f3fd422db0c010ce392d035125211f9 Mon Sep 17 00:00:00 2001 From: Guangguan Wang Date: Tue, 4 Mar 2025 20:43:04 +0800 Subject: [PATCH 0154/2211] net/smc: use the correct ndev to find pnetid by pnetid table [ Upstream commit bfc6c67ec2d64d0ca4e5cc3e1ac84298a10b8d62 ] When using smc_pnet in SMC, it will only search the pnetid in the base_ndev of the netdev hierarchy(both HW PNETID and User-defined sw pnetid). This may not work for some scenarios when using SMC in container on cloud environment. In container, there have choices of different container network, such as directly using host network, virtual network IPVLAN, veth, etc. Different choices of container network have different netdev hierarchy. Examples of netdev hierarchy show below. (eth0 and eth1 in host below is the netdev directly related to the physical device). _______________________________ | _________________ | | |POD | | | | | | | | eth0_________ | | | |____| |__| | | | | | | | | | | eth1|base_ndev| eth0_______ | | | | | RDMA || | host |_________| |_______|| --------------------------------- netdev hierarchy if directly using host network ________________________________ | _________________ | | |POD __________ | | | | |upper_ndev| | | | |eth0|__________| | | | |_______|_________| | | |lower netdev | | __|______ | | eth1| | eth0_______ | | |base_ndev| | RDMA || | host |_________| |_______|| --------------------------------- netdev hierarchy if using IPVLAN _______________________________ | _____________________ | | |POD _________ | | | | |base_ndev|| | | |eth0(veth)|_________|| | | |____________|________| | | |pairs | | _______|_ | | | | eth0_______ | | veth|base_ndev| | RDMA || | |_________| |_______|| | _________ | | eth1|base_ndev| | | host |_________| | --------------------------------- netdev hierarchy if using veth Due to some reasons, the eth1 in host is not RDMA attached netdevice, pnetid is needed to map the eth1(in host) with RDMA device so that POD can do SMC-R. Because the eth1(in host) is managed by CNI plugin(such as Terway, network management plugin in container environment), and in cloud environment the eth(in host) can dynamically be inserted by CNI when POD create and dynamically be removed by CNI when POD destroy and no POD related to the eth(in host) anymore. It is hard to config the pnetid to the eth1(in host). But it is easy to config the pnetid to the netdevice which can be seen in POD. When do SMC-R, both the container directly using host network and the container using veth network can successfully match the RDMA device, because the configured pnetid netdev is a base_ndev. But the container using IPVLAN can not successfully match the RDMA device and 0x03030000 fallback happens, because the configured pnetid netdev is not a base_ndev. Additionally, if config pnetid to the eth1(in host) also can not work for matching RDMA device when using veth network and doing SMC-R in POD. To resolve the problems list above, this patch extends to search user -defined sw pnetid in the clc handshake ndev when no pnetid can be found in the base_ndev, and the base_ndev take precedence over ndev for backward compatibility. This patch also can unify the pnetid setup of different network choices list above in container(Config user-defined sw pnetid in the netdevice can be seen in POD). Signed-off-by: Guangguan Wang Reviewed-by: Wenjia Zhang Reviewed-by: Halil Pasic Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/smc/smc_pnet.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/net/smc/smc_pnet.c b/net/smc/smc_pnet.c index 716808f374a8d..b391c2ef463f2 100644 --- a/net/smc/smc_pnet.c +++ b/net/smc/smc_pnet.c @@ -1079,14 +1079,16 @@ static void smc_pnet_find_roce_by_pnetid(struct net_device *ndev, struct smc_init_info *ini) { u8 ndev_pnetid[SMC_MAX_PNETID_LEN]; + struct net_device *base_ndev; struct net *net; - ndev = pnet_find_base_ndev(ndev); + base_ndev = pnet_find_base_ndev(ndev); net = dev_net(ndev); - if (smc_pnetid_by_dev_port(ndev->dev.parent, ndev->dev_port, + if (smc_pnetid_by_dev_port(base_ndev->dev.parent, base_ndev->dev_port, ndev_pnetid) && + smc_pnet_find_ndev_pnetid_by_table(base_ndev, ndev_pnetid) && smc_pnet_find_ndev_pnetid_by_table(ndev, ndev_pnetid)) { - smc_pnet_find_rdma_dev(ndev, ini); + smc_pnet_find_rdma_dev(base_ndev, ini); return; /* pnetid could not be determined */ } _smc_pnet_find_roce_by_pnetid(ndev_pnetid, ini, NULL, net); -- GitLab From f5363ffdabc2a281bd0023584944e3d0c25dfcd3 Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Thu, 27 Feb 2025 14:50:15 +0000 Subject: [PATCH 0155/2211] xen: Add support for XenServer 6.1 platform device [ Upstream commit 2356f15caefc0cc63d9cc5122641754f76ef9b25 ] On XenServer on Windows machine a platform device with ID 2 instead of 1 is used. This device is mainly identical to device 1 but due to some Windows update behaviour it was decided to use a device with a different ID. This causes compatibility issues with Linux which expects, if Xen is detected, to find a Xen platform device (5853:0001) otherwise code will crash due to some missing initialization (specifically grant tables). Specifically from dmesg RIP: 0010:gnttab_expand+0x29/0x210 Code: 90 0f 1f 44 00 00 55 31 d2 48 89 e5 41 57 41 56 41 55 41 89 fd 41 54 53 48 83 ec 10 48 8b 05 7e 9a 49 02 44 8b 35 a7 9a 49 02 <8b> 48 04 8d 44 39 ff f7 f1 45 8d 24 06 89 c3 e8 43 fe ff ff 44 39 RSP: 0000:ffffba34c01fbc88 EFLAGS: 00010086 ... The device 2 is presented by Xapi adding device specification to Qemu command line. Signed-off-by: Frediano Ziglio Acked-by: Juergen Gross Message-ID: <20250227145016.25350-1-frediano.ziglio@cloud.com> Signed-off-by: Juergen Gross Signed-off-by: Sasha Levin --- drivers/xen/platform-pci.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/xen/platform-pci.c b/drivers/xen/platform-pci.c index 544d3f9010b92..1db82da56db62 100644 --- a/drivers/xen/platform-pci.c +++ b/drivers/xen/platform-pci.c @@ -26,6 +26,8 @@ #define DRV_NAME "xen-platform-pci" +#define PCI_DEVICE_ID_XEN_PLATFORM_XS61 0x0002 + static unsigned long platform_mmio; static unsigned long platform_mmio_alloc; static unsigned long platform_mmiolen; @@ -174,6 +176,8 @@ pci_out: static const struct pci_device_id platform_pci_tbl[] = { {PCI_VENDOR_ID_XEN, PCI_DEVICE_ID_XEN_PLATFORM, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {PCI_VENDOR_ID_XEN, PCI_DEVICE_ID_XEN_PLATFORM_XS61, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0,} }; -- GitLab From 27b19f29c9a06da43fd6f1c54c359edc715fc01c Mon Sep 17 00:00:00 2001 From: Prathamesh Shete Date: Wed, 5 Mar 2025 16:19:39 +0530 Subject: [PATCH 0156/2211] pinctrl-tegra: Restore SFSEL bit when freeing pins [ Upstream commit c12bfa0fee65940b10ff5187349f76c6f6b1df9c ] Each pin can be configured as a Special Function IO (SFIO) or GPIO, where the SFIO enables the pin to operate in alternative modes such as I2C, SPI, etc. The current implementation sets all the pins back to SFIO mode even if they were initially in GPIO mode. This can cause glitches on the pins when pinctrl_gpio_free() is called. Avoid these undesired glitches by storing the pin's SFIO/GPIO state on GPIO request and restoring it on GPIO free. Signed-off-by: Prathamesh Shete Link: https://lore.kernel.org/20250305104939.15168-2-pshete@nvidia.com Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/tegra/pinctrl-tegra.c | 59 +++++++++++++++++++++++---- drivers/pinctrl/tegra/pinctrl-tegra.h | 6 +++ 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/drivers/pinctrl/tegra/pinctrl-tegra.c b/drivers/pinctrl/tegra/pinctrl-tegra.c index 3b046450bd3ff..27823e4207347 100644 --- a/drivers/pinctrl/tegra/pinctrl-tegra.c +++ b/drivers/pinctrl/tegra/pinctrl-tegra.c @@ -278,8 +278,8 @@ static int tegra_pinctrl_set_mux(struct pinctrl_dev *pctldev, return 0; } -static const struct tegra_pingroup *tegra_pinctrl_get_group(struct pinctrl_dev *pctldev, - unsigned int offset) +static int tegra_pinctrl_get_group_index(struct pinctrl_dev *pctldev, + unsigned int offset) { struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); unsigned int group, num_pins, j; @@ -292,12 +292,35 @@ static const struct tegra_pingroup *tegra_pinctrl_get_group(struct pinctrl_dev * continue; for (j = 0; j < num_pins; j++) { if (offset == pins[j]) - return &pmx->soc->groups[group]; + return group; } } - dev_err(pctldev->dev, "Pingroup not found for pin %u\n", offset); - return NULL; + return -EINVAL; +} + +static const struct tegra_pingroup *tegra_pinctrl_get_group(struct pinctrl_dev *pctldev, + unsigned int offset, + int group_index) +{ + struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); + + if (group_index < 0 || group_index > pmx->soc->ngroups) + return NULL; + + return &pmx->soc->groups[group_index]; +} + +static struct tegra_pingroup_config *tegra_pinctrl_get_group_config(struct pinctrl_dev *pctldev, + unsigned int offset, + int group_index) +{ + struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); + + if (group_index < 0) + return NULL; + + return &pmx->pingroup_configs[group_index]; } static int tegra_pinctrl_gpio_request_enable(struct pinctrl_dev *pctldev, @@ -306,12 +329,15 @@ static int tegra_pinctrl_gpio_request_enable(struct pinctrl_dev *pctldev, { struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); const struct tegra_pingroup *group; + struct tegra_pingroup_config *config; + int group_index; u32 value; if (!pmx->soc->sfsel_in_mux) return 0; - group = tegra_pinctrl_get_group(pctldev, offset); + group_index = tegra_pinctrl_get_group_index(pctldev, offset); + group = tegra_pinctrl_get_group(pctldev, offset, group_index); if (!group) return -EINVAL; @@ -319,7 +345,11 @@ static int tegra_pinctrl_gpio_request_enable(struct pinctrl_dev *pctldev, if (group->mux_reg < 0 || group->sfsel_bit < 0) return -EINVAL; + config = tegra_pinctrl_get_group_config(pctldev, offset, group_index); + if (!config) + return -EINVAL; value = pmx_readl(pmx, group->mux_bank, group->mux_reg); + config->is_sfsel = (value & BIT(group->sfsel_bit)) != 0; value &= ~BIT(group->sfsel_bit); pmx_writel(pmx, value, group->mux_bank, group->mux_reg); @@ -332,12 +362,15 @@ static void tegra_pinctrl_gpio_disable_free(struct pinctrl_dev *pctldev, { struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); const struct tegra_pingroup *group; + struct tegra_pingroup_config *config; + int group_index; u32 value; if (!pmx->soc->sfsel_in_mux) return; - group = tegra_pinctrl_get_group(pctldev, offset); + group_index = tegra_pinctrl_get_group_index(pctldev, offset); + group = tegra_pinctrl_get_group(pctldev, offset, group_index); if (!group) return; @@ -345,8 +378,12 @@ static void tegra_pinctrl_gpio_disable_free(struct pinctrl_dev *pctldev, if (group->mux_reg < 0 || group->sfsel_bit < 0) return; + config = tegra_pinctrl_get_group_config(pctldev, offset, group_index); + if (!config) + return; value = pmx_readl(pmx, group->mux_bank, group->mux_reg); - value |= BIT(group->sfsel_bit); + if (config->is_sfsel) + value |= BIT(group->sfsel_bit); pmx_writel(pmx, value, group->mux_bank, group->mux_reg); } @@ -791,6 +828,12 @@ int tegra_pinctrl_probe(struct platform_device *pdev, pmx->dev = &pdev->dev; pmx->soc = soc_data; + pmx->pingroup_configs = devm_kcalloc(&pdev->dev, + pmx->soc->ngroups, sizeof(*pmx->pingroup_configs), + GFP_KERNEL); + if (!pmx->pingroup_configs) + return -ENOMEM; + /* * Each mux group will appear in 4 functions' list of groups. * This over-allocates slightly, since not all groups are mux groups. diff --git a/drivers/pinctrl/tegra/pinctrl-tegra.h b/drivers/pinctrl/tegra/pinctrl-tegra.h index b3289bdf727d8..b97136685f7a8 100644 --- a/drivers/pinctrl/tegra/pinctrl-tegra.h +++ b/drivers/pinctrl/tegra/pinctrl-tegra.h @@ -8,6 +8,10 @@ #ifndef __PINMUX_TEGRA_H__ #define __PINMUX_TEGRA_H__ +struct tegra_pingroup_config { + bool is_sfsel; +}; + struct tegra_pmx { struct device *dev; struct pinctrl_dev *pctl; @@ -21,6 +25,8 @@ struct tegra_pmx { int nbanks; void __iomem **regs; u32 *backup_regs; + /* Array of size soc->ngroups */ + struct tegra_pingroup_config *pingroup_configs; }; enum tegra_pinconf_param { -- GitLab From 580750a317d7b09eab13c035478193fca0ea50cb Mon Sep 17 00:00:00 2001 From: Shree Ramamoorthy Date: Thu, 6 Feb 2025 11:37:23 -0600 Subject: [PATCH 0157/2211] mfd: tps65219: Remove TPS65219_REG_TI_DEV_ID check [ Upstream commit 76b58d5111fdcffce615beb71520bc7a6f1742c9 ] The chipid macro/variable and regmap_read function call is not needed because the TPS65219_REG_TI_DEV_ID register value is not a consistent value across TPS65219 PMIC config versions. Reading from the DEV_ID register without a consistent value to compare it to isn't useful. There isn't a way to verify the match data ID is the same ID read from the DEV_ID device register. 0xF0 isn't a DEV_ID value consistent across TPS65219 NVM configurations. For TPS65215, there is a consistent value in bits 5-0 of the DEV_ID register. However, there are other error checks in place within probe() that apply to both PMICs rather than keeping this isolated check for one PMIC. Signed-off-by: Shree Ramamoorthy Link: https://lore.kernel.org/r/20250206173725.386720-4-s-ramamoorthy@ti.com Signed-off-by: Lee Jones Signed-off-by: Sasha Levin --- drivers/mfd/tps65219.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/drivers/mfd/tps65219.c b/drivers/mfd/tps65219.c index 57ff5cb294a66..d3b77abec786e 100644 --- a/drivers/mfd/tps65219.c +++ b/drivers/mfd/tps65219.c @@ -228,7 +228,6 @@ static const struct regmap_irq_chip tps65219_irq_chip = { static int tps65219_probe(struct i2c_client *client) { struct tps65219 *tps; - unsigned int chipid; bool pwr_button; int ret; @@ -253,12 +252,6 @@ static int tps65219_probe(struct i2c_client *client) if (ret) return ret; - ret = regmap_read(tps->regmap, TPS65219_REG_TI_DEV_ID, &chipid); - if (ret) { - dev_err(tps->dev, "Failed to read device ID: %d\n", ret); - return ret; - } - ret = devm_mfd_add_devices(tps->dev, PLATFORM_DEVID_AUTO, tps65219_cells, ARRAY_SIZE(tps65219_cells), NULL, 0, regmap_irq_get_domain(tps->irq_data)); -- GitLab From 73d437ae63ce600a188431d2b9bd3aa157f45cb3 Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Wed, 26 Feb 2025 16:08:03 -0500 Subject: [PATCH 0158/2211] drm/amdgpu/gfx12: don't read registers in mqd init [ Upstream commit fc3c139cf0432b79fd08e23100a559ee51cd0be4 ] Just use the default values. There's not need to get the value from hardware and it could cause problems if we do that at runtime and gfxoff is active. Reviewed-by: Mukul Joshi Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c | 48 ++++++++++++++++++-------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c index 241619ee10e4b..adcfcf594286f 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c @@ -52,6 +52,24 @@ #define RLCG_UCODE_LOADING_START_ADDRESS 0x00002000L +#define regCP_GFX_MQD_CONTROL_DEFAULT 0x00000100 +#define regCP_GFX_HQD_VMID_DEFAULT 0x00000000 +#define regCP_GFX_HQD_QUEUE_PRIORITY_DEFAULT 0x00000000 +#define regCP_GFX_HQD_QUANTUM_DEFAULT 0x00000a01 +#define regCP_GFX_HQD_CNTL_DEFAULT 0x00f00000 +#define regCP_RB_DOORBELL_CONTROL_DEFAULT 0x00000000 +#define regCP_GFX_HQD_RPTR_DEFAULT 0x00000000 + +#define regCP_HQD_EOP_CONTROL_DEFAULT 0x00000006 +#define regCP_HQD_PQ_DOORBELL_CONTROL_DEFAULT 0x00000000 +#define regCP_MQD_CONTROL_DEFAULT 0x00000100 +#define regCP_HQD_PQ_CONTROL_DEFAULT 0x00308509 +#define regCP_HQD_PQ_DOORBELL_CONTROL_DEFAULT 0x00000000 +#define regCP_HQD_PQ_RPTR_DEFAULT 0x00000000 +#define regCP_HQD_PERSISTENT_STATE_DEFAULT 0x0be05501 +#define regCP_HQD_IB_CONTROL_DEFAULT 0x00300000 + + MODULE_FIRMWARE("amdgpu/gc_12_0_0_pfp.bin"); MODULE_FIRMWARE("amdgpu/gc_12_0_0_me.bin"); MODULE_FIRMWARE("amdgpu/gc_12_0_0_mec.bin"); @@ -2851,25 +2869,25 @@ static int gfx_v12_0_gfx_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_mqd_base_addr_hi = upper_32_bits(prop->mqd_gpu_addr); /* set up mqd control */ - tmp = RREG32_SOC15(GC, 0, regCP_GFX_MQD_CONTROL); + tmp = regCP_GFX_MQD_CONTROL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_GFX_MQD_CONTROL, VMID, 0); tmp = REG_SET_FIELD(tmp, CP_GFX_MQD_CONTROL, PRIV_STATE, 1); tmp = REG_SET_FIELD(tmp, CP_GFX_MQD_CONTROL, CACHE_POLICY, 0); mqd->cp_gfx_mqd_control = tmp; /* set up gfx_hqd_vimd with 0x0 to indicate the ring buffer's vmid */ - tmp = RREG32_SOC15(GC, 0, regCP_GFX_HQD_VMID); + tmp = regCP_GFX_HQD_VMID_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_VMID, VMID, 0); mqd->cp_gfx_hqd_vmid = 0; /* set up default queue priority level * 0x0 = low priority, 0x1 = high priority */ - tmp = RREG32_SOC15(GC, 0, regCP_GFX_HQD_QUEUE_PRIORITY); + tmp = regCP_GFX_HQD_QUEUE_PRIORITY_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_QUEUE_PRIORITY, PRIORITY_LEVEL, 0); mqd->cp_gfx_hqd_queue_priority = tmp; /* set up time quantum */ - tmp = RREG32_SOC15(GC, 0, regCP_GFX_HQD_QUANTUM); + tmp = regCP_GFX_HQD_QUANTUM_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_QUANTUM, QUANTUM_EN, 1); mqd->cp_gfx_hqd_quantum = tmp; @@ -2891,7 +2909,7 @@ static int gfx_v12_0_gfx_mqd_init(struct amdgpu_device *adev, void *m, /* set up the gfx_hqd_control, similar as CP_RB0_CNTL */ rb_bufsz = order_base_2(prop->queue_size / 4) - 1; - tmp = RREG32_SOC15(GC, 0, regCP_GFX_HQD_CNTL); + tmp = regCP_GFX_HQD_CNTL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_CNTL, RB_BUFSZ, rb_bufsz); tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_CNTL, RB_BLKSZ, rb_bufsz - 2); #ifdef __BIG_ENDIAN @@ -2900,7 +2918,7 @@ static int gfx_v12_0_gfx_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_gfx_hqd_cntl = tmp; /* set up cp_doorbell_control */ - tmp = RREG32_SOC15(GC, 0, regCP_RB_DOORBELL_CONTROL); + tmp = regCP_RB_DOORBELL_CONTROL_DEFAULT; if (prop->use_doorbell) { tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL, DOORBELL_OFFSET, prop->doorbell_index); @@ -2912,7 +2930,7 @@ static int gfx_v12_0_gfx_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_rb_doorbell_control = tmp; /* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */ - mqd->cp_gfx_hqd_rptr = RREG32_SOC15(GC, 0, regCP_GFX_HQD_RPTR); + mqd->cp_gfx_hqd_rptr = regCP_GFX_HQD_RPTR_DEFAULT; /* active the queue */ mqd->cp_gfx_hqd_active = 1; @@ -3007,14 +3025,14 @@ static int gfx_v12_0_compute_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_hqd_eop_base_addr_hi = upper_32_bits(eop_base_addr); /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */ - tmp = RREG32_SOC15(GC, 0, regCP_HQD_EOP_CONTROL); + tmp = regCP_HQD_EOP_CONTROL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_HQD_EOP_CONTROL, EOP_SIZE, (order_base_2(GFX12_MEC_HPD_SIZE / 4) - 1)); mqd->cp_hqd_eop_control = tmp; /* enable doorbell? */ - tmp = RREG32_SOC15(GC, 0, regCP_HQD_PQ_DOORBELL_CONTROL); + tmp = regCP_HQD_PQ_DOORBELL_CONTROL_DEFAULT; if (prop->use_doorbell) { tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, @@ -3043,7 +3061,7 @@ static int gfx_v12_0_compute_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_mqd_base_addr_hi = upper_32_bits(prop->mqd_gpu_addr); /* set MQD vmid to 0 */ - tmp = RREG32_SOC15(GC, 0, regCP_MQD_CONTROL); + tmp = regCP_MQD_CONTROL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_MQD_CONTROL, VMID, 0); mqd->cp_mqd_control = tmp; @@ -3053,7 +3071,7 @@ static int gfx_v12_0_compute_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr); /* set up the HQD, this is similar to CP_RB0_CNTL */ - tmp = RREG32_SOC15(GC, 0, regCP_HQD_PQ_CONTROL); + tmp = regCP_HQD_PQ_CONTROL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, QUEUE_SIZE, (order_base_2(prop->queue_size / 4) - 1)); tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE, @@ -3078,7 +3096,7 @@ static int gfx_v12_0_compute_mqd_init(struct amdgpu_device *adev, void *m, tmp = 0; /* enable the doorbell if requested */ if (prop->use_doorbell) { - tmp = RREG32_SOC15(GC, 0, regCP_HQD_PQ_DOORBELL_CONTROL); + tmp = regCP_HQD_PQ_DOORBELL_CONTROL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_OFFSET, prop->doorbell_index); @@ -3093,17 +3111,17 @@ static int gfx_v12_0_compute_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_hqd_pq_doorbell_control = tmp; /* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */ - mqd->cp_hqd_pq_rptr = RREG32_SOC15(GC, 0, regCP_HQD_PQ_RPTR); + mqd->cp_hqd_pq_rptr = regCP_HQD_PQ_RPTR_DEFAULT; /* set the vmid for the queue */ mqd->cp_hqd_vmid = 0; - tmp = RREG32_SOC15(GC, 0, regCP_HQD_PERSISTENT_STATE); + tmp = regCP_HQD_PERSISTENT_STATE_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_HQD_PERSISTENT_STATE, PRELOAD_SIZE, 0x55); mqd->cp_hqd_persistent_state = tmp; /* set MIN_IB_AVAIL_SIZE */ - tmp = RREG32_SOC15(GC, 0, regCP_HQD_IB_CONTROL); + tmp = regCP_HQD_IB_CONTROL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_HQD_IB_CONTROL, MIN_IB_AVAIL_SIZE, 3); mqd->cp_hqd_ib_control = tmp; -- GitLab From 858425dc2df3ea3edf8ab719723b8fffc20b5634 Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Wed, 26 Feb 2025 15:55:33 -0500 Subject: [PATCH 0159/2211] drm/amdgpu/gfx11: don't read registers in mqd init [ Upstream commit e27b36ea6ba5f29e91fcfb375ea29503708fcf43 ] Just use the default values. There's not need to get the value from hardware and it could cause problems if we do that at runtime and gfxoff is active. Reviewed-by: Mukul Joshi Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 47 ++++++++++++++++++-------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c index 0357fea8ae1df..1f06b22dbe7c6 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c @@ -63,6 +63,23 @@ #define regPC_CONFIG_CNTL_1 0x194d #define regPC_CONFIG_CNTL_1_BASE_IDX 1 +#define regCP_GFX_MQD_CONTROL_DEFAULT 0x00000100 +#define regCP_GFX_HQD_VMID_DEFAULT 0x00000000 +#define regCP_GFX_HQD_QUEUE_PRIORITY_DEFAULT 0x00000000 +#define regCP_GFX_HQD_QUANTUM_DEFAULT 0x00000a01 +#define regCP_GFX_HQD_CNTL_DEFAULT 0x00a00000 +#define regCP_RB_DOORBELL_CONTROL_DEFAULT 0x00000000 +#define regCP_GFX_HQD_RPTR_DEFAULT 0x00000000 + +#define regCP_HQD_EOP_CONTROL_DEFAULT 0x00000006 +#define regCP_HQD_PQ_DOORBELL_CONTROL_DEFAULT 0x00000000 +#define regCP_MQD_CONTROL_DEFAULT 0x00000100 +#define regCP_HQD_PQ_CONTROL_DEFAULT 0x00308509 +#define regCP_HQD_PQ_DOORBELL_CONTROL_DEFAULT 0x00000000 +#define regCP_HQD_PQ_RPTR_DEFAULT 0x00000000 +#define regCP_HQD_PERSISTENT_STATE_DEFAULT 0x0be05501 +#define regCP_HQD_IB_CONTROL_DEFAULT 0x00300000 + MODULE_FIRMWARE("amdgpu/gc_11_0_0_pfp.bin"); MODULE_FIRMWARE("amdgpu/gc_11_0_0_me.bin"); MODULE_FIRMWARE("amdgpu/gc_11_0_0_mec.bin"); @@ -3896,7 +3913,7 @@ static void gfx_v11_0_gfx_mqd_set_priority(struct amdgpu_device *adev, if (prop->hqd_pipe_priority == AMDGPU_GFX_PIPE_PRIO_HIGH) priority = 1; - tmp = RREG32_SOC15(GC, 0, regCP_GFX_HQD_QUEUE_PRIORITY); + tmp = regCP_GFX_HQD_QUEUE_PRIORITY_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_QUEUE_PRIORITY, PRIORITY_LEVEL, priority); mqd->cp_gfx_hqd_queue_priority = tmp; } @@ -3918,14 +3935,14 @@ static int gfx_v11_0_gfx_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_mqd_base_addr_hi = upper_32_bits(prop->mqd_gpu_addr); /* set up mqd control */ - tmp = RREG32_SOC15(GC, 0, regCP_GFX_MQD_CONTROL); + tmp = regCP_GFX_MQD_CONTROL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_GFX_MQD_CONTROL, VMID, 0); tmp = REG_SET_FIELD(tmp, CP_GFX_MQD_CONTROL, PRIV_STATE, 1); tmp = REG_SET_FIELD(tmp, CP_GFX_MQD_CONTROL, CACHE_POLICY, 0); mqd->cp_gfx_mqd_control = tmp; /* set up gfx_hqd_vimd with 0x0 to indicate the ring buffer's vmid */ - tmp = RREG32_SOC15(GC, 0, regCP_GFX_HQD_VMID); + tmp = regCP_GFX_HQD_VMID_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_VMID, VMID, 0); mqd->cp_gfx_hqd_vmid = 0; @@ -3933,7 +3950,7 @@ static int gfx_v11_0_gfx_mqd_init(struct amdgpu_device *adev, void *m, gfx_v11_0_gfx_mqd_set_priority(adev, mqd, prop); /* set up time quantum */ - tmp = RREG32_SOC15(GC, 0, regCP_GFX_HQD_QUANTUM); + tmp = regCP_GFX_HQD_QUANTUM_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_QUANTUM, QUANTUM_EN, 1); mqd->cp_gfx_hqd_quantum = tmp; @@ -3955,7 +3972,7 @@ static int gfx_v11_0_gfx_mqd_init(struct amdgpu_device *adev, void *m, /* set up the gfx_hqd_control, similar as CP_RB0_CNTL */ rb_bufsz = order_base_2(prop->queue_size / 4) - 1; - tmp = RREG32_SOC15(GC, 0, regCP_GFX_HQD_CNTL); + tmp = regCP_GFX_HQD_CNTL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_CNTL, RB_BUFSZ, rb_bufsz); tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_CNTL, RB_BLKSZ, rb_bufsz - 2); #ifdef __BIG_ENDIAN @@ -3964,7 +3981,7 @@ static int gfx_v11_0_gfx_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_gfx_hqd_cntl = tmp; /* set up cp_doorbell_control */ - tmp = RREG32_SOC15(GC, 0, regCP_RB_DOORBELL_CONTROL); + tmp = regCP_RB_DOORBELL_CONTROL_DEFAULT; if (prop->use_doorbell) { tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL, DOORBELL_OFFSET, prop->doorbell_index); @@ -3976,7 +3993,7 @@ static int gfx_v11_0_gfx_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_rb_doorbell_control = tmp; /* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */ - mqd->cp_gfx_hqd_rptr = RREG32_SOC15(GC, 0, regCP_GFX_HQD_RPTR); + mqd->cp_gfx_hqd_rptr = regCP_GFX_HQD_RPTR_DEFAULT; /* active the queue */ mqd->cp_gfx_hqd_active = 1; @@ -4062,14 +4079,14 @@ static int gfx_v11_0_compute_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_hqd_eop_base_addr_hi = upper_32_bits(eop_base_addr); /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */ - tmp = RREG32_SOC15(GC, 0, regCP_HQD_EOP_CONTROL); + tmp = regCP_HQD_EOP_CONTROL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_HQD_EOP_CONTROL, EOP_SIZE, (order_base_2(GFX11_MEC_HPD_SIZE / 4) - 1)); mqd->cp_hqd_eop_control = tmp; /* enable doorbell? */ - tmp = RREG32_SOC15(GC, 0, regCP_HQD_PQ_DOORBELL_CONTROL); + tmp = regCP_HQD_PQ_DOORBELL_CONTROL_DEFAULT; if (prop->use_doorbell) { tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, @@ -4098,7 +4115,7 @@ static int gfx_v11_0_compute_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_mqd_base_addr_hi = upper_32_bits(prop->mqd_gpu_addr); /* set MQD vmid to 0 */ - tmp = RREG32_SOC15(GC, 0, regCP_MQD_CONTROL); + tmp = regCP_MQD_CONTROL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_MQD_CONTROL, VMID, 0); mqd->cp_mqd_control = tmp; @@ -4108,7 +4125,7 @@ static int gfx_v11_0_compute_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr); /* set up the HQD, this is similar to CP_RB0_CNTL */ - tmp = RREG32_SOC15(GC, 0, regCP_HQD_PQ_CONTROL); + tmp = regCP_HQD_PQ_CONTROL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, QUEUE_SIZE, (order_base_2(prop->queue_size / 4) - 1)); tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE, @@ -4134,7 +4151,7 @@ static int gfx_v11_0_compute_mqd_init(struct amdgpu_device *adev, void *m, tmp = 0; /* enable the doorbell if requested */ if (prop->use_doorbell) { - tmp = RREG32_SOC15(GC, 0, regCP_HQD_PQ_DOORBELL_CONTROL); + tmp = regCP_HQD_PQ_DOORBELL_CONTROL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_OFFSET, prop->doorbell_index); @@ -4149,17 +4166,17 @@ static int gfx_v11_0_compute_mqd_init(struct amdgpu_device *adev, void *m, mqd->cp_hqd_pq_doorbell_control = tmp; /* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */ - mqd->cp_hqd_pq_rptr = RREG32_SOC15(GC, 0, regCP_HQD_PQ_RPTR); + mqd->cp_hqd_pq_rptr = regCP_HQD_PQ_RPTR_DEFAULT; /* set the vmid for the queue */ mqd->cp_hqd_vmid = 0; - tmp = RREG32_SOC15(GC, 0, regCP_HQD_PERSISTENT_STATE); + tmp = regCP_HQD_PERSISTENT_STATE_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_HQD_PERSISTENT_STATE, PRELOAD_SIZE, 0x55); mqd->cp_hqd_persistent_state = tmp; /* set MIN_IB_AVAIL_SIZE */ - tmp = RREG32_SOC15(GC, 0, regCP_HQD_IB_CONTROL); + tmp = regCP_HQD_IB_CONTROL_DEFAULT; tmp = REG_SET_FIELD(tmp, CP_HQD_IB_CONTROL, MIN_IB_AVAIL_SIZE, 3); mqd->cp_hqd_ib_control = tmp; -- GitLab From de3c09de746f7d68b63efad491aa952e442f72ab Mon Sep 17 00:00:00 2001 From: David Rosca Date: Fri, 28 Feb 2025 13:44:32 +0100 Subject: [PATCH 0160/2211] drm/amdgpu: Update SRIOV video codec caps [ Upstream commit 19478f2011f8b53dee401c91423c4e0b73753e4f ] There have been multiple fixes to the video caps that are missing for SRIOV. Update the SRIOV caps with correct values. Signed-off-by: David Rosca Acked-by: Alex Deucher Reviewed-by: Ruijing Dong Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/nv.c | 16 ++++++++-------- drivers/gpu/drm/amd/amdgpu/soc21.c | 10 ++-------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c index 4f94a119d6275..ab0eecbab4125 100644 --- a/drivers/gpu/drm/amd/amdgpu/nv.c +++ b/drivers/gpu/drm/amd/amdgpu/nv.c @@ -141,23 +141,23 @@ static struct amdgpu_video_codec_info sriov_sc_video_codecs_encode_array[] = { }; static struct amdgpu_video_codec_info sriov_sc_video_codecs_decode_array_vcn0[] = { - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4096, 3)}, - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4096, 5)}, + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 1920, 1088, 3)}, + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 1920, 1088, 5)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)}, - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4096, 4)}, + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 1920, 1088, 4)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)}, + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 16384, 16384, 0)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)}, }; static struct amdgpu_video_codec_info sriov_sc_video_codecs_decode_array_vcn1[] = { - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4096, 3)}, - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4096, 5)}, + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 1920, 1088, 3)}, + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 1920, 1088, 5)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)}, - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4096, 4)}, + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 1920, 1088, 4)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)}, + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 16384, 16384, 0)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)}, }; diff --git a/drivers/gpu/drm/amd/amdgpu/soc21.c b/drivers/gpu/drm/amd/amdgpu/soc21.c index bba35880badb9..04a1b2a46368f 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc21.c +++ b/drivers/gpu/drm/amd/amdgpu/soc21.c @@ -117,23 +117,17 @@ static struct amdgpu_video_codecs sriov_vcn_4_0_0_video_codecs_encode_vcn1 = { }; static struct amdgpu_video_codec_info sriov_vcn_4_0_0_video_codecs_decode_array_vcn0[] = { - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4096, 3)}, - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4096, 5)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)}, - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4096, 4)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)}, + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 16384, 16384, 0)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)}, }; static struct amdgpu_video_codec_info sriov_vcn_4_0_0_video_codecs_decode_array_vcn1[] = { - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4096, 3)}, - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4096, 5)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)}, - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4096, 4)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, - {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)}, + {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 16384, 16384, 0)}, {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)}, }; -- GitLab From 3673382803c51cda73fab1df1057ea73d366da23 Mon Sep 17 00:00:00 2001 From: Ryan Walklin Date: Sat, 15 Feb 2025 11:02:25 +1300 Subject: [PATCH 0161/2211] ASoC: sun4i-codec: support hp-det-gpios property [ Upstream commit a149377c033afe6557c50892ebbfc0e8b7e2e253 ] Add support for GPIO headphone detection with the hp-det-gpios property. In order for this to properly disable the path upon removal of headphones, the output must be labelled Headphone which is a common sink in the driver. Describe a headphone jack and detection GPIO in the driver, check for a corresponding device tree node, and enable jack detection in a new machine init function if described. Signed-off-by: Chris Morgan Signed-off-by: Ryan Walklin -- Changelog v1..v2: - Separate DAPM changes into separate patch and add rationale. Tested-by: Philippe Simons Link: https://patch.msgid.link/20250214220247.10810-4-ryan@testtoast.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/sunxi/sun4i-codec.c | 53 +++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c index 330bc0c09f56b..93dd88fb805dd 100644 --- a/sound/soc/sunxi/sun4i-codec.c +++ b/sound/soc/sunxi/sun4i-codec.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -235,6 +236,7 @@ struct sun4i_codec { struct clk *clk_module; struct reset_control *rst; struct gpio_desc *gpio_pa; + struct gpio_desc *gpio_hp; /* ADC_FIFOC register is at different offset on different SoCs */ struct regmap_field *reg_adc_fifoc; @@ -1263,6 +1265,49 @@ static struct snd_soc_dai_driver dummy_cpu_dai = { .ops = &dummy_dai_ops, }; +static struct snd_soc_jack sun4i_headphone_jack; + +static struct snd_soc_jack_pin sun4i_headphone_jack_pins[] = { + { .pin = "Headphone", .mask = SND_JACK_HEADPHONE }, +}; + +static struct snd_soc_jack_gpio sun4i_headphone_jack_gpio = { + .name = "hp-det", + .report = SND_JACK_HEADPHONE, + .debounce_time = 150, +}; + +static int sun4i_codec_machine_init(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_soc_card *card = rtd->card; + struct sun4i_codec *scodec = snd_soc_card_get_drvdata(card); + int ret; + + if (scodec->gpio_hp) { + ret = snd_soc_card_jack_new_pins(card, "Headphone Jack", + SND_JACK_HEADPHONE, + &sun4i_headphone_jack, + sun4i_headphone_jack_pins, + ARRAY_SIZE(sun4i_headphone_jack_pins)); + if (ret) { + dev_err(rtd->dev, + "Headphone jack creation failed: %d\n", ret); + return ret; + } + + sun4i_headphone_jack_gpio.desc = scodec->gpio_hp; + ret = snd_soc_jack_add_gpios(&sun4i_headphone_jack, 1, + &sun4i_headphone_jack_gpio); + + if (ret) { + dev_err(rtd->dev, "Headphone GPIO not added: %d\n", ret); + return ret; + } + } + + return 0; +} + static struct snd_soc_dai_link *sun4i_codec_create_link(struct device *dev, int *num_links) { @@ -1288,6 +1333,7 @@ static struct snd_soc_dai_link *sun4i_codec_create_link(struct device *dev, link->codecs->name = dev_name(dev); link->platforms->name = dev_name(dev); link->dai_fmt = SND_SOC_DAIFMT_I2S; + link->init = sun4i_codec_machine_init; *num_links = 1; @@ -1728,6 +1774,13 @@ static int sun4i_codec_probe(struct platform_device *pdev) return ret; } + scodec->gpio_hp = devm_gpiod_get_optional(&pdev->dev, "hp-det", GPIOD_IN); + if (IS_ERR(scodec->gpio_hp)) { + ret = PTR_ERR(scodec->gpio_hp); + dev_err_probe(&pdev->dev, ret, "Failed to get hp-det gpio\n"); + return ret; + } + /* reg_field setup */ scodec->reg_adc_fifoc = devm_regmap_field_alloc(&pdev->dev, scodec->regmap, -- GitLab From 3039f0c9c75548dc54e9968e123b990090310708 Mon Sep 17 00:00:00 2001 From: Taniya Das Date: Fri, 21 Feb 2025 15:04:55 +0530 Subject: [PATCH 0162/2211] clk: qcom: lpassaudiocc-sc7280: Add support for LPASS resets for QCM6490 [ Upstream commit cdbbc480f4146cb659af97f4020601fde5fb65a7 ] On the QCM6490 boards, the LPASS firmware controls the complete clock controller functionalities and associated power domains. However, only the LPASS resets required to be controlled by the high level OS. Thus, add support for the resets in the clock driver to enable the Audio SW driver to assert/deassert the audio resets as needed. Reviewed-by: Dmitry Baryshkov Signed-off-by: Taniya Das Link: https://lore.kernel.org/r/20250221-lpass_qcm6490_resets-v5-2-6be0c0949a83@quicinc.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/clk/qcom/lpassaudiocc-sc7280.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/clk/qcom/lpassaudiocc-sc7280.c b/drivers/clk/qcom/lpassaudiocc-sc7280.c index 45e7264770866..22169da08a51a 100644 --- a/drivers/clk/qcom/lpassaudiocc-sc7280.c +++ b/drivers/clk/qcom/lpassaudiocc-sc7280.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2025, Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -713,14 +714,24 @@ static const struct qcom_reset_map lpass_audio_cc_sc7280_resets[] = { [LPASS_AUDIO_SWR_WSA_CGCR] = { 0xb0, 1 }, }; +static const struct regmap_config lpass_audio_cc_sc7280_reset_regmap_config = { + .name = "lpassaudio_cc_reset", + .reg_bits = 32, + .reg_stride = 4, + .val_bits = 32, + .fast_io = true, + .max_register = 0xc8, +}; + static const struct qcom_cc_desc lpass_audio_cc_reset_sc7280_desc = { - .config = &lpass_audio_cc_sc7280_regmap_config, + .config = &lpass_audio_cc_sc7280_reset_regmap_config, .resets = lpass_audio_cc_sc7280_resets, .num_resets = ARRAY_SIZE(lpass_audio_cc_sc7280_resets), }; static const struct of_device_id lpass_audio_cc_sc7280_match_table[] = { - { .compatible = "qcom,sc7280-lpassaudiocc" }, + { .compatible = "qcom,qcm6490-lpassaudiocc", .data = &lpass_audio_cc_reset_sc7280_desc }, + { .compatible = "qcom,sc7280-lpassaudiocc", .data = &lpass_audio_cc_sc7280_desc }, { } }; MODULE_DEVICE_TABLE(of, lpass_audio_cc_sc7280_match_table); @@ -752,13 +763,17 @@ static int lpass_audio_cc_sc7280_probe(struct platform_device *pdev) struct regmap *regmap; int ret; + desc = device_get_match_data(&pdev->dev); + + if (of_device_is_compatible(pdev->dev.of_node, "qcom,qcm6490-lpassaudiocc")) + return qcom_cc_probe_by_index(pdev, 1, desc); + ret = lpass_audio_setup_runtime_pm(pdev); if (ret) return ret; lpass_audio_cc_sc7280_regmap_config.name = "lpassaudio_cc"; lpass_audio_cc_sc7280_regmap_config.max_register = 0x2f000; - desc = &lpass_audio_cc_sc7280_desc; regmap = qcom_cc_map(pdev, desc); if (IS_ERR(regmap)) { @@ -772,7 +787,7 @@ static int lpass_audio_cc_sc7280_probe(struct platform_device *pdev) regmap_write(regmap, 0x4, 0x3b); regmap_write(regmap, 0x8, 0xff05); - ret = qcom_cc_really_probe(&pdev->dev, &lpass_audio_cc_sc7280_desc, regmap); + ret = qcom_cc_really_probe(&pdev->dev, desc, regmap); if (ret) { dev_err(&pdev->dev, "Failed to register LPASS AUDIO CC clocks\n"); goto exit; -- GitLab From 2f5f326214321c1f2ab07f820736900381e0c018 Mon Sep 17 00:00:00 2001 From: Baokun Li Date: Wed, 22 Jan 2025 19:05:27 +0800 Subject: [PATCH 0163/2211] ext4: reject the 'data_err=abort' option in nojournal mode [ Upstream commit 26343ca0df715097065b02a6cddb4a029d5b9327 ] data_err=abort aborts the journal on I/O errors. However, this option is meaningless if journal is disabled, so it is rejected in nojournal mode to reduce unnecessary checks. Also, this option is ignored upon remount. Signed-off-by: Baokun Li Reviewed-by: Zhang Yi Reviewed-by: Jan Kara Link: https://patch.msgid.link/20250122110533.4116662-4-libaokun@huaweicloud.com Signed-off-by: Theodore Ts'o Signed-off-by: Sasha Levin --- fs/ext4/super.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 473909c4a3784..99117d1e1bdd5 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -2787,6 +2787,13 @@ static int ext4_check_opt_consistency(struct fs_context *fc, } if (is_remount) { + if (!sbi->s_journal && + ctx_test_mount_opt(ctx, EXT4_MOUNT_DATA_ERR_ABORT)) { + ext4_msg(NULL, KERN_WARNING, + "Remounting fs w/o journal so ignoring data_err option"); + ctx_clear_mount_opt(ctx, EXT4_MOUNT_DATA_ERR_ABORT); + } + if (ctx_test_mount_opt(ctx, EXT4_MOUNT_DAX_ALWAYS) && (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)) { ext4_msg(NULL, KERN_ERR, "can't mount with " @@ -5396,6 +5403,11 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb) "data=, fs mounted w/o journal"); goto failed_mount3a; } + if (test_opt(sb, DATA_ERR_ABORT)) { + ext4_msg(sb, KERN_ERR, + "can't mount with data_err=abort, fs mounted w/o journal"); + goto failed_mount3a; + } sbi->s_def_mount_opt &= ~EXT4_MOUNT_JOURNAL_CHECKSUM; clear_opt(sb, JOURNAL_CHECKSUM); clear_opt(sb, DATA_FLAGS); -- GitLab From 785ac699113320e3c3968754ca0c78d40a013107 Mon Sep 17 00:00:00 2001 From: Baokun Li Date: Wed, 22 Jan 2025 19:05:26 +0800 Subject: [PATCH 0164/2211] ext4: do not convert the unwritten extents if data writeback fails [ Upstream commit e856f93e0fb249955f7d5efb18fe20500a9ccc6d ] When dioread_nolock is turned on (the default), it will convert unwritten extents to written at ext4_end_io_end(), even if the data writeback fails. It leads to the possibility that stale data may be exposed when the physical block corresponding to the file data is read-only (i.e., writes return -EIO, but reads are normal). Therefore a new ext4_io_end->flags EXT4_IO_END_FAILED is added, which indicates that some bio write-back failed in the current ext4_io_end. When this flag is set, the unwritten to written conversion is no longer performed. Users can read the data normally until the caches are dropped, after that, the failed extents can only be read to all 0. Signed-off-by: Baokun Li Reviewed-by: Jan Kara Reviewed-by: Zhang Yi Link: https://patch.msgid.link/20250122110533.4116662-3-libaokun@huaweicloud.com Signed-off-by: Theodore Ts'o Signed-off-by: Sasha Levin --- fs/ext4/ext4.h | 3 ++- fs/ext4/page-io.c | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index bbffb76d9a904..75df7eeee50d8 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -278,7 +278,8 @@ struct ext4_system_blocks { /* * Flags for ext4_io_end->flags */ -#define EXT4_IO_END_UNWRITTEN 0x0001 +#define EXT4_IO_END_UNWRITTEN 0x0001 +#define EXT4_IO_END_FAILED 0x0002 struct ext4_io_end_vec { struct list_head list; /* list of io_end_vec */ diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index b7b9261fec3b5..cb023922c93c8 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -181,14 +181,25 @@ static int ext4_end_io_end(ext4_io_end_t *io_end) "list->prev 0x%p\n", io_end, inode->i_ino, io_end->list.next, io_end->list.prev); - io_end->handle = NULL; /* Following call will use up the handle */ - ret = ext4_convert_unwritten_io_end_vec(handle, io_end); + /* + * Do not convert the unwritten extents if data writeback fails, + * or stale data may be exposed. + */ + io_end->handle = NULL; /* Following call will use up the handle */ + if (unlikely(io_end->flag & EXT4_IO_END_FAILED)) { + ret = -EIO; + if (handle) + jbd2_journal_free_reserved(handle); + } else { + ret = ext4_convert_unwritten_io_end_vec(handle, io_end); + } if (ret < 0 && !ext4_forced_shutdown(inode->i_sb)) { ext4_msg(inode->i_sb, KERN_EMERG, "failed to convert unwritten extents to written " "extents -- potential data loss! " "(inode %lu, error %d)", inode->i_ino, ret); } + ext4_clear_io_unwritten_flag(io_end); ext4_release_io_end(io_end); return ret; @@ -344,6 +355,7 @@ static void ext4_end_bio(struct bio *bio) bio->bi_status, inode->i_ino, (unsigned long long) bi_sector >> (inode->i_blkbits - 9)); + io_end->flag |= EXT4_IO_END_FAILED; mapping_set_error(inode->i_mapping, blk_status_to_errno(bio->bi_status)); } -- GitLab From 135dde13b96d565d8bcd69e7350f29fc1aade0e5 Mon Sep 17 00:00:00 2001 From: Maher Sanalla Date: Wed, 26 Feb 2025 15:54:13 +0200 Subject: [PATCH 0165/2211] RDMA/uverbs: Propagate errors from rdma_lookup_get_uobject() [ Upstream commit 81f8f7454ad9e0bf95efdec6542afdc9a6ab1e24 ] Currently, the IB uverbs API calls uobj_get_uobj_read(), which in turn uses the rdma_lookup_get_uobject() helper to retrieve user objects. In case of failure, uobj_get_uobj_read() returns NULL, overriding the error code from rdma_lookup_get_uobject(). The IB uverbs API then translates this NULL to -EINVAL, masking the actual error and complicating debugging. For example, applications calling ibv_modify_qp that fails with EBUSY when retrieving the QP uobject will see the overridden error code EINVAL instead, masking the actual error. Furthermore, based on rdma-core commit: "2a22f1ced5f3 ("Merge pull request #1568 from jakemoroni/master")" Kernel's IB uverbs return values are either ignored and passed on as is to application or overridden with other errnos in a few cases. Thus, to improve error reporting and debuggability, propagate the original error from rdma_lookup_get_uobject() instead of replacing it with EINVAL. Signed-off-by: Maher Sanalla Link: https://patch.msgid.link/64f9d3711b183984e939962c2f83383904f97dfb.1740577869.git.leon@kernel.org Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/infiniband/core/uverbs_cmd.c | 144 ++++++++++++++------------- include/rdma/uverbs_std_types.h | 2 +- 2 files changed, 77 insertions(+), 69 deletions(-) diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index edef79daed3fa..535bb99ed9f5f 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -718,8 +718,8 @@ static int ib_uverbs_reg_mr(struct uverbs_attr_bundle *attrs) goto err_free; pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd.pd_handle, attrs); - if (!pd) { - ret = -EINVAL; + if (IS_ERR(pd)) { + ret = PTR_ERR(pd); goto err_free; } @@ -809,8 +809,8 @@ static int ib_uverbs_rereg_mr(struct uverbs_attr_bundle *attrs) if (cmd.flags & IB_MR_REREG_PD) { new_pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd.pd_handle, attrs); - if (!new_pd) { - ret = -EINVAL; + if (IS_ERR(new_pd)) { + ret = PTR_ERR(new_pd); goto put_uobjs; } } else { @@ -919,8 +919,8 @@ static int ib_uverbs_alloc_mw(struct uverbs_attr_bundle *attrs) return PTR_ERR(uobj); pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd.pd_handle, attrs); - if (!pd) { - ret = -EINVAL; + if (IS_ERR(pd)) { + ret = PTR_ERR(pd); goto err_free; } @@ -1127,8 +1127,8 @@ static int ib_uverbs_resize_cq(struct uverbs_attr_bundle *attrs) return ret; cq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd.cq_handle, attrs); - if (!cq) - return -EINVAL; + if (IS_ERR(cq)) + return PTR_ERR(cq); ret = cq->device->ops.resize_cq(cq, cmd.cqe, &attrs->driver_udata); if (ret) @@ -1189,8 +1189,8 @@ static int ib_uverbs_poll_cq(struct uverbs_attr_bundle *attrs) return ret; cq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd.cq_handle, attrs); - if (!cq) - return -EINVAL; + if (IS_ERR(cq)) + return PTR_ERR(cq); /* we copy a struct ib_uverbs_poll_cq_resp to user space */ header_ptr = attrs->ucore.outbuf; @@ -1238,8 +1238,8 @@ static int ib_uverbs_req_notify_cq(struct uverbs_attr_bundle *attrs) return ret; cq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd.cq_handle, attrs); - if (!cq) - return -EINVAL; + if (IS_ERR(cq)) + return PTR_ERR(cq); ib_req_notify_cq(cq, cmd.solicited_only ? IB_CQ_SOLICITED : IB_CQ_NEXT_COMP); @@ -1321,8 +1321,8 @@ static int create_qp(struct uverbs_attr_bundle *attrs, ind_tbl = uobj_get_obj_read(rwq_ind_table, UVERBS_OBJECT_RWQ_IND_TBL, cmd->rwq_ind_tbl_handle, attrs); - if (!ind_tbl) { - ret = -EINVAL; + if (IS_ERR(ind_tbl)) { + ret = PTR_ERR(ind_tbl); goto err_put; } @@ -1360,8 +1360,10 @@ static int create_qp(struct uverbs_attr_bundle *attrs, if (cmd->is_srq) { srq = uobj_get_obj_read(srq, UVERBS_OBJECT_SRQ, cmd->srq_handle, attrs); - if (!srq || srq->srq_type == IB_SRQT_XRC) { - ret = -EINVAL; + if (IS_ERR(srq) || + srq->srq_type == IB_SRQT_XRC) { + ret = IS_ERR(srq) ? PTR_ERR(srq) : + -EINVAL; goto err_put; } } @@ -1371,23 +1373,29 @@ static int create_qp(struct uverbs_attr_bundle *attrs, rcq = uobj_get_obj_read( cq, UVERBS_OBJECT_CQ, cmd->recv_cq_handle, attrs); - if (!rcq) { - ret = -EINVAL; + if (IS_ERR(rcq)) { + ret = PTR_ERR(rcq); goto err_put; } } } } - if (has_sq) + if (has_sq) { scq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd->send_cq_handle, attrs); + if (IS_ERR(scq)) { + ret = PTR_ERR(scq); + goto err_put; + } + } + if (!ind_tbl && cmd->qp_type != IB_QPT_XRC_INI) rcq = rcq ?: scq; pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd->pd_handle, attrs); - if (!pd || (!scq && has_sq)) { - ret = -EINVAL; + if (IS_ERR(pd)) { + ret = PTR_ERR(pd); goto err_put; } @@ -1482,18 +1490,18 @@ static int create_qp(struct uverbs_attr_bundle *attrs, err_put: if (!IS_ERR(xrcd_uobj)) uobj_put_read(xrcd_uobj); - if (pd) + if (!IS_ERR_OR_NULL(pd)) uobj_put_obj_read(pd); - if (scq) + if (!IS_ERR_OR_NULL(scq)) rdma_lookup_put_uobject(&scq->uobject->uevent.uobject, UVERBS_LOOKUP_READ); - if (rcq && rcq != scq) + if (!IS_ERR_OR_NULL(rcq) && rcq != scq) rdma_lookup_put_uobject(&rcq->uobject->uevent.uobject, UVERBS_LOOKUP_READ); - if (srq) + if (!IS_ERR_OR_NULL(srq)) rdma_lookup_put_uobject(&srq->uobject->uevent.uobject, UVERBS_LOOKUP_READ); - if (ind_tbl) + if (!IS_ERR_OR_NULL(ind_tbl)) uobj_put_obj_read(ind_tbl); uobj_alloc_abort(&obj->uevent.uobject, attrs); @@ -1655,8 +1663,8 @@ static int ib_uverbs_query_qp(struct uverbs_attr_bundle *attrs) } qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs); - if (!qp) { - ret = -EINVAL; + if (IS_ERR(qp)) { + ret = PTR_ERR(qp); goto out; } @@ -1761,8 +1769,8 @@ static int modify_qp(struct uverbs_attr_bundle *attrs, qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd->base.qp_handle, attrs); - if (!qp) { - ret = -EINVAL; + if (IS_ERR(qp)) { + ret = PTR_ERR(qp); goto out; } @@ -2028,8 +2036,8 @@ static int ib_uverbs_post_send(struct uverbs_attr_bundle *attrs) return -ENOMEM; qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs); - if (!qp) { - ret = -EINVAL; + if (IS_ERR(qp)) { + ret = PTR_ERR(qp); goto out; } @@ -2066,9 +2074,9 @@ static int ib_uverbs_post_send(struct uverbs_attr_bundle *attrs) ud->ah = uobj_get_obj_read(ah, UVERBS_OBJECT_AH, user_wr->wr.ud.ah, attrs); - if (!ud->ah) { + if (IS_ERR(ud->ah)) { + ret = PTR_ERR(ud->ah); kfree(ud); - ret = -EINVAL; goto out_put; } ud->remote_qpn = user_wr->wr.ud.remote_qpn; @@ -2305,8 +2313,8 @@ static int ib_uverbs_post_recv(struct uverbs_attr_bundle *attrs) return PTR_ERR(wr); qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs); - if (!qp) { - ret = -EINVAL; + if (IS_ERR(qp)) { + ret = PTR_ERR(qp); goto out; } @@ -2356,8 +2364,8 @@ static int ib_uverbs_post_srq_recv(struct uverbs_attr_bundle *attrs) return PTR_ERR(wr); srq = uobj_get_obj_read(srq, UVERBS_OBJECT_SRQ, cmd.srq_handle, attrs); - if (!srq) { - ret = -EINVAL; + if (IS_ERR(srq)) { + ret = PTR_ERR(srq); goto out; } @@ -2413,8 +2421,8 @@ static int ib_uverbs_create_ah(struct uverbs_attr_bundle *attrs) } pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd.pd_handle, attrs); - if (!pd) { - ret = -EINVAL; + if (IS_ERR(pd)) { + ret = PTR_ERR(pd); goto err; } @@ -2483,8 +2491,8 @@ static int ib_uverbs_attach_mcast(struct uverbs_attr_bundle *attrs) return ret; qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs); - if (!qp) - return -EINVAL; + if (IS_ERR(qp)) + return PTR_ERR(qp); obj = qp->uobject; @@ -2533,8 +2541,8 @@ static int ib_uverbs_detach_mcast(struct uverbs_attr_bundle *attrs) return ret; qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs); - if (!qp) - return -EINVAL; + if (IS_ERR(qp)) + return PTR_ERR(qp); obj = qp->uobject; mutex_lock(&obj->mcast_lock); @@ -2668,8 +2676,8 @@ static int kern_spec_to_ib_spec_action(struct uverbs_attr_bundle *attrs, UVERBS_OBJECT_FLOW_ACTION, kern_spec->action.handle, attrs); - if (!ib_spec->action.act) - return -EINVAL; + if (IS_ERR(ib_spec->action.act)) + return PTR_ERR(ib_spec->action.act); ib_spec->action.size = sizeof(struct ib_flow_spec_action_handle); flow_resources_add(uflow_res, @@ -2686,8 +2694,8 @@ static int kern_spec_to_ib_spec_action(struct uverbs_attr_bundle *attrs, UVERBS_OBJECT_COUNTERS, kern_spec->flow_count.handle, attrs); - if (!ib_spec->flow_count.counters) - return -EINVAL; + if (IS_ERR(ib_spec->flow_count.counters)) + return PTR_ERR(ib_spec->flow_count.counters); ib_spec->flow_count.size = sizeof(struct ib_flow_spec_action_count); flow_resources_add(uflow_res, @@ -2905,14 +2913,14 @@ static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs) return PTR_ERR(obj); pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd.pd_handle, attrs); - if (!pd) { - err = -EINVAL; + if (IS_ERR(pd)) { + err = PTR_ERR(pd); goto err_uobj; } cq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd.cq_handle, attrs); - if (!cq) { - err = -EINVAL; + if (IS_ERR(cq)) { + err = PTR_ERR(cq); goto err_put_pd; } @@ -3013,8 +3021,8 @@ static int ib_uverbs_ex_modify_wq(struct uverbs_attr_bundle *attrs) return -EINVAL; wq = uobj_get_obj_read(wq, UVERBS_OBJECT_WQ, cmd.wq_handle, attrs); - if (!wq) - return -EINVAL; + if (IS_ERR(wq)) + return PTR_ERR(wq); if (cmd.attr_mask & IB_WQ_FLAGS) { wq_attr.flags = cmd.flags; @@ -3097,8 +3105,8 @@ static int ib_uverbs_ex_create_rwq_ind_table(struct uverbs_attr_bundle *attrs) num_read_wqs++) { wq = uobj_get_obj_read(wq, UVERBS_OBJECT_WQ, wqs_handles[num_read_wqs], attrs); - if (!wq) { - err = -EINVAL; + if (IS_ERR(wq)) { + err = PTR_ERR(wq); goto put_wqs; } @@ -3253,8 +3261,8 @@ static int ib_uverbs_ex_create_flow(struct uverbs_attr_bundle *attrs) } qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs); - if (!qp) { - err = -EINVAL; + if (IS_ERR(qp)) { + err = PTR_ERR(qp); goto err_uobj; } @@ -3400,15 +3408,15 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs, if (ib_srq_has_cq(cmd->srq_type)) { attr.ext.cq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd->cq_handle, attrs); - if (!attr.ext.cq) { - ret = -EINVAL; + if (IS_ERR(attr.ext.cq)) { + ret = PTR_ERR(attr.ext.cq); goto err_put_xrcd; } } pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd->pd_handle, attrs); - if (!pd) { - ret = -EINVAL; + if (IS_ERR(pd)) { + ret = PTR_ERR(pd); goto err_put_cq; } @@ -3515,8 +3523,8 @@ static int ib_uverbs_modify_srq(struct uverbs_attr_bundle *attrs) return ret; srq = uobj_get_obj_read(srq, UVERBS_OBJECT_SRQ, cmd.srq_handle, attrs); - if (!srq) - return -EINVAL; + if (IS_ERR(srq)) + return PTR_ERR(srq); attr.max_wr = cmd.max_wr; attr.srq_limit = cmd.srq_limit; @@ -3543,8 +3551,8 @@ static int ib_uverbs_query_srq(struct uverbs_attr_bundle *attrs) return ret; srq = uobj_get_obj_read(srq, UVERBS_OBJECT_SRQ, cmd.srq_handle, attrs); - if (!srq) - return -EINVAL; + if (IS_ERR(srq)) + return PTR_ERR(srq); ret = ib_query_srq(srq, &attr); @@ -3669,8 +3677,8 @@ static int ib_uverbs_ex_modify_cq(struct uverbs_attr_bundle *attrs) return -EOPNOTSUPP; cq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd.cq_handle, attrs); - if (!cq) - return -EINVAL; + if (IS_ERR(cq)) + return PTR_ERR(cq); ret = rdma_set_cq_moderation(cq, cmd.attr.cq_count, cmd.attr.cq_period); diff --git a/include/rdma/uverbs_std_types.h b/include/rdma/uverbs_std_types.h index fe05121169589..555ea3d142a46 100644 --- a/include/rdma/uverbs_std_types.h +++ b/include/rdma/uverbs_std_types.h @@ -34,7 +34,7 @@ static inline void *_uobj_get_obj_read(struct ib_uobject *uobj) { if (IS_ERR(uobj)) - return NULL; + return ERR_CAST(uobj); return uobj->object; } #define uobj_get_obj_read(_object, _type, _id, _attrs) \ -- GitLab From d0dc233fe22412b2ddec3ead6419a495f2769d1f Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Sat, 8 Mar 2025 17:48:17 +0100 Subject: [PATCH 0166/2211] posix-timers: Add cond_resched() to posix_timer_add() search loop [ Upstream commit 5f2909c6cd13564a07ae692a95457f52295c4f22 ] With a large number of POSIX timers the search for a valid ID might cause a soft lockup on PREEMPT_NONE/VOLUNTARY kernels. Add cond_resched() to the loop to prevent that. [ tglx: Split out from Eric's series ] Signed-off-by: Eric Dumazet Signed-off-by: Thomas Gleixner Reviewed-by: Frederic Weisbecker Link: https://lore.kernel.org/all/20250214135911.2037402-2-edumazet@google.com Link: https://lore.kernel.org/all/20250308155623.635612865@linutronix.de Signed-off-by: Sasha Levin --- kernel/time/posix-timers.c | 1 + 1 file changed, 1 insertion(+) diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c index 4576aaed13b23..896ff735034ce 100644 --- a/kernel/time/posix-timers.c +++ b/kernel/time/posix-timers.c @@ -118,6 +118,7 @@ static int posix_timer_add(struct k_itimer *timer) return id; } spin_unlock(&hash_lock); + cond_resched(); } /* POSIX return code when no timer ID could be allocated */ return -EAGAIN; -- GitLab From ae22452d15c89d3cec3d7e0e5a7041f41c2efb2e Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sat, 8 Mar 2025 17:48:10 +0100 Subject: [PATCH 0167/2211] posix-timers: Ensure that timer initialization is fully visible [ Upstream commit 2389c6efd3ad8edb3bcce0019b4edcc7d9c7de19 ] Frederic pointed out that the memory operations to initialize the timer are not guaranteed to be visible, when __lock_timer() observes timer::it_signal valid under timer::it_lock: T0 T1 --------- ----------- do_timer_create() // A new_timer->.... = .... spin_lock(current->sighand) // B WRITE_ONCE(new_timer->it_signal, current->signal) spin_unlock(current->sighand) sys_timer_*() t = __lock_timer() spin_lock(&timr->it_lock) // observes B if (timr->it_signal == current->signal) return timr; if (!t) return; // Is not guaranteed to observe A Protect the write of timer::it_signal, which makes the timer valid, with timer::it_lock as well. This guarantees that T1 must observe the initialization A completely, when it observes the valid signal pointer under timer::it_lock. sighand::siglock must still be taken to protect the signal::posix_timers list. Reported-by: Frederic Weisbecker Suggested-by: Frederic Weisbecker Signed-off-by: Thomas Gleixner Reviewed-by: Frederic Weisbecker Link: https://lore.kernel.org/all/20250308155623.507944489@linutronix.de Signed-off-by: Sasha Levin --- kernel/time/posix-timers.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c index 896ff735034ce..c5d9bfbb082b8 100644 --- a/kernel/time/posix-timers.c +++ b/kernel/time/posix-timers.c @@ -514,14 +514,21 @@ static int do_timer_create(clockid_t which_clock, struct sigevent *event, if (error) goto out; - spin_lock_irq(¤t->sighand->siglock); - /* This makes the timer valid in the hash table */ - WRITE_ONCE(new_timer->it_signal, current->signal); - hlist_add_head(&new_timer->list, ¤t->signal->posix_timers); - spin_unlock_irq(¤t->sighand->siglock); /* - * After unlocking sighand::siglock @new_timer is subject to - * concurrent removal and cannot be touched anymore + * timer::it_lock ensures that __lock_timer() observes a fully + * initialized timer when it observes a valid timer::it_signal. + * + * sighand::siglock is required to protect signal::posix_timers. + */ + scoped_guard (spinlock_irq, &new_timer->it_lock) { + guard(spinlock)(¤t->sighand->siglock); + /* This makes the timer valid in the hash table */ + WRITE_ONCE(new_timer->it_signal, current->signal); + hlist_add_head(&new_timer->list, ¤t->signal->posix_timers); + } + /* + * After unlocking @new_timer is subject to concurrent removal and + * cannot be touched anymore */ return 0; out: -- GitLab From f933879c5b6a64ca0f5b4a68f0ea8b76c295d6d5 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 8 Mar 2025 21:37:14 +0000 Subject: [PATCH 0168/2211] net: stmmac: dwmac-rk: Validate GRF and peripheral GRF during probe [ Upstream commit 247e84f66a3d1946193d739fec5dc3d69833fd00 ] All Rockchip GMAC variants typically write to GRF regs to control e.g. interface mode, speed and MAC rx/tx delay. Newer SoCs such as RK3576 and RK3588 use a mix of GRF and peripheral GRF regs. These syscon regmaps is located with help of a rockchip,grf and rockchip,php-grf phandle. However, validating the rockchip,grf and rockchip,php-grf syscon regmap is deferred until e.g. interface mode or speed is configured, inside the individual SoC specific operations. Change to validate the rockchip,grf and rockchip,php-grf syscon regmap at probe time to simplify all SoC specific operations. This should not introduce any backward compatibility issues as all GMAC nodes have been added together with a rockchip,grf phandle (and rockchip,php-grf where required) in their initial commit. Signed-off-by: Jonas Karlman Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250308213720.2517944-3-jonas@kwiboo.se Reviewed-by: Sebastian Reichel Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- .../net/ethernet/stmicro/stmmac/dwmac-rk.c | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c index 50073bdade46e..8f90eae937741 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c @@ -33,6 +33,7 @@ struct rk_gmac_ops { void (*set_clock_selection)(struct rk_priv_data *bsp_priv, bool input, bool enable); void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv); + bool php_grf_required; bool regs_valid; u32 regs[]; }; @@ -1263,6 +1264,7 @@ static const struct rk_gmac_ops rk3576_ops = { .set_rgmii_speed = rk3576_set_gmac_speed, .set_rmii_speed = rk3576_set_gmac_speed, .set_clock_selection = rk3576_set_clock_selection, + .php_grf_required = true, .regs_valid = true, .regs = { 0x2a220000, /* gmac0 */ @@ -1410,6 +1412,7 @@ static const struct rk_gmac_ops rk3588_ops = { .set_rgmii_speed = rk3588_set_gmac_speed, .set_rmii_speed = rk3588_set_gmac_speed, .set_clock_selection = rk3588_set_clock_selection, + .php_grf_required = true, .regs_valid = true, .regs = { 0xfe1b0000, /* gmac0 */ @@ -1830,8 +1833,22 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev, bsp_priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,grf"); - bsp_priv->php_grf = syscon_regmap_lookup_by_phandle(dev->of_node, - "rockchip,php-grf"); + if (IS_ERR(bsp_priv->grf)) { + dev_err_probe(dev, PTR_ERR(bsp_priv->grf), + "failed to lookup rockchip,grf\n"); + return ERR_CAST(bsp_priv->grf); + } + + if (ops->php_grf_required) { + bsp_priv->php_grf = + syscon_regmap_lookup_by_phandle(dev->of_node, + "rockchip,php-grf"); + if (IS_ERR(bsp_priv->php_grf)) { + dev_err_probe(dev, PTR_ERR(bsp_priv->php_grf), + "failed to lookup rockchip,php-grf\n"); + return ERR_CAST(bsp_priv->php_grf); + } + } if (plat->phy_node) { bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node, -- GitLab From 6e816a97fa840b129d277a56af3b36196f5ffafb Mon Sep 17 00:00:00 2001 From: Jaakko Karrenpalo Date: Fri, 7 Mar 2025 18:16:59 +0200 Subject: [PATCH 0169/2211] net: hsr: Fix PRP duplicate detection [ Upstream commit 05fd00e5e7b1ac60d264f72423fba38cc382b447 ] Add PRP specific function for handling duplicate packets. This is needed because of potential L2 802.1p prioritization done by network switches. The L2 prioritization can re-order the PRP packets from a node causing the existing implementation to discard the frame(s) that have been received 'late' because the sequence number is before the previous received packet. This can happen if the node is sending multiple frames back-to-back with different priority. Signed-off-by: Jaakko Karrenpalo Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250307161700.1045-1-jkarrenpalo@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/hsr/hsr_device.c | 2 + net/hsr/hsr_forward.c | 4 +- net/hsr/hsr_framereg.c | 95 ++++++++++++++++++++++++++++++++++++++++-- net/hsr/hsr_framereg.h | 8 +++- net/hsr/hsr_main.h | 2 + 5 files changed, 104 insertions(+), 7 deletions(-) diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c index 44048d7538ddc..9d0754b3642fd 100644 --- a/net/hsr/hsr_device.c +++ b/net/hsr/hsr_device.c @@ -543,6 +543,7 @@ static struct hsr_proto_ops hsr_ops = { .drop_frame = hsr_drop_frame, .fill_frame_info = hsr_fill_frame_info, .invalid_dan_ingress_frame = hsr_invalid_dan_ingress_frame, + .register_frame_out = hsr_register_frame_out, }; static struct hsr_proto_ops prp_ops = { @@ -553,6 +554,7 @@ static struct hsr_proto_ops prp_ops = { .fill_frame_info = prp_fill_frame_info, .handle_san_frame = prp_handle_san_frame, .update_san_info = prp_update_san_info, + .register_frame_out = prp_register_frame_out, }; void hsr_dev_setup(struct net_device *dev) diff --git a/net/hsr/hsr_forward.c b/net/hsr/hsr_forward.c index c0217476eb17f..ace4e355d1647 100644 --- a/net/hsr/hsr_forward.c +++ b/net/hsr/hsr_forward.c @@ -524,8 +524,8 @@ static void hsr_forward_do(struct hsr_frame_info *frame) * Also for SAN, this shouldn't be done. */ if (!frame->is_from_san && - hsr_register_frame_out(port, frame->node_src, - frame->sequence_nr)) + hsr->proto_ops->register_frame_out && + hsr->proto_ops->register_frame_out(port, frame)) continue; if (frame->is_supervision && port->type == HSR_PT_MASTER && diff --git a/net/hsr/hsr_framereg.c b/net/hsr/hsr_framereg.c index 73bc6f659812f..85991fab7db58 100644 --- a/net/hsr/hsr_framereg.c +++ b/net/hsr/hsr_framereg.c @@ -35,6 +35,7 @@ static bool seq_nr_after(u16 a, u16 b) #define seq_nr_before(a, b) seq_nr_after((b), (a)) #define seq_nr_before_or_eq(a, b) (!seq_nr_after((a), (b))) +#define PRP_DROP_WINDOW_LEN 32768 bool hsr_addr_is_redbox(struct hsr_priv *hsr, unsigned char *addr) { @@ -176,8 +177,11 @@ static struct hsr_node *hsr_add_node(struct hsr_priv *hsr, new_node->time_in[i] = now; new_node->time_out[i] = now; } - for (i = 0; i < HSR_PT_PORTS; i++) + for (i = 0; i < HSR_PT_PORTS; i++) { new_node->seq_out[i] = seq_out; + new_node->seq_expected[i] = seq_out + 1; + new_node->seq_start[i] = seq_out + 1; + } if (san && hsr->proto_ops->handle_san_frame) hsr->proto_ops->handle_san_frame(san, rx_port, new_node); @@ -482,9 +486,11 @@ void hsr_register_frame_in(struct hsr_node *node, struct hsr_port *port, * 0 otherwise, or * negative error code on error */ -int hsr_register_frame_out(struct hsr_port *port, struct hsr_node *node, - u16 sequence_nr) +int hsr_register_frame_out(struct hsr_port *port, struct hsr_frame_info *frame) { + struct hsr_node *node = frame->node_src; + u16 sequence_nr = frame->sequence_nr; + spin_lock_bh(&node->seq_out_lock); if (seq_nr_before_or_eq(sequence_nr, node->seq_out[port->type]) && time_is_after_jiffies(node->time_out[port->type] + @@ -499,6 +505,89 @@ int hsr_register_frame_out(struct hsr_port *port, struct hsr_node *node, return 0; } +/* Adaptation of the PRP duplicate discard algorithm described in wireshark + * wiki (https://wiki.wireshark.org/PRP) + * + * A drop window is maintained for both LANs with start sequence set to the + * first sequence accepted on the LAN that has not been seen on the other LAN, + * and expected sequence set to the latest received sequence number plus one. + * + * When a frame is received on either LAN it is compared against the received + * frames on the other LAN. If it is outside the drop window of the other LAN + * the frame is accepted and the drop window is updated. + * The drop window for the other LAN is reset. + * + * 'port' is the outgoing interface + * 'frame' is the frame to be sent + * + * Return: + * 1 if frame can be shown to have been sent recently on this interface, + * 0 otherwise + */ +int prp_register_frame_out(struct hsr_port *port, struct hsr_frame_info *frame) +{ + enum hsr_port_type other_port; + enum hsr_port_type rcv_port; + struct hsr_node *node; + u16 sequence_diff; + u16 sequence_exp; + u16 sequence_nr; + + /* out-going frames are always in order + * and can be checked the same way as for HSR + */ + if (frame->port_rcv->type == HSR_PT_MASTER) + return hsr_register_frame_out(port, frame); + + /* for PRP we should only forward frames from the slave ports + * to the master port + */ + if (port->type != HSR_PT_MASTER) + return 1; + + node = frame->node_src; + sequence_nr = frame->sequence_nr; + sequence_exp = sequence_nr + 1; + rcv_port = frame->port_rcv->type; + other_port = rcv_port == HSR_PT_SLAVE_A ? HSR_PT_SLAVE_B : + HSR_PT_SLAVE_A; + + spin_lock_bh(&node->seq_out_lock); + if (time_is_before_jiffies(node->time_out[port->type] + + msecs_to_jiffies(HSR_ENTRY_FORGET_TIME)) || + (node->seq_start[rcv_port] == node->seq_expected[rcv_port] && + node->seq_start[other_port] == node->seq_expected[other_port])) { + /* the node hasn't been sending for a while + * or both drop windows are empty, forward the frame + */ + node->seq_start[rcv_port] = sequence_nr; + } else if (seq_nr_before(sequence_nr, node->seq_expected[other_port]) && + seq_nr_before_or_eq(node->seq_start[other_port], sequence_nr)) { + /* drop the frame, update the drop window for the other port + * and reset our drop window + */ + node->seq_start[other_port] = sequence_exp; + node->seq_expected[rcv_port] = sequence_exp; + node->seq_start[rcv_port] = node->seq_expected[rcv_port]; + spin_unlock_bh(&node->seq_out_lock); + return 1; + } + + /* update the drop window for the port where this frame was received + * and clear the drop window for the other port + */ + node->seq_start[other_port] = node->seq_expected[other_port]; + node->seq_expected[rcv_port] = sequence_exp; + sequence_diff = sequence_exp - node->seq_start[rcv_port]; + if (sequence_diff > PRP_DROP_WINDOW_LEN) + node->seq_start[rcv_port] = sequence_exp - PRP_DROP_WINDOW_LEN; + + node->time_out[port->type] = jiffies; + node->seq_out[port->type] = sequence_nr; + spin_unlock_bh(&node->seq_out_lock); + return 0; +} + static struct hsr_port *get_late_port(struct hsr_priv *hsr, struct hsr_node *node) { diff --git a/net/hsr/hsr_framereg.h b/net/hsr/hsr_framereg.h index 993fa950d8144..b04948659d84d 100644 --- a/net/hsr/hsr_framereg.h +++ b/net/hsr/hsr_framereg.h @@ -44,8 +44,7 @@ void hsr_addr_subst_dest(struct hsr_node *node_src, struct sk_buff *skb, void hsr_register_frame_in(struct hsr_node *node, struct hsr_port *port, u16 sequence_nr); -int hsr_register_frame_out(struct hsr_port *port, struct hsr_node *node, - u16 sequence_nr); +int hsr_register_frame_out(struct hsr_port *port, struct hsr_frame_info *frame); void hsr_prune_nodes(struct timer_list *t); void hsr_prune_proxy_nodes(struct timer_list *t); @@ -73,6 +72,8 @@ void prp_update_san_info(struct hsr_node *node, bool is_sup); bool hsr_is_node_in_db(struct list_head *node_db, const unsigned char addr[ETH_ALEN]); +int prp_register_frame_out(struct hsr_port *port, struct hsr_frame_info *frame); + struct hsr_node { struct list_head mac_list; /* Protect R/W access to seq_out */ @@ -89,6 +90,9 @@ struct hsr_node { bool san_b; u16 seq_out[HSR_PT_PORTS]; bool removed; + /* PRP specific duplicate handling */ + u16 seq_expected[HSR_PT_PORTS]; + u16 seq_start[HSR_PT_PORTS]; struct rcu_head rcu_head; }; diff --git a/net/hsr/hsr_main.h b/net/hsr/hsr_main.h index fcfeb79bb0401..e26244456f639 100644 --- a/net/hsr/hsr_main.h +++ b/net/hsr/hsr_main.h @@ -183,6 +183,8 @@ struct hsr_proto_ops { struct hsr_frame_info *frame); bool (*invalid_dan_ingress_frame)(__be16 protocol); void (*update_san_info)(struct hsr_node *node, bool is_sup); + int (*register_frame_out)(struct hsr_port *port, + struct hsr_frame_info *frame); }; struct hsr_self_node { -- GitLab From 3fb9ee05ec15ff3d60a1217f65228221fbace3c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Tue, 11 Mar 2025 10:54:47 +0100 Subject: [PATCH 0170/2211] timer_list: Don't use %pK through printk() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit a52067c24ccf6ee4c85acffa0f155e9714f9adce ] This reverts commit f590308536db ("timer debug: Hide kernel addresses via %pK in /proc/timer_list") The timer list helper SEQ_printf() uses either the real seq_printf() for procfs output or vprintk() to print to the kernel log, when invoked from SysRq-q. It uses %pK for printing pointers. In the past %pK was prefered over %p as it would not leak raw pointer values into the kernel log. Since commit ad67b74d2469 ("printk: hash addresses printed with %p") the regular %p has been improved to avoid this issue. Furthermore, restricted pointers ("%pK") were never meant to be used through printk(). They can still unintentionally leak raw pointers or acquire sleeping looks in atomic contexts. Switch to the regular pointer formatting which is safer, easier to reason about and sufficient here. Signed-off-by: Thomas Weißschuh Signed-off-by: Thomas Gleixner Link: https://lore.kernel.org/lkml/20250113171731-dc10e3c1-da64-4af0-b767-7c7070468023@linutronix.de/ Link: https://lore.kernel.org/all/20250311-restricted-pointers-timer-v1-1-6626b91e54ab@linutronix.de Signed-off-by: Sasha Levin --- kernel/time/timer_list.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/time/timer_list.c b/kernel/time/timer_list.c index 1c311c46da507..cfbb46cc4e761 100644 --- a/kernel/time/timer_list.c +++ b/kernel/time/timer_list.c @@ -46,7 +46,7 @@ static void print_timer(struct seq_file *m, struct hrtimer *taddr, struct hrtimer *timer, int idx, u64 now) { - SEQ_printf(m, " #%d: <%pK>, %ps", idx, taddr, timer->function); + SEQ_printf(m, " #%d: <%p>, %ps", idx, taddr, timer->function); SEQ_printf(m, ", S:%02x", timer->state); SEQ_printf(m, "\n"); SEQ_printf(m, " # expires at %Lu-%Lu nsecs [in %Ld to %Ld nsecs]\n", @@ -98,7 +98,7 @@ next_one: static void print_base(struct seq_file *m, struct hrtimer_clock_base *base, u64 now) { - SEQ_printf(m, " .base: %pK\n", base); + SEQ_printf(m, " .base: %p\n", base); SEQ_printf(m, " .index: %d\n", base->index); SEQ_printf(m, " .resolution: %u nsecs\n", hrtimer_resolution); -- GitLab From 42101748275867dbcf8a527891687ab5a4c1e28a Mon Sep 17 00:00:00 2001 From: Dian-Syuan Yang Date: Thu, 6 Mar 2025 10:11:44 +0800 Subject: [PATCH 0171/2211] wifi: rtw89: set force HE TB mode when connecting to 11ax AP [ Upstream commit a9b56f219a0fa550f92e65ac58443a7892380e09 ] Some of 11ax AP set the UL HE-SIG-A2 reserved subfield to all 0s, which will cause the 11be chip to recognize trigger frame as EHT. We propose a method to bypass the "UL HE-SIG-A2 reserved subfield" and always uses HE TB in response to the AP's trigger frame. Signed-off-by: Dian-Syuan Yang Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250306021144.12854-6-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/mac.c | 26 +++++++++++++++++++ drivers/net/wireless/realtek/rtw89/mac.h | 2 ++ drivers/net/wireless/realtek/rtw89/mac80211.c | 1 + drivers/net/wireless/realtek/rtw89/reg.h | 4 +++ 4 files changed, 33 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c index 4574aa62839b0..04e254bd6b17f 100644 --- a/drivers/net/wireless/realtek/rtw89/mac.c +++ b/drivers/net/wireless/realtek/rtw89/mac.c @@ -4745,6 +4745,32 @@ void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev, rtw89_write32_set(rtwdev, reg, mac->narrow_bw_ru_dis.mask); } +void rtw89_mac_set_he_tb(struct rtw89_dev *rtwdev, + struct rtw89_vif_link *rtwvif_link) +{ + struct ieee80211_bss_conf *bss_conf; + bool set; + u32 reg; + + if (rtwdev->chip->chip_gen != RTW89_CHIP_BE) + return; + + rcu_read_lock(); + + bss_conf = rtw89_vif_rcu_dereference_link(rtwvif_link, true); + set = bss_conf->he_support && !bss_conf->eht_support; + + rcu_read_unlock(); + + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CLIENT_OM_CTRL, + rtwvif_link->mac_idx); + + if (set) + rtw89_write32_set(rtwdev, reg, B_BE_TRIG_DIS_EHTTB); + else + rtw89_write32_clr(rtwdev, reg, B_BE_TRIG_DIS_EHTTB); +} + void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link) { rtw89_mac_port_cfg_func_sw(rtwdev, rtwvif_link); diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h index 0c269961a5731..5ba1133b79d64 100644 --- a/drivers/net/wireless/realtek/rtw89/mac.h +++ b/drivers/net/wireless/realtek/rtw89/mac.h @@ -1160,6 +1160,8 @@ void rtw89_mac_port_cfg_rx_sync(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, bool en); void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link); +void rtw89_mac_set_he_tb(struct rtw89_dev *rtwdev, + struct rtw89_vif_link *rtwvif_link); void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link); void rtw89_mac_enable_beacon_for_ap_vifs(struct rtw89_dev *rtwdev, bool en); int rtw89_mac_remove_vif(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif); diff --git a/drivers/net/wireless/realtek/rtw89/mac80211.c b/drivers/net/wireless/realtek/rtw89/mac80211.c index 8351a70d325d4..3a1a2b243adf0 100644 --- a/drivers/net/wireless/realtek/rtw89/mac80211.c +++ b/drivers/net/wireless/realtek/rtw89/mac80211.c @@ -669,6 +669,7 @@ static void __rtw89_ops_bss_link_assoc(struct rtw89_dev *rtwdev, rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, rtwvif_link); rtw89_mac_port_update(rtwdev, rtwvif_link); rtw89_mac_set_he_obss_narrow_bw_ru(rtwdev, rtwvif_link); + rtw89_mac_set_he_tb(rtwdev, rtwvif_link); } static void __rtw89_ops_bss_assoc(struct rtw89_dev *rtwdev, diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h index 69678eab23093..9fbcc7fee290f 100644 --- a/drivers/net/wireless/realtek/rtw89/reg.h +++ b/drivers/net/wireless/realtek/rtw89/reg.h @@ -7093,6 +7093,10 @@ #define B_BE_MACLBK_RDY_NUM_MASK GENMASK(7, 3) #define B_BE_MACLBK_EN BIT(0) +#define R_BE_CLIENT_OM_CTRL 0x11040 +#define R_BE_CLIENT_OM_CTRL_C1 0x15040 +#define B_BE_TRIG_DIS_EHTTB BIT(24) + #define R_BE_WMAC_NAV_CTL 0x11080 #define R_BE_WMAC_NAV_CTL_C1 0x15080 #define B_BE_WMAC_NAV_UPPER_EN BIT(26) -- GitLab From 21153e0974fccb6aa9fa8db6dd5e902c4c664747 Mon Sep 17 00:00:00 2001 From: Nicolas Bouchinet Date: Wed, 29 Jan 2025 18:06:30 +0100 Subject: [PATCH 0172/2211] netfilter: conntrack: Bound nf_conntrack sysctl writes [ Upstream commit 8b6861390ffee6b8ed78b9395e3776c16fec6579 ] nf_conntrack_max and nf_conntrack_expect_max sysctls were authorized to be written any negative value, which would then be stored in the unsigned int variables nf_conntrack_max and nf_ct_expect_max variables. While the do_proc_dointvec_conv function is supposed to limit writing handled by proc_dointvec proc_handler to INT_MAX. Such a negative value being written in an unsigned int leads to a very high value, exceeding this limit. Moreover, the nf_conntrack_expect_max sysctl documentation specifies the minimum value is 1. The proc_handlers have thus been updated to proc_dointvec_minmax in order to specify the following write bounds : * Bound nf_conntrack_max sysctl writings between SYSCTL_ZERO and SYSCTL_INT_MAX. * Bound nf_conntrack_expect_max sysctl writings between SYSCTL_ONE and SYSCTL_INT_MAX as defined in the sysctl documentation. With this patch applied, sysctl writes outside the defined in the bound will thus lead to a write error : ``` sysctl -w net.netfilter.nf_conntrack_expect_max=-1 sysctl: setting key "net.netfilter.nf_conntrack_expect_max": Invalid argument ``` Signed-off-by: Nicolas Bouchinet Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- net/netfilter/nf_conntrack_standalone.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index 7d4f0fa8b609d..3ea60ff7a6a49 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c @@ -619,7 +619,9 @@ static struct ctl_table nf_ct_sysctl_table[] = { .data = &nf_conntrack_max, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_INT_MAX, }, [NF_SYSCTL_CT_COUNT] = { .procname = "nf_conntrack_count", @@ -655,7 +657,9 @@ static struct ctl_table nf_ct_sysctl_table[] = { .data = &nf_ct_expect_max, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ONE, + .extra2 = SYSCTL_INT_MAX, }, [NF_SYSCTL_CT_ACCT] = { .procname = "nf_conntrack_acct", @@ -948,7 +952,9 @@ static struct ctl_table nf_ct_netfilter_table[] = { .data = &nf_conntrack_max, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_INT_MAX, }, }; -- GitLab From 236a87e9d21105438a05fdf39e75526341e4bc42 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Mon, 10 Mar 2025 15:24:33 -0700 Subject: [PATCH 0173/2211] PNP: Expand length of fixup id string [ Upstream commit 425b1c97b07f2290700f708edabef32861e2b2db ] GCC 15's -Wunterminated-string-initialization saw that "id" was not including the required trailing NUL character. Instead of marking "id" with __nonstring[1], expand the length of the string as it is used in (debugging) format strings that expect a properly formed C string. Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117178 [1] Signed-off-by: Kees Cook Link: https://patch.msgid.link/20250310222432.work.826-kees@kernel.org Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- include/linux/pnp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/pnp.h b/include/linux/pnp.h index b7a7158aaf65e..23fe3eaf242d6 100644 --- a/include/linux/pnp.h +++ b/include/linux/pnp.h @@ -290,7 +290,7 @@ static inline void pnp_set_drvdata(struct pnp_dev *pdev, void *data) } struct pnp_fixup { - char id[7]; + char id[8]; void (*quirk_function) (struct pnp_dev *dev); /* fixup function */ }; -- GitLab From 4f89f257f32da7f5cd5312bc44b47b2be56ee597 Mon Sep 17 00:00:00 2001 From: Andy Yan Date: Wed, 12 Mar 2025 16:00:07 +0800 Subject: [PATCH 0174/2211] phy: rockchip: usbdp: Only verify link rates/lanes/voltage when the corresponding set flags are set [ Upstream commit 969a38be437b68dc9e12e3c3f08911c9f9c8be73 ] According documentation of phy_configure_opts_dp, at the configure stage, link rates should only be verify/configure when set_rate flag is set, the same applies to lanes and voltage. So do it as the documentation says. Because voltage setting depends on the lanes, link rates set previously, so record the link rates and lanes at it's verify stage. Signed-off-by: Andy Yan Link: https://lore.kernel.org/r/20250312080041.524546-1-andyshrk@163.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/phy/rockchip/phy-rockchip-usbdp.c | 87 ++++++++++++++--------- 1 file changed, 53 insertions(+), 34 deletions(-) diff --git a/drivers/phy/rockchip/phy-rockchip-usbdp.c b/drivers/phy/rockchip/phy-rockchip-usbdp.c index f5c6d264d89ed..d2021f7941e3e 100644 --- a/drivers/phy/rockchip/phy-rockchip-usbdp.c +++ b/drivers/phy/rockchip/phy-rockchip-usbdp.c @@ -187,6 +187,8 @@ struct rk_udphy { u32 dp_aux_din_sel; bool dp_sink_hpd_sel; bool dp_sink_hpd_cfg; + unsigned int link_rate; + unsigned int lanes; u8 bw; int id; @@ -1102,15 +1104,19 @@ static int rk_udphy_dp_phy_power_off(struct phy *phy) return 0; } -static int rk_udphy_dp_phy_verify_link_rate(unsigned int link_rate) +/* + * Verify link rate + */ +static int rk_udphy_dp_phy_verify_link_rate(struct rk_udphy *udphy, + struct phy_configure_opts_dp *dp) { - switch (link_rate) { + switch (dp->link_rate) { case 1620: case 2700: case 5400: case 8100: + udphy->link_rate = dp->link_rate; break; - default: return -EINVAL; } @@ -1118,45 +1124,44 @@ static int rk_udphy_dp_phy_verify_link_rate(unsigned int link_rate) return 0; } -static int rk_udphy_dp_phy_verify_config(struct rk_udphy *udphy, - struct phy_configure_opts_dp *dp) +static int rk_udphy_dp_phy_verify_lanes(struct rk_udphy *udphy, + struct phy_configure_opts_dp *dp) { - int i, ret; - - /* If changing link rate was required, verify it's supported. */ - ret = rk_udphy_dp_phy_verify_link_rate(dp->link_rate); - if (ret) - return ret; - - /* Verify lane count. */ switch (dp->lanes) { case 1: case 2: case 4: /* valid lane count. */ + udphy->lanes = dp->lanes; break; default: return -EINVAL; } - /* - * If changing voltages is required, check swing and pre-emphasis - * levels, per-lane. - */ - if (dp->set_voltages) { - /* Lane count verified previously. */ - for (i = 0; i < dp->lanes; i++) { - if (dp->voltage[i] > 3 || dp->pre[i] > 3) - return -EINVAL; + return 0; +} - /* - * Sum of voltage swing and pre-emphasis levels cannot - * exceed 3. - */ - if (dp->voltage[i] + dp->pre[i] > 3) - return -EINVAL; - } +/* + * If changing voltages is required, check swing and pre-emphasis + * levels, per-lane. + */ +static int rk_udphy_dp_phy_verify_voltages(struct rk_udphy *udphy, + struct phy_configure_opts_dp *dp) +{ + int i; + + /* Lane count verified previously. */ + for (i = 0; i < udphy->lanes; i++) { + if (dp->voltage[i] > 3 || dp->pre[i] > 3) + return -EINVAL; + + /* + * Sum of voltage swing and pre-emphasis levels cannot + * exceed 3. + */ + if (dp->voltage[i] + dp->pre[i] > 3) + return -EINVAL; } return 0; @@ -1196,9 +1201,23 @@ static int rk_udphy_dp_phy_configure(struct phy *phy, u32 i, val, lane; int ret; - ret = rk_udphy_dp_phy_verify_config(udphy, dp); - if (ret) - return ret; + if (dp->set_rate) { + ret = rk_udphy_dp_phy_verify_link_rate(udphy, dp); + if (ret) + return ret; + } + + if (dp->set_lanes) { + ret = rk_udphy_dp_phy_verify_lanes(udphy, dp); + if (ret) + return ret; + } + + if (dp->set_voltages) { + ret = rk_udphy_dp_phy_verify_voltages(udphy, dp); + if (ret) + return ret; + } if (dp->set_rate) { regmap_update_bits(udphy->pma_regmap, CMN_DP_RSTN_OFFSET, @@ -1243,9 +1262,9 @@ static int rk_udphy_dp_phy_configure(struct phy *phy, } if (dp->set_voltages) { - for (i = 0; i < dp->lanes; i++) { + for (i = 0; i < udphy->lanes; i++) { lane = udphy->dp_lane_sel[i]; - switch (dp->link_rate) { + switch (udphy->link_rate) { case 1620: case 2700: regmap_update_bits(udphy->pma_regmap, -- GitLab From 6215143ad372d1e5f0bb5e2e934a426758653d09 Mon Sep 17 00:00:00 2001 From: Ryan Roberts Date: Fri, 21 Feb 2025 10:12:26 +0530 Subject: [PATCH 0175/2211] arm64/mm: Check pmd_table() in pmd_trans_huge() [ Upstream commit d1770e909898c108e8c7d30ca039053e8818a9c9 ] Check for pmd_table() in pmd_trans_huge() rather then just checking for the PMD_TABLE_BIT. But ensure all present-invalid entries are handled correctly by always setting PTE_VALID before checking with pmd_table(). Cc: Will Deacon Cc: Ard Biesheuvel Cc: Ryan Roberts Cc: Mark Rutland Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Ryan Roberts Signed-off-by: Anshuman Khandual Link: https://lore.kernel.org/r/20250221044227.1145393-8-anshuman.khandual@arm.com Signed-off-by: Catalin Marinas Signed-off-by: Sasha Levin --- arch/arm64/include/asm/pgtable.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index c329ea061dc98..8ee56ae999c16 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h @@ -554,18 +554,6 @@ static inline int pmd_protnone(pmd_t pmd) #endif #define pmd_present(pmd) pte_present(pmd_pte(pmd)) - -/* - * THP definitions. - */ - -#ifdef CONFIG_TRANSPARENT_HUGEPAGE -static inline int pmd_trans_huge(pmd_t pmd) -{ - return pmd_val(pmd) && pmd_present(pmd) && !(pmd_val(pmd) & PMD_TABLE_BIT); -} -#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ - #define pmd_dirty(pmd) pte_dirty(pmd_pte(pmd)) #define pmd_young(pmd) pte_young(pmd_pte(pmd)) #define pmd_valid(pmd) pte_valid(pmd_pte(pmd)) @@ -725,6 +713,18 @@ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, #define pmd_leaf_size(pmd) (pmd_cont(pmd) ? CONT_PMD_SIZE : PMD_SIZE) #define pte_leaf_size(pte) (pte_cont(pte) ? CONT_PTE_SIZE : PAGE_SIZE) +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +static inline int pmd_trans_huge(pmd_t pmd) +{ + /* + * If pmd is present-invalid, pmd_table() won't detect it + * as a table, so force the valid bit for the comparison. + */ + return pmd_val(pmd) && pmd_present(pmd) && + !pmd_table(__pmd(pmd_val(pmd) | PTE_VALID)); +} +#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ + #if defined(CONFIG_ARM64_64K_PAGES) || CONFIG_PGTABLE_LEVELS < 3 static inline bool pud_sect(pud_t pud) { return false; } static inline bool pud_table(pud_t pud) { return true; } -- GitLab From 8ad58a7eba6db85301d873d91a51b49fdb6505ef Mon Sep 17 00:00:00 2001 From: Ryan Roberts Date: Fri, 21 Feb 2025 10:12:25 +0530 Subject: [PATCH 0176/2211] arm64/mm: Check PUD_TYPE_TABLE in pud_bad() [ Upstream commit bfb1d2b9021c21891427acc86eb848ccedeb274e ] pud_bad() is currently defined in terms of pud_table(). Although for some configs, pud_table() is hard-coded to true i.e. when using 64K base pages or when page table levels are less than 3. pud_bad() is intended to check that the pud is configured correctly. Hence let's open-code the same check that the full version of pud_table() uses into pud_bad(). Then it always performs the check regardless of the config. Cc: Will Deacon Cc: Ard Biesheuvel Cc: Ryan Roberts Cc: Mark Rutland Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Ryan Roberts Signed-off-by: Anshuman Khandual Link: https://lore.kernel.org/r/20250221044227.1145393-7-anshuman.khandual@arm.com Signed-off-by: Catalin Marinas Signed-off-by: Sasha Levin --- arch/arm64/include/asm/pgtable.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index 8ee56ae999c16..5ba8376735cb0 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h @@ -806,7 +806,8 @@ static inline unsigned long pmd_page_vaddr(pmd_t pmd) pr_err("%s:%d: bad pmd %016llx.\n", __FILE__, __LINE__, pmd_val(e)) #define pud_none(pud) (!pud_val(pud)) -#define pud_bad(pud) (!pud_table(pud)) +#define pud_bad(pud) ((pud_val(pud) & PUD_TYPE_MASK) != \ + PUD_TYPE_TABLE) #define pud_present(pud) pte_present(pud_pte(pud)) #ifndef __PAGETABLE_PMD_FOLDED #define pud_leaf(pud) (pud_present(pud) && !pud_table(pud)) -- GitLab From 38828e0dc771c730c9289d4a6deb8815ad3867ed Mon Sep 17 00:00:00 2001 From: Kaustabh Chakraborty Date: Wed, 19 Feb 2025 00:17:49 +0530 Subject: [PATCH 0177/2211] mmc: dw_mmc: add exynos7870 DW MMC support [ Upstream commit 7cbe799ac10fd8be85af5e0615c4337f81e575f3 ] Add support for Exynos7870 DW MMC controllers, for both SMU and non-SMU variants. These controllers require a quirk to access 64-bit FIFO in 32-bit accesses (DW_MMC_QUIRK_FIFO64_32). Signed-off-by: Kaustabh Chakraborty Link: https://lore.kernel.org/r/20250219-exynos7870-mmc-v2-3-b4255a3e39ed@disroot.org Signed-off-by: Ulf Hansson Signed-off-by: Sasha Levin --- drivers/mmc/host/dw_mmc-exynos.c | 41 +++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/dw_mmc-exynos.c b/drivers/mmc/host/dw_mmc-exynos.c index 6dc057718d2cb..89682f10e69f3 100644 --- a/drivers/mmc/host/dw_mmc-exynos.c +++ b/drivers/mmc/host/dw_mmc-exynos.c @@ -27,6 +27,8 @@ enum dw_mci_exynos_type { DW_MCI_TYPE_EXYNOS5420_SMU, DW_MCI_TYPE_EXYNOS7, DW_MCI_TYPE_EXYNOS7_SMU, + DW_MCI_TYPE_EXYNOS7870, + DW_MCI_TYPE_EXYNOS7870_SMU, DW_MCI_TYPE_ARTPEC8, }; @@ -69,6 +71,12 @@ static struct dw_mci_exynos_compatible { }, { .compatible = "samsung,exynos7-dw-mshc-smu", .ctrl_type = DW_MCI_TYPE_EXYNOS7_SMU, + }, { + .compatible = "samsung,exynos7870-dw-mshc", + .ctrl_type = DW_MCI_TYPE_EXYNOS7870, + }, { + .compatible = "samsung,exynos7870-dw-mshc-smu", + .ctrl_type = DW_MCI_TYPE_EXYNOS7870_SMU, }, { .compatible = "axis,artpec8-dw-mshc", .ctrl_type = DW_MCI_TYPE_ARTPEC8, @@ -85,6 +93,8 @@ static inline u8 dw_mci_exynos_get_ciu_div(struct dw_mci *host) return EXYNOS4210_FIXED_CIU_CLK_DIV; else if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU || priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) return SDMMC_CLKSEL_GET_DIV(mci_readl(host, CLKSEL64)) + 1; else @@ -100,7 +110,8 @@ static void dw_mci_exynos_config_smu(struct dw_mci *host) * set for non-ecryption mode at this time. */ if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS5420_SMU || - priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) { + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU) { mci_writel(host, MPSBEGIN0, 0); mci_writel(host, MPSEND0, SDMMC_ENDING_SEC_NR_MAX); mci_writel(host, MPSCTRL0, SDMMC_MPSCTRL_SECURE_WRITE_BIT | @@ -126,6 +137,12 @@ static int dw_mci_exynos_priv_init(struct dw_mci *host) DQS_CTRL_GET_RD_DELAY(priv->saved_strobe_ctrl); } + if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU) { + /* Quirk needed for certain Exynos SoCs */ + host->quirks |= DW_MMC_QUIRK_FIFO64_32; + } + if (priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) { /* Quirk needed for the ARTPEC-8 SoC */ host->quirks |= DW_MMC_QUIRK_EXTENDED_TMOUT; @@ -143,6 +160,8 @@ static void dw_mci_exynos_set_clksel_timing(struct dw_mci *host, u32 timing) if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU || priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) clksel = mci_readl(host, CLKSEL64); else @@ -152,6 +171,8 @@ static void dw_mci_exynos_set_clksel_timing(struct dw_mci *host, u32 timing) if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU || priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) mci_writel(host, CLKSEL64, clksel); else @@ -222,6 +243,8 @@ static int dw_mci_exynos_resume_noirq(struct device *dev) if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU || priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) clksel = mci_readl(host, CLKSEL64); else @@ -230,6 +253,8 @@ static int dw_mci_exynos_resume_noirq(struct device *dev) if (clksel & SDMMC_CLKSEL_WAKEUP_INT) { if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU || priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) mci_writel(host, CLKSEL64, clksel); else @@ -409,6 +434,8 @@ static inline u8 dw_mci_exynos_get_clksmpl(struct dw_mci *host) if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU || priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) return SDMMC_CLKSEL_CCLK_SAMPLE(mci_readl(host, CLKSEL64)); else @@ -422,6 +449,8 @@ static inline void dw_mci_exynos_set_clksmpl(struct dw_mci *host, u8 sample) if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU || priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) clksel = mci_readl(host, CLKSEL64); else @@ -429,6 +458,8 @@ static inline void dw_mci_exynos_set_clksmpl(struct dw_mci *host, u8 sample) clksel = SDMMC_CLKSEL_UP_SAMPLE(clksel, sample); if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU || priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) mci_writel(host, CLKSEL64, clksel); else @@ -443,6 +474,8 @@ static inline u8 dw_mci_exynos_move_next_clksmpl(struct dw_mci *host) if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU || priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) clksel = mci_readl(host, CLKSEL64); else @@ -453,6 +486,8 @@ static inline u8 dw_mci_exynos_move_next_clksmpl(struct dw_mci *host) if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 || + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU || priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) mci_writel(host, CLKSEL64, clksel); else @@ -632,6 +667,10 @@ static const struct of_device_id dw_mci_exynos_match[] = { .data = &exynos_drv_data, }, { .compatible = "samsung,exynos7-dw-mshc-smu", .data = &exynos_drv_data, }, + { .compatible = "samsung,exynos7870-dw-mshc", + .data = &exynos_drv_data, }, + { .compatible = "samsung,exynos7870-dw-mshc-smu", + .data = &exynos_drv_data, }, { .compatible = "axis,artpec8-dw-mshc", .data = &artpec_drv_data, }, {}, -- GitLab From 28306c58daf81bdfb01b1f12fa5936a1d5afbefa Mon Sep 17 00:00:00 2001 From: Erick Shepherd Date: Tue, 11 Feb 2025 15:46:45 -0600 Subject: [PATCH 0178/2211] mmc: sdhci: Disable SD card clock before changing parameters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit fb3bbc46c94f261b6156ee863c1b06c84cf157dc ] Per the SD Host Controller Simplified Specification v4.20 §3.2.3, change the SD card clock parameters only after first disabling the external card clock. Doing this fixes a spurious clock pulse on Baytrail and Apollo Lake SD controllers which otherwise breaks voltage switching with a specific Swissbit SD card. Signed-off-by: Kyle Roeschley Signed-off-by: Brad Mouring Signed-off-by: Erick Shepherd Acked-by: Adrian Hunter Link: https://lore.kernel.org/r/20250211214645.469279-1-erick.shepherd@ni.com Signed-off-by: Ulf Hansson Signed-off-by: Sasha Levin --- drivers/mmc/host/sdhci.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 4b91c9e966357..8ae76300d157d 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -2035,10 +2035,15 @@ void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) host->mmc->actual_clock = 0; - sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL); + clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); + if (clk & SDHCI_CLOCK_CARD_EN) + sdhci_writew(host, clk & ~SDHCI_CLOCK_CARD_EN, + SDHCI_CLOCK_CONTROL); - if (clock == 0) + if (clock == 0) { + sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL); return; + } clk = sdhci_calc_clk(host, clock, &host->mmc->actual_clock); sdhci_enable_clk(host, clk); -- GitLab From 3a75fe58a164a22eada1c4ac8a1cbf53ca26625e Mon Sep 17 00:00:00 2001 From: Michal Pecio Date: Tue, 11 Mar 2025 17:45:50 +0200 Subject: [PATCH 0179/2211] usb: xhci: Don't change the status of stalled TDs on failed Stop EP [ Upstream commit dfc88357b6b6356dadea06b2c0bc8041f5e11720 ] When the device stalls an endpoint, current TD is assigned -EPIPE status and Reset Endpoint is queued. If a Stop Endpoint is pending at the time, it will run before Reset Endpoint and fail due to the stall. Its handler will change TD's status to -EPROTO before Reset Endpoint handler runs and initiates giveback. Check if the stall has already been handled and don't try to do it again. Since xhci_handle_halted_endpoint() performs this check too, not overwriting td->status is the only difference. I haven't seen this case yet, but I have seen a related one where the xHC has already executed Reset Endpoint, EP Context state is now Stopped and EP_HALTED is set. If the xHC took a bit longer to execute Reset Endpoint, said case would become this one. Signed-off-by: Michal Pecio Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20250311154551.4035726-3-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/host/xhci-ring.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 3e70e4f6bf083..fbc8419a54730 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -1156,7 +1156,14 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id, */ switch (GET_EP_CTX_STATE(ep_ctx)) { case EP_STATE_HALTED: - xhci_dbg(xhci, "Stop ep completion raced with stall, reset ep\n"); + xhci_dbg(xhci, "Stop ep completion raced with stall\n"); + /* + * If the halt happened before Stop Endpoint failed, its transfer event + * should have already been handled and Reset Endpoint should be pending. + */ + if (ep->ep_state & EP_HALTED) + goto reset_done; + if (ep->ep_state & EP_HAS_STREAMS) { reset_type = EP_SOFT_RESET; } else { @@ -1167,8 +1174,11 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id, } /* reset ep, reset handler cleans up cancelled tds */ err = xhci_handle_halted_endpoint(xhci, ep, td, reset_type); + xhci_dbg(xhci, "Stop ep completion resetting ep, status %d\n", err); if (err) break; +reset_done: + /* Reset EP handler will clean up cancelled TDs */ ep->ep_state &= ~EP_STOP_CMD_PENDING; return; case EP_STATE_STOPPED: -- GitLab From aef1b639ae2a8a966118c45bda1559419cea7ac6 Mon Sep 17 00:00:00 2001 From: Avraham Stern Date: Sat, 8 Mar 2025 23:19:25 +0200 Subject: [PATCH 0180/2211] wifi: iwlwifi: mvm: fix setting the TK when associated [ Upstream commit 3ad61970ac9e164be1b09b46c01aa942e8966132 ] When running secured ranging and the initiator is associated with the responder, the TK was not set in the range request command. Fix it. Signed-off-by: Avraham Stern Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250308231427.603dc31579d9.Icd19d797e56483c08dd22c55b96fee481c4d2f3d@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c b/drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c index 55245f913286b..2ed7a0d77ef83 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c @@ -773,7 +773,11 @@ iwl_mvm_ftm_set_secured_ranging(struct iwl_mvm *mvm, struct ieee80211_vif *vif, target.bssid = bssid; target.cipher = cipher; + target.tk = NULL; ieee80211_iter_keys(mvm->hw, vif, iter, &target); + + if (!WARN_ON(!target.tk)) + memcpy(tk, target.tk, TK_11AZ_LEN); } else { memcpy(tk, entry->tk, sizeof(entry->tk)); } -- GitLab From a21f1607d0b3c7328333c9b3bfda4087d88a6e13 Mon Sep 17 00:00:00 2001 From: Kurt Borja Date: Tue, 4 Mar 2025 00:52:50 -0500 Subject: [PATCH 0181/2211] hwmon: (dell-smm) Increment the number of fans [ Upstream commit dbcfcb239b3b452ef8782842c36fb17dd1b9092f ] Some Alienware laptops that support the SMM interface, may have up to 4 fans. Tested on an Alienware x15 r1. Signed-off-by: Kurt Borja Link: https://lore.kernel.org/r/20250304055249.51940-2-kuurtb@gmail.com Signed-off-by: Guenter Roeck Signed-off-by: Sasha Levin --- Documentation/hwmon/dell-smm-hwmon.rst | 14 +++++++------- drivers/hwmon/dell-smm-hwmon.c | 5 ++++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Documentation/hwmon/dell-smm-hwmon.rst b/Documentation/hwmon/dell-smm-hwmon.rst index 74905675d71f9..5a4edb6565cf9 100644 --- a/Documentation/hwmon/dell-smm-hwmon.rst +++ b/Documentation/hwmon/dell-smm-hwmon.rst @@ -32,12 +32,12 @@ Temperature sensors and fans can be queried and set via the standard =============================== ======= ======================================= Name Perm Description =============================== ======= ======================================= -fan[1-3]_input RO Fan speed in RPM. -fan[1-3]_label RO Fan label. -fan[1-3]_min RO Minimal Fan speed in RPM -fan[1-3]_max RO Maximal Fan speed in RPM -fan[1-3]_target RO Expected Fan speed in RPM -pwm[1-3] RW Control the fan PWM duty-cycle. +fan[1-4]_input RO Fan speed in RPM. +fan[1-4]_label RO Fan label. +fan[1-4]_min RO Minimal Fan speed in RPM +fan[1-4]_max RO Maximal Fan speed in RPM +fan[1-4]_target RO Expected Fan speed in RPM +pwm[1-4] RW Control the fan PWM duty-cycle. pwm1_enable WO Enable or disable automatic BIOS fan control (not supported on all laptops, see below for details). @@ -93,7 +93,7 @@ Again, when you find new codes, we'd be happy to have your patches! --------------------------- The driver also exports the fans as thermal cooling devices with -``type`` set to ``dell-smm-fan[1-3]``. This allows for easy fan control +``type`` set to ``dell-smm-fan[1-4]``. This allows for easy fan control using one of the thermal governors. Module parameters diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c index f5bdf842040e6..b043fbd15c9da 100644 --- a/drivers/hwmon/dell-smm-hwmon.c +++ b/drivers/hwmon/dell-smm-hwmon.c @@ -73,7 +73,7 @@ #define DELL_SMM_LEGACY_EXECUTE 0x1 #define DELL_SMM_NO_TEMP 10 -#define DELL_SMM_NO_FANS 3 +#define DELL_SMM_NO_FANS 4 struct smm_regs { unsigned int eax; @@ -1074,11 +1074,14 @@ static const struct hwmon_channel_info * const dell_smm_info[] = { HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_MIN | HWMON_F_MAX | HWMON_F_TARGET, HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_MIN | HWMON_F_MAX | + HWMON_F_TARGET, + HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_MIN | HWMON_F_MAX | HWMON_F_TARGET ), HWMON_CHANNEL_INFO(pwm, HWMON_PWM_INPUT | HWMON_PWM_ENABLE, HWMON_PWM_INPUT, + HWMON_PWM_INPUT, HWMON_PWM_INPUT ), NULL -- GitLab From 063ad8885c7c61ff23ddf5a52c3b5c04968c6a56 Mon Sep 17 00:00:00 2001 From: Robin Murphy Date: Fri, 28 Feb 2025 15:46:32 +0000 Subject: [PATCH 0182/2211] iommu: Keep dev->iommu state consistent [ Upstream commit 3832862eb9c4dfa0e80b2522bfaedbc8a43de97d ] At the moment, if of_iommu_configure() allocates dev->iommu itself via iommu_fwspec_init(), then suffers a DT parsing failure, it cleans up the fwspec but leaves the empty dev_iommu hanging around. So far this is benign (if a tiny bit wasteful), but we'd like to be able to reason about dev->iommu having a consistent and unambiguous lifecycle. Thus make sure that the of_iommu cleanup undoes precisely whatever it did. Signed-off-by: Robin Murphy Reviewed-by: Jason Gunthorpe Link: https://lore.kernel.org/r/d219663a3f23001f23d520a883ac622d70b4e642.1740753261.git.robin.murphy@arm.com Signed-off-by: Joerg Roedel Signed-off-by: Sasha Levin --- drivers/iommu/iommu-priv.h | 2 ++ drivers/iommu/iommu.c | 2 +- drivers/iommu/of_iommu.c | 6 +++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/iommu-priv.h b/drivers/iommu/iommu-priv.h index de5b54eaa8bf1..a5913c0b02a0a 100644 --- a/drivers/iommu/iommu-priv.h +++ b/drivers/iommu/iommu-priv.h @@ -17,6 +17,8 @@ static inline const struct iommu_ops *dev_iommu_ops(struct device *dev) return dev->iommu->iommu_dev->ops; } +void dev_iommu_free(struct device *dev); + const struct iommu_ops *iommu_ops_from_fwnode(const struct fwnode_handle *fwnode); static inline const struct iommu_ops *iommu_fwspec_ops(struct iommu_fwspec *fwspec) diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index cac3dce111689..879009adef407 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -347,7 +347,7 @@ static struct dev_iommu *dev_iommu_get(struct device *dev) return param; } -static void dev_iommu_free(struct device *dev) +void dev_iommu_free(struct device *dev) { struct dev_iommu *param = dev->iommu; diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c index e7a6a1611d193..e3fcab925a547 100644 --- a/drivers/iommu/of_iommu.c +++ b/drivers/iommu/of_iommu.c @@ -118,6 +118,7 @@ static void of_pci_check_device_ats(struct device *dev, struct device_node *np) int of_iommu_configure(struct device *dev, struct device_node *master_np, const u32 *id) { + bool dev_iommu_present; int err; if (!master_np) @@ -129,6 +130,7 @@ int of_iommu_configure(struct device *dev, struct device_node *master_np, mutex_unlock(&iommu_probe_device_lock); return 0; } + dev_iommu_present = dev->iommu; /* * We don't currently walk up the tree looking for a parent IOMMU. @@ -149,8 +151,10 @@ int of_iommu_configure(struct device *dev, struct device_node *master_np, err = of_iommu_configure_device(master_np, dev, id); } - if (err) + if (err && dev_iommu_present) iommu_fwspec_free(dev); + else if (err && dev->iommu) + dev_iommu_free(dev); mutex_unlock(&iommu_probe_device_lock); if (!err && dev->bus) -- GitLab From 101a3b9920a79832dc55efc4296ca246bde5e566 Mon Sep 17 00:00:00 2001 From: Marcos Paulo de Souza Date: Wed, 26 Feb 2025 16:59:05 -0300 Subject: [PATCH 0183/2211] printk: Check CON_SUSPEND when unblanking a console [ Upstream commit 72c96a2dacc0fb056d13a5f02b0845c4c910fe54 ] The commit 9e70a5e109a4 ("printk: Add per-console suspended state") introduced the CON_SUSPENDED flag for consoles. The suspended consoles will stop receiving messages, so don't unblank suspended consoles because it won't be showing anything either way. Signed-off-by: Marcos Paulo de Souza Reviewed-by: Petr Mladek Reviewed-by: John Ogness Link: https://lore.kernel.org/r/20250226-printk-renaming-v1-5-0b878577f2e6@suse.com Signed-off-by: Petr Mladek Signed-off-by: Sasha Levin --- kernel/printk/printk.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 881a26e18c658..3a91b739e8f30 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -3310,7 +3310,12 @@ void console_unblank(void) */ cookie = console_srcu_read_lock(); for_each_console_srcu(c) { - if ((console_srcu_read_flags(c) & CON_ENABLED) && c->unblank) { + short flags = console_srcu_read_flags(c); + + if (flags & CON_SUSPENDED) + continue; + + if ((flags & CON_ENABLED) && c->unblank) { found_unblank = true; break; } @@ -3347,7 +3352,12 @@ void console_unblank(void) cookie = console_srcu_read_lock(); for_each_console_srcu(c) { - if ((console_srcu_read_flags(c) & CON_ENABLED) && c->unblank) + short flags = console_srcu_read_flags(c); + + if (flags & CON_SUSPENDED) + continue; + + if ((flags & CON_ENABLED) && c->unblank) c->unblank(); } console_srcu_read_unlock(cookie); -- GitLab From 0446d34a853d9576e2a7628c803d2abd2f8cf3a8 Mon Sep 17 00:00:00 2001 From: Miri Korenblit Date: Sat, 8 Mar 2025 23:19:23 +0200 Subject: [PATCH 0184/2211] wifi: iwlwifi: don't warn when if there is a FW error [ Upstream commit c7f50d0433a016d43681592836a3d484817bfb34 ] iwl_trans_reclaim is warning if it is called when the FW is not alive. But if it is called when there is a pending restart, i.e. after a FW error, there is no need to warn, instead - return silently. Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250308231427.ba3d90b22c25.I9332506af1997faefcf0bdb51d98d5e874051722@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/iwl-trans.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c index 3b3dcaf33c9d9..311b167ea09ed 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c +++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c @@ -2,7 +2,7 @@ /* * Copyright (C) 2015 Intel Mobile Communications GmbH * Copyright (C) 2016-2017 Intel Deutschland GmbH - * Copyright (C) 2019-2021, 2023-2024 Intel Corporation + * Copyright (C) 2019-2021, 2023-2025 Intel Corporation */ #include #include @@ -419,6 +419,9 @@ IWL_EXPORT_SYMBOL(iwl_trans_tx); void iwl_trans_reclaim(struct iwl_trans *trans, int queue, int ssn, struct sk_buff_head *skbs, bool is_flush) { + if (unlikely(test_bit(STATUS_FW_ERROR, &trans->status))) + return; + if (WARN_ONCE(trans->state != IWL_TRANS_FW_ALIVE, "bad state = %d\n", trans->state)) return; -- GitLab From 1c55feb63827f7d1b79369fa7ff37187c74648a2 Mon Sep 17 00:00:00 2001 From: Daniel Gabay Date: Sat, 8 Mar 2025 23:19:19 +0200 Subject: [PATCH 0185/2211] wifi: iwlwifi: w/a FW SMPS mode selection [ Upstream commit b2e709805ce955f80803b7cab3421813c79e1df4 ] The FW is now responsible of determining the SMPS mode. If the user disabled power save in a certain vif, we send the vif-level power command to clear out the POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK bit for that vif. But erroneously, the FW checks DEVICE_POWER_FLAGS_POWER_SAVE_ENA_MSK in the device-level command to determine the SMPS mode. To W/A this, send also the device-level command when the power save of a vif changes, and disable power save if there is any vif that has power save disabled. Signed-off-by: Daniel Gabay Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250308231427.7bf205efa027.I2c793ff1fc2a6779a95faaee1ded348100fd97f1@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 15 +++++++++++++++ .../net/wireless/intel/iwlwifi/mvm/mld-mac80211.c | 3 ++- drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 3 +++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c index d37d83d246354..3fd257f770baa 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c @@ -4096,6 +4096,20 @@ iwl_mvm_sta_state_authorized_to_assoc(struct iwl_mvm *mvm, return 0; } +void iwl_mvm_smps_workaround(struct iwl_mvm *mvm, struct ieee80211_vif *vif, + bool update) +{ + struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); + + if (!iwl_mvm_has_rlc_offload(mvm)) + return; + + mvmvif->ps_disabled = !vif->cfg.ps; + + if (update) + iwl_mvm_power_update_mac(mvm); +} + /* Common part for MLD and non-MLD modes */ int iwl_mvm_mac_sta_state_common(struct ieee80211_hw *hw, struct ieee80211_vif *vif, @@ -4188,6 +4202,7 @@ int iwl_mvm_mac_sta_state_common(struct ieee80211_hw *hw, new_state == IEEE80211_STA_AUTHORIZED) { ret = iwl_mvm_sta_state_assoc_to_authorized(mvm, vif, sta, callbacks); + iwl_mvm_smps_workaround(mvm, vif, true); } else if (old_state == IEEE80211_STA_AUTHORIZED && new_state == IEEE80211_STA_ASSOC) { ret = iwl_mvm_sta_state_authorized_to_assoc(mvm, vif, sta, diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c index e252f0dcea205..04da02bdd9536 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* - * Copyright (C) 2022-2024 Intel Corporation + * Copyright (C) 2022-2025 Intel Corporation */ #include "mvm.h" @@ -961,6 +961,7 @@ static void iwl_mvm_mld_vif_cfg_changed_station(struct iwl_mvm *mvm, } if (changes & BSS_CHANGED_PS) { + iwl_mvm_smps_workaround(mvm, vif, false); ret = iwl_mvm_power_update_mac(mvm); if (ret) IWL_ERR(mvm, "failed to update power mode\n"); diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h index ef07cff203b0d..7d86d273092ac 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h @@ -3042,4 +3042,7 @@ iwl_mvm_send_ap_tx_power_constraint_cmd(struct iwl_mvm *mvm, struct ieee80211_vif *vif, struct ieee80211_bss_conf *bss_conf, bool is_ap); + +void iwl_mvm_smps_workaround(struct iwl_mvm *mvm, struct ieee80211_vif *vif, + bool update); #endif /* __IWL_MVM_H__ */ -- GitLab From 181e8b56b74ad3920456dcdc8a361520d9007956 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Sat, 8 Mar 2025 23:19:18 +0200 Subject: [PATCH 0186/2211] wifi: iwlwifi: fix debug actions order [ Upstream commit eb29b4ffafb20281624dcd2cbb768d6f30edf600 ] The order of actions taken for debug was implemented incorrectly. Now we implemented the dump split and do the FW reset only in the middle of the dump (rather than the FW killing itself on error.) As a result, some of the actions taken when applying the config will now crash the device, so we need to fix the order. Signed-off-by: Johannes Berg Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250308231427.6de7fa8e63ed.I40632c48e2a67a8aca05def572a934b88ce7934b@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c b/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c index 08d990ba8a794..ce787326aa69d 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c +++ b/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* - * Copyright (C) 2018-2024 Intel Corporation + * Copyright (C) 2018-2025 Intel Corporation */ #include #include "iwl-drv.h" @@ -1372,15 +1372,15 @@ void _iwl_dbg_tlv_time_point(struct iwl_fw_runtime *fwrt, switch (tp_id) { case IWL_FW_INI_TIME_POINT_EARLY: iwl_dbg_tlv_init_cfg(fwrt); - iwl_dbg_tlv_apply_config(fwrt, conf_list); iwl_dbg_tlv_update_drams(fwrt); iwl_dbg_tlv_tp_trigger(fwrt, sync, trig_list, tp_data, NULL); + iwl_dbg_tlv_apply_config(fwrt, conf_list); break; case IWL_FW_INI_TIME_POINT_AFTER_ALIVE: iwl_dbg_tlv_apply_buffers(fwrt); iwl_dbg_tlv_send_hcmds(fwrt, hcmd_list); - iwl_dbg_tlv_apply_config(fwrt, conf_list); iwl_dbg_tlv_tp_trigger(fwrt, sync, trig_list, tp_data, NULL); + iwl_dbg_tlv_apply_config(fwrt, conf_list); break; case IWL_FW_INI_TIME_POINT_PERIODIC: iwl_dbg_tlv_set_periodic_trigs(fwrt); @@ -1390,14 +1390,14 @@ void _iwl_dbg_tlv_time_point(struct iwl_fw_runtime *fwrt, case IWL_FW_INI_TIME_POINT_MISSED_BEACONS: case IWL_FW_INI_TIME_POINT_FW_DHC_NOTIFICATION: iwl_dbg_tlv_send_hcmds(fwrt, hcmd_list); - iwl_dbg_tlv_apply_config(fwrt, conf_list); iwl_dbg_tlv_tp_trigger(fwrt, sync, trig_list, tp_data, iwl_dbg_tlv_check_fw_pkt); + iwl_dbg_tlv_apply_config(fwrt, conf_list); break; default: iwl_dbg_tlv_send_hcmds(fwrt, hcmd_list); - iwl_dbg_tlv_apply_config(fwrt, conf_list); iwl_dbg_tlv_tp_trigger(fwrt, sync, trig_list, tp_data, NULL); + iwl_dbg_tlv_apply_config(fwrt, conf_list); break; } } -- GitLab From 7ce37a3ca0907e031bbbd8754c6cf7779390c168 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Sat, 8 Mar 2025 23:19:17 +0200 Subject: [PATCH 0187/2211] wifi: iwlwifi: mark Br device not integrated [ Upstream commit 5f0ab2f35a43773a0dfe1297129a8dbff906b932 ] This is a discrete device, don't mark it as integrated. This also means we cannot set the LTR delay. Signed-off-by: Johannes Berg Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250308231427.9bb69393fcc9.I197129383e5441c8139cbb0e810ae0b71198a37c@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/cfg/dr.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/dr.c b/drivers/net/wireless/intel/iwlwifi/cfg/dr.c index ab7c0f8d54f42..d3542af0f625e 100644 --- a/drivers/net/wireless/intel/iwlwifi/cfg/dr.c +++ b/drivers/net/wireless/intel/iwlwifi/cfg/dr.c @@ -148,11 +148,9 @@ const struct iwl_cfg_trans_params iwl_br_trans_cfg = { .mq_rx_supported = true, .rf_id = true, .gen2 = true, - .integrated = true, .umac_prph_offset = 0x300000, .xtal_latency = 12000, .low_latency_xtal = true, - .ltr_delay = IWL_CFG_TRANS_LTR_DELAY_2500US, }; const char iwl_br_name[] = "Intel(R) TBD Br device"; -- GitLab From a791a6bf02c493a82d051ba59067e84505d4fc23 Mon Sep 17 00:00:00 2001 From: Emmanuel Grumbach Date: Sat, 8 Mar 2025 23:19:13 +0200 Subject: [PATCH 0188/2211] wifi: iwlwifi: fix the ECKV UEFI variable name [ Upstream commit 3ea2970b0578011ab8402ad0cff39712255f63df ] This UEFI variable name was badly named. Fix its name and also use the right GUID to find it: we need to use the BT_WIFI (a.k.a. Common) GUID. Signed-off-by: Emmanuel Grumbach Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250308231426.78c998d0fa71.I2bc9d72c1dc2c4d7028f0265634a940c2fadbbb5@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/fw/uefi.c | 8 +++++--- drivers/net/wireless/intel/iwlwifi/fw/uefi.h | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/intel/iwlwifi/fw/uefi.c b/drivers/net/wireless/intel/iwlwifi/fw/uefi.c index 834f7c9bb9e92..86d6286a15378 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/uefi.c +++ b/drivers/net/wireless/intel/iwlwifi/fw/uefi.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* - * Copyright(c) 2021-2024 Intel Corporation + * Copyright(c) 2021-2025 Intel Corporation */ #include "iwl-drv.h" @@ -673,8 +673,10 @@ int iwl_uefi_get_eckv(struct iwl_fw_runtime *fwrt, u32 *extl_clk) struct uefi_cnv_var_eckv *data; int ret = 0; - data = iwl_uefi_get_verified_variable(fwrt->trans, IWL_UEFI_ECKV_NAME, - "ECKV", sizeof(*data), NULL); + data = iwl_uefi_get_verified_variable_guid(fwrt->trans, + &IWL_EFI_WIFI_BT_GUID, + IWL_UEFI_ECKV_NAME, + "ECKV", sizeof(*data), NULL); if (IS_ERR(data)) return -EINVAL; diff --git a/drivers/net/wireless/intel/iwlwifi/fw/uefi.h b/drivers/net/wireless/intel/iwlwifi/fw/uefi.h index e525d449e656e..c931f5cedb0b9 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/uefi.h +++ b/drivers/net/wireless/intel/iwlwifi/fw/uefi.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ /* - * Copyright(c) 2021-2024 Intel Corporation + * Copyright(c) 2021-2025 Intel Corporation */ #ifndef __iwl_fw_uefi__ #define __iwl_fw_uefi__ @@ -19,7 +19,7 @@ #define IWL_UEFI_WTAS_NAME L"UefiCnvWlanWTAS" #define IWL_UEFI_SPLC_NAME L"UefiCnvWlanSPLC" #define IWL_UEFI_WRDD_NAME L"UefiCnvWlanWRDD" -#define IWL_UEFI_ECKV_NAME L"UefiCnvWlanECKV" +#define IWL_UEFI_ECKV_NAME L"UefiCnvCommonECKV" #define IWL_UEFI_DSM_NAME L"UefiCnvWlanGeneralCfg" #define IWL_UEFI_WBEM_NAME L"UefiCnvWlanWBEM" #define IWL_UEFI_PUNCTURING_NAME L"UefiCnvWlanPuncturing" -- GitLab From 07709d31829fd22ceb93b0cf7f2042e6d7e58230 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Sat, 8 Mar 2025 23:03:36 +0200 Subject: [PATCH 0189/2211] wifi: mac80211: fix warning on disconnect during failed ML reconf [ Upstream commit 0e104aa3676d020f6c442cd7fbaeb72adaaab6fc ] If multi-link reconfiguration fails, we can disconnect with a local link already allocated but the BSS entry not assigned yet, which leads to a warning in cfg80211. Add a check to avoid the warning. Signed-off-by: Johannes Berg Reviewed-by: Ilan Peer Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250308225541.699bd9cbabe5.I599d5ff69092a65e916e2acd25137ae9df8debe8@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- net/mac80211/mlme.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index cc8c5d18b130d..3a279ded46c2f 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -4033,7 +4033,7 @@ static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) struct ieee80211_link_data *link; link = sdata_dereference(sdata->link[link_id], sdata); - if (!link) + if (!link || !link->conf->bss) continue; cfg80211_unlink_bss(local->hw.wiphy, link->conf->bss); link->conf->bss = NULL; -- GitLab From 22d8cc7f5d5a9ad9be8897e4783b129c12bc570c Mon Sep 17 00:00:00 2001 From: Ilan Peer Date: Sat, 8 Mar 2025 23:03:34 +0200 Subject: [PATCH 0190/2211] wifi: mac80211_hwsim: Fix MLD address translation [ Upstream commit 65bff0be9b154621b617fc2e4bd89f1e18e97cdb ] Do address translations only between shared links. It is possible that while an non-AP MLD station and an AP MLD station have shared links, the frame is intended to be sent on a link which is not shared (for example when sending a probe response). Signed-off-by: Ilan Peer Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250308225541.1aa461270bb6.Ic21592e1b1634653f02b80628cb2152f6e9de367@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/virtual/mac80211_hwsim.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c index 3f424f14de4ec..4a2b7c9921bc6 100644 --- a/drivers/net/wireless/virtual/mac80211_hwsim.c +++ b/drivers/net/wireless/virtual/mac80211_hwsim.c @@ -4,7 +4,7 @@ * Copyright (c) 2008, Jouni Malinen * Copyright (c) 2011, Javier Lopez * Copyright (c) 2016 - 2017 Intel Deutschland GmbH - * Copyright (C) 2018 - 2024 Intel Corporation + * Copyright (C) 2018 - 2025 Intel Corporation */ /* @@ -1983,11 +1983,13 @@ static void mac80211_hwsim_tx(struct ieee80211_hw *hw, return; } - if (sta && sta->mlo) { - if (WARN_ON(!link_sta)) { - ieee80211_free_txskb(hw, skb); - return; - } + /* Do address translations only between shared links. It is + * possible that while an non-AP MLD station and an AP MLD + * station have shared links, the frame is intended to be sent + * on a link which is not shared (for example when sending a + * probe response). + */ + if (sta && sta->mlo && link_sta) { /* address translation to link addresses on TX */ ether_addr_copy(hdr->addr1, link_sta->addr); ether_addr_copy(hdr->addr2, bss_conf->addr); -- GitLab From faba68a86ab7993436b510dbee8a022371ffd9b3 Mon Sep 17 00:00:00 2001 From: Anjaneyulu Date: Sat, 8 Mar 2025 23:03:30 +0200 Subject: [PATCH 0191/2211] wifi: cfg80211: allow IR in 20 MHz configurations [ Upstream commit cf4bd1608882792d4742e27a819493312904a680 ] Some regulatory bodies doesn't allow IR (initiate radioation) on a specific subband, but allows it for channels with a bandwidth of 20 MHz. Add a channel flag that indicates that, and consider it in cfg80211_reg_check_beaconing. While on it, fix the kernel doc of enum nl80211_reg_rule_flags and change it to use BIT(). Signed-off-by: Anjaneyulu Co-developed-by: Somashekhar Puttagangaiah Signed-off-by: Somashekhar Puttagangaiah Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250308225541.d3ab352a73ff.I8a8f79e1c9eb74936929463960ee2a324712fe51@changeid [fix typo] Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- include/net/cfg80211.h | 3 +++ include/uapi/linux/nl80211.h | 52 ++++++++++++++++++++---------------- net/wireless/chan.c | 8 +++++- net/wireless/nl80211.c | 4 +++ net/wireless/reg.c | 4 ++- 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 941dc62f3027c..8a712ca73f2b0 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -127,6 +127,8 @@ struct wiphy; * even if it is otherwise disabled. * @IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP: Allow using this channel for AP operation * with very low power (VLP), even if otherwise set to NO_IR. + * @IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY: Allow activity on a 20 MHz channel, + * even if otherwise set to NO_IR. */ enum ieee80211_channel_flags { IEEE80211_CHAN_DISABLED = BIT(0), @@ -155,6 +157,7 @@ enum ieee80211_channel_flags { IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT = BIT(23), IEEE80211_CHAN_CAN_MONITOR = BIT(24), IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP = BIT(25), + IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY = BIT(26), }; #define IEEE80211_CHAN_NO_HT40 \ diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index f97f5adc8d518..c2d7faf8d87fa 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -4294,6 +4294,8 @@ enum nl80211_wmm_rule { * otherwise completely disabled. * @NL80211_FREQUENCY_ATTR_ALLOW_6GHZ_VLP_AP: This channel can be used for a * very low power (VLP) AP, despite being NO_IR. + * @NL80211_FREQUENCY_ATTR_ALLOW_20MHZ_ACTIVITY: This channel can be active in + * 20 MHz bandwidth, despite being NO_IR. * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number * currently defined * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use @@ -4338,6 +4340,7 @@ enum nl80211_frequency_attr { NL80211_FREQUENCY_ATTR_NO_6GHZ_AFC_CLIENT, NL80211_FREQUENCY_ATTR_CAN_MONITOR, NL80211_FREQUENCY_ATTR_ALLOW_6GHZ_VLP_AP, + NL80211_FREQUENCY_ATTR_ALLOW_20MHZ_ACTIVITY, /* keep last */ __NL80211_FREQUENCY_ATTR_AFTER_LAST, @@ -4549,31 +4552,34 @@ enum nl80211_sched_scan_match_attr { * @NL80211_RRF_NO_6GHZ_AFC_CLIENT: Client connection to AFC AP not allowed * @NL80211_RRF_ALLOW_6GHZ_VLP_AP: Very low power (VLP) AP can be permitted * despite NO_IR configuration. + * @NL80211_RRF_ALLOW_20MHZ_ACTIVITY: Allow activity in 20 MHz bandwidth, + * despite NO_IR configuration. */ enum nl80211_reg_rule_flags { - NL80211_RRF_NO_OFDM = 1<<0, - NL80211_RRF_NO_CCK = 1<<1, - NL80211_RRF_NO_INDOOR = 1<<2, - NL80211_RRF_NO_OUTDOOR = 1<<3, - NL80211_RRF_DFS = 1<<4, - NL80211_RRF_PTP_ONLY = 1<<5, - NL80211_RRF_PTMP_ONLY = 1<<6, - NL80211_RRF_NO_IR = 1<<7, - __NL80211_RRF_NO_IBSS = 1<<8, - NL80211_RRF_AUTO_BW = 1<<11, - NL80211_RRF_IR_CONCURRENT = 1<<12, - NL80211_RRF_NO_HT40MINUS = 1<<13, - NL80211_RRF_NO_HT40PLUS = 1<<14, - NL80211_RRF_NO_80MHZ = 1<<15, - NL80211_RRF_NO_160MHZ = 1<<16, - NL80211_RRF_NO_HE = 1<<17, - NL80211_RRF_NO_320MHZ = 1<<18, - NL80211_RRF_NO_EHT = 1<<19, - NL80211_RRF_PSD = 1<<20, - NL80211_RRF_DFS_CONCURRENT = 1<<21, - NL80211_RRF_NO_6GHZ_VLP_CLIENT = 1<<22, - NL80211_RRF_NO_6GHZ_AFC_CLIENT = 1<<23, - NL80211_RRF_ALLOW_6GHZ_VLP_AP = 1<<24, + NL80211_RRF_NO_OFDM = 1 << 0, + NL80211_RRF_NO_CCK = 1 << 1, + NL80211_RRF_NO_INDOOR = 1 << 2, + NL80211_RRF_NO_OUTDOOR = 1 << 3, + NL80211_RRF_DFS = 1 << 4, + NL80211_RRF_PTP_ONLY = 1 << 5, + NL80211_RRF_PTMP_ONLY = 1 << 6, + NL80211_RRF_NO_IR = 1 << 7, + __NL80211_RRF_NO_IBSS = 1 << 8, + NL80211_RRF_AUTO_BW = 1 << 11, + NL80211_RRF_IR_CONCURRENT = 1 << 12, + NL80211_RRF_NO_HT40MINUS = 1 << 13, + NL80211_RRF_NO_HT40PLUS = 1 << 14, + NL80211_RRF_NO_80MHZ = 1 << 15, + NL80211_RRF_NO_160MHZ = 1 << 16, + NL80211_RRF_NO_HE = 1 << 17, + NL80211_RRF_NO_320MHZ = 1 << 18, + NL80211_RRF_NO_EHT = 1 << 19, + NL80211_RRF_PSD = 1 << 20, + NL80211_RRF_DFS_CONCURRENT = 1 << 21, + NL80211_RRF_NO_6GHZ_VLP_CLIENT = 1 << 22, + NL80211_RRF_NO_6GHZ_AFC_CLIENT = 1 << 23, + NL80211_RRF_ALLOW_6GHZ_VLP_AP = 1 << 24, + NL80211_RRF_ALLOW_20MHZ_ACTIVITY = 1 << 25, }; #define NL80211_RRF_PASSIVE_SCAN NL80211_RRF_NO_IR diff --git a/net/wireless/chan.c b/net/wireless/chan.c index e579d7e1425fe..c4f3fefeb3544 100644 --- a/net/wireless/chan.c +++ b/net/wireless/chan.c @@ -6,7 +6,7 @@ * * Copyright 2009 Johannes Berg * Copyright 2013-2014 Intel Mobile Communications GmbH - * Copyright 2018-2024 Intel Corporation + * Copyright 2018-2025 Intel Corporation */ #include @@ -1621,6 +1621,12 @@ bool cfg80211_reg_check_beaconing(struct wiphy *wiphy, if (cfg->reg_power == IEEE80211_REG_VLP_AP) permitting_flags |= IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP; + if ((cfg->iftype == NL80211_IFTYPE_P2P_GO || + cfg->iftype == NL80211_IFTYPE_AP) && + (chandef->width == NL80211_CHAN_WIDTH_20_NOHT || + chandef->width == NL80211_CHAN_WIDTH_20)) + permitting_flags |= IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY; + return _cfg80211_reg_can_beacon(wiphy, chandef, cfg->iftype, check_no_ir ? IEEE80211_CHAN_NO_IR : 0, permitting_flags); diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index ecfceddce00fc..c778ffa1c8efd 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -1213,6 +1213,10 @@ static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy, if ((chan->flags & IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP) && nla_put_flag(msg, NL80211_FREQUENCY_ATTR_ALLOW_6GHZ_VLP_AP)) goto nla_put_failure; + if ((chan->flags & IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY) && + nla_put_flag(msg, + NL80211_FREQUENCY_ATTR_ALLOW_20MHZ_ACTIVITY)) + goto nla_put_failure; } if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER, diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 2b626078739c5..f6846eb0f4b84 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -5,7 +5,7 @@ * Copyright 2008-2011 Luis R. Rodriguez * Copyright 2013-2014 Intel Mobile Communications GmbH * Copyright 2017 Intel Deutschland GmbH - * Copyright (C) 2018 - 2024 Intel Corporation + * Copyright (C) 2018 - 2025 Intel Corporation * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -1603,6 +1603,8 @@ static u32 map_regdom_flags(u32 rd_flags) channel_flags |= IEEE80211_CHAN_PSD; if (rd_flags & NL80211_RRF_ALLOW_6GHZ_VLP_AP) channel_flags |= IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP; + if (rd_flags & NL80211_RRF_ALLOW_20MHZ_ACTIVITY) + channel_flags |= IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY; return channel_flags; } -- GitLab From c1502fc84d1c65e17ba25fcde1c52cbe52f79157 Mon Sep 17 00:00:00 2001 From: Willem de Bruijn Date: Thu, 6 Mar 2025 22:34:09 -0500 Subject: [PATCH 0192/2211] ipv6: save dontfrag in cork [ Upstream commit a18dfa9925b9ef6107ea3aa5814ca3c704d34a8a ] When spanning datagram construction over multiple send calls using MSG_MORE, per datagram settings are configured on the first send. That is when ip(6)_setup_cork stores these settings for subsequent use in __ip(6)_append_data and others. The only flag that escaped this was dontfrag. As a result, a datagram could be constructed with df=0 on the first sendmsg, but df=1 on a next. Which is what cmsg_ip.sh does in an upcoming MSG_MORE test in the "diff" scenario. Changing datagram conditions in the middle of constructing an skb makes this already complex code path even more convoluted. It is here unintentional. Bring this flag in line with expected sockopt/cmsg behavior. And stop passing ipc6 to __ip6_append_data, to avoid such issues in the future. This is already the case for __ip_append_data. inet6_cork had a 6 byte hole, so the 1B flag has no impact. Signed-off-by: Willem de Bruijn Reviewed-by: Eric Dumazet Link: https://patch.msgid.link/20250307033620.411611-3-willemdebruijn.kernel@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- include/linux/ipv6.h | 1 + net/ipv6/ip6_output.c | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index a6e2aadbb91bd..5aeeed22f35bf 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -207,6 +207,7 @@ struct inet6_cork { struct ipv6_txoptions *opt; u8 hop_limit; u8 tclass; + u8 dontfrag:1; }; /* struct ipv6_pinfo - ipv6 private area */ diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 434ddf263b88a..89a61e040e6a1 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -1386,6 +1386,7 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork, } v6_cork->hop_limit = ipc6->hlimit; v6_cork->tclass = ipc6->tclass; + v6_cork->dontfrag = ipc6->dontfrag; if (rt->dst.flags & DST_XFRM_TUNNEL) mtu = READ_ONCE(np->pmtudisc) >= IPV6_PMTUDISC_PROBE ? READ_ONCE(rt->dst.dev->mtu) : dst_mtu(&rt->dst); @@ -1417,7 +1418,7 @@ static int __ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb), void *from, size_t length, int transhdrlen, - unsigned int flags, struct ipcm6_cookie *ipc6) + unsigned int flags) { struct sk_buff *skb, *skb_prev = NULL; struct inet_cork *cork = &cork_full->base; @@ -1471,7 +1472,7 @@ static int __ip6_append_data(struct sock *sk, if (headersize + transhdrlen > mtu) goto emsgsize; - if (cork->length + length > mtu - headersize && ipc6->dontfrag && + if (cork->length + length > mtu - headersize && v6_cork->dontfrag && (sk->sk_protocol == IPPROTO_UDP || sk->sk_protocol == IPPROTO_ICMPV6 || sk->sk_protocol == IPPROTO_RAW)) { @@ -1843,7 +1844,7 @@ int ip6_append_data(struct sock *sk, return __ip6_append_data(sk, &sk->sk_write_queue, &inet->cork, &np->cork, sk_page_frag(sk), getfrag, - from, length, transhdrlen, flags, ipc6); + from, length, transhdrlen, flags); } EXPORT_SYMBOL_GPL(ip6_append_data); @@ -2048,7 +2049,7 @@ struct sk_buff *ip6_make_skb(struct sock *sk, err = __ip6_append_data(sk, &queue, cork, &v6_cork, ¤t->task_frag, getfrag, from, length + exthdrlen, transhdrlen + exthdrlen, - flags, ipc6); + flags); if (err) { __ip6_flush_pending_frames(sk, &queue, cork, &v6_cork); return ERR_PTR(err); -- GitLab From 65e51bc2803bb9c19df74c7014c45fb5b1b96582 Mon Sep 17 00:00:00 2001 From: Charlene Liu Date: Mon, 3 Mar 2025 13:53:16 -0500 Subject: [PATCH 0193/2211] drm/amd/display: remove minimum Dispclk and apply oem panel timing. [ Upstream commit 756e58e83e89d372b94269c0cde61fe55da76947 ] [why & how] 1. apply oem panel timing (not only on OLED) 2. remove MIN_DPP_DISP_CLK request in driver. This fix will apply for dcn31x but not sync with DML's output. Reviewed-by: Ovidiu Bunea Signed-off-by: Charlene Liu Signed-off-by: Tom Chung Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c | 2 -- drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c | 2 -- drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c | 3 ++- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c index 827b24b3442ad..e4d22f74f9869 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c @@ -194,8 +194,6 @@ static void dcn315_update_clocks(struct clk_mgr *clk_mgr_base, // workaround: Limit dppclk to 100Mhz to avoid lower eDP panel switch to plus 4K monitor underflow. if (new_clocks->dppclk_khz < MIN_DPP_DISP_CLK) new_clocks->dppclk_khz = MIN_DPP_DISP_CLK; - if (new_clocks->dispclk_khz < MIN_DPP_DISP_CLK) - new_clocks->dispclk_khz = MIN_DPP_DISP_CLK; if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr->base.clks.dppclk_khz)) { if (clk_mgr->base.clks.dppclk_khz > new_clocks->dppclk_khz) diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c index 37c39756fece4..49efea0c8fcff 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c @@ -201,8 +201,6 @@ static void dcn316_update_clocks(struct clk_mgr *clk_mgr_base, // workaround: Limit dppclk to 100Mhz to avoid lower eDP panel switch to plus 4K monitor underflow. if (new_clocks->dppclk_khz < 100000) new_clocks->dppclk_khz = 100000; - if (new_clocks->dispclk_khz < 100000) - new_clocks->dispclk_khz = 100000; if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr->base.clks.dppclk_khz)) { if (clk_mgr->base.clks.dppclk_khz > new_clocks->dppclk_khz) diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c index 1e76524d116dc..59457ca24e1dc 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c @@ -1064,7 +1064,8 @@ void dce110_edp_backlight_control( DC_LOG_DC("edp_receiver_ready_T9 skipped\n"); } - if (!enable && link->dpcd_sink_ext_caps.bits.oled) { + if (!enable) { + /*follow oem panel config's requirement*/ pre_T11_delay += link->panel_config.pps.extra_pre_t11_ms; msleep(pre_T11_delay); } -- GitLab From 83e4f1de0802b7f82dc59325b905b759627a8f39 Mon Sep 17 00:00:00 2001 From: Zhikai Zhai Date: Thu, 27 Feb 2025 20:09:14 +0800 Subject: [PATCH 0194/2211] drm/amd/display: calculate the remain segments for all pipes [ Upstream commit d3069feecdb5542604d29b59acfd1fd213bad95b ] [WHY] In some cases the remain de-tile buffer segments will be greater than zero if we don't add the non-top pipe to calculate, at this time the override de-tile buffer size will be valid and used. But it makes the de-tile buffer segments used finally for all of pipes exceed the maximum. [HOW] Add the non-top pipe to calculate the remain de-tile buffer segments. Don't set override size to use the average according to pipe count if the value exceed the maximum. Reviewed-by: Charlene Liu Signed-off-by: Zhikai Zhai Signed-off-by: Tom Chung Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../dc/resource/dcn315/dcn315_resource.c | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c index f2ce687c0e03c..9cb72805b8d1a 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c @@ -1699,7 +1699,7 @@ static int dcn315_populate_dml_pipes_from_context( pipes[pipe_cnt].dout.dsc_input_bpc = 0; DC_FP_START(); dcn31_zero_pipe_dcc_fraction(pipes, pipe_cnt); - if (pixel_rate_crb && !pipe->top_pipe && !pipe->prev_odm_pipe) { + if (pixel_rate_crb) { int bpp = source_format_to_bpp(pipes[pipe_cnt].pipe.src.source_format); /* Ceil to crb segment size */ int approx_det_segs_required_for_pstate = dcn_get_approx_det_segs_required_for_pstate( @@ -1756,28 +1756,26 @@ static int dcn315_populate_dml_pipes_from_context( continue; } - if (!pipe->top_pipe && !pipe->prev_odm_pipe) { - bool split_required = pipe->stream->timing.pix_clk_100hz >= dcn_get_max_non_odm_pix_rate_100hz(&dc->dml.soc) - || (pipe->plane_state && pipe->plane_state->src_rect.width > 5120); - - if (remaining_det_segs > MIN_RESERVED_DET_SEGS && crb_pipes != 0) - pipes[pipe_cnt].pipe.src.det_size_override += (remaining_det_segs - MIN_RESERVED_DET_SEGS) / crb_pipes + - (crb_idx < (remaining_det_segs - MIN_RESERVED_DET_SEGS) % crb_pipes ? 1 : 0); - if (pipes[pipe_cnt].pipe.src.det_size_override > 2 * DCN3_15_MAX_DET_SEGS) { - /* Clamp to 2 pipe split max det segments */ - remaining_det_segs += pipes[pipe_cnt].pipe.src.det_size_override - 2 * (DCN3_15_MAX_DET_SEGS); - pipes[pipe_cnt].pipe.src.det_size_override = 2 * DCN3_15_MAX_DET_SEGS; - } - if (pipes[pipe_cnt].pipe.src.det_size_override > DCN3_15_MAX_DET_SEGS || split_required) { - /* If we are splitting we must have an even number of segments */ - remaining_det_segs += pipes[pipe_cnt].pipe.src.det_size_override % 2; - pipes[pipe_cnt].pipe.src.det_size_override -= pipes[pipe_cnt].pipe.src.det_size_override % 2; - } - /* Convert segments into size for DML use */ - pipes[pipe_cnt].pipe.src.det_size_override *= DCN3_15_CRB_SEGMENT_SIZE_KB; - - crb_idx++; + bool split_required = pipe->stream->timing.pix_clk_100hz >= dcn_get_max_non_odm_pix_rate_100hz(&dc->dml.soc) + || (pipe->plane_state && pipe->plane_state->src_rect.width > 5120); + + if (remaining_det_segs > MIN_RESERVED_DET_SEGS && crb_pipes != 0) + pipes[pipe_cnt].pipe.src.det_size_override += (remaining_det_segs - MIN_RESERVED_DET_SEGS) / crb_pipes + + (crb_idx < (remaining_det_segs - MIN_RESERVED_DET_SEGS) % crb_pipes ? 1 : 0); + if (pipes[pipe_cnt].pipe.src.det_size_override > 2 * DCN3_15_MAX_DET_SEGS) { + /* Clamp to 2 pipe split max det segments */ + remaining_det_segs += pipes[pipe_cnt].pipe.src.det_size_override - 2 * (DCN3_15_MAX_DET_SEGS); + pipes[pipe_cnt].pipe.src.det_size_override = 2 * DCN3_15_MAX_DET_SEGS; + } + if (pipes[pipe_cnt].pipe.src.det_size_override > DCN3_15_MAX_DET_SEGS || split_required) { + /* If we are splitting we must have an even number of segments */ + remaining_det_segs += pipes[pipe_cnt].pipe.src.det_size_override % 2; + pipes[pipe_cnt].pipe.src.det_size_override -= pipes[pipe_cnt].pipe.src.det_size_override % 2; } + /* Convert segments into size for DML use */ + pipes[pipe_cnt].pipe.src.det_size_override *= DCN3_15_CRB_SEGMENT_SIZE_KB; + + crb_idx++; pipe_cnt++; } } -- GitLab From ed7eda66b20cbb0ffb3c8db63406f2732b7ef2de Mon Sep 17 00:00:00 2001 From: Peichen Huang Date: Tue, 25 Feb 2025 14:52:30 +0800 Subject: [PATCH 0195/2211] drm/amd/display: not abort link train when bw is low [ Upstream commit 8a21da2842bb22b2b80e5902d0438030d729bfd3 ] [WHY] DP tunneling should not abort link train even bandwidth become too low after downgrade. Otherwise, it would fail compliance test. [HOW} Do link train with downgrade settings even bandwidth is not enough Reviewed-by: Cruise Hung Reviewed-by: Meenakshikumar Somasundaram Signed-off-by: Peichen Huang Signed-off-by: Tom Chung Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../gpu/drm/amd/display/dc/link/protocols/link_dp_training.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c index 27b881f947e8b..9385a32a471b8 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c @@ -1769,13 +1769,10 @@ bool perform_link_training_with_retries( is_link_bw_min = ((cur_link_settings.link_rate <= LINK_RATE_LOW) && (cur_link_settings.lane_count <= LANE_COUNT_ONE)); - if (is_link_bw_low) { + if (is_link_bw_low) DC_LOG_WARNING( "%s: Link(%d) bandwidth too low after fallback req_bw(%d) > link_bw(%d)\n", __func__, link->link_index, req_bw, link_bw); - - return false; - } } msleep(delay_between_attempts); -- GitLab From ff11cd673e477d3311db3476659d08b9ad361ef6 Mon Sep 17 00:00:00 2001 From: Leon Huang Date: Tue, 11 Feb 2025 15:45:43 +0800 Subject: [PATCH 0196/2211] drm/amd/display: Fix incorrect DPCD configs while Replay/PSR switch [ Upstream commit 0d9cabc8f591ea1cd97c071b853b75b155c13259 ] [Why] When switching between PSR/Replay, the DPCD config of previous mode is not cleared, resulting in unexpected behavior in TCON. [How] Initialize the DPCD in setup function Reviewed-by: Robin Chen Signed-off-by: Leon Huang Signed-off-by: Tom Chung Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../link/protocols/link_edp_panel_control.c | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c index 3aa05a2be6c09..fa642f4b88c2d 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c @@ -674,6 +674,18 @@ bool edp_setup_psr(struct dc_link *link, if (!link) return false; + //Clear PSR cfg + memset(&psr_configuration, 0, sizeof(psr_configuration)); + dm_helpers_dp_write_dpcd( + link->ctx, + link, + DP_PSR_EN_CFG, + &psr_configuration.raw, + sizeof(psr_configuration.raw)); + + if (link->psr_settings.psr_version == DC_PSR_VERSION_UNSUPPORTED) + return false; + dc = link->ctx->dc; dmcu = dc->res_pool->dmcu; psr = dc->res_pool->psr; @@ -684,9 +696,6 @@ bool edp_setup_psr(struct dc_link *link, if (!dc_get_edp_link_panel_inst(dc, link, &panel_inst)) return false; - - memset(&psr_configuration, 0, sizeof(psr_configuration)); - psr_configuration.bits.ENABLE = 1; psr_configuration.bits.CRC_VERIFICATION = 1; psr_configuration.bits.FRAME_CAPTURE_INDICATION = @@ -950,6 +959,16 @@ bool edp_setup_replay(struct dc_link *link, const struct dc_stream_state *stream if (!link) return false; + //Clear Replay config + dm_helpers_dp_write_dpcd(link->ctx, link, + DP_SINK_PR_ENABLE_AND_CONFIGURATION, + (uint8_t *)&(replay_config.raw), sizeof(uint8_t)); + + if (!(link->replay_settings.config.replay_supported)) + return false; + + link->replay_settings.config.replay_error_status.raw = 0; + dc = link->ctx->dc; replay = dc->res_pool->replay; -- GitLab From 53ce7542861806023b96c7fe03ae1229556a48a7 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Thu, 6 Feb 2025 14:58:39 +0100 Subject: [PATCH 0197/2211] gfs2: Check for empty queue in run_queue [ Upstream commit d838605fea6eabae3746a276fd448f6719eb3926 ] In run_queue(), check if the queue of pending requests is empty instead of blindly assuming that it won't be. Signed-off-by: Andreas Gruenbacher Signed-off-by: Sasha Levin --- fs/gfs2/glock.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index a51fe42732c4c..4f1eca99786b6 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -843,12 +843,13 @@ static void run_queue(struct gfs2_glock *gl, const int nonblock) __releases(&gl->gl_lockref.lock) __acquires(&gl->gl_lockref.lock) { - struct gfs2_holder *gh = NULL; + struct gfs2_holder *gh; if (test_bit(GLF_LOCK, &gl->gl_flags)) return; set_bit(GLF_LOCK, &gl->gl_flags); + /* While a demote is in progress, the GLF_LOCK flag must be set. */ GLOCK_BUG_ON(gl, test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags)); if (test_bit(GLF_DEMOTE, &gl->gl_flags) && @@ -860,18 +861,22 @@ __acquires(&gl->gl_lockref.lock) set_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags); GLOCK_BUG_ON(gl, gl->gl_demote_state == LM_ST_EXCLUSIVE); gl->gl_target = gl->gl_demote_state; + do_xmote(gl, NULL, gl->gl_target); + return; } else { if (test_bit(GLF_DEMOTE, &gl->gl_flags)) gfs2_demote_wake(gl); if (do_promote(gl)) goto out_unlock; gh = find_first_waiter(gl); + if (!gh) + goto out_unlock; gl->gl_target = gh->gh_state; if (!(gh->gh_flags & (LM_FLAG_TRY | LM_FLAG_TRY_1CB))) do_error(gl, 0); /* Fail queued try locks */ + do_xmote(gl, gh, gl->gl_target); + return; } - do_xmote(gl, gh, gl->gl_target); - return; out_sched: clear_bit(GLF_LOCK, &gl->gl_flags); -- GitLab From 84c069dc5fc8970a2554816dea36c10d897d0587 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Mon, 24 Feb 2025 19:27:38 +0200 Subject: [PATCH 0198/2211] auxdisplay: charlcd: Partially revert "Move hwidth and bwidth to struct hd44780_common" [ Upstream commit 09965a142078080fe7807bab0f6f1890cb5987a4 ] Commit 2545c1c948a6 ("auxdisplay: Move hwidth and bwidth to struct hd44780_common") makes charlcd_alloc() argument-less effectively dropping the single allocation for the struct charlcd_priv object along with the driver specific one. Restore that behaviour here. Signed-off-by: Andy Shevchenko Reviewed-by: Geert Uytterhoeven Signed-off-by: Sasha Levin --- drivers/auxdisplay/charlcd.c | 5 +++-- drivers/auxdisplay/charlcd.h | 5 +++-- drivers/auxdisplay/hd44780.c | 2 +- drivers/auxdisplay/lcd2s.c | 2 +- drivers/auxdisplay/panel.c | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/drivers/auxdisplay/charlcd.c b/drivers/auxdisplay/charlcd.c index 19b619376d48b..09020bb8ad15f 100644 --- a/drivers/auxdisplay/charlcd.c +++ b/drivers/auxdisplay/charlcd.c @@ -595,18 +595,19 @@ static int charlcd_init(struct charlcd *lcd) return 0; } -struct charlcd *charlcd_alloc(void) +struct charlcd *charlcd_alloc(unsigned int drvdata_size) { struct charlcd_priv *priv; struct charlcd *lcd; - priv = kzalloc(sizeof(*priv), GFP_KERNEL); + priv = kzalloc(sizeof(*priv) + drvdata_size, GFP_KERNEL); if (!priv) return NULL; priv->esc_seq.len = -1; lcd = &priv->lcd; + lcd->drvdata = priv->drvdata; return lcd; } diff --git a/drivers/auxdisplay/charlcd.h b/drivers/auxdisplay/charlcd.h index 4d4287209d04c..d10b89740bcae 100644 --- a/drivers/auxdisplay/charlcd.h +++ b/drivers/auxdisplay/charlcd.h @@ -51,7 +51,7 @@ struct charlcd { unsigned long y; } addr; - void *drvdata; + void *drvdata; /* Set by charlcd_alloc() */ }; /** @@ -95,7 +95,8 @@ struct charlcd_ops { }; void charlcd_backlight(struct charlcd *lcd, enum charlcd_onoff on); -struct charlcd *charlcd_alloc(void); + +struct charlcd *charlcd_alloc(unsigned int drvdata_size); void charlcd_free(struct charlcd *lcd); int charlcd_register(struct charlcd *lcd); diff --git a/drivers/auxdisplay/hd44780.c b/drivers/auxdisplay/hd44780.c index 41807ce363399..9428f951c9bf2 100644 --- a/drivers/auxdisplay/hd44780.c +++ b/drivers/auxdisplay/hd44780.c @@ -226,7 +226,7 @@ static int hd44780_probe(struct platform_device *pdev) if (!hdc) return -ENOMEM; - lcd = charlcd_alloc(); + lcd = charlcd_alloc(0); if (!lcd) goto fail1; diff --git a/drivers/auxdisplay/lcd2s.c b/drivers/auxdisplay/lcd2s.c index 6422be0dfe20e..0ecf6a9469f24 100644 --- a/drivers/auxdisplay/lcd2s.c +++ b/drivers/auxdisplay/lcd2s.c @@ -307,7 +307,7 @@ static int lcd2s_i2c_probe(struct i2c_client *i2c) if (err < 0) return err; - lcd = charlcd_alloc(); + lcd = charlcd_alloc(0); if (!lcd) return -ENOMEM; diff --git a/drivers/auxdisplay/panel.c b/drivers/auxdisplay/panel.c index 6dc8798d01f98..4da142692d55f 100644 --- a/drivers/auxdisplay/panel.c +++ b/drivers/auxdisplay/panel.c @@ -835,7 +835,7 @@ static void lcd_init(void) if (!hdc) return; - charlcd = charlcd_alloc(); + charlcd = charlcd_alloc(0); if (!charlcd) { kfree(hdc); return; -- GitLab From 7bd6061b0a44b924d7c3e2525662c1bb0c6ce400 Mon Sep 17 00:00:00 2001 From: Alexey Klimov Date: Fri, 28 Feb 2025 16:14:30 +0000 Subject: [PATCH 0199/2211] ASoC: qcom: sm8250: explicitly set format in sm8250_be_hw_params_fixup() [ Upstream commit 89be3c15a58b2ccf31e969223c8ac93ca8932d81 ] Setting format to s16le is required for compressed playback on compatible soundcards. Cc: Srinivas Kandagatla Signed-off-by: Alexey Klimov Link: https://patch.msgid.link/20250228161430.373961-1-alexey.klimov@linaro.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/qcom/sm8250.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sound/soc/qcom/sm8250.c b/sound/soc/qcom/sm8250.c index 19adadedc88a2..1001fd3213803 100644 --- a/sound/soc/qcom/sm8250.c +++ b/sound/soc/qcom/sm8250.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -39,9 +40,11 @@ static int sm8250_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, SNDRV_PCM_HW_PARAM_RATE); struct snd_interval *channels = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS); + struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); rate->min = rate->max = 48000; channels->min = channels->max = 2; + snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S16_LE); return 0; } -- GitLab From 75ae2a35536111c557952f809323e5fe1674aa09 Mon Sep 17 00:00:00 2001 From: Coly Li Date: Sun, 9 Mar 2025 12:05:56 -0400 Subject: [PATCH 0200/2211] badblocks: Fix a nonsense WARN_ON() which checks whether a u64 variable < 0 [ Upstream commit 7e76336e14de9a2b67af96012ddd46c5676cf340 ] In _badblocks_check(), there are lines of code like this, 1246 sectors -= len; [snipped] 1251 WARN_ON(sectors < 0); The WARN_ON() at line 1257 doesn't make sense because sectors is unsigned long long type and never to be <0. Fix it by checking directly checking whether sectors is less than len. Reported-by: Dan Carpenter Signed-off-by: Coly Li Reviewed-by: Yu Kuai Link: https://lore.kernel.org/r/20250309160556.42854-1-colyli@kernel.org Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- block/badblocks.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/block/badblocks.c b/block/badblocks.c index db4ec8b9b2a8c..a9709771a1015 100644 --- a/block/badblocks.c +++ b/block/badblocks.c @@ -1349,14 +1349,15 @@ re_check: len = sectors; update_sectors: + /* This situation should never happen */ + WARN_ON(sectors < len); + s += len; sectors -= len; if (sectors > 0) goto re_check; - WARN_ON(sectors < 0); - if (unacked_badblocks > 0) rv = -1; else if (acked_badblocks > 0) -- GitLab From 9032252905664bb033eb9bb8acb6e8a04f31cf39 Mon Sep 17 00:00:00 2001 From: Yeoreum Yun Date: Thu, 6 Mar 2025 12:11:06 +0000 Subject: [PATCH 0201/2211] coresight-etb10: change etb_drvdata spinlock's type to raw_spinlock_t [ Upstream commit 6b80c0abe475ed1017c5e862636049aa1cc17a1a ] In coresight-etb10 drivers, etb_drvdata->spinlock can be held during __schedule() by perf_event_task_sched_out()/in(). Since etb_drvdata->spinlock type is spinlock_t and perf_event_task_sched_out()/in() is called after acquiring rq_lock, which is raw_spinlock_t (an unsleepable lock), this poses an issue in PREEMPT_RT kernel where spinlock_t is sleepable. To address this, change type etb_drvdata->spinlock in coresight-etb10 drivers, which can be called by perf_event_task_sched_out()/in(), from spinlock_t to raw_spinlock_t. Reviewed-by: James Clark Reviewed-by: Mike Leach Signed-off-by: Yeoreum Yun Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20250306121110.1647948-6-yeoreum.yun@arm.com Signed-off-by: Sasha Levin --- drivers/hwtracing/coresight/coresight-etb10.c | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-etb10.c b/drivers/hwtracing/coresight/coresight-etb10.c index aea9ac9c4bd06..7948597d483d2 100644 --- a/drivers/hwtracing/coresight/coresight-etb10.c +++ b/drivers/hwtracing/coresight/coresight-etb10.c @@ -84,7 +84,7 @@ struct etb_drvdata { struct clk *atclk; struct coresight_device *csdev; struct miscdevice miscdev; - spinlock_t spinlock; + raw_spinlock_t spinlock; local_t reading; pid_t pid; u8 *buf; @@ -145,7 +145,7 @@ static int etb_enable_sysfs(struct coresight_device *csdev) unsigned long flags; struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); - spin_lock_irqsave(&drvdata->spinlock, flags); + raw_spin_lock_irqsave(&drvdata->spinlock, flags); /* Don't messup with perf sessions. */ if (coresight_get_mode(csdev) == CS_MODE_PERF) { @@ -163,7 +163,7 @@ static int etb_enable_sysfs(struct coresight_device *csdev) csdev->refcnt++; out: - spin_unlock_irqrestore(&drvdata->spinlock, flags); + raw_spin_unlock_irqrestore(&drvdata->spinlock, flags); return ret; } @@ -176,7 +176,7 @@ static int etb_enable_perf(struct coresight_device *csdev, void *data) struct perf_output_handle *handle = data; struct cs_buffers *buf = etm_perf_sink_config(handle); - spin_lock_irqsave(&drvdata->spinlock, flags); + raw_spin_lock_irqsave(&drvdata->spinlock, flags); /* No need to continue if the component is already in used by sysFS. */ if (coresight_get_mode(drvdata->csdev) == CS_MODE_SYSFS) { @@ -219,7 +219,7 @@ static int etb_enable_perf(struct coresight_device *csdev, void *data) } out: - spin_unlock_irqrestore(&drvdata->spinlock, flags); + raw_spin_unlock_irqrestore(&drvdata->spinlock, flags); return ret; } @@ -352,11 +352,11 @@ static int etb_disable(struct coresight_device *csdev) struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); unsigned long flags; - spin_lock_irqsave(&drvdata->spinlock, flags); + raw_spin_lock_irqsave(&drvdata->spinlock, flags); csdev->refcnt--; if (csdev->refcnt) { - spin_unlock_irqrestore(&drvdata->spinlock, flags); + raw_spin_unlock_irqrestore(&drvdata->spinlock, flags); return -EBUSY; } @@ -366,7 +366,7 @@ static int etb_disable(struct coresight_device *csdev) /* Dissociate from monitored process. */ drvdata->pid = -1; coresight_set_mode(csdev, CS_MODE_DISABLED); - spin_unlock_irqrestore(&drvdata->spinlock, flags); + raw_spin_unlock_irqrestore(&drvdata->spinlock, flags); dev_dbg(&csdev->dev, "ETB disabled\n"); return 0; @@ -443,7 +443,7 @@ static unsigned long etb_update_buffer(struct coresight_device *csdev, capacity = drvdata->buffer_depth * ETB_FRAME_SIZE_WORDS; - spin_lock_irqsave(&drvdata->spinlock, flags); + raw_spin_lock_irqsave(&drvdata->spinlock, flags); /* Don't do anything if another tracer is using this sink */ if (csdev->refcnt != 1) @@ -566,7 +566,7 @@ static unsigned long etb_update_buffer(struct coresight_device *csdev, __etb_enable_hw(drvdata); CS_LOCK(drvdata->base); out: - spin_unlock_irqrestore(&drvdata->spinlock, flags); + raw_spin_unlock_irqrestore(&drvdata->spinlock, flags); return to_read; } @@ -587,13 +587,13 @@ static void etb_dump(struct etb_drvdata *drvdata) { unsigned long flags; - spin_lock_irqsave(&drvdata->spinlock, flags); + raw_spin_lock_irqsave(&drvdata->spinlock, flags); if (coresight_get_mode(drvdata->csdev) == CS_MODE_SYSFS) { __etb_disable_hw(drvdata); etb_dump_hw(drvdata); __etb_enable_hw(drvdata); } - spin_unlock_irqrestore(&drvdata->spinlock, flags); + raw_spin_unlock_irqrestore(&drvdata->spinlock, flags); dev_dbg(&drvdata->csdev->dev, "ETB dumped\n"); } @@ -746,7 +746,7 @@ static int etb_probe(struct amba_device *adev, const struct amba_id *id) drvdata->base = base; desc.access = CSDEV_ACCESS_IOMEM(base); - spin_lock_init(&drvdata->spinlock); + raw_spin_lock_init(&drvdata->spinlock); drvdata->buffer_depth = etb_get_buffer_depth(drvdata); -- GitLab From 11be3d3f956ba13cd91d41655e5046a6084e8083 Mon Sep 17 00:00:00 2001 From: Vasant Hegde Date: Thu, 27 Feb 2025 16:23:16 +0000 Subject: [PATCH 0202/2211] iommu/amd/pgtbl_v2: Improve error handling [ Upstream commit 36a1cfd497435ba5e37572fe9463bb62a7b1b984 ] Return -ENOMEM if v2_alloc_pte() fails to allocate memory. Signed-off-by: Vasant Hegde Reviewed-by: Jason Gunthorpe Link: https://lore.kernel.org/r/20250227162320.5805-4-vasant.hegde@amd.com Signed-off-by: Joerg Roedel Signed-off-by: Sasha Levin --- drivers/iommu/amd/io_pgtable_v2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/iommu/amd/io_pgtable_v2.c b/drivers/iommu/amd/io_pgtable_v2.c index c616de2c5926e..a56a273963059 100644 --- a/drivers/iommu/amd/io_pgtable_v2.c +++ b/drivers/iommu/amd/io_pgtable_v2.c @@ -254,7 +254,7 @@ static int iommu_v2_map_pages(struct io_pgtable_ops *ops, unsigned long iova, pte = v2_alloc_pte(cfg->amd.nid, pgtable->pgd, iova, map_size, gfp, &updated); if (!pte) { - ret = -EINVAL; + ret = -ENOMEM; goto out; } -- GitLab From d95fdee2253e612216e72f29c65b92ec42d254eb Mon Sep 17 00:00:00 2001 From: Aaron Kling Date: Mon, 10 Mar 2025 00:28:48 -0500 Subject: [PATCH 0203/2211] cpufreq: tegra186: Share policy per cluster [ Upstream commit be4ae8c19492cd6d5de61ccb34ffb3f5ede5eec8 ] This functionally brings tegra186 in line with tegra210 and tegra194, sharing a cpufreq policy between all cores in a cluster. Reviewed-by: Sumit Gupta Acked-by: Thierry Reding Signed-off-by: Aaron Kling Signed-off-by: Viresh Kumar Signed-off-by: Sasha Levin --- drivers/cpufreq/tegra186-cpufreq.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/cpufreq/tegra186-cpufreq.c b/drivers/cpufreq/tegra186-cpufreq.c index 7b8fcfa55038b..4e5b6f9a56d1b 100644 --- a/drivers/cpufreq/tegra186-cpufreq.c +++ b/drivers/cpufreq/tegra186-cpufreq.c @@ -73,11 +73,18 @@ static int tegra186_cpufreq_init(struct cpufreq_policy *policy) { struct tegra186_cpufreq_data *data = cpufreq_get_driver_data(); unsigned int cluster = data->cpus[policy->cpu].bpmp_cluster_id; + u32 cpu; policy->freq_table = data->clusters[cluster].table; policy->cpuinfo.transition_latency = 300 * 1000; policy->driver_data = NULL; + /* set same policy for all cpus in a cluster */ + for (cpu = 0; cpu < ARRAY_SIZE(tegra186_cpus); cpu++) { + if (data->cpus[cpu].bpmp_cluster_id == cluster) + cpumask_set_cpu(cpu, policy->cpus); + } + return 0; } -- GitLab From 1e0398a349e85cc1a23bafcf005c9a351251267f Mon Sep 17 00:00:00 2001 From: Chin-Ting Kuo Date: Mon, 13 Jan 2025 17:37:37 +0800 Subject: [PATCH 0204/2211] watchdog: aspeed: Update bootstatus handling [ Upstream commit 5c03f9f4d36292150c14ebd90788c4d3273ed9dc ] The boot status in the watchdog device struct is updated during controller probe stage. Application layer can get the boot status through the command, cat /sys/class/watchdog/watchdogX/bootstatus. The bootstatus can be, WDIOF_CARDRESET => System is reset due to WDT timeout occurs. Others => Other reset events, e.g., power on reset. On ASPEED platforms, boot status is recorded in the SCU registers. - AST2400: Only a bit is used to represent system reset triggered by any WDT controller. - AST2500/AST2600: System reset triggered by different WDT controllers can be distinguished by different SCU bits. Besides, on AST2400 and AST2500, since alternating boot event is also triggered by using WDT timeout mechanism, it is classified as WDIOF_CARDRESET. Signed-off-by: Chin-Ting Kuo Reviewed-by: Andrew Jeffery Reviewed-by: Guenter Roeck Link: https://lore.kernel.org/r/20250113093737.845097-2-chin-ting_kuo@aspeedtech.com Signed-off-by: Guenter Roeck Signed-off-by: Wim Van Sebroeck Signed-off-by: Sasha Levin --- drivers/watchdog/aspeed_wdt.c | 81 ++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/drivers/watchdog/aspeed_wdt.c b/drivers/watchdog/aspeed_wdt.c index b4773a6aaf8cc..369635b38ca0e 100644 --- a/drivers/watchdog/aspeed_wdt.c +++ b/drivers/watchdog/aspeed_wdt.c @@ -11,21 +11,30 @@ #include #include #include +#include #include #include #include #include +#include #include static bool nowayout = WATCHDOG_NOWAYOUT; module_param(nowayout, bool, 0); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); +struct aspeed_wdt_scu { + const char *compatible; + u32 reset_status_reg; + u32 wdt_reset_mask; + u32 wdt_reset_mask_shift; +}; struct aspeed_wdt_config { u32 ext_pulse_width_mask; u32 irq_shift; u32 irq_mask; + struct aspeed_wdt_scu scu; }; struct aspeed_wdt { @@ -39,18 +48,36 @@ static const struct aspeed_wdt_config ast2400_config = { .ext_pulse_width_mask = 0xff, .irq_shift = 0, .irq_mask = 0, + .scu = { + .compatible = "aspeed,ast2400-scu", + .reset_status_reg = 0x3c, + .wdt_reset_mask = 0x1, + .wdt_reset_mask_shift = 1, + }, }; static const struct aspeed_wdt_config ast2500_config = { .ext_pulse_width_mask = 0xfffff, .irq_shift = 12, .irq_mask = GENMASK(31, 12), + .scu = { + .compatible = "aspeed,ast2500-scu", + .reset_status_reg = 0x3c, + .wdt_reset_mask = 0x1, + .wdt_reset_mask_shift = 2, + }, }; static const struct aspeed_wdt_config ast2600_config = { .ext_pulse_width_mask = 0xfffff, .irq_shift = 0, .irq_mask = GENMASK(31, 10), + .scu = { + .compatible = "aspeed,ast2600-scu", + .reset_status_reg = 0x74, + .wdt_reset_mask = 0xf, + .wdt_reset_mask_shift = 16, + }, }; static const struct of_device_id aspeed_wdt_of_table[] = { @@ -213,6 +240,56 @@ static int aspeed_wdt_restart(struct watchdog_device *wdd, return 0; } +static void aspeed_wdt_update_bootstatus(struct platform_device *pdev, + struct aspeed_wdt *wdt) +{ + const struct resource *res; + struct aspeed_wdt_scu scu = wdt->cfg->scu; + struct regmap *scu_base; + u32 reset_mask_width; + u32 reset_mask_shift; + u32 idx = 0; + u32 status; + int ret; + + if (!of_device_is_compatible(pdev->dev.of_node, "aspeed,ast2400-wdt")) { + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + idx = ((intptr_t)wdt->base & 0x00000fff) / resource_size(res); + } + + scu_base = syscon_regmap_lookup_by_compatible(scu.compatible); + if (IS_ERR(scu_base)) { + wdt->wdd.bootstatus = WDIOS_UNKNOWN; + return; + } + + ret = regmap_read(scu_base, scu.reset_status_reg, &status); + if (ret) { + wdt->wdd.bootstatus = WDIOS_UNKNOWN; + return; + } + + reset_mask_width = hweight32(scu.wdt_reset_mask); + reset_mask_shift = scu.wdt_reset_mask_shift + + reset_mask_width * idx; + + if (status & (scu.wdt_reset_mask << reset_mask_shift)) + wdt->wdd.bootstatus = WDIOF_CARDRESET; + + /* clear wdt reset event flag */ + if (of_device_is_compatible(pdev->dev.of_node, "aspeed,ast2400-wdt") || + of_device_is_compatible(pdev->dev.of_node, "aspeed,ast2500-wdt")) { + ret = regmap_read(scu_base, scu.reset_status_reg, &status); + if (!ret) { + status &= ~(scu.wdt_reset_mask << reset_mask_shift); + regmap_write(scu_base, scu.reset_status_reg, status); + } + } else { + regmap_write(scu_base, scu.reset_status_reg, + scu.wdt_reset_mask << reset_mask_shift); + } +} + /* access_cs0 shows if cs0 is accessible, hence the reverted bit */ static ssize_t access_cs0_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -458,10 +535,10 @@ static int aspeed_wdt_probe(struct platform_device *pdev) writel(duration - 1, wdt->base + WDT_RESET_WIDTH); } + aspeed_wdt_update_bootstatus(pdev, wdt); + status = readl(wdt->base + WDT_TIMEOUT_STATUS); if (status & WDT_TIMEOUT_STATUS_BOOT_SECONDARY) { - wdt->wdd.bootstatus = WDIOF_CARDRESET; - if (of_device_is_compatible(np, "aspeed,ast2400-wdt") || of_device_is_compatible(np, "aspeed,ast2500-wdt")) wdt->wdd.groups = bswitch_groups; -- GitLab From fe2329eff5bee461ebcafadb6ca1df0cbf5945fd Mon Sep 17 00:00:00 2001 From: Christian Bruel Date: Fri, 24 Jan 2025 13:30:43 +0100 Subject: [PATCH 0205/2211] PCI: endpoint: pci-epf-test: Fix double free that causes kernel to oops MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 934e9d137d937706004c325fa1474f9e3f1ba10a ] Fix a kernel oops found while testing the stm32_pcie Endpoint driver with handling of PERST# deassertion: During EP initialization, pci_epf_test_alloc_space() allocates all BARs, which are further freed if epc_set_bar() fails (for instance, due to no free inbound window). However, when pci_epc_set_bar() fails, the error path: pci_epc_set_bar() -> pci_epf_free_space() does not clear the previous assignment to epf_test->reg[bar]. Then, if the host reboots, the PERST# deassertion restarts the BAR allocation sequence with the same allocation failure (no free inbound window), creating a double free situation since epf_test->reg[bar] was deallocated and is still non-NULL. Thus, make sure that pci_epf_alloc_space() and pci_epf_free_space() invocations are symmetric, and as such, set epf_test->reg[bar] to NULL when memory is freed. Reviewed-by: Niklas Cassel Reviewed-by: Manivannan Sadhasivam Signed-off-by: Christian Bruel Link: https://lore.kernel.org/r/20250124123043.96112-1-christian.bruel@foss.st.com [kwilczynski: commit log] Signed-off-by: Krzysztof Wilczyński Signed-off-by: Sasha Levin --- drivers/pci/endpoint/functions/pci-epf-test.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c index 14b4c68ab4e1a..21aa3709e2577 100644 --- a/drivers/pci/endpoint/functions/pci-epf-test.c +++ b/drivers/pci/endpoint/functions/pci-epf-test.c @@ -703,6 +703,7 @@ static int pci_epf_test_set_bar(struct pci_epf *epf) if (ret) { pci_epf_free_space(epf, epf_test->reg[bar], bar, PRIMARY_INTERFACE); + epf_test->reg[bar] = NULL; dev_err(dev, "Failed to set BAR%d\n", bar); if (bar == test_reg_bar) return ret; @@ -878,6 +879,7 @@ static void pci_epf_test_free_space(struct pci_epf *epf) pci_epf_free_space(epf, epf_test->reg[bar], bar, PRIMARY_INTERFACE); + epf_test->reg[bar] = NULL; } } -- GitLab From f615e8d2dec6746127d4667c3cae81bfd6a1ed3a Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Thu, 23 Jan 2025 13:01:48 +0100 Subject: [PATCH 0206/2211] misc: pci_endpoint_test: Give disabled BARs a distinct error code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 7e80bbef1d697dbce7a39cfad0df770880fe3f29 ] The current code returns -ENOMEM if test->bar[barno] is NULL. There can be two reasons why test->bar[barno] is NULL: 1) The pci_ioremap_bar() call in pci_endpoint_test_probe() failed. 2) The BAR was skipped, because it is disabled by the endpoint. Many PCI endpoint controller drivers will disable all BARs in their init function. A disabled BAR will have a size of 0. A PCI endpoint function driver will be able to enable any BAR that is not marked as BAR_RESERVED (which means that the BAR should not be touched by the EPF driver). Thus, perform check if the size is 0, before checking if test->bar[barno] is NULL, such that we can return different errors. This will allow the selftests to return SKIP instead of FAIL for disabled BARs. Signed-off-by: Niklas Cassel Reviewed-by: Manivannan Sadhasivam Link: https://lore.kernel.org/r/20250123120147.3603409-3-cassel@kernel.org Signed-off-by: Manivannan Sadhasivam [kwilczynski: commit log] Signed-off-by: Krzysztof Wilczyński Signed-off-by: Sasha Levin --- drivers/misc/pci_endpoint_test.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_test.c index e22afb420d099..f05256b7c2084 100644 --- a/drivers/misc/pci_endpoint_test.c +++ b/drivers/misc/pci_endpoint_test.c @@ -287,11 +287,13 @@ static bool pci_endpoint_test_bar(struct pci_endpoint_test *test, void *read_buf __free(kfree) = NULL; struct pci_dev *pdev = test->pdev; + bar_size = pci_resource_len(pdev, barno); + if (!bar_size) + return -ENODATA; + if (!test->bar[barno]) return false; - bar_size = pci_resource_len(pdev, barno); - if (barno == test->test_reg_bar) bar_size = 0x4; -- GitLab From 7caad075acb634a74911830d6386c50ea12566cd Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Thu, 27 Feb 2025 17:04:46 +0800 Subject: [PATCH 0207/2211] crypto: lzo - Fix compression buffer overrun [ Upstream commit cc47f07234f72cbd8e2c973cdbf2a6730660a463 ] Unlike the decompression code, the compression code in LZO never checked for output overruns. It instead assumes that the caller always provides enough buffer space, disregarding the buffer length provided by the caller. Add a safe compression interface that checks for the end of buffer before each write. Use the safe interface in crypto/lzo. Signed-off-by: Herbert Xu Reviewed-by: David Sterba Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- crypto/lzo-rle.c | 2 +- crypto/lzo.c | 2 +- include/linux/lzo.h | 8 +++ lib/lzo/Makefile | 2 +- lib/lzo/lzo1x_compress.c | 102 +++++++++++++++++++++++++--------- lib/lzo/lzo1x_compress_safe.c | 18 ++++++ 6 files changed, 106 insertions(+), 28 deletions(-) create mode 100644 lib/lzo/lzo1x_compress_safe.c diff --git a/crypto/lzo-rle.c b/crypto/lzo-rle.c index 0631d975bfac1..0abc2d87f0420 100644 --- a/crypto/lzo-rle.c +++ b/crypto/lzo-rle.c @@ -55,7 +55,7 @@ static int __lzorle_compress(const u8 *src, unsigned int slen, size_t tmp_len = *dlen; /* size_t(ulong) <-> uint on 64 bit */ int err; - err = lzorle1x_1_compress(src, slen, dst, &tmp_len, ctx); + err = lzorle1x_1_compress_safe(src, slen, dst, &tmp_len, ctx); if (err != LZO_E_OK) return -EINVAL; diff --git a/crypto/lzo.c b/crypto/lzo.c index ebda132dd22bf..8338851c7406a 100644 --- a/crypto/lzo.c +++ b/crypto/lzo.c @@ -55,7 +55,7 @@ static int __lzo_compress(const u8 *src, unsigned int slen, size_t tmp_len = *dlen; /* size_t(ulong) <-> uint on 64 bit */ int err; - err = lzo1x_1_compress(src, slen, dst, &tmp_len, ctx); + err = lzo1x_1_compress_safe(src, slen, dst, &tmp_len, ctx); if (err != LZO_E_OK) return -EINVAL; diff --git a/include/linux/lzo.h b/include/linux/lzo.h index e95c7d1092b28..4d30e3624acd2 100644 --- a/include/linux/lzo.h +++ b/include/linux/lzo.h @@ -24,10 +24,18 @@ int lzo1x_1_compress(const unsigned char *src, size_t src_len, unsigned char *dst, size_t *dst_len, void *wrkmem); +/* Same as above but does not write more than dst_len to dst. */ +int lzo1x_1_compress_safe(const unsigned char *src, size_t src_len, + unsigned char *dst, size_t *dst_len, void *wrkmem); + /* This requires 'wrkmem' of size LZO1X_1_MEM_COMPRESS */ int lzorle1x_1_compress(const unsigned char *src, size_t src_len, unsigned char *dst, size_t *dst_len, void *wrkmem); +/* Same as above but does not write more than dst_len to dst. */ +int lzorle1x_1_compress_safe(const unsigned char *src, size_t src_len, + unsigned char *dst, size_t *dst_len, void *wrkmem); + /* safe decompression with overrun testing */ int lzo1x_decompress_safe(const unsigned char *src, size_t src_len, unsigned char *dst, size_t *dst_len); diff --git a/lib/lzo/Makefile b/lib/lzo/Makefile index 2f58fafbbdddc..fc7b2b7ef4b20 100644 --- a/lib/lzo/Makefile +++ b/lib/lzo/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-only -lzo_compress-objs := lzo1x_compress.o +lzo_compress-objs := lzo1x_compress.o lzo1x_compress_safe.o lzo_decompress-objs := lzo1x_decompress_safe.o obj-$(CONFIG_LZO_COMPRESS) += lzo_compress.o diff --git a/lib/lzo/lzo1x_compress.c b/lib/lzo/lzo1x_compress.c index 47d6d43ea9578..7b10ca86a8930 100644 --- a/lib/lzo/lzo1x_compress.c +++ b/lib/lzo/lzo1x_compress.c @@ -18,11 +18,22 @@ #include #include "lzodefs.h" -static noinline size_t -lzo1x_1_do_compress(const unsigned char *in, size_t in_len, - unsigned char *out, size_t *out_len, - size_t ti, void *wrkmem, signed char *state_offset, - const unsigned char bitstream_version) +#undef LZO_UNSAFE + +#ifndef LZO_SAFE +#define LZO_UNSAFE 1 +#define LZO_SAFE(name) name +#define HAVE_OP(x) 1 +#endif + +#define NEED_OP(x) if (!HAVE_OP(x)) goto output_overrun + +static noinline int +LZO_SAFE(lzo1x_1_do_compress)(const unsigned char *in, size_t in_len, + unsigned char **out, unsigned char *op_end, + size_t *tp, void *wrkmem, + signed char *state_offset, + const unsigned char bitstream_version) { const unsigned char *ip; unsigned char *op; @@ -30,8 +41,9 @@ lzo1x_1_do_compress(const unsigned char *in, size_t in_len, const unsigned char * const ip_end = in + in_len - 20; const unsigned char *ii; lzo_dict_t * const dict = (lzo_dict_t *) wrkmem; + size_t ti = *tp; - op = out; + op = *out; ip = in; ii = ip; ip += ti < 4 ? 4 - ti : 0; @@ -116,25 +128,32 @@ next: if (t != 0) { if (t <= 3) { op[*state_offset] |= t; + NEED_OP(4); COPY4(op, ii); op += t; } else if (t <= 16) { + NEED_OP(17); *op++ = (t - 3); COPY8(op, ii); COPY8(op + 8, ii + 8); op += t; } else { if (t <= 18) { + NEED_OP(1); *op++ = (t - 3); } else { size_t tt = t - 18; + NEED_OP(1); *op++ = 0; while (unlikely(tt > 255)) { tt -= 255; + NEED_OP(1); *op++ = 0; } + NEED_OP(1); *op++ = tt; } + NEED_OP(t); do { COPY8(op, ii); COPY8(op + 8, ii + 8); @@ -151,6 +170,7 @@ next: if (unlikely(run_length)) { ip += run_length; run_length -= MIN_ZERO_RUN_LENGTH; + NEED_OP(4); put_unaligned_le32((run_length << 21) | 0xfffc18 | (run_length & 0x7), op); op += 4; @@ -243,10 +263,12 @@ m_len_done: ip += m_len; if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) { m_off -= 1; + NEED_OP(2); *op++ = (((m_len - 1) << 5) | ((m_off & 7) << 2)); *op++ = (m_off >> 3); } else if (m_off <= M3_MAX_OFFSET) { m_off -= 1; + NEED_OP(1); if (m_len <= M3_MAX_LEN) *op++ = (M3_MARKER | (m_len - 2)); else { @@ -254,14 +276,18 @@ m_len_done: *op++ = M3_MARKER | 0; while (unlikely(m_len > 255)) { m_len -= 255; + NEED_OP(1); *op++ = 0; } + NEED_OP(1); *op++ = (m_len); } + NEED_OP(2); *op++ = (m_off << 2); *op++ = (m_off >> 6); } else { m_off -= 0x4000; + NEED_OP(1); if (m_len <= M4_MAX_LEN) *op++ = (M4_MARKER | ((m_off >> 11) & 8) | (m_len - 2)); @@ -282,11 +308,14 @@ m_len_done: m_len -= M4_MAX_LEN; *op++ = (M4_MARKER | ((m_off >> 11) & 8)); while (unlikely(m_len > 255)) { + NEED_OP(1); m_len -= 255; *op++ = 0; } + NEED_OP(1); *op++ = (m_len); } + NEED_OP(2); *op++ = (m_off << 2); *op++ = (m_off >> 6); } @@ -295,14 +324,20 @@ finished_writing_instruction: ii = ip; goto next; } - *out_len = op - out; - return in_end - (ii - ti); + *out = op; + *tp = in_end - (ii - ti); + return LZO_E_OK; + +output_overrun: + return LZO_E_OUTPUT_OVERRUN; } -static int lzogeneric1x_1_compress(const unsigned char *in, size_t in_len, - unsigned char *out, size_t *out_len, - void *wrkmem, const unsigned char bitstream_version) +static int LZO_SAFE(lzogeneric1x_1_compress)( + const unsigned char *in, size_t in_len, + unsigned char *out, size_t *out_len, + void *wrkmem, const unsigned char bitstream_version) { + unsigned char * const op_end = out + *out_len; const unsigned char *ip = in; unsigned char *op = out; unsigned char *data_start; @@ -326,14 +361,18 @@ static int lzogeneric1x_1_compress(const unsigned char *in, size_t in_len, while (l > 20) { size_t ll = min_t(size_t, l, m4_max_offset + 1); uintptr_t ll_end = (uintptr_t) ip + ll; + int err; + if ((ll_end + ((t + ll) >> 5)) <= ll_end) break; BUILD_BUG_ON(D_SIZE * sizeof(lzo_dict_t) > LZO1X_1_MEM_COMPRESS); memset(wrkmem, 0, D_SIZE * sizeof(lzo_dict_t)); - t = lzo1x_1_do_compress(ip, ll, op, out_len, t, wrkmem, - &state_offset, bitstream_version); + err = LZO_SAFE(lzo1x_1_do_compress)( + ip, ll, &op, op_end, &t, wrkmem, + &state_offset, bitstream_version); + if (err != LZO_E_OK) + return err; ip += ll; - op += *out_len; l -= ll; } t += l; @@ -342,20 +381,26 @@ static int lzogeneric1x_1_compress(const unsigned char *in, size_t in_len, const unsigned char *ii = in + in_len - t; if (op == data_start && t <= 238) { + NEED_OP(1); *op++ = (17 + t); } else if (t <= 3) { op[state_offset] |= t; } else if (t <= 18) { + NEED_OP(1); *op++ = (t - 3); } else { size_t tt = t - 18; + NEED_OP(1); *op++ = 0; while (tt > 255) { tt -= 255; + NEED_OP(1); *op++ = 0; } + NEED_OP(1); *op++ = tt; } + NEED_OP(t); if (t >= 16) do { COPY8(op, ii); COPY8(op + 8, ii + 8); @@ -368,31 +413,38 @@ static int lzogeneric1x_1_compress(const unsigned char *in, size_t in_len, } while (--t > 0); } + NEED_OP(3); *op++ = M4_MARKER | 1; *op++ = 0; *op++ = 0; *out_len = op - out; return LZO_E_OK; + +output_overrun: + return LZO_E_OUTPUT_OVERRUN; } -int lzo1x_1_compress(const unsigned char *in, size_t in_len, - unsigned char *out, size_t *out_len, - void *wrkmem) +int LZO_SAFE(lzo1x_1_compress)(const unsigned char *in, size_t in_len, + unsigned char *out, size_t *out_len, + void *wrkmem) { - return lzogeneric1x_1_compress(in, in_len, out, out_len, wrkmem, 0); + return LZO_SAFE(lzogeneric1x_1_compress)( + in, in_len, out, out_len, wrkmem, 0); } -int lzorle1x_1_compress(const unsigned char *in, size_t in_len, - unsigned char *out, size_t *out_len, - void *wrkmem) +int LZO_SAFE(lzorle1x_1_compress)(const unsigned char *in, size_t in_len, + unsigned char *out, size_t *out_len, + void *wrkmem) { - return lzogeneric1x_1_compress(in, in_len, out, out_len, - wrkmem, LZO_VERSION); + return LZO_SAFE(lzogeneric1x_1_compress)( + in, in_len, out, out_len, wrkmem, LZO_VERSION); } -EXPORT_SYMBOL_GPL(lzo1x_1_compress); -EXPORT_SYMBOL_GPL(lzorle1x_1_compress); +EXPORT_SYMBOL_GPL(LZO_SAFE(lzo1x_1_compress)); +EXPORT_SYMBOL_GPL(LZO_SAFE(lzorle1x_1_compress)); +#ifndef LZO_UNSAFE MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("LZO1X-1 Compressor"); +#endif diff --git a/lib/lzo/lzo1x_compress_safe.c b/lib/lzo/lzo1x_compress_safe.c new file mode 100644 index 0000000000000..371c9f8494928 --- /dev/null +++ b/lib/lzo/lzo1x_compress_safe.c @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * LZO1X Compressor from LZO + * + * Copyright (C) 1996-2012 Markus F.X.J. Oberhumer + * + * The full LZO package can be found at: + * http://www.oberhumer.com/opensource/lzo/ + * + * Changed for Linux kernel use by: + * Nitin Gupta + * Richard Purdie + */ + +#define LZO_SAFE(name) name##_safe +#define HAVE_OP(x) ((size_t)(op_end - op) >= (size_t)(x)) + +#include "lzo1x_compress.c" -- GitLab From 6a1706dfe0569a3d1934012948a4c1f420b5562f Mon Sep 17 00:00:00 2001 From: Sven Schwermer Date: Mon, 24 Feb 2025 08:42:25 +0100 Subject: [PATCH 0208/2211] crypto: mxs-dcp - Only set OTP_KEY bit for OTP key [ Upstream commit caa9dbb76ff52ec848a57245062aaeaa07740adc ] While MXS_DCP_CONTROL0_OTP_KEY is set, the CRYPTO_KEY (DCP_PAES_KEY_OTP) is used even if the UNIQUE_KEY (DCP_PAES_KEY_UNIQUE) is selected. This is not clearly documented, but this implementation is consistent with NXP's downstream kernel fork and optee_os. Signed-off-by: Sven Schwermer Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- drivers/crypto/mxs-dcp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/crypto/mxs-dcp.c b/drivers/crypto/mxs-dcp.c index 77a6301f37f0a..29c0c69d5905d 100644 --- a/drivers/crypto/mxs-dcp.c +++ b/drivers/crypto/mxs-dcp.c @@ -265,12 +265,12 @@ static int mxs_dcp_run_aes(struct dcp_async_ctx *actx, MXS_DCP_CONTROL0_INTERRUPT | MXS_DCP_CONTROL0_ENABLE_CIPHER; - if (key_referenced) - /* Set OTP key bit to select the key via KEY_SELECT. */ - desc->control0 |= MXS_DCP_CONTROL0_OTP_KEY; - else + if (!key_referenced) /* Payload contains the key. */ desc->control0 |= MXS_DCP_CONTROL0_PAYLOAD_KEY; + else if (actx->key[0] == DCP_PAES_KEY_OTP) + /* Set OTP key bit to select the key via KEY_SELECT. */ + desc->control0 |= MXS_DCP_CONTROL0_OTP_KEY; if (rctx->enc) desc->control0 |= MXS_DCP_CONTROL0_CIPHER_ENCRYPT; -- GitLab From e1901e8e6bbc44b9c91b55ce47deb9297cd7bb8d Mon Sep 17 00:00:00 2001 From: Harish Kasiviswanathan Date: Tue, 14 Jan 2025 14:13:35 -0500 Subject: [PATCH 0209/2211] drm/amdkfd: Set per-process flags only once for gfx9/10/11/12 [ Upstream commit 61972cd93af70738a6ad7f93e17cc7f68a01e182 ] Define set_cache_memory_policy() for these asics and move all static changes from update_qpd() which is called each time a queue is created to set_cache_memory_policy() which is called once during process initialization Signed-off-by: Harish Kasiviswanathan Reviewed-by: Amber Lin Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../amd/amdkfd/kfd_device_queue_manager_v10.c | 41 +++++++++++-------- .../amd/amdkfd/kfd_device_queue_manager_v11.c | 41 +++++++++++-------- .../amd/amdkfd/kfd_device_queue_manager_v12.c | 41 +++++++++++-------- .../amd/amdkfd/kfd_device_queue_manager_v9.c | 36 +++++++++++++++- 4 files changed, 107 insertions(+), 52 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v10.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v10.c index 245a90dfc2f6b..b5f5f141353b5 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v10.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v10.c @@ -31,10 +31,17 @@ static int update_qpd_v10(struct device_queue_manager *dqm, struct qcm_process_device *qpd); static void init_sdma_vm_v10(struct device_queue_manager *dqm, struct queue *q, struct qcm_process_device *qpd); +static bool set_cache_memory_policy_v10(struct device_queue_manager *dqm, + struct qcm_process_device *qpd, + enum cache_policy default_policy, + enum cache_policy alternate_policy, + void __user *alternate_aperture_base, + uint64_t alternate_aperture_size); void device_queue_manager_init_v10( struct device_queue_manager_asic_ops *asic_ops) { + asic_ops->set_cache_memory_policy = set_cache_memory_policy_v10; asic_ops->update_qpd = update_qpd_v10; asic_ops->init_sdma_vm = init_sdma_vm_v10; asic_ops->mqd_manager_init = mqd_manager_init_v10; @@ -49,27 +56,27 @@ static uint32_t compute_sh_mem_bases_64bit(struct kfd_process_device *pdd) private_base; } -static int update_qpd_v10(struct device_queue_manager *dqm, - struct qcm_process_device *qpd) +static bool set_cache_memory_policy_v10(struct device_queue_manager *dqm, + struct qcm_process_device *qpd, + enum cache_policy default_policy, + enum cache_policy alternate_policy, + void __user *alternate_aperture_base, + uint64_t alternate_aperture_size) { - struct kfd_process_device *pdd; - - pdd = qpd_to_pdd(qpd); - - /* check if sh_mem_config register already configured */ - if (qpd->sh_mem_config == 0) { - qpd->sh_mem_config = - (SH_MEM_ALIGNMENT_MODE_UNALIGNED << - SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) | - (3 << SH_MEM_CONFIG__INITIAL_INST_PREFETCH__SHIFT); - qpd->sh_mem_ape1_limit = 0; - qpd->sh_mem_ape1_base = 0; - } - - qpd->sh_mem_bases = compute_sh_mem_bases_64bit(pdd); + qpd->sh_mem_config = (SH_MEM_ALIGNMENT_MODE_UNALIGNED << + SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) | + (3 << SH_MEM_CONFIG__INITIAL_INST_PREFETCH__SHIFT); + qpd->sh_mem_ape1_limit = 0; + qpd->sh_mem_ape1_base = 0; + qpd->sh_mem_bases = compute_sh_mem_bases_64bit(qpd_to_pdd(qpd)); pr_debug("sh_mem_bases 0x%X\n", qpd->sh_mem_bases); + return true; +} +static int update_qpd_v10(struct device_queue_manager *dqm, + struct qcm_process_device *qpd) +{ return 0; } diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v11.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v11.c index 2e129da7acb43..f436878d0d621 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v11.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v11.c @@ -30,10 +30,17 @@ static int update_qpd_v11(struct device_queue_manager *dqm, struct qcm_process_device *qpd); static void init_sdma_vm_v11(struct device_queue_manager *dqm, struct queue *q, struct qcm_process_device *qpd); +static bool set_cache_memory_policy_v11(struct device_queue_manager *dqm, + struct qcm_process_device *qpd, + enum cache_policy default_policy, + enum cache_policy alternate_policy, + void __user *alternate_aperture_base, + uint64_t alternate_aperture_size); void device_queue_manager_init_v11( struct device_queue_manager_asic_ops *asic_ops) { + asic_ops->set_cache_memory_policy = set_cache_memory_policy_v11; asic_ops->update_qpd = update_qpd_v11; asic_ops->init_sdma_vm = init_sdma_vm_v11; asic_ops->mqd_manager_init = mqd_manager_init_v11; @@ -48,28 +55,28 @@ static uint32_t compute_sh_mem_bases_64bit(struct kfd_process_device *pdd) private_base; } -static int update_qpd_v11(struct device_queue_manager *dqm, - struct qcm_process_device *qpd) +static bool set_cache_memory_policy_v11(struct device_queue_manager *dqm, + struct qcm_process_device *qpd, + enum cache_policy default_policy, + enum cache_policy alternate_policy, + void __user *alternate_aperture_base, + uint64_t alternate_aperture_size) { - struct kfd_process_device *pdd; - - pdd = qpd_to_pdd(qpd); - - /* check if sh_mem_config register already configured */ - if (qpd->sh_mem_config == 0) { - qpd->sh_mem_config = - (SH_MEM_ALIGNMENT_MODE_UNALIGNED << - SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) | - (3 << SH_MEM_CONFIG__INITIAL_INST_PREFETCH__SHIFT); - - qpd->sh_mem_ape1_limit = 0; - qpd->sh_mem_ape1_base = 0; - } + qpd->sh_mem_config = (SH_MEM_ALIGNMENT_MODE_UNALIGNED << + SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) | + (3 << SH_MEM_CONFIG__INITIAL_INST_PREFETCH__SHIFT); - qpd->sh_mem_bases = compute_sh_mem_bases_64bit(pdd); + qpd->sh_mem_ape1_limit = 0; + qpd->sh_mem_ape1_base = 0; + qpd->sh_mem_bases = compute_sh_mem_bases_64bit(qpd_to_pdd(qpd)); pr_debug("sh_mem_bases 0x%X\n", qpd->sh_mem_bases); + return true; +} +static int update_qpd_v11(struct device_queue_manager *dqm, + struct qcm_process_device *qpd) +{ return 0; } diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v12.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v12.c index 4f3295b29dfb1..62ca1c8fcbaf9 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v12.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v12.c @@ -30,10 +30,17 @@ static int update_qpd_v12(struct device_queue_manager *dqm, struct qcm_process_device *qpd); static void init_sdma_vm_v12(struct device_queue_manager *dqm, struct queue *q, struct qcm_process_device *qpd); +static bool set_cache_memory_policy_v12(struct device_queue_manager *dqm, + struct qcm_process_device *qpd, + enum cache_policy default_policy, + enum cache_policy alternate_policy, + void __user *alternate_aperture_base, + uint64_t alternate_aperture_size); void device_queue_manager_init_v12( struct device_queue_manager_asic_ops *asic_ops) { + asic_ops->set_cache_memory_policy = set_cache_memory_policy_v12; asic_ops->update_qpd = update_qpd_v12; asic_ops->init_sdma_vm = init_sdma_vm_v12; asic_ops->mqd_manager_init = mqd_manager_init_v12; @@ -48,28 +55,28 @@ static uint32_t compute_sh_mem_bases_64bit(struct kfd_process_device *pdd) private_base; } -static int update_qpd_v12(struct device_queue_manager *dqm, - struct qcm_process_device *qpd) +static bool set_cache_memory_policy_v12(struct device_queue_manager *dqm, + struct qcm_process_device *qpd, + enum cache_policy default_policy, + enum cache_policy alternate_policy, + void __user *alternate_aperture_base, + uint64_t alternate_aperture_size) { - struct kfd_process_device *pdd; - - pdd = qpd_to_pdd(qpd); - - /* check if sh_mem_config register already configured */ - if (qpd->sh_mem_config == 0) { - qpd->sh_mem_config = - (SH_MEM_ALIGNMENT_MODE_UNALIGNED << - SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) | - (3 << SH_MEM_CONFIG__INITIAL_INST_PREFETCH__SHIFT); - - qpd->sh_mem_ape1_limit = 0; - qpd->sh_mem_ape1_base = 0; - } + qpd->sh_mem_config = (SH_MEM_ALIGNMENT_MODE_UNALIGNED << + SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) | + (3 << SH_MEM_CONFIG__INITIAL_INST_PREFETCH__SHIFT); - qpd->sh_mem_bases = compute_sh_mem_bases_64bit(pdd); + qpd->sh_mem_ape1_limit = 0; + qpd->sh_mem_ape1_base = 0; + qpd->sh_mem_bases = compute_sh_mem_bases_64bit(qpd_to_pdd(qpd)); pr_debug("sh_mem_bases 0x%X\n", qpd->sh_mem_bases); + return true; +} +static int update_qpd_v12(struct device_queue_manager *dqm, + struct qcm_process_device *qpd) +{ return 0; } diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c index 210bcc048f4c5..3264509408bc8 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c @@ -30,10 +30,17 @@ static int update_qpd_v9(struct device_queue_manager *dqm, struct qcm_process_device *qpd); static void init_sdma_vm_v9(struct device_queue_manager *dqm, struct queue *q, struct qcm_process_device *qpd); +static bool set_cache_memory_policy_v9(struct device_queue_manager *dqm, + struct qcm_process_device *qpd, + enum cache_policy default_policy, + enum cache_policy alternate_policy, + void __user *alternate_aperture_base, + uint64_t alternate_aperture_size); void device_queue_manager_init_v9( struct device_queue_manager_asic_ops *asic_ops) { + asic_ops->set_cache_memory_policy = set_cache_memory_policy_v9; asic_ops->update_qpd = update_qpd_v9; asic_ops->init_sdma_vm = init_sdma_vm_v9; asic_ops->mqd_manager_init = mqd_manager_init_v9; @@ -48,10 +55,37 @@ static uint32_t compute_sh_mem_bases_64bit(struct kfd_process_device *pdd) private_base; } +static bool set_cache_memory_policy_v9(struct device_queue_manager *dqm, + struct qcm_process_device *qpd, + enum cache_policy default_policy, + enum cache_policy alternate_policy, + void __user *alternate_aperture_base, + uint64_t alternate_aperture_size) +{ + qpd->sh_mem_config = SH_MEM_ALIGNMENT_MODE_UNALIGNED << + SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT; + + if (dqm->dev->kfd->noretry) + qpd->sh_mem_config |= 1 << SH_MEM_CONFIG__RETRY_DISABLE__SHIFT; + + if (KFD_GC_VERSION(dqm->dev->kfd) == IP_VERSION(9, 4, 3) || + KFD_GC_VERSION(dqm->dev->kfd) == IP_VERSION(9, 4, 4) || + KFD_GC_VERSION(dqm->dev->kfd) == IP_VERSION(9, 5, 0)) + qpd->sh_mem_config |= (1 << SH_MEM_CONFIG__F8_MODE__SHIFT); + + qpd->sh_mem_ape1_limit = 0; + qpd->sh_mem_ape1_base = 0; + qpd->sh_mem_bases = compute_sh_mem_bases_64bit(qpd_to_pdd(qpd)); + + pr_debug("sh_mem_bases 0x%X sh_mem_config 0x%X\n", qpd->sh_mem_bases, + qpd->sh_mem_config); + return true; +} + static int update_qpd_v9(struct device_queue_manager *dqm, struct qcm_process_device *qpd) { - struct kfd_process_device *pdd; + struct kfd_process_device *pdd = qpd_to_pdd(qpd); pdd = qpd_to_pdd(qpd); -- GitLab From c700730d816d660aa48c89e926f9b8678f25b472 Mon Sep 17 00:00:00 2001 From: Harish Kasiviswanathan Date: Tue, 14 Jan 2025 14:07:24 -0500 Subject: [PATCH 0210/2211] drm/amdkfd: Set per-process flags only once cik/vi [ Upstream commit 289e68503a4533b014f8447e2af28ad44c92c221 ] Set per-process static sh_mem config only once during process initialization. Move all static changes from update_qpd() which is called each time a queue is created to set_cache_memory_policy() which is called once during process initialization. set_cache_memory_policy() is currently defined only for cik and vi family. So this commit only focuses on these two. A separate commit will address other asics. Signed-off-by: Harish Kasiviswanathan Reviewed-by: Amber Lin Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../drm/amd/amdkfd/kfd_device_queue_manager.c | 39 +--------- .../amd/amdkfd/kfd_device_queue_manager_cik.c | 69 ++++++++++++------ .../amd/amdkfd/kfd_device_queue_manager_vi.c | 71 ++++++++++++------- 3 files changed, 94 insertions(+), 85 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c index 951b87e7e3f68..6a58dd8d2130c 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c @@ -2453,14 +2453,6 @@ failed_try_destroy_debugged_queue: return retval; } -/* - * Low bits must be 0000/FFFF as required by HW, high bits must be 0 to - * stay in user mode. - */ -#define APE1_FIXED_BITS_MASK 0xFFFF80000000FFFFULL -/* APE1 limit is inclusive and 64K aligned. */ -#define APE1_LIMIT_ALIGNMENT 0xFFFF - static bool set_cache_memory_policy(struct device_queue_manager *dqm, struct qcm_process_device *qpd, enum cache_policy default_policy, @@ -2475,34 +2467,6 @@ static bool set_cache_memory_policy(struct device_queue_manager *dqm, dqm_lock(dqm); - if (alternate_aperture_size == 0) { - /* base > limit disables APE1 */ - qpd->sh_mem_ape1_base = 1; - qpd->sh_mem_ape1_limit = 0; - } else { - /* - * In FSA64, APE1_Base[63:0] = { 16{SH_MEM_APE1_BASE[31]}, - * SH_MEM_APE1_BASE[31:0], 0x0000 } - * APE1_Limit[63:0] = { 16{SH_MEM_APE1_LIMIT[31]}, - * SH_MEM_APE1_LIMIT[31:0], 0xFFFF } - * Verify that the base and size parameters can be - * represented in this format and convert them. - * Additionally restrict APE1 to user-mode addresses. - */ - - uint64_t base = (uintptr_t)alternate_aperture_base; - uint64_t limit = base + alternate_aperture_size - 1; - - if (limit <= base || (base & APE1_FIXED_BITS_MASK) != 0 || - (limit & APE1_FIXED_BITS_MASK) != APE1_LIMIT_ALIGNMENT) { - retval = false; - goto out; - } - - qpd->sh_mem_ape1_base = base >> 16; - qpd->sh_mem_ape1_limit = limit >> 16; - } - retval = dqm->asic_ops.set_cache_memory_policy( dqm, qpd, @@ -2511,6 +2475,9 @@ static bool set_cache_memory_policy(struct device_queue_manager *dqm, alternate_aperture_base, alternate_aperture_size); + if (retval) + goto out; + if ((dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) && (qpd->vmid != 0)) program_sh_mem_settings(dqm, qpd); diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_cik.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_cik.c index d4d95c7f2e5d4..32bedef912b3b 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_cik.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_cik.c @@ -27,6 +27,14 @@ #include "oss/oss_2_4_sh_mask.h" #include "gca/gfx_7_2_sh_mask.h" +/* + * Low bits must be 0000/FFFF as required by HW, high bits must be 0 to + * stay in user mode. + */ +#define APE1_FIXED_BITS_MASK 0xFFFF80000000FFFFULL +/* APE1 limit is inclusive and 64K aligned. */ +#define APE1_LIMIT_ALIGNMENT 0xFFFF + static bool set_cache_memory_policy_cik(struct device_queue_manager *dqm, struct qcm_process_device *qpd, enum cache_policy default_policy, @@ -84,6 +92,36 @@ static bool set_cache_memory_policy_cik(struct device_queue_manager *dqm, { uint32_t default_mtype; uint32_t ape1_mtype; + unsigned int temp; + bool retval = true; + + if (alternate_aperture_size == 0) { + /* base > limit disables APE1 */ + qpd->sh_mem_ape1_base = 1; + qpd->sh_mem_ape1_limit = 0; + } else { + /* + * In FSA64, APE1_Base[63:0] = { 16{SH_MEM_APE1_BASE[31]}, + * SH_MEM_APE1_BASE[31:0], 0x0000 } + * APE1_Limit[63:0] = { 16{SH_MEM_APE1_LIMIT[31]}, + * SH_MEM_APE1_LIMIT[31:0], 0xFFFF } + * Verify that the base and size parameters can be + * represented in this format and convert them. + * Additionally restrict APE1 to user-mode addresses. + */ + + uint64_t base = (uintptr_t)alternate_aperture_base; + uint64_t limit = base + alternate_aperture_size - 1; + + if (limit <= base || (base & APE1_FIXED_BITS_MASK) != 0 || + (limit & APE1_FIXED_BITS_MASK) != APE1_LIMIT_ALIGNMENT) { + retval = false; + goto out; + } + + qpd->sh_mem_ape1_base = base >> 16; + qpd->sh_mem_ape1_limit = limit >> 16; + } default_mtype = (default_policy == cache_policy_coherent) ? MTYPE_NONCACHED : @@ -97,37 +135,22 @@ static bool set_cache_memory_policy_cik(struct device_queue_manager *dqm, | ALIGNMENT_MODE(SH_MEM_ALIGNMENT_MODE_UNALIGNED) | DEFAULT_MTYPE(default_mtype) | APE1_MTYPE(ape1_mtype); - - return true; -} - -static int update_qpd_cik(struct device_queue_manager *dqm, - struct qcm_process_device *qpd) -{ - struct kfd_process_device *pdd; - unsigned int temp; - - pdd = qpd_to_pdd(qpd); - - /* check if sh_mem_config register already configured */ - if (qpd->sh_mem_config == 0) { - qpd->sh_mem_config = - ALIGNMENT_MODE(SH_MEM_ALIGNMENT_MODE_UNALIGNED) | - DEFAULT_MTYPE(MTYPE_NONCACHED) | - APE1_MTYPE(MTYPE_NONCACHED); - qpd->sh_mem_ape1_limit = 0; - qpd->sh_mem_ape1_base = 0; - } - /* On dGPU we're always in GPUVM64 addressing mode with 64-bit * aperture addresses. */ - temp = get_sh_mem_bases_nybble_64(pdd); + temp = get_sh_mem_bases_nybble_64(qpd_to_pdd(qpd)); qpd->sh_mem_bases = compute_sh_mem_bases_64bit(temp); pr_debug("is32bit process: %d sh_mem_bases nybble: 0x%X and register 0x%X\n", qpd->pqm->process->is_32bit_user_mode, temp, qpd->sh_mem_bases); +out: + return retval; +} + +static int update_qpd_cik(struct device_queue_manager *dqm, + struct qcm_process_device *qpd) +{ return 0; } diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_vi.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_vi.c index b291ee0fab943..320518f418903 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_vi.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_vi.c @@ -27,6 +27,14 @@ #include "gca/gfx_8_0_sh_mask.h" #include "oss/oss_3_0_sh_mask.h" +/* + * Low bits must be 0000/FFFF as required by HW, high bits must be 0 to + * stay in user mode. + */ +#define APE1_FIXED_BITS_MASK 0xFFFF80000000FFFFULL +/* APE1 limit is inclusive and 64K aligned. */ +#define APE1_LIMIT_ALIGNMENT 0xFFFF + static bool set_cache_memory_policy_vi(struct device_queue_manager *dqm, struct qcm_process_device *qpd, enum cache_policy default_policy, @@ -85,6 +93,36 @@ static bool set_cache_memory_policy_vi(struct device_queue_manager *dqm, { uint32_t default_mtype; uint32_t ape1_mtype; + unsigned int temp; + bool retval = true; + + if (alternate_aperture_size == 0) { + /* base > limit disables APE1 */ + qpd->sh_mem_ape1_base = 1; + qpd->sh_mem_ape1_limit = 0; + } else { + /* + * In FSA64, APE1_Base[63:0] = { 16{SH_MEM_APE1_BASE[31]}, + * SH_MEM_APE1_BASE[31:0], 0x0000 } + * APE1_Limit[63:0] = { 16{SH_MEM_APE1_LIMIT[31]}, + * SH_MEM_APE1_LIMIT[31:0], 0xFFFF } + * Verify that the base and size parameters can be + * represented in this format and convert them. + * Additionally restrict APE1 to user-mode addresses. + */ + + uint64_t base = (uintptr_t)alternate_aperture_base; + uint64_t limit = base + alternate_aperture_size - 1; + + if (limit <= base || (base & APE1_FIXED_BITS_MASK) != 0 || + (limit & APE1_FIXED_BITS_MASK) != APE1_LIMIT_ALIGNMENT) { + retval = false; + goto out; + } + + qpd->sh_mem_ape1_base = base >> 16; + qpd->sh_mem_ape1_limit = limit >> 16; + } default_mtype = (default_policy == cache_policy_coherent) ? MTYPE_UC : @@ -100,40 +138,21 @@ static bool set_cache_memory_policy_vi(struct device_queue_manager *dqm, default_mtype << SH_MEM_CONFIG__DEFAULT_MTYPE__SHIFT | ape1_mtype << SH_MEM_CONFIG__APE1_MTYPE__SHIFT; - return true; -} - -static int update_qpd_vi(struct device_queue_manager *dqm, - struct qcm_process_device *qpd) -{ - struct kfd_process_device *pdd; - unsigned int temp; - - pdd = qpd_to_pdd(qpd); - - /* check if sh_mem_config register already configured */ - if (qpd->sh_mem_config == 0) { - qpd->sh_mem_config = - SH_MEM_ALIGNMENT_MODE_UNALIGNED << - SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT | - MTYPE_UC << - SH_MEM_CONFIG__DEFAULT_MTYPE__SHIFT | - MTYPE_UC << - SH_MEM_CONFIG__APE1_MTYPE__SHIFT; - - qpd->sh_mem_ape1_limit = 0; - qpd->sh_mem_ape1_base = 0; - } - /* On dGPU we're always in GPUVM64 addressing mode with 64-bit * aperture addresses. */ - temp = get_sh_mem_bases_nybble_64(pdd); + temp = get_sh_mem_bases_nybble_64(qpd_to_pdd(qpd)); qpd->sh_mem_bases = compute_sh_mem_bases_64bit(temp); pr_debug("sh_mem_bases nybble: 0x%X and register 0x%X\n", temp, qpd->sh_mem_bases); +out: + return retval; +} +static int update_qpd_vi(struct device_queue_manager *dqm, + struct qcm_process_device *qpd) +{ return 0; } -- GitLab From ecaa856227ae44f6b9323adb2e84bb9445632bdb Mon Sep 17 00:00:00 2001 From: Emily Deng Date: Mon, 3 Mar 2025 15:10:22 +0800 Subject: [PATCH 0211/2211] drm/amdgpu: Fix missing drain retry fault the last entry [ Upstream commit fe2fa3be3d59ba67d6de54a0064441ec233cb50c ] While the entry get in svm_range_unmap_from_cpu is the last entry, and the entry is page fault, it also need to be dropped. So for equal case, it also need to be dropped. v2: Only modify the svm_range_restore_pages. Signed-off-by: Emily Deng Reviewed-by: Xiaogang Chen Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h | 3 +++ drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h index 508f02eb0cf8f..7de10208e8dde 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h @@ -78,6 +78,9 @@ struct amdgpu_ih_ring { #define amdgpu_ih_ts_after(t1, t2) \ (((int64_t)((t2) << 16) - (int64_t)((t1) << 16)) > 0LL) +#define amdgpu_ih_ts_after_or_equal(t1, t2) \ + (((int64_t)((t2) << 16) - (int64_t)((t1) << 16)) >= 0LL) + /* provided by the ih block */ struct amdgpu_ih_funcs { /* ring read/write ptr handling, called from interrupt context */ diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c index b50283864dcd2..f00d41be7fca2 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c @@ -3014,7 +3014,7 @@ retry_write_locked: /* check if this page fault time stamp is before svms->checkpoint_ts */ if (svms->checkpoint_ts[gpuidx] != 0) { - if (amdgpu_ih_ts_after(ts, svms->checkpoint_ts[gpuidx])) { + if (amdgpu_ih_ts_after_or_equal(ts, svms->checkpoint_ts[gpuidx])) { pr_debug("draining retry fault, drop fault 0x%llx\n", addr); r = -EAGAIN; goto out_unlock_svms; -- GitLab From 2f0044e20fab1de422f3abb39788aebeb932a5a6 Mon Sep 17 00:00:00 2001 From: Diogo Ivo Date: Mon, 24 Feb 2025 12:17:36 +0000 Subject: [PATCH 0212/2211] arm64: tegra: p2597: Fix gpio for vdd-1v8-dis regulator [ Upstream commit f34621f31e3be81456c903287f7e4c0609829e29 ] According to the board schematics the enable pin of this regulator is connected to gpio line #9 of the first instance of the TCA9539 GPIO expander, so adjust it. Signed-off-by: Diogo Ivo Link: https://lore.kernel.org/r/20250224-diogo-gpio_exp-v1-1-80fb84ac48c6@tecnico.ulisboa.pt Signed-off-by: Thierry Reding Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi b/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi index 63b94a04308e8..38d49d612c0c1 100644 --- a/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi +++ b/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi @@ -1686,7 +1686,7 @@ regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-always-on; - gpio = <&exp1 14 GPIO_ACTIVE_HIGH>; + gpio = <&exp1 9 GPIO_ACTIVE_HIGH>; enable-active-high; vin-supply = <&vdd_1v8>; }; -- GitLab From 09193145d11801053cb37910fe7d1ccec3f2f0e5 Mon Sep 17 00:00:00 2001 From: Jon Hunter Date: Thu, 16 Jan 2025 15:19:03 +0000 Subject: [PATCH 0213/2211] arm64: tegra: Resize aperture for the IGX PCIe C5 slot [ Upstream commit 6d4bfe6d86af1ef52bdb4592c9afb2037f24f2c4 ] Some discrete graphics cards such as the NVIDIA RTX A6000 support resizable BARs. When connecting an A6000 card to the NVIDIA IGX Orin platform, resizing the BAR1 aperture to 8GB fails because the current device-tree configuration for the PCIe C5 slot cannot support this. Fix this by updating the device-tree 'reg' and 'ranges' properties for the PCIe C5 slot to support this. Signed-off-by: Jon Hunter Link: https://lore.kernel.org/r/20250116151903.476047-1-jonathanh@nvidia.com Signed-off-by: Thierry Reding Signed-off-by: Sasha Levin --- .../boot/dts/nvidia/tegra234-p3740-0002+p3701-0008.dts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/arch/arm64/boot/dts/nvidia/tegra234-p3740-0002+p3701-0008.dts b/arch/arm64/boot/dts/nvidia/tegra234-p3740-0002+p3701-0008.dts index 36e8880537460..9ce55b4d2de89 100644 --- a/arch/arm64/boot/dts/nvidia/tegra234-p3740-0002+p3701-0008.dts +++ b/arch/arm64/boot/dts/nvidia/tegra234-p3740-0002+p3701-0008.dts @@ -302,6 +302,16 @@ }; pcie@141a0000 { + reg = <0x00 0x141a0000 0x0 0x00020000 /* appl registers (128K) */ + 0x00 0x3a000000 0x0 0x00040000 /* configuration space (256K) */ + 0x00 0x3a040000 0x0 0x00040000 /* iATU_DMA reg space (256K) */ + 0x00 0x3a080000 0x0 0x00040000 /* DBI reg space (256K) */ + 0x2e 0x20000000 0x0 0x10000000>; /* ECAM (256MB) */ + + ranges = <0x81000000 0x00 0x3a100000 0x00 0x3a100000 0x0 0x00100000 /* downstream I/O (1MB) */ + 0x82000000 0x00 0x40000000 0x2e 0x30000000 0x0 0x08000000 /* non-prefetchable memory (128MB) */ + 0xc3000000 0x28 0x00000000 0x28 0x00000000 0x6 0x20000000>; /* prefetchable memory (25088MB) */ + status = "okay"; vddio-pex-ctl-supply = <&vdd_1v8_ls>; phys = <&p2u_nvhs_0>, <&p2u_nvhs_1>, <&p2u_nvhs_2>, -- GitLab From 515a21a5e19abd7363774df1f98ad74431cac6f1 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Mon, 13 Jan 2025 18:19:09 +0100 Subject: [PATCH 0214/2211] powerpc/prom_init: Fixup missing #size-cells on PowerBook6,7 [ Upstream commit 7e67ef889c9ab7246547db73d524459f47403a77 ] Similar to the PowerMac3,1, the PowerBook6,7 is missing the #size-cells property on the i2s node. Depends-on: commit 045b14ca5c36 ("of: WARN on deprecated #address-cells/#size-cells handling") Signed-off-by: Andreas Schwab Acked-by: Rob Herring (Arm) [maddy: added "commit" work in depends-on to avoid checkpatch error] Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/875xmizl6a.fsf@igel.home Signed-off-by: Sasha Levin --- arch/powerpc/kernel/prom_init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 935568d68196d..b1dc4cb9f78e6 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c @@ -2982,11 +2982,11 @@ static void __init fixup_device_tree_pmac(void) char type[8]; phandle node; - // Some pmacs are missing #size-cells on escc nodes + // Some pmacs are missing #size-cells on escc or i2s nodes for (node = 0; prom_next_node(&node); ) { type[0] = '\0'; prom_getprop(node, "device_type", type, sizeof(type)); - if (prom_strcmp(type, "escc")) + if (prom_strcmp(type, "escc") && prom_strcmp(type, "i2s")) continue; if (prom_getproplen(node, "#size-cells") != PROM_ERROR) -- GitLab From a06861298554bbd46611fcda86f86529867afd0d Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 7 Mar 2025 09:42:42 +0100 Subject: [PATCH 0215/2211] ALSA: seq: Improve data consistency at polling [ Upstream commit e3cd33ab17c33bd8f1a9df66ec83a15dd8f7afbb ] snd_seq_poll() calls snd_seq_write_pool_allocated() that reads out a field in client->pool object, while it can be updated concurrently via ioctls, as reported by syzbot. The data race itself is harmless, as it's merely a poll() call, and the state is volatile. OTOH, the read out of poll object info from the caller side is fragile, and we can leave it better in snd_seq_pool_poll_wait() alone. A similar pattern is seen in snd_seq_kernel_client_write_poll(), too, which is called from the OSS sequencer. This patch drops the pool checks from the caller side and add the pool->lock in snd_seq_pool_poll_wait() for better data consistency. Reported-by: syzbot+2d373c9936c00d7e120c@syzkaller.appspotmail.com Closes: https://lore.kernel.org/67c88903.050a0220.15b4b9.0028.GAE@google.com Link: https://patch.msgid.link/20250307084246.29271-1-tiwai@suse.de Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/core/seq/seq_clientmgr.c | 5 +---- sound/core/seq/seq_memory.c | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c index b74de9c0969fc..9e59a97f47472 100644 --- a/sound/core/seq/seq_clientmgr.c +++ b/sound/core/seq/seq_clientmgr.c @@ -1164,8 +1164,7 @@ static __poll_t snd_seq_poll(struct file *file, poll_table * wait) if (snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_OUTPUT) { /* check if data is available in the pool */ - if (!snd_seq_write_pool_allocated(client) || - snd_seq_pool_poll_wait(client->pool, file, wait)) + if (snd_seq_pool_poll_wait(client->pool, file, wait)) mask |= EPOLLOUT | EPOLLWRNORM; } @@ -2583,8 +2582,6 @@ int snd_seq_kernel_client_write_poll(int clientid, struct file *file, poll_table if (client == NULL) return -ENXIO; - if (! snd_seq_write_pool_allocated(client)) - return 1; if (snd_seq_pool_poll_wait(client->pool, file, wait)) return 1; return 0; diff --git a/sound/core/seq/seq_memory.c b/sound/core/seq/seq_memory.c index 20155e3e87c6a..ccde0ca3d2082 100644 --- a/sound/core/seq/seq_memory.c +++ b/sound/core/seq/seq_memory.c @@ -427,6 +427,7 @@ int snd_seq_pool_poll_wait(struct snd_seq_pool *pool, struct file *file, poll_table *wait) { poll_wait(file, &pool->output_sleep, wait); + guard(spinlock_irq)(&pool->lock); return snd_seq_output_ok(pool); } -- GitLab From 73d01bcbf2aad43c1855e7b45fd2f64bd1583ce4 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 5 Mar 2025 13:05:50 +0000 Subject: [PATCH 0216/2211] tcp: bring back NUMA dispersion in inet_ehash_locks_alloc() [ Upstream commit f8ece40786c9342249aa0a1b55e148ee23b2a746 ] We have platforms with 6 NUMA nodes and 480 cpus. inet_ehash_locks_alloc() currently allocates a single 64KB page to hold all ehash spinlocks. This adds more pressure on a single node. Change inet_ehash_locks_alloc() to use vmalloc() to spread the spinlocks on all online nodes, driven by NUMA policies. At boot time, NUMA policy is interleave=all, meaning that tcp_hashinfo.ehash_locks gets hash dispersion on all nodes. Tested: lack5:~# grep inet_ehash_locks_alloc /proc/vmallocinfo 0x00000000d9aec4d1-0x00000000a828b652 69632 inet_ehash_locks_alloc+0x90/0x100 pages=16 vmalloc N0=2 N1=3 N2=3 N3=3 N4=3 N5=2 lack5:~# echo 8192 >/proc/sys/net/ipv4/tcp_child_ehash_entries lack5:~# numactl --interleave=all unshare -n bash -c "grep inet_ehash_locks_alloc /proc/vmallocinfo" 0x000000004e99d30c-0x00000000763f3279 36864 inet_ehash_locks_alloc+0x90/0x100 pages=8 vmalloc N0=1 N1=2 N2=2 N3=1 N4=1 N5=1 0x00000000d9aec4d1-0x00000000a828b652 69632 inet_ehash_locks_alloc+0x90/0x100 pages=16 vmalloc N0=2 N1=3 N2=3 N3=3 N4=3 N5=2 lack5:~# numactl --interleave=0,5 unshare -n bash -c "grep inet_ehash_locks_alloc /proc/vmallocinfo" 0x00000000fd73a33e-0x0000000004b9a177 36864 inet_ehash_locks_alloc+0x90/0x100 pages=8 vmalloc N0=4 N5=4 0x00000000d9aec4d1-0x00000000a828b652 69632 inet_ehash_locks_alloc+0x90/0x100 pages=16 vmalloc N0=2 N1=3 N2=3 N3=3 N4=3 N5=2 lack5:~# echo 1024 >/proc/sys/net/ipv4/tcp_child_ehash_entries lack5:~# numactl --interleave=all unshare -n bash -c "grep inet_ehash_locks_alloc /proc/vmallocinfo" 0x00000000db07d7a2-0x00000000ad697d29 8192 inet_ehash_locks_alloc+0x90/0x100 pages=1 vmalloc N2=1 0x00000000d9aec4d1-0x00000000a828b652 69632 inet_ehash_locks_alloc+0x90/0x100 pages=16 vmalloc N0=2 N1=3 N2=3 N3=3 N4=3 N5=2 Signed-off-by: Eric Dumazet Tested-by: Jason Xing Reviewed-by: Kuniyuki Iwashima Link: https://patch.msgid.link/20250305130550.1865988-1-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/ipv4/inet_hashtables.c | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c index 9bfcfd016e182..2b4a588247639 100644 --- a/net/ipv4/inet_hashtables.c +++ b/net/ipv4/inet_hashtables.c @@ -1230,22 +1230,37 @@ int inet_ehash_locks_alloc(struct inet_hashinfo *hashinfo) { unsigned int locksz = sizeof(spinlock_t); unsigned int i, nblocks = 1; + spinlock_t *ptr = NULL; - if (locksz != 0) { - /* allocate 2 cache lines or at least one spinlock per cpu */ - nblocks = max(2U * L1_CACHE_BYTES / locksz, 1U); - nblocks = roundup_pow_of_two(nblocks * num_possible_cpus()); + if (locksz == 0) + goto set_mask; - /* no more locks than number of hash buckets */ - nblocks = min(nblocks, hashinfo->ehash_mask + 1); + /* Allocate 2 cache lines or at least one spinlock per cpu. */ + nblocks = max(2U * L1_CACHE_BYTES / locksz, 1U) * num_possible_cpus(); - hashinfo->ehash_locks = kvmalloc_array(nblocks, locksz, GFP_KERNEL); - if (!hashinfo->ehash_locks) - return -ENOMEM; + /* At least one page per NUMA node. */ + nblocks = max(nblocks, num_online_nodes() * PAGE_SIZE / locksz); + + nblocks = roundup_pow_of_two(nblocks); + + /* No more locks than number of hash buckets. */ + nblocks = min(nblocks, hashinfo->ehash_mask + 1); - for (i = 0; i < nblocks; i++) - spin_lock_init(&hashinfo->ehash_locks[i]); + if (num_online_nodes() > 1) { + /* Use vmalloc() to allow NUMA policy to spread pages + * on all available nodes if desired. + */ + ptr = vmalloc_array(nblocks, locksz); + } + if (!ptr) { + ptr = kvmalloc_array(nblocks, locksz, GFP_KERNEL); + if (!ptr) + return -ENOMEM; } + for (i = 0; i < nblocks; i++) + spin_lock_init(&ptr[i]); + hashinfo->ehash_locks = ptr; +set_mask: hashinfo->ehash_locks_mask = nblocks - 1; return 0; } -- GitLab From 3afa1610e5a4e50f9d87cb3460a4d02c7c14fad0 Mon Sep 17 00:00:00 2001 From: Alexandre Belloni Date: Mon, 3 Mar 2025 23:37:44 +0100 Subject: [PATCH 0217/2211] rtc: ds1307: stop disabling alarms on probe [ Upstream commit dcec12617ee61beed928e889607bf37e145bf86b ] It is a bad practice to disable alarms on probe or remove as this will prevent alarms across reboots. Link: https://lore.kernel.org/r/20250303223744.1135672-1-alexandre.belloni@bootlin.com Signed-off-by: Alexandre Belloni Signed-off-by: Sasha Levin --- drivers/rtc/rtc-ds1307.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 872e0b679be48..5efbe69bf5ca8 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -1807,10 +1807,8 @@ static int ds1307_probe(struct i2c_client *client) * For some variants, be sure alarms can trigger when we're * running on Vbackup (BBSQI/BBSQW) */ - if (want_irq || ds1307_can_wakeup_device) { + if (want_irq || ds1307_can_wakeup_device) regs[0] |= DS1337_BIT_INTCN | chip->bbsqi_bit; - regs[0] &= ~(DS1337_BIT_A2IE | DS1337_BIT_A1IE); - } regmap_write(ds1307->regmap, DS1337_REG_CONTROL, regs[0]); -- GitLab From a3642d2d73a97b39c50fcb6abb71c2488cda21ae Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Wed, 5 Mar 2025 12:55:34 +0200 Subject: [PATCH 0218/2211] ieee802154: ca8210: Use proper setters and getters for bitwise types [ Upstream commit 169b2262205836a5d1213ff44dca2962276bece1 ] Sparse complains that the driver doesn't respect the bitwise types: drivers/net/ieee802154/ca8210.c:1796:27: warning: incorrect type in assignment (different base types) drivers/net/ieee802154/ca8210.c:1796:27: expected restricted __le16 [addressable] [assigned] [usertype] pan_id drivers/net/ieee802154/ca8210.c:1796:27: got unsigned short [usertype] drivers/net/ieee802154/ca8210.c:1801:25: warning: incorrect type in assignment (different base types) drivers/net/ieee802154/ca8210.c:1801:25: expected restricted __le16 [addressable] [assigned] [usertype] pan_id drivers/net/ieee802154/ca8210.c:1801:25: got unsigned short [usertype] drivers/net/ieee802154/ca8210.c:1928:28: warning: incorrect type in argument 3 (different base types) drivers/net/ieee802154/ca8210.c:1928:28: expected unsigned short [usertype] dst_pan_id drivers/net/ieee802154/ca8210.c:1928:28: got restricted __le16 [addressable] [usertype] pan_id Use proper setters and getters for bitwise types. Note, in accordance with [1] the protocol is little endian. Link: https://www.cascoda.com/wp-content/uploads/2018/11/CA-8210_datasheet_0418.pdf [1] Reviewed-by: Miquel Raynal Reviewed-by: Linus Walleij Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/20250305105656.2133487-2-andriy.shevchenko@linux.intel.com Signed-off-by: Stefan Schmidt Signed-off-by: Sasha Levin --- drivers/net/ieee802154/ca8210.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c index 753215ebc67c7..a036910f60828 100644 --- a/drivers/net/ieee802154/ca8210.c +++ b/drivers/net/ieee802154/ca8210.c @@ -1446,8 +1446,7 @@ static u8 mcps_data_request( command.pdata.data_req.src_addr_mode = src_addr_mode; command.pdata.data_req.dst.mode = dst_address_mode; if (dst_address_mode != MAC_MODE_NO_ADDR) { - command.pdata.data_req.dst.pan_id[0] = LS_BYTE(dst_pan_id); - command.pdata.data_req.dst.pan_id[1] = MS_BYTE(dst_pan_id); + put_unaligned_le16(dst_pan_id, command.pdata.data_req.dst.pan_id); if (dst_address_mode == MAC_MODE_SHORT_ADDR) { command.pdata.data_req.dst.address[0] = LS_BYTE( dst_addr->short_address @@ -1795,12 +1794,12 @@ static int ca8210_skb_rx( } hdr.source.mode = data_ind[0]; dev_dbg(&priv->spi->dev, "srcAddrMode: %#03x\n", hdr.source.mode); - hdr.source.pan_id = *(u16 *)&data_ind[1]; + hdr.source.pan_id = cpu_to_le16(get_unaligned_le16(&data_ind[1])); dev_dbg(&priv->spi->dev, "srcPanId: %#06x\n", hdr.source.pan_id); memcpy(&hdr.source.extended_addr, &data_ind[3], 8); hdr.dest.mode = data_ind[11]; dev_dbg(&priv->spi->dev, "dstAddrMode: %#03x\n", hdr.dest.mode); - hdr.dest.pan_id = *(u16 *)&data_ind[12]; + hdr.dest.pan_id = cpu_to_le16(get_unaligned_le16(&data_ind[12])); dev_dbg(&priv->spi->dev, "dstPanId: %#06x\n", hdr.dest.pan_id); memcpy(&hdr.dest.extended_addr, &data_ind[14], 8); @@ -1927,7 +1926,7 @@ static int ca8210_skb_tx( status = mcps_data_request( header.source.mode, header.dest.mode, - header.dest.pan_id, + le16_to_cpu(header.dest.pan_id), (union macaddr *)&header.dest.extended_addr, skb->len - mac_len, &skb->data[mac_len], -- GitLab From 623669ae7a8204264098c80cdc13086b7371bacf Mon Sep 17 00:00:00 2001 From: Matthew Brost Date: Wed, 5 Mar 2025 17:26:36 -0800 Subject: [PATCH 0219/2211] drm/xe: Nuke VM's mapping upon close MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 074e40d9c2a84939fe28d7121d3469db50f34a3d ] Clear root PT entry and invalidate entire VM's address space when closing the VM. Will prevent the GPU from accessing any of the VM's memory after closing. v2: - s/vma/vm in kernel doc (CI) - Don't nuke migration VM as this occur at driver unload (CI) v3: - Rebase and pull into SVM series (Thomas) - Wait for pending binds (Thomas) v5: - Remove xe_gt_tlb_invalidation_fence_fini in error case (Matt Auld) - Drop local migration bool (Thomas) v7: - Add drm_dev_enter/exit protecting invalidation (CI, Matt Auld) Signed-off-by: Matthew Brost Reviewed-by: Thomas Hellström Link: https://patchwork.freedesktop.org/patch/msgid/20250306012657.3505757-12-matthew.brost@intel.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c | 22 ++++++++++++++ drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h | 2 ++ drivers/gpu/drm/xe/xe_pt.c | 14 +++++++++ drivers/gpu/drm/xe/xe_pt.h | 3 ++ drivers/gpu/drm/xe/xe_vm.c | 32 +++++++++++++++++++++ 5 files changed, 73 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c index 98a450271f5ce..3155825fa46ad 100644 --- a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c +++ b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c @@ -406,6 +406,28 @@ int xe_gt_tlb_invalidation_range(struct xe_gt *gt, return send_tlb_invalidation(>->uc.guc, fence, action, len); } +/** + * xe_gt_tlb_invalidation_vm - Issue a TLB invalidation on this GT for a VM + * @gt: graphics tile + * @vm: VM to invalidate + * + * Invalidate entire VM's address space + */ +void xe_gt_tlb_invalidation_vm(struct xe_gt *gt, struct xe_vm *vm) +{ + struct xe_gt_tlb_invalidation_fence fence; + u64 range = 1ull << vm->xe->info.va_bits; + int ret; + + xe_gt_tlb_invalidation_fence_init(gt, &fence, true); + + ret = xe_gt_tlb_invalidation_range(gt, &fence, 0, range, vm->usm.asid); + if (ret < 0) + return; + + xe_gt_tlb_invalidation_fence_wait(&fence); +} + /** * xe_gt_tlb_invalidation_vma - Issue a TLB invalidation on this GT for a VMA * @gt: graphics tile diff --git a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h index 672acfcdf0d70..abe9b03d543e6 100644 --- a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h +++ b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h @@ -12,6 +12,7 @@ struct xe_gt; struct xe_guc; +struct xe_vm; struct xe_vma; int xe_gt_tlb_invalidation_init_early(struct xe_gt *gt); @@ -21,6 +22,7 @@ int xe_gt_tlb_invalidation_ggtt(struct xe_gt *gt); int xe_gt_tlb_invalidation_vma(struct xe_gt *gt, struct xe_gt_tlb_invalidation_fence *fence, struct xe_vma *vma); +void xe_gt_tlb_invalidation_vm(struct xe_gt *gt, struct xe_vm *vm); int xe_gt_tlb_invalidation_range(struct xe_gt *gt, struct xe_gt_tlb_invalidation_fence *fence, u64 start, u64 end, u32 asid); diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c index 230cf47fb9c5e..fb94ff55c7361 100644 --- a/drivers/gpu/drm/xe/xe_pt.c +++ b/drivers/gpu/drm/xe/xe_pt.c @@ -217,6 +217,20 @@ void xe_pt_destroy(struct xe_pt *pt, u32 flags, struct llist_head *deferred) xe_pt_free(pt); } +/** + * xe_pt_clear() - Clear a page-table. + * @xe: xe device. + * @pt: The page-table. + * + * Clears page-table by setting to zero. + */ +void xe_pt_clear(struct xe_device *xe, struct xe_pt *pt) +{ + struct iosys_map *map = &pt->bo->vmap; + + xe_map_memset(xe, map, 0, 0, SZ_4K); +} + /** * DOC: Pagetable building * diff --git a/drivers/gpu/drm/xe/xe_pt.h b/drivers/gpu/drm/xe/xe_pt.h index 9ab386431cadd..8e43912ae8e94 100644 --- a/drivers/gpu/drm/xe/xe_pt.h +++ b/drivers/gpu/drm/xe/xe_pt.h @@ -13,6 +13,7 @@ struct dma_fence; struct xe_bo; struct xe_device; struct xe_exec_queue; +struct xe_svm_range; struct xe_sync_entry; struct xe_tile; struct xe_vm; @@ -35,6 +36,8 @@ void xe_pt_populate_empty(struct xe_tile *tile, struct xe_vm *vm, void xe_pt_destroy(struct xe_pt *pt, u32 flags, struct llist_head *deferred); +void xe_pt_clear(struct xe_device *xe, struct xe_pt *pt); + int xe_pt_update_ops_prepare(struct xe_tile *tile, struct xe_vma_ops *vops); struct dma_fence *xe_pt_update_ops_run(struct xe_tile *tile, struct xe_vma_ops *vops); diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c index 872de052d670f..de257a032225f 100644 --- a/drivers/gpu/drm/xe/xe_vm.c +++ b/drivers/gpu/drm/xe/xe_vm.c @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -1581,9 +1582,40 @@ err_no_resv: static void xe_vm_close(struct xe_vm *vm) { + struct xe_device *xe = vm->xe; + bool bound; + int idx; + + bound = drm_dev_enter(&xe->drm, &idx); + down_write(&vm->lock); + vm->size = 0; + + if (!((vm->flags & XE_VM_FLAG_MIGRATION))) { + struct xe_tile *tile; + struct xe_gt *gt; + u8 id; + + /* Wait for pending binds */ + dma_resv_wait_timeout(xe_vm_resv(vm), + DMA_RESV_USAGE_BOOKKEEP, + false, MAX_SCHEDULE_TIMEOUT); + + if (bound) { + for_each_tile(tile, xe, id) + if (vm->pt_root[id]) + xe_pt_clear(xe, vm->pt_root[id]); + + for_each_gt(gt, xe, id) + xe_gt_tlb_invalidation_vm(gt, vm); + } + } + up_write(&vm->lock); + + if (bound) + drm_dev_exit(idx); } void xe_vm_close_and_put(struct xe_vm *vm) -- GitLab From 4943c0bae1248fa69fba0872ebb6012d805f4c26 Mon Sep 17 00:00:00 2001 From: Matthew Brost Date: Wed, 5 Mar 2025 17:26:26 -0800 Subject: [PATCH 0220/2211] drm/xe: Retry BO allocation [ Upstream commit 1d724a2f1b2c3f0cba4975784a808482e0631adf ] TTM doesn't support fair eviction via WW locking, this mitigated in by using retry loops in exec and preempt rebind worker. Extend this retry loop to BO allocation. Once TTM supports fair eviction this patch can be reverted. v4: - Keep line break (Stuart) Signed-off-by: Matthew Brost Reviewed-by: Gwan-gyeong Mun Reviewed-by: Stuart Summers Link: https://patchwork.freedesktop.org/patch/msgid/20250306012657.3505757-2-matthew.brost@intel.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_bo.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c index 84e327b569252..35a8242a9f541 100644 --- a/drivers/gpu/drm/xe/xe_bo.c +++ b/drivers/gpu/drm/xe/xe_bo.c @@ -1975,6 +1975,7 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, struct xe_file *xef = to_xe_file(file); struct drm_xe_gem_create *args = data; struct xe_vm *vm = NULL; + ktime_t end = 0; struct xe_bo *bo; unsigned int bo_flags; u32 handle; @@ -2047,6 +2048,10 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, vm = xe_vm_lookup(xef, args->vm_id); if (XE_IOCTL_DBG(xe, !vm)) return -ENOENT; + } + +retry: + if (vm) { err = xe_vm_lock(vm, true); if (err) goto out_vm; @@ -2060,6 +2065,8 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, if (IS_ERR(bo)) { err = PTR_ERR(bo); + if (xe_vm_validate_should_retry(NULL, err, &end)) + goto retry; goto out_vm; } -- GitLab From 8fc16414c3ef7b7db4e8873557316dbaeb36f747 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Wed, 5 Mar 2025 22:14:02 +0100 Subject: [PATCH 0221/2211] soc: samsung: include linux/array_size.h where needed [ Upstream commit 4c57930f68d90e0d52c396d058cfa9ed8447a6c4 ] This does not necessarily get included through asm/io.h: drivers/soc/samsung/exynos3250-pmu.c:120:18: error: use of undeclared identifier 'ARRAY_SIZE' 120 | for (i = 0; i < ARRAY_SIZE(exynos3250_list_feed); i++) { | ^ drivers/soc/samsung/exynos5250-pmu.c:162:18: error: use of undeclared identifier 'ARRAY_SIZE' 162 | for (i = 0; i < ARRAY_SIZE(exynos5_list_both_cnt_feed); i++) { | ^ Signed-off-by: Arnd Bergmann Link: https://lore.kernel.org/r/20250305211446.43772-1-arnd@kernel.org Signed-off-by: Krzysztof Kozlowski Signed-off-by: Sasha Levin --- drivers/soc/samsung/exynos-asv.c | 1 + drivers/soc/samsung/exynos-chipid.c | 1 + drivers/soc/samsung/exynos-pmu.c | 1 + drivers/soc/samsung/exynos-usi.c | 1 + drivers/soc/samsung/exynos3250-pmu.c | 1 + drivers/soc/samsung/exynos5250-pmu.c | 1 + drivers/soc/samsung/exynos5420-pmu.c | 1 + 7 files changed, 7 insertions(+) diff --git a/drivers/soc/samsung/exynos-asv.c b/drivers/soc/samsung/exynos-asv.c index 97006cc3b9461..8e681f5195264 100644 --- a/drivers/soc/samsung/exynos-asv.c +++ b/drivers/soc/samsung/exynos-asv.c @@ -9,6 +9,7 @@ * Samsung Exynos SoC Adaptive Supply Voltage support */ +#include #include #include #include diff --git a/drivers/soc/samsung/exynos-chipid.c b/drivers/soc/samsung/exynos-chipid.c index bba8d86ae1bb0..dedfe6d0fb3f3 100644 --- a/drivers/soc/samsung/exynos-chipid.c +++ b/drivers/soc/samsung/exynos-chipid.c @@ -12,6 +12,7 @@ * Samsung Exynos SoC Adaptive Supply Voltage and Chip ID support */ +#include #include #include #include diff --git a/drivers/soc/samsung/exynos-pmu.c b/drivers/soc/samsung/exynos-pmu.c index dd5256e5aae1a..c40313886a012 100644 --- a/drivers/soc/samsung/exynos-pmu.c +++ b/drivers/soc/samsung/exynos-pmu.c @@ -5,6 +5,7 @@ // // Exynos - CPU PMU(Power Management Unit) support +#include #include #include #include diff --git a/drivers/soc/samsung/exynos-usi.c b/drivers/soc/samsung/exynos-usi.c index 114352695ac2b..5a93a68dba87f 100644 --- a/drivers/soc/samsung/exynos-usi.c +++ b/drivers/soc/samsung/exynos-usi.c @@ -6,6 +6,7 @@ * Samsung Exynos USI driver (Universal Serial Interface). */ +#include #include #include #include diff --git a/drivers/soc/samsung/exynos3250-pmu.c b/drivers/soc/samsung/exynos3250-pmu.c index 30f230ed1769c..4bad12a995422 100644 --- a/drivers/soc/samsung/exynos3250-pmu.c +++ b/drivers/soc/samsung/exynos3250-pmu.c @@ -5,6 +5,7 @@ // // Exynos3250 - CPU PMU (Power Management Unit) support +#include #include #include diff --git a/drivers/soc/samsung/exynos5250-pmu.c b/drivers/soc/samsung/exynos5250-pmu.c index 7a2d50be6b4ac..2ae5c3e1b07a3 100644 --- a/drivers/soc/samsung/exynos5250-pmu.c +++ b/drivers/soc/samsung/exynos5250-pmu.c @@ -5,6 +5,7 @@ // // Exynos5250 - CPU PMU (Power Management Unit) support +#include #include #include diff --git a/drivers/soc/samsung/exynos5420-pmu.c b/drivers/soc/samsung/exynos5420-pmu.c index 6fedcd78cb451..58a2209795f78 100644 --- a/drivers/soc/samsung/exynos5420-pmu.c +++ b/drivers/soc/samsung/exynos5420-pmu.c @@ -5,6 +5,7 @@ // // Exynos5420 - CPU PMU (Power Management Unit) support +#include #include #include #include -- GitLab From 25056d1fe57eb6d332991820dbc3d2a65303e7c3 Mon Sep 17 00:00:00 2001 From: Svyatoslav Ryhel Date: Wed, 26 Feb 2025 12:56:11 +0200 Subject: [PATCH 0222/2211] ARM: tegra: Switch DSI-B clock parent to PLLD on Tegra114 [ Upstream commit 2b3db788f2f614b875b257cdb079adadedc060f3 ] PLLD is usually used as parent clock for internal video devices, like DSI for example, while PLLD2 is used as parent for HDMI. Signed-off-by: Svyatoslav Ryhel Link: https://lore.kernel.org/r/20250226105615.61087-3-clamor95@gmail.com Signed-off-by: Thierry Reding Signed-off-by: Sasha Levin --- arch/arm/boot/dts/nvidia/tegra114.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/nvidia/tegra114.dtsi b/arch/arm/boot/dts/nvidia/tegra114.dtsi index 86f14e2fd29f3..6c057b5069514 100644 --- a/arch/arm/boot/dts/nvidia/tegra114.dtsi +++ b/arch/arm/boot/dts/nvidia/tegra114.dtsi @@ -139,7 +139,7 @@ reg = <0x54400000 0x00040000>; clocks = <&tegra_car TEGRA114_CLK_DSIB>, <&tegra_car TEGRA114_CLK_DSIBLP>, - <&tegra_car TEGRA114_CLK_PLL_D2_OUT0>; + <&tegra_car TEGRA114_CLK_PLL_D_OUT0>; clock-names = "dsi", "lp", "parent"; resets = <&tegra_car 82>; reset-names = "dsi"; -- GitLab From 5520fed18df866d7821fbde9549c6cb7beb096ee Mon Sep 17 00:00:00 2001 From: Markus Elfring Date: Fri, 4 Oct 2024 15:50:15 +0200 Subject: [PATCH 0223/2211] media: c8sectpfe: Call of_node_put(i2c_bus) only once in c8sectpfe_probe() [ Upstream commit b773530a34df0687020520015057075f8b7b4ac4 ] An of_node_put(i2c_bus) call was immediately used after a pointer check for an of_find_i2c_adapter_by_node() call in this function implementation. Thus call such a function only once instead directly before the check. This issue was transformed by using the Coccinelle software. Signed-off-by: Markus Elfring Signed-off-by: Hans Verkuil Signed-off-by: Sasha Levin --- drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c index 67d3d6e50d2e2..ed3a107965cc9 100644 --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c +++ b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c @@ -797,13 +797,12 @@ static int c8sectpfe_probe(struct platform_device *pdev) } tsin->i2c_adapter = of_find_i2c_adapter_by_node(i2c_bus); + of_node_put(i2c_bus); if (!tsin->i2c_adapter) { dev_err(&pdev->dev, "No i2c adapter found\n"); - of_node_put(i2c_bus); ret = -ENODEV; goto err_node_put; } - of_node_put(i2c_bus); /* Acquire reset GPIO and activate it */ tsin->rst_gpio = devm_fwnode_gpiod_get(dev, -- GitLab From 1c171908807cb3717c7a38e51363d1fb8e887e13 Mon Sep 17 00:00:00 2001 From: Niklas Neronin Date: Thu, 6 Mar 2025 16:49:48 +0200 Subject: [PATCH 0224/2211] usb: xhci: set page size to the xHCI-supported size [ Upstream commit 68c1f1671650b49bbd26e6a65ddcf33f2565efa3 ] The current xHCI driver does not validate whether a page size of 4096 bytes is supported. Address the issue by setting the page size to the value supported by the xHCI controller, as read from the Page Size register. In the event of an unexpected value; default to a 4K page size. Additionally, this commit removes unnecessary debug messages and instead prints the supported and used page size once. The xHCI controller supports page sizes of (2^{(n+12)}) bytes, where 'n' is the Page Size Bit. Only one page size is supported, with a maximum page size of 128 KB. Signed-off-by: Niklas Neronin Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20250306144954.3507700-10-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/host/xhci-mem.c | 34 ++++++++++++++++++---------------- drivers/usb/host/xhci.h | 8 ++++---- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 8c26275696df9..f9c51e0f2e37c 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -1959,7 +1959,6 @@ no_bw: xhci->interrupters = NULL; xhci->page_size = 0; - xhci->page_shift = 0; xhci->usb2_rhub.bus_state.bus_suspended = 0; xhci->usb3_rhub.bus_state.bus_suspended = 0; } @@ -2378,6 +2377,22 @@ xhci_create_secondary_interrupter(struct usb_hcd *hcd, unsigned int segs, } EXPORT_SYMBOL_GPL(xhci_create_secondary_interrupter); +static void xhci_hcd_page_size(struct xhci_hcd *xhci) +{ + u32 page_size; + + page_size = readl(&xhci->op_regs->page_size) & XHCI_PAGE_SIZE_MASK; + if (!is_power_of_2(page_size)) { + xhci_warn(xhci, "Invalid page size register = 0x%x\n", page_size); + /* Fallback to 4K page size, since that's common */ + page_size = 1; + } + + xhci->page_size = page_size << 12; + xhci_dbg_trace(xhci, trace_xhci_dbg_init, "HCD page size set to %iK", + xhci->page_size >> 10); +} + int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) { struct xhci_interrupter *ir; @@ -2385,7 +2400,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) dma_addr_t dma; unsigned int val, val2; u64 val_64; - u32 page_size, temp; + u32 temp; int i; INIT_LIST_HEAD(&xhci->cmd_list); @@ -2394,20 +2409,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) INIT_DELAYED_WORK(&xhci->cmd_timer, xhci_handle_command_timeout); init_completion(&xhci->cmd_ring_stop_completion); - page_size = readl(&xhci->op_regs->page_size); - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "Supported page size register = 0x%x", page_size); - val = ffs(page_size) - 1; - if (val < 16) - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "Supported page size of %iK", (1 << (val + 12)) / 1024); - else - xhci_warn(xhci, "WARN: no supported page size\n"); - /* Use 4K pages, since that's common and the minimum the HC supports */ - xhci->page_shift = 12; - xhci->page_size = 1 << xhci->page_shift; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "HCD page size set to %iK", xhci->page_size / 1024); + xhci_hcd_page_size(xhci); /* * Program the Number of Device Slots Enabled field in the CONFIG diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 2a954efa53e80..c4d5b90ef90a8 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -211,6 +211,9 @@ struct xhci_op_regs { #define CONFIG_CIE (1 << 9) /* bits 10:31 - reserved and should be preserved */ +/* bits 15:0 - HCD page shift bit */ +#define XHCI_PAGE_SIZE_MASK 0xffff + /** * struct xhci_intr_reg - Interrupt Register Set * @irq_pending: IMAN - Interrupt Management Register. Used to enable @@ -1503,10 +1506,7 @@ struct xhci_hcd { u16 max_interrupters; /* imod_interval in ns (I * 250ns) */ u32 imod_interval; - /* 4KB min, 128MB max */ - int page_size; - /* Valid values are 12 to 20, inclusive */ - int page_shift; + u32 page_size; /* MSI-X/MSI vectors */ int nvecs; /* optional clocks */ -- GitLab From cc80a5cc520939d0a7d071cc4ae4b3c55ef171d0 Mon Sep 17 00:00:00 2001 From: Ming-Hung Tsai Date: Thu, 6 Mar 2025 16:41:50 +0800 Subject: [PATCH 0225/2211] dm cache: prevent BUG_ON by blocking retries on failed device resumes [ Upstream commit 5da692e2262b8f81993baa9592f57d12c2703dea ] A cache device failing to resume due to mapping errors should not be retried, as the failure leaves a partially initialized policy object. Repeating the resume operation risks triggering BUG_ON when reloading cache mappings into the incomplete policy object. Reproduce steps: 1. create a cache metadata consisting of 512 or more cache blocks, with some mappings stored in the first array block of the mapping array. Here we use cache_restore v1.0 to build the metadata. cat <> cmeta.xml EOF dmsetup create cmeta --table "0 8192 linear /dev/sdc 0" cache_restore -i cmeta.xml -o /dev/mapper/cmeta --metadata-version=2 dmsetup remove cmeta 2. wipe the second array block of the mapping array to simulate data degradations. mapping_root=$(dd if=/dev/sdc bs=1c count=8 skip=192 \ 2>/dev/null | hexdump -e '1/8 "%u\n"') ablock=$(dd if=/dev/sdc bs=1c count=8 skip=$((4096*mapping_root+2056)) \ 2>/dev/null | hexdump -e '1/8 "%u\n"') dd if=/dev/zero of=/dev/sdc bs=4k count=1 seek=$ablock 3. try bringing up the cache device. The resume is expected to fail due to the broken array block. dmsetup create cmeta --table "0 8192 linear /dev/sdc 0" dmsetup create cdata --table "0 65536 linear /dev/sdc 8192" dmsetup create corig --table "0 524288 linear /dev/sdc 262144" dmsetup create cache --notable dmsetup load cache --table "0 524288 cache /dev/mapper/cmeta \ /dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 writethrough smq 0" dmsetup resume cache 4. try resuming the cache again. An unexpected BUG_ON is triggered while loading cache mappings. dmsetup resume cache Kernel logs: (snip) ------------[ cut here ]------------ kernel BUG at drivers/md/dm-cache-policy-smq.c:752! Oops: invalid opcode: 0000 [#1] PREEMPT SMP KASAN NOPTI CPU: 0 UID: 0 PID: 332 Comm: dmsetup Not tainted 6.13.4 #3 RIP: 0010:smq_load_mapping+0x3e5/0x570 Fix by disallowing resume operations for devices that failed the initial attempt. Signed-off-by: Ming-Hung Tsai Signed-off-by: Mikulas Patocka Signed-off-by: Sasha Levin --- drivers/md/dm-cache-target.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index 849eb6333e980..6aa4095dc5876 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c @@ -2899,6 +2899,27 @@ static dm_cblock_t get_cache_dev_size(struct cache *cache) return to_cblock(size); } +static bool can_resume(struct cache *cache) +{ + /* + * Disallow retrying the resume operation for devices that failed the + * first resume attempt, as the failure leaves the policy object partially + * initialized. Retrying could trigger BUG_ON when loading cache mappings + * into the incomplete policy object. + */ + if (cache->sized && !cache->loaded_mappings) { + if (get_cache_mode(cache) != CM_WRITE) + DMERR("%s: unable to resume a failed-loaded cache, please check metadata.", + cache_device_name(cache)); + else + DMERR("%s: unable to resume cache due to missing proper cache table reload", + cache_device_name(cache)); + return false; + } + + return true; +} + static bool can_resize(struct cache *cache, dm_cblock_t new_size) { if (from_cblock(new_size) > from_cblock(cache->cache_size)) { @@ -2947,6 +2968,9 @@ static int cache_preresume(struct dm_target *ti) struct cache *cache = ti->private; dm_cblock_t csize = get_cache_dev_size(cache); + if (!can_resume(cache)) + return -EINVAL; + /* * Check to see if the cache has resized. */ -- GitLab From 6ad0673ab24f0b94f396bfafb899d299613e6e33 Mon Sep 17 00:00:00 2001 From: AngeloGioacchino Del Regno Date: Wed, 12 Feb 2025 11:00:05 +0100 Subject: [PATCH 0226/2211] soc: mediatek: mtk-mutex: Add DPI1 SOF/EOF to MT8188 mutex tables [ Upstream commit 694e0b7c1747603243da874de9cbbf8cb806ca44 ] MT8188 uses DPI1 to output to the HDMI controller: add the Start of Frame and End of Frame configuration for the DPI1 IP to the tables to unblock generation and sending of these signals to the GCE. Link: https://lore.kernel.org/r/20250212100012.33001-2-angelogioacchino.delregno@collabora.com Signed-off-by: AngeloGioacchino Del Regno Signed-off-by: Sasha Levin --- drivers/soc/mediatek/mtk-mutex.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/soc/mediatek/mtk-mutex.c b/drivers/soc/mediatek/mtk-mutex.c index 5250c1d702eb9..aaa965d4b050a 100644 --- a/drivers/soc/mediatek/mtk-mutex.c +++ b/drivers/soc/mediatek/mtk-mutex.c @@ -155,6 +155,7 @@ #define MT8188_MUTEX_MOD_DISP1_VPP_MERGE3 23 #define MT8188_MUTEX_MOD_DISP1_VPP_MERGE4 24 #define MT8188_MUTEX_MOD_DISP1_DISP_MIXER 30 +#define MT8188_MUTEX_MOD_DISP1_DPI1 38 #define MT8188_MUTEX_MOD_DISP1_DP_INTF1 39 #define MT8195_MUTEX_MOD_DISP_OVL0 0 @@ -289,6 +290,7 @@ #define MT8188_MUTEX_SOF_DSI0 1 #define MT8188_MUTEX_SOF_DP_INTF0 3 #define MT8188_MUTEX_SOF_DP_INTF1 4 +#define MT8188_MUTEX_SOF_DPI1 5 #define MT8195_MUTEX_SOF_DSI0 1 #define MT8195_MUTEX_SOF_DSI1 2 #define MT8195_MUTEX_SOF_DP_INTF0 3 @@ -301,6 +303,7 @@ #define MT8188_MUTEX_EOF_DSI0 (MT8188_MUTEX_SOF_DSI0 << 7) #define MT8188_MUTEX_EOF_DP_INTF0 (MT8188_MUTEX_SOF_DP_INTF0 << 7) #define MT8188_MUTEX_EOF_DP_INTF1 (MT8188_MUTEX_SOF_DP_INTF1 << 7) +#define MT8188_MUTEX_EOF_DPI1 (MT8188_MUTEX_SOF_DPI1 << 7) #define MT8195_MUTEX_EOF_DSI0 (MT8195_MUTEX_SOF_DSI0 << 7) #define MT8195_MUTEX_EOF_DSI1 (MT8195_MUTEX_SOF_DSI1 << 7) #define MT8195_MUTEX_EOF_DP_INTF0 (MT8195_MUTEX_SOF_DP_INTF0 << 7) @@ -472,6 +475,7 @@ static const u8 mt8188_mutex_mod[DDP_COMPONENT_ID_MAX] = { [DDP_COMPONENT_PWM0] = MT8188_MUTEX_MOD2_DISP_PWM0, [DDP_COMPONENT_DP_INTF0] = MT8188_MUTEX_MOD_DISP_DP_INTF0, [DDP_COMPONENT_DP_INTF1] = MT8188_MUTEX_MOD_DISP1_DP_INTF1, + [DDP_COMPONENT_DPI1] = MT8188_MUTEX_MOD_DISP1_DPI1, [DDP_COMPONENT_ETHDR_MIXER] = MT8188_MUTEX_MOD_DISP1_DISP_MIXER, [DDP_COMPONENT_MDP_RDMA0] = MT8188_MUTEX_MOD_DISP1_MDP_RDMA0, [DDP_COMPONENT_MDP_RDMA1] = MT8188_MUTEX_MOD_DISP1_MDP_RDMA1, @@ -686,6 +690,8 @@ static const u16 mt8188_mutex_sof[DDP_MUTEX_SOF_MAX] = { [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE, [MUTEX_SOF_DSI0] = MT8188_MUTEX_SOF_DSI0 | MT8188_MUTEX_EOF_DSI0, + [MUTEX_SOF_DPI1] = + MT8188_MUTEX_SOF_DPI1 | MT8188_MUTEX_EOF_DPI1, [MUTEX_SOF_DP_INTF0] = MT8188_MUTEX_SOF_DP_INTF0 | MT8188_MUTEX_EOF_DP_INTF0, [MUTEX_SOF_DP_INTF1] = -- GitLab From cd918ec24168fe08c6aafc077dd3b6d88364c5cf Mon Sep 17 00:00:00 2001 From: "Matthew Wilcox (Oracle)" Date: Wed, 5 Mar 2025 20:47:25 +0000 Subject: [PATCH 0227/2211] orangefs: Do not truncate file size [ Upstream commit 062e8093592fb866b8e016641a8b27feb6ac509d ] 'len' is used to store the result of i_size_read(), so making 'len' a size_t results in truncation to 4GiB on 32-bit systems. Signed-off-by: "Matthew Wilcox (Oracle)" Link: https://lore.kernel.org/r/20250305204734.1475264-2-willy@infradead.org Tested-by: Mike Marshall Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/orangefs/inode.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/fs/orangefs/inode.c b/fs/orangefs/inode.c index aae6d2b8767df..63d7c1ca0dfd3 100644 --- a/fs/orangefs/inode.c +++ b/fs/orangefs/inode.c @@ -23,9 +23,9 @@ static int orangefs_writepage_locked(struct page *page, struct orangefs_write_range *wr = NULL; struct iov_iter iter; struct bio_vec bv; - size_t len, wlen; + size_t wlen; ssize_t ret; - loff_t off; + loff_t len, off; set_page_writeback(page); @@ -91,8 +91,7 @@ static int orangefs_writepages_work(struct orangefs_writepages *ow, struct orangefs_write_range *wrp, wr; struct iov_iter iter; ssize_t ret; - size_t len; - loff_t off; + loff_t len, off; int i; len = i_size_read(inode); -- GitLab From 93f581d7634ffca6823cfedcdb737bd31f810612 Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Wed, 26 Feb 2025 18:03:04 +0100 Subject: [PATCH 0228/2211] drm/gem: Test for imported GEM buffers with helper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit b57aa47d39e94dc47403a745e2024664e544078c ] Add drm_gem_is_imported() that tests if a GEM object's buffer has been imported. Update the GEM code accordingly. GEM code usually tests for imports if import_attach has been set in struct drm_gem_object. But attaching a dma-buf on import requires a DMA-capable importer device, which is not the case for many serial busses like USB or I2C. The new helper tests if a GEM object's dma-buf has been created from the GEM object. Signed-off-by: Thomas Zimmermann Reviewed-by: Anusha Srivatsa Reviewed-by: Christian König Link: https://patchwork.freedesktop.org/patch/msgid/20250226172457.217725-2-tzimmermann@suse.de Signed-off-by: Sasha Levin --- drivers/gpu/drm/drm_gem.c | 4 ++-- include/drm/drm_gem.h | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 149b8e25da5bb..426d0867882df 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -322,7 +322,7 @@ int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, return -ENOENT; /* Don't allow imported objects to be mapped */ - if (obj->import_attach) { + if (drm_gem_is_imported(obj)) { ret = -EINVAL; goto out; } @@ -1152,7 +1152,7 @@ void drm_gem_print_info(struct drm_printer *p, unsigned int indent, drm_vma_node_start(&obj->vma_node)); drm_printf_indent(p, indent, "size=%zu\n", obj->size); drm_printf_indent(p, indent, "imported=%s\n", - str_yes_no(obj->import_attach)); + str_yes_no(drm_gem_is_imported(obj))); if (obj->funcs->print_info) obj->funcs->print_info(p, indent, obj); diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index d8b86df2ec0da..70c0f8c83629d 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -35,6 +35,7 @@ */ #include +#include #include #include #include @@ -570,6 +571,19 @@ static inline bool drm_gem_object_is_shared_for_memory_stats(struct drm_gem_obje return (obj->handle_count > 1) || obj->dma_buf; } +/** + * drm_gem_is_imported() - Tests if GEM object's buffer has been imported + * @obj: the GEM object + * + * Returns: + * True if the GEM object's buffer has been imported, false otherwise + */ +static inline bool drm_gem_is_imported(const struct drm_gem_object *obj) +{ + /* The dma-buf's priv field points to the original GEM object. */ + return obj->dma_buf && (obj->dma_buf->priv != obj); +} + #ifdef CONFIG_LOCKDEP /** * drm_gem_gpuva_set_lock() - Set the lock protecting accesses to the gpuva list. -- GitLab From c4525b513de399109fc51529fcf7fec04f907be1 Mon Sep 17 00:00:00 2001 From: Choong Yong Liang Date: Thu, 27 Feb 2025 20:15:17 +0800 Subject: [PATCH 0229/2211] net: phylink: use pl->link_interface in phylink_expects_phy() [ Upstream commit b63263555eaafbf9ab1a82f2020bbee872d83759 ] The phylink_expects_phy() function allows MAC drivers to check if they are expecting a PHY to attach. The checking condition in phylink_expects_phy() aims to achieve the same result as the checking condition in phylink_attach_phy(). However, the checking condition in phylink_expects_phy() uses pl->link_config.interface, while phylink_attach_phy() uses pl->link_interface. Initially, both pl->link_interface and pl->link_config.interface are set to SGMII, and pl->cfg_link_an_mode is set to MLO_AN_INBAND. When the interface switches from SGMII to 2500BASE-X, pl->link_config.interface is updated by phylink_major_config(). At this point, pl->cfg_link_an_mode remains MLO_AN_INBAND, and pl->link_config.interface is set to 2500BASE-X. Subsequently, when the STMMAC interface is taken down administratively and brought back up, it is blocked by phylink_expects_phy(). Since phylink_expects_phy() and phylink_attach_phy() aim to achieve the same result, phylink_expects_phy() should check pl->link_interface, which never changes, instead of pl->link_config.interface, which is updated by phylink_major_config(). Reviewed-by: Russell King (Oracle) Signed-off-by: Choong Yong Liang Link: https://patch.msgid.link/20250227121522.1802832-2-yong.liang.choong@linux.intel.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/phy/phylink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c index 3e9957b6aa148..b78dfcbec936c 100644 --- a/drivers/net/phy/phylink.c +++ b/drivers/net/phy/phylink.c @@ -1811,7 +1811,7 @@ bool phylink_expects_phy(struct phylink *pl) { if (pl->cfg_link_an_mode == MLO_AN_FIXED || (pl->cfg_link_an_mode == MLO_AN_INBAND && - phy_interface_mode_is_8023z(pl->link_config.interface))) + phy_interface_mode_is_8023z(pl->link_interface))) return false; return true; } -- GitLab From 95080412e9304cb5eeadd8a1f54aae9465330c54 Mon Sep 17 00:00:00 2001 From: Ming Lei Date: Wed, 5 Mar 2025 12:31:20 +0800 Subject: [PATCH 0230/2211] blk-throttle: don't take carryover for prioritized processing of metadata [ Upstream commit a9fc8868b350cbf4ff730a4ea9651319cc669516 ] Commit 29390bb5661d ("blk-throttle: support prioritized processing of metadata") takes bytes/ios carryover for prioritized processing of metadata. Turns out we can support it by charging it directly without trimming slice, and the result is same with carryover. Cc: Tejun Heo Cc: Josef Bacik Cc: Yu Kuai Signed-off-by: Ming Lei Acked-by: Tejun Heo Link: https://lore.kernel.org/r/20250305043123.3938491-3-ming.lei@redhat.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- block/blk-throttle.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/block/blk-throttle.c b/block/blk-throttle.c index 2c4192e12efab..6b82fcbd7e774 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c @@ -1593,13 +1593,6 @@ static bool tg_within_limit(struct throtl_grp *tg, struct bio *bio, bool rw) return tg_may_dispatch(tg, bio, NULL); } -static void tg_dispatch_in_debt(struct throtl_grp *tg, struct bio *bio, bool rw) -{ - if (!bio_flagged(bio, BIO_BPS_THROTTLED)) - tg->carryover_bytes[rw] -= throtl_bio_data_size(bio); - tg->carryover_ios[rw]--; -} - bool __blk_throtl_bio(struct bio *bio) { struct request_queue *q = bdev_get_queue(bio->bi_bdev); @@ -1636,10 +1629,12 @@ bool __blk_throtl_bio(struct bio *bio) /* * IOs which may cause priority inversions are * dispatched directly, even if they're over limit. - * Debts are handled by carryover_bytes/ios while - * calculating wait time. + * + * Charge and dispatch directly, and our throttle + * control algorithm is adaptive, and extra IO bytes + * will be throttled for paying the debt */ - tg_dispatch_in_debt(tg, bio, rw); + throtl_charge_bio(tg, bio); } else { /* if above limits, break to queue */ break; -- GitLab From 69bb5b3ae348040e385113efba5bdc76396644d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matti=20Lehtim=C3=A4ki?= Date: Thu, 6 Feb 2025 20:56:48 +0100 Subject: [PATCH 0231/2211] remoteproc: qcom_wcnss: Handle platforms with only single power domain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 65991ea8a6d1e68effdc01d95ebe39f1653f7b71 ] Both MSM8974 and MSM8226 have only CX as power domain with MX & PX being handled as regulators. Handle this case by reodering pd_names to have CX first, and handling that the driver core will already attach a single power domain internally. Signed-off-by: Matti Lehtimäki [luca: minor changes] Signed-off-by: Luca Weiss Link: https://lore.kernel.org/r/20250206-wcnss-singlepd-v2-2-9a53ee953dee@lucaweiss.eu [bjorn: Added missing braces to else after multi-statement if] Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/remoteproc/qcom_wcnss.c | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/drivers/remoteproc/qcom_wcnss.c b/drivers/remoteproc/qcom_wcnss.c index a7bb9da27029d..735d373a9f636 100644 --- a/drivers/remoteproc/qcom_wcnss.c +++ b/drivers/remoteproc/qcom_wcnss.c @@ -117,10 +117,10 @@ static const struct wcnss_data pronto_v1_data = { .pmu_offset = 0x1004, .spare_offset = 0x1088, - .pd_names = { "mx", "cx" }, + .pd_names = { "cx", "mx" }, .vregs = (struct wcnss_vreg_info[]) { - { "vddmx", 950000, 1150000, 0 }, { "vddcx", .super_turbo = true}, + { "vddmx", 950000, 1150000, 0 }, { "vddpx", 1800000, 1800000, 0 }, }, .num_pd_vregs = 2, @@ -131,10 +131,10 @@ static const struct wcnss_data pronto_v2_data = { .pmu_offset = 0x1004, .spare_offset = 0x1088, - .pd_names = { "mx", "cx" }, + .pd_names = { "cx", "mx" }, .vregs = (struct wcnss_vreg_info[]) { - { "vddmx", 1287500, 1287500, 0 }, { "vddcx", .super_turbo = true }, + { "vddmx", 1287500, 1287500, 0 }, { "vddpx", 1800000, 1800000, 0 }, }, .num_pd_vregs = 2, @@ -397,8 +397,17 @@ static irqreturn_t wcnss_stop_ack_interrupt(int irq, void *dev) static int wcnss_init_pds(struct qcom_wcnss *wcnss, const char * const pd_names[WCNSS_MAX_PDS]) { + struct device *dev = wcnss->dev; int i, ret; + /* Handle single power domain */ + if (dev->pm_domain) { + wcnss->pds[0] = dev; + wcnss->num_pds = 1; + pm_runtime_enable(dev); + return 0; + } + for (i = 0; i < WCNSS_MAX_PDS; i++) { if (!pd_names[i]) break; @@ -418,8 +427,15 @@ static int wcnss_init_pds(struct qcom_wcnss *wcnss, static void wcnss_release_pds(struct qcom_wcnss *wcnss) { + struct device *dev = wcnss->dev; int i; + /* Handle single power domain */ + if (wcnss->num_pds == 1 && dev->pm_domain) { + pm_runtime_disable(dev); + return; + } + for (i = 0; i < wcnss->num_pds; i++) dev_pm_domain_detach(wcnss->pds[i], false); } @@ -437,10 +453,13 @@ static int wcnss_init_regulators(struct qcom_wcnss *wcnss, * the regulators for the power domains. For old device trees we need to * reserve extra space to manage them through the regulator interface. */ - if (wcnss->num_pds) - info += num_pd_vregs; - else + if (wcnss->num_pds) { + info += wcnss->num_pds; + /* Handle single power domain case */ + num_vregs += num_pd_vregs - wcnss->num_pds; + } else { num_vregs += num_pd_vregs; + } bulk = devm_kcalloc(wcnss->dev, num_vregs, sizeof(struct regulator_bulk_data), -- GitLab From a23f3910123b518c8cf0fbb89aa9c9e08d23a4ca Mon Sep 17 00:00:00 2001 From: Victor Lu Date: Thu, 13 Feb 2025 18:38:28 -0500 Subject: [PATCH 0232/2211] drm/amdgpu: Do not program AGP BAR regs under SRIOV in gfxhub_v1_0.c [ Upstream commit 057fef20b8401110a7bc1c2fe9d804a8a0bf0d24 ] SRIOV VF does not have write access to AGP BAR regs. Skip the writes to avoid a dmesg warning. Signed-off-by: Victor Lu Acked-by: Alex Deucher Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c index 0e3ddea7b8e0f..a7bfc9f41d0e3 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c @@ -92,12 +92,12 @@ static void gfxhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev) { uint64_t value; - /* Program the AGP BAR */ - WREG32_SOC15_RLC(GC, 0, mmMC_VM_AGP_BASE, 0); - WREG32_SOC15_RLC(GC, 0, mmMC_VM_AGP_BOT, adev->gmc.agp_start >> 24); - WREG32_SOC15_RLC(GC, 0, mmMC_VM_AGP_TOP, adev->gmc.agp_end >> 24); - if (!amdgpu_sriov_vf(adev) || adev->asic_type <= CHIP_VEGA10) { + /* Program the AGP BAR */ + WREG32_SOC15_RLC(GC, 0, mmMC_VM_AGP_BASE, 0); + WREG32_SOC15_RLC(GC, 0, mmMC_VM_AGP_BOT, adev->gmc.agp_start >> 24); + WREG32_SOC15_RLC(GC, 0, mmMC_VM_AGP_TOP, adev->gmc.agp_end >> 24); + /* Program the system aperture low logical page number. */ WREG32_SOC15_RLC(GC, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR, min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18); -- GitLab From 5bf0fd2bd5efba63f278b5b6fca7a1ddead451be Mon Sep 17 00:00:00 2001 From: Nicholas Kazlauskas Date: Wed, 19 Feb 2025 09:56:53 -0500 Subject: [PATCH 0233/2211] drm/amd/display: Ensure DMCUB idle before reset on DCN31/DCN35 [ Upstream commit c707ea82c79dbd1d295ec94cc6529a5248c77757 ] [Why] If we soft reset before halt finishes and there are outstanding memory transactions then the memory interface may produce unexpected results, such as out of order transactions when the firmware next runs. These can manifest as random or unexpected load/store violations. [How] Increase the timeout before soft reset to ensure the DMCUB has quiesced. This is effectively 1s maximum based on experimentation. Use the enable bit check on DCN31 like we're doing on DCN35 and reorder the reset writes to follow the HW programming guide. Ensure we're reading SCRATCH7 instead of SCRATCH8 for the HALT code. No current versions of DMCUB firmware use the SCRATCH8 boot bit to dynamically switch where the HALT code goes to maintain backwards compatibility with PSP. Reviewed-by: Dillon Varone Signed-off-by: Nicholas Kazlauskas Signed-off-by: Wayne Lin Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../gpu/drm/amd/display/dmub/src/dmub_dcn31.c | 17 +++++++++++------ .../gpu/drm/amd/display/dmub/src/dmub_dcn35.c | 4 ++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c index d9f31b191c693..1a68b5782cac6 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c @@ -83,8 +83,8 @@ static inline void dmub_dcn31_translate_addr(const union dmub_addr *addr_in, void dmub_dcn31_reset(struct dmub_srv *dmub) { union dmub_gpint_data_register cmd; - const uint32_t timeout = 100; - uint32_t in_reset, scratch, i, pwait_mode; + const uint32_t timeout = 100000; + uint32_t in_reset, is_enabled, scratch, i, pwait_mode; REG_GET(DMCUB_CNTL2, DMCUB_SOFT_RESET, &in_reset); @@ -108,7 +108,7 @@ void dmub_dcn31_reset(struct dmub_srv *dmub) } for (i = 0; i < timeout; ++i) { - scratch = dmub->hw_funcs.get_gpint_response(dmub); + scratch = REG_READ(DMCUB_SCRATCH7); if (scratch == DMUB_GPINT__STOP_FW_RESPONSE) break; @@ -125,9 +125,14 @@ void dmub_dcn31_reset(struct dmub_srv *dmub) /* Force reset in case we timed out, DMCUB is likely hung. */ } - REG_UPDATE(DMCUB_CNTL2, DMCUB_SOFT_RESET, 1); - REG_UPDATE(DMCUB_CNTL, DMCUB_ENABLE, 0); - REG_UPDATE(MMHUBBUB_SOFT_RESET, DMUIF_SOFT_RESET, 1); + REG_GET(DMCUB_CNTL, DMCUB_ENABLE, &is_enabled); + + if (is_enabled) { + REG_UPDATE(DMCUB_CNTL2, DMCUB_SOFT_RESET, 1); + REG_UPDATE(MMHUBBUB_SOFT_RESET, DMUIF_SOFT_RESET, 1); + REG_UPDATE(DMCUB_CNTL, DMCUB_ENABLE, 0); + } + REG_WRITE(DMCUB_INBOX1_RPTR, 0); REG_WRITE(DMCUB_INBOX1_WPTR, 0); REG_WRITE(DMCUB_OUTBOX1_RPTR, 0); diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c index 2ccad79053c58..4581eb4794518 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c @@ -88,7 +88,7 @@ static inline void dmub_dcn35_translate_addr(const union dmub_addr *addr_in, void dmub_dcn35_reset(struct dmub_srv *dmub) { union dmub_gpint_data_register cmd; - const uint32_t timeout = 100; + const uint32_t timeout = 100000; uint32_t in_reset, is_enabled, scratch, i, pwait_mode; REG_GET(DMCUB_CNTL2, DMCUB_SOFT_RESET, &in_reset); @@ -113,7 +113,7 @@ void dmub_dcn35_reset(struct dmub_srv *dmub) } for (i = 0; i < timeout; ++i) { - scratch = dmub->hw_funcs.get_gpint_response(dmub); + scratch = REG_READ(DMCUB_SCRATCH7); if (scratch == DMUB_GPINT__STOP_FW_RESPONSE) break; -- GitLab From 682c4226f317ec1954755eb4e8e58dd4d3a5cef1 Mon Sep 17 00:00:00 2001 From: George Shen Date: Fri, 14 Feb 2025 22:00:13 -0500 Subject: [PATCH 0234/2211] drm/amd/display: Skip checking FRL_MODE bit for PCON BW determination [ Upstream commit 0584bbcf0c53c133081100e4f4c9fe41e598d045 ] [Why/How] Certain PCON will clear the FRL_MODE bit despite supporting the link BW indicated in the other bits. Thus, skip checking the FRL_MODE bit when interpreting the hdmi_encoded_link_bw struct. Reviewed-by: Wenjing Liu Signed-off-by: George Shen Signed-off-by: Wayne Lin Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../dc/link/protocols/link_dp_capability.c | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c index 885e749cdc6e9..23e650e39910e 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c @@ -250,21 +250,21 @@ static uint32_t intersect_frl_link_bw_support( { uint32_t supported_bw_in_kbps = max_supported_frl_bw_in_kbps; - // HDMI_ENCODED_LINK_BW bits are only valid if HDMI Link Configuration bit is 1 (FRL mode) - if (hdmi_encoded_link_bw.bits.FRL_MODE) { - if (hdmi_encoded_link_bw.bits.BW_48Gbps) - supported_bw_in_kbps = 48000000; - else if (hdmi_encoded_link_bw.bits.BW_40Gbps) - supported_bw_in_kbps = 40000000; - else if (hdmi_encoded_link_bw.bits.BW_32Gbps) - supported_bw_in_kbps = 32000000; - else if (hdmi_encoded_link_bw.bits.BW_24Gbps) - supported_bw_in_kbps = 24000000; - else if (hdmi_encoded_link_bw.bits.BW_18Gbps) - supported_bw_in_kbps = 18000000; - else if (hdmi_encoded_link_bw.bits.BW_9Gbps) - supported_bw_in_kbps = 9000000; - } + /* Skip checking FRL_MODE bit, as certain PCON will clear + * it despite supporting the link BW indicated in the other bits. + */ + if (hdmi_encoded_link_bw.bits.BW_48Gbps) + supported_bw_in_kbps = 48000000; + else if (hdmi_encoded_link_bw.bits.BW_40Gbps) + supported_bw_in_kbps = 40000000; + else if (hdmi_encoded_link_bw.bits.BW_32Gbps) + supported_bw_in_kbps = 32000000; + else if (hdmi_encoded_link_bw.bits.BW_24Gbps) + supported_bw_in_kbps = 24000000; + else if (hdmi_encoded_link_bw.bits.BW_18Gbps) + supported_bw_in_kbps = 18000000; + else if (hdmi_encoded_link_bw.bits.BW_9Gbps) + supported_bw_in_kbps = 9000000; return supported_bw_in_kbps; } -- GitLab From e015cef8b78f6020bb43f898aa4e543a166d3aff Mon Sep 17 00:00:00 2001 From: Dillon Varone Date: Thu, 13 Feb 2025 13:10:41 -0500 Subject: [PATCH 0235/2211] drm/amd/display: Fix DMUB reset sequence for DCN401 [ Upstream commit 0dfcc2bf269010a6e093793034c048049a40ee93 ] [WHY] It should no longer use DMCUB_SOFT_RESET as it can result in the memory request path becoming desynchronized. [HOW] To ensure robustness in the reset sequence: 1) Extend timeout on the "halt" command sent via gpint, and check for controller to enter "wait" as a stronger guarantee that there are no requests to memory still in flight. 2) Remove usage of DMCUB_SOFT_RESET 3) Rely on PSP to reset the controller safely Reviewed-by: Nicholas Kazlauskas Signed-off-by: Dillon Varone Signed-off-by: Wayne Lin Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../drm/amd/display/dmub/src/dmub_dcn401.c | 47 ++++++++++++------- .../drm/amd/display/dmub/src/dmub_dcn401.h | 3 +- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn401.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn401.c index 39a8cb6d7523c..e1c4fe1c6e3ee 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn401.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn401.c @@ -63,8 +63,10 @@ static inline void dmub_dcn401_translate_addr(const union dmub_addr *addr_in, void dmub_dcn401_reset(struct dmub_srv *dmub) { union dmub_gpint_data_register cmd; - const uint32_t timeout = 30; - uint32_t in_reset, scratch, i; + const uint32_t timeout_us = 1 * 1000 * 1000; //1s + const uint32_t poll_delay_us = 1; //1us + uint32_t i = 0; + uint32_t in_reset, scratch, pwait_mode; REG_GET(DMCUB_CNTL2, DMCUB_SOFT_RESET, &in_reset); @@ -75,32 +77,35 @@ void dmub_dcn401_reset(struct dmub_srv *dmub) dmub->hw_funcs.set_gpint(dmub, cmd); - /** - * Timeout covers both the ACK and the wait - * for remaining work to finish. - * - * This is mostly bound by the PHY disable sequence. - * Each register check will be greater than 1us, so - * don't bother using udelay. - */ - - for (i = 0; i < timeout; ++i) { + for (i = 0; i < timeout_us; i++) { if (dmub->hw_funcs.is_gpint_acked(dmub, cmd)) break; + + udelay(poll_delay_us); } - for (i = 0; i < timeout; ++i) { + for (; i < timeout_us; i++) { scratch = dmub->hw_funcs.get_gpint_response(dmub); if (scratch == DMUB_GPINT__STOP_FW_RESPONSE) break; + + udelay(poll_delay_us); } - /* Force reset in case we timed out, DMCUB is likely hung. */ + for (; i < timeout_us; i++) { + REG_GET(DMCUB_CNTL, DMCUB_PWAIT_MODE_STATUS, &pwait_mode); + if (pwait_mode & (1 << 0)) + break; + + udelay(poll_delay_us); + } + } + + if (i >= timeout_us) { + /* timeout should never occur */ + BREAK_TO_DEBUGGER(); } - REG_UPDATE(DMCUB_CNTL2, DMCUB_SOFT_RESET, 1); - REG_UPDATE(DMCUB_CNTL, DMCUB_ENABLE, 0); - REG_UPDATE(MMHUBBUB_SOFT_RESET, DMUIF_SOFT_RESET, 1); REG_WRITE(DMCUB_INBOX1_RPTR, 0); REG_WRITE(DMCUB_INBOX1_WPTR, 0); REG_WRITE(DMCUB_OUTBOX1_RPTR, 0); @@ -131,7 +136,10 @@ void dmub_dcn401_backdoor_load(struct dmub_srv *dmub, dmub_dcn401_get_fb_base_offset(dmub, &fb_base, &fb_offset); + /* reset and disable DMCUB and MMHUBBUB DMUIF */ REG_UPDATE(DMCUB_SEC_CNTL, DMCUB_SEC_RESET, 1); + REG_UPDATE(MMHUBBUB_SOFT_RESET, DMUIF_SOFT_RESET, 1); + REG_UPDATE(DMCUB_CNTL, DMCUB_ENABLE, 0); dmub_dcn401_translate_addr(&cw0->offset, fb_base, fb_offset, &offset); @@ -151,6 +159,7 @@ void dmub_dcn401_backdoor_load(struct dmub_srv *dmub, DMCUB_REGION3_CW1_TOP_ADDRESS, cw1->region.top, DMCUB_REGION3_CW1_ENABLE, 1); + /* release DMCUB reset only to prevent premature execution */ REG_UPDATE_2(DMCUB_SEC_CNTL, DMCUB_SEC_RESET, 0, DMCUB_MEM_UNIT_ID, 0x20); } @@ -161,7 +170,10 @@ void dmub_dcn401_backdoor_load_zfb_mode(struct dmub_srv *dmub, { union dmub_addr offset; + /* reset and disable DMCUB and MMHUBBUB DMUIF */ REG_UPDATE(DMCUB_SEC_CNTL, DMCUB_SEC_RESET, 1); + REG_UPDATE(MMHUBBUB_SOFT_RESET, DMUIF_SOFT_RESET, 1); + REG_UPDATE(DMCUB_CNTL, DMCUB_ENABLE, 0); offset = cw0->offset; @@ -181,6 +193,7 @@ void dmub_dcn401_backdoor_load_zfb_mode(struct dmub_srv *dmub, DMCUB_REGION3_CW1_TOP_ADDRESS, cw1->region.top, DMCUB_REGION3_CW1_ENABLE, 1); + /* release DMCUB reset only to prevent premature execution */ REG_UPDATE_2(DMCUB_SEC_CNTL, DMCUB_SEC_RESET, 0, DMCUB_MEM_UNIT_ID, 0x20); } diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn401.h b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn401.h index 4c8843b796950..31f95b27e227d 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn401.h +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn401.h @@ -169,7 +169,8 @@ struct dmub_srv; DMUB_SF(HOST_INTERRUPT_CSR, HOST_REG_INBOX0_RSP_INT_EN) \ DMUB_SF(HOST_INTERRUPT_CSR, HOST_REG_OUTBOX0_RDY_INT_ACK) \ DMUB_SF(HOST_INTERRUPT_CSR, HOST_REG_OUTBOX0_RDY_INT_STAT) \ - DMUB_SF(HOST_INTERRUPT_CSR, HOST_REG_OUTBOX0_RDY_INT_EN) + DMUB_SF(HOST_INTERRUPT_CSR, HOST_REG_OUTBOX0_RDY_INT_EN) \ + DMUB_SF(DMCUB_CNTL, DMCUB_PWAIT_MODE_STATUS) struct dmub_srv_dcn401_reg_offset { #define DMUB_SR(reg) uint32_t reg; -- GitLab From 1f2b3ea00717f867d8a7e263fc94fd2b9b4f22f1 Mon Sep 17 00:00:00 2001 From: Dillon Varone Date: Wed, 12 Feb 2025 17:06:42 -0500 Subject: [PATCH 0236/2211] drm/amd/display: Fix p-state type when p-state is unsupported [ Upstream commit a025f424af0407b7561bd5e6217295dde3abbc2e ] [WHY&HOW] P-state type would remain on previously used when unsupported which causes confusion in logging and visual confirm, so set back to zero when unsupported. Reviewed-by: Aric Cyr Signed-off-by: Dillon Varone Signed-off-by: Wayne Lin Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c index fdcba960e1e6f..d2342a91e7e71 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c @@ -508,6 +508,7 @@ void set_p_state_switch_method( if (!dc->ctx || !dc->ctx->dmub_srv || !pipe_ctx || !vba) return; + pipe_ctx->p_state_type = P_STATE_UNKNOWN; if (vba->DRAMClockChangeSupport[vba->VoltageLevel][vba->maxMpcComb] != dm_dram_clock_change_unsupported) { /* MCLK switching is supported */ -- GitLab From cc714c89ef5a990bc2c3b96171980f06b196e0b7 Mon Sep 17 00:00:00 2001 From: Aric Cyr Date: Thu, 23 Jan 2025 16:39:52 -0500 Subject: [PATCH 0237/2211] drm/amd/display: Request HW cursor on DCN3.2 with SubVP [ Upstream commit b74f46f3ce1e5f6336645f1e9ff47c56d5dfdef1 ] [why] When SubVP is active the HW cursor size is limited to 64x64, and anything larger will force composition which is bad for gaming on DCN3.2 if the game uses a larger cursor. [how] If HW cursor is requested, typically by a fullscreen game, do not enable SubVP so that up to 256x256 cursor sizes are available for DCN3.2. Reviewed-by: Aric Cyr Signed-off-by: Aric Cyr Signed-off-by: Wayne Lin Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/core/dc.c | 3 ++- drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index dd4b131fac6cb..fa7db10104c45 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -4744,7 +4744,8 @@ static bool full_update_required(struct dc *dc, stream_update->lut3d_func || stream_update->pending_test_pattern || stream_update->crtc_timing_adjust || - stream_update->scaler_sharpener_update)) + stream_update->scaler_sharpener_update || + stream_update->hw_cursor_req)) return true; if (stream) { diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c index 6f490d8d7038c..56dda686e2992 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c @@ -626,6 +626,7 @@ static bool dcn32_assign_subvp_pipe(struct dc *dc, * - Not TMZ surface */ if (pipe->plane_state && !pipe->top_pipe && !pipe->prev_odm_pipe && !dcn32_is_center_timing(pipe) && + !pipe->stream->hw_cursor_req && !(pipe->stream->timing.pix_clk_100hz / 10000 > DCN3_2_MAX_SUBVP_PIXEL_RATE_MHZ) && (!dcn32_is_psr_capable(pipe) || (context->stream_count == 1 && dc->caps.dmub_caps.subvp_psr)) && dc_state_get_pipe_subvp_type(context, pipe) == SUBVP_NONE && -- GitLab From f29c876d72d71b64b0cf0958345f1da0fbd9c383 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Wed, 5 Feb 2025 11:21:28 +0100 Subject: [PATCH 0238/2211] perf/core: Clean up perf_try_init_event() [ Upstream commit da02f54e81db2f7bf6af9d1d0cfc5b41ec6d0dcb ] Make sure that perf_try_init_event() doesn't leave event->pmu nor event->destroy set on failure. Signed-off-by: Peter Zijlstra (Intel) Signed-off-by: Ingo Molnar Acked-by: Ravi Bangoria Link: https://lore.kernel.org/r/20250205102449.110145835@infradead.org Signed-off-by: Sasha Levin --- kernel/events/core.c | 65 ++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index edafe9fc4bdd0..19dde12f23b83 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -11978,40 +11978,51 @@ static int perf_try_init_event(struct pmu *pmu, struct perf_event *event) if (ctx) perf_event_ctx_unlock(event->group_leader, ctx); - if (!ret) { - if (!(pmu->capabilities & PERF_PMU_CAP_EXTENDED_REGS) && - has_extended_regs(event)) - ret = -EOPNOTSUPP; + if (ret) + goto err_pmu; - if (pmu->capabilities & PERF_PMU_CAP_NO_EXCLUDE && - event_has_any_exclude_flag(event)) - ret = -EINVAL; + if (!(pmu->capabilities & PERF_PMU_CAP_EXTENDED_REGS) && + has_extended_regs(event)) { + ret = -EOPNOTSUPP; + goto err_destroy; + } - if (pmu->scope != PERF_PMU_SCOPE_NONE && event->cpu >= 0) { - const struct cpumask *cpumask = perf_scope_cpu_topology_cpumask(pmu->scope, event->cpu); - struct cpumask *pmu_cpumask = perf_scope_cpumask(pmu->scope); - int cpu; - - if (pmu_cpumask && cpumask) { - cpu = cpumask_any_and(pmu_cpumask, cpumask); - if (cpu >= nr_cpu_ids) - ret = -ENODEV; - else - event->event_caps |= PERF_EV_CAP_READ_SCOPE; - } else { - ret = -ENODEV; - } - } + if (pmu->capabilities & PERF_PMU_CAP_NO_EXCLUDE && + event_has_any_exclude_flag(event)) { + ret = -EINVAL; + goto err_destroy; + } - if (ret && event->destroy) - event->destroy(event); + if (pmu->scope != PERF_PMU_SCOPE_NONE && event->cpu >= 0) { + const struct cpumask *cpumask; + struct cpumask *pmu_cpumask; + int cpu; + + cpumask = perf_scope_cpu_topology_cpumask(pmu->scope, event->cpu); + pmu_cpumask = perf_scope_cpumask(pmu->scope); + + ret = -ENODEV; + if (!pmu_cpumask || !cpumask) + goto err_destroy; + + cpu = cpumask_any_and(pmu_cpumask, cpumask); + if (cpu >= nr_cpu_ids) + goto err_destroy; + + event->event_caps |= PERF_EV_CAP_READ_SCOPE; } - if (ret) { - event->pmu = NULL; - module_put(pmu->module); + return 0; + +err_destroy: + if (event->destroy) { + event->destroy(event); + event->destroy = NULL; } +err_pmu: + event->pmu = NULL; + module_put(pmu->module); return ret; } -- GitLab From 4731d5328f507ae8fd8a57abbca9119ec7a8d665 Mon Sep 17 00:00:00 2001 From: Hans Verkuil Date: Mon, 24 Feb 2025 14:13:24 +0100 Subject: [PATCH 0239/2211] media: cx231xx: set device_caps for 417 [ Upstream commit a79efc44b51432490538a55b9753a721f7d3ea42 ] The video_device for the MPEG encoder did not set device_caps. Add this, otherwise the video device can't be registered (you get a WARN_ON instead). Not seen before since currently 417 support is disabled, but I found this while experimenting with it. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Sasha Levin --- drivers/media/usb/cx231xx/cx231xx-417.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/usb/cx231xx/cx231xx-417.c b/drivers/media/usb/cx231xx/cx231xx-417.c index abb967c8bd352..6cb130eb32d58 100644 --- a/drivers/media/usb/cx231xx/cx231xx-417.c +++ b/drivers/media/usb/cx231xx/cx231xx-417.c @@ -1722,6 +1722,8 @@ static void cx231xx_video_dev_init( vfd->lock = &dev->lock; vfd->release = video_device_release_empty; vfd->ctrl_handler = &dev->mpeg_ctrl_handler.hdl; + vfd->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING | + V4L2_CAP_VIDEO_CAPTURE; video_set_drvdata(vfd, dev); if (dev->tuner_type == TUNER_ABSENT) { v4l2_disable_ioctl(vfd, VIDIOC_G_FREQUENCY); -- GitLab From 5aba8ac434d8bcffc673538da6772ec955a81b3f Mon Sep 17 00:00:00 2001 From: Artur Weber Date: Mon, 3 Mar 2025 21:54:47 +0100 Subject: [PATCH 0240/2211] pinctrl: bcm281xx: Use "unsigned int" instead of bare "unsigned" [ Upstream commit 07b5a2a13f4704c5eae3be7277ec54ffdba45f72 ] Replace uses of bare "unsigned" with "unsigned int" to fix checkpatch warnings. No functional change. Signed-off-by: Artur Weber Link: https://lore.kernel.org/20250303-bcm21664-pinctrl-v3-2-5f8b80e4ab51@gmail.com Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/bcm/pinctrl-bcm281xx.c | 44 +++++++++++++------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/drivers/pinctrl/bcm/pinctrl-bcm281xx.c b/drivers/pinctrl/bcm/pinctrl-bcm281xx.c index cf6efa9c0364a..a039b490cdb8e 100644 --- a/drivers/pinctrl/bcm/pinctrl-bcm281xx.c +++ b/drivers/pinctrl/bcm/pinctrl-bcm281xx.c @@ -72,7 +72,7 @@ static enum bcm281xx_pin_type hdmi_pin = BCM281XX_PIN_TYPE_HDMI; struct bcm281xx_pin_function { const char *name; const char * const *groups; - const unsigned ngroups; + const unsigned int ngroups; }; /* @@ -84,10 +84,10 @@ struct bcm281xx_pinctrl_data { /* List of all pins */ const struct pinctrl_pin_desc *pins; - const unsigned npins; + const unsigned int npins; const struct bcm281xx_pin_function *functions; - const unsigned nfunctions; + const unsigned int nfunctions; struct regmap *regmap; }; @@ -941,7 +941,7 @@ static struct bcm281xx_pinctrl_data bcm281xx_pinctrl = { }; static inline enum bcm281xx_pin_type pin_type_get(struct pinctrl_dev *pctldev, - unsigned pin) + unsigned int pin) { struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); @@ -985,7 +985,7 @@ static int bcm281xx_pinctrl_get_groups_count(struct pinctrl_dev *pctldev) } static const char *bcm281xx_pinctrl_get_group_name(struct pinctrl_dev *pctldev, - unsigned group) + unsigned int group) { struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); @@ -993,9 +993,9 @@ static const char *bcm281xx_pinctrl_get_group_name(struct pinctrl_dev *pctldev, } static int bcm281xx_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, - unsigned group, + unsigned int group, const unsigned **pins, - unsigned *num_pins) + unsigned int *num_pins) { struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); @@ -1007,7 +1007,7 @@ static int bcm281xx_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, static void bcm281xx_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, - unsigned offset) + unsigned int offset) { seq_printf(s, " %s", dev_name(pctldev->dev)); } @@ -1029,7 +1029,7 @@ static int bcm281xx_pinctrl_get_fcns_count(struct pinctrl_dev *pctldev) } static const char *bcm281xx_pinctrl_get_fcn_name(struct pinctrl_dev *pctldev, - unsigned function) + unsigned int function) { struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); @@ -1037,9 +1037,9 @@ static const char *bcm281xx_pinctrl_get_fcn_name(struct pinctrl_dev *pctldev, } static int bcm281xx_pinctrl_get_fcn_groups(struct pinctrl_dev *pctldev, - unsigned function, + unsigned int function, const char * const **groups, - unsigned * const num_groups) + unsigned int * const num_groups) { struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); @@ -1050,8 +1050,8 @@ static int bcm281xx_pinctrl_get_fcn_groups(struct pinctrl_dev *pctldev, } static int bcm281xx_pinmux_set(struct pinctrl_dev *pctldev, - unsigned function, - unsigned group) + unsigned int function, + unsigned int group) { struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); const struct bcm281xx_pin_function *f = &pdata->functions[function]; @@ -1082,7 +1082,7 @@ static const struct pinmux_ops bcm281xx_pinctrl_pinmux_ops = { }; static int bcm281xx_pinctrl_pin_config_get(struct pinctrl_dev *pctldev, - unsigned pin, + unsigned int pin, unsigned long *config) { return -ENOTSUPP; @@ -1091,9 +1091,9 @@ static int bcm281xx_pinctrl_pin_config_get(struct pinctrl_dev *pctldev, /* Goes through the configs and update register val/mask */ static int bcm281xx_std_pin_update(struct pinctrl_dev *pctldev, - unsigned pin, + unsigned int pin, unsigned long *configs, - unsigned num_configs, + unsigned int num_configs, u32 *val, u32 *mask) { @@ -1207,9 +1207,9 @@ static const u16 bcm281xx_pullup_map[] = { /* Goes through the configs and update register val/mask */ static int bcm281xx_i2c_pin_update(struct pinctrl_dev *pctldev, - unsigned pin, + unsigned int pin, unsigned long *configs, - unsigned num_configs, + unsigned int num_configs, u32 *val, u32 *mask) { @@ -1277,9 +1277,9 @@ static int bcm281xx_i2c_pin_update(struct pinctrl_dev *pctldev, /* Goes through the configs and update register val/mask */ static int bcm281xx_hdmi_pin_update(struct pinctrl_dev *pctldev, - unsigned pin, + unsigned int pin, unsigned long *configs, - unsigned num_configs, + unsigned int num_configs, u32 *val, u32 *mask) { @@ -1321,9 +1321,9 @@ static int bcm281xx_hdmi_pin_update(struct pinctrl_dev *pctldev, } static int bcm281xx_pinctrl_pin_config_set(struct pinctrl_dev *pctldev, - unsigned pin, + unsigned int pin, unsigned long *configs, - unsigned num_configs) + unsigned int num_configs) { struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); enum bcm281xx_pin_type pin_type; -- GitLab From 1a4a834f2af5b51c01ff2303389b9673caa8630e Mon Sep 17 00:00:00 2001 From: "Paul E. McKenney" Date: Thu, 12 Dec 2024 14:15:07 -0800 Subject: [PATCH 0241/2211] rcu: Fix get_state_synchronize_rcu_full() GP-start detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 85aad7cc417877054c65bd490dc037b087ef21b4 ] The get_state_synchronize_rcu_full() and poll_state_synchronize_rcu_full() functions use the root rcu_node structure's ->gp_seq field to detect the beginnings and ends of grace periods, respectively. This choice is necessary for the poll_state_synchronize_rcu_full() function because (give or take counter wrap), the following sequence is guaranteed not to trigger: get_state_synchronize_rcu_full(&rgos); synchronize_rcu(); WARN_ON_ONCE(!poll_state_synchronize_rcu_full(&rgos)); The RCU callbacks that awaken synchronize_rcu() instances are guaranteed not to be invoked before the root rcu_node structure's ->gp_seq field is updated to indicate the end of the grace period. However, these callbacks might start being invoked immediately thereafter, in particular, before rcu_state.gp_seq has been updated. Therefore, poll_state_synchronize_rcu_full() must refer to the root rcu_node structure's ->gp_seq field. Because this field is updated under this structure's ->lock, any code following a call to poll_state_synchronize_rcu_full() will be fully ordered after the full grace-period computation, as is required by RCU's memory-ordering semantics. By symmetry, the get_state_synchronize_rcu_full() function should also use this same root rcu_node structure's ->gp_seq field. But it turns out that symmetry is profoundly (though extremely infrequently) destructive in this case. To see this, consider the following sequence of events: 1. CPU 0 starts a new grace period, and updates rcu_state.gp_seq accordingly. 2. As its first step of grace-period initialization, CPU 0 examines the current CPU hotplug state and decides that it need not wait for CPU 1, which is currently offline. 3. CPU 1 comes online, and updates its state. But this does not affect the current grace period, but rather the one after that. After all, CPU 1 was offline when the current grace period started, so all pre-existing RCU readers on CPU 1 must have completed or been preempted before it last went offline. The current grace period therefore has nothing it needs to wait for on CPU 1. 4. CPU 1 switches to an rcutorture kthread which is running rcutorture's rcu_torture_reader() function, which starts a new RCU reader. 5. CPU 2 is running rcutorture's rcu_torture_writer() function and collects a new polled grace-period "cookie" using get_state_synchronize_rcu_full(). Because the newly started grace period has not completed initialization, the root rcu_node structure's ->gp_seq field has not yet been updated to indicate that this new grace period has already started. This cookie is therefore set up for the end of the current grace period (rather than the end of the following grace period). 6. CPU 0 finishes grace-period initialization. 7. If CPU 1’s rcutorture reader is preempted, it will be added to the ->blkd_tasks list, but because CPU 1’s ->qsmask bit is not set in CPU 1's leaf rcu_node structure, the ->gp_tasks pointer will not be updated.  Thus, this grace period will not wait on it.  Which is only fair, given that the CPU did not come online until after the grace period officially started. 8. CPUs 0 and 2 then detect the new grace period and then report a quiescent state to the RCU core. 9. Because CPU 1 was offline at the start of the current grace period, CPUs 0 and 2 are the only CPUs that this grace period needs to wait on. So the grace period ends and post-grace-period cleanup starts. In particular, the root rcu_node structure's ->gp_seq field is updated to indicate that this grace period has now ended. 10. CPU 2 continues running rcu_torture_writer() and sees that, from the viewpoint of the root rcu_node structure consulted by the poll_state_synchronize_rcu_full() function, the grace period has ended.  It therefore updates state accordingly. 11. CPU 1 is still running the same RCU reader, which notices this update and thus complains about the too-short grace period. The fix is for the get_state_synchronize_rcu_full() function to use rcu_state.gp_seq instead of the root rcu_node structure's ->gp_seq field. With this change in place, if step 5's cookie indicates that the grace period has not yet started, then any prior code executed by CPU 2 must have happened before CPU 1 came online. This will in turn prevent CPU 1's code in steps 3 and 11 from spanning CPU 2's grace-period wait, thus preventing CPU 1 from being subjected to a too-short grace period. This commit therefore makes this change. Note that there is no change to the poll_state_synchronize_rcu_full() function, which as noted above, must continue to use the root rcu_node structure's ->gp_seq field. This is of course an asymmetry between these two functions, but is an asymmetry that is absolutely required for correct operation. It is a common human tendency to greatly value symmetry, and sometimes symmetry is a wonderful thing. Other times, symmetry results in poor performance. But in this case, symmetry is just plain wrong. Nevertheless, the asymmetry does require an additional adjustment. It is possible for get_state_synchronize_rcu_full() to see a given grace period as having started, but for an immediately following poll_state_synchronize_rcu_full() to see it as having not yet started. Given the current rcu_seq_done_exact() implementation, this will result in a false-positive indication that the grace period is done from poll_state_synchronize_rcu_full(). This is dealt with by making rcu_seq_done_exact() reach back three grace periods rather than just two of them. However, simply changing get_state_synchronize_rcu_full() function to use rcu_state.gp_seq instead of the root rcu_node structure's ->gp_seq field results in a theoretical bug in kernels booted with rcutree.rcu_normal_wake_from_gp=1 due to the following sequence of events: o The rcu_gp_init() function invokes rcu_seq_start() to officially start a new grace period. o A new RCU reader begins, referencing X from some RCU-protected list. The new grace period is not obligated to wait for this reader. o An updater removes X, then calls synchronize_rcu(), which queues a wait element. o The grace period ends, awakening the updater, which frees X while the reader is still referencing it. The reason that this is theoretical is that although the grace period has officially started, none of the CPUs are officially aware of this, and thus will have to assume that the RCU reader pre-dated the start of the grace period. Detailed explanation can be found at [2] and [3]. Except for kernels built with CONFIG_PROVE_RCU=y, which use the polled grace-period APIs, which can and do complain bitterly when this sequence of events occurs. Not only that, there might be some future RCU grace-period mechanism that pulls this sequence of events from theory into practice. This commit therefore also pulls the call to rcu_sr_normal_gp_init() to precede that to rcu_seq_start(). Although this fixes commit 91a967fd6934 ("rcu: Add full-sized polling for get_completed*() and poll_state*()"), it is not clear that it is worth backporting this commit. First, it took me many weeks to convince rcutorture to reproduce this more frequently than once per year. Second, this cannot be reproduced at all without frequent CPU-hotplug operations, as in waiting all of 50 milliseconds from the end of the previous operation until starting the next one. Third, the TREE03.boot settings cause multi-millisecond delays during RCU grace-period initialization, which greatly increase the probability of the above sequence of events. (Don't do this in production workloads!) Fourth, the TREE03 rcutorture scenario was modified to use four-CPU guest OSes, to have a single-rcu_node combining tree, no testing of RCU priority boosting, and no random preemption, and these modifications were necessary to reproduce this issue in a reasonable timeframe. Fifth, extremely heavy use of get_state_synchronize_rcu_full() and/or poll_state_synchronize_rcu_full() is required to reproduce this, and as of v6.12, only kfree_rcu() uses it, and even then not particularly heavily. [boqun: Apply the fix [1], and add the comment before the moved rcu_sr_normal_gp_init(). Additional links are added for explanation.] Signed-off-by: Paul E. McKenney Reviewed-by: Frederic Weisbecker Reviewed-by: Joel Fernandes (Google) Tested-by: Uladzislau Rezki (Sony) Link: https://lore.kernel.org/rcu/d90bd6d9-d15c-4b9b-8a69-95336e74e8f4@paulmck-laptop/ [1] Link: https://lore.kernel.org/rcu/20250303001507.GA3994772@joelnvbox/ [2] Link: https://lore.kernel.org/rcu/Z8bcUsZ9IpRi1QoP@pc636/ [3] Reviewed-by: Joel Fernandes Signed-off-by: Boqun Feng Signed-off-by: Sasha Levin --- kernel/rcu/rcu.h | 2 +- kernel/rcu/tree.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h index feb3ac1dc5d59..f87c9d6d36fcb 100644 --- a/kernel/rcu/rcu.h +++ b/kernel/rcu/rcu.h @@ -162,7 +162,7 @@ static inline bool rcu_seq_done_exact(unsigned long *sp, unsigned long s) { unsigned long cur_s = READ_ONCE(*sp); - return ULONG_CMP_GE(cur_s, s) || ULONG_CMP_LT(cur_s, s - (2 * RCU_SEQ_STATE_MASK + 1)); + return ULONG_CMP_GE(cur_s, s) || ULONG_CMP_LT(cur_s, s - (3 * RCU_SEQ_STATE_MASK + 1)); } /* diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 8e52c1dd06284..4ed8632195217 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -1822,10 +1822,14 @@ static noinline_for_stack bool rcu_gp_init(void) /* Advance to a new grace period and initialize state. */ record_gp_stall_check_time(); + /* + * A new wait segment must be started before gp_seq advanced, so + * that previous gp waiters won't observe the new gp_seq. + */ + start_new_poll = rcu_sr_normal_gp_init(); /* Record GP times before starting GP, hence rcu_seq_start(). */ rcu_seq_start(&rcu_state.gp_seq); ASSERT_EXCLUSIVE_WRITER(rcu_state.gp_seq); - start_new_poll = rcu_sr_normal_gp_init(); trace_rcu_grace_period(rcu_state.name, rcu_state.gp_seq, TPS("start")); rcu_poll_gp_seq_start(&rcu_state.gp_seq_polled_snap); raw_spin_unlock_irq_rcu_node(rnp); @@ -4183,14 +4187,17 @@ EXPORT_SYMBOL_GPL(get_state_synchronize_rcu); */ void get_state_synchronize_rcu_full(struct rcu_gp_oldstate *rgosp) { - struct rcu_node *rnp = rcu_get_root(); - /* * Any prior manipulation of RCU-protected data must happen * before the loads from ->gp_seq and ->expedited_sequence. */ smp_mb(); /* ^^^ */ - rgosp->rgos_norm = rcu_seq_snap(&rnp->gp_seq); + + // Yes, rcu_state.gp_seq, not rnp_root->gp_seq, the latter's use + // in poll_state_synchronize_rcu_full() notwithstanding. Use of + // the latter here would result in too-short grace periods due to + // interactions with newly onlined CPUs. + rgosp->rgos_norm = rcu_seq_snap(&rcu_state.gp_seq); rgosp->rgos_exp = rcu_seq_snap(&rcu_state.expedited_sequence); } EXPORT_SYMBOL_GPL(get_state_synchronize_rcu_full); -- GitLab From 94df9fd015acef4556fe16ce06092a8d597c8897 Mon Sep 17 00:00:00 2001 From: Alexander Sverdlin Date: Mon, 3 Mar 2025 08:46:57 +0100 Subject: [PATCH 0242/2211] net: ethernet: ti: cpsw_new: populate netdev of_node [ Upstream commit 7ff1c88fc89688c27f773ba956f65f0c11367269 ] So that of_find_net_device_by_node() can find CPSW ports and other DSA switches can be stacked downstream. Tested in conjunction with KSZ8873. Reviewed-by: Siddharth Vadapalli Reviewed-by: Andrew Lunn Signed-off-by: Alexander Sverdlin Link: https://patch.msgid.link/20250303074703.1758297-1-alexander.sverdlin@siemens.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/ti/cpsw_new.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/ethernet/ti/cpsw_new.c b/drivers/net/ethernet/ti/cpsw_new.c index 557cc71b9dd22..0eee1a0527b5c 100644 --- a/drivers/net/ethernet/ti/cpsw_new.c +++ b/drivers/net/ethernet/ti/cpsw_new.c @@ -1417,6 +1417,7 @@ static int cpsw_create_ports(struct cpsw_common *cpsw) ndev->netdev_ops = &cpsw_netdev_ops; ndev->ethtool_ops = &cpsw_ethtool_ops; SET_NETDEV_DEV(ndev, dev); + ndev->dev.of_node = slave_data->slave_node; if (!napi_ndev) { /* CPSW Host port CPDMA interface is shared between -- GitLab From ebaed867bfd1ef1b56523b940cc1a437f74ef857 Mon Sep 17 00:00:00 2001 From: Andrei Botila Date: Fri, 28 Feb 2025 17:43:19 +0200 Subject: [PATCH 0243/2211] net: phy: nxp-c45-tja11xx: add match_phy_device to TJA1103/TJA1104 [ Upstream commit a06a868a0cd96bc51401cdea897313a3f6ad01a0 ] Add .match_phy_device for the existing TJAs to differentiate between TJA1103 and TJA1104. TJA1103 and TJA1104 share the same PHY_ID but TJA1104 has MACsec capabilities while TJA1103 doesn't. Signed-off-by: Andrei Botila Reviewed-by: Andrew Lunn Link: https://patch.msgid.link/20250228154320.2979000-2-andrei.botila@oss.nxp.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/phy/nxp-c45-tja11xx.c | 54 +++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/drivers/net/phy/nxp-c45-tja11xx.c b/drivers/net/phy/nxp-c45-tja11xx.c index 9788b820c6be7..99a5eee77bec1 100644 --- a/drivers/net/phy/nxp-c45-tja11xx.c +++ b/drivers/net/phy/nxp-c45-tja11xx.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 /* NXP C45 PHY driver - * Copyright 2021-2023 NXP + * Copyright 2021-2025 NXP * Author: Radu Pirea */ @@ -18,6 +18,8 @@ #include "nxp-c45-tja11xx.h" +#define PHY_ID_MASK GENMASK(31, 4) +/* Same id: TJA1103, TJA1104 */ #define PHY_ID_TJA_1103 0x001BB010 #define PHY_ID_TJA_1120 0x001BB031 @@ -1930,6 +1932,30 @@ static void tja1120_nmi_handler(struct phy_device *phydev, } } +static int nxp_c45_macsec_ability(struct phy_device *phydev) +{ + bool macsec_ability; + int phy_abilities; + + phy_abilities = phy_read_mmd(phydev, MDIO_MMD_VEND1, + VEND1_PORT_ABILITIES); + macsec_ability = !!(phy_abilities & MACSEC_ABILITY); + + return macsec_ability; +} + +static int tja1103_match_phy_device(struct phy_device *phydev) +{ + return phy_id_compare(phydev->phy_id, PHY_ID_TJA_1103, PHY_ID_MASK) && + !nxp_c45_macsec_ability(phydev); +} + +static int tja1104_match_phy_device(struct phy_device *phydev) +{ + return phy_id_compare(phydev->phy_id, PHY_ID_TJA_1103, PHY_ID_MASK) && + nxp_c45_macsec_ability(phydev); +} + static const struct nxp_c45_regmap tja1120_regmap = { .vend1_ptp_clk_period = 0x1020, .vend1_event_msg_filt = 0x9010, @@ -2000,7 +2026,6 @@ static const struct nxp_c45_phy_data tja1120_phy_data = { static struct phy_driver nxp_c45_driver[] = { { - PHY_ID_MATCH_MODEL(PHY_ID_TJA_1103), .name = "NXP C45 TJA1103", .get_features = nxp_c45_get_features, .driver_data = &tja1103_phy_data, @@ -2022,6 +2047,31 @@ static struct phy_driver nxp_c45_driver[] = { .get_sqi = nxp_c45_get_sqi, .get_sqi_max = nxp_c45_get_sqi_max, .remove = nxp_c45_remove, + .match_phy_device = tja1103_match_phy_device, + }, + { + .name = "NXP C45 TJA1104", + .get_features = nxp_c45_get_features, + .driver_data = &tja1103_phy_data, + .probe = nxp_c45_probe, + .soft_reset = nxp_c45_soft_reset, + .config_aneg = genphy_c45_config_aneg, + .config_init = nxp_c45_config_init, + .config_intr = tja1103_config_intr, + .handle_interrupt = nxp_c45_handle_interrupt, + .read_status = genphy_c45_read_status, + .suspend = genphy_c45_pma_suspend, + .resume = genphy_c45_pma_resume, + .get_sset_count = nxp_c45_get_sset_count, + .get_strings = nxp_c45_get_strings, + .get_stats = nxp_c45_get_stats, + .cable_test_start = nxp_c45_cable_test_start, + .cable_test_get_status = nxp_c45_cable_test_get_status, + .set_loopback = genphy_c45_loopback, + .get_sqi = nxp_c45_get_sqi, + .get_sqi_max = nxp_c45_get_sqi_max, + .remove = nxp_c45_remove, + .match_phy_device = tja1104_match_phy_device, }, { PHY_ID_MATCH_MODEL(PHY_ID_TJA_1120), -- GitLab From c4f025a58eef14983b424b95f7bafdc5602b79a2 Mon Sep 17 00:00:00 2001 From: Jiasheng Jiang Date: Fri, 28 Feb 2025 15:02:10 +0000 Subject: [PATCH 0244/2211] dpll: Add an assertion to check freq_supported_num [ Upstream commit 39e912a959c19338855b768eaaee2917d7841f71 ] Since the driver is broken in the case that src->freq_supported is not NULL but src->freq_supported_num is 0, add an assertion for it. Signed-off-by: Jiasheng Jiang Reviewed-by: Jiri Pirko Reviewed-by: Vadim Fedorenko Reviewed-by: Arkadiusz Kubalewski Link: https://patch.msgid.link/20250228150210.34404-1-jiashengjiangcool@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/dpll/dpll_core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/dpll/dpll_core.c b/drivers/dpll/dpll_core.c index 1877201d1aa9f..20bdc52f63a50 100644 --- a/drivers/dpll/dpll_core.c +++ b/drivers/dpll/dpll_core.c @@ -443,8 +443,11 @@ static void dpll_pin_prop_free(struct dpll_pin_properties *prop) static int dpll_pin_prop_dup(const struct dpll_pin_properties *src, struct dpll_pin_properties *dst) { + if (WARN_ON(src->freq_supported && !src->freq_supported_num)) + return -EINVAL; + memcpy(dst, src, sizeof(*dst)); - if (src->freq_supported && src->freq_supported_num) { + if (src->freq_supported) { size_t freq_size = src->freq_supported_num * sizeof(*src->freq_supported); dst->freq_supported = kmemdup(src->freq_supported, -- GitLab From af73c8fd7388df67be2bd721510f4f3853101fb4 Mon Sep 17 00:00:00 2001 From: Uday Shankar Date: Fri, 28 Feb 2025 21:31:48 -0700 Subject: [PATCH 0245/2211] ublk: enforce ublks_max only for unprivileged devices [ Upstream commit 80bdfbb3545b6f16680a72c825063d08a6b44c7a ] Commit 403ebc877832 ("ublk_drv: add module parameter of ublks_max for limiting max allowed ublk dev"), claimed ublks_max was added to prevent a DoS situation with an untrusted user creating too many ublk devices. If that's the case, ublks_max should only restrict the number of unprivileged ublk devices in the system. Enforce the limit only for unprivileged ublk devices, and rename variables accordingly. Leave the external-facing parameter name unchanged, since changing it may break systems which use it (but still update its documentation to reflect its new meaning). As a result of this change, in a system where there are only normal (non-unprivileged) devices, the maximum number of such devices is increased to 1 << MINORBITS, or 1048576. That ought to be enough for anyone, right? Signed-off-by: Uday Shankar Reviewed-by: Ming Lei Link: https://lore.kernel.org/r/20250228-ublks_max-v1-1-04b7379190c0@purestorage.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/block/ublk_drv.c | 42 ++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 38b9e485e520d..5ec5d580ef506 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -484,15 +484,17 @@ static wait_queue_head_t ublk_idr_wq; /* wait until one idr is freed */ static DEFINE_MUTEX(ublk_ctl_mutex); + +#define UBLK_MAX_UBLKS UBLK_MINORS + /* - * Max ublk devices allowed to add + * Max unprivileged ublk devices allowed to add * * It can be extended to one per-user limit in future or even controlled * by cgroup. */ -#define UBLK_MAX_UBLKS UBLK_MINORS -static unsigned int ublks_max = 64; -static unsigned int ublks_added; /* protected by ublk_ctl_mutex */ +static unsigned int unprivileged_ublks_max = 64; +static unsigned int unprivileged_ublks_added; /* protected by ublk_ctl_mutex */ static struct miscdevice ublk_misc; @@ -2203,7 +2205,8 @@ static int ublk_add_chdev(struct ublk_device *ub) if (ret) goto fail; - ublks_added++; + if (ub->dev_info.flags & UBLK_F_UNPRIVILEGED_DEV) + unprivileged_ublks_added++; return 0; fail: put_device(dev); @@ -2241,12 +2244,17 @@ static int ublk_add_tag_set(struct ublk_device *ub) static void ublk_remove(struct ublk_device *ub) { + bool unprivileged; + ublk_stop_dev(ub); cancel_work_sync(&ub->stop_work); cancel_work_sync(&ub->quiesce_work); cdev_device_del(&ub->cdev, &ub->cdev_dev); + unprivileged = ub->dev_info.flags & UBLK_F_UNPRIVILEGED_DEV; ublk_put_device(ub); - ublks_added--; + + if (unprivileged) + unprivileged_ublks_added--; } static struct ublk_device *ublk_get_device_from_id(int idx) @@ -2495,7 +2503,8 @@ static int ublk_ctrl_add_dev(struct io_uring_cmd *cmd) return ret; ret = -EACCES; - if (ublks_added >= ublks_max) + if ((info.flags & UBLK_F_UNPRIVILEGED_DEV) && + unprivileged_ublks_added >= unprivileged_ublks_max) goto out_unlock; ret = -ENOMEM; @@ -3123,23 +3132,26 @@ static void __exit ublk_exit(void) module_init(ublk_init); module_exit(ublk_exit); -static int ublk_set_max_ublks(const char *buf, const struct kernel_param *kp) +static int ublk_set_max_unprivileged_ublks(const char *buf, + const struct kernel_param *kp) { return param_set_uint_minmax(buf, kp, 0, UBLK_MAX_UBLKS); } -static int ublk_get_max_ublks(char *buf, const struct kernel_param *kp) +static int ublk_get_max_unprivileged_ublks(char *buf, + const struct kernel_param *kp) { - return sysfs_emit(buf, "%u\n", ublks_max); + return sysfs_emit(buf, "%u\n", unprivileged_ublks_max); } -static const struct kernel_param_ops ublk_max_ublks_ops = { - .set = ublk_set_max_ublks, - .get = ublk_get_max_ublks, +static const struct kernel_param_ops ublk_max_unprivileged_ublks_ops = { + .set = ublk_set_max_unprivileged_ublks, + .get = ublk_get_max_unprivileged_ublks, }; -module_param_cb(ublks_max, &ublk_max_ublks_ops, &ublks_max, 0644); -MODULE_PARM_DESC(ublks_max, "max number of ublk devices allowed to add(default: 64)"); +module_param_cb(ublks_max, &ublk_max_unprivileged_ublks_ops, + &unprivileged_ublks_max, 0644); +MODULE_PARM_DESC(ublks_max, "max number of unprivileged ublk devices allowed to add(default: 64)"); MODULE_AUTHOR("Ming Lei "); MODULE_DESCRIPTION("Userspace block device"); -- GitLab From 4176d6f2a67b81a2e261bff3833de73aa84862c6 Mon Sep 17 00:00:00 2001 From: Yi Liu Date: Wed, 26 Feb 2025 02:40:12 -0800 Subject: [PATCH 0246/2211] iommufd: Disallow allocating nested parent domain with fault ID [ Upstream commit 1062d81086156e42878d701b816d2f368b53a77c ] Allocating a domain with a fault ID indicates that the domain is faultable. However, there is a gap for the nested parent domain to support PRI. Some hardware lacks the capability to distinguish whether PRI occurs at stage 1 or stage 2. This limitation may require software-based page table walking to resolve. Since no in-tree IOMMU driver currently supports this functionality, it is disallowed. For more details, refer to the related discussion at [1]. [1] https://lore.kernel.org/linux-iommu/bd1655c6-8b2f-4cfa-adb1-badc00d01811@intel.com/ Link: https://patch.msgid.link/r/20250226104012.82079-1-yi.l.liu@intel.com Suggested-by: Lu Baolu Signed-off-by: Yi Liu Reviewed-by: Kevin Tian Reviewed-by: Lu Baolu Signed-off-by: Jason Gunthorpe Signed-off-by: Sasha Levin --- drivers/iommu/iommufd/hw_pagetable.c | 3 +++ tools/testing/selftests/iommu/iommufd.c | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/drivers/iommu/iommufd/hw_pagetable.c b/drivers/iommu/iommufd/hw_pagetable.c index d06bf6e6c19fd..2454627a8b61b 100644 --- a/drivers/iommu/iommufd/hw_pagetable.c +++ b/drivers/iommu/iommufd/hw_pagetable.c @@ -122,6 +122,9 @@ iommufd_hwpt_paging_alloc(struct iommufd_ctx *ictx, struct iommufd_ioas *ioas, if ((flags & IOMMU_HWPT_ALLOC_DIRTY_TRACKING) && !device_iommu_capable(idev->dev, IOMMU_CAP_DIRTY_TRACKING)) return ERR_PTR(-EOPNOTSUPP); + if ((flags & IOMMU_HWPT_FAULT_ID_VALID) && + (flags & IOMMU_HWPT_ALLOC_NEST_PARENT)) + return ERR_PTR(-EOPNOTSUPP); hwpt_paging = __iommufd_object_alloc( ictx, hwpt_paging, IOMMUFD_OBJ_HWPT_PAGING, common.obj); diff --git a/tools/testing/selftests/iommu/iommufd.c b/tools/testing/selftests/iommu/iommufd.c index 4927b9add5add..06f252733660a 100644 --- a/tools/testing/selftests/iommu/iommufd.c +++ b/tools/testing/selftests/iommu/iommufd.c @@ -289,6 +289,10 @@ TEST_F(iommufd_ioas, alloc_hwpt_nested) &test_hwpt_id); test_err_hwpt_alloc(EINVAL, self->device_id, self->device_id, 0, &test_hwpt_id); + test_err_hwpt_alloc(EOPNOTSUPP, self->device_id, self->ioas_id, + IOMMU_HWPT_ALLOC_NEST_PARENT | + IOMMU_HWPT_FAULT_ID_VALID, + &test_hwpt_id); test_cmd_hwpt_alloc(self->device_id, self->ioas_id, IOMMU_HWPT_ALLOC_NEST_PARENT, -- GitLab From 8d7e13c31c52690655883dff604238b0760a3644 Mon Sep 17 00:00:00 2001 From: Paul Elder Date: Fri, 28 Feb 2025 18:17:31 +0900 Subject: [PATCH 0247/2211] media: imx335: Set vblank immediately [ Upstream commit c0aa40f45fef80b4182704d1bc089cbf8ae8bed0 ] When the vblank v4l2 control is set, it does not get written to the hardware unless exposure is also changed. Change the behavior such that the vblank is written immediately when the control is set, as setting the vblank without changing the exposure is a valid use case (such as for changing the frame rate). Signed-off-by: Paul Elder Reviewed-by: Kieran Bingham Signed-off-by: Sakari Ailus Signed-off-by: Hans Verkuil Signed-off-by: Sasha Levin --- drivers/media/i2c/imx335.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c index fcfd1d851bd4a..0beb80b8c4581 100644 --- a/drivers/media/i2c/imx335.c +++ b/drivers/media/i2c/imx335.c @@ -559,12 +559,14 @@ static int imx335_set_ctrl(struct v4l2_ctrl *ctrl) imx335->vblank, imx335->vblank + imx335->cur_mode->height); - return __v4l2_ctrl_modify_range(imx335->exp_ctrl, - IMX335_EXPOSURE_MIN, - imx335->vblank + - imx335->cur_mode->height - - IMX335_EXPOSURE_OFFSET, - 1, IMX335_EXPOSURE_DEFAULT); + ret = __v4l2_ctrl_modify_range(imx335->exp_ctrl, + IMX335_EXPOSURE_MIN, + imx335->vblank + + imx335->cur_mode->height - + IMX335_EXPOSURE_OFFSET, + 1, IMX335_EXPOSURE_DEFAULT); + if (ret) + return ret; } /* @@ -575,6 +577,13 @@ static int imx335_set_ctrl(struct v4l2_ctrl *ctrl) return 0; switch (ctrl->id) { + case V4L2_CID_VBLANK: + exposure = imx335->exp_ctrl->val; + analog_gain = imx335->again_ctrl->val; + + ret = imx335_update_exp_gain(imx335, exposure, analog_gain); + + break; case V4L2_CID_EXPOSURE: exposure = ctrl->val; analog_gain = imx335->again_ctrl->val; -- GitLab From f9d15ef2e069d509c3de590270a3fed9b67417b0 Mon Sep 17 00:00:00 2001 From: Peter Seiderer Date: Thu, 27 Feb 2025 14:56:00 +0100 Subject: [PATCH 0248/2211] net: pktgen: fix mpls maximum labels list parsing [ Upstream commit 2b15a0693f70d1e8119743ee89edbfb1271b3ea8 ] Fix mpls maximum labels list parsing up to MAX_MPLS_LABELS entries (instead of up to MAX_MPLS_LABELS - 1). Addresses the following: $ echo "mpls 00000f00,00000f01,00000f02,00000f03,00000f04,00000f05,00000f06,00000f07,00000f08,00000f09,00000f0a,00000f0b,00000f0c,00000f0d,00000f0e,00000f0f" > /proc/net/pktgen/lo\@0 -bash: echo: write error: Argument list too long Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/core/pktgen.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index b6db4910359bb..4d87da56c56a0 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -898,6 +898,10 @@ static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev) pkt_dev->nr_labels = 0; do { __u32 tmp; + + if (n >= MAX_MPLS_LABELS) + return -E2BIG; + len = hex32_arg(&buffer[i], 8, &tmp); if (len <= 0) return len; @@ -909,8 +913,6 @@ static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev) return -EFAULT; i++; n++; - if (n >= MAX_MPLS_LABELS) - return -E2BIG; } while (c == ','); pkt_dev->nr_labels = n; -- GitLab From 592ba27580364c635b920eb7eae7d060e72b7aa1 Mon Sep 17 00:00:00 2001 From: Saket Kumar Bhaskar Date: Mon, 3 Mar 2025 14:54:51 +0530 Subject: [PATCH 0249/2211] perf/hw_breakpoint: Return EOPNOTSUPP for unsupported breakpoint type [ Upstream commit 061c991697062f3bf87b72ed553d1d33a0e370dd ] Currently, __reserve_bp_slot() returns -ENOSPC for unsupported breakpoint types on the architecture. For example, powerpc does not support hardware instruction breakpoints. This causes the perf_skip BPF selftest to fail, as neither ENOENT nor EOPNOTSUPP is returned by perf_event_open for unsupported breakpoint types. As a result, the test that should be skipped for this arch is not correctly identified. To resolve this, hw_breakpoint_event_init() should exit early by checking for unsupported breakpoint types using hw_breakpoint_slots_cached() and return the appropriate error (-EOPNOTSUPP). Signed-off-by: Saket Kumar Bhaskar Signed-off-by: Ingo Molnar Cc: Marco Elver Cc: Dmitry Vyukov Cc: Ian Rogers Cc: Frederic Weisbecker Link: https://lore.kernel.org/r/20250303092451.1862862-1-skb99@linux.ibm.com Signed-off-by: Sasha Levin --- kernel/events/hw_breakpoint.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c index 6c2cb4e4f48da..8f3f624419aa9 100644 --- a/kernel/events/hw_breakpoint.c +++ b/kernel/events/hw_breakpoint.c @@ -950,9 +950,10 @@ static int hw_breakpoint_event_init(struct perf_event *bp) return -ENOENT; /* - * no branch sampling for breakpoint events + * Check if breakpoint type is supported before proceeding. + * Also, no branch sampling for breakpoint events. */ - if (has_branch_stack(bp)) + if (!hw_breakpoint_slots_cached(find_slot_idx(bp->attr.bp_type)) || has_branch_stack(bp)) return -EOPNOTSUPP; err = register_perf_hw_breakpoint(bp); -- GitLab From 500d22dbd966214cad9cfaed1d6f9e73689609de Mon Sep 17 00:00:00 2001 From: "Maciej S. Szmigiero" Date: Sun, 16 Feb 2025 22:31:03 +0100 Subject: [PATCH 0250/2211] ALSA: hda/realtek: Enable PC beep passthrough for HP EliteBook 855 G7 [ Upstream commit aa85822c611aef7cd4dc17d27121d43e21bb82f0 ] PC speaker works well on this platform in BIOS and in Linux until sound card drivers are loaded. Then it stops working. There seems to be a beep generator node at 0x1a in this CODEC (ALC269_TYPE_ALC215) but it seems to be only connected to capture mixers at nodes 0x22 and 0x23. If I unmute the mixer input for 0x1a at node 0x23 and start recording from its "ALC285 Analog" capture device I can clearly hear beeps in that recording. So the beep generator is indeed working properly, however I wasn't able to figure out any way to connect it to speakers. However, the bits in the "Passthrough Control" register (0x36) seems to work at least partially: by zeroing "B" and "h" and setting "S" I can at least make the PIT PC speaker output appear either in this laptop speakers or headphones (depending on whether they are connected or not). There are some caveats, however: * If the CODEC gets runtime-suspended the beeps stop so it needs HDA beep device for keeping it awake during beeping. * If the beep generator node is generating any beep the PC beep passthrough seems to be temporarily inhibited, so the HDA beep device has to be prevented from using the actual beep generator node - but the beep device is still necessary due to the previous point. * In contrast with other platforms here beep amplification has to be disabled otherwise the beeps output are WAY louder than they were on pure BIOS setup. Unless someone (from Realtek probably) knows how to make the beep generator node output appear in speakers / headphones using PC beep passthrough seems to be the only way to make PC speaker beeping actually work on this platform. Signed-off-by: Maciej S. Szmigiero Acked-by: kailang@realtek.com Link: https://patch.msgid.link/7461f695b4daed80f2fc4b1463ead47f04f9ad05.1739741254.git.mail@maciej.szmigiero.name Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- include/sound/hda_codec.h | 1 + sound/pci/hda/hda_beep.c | 15 +++++++++------ sound/pci/hda/patch_realtek.c | 34 +++++++++++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/include/sound/hda_codec.h b/include/sound/hda_codec.h index 575e55aa08ca9..c1fe6290d04dc 100644 --- a/include/sound/hda_codec.h +++ b/include/sound/hda_codec.h @@ -195,6 +195,7 @@ struct hda_codec { /* beep device */ struct hda_beep *beep; unsigned int beep_mode; + bool beep_just_power_on; /* widget capabilities cache */ u32 *wcaps; diff --git a/sound/pci/hda/hda_beep.c b/sound/pci/hda/hda_beep.c index e51d475725576..13a7d92e8d8d0 100644 --- a/sound/pci/hda/hda_beep.c +++ b/sound/pci/hda/hda_beep.c @@ -31,8 +31,9 @@ static void generate_tone(struct hda_beep *beep, int tone) beep->power_hook(beep, true); beep->playing = 1; } - snd_hda_codec_write(codec, beep->nid, 0, - AC_VERB_SET_BEEP_CONTROL, tone); + if (!codec->beep_just_power_on) + snd_hda_codec_write(codec, beep->nid, 0, + AC_VERB_SET_BEEP_CONTROL, tone); if (!tone && beep->playing) { beep->playing = 0; if (beep->power_hook) @@ -212,10 +213,12 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) struct hda_beep *beep; int err; - if (!snd_hda_get_bool_hint(codec, "beep")) - return 0; /* disabled explicitly by hints */ - if (codec->beep_mode == HDA_BEEP_MODE_OFF) - return 0; /* disabled by module option */ + if (!codec->beep_just_power_on) { + if (!snd_hda_get_bool_hint(codec, "beep")) + return 0; /* disabled explicitly by hints */ + if (codec->beep_mode == HDA_BEEP_MODE_OFF) + return 0; /* disabled by module option */ + } beep = kzalloc(sizeof(*beep), GFP_KERNEL); if (beep == NULL) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index db72c5fce9d18..0b243adac8cf4 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -28,6 +28,7 @@ #include #include "hda_local.h" #include "hda_auto_parser.h" +#include "hda_beep.h" #include "hda_jack.h" #include "hda_generic.h" #include "hda_component.h" @@ -7036,6 +7037,30 @@ static void alc285_fixup_hp_envy_x360(struct hda_codec *codec, } } +static void alc285_fixup_hp_beep(struct hda_codec *codec, + const struct hda_fixup *fix, int action) +{ + if (action == HDA_FIXUP_ACT_PRE_PROBE) { + codec->beep_just_power_on = true; + } else if (action == HDA_FIXUP_ACT_INIT) { +#ifdef CONFIG_SND_HDA_INPUT_BEEP + /* + * Just enable loopback to internal speaker and headphone jack. + * Disable amplification to get about the same beep volume as + * was on pure BIOS setup before loading the driver. + */ + alc_update_coef_idx(codec, 0x36, 0x7070, BIT(13)); + + snd_hda_enable_beep_device(codec, 1); + +#if !IS_ENABLED(CONFIG_INPUT_PCSPKR) + dev_warn_once(hda_codec_dev(codec), + "enable CONFIG_INPUT_PCSPKR to get PC beeps\n"); +#endif +#endif + } +} + /* for hda_fixup_thinkpad_acpi() */ #include "thinkpad_helper.c" @@ -7806,6 +7831,7 @@ enum { ALC285_FIXUP_HP_GPIO_LED, ALC285_FIXUP_HP_MUTE_LED, ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED, + ALC285_FIXUP_HP_BEEP_MICMUTE_LED, ALC236_FIXUP_HP_MUTE_LED_COEFBIT2, ALC236_FIXUP_HP_GPIO_LED, ALC236_FIXUP_HP_MUTE_LED, @@ -9395,6 +9421,12 @@ static const struct hda_fixup alc269_fixups[] = { .type = HDA_FIXUP_FUNC, .v.func = alc285_fixup_hp_spectre_x360_mute_led, }, + [ALC285_FIXUP_HP_BEEP_MICMUTE_LED] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc285_fixup_hp_beep, + .chained = true, + .chain_id = ALC285_FIXUP_HP_MUTE_LED, + }, [ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = { .type = HDA_FIXUP_FUNC, .v.func = alc236_fixup_hp_mute_led_coefbit2, @@ -10493,7 +10525,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT), - SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED), + SND_PCI_QUIRK(0x103c, 0x8760, "HP EliteBook 8{4,5}5 G7", ALC285_FIXUP_HP_BEEP_MICMUTE_LED), SND_PCI_QUIRK(0x103c, 0x876e, "HP ENVY x360 Convertible 13-ay0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS), SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED), SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED), -- GitLab From 3de322a98b365a7398d245d3de06971b3df1617f Mon Sep 17 00:00:00 2001 From: Nicolas Bouchinet Date: Mon, 24 Feb 2025 10:58:19 +0100 Subject: [PATCH 0251/2211] scsi: logging: Fix scsi_logging_level bounds [ Upstream commit 2cef5b4472c602e6c5a119aca869d9d4050586f3 ] Bound scsi_logging_level sysctl writings between SYSCTL_ZERO and SYSCTL_INT_MAX. The proc_handler has thus been updated to proc_dointvec_minmax. Signed-off-by: Nicolas Bouchinet Link: https://lore.kernel.org/r/20250224095826.16458-5-nicolas.bouchinet@clip-os.org Reviewed-by: Joel Granados Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/scsi_sysctl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/scsi_sysctl.c b/drivers/scsi/scsi_sysctl.c index 093774d775346..daa160459c9b3 100644 --- a/drivers/scsi/scsi_sysctl.c +++ b/drivers/scsi/scsi_sysctl.c @@ -17,7 +17,9 @@ static struct ctl_table scsi_table[] = { .data = &scsi_logging_level, .maxlen = sizeof(scsi_logging_level), .mode = 0644, - .proc_handler = proc_dointvec }, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_INT_MAX }, }; static struct ctl_table_header *scsi_table_header; -- GitLab From f33b310eac36a5dfc844bfc7d17f67440a32d170 Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Thu, 27 Feb 2025 20:23:27 -0800 Subject: [PATCH 0252/2211] ipv4: fib: Move fib_valid_key_len() to rtm_to_fib_config(). [ Upstream commit 254ba7e6032d3fc738050d500b0c1d8197af90ca ] fib_valid_key_len() is called in the beginning of fib_table_insert() or fib_table_delete() to check if the prefix length is valid. fib_table_insert() and fib_table_delete() are called from 3 paths - ip_rt_ioctl() - inet_rtm_newroute() / inet_rtm_delroute() - fib_magic() In the first ioctl() path, rtentry_to_fib_config() checks the prefix length with bad_mask(). Also, fib_magic() always passes the correct prefix: 32 or ifa->ifa_prefixlen, which is already validated. Let's move fib_valid_key_len() to the rtnetlink path, rtm_to_fib_config(). While at it, 2 direct returns in rtm_to_fib_config() are changed to goto to match other places in the same function Signed-off-by: Kuniyuki Iwashima Reviewed-by: Eric Dumazet Reviewed-by: David Ahern Link: https://patch.msgid.link/20250228042328.96624-12-kuniyu@amazon.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/ipv4/fib_frontend.c | 18 ++++++++++++++++-- net/ipv4/fib_trie.c | 22 ---------------------- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 793e6781399a4..5b7c41333d6fc 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c @@ -829,19 +829,33 @@ static int rtm_to_fib_config(struct net *net, struct sk_buff *skb, } } + if (cfg->fc_dst_len > 32) { + NL_SET_ERR_MSG(extack, "Invalid prefix length"); + err = -EINVAL; + goto errout; + } + + if (cfg->fc_dst_len < 32 && (ntohl(cfg->fc_dst) << cfg->fc_dst_len)) { + NL_SET_ERR_MSG(extack, "Invalid prefix for given prefix length"); + err = -EINVAL; + goto errout; + } + if (cfg->fc_nh_id) { if (cfg->fc_oif || cfg->fc_gw_family || cfg->fc_encap || cfg->fc_mp) { NL_SET_ERR_MSG(extack, "Nexthop specification and nexthop id are mutually exclusive"); - return -EINVAL; + err = -EINVAL; + goto errout; } } if (has_gw && has_via) { NL_SET_ERR_MSG(extack, "Nexthop configuration can not contain both GATEWAY and VIA"); - return -EINVAL; + err = -EINVAL; + goto errout; } if (!cfg->fc_table) diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 09e31757e96c7..cc86031d2050f 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c @@ -1193,22 +1193,6 @@ static int fib_insert_alias(struct trie *t, struct key_vector *tp, return 0; } -static bool fib_valid_key_len(u32 key, u8 plen, struct netlink_ext_ack *extack) -{ - if (plen > KEYLENGTH) { - NL_SET_ERR_MSG(extack, "Invalid prefix length"); - return false; - } - - if ((plen < KEYLENGTH) && (key << plen)) { - NL_SET_ERR_MSG(extack, - "Invalid prefix for given prefix length"); - return false; - } - - return true; -} - static void fib_remove_alias(struct trie *t, struct key_vector *tp, struct key_vector *l, struct fib_alias *old); @@ -1229,9 +1213,6 @@ int fib_table_insert(struct net *net, struct fib_table *tb, key = ntohl(cfg->fc_dst); - if (!fib_valid_key_len(key, plen, extack)) - return -EINVAL; - pr_debug("Insert table=%u %08x/%d\n", tb->tb_id, key, plen); fi = fib_create_info(cfg, extack); @@ -1723,9 +1704,6 @@ int fib_table_delete(struct net *net, struct fib_table *tb, key = ntohl(cfg->fc_dst); - if (!fib_valid_key_len(key, plen, extack)) - return -EINVAL; - l = fib_find_node(t, &tp, key); if (!l) return -ESRCH; -- GitLab From f7226dedac039dfb436f3e8999aa493d216801dc Mon Sep 17 00:00:00 2001 From: Andy Yan Date: Mon, 3 Mar 2025 11:44:17 +0800 Subject: [PATCH 0253/2211] drm/rockchip: vop2: Add uv swap for cluster window [ Upstream commit e7aae9f6d762139f8d2b86db03793ae0ab3dd802 ] The Cluster windows of upcoming VOP on rk3576 also support linear YUV support, we need to set uv swap bit for it. As the VOP2_WIN_UV_SWA register defined on rk3568/rk3588 is 0xffffffff, so this register will not be touched on these two platforms. Signed-off-by: Andy Yan Tested-by: Michael Riesch # on RK3568 Tested-by: Detlev Casanova Signed-off-by: Heiko Stuebner Link: https://patchwork.freedesktop.org/patch/msgid/20250303034436.192400-4-andyshrk@163.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 5880d87fe6b3a..2aab2a0956788 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -1432,10 +1432,8 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, rb_swap = vop2_win_rb_swap(fb->format->format); vop2_win_write(win, VOP2_WIN_RB_SWAP, rb_swap); - if (!vop2_cluster_window(win)) { - uv_swap = vop2_win_uv_swap(fb->format->format); - vop2_win_write(win, VOP2_WIN_UV_SWAP, uv_swap); - } + uv_swap = vop2_win_uv_swap(fb->format->format); + vop2_win_write(win, VOP2_WIN_UV_SWAP, uv_swap); if (fb->format->is_yuv) { vop2_win_write(win, VOP2_WIN_UV_VIR, DIV_ROUND_UP(fb->pitches[1], 4)); -- GitLab From 564f03a7970c2c3695677d2f4bd3f1b0f23be3c1 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Tue, 25 Feb 2025 07:44:31 -0800 Subject: [PATCH 0254/2211] block: mark bounce buffering as incompatible with integrity [ Upstream commit 5fd0268a8806d35dcaf89139bfcda92be51b2b2f ] None of the few drivers still using the legacy block layer bounce buffering support integrity metadata. Explicitly mark the features as incompatible and stop creating the slab and mempool for integrity buffers for the bounce bio_set. Signed-off-by: Christoph Hellwig Reviewed-by: Anuj Gupta Reviewed-by: Martin K. Petersen Reviewed-by: Hannes Reinecke Reviewed-by: Johannes Thumshirn Link: https://lore.kernel.org/r/20250225154449.422989-2-hch@lst.de Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- block/blk-settings.c | 5 +++++ block/bounce.c | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/block/blk-settings.c b/block/blk-settings.c index 1e63e3dd54402..7858c92b44834 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -124,6 +124,11 @@ static int blk_validate_integrity_limits(struct queue_limits *lim) return 0; } + if (lim->features & BLK_FEAT_BOUNCE_HIGH) { + pr_warn("no bounce buffer support for integrity metadata\n"); + return -EINVAL; + } + if (!IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY)) { pr_warn("integrity support disabled.\n"); return -EINVAL; diff --git a/block/bounce.c b/block/bounce.c index 0d898cd5ec497..09a9616cf2094 100644 --- a/block/bounce.c +++ b/block/bounce.c @@ -41,8 +41,6 @@ static void init_bounce_bioset(void) ret = bioset_init(&bounce_bio_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS); BUG_ON(ret); - if (bioset_integrity_create(&bounce_bio_set, BIO_POOL_SIZE)) - BUG_ON(1); ret = bioset_init(&bounce_bio_split, BIO_POOL_SIZE, 0, 0); BUG_ON(ret); -- GitLab From 82209faa87f4aa36140039600714379233af290f Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 25 Feb 2025 14:24:55 -0700 Subject: [PATCH 0255/2211] ublk: complete command synchronously on error [ Upstream commit 603f9be21c1894e462416e3324962d6c9c2b95f8 ] In case of an error, ublk's ->uring_cmd() functions currently return -EIOCBQUEUED and immediately call io_uring_cmd_done(). -EIOCBQUEUED and io_uring_cmd_done() are intended for asynchronous completions. For synchronous completions, the ->uring_cmd() function can just return the negative return code directly. This skips io_uring_cmd_del_cancelable(), and deferring the completion to task work. So return the error code directly from __ublk_ch_uring_cmd() and ublk_ctrl_uring_cmd(). Update ublk_ch_uring_cmd_cb(), which currently ignores the return value from __ublk_ch_uring_cmd(), to call io_uring_cmd_done() for synchronous completions. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei Reviewed-by: Keith Busch Link: https://lore.kernel.org/r/20250225212456.2902549-1-csander@purestorage.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/block/ublk_drv.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 5ec5d580ef506..a01a547c562f3 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -1881,10 +1881,9 @@ static int __ublk_ch_uring_cmd(struct io_uring_cmd *cmd, return -EIOCBQUEUED; out: - io_uring_cmd_done(cmd, ret, 0, issue_flags); pr_devel("%s: complete: cmd op %d, tag %d ret %x io_flags %x\n", __func__, cmd_op, tag, ret, io->flags); - return -EIOCBQUEUED; + return ret; } static inline struct request *__ublk_check_and_get_req(struct ublk_device *ub, @@ -1940,7 +1939,10 @@ static inline int ublk_ch_uring_cmd_local(struct io_uring_cmd *cmd, static void ublk_ch_uring_cmd_cb(struct io_uring_cmd *cmd, unsigned int issue_flags) { - ublk_ch_uring_cmd_local(cmd, issue_flags); + int ret = ublk_ch_uring_cmd_local(cmd, issue_flags); + + if (ret != -EIOCBQUEUED) + io_uring_cmd_done(cmd, ret, 0, issue_flags); } static int ublk_ch_uring_cmd(struct io_uring_cmd *cmd, unsigned int issue_flags) @@ -3065,10 +3067,9 @@ static int ublk_ctrl_uring_cmd(struct io_uring_cmd *cmd, if (ub) ublk_put_device(ub); out: - io_uring_cmd_done(cmd, ret, 0, issue_flags); pr_devel("%s: cmd done ret %d cmd_op %x, dev id %d qid %d\n", __func__, ret, cmd->cmd_op, header->dev_id, header->queue_id); - return -EIOCBQUEUED; + return ret; } static const struct file_operations ublk_ctl_fops = { -- GitLab From b98aad5e5ebf91f644401833b4015790e8880720 Mon Sep 17 00:00:00 2001 From: Ricardo Ribalda Date: Mon, 3 Feb 2025 11:55:51 +0000 Subject: [PATCH 0256/2211] media: uvcvideo: Add sanity check to uvc_ioctl_xu_ctrl_map [ Upstream commit 990262fdfce24d6055df9711424343d94d829e6a ] Do not process unknown data types. Tested-by: Yunke Cao Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda Link: https://lore.kernel.org/r/20250203-uvc-roi-v17-15-5900a9fed613@chromium.org Signed-off-by: Hans de Goede Signed-off-by: Hans Verkuil Signed-off-by: Sasha Levin --- drivers/media/usb/uvc/uvc_v4l2.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index 7bcd706281daf..cb7d9fb589fca 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -106,6 +106,12 @@ static int uvc_ioctl_xu_ctrl_map(struct uvc_video_chain *chain, struct uvc_control_mapping *map; int ret; + if (xmap->data_type > UVC_CTRL_DATA_TYPE_BITMASK) { + uvc_dbg(chain->dev, CONTROL, + "Unsupported UVC data type %u\n", xmap->data_type); + return -EINVAL; + } + map = kzalloc(sizeof(*map), GFP_KERNEL); if (map == NULL) return -ENOMEM; -- GitLab From 2d6231d5ce9b66cdb52c4d1a95d92a0ad5505515 Mon Sep 17 00:00:00 2001 From: Ricardo Ribalda Date: Mon, 3 Feb 2025 11:55:40 +0000 Subject: [PATCH 0257/2211] media: uvcvideo: Handle uvc menu translation inside uvc_get_le_value [ Upstream commit 9109a0b4cb10fd681e9c6e9a4497a6fec5b91c39 ] map->get() gets a value from an uvc_control in "UVC format" and converts it to a value that can be consumed by v4l2. Instead of using a special get function for V4L2_CTRL_TYPE_MENU, we were converting from uvc_get_le_value in two different places. Move the conversion to uvc_get_le_value(). Reviewed-by: Hans de Goede Tested-by: Yunke Cao Signed-off-by: Ricardo Ribalda Link: https://lore.kernel.org/r/20250203-uvc-roi-v17-4-5900a9fed613@chromium.org Signed-off-by: Hans de Goede Signed-off-by: Hans Verkuil Signed-off-by: Sasha Levin --- drivers/media/usb/uvc/uvc_ctrl.c | 77 +++++++++++++------------------- 1 file changed, 32 insertions(+), 45 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index 4837d8df9c038..58d1bc80253e8 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -862,6 +862,25 @@ static inline void uvc_clear_bit(u8 *data, int bit) data[bit >> 3] &= ~(1 << (bit & 7)); } +static s32 uvc_menu_to_v4l2_menu(struct uvc_control_mapping *mapping, s32 val) +{ + unsigned int i; + + for (i = 0; BIT(i) <= mapping->menu_mask; ++i) { + u32 menu_value; + + if (!test_bit(i, &mapping->menu_mask)) + continue; + + menu_value = uvc_mapping_get_menu_value(mapping, i); + + if (menu_value == val) + return i; + } + + return val; +} + /* * Extract the bit string specified by mapping->offset and mapping->size * from the little-endian data stored at 'data' and return the result as @@ -896,6 +915,16 @@ static s32 uvc_get_le_value(struct uvc_control_mapping *mapping, if (mapping->data_type == UVC_CTRL_DATA_TYPE_SIGNED) value |= -(value & (1 << (mapping->size - 1))); + /* If it is a menu, convert from uvc to v4l2. */ + if (mapping->v4l2_type != V4L2_CTRL_TYPE_MENU) + return value; + + switch (query) { + case UVC_GET_CUR: + case UVC_GET_DEF: + return uvc_menu_to_v4l2_menu(mapping, value); + } + return value; } @@ -1060,32 +1089,6 @@ static int uvc_ctrl_populate_cache(struct uvc_video_chain *chain, return 0; } -static s32 __uvc_ctrl_get_value(struct uvc_control_mapping *mapping, - const u8 *data) -{ - s32 value = mapping->get(mapping, UVC_GET_CUR, data); - - if (mapping->v4l2_type == V4L2_CTRL_TYPE_MENU) { - unsigned int i; - - for (i = 0; BIT(i) <= mapping->menu_mask; ++i) { - u32 menu_value; - - if (!test_bit(i, &mapping->menu_mask)) - continue; - - menu_value = uvc_mapping_get_menu_value(mapping, i); - - if (menu_value == value) { - value = i; - break; - } - } - } - - return value; -} - static int __uvc_ctrl_load_cur(struct uvc_video_chain *chain, struct uvc_control *ctrl) { @@ -1136,8 +1139,8 @@ static int __uvc_ctrl_get(struct uvc_video_chain *chain, if (ret < 0) return ret; - *value = __uvc_ctrl_get_value(mapping, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); + *value = mapping->get(mapping, UVC_GET_CUR, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); return 0; } @@ -1287,7 +1290,6 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, { struct uvc_control_mapping *master_map = NULL; struct uvc_control *master_ctrl = NULL; - unsigned int i; memset(v4l2_ctrl, 0, sizeof(*v4l2_ctrl)); v4l2_ctrl->id = mapping->id; @@ -1330,21 +1332,6 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, v4l2_ctrl->minimum = ffs(mapping->menu_mask) - 1; v4l2_ctrl->maximum = fls(mapping->menu_mask) - 1; v4l2_ctrl->step = 1; - - for (i = 0; BIT(i) <= mapping->menu_mask; ++i) { - u32 menu_value; - - if (!test_bit(i, &mapping->menu_mask)) - continue; - - menu_value = uvc_mapping_get_menu_value(mapping, i); - - if (menu_value == v4l2_ctrl->default_value) { - v4l2_ctrl->default_value = i; - break; - } - } - return 0; case V4L2_CTRL_TYPE_BOOLEAN: @@ -1627,7 +1614,7 @@ void uvc_ctrl_status_event(struct uvc_video_chain *chain, uvc_ctrl_set_handle(handle, ctrl, NULL); list_for_each_entry(mapping, &ctrl->info.mappings, list) { - s32 value = __uvc_ctrl_get_value(mapping, data); + s32 value = mapping->get(mapping, UVC_GET_CUR, data); /* * handle may be NULL here if the device sends auto-update -- GitLab From 0d232fa3b07690035da54836346898eab441a4ad Mon Sep 17 00:00:00 2001 From: Ahmad Fatoum Date: Tue, 18 Feb 2025 19:26:46 +0100 Subject: [PATCH 0258/2211] clk: imx8mp: inform CCF of maximum frequency of clocks [ Upstream commit 06a61b5cb6a8638fa8823cd09b17233b29696fa2 ] The IMX8MPCEC datasheet lists maximum frequencies allowed for different modules. Some of these limits are universal, but some depend on whether the SoC is operating in nominal or in overdrive mode. The imx8mp.dtsi currently assumes overdrive mode and configures some clocks in accordance with this. Boards wishing to make use of nominal mode will need to override some of the clock rates manually. As operating the clocks outside of their allowed range can lead to difficult to debug issues, it makes sense to register the maximum rates allowed in the driver, so the CCF can take them into account. Reviewed-by: Peng Fan Signed-off-by: Ahmad Fatoum Link: https://lore.kernel.org/r/20250218-imx8m-clk-v4-6-b7697dc2dcd0@pengutronix.de Signed-off-by: Abel Vesa Signed-off-by: Sasha Levin --- drivers/clk/imx/clk-imx8mp.c | 151 +++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) diff --git a/drivers/clk/imx/clk-imx8mp.c b/drivers/clk/imx/clk-imx8mp.c index fb18f507f1213..fe6dac70f1a15 100644 --- a/drivers/clk/imx/clk-imx8mp.c +++ b/drivers/clk/imx/clk-imx8mp.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -406,11 +407,151 @@ static const char * const imx8mp_clkout_sels[] = {"audio_pll1_out", "audio_pll2_ static struct clk_hw **hws; static struct clk_hw_onecell_data *clk_hw_data; +struct imx8mp_clock_constraints { + unsigned int clkid; + u32 maxrate; +}; + +/* + * Below tables are taken from IMX8MPCEC Rev. 2.1, 07/2023 + * Table 13. Maximum frequency of modules. + * Probable typos fixed are marked with a comment. + */ +static const struct imx8mp_clock_constraints imx8mp_clock_common_constraints[] = { + { IMX8MP_CLK_A53_DIV, 1000 * HZ_PER_MHZ }, + { IMX8MP_CLK_ENET_AXI, 266666667 }, /* Datasheet claims 266MHz */ + { IMX8MP_CLK_NAND_USDHC_BUS, 266666667 }, /* Datasheet claims 266MHz */ + { IMX8MP_CLK_MEDIA_APB, 200 * HZ_PER_MHZ }, + { IMX8MP_CLK_HDMI_APB, 133333333 }, /* Datasheet claims 133MHz */ + { IMX8MP_CLK_ML_AXI, 800 * HZ_PER_MHZ }, + { IMX8MP_CLK_AHB, 133333333 }, + { IMX8MP_CLK_IPG_ROOT, 66666667 }, + { IMX8MP_CLK_AUDIO_AHB, 400 * HZ_PER_MHZ }, + { IMX8MP_CLK_MEDIA_DISP2_PIX, 170 * HZ_PER_MHZ }, + { IMX8MP_CLK_DRAM_ALT, 666666667 }, + { IMX8MP_CLK_DRAM_APB, 200 * HZ_PER_MHZ }, + { IMX8MP_CLK_CAN1, 80 * HZ_PER_MHZ }, + { IMX8MP_CLK_CAN2, 80 * HZ_PER_MHZ }, + { IMX8MP_CLK_PCIE_AUX, 10 * HZ_PER_MHZ }, + { IMX8MP_CLK_I2C5, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_I2C6, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_SAI1, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_SAI2, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_SAI3, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_SAI5, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_SAI6, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_ENET_QOS, 125 * HZ_PER_MHZ }, + { IMX8MP_CLK_ENET_QOS_TIMER, 200 * HZ_PER_MHZ }, + { IMX8MP_CLK_ENET_REF, 125 * HZ_PER_MHZ }, + { IMX8MP_CLK_ENET_TIMER, 125 * HZ_PER_MHZ }, + { IMX8MP_CLK_ENET_PHY_REF, 125 * HZ_PER_MHZ }, + { IMX8MP_CLK_NAND, 500 * HZ_PER_MHZ }, + { IMX8MP_CLK_QSPI, 400 * HZ_PER_MHZ }, + { IMX8MP_CLK_USDHC1, 400 * HZ_PER_MHZ }, + { IMX8MP_CLK_USDHC2, 400 * HZ_PER_MHZ }, + { IMX8MP_CLK_I2C1, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_I2C2, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_I2C3, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_I2C4, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_UART1, 80 * HZ_PER_MHZ }, + { IMX8MP_CLK_UART2, 80 * HZ_PER_MHZ }, + { IMX8MP_CLK_UART3, 80 * HZ_PER_MHZ }, + { IMX8MP_CLK_UART4, 80 * HZ_PER_MHZ }, + { IMX8MP_CLK_ECSPI1, 80 * HZ_PER_MHZ }, + { IMX8MP_CLK_ECSPI2, 80 * HZ_PER_MHZ }, + { IMX8MP_CLK_PWM1, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_PWM2, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_PWM3, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_PWM4, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_GPT1, 100 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPT2, 100 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPT3, 100 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPT4, 100 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPT5, 100 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPT6, 100 * HZ_PER_MHZ }, + { IMX8MP_CLK_WDOG, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_IPP_DO_CLKO1, 200 * HZ_PER_MHZ }, + { IMX8MP_CLK_IPP_DO_CLKO2, 200 * HZ_PER_MHZ }, + { IMX8MP_CLK_HDMI_REF_266M, 266 * HZ_PER_MHZ }, + { IMX8MP_CLK_USDHC3, 400 * HZ_PER_MHZ }, + { IMX8MP_CLK_MEDIA_MIPI_PHY1_REF, 300 * HZ_PER_MHZ }, + { IMX8MP_CLK_MEDIA_DISP1_PIX, 250 * HZ_PER_MHZ }, + { IMX8MP_CLK_MEDIA_CAM2_PIX, 277 * HZ_PER_MHZ }, + { IMX8MP_CLK_MEDIA_LDB, 595 * HZ_PER_MHZ }, + { IMX8MP_CLK_MEDIA_MIPI_TEST_BYTE, 200 * HZ_PER_MHZ }, + { IMX8MP_CLK_ECSPI3, 80 * HZ_PER_MHZ }, + { IMX8MP_CLK_PDM, 200 * HZ_PER_MHZ }, + { IMX8MP_CLK_SAI7, 66666667 }, /* Datasheet claims 66MHz */ + { IMX8MP_CLK_MAIN_AXI, 400 * HZ_PER_MHZ }, + { /* Sentinel */ } +}; + +static const struct imx8mp_clock_constraints imx8mp_clock_nominal_constraints[] = { + { IMX8MP_CLK_M7_CORE, 600 * HZ_PER_MHZ }, + { IMX8MP_CLK_ML_CORE, 800 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPU3D_CORE, 800 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPU3D_SHADER_CORE, 800 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPU2D_CORE, 800 * HZ_PER_MHZ }, + { IMX8MP_CLK_AUDIO_AXI_SRC, 600 * HZ_PER_MHZ }, + { IMX8MP_CLK_HSIO_AXI, 400 * HZ_PER_MHZ }, + { IMX8MP_CLK_MEDIA_ISP, 400 * HZ_PER_MHZ }, + { IMX8MP_CLK_VPU_BUS, 600 * HZ_PER_MHZ }, + { IMX8MP_CLK_MEDIA_AXI, 400 * HZ_PER_MHZ }, + { IMX8MP_CLK_HDMI_AXI, 400 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPU_AXI, 600 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPU_AHB, 300 * HZ_PER_MHZ }, + { IMX8MP_CLK_NOC, 800 * HZ_PER_MHZ }, + { IMX8MP_CLK_NOC_IO, 600 * HZ_PER_MHZ }, + { IMX8MP_CLK_ML_AHB, 300 * HZ_PER_MHZ }, + { IMX8MP_CLK_VPU_G1, 600 * HZ_PER_MHZ }, + { IMX8MP_CLK_VPU_G2, 500 * HZ_PER_MHZ }, + { IMX8MP_CLK_MEDIA_CAM1_PIX, 400 * HZ_PER_MHZ }, + { IMX8MP_CLK_VPU_VC8000E, 400 * HZ_PER_MHZ }, /* Datasheet claims 500MHz */ + { IMX8MP_CLK_DRAM_CORE, 800 * HZ_PER_MHZ }, + { IMX8MP_CLK_GIC, 400 * HZ_PER_MHZ }, + { /* Sentinel */ } +}; + +static const struct imx8mp_clock_constraints imx8mp_clock_overdrive_constraints[] = { + { IMX8MP_CLK_M7_CORE, 800 * HZ_PER_MHZ}, + { IMX8MP_CLK_ML_CORE, 1000 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPU3D_CORE, 1000 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPU3D_SHADER_CORE, 1000 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPU2D_CORE, 1000 * HZ_PER_MHZ }, + { IMX8MP_CLK_AUDIO_AXI_SRC, 800 * HZ_PER_MHZ }, + { IMX8MP_CLK_HSIO_AXI, 500 * HZ_PER_MHZ }, + { IMX8MP_CLK_MEDIA_ISP, 500 * HZ_PER_MHZ }, + { IMX8MP_CLK_VPU_BUS, 800 * HZ_PER_MHZ }, + { IMX8MP_CLK_MEDIA_AXI, 500 * HZ_PER_MHZ }, + { IMX8MP_CLK_HDMI_AXI, 500 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPU_AXI, 800 * HZ_PER_MHZ }, + { IMX8MP_CLK_GPU_AHB, 400 * HZ_PER_MHZ }, + { IMX8MP_CLK_NOC, 1000 * HZ_PER_MHZ }, + { IMX8MP_CLK_NOC_IO, 800 * HZ_PER_MHZ }, + { IMX8MP_CLK_ML_AHB, 400 * HZ_PER_MHZ }, + { IMX8MP_CLK_VPU_G1, 800 * HZ_PER_MHZ }, + { IMX8MP_CLK_VPU_G2, 700 * HZ_PER_MHZ }, + { IMX8MP_CLK_MEDIA_CAM1_PIX, 500 * HZ_PER_MHZ }, + { IMX8MP_CLK_VPU_VC8000E, 500 * HZ_PER_MHZ }, /* Datasheet claims 400MHz */ + { IMX8MP_CLK_DRAM_CORE, 1000 * HZ_PER_MHZ }, + { IMX8MP_CLK_GIC, 500 * HZ_PER_MHZ }, + { /* Sentinel */ } +}; + +static void imx8mp_clocks_apply_constraints(const struct imx8mp_clock_constraints constraints[]) +{ + const struct imx8mp_clock_constraints *constr; + + for (constr = constraints; constr->clkid; constr++) + clk_hw_set_rate_range(hws[constr->clkid], 0, constr->maxrate); +} + static int imx8mp_clocks_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np; void __iomem *anatop_base, *ccm_base; + const char *opmode; int err; np = of_find_compatible_node(NULL, NULL, "fsl,imx8mp-anatop"); @@ -715,6 +856,16 @@ static int imx8mp_clocks_probe(struct platform_device *pdev) imx_check_clk_hws(hws, IMX8MP_CLK_END); + imx8mp_clocks_apply_constraints(imx8mp_clock_common_constraints); + + err = of_property_read_string(np, "fsl,operating-mode", &opmode); + if (!err) { + if (!strcmp(opmode, "nominal")) + imx8mp_clocks_apply_constraints(imx8mp_clock_nominal_constraints); + else if (!strcmp(opmode, "overdrive")) + imx8mp_clocks_apply_constraints(imx8mp_clock_overdrive_constraints); + } + err = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_hw_data); if (err < 0) { dev_err(dev, "failed to register hws for i.MX8MP\n"); -- GitLab From e7e30a4a37d1e5fd0bae01a51ef738c17606f9f8 Mon Sep 17 00:00:00 2001 From: Breno Leitao Date: Thu, 31 Oct 2024 04:06:17 -0700 Subject: [PATCH 0259/2211] x86/bugs: Make spectre user default depend on MITIGATION_SPECTRE_V2 [ Upstream commit 98fdaeb296f51ef08e727a7cc72e5b5c864c4f4d ] Change the default value of spectre v2 in user mode to respect the CONFIG_MITIGATION_SPECTRE_V2 config option. Currently, user mode spectre v2 is set to auto (SPECTRE_V2_USER_CMD_AUTO) by default, even if CONFIG_MITIGATION_SPECTRE_V2 is disabled. Set the spectre_v2 value to auto (SPECTRE_V2_USER_CMD_AUTO) if the Spectre v2 config (CONFIG_MITIGATION_SPECTRE_V2) is enabled, otherwise set the value to none (SPECTRE_V2_USER_CMD_NONE). Important to say the command line argument "spectre_v2_user" overwrites the default value in both cases. When CONFIG_MITIGATION_SPECTRE_V2 is not set, users have the flexibility to opt-in for specific mitigations independently. In this scenario, setting spectre_v2= will not enable spectre_v2_user=, and command line options spectre_v2_user and spectre_v2 are independent when CONFIG_MITIGATION_SPECTRE_V2=n. Signed-off-by: Breno Leitao Signed-off-by: Ingo Molnar Reviewed-by: Pawan Gupta Acked-by: Josh Poimboeuf Cc: Peter Zijlstra Cc: David Kaplan Link: https://lore.kernel.org/r/20241031-x86_bugs_last_v2-v2-2-b7ff1dab840e@debian.org Signed-off-by: Sasha Levin --- Documentation/admin-guide/kernel-parameters.txt | 2 ++ arch/x86/kernel/cpu/bugs.c | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index e691f75c97e7b..b5cb361485541 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -6261,6 +6261,8 @@ Selecting 'on' will also enable the mitigation against user space to user space task attacks. + Selecting specific mitigation does not force enable + user mitigations. Selecting 'off' will disable both the kernel and the user space protections. diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index c683abd640fde..0e9ab0b9a4942 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c @@ -1442,9 +1442,13 @@ static __ro_after_init enum spectre_v2_mitigation_cmd spectre_v2_cmd; static enum spectre_v2_user_cmd __init spectre_v2_parse_user_cmdline(void) { + enum spectre_v2_user_cmd mode; char arg[20]; int ret, i; + mode = IS_ENABLED(CONFIG_MITIGATION_SPECTRE_V2) ? + SPECTRE_V2_USER_CMD_AUTO : SPECTRE_V2_USER_CMD_NONE; + switch (spectre_v2_cmd) { case SPECTRE_V2_CMD_NONE: return SPECTRE_V2_USER_CMD_NONE; @@ -1457,7 +1461,7 @@ spectre_v2_parse_user_cmdline(void) ret = cmdline_find_option(boot_command_line, "spectre_v2_user", arg, sizeof(arg)); if (ret < 0) - return SPECTRE_V2_USER_CMD_AUTO; + return mode; for (i = 0; i < ARRAY_SIZE(v2_user_options); i++) { if (match_option(arg, ret, v2_user_options[i].option)) { @@ -1467,8 +1471,8 @@ spectre_v2_parse_user_cmdline(void) } } - pr_err("Unknown user space protection option (%s). Switching to AUTO select\n", arg); - return SPECTRE_V2_USER_CMD_AUTO; + pr_err("Unknown user space protection option (%s). Switching to default\n", arg); + return mode; } static inline bool spectre_v2_in_ibrs_mode(enum spectre_v2_mitigation mode) -- GitLab From cd62e9d42fe76265d545a0c340e1d7307ba45808 Mon Sep 17 00:00:00 2001 From: Alexander Stein Date: Mon, 10 Feb 2025 15:59:30 +0100 Subject: [PATCH 0260/2211] hwmon: (gpio-fan) Add missing mutex locks [ Upstream commit 9fee7d19bab635f89223cc40dfd2c8797fdc4988 ] set_fan_speed() is expected to be called with fan_data->lock being locked. Add locking for proper synchronization. Signed-off-by: Alexander Stein Link: https://lore.kernel.org/r/20250210145934.761280-3-alexander.stein@ew.tq-group.com Signed-off-by: Guenter Roeck Signed-off-by: Sasha Levin --- drivers/hwmon/gpio-fan.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/hwmon/gpio-fan.c b/drivers/hwmon/gpio-fan.c index d92c536be9af7..b779240328d59 100644 --- a/drivers/hwmon/gpio-fan.c +++ b/drivers/hwmon/gpio-fan.c @@ -393,7 +393,12 @@ static int gpio_fan_set_cur_state(struct thermal_cooling_device *cdev, if (state >= fan_data->num_speed) return -EINVAL; + mutex_lock(&fan_data->lock); + set_fan_speed(fan_data, state); + + mutex_unlock(&fan_data->lock); + return 0; } @@ -489,7 +494,11 @@ MODULE_DEVICE_TABLE(of, of_gpio_fan_match); static void gpio_fan_stop(void *data) { + struct gpio_fan_data *fan_data = data; + + mutex_lock(&fan_data->lock); set_fan_speed(data, 0); + mutex_unlock(&fan_data->lock); } static int gpio_fan_probe(struct platform_device *pdev) @@ -562,7 +571,9 @@ static int gpio_fan_suspend(struct device *dev) if (fan_data->gpios) { fan_data->resume_speed = fan_data->speed_index; + mutex_lock(&fan_data->lock); set_fan_speed(fan_data, 0); + mutex_unlock(&fan_data->lock); } return 0; @@ -572,8 +583,11 @@ static int gpio_fan_resume(struct device *dev) { struct gpio_fan_data *fan_data = dev_get_drvdata(dev); - if (fan_data->gpios) + if (fan_data->gpios) { + mutex_lock(&fan_data->lock); set_fan_speed(fan_data, fan_data->resume_speed); + mutex_unlock(&fan_data->lock); + } return 0; } -- GitLab From 89800836bf32f5b0c14734c64d804fe73e34744f Mon Sep 17 00:00:00 2001 From: Li Bin Date: Thu, 27 Feb 2025 08:51:56 -0700 Subject: [PATCH 0261/2211] ARM: at91: pm: fix at91_suspend_finish for ZQ calibration [ Upstream commit bc4722c3598d0e2c2dbf9609a3d3198993093e2b ] For sama7g5 and sama7d65 backup mode, we encountered a "ZQ calibrate error" during recalibrating the impedance in BootStrap. We found that the impedance value saved in at91_suspend_finish() before the DDR entered self-refresh mode did not match the resistor values. The ZDATA field in the DDR3PHY_ZQ0CR0 register uses a modified gray code to select the different impedance setting. But these gray code are incorrect, a workaournd from design team fixed the bug in the calibration logic. The ZDATA contains four independent impedance elements, but the algorithm combined the four elements into one. The elements were fixed using properly shifted offsets. Signed-off-by: Li Bin [nicolas.ferre@microchip.com: fix indentation and combine 2 patches] Signed-off-by: Nicolas Ferre Tested-by: Ryan Wanner Tested-by: Durai Manickam KR Tested-by: Andrei Simion Signed-off-by: Ryan Wanner Link: https://lore.kernel.org/r/28b33f9bcd0ca60ceba032969fe054d38f2b9577.1740671156.git.Ryan.Wanner@microchip.com Signed-off-by: Claudiu Beznea Signed-off-by: Sasha Levin --- arch/arm/mach-at91/pm.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 05a1547642b60..6c3e6aa22606f 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c @@ -545,11 +545,12 @@ extern u32 at91_pm_suspend_in_sram_sz; static int at91_suspend_finish(unsigned long val) { - unsigned char modified_gray_code[] = { - 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x04, 0x05, 0x0c, 0x0d, - 0x0e, 0x0f, 0x0a, 0x0b, 0x08, 0x09, 0x18, 0x19, 0x1a, 0x1b, - 0x1e, 0x1f, 0x1c, 0x1d, 0x14, 0x15, 0x16, 0x17, 0x12, 0x13, - 0x10, 0x11, + /* SYNOPSYS workaround to fix a bug in the calibration logic */ + unsigned char modified_fix_code[] = { + 0x00, 0x01, 0x01, 0x06, 0x07, 0x0c, 0x06, 0x07, 0x0b, 0x18, + 0x0a, 0x0b, 0x0c, 0x0d, 0x0d, 0x0a, 0x13, 0x13, 0x12, 0x13, + 0x14, 0x15, 0x15, 0x12, 0x18, 0x19, 0x19, 0x1e, 0x1f, 0x14, + 0x1e, 0x1f, }; unsigned int tmp, index; int i; @@ -560,25 +561,25 @@ static int at91_suspend_finish(unsigned long val) * restore the ZQ0SR0 with the value saved here. But the * calibration is buggy and restoring some values from ZQ0SR0 * is forbidden and risky thus we need to provide processed - * values for these (modified gray code values). + * values for these. */ tmp = readl(soc_pm.data.ramc_phy + DDR3PHY_ZQ0SR0); /* Store pull-down output impedance select. */ index = (tmp >> DDR3PHY_ZQ0SR0_PDO_OFF) & 0x1f; - soc_pm.bu->ddr_phy_calibration[0] = modified_gray_code[index]; + soc_pm.bu->ddr_phy_calibration[0] = modified_fix_code[index] << DDR3PHY_ZQ0SR0_PDO_OFF; /* Store pull-up output impedance select. */ index = (tmp >> DDR3PHY_ZQ0SR0_PUO_OFF) & 0x1f; - soc_pm.bu->ddr_phy_calibration[0] |= modified_gray_code[index]; + soc_pm.bu->ddr_phy_calibration[0] |= modified_fix_code[index] << DDR3PHY_ZQ0SR0_PUO_OFF; /* Store pull-down on-die termination impedance select. */ index = (tmp >> DDR3PHY_ZQ0SR0_PDODT_OFF) & 0x1f; - soc_pm.bu->ddr_phy_calibration[0] |= modified_gray_code[index]; + soc_pm.bu->ddr_phy_calibration[0] |= modified_fix_code[index] << DDR3PHY_ZQ0SR0_PDODT_OFF; /* Store pull-up on-die termination impedance select. */ index = (tmp >> DDR3PHY_ZQ0SRO_PUODT_OFF) & 0x1f; - soc_pm.bu->ddr_phy_calibration[0] |= modified_gray_code[index]; + soc_pm.bu->ddr_phy_calibration[0] |= modified_fix_code[index] << DDR3PHY_ZQ0SRO_PUODT_OFF; /* * The 1st 8 words of memory might get corrupted in the process -- GitLab From 7857d8977e9864fef9a61d98b3814dd71c64443f Mon Sep 17 00:00:00 2001 From: AngeloGioacchino Del Regno Date: Mon, 17 Feb 2025 16:47:58 +0100 Subject: [PATCH 0262/2211] drm/mediatek: mtk_dpi: Add checks for reg_h_fre_con existence [ Upstream commit 8c9da7cd0bbcc90ab444454fecf535320456a312 ] In preparation for adding support for newer DPI instances which do support direct-pin but do not have any H_FRE_CON register, like the one found in MT8195 and MT8188, add a branch to check if the reg_h_fre_con variable was declared in the mtk_dpi_conf structure for the probed SoC DPI version. As a note, this is useful specifically only for cases in which the support_direct_pin variable is true, so mt8195-dpintf is not affected by any issue. Reviewed-by: CK Hu Signed-off-by: AngeloGioacchino Del Regno Link: https://patchwork.kernel.org/project/dri-devel/patch/20250217154836.108895-6-angelogioacchino.delregno@collabora.com/ Signed-off-by: Chun-Kuang Hu Signed-off-by: Sasha Levin --- drivers/gpu/drm/mediatek/mtk_dpi.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c index 9c11d3158324c..20a50180d4d49 100644 --- a/drivers/gpu/drm/mediatek/mtk_dpi.c +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c @@ -410,12 +410,13 @@ static void mtk_dpi_config_swap_input(struct mtk_dpi *dpi, bool enable) static void mtk_dpi_config_2n_h_fre(struct mtk_dpi *dpi) { - mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, H_FRE_2N, H_FRE_2N); + if (dpi->conf->reg_h_fre_con) + mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, H_FRE_2N, H_FRE_2N); } static void mtk_dpi_config_disable_edge(struct mtk_dpi *dpi) { - if (dpi->conf->edge_sel_en) + if (dpi->conf->edge_sel_en && dpi->conf->reg_h_fre_con) mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, 0, EDGE_SEL_EN); } -- GitLab From b38fbf98645be29e53f02380fa679237f667fded Mon Sep 17 00:00:00 2001 From: Kuhanh Murugasen Krishnan Date: Thu, 13 Feb 2025 06:12:49 +0800 Subject: [PATCH 0263/2211] fpga: altera-cvp: Increase credit timeout [ Upstream commit 0f05886a40fdc55016ba4d9ae0a9c41f8312f15b ] Increase the timeout for SDM (Secure device manager) data credits from 20ms to 40ms. Internal stress tests running at 500 loops failed with the current timeout of 20ms. At the start of a FPGA configuration, the CVP host driver reads the transmit credits from SDM. It then sends bitstream FPGA data to SDM based on the total credits. Each credit allows the CVP host driver to send 4kBytes of data. There are situations whereby, the SDM did not respond in time during testing. Signed-off-by: Ang Tien Sung Signed-off-by: Kuhanh Murugasen Krishnan Acked-by: Xu Yilun Link: https://lore.kernel.org/r/20250212221249.2715929-1-tien.sung.ang@intel.com Signed-off-by: Xu Yilun Signed-off-by: Sasha Levin --- drivers/fpga/altera-cvp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/fpga/altera-cvp.c b/drivers/fpga/altera-cvp.c index 6b09144324453..5af0bd33890c0 100644 --- a/drivers/fpga/altera-cvp.c +++ b/drivers/fpga/altera-cvp.c @@ -52,7 +52,7 @@ /* V2 Defines */ #define VSE_CVP_TX_CREDITS 0x49 /* 8bit */ -#define V2_CREDIT_TIMEOUT_US 20000 +#define V2_CREDIT_TIMEOUT_US 40000 #define V2_CHECK_CREDIT_US 10 #define V2_POLL_TIMEOUT_US 1000000 #define V2_USER_TIMEOUT_US 500000 -- GitLab From e359d62886cb1d7224e331575d6ab07f97b7fb14 Mon Sep 17 00:00:00 2001 From: "Rob Herring (Arm)" Date: Tue, 18 Feb 2025 14:39:56 -0600 Subject: [PATCH 0264/2211] perf: arm_pmuv3: Call kvm_vcpu_pmu_resync_el0() before enabling counters [ Upstream commit 04bd15c4cbc3f7bd2399d1baab958c5e738dbfc9 ] Counting events related to setup of the PMU is not desired, but kvm_vcpu_pmu_resync_el0() is called just after the PMU counters have been enabled. Move the call to before enabling the counters. Signed-off-by: Rob Herring (Arm) Reviewed-by: Anshuman Khandual Tested-by: James Clark Link: https://lore.kernel.org/r/20250218-arm-brbe-v19-v20-1-4e9922fc2e8e@kernel.org Signed-off-by: Will Deacon Signed-off-by: Sasha Levin --- drivers/perf/arm_pmuv3.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/perf/arm_pmuv3.c b/drivers/perf/arm_pmuv3.c index 0afe02f879b45..d9b56f0f90942 100644 --- a/drivers/perf/arm_pmuv3.c +++ b/drivers/perf/arm_pmuv3.c @@ -816,10 +816,10 @@ static void armv8pmu_start(struct arm_pmu *cpu_pmu) else armv8pmu_disable_user_access(); + kvm_vcpu_pmu_resync_el0(); + /* Enable all counters */ armv8pmu_pmcr_write(armv8pmu_pmcr_read() | ARMV8_PMU_PMCR_E); - - kvm_vcpu_pmu_resync_el0(); } static void armv8pmu_stop(struct arm_pmu *cpu_pmu) -- GitLab From 92c6687ba951f311dc36c0bb7c62dd9b5fb9e244 Mon Sep 17 00:00:00 2001 From: Janne Grunau Date: Wed, 26 Feb 2025 19:00:05 +0000 Subject: [PATCH 0265/2211] soc: apple: rtkit: Use high prio work queue [ Upstream commit 22af2fac88fa5dbc310bfe7d0b66d4de3ac47305 ] rtkit messages as communication with the DCP firmware for framebuffer swaps or input events are time critical so use WQ_HIGHPRI to prevent user space CPU load to increase latency. With kwin_wayland 6's explicit sync mode user space load was able to delay the IOMFB rtkit communication enough to miss vsync for surface swaps. Minimal test scenario is constantly resizing a glxgears Xwayland window. Signed-off-by: Janne Grunau Reviewed-by: Alyssa Rosenzweig Link: https://lore.kernel.org/r/20250226-apple-soc-misc-v2-3-c3ec37f9021b@svenpeter.dev Signed-off-by: Sven Peter Signed-off-by: Sasha Levin --- drivers/soc/apple/rtkit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/soc/apple/rtkit.c b/drivers/soc/apple/rtkit.c index e6d940292c9fb..00d59a81db88b 100644 --- a/drivers/soc/apple/rtkit.c +++ b/drivers/soc/apple/rtkit.c @@ -667,7 +667,7 @@ struct apple_rtkit *apple_rtkit_init(struct device *dev, void *cookie, rtk->mbox->rx = apple_rtkit_rx; rtk->mbox->cookie = rtk; - rtk->wq = alloc_ordered_workqueue("rtkit-%s", WQ_MEM_RECLAIM, + rtk->wq = alloc_ordered_workqueue("rtkit-%s", WQ_HIGHPRI | WQ_MEM_RECLAIM, dev_name(rtk->dev)); if (!rtk->wq) { ret = -ENOMEM; -- GitLab From 1c2c538bbd60288f5de1a70de1789d8a00294336 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Wed, 26 Feb 2025 19:00:04 +0000 Subject: [PATCH 0266/2211] soc: apple: rtkit: Implement OSLog buffers properly [ Upstream commit a06398687065e0c334dc5fc4d2778b5b87292e43 ] Apparently nobody can figure out where the old logic came from, but it seems like it has never been actually used on any supported firmware to this day. OSLog buffers were apparently never requested. But starting with 13.3, we actually need this implemented properly for MTP (and later AOP) to work, so let's actually do that. Signed-off-by: Hector Martin Reviewed-by: Alyssa Rosenzweig Link: https://lore.kernel.org/r/20250226-apple-soc-misc-v2-2-c3ec37f9021b@svenpeter.dev Signed-off-by: Sven Peter Signed-off-by: Sasha Levin --- drivers/soc/apple/rtkit-internal.h | 1 + drivers/soc/apple/rtkit.c | 56 ++++++++++++++++++------------ 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/drivers/soc/apple/rtkit-internal.h b/drivers/soc/apple/rtkit-internal.h index 27c9fa745fd52..b8d5244678f01 100644 --- a/drivers/soc/apple/rtkit-internal.h +++ b/drivers/soc/apple/rtkit-internal.h @@ -44,6 +44,7 @@ struct apple_rtkit { struct apple_rtkit_shmem ioreport_buffer; struct apple_rtkit_shmem crashlog_buffer; + struct apple_rtkit_shmem oslog_buffer; struct apple_rtkit_shmem syslog_buffer; char *syslog_msg_buffer; diff --git a/drivers/soc/apple/rtkit.c b/drivers/soc/apple/rtkit.c index 00d59a81db88b..45ccbe2cbcd63 100644 --- a/drivers/soc/apple/rtkit.c +++ b/drivers/soc/apple/rtkit.c @@ -66,8 +66,9 @@ enum { #define APPLE_RTKIT_SYSLOG_MSG_SIZE GENMASK_ULL(31, 24) #define APPLE_RTKIT_OSLOG_TYPE GENMASK_ULL(63, 56) -#define APPLE_RTKIT_OSLOG_INIT 1 -#define APPLE_RTKIT_OSLOG_ACK 3 +#define APPLE_RTKIT_OSLOG_BUFFER_REQUEST 1 +#define APPLE_RTKIT_OSLOG_SIZE GENMASK_ULL(55, 36) +#define APPLE_RTKIT_OSLOG_IOVA GENMASK_ULL(35, 0) #define APPLE_RTKIT_MIN_SUPPORTED_VERSION 11 #define APPLE_RTKIT_MAX_SUPPORTED_VERSION 12 @@ -251,15 +252,21 @@ static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk, struct apple_rtkit_shmem *buffer, u8 ep, u64 msg) { - size_t n_4kpages = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg); u64 reply; int err; + /* The different size vs. IOVA shifts look odd but are indeed correct this way */ + if (ep == APPLE_RTKIT_EP_OSLOG) { + buffer->size = FIELD_GET(APPLE_RTKIT_OSLOG_SIZE, msg); + buffer->iova = FIELD_GET(APPLE_RTKIT_OSLOG_IOVA, msg) << 12; + } else { + buffer->size = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg) << 12; + buffer->iova = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg); + } + buffer->buffer = NULL; buffer->iomem = NULL; buffer->is_mapped = false; - buffer->iova = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg); - buffer->size = n_4kpages << 12; dev_dbg(rtk->dev, "RTKit: buffer request for 0x%zx bytes at %pad\n", buffer->size, &buffer->iova); @@ -284,11 +291,21 @@ static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk, } if (!buffer->is_mapped) { - reply = FIELD_PREP(APPLE_RTKIT_SYSLOG_TYPE, - APPLE_RTKIT_BUFFER_REQUEST); - reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, n_4kpages); - reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, - buffer->iova); + /* oslog uses different fields and needs a shifted IOVA instead of size */ + if (ep == APPLE_RTKIT_EP_OSLOG) { + reply = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE, + APPLE_RTKIT_OSLOG_BUFFER_REQUEST); + reply |= FIELD_PREP(APPLE_RTKIT_OSLOG_SIZE, buffer->size); + reply |= FIELD_PREP(APPLE_RTKIT_OSLOG_IOVA, + buffer->iova >> 12); + } else { + reply = FIELD_PREP(APPLE_RTKIT_SYSLOG_TYPE, + APPLE_RTKIT_BUFFER_REQUEST); + reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, + buffer->size >> 12); + reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, + buffer->iova); + } apple_rtkit_send_message(rtk, ep, reply, NULL, false); } @@ -482,25 +499,18 @@ static void apple_rtkit_syslog_rx(struct apple_rtkit *rtk, u64 msg) } } -static void apple_rtkit_oslog_rx_init(struct apple_rtkit *rtk, u64 msg) -{ - u64 ack; - - dev_dbg(rtk->dev, "RTKit: oslog init: msg: 0x%llx\n", msg); - ack = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE, APPLE_RTKIT_OSLOG_ACK); - apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_OSLOG, ack, NULL, false); -} - static void apple_rtkit_oslog_rx(struct apple_rtkit *rtk, u64 msg) { u8 type = FIELD_GET(APPLE_RTKIT_OSLOG_TYPE, msg); switch (type) { - case APPLE_RTKIT_OSLOG_INIT: - apple_rtkit_oslog_rx_init(rtk, msg); + case APPLE_RTKIT_OSLOG_BUFFER_REQUEST: + apple_rtkit_common_rx_get_buffer(rtk, &rtk->oslog_buffer, + APPLE_RTKIT_EP_OSLOG, msg); break; default: - dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n", msg); + dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n", + msg); } } @@ -710,6 +720,7 @@ int apple_rtkit_reinit(struct apple_rtkit *rtk) apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer); apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer); + apple_rtkit_free_buffer(rtk, &rtk->oslog_buffer); apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer); kfree(rtk->syslog_msg_buffer); @@ -890,6 +901,7 @@ void apple_rtkit_free(struct apple_rtkit *rtk) apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer); apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer); + apple_rtkit_free_buffer(rtk, &rtk->oslog_buffer); apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer); kfree(rtk->syslog_msg_buffer); -- GitLab From 7add9c10ca284b9ff599fa6a1faae3c357425db7 Mon Sep 17 00:00:00 2001 From: Vinith Kumar R Date: Fri, 22 Nov 2024 23:04:32 +0530 Subject: [PATCH 0267/2211] wifi: ath12k: Report proper tx completion status to mac80211 [ Upstream commit d2d9c9b8de725e1006d3aa3d18678a732f5d3584 ] Currently Tx completion for few exception packets are received from firmware and the tx status updated to mac80211. The tx status values of HAL_WBM_REL_HTT_TX_COMP_STATUS_DROP and HAL_WBM_REL_HTT_TX_COMP_STATUS_TTL are considered as tx failure and reported as tx failure to mac80211. But these failure status is due to internal firmware tx drop and these packets were not tried to transmit in the air. In case of mesh this invalid tx status report might trigger mpath broken issue due to increase in mpath fail average. So do not report these tx status as tx failure instead free the skb by calling ieee80211_free_txskb(), and that will be accounted as dropped frame. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Signed-off-by: Vinith Kumar R Signed-off-by: Tamizh Chelvam Raja Acked-by: Jeff Johnson Link: https://patch.msgid.link/20241122173432.2064858-1-quic_tamizhr@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/dp_tx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/dp_tx.c b/drivers/net/wireless/ath/ath12k/dp_tx.c index 44406e0b4a342..ad21fbfbcbe22 100644 --- a/drivers/net/wireless/ath/ath12k/dp_tx.c +++ b/drivers/net/wireless/ath/ath12k/dp_tx.c @@ -557,13 +557,13 @@ ath12k_dp_tx_process_htt_tx_complete(struct ath12k_base *ab, switch (wbm_status) { case HAL_WBM_REL_HTT_TX_COMP_STATUS_OK: - case HAL_WBM_REL_HTT_TX_COMP_STATUS_DROP: - case HAL_WBM_REL_HTT_TX_COMP_STATUS_TTL: ts.acked = (wbm_status == HAL_WBM_REL_HTT_TX_COMP_STATUS_OK); ts.ack_rssi = le32_get_bits(status_desc->info2, HTT_TX_WBM_COMP_INFO2_ACK_RSSI); ath12k_dp_tx_htt_tx_complete_buf(ab, msdu, tx_ring, &ts); break; + case HAL_WBM_REL_HTT_TX_COMP_STATUS_DROP: + case HAL_WBM_REL_HTT_TX_COMP_STATUS_TTL: case HAL_WBM_REL_HTT_TX_COMP_STATUS_REINJ: case HAL_WBM_REL_HTT_TX_COMP_STATUS_INSPECT: ath12k_dp_tx_free_txbuf(ab, msdu, mac_id, tx_ring); -- GitLab From 3ffaa2e999380477774e76680ff4cef247451168 Mon Sep 17 00:00:00 2001 From: Stanimir Varbanov Date: Mon, 24 Feb 2025 10:35:58 +0200 Subject: [PATCH 0268/2211] PCI: brcmstb: Expand inbound window size up to 64GB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 25a98c727015638baffcfa236e3f37b70cedcf87 ] The BCM2712 memory map can support up to 64GB of system memory, thus expand the inbound window size in calculation helper function. The change is safe for the currently supported SoCs that have smaller inbound window sizes. Signed-off-by: Stanimir Varbanov Reviewed-by: Florian Fainelli Reviewed-by: Jim Quinlan Tested-by: Ivan T. Ivanov Link: https://lore.kernel.org/r/20250224083559.47645-7-svarbanov@suse.de [kwilczynski: commit log] Signed-off-by: Krzysztof Wilczyński Signed-off-by: Sasha Levin --- drivers/pci/controller/pcie-brcmstb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c index 792d24cea5747..32ffb0c14c3ca 100644 --- a/drivers/pci/controller/pcie-brcmstb.c +++ b/drivers/pci/controller/pcie-brcmstb.c @@ -309,8 +309,8 @@ static int brcm_pcie_encode_ibar_size(u64 size) if (log2_in >= 12 && log2_in <= 15) /* Covers 4KB to 32KB (inclusive) */ return (log2_in - 12) + 0x1c; - else if (log2_in >= 16 && log2_in <= 35) - /* Covers 64KB to 32GB, (inclusive) */ + else if (log2_in >= 16 && log2_in <= 36) + /* Covers 64KB to 64GB, (inclusive) */ return log2_in - 15; /* Something is awry so disable */ return 0; -- GitLab From 12153e3948c596737853c3ec4ff7e4e3f4a9f9a6 Mon Sep 17 00:00:00 2001 From: Stanimir Varbanov Date: Mon, 24 Feb 2025 10:35:56 +0200 Subject: [PATCH 0269/2211] PCI: brcmstb: Add a softdep to MIP MSI-X driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 2294059118c550464dd8906286324d90c33b152b ] Then the brcmstb PCIe driver and MIP MSI-X interrupt controller drivers are built as modules there could be a race in probing. To avoid this, add a softdep to MIP driver to guarantee that MIP driver will be load first. Signed-off-by: Stanimir Varbanov Reviewed-by: Florian Fainelli Tested-by: Ivan T. Ivanov Link: https://lore.kernel.org/r/20250224083559.47645-5-svarbanov@suse.de [kwilczynski: commit log] Signed-off-by: Krzysztof Wilczyński Signed-off-by: Sasha Levin --- drivers/pci/controller/pcie-brcmstb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c index 32ffb0c14c3ca..81f085cebf627 100644 --- a/drivers/pci/controller/pcie-brcmstb.c +++ b/drivers/pci/controller/pcie-brcmstb.c @@ -1947,3 +1947,4 @@ module_platform_driver(brcm_pcie_driver); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Broadcom STB PCIe RC driver"); MODULE_AUTHOR("Broadcom"); +MODULE_SOFTDEP("pre: irq_bcm2712_mip"); -- GitLab From 3a3efeef64364c2a028cf0d03d68c831813a97fd Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Fri, 17 Jan 2025 15:35:52 +0530 Subject: [PATCH 0270/2211] firmware: arm_ffa: Set dma_mask for ffa devices [ Upstream commit cc0aac7ca17e0ea3ca84b552fc79f3e86fd07f53 ] Set dma_mask for FFA devices, otherwise DMA allocation using the device pointer lead to following warning: WARNING: CPU: 1 PID: 1 at kernel/dma/mapping.c:597 dma_alloc_attrs+0xe0/0x124 Signed-off-by: Viresh Kumar Message-Id: Signed-off-by: Sudeep Holla Signed-off-by: Sasha Levin --- drivers/firmware/arm_ffa/bus.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c index dfda5ffc14db7..dea3eb741d95d 100644 --- a/drivers/firmware/arm_ffa/bus.c +++ b/drivers/firmware/arm_ffa/bus.c @@ -212,6 +212,7 @@ ffa_device_register(const struct ffa_partition_info *part_info, dev = &ffa_dev->dev; dev->bus = &ffa_bus_type; dev->release = ffa_release_device; + dev->dma_mask = &dev->coherent_dma_mask; dev_set_name(&ffa_dev->dev, "arm-ffa-%d", id); ffa_dev->id = id; -- GitLab From df888ad55f8f8aaf22bbeafcee6bf7c27374bba3 Mon Sep 17 00:00:00 2001 From: Satyanarayana K V P Date: Mon, 24 Feb 2025 15:58:07 +0530 Subject: [PATCH 0271/2211] drm/xe/vf: Retry sending MMIO request to GUC on timeout error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit ba757a65d2a28d46a8ccf50538f4f05036983f1b ] Add support to allow retrying the sending of MMIO requests from the VF to the GUC in the event of an error. During the suspend/resume process, VFs begin resuming only after the PF has resumed. Although the PF resumes, the GUC reset and provisioning occur later in a separate worker process. When there are a large number of VFs, some may attempt to resume before the PF has completed its provisioning. Therefore, if a MMIO request from a VF fails during this period, we will retry sending the request up to GUC_RESET_VF_STATE_RETRY_MAX times, which is set to a maximum of 10 attempts. Signed-off-by: Satyanarayana K V P Cc: Michał Wajdeczko Cc: Michał Winiarski Cc: Piotr Piórkowski Reviewed-by: Piotr Piorkowski Signed-off-by: Michal Wajdeczko Link: https://patchwork.freedesktop.org/patch/msgid/20250224102807.11065-3-satyanarayana.k.v.p@intel.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c index f982d6f9f218d..7ddbfeaf494ac 100644 --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c @@ -46,12 +46,19 @@ static int guc_action_vf_reset(struct xe_guc *guc) return ret > 0 ? -EPROTO : ret; } +#define GUC_RESET_VF_STATE_RETRY_MAX 10 static int vf_reset_guc_state(struct xe_gt *gt) { + unsigned int retry = GUC_RESET_VF_STATE_RETRY_MAX; struct xe_guc *guc = >->uc.guc; int err; - err = guc_action_vf_reset(guc); + do { + err = guc_action_vf_reset(guc); + if (!err || err != -ETIMEDOUT) + break; + } while (--retry); + if (unlikely(err)) xe_gt_sriov_err(gt, "Failed to reset GuC state (%pe)\n", ERR_PTR(err)); return err; -- GitLab From 1f512005f497dab8fb62218a3256ce1547ad9d1a Mon Sep 17 00:00:00 2001 From: Satyanarayana K V P Date: Mon, 24 Feb 2025 15:58:06 +0530 Subject: [PATCH 0272/2211] drm/xe/pf: Create a link between PF and VF devices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 8c0aff7d92e2be25717669eb65a81a89740a24f2 ] When both PF and VF devices are enabled on the host, they resume simultaneously during system resume. However, the PF must finish provisioning the VF before any VFs can successfully resume. Establish a parent-child device link between the PF and VF devices to ensure the correct order of resumption. V4 -> V5: - Added missing break in the error condition. V3 -> V4: - Made xe_pci_pf_get_vf_dev() as a static function and updated input parameter types. - Updated xe_sriov_warn() to xe_sriov_abort() when VF device cannot be found. V2 -> V3: - Added function documentation for xe_pci_pf_get_vf_dev(). - Added assertion if not called from PF. V1 -> V2: - Added a helper function to get VF pci_dev. - Updated xe_sriov_notice() to xe_sriov_warn() if vf pci_dev is not found. Signed-off-by: Satyanarayana K V P Cc: Michał Wajdeczko Cc: Michał Winiarski Cc: Piotr Piórkowski Reviewed-by: Piotr Piorkowski Signed-off-by: Michal Wajdeczko Link: https://patchwork.freedesktop.org/patch/msgid/20250224102807.11065-2-satyanarayana.k.v.p@intel.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_pci_sriov.c | 51 +++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_pci_sriov.c b/drivers/gpu/drm/xe/xe_pci_sriov.c index aaceee748287e..09ee8a06fe2ed 100644 --- a/drivers/gpu/drm/xe/xe_pci_sriov.c +++ b/drivers/gpu/drm/xe/xe_pci_sriov.c @@ -62,6 +62,55 @@ static void pf_reset_vfs(struct xe_device *xe, unsigned int num_vfs) xe_gt_sriov_pf_control_trigger_flr(gt, n); } +static struct pci_dev *xe_pci_pf_get_vf_dev(struct xe_device *xe, unsigned int vf_id) +{ + struct pci_dev *pdev = to_pci_dev(xe->drm.dev); + + xe_assert(xe, IS_SRIOV_PF(xe)); + + /* caller must use pci_dev_put() */ + return pci_get_domain_bus_and_slot(pci_domain_nr(pdev->bus), + pdev->bus->number, + pci_iov_virtfn_devfn(pdev, vf_id)); +} + +static void pf_link_vfs(struct xe_device *xe, int num_vfs) +{ + struct pci_dev *pdev_pf = to_pci_dev(xe->drm.dev); + struct device_link *link; + struct pci_dev *pdev_vf; + unsigned int n; + + /* + * When both PF and VF devices are enabled on the host, during system + * resume they are resuming in parallel. + * + * But PF has to complete the provision of VF first to allow any VFs to + * successfully resume. + * + * Create a parent-child device link between PF and VF devices that will + * enforce correct resume order. + */ + for (n = 1; n <= num_vfs; n++) { + pdev_vf = xe_pci_pf_get_vf_dev(xe, n - 1); + + /* unlikely, something weird is happening, abort */ + if (!pdev_vf) { + xe_sriov_err(xe, "Cannot find VF%u device, aborting link%s creation!\n", + n, str_plural(num_vfs)); + break; + } + + link = device_link_add(&pdev_vf->dev, &pdev_pf->dev, + DL_FLAG_AUTOREMOVE_CONSUMER); + /* unlikely and harmless, continue with other VFs */ + if (!link) + xe_sriov_notice(xe, "Failed linking VF%u\n", n); + + pci_dev_put(pdev_vf); + } +} + static int pf_enable_vfs(struct xe_device *xe, int num_vfs) { struct pci_dev *pdev = to_pci_dev(xe->drm.dev); @@ -92,6 +141,8 @@ static int pf_enable_vfs(struct xe_device *xe, int num_vfs) if (err < 0) goto failed; + pf_link_vfs(xe, num_vfs); + xe_sriov_info(xe, "Enabled %u of %u VF%s\n", num_vfs, total_vfs, str_plural(total_vfs)); return num_vfs; -- GitLab From 11e721443c5647a2b1c005a598438890d8dcfd3b Mon Sep 17 00:00:00 2001 From: Moshe Shemesh Date: Wed, 26 Feb 2025 14:25:40 +0200 Subject: [PATCH 0273/2211] net/mlx5: Avoid report two health errors on same syndrome [ Upstream commit b5d7b2f04ebcff740f44ef4d295b3401aeb029f4 ] In case health counter has not increased for few polling intervals, miss counter will reach max misses threshold and health report will be triggered for FW health reporter. In case syndrome found on same health poll another health report will be triggered. Avoid two health reports on same syndrome by marking this syndrome as already known. Signed-off-by: Moshe Shemesh Reviewed-by: Shahar Shitrit Signed-off-by: Tariq Toukan Reviewed-by: Kalesh AP Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/health.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/health.c b/drivers/net/ethernet/mellanox/mlx5/core/health.c index a6329ca2d9bff..52c8035547be5 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/health.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/health.c @@ -799,6 +799,7 @@ static void poll_health(struct timer_list *t) health->prev = count; if (health->miss_counter == MAX_MISSES) { mlx5_core_err(dev, "device's health compromised - reached miss count\n"); + health->synd = ioread8(&h->synd); print_health_info(dev); queue_work(health->wq, &health->report_work); } -- GitLab From baaf3084c2cb92933c7ec29d584bccd1e9183a2a Mon Sep 17 00:00:00 2001 From: Kevin Krakauer Date: Wed, 26 Feb 2025 11:27:23 -0800 Subject: [PATCH 0274/2211] selftests/net: have `gro.sh -t` return a correct exit code [ Upstream commit 784e6abd99f24024a8998b5916795f0bec9d2fd9 ] Modify gro.sh to return a useful exit code when the -t flag is used. It formerly returned 0 no matter what. Tested: Ran `gro.sh -t large` and verified that test failures return 1. Signed-off-by: Kevin Krakauer Reviewed-by: Willem de Bruijn Link: https://patch.msgid.link/20250226192725.621969-2-krakauer@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- tools/testing/selftests/net/gro.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/gro.sh b/tools/testing/selftests/net/gro.sh index 02c21ff4ca81f..aabd6e5480b8e 100755 --- a/tools/testing/selftests/net/gro.sh +++ b/tools/testing/selftests/net/gro.sh @@ -100,5 +100,6 @@ trap cleanup EXIT if [[ "${test}" == "all" ]]; then run_all_tests else - run_test "${proto}" "${test}" + exit_code=$(run_test "${proto}" "${test}") + exit $exit_code fi; -- GitLab From 1dd943dfb56f86f65f624cad9fb1834a3cb717fe Mon Sep 17 00:00:00 2001 From: Inochi Amaoto Date: Tue, 11 Feb 2025 13:17:49 +0800 Subject: [PATCH 0275/2211] pinctrl: sophgo: avoid to modify untouched bit when setting cv1800 pinconf [ Upstream commit ef1a5121ae3da02372fcb66d9632ed3d47ad5637 ] When setting pinconf configuration for cv1800 SoC, the driver just writes the value. It may zero some bits of the pinconf register and cause some unexpected error. Add a mask to avoid this. Signed-off-by: Inochi Amaoto Link: https://lore.kernel.org/20250211051801.470800-2-inochiama@gmail.com Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/sophgo/pinctrl-cv18xx.c | 33 +++++++++++++++++-------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/drivers/pinctrl/sophgo/pinctrl-cv18xx.c b/drivers/pinctrl/sophgo/pinctrl-cv18xx.c index 57f2674e75d68..84b4850771ce2 100644 --- a/drivers/pinctrl/sophgo/pinctrl-cv18xx.c +++ b/drivers/pinctrl/sophgo/pinctrl-cv18xx.c @@ -574,10 +574,10 @@ static int cv1800_pinconf_compute_config(struct cv1800_pinctrl *pctrl, struct cv1800_pin *pin, unsigned long *configs, unsigned int num_configs, - u32 *value) + u32 *value, u32 *mask) { int i; - u32 v = 0; + u32 v = 0, m = 0; enum cv1800_pin_io_type type; int ret; @@ -596,10 +596,12 @@ static int cv1800_pinconf_compute_config(struct cv1800_pinctrl *pctrl, case PIN_CONFIG_BIAS_PULL_DOWN: v &= ~PIN_IO_PULLDOWN; v |= FIELD_PREP(PIN_IO_PULLDOWN, arg); + m |= PIN_IO_PULLDOWN; break; case PIN_CONFIG_BIAS_PULL_UP: v &= ~PIN_IO_PULLUP; v |= FIELD_PREP(PIN_IO_PULLUP, arg); + m |= PIN_IO_PULLUP; break; case PIN_CONFIG_DRIVE_STRENGTH_UA: ret = cv1800_pinctrl_oc2reg(pctrl, pin, arg); @@ -607,6 +609,7 @@ static int cv1800_pinconf_compute_config(struct cv1800_pinctrl *pctrl, return ret; v &= ~PIN_IO_DRIVE; v |= FIELD_PREP(PIN_IO_DRIVE, ret); + m |= PIN_IO_DRIVE; break; case PIN_CONFIG_INPUT_SCHMITT_UV: ret = cv1800_pinctrl_schmitt2reg(pctrl, pin, arg); @@ -614,6 +617,7 @@ static int cv1800_pinconf_compute_config(struct cv1800_pinctrl *pctrl, return ret; v &= ~PIN_IO_SCHMITT; v |= FIELD_PREP(PIN_IO_SCHMITT, ret); + m |= PIN_IO_SCHMITT; break; case PIN_CONFIG_POWER_SOURCE: /* Ignore power source as it is always fixed */ @@ -621,10 +625,12 @@ static int cv1800_pinconf_compute_config(struct cv1800_pinctrl *pctrl, case PIN_CONFIG_SLEW_RATE: v &= ~PIN_IO_OUT_FAST_SLEW; v |= FIELD_PREP(PIN_IO_OUT_FAST_SLEW, arg); + m |= PIN_IO_OUT_FAST_SLEW; break; case PIN_CONFIG_BIAS_BUS_HOLD: v &= ~PIN_IO_BUS_HOLD; v |= FIELD_PREP(PIN_IO_BUS_HOLD, arg); + m |= PIN_IO_BUS_HOLD; break; default: return -ENOTSUPP; @@ -632,17 +638,19 @@ static int cv1800_pinconf_compute_config(struct cv1800_pinctrl *pctrl, } *value = v; + *mask = m; return 0; } static int cv1800_pin_set_config(struct cv1800_pinctrl *pctrl, unsigned int pin_id, - u32 value) + u32 value, u32 mask) { struct cv1800_pin *pin = cv1800_get_pin(pctrl, pin_id); unsigned long flags; void __iomem *addr; + u32 reg; if (!pin) return -EINVAL; @@ -650,7 +658,10 @@ static int cv1800_pin_set_config(struct cv1800_pinctrl *pctrl, addr = cv1800_pinctrl_get_component_addr(pctrl, &pin->conf); raw_spin_lock_irqsave(&pctrl->lock, flags); - writel(value, addr); + reg = readl(addr); + reg &= ~mask; + reg |= value; + writel(reg, addr); raw_spin_unlock_irqrestore(&pctrl->lock, flags); return 0; @@ -662,16 +673,17 @@ static int cv1800_pconf_set(struct pinctrl_dev *pctldev, { struct cv1800_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); struct cv1800_pin *pin = cv1800_get_pin(pctrl, pin_id); - u32 value; + u32 value, mask; if (!pin) return -ENODEV; if (cv1800_pinconf_compute_config(pctrl, pin, - configs, num_configs, &value)) + configs, num_configs, + &value, &mask)) return -ENOTSUPP; - return cv1800_pin_set_config(pctrl, pin_id, value); + return cv1800_pin_set_config(pctrl, pin_id, value, mask); } static int cv1800_pconf_group_set(struct pinctrl_dev *pctldev, @@ -682,7 +694,7 @@ static int cv1800_pconf_group_set(struct pinctrl_dev *pctldev, struct cv1800_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); const struct group_desc *group; const struct cv1800_pin_mux_config *pinmuxs; - u32 value; + u32 value, mask; int i; group = pinctrl_generic_get_group(pctldev, gsel); @@ -692,11 +704,12 @@ static int cv1800_pconf_group_set(struct pinctrl_dev *pctldev, pinmuxs = group->data; if (cv1800_pinconf_compute_config(pctrl, pinmuxs[0].pin, - configs, num_configs, &value)) + configs, num_configs, + &value, &mask)) return -ENOTSUPP; for (i = 0; i < group->grp.npins; i++) - cv1800_pin_set_config(pctrl, group->grp.pins[i], value); + cv1800_pin_set_config(pctrl, group->grp.pins[i], value, mask); return 0; } -- GitLab From 0d8562e358176106d9a0a3c8932cf706119eccde Mon Sep 17 00:00:00 2001 From: Philip Yang Date: Mon, 17 Feb 2025 20:08:29 -0500 Subject: [PATCH 0276/2211] drm/amdkfd: KFD release_work possible circular locking [ Upstream commit 1b9366c601039d60546794c63fbb83ce8e53b978 ] If waiting for gpu reset done in KFD release_work, thers is WARNING: possible circular locking dependency detected #2 kfd_create_process kfd_process_mutex flush kfd release work #1 kfd release work wait for amdgpu reset work #0 amdgpu_device_gpu_reset kgd2kfd_pre_reset kfd_process_mutex Possible unsafe locking scenario: CPU0 CPU1 ---- ---- lock((work_completion)(&p->release_work)); lock((wq_completion)kfd_process_wq); lock((work_completion)(&p->release_work)); lock((wq_completion)amdgpu-reset-dev); To fix this, KFD create process move flush release work outside kfd_process_mutex. Signed-off-by: Philip Yang Reviewed-by: Felix Kuehling Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdkfd/kfd_process.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c index 0ec8b457494bd..45923da7709fd 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c @@ -842,6 +842,14 @@ struct kfd_process *kfd_create_process(struct task_struct *thread) return ERR_PTR(-EINVAL); } + /* If the process just called exec(3), it is possible that the + * cleanup of the kfd_process (following the release of the mm + * of the old process image) is still in the cleanup work queue. + * Make sure to drain any job before trying to recreate any + * resource for this process. + */ + flush_workqueue(kfd_process_wq); + /* * take kfd processes mutex before starting of process creation * so there won't be a case where two threads of the same process @@ -860,14 +868,6 @@ struct kfd_process *kfd_create_process(struct task_struct *thread) if (process) { pr_debug("Process already found\n"); } else { - /* If the process just called exec(3), it is possible that the - * cleanup of the kfd_process (following the release of the mm - * of the old process image) is still in the cleanup work queue. - * Make sure to drain any job before trying to recreate any - * resource for this process. - */ - flush_workqueue(kfd_process_wq); - process = create_process(thread); if (IS_ERR(process)) goto out; -- GitLab From b8fcb1cdbfc0c876a443d34ae3fe5154d6642715 Mon Sep 17 00:00:00 2001 From: Daniel Gomez Date: Mon, 24 Feb 2025 07:23:13 +0100 Subject: [PATCH 0277/2211] drm/xe: xe_gen_wa_oob: replace program_invocation_short_name [ Upstream commit 89eb42b5539f6ae6a0cabcb39e5b6fcc83c106a1 ] program_invocation_short_name may not be available in other systems. Instead, replace it with the argv[0] to pass the executable name. Fixes build error when program_invocation_short_name is not available: drivers/gpu/drm/xe/xe_gen_wa_oob.c:34:3: error: use of undeclared identifier 'program_invocation_short_name' 34 | program_invocation_short_name); | ^ 1 error generated. Suggested-by: Masahiro Yamada Signed-off-by: Daniel Gomez Reviewed-by: Lucas De Marchi Link: https://patchwork.freedesktop.org/patch/msgid/20250224-macos-build-support-xe-v3-1-d2c9ed3a27cc@samsung.com Signed-off-by: Lucas De Marchi Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_gen_wa_oob.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_gen_wa_oob.c b/drivers/gpu/drm/xe/xe_gen_wa_oob.c index 904cf47925aa1..ed9183599e31c 100644 --- a/drivers/gpu/drm/xe/xe_gen_wa_oob.c +++ b/drivers/gpu/drm/xe/xe_gen_wa_oob.c @@ -28,10 +28,10 @@ "\n" \ "#endif\n" -static void print_usage(FILE *f) +static void print_usage(FILE *f, const char *progname) { fprintf(f, "usage: %s \n", - program_invocation_short_name); + progname); } static void print_parse_error(const char *err_msg, const char *line, @@ -144,7 +144,7 @@ int main(int argc, const char *argv[]) if (argc < 3) { fprintf(stderr, "ERROR: wrong arguments\n"); - print_usage(stderr); + print_usage(stderr, argv[0]); return 1; } -- GitLab From 562b4f70bf88add47ef146e02bf972b9a8ab370d Mon Sep 17 00:00:00 2001 From: Yuanjun Gong Date: Sun, 23 Feb 2025 20:14:59 +0800 Subject: [PATCH 0278/2211] leds: pwm-multicolor: Add check for fwnode_property_read_u32 [ Upstream commit 6d91124e7edc109f114b1afe6d00d85d0d0ac174 ] Add a check to the return value of fwnode_property_read_u32() in case it fails. Signed-off-by: Yuanjun Gong Link: https://lore.kernel.org/r/20250223121459.2889484-1-ruc_gongyuanjun@163.com Signed-off-by: Lee Jones Signed-off-by: Sasha Levin --- drivers/leds/rgb/leds-pwm-multicolor.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/leds/rgb/leds-pwm-multicolor.c b/drivers/leds/rgb/leds-pwm-multicolor.c index e1a81e0109e8a..c0aa34b1d0e2d 100644 --- a/drivers/leds/rgb/leds-pwm-multicolor.c +++ b/drivers/leds/rgb/leds-pwm-multicolor.c @@ -135,8 +135,11 @@ static int led_pwm_mc_probe(struct platform_device *pdev) /* init the multicolor's LED class device */ cdev = &priv->mc_cdev.led_cdev; - fwnode_property_read_u32(mcnode, "max-brightness", + ret = fwnode_property_read_u32(mcnode, "max-brightness", &cdev->max_brightness); + if (ret) + goto release_mcnode; + cdev->flags = LED_CORE_SUSPENDRESUME; cdev->brightness_set_blocking = led_pwm_mc_set; -- GitLab From 459b3f7cf0dcfa7f4fa1b8ccab8a176e96ebcf48 Mon Sep 17 00:00:00 2001 From: Eric Woudstra Date: Tue, 25 Feb 2025 21:15:09 +0100 Subject: [PATCH 0279/2211] net: ethernet: mtk_ppe_offload: Allow QinQ, double ETH_P_8021Q only [ Upstream commit 7fe0353606d77a32c4c7f2814833dd1c043ebdd2 ] mtk_foe_entry_set_vlan() in mtk_ppe.c already supports double vlan tagging, but mtk_flow_offload_replace() in mtk_ppe_offload.c only allows for 1 vlan tag, optionally in combination with pppoe and dsa tags. However, mtk_foe_entry_set_vlan() only allows for setting the vlan id. The protocol cannot be set, it is always ETH_P_8021Q, for inner and outer tag. This patch adds QinQ support to mtk_flow_offload_replace(), only in the case that both inner and outer tags are ETH_P_8021Q. Only PPPoE-in-Q (as before) and Q-in-Q are allowed. A combination of PPPoE and Q-in-Q is not allowed. Signed-off-by: Eric Woudstra Link: https://patch.msgid.link/20250225201509.20843-1-ericwouds@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- .../net/ethernet/mediatek/mtk_ppe_offload.c | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c index f20bb390df3ad..c855fb799ce14 100644 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c @@ -34,8 +34,10 @@ struct mtk_flow_data { u16 vlan_in; struct { - u16 id; - __be16 proto; + struct { + u16 id; + __be16 proto; + } vlans[2]; u8 num; } vlan; struct { @@ -349,18 +351,19 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f, case FLOW_ACTION_CSUM: break; case FLOW_ACTION_VLAN_PUSH: - if (data.vlan.num == 1 || + if (data.vlan.num + data.pppoe.num == 2 || act->vlan.proto != htons(ETH_P_8021Q)) return -EOPNOTSUPP; - data.vlan.id = act->vlan.vid; - data.vlan.proto = act->vlan.proto; + data.vlan.vlans[data.vlan.num].id = act->vlan.vid; + data.vlan.vlans[data.vlan.num].proto = act->vlan.proto; data.vlan.num++; break; case FLOW_ACTION_VLAN_POP: break; case FLOW_ACTION_PPPOE_PUSH: - if (data.pppoe.num == 1) + if (data.pppoe.num == 1 || + data.vlan.num == 2) return -EOPNOTSUPP; data.pppoe.sid = act->pppoe.sid; @@ -450,12 +453,9 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f, if (offload_type == MTK_PPE_PKT_TYPE_BRIDGE) foe.bridge.vlan = data.vlan_in; - if (data.vlan.num == 1) { - if (data.vlan.proto != htons(ETH_P_8021Q)) - return -EOPNOTSUPP; + for (i = 0; i < data.vlan.num; i++) + mtk_foe_entry_set_vlan(eth, &foe, data.vlan.vlans[i].id); - mtk_foe_entry_set_vlan(eth, &foe, data.vlan.id); - } if (data.pppoe.num == 1) mtk_foe_entry_set_pppoe(eth, &foe, data.pppoe.sid); -- GitLab From f872f7aaa4cac5f4c1dcae4a0489374735ff1048 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Tue, 25 Feb 2025 17:33:33 +0100 Subject: [PATCH 0280/2211] net: xgene-v2: remove incorrect ACPI_PTR annotation [ Upstream commit 01358e8fe922f716c05d7864ac2213b2440026e7 ] Building with W=1 shows a warning about xge_acpi_match being unused when CONFIG_ACPI is disabled: drivers/net/ethernet/apm/xgene-v2/main.c:723:36: error: unused variable 'xge_acpi_match' [-Werror,-Wunused-const-variable] Signed-off-by: Arnd Bergmann Link: https://patch.msgid.link/20250225163341.4168238-2-arnd@kernel.org Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/apm/xgene-v2/main.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/net/ethernet/apm/xgene-v2/main.c b/drivers/net/ethernet/apm/xgene-v2/main.c index 9e90c23814910..68335935cea77 100644 --- a/drivers/net/ethernet/apm/xgene-v2/main.c +++ b/drivers/net/ethernet/apm/xgene-v2/main.c @@ -9,8 +9,6 @@ #include "main.h" -static const struct acpi_device_id xge_acpi_match[]; - static int xge_get_resources(struct xge_pdata *pdata) { struct platform_device *pdev; @@ -731,7 +729,7 @@ MODULE_DEVICE_TABLE(acpi, xge_acpi_match); static struct platform_driver xge_driver = { .driver = { .name = "xgene-enet-v2", - .acpi_match_table = ACPI_PTR(xge_acpi_match), + .acpi_match_table = xge_acpi_match, }, .probe = xge_probe, .remove_new = xge_remove, -- GitLab From e39fd41117bd94b2e992f857cd77cf07972566e6 Mon Sep 17 00:00:00 2001 From: Hangbin Liu Date: Tue, 25 Feb 2025 03:39:14 +0000 Subject: [PATCH 0281/2211] bonding: report duplicate MAC address in all situations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 28d68d396a1cd21591e8c6d74afbde33a7ea107e ] Normally, a bond uses the MAC address of the first added slave as the bond’s MAC address. And the bond will set active slave’s MAC address to bond’s address if fail_over_mac is set to none (0) or follow (2). When the first slave is removed, the bond will still use the removed slave’s MAC address, which can lead to a duplicate MAC address and potentially cause issues with the switch. To avoid confusion, let's warn the user in all situations, including when fail_over_mac is set to 2 or not in active-backup mode. Signed-off-by: Hangbin Liu Reviewed-by: Nikolay Aleksandrov Link: https://patch.msgid.link/20250225033914.18617-1-liuhangbin@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/bonding/bond_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 4d73abae503d1..4d2e30f4ee250 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -2542,7 +2542,7 @@ static int __bond_release_one(struct net_device *bond_dev, RCU_INIT_POINTER(bond->current_arp_slave, NULL); - if (!all && (!bond->params.fail_over_mac || + if (!all && (bond->params.fail_over_mac != BOND_FOM_ACTIVE || BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP)) { if (ether_addr_equal_64bits(bond_dev->dev_addr, slave->perm_hwaddr) && bond_has_slaves(bond)) -- GitLab From 54ef1a89e287ee81382358889a1e8b9637879af4 Mon Sep 17 00:00:00 2001 From: Ramasamy Kaliappan Date: Fri, 7 Feb 2025 11:30:05 +0530 Subject: [PATCH 0282/2211] wifi: ath12k: Improve BSS discovery with hidden SSID in 6 GHz band [ Upstream commit 27d38bdfd416f4db70e09c3bef3b030c86fd235a ] Currently, sometimes, the station is unable to identify the configured AP SSID in its scan results when the AP is not broadcasting its name publicly and has a hidden SSID. Currently, channel dwell time for an ath12k station is 30 ms. Sometimes, station can send broadcast probe request to AP close to the end of dwell time. In some of these cases, before AP sends a response to the received probe request, the dwell time on the station side would come to an end. So, the station will move to scan next channel and will not be able to acknowledge the unicast probe response. Resolve this issue by increasing station's channel dwell time to 70 ms, so that the it remains on the same channel for a longer period. This would increase the station's chance of receiving probe response from the AP. The station will then send a response acknowledgment back to the AP, thus leading to successful scan and BSS discovery. With an increased dwell time, scan would take longer than it takes now. But, this fix is an improvement for hidden SSID scan issue. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 Signed-off-by: Ramasamy Kaliappan Signed-off-by: Roopni Devanathan Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250207060005.153835-1-quic_rdevanat@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/wmi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c index a6ba97949440e..30836a09d5506 100644 --- a/drivers/net/wireless/ath/ath12k/wmi.c +++ b/drivers/net/wireless/ath/ath12k/wmi.c @@ -2206,8 +2206,8 @@ void ath12k_wmi_start_scan_init(struct ath12k *ar, arg->dwell_time_active = 50; arg->dwell_time_active_2g = 0; arg->dwell_time_passive = 150; - arg->dwell_time_active_6g = 40; - arg->dwell_time_passive_6g = 30; + arg->dwell_time_active_6g = 70; + arg->dwell_time_passive_6g = 70; arg->min_rest_time = 50; arg->max_rest_time = 500; arg->repeat_probe_time = 0; -- GitLab From 06100e642f4b83ec758744e5f992d7a2039ec98f Mon Sep 17 00:00:00 2001 From: Andrew Davis Date: Thu, 23 Jan 2025 12:17:26 -0600 Subject: [PATCH 0283/2211] soc: ti: k3-socinfo: Do not use syscon helper to build regmap [ Upstream commit a5caf03188e44388e8c618dcbe5fffad1a249385 ] The syscon helper device_node_to_regmap() is used to fetch a regmap registered to a device node. It also currently creates this regmap if the node did not already have a regmap associated with it. This should only be used on "syscon" nodes. This driver is not such a device and instead uses device_node_to_regmap() on its own node as a hacky way to create a regmap for itself. This will not work going forward and so we should create our regmap the normal way by defining our regmap_config, fetching our memory resource, then using the normal regmap_init_mmio() function. Signed-off-by: Andrew Davis Link: https://lore.kernel.org/r/20250123181726.597144-1-afd@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Sasha Levin --- drivers/soc/ti/k3-socinfo.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/soc/ti/k3-socinfo.c b/drivers/soc/ti/k3-socinfo.c index 4fb0f0a248288..704039eb3c078 100644 --- a/drivers/soc/ti/k3-socinfo.c +++ b/drivers/soc/ti/k3-socinfo.c @@ -105,6 +105,12 @@ err_unknown_variant: return -ENODEV; } +static const struct regmap_config k3_chipinfo_regmap_cfg = { + .reg_bits = 32, + .val_bits = 32, + .reg_stride = 4, +}; + static int k3_chipinfo_probe(struct platform_device *pdev) { struct device_node *node = pdev->dev.of_node; @@ -112,13 +118,18 @@ static int k3_chipinfo_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct soc_device *soc_dev; struct regmap *regmap; + void __iomem *base; u32 partno_id; u32 variant; u32 jtag_id; u32 mfg; int ret; - regmap = device_node_to_regmap(node); + base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return PTR_ERR(base); + + regmap = regmap_init_mmio(dev, base, &k3_chipinfo_regmap_cfg); if (IS_ERR(regmap)) return PTR_ERR(regmap); -- GitLab From 673dde8d3c3ec97d10312caced2143194873de6f Mon Sep 17 00:00:00 2001 From: Amery Hung Date: Tue, 25 Feb 2025 15:35:44 -0800 Subject: [PATCH 0284/2211] bpf: Search and add kfuncs in struct_ops prologue and epilogue [ Upstream commit d519594ee2445d7cd1ad51f4db4cee58f8213400 ] Currently, add_kfunc_call() is only invoked once before the main verification loop. Therefore, the verifier could not find the bpf_kfunc_btf_tab of a new kfunc call which is not seen in user defined struct_ops operators but introduced in gen_prologue or gen_epilogue during do_misc_fixup(). Fix this by searching kfuncs in the patching instruction buffer and add them to prog->aux->kfunc_tab. Signed-off-by: Amery Hung Acked-by: Eduard Zingerman Acked-by: Martin KaFai Lau Link: https://lore.kernel.org/r/20250225233545.285481-1-ameryhung@gmail.com Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- kernel/bpf/verifier.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 8656208aa4bbb..294fbafbeba75 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -2987,6 +2987,21 @@ bpf_jit_find_kfunc_model(const struct bpf_prog *prog, return res ? &res->func_model : NULL; } +static int add_kfunc_in_insns(struct bpf_verifier_env *env, + struct bpf_insn *insn, int cnt) +{ + int i, ret; + + for (i = 0; i < cnt; i++, insn++) { + if (bpf_pseudo_kfunc_call(insn)) { + ret = add_kfunc_call(env, insn->imm, insn->off); + if (ret < 0) + return ret; + } + } + return 0; +} + static int add_subprog_and_kfunc(struct bpf_verifier_env *env) { struct bpf_subprog_info *subprog = env->subprog_info; @@ -19768,7 +19783,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env) { struct bpf_subprog_info *subprogs = env->subprog_info; const struct bpf_verifier_ops *ops = env->ops; - int i, cnt, size, ctx_field_size, delta = 0, epilogue_cnt = 0; + int i, cnt, size, ctx_field_size, ret, delta = 0, epilogue_cnt = 0; const int insn_cnt = env->prog->len; struct bpf_insn *epilogue_buf = env->epilogue_buf; struct bpf_insn *insn_buf = env->insn_buf; @@ -19797,6 +19812,10 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env) return -ENOMEM; env->prog = new_prog; delta += cnt - 1; + + ret = add_kfunc_in_insns(env, epilogue_buf, epilogue_cnt - 1); + if (ret < 0) + return ret; } } @@ -19817,6 +19836,10 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env) env->prog = new_prog; delta += cnt - 1; + + ret = add_kfunc_in_insns(env, insn_buf, cnt - 1); + if (ret < 0) + return ret; } } -- GitLab From de48b82dcf583563227ea84606ffd1d4eab44404 Mon Sep 17 00:00:00 2001 From: Hariprasad Kelam Date: Mon, 24 Feb 2025 09:26:03 +0530 Subject: [PATCH 0285/2211] Octeontx2-af: RPM: Register driver with PCI subsys IDs [ Upstream commit fc9167192f29485be5621e2e9c8208b717b65753 ] Although the PCI device ID and Vendor ID for the RPM (MAC) block have remained the same across Octeon CN10K and the next-generation CN20K silicon, Hardware architecture has changed (NIX mapped RPMs and RFOE Mapped RPMs). Add PCI Subsystem IDs to the device table to ensure that this driver can be probed from NIX mapped RPM devices only. Signed-off-by: Hariprasad Kelam Link: https://patch.msgid.link/20250224035603.1220913-1-hkelam@marvell.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/marvell/octeontx2/af/cgx.c | 14 ++++++++++++-- drivers/net/ethernet/marvell/octeontx2/af/rvu.h | 2 ++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c index e43c4608d3ba3..971993586fb49 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c @@ -66,8 +66,18 @@ static int cgx_fwi_link_change(struct cgx *cgx, int lmac_id, bool en); /* Supported devices */ static const struct pci_device_id cgx_id_table[] = { { PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_OCTEONTX2_CGX) }, - { PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CN10K_RPM) }, - { PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CN10KB_RPM) }, + { PCI_DEVICE_SUB(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CN10K_RPM, + PCI_ANY_ID, PCI_SUBSYS_DEVID_CN10K_A) }, + { PCI_DEVICE_SUB(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CN10K_RPM, + PCI_ANY_ID, PCI_SUBSYS_DEVID_CNF10K_A) }, + { PCI_DEVICE_SUB(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CN10K_RPM, + PCI_ANY_ID, PCI_SUBSYS_DEVID_CNF10K_B) }, + { PCI_DEVICE_SUB(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CN10KB_RPM, + PCI_ANY_ID, PCI_SUBSYS_DEVID_CN10K_B) }, + { PCI_DEVICE_SUB(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CN10KB_RPM, + PCI_ANY_ID, PCI_SUBSYS_DEVID_CN20KA) }, + { PCI_DEVICE_SUB(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CN10KB_RPM, + PCI_ANY_ID, PCI_SUBSYS_DEVID_CNF20KA) }, { 0, } /* end of table */ }; diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h index 8555edbb1c8f9..f94bf04788e98 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h @@ -30,6 +30,8 @@ #define PCI_SUBSYS_DEVID_CNF10K_A 0xBA00 #define PCI_SUBSYS_DEVID_CNF10K_B 0xBC00 #define PCI_SUBSYS_DEVID_CN10K_B 0xBD00 +#define PCI_SUBSYS_DEVID_CN20KA 0xC220 +#define PCI_SUBSYS_DEVID_CNF20KA 0xC320 /* PCI BAR nos */ #define PCI_AF_REG_BAR_NUM 0 -- GitLab From 5cab1de0cea2840a8a7d061ae13413fb77ff96c0 Mon Sep 17 00:00:00 2001 From: Nir Lichtman Date: Fri, 10 Jan 2025 12:05:00 +0000 Subject: [PATCH 0286/2211] x86/build: Fix broken copy command in genimage.sh when making isoimage [ Upstream commit e451630226bd09dc730eedb4e32cab1cc7155ae8 ] Problem: Currently when running the "make isoimage" command there is an error related to wrong parameters passed to the cp command: "cp: missing destination file operand after 'arch/x86/boot/isoimage/'" This is caused because FDINITRDS is an empty array. Solution: Check if FDINITRDS is empty before executing the "cp" command, similar to how it is done in the case of hdimage. Signed-off-by: Nir Lichtman Signed-off-by: Ingo Molnar Cc: "H. Peter Anvin" Cc: Ard Biesheuvel Cc: Masahiro Yamada Cc: Michal Marek Link: https://lore.kernel.org/r/20250110120500.GA923218@lichtman.org Signed-off-by: Sasha Levin --- arch/x86/boot/genimage.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/x86/boot/genimage.sh b/arch/x86/boot/genimage.sh index c9299aeb7333e..3882ead513f74 100644 --- a/arch/x86/boot/genimage.sh +++ b/arch/x86/boot/genimage.sh @@ -22,6 +22,7 @@ # This script requires: # bash # syslinux +# genisoimage # mtools (for fdimage* and hdimage) # edk2/OVMF (for hdimage) # @@ -251,7 +252,9 @@ geniso() { cp "$isolinux" "$ldlinux" "$tmp_dir" cp "$FBZIMAGE" "$tmp_dir"/linux echo default linux "$KCMDLINE" > "$tmp_dir"/isolinux.cfg - cp "${FDINITRDS[@]}" "$tmp_dir"/ + if [ ${#FDINITRDS[@]} -gt 0 ]; then + cp "${FDINITRDS[@]}" "$tmp_dir"/ + fi genisoimage -J -r -appid 'LINUX_BOOT' -input-charset=utf-8 \ -quiet -o "$FIMAGE" -b isolinux.bin \ -c boot.cat -no-emul-boot -boot-load-size 4 \ -- GitLab From 54dd746ed8a30175444076c9b4fdd15cf86e0842 Mon Sep 17 00:00:00 2001 From: Yihan Zhu Date: Wed, 12 Feb 2025 15:17:56 -0500 Subject: [PATCH 0287/2211] drm/amd/display: handle max_downscale_src_width fail check [ Upstream commit 02a940da2ccc0cc0299811379580852b405a0ea2 ] [WHY] If max_downscale_src_width check fails, we exit early from TAP calculation and left a NULL value to the scaling data structure to cause the zero divide in the DML validation. [HOW] Call set default TAP calculation before early exit in get_optimal_number_of_taps due to max downscale limit exceed. Reviewed-by: Samson Tam Signed-off-by: Yihan Zhu Signed-off-by: Zaeem Mohamed Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.c b/drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.c index 40acebd13e46d..abf439e743f23 100644 --- a/drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.c +++ b/drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.c @@ -425,11 +425,6 @@ bool dpp3_get_optimal_number_of_taps( int min_taps_y, min_taps_c; enum lb_memory_config lb_config; - if (scl_data->viewport.width > scl_data->h_active && - dpp->ctx->dc->debug.max_downscale_src_width != 0 && - scl_data->viewport.width > dpp->ctx->dc->debug.max_downscale_src_width) - return false; - /* * Set default taps if none are provided * From programming guide: taps = min{ ceil(2*H_RATIO,1), 8} for downscaling @@ -467,6 +462,12 @@ bool dpp3_get_optimal_number_of_taps( else scl_data->taps.h_taps_c = in_taps->h_taps_c; + // Avoid null data in the scl data with this early return, proceed non-adaptive calcualtion first + if (scl_data->viewport.width > scl_data->h_active && + dpp->ctx->dc->debug.max_downscale_src_width != 0 && + scl_data->viewport.width > dpp->ctx->dc->debug.max_downscale_src_width) + return false; + /*Ensure we can support the requested number of vtaps*/ min_taps_y = dc_fixpt_ceil(scl_data->ratios.vert); min_taps_c = dc_fixpt_ceil(scl_data->ratios.vert_c); -- GitLab From 990e4fb37bcd49161bbc5331a24b73616aefafbf Mon Sep 17 00:00:00 2001 From: Charlene Liu Date: Thu, 13 Feb 2025 12:37:10 -0500 Subject: [PATCH 0288/2211] drm/amd/display: fix dcn4x init failed [ Upstream commit 23ef388a84c72b0614a6c10f866ffeac7e807719 ] [why] failed due to cmdtable not created. switch atombios cmdtable as default. Reviewed-by: Alvin Lee Signed-off-by: Charlene Liu Signed-off-by: Zaeem Mohamed Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/bios/command_table2.c | 9 --------- .../gpu/drm/amd/display/dc/bios/command_table_helper2.c | 3 +-- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/bios/command_table2.c b/drivers/gpu/drm/amd/display/dc/bios/command_table2.c index 7d18f372ce7ab..6bc59b7ef007b 100644 --- a/drivers/gpu/drm/amd/display/dc/bios/command_table2.c +++ b/drivers/gpu/drm/amd/display/dc/bios/command_table2.c @@ -101,7 +101,6 @@ static void init_dig_encoder_control(struct bios_parser *bp) bp->cmd_tbl.dig_encoder_control = encoder_control_digx_v1_5; break; default: - dm_output_to_console("Don't have dig_encoder_control for v%d\n", version); bp->cmd_tbl.dig_encoder_control = encoder_control_fallback; break; } @@ -238,7 +237,6 @@ static void init_transmitter_control(struct bios_parser *bp) bp->cmd_tbl.transmitter_control = transmitter_control_v1_7; break; default: - dm_output_to_console("Don't have transmitter_control for v%d\n", crev); bp->cmd_tbl.transmitter_control = transmitter_control_fallback; break; } @@ -408,8 +406,6 @@ static void init_set_pixel_clock(struct bios_parser *bp) bp->cmd_tbl.set_pixel_clock = set_pixel_clock_v7; break; default: - dm_output_to_console("Don't have set_pixel_clock for v%d\n", - BIOS_CMD_TABLE_PARA_REVISION(setpixelclock)); bp->cmd_tbl.set_pixel_clock = set_pixel_clock_fallback; break; } @@ -554,7 +550,6 @@ static void init_set_crtc_timing(struct bios_parser *bp) set_crtc_using_dtd_timing_v3; break; default: - dm_output_to_console("Don't have set_crtc_timing for v%d\n", dtd_version); bp->cmd_tbl.set_crtc_timing = NULL; break; } @@ -671,8 +666,6 @@ static void init_enable_crtc(struct bios_parser *bp) bp->cmd_tbl.enable_crtc = enable_crtc_v1; break; default: - dm_output_to_console("Don't have enable_crtc for v%d\n", - BIOS_CMD_TABLE_PARA_REVISION(enablecrtc)); bp->cmd_tbl.enable_crtc = NULL; break; } @@ -864,8 +857,6 @@ static void init_set_dce_clock(struct bios_parser *bp) bp->cmd_tbl.set_dce_clock = set_dce_clock_v2_1; break; default: - dm_output_to_console("Don't have set_dce_clock for v%d\n", - BIOS_CMD_TABLE_PARA_REVISION(setdceclock)); bp->cmd_tbl.set_dce_clock = NULL; break; } diff --git a/drivers/gpu/drm/amd/display/dc/bios/command_table_helper2.c b/drivers/gpu/drm/amd/display/dc/bios/command_table_helper2.c index 73458e2951034..df8139bda142b 100644 --- a/drivers/gpu/drm/amd/display/dc/bios/command_table_helper2.c +++ b/drivers/gpu/drm/amd/display/dc/bios/command_table_helper2.c @@ -87,8 +87,7 @@ bool dal_bios_parser_init_cmd_tbl_helper2( return true; default: - /* Unsupported DCE */ - BREAK_TO_DEBUGGER(); + *h = dal_cmd_tbl_helper_dce112_get_table2(); return false; } } -- GitLab From 6e5935b755b4a81ccebde4eed0ebd37f5875ddb3 Mon Sep 17 00:00:00 2001 From: "Assadian, Navid" Date: Thu, 19 Dec 2024 17:19:09 -0500 Subject: [PATCH 0289/2211] drm/amd/display: Fix mismatch type comparison [ Upstream commit 26873260d394b1e33cdd720154aedf0af95327f9 ] The mismatch type comparison/assignment may cause data loss. Since the values are always non-negative, it is safe to use unsigned variables to resolve the mismatch. Signed-off-by: Navid Assadian Reviewed-by: Joshua Aberback Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/spl/dc_spl.c | 4 ++-- drivers/gpu/drm/amd/display/dc/spl/dc_spl_types.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/spl/dc_spl.c b/drivers/gpu/drm/amd/display/dc/spl/dc_spl.c index 014e8a296f0c7..54c7d6aecf51c 100644 --- a/drivers/gpu/drm/amd/display/dc/spl/dc_spl.c +++ b/drivers/gpu/drm/amd/display/dc/spl/dc_spl.c @@ -875,8 +875,8 @@ static bool spl_get_optimal_number_of_taps( bool *enable_isharp) { int num_part_y, num_part_c; - int max_taps_y, max_taps_c; - int min_taps_y, min_taps_c; + unsigned int max_taps_y, max_taps_c; + unsigned int min_taps_y, min_taps_c; enum lb_memory_config lb_config; bool skip_easf = false; diff --git a/drivers/gpu/drm/amd/display/dc/spl/dc_spl_types.h b/drivers/gpu/drm/amd/display/dc/spl/dc_spl_types.h index 2a74ff5fdfdbc..a2c28949ec47f 100644 --- a/drivers/gpu/drm/amd/display/dc/spl/dc_spl_types.h +++ b/drivers/gpu/drm/amd/display/dc/spl/dc_spl_types.h @@ -479,7 +479,7 @@ struct spl_sharpness_range { }; struct adaptive_sharpness { bool enable; - int sharpness_level; + unsigned int sharpness_level; struct spl_sharpness_range sharpness_range; }; enum linear_light_scaling { // convert it in translation logic -- GitLab From 4a21b57d83c553bd96577be4b9fb5eeaf1f3ec5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=ADcolas=20F=2E=20R=2E=20A=2E=20Prado?= Date: Tue, 25 Feb 2025 11:33:49 -0300 Subject: [PATCH 0290/2211] ASoC: mediatek: mt8188: Treat DMIC_GAINx_CUR as non-volatile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 7d87bde21c73731ddaf15e572020f80999c38ee3 ] The DMIC_GAINx_CUR registers contain the current (as in present) gain of each DMIC. During capture, this gain will ramp up until a target value is reached, and therefore the register is volatile since it is updated automatically by hardware. However, after capture the register's value returns to the value that was written to it. So reading these registers returns the current gain, and writing configures the initial gain for every capture. >From an audio configuration perspective, reading the instantaneous gain is not really useful. Instead, reading back the initial gain that was configured is the desired behavior. For that reason, consider the DMIC_GAINx_CUR registers as non-volatile, so the regmap's cache can be used to retrieve the values, rather than requiring pm runtime resuming the device. Signed-off-by: Nícolas F. R. A. Prado Reviewed-by: AngeloGioacchino Del Regno Link: https://patch.msgid.link/20250225-genio700-dmic-v2-3-3076f5b50ef7@collabora.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/mediatek/mt8188/mt8188-afe-pcm.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c b/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c index 73e5c63aeec87..d36520c6272dd 100644 --- a/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c +++ b/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c @@ -2855,10 +2855,6 @@ static bool mt8188_is_volatile_reg(struct device *dev, unsigned int reg) case AFE_DMIC3_SRC_DEBUG_MON0: case AFE_DMIC3_UL_SRC_MON0: case AFE_DMIC3_UL_SRC_MON1: - case DMIC_GAIN1_CUR: - case DMIC_GAIN2_CUR: - case DMIC_GAIN3_CUR: - case DMIC_GAIN4_CUR: case ETDM_IN1_MONITOR: case ETDM_IN2_MONITOR: case ETDM_OUT1_MONITOR: -- GitLab From 7bbfaa24c02f46ad06ac44cc7f4d3b194ce9a2fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=ADcolas=20F=2E=20R=2E=20A=2E=20Prado?= Date: Tue, 25 Feb 2025 11:33:48 -0300 Subject: [PATCH 0291/2211] ASoC: mediatek: mt8188: Add reference for dmic clocks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit bf1800073f4d55f08191b034c86b95881e99b6fd ] Add the names for the dmic clocks, aud_afe_dmic* and aud_dmic_hires*, so they can be acquired and enabled by the platform driver. Signed-off-by: Nícolas F. R. A. Prado Reviewed-by: AngeloGioacchino Del Regno Link: https://patch.msgid.link/20250225-genio700-dmic-v2-2-3076f5b50ef7@collabora.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/mediatek/mt8188/mt8188-afe-clk.c | 8 ++++++++ sound/soc/mediatek/mt8188/mt8188-afe-clk.h | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/sound/soc/mediatek/mt8188/mt8188-afe-clk.c b/sound/soc/mediatek/mt8188/mt8188-afe-clk.c index e69c1bb2cb239..7f411b8577823 100644 --- a/sound/soc/mediatek/mt8188/mt8188-afe-clk.c +++ b/sound/soc/mediatek/mt8188/mt8188-afe-clk.c @@ -58,7 +58,15 @@ static const char *aud_clks[MT8188_CLK_NUM] = { [MT8188_CLK_AUD_ADC] = "aud_adc", [MT8188_CLK_AUD_DAC_HIRES] = "aud_dac_hires", [MT8188_CLK_AUD_A1SYS_HP] = "aud_a1sys_hp", + [MT8188_CLK_AUD_AFE_DMIC1] = "aud_afe_dmic1", + [MT8188_CLK_AUD_AFE_DMIC2] = "aud_afe_dmic2", + [MT8188_CLK_AUD_AFE_DMIC3] = "aud_afe_dmic3", + [MT8188_CLK_AUD_AFE_DMIC4] = "aud_afe_dmic4", [MT8188_CLK_AUD_ADC_HIRES] = "aud_adc_hires", + [MT8188_CLK_AUD_DMIC_HIRES1] = "aud_dmic_hires1", + [MT8188_CLK_AUD_DMIC_HIRES2] = "aud_dmic_hires2", + [MT8188_CLK_AUD_DMIC_HIRES3] = "aud_dmic_hires3", + [MT8188_CLK_AUD_DMIC_HIRES4] = "aud_dmic_hires4", [MT8188_CLK_AUD_I2SIN] = "aud_i2sin", [MT8188_CLK_AUD_TDM_IN] = "aud_tdm_in", [MT8188_CLK_AUD_I2S_OUT] = "aud_i2s_out", diff --git a/sound/soc/mediatek/mt8188/mt8188-afe-clk.h b/sound/soc/mediatek/mt8188/mt8188-afe-clk.h index ec53c171c170a..c6c78d684f3ee 100644 --- a/sound/soc/mediatek/mt8188/mt8188-afe-clk.h +++ b/sound/soc/mediatek/mt8188/mt8188-afe-clk.h @@ -54,7 +54,15 @@ enum { MT8188_CLK_AUD_ADC, MT8188_CLK_AUD_DAC_HIRES, MT8188_CLK_AUD_A1SYS_HP, + MT8188_CLK_AUD_AFE_DMIC1, + MT8188_CLK_AUD_AFE_DMIC2, + MT8188_CLK_AUD_AFE_DMIC3, + MT8188_CLK_AUD_AFE_DMIC4, MT8188_CLK_AUD_ADC_HIRES, + MT8188_CLK_AUD_DMIC_HIRES1, + MT8188_CLK_AUD_DMIC_HIRES2, + MT8188_CLK_AUD_DMIC_HIRES3, + MT8188_CLK_AUD_DMIC_HIRES4, MT8188_CLK_AUD_I2SIN, MT8188_CLK_AUD_TDM_IN, MT8188_CLK_AUD_I2S_OUT, -- GitLab From 7eb29d704d2760454d39c2a6c63460d7ff79892d Mon Sep 17 00:00:00 2001 From: Waiman Long Date: Thu, 6 Feb 2025 14:18:44 -0500 Subject: [PATCH 0292/2211] x86/nmi: Add an emergency handler in nmi_desc & use it in nmi_shootdown_cpus() [ Upstream commit fe37c699ae3eed6e02ee55fbf5cb9ceb7fcfd76c ] Depending on the type of panics, it was found that the __register_nmi_handler() function can be called in NMI context from nmi_shootdown_cpus() leading to a lockdep splat: WARNING: inconsistent lock state inconsistent {INITIAL USE} -> {IN-NMI} usage. lock(&nmi_desc[0].lock); lock(&nmi_desc[0].lock); Call Trace: _raw_spin_lock_irqsave __register_nmi_handler nmi_shootdown_cpus kdump_nmi_shootdown_cpus native_machine_crash_shutdown __crash_kexec In this particular case, the following panic message was printed before: Kernel panic - not syncing: Fatal hardware error! This message seemed to be given out from __ghes_panic() running in NMI context. The __register_nmi_handler() function which takes the nmi_desc lock with irq disabled shouldn't be called from NMI context as this can lead to deadlock. The nmi_shootdown_cpus() function can only be invoked once. After the first invocation, all other CPUs should be stuck in the newly added crash_nmi_callback() and cannot respond to a second NMI. Fix it by adding a new emergency NMI handler to the nmi_desc structure and provide a new set_emergency_nmi_handler() helper to set crash_nmi_callback() in any context. The new emergency handler will preempt other handlers in the linked list. That will eliminate the need to take any lock and serve the panic in NMI use case. Signed-off-by: Waiman Long Signed-off-by: Ingo Molnar Acked-by: Rik van Riel Cc: Thomas Gleixner Link: https://lore.kernel.org/r/20250206191844.131700-1-longman@redhat.com Signed-off-by: Sasha Levin --- arch/x86/include/asm/nmi.h | 2 ++ arch/x86/kernel/nmi.c | 42 ++++++++++++++++++++++++++++++++++++++ arch/x86/kernel/reboot.c | 10 +++------ 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/arch/x86/include/asm/nmi.h b/arch/x86/include/asm/nmi.h index 41a0ebb699ec6..f677382093f36 100644 --- a/arch/x86/include/asm/nmi.h +++ b/arch/x86/include/asm/nmi.h @@ -56,6 +56,8 @@ int __register_nmi_handler(unsigned int, struct nmiaction *); void unregister_nmi_handler(unsigned int, const char *); +void set_emergency_nmi_handler(unsigned int type, nmi_handler_t handler); + void stop_nmi(void); void restart_nmi(void); void local_touch_nmi(void); diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index ed163c8c8604e..9a95d00f14233 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c @@ -40,8 +40,12 @@ #define CREATE_TRACE_POINTS #include +/* + * An emergency handler can be set in any context including NMI + */ struct nmi_desc { raw_spinlock_t lock; + nmi_handler_t emerg_handler; struct list_head head; }; @@ -132,9 +136,22 @@ static void nmi_check_duration(struct nmiaction *action, u64 duration) static int nmi_handle(unsigned int type, struct pt_regs *regs) { struct nmi_desc *desc = nmi_to_desc(type); + nmi_handler_t ehandler; struct nmiaction *a; int handled=0; + /* + * Call the emergency handler, if set + * + * In the case of crash_nmi_callback() emergency handler, it will + * return in the case of the crashing CPU to enable it to complete + * other necessary crashing actions ASAP. Other handlers in the + * linked list won't need to be run. + */ + ehandler = desc->emerg_handler; + if (ehandler) + return ehandler(type, regs); + rcu_read_lock(); /* @@ -224,6 +241,31 @@ void unregister_nmi_handler(unsigned int type, const char *name) } EXPORT_SYMBOL_GPL(unregister_nmi_handler); +/** + * set_emergency_nmi_handler - Set emergency handler + * @type: NMI type + * @handler: the emergency handler to be stored + * + * Set an emergency NMI handler which, if set, will preempt all the other + * handlers in the linked list. If a NULL handler is passed in, it will clear + * it. It is expected that concurrent calls to this function will not happen + * or the system is screwed beyond repair. + */ +void set_emergency_nmi_handler(unsigned int type, nmi_handler_t handler) +{ + struct nmi_desc *desc = nmi_to_desc(type); + + if (WARN_ON_ONCE(desc->emerg_handler == handler)) + return; + desc->emerg_handler = handler; + + /* + * Ensure the emergency handler is visible to other CPUs before + * function return + */ + smp_wmb(); +} + static void pci_serr_error(unsigned char reason, struct pt_regs *regs) { diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index dc1dd3f3e67fc..9aaac1f9f45b5 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -926,15 +926,11 @@ void nmi_shootdown_cpus(nmi_shootdown_cb callback) shootdown_callback = callback; atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1); - /* Would it be better to replace the trap vector here? */ - if (register_nmi_handler(NMI_LOCAL, crash_nmi_callback, - NMI_FLAG_FIRST, "crash")) - return; /* Return what? */ + /* - * Ensure the new callback function is set before sending - * out the NMI + * Set emergency handler to preempt other handlers. */ - wmb(); + set_emergency_nmi_handler(NMI_LOCAL, crash_nmi_callback); apic_send_IPI_allbutself(NMI_VECTOR); -- GitLab From 083383aba01f278080938e3b71dbfa7256648ca4 Mon Sep 17 00:00:00 2001 From: "Rafael J. Wysocki" Date: Thu, 6 Feb 2025 15:29:05 +0100 Subject: [PATCH 0293/2211] cpuidle: menu: Avoid discarding useful information [ Upstream commit 85975daeaa4d6ec560bfcd354fc9c08ad7f38888 ] When giving up on making a high-confidence prediction, get_typical_interval() always returns UINT_MAX which means that the next idle interval prediction will be based entirely on the time till the next timer. However, the information represented by the most recent intervals may not be completely useless in those cases. Namely, the largest recent idle interval is an upper bound on the recently observed idle duration, so it is reasonable to assume that the next idle duration is unlikely to exceed it. Moreover, this is still true after eliminating the suspected outliers if the sample set still under consideration is at least as large as 50% of the maximum sample set size. Accordingly, make get_typical_interval() return the current maximum recent interval value in that case instead of UINT_MAX. Signed-off-by: Rafael J. Wysocki Reported-by: Artem Bityutskiy Tested-by: Artem Bityutskiy Reviewed-by: Christian Loehle Tested-by: Christian Loehle Tested-by: Aboorva Devarajan Link: https://patch.msgid.link/7770672.EvYhyI6sBW@rjwysocki.net Signed-off-by: Sasha Levin --- drivers/cpuidle/governors/menu.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index f3c9d49f0f2a5..97ffadc7e57a6 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c @@ -239,8 +239,19 @@ again: * This can deal with workloads that have long pauses interspersed * with sporadic activity with a bunch of short pauses. */ - if ((divisor * 4) <= INTERVALS * 3) + if (divisor * 4 <= INTERVALS * 3) { + /* + * If there are sufficiently many data points still under + * consideration after the outliers have been eliminated, + * returning without a prediction would be a mistake because it + * is likely that the next interval will not exceed the current + * maximum, so return the latter in that case. + */ + if (divisor >= INTERVALS / 2) + return max; + return UINT_MAX; + } thresh = max - 1; goto again; -- GitLab From 6398dd09d50b432e4d01fa8cfa8c3ae854fdf0f9 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Tue, 3 Dec 2024 13:15:11 -0600 Subject: [PATCH 0294/2211] vhost-scsi: Return queue full for page alloc failures during copy [ Upstream commit 891b99eab0f89dbe08d216f4ab71acbeaf7a3102 ] This has us return queue full if we can't allocate a page during the copy operation so the initiator can retry. Signed-off-by: Mike Christie Message-Id: <20241203191705.19431-5-michael.christie@oracle.com> Signed-off-by: Michael S. Tsirkin Acked-by: Stefan Hajnoczi Signed-off-by: Sasha Levin --- drivers/vhost/scsi.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c index ecad2f53b7635..38d243d914d00 100644 --- a/drivers/vhost/scsi.c +++ b/drivers/vhost/scsi.c @@ -762,7 +762,7 @@ vhost_scsi_copy_iov_to_sgl(struct vhost_scsi_cmd *cmd, struct iov_iter *iter, size_t len = iov_iter_count(iter); unsigned int nbytes = 0; struct page *page; - int i; + int i, ret; if (cmd->tvc_data_direction == DMA_FROM_DEVICE) { cmd->saved_iter_addr = dup_iter(&cmd->saved_iter, iter, @@ -775,6 +775,7 @@ vhost_scsi_copy_iov_to_sgl(struct vhost_scsi_cmd *cmd, struct iov_iter *iter, page = alloc_page(GFP_KERNEL); if (!page) { i--; + ret = -ENOMEM; goto err; } @@ -782,8 +783,10 @@ vhost_scsi_copy_iov_to_sgl(struct vhost_scsi_cmd *cmd, struct iov_iter *iter, sg_set_page(&sg[i], page, nbytes, 0); if (cmd->tvc_data_direction == DMA_TO_DEVICE && - copy_page_from_iter(page, 0, nbytes, iter) != nbytes) + copy_page_from_iter(page, 0, nbytes, iter) != nbytes) { + ret = -EFAULT; goto err; + } len -= nbytes; } @@ -798,7 +801,7 @@ err: for (; i >= 0; i--) __free_page(sg_page(&sg[i])); kfree(cmd->saved_iter_addr); - return -ENOMEM; + return ret; } static int @@ -1282,9 +1285,9 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) " %d\n", cmd, exp_data_len, prot_bytes, data_direction); if (data_direction != DMA_NONE) { - if (unlikely(vhost_scsi_mapal(cmd, prot_bytes, - &prot_iter, exp_data_len, - &data_iter))) { + ret = vhost_scsi_mapal(cmd, prot_bytes, &prot_iter, + exp_data_len, &data_iter); + if (unlikely(ret)) { vq_err(vq, "Failed to map iov to sgl\n"); vhost_scsi_release_cmd_res(&cmd->tvc_se_cmd); goto err; -- GitLab From bb8fb041cba26793200d006231fab765ee63ed64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20S=C3=B6derlund?= Date: Sat, 22 Feb 2025 00:09:07 +0100 Subject: [PATCH 0295/2211] media: adv7180: Disable test-pattern control on adv7180 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit a980bc5f56b0292336e408f657f79e574e8067c0 ] The register that enables selecting a test-pattern to be outputted in free-run mode (FREE_RUN_PAT_SEL[2:0]) is only available on adv7280 based devices, not the adv7180 based ones. Add a flag to mark devices that are capable of generating test-patterns, and those that are not. And only register the control on supported devices. Signed-off-by: Niklas Söderlund Signed-off-by: Hans Verkuil Signed-off-by: Sasha Levin --- drivers/media/i2c/adv7180.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/drivers/media/i2c/adv7180.c b/drivers/media/i2c/adv7180.c index 819ff9f7c90fe..2a20a4fad796c 100644 --- a/drivers/media/i2c/adv7180.c +++ b/drivers/media/i2c/adv7180.c @@ -195,6 +195,7 @@ struct adv7180_state; #define ADV7180_FLAG_V2 BIT(1) #define ADV7180_FLAG_MIPI_CSI2 BIT(2) #define ADV7180_FLAG_I2P BIT(3) +#define ADV7180_FLAG_TEST_PATTERN BIT(4) struct adv7180_chip_info { unsigned int flags; @@ -682,11 +683,15 @@ static int adv7180_init_controls(struct adv7180_state *state) ADV7180_HUE_MAX, 1, ADV7180_HUE_DEF); v4l2_ctrl_new_custom(&state->ctrl_hdl, &adv7180_ctrl_fast_switch, NULL); - v4l2_ctrl_new_std_menu_items(&state->ctrl_hdl, &adv7180_ctrl_ops, - V4L2_CID_TEST_PATTERN, - ARRAY_SIZE(test_pattern_menu) - 1, - 0, ARRAY_SIZE(test_pattern_menu) - 1, - test_pattern_menu); + if (state->chip_info->flags & ADV7180_FLAG_TEST_PATTERN) { + v4l2_ctrl_new_std_menu_items(&state->ctrl_hdl, + &adv7180_ctrl_ops, + V4L2_CID_TEST_PATTERN, + ARRAY_SIZE(test_pattern_menu) - 1, + 0, + ARRAY_SIZE(test_pattern_menu) - 1, + test_pattern_menu); + } state->sd.ctrl_handler = &state->ctrl_hdl; if (state->ctrl_hdl.error) { @@ -1221,7 +1226,7 @@ static const struct adv7180_chip_info adv7182_info = { }; static const struct adv7180_chip_info adv7280_info = { - .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_I2P, + .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_I2P | ADV7180_FLAG_TEST_PATTERN, .valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) | BIT(ADV7182_INPUT_CVBS_AIN2) | BIT(ADV7182_INPUT_CVBS_AIN3) | @@ -1235,7 +1240,8 @@ static const struct adv7180_chip_info adv7280_info = { }; static const struct adv7180_chip_info adv7280_m_info = { - .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 | ADV7180_FLAG_I2P, + .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 | ADV7180_FLAG_I2P | + ADV7180_FLAG_TEST_PATTERN, .valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) | BIT(ADV7182_INPUT_CVBS_AIN2) | BIT(ADV7182_INPUT_CVBS_AIN3) | @@ -1256,7 +1262,8 @@ static const struct adv7180_chip_info adv7280_m_info = { }; static const struct adv7180_chip_info adv7281_info = { - .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2, + .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 | + ADV7180_FLAG_TEST_PATTERN, .valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) | BIT(ADV7182_INPUT_CVBS_AIN2) | BIT(ADV7182_INPUT_CVBS_AIN7) | @@ -1271,7 +1278,8 @@ static const struct adv7180_chip_info adv7281_info = { }; static const struct adv7180_chip_info adv7281_m_info = { - .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2, + .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 | + ADV7180_FLAG_TEST_PATTERN, .valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) | BIT(ADV7182_INPUT_CVBS_AIN2) | BIT(ADV7182_INPUT_CVBS_AIN3) | @@ -1291,7 +1299,8 @@ static const struct adv7180_chip_info adv7281_m_info = { }; static const struct adv7180_chip_info adv7281_ma_info = { - .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2, + .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 | + ADV7180_FLAG_TEST_PATTERN, .valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) | BIT(ADV7182_INPUT_CVBS_AIN2) | BIT(ADV7182_INPUT_CVBS_AIN3) | @@ -1316,7 +1325,7 @@ static const struct adv7180_chip_info adv7281_ma_info = { }; static const struct adv7180_chip_info adv7282_info = { - .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_I2P, + .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_I2P | ADV7180_FLAG_TEST_PATTERN, .valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) | BIT(ADV7182_INPUT_CVBS_AIN2) | BIT(ADV7182_INPUT_CVBS_AIN7) | @@ -1331,7 +1340,8 @@ static const struct adv7180_chip_info adv7282_info = { }; static const struct adv7180_chip_info adv7282_m_info = { - .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 | ADV7180_FLAG_I2P, + .flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 | ADV7180_FLAG_I2P | + ADV7180_FLAG_TEST_PATTERN, .valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) | BIT(ADV7182_INPUT_CVBS_AIN2) | BIT(ADV7182_INPUT_CVBS_AIN3) | -- GitLab From 0d508cefcd24a3ac1b934313d647ebd68bf9b946 Mon Sep 17 00:00:00 2001 From: Konstantin Shkolnyy Date: Tue, 4 Feb 2025 11:31:27 -0600 Subject: [PATCH 0296/2211] vdpa/mlx5: Fix mlx5_vdpa_get_config() endianness on big-endian machines MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 439252e167ac45a5d46f573aac1da7d8f3e051ad ] mlx5_vdpa_dev_add() doesn’t initialize mvdev->actual_features. It’s initialized later by mlx5_vdpa_set_driver_features(). However, mlx5_vdpa_get_config() depends on the VIRTIO_F_VERSION_1 flag in actual_features, to return data with correct endianness. When it’s called before mlx5_vdpa_set_driver_features(), the data are incorrectly returned as big-endian on big-endian machines, while QEMU then interprets them as little-endian. The fix is to initialize this VIRTIO_F_VERSION_1 as early as possible, especially considering that mlx5_vdpa_dev_add() insists on this flag to always be set anyway. Signed-off-by: Konstantin Shkolnyy Message-Id: <20250204173127.166673-1-kshk@linux.ibm.com> Signed-off-by: Michael S. Tsirkin Reviewed-by: Dragos Tatulea Acked-by: Jason Wang Signed-off-by: Sasha Levin --- drivers/vdpa/mlx5/net/mlx5_vnet.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c index 5f581e71e2010..76aedac37a788 100644 --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c @@ -3884,6 +3884,9 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name, ndev->mvdev.max_vqs = max_vqs; mvdev = &ndev->mvdev; mvdev->mdev = mdev; + /* cpu_to_mlx5vdpa16() below depends on this flag */ + mvdev->actual_features = + (device_features & BIT_ULL(VIRTIO_F_VERSION_1)); ndev->vqs = kcalloc(max_vqs, sizeof(*ndev->vqs), GFP_KERNEL); ndev->event_cbs = kcalloc(max_vqs + 1, sizeof(*ndev->event_cbs), GFP_KERNEL); -- GitLab From c2aa6567a6a486a61325eb222afbebf28768989f Mon Sep 17 00:00:00 2001 From: Matthias Fend Date: Tue, 7 Jan 2025 17:07:01 +0100 Subject: [PATCH 0297/2211] media: tc358746: improve calculation of the D-PHY timing registers [ Upstream commit 78d7265e2e1ce349e7f3c6a085f2b66d7b73f4ca ] When calculating D-PHY registers, using data rates that are not multiples of 16 can lead to precision loss in division operations. This can result in register values that produce timing violations against the MIPI standard. An example: cfg->hs_clk_rate = 294MHz hf_clk = 18 If the desired value in cfg->init is 100us, which is the minimum allowed value, then the LINEINITCNT register is calculated as 1799. But since the actual clock is 18.375MHz instead of 18MHz, this setting results in a time that is shorter than 100us and thus violates the standard. The correct value for LINEINITCNT would be 1837. Improve the precision of calculations by using Hz instead of MHz as unit. Signed-off-by: Matthias Fend Reviewed-by: Marco Felsch Signed-off-by: Hans Verkuil Signed-off-by: Sasha Levin --- drivers/media/i2c/tc358746.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/drivers/media/i2c/tc358746.c b/drivers/media/i2c/tc358746.c index 389582420ba78..048a1a381b333 100644 --- a/drivers/media/i2c/tc358746.c +++ b/drivers/media/i2c/tc358746.c @@ -460,24 +460,20 @@ out: return err; } -/* Use MHz as base so the div needs no u64 */ -static u32 tc358746_cfg_to_cnt(unsigned int cfg_val, - unsigned int clk_mhz, - unsigned int time_base) +static u32 tc358746_cfg_to_cnt(unsigned long cfg_val, unsigned long clk_hz, + unsigned long long time_base) { - return DIV_ROUND_UP(cfg_val * clk_mhz, time_base); + return div64_u64((u64)cfg_val * clk_hz + time_base - 1, time_base); } -static u32 tc358746_ps_to_cnt(unsigned int cfg_val, - unsigned int clk_mhz) +static u32 tc358746_ps_to_cnt(unsigned long cfg_val, unsigned long clk_hz) { - return tc358746_cfg_to_cnt(cfg_val, clk_mhz, USEC_PER_SEC); + return tc358746_cfg_to_cnt(cfg_val, clk_hz, PSEC_PER_SEC); } -static u32 tc358746_us_to_cnt(unsigned int cfg_val, - unsigned int clk_mhz) +static u32 tc358746_us_to_cnt(unsigned long cfg_val, unsigned long clk_hz) { - return tc358746_cfg_to_cnt(cfg_val, clk_mhz, 1); + return tc358746_cfg_to_cnt(cfg_val, clk_hz, USEC_PER_SEC); } static int tc358746_apply_dphy_config(struct tc358746 *tc358746) @@ -492,7 +488,6 @@ static int tc358746_apply_dphy_config(struct tc358746 *tc358746) /* The hs_byte_clk is also called SYSCLK in the excel sheet */ hs_byte_clk = cfg->hs_clk_rate / 8; - hs_byte_clk /= HZ_PER_MHZ; hf_clk = hs_byte_clk / 2; val = tc358746_us_to_cnt(cfg->init, hf_clk) - 1; -- GitLab From a68686c08b70bdad0b1a406bcfe7e07f3bdc5da2 Mon Sep 17 00:00:00 2001 From: Jianbo Liu Date: Thu, 20 Feb 2025 23:39:53 +0200 Subject: [PATCH 0298/2211] net/mlx5e: Add correct match to check IPSec syndromes for switchdev mode [ Upstream commit 85e4a808af2545fefaf18c8fe50071b06fcbdabc ] In commit dddb49b63d86 ("net/mlx5e: Add IPsec and ASO syndromes check in HW"), IPSec and ASO syndromes checks after decryption for the specified ASO object were added. But they are correct only for eswith in legacy mode. For switchdev mode, metadata register c1 is used to save the mapped id (not ASO object id). So, need to change the match accordingly for the check rules in status table. Signed-off-by: Jianbo Liu Reviewed-by: Leon Romanovsky Reviewed-by: Patrisious Haddad Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20250220213959.504304-4-tariqt@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- .../mellanox/mlx5/core/en_accel/ipsec_fs.c | 28 ++++++++++++++----- .../mellanox/mlx5/core/esw/ipsec_fs.c | 13 +++++++++ .../mellanox/mlx5/core/esw/ipsec_fs.h | 5 ++++ include/linux/mlx5/eswitch.h | 2 ++ 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c index 57861d34d46f8..59b9653f573c8 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c @@ -165,6 +165,25 @@ static void ipsec_rx_status_pass_destroy(struct mlx5e_ipsec *ipsec, #endif } +static void ipsec_rx_rule_add_match_obj(struct mlx5e_ipsec_sa_entry *sa_entry, + struct mlx5e_ipsec_rx *rx, + struct mlx5_flow_spec *spec) +{ + struct mlx5e_ipsec *ipsec = sa_entry->ipsec; + + if (rx == ipsec->rx_esw) { + mlx5_esw_ipsec_rx_rule_add_match_obj(sa_entry, spec); + } else { + MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, + misc_parameters_2.metadata_reg_c_2); + MLX5_SET(fte_match_param, spec->match_value, + misc_parameters_2.metadata_reg_c_2, + sa_entry->ipsec_obj_id | BIT(31)); + + spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS_2; + } +} + static int rx_add_rule_drop_auth_trailer(struct mlx5e_ipsec_sa_entry *sa_entry, struct mlx5e_ipsec_rx *rx) { @@ -200,11 +219,8 @@ static int rx_add_rule_drop_auth_trailer(struct mlx5e_ipsec_sa_entry *sa_entry, MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, misc_parameters_2.ipsec_syndrome); MLX5_SET(fte_match_param, spec->match_value, misc_parameters_2.ipsec_syndrome, 1); - MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, misc_parameters_2.metadata_reg_c_2); - MLX5_SET(fte_match_param, spec->match_value, - misc_parameters_2.metadata_reg_c_2, - sa_entry->ipsec_obj_id | BIT(31)); spec->match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS_2; + ipsec_rx_rule_add_match_obj(sa_entry, rx, spec); rule = mlx5_add_flow_rules(ft, spec, &flow_act, &dest, 1); if (IS_ERR(rule)) { err = PTR_ERR(rule); @@ -281,10 +297,8 @@ static int rx_add_rule_drop_replay(struct mlx5e_ipsec_sa_entry *sa_entry, struct MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, misc_parameters_2.metadata_reg_c_4); MLX5_SET(fte_match_param, spec->match_value, misc_parameters_2.metadata_reg_c_4, 1); - MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, misc_parameters_2.metadata_reg_c_2); - MLX5_SET(fte_match_param, spec->match_value, misc_parameters_2.metadata_reg_c_2, - sa_entry->ipsec_obj_id | BIT(31)); spec->match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS_2; + ipsec_rx_rule_add_match_obj(sa_entry, rx, spec); rule = mlx5_add_flow_rules(ft, spec, &flow_act, &dest, 1); if (IS_ERR(rule)) { err = PTR_ERR(rule); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c b/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c index ed977ae75fab8..4bba2884c1c05 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c @@ -85,6 +85,19 @@ err_header_alloc: return err; } +void mlx5_esw_ipsec_rx_rule_add_match_obj(struct mlx5e_ipsec_sa_entry *sa_entry, + struct mlx5_flow_spec *spec) +{ + MLX5_SET(fte_match_param, spec->match_criteria, + misc_parameters_2.metadata_reg_c_1, + ESW_IPSEC_RX_MAPPED_ID_MATCH_MASK); + MLX5_SET(fte_match_param, spec->match_value, + misc_parameters_2.metadata_reg_c_1, + sa_entry->rx_mapped_id << ESW_ZONE_ID_BITS); + + spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS_2; +} + void mlx5_esw_ipsec_rx_id_mapping_remove(struct mlx5e_ipsec_sa_entry *sa_entry) { struct mlx5e_ipsec *ipsec = sa_entry->ipsec; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.h b/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.h index ac9c65b89166e..514c15258b1d1 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.h @@ -20,6 +20,8 @@ int mlx5_esw_ipsec_rx_ipsec_obj_id_search(struct mlx5e_priv *priv, u32 id, void mlx5_esw_ipsec_tx_create_attr_set(struct mlx5e_ipsec *ipsec, struct mlx5e_ipsec_tx_create_attr *attr); void mlx5_esw_ipsec_restore_dest_uplink(struct mlx5_core_dev *mdev); +void mlx5_esw_ipsec_rx_rule_add_match_obj(struct mlx5e_ipsec_sa_entry *sa_entry, + struct mlx5_flow_spec *spec); #else static inline void mlx5_esw_ipsec_rx_create_attr_set(struct mlx5e_ipsec *ipsec, struct mlx5e_ipsec_rx_create_attr *attr) {} @@ -48,5 +50,8 @@ static inline void mlx5_esw_ipsec_tx_create_attr_set(struct mlx5e_ipsec *ipsec, struct mlx5e_ipsec_tx_create_attr *attr) {} static inline void mlx5_esw_ipsec_restore_dest_uplink(struct mlx5_core_dev *mdev) {} +static inline void +mlx5_esw_ipsec_rx_rule_add_match_obj(struct mlx5e_ipsec_sa_entry *sa_entry, + struct mlx5_flow_spec *spec) {} #endif /* CONFIG_MLX5_ESWITCH */ #endif /* __MLX5_ESW_IPSEC_FS_H__ */ diff --git a/include/linux/mlx5/eswitch.h b/include/linux/mlx5/eswitch.h index df73a2ccc9af3..67256e776566c 100644 --- a/include/linux/mlx5/eswitch.h +++ b/include/linux/mlx5/eswitch.h @@ -147,6 +147,8 @@ u32 mlx5_eswitch_get_vport_metadata_for_set(struct mlx5_eswitch *esw, /* reuse tun_opts for the mapped ipsec obj id when tun_id is 0 (invalid) */ #define ESW_IPSEC_RX_MAPPED_ID_MASK GENMASK(ESW_TUN_OPTS_BITS - 1, 0) +#define ESW_IPSEC_RX_MAPPED_ID_MATCH_MASK \ + GENMASK(31 - ESW_RESERVED_BITS, ESW_ZONE_ID_BITS) u8 mlx5_eswitch_mode(const struct mlx5_core_dev *dev); u16 mlx5_eswitch_get_total_vports(const struct mlx5_core_dev *dev); -- GitLab From 5b62f941eae80688aecbbbaed44b51cbb0fe1fa7 Mon Sep 17 00:00:00 2001 From: Ranjan Kumar Date: Thu, 20 Feb 2025 19:55:26 +0530 Subject: [PATCH 0299/2211] scsi: mpi3mr: Update timestamp only for supervisor IOCs [ Upstream commit 83a9d30d29f275571f6e8f879f04b2379be7eb6c ] The driver issues the time stamp update command periodically. Even if the command fails with supervisor only IOC Status. Instead check the Non-Supervisor capability bit reported by IOC as part of IOC Facts. Co-developed-by: Sumit Saxena Signed-off-by: Sumit Saxena Signed-off-by: Ranjan Kumar Link: https://lore.kernel.org/r/20250220142528.20837-3-ranjan.kumar@broadcom.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/mpi3mr/mpi3mr_fw.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c index f6d3db3fd0d8e..604f37e5c0c35 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_fw.c +++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c @@ -2747,7 +2747,10 @@ static void mpi3mr_watchdog_work(struct work_struct *work) return; } - if (mrioc->ts_update_counter++ >= mrioc->ts_update_interval) { + if (!(mrioc->facts.ioc_capabilities & + MPI3_IOCFACTS_CAPABILITY_NON_SUPERVISOR_IOC) && + (mrioc->ts_update_counter++ >= mrioc->ts_update_interval)) { + mrioc->ts_update_counter = 0; mpi3mr_sync_timestamp(mrioc); } -- GitLab From 20a53c3689a20a5e34b88fc7705b7f0bf883eb1c Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Fri, 31 Jan 2025 13:00:40 +0100 Subject: [PATCH 0300/2211] loop: check in LO_FLAGS_DIRECT_IO in loop_default_blocksize [ Upstream commit f6f9e32fe1e454ae8ac0190b2c2bd6074914beec ] We can't go below the minimum direct I/O size no matter if direct I/O is enabled by passing in an O_DIRECT file descriptor or due to the explicit flag. Now that LO_FLAGS_DIRECT_IO is set earlier after assigning a backing file, loop_default_blocksize can check it instead of the O_DIRECT flag to handle both conditions. Signed-off-by: Christoph Hellwig Reviewed-by: Damien Le Moal Link: https://lore.kernel.org/r/20250131120120.1315125-4-hch@lst.de Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/block/loop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 6bd44ec2c9b1a..fa9c77b8f4d23 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -916,7 +916,7 @@ static unsigned int loop_default_blocksize(struct loop_device *lo, struct block_device *backing_bdev) { /* In case of direct I/O, match underlying block size */ - if ((lo->lo_backing_file->f_flags & O_DIRECT) && backing_bdev) + if ((lo->lo_flags & LO_FLAGS_DIRECT_IO) && backing_bdev) return bdev_logical_block_size(backing_bdev); return SECTOR_SIZE; } -- GitLab From 2c600cbe33f2072b218037895b58753cc49e5e97 Mon Sep 17 00:00:00 2001 From: Nandakumar Edamana Date: Sat, 22 Feb 2025 02:31:11 +0530 Subject: [PATCH 0301/2211] libbpf: Fix out-of-bound read [ Upstream commit 236d3910117e9f97ebf75e511d8bcc950f1a4e5f ] In `set_kcfg_value_str`, an untrusted string is accessed with the assumption that it will be at least two characters long due to the presence of checks for opening and closing quotes. But the check for the closing quote (value[len - 1] != '"') misses the fact that it could be checking the opening quote itself in case of an invalid input that consists of just the opening quote. This commit adds an explicit check to make sure the string is at least two characters long. Signed-off-by: Nandakumar Edamana Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250221210110.3182084-1-nandakumar@nandakumar.co.in Signed-off-by: Sasha Levin --- tools/lib/bpf/libbpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 5ff643e60d09c..6e4d417604fa0 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -2074,7 +2074,7 @@ static int set_kcfg_value_str(struct extern_desc *ext, char *ext_val, } len = strlen(value); - if (value[len - 1] != '"') { + if (len < 2 || value[len - 1] != '"') { pr_warn("extern (kcfg) '%s': invalid string config '%s'\n", ext->name, value); return -EINVAL; -- GitLab From b55a97d1bd4083729a60d19beffe85d4c96680de Mon Sep 17 00:00:00 2001 From: Jinliang Zheng Date: Thu, 20 Feb 2025 19:20:14 +0800 Subject: [PATCH 0302/2211] dm: fix unconditional IO throttle caused by REQ_PREFLUSH [ Upstream commit 88f7f56d16f568f19e1a695af34a7f4a6ce537a6 ] When a bio with REQ_PREFLUSH is submitted to dm, __send_empty_flush() generates a flush_bio with REQ_OP_WRITE | REQ_PREFLUSH | REQ_SYNC, which causes the flush_bio to be throttled by wbt_wait(). An example from v5.4, similar problem also exists in upstream: crash> bt 2091206 PID: 2091206 TASK: ffff2050df92a300 CPU: 109 COMMAND: "kworker/u260:0" #0 [ffff800084a2f7f0] __switch_to at ffff80004008aeb8 #1 [ffff800084a2f820] __schedule at ffff800040bfa0c4 #2 [ffff800084a2f880] schedule at ffff800040bfa4b4 #3 [ffff800084a2f8a0] io_schedule at ffff800040bfa9c4 #4 [ffff800084a2f8c0] rq_qos_wait at ffff8000405925bc #5 [ffff800084a2f940] wbt_wait at ffff8000405bb3a0 #6 [ffff800084a2f9a0] __rq_qos_throttle at ffff800040592254 #7 [ffff800084a2f9c0] blk_mq_make_request at ffff80004057cf38 #8 [ffff800084a2fa60] generic_make_request at ffff800040570138 #9 [ffff800084a2fae0] submit_bio at ffff8000405703b4 #10 [ffff800084a2fb50] xlog_write_iclog at ffff800001280834 [xfs] #11 [ffff800084a2fbb0] xlog_sync at ffff800001280c3c [xfs] #12 [ffff800084a2fbf0] xlog_state_release_iclog at ffff800001280df4 [xfs] #13 [ffff800084a2fc10] xlog_write at ffff80000128203c [xfs] #14 [ffff800084a2fcd0] xlog_cil_push at ffff8000012846dc [xfs] #15 [ffff800084a2fda0] xlog_cil_push_work at ffff800001284a2c [xfs] #16 [ffff800084a2fdb0] process_one_work at ffff800040111d08 #17 [ffff800084a2fe00] worker_thread at ffff8000401121cc #18 [ffff800084a2fe70] kthread at ffff800040118de4 After commit 2def2845cc33 ("xfs: don't allow log IO to be throttled"), the metadata submitted by xlog_write_iclog() should not be throttled. But due to the existence of the dm layer, throttling flush_bio indirectly causes the metadata bio to be throttled. Fix this by conditionally adding REQ_IDLE to flush_bio.bi_opf, which makes wbt_should_throttle() return false to avoid wbt_wait(). Signed-off-by: Jinliang Zheng Reviewed-by: Tianxiang Peng Reviewed-by: Hao Peng Signed-off-by: Mikulas Patocka Signed-off-by: Sasha Levin --- drivers/md/dm.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 19230404d8c2b..d29125ee9e72a 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1541,14 +1541,18 @@ static void __send_empty_flush(struct clone_info *ci) { struct dm_table *t = ci->map; struct bio flush_bio; + blk_opf_t opf = REQ_OP_WRITE | REQ_PREFLUSH | REQ_SYNC; + + if ((ci->io->orig_bio->bi_opf & (REQ_IDLE | REQ_SYNC)) == + (REQ_IDLE | REQ_SYNC)) + opf |= REQ_IDLE; /* * Use an on-stack bio for this, it's safe since we don't * need to reference it after submit. It's just used as * the basis for the clone(s). */ - bio_init(&flush_bio, ci->io->md->disk->part0, NULL, 0, - REQ_OP_WRITE | REQ_PREFLUSH | REQ_SYNC); + bio_init(&flush_bio, ci->io->md->disk->part0, NULL, 0, opf); ci->bio = &flush_bio; ci->sector_count = 0; -- GitLab From d2d76fc02543a94fc126d8c8e490aa2f9a7ce5fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20M=C3=A4kisara?= Date: Thu, 13 Feb 2025 11:26:30 +0200 Subject: [PATCH 0303/2211] scsi: scsi_debug: First fixes for tapes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit f69da85d5d5cc5b7dfb963a6c6c1ac0dd9002341 ] Patch includes the following: - Enable MODE SENSE/SELECT without actual page (to read/write only the Block Descriptor) - Store the density code and block size in the Block Descriptor (only short version for tapes) - Fix REWIND not to use the wrong page filling function Signed-off-by: Kai Mäkisara Link: https://lore.kernel.org/r/20250213092636.2510-2-Kai.Makisara@kolumbus.fi Reviewed-by: John Meneghini Tested-by: John Meneghini Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/scsi_debug.c | 55 ++++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 680ba180a6725..89a2aaccdcfce 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c @@ -173,6 +173,10 @@ static const char *sdebug_version_date = "20210520"; #define DEF_ZBC_MAX_OPEN_ZONES 8 #define DEF_ZBC_NR_CONV_ZONES 1 +/* Default parameters for tape drives */ +#define TAPE_DEF_DENSITY 0x0 +#define TAPE_DEF_BLKSIZE 0 + #define SDEBUG_LUN_0_VAL 0 /* bit mask values for sdebug_opts */ @@ -363,6 +367,10 @@ struct sdebug_dev_info { ktime_t create_ts; /* time since bootup that this device was created */ struct sdeb_zone_state *zstate; + /* For tapes */ + unsigned int tape_blksize; + unsigned int tape_density; + struct dentry *debugfs_entry; struct spinlock list_lock; struct list_head inject_err_list; @@ -773,7 +781,7 @@ static const struct opcode_info_t opcode_info_arr[SDEB_I_LAST_ELEM_P1 + 1] = { /* 20 */ {0, 0x1e, 0, 0, NULL, NULL, /* ALLOW REMOVAL */ {6, 0, 0, 0, 0x3, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, - {0, 0x1, 0, 0, resp_start_stop, NULL, /* REWIND ?? */ + {0, 0x1, 0, 0, NULL, NULL, /* REWIND ?? */ {6, 0x1, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, {0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* ATA_PT */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, @@ -2742,7 +2750,7 @@ static int resp_mode_sense(struct scsi_cmnd *scp, unsigned char *ap; unsigned char *arr __free(kfree); unsigned char *cmd = scp->cmnd; - bool dbd, llbaa, msense_6, is_disk, is_zbc; + bool dbd, llbaa, msense_6, is_disk, is_zbc, is_tape; arr = kzalloc(SDEBUG_MAX_MSENSE_SZ, GFP_ATOMIC); if (!arr) @@ -2755,7 +2763,8 @@ static int resp_mode_sense(struct scsi_cmnd *scp, llbaa = msense_6 ? false : !!(cmd[1] & 0x10); is_disk = (sdebug_ptype == TYPE_DISK); is_zbc = devip->zoned; - if ((is_disk || is_zbc) && !dbd) + is_tape = (sdebug_ptype == TYPE_TAPE); + if ((is_disk || is_zbc || is_tape) && !dbd) bd_len = llbaa ? 16 : 8; else bd_len = 0; @@ -2793,15 +2802,25 @@ static int resp_mode_sense(struct scsi_cmnd *scp, put_unaligned_be32(0xffffffff, ap + 0); else put_unaligned_be32(sdebug_capacity, ap + 0); - put_unaligned_be16(sdebug_sector_size, ap + 6); + if (is_tape) { + ap[0] = devip->tape_density; + put_unaligned_be16(devip->tape_blksize, ap + 6); + } else + put_unaligned_be16(sdebug_sector_size, ap + 6); offset += bd_len; ap = arr + offset; } else if (16 == bd_len) { + if (is_tape) { + mk_sense_invalid_fld(scp, SDEB_IN_DATA, 1, 4); + return check_condition_result; + } put_unaligned_be64((u64)sdebug_capacity, ap + 0); put_unaligned_be32(sdebug_sector_size, ap + 12); offset += bd_len; ap = arr + offset; } + if (cmd[2] == 0) + goto only_bd; /* Only block descriptor requested */ /* * N.B. If len>0 before resp_*_pg() call, then form of that call should be: @@ -2902,6 +2921,7 @@ static int resp_mode_sense(struct scsi_cmnd *scp, default: goto bad_pcode; } +only_bd: if (msense_6) arr[0] = offset - 1; else @@ -2945,8 +2965,27 @@ static int resp_mode_select(struct scsi_cmnd *scp, __func__, param_len, res); md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2); bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6); - off = bd_len + (mselect6 ? 4 : 8); - if (md_len > 2 || off >= res) { + off = (mselect6 ? 4 : 8); + if (sdebug_ptype == TYPE_TAPE) { + int blksize; + + if (bd_len != 8) { + mk_sense_invalid_fld(scp, SDEB_IN_DATA, + mselect6 ? 3 : 6, -1); + return check_condition_result; + } + blksize = get_unaligned_be16(arr + off + 6); + if ((blksize % 4) != 0) { + mk_sense_invalid_fld(scp, SDEB_IN_DATA, off + 6, -1); + return check_condition_result; + } + devip->tape_density = arr[off]; + devip->tape_blksize = blksize; + } + off += bd_len; + if (off >= res) + return 0; /* No page written, just descriptors */ + if (md_len > 2) { mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1); return check_condition_result; } @@ -5835,6 +5874,10 @@ static struct sdebug_dev_info *sdebug_device_create( } else { devip->zoned = false; } + if (sdebug_ptype == TYPE_TAPE) { + devip->tape_density = TAPE_DEF_DENSITY; + devip->tape_blksize = TAPE_DEF_BLKSIZE; + } devip->create_ts = ktime_get_boottime(); atomic_set(&devip->stopped, (sdeb_tur_ms_to_ready > 0 ? 2 : 0)); spin_lock_init(&devip->list_lock); -- GitLab From 0bdaab17a2a177bbb8dfa96cf1413d183e8b6ea6 Mon Sep 17 00:00:00 2001 From: Patrisious Haddad Date: Wed, 19 Feb 2025 10:58:08 +0200 Subject: [PATCH 0304/2211] net/mlx5: Change POOL_NEXT_SIZE define value and make it global [ Upstream commit 80df31f384b4146a62a01b3d4beb376cc7b9a89e ] Change POOL_NEXT_SIZE define value from 0 to BIT(30), since this define is used to request the available maximum sized flow table, and zero doesn't make sense for it, whereas some places in the driver use zero explicitly expecting the smallest table size possible but instead due to this define they end up allocating the biggest table size unawarely. In addition move the definition to "include/linux/mlx5/fs.h" to expose the define to IB driver as well, while appropriately renaming it. Signed-off-by: Patrisious Haddad Reviewed-by: Maor Gottlieb Reviewed-by: Mark Bloch Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20250219085808.349923-3-tariqt@nvidia.com Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/fs_ft_pool.c | 6 ++++-- drivers/net/ethernet/mellanox/mlx5/core/fs_ft_pool.h | 2 -- drivers/net/ethernet/mellanox/mlx5/core/lib/fs_chains.c | 3 ++- include/linux/mlx5/fs.h | 2 ++ 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c b/drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c index 8587cd572da53..bdb825aa87268 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c @@ -96,7 +96,7 @@ static int esw_create_legacy_fdb_table(struct mlx5_eswitch *esw) if (!flow_group_in) return -ENOMEM; - ft_attr.max_fte = POOL_NEXT_SIZE; + ft_attr.max_fte = MLX5_FS_MAX_POOL_SIZE; ft_attr.prio = LEGACY_FDB_PRIO; fdb = mlx5_create_flow_table(root_ns, &ft_attr); if (IS_ERR(fdb)) { diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_ft_pool.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_ft_pool.c index c14590acc7726..f6abfd00d7e68 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_ft_pool.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_ft_pool.c @@ -50,10 +50,12 @@ mlx5_ft_pool_get_avail_sz(struct mlx5_core_dev *dev, enum fs_flow_table_type tab int i, found_i = -1; for (i = ARRAY_SIZE(FT_POOLS) - 1; i >= 0; i--) { - if (dev->priv.ft_pool->ft_left[i] && FT_POOLS[i] >= desired_size && + if (dev->priv.ft_pool->ft_left[i] && + (FT_POOLS[i] >= desired_size || + desired_size == MLX5_FS_MAX_POOL_SIZE) && FT_POOLS[i] <= max_ft_size) { found_i = i; - if (desired_size != POOL_NEXT_SIZE) + if (desired_size != MLX5_FS_MAX_POOL_SIZE) break; } } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_ft_pool.h b/drivers/net/ethernet/mellanox/mlx5/core/fs_ft_pool.h index 25f4274b372b5..173e312db7204 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_ft_pool.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_ft_pool.h @@ -7,8 +7,6 @@ #include #include "fs_core.h" -#define POOL_NEXT_SIZE 0 - int mlx5_ft_pool_init(struct mlx5_core_dev *dev); void mlx5_ft_pool_destroy(struct mlx5_core_dev *dev); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/fs_chains.c b/drivers/net/ethernet/mellanox/mlx5/core/lib/fs_chains.c index 711d14dea2485..d313cb7f0ed88 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/lib/fs_chains.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/fs_chains.c @@ -161,7 +161,8 @@ mlx5_chains_create_table(struct mlx5_fs_chains *chains, ft_attr.flags |= (MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT | MLX5_FLOW_TABLE_TUNNEL_EN_DECAP); - sz = (chain == mlx5_chains_get_nf_ft_chain(chains)) ? FT_TBL_SZ : POOL_NEXT_SIZE; + sz = (chain == mlx5_chains_get_nf_ft_chain(chains)) ? + FT_TBL_SZ : MLX5_FS_MAX_POOL_SIZE; ft_attr.max_fte = sz; /* We use chains_default_ft(chains) as the table's next_ft till diff --git a/include/linux/mlx5/fs.h b/include/linux/mlx5/fs.h index b744e554f014d..db5c9ddef1702 100644 --- a/include/linux/mlx5/fs.h +++ b/include/linux/mlx5/fs.h @@ -40,6 +40,8 @@ #define MLX5_SET_CFG(p, f, v) MLX5_SET(create_flow_group_in, p, f, v) +#define MLX5_FS_MAX_POOL_SIZE BIT(30) + enum mlx5_flow_destination_type { MLX5_FLOW_DESTINATION_TYPE_NONE, MLX5_FLOW_DESTINATION_TYPE_VPORT, -- GitLab From 562e512f6bf999c9966baf64b4d9fded8071919e Mon Sep 17 00:00:00 2001 From: Balbir Singh Date: Fri, 7 Feb 2025 10:42:34 +1100 Subject: [PATCH 0305/2211] x86/kaslr: Reduce KASLR entropy on most x86 systems [ Upstream commit 7ffb791423c7c518269a9aad35039ef824a40adb ] When CONFIG_PCI_P2PDMA=y (which is basically enabled on all large x86 distros), it maps the PFN's via a ZONE_DEVICE mapping using devm_memremap_pages(). The mapped virtual address range corresponds to the pci_resource_start() of the BAR address and size corresponding to the BAR length. When KASLR is enabled, the direct map range of the kernel is reduced to the size of physical memory plus additional padding. If the BAR address is beyond this limit, PCI peer to peer DMA mappings fail. Fix this by not shrinking the size of the direct map when CONFIG_PCI_P2PDMA=y. This reduces the total available entropy, but it's better than the current work around of having to disable KASLR completely. [ mingo: Clarified the changelog to point out the broad impact ... ] Signed-off-by: Balbir Singh Signed-off-by: Ingo Molnar Reviewed-by: Kees Cook Acked-by: Bjorn Helgaas # drivers/pci/Kconfig Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Andy Lutomirski Link: https://lore.kernel.org/lkml/20250206023201.1481957-1-balbirs@nvidia.com/ Link: https://lore.kernel.org/r/20250206234234.1912585-1-balbirs@nvidia.com -- arch/x86/mm/kaslr.c | 10 ++++++++-- drivers/pci/Kconfig | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-) Signed-off-by: Sasha Levin --- arch/x86/mm/kaslr.c | 10 ++++++++-- drivers/pci/Kconfig | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c index 230f1dee4f095..e0b0ec0f82457 100644 --- a/arch/x86/mm/kaslr.c +++ b/arch/x86/mm/kaslr.c @@ -109,8 +109,14 @@ void __init kernel_randomize_memory(void) memory_tb = DIV_ROUND_UP(max_pfn << PAGE_SHIFT, 1UL << TB_SHIFT) + CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING; - /* Adapt physical memory region size based on available memory */ - if (memory_tb < kaslr_regions[0].size_tb) + /* + * Adapt physical memory region size based on available memory, + * except when CONFIG_PCI_P2PDMA is enabled. P2PDMA exposes the + * device BAR space assuming the direct map space is large enough + * for creating a ZONE_DEVICE mapping in the direct map corresponding + * to the physical BAR address. + */ + if (!IS_ENABLED(CONFIG_PCI_P2PDMA) && (memory_tb < kaslr_regions[0].size_tb)) kaslr_regions[0].size_tb = memory_tb; /* diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig index 0d94e4a967d81..7cef00d9d7ab6 100644 --- a/drivers/pci/Kconfig +++ b/drivers/pci/Kconfig @@ -194,6 +194,12 @@ config PCI_P2PDMA P2P DMA transactions must be between devices behind the same root port. + Enabling this option will reduce the entropy of x86 KASLR memory + regions. For example - on a 46 bit system, the entropy goes down + from 16 bits to 15 bits. The actual reduction in entropy depends + on the physical address bits, on processor features, kernel config + (5 level page table) and physical memory present on the system. + If unsure, say N. config PCI_LABEL -- GitLab From 9f27b38771b05067f5fadf4628296efb768e50d4 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Sun, 16 Feb 2025 11:07:24 +0800 Subject: [PATCH 0306/2211] crypto: ahash - Set default reqsize from ahash_alg [ Upstream commit 9e01aaa1033d6e40f8d7cf4f20931a61ce9e3f04 ] Add a reqsize field to struct ahash_alg and use it to set the default reqsize so that algorithms with a static reqsize are not forced to create an init_tfm function. Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- crypto/ahash.c | 4 ++++ include/crypto/hash.h | 3 +++ 2 files changed, 7 insertions(+) diff --git a/crypto/ahash.c b/crypto/ahash.c index bcd9de009a91b..fe19bf7f15eb9 100644 --- a/crypto/ahash.c +++ b/crypto/ahash.c @@ -473,6 +473,7 @@ static int crypto_ahash_init_tfm(struct crypto_tfm *tfm) struct ahash_alg *alg = crypto_ahash_alg(hash); crypto_ahash_set_statesize(hash, alg->halg.statesize); + crypto_ahash_set_reqsize(hash, alg->reqsize); if (tfm->__crt_alg->cra_type == &crypto_shash_type) return crypto_init_ahash_using_shash(tfm); @@ -638,6 +639,9 @@ static int ahash_prepare_alg(struct ahash_alg *alg) if (alg->halg.statesize == 0) return -EINVAL; + if (alg->reqsize && alg->reqsize < alg->halg.statesize) + return -EINVAL; + err = hash_prepare_alg(&alg->halg); if (err) return err; diff --git a/include/crypto/hash.h b/include/crypto/hash.h index 2d5ea9f9ff43e..6692253f0b5be 100644 --- a/include/crypto/hash.h +++ b/include/crypto/hash.h @@ -132,6 +132,7 @@ struct ahash_request { * This is a counterpart to @init_tfm, used to remove * various changes set in @init_tfm. * @clone_tfm: Copy transform into new object, may allocate memory. + * @reqsize: Size of the request context. * @halg: see struct hash_alg_common */ struct ahash_alg { @@ -148,6 +149,8 @@ struct ahash_alg { void (*exit_tfm)(struct crypto_ahash *tfm); int (*clone_tfm)(struct crypto_ahash *dst, struct crypto_ahash *src); + unsigned int reqsize; + struct hash_alg_common halg; }; -- GitLab From 897c98fb328011461cc63ea1533688bdac035ad8 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Sat, 15 Feb 2025 08:57:51 +0800 Subject: [PATCH 0307/2211] crypto: skcipher - Zap type in crypto_alloc_sync_skcipher [ Upstream commit ee509efc74ddbc59bb5d6fd6e050f9ef25f74bff ] The type needs to be zeroed as otherwise the user could use it to allocate an asynchronous sync skcipher. Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- crypto/skcipher.c | 1 + 1 file changed, 1 insertion(+) diff --git a/crypto/skcipher.c b/crypto/skcipher.c index ceed7f33a67ba..fd3273b519dc0 100644 --- a/crypto/skcipher.c +++ b/crypto/skcipher.c @@ -844,6 +844,7 @@ struct crypto_sync_skcipher *crypto_alloc_sync_skcipher( /* Only sync algorithms allowed. */ mask |= CRYPTO_ALG_ASYNC | CRYPTO_ALG_SKCIPHER_REQSIZE_LARGE; + type &= ~(CRYPTO_ALG_ASYNC | CRYPTO_ALG_SKCIPHER_REQSIZE_LARGE); tfm = crypto_alloc_tfm(alg_name, &crypto_skcipher_type, type, mask); -- GitLab From 4d9fa2ebc01c492bf478bbdbfc5c9ebd4b27aeb4 Mon Sep 17 00:00:00 2001 From: Xiao Liang Date: Wed, 19 Feb 2025 20:50:33 +0800 Subject: [PATCH 0308/2211] net: ipv6: Init tunnel link-netns before registering dev [ Upstream commit db014522f35606031d8ac58b4aed6b1ed84f03d1 ] Currently some IPv6 tunnel drivers set tnl->net to dev_net(dev) in ndo_init(), which is called in register_netdevice(). However, it lacks the context of link-netns when we enable cross-net tunnels at device registration time. Let's move the init of tunnel link-netns before register_netdevice(). ip6_gre has already initialized netns, so just remove the redundant assignment. Signed-off-by: Xiao Liang Reviewed-by: Kuniyuki Iwashima Link: https://patch.msgid.link/20250219125039.18024-8-shaw.leon@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/ipv6/ip6_gre.c | 2 -- net/ipv6/ip6_tunnel.c | 3 ++- net/ipv6/ip6_vti.c | 3 ++- net/ipv6/sit.c | 8 +++++--- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index 235808cfec705..68e9a41eed491 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c @@ -1498,7 +1498,6 @@ static int ip6gre_tunnel_init_common(struct net_device *dev) tunnel = netdev_priv(dev); tunnel->dev = dev; - tunnel->net = dev_net(dev); strcpy(tunnel->parms.name, dev->name); ret = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL); @@ -1882,7 +1881,6 @@ static int ip6erspan_tap_init(struct net_device *dev) tunnel = netdev_priv(dev); tunnel->dev = dev; - tunnel->net = dev_net(dev); strcpy(tunnel->parms.name, dev->name); ret = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL); diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 48fd53b989726..5350c9bb2319b 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c @@ -1878,7 +1878,6 @@ ip6_tnl_dev_init_gen(struct net_device *dev) int t_hlen; t->dev = dev; - t->net = dev_net(dev); ret = dst_cache_init(&t->dst_cache, GFP_KERNEL); if (ret) @@ -1940,6 +1939,7 @@ static int __net_init ip6_fb_tnl_dev_init(struct net_device *dev) struct net *net = dev_net(dev); struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); + t->net = net; t->parms.proto = IPPROTO_IPV6; rcu_assign_pointer(ip6n->tnls_wc[0], t); @@ -2013,6 +2013,7 @@ static int ip6_tnl_newlink(struct net *src_net, struct net_device *dev, int err; nt = netdev_priv(dev); + nt->net = net; if (ip_tunnel_netlink_encap_parms(data, &ipencap)) { err = ip6_tnl_encap_setup(nt, &ipencap); diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c index 590737c275379..0123504691443 100644 --- a/net/ipv6/ip6_vti.c +++ b/net/ipv6/ip6_vti.c @@ -925,7 +925,6 @@ static inline int vti6_dev_init_gen(struct net_device *dev) struct ip6_tnl *t = netdev_priv(dev); t->dev = dev; - t->net = dev_net(dev); netdev_hold(dev, &t->dev_tracker, GFP_KERNEL); netdev_lockdep_set_classes(dev); return 0; @@ -958,6 +957,7 @@ static int __net_init vti6_fb_tnl_dev_init(struct net_device *dev) struct net *net = dev_net(dev); struct vti6_net *ip6n = net_generic(net, vti6_net_id); + t->net = net; t->parms.proto = IPPROTO_IPV6; rcu_assign_pointer(ip6n->tnls_wc[0], t); @@ -1008,6 +1008,7 @@ static int vti6_newlink(struct net *src_net, struct net_device *dev, vti6_netlink_parms(data, &nt->parms); nt->parms.proto = IPPROTO_IPV6; + nt->net = net; if (vti6_locate(net, &nt->parms, 0)) return -EEXIST; diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 39bd8951bfca1..3c15a0ae228e2 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c @@ -269,6 +269,7 @@ static struct ip_tunnel *ipip6_tunnel_locate(struct net *net, nt = netdev_priv(dev); + nt->net = net; nt->parms = *parms; if (ipip6_tunnel_create(dev) < 0) goto failed_free; @@ -1449,7 +1450,6 @@ static int ipip6_tunnel_init(struct net_device *dev) int err; tunnel->dev = dev; - tunnel->net = dev_net(dev); strcpy(tunnel->parms.name, dev->name); ipip6_tunnel_bind_dev(dev); @@ -1563,6 +1563,7 @@ static int ipip6_newlink(struct net *src_net, struct net_device *dev, int err; nt = netdev_priv(dev); + nt->net = net; if (ip_tunnel_netlink_encap_parms(data, &ipencap)) { err = ip_tunnel_encap_setup(nt, &ipencap); @@ -1858,6 +1859,9 @@ static int __net_init sit_init_net(struct net *net) */ sitn->fb_tunnel_dev->netns_local = true; + t = netdev_priv(sitn->fb_tunnel_dev); + t->net = net; + err = register_netdev(sitn->fb_tunnel_dev); if (err) goto err_reg_dev; @@ -1865,8 +1869,6 @@ static int __net_init sit_init_net(struct net *net) ipip6_tunnel_clone_6rd(sitn->fb_tunnel_dev, sitn); ipip6_fb_tunnel_init(sitn->fb_tunnel_dev); - t = netdev_priv(sitn->fb_tunnel_dev); - strcpy(t->parms.name, sitn->fb_tunnel_dev->name); return 0; -- GitLab From 9058b48578aea5c59189ccb72abbd0bc9fa43a45 Mon Sep 17 00:00:00 2001 From: Umesh Nerlige Ramappa Date: Tue, 11 Feb 2025 17:02:55 -0800 Subject: [PATCH 0309/2211] drm/xe/oa: Ensure that polled read returns latest data [ Upstream commit 98c9d27ab30aa9c6451d3a34e6e297171f273e51 ] In polled mode, user calls poll() for read data to be available before performing a read(). In the duration between these 2 calls, there may be new data available in the OA buffer. To ensure user reads all available data, check for latest data in the OA buffer in polled read. Signed-off-by: Umesh Nerlige Ramappa Reviewed-by: Ashutosh Dixit Link: https://patchwork.freedesktop.org/patch/msgid/20250212010255.1423343-1-umesh.nerlige.ramappa@intel.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_oa.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/xe/xe_oa.c b/drivers/gpu/drm/xe/xe_oa.c index 448766033690c..d306ed0a04434 100644 --- a/drivers/gpu/drm/xe/xe_oa.c +++ b/drivers/gpu/drm/xe/xe_oa.c @@ -535,6 +535,7 @@ static ssize_t xe_oa_read(struct file *file, char __user *buf, mutex_unlock(&stream->stream_lock); } while (!offset && !ret); } else { + xe_oa_buffer_check_unlocked(stream); mutex_lock(&stream->stream_lock); ret = __xe_oa_read(stream, buf, count, &offset); mutex_unlock(&stream->stream_lock); -- GitLab From af706d0e279fcc8e181ebe539a26e3a203c469a3 Mon Sep 17 00:00:00 2001 From: Bibo Mao Date: Tue, 9 Jun 2020 10:54:35 +0800 Subject: [PATCH 0310/2211] MIPS: Use arch specific syscall name match function [ Upstream commit 756276ce78d5624dc814f9d99f7d16c8fd51076e ] On MIPS system, most of the syscall function name begin with prefix sys_. Some syscalls are special such as clone/fork, function name of these begin with __sys_. Since scratch registers need be saved in stack when these system calls happens. With ftrace system call method, system call functions are declared with SYSCALL_DEFINEx, metadata of the system call symbol name begins with sys_. Here mips specific function arch_syscall_match_sym_name is used to compare function name between sys_call_table[] and metadata of syscall symbol. Signed-off-by: Bibo Mao Signed-off-by: Thomas Bogendoerfer Signed-off-by: Sasha Levin --- arch/mips/include/asm/ftrace.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/arch/mips/include/asm/ftrace.h b/arch/mips/include/asm/ftrace.h index dc025888f6d28..b41fc10446688 100644 --- a/arch/mips/include/asm/ftrace.h +++ b/arch/mips/include/asm/ftrace.h @@ -91,4 +91,20 @@ void prepare_ftrace_return(unsigned long *parent_ra_addr, unsigned long self_ra, #endif /* __ASSEMBLY__ */ #endif /* CONFIG_FUNCTION_TRACER */ + +#ifdef CONFIG_FTRACE_SYSCALLS +#ifndef __ASSEMBLY__ +/* + * Some syscall entry functions on mips start with "__sys_" (fork and clone, + * for instance). We should also match the sys_ variant with those. + */ +#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME +static inline bool arch_syscall_match_sym_name(const char *sym, + const char *name) +{ + return !strcmp(sym, name) || + (!strncmp(sym, "__sys_", 6) && !strcmp(sym + 6, name + 4)); +} +#endif /* __ASSEMBLY__ */ +#endif /* CONFIG_FTRACE_SYSCALLS */ #endif /* _ASM_MIPS_FTRACE_H */ -- GitLab From 95b8f2b7d9312054209bfd80460a1c6adae1ac29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=B6nig?= Date: Wed, 29 Jan 2025 16:28:49 +0100 Subject: [PATCH 0311/2211] drm/amdgpu: remove all KFD fences from the BO on release MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit cb0de06d1b0afb2d0c600ad748069f5ce27730ec ] Remove all KFD BOs from the private dma_resv object. This prevents the KFD from being evict unecessarily when an exported BO is released. Signed-off-by: Christian König Signed-off-by: James Zhu Reviewed-by: Felix Kuehling Reviewed-and-tested-by: James Zhu Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 5 +- .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 52 ++++++++----------- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 38 ++++++++------ 3 files changed, 47 insertions(+), 48 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h index f9d1194484423..581fe1a48f376 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h @@ -192,7 +192,7 @@ int kfd_debugfs_kfd_mem_limits(struct seq_file *m, void *data); #if IS_ENABLED(CONFIG_HSA_AMD) bool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm); struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f); -int amdgpu_amdkfd_remove_fence_on_pt_pd_bos(struct amdgpu_bo *bo); +void amdgpu_amdkfd_remove_all_eviction_fences(struct amdgpu_bo *bo); int amdgpu_amdkfd_evict_userptr(struct mmu_interval_notifier *mni, unsigned long cur_seq, struct kgd_mem *mem); int amdgpu_amdkfd_bo_validate_and_fence(struct amdgpu_bo *bo, @@ -212,9 +212,8 @@ struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f) } static inline -int amdgpu_amdkfd_remove_fence_on_pt_pd_bos(struct amdgpu_bo *bo) +void amdgpu_amdkfd_remove_all_eviction_fences(struct amdgpu_bo *bo) { - return 0; } static inline diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index fa572ba7f9fc1..1465b3adacb0a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -370,40 +370,32 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct amdgpu_bo *bo, return 0; } -int amdgpu_amdkfd_remove_fence_on_pt_pd_bos(struct amdgpu_bo *bo) +/** + * amdgpu_amdkfd_remove_all_eviction_fences - Remove all eviction fences + * @bo: the BO where to remove the evictions fences from. + * + * This functions should only be used on release when all references to the BO + * are already dropped. We remove the eviction fence from the private copy of + * the dma_resv object here since that is what is used during release to + * determine of the BO is idle or not. + */ +void amdgpu_amdkfd_remove_all_eviction_fences(struct amdgpu_bo *bo) { - struct amdgpu_bo *root = bo; - struct amdgpu_vm_bo_base *vm_bo; - struct amdgpu_vm *vm; - struct amdkfd_process_info *info; - struct amdgpu_amdkfd_fence *ef; - int ret; - - /* we can always get vm_bo from root PD bo.*/ - while (root->parent) - root = root->parent; + struct dma_resv *resv = &bo->tbo.base._resv; + struct dma_fence *fence, *stub; + struct dma_resv_iter cursor; - vm_bo = root->vm_bo; - if (!vm_bo) - return 0; + dma_resv_assert_held(resv); - vm = vm_bo->vm; - if (!vm) - return 0; - - info = vm->process_info; - if (!info || !info->eviction_fence) - return 0; - - ef = container_of(dma_fence_get(&info->eviction_fence->base), - struct amdgpu_amdkfd_fence, base); - - BUG_ON(!dma_resv_trylock(bo->tbo.base.resv)); - ret = amdgpu_amdkfd_remove_eviction_fence(bo, ef); - dma_resv_unlock(bo->tbo.base.resv); + stub = dma_fence_get_stub(); + dma_resv_for_each_fence(&cursor, resv, DMA_RESV_USAGE_BOOKKEEP, fence) { + if (!to_amdgpu_amdkfd_fence(fence)) + continue; - dma_fence_put(&ef->base); - return ret; + dma_resv_replace_fences(resv, fence->context, stub, + DMA_RESV_USAGE_BOOKKEEP); + } + dma_fence_put(stub); } static int amdgpu_amdkfd_bo_validate(struct amdgpu_bo *bo, uint32_t domain, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 4c4bdc4f51b29..fc588ef598c09 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -1246,28 +1246,36 @@ void amdgpu_bo_release_notify(struct ttm_buffer_object *bo) if (abo->kfd_bo) amdgpu_amdkfd_release_notify(abo); - /* We only remove the fence if the resv has individualized. */ - WARN_ON_ONCE(bo->type == ttm_bo_type_kernel - && bo->base.resv != &bo->base._resv); - if (bo->base.resv == &bo->base._resv) - amdgpu_amdkfd_remove_fence_on_pt_pd_bos(abo); + /* + * We lock the private dma_resv object here and since the BO is about to + * be released nobody else should have a pointer to it. + * So when this locking here fails something is wrong with the reference + * counting. + */ + if (WARN_ON_ONCE(!dma_resv_trylock(&bo->base._resv))) + return; + + amdgpu_amdkfd_remove_all_eviction_fences(abo); if (!bo->resource || bo->resource->mem_type != TTM_PL_VRAM || !(abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE) || adev->in_suspend || drm_dev_is_unplugged(adev_to_drm(adev))) - return; + goto out; - if (WARN_ON_ONCE(!dma_resv_trylock(bo->base.resv))) - return; + r = dma_resv_reserve_fences(&bo->base._resv, 1); + if (r) + goto out; - r = amdgpu_fill_buffer(abo, 0, bo->base.resv, &fence, true); - if (!WARN_ON(r)) { - amdgpu_vram_mgr_set_cleared(bo->resource); - amdgpu_bo_fence(abo, fence, false); - dma_fence_put(fence); - } + r = amdgpu_fill_buffer(abo, 0, &bo->base._resv, &fence, true); + if (WARN_ON(r)) + goto out; + + amdgpu_vram_mgr_set_cleared(bo->resource); + dma_resv_add_fence(&bo->base._resv, fence, DMA_RESV_USAGE_KERNEL); + dma_fence_put(fence); - dma_resv_unlock(bo->base.resv); +out: + dma_resv_unlock(&bo->base._resv); } /** -- GitLab From 5111c2e0cf2b650ebf69003e3a75aa055eb9a3b0 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Fri, 14 Feb 2025 16:07:46 +0100 Subject: [PATCH 0312/2211] x86/locking: Use ALT_OUTPUT_SP() for percpu_{,try_}cmpxchg{64,128}_op() [ Upstream commit 4087e16b033140cf2ce509ec23503bddec818a16 ] percpu_{,try_}cmpxchg{64,128}() macros use CALL instruction inside asm statement in one of their alternatives. Use ALT_OUTPUT_SP() macro to add required dependence on %esp register. ALT_OUTPUT_SP() implements the above dependence by adding ASM_CALL_CONSTRAINT to its arguments. This constraint should be used for any inline asm which has a CALL instruction, otherwise the compiler may schedule the asm before the frame pointer gets set up by the containing function, causing objtool to print a "call without frame pointer save/setup" warning. Signed-off-by: Uros Bizjak Signed-off-by: Ingo Molnar Cc: Linus Torvalds Link: https://lore.kernel.org/r/20250214150929.5780-1-ubizjak@gmail.com Signed-off-by: Sasha Levin --- arch/x86/include/asm/percpu.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h index c55a79d5feaeb..2d9c250b3c8d8 100644 --- a/arch/x86/include/asm/percpu.h +++ b/arch/x86/include/asm/percpu.h @@ -349,9 +349,9 @@ do { \ \ asm qual (ALTERNATIVE("call this_cpu_cmpxchg8b_emu", \ "cmpxchg8b " __percpu_arg([var]), X86_FEATURE_CX8) \ - : [var] "+m" (__my_cpu_var(_var)), \ - "+a" (old__.low), \ - "+d" (old__.high) \ + : ALT_OUTPUT_SP([var] "+m" (__my_cpu_var(_var)), \ + "+a" (old__.low), \ + "+d" (old__.high)) \ : "b" (new__.low), \ "c" (new__.high), \ "S" (&(_var)) \ @@ -380,10 +380,10 @@ do { \ asm qual (ALTERNATIVE("call this_cpu_cmpxchg8b_emu", \ "cmpxchg8b " __percpu_arg([var]), X86_FEATURE_CX8) \ CC_SET(z) \ - : CC_OUT(z) (success), \ - [var] "+m" (__my_cpu_var(_var)), \ - "+a" (old__.low), \ - "+d" (old__.high) \ + : ALT_OUTPUT_SP(CC_OUT(z) (success), \ + [var] "+m" (__my_cpu_var(_var)), \ + "+a" (old__.low), \ + "+d" (old__.high)) \ : "b" (new__.low), \ "c" (new__.high), \ "S" (&(_var)) \ @@ -420,9 +420,9 @@ do { \ \ asm qual (ALTERNATIVE("call this_cpu_cmpxchg16b_emu", \ "cmpxchg16b " __percpu_arg([var]), X86_FEATURE_CX16) \ - : [var] "+m" (__my_cpu_var(_var)), \ - "+a" (old__.low), \ - "+d" (old__.high) \ + : ALT_OUTPUT_SP([var] "+m" (__my_cpu_var(_var)), \ + "+a" (old__.low), \ + "+d" (old__.high)) \ : "b" (new__.low), \ "c" (new__.high), \ "S" (&(_var)) \ @@ -451,10 +451,10 @@ do { \ asm qual (ALTERNATIVE("call this_cpu_cmpxchg16b_emu", \ "cmpxchg16b " __percpu_arg([var]), X86_FEATURE_CX16) \ CC_SET(z) \ - : CC_OUT(z) (success), \ - [var] "+m" (__my_cpu_var(_var)), \ - "+a" (old__.low), \ - "+d" (old__.high) \ + : ALT_OUTPUT_SP(CC_OUT(z) (success), \ + [var] "+m" (__my_cpu_var(_var)), \ + "+a" (old__.low), \ + "+d" (old__.high)) \ : "b" (new__.low), \ "c" (new__.high), \ "S" (&(_var)) \ -- GitLab From 53f42776e435f63e5f8e61955e4c205dbfeaf524 Mon Sep 17 00:00:00 2001 From: Jason Gunthorpe Date: Wed, 19 Feb 2025 17:31:36 -0800 Subject: [PATCH 0313/2211] genirq/msi: Store the IOMMU IOVA directly in msi_desc instead of iommu_cookie [ Upstream commit 1f7df3a691740a7736bbc99dc4ed536120eb4746 ] The IOMMU translation for MSI message addresses has been a 2-step process, separated in time: 1) iommu_dma_prepare_msi(): A cookie pointer containing the IOVA address is stored in the MSI descriptor when an MSI interrupt is allocated. 2) iommu_dma_compose_msi_msg(): this cookie pointer is used to compute a translated message address. This has an inherent lifetime problem for the pointer stored in the cookie that must remain valid between the two steps. However, there is no locking at the irq layer that helps protect the lifetime. Today, this works under the assumption that the iommu domain is not changed while MSI interrupts being programmed. This is true for normal DMA API users within the kernel, as the iommu domain is attached before the driver is probed and cannot be changed while a driver is attached. Classic VFIO type1 also prevented changing the iommu domain while VFIO was running as it does not support changing the "container" after starting up. However, iommufd has improved this so that the iommu domain can be changed during VFIO operation. This potentially allows userspace to directly race VFIO_DEVICE_ATTACH_IOMMUFD_PT (which calls iommu_attach_group()) and VFIO_DEVICE_SET_IRQS (which calls into iommu_dma_compose_msi_msg()). This potentially causes both the cookie pointer and the unlocked call to iommu_get_domain_for_dev() on the MSI translation path to become UAFs. Fix the MSI cookie UAF by removing the cookie pointer. The translated IOVA address is already known during iommu_dma_prepare_msi() and cannot change. Thus, it can simply be stored as an integer in the MSI descriptor. The other UAF related to iommu_get_domain_for_dev() will be addressed in patch "iommu: Make iommu_dma_prepare_msi() into a generic operation" by using the IOMMU group mutex. Link: https://patch.msgid.link/r/a4f2cd76b9dc1833ee6c1cf325cba57def22231c.1740014950.git.nicolinc@nvidia.com Signed-off-by: Nicolin Chen Reviewed-by: Thomas Gleixner Signed-off-by: Jason Gunthorpe Signed-off-by: Sasha Levin --- drivers/iommu/dma-iommu.c | 28 +++++++++++++--------------- include/linux/msi.h | 33 ++++++++++++--------------------- 2 files changed, 25 insertions(+), 36 deletions(-) diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index 2a9fa0c8cc00f..0f0caf59023c7 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -1815,7 +1815,7 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) static DEFINE_MUTEX(msi_prepare_lock); /* see below */ if (!domain || !domain->iova_cookie) { - desc->iommu_cookie = NULL; + msi_desc_set_iommu_msi_iova(desc, 0, 0); return 0; } @@ -1827,11 +1827,12 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) mutex_lock(&msi_prepare_lock); msi_page = iommu_dma_get_msi_page(dev, msi_addr, domain); mutex_unlock(&msi_prepare_lock); - - msi_desc_set_iommu_cookie(desc, msi_page); - if (!msi_page) return -ENOMEM; + + msi_desc_set_iommu_msi_iova( + desc, msi_page->iova, + ilog2(cookie_msi_granule(domain->iova_cookie))); return 0; } @@ -1842,18 +1843,15 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) */ void iommu_dma_compose_msi_msg(struct msi_desc *desc, struct msi_msg *msg) { - struct device *dev = msi_desc_to_dev(desc); - const struct iommu_domain *domain = iommu_get_domain_for_dev(dev); - const struct iommu_dma_msi_page *msi_page; +#ifdef CONFIG_IRQ_MSI_IOMMU + if (desc->iommu_msi_shift) { + u64 msi_iova = desc->iommu_msi_iova << desc->iommu_msi_shift; - msi_page = msi_desc_get_iommu_cookie(desc); - - if (!domain || !domain->iova_cookie || WARN_ON(!msi_page)) - return; - - msg->address_hi = upper_32_bits(msi_page->iova); - msg->address_lo &= cookie_msi_granule(domain->iova_cookie) - 1; - msg->address_lo += lower_32_bits(msi_page->iova); + msg->address_hi = upper_32_bits(msi_iova); + msg->address_lo = lower_32_bits(msi_iova) | + (msg->address_lo & ((1 << desc->iommu_msi_shift) - 1)); + } +#endif } static int iommu_dma_init(void) diff --git a/include/linux/msi.h b/include/linux/msi.h index 59a421fc42bf0..63d0e51f7a801 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h @@ -165,6 +165,10 @@ struct msi_desc_data { * @dev: Pointer to the device which uses this descriptor * @msg: The last set MSI message cached for reuse * @affinity: Optional pointer to a cpu affinity mask for this descriptor + * @iommu_msi_iova: Optional shifted IOVA from the IOMMU to override the msi_addr. + * Only used if iommu_msi_shift != 0 + * @iommu_msi_shift: Indicates how many bits of the original address should be + * preserved when using iommu_msi_iova. * @sysfs_attr: Pointer to sysfs device attribute * * @write_msi_msg: Callback that may be called when the MSI message @@ -183,7 +187,8 @@ struct msi_desc { struct msi_msg msg; struct irq_affinity_desc *affinity; #ifdef CONFIG_IRQ_MSI_IOMMU - const void *iommu_cookie; + u64 iommu_msi_iova : 58; + u64 iommu_msi_shift : 6; #endif #ifdef CONFIG_SYSFS struct device_attribute *sysfs_attrs; @@ -284,28 +289,14 @@ struct msi_desc *msi_next_desc(struct device *dev, unsigned int domid, #define msi_desc_to_dev(desc) ((desc)->dev) -#ifdef CONFIG_IRQ_MSI_IOMMU -static inline const void *msi_desc_get_iommu_cookie(struct msi_desc *desc) -{ - return desc->iommu_cookie; -} - -static inline void msi_desc_set_iommu_cookie(struct msi_desc *desc, - const void *iommu_cookie) -{ - desc->iommu_cookie = iommu_cookie; -} -#else -static inline const void *msi_desc_get_iommu_cookie(struct msi_desc *desc) +static inline void msi_desc_set_iommu_msi_iova(struct msi_desc *desc, u64 msi_iova, + unsigned int msi_shift) { - return NULL; -} - -static inline void msi_desc_set_iommu_cookie(struct msi_desc *desc, - const void *iommu_cookie) -{ -} +#ifdef CONFIG_IRQ_MSI_IOMMU + desc->iommu_msi_iova = msi_iova >> msi_shift; + desc->iommu_msi_shift = msi_shift; #endif +} int msi_domain_insert_msi_desc(struct device *dev, unsigned int domid, struct msi_desc *init_desc); -- GitLab From 1a3529f36f26ef8ecb9c1f4fef49c2af3986da6d Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Wed, 29 Jan 2025 13:32:48 +0100 Subject: [PATCH 0314/2211] MIPS: pm-cps: Use per-CPU variables as per-CPU, not per-core [ Upstream commit 00a134fc2bb4a5f8fada58cf7ff4259149691d64 ] The pm-cps code has up until now used per-CPU variables indexed by core, rather than CPU number, in order to share data amongst sibling CPUs (ie. VPs/threads in a core). This works fine for single cluster systems, but with multi-cluster systems a core number is no longer unique in the system, leading to sharing between CPUs that are not actually siblings. Avoid this issue by using per-CPU variables as they are more generally used - ie. access them using CPU numbers rather than core numbers. Sharing between siblings is then accomplished by: - Assigning the same pointer to entries for each sibling CPU for the nc_asm_enter & ready_count variables, which allow this by virtue of being per-CPU pointers. - Indexing by the first CPU set in a CPUs cpu_sibling_map in the case of pm_barrier, for which we can't use the previous approach because the per-CPU variable is not a pointer. Signed-off-by: Paul Burton Signed-off-by: Dragan Mladjenovic Signed-off-by: Aleksandar Rikalo Tested-by: Serge Semin Tested-by: Gregory CLEMENT Signed-off-by: Thomas Bogendoerfer Signed-off-by: Sasha Levin --- arch/mips/kernel/pm-cps.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/arch/mips/kernel/pm-cps.c b/arch/mips/kernel/pm-cps.c index d09ca77e624d7..9369a8dc385e2 100644 --- a/arch/mips/kernel/pm-cps.c +++ b/arch/mips/kernel/pm-cps.c @@ -57,10 +57,7 @@ static DEFINE_PER_CPU_ALIGNED(u32*, ready_count); /* Indicates online CPUs coupled with the current CPU */ static DEFINE_PER_CPU_ALIGNED(cpumask_t, online_coupled); -/* - * Used to synchronize entry to deep idle states. Actually per-core rather - * than per-CPU. - */ +/* Used to synchronize entry to deep idle states */ static DEFINE_PER_CPU_ALIGNED(atomic_t, pm_barrier); /* Saved CPU state across the CPS_PM_POWER_GATED state */ @@ -112,9 +109,10 @@ int cps_pm_enter_state(enum cps_pm_state state) cps_nc_entry_fn entry; struct core_boot_config *core_cfg; struct vpe_boot_config *vpe_cfg; + atomic_t *barrier; /* Check that there is an entry function for this state */ - entry = per_cpu(nc_asm_enter, core)[state]; + entry = per_cpu(nc_asm_enter, cpu)[state]; if (!entry) return -EINVAL; @@ -150,7 +148,7 @@ int cps_pm_enter_state(enum cps_pm_state state) smp_mb__after_atomic(); /* Create a non-coherent mapping of the core ready_count */ - core_ready_count = per_cpu(ready_count, core); + core_ready_count = per_cpu(ready_count, cpu); nc_addr = kmap_noncoherent(virt_to_page(core_ready_count), (unsigned long)core_ready_count); nc_addr += ((unsigned long)core_ready_count & ~PAGE_MASK); @@ -158,7 +156,8 @@ int cps_pm_enter_state(enum cps_pm_state state) /* Ensure ready_count is zero-initialised before the assembly runs */ WRITE_ONCE(*nc_core_ready_count, 0); - coupled_barrier(&per_cpu(pm_barrier, core), online); + barrier = &per_cpu(pm_barrier, cpumask_first(&cpu_sibling_map[cpu])); + coupled_barrier(barrier, online); /* Run the generated entry code */ left = entry(online, nc_core_ready_count); @@ -629,12 +628,14 @@ out_err: static int cps_pm_online_cpu(unsigned int cpu) { - enum cps_pm_state state; - unsigned core = cpu_core(&cpu_data[cpu]); + unsigned int sibling, core; void *entry_fn, *core_rc; + enum cps_pm_state state; + + core = cpu_core(&cpu_data[cpu]); for (state = CPS_PM_NC_WAIT; state < CPS_PM_STATE_COUNT; state++) { - if (per_cpu(nc_asm_enter, core)[state]) + if (per_cpu(nc_asm_enter, cpu)[state]) continue; if (!test_bit(state, state_support)) continue; @@ -646,16 +647,19 @@ static int cps_pm_online_cpu(unsigned int cpu) clear_bit(state, state_support); } - per_cpu(nc_asm_enter, core)[state] = entry_fn; + for_each_cpu(sibling, &cpu_sibling_map[cpu]) + per_cpu(nc_asm_enter, sibling)[state] = entry_fn; } - if (!per_cpu(ready_count, core)) { + if (!per_cpu(ready_count, cpu)) { core_rc = kmalloc(sizeof(u32), GFP_KERNEL); if (!core_rc) { pr_err("Failed allocate core %u ready_count\n", core); return -ENOMEM; } - per_cpu(ready_count, core) = core_rc; + + for_each_cpu(sibling, &cpu_sibling_map[cpu]) + per_cpu(ready_count, sibling) = core_rc; } return 0; -- GitLab From 0b21e99cf638bc06f199204d2211034661f650b4 Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Wed, 29 Jan 2025 13:32:47 +0100 Subject: [PATCH 0315/2211] clocksource: mips-gic-timer: Enable counter when CPUs start MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 3128b0a2e0cf6e07aa78e5f8cf7dd9cd59dc8174 ] In multi-cluster MIPS I6500 systems there is a GIC in each cluster, each with its own counter. When a cluster powers up the counter will be stopped, with the COUNTSTOP bit set in the GIC_CONFIG register. In single cluster systems, it has been fine to clear COUNTSTOP once in gic_clocksource_of_init() to start the counter. In multi-cluster systems, this will only have started the counter in the boot cluster, and any CPUs in other clusters will find their counter stopped which will break the GIC clock_event_device. Resolve this by having CPUs clear the COUNTSTOP bit when they come online, using the existing gic_starting_cpu() CPU hotplug callback. This will allow CPUs in secondary clusters to ensure that the cluster's GIC counter is running as expected. Signed-off-by: Paul Burton Signed-off-by: Chao-ying Fu Signed-off-by: Dragan Mladjenovic Signed-off-by: Aleksandar Rikalo Reviewed-by: Philippe Mathieu-Daudé Tested-by: Serge Semin Tested-by: Gregory CLEMENT Acked-by: Daniel Lezcano Signed-off-by: Thomas Bogendoerfer Signed-off-by: Sasha Levin --- drivers/clocksource/mips-gic-timer.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/clocksource/mips-gic-timer.c b/drivers/clocksource/mips-gic-timer.c index 110347707ff98..8592910710d17 100644 --- a/drivers/clocksource/mips-gic-timer.c +++ b/drivers/clocksource/mips-gic-timer.c @@ -115,6 +115,9 @@ static void gic_update_frequency(void *data) static int gic_starting_cpu(unsigned int cpu) { + /* Ensure the GIC counter is running */ + clear_gic_config(GIC_CONFIG_COUNTSTOP); + gic_clockevent_cpu_init(cpu, this_cpu_ptr(&gic_clockevent_device)); return 0; } @@ -252,9 +255,6 @@ static int __init gic_clocksource_of_init(struct device_node *node) pr_warn("Unable to register clock notifier\n"); } - /* And finally start the counter */ - clear_gic_config(GIC_CONFIG_COUNTSTOP); - /* * It's safe to use the MIPS GIC timer as a sched clock source only if * its ticks are stable, which is true on either the platforms with -- GitLab From b5038d313a3b7fcf56b2e9853a7cf663dc83c47f Mon Sep 17 00:00:00 2001 From: Mrinmay Sarkar Date: Thu, 5 Dec 2024 12:24:20 +0530 Subject: [PATCH 0316/2211] PCI: epf-mhi: Update device ID for SA8775P MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 4f13dd9e2b1d2b317bb36704f8a7bd1d3017f7a2 ] Update device ID for the Qcom SA8775P SoC. Signed-off-by: Mrinmay Sarkar Link: https://lore.kernel.org/r/20241205065422.2515086-3-quic_msarkar@quicinc.com [kwilczynski: commit log] Signed-off-by: Krzysztof Wilczyński Signed-off-by: Sasha Levin --- drivers/pci/endpoint/functions/pci-epf-mhi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c b/drivers/pci/endpoint/functions/pci-epf-mhi.c index 54286a40bdfbf..6643a88c7a0ce 100644 --- a/drivers/pci/endpoint/functions/pci-epf-mhi.c +++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c @@ -125,7 +125,7 @@ static const struct pci_epf_mhi_ep_info sm8450_info = { static struct pci_epf_header sa8775p_header = { .vendorid = PCI_VENDOR_ID_QCOM, - .deviceid = 0x0306, /* FIXME: Update deviceid for sa8775p EP */ + .deviceid = 0x0116, .baseclass_code = PCI_CLASS_OTHERS, .interrupt_pin = PCI_INTERRUPT_INTA, }; -- GitLab From 1653c72dabfd68b68e4aa94d10075a8f16ca3ac2 Mon Sep 17 00:00:00 2001 From: Shivasharan S Date: Wed, 12 Feb 2025 17:26:55 -0800 Subject: [PATCH 0317/2211] scsi: mpt3sas: Send a diag reset if target reset fails [ Upstream commit 5612d6d51ed2634a033c95de2edec7449409cbb9 ] When an IOCTL times out and driver issues a target reset, if firmware fails the task management elevate the recovery by issuing a diag reset to controller. Signed-off-by: Shivasharan S Link: https://lore.kernel.org/r/1739410016-27503-5-git-send-email-shivasharan.srikanteshwara@broadcom.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/mpt3sas/mpt3sas_ctl.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/mpt3sas/mpt3sas_ctl.c b/drivers/scsi/mpt3sas/mpt3sas_ctl.c index 87784c96249a7..47faa27bc3559 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_ctl.c +++ b/drivers/scsi/mpt3sas/mpt3sas_ctl.c @@ -679,6 +679,7 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg, size_t data_in_sz = 0; long ret; u16 device_handle = MPT3SAS_INVALID_DEVICE_HANDLE; + int tm_ret; issue_reset = 0; @@ -1120,18 +1121,25 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg, if (pcie_device && (!ioc->tm_custom_handling) && (!(mpt3sas_scsih_is_pcie_scsi_device( pcie_device->device_info)))) - mpt3sas_scsih_issue_locked_tm(ioc, + tm_ret = mpt3sas_scsih_issue_locked_tm(ioc, le16_to_cpu(mpi_request->FunctionDependent1), 0, 0, 0, MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0, 0, pcie_device->reset_timeout, MPI26_SCSITASKMGMT_MSGFLAGS_PROTOCOL_LVL_RST_PCIE); else - mpt3sas_scsih_issue_locked_tm(ioc, + tm_ret = mpt3sas_scsih_issue_locked_tm(ioc, le16_to_cpu(mpi_request->FunctionDependent1), 0, 0, 0, MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0, 0, 30, MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET); + + if (tm_ret != SUCCESS) { + ioc_info(ioc, + "target reset failed, issue hard reset: handle (0x%04x)\n", + le16_to_cpu(mpi_request->FunctionDependent1)); + mpt3sas_base_hard_reset_handler(ioc, FORCE_BIG_HAMMER); + } } else mpt3sas_base_hard_reset_handler(ioc, FORCE_BIG_HAMMER); } -- GitLab From 9a3f80a727aac5e6c446d1386ad0c007734bf5cc Mon Sep 17 00:00:00 2001 From: Bitterblue Smith Date: Tue, 18 Feb 2025 01:30:48 +0200 Subject: [PATCH 0318/2211] wifi: rtw88: Fix rtw_init_vht_cap() for RTL8814AU [ Upstream commit 6be7544d19fcfcb729495e793bc6181f85bb8949 ] Set the MCS maps and the highest rates according to the number of spatial streams the chip has. For RTL8814AU that is 3. Signed-off-by: Bitterblue Smith Acked-by: Ping-Ke Shih Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/e86aa009-b5bf-4b3a-8112-ea5e3cd49465@gmail.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw88/main.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c index bbdef38c7e341..2c81e4cae039e 100644 --- a/drivers/net/wireless/realtek/rtw88/main.c +++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -1579,8 +1579,9 @@ static void rtw_init_vht_cap(struct rtw_dev *rtwdev, struct ieee80211_sta_vht_cap *vht_cap) { struct rtw_efuse *efuse = &rtwdev->efuse; - u16 mcs_map; + u16 mcs_map = 0; __le16 highest; + int i; if (efuse->hw_cap.ptcl != EFUSE_HW_CAP_IGNORE && efuse->hw_cap.ptcl != EFUSE_HW_CAP_PTCL_VHT) @@ -1603,21 +1604,15 @@ static void rtw_init_vht_cap(struct rtw_dev *rtwdev, if (rtw_chip_has_rx_ldpc(rtwdev)) vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC; - mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 | - IEEE80211_VHT_MCS_NOT_SUPPORTED << 4 | - IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 | - IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 | - IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 | - IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 | - IEEE80211_VHT_MCS_NOT_SUPPORTED << 14; - if (efuse->hw_cap.nss > 1) { - highest = cpu_to_le16(780); - mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << 2; - } else { - highest = cpu_to_le16(390); - mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << 2; + for (i = 0; i < 8; i++) { + if (i < efuse->hw_cap.nss) + mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2); + else + mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2); } + highest = cpu_to_le16(390 * efuse->hw_cap.nss); + vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map); vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map); vht_cap->vht_mcs.rx_highest = highest; -- GitLab From adcc65afaa97921d430a662229ae8e573a4a8dec Mon Sep 17 00:00:00 2001 From: Bitterblue Smith Date: Tue, 18 Feb 2025 01:30:22 +0200 Subject: [PATCH 0319/2211] wifi: rtw88: Fix rtw_init_ht_cap() for RTL8814AU [ Upstream commit c7eea1ba05ca5b0dbf77a27cf2e1e6e2fb3c0043 ] Set the RX mask and the highest RX rate according to the number of spatial streams the chip can receive. For RTL8814AU that is 3. Signed-off-by: Bitterblue Smith Acked-by: Ping-Ke Shih Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/4e786f50-ed1c-4387-8b28-e6ff00e35e81@gmail.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw88/main.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c index 2c81e4cae039e..a808af2f085ec 100644 --- a/drivers/net/wireless/realtek/rtw88/main.c +++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -1543,6 +1543,7 @@ static void rtw_init_ht_cap(struct rtw_dev *rtwdev, { const struct rtw_chip_info *chip = rtwdev->chip; struct rtw_efuse *efuse = &rtwdev->efuse; + int i; ht_cap->ht_supported = true; ht_cap->cap = 0; @@ -1562,17 +1563,11 @@ static void rtw_init_ht_cap(struct rtw_dev *rtwdev, ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; ht_cap->ampdu_density = chip->ampdu_density; ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; - if (efuse->hw_cap.nss > 1) { - ht_cap->mcs.rx_mask[0] = 0xFF; - ht_cap->mcs.rx_mask[1] = 0xFF; - ht_cap->mcs.rx_mask[4] = 0x01; - ht_cap->mcs.rx_highest = cpu_to_le16(300); - } else { - ht_cap->mcs.rx_mask[0] = 0xFF; - ht_cap->mcs.rx_mask[1] = 0x00; - ht_cap->mcs.rx_mask[4] = 0x01; - ht_cap->mcs.rx_highest = cpu_to_le16(150); - } + + for (i = 0; i < efuse->hw_cap.nss; i++) + ht_cap->mcs.rx_mask[i] = 0xFF; + ht_cap->mcs.rx_mask[4] = 0x01; + ht_cap->mcs.rx_highest = cpu_to_le16(150 * efuse->hw_cap.nss); } static void rtw_init_vht_cap(struct rtw_dev *rtwdev, -- GitLab From a4523765fa3a9f58012904c0329a8bb93ba20b0e Mon Sep 17 00:00:00 2001 From: Bitterblue Smith Date: Tue, 18 Feb 2025 01:29:52 +0200 Subject: [PATCH 0320/2211] wifi: rtw88: Fix rtw_desc_to_mcsrate() to handle MCS16-31 [ Upstream commit 86d04f8f991a0509e318fe886d5a1cf795736c7d ] This function translates the rate number reported by the hardware into something mac80211 can understand. It was ignoring the 3SS and 4SS HT rates. Translate them too. Also set *nss to 0 for the HT rates, just to make sure it's initialised. Signed-off-by: Bitterblue Smith Acked-by: Ping-Ke Shih Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/d0a5a86b-4869-47f6-a5a7-01c0f987cc7f@gmail.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw88/util.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw88/util.c b/drivers/net/wireless/realtek/rtw88/util.c index e222d3c01a77e..66819f6944055 100644 --- a/drivers/net/wireless/realtek/rtw88/util.c +++ b/drivers/net/wireless/realtek/rtw88/util.c @@ -101,7 +101,8 @@ void rtw_desc_to_mcsrate(u16 rate, u8 *mcs, u8 *nss) *nss = 4; *mcs = rate - DESC_RATEVHT4SS_MCS0; } else if (rate >= DESC_RATEMCS0 && - rate <= DESC_RATEMCS15) { + rate <= DESC_RATEMCS31) { + *nss = 0; *mcs = rate - DESC_RATEMCS0; } } -- GitLab From 1cbef396c5f3bf89f4787c975d85533f373bb9ad Mon Sep 17 00:00:00 2001 From: Ping-Ke Shih Date: Mon, 17 Feb 2025 14:43:06 +0800 Subject: [PATCH 0321/2211] wifi: rtw89: fw: propagate error code from rtw89_h2c_tx() [ Upstream commit 56e1acaa0f80620b8e2c3410db35b4b975782b0a ] The error code should be propagated to callers during downloading firmware header and body. Remove unnecessary assignment of -1. Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250217064308.43559-4-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/fw.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c index 620e076d1b597..9d26502a2885a 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.c +++ b/drivers/net/wireless/realtek/rtw89/fw.c @@ -1234,7 +1234,6 @@ static int __rtw89_fw_download_hdr(struct rtw89_dev *rtwdev, ret = rtw89_h2c_tx(rtwdev, skb, false); if (ret) { rtw89_err(rtwdev, "failed to send h2c\n"); - ret = -1; goto fail; } @@ -1311,7 +1310,6 @@ static int __rtw89_fw_download_main(struct rtw89_dev *rtwdev, ret = rtw89_h2c_tx(rtwdev, skb, true); if (ret) { rtw89_err(rtwdev, "failed to send h2c\n"); - ret = -1; goto fail; } -- GitLab From 6ffcf25e6322630cc495fb3cde7f0e9ca56afc72 Mon Sep 17 00:00:00 2001 From: Ping-Ke Shih Date: Mon, 17 Feb 2025 14:43:05 +0800 Subject: [PATCH 0322/2211] wifi: rtw89: fw: get sb_sel_ver via get_unaligned_le32() [ Upstream commit 2f9da853f4d848d23bade4c22931ea0f5a011674 ] The sb_sel_ver is selection version for secure boot recorded in firmware binary data, and its size is 4 and offset is 58 (not natural alignment). Use get_unaligned_le32() to get this value safely. Find this by reviewing. Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250217064308.43559-3-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/fw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c index 9d26502a2885a..f0e87af68d8cb 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.c +++ b/drivers/net/wireless/realtek/rtw89/fw.c @@ -285,7 +285,7 @@ static int __parse_formatted_mssc(struct rtw89_dev *rtwdev, if (!sec->secure_boot) goto out; - sb_sel_ver = le32_to_cpu(section_content->sb_sel_ver.v); + sb_sel_ver = get_unaligned_le32(§ion_content->sb_sel_ver.v); if (sb_sel_ver && sb_sel_ver != sec->sb_sel_mgn) goto ignore; -- GitLab From 7dafba4e854cd489790213a1af04986342b09c18 Mon Sep 17 00:00:00 2001 From: Ping-Ke Shih Date: Mon, 17 Feb 2025 14:43:04 +0800 Subject: [PATCH 0323/2211] wifi: rtw89: fw: add blacklist to avoid obsolete secure firmware [ Upstream commit f11d042b3a2e92ab1aa10e0da8e290bcdcf31d39 ] To ensure secure chip only runs expected secure firmware, stop using obsolete firmware in blacklist which weakness or flaw was found. Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250217064308.43559-2-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/core.h | 2 + drivers/net/wireless/realtek/rtw89/fw.c | 52 ++++++++++++++++++- drivers/net/wireless/realtek/rtw89/fw.h | 12 +++++ drivers/net/wireless/realtek/rtw89/rtw8851b.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852a.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852b.c | 1 + .../net/wireless/realtek/rtw89/rtw8852bt.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852c.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8922a.c | 1 + 9 files changed, 71 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h index ff3048d2489f1..4f64ea392e6c9 100644 --- a/drivers/net/wireless/realtek/rtw89/core.h +++ b/drivers/net/wireless/realtek/rtw89/core.h @@ -17,6 +17,7 @@ struct rtw89_dev; struct rtw89_pci_info; struct rtw89_mac_gen_def; struct rtw89_phy_gen_def; +struct rtw89_fw_blacklist; struct rtw89_efuse_block_cfg; struct rtw89_h2c_rf_tssi; struct rtw89_fw_txpwr_track_cfg; @@ -4232,6 +4233,7 @@ struct rtw89_chip_info { bool try_ce_fw; u8 bbmcu_nr; u32 needed_fw_elms; + const struct rtw89_fw_blacklist *fw_blacklist; u32 fifo_size; bool small_fifo_size; u32 dle_scc_rsvd_size; diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c index f0e87af68d8cb..93d760b8b5e35 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.c +++ b/drivers/net/wireless/realtek/rtw89/fw.c @@ -38,6 +38,16 @@ struct rtw89_arp_rsp { static const u8 mss_signature[] = {0x4D, 0x53, 0x53, 0x4B, 0x50, 0x4F, 0x4F, 0x4C}; +const struct rtw89_fw_blacklist rtw89_fw_blacklist_default = { + .ver = 0x00, + .list = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + }, +}; +EXPORT_SYMBOL(rtw89_fw_blacklist_default); + union rtw89_fw_element_arg { size_t offset; enum rtw89_rf_path rf_path; @@ -315,6 +325,46 @@ ignore: return 0; } +static int __check_secure_blacklist(struct rtw89_dev *rtwdev, + struct rtw89_fw_bin_info *info, + struct rtw89_fw_hdr_section_info *section_info, + const void *content) +{ + const struct rtw89_fw_blacklist *chip_blacklist = rtwdev->chip->fw_blacklist; + const union rtw89_fw_section_mssc_content *section_content = content; + struct rtw89_fw_secure *sec = &rtwdev->fw.sec; + u8 byte_idx; + u8 bit_mask; + + if (!sec->secure_boot) + return 0; + + if (!info->secure_section_exist || section_info->ignore) + return 0; + + if (!chip_blacklist) { + rtw89_err(rtwdev, "chip no blacklist for secure firmware\n"); + return -ENOENT; + } + + byte_idx = section_content->blacklist.bit_in_chip_list >> 3; + bit_mask = BIT(section_content->blacklist.bit_in_chip_list & 0x7); + + if (section_content->blacklist.ver > chip_blacklist->ver) { + rtw89_err(rtwdev, "chip blacklist out of date (%u, %u)\n", + section_content->blacklist.ver, chip_blacklist->ver); + return -EINVAL; + } + + if (chip_blacklist->list[byte_idx] & bit_mask) { + rtw89_err(rtwdev, "firmware %u in chip blacklist\n", + section_content->blacklist.ver); + return -EPERM; + } + + return 0; +} + static int __parse_security_section(struct rtw89_dev *rtwdev, struct rtw89_fw_bin_info *info, struct rtw89_fw_hdr_section_info *section_info, @@ -340,7 +390,7 @@ static int __parse_security_section(struct rtw89_dev *rtwdev, info->secure_section_exist = true; } - return 0; + return __check_secure_blacklist(rtwdev, info, section_info, content); } static int rtw89_fw_hdr_parser_v1(struct rtw89_dev *rtwdev, const u8 *fw, u32 len, diff --git a/drivers/net/wireless/realtek/rtw89/fw.h b/drivers/net/wireless/realtek/rtw89/fw.h index ccbbc43f33fee..502ece540b9dc 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.h +++ b/drivers/net/wireless/realtek/rtw89/fw.h @@ -639,6 +639,11 @@ struct rtw89_fw_mss_pool_hdr { } __packed; union rtw89_fw_section_mssc_content { + struct { + u8 pad[0x20]; + u8 bit_in_chip_list; + u8 ver; + } __packed blacklist; struct { u8 pad[58]; __le32 v; @@ -649,6 +654,13 @@ union rtw89_fw_section_mssc_content { } __packed key_sign_len; } __packed; +struct rtw89_fw_blacklist { + u8 ver; + u8 list[32]; +}; + +extern const struct rtw89_fw_blacklist rtw89_fw_blacklist_default; + static inline void SET_CTRL_INFO_MACID(void *table, u32 val) { le32p_replace_bits((__le32 *)(table) + 0, val, GENMASK(6, 0)); diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851b.c b/drivers/net/wireless/realtek/rtw89/rtw8851b.c index f9766bf30e71d..0d2a1e712b345 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8851b.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8851b.c @@ -2443,6 +2443,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = { .try_ce_fw = true, .bbmcu_nr = 0, .needed_fw_elms = 0, + .fw_blacklist = NULL, .fifo_size = 196608, .small_fifo_size = true, .dle_scc_rsvd_size = 98304, diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c index 42d369d2e916a..5f08207936c68 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c @@ -2159,6 +2159,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = { .try_ce_fw = false, .bbmcu_nr = 0, .needed_fw_elms = 0, + .fw_blacklist = NULL, .fifo_size = 458752, .small_fifo_size = false, .dle_scc_rsvd_size = 0, diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b.c b/drivers/net/wireless/realtek/rtw89/rtw8852b.c index 364aa21cbd446..0e03d97ba1cf6 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852b.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852b.c @@ -797,6 +797,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = { .try_ce_fw = true, .bbmcu_nr = 0, .needed_fw_elms = 0, + .fw_blacklist = &rtw89_fw_blacklist_default, .fifo_size = 196608, .small_fifo_size = true, .dle_scc_rsvd_size = 98304, diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c index dab7e71ec6a14..1dd3e51bab9f3 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c @@ -731,6 +731,7 @@ const struct rtw89_chip_info rtw8852bt_chip_info = { .try_ce_fw = true, .bbmcu_nr = 0, .needed_fw_elms = RTW89_AX_GEN_DEF_NEEDED_FW_ELEMENTS_NO_6GHZ, + .fw_blacklist = &rtw89_fw_blacklist_default, .fifo_size = 458752, .small_fifo_size = true, .dle_scc_rsvd_size = 98304, diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c index dbe77abb2c488..5e2592cf1a9fa 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c @@ -2936,6 +2936,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = { .try_ce_fw = false, .bbmcu_nr = 0, .needed_fw_elms = 0, + .fw_blacklist = &rtw89_fw_blacklist_default, .fifo_size = 458752, .small_fifo_size = false, .dle_scc_rsvd_size = 0, diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922a.c b/drivers/net/wireless/realtek/rtw89/rtw8922a.c index ef7747adbcc2b..64a41f24b2adb 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8922a.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8922a.c @@ -2632,6 +2632,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = { .try_ce_fw = false, .bbmcu_nr = 1, .needed_fw_elms = RTW89_BE_GEN_DEF_NEEDED_FW_ELEMENTS, + .fw_blacklist = &rtw89_fw_blacklist_default, .fifo_size = 589824, .small_fifo_size = false, .dle_scc_rsvd_size = 0, -- GitLab From d37783f25a3c8aa32d7fb2d61941dbbcd1ddb62b Mon Sep 17 00:00:00 2001 From: Kuan-Chung Chen Date: Mon, 17 Feb 2025 14:12:35 +0800 Subject: [PATCH 0324/2211] wifi: rtw89: 8922a: fix incorrect STA-ID in EHT MU PPDU [ Upstream commit bdce0574243b43b3bb2064f609c0c326df44c4c6 ] EHT MU PPDU contains user field of EHT-SIG field with STA-ID that must match AID subfield in the Associate Response. Add a necessary setting to prevent these from being inconsistent. Signed-off-by: Kuan-Chung Chen Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250217061235.32031-1-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/fw.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c index 93d760b8b5e35..9346fe082040c 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.c +++ b/drivers/net/wireless/realtek/rtw89/fw.c @@ -3128,9 +3128,10 @@ int rtw89_fw_h2c_assoc_cmac_tbl_g7(struct rtw89_dev *rtwdev, CCTLINFO_G7_W5_NOMINAL_PKT_PADDING3 | CCTLINFO_G7_W5_NOMINAL_PKT_PADDING4); - h2c->w6 = le32_encode_bits(vif->type == NL80211_IFTYPE_STATION ? 1 : 0, + h2c->w6 = le32_encode_bits(vif->cfg.aid, CCTLINFO_G7_W6_AID12_PAID) | + le32_encode_bits(vif->type == NL80211_IFTYPE_STATION ? 1 : 0, CCTLINFO_G7_W6_ULDL); - h2c->m6 = cpu_to_le32(CCTLINFO_G7_W6_ULDL); + h2c->m6 = cpu_to_le32(CCTLINFO_G7_W6_AID12_PAID | CCTLINFO_G7_W6_ULDL); if (rtwsta_link) { h2c->w8 = le32_encode_bits(link_sta->he_cap.has_he, -- GitLab From 6b1d3e9db82d01a88de1795b879df67c2116b4f4 Mon Sep 17 00:00:00 2001 From: Peter Seiderer Date: Wed, 19 Feb 2025 09:45:27 +0100 Subject: [PATCH 0325/2211] net: pktgen: fix access outside of user given buffer in pktgen_thread_write() [ Upstream commit 425e64440ad0a2f03bdaf04be0ae53dededbaa77 ] Honour the user given buffer size for the strn_len() calls (otherwise strn_len() will access memory outside of the user given buffer). Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250219084527.20488-8-ps.report@gmx.net Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/core/pktgen.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 4d87da56c56a0..762ede0278990 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -1898,8 +1898,8 @@ static ssize_t pktgen_thread_write(struct file *file, i = len; /* Read variable name */ - - len = strn_len(&user_buffer[i], sizeof(name) - 1); + max = min(sizeof(name) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1929,7 +1929,8 @@ static ssize_t pktgen_thread_write(struct file *file, if (!strcmp(name, "add_device")) { char f[32]; memset(f, 0, 32); - len = strn_len(&user_buffer[i], sizeof(f) - 1); + max = min(sizeof(f) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) { ret = len; goto out; -- GitLab From 4593aaf48fc16c7a06d05dd2db4b35d0deec718d Mon Sep 17 00:00:00 2001 From: Chris Morgan Date: Tue, 4 Feb 2025 09:58:33 -0600 Subject: [PATCH 0326/2211] power: supply: axp20x_battery: Update temp sensor for AXP717 from device tree [ Upstream commit bbcfe510ecd47f2db4c8653c7dfa9dc7a55b1583 ] Allow a boolean property of "x-powers,no-thermistor" to specify devices where the ts pin is not connected to anything. This works around an issue found with some devices where the efuse is not programmed correctly from the factory or when the register gets set erroneously. Signed-off-by: Chris Morgan Tested-by: Philippe Simons Link: https://lore.kernel.org/r/20250204155835.161973-4-macroalpha82@gmail.com Signed-off-by: Sebastian Reichel Signed-off-by: Sasha Levin --- drivers/power/supply/axp20x_battery.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c index 57eba1ddb17ba..88fbae613e8bc 100644 --- a/drivers/power/supply/axp20x_battery.c +++ b/drivers/power/supply/axp20x_battery.c @@ -89,6 +89,8 @@ #define AXP717_BAT_CC_MIN_UA 0 #define AXP717_BAT_CC_MAX_UA 3008000 +#define AXP717_TS_PIN_DISABLE BIT(4) + struct axp20x_batt_ps; struct axp_data { @@ -117,6 +119,7 @@ struct axp20x_batt_ps { /* Maximum constant charge current */ unsigned int max_ccc; const struct axp_data *data; + bool ts_disable; }; static int axp20x_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt, @@ -983,6 +986,24 @@ static void axp717_set_battery_info(struct platform_device *pdev, int ccc = info->constant_charge_current_max_ua; int val; + axp_batt->ts_disable = (device_property_read_bool(axp_batt->dev, + "x-powers,no-thermistor")); + + /* + * Under rare conditions an incorrectly programmed efuse for + * the temp sensor on the PMIC may trigger a fault condition. + * Allow users to hard-code if the ts pin is not used to work + * around this problem. Note that this requires the battery + * be correctly defined in the device tree with a monitored + * battery node. + */ + if (axp_batt->ts_disable) { + regmap_update_bits(axp_batt->regmap, + AXP717_TS_PIN_CFG, + AXP717_TS_PIN_DISABLE, + AXP717_TS_PIN_DISABLE); + } + if (vmin > 0 && axp717_set_voltage_min_design(axp_batt, vmin)) dev_err(&pdev->dev, "couldn't set voltage_min_design\n"); -- GitLab From 7d0c92af8d3557131da00059d34712b82922aecb Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Wed, 22 Jan 2025 07:50:26 +0100 Subject: [PATCH 0327/2211] EDAC/ie31200: work around false positive build warning [ Upstream commit c29dfd661fe2f8d1b48c7f00590929c04b25bf40 ] gcc-14 produces a bogus warning in some configurations: drivers/edac/ie31200_edac.c: In function 'ie31200_probe1.isra': drivers/edac/ie31200_edac.c:412:26: error: 'dimm_info' is used uninitialized [-Werror=uninitialized] 412 | struct dimm_data dimm_info[IE31200_CHANNELS][IE31200_DIMMS_PER_CHANNEL]; | ^~~~~~~~~ drivers/edac/ie31200_edac.c:412:26: note: 'dimm_info' declared here 412 | struct dimm_data dimm_info[IE31200_CHANNELS][IE31200_DIMMS_PER_CHANNEL]; | ^~~~~~~~~ I don't see any way the unintialized access could really happen here, but I can see why the compiler gets confused by the two loops. Instead, rework the two nested loops to only read the addr_decode registers and then keep only one instance of the dimm info structure. [Tony: Qiuxu pointed out that the "populate DIMM info" comment was left behind in the refactor and suggested moving it. I deleted the comment as unnecessry in front os a call to populate_dimm_info(). That seems pretty self-describing.] Signed-off-by: Arnd Bergmann Acked-by: Jason Baron Signed-off-by: Tony Luck Link: https://lore.kernel.org/all/20250122065031.1321015-1-arnd@kernel.org Signed-off-by: Sasha Levin --- drivers/edac/ie31200_edac.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/drivers/edac/ie31200_edac.c b/drivers/edac/ie31200_edac.c index 56be8ef40f376..e3635fba63b49 100644 --- a/drivers/edac/ie31200_edac.c +++ b/drivers/edac/ie31200_edac.c @@ -405,10 +405,9 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx) int i, j, ret; struct mem_ctl_info *mci = NULL; struct edac_mc_layer layers[2]; - struct dimm_data dimm_info[IE31200_CHANNELS][IE31200_DIMMS_PER_CHANNEL]; void __iomem *window; struct ie31200_priv *priv; - u32 addr_decode, mad_offset; + u32 addr_decode[IE31200_CHANNELS], mad_offset; /* * Kaby Lake, Coffee Lake seem to work like Skylake. Please re-visit @@ -466,19 +465,10 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx) mad_offset = IE31200_MAD_DIMM_0_OFFSET; } - /* populate DIMM info */ for (i = 0; i < IE31200_CHANNELS; i++) { - addr_decode = readl(window + mad_offset + + addr_decode[i] = readl(window + mad_offset + (i * 4)); - edac_dbg(0, "addr_decode: 0x%x\n", addr_decode); - for (j = 0; j < IE31200_DIMMS_PER_CHANNEL; j++) { - populate_dimm_info(&dimm_info[i][j], addr_decode, j, - skl); - edac_dbg(0, "size: 0x%x, rank: %d, width: %d\n", - dimm_info[i][j].size, - dimm_info[i][j].dual_rank, - dimm_info[i][j].x16_width); - } + edac_dbg(0, "addr_decode: 0x%x\n", addr_decode[i]); } /* @@ -489,14 +479,22 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx) */ for (i = 0; i < IE31200_DIMMS_PER_CHANNEL; i++) { for (j = 0; j < IE31200_CHANNELS; j++) { + struct dimm_data dimm_info; struct dimm_info *dimm; unsigned long nr_pages; - nr_pages = IE31200_PAGES(dimm_info[j][i].size, skl); + populate_dimm_info(&dimm_info, addr_decode[j], i, + skl); + edac_dbg(0, "size: 0x%x, rank: %d, width: %d\n", + dimm_info.size, + dimm_info.dual_rank, + dimm_info.x16_width); + + nr_pages = IE31200_PAGES(dimm_info.size, skl); if (nr_pages == 0) continue; - if (dimm_info[j][i].dual_rank) { + if (dimm_info.dual_rank) { nr_pages = nr_pages / 2; dimm = edac_get_dimm(mci, (i * 2) + 1, j, 0); dimm->nr_pages = nr_pages; -- GitLab From a82c0c39967710d6232b51a78b71222e9ffec705 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Wed, 29 Jan 2025 11:22:50 -0500 Subject: [PATCH 0328/2211] i3c: master: svc: Flush FIFO before sending Dynamic Address Assignment(DAA) [ Upstream commit a892ee4cf22a50e1d6988d0464a9a421f3e5db2f ] Ensure the FIFO is empty before issuing the DAA command to prevent incorrect command data from being sent. Align with other data transfers, such as svc_i3c_master_start_xfer_locked(), which flushes the FIFO before sending a command. Signed-off-by: Frank Li Reviewed-by: Miquel Raynal Link: https://lore.kernel.org/r/20250129162250.3629189-1-Frank.Li@nxp.com Signed-off-by: Alexandre Belloni Signed-off-by: Sasha Levin --- drivers/i3c/master/svc-i3c-master.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c index 6ffe022dbb5b4..62913feae45dd 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -860,6 +860,8 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master, u32 reg; int ret, i; + svc_i3c_master_flush_fifo(master); + while (true) { /* SVC_I3C_MCTRL_REQUEST_PROC_DAA have two mode, ENTER DAA or PROCESS DAA. * -- GitLab From 011a62d2d79ac5a1a14a1cc9d2f62490d25451b5 Mon Sep 17 00:00:00 2001 From: Chris Morgan Date: Tue, 4 Feb 2025 09:58:32 -0600 Subject: [PATCH 0329/2211] mfd: axp20x: AXP717: Add AXP717_TS_PIN_CFG to writeable regs [ Upstream commit bfad07fe298bfba0c7ddab87c5b5325970203a1e ] Add AXP717_TS_PIN_CFG (register 0x50) to the table of writeable registers so that the temperature sensor can be configured by the battery driver. Signed-off-by: Chris Morgan Link: https://lore.kernel.org/r/20250204155835.161973-3-macroalpha82@gmail.com Signed-off-by: Lee Jones Signed-off-by: Sasha Levin --- drivers/mfd/axp20x.c | 1 + include/linux/mfd/axp20x.h | 1 + 2 files changed, 2 insertions(+) diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c index 4051551757f2d..3780929039710 100644 --- a/drivers/mfd/axp20x.c +++ b/drivers/mfd/axp20x.c @@ -214,6 +214,7 @@ static const struct regmap_range axp717_writeable_ranges[] = { regmap_reg_range(AXP717_VSYS_V_POWEROFF, AXP717_VSYS_V_POWEROFF), regmap_reg_range(AXP717_IRQ0_EN, AXP717_IRQ4_EN), regmap_reg_range(AXP717_IRQ0_STATE, AXP717_IRQ4_STATE), + regmap_reg_range(AXP717_TS_PIN_CFG, AXP717_TS_PIN_CFG), regmap_reg_range(AXP717_ICC_CHG_SET, AXP717_CV_CHG_SET), regmap_reg_range(AXP717_DCDC_OUTPUT_CONTROL, AXP717_CPUSLDO_CONTROL), regmap_reg_range(AXP717_ADC_CH_EN_CONTROL, AXP717_ADC_CH_EN_CONTROL), diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h index f4dfc1871a95b..d1c21ad6440d1 100644 --- a/include/linux/mfd/axp20x.h +++ b/include/linux/mfd/axp20x.h @@ -135,6 +135,7 @@ enum axp20x_variants { #define AXP717_IRQ2_STATE 0x4a #define AXP717_IRQ3_STATE 0x4b #define AXP717_IRQ4_STATE 0x4c +#define AXP717_TS_PIN_CFG 0x50 #define AXP717_ICC_CHG_SET 0x62 #define AXP717_ITERM_CHG_SET 0x63 #define AXP717_CV_CHG_SET 0x64 -- GitLab From d85004266a32c69fb72243983bac9818c7998b01 Mon Sep 17 00:00:00 2001 From: Eddie James Date: Tue, 18 Feb 2025 16:09:59 -0600 Subject: [PATCH 0330/2211] eeprom: ee1004: Check chip before probing [ Upstream commit d9406677428e9234ea62bb2d2f5e996d1b777760 ] Like other eeprom drivers, check if the device is really there and functional before probing. Signed-off-by: Eddie James Link: https://lore.kernel.org/r/20250218220959.721698-1-eajames@linux.ibm.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/misc/eeprom/ee1004.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/misc/eeprom/ee1004.c b/drivers/misc/eeprom/ee1004.c index 89224d4af4a20..e13f9fdd9d7b1 100644 --- a/drivers/misc/eeprom/ee1004.c +++ b/drivers/misc/eeprom/ee1004.c @@ -304,6 +304,10 @@ static int ee1004_probe(struct i2c_client *client) I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_READ_BYTE_DATA)) return -EPFNOSUPPORT; + err = i2c_smbus_read_byte(client); + if (err < 0) + return -ENODEV; + mutex_lock(&ee1004_bus_lock); err = ee1004_init_bus_data(client); -- GitLab From 098788e118d1e8e480735242934fbc80cee645c2 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Mon, 17 Feb 2025 14:26:53 +0530 Subject: [PATCH 0331/2211] irqchip/riscv-imsic: Separate next and previous pointers in IMSIC vector [ Upstream commit 0f67911e821c67ecfccc365a2103ce276a9a56fe ] Currently, there is only one "move" pointer in struct imsic_vector so during vector movement the old vector points to the new vector and new vector points to itself. To support forced cleanup of the old vector, add separate "move_next" and "move_prev" pointers to struct imsic_vector, where during vector movement the "move_next" pointer of the old vector points to the new vector and the "move_prev" pointer of the new vector points to the old vector. Both "move_next" and "move_prev" pointers are cleared separately by __imsic_local_sync() with a restriction that "move_prev" on the new CPU is cleared only after the old CPU has cleared "move_next". Signed-off-by: Anup Patel Signed-off-by: Thomas Gleixner Link: https://lore.kernel.org/all/20250217085657.789309-8-apatel@ventanamicro.com Signed-off-by: Sasha Levin --- drivers/irqchip/irq-riscv-imsic-early.c | 8 ++- drivers/irqchip/irq-riscv-imsic-state.c | 96 +++++++++++++++++-------- drivers/irqchip/irq-riscv-imsic-state.h | 7 +- 3 files changed, 78 insertions(+), 33 deletions(-) diff --git a/drivers/irqchip/irq-riscv-imsic-early.c b/drivers/irqchip/irq-riscv-imsic-early.c index c5c2e6929a2f5..b5def6268936e 100644 --- a/drivers/irqchip/irq-riscv-imsic-early.c +++ b/drivers/irqchip/irq-riscv-imsic-early.c @@ -77,6 +77,12 @@ static void imsic_handle_irq(struct irq_desc *desc) struct imsic_vector *vec; unsigned long local_id; + /* + * Process pending local synchronization instead of waiting + * for per-CPU local timer to expire. + */ + imsic_local_sync_all(false); + chained_irq_enter(chip, desc); while ((local_id = csr_swap(CSR_TOPEI, 0))) { @@ -120,7 +126,7 @@ static int imsic_starting_cpu(unsigned int cpu) * Interrupts identities might have been enabled/disabled while * this CPU was not running so sync-up local enable/disable state. */ - imsic_local_sync_all(); + imsic_local_sync_all(true); /* Enable local interrupt delivery */ imsic_local_delivery(true); diff --git a/drivers/irqchip/irq-riscv-imsic-state.c b/drivers/irqchip/irq-riscv-imsic-state.c index b97e6cd89ed74..1aeba76d72795 100644 --- a/drivers/irqchip/irq-riscv-imsic-state.c +++ b/drivers/irqchip/irq-riscv-imsic-state.c @@ -124,10 +124,11 @@ void __imsic_eix_update(unsigned long base_id, unsigned long num_id, bool pend, } } -static void __imsic_local_sync(struct imsic_local_priv *lpriv) +static bool __imsic_local_sync(struct imsic_local_priv *lpriv) { struct imsic_local_config *mlocal; struct imsic_vector *vec, *mvec; + bool ret = true; int i; lockdep_assert_held(&lpriv->lock); @@ -143,35 +144,75 @@ static void __imsic_local_sync(struct imsic_local_priv *lpriv) __imsic_id_clear_enable(i); /* - * If the ID was being moved to a new ID on some other CPU - * then we can get a MSI during the movement so check the - * ID pending bit and re-trigger the new ID on other CPU - * using MMIO write. + * Clear the previous vector pointer of the new vector only + * after the movement is complete on the old CPU. */ - mvec = READ_ONCE(vec->move); - WRITE_ONCE(vec->move, NULL); - if (mvec && mvec != vec) { + mvec = READ_ONCE(vec->move_prev); + if (mvec) { + /* + * If the old vector has not been updated then + * try again in the next sync-up call. + */ + if (READ_ONCE(mvec->move_next)) { + ret = false; + continue; + } + + WRITE_ONCE(vec->move_prev, NULL); + } + + /* + * If a vector was being moved to a new vector on some other + * CPU then we can get a MSI during the movement so check the + * ID pending bit and re-trigger the new ID on other CPU using + * MMIO write. + */ + mvec = READ_ONCE(vec->move_next); + if (mvec) { if (__imsic_id_read_clear_pending(i)) { mlocal = per_cpu_ptr(imsic->global.local, mvec->cpu); writel_relaxed(mvec->local_id, mlocal->msi_va); } + WRITE_ONCE(vec->move_next, NULL); imsic_vector_free(&lpriv->vectors[i]); } skip: bitmap_clear(lpriv->dirty_bitmap, i, 1); } + + return ret; } -void imsic_local_sync_all(void) +#ifdef CONFIG_SMP +static void __imsic_local_timer_start(struct imsic_local_priv *lpriv) +{ + lockdep_assert_held(&lpriv->lock); + + if (!timer_pending(&lpriv->timer)) { + lpriv->timer.expires = jiffies + 1; + add_timer_on(&lpriv->timer, smp_processor_id()); + } +} +#else +static inline void __imsic_local_timer_start(struct imsic_local_priv *lpriv) +{ +} +#endif + +void imsic_local_sync_all(bool force_all) { struct imsic_local_priv *lpriv = this_cpu_ptr(imsic->lpriv); unsigned long flags; raw_spin_lock_irqsave(&lpriv->lock, flags); - bitmap_fill(lpriv->dirty_bitmap, imsic->global.nr_ids + 1); - __imsic_local_sync(lpriv); + + if (force_all) + bitmap_fill(lpriv->dirty_bitmap, imsic->global.nr_ids + 1); + if (!__imsic_local_sync(lpriv)) + __imsic_local_timer_start(lpriv); + raw_spin_unlock_irqrestore(&lpriv->lock, flags); } @@ -190,12 +231,7 @@ void imsic_local_delivery(bool enable) #ifdef CONFIG_SMP static void imsic_local_timer_callback(struct timer_list *timer) { - struct imsic_local_priv *lpriv = this_cpu_ptr(imsic->lpriv); - unsigned long flags; - - raw_spin_lock_irqsave(&lpriv->lock, flags); - __imsic_local_sync(lpriv); - raw_spin_unlock_irqrestore(&lpriv->lock, flags); + imsic_local_sync_all(false); } static void __imsic_remote_sync(struct imsic_local_priv *lpriv, unsigned int cpu) @@ -216,14 +252,11 @@ static void __imsic_remote_sync(struct imsic_local_priv *lpriv, unsigned int cpu */ if (cpu_online(cpu)) { if (cpu == smp_processor_id()) { - __imsic_local_sync(lpriv); - return; + if (__imsic_local_sync(lpriv)) + return; } - if (!timer_pending(&lpriv->timer)) { - lpriv->timer.expires = jiffies + 1; - add_timer_on(&lpriv->timer, cpu); - } + __imsic_local_timer_start(lpriv); } } #else @@ -278,8 +311,9 @@ void imsic_vector_unmask(struct imsic_vector *vec) raw_spin_unlock(&lpriv->lock); } -static bool imsic_vector_move_update(struct imsic_local_priv *lpriv, struct imsic_vector *vec, - bool new_enable, struct imsic_vector *new_move) +static bool imsic_vector_move_update(struct imsic_local_priv *lpriv, + struct imsic_vector *vec, bool is_old_vec, + bool new_enable, struct imsic_vector *move_vec) { unsigned long flags; bool enabled; @@ -289,7 +323,10 @@ static bool imsic_vector_move_update(struct imsic_local_priv *lpriv, struct imsi /* Update enable and move details */ enabled = READ_ONCE(vec->enable); WRITE_ONCE(vec->enable, new_enable); - WRITE_ONCE(vec->move, new_move); + if (is_old_vec) + WRITE_ONCE(vec->move_next, move_vec); + else + WRITE_ONCE(vec->move_prev, move_vec); /* Mark the vector as dirty and synchronize */ bitmap_set(lpriv->dirty_bitmap, vec->local_id, 1); @@ -322,8 +359,8 @@ void imsic_vector_move(struct imsic_vector *old_vec, struct imsic_vector *new_ve * interrupt on the old vector while device was being moved * to the new vector. */ - enabled = imsic_vector_move_update(old_lpriv, old_vec, false, new_vec); - imsic_vector_move_update(new_lpriv, new_vec, enabled, new_vec); + enabled = imsic_vector_move_update(old_lpriv, old_vec, true, false, new_vec); + imsic_vector_move_update(new_lpriv, new_vec, false, enabled, old_vec); } #ifdef CONFIG_GENERIC_IRQ_DEBUGFS @@ -386,7 +423,8 @@ struct imsic_vector *imsic_vector_alloc(unsigned int hwirq, const struct cpumask vec = &lpriv->vectors[local_id]; vec->hwirq = hwirq; vec->enable = false; - vec->move = NULL; + vec->move_next = NULL; + vec->move_prev = NULL; return vec; } diff --git a/drivers/irqchip/irq-riscv-imsic-state.h b/drivers/irqchip/irq-riscv-imsic-state.h index 391e442808275..f02842b84ed58 100644 --- a/drivers/irqchip/irq-riscv-imsic-state.h +++ b/drivers/irqchip/irq-riscv-imsic-state.h @@ -23,7 +23,8 @@ struct imsic_vector { unsigned int hwirq; /* Details accessed using local lock held */ bool enable; - struct imsic_vector *move; + struct imsic_vector *move_next; + struct imsic_vector *move_prev; }; struct imsic_local_priv { @@ -74,7 +75,7 @@ static inline void __imsic_id_clear_enable(unsigned long id) __imsic_eix_update(id, 1, false, false); } -void imsic_local_sync_all(void); +void imsic_local_sync_all(bool force_all); void imsic_local_delivery(bool enable); void imsic_vector_mask(struct imsic_vector *vec); @@ -87,7 +88,7 @@ static inline bool imsic_vector_isenabled(struct imsic_vector *vec) static inline struct imsic_vector *imsic_vector_get_move(struct imsic_vector *vec) { - return READ_ONCE(vec->move); + return READ_ONCE(vec->move_prev); } void imsic_vector_move(struct imsic_vector *old_vec, struct imsic_vector *new_vec); -- GitLab From 94e6687ceda912d52d6e030f0079bc6a33a47f0b Mon Sep 17 00:00:00 2001 From: Lijo Lazar Date: Tue, 18 Feb 2025 17:43:01 +0530 Subject: [PATCH 0332/2211] drm/amd/pm: Fetch current power limit from PMFW [ Upstream commit b2a9e562dfa156bd53e62ce571f3f8f65d243f14 ] On SMU v13.0.12, always query the firmware to get the current power limit as it could be updated through other means also. Signed-off-by: Lijo Lazar Reviewed-by: Asad Kamal Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c index 99d2d3092ea54..3fd8da5dc761e 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c @@ -2772,6 +2772,7 @@ int smu_get_power_limit(void *handle, switch (amdgpu_ip_version(adev, MP1_HWIP, 0)) { case IP_VERSION(13, 0, 2): case IP_VERSION(13, 0, 6): + case IP_VERSION(13, 0, 12): case IP_VERSION(13, 0, 14): case IP_VERSION(11, 0, 7): case IP_VERSION(11, 0, 11): -- GitLab From b02b561bf7692d8db2b7218c076aad8c32e1261c Mon Sep 17 00:00:00 2001 From: Harry VanZyllDeJong Date: Fri, 7 Feb 2025 13:46:53 -0500 Subject: [PATCH 0333/2211] drm/amd/display: Add support for disconnected eDP streams [ Upstream commit 6571bef25fe48c642f7a69ccf7c3198b317c136a ] [Why] eDP may not be connected to the GPU on driver start causing fail enumeration. [How] Move the virtual signal type check before the eDP connector signal check. Reviewed-by: Wenjing Liu Signed-off-by: Harry VanZyllDeJong Signed-off-by: Roman Li Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../drm/amd/display/dc/link/protocols/link_dp_capability.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c index 23e650e39910e..d9a1e1a599674 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c @@ -945,6 +945,9 @@ bool link_decide_link_settings(struct dc_stream_state *stream, * TODO: add MST specific link training routine */ decide_mst_link_settings(link, link_setting); + } else if (stream->signal == SIGNAL_TYPE_VIRTUAL) { + link_setting->lane_count = LANE_COUNT_FOUR; + link_setting->link_rate = LINK_RATE_HIGH3; } else if (link->connector_signal == SIGNAL_TYPE_EDP) { /* enable edp link optimization for DSC eDP case */ if (stream->timing.flags.DSC) { @@ -967,9 +970,6 @@ bool link_decide_link_settings(struct dc_stream_state *stream, } else { edp_decide_link_settings(link, link_setting, req_bw); } - } else if (stream->signal == SIGNAL_TYPE_VIRTUAL) { - link_setting->lane_count = LANE_COUNT_FOUR; - link_setting->link_rate = LINK_RATE_HIGH3; } else { decide_dp_link_settings(link, link_setting, req_bw); } -- GitLab From 2bba67f03071a83dacbcaa9569a0541cdfe8083d Mon Sep 17 00:00:00 2001 From: Nicholas Kazlauskas Date: Mon, 3 Feb 2025 09:49:58 -0500 Subject: [PATCH 0334/2211] drm/amd/display: Guard against setting dispclk low when active [ Upstream commit 72d7a7fa1f2404fd31c84a8f808b1b37021a3a9e ] [Why] We should never apply a minimum dispclk value while in prepare_bandwidth or while displays are active. This is always an optimization for when all displays are disabled. [How] Defer dispclk optimization until safe_to_lower = true and display_count reaches 0. Since 0 has a special value in this logic (ie. no dispclk required) we also need adjust the logic that clamps it for the actual request to PMFW. Reviewed-by: Gabe Teeger Reviewed-by: Leo Chen Reviewed-by: Syed Hassan Signed-off-by: Nicholas Kazlauskas Signed-off-by: Roman Li Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c index 7d0d8852ce8d2..a4ac601a30c35 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c @@ -452,14 +452,19 @@ void dcn35_update_clocks(struct clk_mgr *clk_mgr_base, update_dppclk = true; } - if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, clk_mgr_base->clks.dispclk_khz)) { + if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, clk_mgr_base->clks.dispclk_khz) && + (new_clocks->dispclk_khz > 0 || (safe_to_lower && display_count == 0))) { + int requested_dispclk_khz = new_clocks->dispclk_khz; + dcn35_disable_otg_wa(clk_mgr_base, context, safe_to_lower, true); - if (dc->debug.min_disp_clk_khz > 0 && new_clocks->dispclk_khz < dc->debug.min_disp_clk_khz) - new_clocks->dispclk_khz = dc->debug.min_disp_clk_khz; + /* Clamp the requested clock to PMFW based on their limit. */ + if (dc->debug.min_disp_clk_khz > 0 && requested_dispclk_khz < dc->debug.min_disp_clk_khz) + requested_dispclk_khz = dc->debug.min_disp_clk_khz; + dcn35_smu_set_dispclk(clk_mgr, requested_dispclk_khz); clk_mgr_base->clks.dispclk_khz = new_clocks->dispclk_khz; - dcn35_smu_set_dispclk(clk_mgr, clk_mgr_base->clks.dispclk_khz); + dcn35_disable_otg_wa(clk_mgr_base, context, safe_to_lower, false); update_dispclk = true; -- GitLab From 1e826acee1165a05c119366f4e902a4a11ee2460 Mon Sep 17 00:00:00 2001 From: Ilya Bakoulin Date: Wed, 29 Jan 2025 14:46:27 -0500 Subject: [PATCH 0335/2211] drm/amd/display: Fix BT2020 YCbCr limited/full range input [ Upstream commit 07bc2dcbcf403d47d6f305ef7f0d3d489491c5fb ] [Why] BT2020 YCbCr input is not handled properly when full range quantization is used and limited range is not supported at all. [How] - Add enums for BT2020 YCbCr limited/full range - Add limited range CSC matrix Reviewed-by: Krunoslav Kovac Signed-off-by: Ilya Bakoulin Signed-off-by: Roman Li Tested-by: Robert Mader Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 6 +++--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 2 +- drivers/gpu/drm/amd/display/dc/basics/dc_common.c | 3 ++- drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c | 5 +++-- drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 4 ++-- drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 4 +++- drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c | 3 ++- .../gpu/drm/amd/display/dc/dio/dcn10/dcn10_stream_encoder.c | 3 ++- .../amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.c | 3 ++- .../amd/display/dc/hpo/dcn31/dcn31_hpo_dp_stream_encoder.c | 3 ++- drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h | 6 +++++- .../gpu/drm/amd/display/modules/info_packet/info_packet.c | 4 ++-- 12 files changed, 29 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 17c03b89abb31..c0ff501687f5b 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -5552,9 +5552,9 @@ fill_plane_color_attributes(const struct drm_plane_state *plane_state, case DRM_COLOR_YCBCR_BT2020: if (full_range) - *color_space = COLOR_SPACE_2020_YCBCR; + *color_space = COLOR_SPACE_2020_YCBCR_FULL; else - return -EINVAL; + *color_space = COLOR_SPACE_2020_YCBCR_LIMITED; break; default: @@ -6050,7 +6050,7 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing, if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB) color_space = COLOR_SPACE_2020_RGB_FULLRANGE; else - color_space = COLOR_SPACE_2020_YCBCR; + color_space = COLOR_SPACE_2020_YCBCR_LIMITED; break; case DRM_MODE_COLORIMETRY_DEFAULT: // ITU601 default: diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c index 98e88903d07d5..15d94d2a0e2fb 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c @@ -1145,7 +1145,7 @@ static int amdgpu_current_colorspace_show(struct seq_file *m, void *data) case COLOR_SPACE_2020_RGB_FULLRANGE: seq_puts(m, "BT2020_RGB"); break; - case COLOR_SPACE_2020_YCBCR: + case COLOR_SPACE_2020_YCBCR_LIMITED: seq_puts(m, "BT2020_YCC"); break; default: diff --git a/drivers/gpu/drm/amd/display/dc/basics/dc_common.c b/drivers/gpu/drm/amd/display/dc/basics/dc_common.c index b2fc4f8e64825..a51c2701da247 100644 --- a/drivers/gpu/drm/amd/display/dc/basics/dc_common.c +++ b/drivers/gpu/drm/amd/display/dc/basics/dc_common.c @@ -40,7 +40,8 @@ bool is_rgb_cspace(enum dc_color_space output_color_space) case COLOR_SPACE_YCBCR709: case COLOR_SPACE_YCBCR601_LIMITED: case COLOR_SPACE_YCBCR709_LIMITED: - case COLOR_SPACE_2020_YCBCR: + case COLOR_SPACE_2020_YCBCR_LIMITED: + case COLOR_SPACE_2020_YCBCR_FULL: return false; default: /* Add a case to switch */ diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c index d2342a91e7e71..d62b00314682f 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c @@ -176,7 +176,7 @@ static bool is_ycbcr2020_type( { bool ret = false; - if (color_space == COLOR_SPACE_2020_YCBCR) + if (color_space == COLOR_SPACE_2020_YCBCR_LIMITED || color_space == COLOR_SPACE_2020_YCBCR_FULL) ret = true; return ret; } @@ -247,7 +247,8 @@ void color_space_to_black_color( case COLOR_SPACE_YCBCR709_BLACK: case COLOR_SPACE_YCBCR601_LIMITED: case COLOR_SPACE_YCBCR709_LIMITED: - case COLOR_SPACE_2020_YCBCR: + case COLOR_SPACE_2020_YCBCR_LIMITED: + case COLOR_SPACE_2020_YCBCR_FULL: *black_color = black_color_format[BLACK_COLOR_FORMAT_YUV_CV]; break; diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c index bfcbbea377298..6dbf139c51f72 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c @@ -4215,7 +4215,7 @@ static void set_avi_info_frame( break; case COLOR_SPACE_2020_RGB_FULLRANGE: case COLOR_SPACE_2020_RGB_LIMITEDRANGE: - case COLOR_SPACE_2020_YCBCR: + case COLOR_SPACE_2020_YCBCR_LIMITED: hdmi_info.bits.EC0_EC2 = COLORIMETRYEX_BT2020RGBYCBCR; hdmi_info.bits.C0_C1 = COLORIMETRY_EXTENDED; break; @@ -4229,7 +4229,7 @@ static void set_avi_info_frame( break; } - if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR && + if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR_LIMITED && stream->out_transfer_func.tf == TRANSFER_FUNCTION_GAMMA22) { hdmi_info.bits.EC0_EC2 = 0; hdmi_info.bits.C0_C1 = COLORIMETRY_ITU709; diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h index 0ded4bc7825b0..6fd94c5f6da52 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h +++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h @@ -641,7 +641,8 @@ enum dc_color_space { COLOR_SPACE_YCBCR709_LIMITED, COLOR_SPACE_2020_RGB_FULLRANGE, COLOR_SPACE_2020_RGB_LIMITEDRANGE, - COLOR_SPACE_2020_YCBCR, + COLOR_SPACE_2020_YCBCR_LIMITED, + COLOR_SPACE_2020_YCBCR_FULL, COLOR_SPACE_ADOBERGB, COLOR_SPACE_DCIP3, COLOR_SPACE_DISPLAYNATIVE, @@ -649,6 +650,7 @@ enum dc_color_space { COLOR_SPACE_APPCTRL, COLOR_SPACE_CUSTOMPOINTS, COLOR_SPACE_YCBCR709_BLACK, + COLOR_SPACE_2020_YCBCR = COLOR_SPACE_2020_YCBCR_LIMITED, }; enum dc_dither_option { diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c index 5c2825bc9a876..654b919465f08 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c @@ -420,7 +420,7 @@ static void dce110_stream_encoder_dp_set_stream_attribute( dynamic_range_rgb = 1; /*limited range*/ break; case COLOR_SPACE_2020_RGB_FULLRANGE: - case COLOR_SPACE_2020_YCBCR: + case COLOR_SPACE_2020_YCBCR_LIMITED: case COLOR_SPACE_XR_RGB: case COLOR_SPACE_MSREF_SCRGB: case COLOR_SPACE_ADOBERGB: @@ -432,6 +432,7 @@ static void dce110_stream_encoder_dp_set_stream_attribute( case COLOR_SPACE_APPCTRL: case COLOR_SPACE_CUSTOMPOINTS: case COLOR_SPACE_UNKNOWN: + default: /* do nothing */ break; } diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn10/dcn10_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dio/dcn10/dcn10_stream_encoder.c index f496e952ceecb..f8f1e98f646e6 100644 --- a/drivers/gpu/drm/amd/display/dc/dio/dcn10/dcn10_stream_encoder.c +++ b/drivers/gpu/drm/amd/display/dc/dio/dcn10/dcn10_stream_encoder.c @@ -393,7 +393,7 @@ void enc1_stream_encoder_dp_set_stream_attribute( break; case COLOR_SPACE_2020_RGB_LIMITEDRANGE: case COLOR_SPACE_2020_RGB_FULLRANGE: - case COLOR_SPACE_2020_YCBCR: + case COLOR_SPACE_2020_YCBCR_LIMITED: case COLOR_SPACE_XR_RGB: case COLOR_SPACE_MSREF_SCRGB: case COLOR_SPACE_ADOBERGB: @@ -406,6 +406,7 @@ void enc1_stream_encoder_dp_set_stream_attribute( case COLOR_SPACE_CUSTOMPOINTS: case COLOR_SPACE_UNKNOWN: case COLOR_SPACE_YCBCR709_BLACK: + default: /* do nothing */ break; } diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.c index 0a27e0942a123..0008816cf1553 100644 --- a/drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.c +++ b/drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.c @@ -634,7 +634,7 @@ void enc401_stream_encoder_dp_set_stream_attribute( break; case COLOR_SPACE_2020_RGB_LIMITEDRANGE: case COLOR_SPACE_2020_RGB_FULLRANGE: - case COLOR_SPACE_2020_YCBCR: + case COLOR_SPACE_2020_YCBCR_LIMITED: case COLOR_SPACE_XR_RGB: case COLOR_SPACE_MSREF_SCRGB: case COLOR_SPACE_ADOBERGB: @@ -647,6 +647,7 @@ void enc401_stream_encoder_dp_set_stream_attribute( case COLOR_SPACE_CUSTOMPOINTS: case COLOR_SPACE_UNKNOWN: case COLOR_SPACE_YCBCR709_BLACK: + default: /* do nothing */ break; } diff --git a/drivers/gpu/drm/amd/display/dc/hpo/dcn31/dcn31_hpo_dp_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/hpo/dcn31/dcn31_hpo_dp_stream_encoder.c index 678db949cfe3c..759b453385c46 100644 --- a/drivers/gpu/drm/amd/display/dc/hpo/dcn31/dcn31_hpo_dp_stream_encoder.c +++ b/drivers/gpu/drm/amd/display/dc/hpo/dcn31/dcn31_hpo_dp_stream_encoder.c @@ -323,7 +323,7 @@ static void dcn31_hpo_dp_stream_enc_set_stream_attribute( break; case COLOR_SPACE_2020_RGB_LIMITEDRANGE: case COLOR_SPACE_2020_RGB_FULLRANGE: - case COLOR_SPACE_2020_YCBCR: + case COLOR_SPACE_2020_YCBCR_LIMITED: case COLOR_SPACE_XR_RGB: case COLOR_SPACE_MSREF_SCRGB: case COLOR_SPACE_ADOBERGB: @@ -336,6 +336,7 @@ static void dcn31_hpo_dp_stream_enc_set_stream_attribute( case COLOR_SPACE_CUSTOMPOINTS: case COLOR_SPACE_UNKNOWN: case COLOR_SPACE_YCBCR709_BLACK: + default: /* do nothing */ break; } diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h index 0150f2581ee4c..0c5675d1c5936 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h @@ -119,10 +119,14 @@ static const struct dpp_input_csc_matrix __maybe_unused dpp_input_csc_matrix[] = { 0x39a6, 0x2568, 0, 0xe0d6, 0xeedd, 0x2568, 0xf925, 0x9a8, 0, 0x2568, 0x43ee, 0xdbb2 } }, - { COLOR_SPACE_2020_YCBCR, + { COLOR_SPACE_2020_YCBCR_FULL, { 0x2F30, 0x2000, 0, 0xE869, 0xEDB7, 0x2000, 0xFABC, 0xBC6, 0, 0x2000, 0x3C34, 0xE1E6 } }, + { COLOR_SPACE_2020_YCBCR_LIMITED, + { 0x35B9, 0x2543, 0, 0xE2B2, + 0xEB2F, 0x2543, 0xFA01, 0x0B1F, + 0, 0x2543, 0x4489, 0xDB42 } }, { COLOR_SPACE_2020_RGB_LIMITEDRANGE, { 0x35E0, 0x255F, 0, 0xE2B3, 0xEB20, 0x255F, 0xF9FD, 0xB1E, diff --git a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c index a344e2e49b0ea..b3d55cac35694 100644 --- a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c +++ b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c @@ -383,10 +383,10 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream, colorimetryFormat = ColorimetryYCC_DP_ITU709; else if (cs == COLOR_SPACE_ADOBERGB) colorimetryFormat = ColorimetryYCC_DP_AdobeYCC; - else if (cs == COLOR_SPACE_2020_YCBCR) + else if (cs == COLOR_SPACE_2020_YCBCR_LIMITED) colorimetryFormat = ColorimetryYCC_DP_ITU2020YCbCr; - if (cs == COLOR_SPACE_2020_YCBCR && tf == TRANSFER_FUNC_GAMMA_22) + if (cs == COLOR_SPACE_2020_YCBCR_LIMITED && tf == TRANSFER_FUNC_GAMMA_22) colorimetryFormat = ColorimetryYCC_DP_ITU709; break; -- GitLab From 775f3afa6ade18e5d7a89af092517bd38c7183d2 Mon Sep 17 00:00:00 2001 From: George Shen Date: Tue, 4 Feb 2025 14:34:02 -0500 Subject: [PATCH 0336/2211] drm/amd/display: Read LTTPR ALPM caps during link cap retrieval [ Upstream commit de84d580126eb2214937df755cfec5ef0901479e ] [Why] The latest DP spec requires the DP TX to read DPCD F0000h through F0009h when detecting LTTPR capabilities for the first time. [How] Update LTTPR cap retrieval to read up to F0009h (two more bytes than the previous F0007h), and store the LTTPR ALPM capabilities. Reviewed-by: Wenjing Liu Signed-off-by: George Shen Signed-off-by: Roman Li Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/dc_dp_types.h | 12 ++++++++++++ .../display/dc/link/protocols/link_dp_capability.c | 6 +++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/dc/dc_dp_types.h b/drivers/gpu/drm/amd/display/dc/dc_dp_types.h index 41bd95e9177a4..223c3d55544b2 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_dp_types.h +++ b/drivers/gpu/drm/amd/display/dc/dc_dp_types.h @@ -959,6 +959,14 @@ union dp_128b_132b_supported_lttpr_link_rates { uint8_t raw; }; +union dp_alpm_lttpr_cap { + struct { + uint8_t AUX_LESS_ALPM_SUPPORTED :1; + uint8_t RESERVED :7; + } bits; + uint8_t raw; +}; + union dp_sink_video_fallback_formats { struct { uint8_t dp_1024x768_60Hz_24bpp_support :1; @@ -1103,6 +1111,7 @@ struct dc_lttpr_caps { uint8_t max_ext_timeout; union dp_main_link_channel_coding_lttpr_cap main_link_channel_coding; union dp_128b_132b_supported_lttpr_link_rates supported_128b_132b_rates; + union dp_alpm_lttpr_cap alpm; uint8_t aux_rd_interval[MAX_REPEATER_CNT - 1]; }; @@ -1352,6 +1361,9 @@ struct dp_trace { #ifndef DPCD_MAX_UNCOMPRESSED_PIXEL_RATE_CAP #define DPCD_MAX_UNCOMPRESSED_PIXEL_RATE_CAP 0x221c #endif +#ifndef DP_LTTPR_ALPM_CAPABILITIES +#define DP_LTTPR_ALPM_CAPABILITIES 0xF0009 +#endif #ifndef DP_REPEATER_CONFIGURATION_AND_STATUS_SIZE #define DP_REPEATER_CONFIGURATION_AND_STATUS_SIZE 0x50 #endif diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c index d9a1e1a599674..842636c7922b4 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c @@ -1495,7 +1495,7 @@ static bool dpcd_read_sink_ext_caps(struct dc_link *link) enum dc_status dp_retrieve_lttpr_cap(struct dc_link *link) { - uint8_t lttpr_dpcd_data[8] = {0}; + uint8_t lttpr_dpcd_data[10] = {0}; enum dc_status status; bool is_lttpr_present; @@ -1545,6 +1545,10 @@ enum dc_status dp_retrieve_lttpr_cap(struct dc_link *link) lttpr_dpcd_data[DP_PHY_REPEATER_128B132B_RATES - DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV]; + link->dpcd_caps.lttpr_caps.alpm.raw = + lttpr_dpcd_data[DP_LTTPR_ALPM_CAPABILITIES - + DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV]; + /* If this chip cap is set, at least one retimer must exist in the chain * Override count to 1 if we receive a known bad count (0 or an invalid value) */ if ((link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN) && -- GitLab From cee5d56fa783ff852a23da5ce3da17fd0d450d18 Mon Sep 17 00:00:00 2001 From: Leo Zeng Date: Fri, 31 Jan 2025 11:46:52 -0500 Subject: [PATCH 0337/2211] Revert "drm/amd/display: Request HW cursor on DCN3.2 with SubVP" [ Upstream commit 8ae6dfc0b61b170cf13832d4cfe2a0c744e621a7 ] This reverts commit 13437c91606c9232c747475e202fe3827cd53264. Reason to revert: idle power regression found in testing. Reviewed-by: Dillon Varone Signed-off-by: Leo Zeng Signed-off-by: Roman Li Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c index 56dda686e2992..6f490d8d7038c 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c @@ -626,7 +626,6 @@ static bool dcn32_assign_subvp_pipe(struct dc *dc, * - Not TMZ surface */ if (pipe->plane_state && !pipe->top_pipe && !pipe->prev_odm_pipe && !dcn32_is_center_timing(pipe) && - !pipe->stream->hw_cursor_req && !(pipe->stream->timing.pix_clk_100hz / 10000 > DCN3_2_MAX_SUBVP_PIXEL_RATE_MHZ) && (!dcn32_is_psr_capable(pipe) || (context->stream_count == 1 && dc->caps.dmub_caps.subvp_psr)) && dc_state_get_pipe_subvp_type(context, pipe) == SUBVP_NONE && -- GitLab From b14e726d57f61085485f107a6203c50a09695abd Mon Sep 17 00:00:00 2001 From: Harry Wentland Date: Fri, 31 Jan 2025 11:57:49 -0500 Subject: [PATCH 0338/2211] drm/amd/display: Don't treat wb connector as physical in create_validate_stream_for_sink [ Upstream commit cbf4890c6f28fb1ad733e14613fbd33c2004bced ] Don't try to operate on a drm_wb_connector as an amdgpu_dm_connector. While dereferencing aconnector->base will "work" it's wrong and might lead to unknown bad things. Just... don't. Reviewed-by: Alex Hung Signed-off-by: Harry Wentland Signed-off-by: Roman Li Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 26 ++++++++++++------- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 2 +- .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 6 ++--- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index c0ff501687f5b..1e5984e71bfd7 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -7399,12 +7399,12 @@ cleanup: } struct dc_stream_state * -create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector, +create_validate_stream_for_sink(struct drm_connector *connector, const struct drm_display_mode *drm_mode, const struct dm_connector_state *dm_state, const struct dc_stream_state *old_stream) { - struct drm_connector *connector = &aconnector->base; + struct amdgpu_dm_connector *aconnector = NULL; struct amdgpu_device *adev = drm_to_adev(connector->dev); struct dc_stream_state *stream; const struct drm_connector_state *drm_state = dm_state ? &dm_state->base : NULL; @@ -7415,8 +7415,12 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector, if (!dm_state) return NULL; - if (aconnector->dc_link->connector_signal == SIGNAL_TYPE_HDMI_TYPE_A || - aconnector->dc_link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER) + if (connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK) + aconnector = to_amdgpu_dm_connector(connector); + + if (aconnector && + (aconnector->dc_link->connector_signal == SIGNAL_TYPE_HDMI_TYPE_A || + aconnector->dc_link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER)) bpc_limit = 8; do { @@ -7428,10 +7432,11 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector, break; } - if (aconnector->base.connector_type == DRM_MODE_CONNECTOR_WRITEBACK) + dc_result = dc_validate_stream(adev->dm.dc, stream); + + if (!aconnector) /* writeback connector */ return stream; - dc_result = dc_validate_stream(adev->dm.dc, stream); if (dc_result == DC_OK && stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) dc_result = dm_dp_mst_is_port_support_mode(aconnector, stream); @@ -7461,7 +7466,7 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector, __func__, __LINE__); aconnector->force_yuv420_output = true; - stream = create_validate_stream_for_sink(aconnector, drm_mode, + stream = create_validate_stream_for_sink(connector, drm_mode, dm_state, old_stream); aconnector->force_yuv420_output = false; } @@ -7476,6 +7481,9 @@ enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connec struct dc_sink *dc_sink; /* TODO: Unhardcode stream count */ struct dc_stream_state *stream; + /* we always have an amdgpu_dm_connector here since we got + * here via the amdgpu_dm_connector_helper_funcs + */ struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); if ((mode->flags & DRM_MODE_FLAG_INTERLACE) || @@ -7500,7 +7508,7 @@ enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connec drm_mode_set_crtcinfo(mode, 0); - stream = create_validate_stream_for_sink(aconnector, mode, + stream = create_validate_stream_for_sink(connector, mode, to_dm_connector_state(connector->state), NULL); if (stream) { @@ -10520,7 +10528,7 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm, if (!drm_atomic_crtc_needs_modeset(new_crtc_state)) goto skip_modeset; - new_stream = create_validate_stream_for_sink(aconnector, + new_stream = create_validate_stream_for_sink(connector, &new_crtc_state->mode, dm_new_conn_state, dm_old_crtc_state->stream); diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h index 20ad72d1b0d9b..9603352ee0949 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -987,7 +987,7 @@ int amdgpu_dm_process_dmub_set_config_sync(struct dc_context *ctx, unsigned int struct set_config_cmd_payload *payload, enum set_config_status *operation_result); struct dc_stream_state * - create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector, + create_validate_stream_for_sink(struct drm_connector *connector, const struct drm_display_mode *drm_mode, const struct dm_connector_state *dm_state, const struct dc_stream_state *old_stream); diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index fca0c31e14d8f..92158009cfa73 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c @@ -1646,7 +1646,6 @@ int pre_validate_dsc(struct drm_atomic_state *state, if (ind >= 0) { struct drm_connector *connector; - struct amdgpu_dm_connector *aconnector; struct drm_connector_state *drm_new_conn_state; struct dm_connector_state *dm_new_conn_state; struct dm_crtc_state *dm_old_crtc_state; @@ -1654,15 +1653,14 @@ int pre_validate_dsc(struct drm_atomic_state *state, connector = amdgpu_dm_find_first_crtc_matching_connector(state, state->crtcs[ind].ptr); - aconnector = to_amdgpu_dm_connector(connector); drm_new_conn_state = drm_atomic_get_new_connector_state(state, - &aconnector->base); + connector); dm_new_conn_state = to_dm_connector_state(drm_new_conn_state); dm_old_crtc_state = to_dm_crtc_state(state->crtcs[ind].old_state); local_dc_state->streams[i] = - create_validate_stream_for_sink(aconnector, + create_validate_stream_for_sink(connector, &state->crtcs[ind].new_state->mode, dm_new_conn_state, dm_old_crtc_state->stream); -- GitLab From e6a46719a2369eb5186d4f7e6c0478720ca1ec3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Lothor=C3=A9?= Date: Mon, 17 Feb 2025 07:21:53 +0100 Subject: [PATCH 0339/2211] serial: mctrl_gpio: split disable_ms into sync and no_sync APIs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 1bd2aad57da95f7f2d2bb52f7ad15c0f4993a685 ] The following splat has been observed on a SAMA5D27 platform using atmel_serial: BUG: sleeping function called from invalid context at kernel/irq/manage.c:738 in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 27, name: kworker/u5:0 preempt_count: 1, expected: 0 INFO: lockdep is turned off. irq event stamp: 0 hardirqs last enabled at (0): [<00000000>] 0x0 hardirqs last disabled at (0): [] copy_process+0x1c4c/0x7bec softirqs last enabled at (0): [] copy_process+0x1ca0/0x7bec softirqs last disabled at (0): [<00000000>] 0x0 CPU: 0 UID: 0 PID: 27 Comm: kworker/u5:0 Not tainted 6.13.0-rc7+ #74 Hardware name: Atmel SAMA5 Workqueue: hci0 hci_power_on [bluetooth] Call trace: unwind_backtrace from show_stack+0x18/0x1c show_stack from dump_stack_lvl+0x44/0x70 dump_stack_lvl from __might_resched+0x38c/0x598 __might_resched from disable_irq+0x1c/0x48 disable_irq from mctrl_gpio_disable_ms+0x74/0xc0 mctrl_gpio_disable_ms from atmel_disable_ms.part.0+0x80/0x1f4 atmel_disable_ms.part.0 from atmel_set_termios+0x764/0x11e8 atmel_set_termios from uart_change_line_settings+0x15c/0x994 uart_change_line_settings from uart_set_termios+0x2b0/0x668 uart_set_termios from tty_set_termios+0x600/0x8ec tty_set_termios from ttyport_set_flow_control+0x188/0x1e0 ttyport_set_flow_control from wilc_setup+0xd0/0x524 [hci_wilc] wilc_setup [hci_wilc] from hci_dev_open_sync+0x330/0x203c [bluetooth] hci_dev_open_sync [bluetooth] from hci_dev_do_open+0x40/0xb0 [bluetooth] hci_dev_do_open [bluetooth] from hci_power_on+0x12c/0x664 [bluetooth] hci_power_on [bluetooth] from process_one_work+0x998/0x1a38 process_one_work from worker_thread+0x6e0/0xfb4 worker_thread from kthread+0x3d4/0x484 kthread from ret_from_fork+0x14/0x28 This warning is emitted when trying to toggle, at the highest level, some flow control (with serdev_device_set_flow_control) in a device driver. At the lowest level, the atmel_serial driver is using serial_mctrl_gpio lib to enable/disable the corresponding IRQs accordingly. The warning emitted by CONFIG_DEBUG_ATOMIC_SLEEP is due to disable_irq (called in mctrl_gpio_disable_ms) being possibly called in some atomic context (some tty drivers perform modem lines configuration in regions protected by port lock). Split mctrl_gpio_disable_ms into two differents APIs, a non-blocking one and a blocking one. Replace mctrl_gpio_disable_ms calls with the relevant version depending on whether the call is protected by some port lock. Suggested-by: Jiri Slaby Signed-off-by: Alexis Lothoré Acked-by: Richard Genoud Link: https://lore.kernel.org/r/20250217-atomic_sleep_mctrl_serial_gpio-v3-1-59324b313eef@bootlin.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- Documentation/driver-api/serial/driver.rst | 2 +- drivers/tty/serial/8250/8250_port.c | 2 +- drivers/tty/serial/atmel_serial.c | 2 +- drivers/tty/serial/imx.c | 2 +- drivers/tty/serial/serial_mctrl_gpio.c | 34 +++++++++++++++++----- drivers/tty/serial/serial_mctrl_gpio.h | 17 +++++++++-- drivers/tty/serial/sh-sci.c | 2 +- drivers/tty/serial/stm32-usart.c | 2 +- 8 files changed, 47 insertions(+), 16 deletions(-) diff --git a/Documentation/driver-api/serial/driver.rst b/Documentation/driver-api/serial/driver.rst index 84b43061c11be..60434f2b02863 100644 --- a/Documentation/driver-api/serial/driver.rst +++ b/Documentation/driver-api/serial/driver.rst @@ -103,4 +103,4 @@ Some helpers are provided in order to set/get modem control lines via GPIO. .. kernel-doc:: drivers/tty/serial/serial_mctrl_gpio.c :identifiers: mctrl_gpio_init mctrl_gpio_free mctrl_gpio_to_gpiod mctrl_gpio_set mctrl_gpio_get mctrl_gpio_enable_ms - mctrl_gpio_disable_ms + mctrl_gpio_disable_ms_sync mctrl_gpio_disable_ms_no_sync diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index c1376727642a7..0519679929652 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -1657,7 +1657,7 @@ static void serial8250_disable_ms(struct uart_port *port) if (up->bugs & UART_BUG_NOMSR) return; - mctrl_gpio_disable_ms(up->gpios); + mctrl_gpio_disable_ms_no_sync(up->gpios); up->ier &= ~UART_IER_MSI; serial_port_out(port, UART_IER, up->ier); diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index 09b246c9e389e..8bd39586a49f7 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c @@ -700,7 +700,7 @@ static void atmel_disable_ms(struct uart_port *port) atmel_port->ms_irq_enabled = false; - mctrl_gpio_disable_ms(atmel_port->gpios); + mctrl_gpio_disable_ms_no_sync(atmel_port->gpios); if (!mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_CTS)) idr |= ATMEL_US_CTSIC; diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 90974d338f3c0..8e3b15534bc72 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -1596,7 +1596,7 @@ static void imx_uart_shutdown(struct uart_port *port) imx_uart_dma_exit(sport); } - mctrl_gpio_disable_ms(sport->gpios); + mctrl_gpio_disable_ms_sync(sport->gpios); uart_port_lock_irqsave(&sport->port, &flags); ucr2 = imx_uart_readl(sport, UCR2); diff --git a/drivers/tty/serial/serial_mctrl_gpio.c b/drivers/tty/serial/serial_mctrl_gpio.c index 8855688a5b6c0..ca55bcc0b6111 100644 --- a/drivers/tty/serial/serial_mctrl_gpio.c +++ b/drivers/tty/serial/serial_mctrl_gpio.c @@ -322,11 +322,7 @@ void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios) } EXPORT_SYMBOL_GPL(mctrl_gpio_enable_ms); -/** - * mctrl_gpio_disable_ms - disable irqs and handling of changes to the ms lines - * @gpios: gpios to disable - */ -void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios) +static void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios, bool sync) { enum mctrl_gpio_idx i; @@ -342,10 +338,34 @@ void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios) if (!gpios->irq[i]) continue; - disable_irq(gpios->irq[i]); + if (sync) + disable_irq(gpios->irq[i]); + else + disable_irq_nosync(gpios->irq[i]); } } -EXPORT_SYMBOL_GPL(mctrl_gpio_disable_ms); + +/** + * mctrl_gpio_disable_ms_sync - disable irqs and handling of changes to the ms + * lines, and wait for any pending IRQ to be processed + * @gpios: gpios to disable + */ +void mctrl_gpio_disable_ms_sync(struct mctrl_gpios *gpios) +{ + mctrl_gpio_disable_ms(gpios, true); +} +EXPORT_SYMBOL_GPL(mctrl_gpio_disable_ms_sync); + +/** + * mctrl_gpio_disable_ms_no_sync - disable irqs and handling of changes to the + * ms lines, and return immediately + * @gpios: gpios to disable + */ +void mctrl_gpio_disable_ms_no_sync(struct mctrl_gpios *gpios) +{ + mctrl_gpio_disable_ms(gpios, false); +} +EXPORT_SYMBOL_GPL(mctrl_gpio_disable_ms_no_sync); void mctrl_gpio_enable_irq_wake(struct mctrl_gpios *gpios) { diff --git a/drivers/tty/serial/serial_mctrl_gpio.h b/drivers/tty/serial/serial_mctrl_gpio.h index fc76910fb105a..79e97838ebe56 100644 --- a/drivers/tty/serial/serial_mctrl_gpio.h +++ b/drivers/tty/serial/serial_mctrl_gpio.h @@ -87,9 +87,16 @@ void mctrl_gpio_free(struct device *dev, struct mctrl_gpios *gpios); void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios); /* - * Disable gpio interrupts to report status line changes. + * Disable gpio interrupts to report status line changes, and block until + * any corresponding IRQ is processed */ -void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios); +void mctrl_gpio_disable_ms_sync(struct mctrl_gpios *gpios); + +/* + * Disable gpio interrupts to report status line changes, and return + * immediately + */ +void mctrl_gpio_disable_ms_no_sync(struct mctrl_gpios *gpios); /* * Enable gpio wakeup interrupts to enable wake up source. @@ -148,7 +155,11 @@ static inline void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios) { } -static inline void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios) +static inline void mctrl_gpio_disable_ms_sync(struct mctrl_gpios *gpios) +{ +} + +static inline void mctrl_gpio_disable_ms_no_sync(struct mctrl_gpios *gpios) { } diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index f43059e1b5c28..80efe3b0ed0c3 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -2297,7 +2297,7 @@ static void sci_shutdown(struct uart_port *port) dev_dbg(port->dev, "%s(%d)\n", __func__, port->line); s->autorts = false; - mctrl_gpio_disable_ms(to_sci_port(port)->gpios); + mctrl_gpio_disable_ms_sync(to_sci_port(port)->gpios); uart_port_lock_irqsave(port, &flags); sci_stop_rx(port); diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c index 9b9981352b1e1..e685cace5c854 100644 --- a/drivers/tty/serial/stm32-usart.c +++ b/drivers/tty/serial/stm32-usart.c @@ -944,7 +944,7 @@ static void stm32_usart_enable_ms(struct uart_port *port) static void stm32_usart_disable_ms(struct uart_port *port) { - mctrl_gpio_disable_ms(to_stm32_port(port)->gpios); + mctrl_gpio_disable_ms_sync(to_stm32_port(port)->gpios); } /* Transmit stop */ -- GitLab From 3ccfdd5b337429079325f456e499706313e251e1 Mon Sep 17 00:00:00 2001 From: Michael Margolin Date: Mon, 17 Feb 2025 14:16:23 +0000 Subject: [PATCH 0340/2211] RDMA/core: Fix best page size finding when it can cross SG entries [ Upstream commit 486055f5e09df959ad4e3aa4ee75b5c91ddeec2e ] A single scatter-gather entry is limited by a 32 bits "length" field that is practically 4GB - PAGE_SIZE. This means that even when the memory is physically contiguous, we might need more than one entry to represent it. Additionally when using dmabuf, the sg_table might be originated outside the subsystem and optimized for other needs. For instance an SGT of 16GB GPU continuous memory might look like this: (a real life example) dma_address 34401400000, length fffff000 dma_address 345013ff000, length fffff000 dma_address 346013fe000, length fffff000 dma_address 347013fd000, length fffff000 dma_address 348013fc000, length 4000 Since ib_umem_find_best_pgsz works within SG entries, in the above case we will result with the worst possible 4KB page size. Fix this by taking into consideration only the alignment of addresses of real discontinuity points rather than treating SG entries as such, and adjust the page iterator to correctly handle cross SG entry pages. There is currently an assumption that drivers do not ask for pages bigger than maximal DMA size supported by their devices. Reviewed-by: Firas Jahjah Reviewed-by: Yonatan Nachum Signed-off-by: Michael Margolin Link: https://patch.msgid.link/20250217141623.12428-1-mrgolin@amazon.com Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/infiniband/core/umem.c | 36 ++++++++++++++++++++++++--------- drivers/infiniband/core/verbs.c | 11 +++++----- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c index 07c571c7b6999..c5b6863947605 100644 --- a/drivers/infiniband/core/umem.c +++ b/drivers/infiniband/core/umem.c @@ -80,9 +80,12 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem, unsigned long pgsz_bitmap, unsigned long virt) { - struct scatterlist *sg; + unsigned long curr_len = 0; + dma_addr_t curr_base = ~0; unsigned long va, pgoff; + struct scatterlist *sg; dma_addr_t mask; + dma_addr_t end; int i; umem->iova = va = virt; @@ -107,17 +110,30 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem, pgoff = umem->address & ~PAGE_MASK; for_each_sgtable_dma_sg(&umem->sgt_append.sgt, sg, i) { - /* Walk SGL and reduce max page size if VA/PA bits differ - * for any address. + /* If the current entry is physically contiguous with the previous + * one, no need to take its start addresses into consideration. */ - mask |= (sg_dma_address(sg) + pgoff) ^ va; + if (check_add_overflow(curr_base, curr_len, &end) || + end != sg_dma_address(sg)) { + + curr_base = sg_dma_address(sg); + curr_len = 0; + + /* Reduce max page size if VA/PA bits differ */ + mask |= (curr_base + pgoff) ^ va; + + /* The alignment of any VA matching a discontinuity point + * in the physical memory sets the maximum possible page + * size as this must be a starting point of a new page that + * needs to be aligned. + */ + if (i != 0) + mask |= va; + } + + curr_len += sg_dma_len(sg); va += sg_dma_len(sg) - pgoff; - /* Except for the last entry, the ending iova alignment sets - * the maximum possible page size as the low bits of the iova - * must be zero when starting the next chunk. - */ - if (i != (umem->sgt_append.sgt.nents - 1)) - mask |= va; + pgoff = 0; } diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index 473ee0831307c..dc40001072a5e 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -3109,22 +3109,23 @@ EXPORT_SYMBOL(__rdma_block_iter_start); bool __rdma_block_iter_next(struct ib_block_iter *biter) { unsigned int block_offset; - unsigned int sg_delta; + unsigned int delta; if (!biter->__sg_nents || !biter->__sg) return false; biter->__dma_addr = sg_dma_address(biter->__sg) + biter->__sg_advance; block_offset = biter->__dma_addr & (BIT_ULL(biter->__pg_bit) - 1); - sg_delta = BIT_ULL(biter->__pg_bit) - block_offset; + delta = BIT_ULL(biter->__pg_bit) - block_offset; - if (sg_dma_len(biter->__sg) - biter->__sg_advance > sg_delta) { - biter->__sg_advance += sg_delta; - } else { + while (biter->__sg_nents && biter->__sg && + sg_dma_len(biter->__sg) - biter->__sg_advance <= delta) { + delta -= sg_dma_len(biter->__sg) - biter->__sg_advance; biter->__sg_advance = 0; biter->__sg = sg_next(biter->__sg); biter->__sg_nents--; } + biter->__sg_advance += delta; return true; } -- GitLab From a89326d35bf6fe7b0498311c88a06e35c743434c Mon Sep 17 00:00:00 2001 From: Ahmad Fatoum Date: Tue, 18 Feb 2025 20:18:32 +0100 Subject: [PATCH 0341/2211] pmdomain: imx: gpcv2: use proper helper for property detection [ Upstream commit 6568cb40e73163fa25e2779f7234b169b2e1a32e ] Starting with commit c141ecc3cecd7 ("of: Warn when of_property_read_bool() is used on non-boolean properties"), probing the gpcv2 device on i.MX8M SoCs leads to warnings when LOCKDEP is enabled. Fix this by checking property presence with of_property_present as intended. Signed-off-by: Ahmad Fatoum Link: https://lore.kernel.org/r/20250218-gpcv2-of-property-present-v1-1-3bb1a9789654@pengutronix.de Signed-off-by: Ulf Hansson Signed-off-by: Sasha Levin --- drivers/pmdomain/imx/gpcv2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pmdomain/imx/gpcv2.c b/drivers/pmdomain/imx/gpcv2.c index e03c2cb39a693..0dbf1893abfa3 100644 --- a/drivers/pmdomain/imx/gpcv2.c +++ b/drivers/pmdomain/imx/gpcv2.c @@ -1361,7 +1361,7 @@ static int imx_pgc_domain_probe(struct platform_device *pdev) } if (IS_ENABLED(CONFIG_LOCKDEP) && - of_property_read_bool(domain->dev->of_node, "power-domains")) + of_property_present(domain->dev->of_node, "power-domains")) lockdep_set_subclass(&domain->genpd.mlock, 1); ret = of_genpd_add_provider_simple(domain->dev->of_node, -- GitLab From eaeb67bd851ce573490470b8afd21971d9db942a Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Wed, 12 Feb 2025 21:23:14 +0100 Subject: [PATCH 0342/2211] can: c_can: Use of_property_present() to test existence of DT property [ Upstream commit ab1bc2290fd8311d49b87c29f1eb123fcb581bee ] of_property_read_bool() should be used only on boolean properties. Cc: Rob Herring Signed-off-by: Krzysztof Kozlowski Reviewed-by: Vincent Mailhol Link: https://patch.msgid.link/20250212-syscon-phandle-args-can-v2-3-ac9a1253396b@linaro.org Signed-off-by: Marc Kleine-Budde Signed-off-by: Sasha Levin --- drivers/net/can/c_can/c_can_platform.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/can/c_can/c_can_platform.c b/drivers/net/can/c_can/c_can_platform.c index 399844809bbea..bb6071a758f36 100644 --- a/drivers/net/can/c_can/c_can_platform.c +++ b/drivers/net/can/c_can/c_can_platform.c @@ -324,7 +324,7 @@ static int c_can_plat_probe(struct platform_device *pdev) /* Check if we need custom RAMINIT via syscon. Mostly for TI * platforms. Only supported with DT boot. */ - if (np && of_property_read_bool(np, "syscon-raminit")) { + if (np && of_property_present(np, "syscon-raminit")) { u32 id; struct c_can_raminit *raminit = &priv->raminit_sys; -- GitLab From 2b129e89b8c6e261bd240f56989fc52ec5efbd87 Mon Sep 17 00:00:00 2001 From: Eduard Zingerman Date: Sat, 15 Feb 2025 03:03:54 -0800 Subject: [PATCH 0343/2211] bpf: don't do clean_live_states when state->loop_entry->branches > 0 [ Upstream commit 9e63fdb0cbdf3268c86638a8274f4d5549a82820 ] verifier.c:is_state_visited() uses RANGE_WITHIN states comparison rules for cached states that have loop_entry with non-zero branches count (meaning that loop_entry's verification is not yet done). The RANGE_WITHIN rules in regsafe()/stacksafe() require register and stack objects types to be identical in current and old states. verifier.c:clean_live_states() replaces registers and stack spills with NOT_INIT/STACK_INVALID marks, if these registers/stack spills are not read in any child state. This means that clean_live_states() works against loop convergence logic under some conditions. See selftest in the next patch for a specific example. Mitigate this by prohibiting clean_verifier_state() when state->loop_entry->branches > 0. This undoes negative verification performance impact of the copy_verifier_state() fix from the previous patch. Below is comparison between master and current patch. selftests: File Program Insns (A) Insns (B) Insns (DIFF) States (A) States (B) States (DIFF) ---------------------------------- ---------------------------- --------- --------- --------------- ---------- ---------- -------------- arena_htab.bpf.o arena_htab_llvm 717 423 -294 (-41.00%) 57 37 -20 (-35.09%) arena_htab_asm.bpf.o arena_htab_asm 597 445 -152 (-25.46%) 47 37 -10 (-21.28%) arena_list.bpf.o arena_list_add 1493 1822 +329 (+22.04%) 30 37 +7 (+23.33%) arena_list.bpf.o arena_list_del 309 261 -48 (-15.53%) 23 15 -8 (-34.78%) iters.bpf.o checkpoint_states_deletion 18125 22154 +4029 (+22.23%) 818 918 +100 (+12.22%) iters.bpf.o iter_nested_deeply_iters 593 367 -226 (-38.11%) 67 43 -24 (-35.82%) iters.bpf.o iter_nested_iters 813 772 -41 (-5.04%) 79 72 -7 (-8.86%) iters.bpf.o iter_subprog_check_stacksafe 155 135 -20 (-12.90%) 15 14 -1 (-6.67%) iters.bpf.o iter_subprog_iters 1094 808 -286 (-26.14%) 88 68 -20 (-22.73%) iters.bpf.o loop_state_deps2 479 356 -123 (-25.68%) 46 35 -11 (-23.91%) iters.bpf.o triple_continue 35 31 -4 (-11.43%) 3 3 +0 (+0.00%) kmem_cache_iter.bpf.o open_coded_iter 63 59 -4 (-6.35%) 7 6 -1 (-14.29%) mptcp_subflow.bpf.o _getsockopt_subflow 501 446 -55 (-10.98%) 25 23 -2 (-8.00%) pyperf600_iter.bpf.o on_event 12339 6379 -5960 (-48.30%) 441 286 -155 (-35.15%) verifier_bits_iter.bpf.o max_words 92 84 -8 (-8.70%) 8 7 -1 (-12.50%) verifier_iterating_callbacks.bpf.o cond_break2 113 192 +79 (+69.91%) 12 21 +9 (+75.00%) sched_ext: File Program Insns (A) Insns (B) Insns (DIFF) States (A) States (B) States (DIFF) ----------------- ---------------------- --------- --------- ----------------- ---------- ---------- ---------------- bpf.bpf.o layered_dispatch 11485 9039 -2446 (-21.30%) 848 662 -186 (-21.93%) bpf.bpf.o layered_dump 7422 5022 -2400 (-32.34%) 681 298 -383 (-56.24%) bpf.bpf.o layered_enqueue 16854 13753 -3101 (-18.40%) 1611 1308 -303 (-18.81%) bpf.bpf.o layered_init 1000001 5549 -994452 (-99.45%) 84672 523 -84149 (-99.38%) bpf.bpf.o layered_runnable 3149 1899 -1250 (-39.70%) 288 151 -137 (-47.57%) bpf.bpf.o p2dq_init 2343 1936 -407 (-17.37%) 201 170 -31 (-15.42%) bpf.bpf.o refresh_layer_cpumasks 16487 1285 -15202 (-92.21%) 1770 120 -1650 (-93.22%) bpf.bpf.o rusty_select_cpu 1937 1386 -551 (-28.45%) 177 125 -52 (-29.38%) scx_central.bpf.o central_dispatch 636 600 -36 (-5.66%) 63 59 -4 (-6.35%) scx_central.bpf.o central_init 913 632 -281 (-30.78%) 48 39 -9 (-18.75%) scx_nest.bpf.o nest_init 636 601 -35 (-5.50%) 60 58 -2 (-3.33%) scx_pair.bpf.o pair_dispatch 1000001 1914 -998087 (-99.81%) 58169 142 -58027 (-99.76%) scx_qmap.bpf.o qmap_dispatch 2393 2187 -206 (-8.61%) 196 174 -22 (-11.22%) scx_qmap.bpf.o qmap_init 16367 22777 +6410 (+39.16%) 603 768 +165 (+27.36%) 'layered_init' and 'pair_dispatch' hit 1M on master, but are verified ok with this patch. Signed-off-by: Eduard Zingerman Link: https://lore.kernel.org/r/20250215110411.3236773-4-eddyz87@gmail.com Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- kernel/bpf/verifier.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 294fbafbeba75..592ee3b47635b 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -17282,12 +17282,16 @@ static void clean_verifier_state(struct bpf_verifier_env *env, static void clean_live_states(struct bpf_verifier_env *env, int insn, struct bpf_verifier_state *cur) { + struct bpf_verifier_state *loop_entry; struct bpf_verifier_state_list *sl; sl = *explored_state(env, insn); while (sl) { if (sl->state.branches) goto next; + loop_entry = get_loop_entry(&sl->state); + if (loop_entry && loop_entry->branches) + goto next; if (sl->state.insn_idx != insn || !same_callsites(&sl->state, cur)) goto next; -- GitLab From 46ba5757a7a4714e7d3f68cfe118208822cb3d78 Mon Sep 17 00:00:00 2001 From: Eduard Zingerman Date: Sat, 15 Feb 2025 03:03:52 -0800 Subject: [PATCH 0344/2211] bpf: copy_verifier_state() should copy 'loop_entry' field [ Upstream commit bbbc02b7445ebfda13e4847f4f1413c6480a85a9 ] The bpf_verifier_state.loop_entry state should be copied by copy_verifier_state(). Otherwise, .loop_entry values from unrelated states would poison env->cur_state. Additionally, env->stack should not contain any states with .loop_entry != NULL. The states in env->stack are yet to be verified, while .loop_entry is set for states that reached an equivalent state. This means that env->cur_state->loop_entry should always be NULL after pop_stack(). See the selftest in the next commit for an example of the program that is not safe yet is accepted by verifier w/o this fix. This change has some verification performance impact for selftests: File Program Insns (A) Insns (B) Insns (DIFF) States (A) States (B) States (DIFF) ---------------------------------- ---------------------------- --------- --------- -------------- ---------- ---------- ------------- arena_htab.bpf.o arena_htab_llvm 717 426 -291 (-40.59%) 57 37 -20 (-35.09%) arena_htab_asm.bpf.o arena_htab_asm 597 445 -152 (-25.46%) 47 37 -10 (-21.28%) arena_list.bpf.o arena_list_del 309 279 -30 (-9.71%) 23 14 -9 (-39.13%) iters.bpf.o iter_subprog_check_stacksafe 155 141 -14 (-9.03%) 15 14 -1 (-6.67%) iters.bpf.o iter_subprog_iters 1094 1003 -91 (-8.32%) 88 83 -5 (-5.68%) iters.bpf.o loop_state_deps2 479 725 +246 (+51.36%) 46 63 +17 (+36.96%) kmem_cache_iter.bpf.o open_coded_iter 63 59 -4 (-6.35%) 7 6 -1 (-14.29%) verifier_bits_iter.bpf.o max_words 92 84 -8 (-8.70%) 8 7 -1 (-12.50%) verifier_iterating_callbacks.bpf.o cond_break2 113 107 -6 (-5.31%) 12 12 +0 (+0.00%) And significant negative impact for sched_ext: File Program Insns (A) Insns (B) Insns (DIFF) States (A) States (B) States (DIFF) ----------------- ---------------------- --------- --------- -------------------- ---------- ---------- ------------------ bpf.bpf.o lavd_init 7039 14723 +7684 (+109.16%) 490 1139 +649 (+132.45%) bpf.bpf.o layered_dispatch 11485 10548 -937 (-8.16%) 848 762 -86 (-10.14%) bpf.bpf.o layered_dump 7422 1000001 +992579 (+13373.47%) 681 31178 +30497 (+4478.27%) bpf.bpf.o layered_enqueue 16854 71127 +54273 (+322.02%) 1611 6450 +4839 (+300.37%) bpf.bpf.o p2dq_dispatch 665 791 +126 (+18.95%) 68 78 +10 (+14.71%) bpf.bpf.o p2dq_init 2343 2980 +637 (+27.19%) 201 237 +36 (+17.91%) bpf.bpf.o refresh_layer_cpumasks 16487 674760 +658273 (+3992.68%) 1770 65370 +63600 (+3593.22%) bpf.bpf.o rusty_select_cpu 1937 40872 +38935 (+2010.07%) 177 3210 +3033 (+1713.56%) scx_central.bpf.o central_dispatch 636 2687 +2051 (+322.48%) 63 227 +164 (+260.32%) scx_nest.bpf.o nest_init 636 815 +179 (+28.14%) 60 73 +13 (+21.67%) scx_qmap.bpf.o qmap_dispatch 2393 3580 +1187 (+49.60%) 196 253 +57 (+29.08%) scx_qmap.bpf.o qmap_dump 233 318 +85 (+36.48%) 22 30 +8 (+36.36%) scx_qmap.bpf.o qmap_init 16367 17436 +1069 (+6.53%) 603 669 +66 (+10.95%) Note 'layered_dump' program, which now hits 1M instructions limit. This impact would be mitigated in the next patch. Signed-off-by: Eduard Zingerman Link: https://lore.kernel.org/r/20250215110411.3236773-2-eddyz87@gmail.com Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- kernel/bpf/verifier.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 592ee3b47635b..1437108f9d7af 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -1447,6 +1447,7 @@ static int copy_verifier_state(struct bpf_verifier_state *dst_state, dst_state->callback_unroll_depth = src->callback_unroll_depth; dst_state->used_as_loop_entry = src->used_as_loop_entry; dst_state->may_goto_depth = src->may_goto_depth; + dst_state->loop_entry = src->loop_entry; for (i = 0; i <= src->curframe; i++) { dst = dst_state->frame[i]; if (!dst) { @@ -18720,6 +18721,8 @@ process_bpf_exit: return err; break; } else { + if (WARN_ON_ONCE(env->cur_state->loop_entry)) + env->cur_state->loop_entry = NULL; do_print_state = true; continue; } -- GitLab From 161cc125043a24cf14b86e61e57221a820e8fb5e Mon Sep 17 00:00:00 2001 From: Jakub Kicinski Date: Wed, 12 Feb 2025 17:06:33 -0800 Subject: [PATCH 0345/2211] eth: mlx4: don't try to complete XDP frames in netpoll [ Upstream commit 8fdeafd66edaf420ea0063a1f13442fe3470fe70 ] mlx4 doesn't support ndo_xdp_xmit / XDP_REDIRECT and wasn't using page pool until now, so it could run XDP completions in netpoll (NAPI budget == 0) just fine. Page pool has calling context requirements, make sure we don't try to call it from what is potentially HW IRQ context. Reviewed-by: Tariq Toukan Link: https://patch.msgid.link/20250213010635.1354034-3-kuba@kernel.org Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx4/en_tx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index 1ddb11cb25f91..6e077d202827a 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c @@ -450,6 +450,8 @@ int mlx4_en_process_tx_cq(struct net_device *dev, if (unlikely(!priv->port_up)) return 0; + if (unlikely(!napi_budget) && cq->type == TX_XDP) + return 0; netdev_txq_bql_complete_prefetchw(ring->tx_queue); -- GitLab From 82b54455b6b7f103cd71c7dafd07328331e4f3dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= Date: Mon, 16 Dec 2024 19:56:12 +0200 Subject: [PATCH 0346/2211] PCI: Fix old_size lower bound in calculate_iosize() too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit ff61f380de5652e723168341480cc7adf1dd6213 ] Commit 903534fa7d30 ("PCI: Fix resource double counting on remove & rescan") fixed double counting of mem resources because of old_size being applied too early. Fix a similar counting bug on the io resource side. Link: https://lore.kernel.org/r/20241216175632.4175-6-ilpo.jarvinen@linux.intel.com Signed-off-by: Ilpo Järvinen Signed-off-by: Bjorn Helgaas Tested-by: Xiaochun Lee Signed-off-by: Sasha Levin --- drivers/pci/setup-bus.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index f16c7ce3bf3fc..1eceabef9e84d 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -814,11 +814,9 @@ static resource_size_t calculate_iosize(resource_size_t size, size = (size & 0xff) + ((size & ~0xffUL) << 2); #endif size = size + size1; - if (size < old_size) - size = old_size; - size = ALIGN(max(size, add_size) + children_add_size, align); - return size; + size = max(size, add_size) + children_add_size; + return ALIGN(max(size, old_size), align); } static resource_size_t calculate_memsize(resource_size_t size, -- GitLab From 1fb8106316a218256faf60b37d81134b6e7c798a Mon Sep 17 00:00:00 2001 From: Xiaofei Tan Date: Wed, 12 Feb 2025 14:34:08 +0800 Subject: [PATCH 0347/2211] ACPI: HED: Always initialize before evged [ Upstream commit cccf6ee090c8c133072d5d5b52ae25f3bc907a16 ] When the HED driver is built-in, it initializes after evged because they both are at the same initcall level, so the initialization ordering depends on the Makefile order. However, this prevents RAS records coming in between the evged driver initialization and the HED driver initialization from being handled. If the number of such RAS records is above the APEI HEST error source number, the HEST resources may be exhausted, and that may affect subsequent RAS error reporting. To fix this issue, change the initcall level of HED to subsys_initcall and prevent the driver from being built as a module by changing ACPI_HED in Kconfig from "tristate" to "bool". Signed-off-by: Xiaofei Tan Link: https://patch.msgid.link/20250212063408.927666-1-tanxiaofei@huawei.com [ rjw: Changelog edits ] Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/Kconfig | 2 +- drivers/acpi/hed.c | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index d67f63d93b2ab..89fa569d63702 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig @@ -443,7 +443,7 @@ config ACPI_SBS the modules will be called sbs and sbshc. config ACPI_HED - tristate "Hardware Error Device" + bool "Hardware Error Device" help This driver supports the Hardware Error Device (PNP0C33), which is used to report some hardware errors notified via diff --git a/drivers/acpi/hed.c b/drivers/acpi/hed.c index 7652515a6be1e..3499f86c411e3 100644 --- a/drivers/acpi/hed.c +++ b/drivers/acpi/hed.c @@ -80,7 +80,12 @@ static struct acpi_driver acpi_hed_driver = { .remove = acpi_hed_remove, }, }; -module_acpi_driver(acpi_hed_driver); + +static int __init acpi_hed_driver_init(void) +{ + return acpi_bus_register_driver(&acpi_hed_driver); +} +subsys_initcall(acpi_hed_driver_init); MODULE_AUTHOR("Huang Ying"); MODULE_DESCRIPTION("ACPI Hardware Error Device Driver"); -- GitLab From 7f131fda2654e880700d6826b362e6862ac9ba8a Mon Sep 17 00:00:00 2001 From: Petr Machata Date: Fri, 14 Feb 2025 17:18:21 +0100 Subject: [PATCH 0348/2211] vxlan: Join / leave MC group after remote changes [ Upstream commit d42d543368343c0449a4e433b5f02e063a86209c ] When a vxlan netdevice is brought up, if its default remote is a multicast address, the device joins the indicated group. Therefore when the multicast remote address changes, the device should leave the current group and subscribe to the new one. Similarly when the interface used for endpoint communication is changed in a situation when multicast remote is configured. This is currently not done. Both vxlan_igmp_join() and vxlan_igmp_leave() can however fail. So it is possible that with such fix, the netdevice will end up in an inconsistent situation where the old group is not joined anymore, but joining the new group fails. Should we join the new group first, and leave the old one second, we might end up in the opposite situation, where both groups are joined. Undoing any of this during rollback is going to be similarly problematic. One solution would be to just forbid the change when the netdevice is up. However in vnifilter mode, changing the group address is allowed, and these problems are simply ignored (see vxlan_vni_update_group()): # ip link add name br up type bridge vlan_filtering 1 # ip link add vx1 up master br type vxlan external vnifilter local 192.0.2.1 dev lo dstport 4789 # bridge vni add dev vx1 vni 200 group 224.0.0.1 # tcpdump -i lo & # bridge vni add dev vx1 vni 200 group 224.0.0.2 18:55:46.523438 IP 0.0.0.0 > 224.0.0.22: igmp v3 report, 1 group record(s) 18:55:46.943447 IP 0.0.0.0 > 224.0.0.22: igmp v3 report, 1 group record(s) # bridge vni dev vni group/remote vx1 200 224.0.0.2 Having two different modes of operation for conceptually the same interface is silly, so in this patch, just do what the vnifilter code does and deal with the errors by crossing fingers real hard. The vnifilter code leaves old before joining new, and in case of join / leave failures does not roll back the configuration changes that have already been applied, but bails out of joining if it could not leave. Do the same here: leave before join, apply changes unconditionally and do not attempt to join if we couldn't leave. Signed-off-by: Petr Machata Reviewed-by: Ido Schimmel Reviewed-by: Nikolay Aleksandrov Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/vxlan/vxlan_core.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c index 5e7cdd1b806fb..01f66760e1328 100644 --- a/drivers/net/vxlan/vxlan_core.c +++ b/drivers/net/vxlan/vxlan_core.c @@ -4340,6 +4340,7 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[], struct netlink_ext_ack *extack) { struct vxlan_dev *vxlan = netdev_priv(dev); + bool rem_ip_changed, change_igmp; struct net_device *lowerdev; struct vxlan_config conf; struct vxlan_rdst *dst; @@ -4363,8 +4364,13 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[], if (err) return err; + rem_ip_changed = !vxlan_addr_equal(&conf.remote_ip, &dst->remote_ip); + change_igmp = vxlan->dev->flags & IFF_UP && + (rem_ip_changed || + dst->remote_ifindex != conf.remote_ifindex); + /* handle default dst entry */ - if (!vxlan_addr_equal(&conf.remote_ip, &dst->remote_ip)) { + if (rem_ip_changed) { u32 hash_index = fdb_head_index(vxlan, all_zeros_mac, conf.vni); spin_lock_bh(&vxlan->hash_lock[hash_index]); @@ -4408,6 +4414,9 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[], } } + if (change_igmp && vxlan_addr_multicast(&dst->remote_ip)) + err = vxlan_multicast_leave(vxlan); + if (conf.age_interval != vxlan->cfg.age_interval) mod_timer(&vxlan->age_timer, jiffies); @@ -4415,7 +4424,12 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[], if (lowerdev && lowerdev != dst->remote_dev) dst->remote_dev = lowerdev; vxlan_config_apply(dev, &conf, lowerdev, vxlan->net, true); - return 0; + + if (!err && change_igmp && + vxlan_addr_multicast(&dst->remote_ip)) + err = vxlan_multicast_join(vxlan); + + return err; } static void vxlan_dellink(struct net_device *dev, struct list_head *head) -- GitLab From dc5f5c9d2bbc634eb144beb7d2cea950725d03c8 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Fri, 14 Feb 2025 15:43:33 +0200 Subject: [PATCH 0349/2211] hrtimers: Replace hrtimer_clock_to_base_table with switch-case [ Upstream commit 4441b976dfeff0d3579e8da3c0283300c618a553 ] Clang and GCC complain about overlapped initialisers in the hrtimer_clock_to_base_table definition. With `make W=1` and CONFIG_WERROR=y (which is default nowadays) this breaks the build: CC kernel/time/hrtimer.o kernel/time/hrtimer.c:124:21: error: initializer overrides prior initialization of this subobject [-Werror,-Winitializer-overrides] 124 | [CLOCK_REALTIME] = HRTIMER_BASE_REALTIME, kernel/time/hrtimer.c:122:27: note: previous initialization is here 122 | [0 ... MAX_CLOCKS - 1] = HRTIMER_MAX_CLOCK_BASES, (and similar for CLOCK_MONOTONIC, CLOCK_BOOTTIME, and CLOCK_TAI). hrtimer_clockid_to_base(), which uses the table, is only used in __hrtimer_init(), which is not a hotpath. Therefore replace the table lookup with a switch case in hrtimer_clockid_to_base() to avoid this warning. Signed-off-by: Andy Shevchenko Signed-off-by: Thomas Gleixner Link: https://lore.kernel.org/all/20250214134424.3367619-1-andriy.shevchenko@linux.intel.com Signed-off-by: Sasha Levin --- kernel/time/hrtimer.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index db9c06bb23116..06fbc226341fd 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c @@ -117,16 +117,6 @@ DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) = .csd = CSD_INIT(retrigger_next_event, NULL) }; -static const int hrtimer_clock_to_base_table[MAX_CLOCKS] = { - /* Make sure we catch unsupported clockids */ - [0 ... MAX_CLOCKS - 1] = HRTIMER_MAX_CLOCK_BASES, - - [CLOCK_REALTIME] = HRTIMER_BASE_REALTIME, - [CLOCK_MONOTONIC] = HRTIMER_BASE_MONOTONIC, - [CLOCK_BOOTTIME] = HRTIMER_BASE_BOOTTIME, - [CLOCK_TAI] = HRTIMER_BASE_TAI, -}; - static inline bool hrtimer_base_is_online(struct hrtimer_cpu_base *base) { if (!IS_ENABLED(CONFIG_HOTPLUG_CPU)) @@ -1597,14 +1587,19 @@ u64 hrtimer_next_event_without(const struct hrtimer *exclude) static inline int hrtimer_clockid_to_base(clockid_t clock_id) { - if (likely(clock_id < MAX_CLOCKS)) { - int base = hrtimer_clock_to_base_table[clock_id]; - - if (likely(base != HRTIMER_MAX_CLOCK_BASES)) - return base; + switch (clock_id) { + case CLOCK_REALTIME: + return HRTIMER_BASE_REALTIME; + case CLOCK_MONOTONIC: + return HRTIMER_BASE_MONOTONIC; + case CLOCK_BOOTTIME: + return HRTIMER_BASE_BOOTTIME; + case CLOCK_TAI: + return HRTIMER_BASE_TAI; + default: + WARN(1, "Invalid clockid %d. Using MONOTONIC\n", clock_id); + return HRTIMER_BASE_MONOTONIC; } - WARN(1, "Invalid clockid %d. Using MONOTONIC\n", clock_id); - return HRTIMER_BASE_MONOTONIC; } static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id, -- GitLab From 2fe6284364423d81b2f87d06da5617999e0f30cc Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Mon, 17 Feb 2025 14:26:47 +0530 Subject: [PATCH 0350/2211] irqchip/riscv-imsic: Set irq_set_affinity() for IMSIC base [ Upstream commit 999f458c1771354371ba367dd84f55f9a62a4233 ] The IMSIC driver assigns the IMSIC domain specific imsic_irq_set_affinity() callback to the per device leaf MSI domain. That's a layering violation as it is called with the leaf domain data and not with the IMSIC domain data. This prevents moving the IMSIC driver to the common MSI library which uses the generic msi_domain_set_affinity() callback for device MSI domains. Instead of using imsic_irq_set_affinity() for leaf MSI domains, use imsic_irq_set_affinity() for the non-leaf IMSIC base domain and use irq_chip_set_affinity_parent() for leaf MSI domains. [ tglx: Massaged change log ] Signed-off-by: Andrew Jones Signed-off-by: Anup Patel Signed-off-by: Thomas Gleixner Link: https://lore.kernel.org/all/20250217085657.789309-2-apatel@ventanamicro.com Signed-off-by: Sasha Levin --- drivers/irqchip/irq-riscv-imsic-platform.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/drivers/irqchip/irq-riscv-imsic-platform.c b/drivers/irqchip/irq-riscv-imsic-platform.c index c708780e8760f..5d7c30ad8855b 100644 --- a/drivers/irqchip/irq-riscv-imsic-platform.c +++ b/drivers/irqchip/irq-riscv-imsic-platform.c @@ -96,9 +96,8 @@ static int imsic_irq_set_affinity(struct irq_data *d, const struct cpumask *mask bool force) { struct imsic_vector *old_vec, *new_vec; - struct irq_data *pd = d->parent_data; - old_vec = irq_data_get_irq_chip_data(pd); + old_vec = irq_data_get_irq_chip_data(d); if (WARN_ON(!old_vec)) return -ENOENT; @@ -116,13 +115,13 @@ static int imsic_irq_set_affinity(struct irq_data *d, const struct cpumask *mask return -ENOSPC; /* Point device to the new vector */ - imsic_msi_update_msg(d, new_vec); + imsic_msi_update_msg(irq_get_irq_data(d->irq), new_vec); /* Update irq descriptors with the new vector */ - pd->chip_data = new_vec; + d->chip_data = new_vec; - /* Update effective affinity of parent irq data */ - irq_data_update_effective_affinity(pd, cpumask_of(new_vec->cpu)); + /* Update effective affinity */ + irq_data_update_effective_affinity(d, cpumask_of(new_vec->cpu)); /* Move state of the old vector to the new vector */ imsic_vector_move(old_vec, new_vec); @@ -135,6 +134,9 @@ static struct irq_chip imsic_irq_base_chip = { .name = "IMSIC", .irq_mask = imsic_irq_mask, .irq_unmask = imsic_irq_unmask, +#ifdef CONFIG_SMP + .irq_set_affinity = imsic_irq_set_affinity, +#endif .irq_retrigger = imsic_irq_retrigger, .irq_compose_msi_msg = imsic_irq_compose_msg, .flags = IRQCHIP_SKIP_SET_WAKE | @@ -245,7 +247,7 @@ static bool imsic_init_dev_msi_info(struct device *dev, if (WARN_ON_ONCE(domain != real_parent)) return false; #ifdef CONFIG_SMP - info->chip->irq_set_affinity = imsic_irq_set_affinity; + info->chip->irq_set_affinity = irq_chip_set_affinity_parent; #endif break; default: -- GitLab From 3770acff3110f0fa1438b34050d359e827cba59d Mon Sep 17 00:00:00 2001 From: Hans Verkuil Date: Mon, 9 Dec 2024 16:00:16 +0100 Subject: [PATCH 0351/2211] media: test-drivers: vivid: don't call schedule in loop [ Upstream commit e4740118b752005cbed339aec9a1d1c43620e0b9 ] Artem reported that the CPU load was 100% when capturing from vivid at low resolution with ffmpeg. This was caused by: while (time_is_after_jiffies(cur_jiffies + wait_jiffies) && !kthread_should_stop()) schedule(); If there are no other processes running that can be scheduled, then this is basically a busy-loop. Change it to wait_event_interruptible_timeout() which doesn't have that problem. Signed-off-by: Hans Verkuil Reported-by: Artem S. Tashkinov Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219570 Reviewed-by: Nicolas Dufresne Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Sasha Levin --- drivers/media/test-drivers/vivid/vivid-kthread-cap.c | 11 ++++++++--- drivers/media/test-drivers/vivid/vivid-kthread-out.c | 11 ++++++++--- .../media/test-drivers/vivid/vivid-kthread-touch.c | 11 ++++++++--- drivers/media/test-drivers/vivid/vivid-sdr-cap.c | 11 ++++++++--- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/drivers/media/test-drivers/vivid/vivid-kthread-cap.c b/drivers/media/test-drivers/vivid/vivid-kthread-cap.c index 669bd96da4c79..273e8ed8c2a90 100644 --- a/drivers/media/test-drivers/vivid/vivid-kthread-cap.c +++ b/drivers/media/test-drivers/vivid/vivid-kthread-cap.c @@ -789,9 +789,14 @@ static int vivid_thread_vid_cap(void *data) next_jiffies_since_start = jiffies_since_start; wait_jiffies = next_jiffies_since_start - jiffies_since_start; - while (time_is_after_jiffies(cur_jiffies + wait_jiffies) && - !kthread_should_stop()) - schedule(); + if (!time_is_after_jiffies(cur_jiffies + wait_jiffies)) + continue; + + wait_queue_head_t wait; + + init_waitqueue_head(&wait); + wait_event_interruptible_timeout(wait, kthread_should_stop(), + cur_jiffies + wait_jiffies - jiffies); } dprintk(dev, 1, "Video Capture Thread End\n"); return 0; diff --git a/drivers/media/test-drivers/vivid/vivid-kthread-out.c b/drivers/media/test-drivers/vivid/vivid-kthread-out.c index fac6208b51da8..015a7b166a1e6 100644 --- a/drivers/media/test-drivers/vivid/vivid-kthread-out.c +++ b/drivers/media/test-drivers/vivid/vivid-kthread-out.c @@ -235,9 +235,14 @@ static int vivid_thread_vid_out(void *data) next_jiffies_since_start = jiffies_since_start; wait_jiffies = next_jiffies_since_start - jiffies_since_start; - while (time_is_after_jiffies(cur_jiffies + wait_jiffies) && - !kthread_should_stop()) - schedule(); + if (!time_is_after_jiffies(cur_jiffies + wait_jiffies)) + continue; + + wait_queue_head_t wait; + + init_waitqueue_head(&wait); + wait_event_interruptible_timeout(wait, kthread_should_stop(), + cur_jiffies + wait_jiffies - jiffies); } dprintk(dev, 1, "Video Output Thread End\n"); return 0; diff --git a/drivers/media/test-drivers/vivid/vivid-kthread-touch.c b/drivers/media/test-drivers/vivid/vivid-kthread-touch.c index fa711ee36a3fb..c862689786b69 100644 --- a/drivers/media/test-drivers/vivid/vivid-kthread-touch.c +++ b/drivers/media/test-drivers/vivid/vivid-kthread-touch.c @@ -135,9 +135,14 @@ static int vivid_thread_touch_cap(void *data) next_jiffies_since_start = jiffies_since_start; wait_jiffies = next_jiffies_since_start - jiffies_since_start; - while (time_is_after_jiffies(cur_jiffies + wait_jiffies) && - !kthread_should_stop()) - schedule(); + if (!time_is_after_jiffies(cur_jiffies + wait_jiffies)) + continue; + + wait_queue_head_t wait; + + init_waitqueue_head(&wait); + wait_event_interruptible_timeout(wait, kthread_should_stop(), + cur_jiffies + wait_jiffies - jiffies); } dprintk(dev, 1, "Touch Capture Thread End\n"); return 0; diff --git a/drivers/media/test-drivers/vivid/vivid-sdr-cap.c b/drivers/media/test-drivers/vivid/vivid-sdr-cap.c index 38cda33dffb2a..97cfc58b70571 100644 --- a/drivers/media/test-drivers/vivid/vivid-sdr-cap.c +++ b/drivers/media/test-drivers/vivid/vivid-sdr-cap.c @@ -206,9 +206,14 @@ static int vivid_thread_sdr_cap(void *data) next_jiffies_since_start = jiffies_since_start; wait_jiffies = next_jiffies_since_start - jiffies_since_start; - while (time_is_after_jiffies(cur_jiffies + wait_jiffies) && - !kthread_should_stop()) - schedule(); + if (!time_is_after_jiffies(cur_jiffies + wait_jiffies)) + continue; + + wait_queue_head_t wait; + + init_waitqueue_head(&wait); + wait_event_interruptible_timeout(wait, kthread_should_stop(), + cur_jiffies + wait_jiffies - jiffies); } dprintk(dev, 1, "SDR Capture Thread End\n"); return 0; -- GitLab From c4e1ce22b9ab964a09bc5532c9fae9b4738d36b8 Mon Sep 17 00:00:00 2001 From: Shahar Shitrit Date: Thu, 13 Feb 2025 11:46:40 +0200 Subject: [PATCH 0352/2211] net/mlx5: Modify LSB bitmask in temperature event to include only the first bit [ Upstream commit 633f16d7e07c129a36b882c05379e01ce5bdb542 ] In the sensor_count field of the MTEWE register, bits 1-62 are supported only for unmanaged switches, not for NICs, and bit 63 is reserved for internal use. To prevent confusing output that may include set bits that are not relevant to NIC sensors, we update the bitmask to retain only the first bit, which corresponds to the sensor ASIC. Signed-off-by: Shahar Shitrit Signed-off-by: Tariq Toukan Reviewed-by: Mateusz Polchlopek Link: https://patch.msgid.link/20250213094641.226501-4-tariqt@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/events.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/events.c b/drivers/net/ethernet/mellanox/mlx5/core/events.c index d91ea53eb394d..cd8d107f7d9e3 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/events.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/events.c @@ -163,6 +163,10 @@ static int temp_warn(struct notifier_block *nb, unsigned long type, void *data) u64 value_msb; value_lsb = be64_to_cpu(eqe->data.temp_warning.sensor_warning_lsb); + /* bit 1-63 are not supported for NICs, + * hence read only bit 0 (asic) from lsb. + */ + value_lsb &= 0x1; value_msb = be64_to_cpu(eqe->data.temp_warning.sensor_warning_msb); mlx5_core_warn(events->dev, -- GitLab From 587386c56fb886577bac3e201ef57be43a6720a6 Mon Sep 17 00:00:00 2001 From: Shahar Shitrit Date: Thu, 13 Feb 2025 11:46:38 +0200 Subject: [PATCH 0353/2211] net/mlx5: Apply rate-limiting to high temperature warning [ Upstream commit 9dd3d5d258aceb37bdf09c8b91fa448f58ea81f0 ] Wrap the high temperature warning in a temperature event with a call to net_ratelimit() to prevent flooding the kernel log with repeated warning messages when temperature exceeds the threshold multiple times within a short duration. Signed-off-by: Shahar Shitrit Signed-off-by: Tariq Toukan Reviewed-by: Mateusz Polchlopek Link: https://patch.msgid.link/20250213094641.226501-2-tariqt@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/events.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/events.c b/drivers/net/ethernet/mellanox/mlx5/core/events.c index cd8d107f7d9e3..fc6e56305cbbc 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/events.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/events.c @@ -169,9 +169,10 @@ static int temp_warn(struct notifier_block *nb, unsigned long type, void *data) value_lsb &= 0x1; value_msb = be64_to_cpu(eqe->data.temp_warning.sensor_warning_msb); - mlx5_core_warn(events->dev, - "High temperature on sensors with bit set %llx %llx", - value_msb, value_lsb); + if (net_ratelimit()) + mlx5_core_warn(events->dev, + "High temperature on sensors with bit set %llx %llx", + value_msb, value_lsb); return NOTIFY_OK; } -- GitLab From 3a3fab1be5a0c177d9d45bb3aa8d2897604fa601 Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Mon, 17 Feb 2025 15:38:53 +0000 Subject: [PATCH 0354/2211] firmware: arm_ffa: Reject higher major version as incompatible [ Upstream commit efff6a7f16b34fd902f342b58bd8bafc2d6f2fd1 ] When the firmware compatibility was handled previously in the commit 8e3f9da608f1 ("firmware: arm_ffa: Handle compatibility with different firmware versions"), we only addressed firmware versions that have higher minor versions compared to the driver version which is should be considered compatible unless the firmware returns NOT_SUPPORTED. However, if the firmware reports higher major version than the driver supported, we need to reject it. If the firmware can work in a compatible mode with the driver requested version, it must return the same major version as requested. Tested-by: Viresh Kumar Message-Id: <20250217-ffa_updates-v3-12-bd1d9de615e7@arm.com> Signed-off-by: Sudeep Holla Signed-off-by: Sasha Levin --- drivers/firmware/arm_ffa/driver.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index dce448687e28e..8dc8654f9f4b2 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -150,6 +150,14 @@ static int ffa_version_check(u32 *version) return -EOPNOTSUPP; } + if (FFA_MAJOR_VERSION(ver.a0) > FFA_MAJOR_VERSION(FFA_DRIVER_VERSION)) { + pr_err("Incompatible v%d.%d! Latest supported v%d.%d\n", + FFA_MAJOR_VERSION(ver.a0), FFA_MINOR_VERSION(ver.a0), + FFA_MAJOR_VERSION(FFA_DRIVER_VERSION), + FFA_MINOR_VERSION(FFA_DRIVER_VERSION)); + return -EINVAL; + } + if (ver.a0 < FFA_MIN_VERSION) { pr_err("Incompatible v%d.%d! Earliest supported v%d.%d\n", FFA_MAJOR_VERSION(ver.a0), FFA_MINOR_VERSION(ver.a0), -- GitLab From e1c4bb3774421fdcd941bbb6a6a20d86be555d26 Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Mon, 17 Feb 2025 15:38:48 +0000 Subject: [PATCH 0355/2211] firmware: arm_ffa: Handle the presence of host partition in the partition info [ Upstream commit 2f622a8b0722d332a2a149794a3add47bc9bdcf3 ] Currently it is assumed that the firmware doesn't present the host partition in the list of partitions presented as part of the response to PARTITION_INFO_GET from the firmware. However, there are few platforms that prefer to present the same in the list of partitions. It is not manadatory but not restricted as well. So handle the same by making sure to check the presence of the host VM ID in the XArray partition information maintained/managed in the driver before attempting to add it. Tested-by: Viresh Kumar Message-Id: <20250217-ffa_updates-v3-7-bd1d9de615e7@arm.com> Signed-off-by: Sudeep Holla Signed-off-by: Sasha Levin --- drivers/firmware/arm_ffa/driver.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index 8dc8654f9f4b2..47751b2c057ae 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -1449,6 +1449,10 @@ static int ffa_setup_partitions(void) kfree(pbuf); + /* Check if the host is already added as part of partition info */ + if (xa_load(&drv_info->partition_info, drv_info->vm_id)) + return 0; + /* Allocate for the host */ info = kzalloc(sizeof(*info), GFP_KERNEL); if (!info) { -- GitLab From 83ea9472389530b78d1a5daae267e7e75e4533dd Mon Sep 17 00:00:00 2001 From: Siva Durga Prasad Paladugu Date: Fri, 7 Feb 2025 11:19:51 +0530 Subject: [PATCH 0356/2211] firmware: xilinx: Dont send linux address to get fpga config get status [ Upstream commit 5abc174016052caff1bcf4cedb159bd388411e98 ] Fpga get config status just returns status through ret_payload and there is no need to allocate local buf and send its address through SMC args. Moreover, the address that is being passed till now is linux virtual address and is incorrect. Corresponding modification has been done in the firmware to avoid using the address sent by linux. Signed-off-by: Siva Durga Prasad Paladugu Signed-off-by: Nava kishore Manne Link: https://lore.kernel.org/r/20250207054951.1650534-1-nava.kishore.manne@amd.com Signed-off-by: Michal Simek Signed-off-by: Sasha Levin --- drivers/firmware/xilinx/zynqmp.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c index add8acf66a9c7..5578158f13750 100644 --- a/drivers/firmware/xilinx/zynqmp.c +++ b/drivers/firmware/xilinx/zynqmp.c @@ -1012,17 +1012,13 @@ EXPORT_SYMBOL_GPL(zynqmp_pm_fpga_get_status); int zynqmp_pm_fpga_get_config_status(u32 *value) { u32 ret_payload[PAYLOAD_ARG_CNT]; - u32 buf, lower_addr, upper_addr; int ret; if (!value) return -EINVAL; - lower_addr = lower_32_bits((u64)&buf); - upper_addr = upper_32_bits((u64)&buf); - ret = zynqmp_pm_invoke_fn(PM_FPGA_READ, ret_payload, 4, - XILINX_ZYNQMP_PM_FPGA_CONFIG_STAT_OFFSET, lower_addr, upper_addr, + XILINX_ZYNQMP_PM_FPGA_CONFIG_STAT_OFFSET, 0, 0, XILINX_ZYNQMP_PM_FPGA_READ_CONFIG_REG); *value = ret_payload[1]; -- GitLab From 000dd6e3441fcb0094ad7960d6b9bd7c570f13ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Povi=C5=A1er?= Date: Sat, 8 Feb 2025 00:57:22 +0000 Subject: [PATCH 0357/2211] ASoC: ops: Enforce platform maximum on initial value MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 783db6851c1821d8b983ffb12b99c279ff64f2ee ] Lower the volume if it is violating the platform maximum at its initial value (i.e. at the time of the 'snd_soc_limit_volume' call). Signed-off-by: Martin Povišer [Cherry picked from the Asahi kernel with fixups -- broonie] Signed-off-by: Mark Brown Link: https://patch.msgid.link/20250208-asoc-volume-limit-v1-1-b98fcf4cdbad@kernel.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/soc-ops.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c index b0e4e4168f38d..fb11003d56cf6 100644 --- a/sound/soc/soc-ops.c +++ b/sound/soc/soc-ops.c @@ -639,6 +639,33 @@ int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol, } EXPORT_SYMBOL_GPL(snd_soc_get_volsw_range); +static int snd_soc_clip_to_platform_max(struct snd_kcontrol *kctl) +{ + struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value; + struct snd_ctl_elem_value uctl; + int ret; + + if (!mc->platform_max) + return 0; + + ret = kctl->get(kctl, &uctl); + if (ret < 0) + return ret; + + if (uctl.value.integer.value[0] > mc->platform_max) + uctl.value.integer.value[0] = mc->platform_max; + + if (snd_soc_volsw_is_stereo(mc) && + uctl.value.integer.value[1] > mc->platform_max) + uctl.value.integer.value[1] = mc->platform_max; + + ret = kctl->put(kctl, &uctl); + if (ret < 0) + return ret; + + return 0; +} + /** * snd_soc_limit_volume - Set new limit to an existing volume control. * @@ -663,7 +690,7 @@ int snd_soc_limit_volume(struct snd_soc_card *card, struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value; if (max <= mc->max - mc->min) { mc->platform_max = max; - ret = 0; + ret = snd_soc_clip_to_platform_max(kctl); } } return ret; -- GitLab From 8d8083881ecbb8112317e8e407ae617fa07c8077 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Sat, 8 Feb 2025 01:03:27 +0000 Subject: [PATCH 0358/2211] ASoC: tas2764: Add reg defaults for TAS2764_INT_CLK_CFG [ Upstream commit d64c4c3d1c578f98d70db1c5e2535b47adce9d07 ] Signed-off-by: Hector Martin Signed-off-by: Mark Brown Link: https://patch.msgid.link/20250208-asoc-tas2764-v1-4-dbab892a69b5@kernel.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/tas2764.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c index 58315eab492a1..bc0a73fc7ab41 100644 --- a/sound/soc/codecs/tas2764.c +++ b/sound/soc/codecs/tas2764.c @@ -634,6 +634,7 @@ static const struct reg_default tas2764_reg_defaults[] = { { TAS2764_TDM_CFG2, 0x0a }, { TAS2764_TDM_CFG3, 0x10 }, { TAS2764_TDM_CFG5, 0x42 }, + { TAS2764_INT_CLK_CFG, 0x19 }, }; static const struct regmap_range_cfg tas2764_regmap_ranges[] = { -- GitLab From 409c12ce79b33c15ba668b883f17d14d948d22e4 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Sat, 8 Feb 2025 01:03:26 +0000 Subject: [PATCH 0359/2211] ASoC: tas2764: Mark SW_RESET as volatile [ Upstream commit f37f1748564ac51d32f7588bd7bfc99913ccab8e ] Since the bit is self-clearing. Signed-off-by: Hector Martin Signed-off-by: Mark Brown Link: https://patch.msgid.link/20250208-asoc-tas2764-v1-3-dbab892a69b5@kernel.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/tas2764.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c index bc0a73fc7ab41..31f94c8cf2844 100644 --- a/sound/soc/codecs/tas2764.c +++ b/sound/soc/codecs/tas2764.c @@ -652,6 +652,7 @@ static const struct regmap_range_cfg tas2764_regmap_ranges[] = { static bool tas2764_volatile_register(struct device *dev, unsigned int reg) { switch (reg) { + case TAS2764_SW_RST: case TAS2764_INT_LTCH0 ... TAS2764_INT_LTCH4: case TAS2764_INT_CLK_CFG: return true; -- GitLab From 2ea042779621d5f79e1049114f7be62e414722b1 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Sat, 8 Feb 2025 01:03:24 +0000 Subject: [PATCH 0360/2211] ASoC: tas2764: Power up/down amp on mute ops [ Upstream commit 1c3b5f37409682184669457a5bdf761268eafbe5 ] The ASoC convention is that clocks are removed after codec mute, and power up/down is more about top level power management. For these chips, the "mute" state still expects a TDM clock, and yanking the clock in this state will trigger clock errors. So, do the full shutdown<->mute<->active transition on the mute operation, so the amp is in software shutdown by the time the clocks are removed. This fixes TDM clock errors when streams are stopped. Signed-off-by: Hector Martin Signed-off-by: Mark Brown Link: https://patch.msgid.link/20250208-asoc-tas2764-v1-1-dbab892a69b5@kernel.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/tas2764.c | 51 ++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c index 31f94c8cf2844..39a7d39536fe6 100644 --- a/sound/soc/codecs/tas2764.c +++ b/sound/soc/codecs/tas2764.c @@ -180,33 +180,6 @@ static SOC_ENUM_SINGLE_DECL( static const struct snd_kcontrol_new tas2764_asi1_mux = SOC_DAPM_ENUM("ASI1 Source", tas2764_ASI1_src_enum); -static int tas2764_dac_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); - struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(component); - int ret; - - switch (event) { - case SND_SOC_DAPM_POST_PMU: - tas2764->dac_powered = true; - ret = tas2764_update_pwr_ctrl(tas2764); - break; - case SND_SOC_DAPM_PRE_PMD: - tas2764->dac_powered = false; - ret = tas2764_update_pwr_ctrl(tas2764); - break; - default: - dev_err(tas2764->dev, "Unsupported event\n"); - return -EINVAL; - } - - if (ret < 0) - return ret; - - return 0; -} - static const struct snd_kcontrol_new isense_switch = SOC_DAPM_SINGLE("Switch", TAS2764_PWR_CTRL, TAS2764_ISENSE_POWER_EN, 1, 1); static const struct snd_kcontrol_new vsense_switch = @@ -219,8 +192,7 @@ static const struct snd_soc_dapm_widget tas2764_dapm_widgets[] = { 1, &isense_switch), SND_SOC_DAPM_SWITCH("VSENSE", TAS2764_PWR_CTRL, TAS2764_VSENSE_POWER_EN, 1, &vsense_switch), - SND_SOC_DAPM_DAC_E("DAC", NULL, SND_SOC_NOPM, 0, 0, tas2764_dac_event, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), + SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_OUTPUT("OUT"), SND_SOC_DAPM_SIGGEN("VMON"), SND_SOC_DAPM_SIGGEN("IMON") @@ -241,9 +213,28 @@ static int tas2764_mute(struct snd_soc_dai *dai, int mute, int direction) { struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(dai->component); + int ret; + + if (!mute) { + tas2764->dac_powered = true; + ret = tas2764_update_pwr_ctrl(tas2764); + if (ret) + return ret; + } tas2764->unmuted = !mute; - return tas2764_update_pwr_ctrl(tas2764); + ret = tas2764_update_pwr_ctrl(tas2764); + if (ret) + return ret; + + if (mute) { + tas2764->dac_powered = false; + ret = tas2764_update_pwr_ctrl(tas2764); + if (ret) + return ret; + } + + return 0; } static int tas2764_set_bitwidth(struct tas2764_priv *tas2764, int bitwidth) -- GitLab From c4260bf83b4296a94b272291eac66dc52cc0cc46 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Wed, 12 Feb 2025 02:24:38 +0000 Subject: [PATCH 0361/2211] ASoC: soc-dai: check return value at snd_soc_dai_set_tdm_slot() [ Upstream commit 7f1186a8d738661b941b298fd6d1d5725ed71428 ] snd_soc_dai_set_tdm_slot() calls .xlate_tdm_slot_mask() or snd_soc_xlate_tdm_slot_mask(), but didn't check its return value. Let's check it. This patch might break existing driver. In such case, let's makes each func to void instead of int. Signed-off-by: Kuninori Morimoto Link: https://patch.msgid.link/87o6z7yk61.wl-kuninori.morimoto.gx@renesas.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/soc-dai.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c index 4e08892d24c62..de09d21add453 100644 --- a/sound/soc/soc-dai.c +++ b/sound/soc/soc-dai.c @@ -275,10 +275,11 @@ int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai, if (dai->driver->ops && dai->driver->ops->xlate_tdm_slot_mask) - dai->driver->ops->xlate_tdm_slot_mask(slots, - &tx_mask, &rx_mask); + ret = dai->driver->ops->xlate_tdm_slot_mask(slots, &tx_mask, &rx_mask); else - snd_soc_xlate_tdm_slot_mask(slots, &tx_mask, &rx_mask); + ret = snd_soc_xlate_tdm_slot_mask(slots, &tx_mask, &rx_mask); + if (ret) + goto err; for_each_pcm_streams(stream) snd_soc_dai_tdm_mask_set(dai, stream, *tdm_mask[stream]); @@ -287,6 +288,7 @@ int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai, dai->driver->ops->set_tdm_slot) ret = dai->driver->ops->set_tdm_slot(dai, tx_mask, rx_mask, slots, slot_width); +err: return soc_dai_ret(dai, ret); } EXPORT_SYMBOL_GPL(snd_soc_dai_set_tdm_slot); -- GitLab From 5b1b4cb46d9514bec053b392d2266f00e0d6ee19 Mon Sep 17 00:00:00 2001 From: Valentin Caron Date: Thu, 16 Jan 2025 18:00:09 +0100 Subject: [PATCH 0362/2211] pinctrl: devicetree: do not goto err when probing hogs in pinctrl_dt_to_map [ Upstream commit c98868e816209e568c9d72023ba0bc1e4d96e611 ] Cross case in pinctrl framework make impossible to an hogged pin and another, not hogged, used within the same device-tree node. For example with this simplified device-tree : &pinctrl { pinctrl_pin_1: pinctrl-pin-1 { pins = "dummy-pinctrl-pin"; }; }; &rtc { pinctrl-names = "default" pinctrl-0 = <&pinctrl_pin_1 &rtc_pin_1> rtc_pin_1: rtc-pin-1 { pins = "dummy-rtc-pin"; }; }; "pinctrl_pin_1" configuration is never set. This produces this path in the code: really_probe() pinctrl_bind_pins() | devm_pinctrl_get() | pinctrl_get() | create_pinctrl() | pinctrl_dt_to_map() | // Hog pin create an abort for all pins of the node | ret = dt_to_map_one_config() | | /* Do not defer probing of hogs (circular loop) */ | | if (np_pctldev == p->dev->of_node) | | return -ENODEV; | if (ret) | goto err | call_driver_probe() stm32_rtc_probe() pinctrl_enable() pinctrl_claim_hogs() create_pinctrl() for_each_maps(maps_node, i, map) // Not hog pin is skipped if (pctldev && strcmp(dev_name(pctldev->dev), map->ctrl_dev_name)) continue; At the first call of create_pinctrl() the hogged pin produces an abort to avoid a defer of hogged pins. All other pin configurations are trashed. At the second call, create_pinctrl is now called with pctldev parameter to get hogs, but in this context only hogs are set. And other pins are skipped. To handle this, do not produce an abort in the first call of create_pinctrl(). Classic pin configuration will be set in pinctrl_bind_pins() context. And the hogged pin configuration will be set in pinctrl_claim_hogs() context. Signed-off-by: Valentin Caron Link: https://lore.kernel.org/20250116170009.2075544-1-valentin.caron@foss.st.com Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/devicetree.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/pinctrl/devicetree.c b/drivers/pinctrl/devicetree.c index 6a94ecd6a8dea..0b7f74beb6a6a 100644 --- a/drivers/pinctrl/devicetree.c +++ b/drivers/pinctrl/devicetree.c @@ -143,10 +143,14 @@ static int dt_to_map_one_config(struct pinctrl *p, pctldev = get_pinctrl_dev_from_of_node(np_pctldev); if (pctldev) break; - /* Do not defer probing of hogs (circular loop) */ + /* + * Do not defer probing of hogs (circular loop) + * + * Return 1 to let the caller catch the case. + */ if (np_pctldev == p->dev->of_node) { of_node_put(np_pctldev); - return -ENODEV; + return 1; } } of_node_put(np_pctldev); @@ -265,6 +269,8 @@ int pinctrl_dt_to_map(struct pinctrl *p, struct pinctrl_dev *pctldev) ret = dt_to_map_one_config(p, pctldev, statename, np_config); of_node_put(np_config); + if (ret == 1) + continue; if (ret < 0) goto err; } -- GitLab From 316f2911fb11aedee07d047feb958bfb7416159e Mon Sep 17 00:00:00 2001 From: Konstantin Andreev Date: Fri, 17 Jan 2025 02:40:34 +0300 Subject: [PATCH 0363/2211] smack: recognize ipv4 CIPSO w/o categories [ Upstream commit a158a937d864d0034fea14913c1f09c6d5f574b8 ] If SMACK label has CIPSO representation w/o categories, e.g.: | # cat /smack/cipso2 | foo 10 | @ 250/2 | ... then SMACK does not recognize such CIPSO in input ipv4 packets and substitues '*' label instead. Audit records may look like | lsm=SMACK fn=smack_socket_sock_rcv_skb action=denied | subject="*" object="_" requested=w pid=0 comm="swapper/1" ... This happens in two steps: 1) security/smack/smackfs.c`smk_set_cipso does not clear NETLBL_SECATTR_MLS_CAT from (struct smack_known *)skp->smk_netlabel.flags on assigning CIPSO w/o categories: | rcu_assign_pointer(skp->smk_netlabel.attr.mls.cat, ncats.attr.mls.cat); | skp->smk_netlabel.attr.mls.lvl = ncats.attr.mls.lvl; 2) security/smack/smack_lsm.c`smack_from_secattr can not match skp->smk_netlabel with input packet's struct netlbl_lsm_secattr *sap because sap->flags have not NETLBL_SECATTR_MLS_CAT (what is correct) but skp->smk_netlabel.flags have (what is incorrect): | if ((sap->flags & NETLBL_SECATTR_MLS_CAT) == 0) { | if ((skp->smk_netlabel.flags & | NETLBL_SECATTR_MLS_CAT) == 0) | found = 1; | break; | } This commit sets/clears NETLBL_SECATTR_MLS_CAT in skp->smk_netlabel.flags according to the presense of CIPSO categories. The update of smk_netlabel is not atomic, so input packets processing still may be incorrect during short time while update proceeds. Signed-off-by: Konstantin Andreev Signed-off-by: Casey Schaufler Signed-off-by: Sasha Levin --- security/smack/smackfs.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c index 5dd1e164f9b13..d27e8b916bfb9 100644 --- a/security/smack/smackfs.c +++ b/security/smack/smackfs.c @@ -933,6 +933,10 @@ static ssize_t smk_set_cipso(struct file *file, const char __user *buf, if (rc >= 0) { old_cat = skp->smk_netlabel.attr.mls.cat; rcu_assign_pointer(skp->smk_netlabel.attr.mls.cat, ncats.attr.mls.cat); + if (ncats.attr.mls.cat) + skp->smk_netlabel.flags |= NETLBL_SECATTR_MLS_CAT; + else + skp->smk_netlabel.flags &= ~(u32)NETLBL_SECATTR_MLS_CAT; skp->smk_netlabel.attr.mls.lvl = ncats.attr.mls.lvl; synchronize_rcu(); netlbl_catmap_free(old_cat); -- GitLab From 8f5ce688c8318e4a68ccb235495a183286a49b79 Mon Sep 17 00:00:00 2001 From: Konstantin Andreev Date: Fri, 17 Jan 2025 02:40:33 +0300 Subject: [PATCH 0364/2211] smack: Revert "smackfs: Added check catlen" [ Upstream commit c7fb50cecff9cad19fdac5b37337eae4e42b94c7 ] This reverts commit ccfd889acb06eab10b98deb4b5eef0ec74157ea0 The indicated commit * does not describe the problem that change tries to solve * has programming issues * introduces a bug: forever clears NETLBL_SECATTR_MLS_CAT in (struct smack_known *)skp->smk_netlabel.flags Reverting the commit to reapproach original problem Signed-off-by: Konstantin Andreev Signed-off-by: Casey Schaufler Signed-off-by: Sasha Levin --- security/smack/smackfs.c | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c index d27e8b916bfb9..1e35c9f807b2b 100644 --- a/security/smack/smackfs.c +++ b/security/smack/smackfs.c @@ -830,7 +830,7 @@ static int smk_open_cipso(struct inode *inode, struct file *file) static ssize_t smk_set_cipso(struct file *file, const char __user *buf, size_t count, loff_t *ppos, int format) { - struct netlbl_lsm_catmap *old_cat, *new_cat = NULL; + struct netlbl_lsm_catmap *old_cat; struct smack_known *skp; struct netlbl_lsm_secattr ncats; char mapcatset[SMK_CIPSOLEN]; @@ -917,19 +917,8 @@ static ssize_t smk_set_cipso(struct file *file, const char __user *buf, smack_catset_bit(cat, mapcatset); } - ncats.flags = 0; - if (catlen == 0) { - ncats.attr.mls.cat = NULL; - ncats.attr.mls.lvl = maplevel; - new_cat = netlbl_catmap_alloc(GFP_ATOMIC); - if (new_cat) - new_cat->next = ncats.attr.mls.cat; - ncats.attr.mls.cat = new_cat; - skp->smk_netlabel.flags &= ~(1U << 3); - rc = 0; - } else { - rc = smk_netlbl_mls(maplevel, mapcatset, &ncats, SMK_CIPSOLEN); - } + + rc = smk_netlbl_mls(maplevel, mapcatset, &ncats, SMK_CIPSOLEN); if (rc >= 0) { old_cat = skp->smk_netlabel.attr.mls.cat; rcu_assign_pointer(skp->smk_netlabel.attr.mls.cat, ncats.attr.mls.cat); -- GitLab From 12aeff4944dc6263d1e5b00001097ff40aed9180 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Fri, 24 Jan 2025 11:01:42 +0000 Subject: [PATCH 0365/2211] kunit: tool: Use qboot on QEMU x86_64 [ Upstream commit 08fafac4c9f289a9d9a22d838921e4b3eb22c664 ] As noted in [0], SeaBIOS (QEMU default) makes a mess of the terminal, qboot does not. It turns out this is actually useful with kunit.py, since the user is exposed to this issue if they set --raw_output=all. qboot is also faster than SeaBIOS, but it's is marginal for this usecase. [0] https://lore.kernel.org/all/CA+i-1C0wYb-gZ8Mwh3WSVpbk-LF-Uo+njVbASJPe1WXDURoV7A@mail.gmail.com/ Both SeaBIOS and qboot are x86-specific. Link: https://lore.kernel.org/r/20250124-kunit-qboot-v1-1-815e4d4c6f7c@google.com Signed-off-by: Brendan Jackman Reviewed-by: David Gow Signed-off-by: Shuah Khan Signed-off-by: Sasha Levin --- tools/testing/kunit/qemu_configs/x86_64.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/testing/kunit/qemu_configs/x86_64.py b/tools/testing/kunit/qemu_configs/x86_64.py index dc79490768630..4a6bf4e048f5b 100644 --- a/tools/testing/kunit/qemu_configs/x86_64.py +++ b/tools/testing/kunit/qemu_configs/x86_64.py @@ -7,4 +7,6 @@ CONFIG_SERIAL_8250_CONSOLE=y''', qemu_arch='x86_64', kernel_path='arch/x86/boot/bzImage', kernel_command_line='console=ttyS0', - extra_qemu_params=[]) + # qboot is faster than SeaBIOS and doesn't mess up + # the terminal. + extra_qemu_params=['-bios', 'qboot.rom']) -- GitLab From 9a981079097bee6a0583877798de0b240717bdde Mon Sep 17 00:00:00 2001 From: David Plowman Date: Tue, 4 Feb 2025 12:34:36 +0530 Subject: [PATCH 0366/2211] media: i2c: imx219: Correct the minimum vblanking value [ Upstream commit e3b82d49bf676f3c873e642038765eac32ab6d39 ] The datasheet for this sensor documents the minimum vblanking as being 32 lines. It does fix some problems with occasional black lines at the bottom of images (tested on Raspberry Pi). Signed-off-by: David Plowman Reviewed-by: Jacopo Mondi Reviewed-by: Dave Stevenson Signed-off-by: Jai Luthra Signed-off-by: Sakari Ailus Signed-off-by: Hans Verkuil Signed-off-by: Sasha Levin --- drivers/media/i2c/imx219.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c index 906aa314b7f84..eaa1496c71bb2 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -74,7 +74,7 @@ #define IMX219_REG_VTS CCI_REG16(0x0160) #define IMX219_VTS_MAX 0xffff -#define IMX219_VBLANK_MIN 4 +#define IMX219_VBLANK_MIN 32 /* HBLANK control - read only */ #define IMX219_PPL_DEFAULT 3448 -- GitLab From 69689d1138c85f5a46485289d0691bdc95c91e00 Mon Sep 17 00:00:00 2001 From: Sakari Ailus Date: Mon, 16 Dec 2024 10:48:49 +0200 Subject: [PATCH 0367/2211] media: v4l: Memset argument to 0 before calling get_mbus_config pad op [ Upstream commit 91d6a99acfa5ce9f95ede775074b80f7193bd717 ] Memset the config argument to get_mbus_config V4L2 sub-device pad operation to zero before calling the operation. This ensures the callers don't need to bother with it nor the implementations need to set all fields that may not be relevant to them. Signed-off-by: Sakari Ailus Reviewed-by: Tomi Valkeinen Signed-off-by: Hans Verkuil Signed-off-by: Sasha Levin --- drivers/media/v4l2-core/v4l2-subdev.c | 2 ++ include/media/v4l2-subdev.h | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index 3a4ba08810d24..1193852bad599 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -439,6 +439,8 @@ static int call_enum_dv_timings(struct v4l2_subdev *sd, static int call_get_mbus_config(struct v4l2_subdev *sd, unsigned int pad, struct v4l2_mbus_config *config) { + memset(config, 0, sizeof(*config)); + return check_pad(sd, pad) ? : sd->ops->pad->get_mbus_config(sd, pad, config); } diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index 8daa0929865cf..43343f1586d13 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h @@ -821,7 +821,9 @@ struct v4l2_subdev_state { * possible configuration from the remote end, likely calling * this operation as close as possible to stream on time. The * operation shall fail if the pad index it has been called on - * is not valid or in case of unrecoverable failures. + * is not valid or in case of unrecoverable failures. The + * config argument has been memset to 0 just before calling + * the op. * * @set_routing: Enable or disable data connection routes described in the * subdevice routing table. Subdevs that implement this operation -- GitLab From 50c5bbb45c7dfea22c566c75ca62e306848f18ba Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Mon, 10 Feb 2025 09:45:05 -0800 Subject: [PATCH 0368/2211] net/mlx4_core: Avoid impossible mlx4_db_alloc() order value [ Upstream commit 4a6f18f28627e121bd1f74b5fcc9f945d6dbeb1e ] GCC can see that the value range for "order" is capped, but this leads it to consider that it might be negative, leading to a false positive warning (with GCC 15 with -Warray-bounds -fdiagnostics-details): ../drivers/net/ethernet/mellanox/mlx4/alloc.c:691:47: error: array subscript -1 is below array bounds of 'long unsigned int *[2]' [-Werror=array-bounds=] 691 | i = find_first_bit(pgdir->bits[o], MLX4_DB_PER_PAGE >> o); | ~~~~~~~~~~~^~~ 'mlx4_alloc_db_from_pgdir': events 1-2 691 | i = find_first_bit(pgdir->bits[o], MLX4_DB_PER_PAGE >> o); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (2) out of array bounds here | (1) when the condition is evaluated to true In file included from ../drivers/net/ethernet/mellanox/mlx4/mlx4.h:53, from ../drivers/net/ethernet/mellanox/mlx4/alloc.c:42: ../include/linux/mlx4/device.h:664:33: note: while referencing 'bits' 664 | unsigned long *bits[2]; | ^~~~ Switch the argument to unsigned int, which removes the compiler needing to consider negative values. Signed-off-by: Kees Cook Link: https://patch.msgid.link/20250210174504.work.075-kees@kernel.org Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx4/alloc.c | 6 +++--- include/linux/mlx4/device.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx4/alloc.c b/drivers/net/ethernet/mellanox/mlx4/alloc.c index b330020dc0d67..f2bded847e61d 100644 --- a/drivers/net/ethernet/mellanox/mlx4/alloc.c +++ b/drivers/net/ethernet/mellanox/mlx4/alloc.c @@ -682,9 +682,9 @@ static struct mlx4_db_pgdir *mlx4_alloc_db_pgdir(struct device *dma_device) } static int mlx4_alloc_db_from_pgdir(struct mlx4_db_pgdir *pgdir, - struct mlx4_db *db, int order) + struct mlx4_db *db, unsigned int order) { - int o; + unsigned int o; int i; for (o = order; o <= 1; ++o) { @@ -712,7 +712,7 @@ found: return 0; } -int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order) +int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, unsigned int order) { struct mlx4_priv *priv = mlx4_priv(dev); struct mlx4_db_pgdir *pgdir; diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 27f42f713c891..86f0f2a25a3d6 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h @@ -1135,7 +1135,7 @@ int mlx4_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt, int mlx4_buf_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt, struct mlx4_buf *buf); -int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order); +int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, unsigned int order); void mlx4_db_free(struct mlx4_dev *dev, struct mlx4_db *db); int mlx4_alloc_hwq_res(struct mlx4_dev *dev, struct mlx4_hwq_resources *wqres, -- GitLab From 884d64e8e4dc6d4f1b0f69c31e4b4eadaf735648 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Thu, 13 Feb 2025 11:29:01 -0800 Subject: [PATCH 0369/2211] drm/xe: Stop ignoring errors from xe_ttm_stolen_mgr_init() [ Upstream commit ff57025c358603555f1e0ae0d50282a460433594 ] Make sure to differentiate normal behavior, e.g. there's no stolen, from allocation errors or failure to initialize lower layers. Reviewed-by: Francois Dugast Reviewed-by: Himal Prasad Ghimiray Link: https://patchwork.freedesktop.org/patch/msgid/20250213192909.996148-5-lucas.demarchi@intel.com Signed-off-by: Lucas De Marchi Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_device.c | 4 +++- drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c | 17 +++++++++-------- drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c index bb85208cf1a94..5c37bed3c948f 100644 --- a/drivers/gpu/drm/xe/xe_device.c +++ b/drivers/gpu/drm/xe/xe_device.c @@ -694,7 +694,9 @@ int xe_device_probe(struct xe_device *xe) } /* Allocate and map stolen after potential VRAM resize */ - xe_ttm_stolen_mgr_init(xe); + err = xe_ttm_stolen_mgr_init(xe); + if (err) + return err; /* * Now that GT is initialized (TTM in particular), diff --git a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c index f7113cf6109d5..ef84fa757b26f 100644 --- a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c +++ b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c @@ -201,17 +201,16 @@ static u64 detect_stolen(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr) #endif } -void xe_ttm_stolen_mgr_init(struct xe_device *xe) +int xe_ttm_stolen_mgr_init(struct xe_device *xe) { - struct xe_ttm_stolen_mgr *mgr = drmm_kzalloc(&xe->drm, sizeof(*mgr), GFP_KERNEL); struct pci_dev *pdev = to_pci_dev(xe->drm.dev); + struct xe_ttm_stolen_mgr *mgr; u64 stolen_size, io_size; int err; - if (!mgr) { - drm_dbg_kms(&xe->drm, "Stolen mgr init failed\n"); - return; - } + mgr = drmm_kzalloc(&xe->drm, sizeof(*mgr), GFP_KERNEL); + if (!mgr) + return -ENOMEM; if (IS_SRIOV_VF(xe)) stolen_size = 0; @@ -224,7 +223,7 @@ void xe_ttm_stolen_mgr_init(struct xe_device *xe) if (!stolen_size) { drm_dbg_kms(&xe->drm, "No stolen memory support\n"); - return; + return 0; } /* @@ -240,7 +239,7 @@ void xe_ttm_stolen_mgr_init(struct xe_device *xe) io_size, PAGE_SIZE); if (err) { drm_dbg_kms(&xe->drm, "Stolen mgr init failed: %i\n", err); - return; + return err; } drm_dbg_kms(&xe->drm, "Initialized stolen memory support with %llu bytes\n", @@ -248,6 +247,8 @@ void xe_ttm_stolen_mgr_init(struct xe_device *xe) if (io_size) mgr->mapping = devm_ioremap_wc(&pdev->dev, mgr->io_base, io_size); + + return 0; } u64 xe_ttm_stolen_io_offset(struct xe_bo *bo, u32 offset) diff --git a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h index 1777245ff8101..8e877d1e839bd 100644 --- a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h +++ b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h @@ -12,7 +12,7 @@ struct ttm_resource; struct xe_bo; struct xe_device; -void xe_ttm_stolen_mgr_init(struct xe_device *xe); +int xe_ttm_stolen_mgr_init(struct xe_device *xe); int xe_ttm_stolen_io_mem_reserve(struct xe_device *xe, struct ttm_resource *mem); bool xe_ttm_stolen_cpu_access_needs_ggtt(struct xe_device *xe); u64 xe_ttm_stolen_io_offset(struct xe_bo *bo, u32 offset); -- GitLab From 01d28e67f567bcb0aa0533a4b805370131ffc4f4 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Thu, 13 Feb 2025 11:29:00 -0800 Subject: [PATCH 0370/2211] drm/xe: Fix xe_tile_init_noalloc() error propagation [ Upstream commit 0bcf41171c64234e79eb3552d00f0aad8a47e8d3 ] Propagate the error to the caller so initialization properly stops if sysfs creation fails. Reviewed-by: Francois Dugast Reviewed-by: Himal Prasad Ghimiray Link: https://patchwork.freedesktop.org/patch/msgid/20250213192909.996148-4-lucas.demarchi@intel.com Signed-off-by: Lucas De Marchi Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_tile.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_tile.c b/drivers/gpu/drm/xe/xe_tile.c index dda5268507d8e..349beddf9b383 100644 --- a/drivers/gpu/drm/xe/xe_tile.c +++ b/drivers/gpu/drm/xe/xe_tile.c @@ -173,9 +173,7 @@ int xe_tile_init_noalloc(struct xe_tile *tile) xe_wa_apply_tile_workarounds(tile); - err = xe_tile_sysfs_init(tile); - - return 0; + return xe_tile_sysfs_init(tile); } void xe_tile_migrate_wait(struct xe_tile *tile) -- GitLab From 328a2ec198e70f2a3eae206a2718468602a178db Mon Sep 17 00:00:00 2001 From: Karl Chan Date: Tue, 8 Oct 2024 00:34:12 +0800 Subject: [PATCH 0371/2211] clk: qcom: ipq5018: allow it to be bulid on arm32 [ Upstream commit 5d02941c83997b58e8fc15390290c7c6975acaff ] There are some ipq5018 based device's firmware only can able to boot arm32 but the clock driver dont allow it to be compiled on arm32. Therefore allow GCC for IPQ5018 to be selected when building ARM32 kernel Signed-off-by: Karl Chan Reviewed-by: Dmitry Baryshkov Link: https://lore.kernel.org/r/20241007163414.32458-4-exxxxkc@getgoogleoff.me [bjorn: Updated commit message, per Dmitry's suggestion] Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/clk/qcom/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig index 16145f74bbc85..fd605bccf48dc 100644 --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig @@ -199,7 +199,7 @@ config IPQ_GCC_4019 config IPQ_GCC_5018 tristate "IPQ5018 Global Clock Controller" - depends on ARM64 || COMPILE_TEST + depends on ARM || ARM64 || COMPILE_TEST help Support for global clock controller on ipq5018 devices. Say Y if you want to use peripheral devices such as UART, SPI, -- GitLab From 6469a2b1140d0be363b72dfafe0fc0bbc9504493 Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Wed, 12 Feb 2025 21:01:35 +0100 Subject: [PATCH 0372/2211] clk: qcom: clk-alpha-pll: Do not use random stack value for recalc rate [ Upstream commit 7a243e1b814a02ab40793026ef64223155d86395 ] If regmap_read() fails, random stack value was used in calculating new frequency in recalc_rate() callbacks. Such failure is really not expected as these are all MMIO reads, however code should be here correct and bail out. This also avoids possible warning on uninitialized value. Signed-off-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20250212-b4-clk-qcom-clean-v3-1-499f37444f5d@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/clk/qcom/clk-alpha-pll.c | 52 ++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/drivers/clk/qcom/clk-alpha-pll.c b/drivers/clk/qcom/clk-alpha-pll.c index 10e276dabff93..e76ecc4663511 100644 --- a/drivers/clk/qcom/clk-alpha-pll.c +++ b/drivers/clk/qcom/clk-alpha-pll.c @@ -670,14 +670,19 @@ clk_alpha_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); u32 alpha_width = pll_alpha_width(pll); - regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); + if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l)) + return 0; + + if (regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl)) + return 0; - regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl); if (ctl & PLL_ALPHA_EN) { - regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &low); + if (regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &low)) + return 0; if (alpha_width > 32) { - regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), - &high); + if (regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), + &high)) + return 0; a = (u64)high << 32 | low; } else { a = low & GENMASK(alpha_width - 1, 0); @@ -903,8 +908,11 @@ alpha_pll_huayra_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); u32 l, alpha = 0, ctl, alpha_m, alpha_n; - regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); - regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl); + if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l)) + return 0; + + if (regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl)) + return 0; if (ctl & PLL_ALPHA_EN) { regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &alpha); @@ -1098,8 +1106,11 @@ clk_trion_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); u32 l, frac, alpha_width = pll_alpha_width(pll); - regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); - regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &frac); + if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l)) + return 0; + + if (regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &frac)) + return 0; return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width); } @@ -1157,7 +1168,8 @@ clk_alpha_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); u32 ctl; - regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl); + if (regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl)) + return 0; ctl >>= PLL_POST_DIV_SHIFT; ctl &= PLL_POST_DIV_MASK(pll); @@ -1373,8 +1385,11 @@ static unsigned long alpha_pll_fabia_recalc_rate(struct clk_hw *hw, struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); u32 l, frac, alpha_width = pll_alpha_width(pll); - regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); - regmap_read(pll->clkr.regmap, PLL_FRAC(pll), &frac); + if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l)) + return 0; + + if (regmap_read(pll->clkr.regmap, PLL_FRAC(pll), &frac)) + return 0; return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width); } @@ -1524,7 +1539,8 @@ clk_trion_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) struct regmap *regmap = pll->clkr.regmap; u32 i, div = 1, val; - regmap_read(regmap, PLL_USER_CTL(pll), &val); + if (regmap_read(regmap, PLL_USER_CTL(pll), &val)) + return 0; val >>= pll->post_div_shift; val &= PLL_POST_DIV_MASK(pll); @@ -2451,9 +2467,12 @@ static unsigned long alpha_pll_lucid_evo_recalc_rate(struct clk_hw *hw, struct regmap *regmap = pll->clkr.regmap; u32 l, frac; - regmap_read(regmap, PLL_L_VAL(pll), &l); + if (regmap_read(regmap, PLL_L_VAL(pll), &l)) + return 0; l &= LUCID_EVO_PLL_L_VAL_MASK; - regmap_read(regmap, PLL_ALPHA_VAL(pll), &frac); + + if (regmap_read(regmap, PLL_ALPHA_VAL(pll), &frac)) + return 0; return alpha_pll_calc_rate(parent_rate, l, frac, pll_alpha_width(pll)); } @@ -2528,7 +2547,8 @@ static unsigned long clk_rivian_evo_pll_recalc_rate(struct clk_hw *hw, struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); u32 l; - regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); + if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l)) + return 0; return parent_rate * l; } -- GitLab From cf126a14584e5f49647824d4b266567359f0e297 Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Fri, 14 Feb 2025 06:36:15 +0800 Subject: [PATCH 0373/2211] drm/xe/debugfs: fixed the return value of wedged_mode_set [ Upstream commit 6884d2051011f4db9e2f0b85709c79a8ced13bd6 ] It is generally expected that the write() function should return a positive value indicating the number of bytes written or a negative error code if an error occurs. Returning 0 is unusual and can lead to unexpected behavior. When the user program writes the same value to wedged_mode twice in a row, a lockup will occur, because the value expected to be returned by the write() function inside the program should be equal to the actual written value instead of 0. To reproduce the issue: echo 1 > /sys/kernel/debug/dri/0/wedged_mode echo 1 > /sys/kernel/debug/dri/0/wedged_mode <- lockup here Signed-off-by: Xin Wang Cc: Rodrigo Vivi Cc: Fei Yang Cc: Shuicheng Lin Reviewed-by: Rodrigo Vivi Link: https://patchwork.freedesktop.org/patch/msgid/20250213223615.2327367-1-x.wang@intel.com Signed-off-by: Rodrigo Vivi Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/xe/xe_debugfs.c b/drivers/gpu/drm/xe/xe_debugfs.c index fe4319eb13fdf..051a37e477f4c 100644 --- a/drivers/gpu/drm/xe/xe_debugfs.c +++ b/drivers/gpu/drm/xe/xe_debugfs.c @@ -147,7 +147,7 @@ static ssize_t wedged_mode_set(struct file *f, const char __user *ubuf, return -EINVAL; if (xe->wedged.mode == wedged_mode) - return 0; + return size; xe->wedged.mode = wedged_mode; -- GitLab From b870651021223b127efe51b11772b0078a7a49fe Mon Sep 17 00:00:00 2001 From: Shuicheng Lin Date: Thu, 13 Feb 2025 23:03:22 +0000 Subject: [PATCH 0374/2211] drm/xe/debugfs: Add missing xe_pm_runtime_put in wedge_mode_set [ Upstream commit b31e668d3111b100d16fd7db8db335328ce8c6d5 ] xe_pm_runtime_put is missed in the failure path. Cc: Rodrigo Vivi Signed-off-by: Shuicheng Lin Reviewed-by: Rodrigo Vivi Link: https://patchwork.freedesktop.org/patch/msgid/20250213230322.1180621-1-shuicheng.lin@intel.com Signed-off-by: Rodrigo Vivi Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_debugfs.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/xe/xe_debugfs.c b/drivers/gpu/drm/xe/xe_debugfs.c index 051a37e477f4c..278ce1c37b395 100644 --- a/drivers/gpu/drm/xe/xe_debugfs.c +++ b/drivers/gpu/drm/xe/xe_debugfs.c @@ -156,6 +156,7 @@ static ssize_t wedged_mode_set(struct file *f, const char __user *ubuf, ret = xe_guc_ads_scheduler_policy_toggle_reset(>->uc.guc.ads); if (ret) { xe_gt_err(gt, "Failed to update GuC ADS scheduler policy. GuC may still cause engine reset even with wedged_mode=2\n"); + xe_pm_runtime_put(xe); return -EIO; } } -- GitLab From eb6fd16b4fc4feb370c68ec17b59f6078f276a51 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Thu, 13 Feb 2025 12:45:47 +0100 Subject: [PATCH 0375/2211] x86/ibt: Handle FineIBT in handle_cfi_failure() [ Upstream commit 882b86fd4e0d49bf91148dbadcdbece19ded40e6 ] Sami reminded me that FineIBT failure does not hook into the regular CFI failure case, and as such CFI_PERMISSIVE does not work. Reported-by: Sami Tolvanen Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Sami Tolvanen Link: https://lkml.kernel.org/r/20250214092619.GB21726@noisy.programming.kicks-ass.net Signed-off-by: Sasha Levin --- arch/x86/include/asm/cfi.h | 11 +++++++++++ arch/x86/kernel/alternative.c | 30 ++++++++++++++++++++++++++++++ arch/x86/kernel/cfi.c | 22 ++++++++++++++++++---- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/cfi.h b/arch/x86/include/asm/cfi.h index 31d19c815f992..7dd5ab239c87b 100644 --- a/arch/x86/include/asm/cfi.h +++ b/arch/x86/include/asm/cfi.h @@ -126,6 +126,17 @@ static inline int cfi_get_offset(void) extern u32 cfi_get_func_hash(void *func); +#ifdef CONFIG_FINEIBT +extern bool decode_fineibt_insn(struct pt_regs *regs, unsigned long *target, u32 *type); +#else +static inline bool +decode_fineibt_insn(struct pt_regs *regs, unsigned long *target, u32 *type) +{ + return false; +} + +#endif + #else static inline enum bug_trap_type handle_cfi_failure(struct pt_regs *regs) { diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index 66e77bd7d5116..6ab96bc764cfa 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c @@ -1254,6 +1254,7 @@ asm( ".pushsection .rodata \n" " endbr64 \n" " subl $0x12345678, %r10d \n" " je fineibt_preamble_end \n" + "fineibt_preamble_ud2: \n" " ud2 \n" " nop \n" "fineibt_preamble_end: \n" @@ -1261,9 +1262,11 @@ asm( ".pushsection .rodata \n" ); extern u8 fineibt_preamble_start[]; +extern u8 fineibt_preamble_ud2[]; extern u8 fineibt_preamble_end[]; #define fineibt_preamble_size (fineibt_preamble_end - fineibt_preamble_start) +#define fineibt_preamble_ud2 (fineibt_preamble_ud2 - fineibt_preamble_start) #define fineibt_preamble_hash 7 asm( ".pushsection .rodata \n" @@ -1568,6 +1571,33 @@ static void poison_cfi(void *addr) } } +/* + * regs->ip points to a UD2 instruction, return true and fill out target and + * type when this UD2 is from a FineIBT preamble. + * + * We check the preamble by checking for the ENDBR instruction relative to the + * UD2 instruction. + */ +bool decode_fineibt_insn(struct pt_regs *regs, unsigned long *target, u32 *type) +{ + unsigned long addr = regs->ip - fineibt_preamble_ud2; + u32 endbr, hash; + + __get_kernel_nofault(&endbr, addr, u32, Efault); + if (endbr != gen_endbr()) + return false; + + *target = addr + fineibt_preamble_size; + + __get_kernel_nofault(&hash, addr + fineibt_preamble_hash, u32, Efault); + *type = (u32)regs->r10 + hash; + + return true; + +Efault: + return false; +} + #else static void __apply_fineibt(s32 *start_retpoline, s32 *end_retpoline, diff --git a/arch/x86/kernel/cfi.c b/arch/x86/kernel/cfi.c index e6bf78fac1462..f6905bef0af84 100644 --- a/arch/x86/kernel/cfi.c +++ b/arch/x86/kernel/cfi.c @@ -70,11 +70,25 @@ enum bug_trap_type handle_cfi_failure(struct pt_regs *regs) unsigned long target; u32 type; - if (!is_cfi_trap(regs->ip)) - return BUG_TRAP_TYPE_NONE; + switch (cfi_mode) { + case CFI_KCFI: + if (!is_cfi_trap(regs->ip)) + return BUG_TRAP_TYPE_NONE; + + if (!decode_cfi_insn(regs, &target, &type)) + return report_cfi_failure_noaddr(regs, regs->ip); + + break; - if (!decode_cfi_insn(regs, &target, &type)) - return report_cfi_failure_noaddr(regs, regs->ip); + case CFI_FINEIBT: + if (!decode_fineibt_insn(regs, &target, &type)) + return BUG_TRAP_TYPE_NONE; + + break; + + default: + return BUG_TRAP_TYPE_NONE; + } return report_cfi_failure(regs, regs->ip, &target, type); } -- GitLab From 9c5f85b72fa6d285c91e7d867b4c3643a6952efb Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Fri, 7 Feb 2025 13:15:36 +0100 Subject: [PATCH 0376/2211] x86/traps: Cleanup and robustify decode_bug() [ Upstream commit c20ad96c9a8f0aeaf4e4057730a22de2657ad0c2 ] Notably, don't attempt to decode an immediate when MOD == 3. Additionally have it return the instruction length, such that WARN like bugs can more reliably skip to the correct instruction. Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Sami Tolvanen Link: https://lore.kernel.org/r/20250207122546.721120726@infradead.org Signed-off-by: Sasha Levin --- arch/x86/include/asm/bug.h | 5 ++- arch/x86/include/asm/ibt.h | 4 +- arch/x86/kernel/traps.c | 82 ++++++++++++++++++++++++++++---------- 3 files changed, 65 insertions(+), 26 deletions(-) diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h index 806649c7f23dc..9a0f29be1a9ea 100644 --- a/arch/x86/include/asm/bug.h +++ b/arch/x86/include/asm/bug.h @@ -22,8 +22,9 @@ #define SECOND_BYTE_OPCODE_UD2 0x0b #define BUG_NONE 0xffff -#define BUG_UD1 0xfffe -#define BUG_UD2 0xfffd +#define BUG_UD2 0xfffe +#define BUG_UD1 0xfffd +#define BUG_UD1_UBSAN 0xfffc #ifdef CONFIG_GENERIC_BUG diff --git a/arch/x86/include/asm/ibt.h b/arch/x86/include/asm/ibt.h index 1e59581d500ca..b778ae6e67ee8 100644 --- a/arch/x86/include/asm/ibt.h +++ b/arch/x86/include/asm/ibt.h @@ -41,7 +41,7 @@ _ASM_PTR fname "\n\t" \ ".popsection\n\t" -static inline __attribute_const__ u32 gen_endbr(void) +static __always_inline __attribute_const__ u32 gen_endbr(void) { u32 endbr; @@ -56,7 +56,7 @@ static inline __attribute_const__ u32 gen_endbr(void) return endbr; } -static inline __attribute_const__ u32 gen_endbr_poison(void) +static __always_inline __attribute_const__ u32 gen_endbr_poison(void) { /* * 4 byte NOP that isn't NOP4 (in fact it is OSP NOP3), such that it diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 5e3e036e6e537..b18fc7539b8d7 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -94,10 +94,17 @@ __always_inline int is_valid_bugaddr(unsigned long addr) /* * Check for UD1 or UD2, accounting for Address Size Override Prefixes. - * If it's a UD1, get the ModRM byte to pass along to UBSan. + * If it's a UD1, further decode to determine its use: + * + * UBSan{0}: 67 0f b9 00 ud1 (%eax),%eax + * UBSan{10}: 67 0f b9 40 10 ud1 0x10(%eax),%eax + * static_call: 0f b9 cc ud1 %esp,%ecx + * + * Notably UBSAN uses EAX, static_call uses ECX. */ -__always_inline int decode_bug(unsigned long addr, u32 *imm) +__always_inline int decode_bug(unsigned long addr, s32 *imm, int *len) { + unsigned long start = addr; u8 v; if (addr < TASK_SIZE_MAX) @@ -110,24 +117,42 @@ __always_inline int decode_bug(unsigned long addr, u32 *imm) return BUG_NONE; v = *(u8 *)(addr++); - if (v == SECOND_BYTE_OPCODE_UD2) + if (v == SECOND_BYTE_OPCODE_UD2) { + *len = addr - start; return BUG_UD2; + } - if (!IS_ENABLED(CONFIG_UBSAN_TRAP) || v != SECOND_BYTE_OPCODE_UD1) + if (v != SECOND_BYTE_OPCODE_UD1) return BUG_NONE; - /* Retrieve the immediate (type value) for the UBSAN UD1 */ - v = *(u8 *)(addr++); - if (X86_MODRM_RM(v) == 4) - addr++; - *imm = 0; - if (X86_MODRM_MOD(v) == 1) - *imm = *(u8 *)addr; - else if (X86_MODRM_MOD(v) == 2) - *imm = *(u32 *)addr; - else - WARN_ONCE(1, "Unexpected MODRM_MOD: %u\n", X86_MODRM_MOD(v)); + v = *(u8 *)(addr++); /* ModRM */ + + if (X86_MODRM_MOD(v) != 3 && X86_MODRM_RM(v) == 4) + addr++; /* SIB */ + + /* Decode immediate, if present */ + switch (X86_MODRM_MOD(v)) { + case 0: if (X86_MODRM_RM(v) == 5) + addr += 4; /* RIP + disp32 */ + break; + + case 1: *imm = *(s8 *)addr; + addr += 1; + break; + + case 2: *imm = *(s32 *)addr; + addr += 4; + break; + + case 3: break; + } + + /* record instruction length */ + *len = addr - start; + + if (X86_MODRM_REG(v) == 0) /* EAX */ + return BUG_UD1_UBSAN; return BUG_UD1; } @@ -258,10 +283,10 @@ static inline void handle_invalid_op(struct pt_regs *regs) static noinstr bool handle_bug(struct pt_regs *regs) { bool handled = false; - int ud_type; - u32 imm; + int ud_type, ud_len; + s32 ud_imm; - ud_type = decode_bug(regs->ip, &imm); + ud_type = decode_bug(regs->ip, &ud_imm, &ud_len); if (ud_type == BUG_NONE) return handled; @@ -281,15 +306,28 @@ static noinstr bool handle_bug(struct pt_regs *regs) */ if (regs->flags & X86_EFLAGS_IF) raw_local_irq_enable(); - if (ud_type == BUG_UD2) { + + switch (ud_type) { + case BUG_UD2: if (report_bug(regs->ip, regs) == BUG_TRAP_TYPE_WARN || handle_cfi_failure(regs) == BUG_TRAP_TYPE_WARN) { - regs->ip += LEN_UD2; + regs->ip += ud_len; handled = true; } - } else if (IS_ENABLED(CONFIG_UBSAN_TRAP)) { - pr_crit("%s at %pS\n", report_ubsan_failure(regs, imm), (void *)regs->ip); + break; + + case BUG_UD1_UBSAN: + if (IS_ENABLED(CONFIG_UBSAN_TRAP)) { + pr_crit("%s at %pS\n", + report_ubsan_failure(regs, ud_imm), + (void *)regs->ip); + } + break; + + default: + break; } + if (regs->flags & X86_EFLAGS_IF) raw_local_irq_disable(); instrumentation_end(); -- GitLab From e6e31b0182de596f73baf298cae12e04fcf6498b Mon Sep 17 00:00:00 2001 From: zihan zhou <15645113830zzh@gmail.com> Date: Sat, 8 Feb 2025 15:53:23 +0800 Subject: [PATCH 0377/2211] sched: Reduce the default slice to avoid tasks getting an extra tick [ Upstream commit 2ae891b826958b60919ea21c727f77bcd6ffcc2c ] The old default value for slice is 0.75 msec * (1 + ilog(ncpus)) which means that we have a default slice of: 0.75 for 1 cpu 1.50 up to 3 cpus 2.25 up to 7 cpus 3.00 for 8 cpus and above. For HZ=250 and HZ=100, because of the tick accuracy, the runtime of tasks is far higher than their slice. For HZ=1000 with 8 cpus or more, the accuracy of tick is already satisfactory, but there is still an issue that tasks will get an extra tick because the tick often arrives a little faster than expected. In this case, the task can only wait until the next tick to consider that it has reached its deadline, and will run 1ms longer. vruntime + sysctl_sched_base_slice = deadline |-----------|-----------|-----------|-----------| 1ms 1ms 1ms 1ms ^ ^ ^ ^ tick1 tick2 tick3 tick4(nearly 4ms) There are two reasons for tick error: clockevent precision and the CONFIG_IRQ_TIME_ACCOUNTING/CONFIG_PARAVIRT_TIME_ACCOUNTING. with CONFIG_IRQ_TIME_ACCOUNTING every tick will be less than 1ms, but even without it, because of clockevent precision, tick still often less than 1ms. In order to make scheduling more precise, we changed 0.75 to 0.70, Using 0.70 instead of 0.75 should not change much for other configs and would fix this issue: 0.70 for 1 cpu 1.40 up to 3 cpus 2.10 up to 7 cpus 2.8 for 8 cpus and above. This does not guarantee that tasks can run the slice time accurately every time, but occasionally running an extra tick has little impact. Signed-off-by: zihan zhou <15645113830zzh@gmail.com> Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Vincent Guittot Link: https://lkml.kernel.org/r/20250208075322.13139-1-15645113830zzh@gmail.com Signed-off-by: Sasha Levin --- kernel/sched/fair.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 990d0828bf2a9..443f6a9ef3f8f 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -71,10 +71,10 @@ unsigned int sysctl_sched_tunable_scaling = SCHED_TUNABLESCALING_LOG; /* * Minimal preemption granularity for CPU-bound tasks: * - * (default: 0.75 msec * (1 + ilog(ncpus)), units: nanoseconds) + * (default: 0.70 msec * (1 + ilog(ncpus)), units: nanoseconds) */ -unsigned int sysctl_sched_base_slice = 750000ULL; -static unsigned int normalized_sysctl_sched_base_slice = 750000ULL; +unsigned int sysctl_sched_base_slice = 700000ULL; +static unsigned int normalized_sysctl_sched_base_slice = 700000ULL; const_debug unsigned int sysctl_sched_migration_cost = 500000UL; -- GitLab From 5de11f82cbfd17be1f3d36a15d54396206eccf11 Mon Sep 17 00:00:00 2001 From: Claudiu Beznea Date: Fri, 7 Feb 2025 13:33:13 +0200 Subject: [PATCH 0378/2211] serial: sh-sci: Update the suspend/resume support [ Upstream commit 22a6984c5b5df8eab864d7f3e8b94d5a554d31ab ] The Renesas RZ/G3S supports a power saving mode where power to most of the SoC components is turned off. When returning from this power saving mode, SoC components need to be re-configured. The SCIFs on the Renesas RZ/G3S need to be re-configured as well when returning from this power saving mode. The sh-sci code already configures the SCIF clocks, power domain and registers by calling uart_resume_port() in sci_resume(). On suspend path the SCIF UART ports are suspended accordingly (by calling uart_suspend_port() in sci_suspend()). The only missing setting is the reset signal. For this assert/de-assert the reset signal on driver suspend/resume. In case the no_console_suspend is specified by the user, the registers need to be saved on suspend path and restore on resume path. To do this the sci_console_save()/sci_console_restore() functions were added. There is no need to cache/restore the status or FIFO registers. Only the control registers. The registers that will be saved/restored on suspend/resume are specified by the struct sci_suspend_regs data structure. Signed-off-by: Claudiu Beznea Reviewed-by: Geert Uytterhoeven Link: https://lore.kernel.org/r/20250207113313.545432-1-claudiu.beznea.uj@bp.renesas.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/tty/serial/sh-sci.c | 71 +++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 80efe3b0ed0c3..779074b1c2be4 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -104,6 +104,15 @@ struct plat_sci_reg { u8 offset, size; }; +struct sci_suspend_regs { + u16 scsmr; + u16 scscr; + u16 scfcr; + u16 scsptr; + u8 scbrr; + u8 semr; +}; + struct sci_port_params { const struct plat_sci_reg regs[SCIx_NR_REGS]; unsigned int fifosize; @@ -134,6 +143,8 @@ struct sci_port { struct dma_chan *chan_tx; struct dma_chan *chan_rx; + struct reset_control *rstc; + #ifdef CONFIG_SERIAL_SH_SCI_DMA struct dma_chan *chan_tx_saved; struct dma_chan *chan_rx_saved; @@ -153,6 +164,7 @@ struct sci_port { int rx_trigger; struct timer_list rx_fifo_timer; int rx_fifo_timeout; + struct sci_suspend_regs suspend_regs; u16 hscif_tot; bool has_rtscts; @@ -3384,6 +3396,7 @@ static struct plat_sci_port *sci_parse_dt(struct platform_device *pdev, } sp = &sci_ports[id]; + sp->rstc = rstc; *dev_id = id; p->type = SCI_OF_TYPE(data); @@ -3532,13 +3545,57 @@ static int sci_probe(struct platform_device *dev) return 0; } +static void sci_console_save(struct sci_port *s) +{ + struct sci_suspend_regs *regs = &s->suspend_regs; + struct uart_port *port = &s->port; + + if (sci_getreg(port, SCSMR)->size) + regs->scsmr = sci_serial_in(port, SCSMR); + if (sci_getreg(port, SCSCR)->size) + regs->scscr = sci_serial_in(port, SCSCR); + if (sci_getreg(port, SCFCR)->size) + regs->scfcr = sci_serial_in(port, SCFCR); + if (sci_getreg(port, SCSPTR)->size) + regs->scsptr = sci_serial_in(port, SCSPTR); + if (sci_getreg(port, SCBRR)->size) + regs->scbrr = sci_serial_in(port, SCBRR); + if (sci_getreg(port, SEMR)->size) + regs->semr = sci_serial_in(port, SEMR); +} + +static void sci_console_restore(struct sci_port *s) +{ + struct sci_suspend_regs *regs = &s->suspend_regs; + struct uart_port *port = &s->port; + + if (sci_getreg(port, SCSMR)->size) + sci_serial_out(port, SCSMR, regs->scsmr); + if (sci_getreg(port, SCSCR)->size) + sci_serial_out(port, SCSCR, regs->scscr); + if (sci_getreg(port, SCFCR)->size) + sci_serial_out(port, SCFCR, regs->scfcr); + if (sci_getreg(port, SCSPTR)->size) + sci_serial_out(port, SCSPTR, regs->scsptr); + if (sci_getreg(port, SCBRR)->size) + sci_serial_out(port, SCBRR, regs->scbrr); + if (sci_getreg(port, SEMR)->size) + sci_serial_out(port, SEMR, regs->semr); +} + static __maybe_unused int sci_suspend(struct device *dev) { struct sci_port *sport = dev_get_drvdata(dev); - if (sport) + if (sport) { uart_suspend_port(&sci_uart_driver, &sport->port); + if (!console_suspend_enabled && uart_console(&sport->port)) + sci_console_save(sport); + else + return reset_control_assert(sport->rstc); + } + return 0; } @@ -3546,8 +3603,18 @@ static __maybe_unused int sci_resume(struct device *dev) { struct sci_port *sport = dev_get_drvdata(dev); - if (sport) + if (sport) { + if (!console_suspend_enabled && uart_console(&sport->port)) { + sci_console_restore(sport); + } else { + int ret = reset_control_deassert(sport->rstc); + + if (ret) + return ret; + } + uart_resume_port(&sci_uart_driver, &sport->port); + } return 0; } -- GitLab From a507a213e82ca368b18a31f14a2f4813bc14771b Mon Sep 17 00:00:00 2001 From: Claudiu Beznea Date: Wed, 5 Feb 2025 12:01:16 +0200 Subject: [PATCH 0379/2211] pinctrl: renesas: rzg2l: Add suspend/resume support for pull up/down [ Upstream commit b2bd65fbb617353e3c46ba5206b3b030fa0f260c ] The Renesas RZ/G3S supports a power-saving mode where power to most of the SoC components is lost, including the PIN controller. Save and restore the pull-up/pull-down register contents to ensure the functionality is preserved after a suspend/resume cycle. Signed-off-by: Claudiu Beznea Reviewed-by: Lad Prabhakar Reviewed-by: Geert Uytterhoeven Link: https://lore.kernel.org/20250205100116.2032765-1-claudiu.beznea.uj@bp.renesas.com Signed-off-by: Geert Uytterhoeven Signed-off-by: Sasha Levin --- drivers/pinctrl/renesas/pinctrl-rzg2l.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/pinctrl/renesas/pinctrl-rzg2l.c b/drivers/pinctrl/renesas/pinctrl-rzg2l.c index d90685cfe2e1a..bde58f5a743cb 100644 --- a/drivers/pinctrl/renesas/pinctrl-rzg2l.c +++ b/drivers/pinctrl/renesas/pinctrl-rzg2l.c @@ -311,6 +311,7 @@ struct rzg2l_pinctrl_pin_settings { * @pmc: PMC registers cache * @pfc: PFC registers cache * @iolh: IOLH registers cache + * @pupd: PUPD registers cache * @ien: IEN registers cache * @sd_ch: SD_CH registers cache * @eth_poc: ET_POC registers cache @@ -324,6 +325,7 @@ struct rzg2l_pinctrl_reg_cache { u32 *pfc; u32 *iolh[2]; u32 *ien[2]; + u32 *pupd[2]; u8 sd_ch[2]; u8 eth_poc[2]; u8 eth_mode; @@ -2539,6 +2541,11 @@ static int rzg2l_pinctrl_reg_cache_alloc(struct rzg2l_pinctrl *pctrl) if (!cache->ien[i]) return -ENOMEM; + cache->pupd[i] = devm_kcalloc(pctrl->dev, nports, sizeof(*cache->pupd[i]), + GFP_KERNEL); + if (!cache->pupd[i]) + return -ENOMEM; + /* Allocate dedicated cache. */ dedicated_cache->iolh[i] = devm_kcalloc(pctrl->dev, n_dedicated_pins, sizeof(*dedicated_cache->iolh[i]), @@ -2779,7 +2786,7 @@ static void rzg2l_pinctrl_pm_setup_regs(struct rzg2l_pinctrl *pctrl, bool suspen struct rzg2l_pinctrl_reg_cache *cache = pctrl->cache; for (u32 port = 0; port < nports; port++) { - bool has_iolh, has_ien; + bool has_iolh, has_ien, has_pupd; u32 off, caps; u8 pincnt; u64 cfg; @@ -2791,6 +2798,7 @@ static void rzg2l_pinctrl_pm_setup_regs(struct rzg2l_pinctrl *pctrl, bool suspen caps = FIELD_GET(PIN_CFG_MASK, cfg); has_iolh = !!(caps & (PIN_CFG_IOLH_A | PIN_CFG_IOLH_B | PIN_CFG_IOLH_C)); has_ien = !!(caps & PIN_CFG_IEN); + has_pupd = !!(caps & PIN_CFG_PUPD); if (suspend) RZG2L_PCTRL_REG_ACCESS32(suspend, pctrl->base + PFC(off), cache->pfc[port]); @@ -2809,6 +2817,15 @@ static void rzg2l_pinctrl_pm_setup_regs(struct rzg2l_pinctrl *pctrl, bool suspen } } + if (has_pupd) { + RZG2L_PCTRL_REG_ACCESS32(suspend, pctrl->base + PUPD(off), + cache->pupd[0][port]); + if (pincnt >= 4) { + RZG2L_PCTRL_REG_ACCESS32(suspend, pctrl->base + PUPD(off), + cache->pupd[1][port]); + } + } + RZG2L_PCTRL_REG_ACCESS16(suspend, pctrl->base + PM(off), cache->pm[port]); RZG2L_PCTRL_REG_ACCESS8(suspend, pctrl->base + P(off), cache->p[port]); -- GitLab From afb512502f2d74b2b4ee76fe0b698ece3a1dc789 Mon Sep 17 00:00:00 2001 From: Damon Ding Date: Wed, 5 Feb 2025 18:51:54 +0800 Subject: [PATCH 0380/2211] phy: phy-rockchip-samsung-hdptx: Swap the definitions of LCPLL_REF and ROPLL_REF [ Upstream commit 2947c8065e9efdd3b6434d2817dc8896234a3fc0 ] According to the datasheet, setting the dig_clk_sel bit of CMN_REG(0097) to 1'b1 selects LCPLL as the reference clock, while setting it to 1'b0 selects the ROPLL. Signed-off-by: Damon Ding Reviewed-by: Dmitry Baryshkov Link: https://lore.kernel.org/r/20250205105157.580060-2-damon.ding@rock-chips.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c index be6f1ca9095aa..dc6e01dff5c74 100644 --- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c +++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c @@ -94,8 +94,8 @@ #define LCPLL_ALONE_MODE BIT(1) /* CMN_REG(0097) */ #define DIG_CLK_SEL BIT(1) -#define ROPLL_REF BIT(1) -#define LCPLL_REF 0 +#define LCPLL_REF BIT(1) +#define ROPLL_REF 0 /* CMN_REG(0099) */ #define CMN_ROPLL_ALONE_MODE BIT(2) #define ROPLL_ALONE_MODE BIT(2) -- GitLab From ef31dc41cf67ba0363c990ece8ccaa23fd16f7e6 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Sun, 9 Feb 2025 14:31:45 +0200 Subject: [PATCH 0381/2211] phy: core: don't require set_mode() callback for phy_get_mode() to work [ Upstream commit d58c04e305afbaa9dda7969151f06c4efe2c98b0 ] As reported by Damon Ding, the phy_get_mode() call doesn't work as expected unless the PHY driver has a .set_mode() call. This prompts PHY drivers to have empty stubs for .set_mode() for the sake of being able to get the mode. Make .set_mode() callback truly optional and update PHY's mode even if it there is none. Cc: Damon Ding Link: https://lore.kernel.org/r/96f8310f-93f1-4bcb-8637-137e1159ff83@rock-chips.com Tested-by: Damon Ding Signed-off-by: Dmitry Baryshkov Link: https://lore.kernel.org/r/20250209-phy-fix-set-moe-v2-1-76e248503856@linaro.org Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/phy/phy-core.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c index 413f76e2d1744..e0a6a272f5714 100644 --- a/drivers/phy/phy-core.c +++ b/drivers/phy/phy-core.c @@ -405,13 +405,14 @@ EXPORT_SYMBOL_GPL(phy_power_off); int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode) { - int ret; + int ret = 0; - if (!phy || !phy->ops->set_mode) + if (!phy) return 0; mutex_lock(&phy->mutex); - ret = phy->ops->set_mode(phy, mode, submode); + if (phy->ops->set_mode) + ret = phy->ops->set_mode(phy, mode, submode); if (!ret) phy->attrs.mode = mode; mutex_unlock(&phy->mutex); -- GitLab From 164c9f5edf2aea7314b06bc50b607973ce461551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Draszik?= Date: Fri, 6 Dec 2024 16:31:04 +0000 Subject: [PATCH 0382/2211] phy: exynos5-usbdrd: fix EDS distribution tuning (gs101) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 21860f340ba76ee042e5431ff92537f89bc11476 ] This code's intention is to configure lane0 and lane2 tunings, but for lane2 there is a typo and it ends up tuning something else. Fix the typo, as it doesn't appear to make sense to apply different tunings for lane0 vs lane2. The same typo appears to exist in the bootloader, hence we restore the original value in the typo'd registers as well. This can be removed once / if the bootloader is updated. Note that this is incorrect in the downstream driver as well - the values had been copied from there. Reviewed-by: Peter Griffin Tested-by: Peter Griffin Signed-off-by: André Draszik Tested-by: Will McVicker Link: https://lore.kernel.org/r/20241206-gs101-phy-lanes-orientation-phy-v4-4-f5961268b149@linaro.org Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/phy/samsung/phy-exynos5-usbdrd.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c b/drivers/phy/samsung/phy-exynos5-usbdrd.c index 46b8f6987c62c..28d02ae60cc14 100644 --- a/drivers/phy/samsung/phy-exynos5-usbdrd.c +++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c @@ -1513,8 +1513,11 @@ static const struct exynos5_usbdrd_phy_tuning gs101_tunes_pipe3_preinit[] = { PHY_TUNING_ENTRY_PMA(0x09e0, -1, 0x00), PHY_TUNING_ENTRY_PMA(0x09e4, -1, 0x36), PHY_TUNING_ENTRY_PMA(0x1e7c, -1, 0x06), - PHY_TUNING_ENTRY_PMA(0x1e90, -1, 0x00), - PHY_TUNING_ENTRY_PMA(0x1e94, -1, 0x36), + PHY_TUNING_ENTRY_PMA(0x19e0, -1, 0x00), + PHY_TUNING_ENTRY_PMA(0x19e4, -1, 0x36), + /* fix bootloader bug */ + PHY_TUNING_ENTRY_PMA(0x1e90, -1, 0x02), + PHY_TUNING_ENTRY_PMA(0x1e94, -1, 0x0b), /* improve LVCC */ PHY_TUNING_ENTRY_PMA(0x08f0, -1, 0x30), PHY_TUNING_ENTRY_PMA(0x18f0, -1, 0x30), -- GitLab From c043867b654ec9c709cb3697a7ebbaf0ae2e0cc6 Mon Sep 17 00:00:00 2001 From: Vijendar Mukunda Date: Fri, 7 Feb 2025 12:28:36 +0530 Subject: [PATCH 0383/2211] soundwire: amd: change the soundwire wake enable/disable sequence [ Upstream commit dcc48a73eae7f791b1a6856ea1bcc4079282c88d ] During runtime suspend scenario, SoundWire wake should be enabled and during system level suspend scenario SoundWire wake should be disabled. Implement the SoundWire wake enable/disable sequence as per design flow for SoundWire poweroff mode. Signed-off-by: Vijendar Mukunda Link: https://lore.kernel.org/r/20250207065841.4718-2-Vijendar.Mukunda@amd.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/soundwire/amd_manager.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c index 0d01849c35861..e3d5e6c1d582c 100644 --- a/drivers/soundwire/amd_manager.c +++ b/drivers/soundwire/amd_manager.c @@ -1110,6 +1110,7 @@ static int __maybe_unused amd_suspend(struct device *dev) amd_sdw_wake_enable(amd_manager, false); return amd_sdw_clock_stop(amd_manager); } else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) { + amd_sdw_wake_enable(amd_manager, false); /* * As per hardware programming sequence on AMD platforms, * clock stop should be invoked first before powering-off @@ -1137,6 +1138,7 @@ static int __maybe_unused amd_suspend_runtime(struct device *dev) amd_sdw_wake_enable(amd_manager, true); return amd_sdw_clock_stop(amd_manager); } else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) { + amd_sdw_wake_enable(amd_manager, true); ret = amd_sdw_clock_stop(amd_manager); if (ret) return ret; -- GitLab From 97dba4472e4840bae874561542c7f41ed3eb22db Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 5 Feb 2025 15:42:31 +0800 Subject: [PATCH 0384/2211] soundwire: cadence_master: set frame shape and divider based on actual clk freq MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit e738d77f78b3ac085dfb51be414e93464abba7ec ] Frame shape and curr_dr_freq could be updated by sdw_compute_bus_params(). Peripherals will set curr_dr_freq as their frequency. Managers should do the same. Then update frame shape according to the actual bus frequency. Signed-off-by: Bard Liao Reviewed-by: Ranjani Sridharan Reviewed-by: Péter Ujfalusi Reviewed-by: Pierre-Louis Bossart Link: https://lore.kernel.org/r/20250205074232.87537-2-yung-chuan.liao@linux.intel.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/soundwire/cadence_master.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c index 05652e983539b..6f2b5ec5c87c6 100644 --- a/drivers/soundwire/cadence_master.c +++ b/drivers/soundwire/cadence_master.c @@ -1341,7 +1341,7 @@ static u32 cdns_set_initial_frame_shape(int n_rows, int n_cols) return val; } -static void cdns_init_clock_ctrl(struct sdw_cdns *cdns) +static int cdns_init_clock_ctrl(struct sdw_cdns *cdns) { struct sdw_bus *bus = &cdns->bus; struct sdw_master_prop *prop = &bus->prop; @@ -1355,14 +1355,25 @@ static void cdns_init_clock_ctrl(struct sdw_cdns *cdns) prop->default_row, prop->default_col); + if (!prop->default_frame_rate || !prop->default_row) { + dev_err(cdns->dev, "Default frame_rate %d or row %d is invalid\n", + prop->default_frame_rate, prop->default_row); + return -EINVAL; + } + /* Set clock divider */ - divider = (prop->mclk_freq / prop->max_clk_freq) - 1; + divider = (prop->mclk_freq * SDW_DOUBLE_RATE_FACTOR / + bus->params.curr_dr_freq) - 1; cdns_updatel(cdns, CDNS_MCP_CLK_CTRL0, CDNS_MCP_CLK_MCLKD_MASK, divider); cdns_updatel(cdns, CDNS_MCP_CLK_CTRL1, CDNS_MCP_CLK_MCLKD_MASK, divider); + /* Set frame shape base on the actual bus frequency. */ + prop->default_col = bus->params.curr_dr_freq / + prop->default_frame_rate / prop->default_row; + /* * Frame shape changes after initialization have to be done * with the bank switch mechanism @@ -1375,6 +1386,8 @@ static void cdns_init_clock_ctrl(struct sdw_cdns *cdns) ssp_interval = prop->default_frame_rate / SDW_CADENCE_GSYNC_HZ; cdns_writel(cdns, CDNS_MCP_SSP_CTRL0, ssp_interval); cdns_writel(cdns, CDNS_MCP_SSP_CTRL1, ssp_interval); + + return 0; } /** @@ -1383,9 +1396,12 @@ static void cdns_init_clock_ctrl(struct sdw_cdns *cdns) */ int sdw_cdns_init(struct sdw_cdns *cdns) { + int ret; u32 val; - cdns_init_clock_ctrl(cdns); + ret = cdns_init_clock_ctrl(cdns); + if (ret) + return ret; sdw_cdns_check_self_clearing_bits(cdns, __func__, false, 0); -- GitLab From 365d302ac763dbd045c9dfd591d8087e8436bcde Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Fri, 7 Feb 2025 09:39:24 -0500 Subject: [PATCH 0385/2211] drm/amdgpu/mes11: fix set_hw_resources_1 calculation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 1350dd3691b5f757a948e5b9895d62c422baeb90 ] It's GPU page size not CPU page size. In most cases they are the same, but not always. This can lead to overallocation on systems with larger pages. Cc: Srinivasan Shanmugam Cc: Christian König Reviewed-by: Christian König Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/mes_v11_0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c b/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c index 7a773fcd7752c..49113df8baefd 100644 --- a/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c @@ -690,7 +690,7 @@ static int mes_v11_0_set_hw_resources(struct amdgpu_mes *mes) static int mes_v11_0_set_hw_resources_1(struct amdgpu_mes *mes) { - int size = 128 * PAGE_SIZE; + int size = 128 * AMDGPU_GPU_PAGE_SIZE; int ret = 0; struct amdgpu_device *adev = mes->adev; union MESAPI_SET_HW_RESOURCES_1 mes_set_hw_res_pkt; -- GitLab From 5ca70518bc23d2db5cb46d2b9cae40eee4312e8a Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Tue, 28 Jan 2025 15:48:26 -0500 Subject: [PATCH 0386/2211] drm/amdkfd: fix missing L2 cache info in topology [ Upstream commit 5ffd56822a7159917306d99f18fd15dfd7288f20 ] In some ASICs L2 cache info may miss in kfd topology, because the first bitmap may be empty, that means the first cu may be inactive, so to find the first active cu will solve the issue. v2: Only find the first active cu in the first xcc Signed-off-by: Eric Huang Acked-by: Alex Deucher Acked-by: Lijo Lazar Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c index bcb5cdc4a9d81..82da568604b6e 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c @@ -1683,17 +1683,32 @@ static int fill_in_l2_l3_pcache(struct kfd_cache_properties **props_ext, int cache_type, unsigned int cu_processor_id, struct kfd_node *knode) { - unsigned int cu_sibling_map_mask; + unsigned int cu_sibling_map_mask = 0; int first_active_cu; int i, j, k, xcc, start, end; int num_xcc = NUM_XCC(knode->xcc_mask); struct kfd_cache_properties *pcache = NULL; enum amdgpu_memory_partition mode; struct amdgpu_device *adev = knode->adev; + bool found = false; start = ffs(knode->xcc_mask) - 1; end = start + num_xcc; - cu_sibling_map_mask = cu_info->bitmap[start][0][0]; + + /* To find the bitmap in the first active cu in the first + * xcc, it is based on the assumption that evrey xcc must + * have at least one active cu. + */ + for (i = 0; i < gfx_info->max_shader_engines && !found; i++) { + for (j = 0; j < gfx_info->max_sh_per_se && !found; j++) { + if (cu_info->bitmap[start][i % 4][j % 4]) { + cu_sibling_map_mask = + cu_info->bitmap[start][i % 4][j % 4]; + found = true; + } + } + } + cu_sibling_map_mask &= ((1 << pcache_info[cache_type].num_cu_shared) - 1); first_active_cu = ffs(cu_sibling_map_mask); -- GitLab From 452807a863018375186790bed955382b6bd5829e Mon Sep 17 00:00:00 2001 From: Harish Kasiviswanathan Date: Tue, 4 Feb 2025 17:57:47 -0500 Subject: [PATCH 0387/2211] drm/amdgpu: Set snoop bit for SDMA for MI series [ Upstream commit 3394b1f76d3f8adf695ceed350a5dae49003eb37 ] SDMA writes has to probe invalidate RW lines. Set snoop bit in mmhub for this to happen. v2: Missed a few mmhub_v9_4. Added now. v3: Calculate hub offset once since it doesn't change inside the loop Modified function names based on review comments. Signed-off-by: Harish Kasiviswanathan Reviewed-by: Philip Yang Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c | 25 ++++++++++ drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c | 27 +++++++++++ drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c | 31 ++++++++++++ .../asic_reg/mmhub/mmhub_9_4_1_offset.h | 32 +++++++++++++ .../asic_reg/mmhub/mmhub_9_4_1_sh_mask.h | 48 +++++++++++++++++++ 5 files changed, 163 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c index 9689e2b5d4e51..2adee2b94c37d 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c @@ -172,6 +172,30 @@ static void mmhub_v1_7_init_tlb_regs(struct amdgpu_device *adev) WREG32_SOC15(MMHUB, 0, regMC_VM_MX_L1_TLB_CNTL, tmp); } +/* Set snoop bit for SDMA so that SDMA writes probe-invalidates RW lines */ +static void mmhub_v1_7_init_snoop_override_regs(struct amdgpu_device *adev) +{ + uint32_t tmp; + int i; + uint32_t distance = regDAGB1_WRCLI_GPU_SNOOP_OVERRIDE - + regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE; + + for (i = 0; i < 5; i++) { /* DAGB instances */ + tmp = RREG32_SOC15_OFFSET(MMHUB, 0, + regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, i * distance); + tmp |= (1 << 15); /* SDMA client is BIT15 */ + WREG32_SOC15_OFFSET(MMHUB, 0, + regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, i * distance, tmp); + + tmp = RREG32_SOC15_OFFSET(MMHUB, 0, + regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, i * distance); + tmp |= (1 << 15); + WREG32_SOC15_OFFSET(MMHUB, 0, + regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, i * distance, tmp); + } + +} + static void mmhub_v1_7_init_cache_regs(struct amdgpu_device *adev) { uint32_t tmp; @@ -337,6 +361,7 @@ static int mmhub_v1_7_gart_enable(struct amdgpu_device *adev) mmhub_v1_7_init_system_aperture_regs(adev); mmhub_v1_7_init_tlb_regs(adev); mmhub_v1_7_init_cache_regs(adev); + mmhub_v1_7_init_snoop_override_regs(adev); mmhub_v1_7_enable_system_domain(adev); mmhub_v1_7_disable_identity_aperture(adev); diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c index b01bb759d0f4f..2276c644a6974 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c @@ -214,6 +214,32 @@ static void mmhub_v1_8_init_tlb_regs(struct amdgpu_device *adev) } } +/* Set snoop bit for SDMA so that SDMA writes probe-invalidates RW lines */ +static void mmhub_v1_8_init_snoop_override_regs(struct amdgpu_device *adev) +{ + uint32_t tmp, inst_mask; + int i, j; + uint32_t distance = regDAGB1_WRCLI_GPU_SNOOP_OVERRIDE - + regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE; + + inst_mask = adev->aid_mask; + for_each_inst(i, inst_mask) { + for (j = 0; j < 5; j++) { /* DAGB instances */ + tmp = RREG32_SOC15_OFFSET(MMHUB, i, + regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, j * distance); + tmp |= (1 << 15); /* SDMA client is BIT15 */ + WREG32_SOC15_OFFSET(MMHUB, i, + regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, j * distance, tmp); + + tmp = RREG32_SOC15_OFFSET(MMHUB, i, + regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, j * distance); + tmp |= (1 << 15); + WREG32_SOC15_OFFSET(MMHUB, i, + regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, j * distance, tmp); + } + } +} + static void mmhub_v1_8_init_cache_regs(struct amdgpu_device *adev) { uint32_t tmp, inst_mask; @@ -419,6 +445,7 @@ static int mmhub_v1_8_gart_enable(struct amdgpu_device *adev) mmhub_v1_8_init_system_aperture_regs(adev); mmhub_v1_8_init_tlb_regs(adev); mmhub_v1_8_init_cache_regs(adev); + mmhub_v1_8_init_snoop_override_regs(adev); mmhub_v1_8_enable_system_domain(adev); mmhub_v1_8_disable_identity_aperture(adev); diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c index ff1b58e446892..fe0710b55c3ac 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c @@ -198,6 +198,36 @@ static void mmhub_v9_4_init_tlb_regs(struct amdgpu_device *adev, int hubid) hubid * MMHUB_INSTANCE_REGISTER_OFFSET, tmp); } +/* Set snoop bit for SDMA so that SDMA writes probe-invalidates RW lines */ +static void mmhub_v9_4_init_snoop_override_regs(struct amdgpu_device *adev, int hubid) +{ + uint32_t tmp; + int i; + uint32_t distance = mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE - + mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE; + uint32_t huboffset = hubid * MMHUB_INSTANCE_REGISTER_OFFSET; + + for (i = 0; i < 5 - (2 * hubid); i++) { + /* DAGB instances 0 to 4 are in hub0 and 5 to 7 are in hub1 */ + tmp = RREG32_SOC15_OFFSET(MMHUB, 0, + mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, + huboffset + i * distance); + tmp |= (1 << 15); /* SDMA client is BIT15 */ + WREG32_SOC15_OFFSET(MMHUB, 0, + mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, + huboffset + i * distance, tmp); + + tmp = RREG32_SOC15_OFFSET(MMHUB, 0, + mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, + huboffset + i * distance); + tmp |= (1 << 15); + WREG32_SOC15_OFFSET(MMHUB, 0, + mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, + huboffset + i * distance, tmp); + } + +} + static void mmhub_v9_4_init_cache_regs(struct amdgpu_device *adev, int hubid) { uint32_t tmp; @@ -392,6 +422,7 @@ static int mmhub_v9_4_gart_enable(struct amdgpu_device *adev) if (!amdgpu_sriov_vf(adev)) mmhub_v9_4_init_cache_regs(adev, i); + mmhub_v9_4_init_snoop_override_regs(adev, i); mmhub_v9_4_enable_system_domain(adev, i); if (!amdgpu_sriov_vf(adev)) mmhub_v9_4_disable_identity_aperture(adev, i); diff --git a/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_offset.h b/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_offset.h index c488d4a50cf46..b2252deabc17a 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_offset.h +++ b/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_offset.h @@ -203,6 +203,10 @@ #define mmDAGB0_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB0_WR_MISC_CREDIT 0x0058 #define mmDAGB0_WR_MISC_CREDIT_BASE_IDX 1 +#define mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE 0x005b +#define mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 +#define mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x005c +#define mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB0_WRCLI_ASK_PENDING 0x005d #define mmDAGB0_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB0_WRCLI_GO_PENDING 0x005e @@ -455,6 +459,10 @@ #define mmDAGB1_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB1_WR_MISC_CREDIT 0x00d8 #define mmDAGB1_WR_MISC_CREDIT_BASE_IDX 1 +#define mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE 0x00db +#define mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 +#define mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x00dc +#define mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB1_WRCLI_ASK_PENDING 0x00dd #define mmDAGB1_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB1_WRCLI_GO_PENDING 0x00de @@ -707,6 +715,10 @@ #define mmDAGB2_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB2_WR_MISC_CREDIT 0x0158 #define mmDAGB2_WR_MISC_CREDIT_BASE_IDX 1 +#define mmDAGB2_WRCLI_GPU_SNOOP_OVERRIDE 0x015b +#define mmDAGB2_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 +#define mmDAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x015c +#define mmDAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB2_WRCLI_ASK_PENDING 0x015d #define mmDAGB2_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB2_WRCLI_GO_PENDING 0x015e @@ -959,6 +971,10 @@ #define mmDAGB3_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB3_WR_MISC_CREDIT 0x01d8 #define mmDAGB3_WR_MISC_CREDIT_BASE_IDX 1 +#define mmDAGB3_WRCLI_GPU_SNOOP_OVERRIDE 0x01db +#define mmDAGB3_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 +#define mmDAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x01dc +#define mmDAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB3_WRCLI_ASK_PENDING 0x01dd #define mmDAGB3_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB3_WRCLI_GO_PENDING 0x01de @@ -1211,6 +1227,10 @@ #define mmDAGB4_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB4_WR_MISC_CREDIT 0x0258 #define mmDAGB4_WR_MISC_CREDIT_BASE_IDX 1 +#define mmDAGB4_WRCLI_GPU_SNOOP_OVERRIDE 0x025b +#define mmDAGB4_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 +#define mmDAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x025c +#define mmDAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB4_WRCLI_ASK_PENDING 0x025d #define mmDAGB4_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB4_WRCLI_GO_PENDING 0x025e @@ -4793,6 +4813,10 @@ #define mmDAGB5_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB5_WR_MISC_CREDIT 0x3058 #define mmDAGB5_WR_MISC_CREDIT_BASE_IDX 1 +#define mmDAGB5_WRCLI_GPU_SNOOP_OVERRIDE 0x305b +#define mmDAGB5_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 +#define mmDAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x305c +#define mmDAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB5_WRCLI_ASK_PENDING 0x305d #define mmDAGB5_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB5_WRCLI_GO_PENDING 0x305e @@ -5045,6 +5069,10 @@ #define mmDAGB6_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB6_WR_MISC_CREDIT 0x30d8 #define mmDAGB6_WR_MISC_CREDIT_BASE_IDX 1 +#define mmDAGB6_WRCLI_GPU_SNOOP_OVERRIDE 0x30db +#define mmDAGB6_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 +#define mmDAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x30dc +#define mmDAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB6_WRCLI_ASK_PENDING 0x30dd #define mmDAGB6_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB6_WRCLI_GO_PENDING 0x30de @@ -5297,6 +5325,10 @@ #define mmDAGB7_WR_DATA_CREDIT_BASE_IDX 1 #define mmDAGB7_WR_MISC_CREDIT 0x3158 #define mmDAGB7_WR_MISC_CREDIT_BASE_IDX 1 +#define mmDAGB7_WRCLI_GPU_SNOOP_OVERRIDE 0x315b +#define mmDAGB7_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1 +#define mmDAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x315c +#define mmDAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1 #define mmDAGB7_WRCLI_ASK_PENDING 0x315d #define mmDAGB7_WRCLI_ASK_PENDING_BASE_IDX 1 #define mmDAGB7_WRCLI_GO_PENDING 0x315e diff --git a/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_sh_mask.h b/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_sh_mask.h index 2969fbf282b7d..5069d2fd467f2 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_sh_mask.h +++ b/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_sh_mask.h @@ -1532,6 +1532,12 @@ //DAGB0_WRCLI_DBUS_GO_PENDING #define DAGB0_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB0_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL +//DAGB0_WRCLI_GPU_SNOOP_OVERRIDE +#define DAGB0_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 +#define DAGB0_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL +//DAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE +#define DAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 +#define DAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB0_DAGB_DLY #define DAGB0_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB0_DAGB_DLY__CLI__SHIFT 0x8 @@ -3207,6 +3213,12 @@ //DAGB1_WRCLI_DBUS_GO_PENDING #define DAGB1_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB1_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL +//DAGB1_WRCLI_GPU_SNOOP_OVERRIDE +#define DAGB1_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 +#define DAGB1_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL +//DAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE +#define DAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 +#define DAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB1_DAGB_DLY #define DAGB1_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB1_DAGB_DLY__CLI__SHIFT 0x8 @@ -4882,6 +4894,12 @@ //DAGB2_WRCLI_DBUS_GO_PENDING #define DAGB2_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB2_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL +//DAGB2_WRCLI_GPU_SNOOP_OVERRIDE +#define DAGB2_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 +#define DAGB2_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL +//DAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE +#define DAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 +#define DAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB2_DAGB_DLY #define DAGB2_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB2_DAGB_DLY__CLI__SHIFT 0x8 @@ -6557,6 +6575,12 @@ //DAGB3_WRCLI_DBUS_GO_PENDING #define DAGB3_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB3_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL +//DAGB3_WRCLI_GPU_SNOOP_OVERRIDE +#define DAGB3_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 +#define DAGB3_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL +//DAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE +#define DAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 +#define DAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB3_DAGB_DLY #define DAGB3_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB3_DAGB_DLY__CLI__SHIFT 0x8 @@ -8232,6 +8256,12 @@ //DAGB4_WRCLI_DBUS_GO_PENDING #define DAGB4_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB4_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL +//DAGB4_WRCLI_GPU_SNOOP_OVERRIDE +#define DAGB4_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 +#define DAGB4_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL +//DAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE +#define DAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 +#define DAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB4_DAGB_DLY #define DAGB4_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB4_DAGB_DLY__CLI__SHIFT 0x8 @@ -28737,6 +28767,12 @@ //DAGB5_WRCLI_DBUS_GO_PENDING #define DAGB5_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB5_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL +//DAGB5_WRCLI_GPU_SNOOP_OVERRIDE +#define DAGB5_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 +#define DAGB5_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL +//DAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE +#define DAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 +#define DAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB5_DAGB_DLY #define DAGB5_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB5_DAGB_DLY__CLI__SHIFT 0x8 @@ -30412,6 +30448,12 @@ //DAGB6_WRCLI_DBUS_GO_PENDING #define DAGB6_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB6_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL +//DAGB6_WRCLI_GPU_SNOOP_OVERRIDE +#define DAGB6_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 +#define DAGB6_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL +//DAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE +#define DAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 +#define DAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB6_DAGB_DLY #define DAGB6_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB6_DAGB_DLY__CLI__SHIFT 0x8 @@ -32087,6 +32129,12 @@ //DAGB7_WRCLI_DBUS_GO_PENDING #define DAGB7_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0 #define DAGB7_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL +//DAGB7_WRCLI_GPU_SNOOP_OVERRIDE +#define DAGB7_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0 +#define DAGB7_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL +//DAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE +#define DAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0 +#define DAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL //DAGB7_DAGB_DLY #define DAGB7_DAGB_DLY__DLY__SHIFT 0x0 #define DAGB7_DAGB_DLY__CLI__SHIFT 0x8 -- GitLab From a8726bee7046dac60399c2ee88e85584b4c9bc7d Mon Sep 17 00:00:00 2001 From: Charlene Liu Date: Mon, 13 Jan 2025 11:57:54 -0500 Subject: [PATCH 0388/2211] drm/amd/display: pass calculated dram_speed_mts to dml2 [ Upstream commit b40d022ec06ade9f6c809091dc188422a0f0946d ] [why] currently dml2 is using a hard coded 16 to convert memclk to dram_speed_mts. for apu, this depends on wck_ratio. change to pass the already calculated dram_speed_mts from fpu to dml2. v2: use existing calculation of dram_speed_mts for now to avoid regression Signed-off-by: Charlene Liu Signed-off-by: Aurabindo Pillai Reviewed-by: Roman Li Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c | 2 ++ drivers/gpu/drm/amd/display/dc/dml/dcn351/dcn351_fpu.c | 1 + drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h | 1 + 3 files changed, 4 insertions(+) diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c index beed7adbbd43e..c90dee4e9116a 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c @@ -367,6 +367,8 @@ void dcn35_update_bw_bounding_box_fpu(struct dc *dc, clock_limits[i].socclk_mhz; dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].memclk_mhz = clk_table->entries[i].memclk_mhz * clk_table->entries[i].wck_ratio; + + dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].dram_speed_mts = clock_limits[i].dram_speed_mts; dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].dtbclk_mhz = clock_limits[i].dtbclk_mhz; dc->dml2_options.bbox_overrides.clks_table.num_entries_per_clk.num_dcfclk_levels = diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn351/dcn351_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn351/dcn351_fpu.c index a201dbb743d79..79d921adc2153 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn351/dcn351_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn351/dcn351_fpu.c @@ -401,6 +401,7 @@ void dcn351_update_bw_bounding_box_fpu(struct dc *dc, clock_limits[i].socclk_mhz; dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].memclk_mhz = clk_table->entries[i].memclk_mhz * clk_table->entries[i].wck_ratio; + dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].dram_speed_mts = clock_limits[i].dram_speed_mts; dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].dtbclk_mhz = clock_limits[i].dtbclk_mhz; dc->dml2_options.bbox_overrides.clks_table.num_entries_per_clk.num_dcfclk_levels = diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h b/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h index 0f944fcfd5a5b..785226945699d 100644 --- a/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h @@ -159,6 +159,7 @@ struct dml2_clks_table_entry { unsigned int dtbclk_mhz; unsigned int dispclk_mhz; unsigned int dppclk_mhz; + unsigned int dram_speed_mts; /*which is based on wck_ratio*/ }; struct dml2_clks_num_entries { -- GitLab From ed2039d840a12b35e17f9cb1f4a594330c573a0c Mon Sep 17 00:00:00 2001 From: Ilya Bakoulin Date: Tue, 28 Jan 2025 13:14:54 -0500 Subject: [PATCH 0389/2211] drm/amd/display: Don't try AUX transactions on disconnected link [ Upstream commit e8bffa52e0253cfd689813a620e64521256bc712 ] [Why] Setting link DPMS off in response to HPD disconnect creates AUX transactions on a link that is supposed to be disconnected. This can cause issues in some cases when the sink re-asserts HPD and expects source to re-enable the link. [How] Avoid AUX transactions on disconnected link. Reviewed-by: Wenjing Liu Signed-off-by: Ilya Bakoulin Signed-off-by: Aurabindo Pillai Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c index bafa52a0165a0..17c57cf98ec5c 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c @@ -75,7 +75,8 @@ void dp_disable_link_phy(struct dc_link *link, struct dc *dc = link->ctx->dc; if (!link->wa_flags.dp_keep_receiver_powered && - !link->skip_implict_edp_power_control) + !link->skip_implict_edp_power_control && + link->type != dc_connection_none) dpcd_write_rx_power_ctrl(link, false); dc->hwss.disable_link_output(link, link_res, signal); @@ -163,8 +164,9 @@ enum dc_status dp_set_fec_ready(struct dc_link *link, const struct link_resource } else { if (link->fec_state == dc_link_fec_ready) { fec_config = 0; - core_link_write_dpcd(link, DP_FEC_CONFIGURATION, - &fec_config, sizeof(fec_config)); + if (link->type != dc_connection_none) + core_link_write_dpcd(link, DP_FEC_CONFIGURATION, + &fec_config, sizeof(fec_config)); link_enc->funcs->fec_set_ready(link_enc, false); link->fec_state = dc_link_fec_not_ready; -- GitLab From 11c7fa11fa0763a1cff17a5de81511437c9cffd7 Mon Sep 17 00:00:00 2001 From: Huacai Chen Date: Mon, 10 Feb 2025 21:43:28 +0800 Subject: [PATCH 0390/2211] net: stmmac: dwmac-loongson: Set correct {tx,rx}_fifo_size [ Upstream commit 8dbf0c7556454b52af91bae305ca71500c31495c ] Now for dwmac-loongson {tx,rx}_fifo_size are uninitialised, which means zero. This means dwmac-loongson doesn't support changing MTU because in stmmac_change_mtu() it requires the fifo size be no less than MTU. Thus, set the correct tx_fifo_size and rx_fifo_size for it (16KB multiplied by queue counts). Here {tx,rx}_fifo_size is initialised with the initial value (also the maximum value) of {tx,rx}_queues_to_use. So it will keep as 16KB if we don't change the queue count, and will be larger than 16KB if we change (decrease) the queue count. However stmmac_change_mtu() still work well with current logic (MTU cannot be larger than 16KB for stmmac). Note: the Fixes tag picked here is the oldest commit and key commit of the dwmac-loongson series "stmmac: Add Loongson platform support". Acked-by: Yanteng Si Reviewed-by: Simon Horman Signed-off-by: Chong Qiao Signed-off-by: Huacai Chen Link: https://patch.msgid.link/20250210134328.2755328-1-chenhuacai@loongson.cn Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c index ab7c2750c1042..702ea5a00b56d 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c @@ -590,6 +590,9 @@ static int loongson_dwmac_probe(struct pci_dev *pdev, const struct pci_device_id if (ret) goto err_disable_device; + plat->tx_fifo_size = SZ_16K * plat->tx_queues_to_use; + plat->rx_fifo_size = SZ_16K * plat->rx_queues_to_use; + if (dev_of_node(&pdev->dev)) ret = loongson_dwmac_dt_config(pdev, plat, &res); else -- GitLab From a25d045ebfbcea87e8cd4e960b7554c3fd7c1f00 Mon Sep 17 00:00:00 2001 From: Jiang Liu Date: Fri, 7 Feb 2025 14:28:49 +0800 Subject: [PATCH 0391/2211] drm/amdgpu: reset psp->cmd to NULL after releasing the buffer [ Upstream commit e92f3f94cad24154fd3baae30c6dfb918492278d ] Reset psp->cmd to NULL after releasing the buffer in function psp_sw_fini(). Reviewed-by: Lijo Lazar Signed-off-by: Jiang Liu Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index d70855d7c61c1..31a376f2742a2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c @@ -531,7 +531,6 @@ static int psp_sw_fini(void *handle) { struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct psp_context *psp = &adev->psp; - struct psp_gfx_cmd_resp *cmd = psp->cmd; psp_memory_training_fini(psp); @@ -541,8 +540,8 @@ static int psp_sw_fini(void *handle) amdgpu_ucode_release(&psp->cap_fw); amdgpu_ucode_release(&psp->toc_fw); - kfree(cmd); - cmd = NULL; + kfree(psp->cmd); + psp->cmd = NULL; psp_free_shared_bufs(psp); -- GitLab From 4f4cb81def4332163ae00d6fa6d42b1aeba29a54 Mon Sep 17 00:00:00 2001 From: Asad Kamal Date: Thu, 19 Dec 2024 19:16:37 +0800 Subject: [PATCH 0392/2211] drm/amd/pm: Skip P2S load for SMU v13.0.12 [ Upstream commit 1fb85819d629676f1d53f40c3fffa25a33a881e4 ] Skip P2S table load for SMU v13.0.12 Signed-off-by: Asad Kamal Reviewed-by: Lijo Lazar Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c index 55ed6247eb61f..9ac694c4f1f7a 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c @@ -275,8 +275,9 @@ static int smu_v13_0_6_init_microcode(struct smu_context *smu) int var = (adev->pdev->device & 0xF); char ucode_prefix[15]; - /* No need to load P2S tables in IOV mode */ - if (amdgpu_sriov_vf(adev)) + /* No need to load P2S tables in IOV mode or for smu v13.0.12 */ + if (amdgpu_sriov_vf(adev) || + (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 12))) return 0; if (!(adev->flags & AMD_IS_APU)) { -- GitLab From 45068cc170ebf2c0c7b1626841c361a62f66fb77 Mon Sep 17 00:00:00 2001 From: Martin Tsai Date: Mon, 20 Jan 2025 11:21:46 +0800 Subject: [PATCH 0393/2211] drm/amd/display: Support multiple options during psr entry. [ Upstream commit 3a5fa55455db6a11248a25f24570c365f9246144 ] [WHY] Some panels may not handle idle pattern properly during PSR entry. [HOW] Add a condition to allow multiple options on power down sequence during PSR1 entry. Reviewed-by: Anthony Koo Signed-off-by: Martin Tsai Signed-off-by: Alex Hung Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/dc_types.h | 7 +++++++ drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c | 4 ++++ drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h | 6 ++++++ 3 files changed, 17 insertions(+) diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h b/drivers/gpu/drm/amd/display/dc/dc_types.h index c8bdbbba44ef9..1aca9e96c474f 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_types.h +++ b/drivers/gpu/drm/amd/display/dc/dc_types.h @@ -1009,6 +1009,13 @@ struct psr_settings { unsigned int psr_sdp_transmit_line_num_deadline; uint8_t force_ffu_mode; unsigned int psr_power_opt; + + /** + * Some panels cannot handle idle pattern during PSR entry. + * To power down phy before disable stream to avoid sending + * idle pattern. + */ + uint8_t power_down_phy_before_disable_stream; }; enum replay_coasting_vtotal_type { diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c b/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c index cae18f8c1c9a0..8821153d0ac3b 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c @@ -419,6 +419,10 @@ static bool dmub_psr_copy_settings(struct dmub_psr *dmub, copy_settings_data->relock_delay_frame_cnt = 0; if (link->dpcd_caps.sink_dev_id == DP_BRANCH_DEVICE_ID_001CF8) copy_settings_data->relock_delay_frame_cnt = 2; + + copy_settings_data->power_down_phy_before_disable_stream = + link->psr_settings.power_down_phy_before_disable_stream; + copy_settings_data->dsc_slice_height = psr_context->dsc_slice_height; dc_wake_and_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT); diff --git a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h index 7835100b37c41..d743368303682 100644 --- a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h +++ b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h @@ -2869,6 +2869,12 @@ struct dmub_cmd_psr_copy_settings_data { * Some panels request main link off before xth vertical line */ uint16_t poweroff_before_vertical_line; + /** + * Some panels cannot handle idle pattern during PSR entry. + * To power down phy before disable stream to avoid sending + * idle pattern. + */ + uint8_t power_down_phy_before_disable_stream; }; /** -- GitLab From 47bfc7a02704f5789fea366c857ace535ba247b5 Mon Sep 17 00:00:00 2001 From: Brandon Syu Date: Tue, 21 Jan 2025 13:29:51 +0800 Subject: [PATCH 0394/2211] Revert "drm/amd/display: Exit idle optimizations before attempt to access PHY" [ Upstream commit be704e5ef4bd66dee9bb3f876964327e3a247d31 ] This reverts commit de612738e9771bd66aeb20044486c457c512f684. Reason to revert: screen flashes or gray screen appeared half of the screen after resume from S4/S5. Reviewed-by: Charlene Liu Signed-off-by: Brandon Syu Signed-off-by: Alex Hung Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c index 59457ca24e1dc..ccdc9d4101863 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c @@ -1888,7 +1888,6 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context) bool can_apply_edp_fast_boot = false; bool can_apply_seamless_boot = false; bool keep_edp_vdd_on = false; - struct dc_bios *dcb = dc->ctx->dc_bios; DC_LOGGER_INIT(); @@ -1965,8 +1964,6 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context) hws->funcs.edp_backlight_control(edp_link_with_sink, false); } /*resume from S3, no vbios posting, no need to power down again*/ - if (dcb && dcb->funcs && !dcb->funcs->is_accelerated_mode(dcb)) - clk_mgr_exit_optimized_pwr_state(dc, dc->clk_mgr); power_down_all_hw_blocks(dc); @@ -1979,8 +1976,6 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context) disable_vga_and_power_gate_all_controllers(dc); if (edp_link_with_sink && !keep_edp_vdd_on) dc->hwss.edp_power_control(edp_link_with_sink, false); - if (dcb && dcb->funcs && !dcb->funcs->is_accelerated_mode(dcb)) - clk_mgr_optimize_pwr_state(dc, dc->clk_mgr); } bios_set_scratch_acc_mode_change(dc->ctx->dc_bios, 1); } -- GitLab From 563adeeeb0ffa3caeed83750d374387137e0c301 Mon Sep 17 00:00:00 2001 From: George Shen Date: Fri, 10 Jan 2025 11:35:46 -0500 Subject: [PATCH 0395/2211] drm/amd/display: Update CR AUX RD interval interpretation [ Upstream commit 6a7fde433231c18164c117592d3e18ced648ad58 ] [Why] DP spec updated to have the CR AUX RD interval match the EQ AUX RD interval interpretation of DPCD 0000Eh/0220Eh for 8b/10b non-LTTPR mode and LTTPR transparent mode cases. [How] Update interpretation of DPCD 0000Eh/0220Eh for CR AUX RD interval during 8b/10b link training. Reviewed-by: Michael Strauss Reviewed-by: Wenjing Liu Signed-off-by: George Shen Signed-off-by: Zaeem Mohamed Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../display/dc/link/protocols/link_dp_training_8b_10b.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c index 3bdce32a85e3c..ae95ec48e5721 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c @@ -36,7 +36,8 @@ link->ctx->logger static int32_t get_cr_training_aux_rd_interval(struct dc_link *link, - const struct dc_link_settings *link_settings) + const struct dc_link_settings *link_settings, + enum lttpr_mode lttpr_mode) { union training_aux_rd_interval training_rd_interval; uint32_t wait_in_micro_secs = 100; @@ -49,6 +50,8 @@ static int32_t get_cr_training_aux_rd_interval(struct dc_link *link, DP_TRAINING_AUX_RD_INTERVAL, (uint8_t *)&training_rd_interval, sizeof(training_rd_interval)); + if (lttpr_mode != LTTPR_MODE_NON_TRANSPARENT) + wait_in_micro_secs = 400; if (training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL) wait_in_micro_secs = training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL * 4000; } @@ -110,7 +113,6 @@ void decide_8b_10b_training_settings( */ lt_settings->link_settings.link_spread = link->dp_ss_off ? LINK_SPREAD_DISABLED : LINK_SPREAD_05_DOWNSPREAD_30KHZ; - lt_settings->cr_pattern_time = get_cr_training_aux_rd_interval(link, link_setting); lt_settings->eq_pattern_time = get_eq_training_aux_rd_interval(link, link_setting); lt_settings->pattern_for_cr = decide_cr_training_pattern(link_setting); lt_settings->pattern_for_eq = decide_eq_training_pattern(link, link_setting); @@ -119,6 +121,7 @@ void decide_8b_10b_training_settings( lt_settings->disallow_per_lane_settings = true; lt_settings->always_match_dpcd_with_hw_lane_settings = true; lt_settings->lttpr_mode = dp_decide_8b_10b_lttpr_mode(link); + lt_settings->cr_pattern_time = get_cr_training_aux_rd_interval(link, link_setting, lt_settings->lttpr_mode); dp_hw_to_dpcd_lane_settings(lt_settings, lt_settings->hw_lane_settings, lt_settings->dpcd_lane_settings); } -- GitLab From 17e40a52a1492c6c0affc33676f8381391750094 Mon Sep 17 00:00:00 2001 From: Tom Chung Date: Mon, 13 Jan 2025 14:22:31 +0800 Subject: [PATCH 0396/2211] drm/amd/display: Initial psr_version with correct setting [ Upstream commit d8c782cac5007e68e7484d420168f12d3490def6 ] [Why & How] The initial setting for psr_version is not correct while create a virtual link. The default psr_version should be DC_PSR_VERSION_UNSUPPORTED. Reviewed-by: Roman Li Signed-off-by: Tom Chung Signed-off-by: Zaeem Mohamed Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/core/dc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index fa7db10104c45..a99d3e2256f19 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -276,6 +276,7 @@ static bool create_links( link->link_id.type = OBJECT_TYPE_CONNECTOR; link->link_id.id = CONNECTOR_ID_VIRTUAL; link->link_id.enum_id = ENUM_ID_1; + link->psr_settings.psr_version = DC_PSR_VERSION_UNSUPPORTED; link->link_enc = kzalloc(sizeof(*link->link_enc), GFP_KERNEL); if (!link->link_enc) { -- GitLab From e55c5704b12eeea27e212bfab8f7e51ad3e8ac1f Mon Sep 17 00:00:00 2001 From: Joshua Aberback Date: Wed, 8 Jan 2025 12:03:23 -0500 Subject: [PATCH 0397/2211] drm/amd/display: Increase block_sequence array size [ Upstream commit 3a7810c212bcf2f722671dadf4b23ff70a7d23ee ] [Why] It's possible to generate more than 50 steps in hwss_build_fast_sequence, for example with a 6-pipe asic where all pipes are in one MPC chain. This overflows the block_sequence buffer and corrupts block_sequence_steps, causing a crash. [How] Expand block_sequence to 100 items. A naive upper bound on the possible number of steps for a 6-pipe asic, ignoring the potential for steps to be mutually exclusive, is 91 with current code, therefore 100 is sufficient. Reviewed-by: Alvin Lee Signed-off-by: Joshua Aberback Signed-off-by: Wayne Lin Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/inc/core_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h index e1e3142cdc00a..62fb2009b3028 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h +++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h @@ -621,7 +621,7 @@ struct dc_state { */ struct bw_context bw_ctx; - struct block_sequence block_sequence[50]; + struct block_sequence block_sequence[100]; unsigned int block_sequence_steps; struct dc_dmub_cmd dc_dmub_cmd[10]; unsigned int dmub_cmd_count; -- GitLab From af3d57ea9ec7407de75e7f63bbdd5bc445c4b3b7 Mon Sep 17 00:00:00 2001 From: Austin Zheng Date: Tue, 7 Jan 2025 17:49:36 -0500 Subject: [PATCH 0398/2211] drm/amd/display: Use Nominal vBlank If Provided Instead Of Capping It [ Upstream commit 41df56b1fc24cc36fffb10e437385b3a49fbb5e2 ] [Why/How] vBlank used to determine the max vStartup is based on the smallest between the vblank provided by the timing and vblank in ip_caps. Extra vblank time is not considered if the vblank provided by the timing ends up being higher than what's defined by the ip_caps Use 1 less than the vblank size in case the timing is interlaced so vstartup will always be less than vblank_nom. Reviewed-by: Dillon Varone Signed-off-by: Austin Zheng Signed-off-by: Wayne Lin Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c b/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c index e2a3764d9d181..0090b7bc232bf 100644 --- a/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c @@ -3630,13 +3630,12 @@ static unsigned int CalculateMaxVStartup( double line_time_us = (double)timing->h_total / ((double)timing->pixel_clock_khz / 1000); unsigned int vblank_actual = timing->v_total - timing->v_active; unsigned int vblank_nom_default_in_line = (unsigned int)math_floor2((double)vblank_nom_default_us / line_time_us, 1.0); - unsigned int vblank_nom_input = (unsigned int)math_min2(timing->vblank_nom, vblank_nom_default_in_line); - unsigned int vblank_avail = (vblank_nom_input == 0) ? vblank_nom_default_in_line : vblank_nom_input; + unsigned int vblank_avail = (timing->vblank_nom == 0) ? vblank_nom_default_in_line : (unsigned int)timing->vblank_nom; vblank_size = (unsigned int)math_min2(vblank_actual, vblank_avail); if (timing->interlaced && !ptoi_supported) - max_vstartup_lines = (unsigned int)(math_floor2(vblank_size / 2.0, 1.0)); + max_vstartup_lines = (unsigned int)(math_floor2((vblank_size - 1) / 2.0, 1.0)); else max_vstartup_lines = vblank_size - (unsigned int)math_max2(1.0, math_ceil2(write_back_delay_us / line_time_us, 1.0)); #ifdef __DML_VBA_DEBUG__ -- GitLab From 1bb46b5433a8a830d4ee085e7cbe2f16df71c9a3 Mon Sep 17 00:00:00 2001 From: Dillon Varone Date: Wed, 8 Jan 2025 15:25:41 -0500 Subject: [PATCH 0399/2211] drm/amd/display: Populate register address for dentist for dcn401 [ Upstream commit 5f0d1ef6f16e150ee46cc00b8d233d9d271fe39e ] [WHY&HOW] Address was not previously populated which can result in incorrect clock frequencies being read on boot. Reviewed-by: Alvin Lee Signed-off-by: Dillon Varone Signed-off-by: Wayne Lin Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/clk_mgr/dcn401/dcn401_clk_mgr.c | 2 ++ drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr_internal.h | 1 + 2 files changed, 3 insertions(+) diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn401/dcn401_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn401/dcn401_clk_mgr.c index 8cfc5f4359374..313e52997596a 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn401/dcn401_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn401/dcn401_clk_mgr.c @@ -24,6 +24,8 @@ #include "dml/dcn401/dcn401_fpu.h" +#define DCN_BASE__INST0_SEG1 0x000000C0 + #define mmCLK01_CLK0_CLK_PLL_REQ 0x16E37 #define mmCLK01_CLK0_CLK0_DFS_CNTL 0x16E69 #define mmCLK01_CLK0_CLK1_DFS_CNTL 0x16E6C diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr_internal.h b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr_internal.h index 7a1ca1e98059b..221645c023b50 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr_internal.h +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr_internal.h @@ -221,6 +221,7 @@ enum dentist_divider_range { CLK_SF(CLK0_CLK_PLL_REQ, FbMult_frac, mask_sh) #define CLK_REG_LIST_DCN401() \ + SR(DENTIST_DISPCLK_CNTL), \ CLK_SR_DCN401(CLK0_CLK_PLL_REQ, CLK01, 0), \ CLK_SR_DCN401(CLK0_CLK0_DFS_CNTL, CLK01, 0), \ CLK_SR_DCN401(CLK0_CLK1_DFS_CNTL, CLK01, 0), \ -- GitLab From 7ef18e2ffdc12e7d63f14c9e289c1f5697f48405 Mon Sep 17 00:00:00 2001 From: Lijo Lazar Date: Wed, 1 Jan 2025 14:23:31 +0530 Subject: [PATCH 0400/2211] drm/amdgpu: Use active umc info from discovery [ Upstream commit f7a594e40517fa2ab25d5ca10e7b6a158f529fb5 ] There could be configs where some UMC instances are harvested. This information is obtained through discovery data and populated in umc.active_mask. Avoid reassigning this as AID mask, instead use the mask directly while iterating through umc instances. This is to avoid accesses to harvested UMC instances. v2: fix warning (Alex) Signed-off-by: Lijo Lazar Reviewed-by: Hawking Zhang Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c | 42 +++++++++++++++++++++++++ drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 1 - 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c index bb7b9b2eaac1a..8da0bddab3d23 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c @@ -383,6 +383,45 @@ int amdgpu_umc_fill_error_record(struct ras_err_data *err_data, return 0; } +static int amdgpu_umc_loop_all_aid(struct amdgpu_device *adev, umc_func func, + void *data) +{ + uint32_t umc_node_inst; + uint32_t node_inst; + uint32_t umc_inst; + uint32_t ch_inst; + int ret; + + /* + * This loop is done based on the following - + * umc.active mask = mask of active umc instances across all nodes + * umc.umc_inst_num = maximum number of umc instancess per node + * umc.node_inst_num = maximum number of node instances + * Channel instances are not assumed to be harvested. + */ + dev_dbg(adev->dev, "active umcs :%lx umc_inst per node: %d", + adev->umc.active_mask, adev->umc.umc_inst_num); + for_each_set_bit(umc_node_inst, &(adev->umc.active_mask), + adev->umc.node_inst_num * adev->umc.umc_inst_num) { + node_inst = umc_node_inst / adev->umc.umc_inst_num; + umc_inst = umc_node_inst % adev->umc.umc_inst_num; + LOOP_UMC_CH_INST(ch_inst) { + dev_dbg(adev->dev, + "node_inst :%d umc_inst: %d ch_inst: %d", + node_inst, umc_inst, ch_inst); + ret = func(adev, node_inst, umc_inst, ch_inst, data); + if (ret) { + dev_err(adev->dev, + "Node %d umc %d ch %d func returns %d\n", + node_inst, umc_inst, ch_inst, ret); + return ret; + } + } + } + + return 0; +} + int amdgpu_umc_loop_channels(struct amdgpu_device *adev, umc_func func, void *data) { @@ -391,6 +430,9 @@ int amdgpu_umc_loop_channels(struct amdgpu_device *adev, uint32_t ch_inst = 0; int ret = 0; + if (adev->aid_mask) + return amdgpu_umc_loop_all_aid(adev, func, data); + if (adev->umc.node_inst_num) { LOOP_UMC_EACH_NODE_INST_AND_CH(node_inst, umc_inst, ch_inst) { ret = func(adev, node_inst, umc_inst, ch_inst, data); diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index 9a212413c6d3a..78c527b56f7c5 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c @@ -1461,7 +1461,6 @@ static void gmc_v9_0_set_umc_funcs(struct amdgpu_device *adev) adev->umc.umc_inst_num = UMC_V12_0_UMC_INSTANCE_NUM; adev->umc.node_inst_num /= UMC_V12_0_UMC_INSTANCE_NUM; adev->umc.channel_offs = UMC_V12_0_PER_CHANNEL_OFFSET; - adev->umc.active_mask = adev->aid_mask; adev->umc.retire_unit = UMC_V12_0_BAD_PAGE_NUM_PER_CHANNEL; if (!adev->gmc.xgmi.connected_to_cpu && !adev->gmc.is_app_apu) adev->umc.ras = &umc_v12_0_ras; -- GitLab From f5e9d0d206cbd8a064eba6996ab0bdaff12a2853 Mon Sep 17 00:00:00 2001 From: Shiwu Zhang Date: Tue, 19 Nov 2024 15:58:39 +0800 Subject: [PATCH 0401/2211] drm/amdgpu: enlarge the VBIOS binary size limit [ Upstream commit 667b96134c9e206aebe40985650bf478935cbe04 ] Some chips have a larger VBIOS file so raise the size limit to support the flashing tool. Signed-off-by: Shiwu Zhang Reviewed-by: Hawking Zhang Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index 31a376f2742a2..48e30e5f83389 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c @@ -44,7 +44,7 @@ #include "amdgpu_securedisplay.h" #include "amdgpu_atomfirmware.h" -#define AMD_VBIOS_FILE_MAX_SIZE_B (1024*1024*3) +#define AMD_VBIOS_FILE_MAX_SIZE_B (1024*1024*16) static int psp_load_smu_fw(struct psp_context *psp); static int psp_rap_terminate(struct psp_context *psp); -- GitLab From 9acae6e987058dadd7000aa18da9967e97fe6ad9 Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Tue, 17 Dec 2024 09:25:18 -0500 Subject: [PATCH 0402/2211] drm/amd/display/dm: drop hw_support check in amdgpu_dm_i2c_xfer() [ Upstream commit 33da70bd1e115d7d73f45fb1c09f5ecc448f3f13 ] DC supports SW i2c as well. Drop the check. Reviewed-by: Harry Wentland Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 1e5984e71bfd7..09ef87c69230e 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -8288,7 +8288,7 @@ static int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap, int i; int result = -EIO; - if (!ddc_service->ddc_pin || !ddc_service->ddc_pin->hw_info.hw_supported) + if (!ddc_service->ddc_pin) return result; cmd.payloads = kcalloc(num, sizeof(struct i2c_payload), GFP_KERNEL); -- GitLab From d4df87dae1444203080fb03bebcb63035694e418 Mon Sep 17 00:00:00 2001 From: Chaohai Chen Date: Fri, 24 Jan 2025 16:55:42 +0800 Subject: [PATCH 0403/2211] scsi: target: spc: Fix loop traversal in spc_rsoc_get_descr() [ Upstream commit 04ad06e41d1c74cc323b20a7bd023c47bd0e0c38 ] Stop traversing after finding the appropriate descriptor. Signed-off-by: Chaohai Chen Link: https://lore.kernel.org/r/20250124085542.109088-1-wdhh66@163.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/target/target_core_spc.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c index 61c065702350e..701dcbd7b63cf 100644 --- a/drivers/target/target_core_spc.c +++ b/drivers/target/target_core_spc.c @@ -2151,8 +2151,10 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode) if (descr->serv_action_valid) return TCM_INVALID_CDB_FIELD; - if (!descr->enabled || descr->enabled(descr, cmd)) + if (!descr->enabled || descr->enabled(descr, cmd)) { *opcode = descr; + return TCM_NO_SENSE; + } break; case 0x2: /* @@ -2166,8 +2168,10 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode) if (descr->serv_action_valid && descr->service_action == requested_sa) { if (!descr->enabled || descr->enabled(descr, - cmd)) + cmd)) { *opcode = descr; + return TCM_NO_SENSE; + } } else if (!descr->serv_action_valid) return TCM_INVALID_CDB_FIELD; break; @@ -2180,13 +2184,15 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode) */ if (descr->service_action == requested_sa) if (!descr->enabled || descr->enabled(descr, - cmd)) + cmd)) { *opcode = descr; + return TCM_NO_SENSE; + } break; } } - return 0; + return TCM_NO_SENSE; } static sense_reason_t -- GitLab From 4a94ccac4930da16baab1b6c5703779ef25e61e2 Mon Sep 17 00:00:00 2001 From: Alexei Lazar Date: Sun, 9 Feb 2025 12:17:16 +0200 Subject: [PATCH 0404/2211] net/mlx5: XDP, Enable TX side XDP multi-buffer support [ Upstream commit 1a9304859b3a4119579524c293b902a8927180f3 ] In XDP scenarios, fragmented packets can occur if the MTU is larger than the page size, even when the packet size fits within the linear part. If XDP multi-buffer support is disabled, the fragmented part won't be handled in the TX flow, leading to packet drops. Since XDP multi-buffer support is always available, this commit removes the conditional check for enabling it. This ensures that XDP multi-buffer support is always enabled, regardless of the `is_xdp_mb` parameter, and guarantees the handling of fragmented packets in such scenarios. Signed-off-by: Alexei Lazar Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20250209101716.112774-16-tariqt@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/en.h | 1 - .../ethernet/mellanox/mlx5/core/en/params.c | 1 - .../ethernet/mellanox/mlx5/core/en/params.h | 1 - .../mellanox/mlx5/core/en/reporter_tx.c | 1 - .../net/ethernet/mellanox/mlx5/core/en/xdp.c | 49 ++++++++----------- .../net/ethernet/mellanox/mlx5/core/en_main.c | 29 ----------- 6 files changed, 21 insertions(+), 61 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h index 57b7298a0e793..d6266f6a96d6e 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h @@ -385,7 +385,6 @@ enum { MLX5E_SQ_STATE_VLAN_NEED_L2_INLINE, MLX5E_SQ_STATE_PENDING_XSK_TX, MLX5E_SQ_STATE_PENDING_TLS_RX_RESYNC, - MLX5E_SQ_STATE_XDP_MULTIBUF, MLX5E_NUM_SQ_STATES, /* Must be kept last */ }; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/params.c b/drivers/net/ethernet/mellanox/mlx5/core/en/params.c index 31eb99f09c63c..8c4d710e85675 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/params.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/params.c @@ -1242,7 +1242,6 @@ void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev, mlx5e_build_sq_param_common(mdev, param); MLX5_SET(wq, wq, log_wq_sz, params->log_sq_size); param->is_mpw = MLX5E_GET_PFLAG(params, MLX5E_PFLAG_XDP_TX_MPWQE); - param->is_xdp_mb = !mlx5e_rx_is_linear_skb(mdev, params, xsk); mlx5e_build_tx_cq_param(mdev, params, ¶m->cqp); } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/params.h b/drivers/net/ethernet/mellanox/mlx5/core/en/params.h index 3f8986f9d8629..bd5877acc5b1e 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/params.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/params.h @@ -33,7 +33,6 @@ struct mlx5e_sq_param { struct mlx5_wq_param wq; bool is_mpw; bool is_tls; - bool is_xdp_mb; u16 stop_room; }; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c index c8adf309ecad0..dbd9482359e1e 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c @@ -16,7 +16,6 @@ static const char * const sq_sw_state_type_name[] = { [MLX5E_SQ_STATE_VLAN_NEED_L2_INLINE] = "vlan_need_l2_inline", [MLX5E_SQ_STATE_PENDING_XSK_TX] = "pending_xsk_tx", [MLX5E_SQ_STATE_PENDING_TLS_RX_RESYNC] = "pending_tls_rx_resync", - [MLX5E_SQ_STATE_XDP_MULTIBUF] = "xdp_multibuf", }; static int mlx5e_wait_for_sq_flush(struct mlx5e_txqsq *sq) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c index 4610621a340e5..08ab0999f7b31 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c @@ -546,6 +546,7 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xmit_data *xdptxd, bool inline_ok; bool linear; u16 pi; + int i; struct mlx5e_xdpsq_stats *stats = sq->stats; @@ -612,41 +613,33 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xmit_data *xdptxd, cseg->opmod_idx_opcode = cpu_to_be32((sq->pc << 8) | MLX5_OPCODE_SEND); - if (test_bit(MLX5E_SQ_STATE_XDP_MULTIBUF, &sq->state)) { - int i; - - memset(&cseg->trailer, 0, sizeof(cseg->trailer)); - memset(eseg, 0, sizeof(*eseg) - sizeof(eseg->trailer)); - - eseg->inline_hdr.sz = cpu_to_be16(inline_hdr_sz); + memset(&cseg->trailer, 0, sizeof(cseg->trailer)); + memset(eseg, 0, sizeof(*eseg) - sizeof(eseg->trailer)); - for (i = 0; i < num_frags; i++) { - skb_frag_t *frag = &xdptxdf->sinfo->frags[i]; - dma_addr_t addr; + eseg->inline_hdr.sz = cpu_to_be16(inline_hdr_sz); - addr = xdptxdf->dma_arr ? xdptxdf->dma_arr[i] : - page_pool_get_dma_addr(skb_frag_page(frag)) + - skb_frag_off(frag); + for (i = 0; i < num_frags; i++) { + skb_frag_t *frag = &xdptxdf->sinfo->frags[i]; + dma_addr_t addr; - dseg->addr = cpu_to_be64(addr); - dseg->byte_count = cpu_to_be32(skb_frag_size(frag)); - dseg->lkey = sq->mkey_be; - dseg++; - } + addr = xdptxdf->dma_arr ? xdptxdf->dma_arr[i] : + page_pool_get_dma_addr(skb_frag_page(frag)) + + skb_frag_off(frag); - cseg->qpn_ds = cpu_to_be32((sq->sqn << 8) | ds_cnt); + dseg->addr = cpu_to_be64(addr); + dseg->byte_count = cpu_to_be32(skb_frag_size(frag)); + dseg->lkey = sq->mkey_be; + dseg++; + } - sq->db.wqe_info[pi] = (struct mlx5e_xdp_wqe_info) { - .num_wqebbs = num_wqebbs, - .num_pkts = 1, - }; + cseg->qpn_ds = cpu_to_be32((sq->sqn << 8) | ds_cnt); - sq->pc += num_wqebbs; - } else { - cseg->fm_ce_se = 0; + sq->db.wqe_info[pi] = (struct mlx5e_xdp_wqe_info) { + .num_wqebbs = num_wqebbs, + .num_pkts = 1, + }; - sq->pc++; - } + sq->pc += num_wqebbs; xsk_tx_metadata_request(meta, &mlx5e_xsk_tx_metadata_ops, eseg); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 3e9ad3cb8121d..38055537b12ac 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -2030,41 +2030,12 @@ int mlx5e_open_xdpsq(struct mlx5e_channel *c, struct mlx5e_params *params, csp.min_inline_mode = sq->min_inline_mode; set_bit(MLX5E_SQ_STATE_ENABLED, &sq->state); - if (param->is_xdp_mb) - set_bit(MLX5E_SQ_STATE_XDP_MULTIBUF, &sq->state); - err = mlx5e_create_sq_rdy(c->mdev, param, &csp, 0, &sq->sqn); if (err) goto err_free_xdpsq; mlx5e_set_xmit_fp(sq, param->is_mpw); - if (!param->is_mpw && !test_bit(MLX5E_SQ_STATE_XDP_MULTIBUF, &sq->state)) { - unsigned int ds_cnt = MLX5E_TX_WQE_EMPTY_DS_COUNT + 1; - unsigned int inline_hdr_sz = 0; - int i; - - if (sq->min_inline_mode != MLX5_INLINE_MODE_NONE) { - inline_hdr_sz = MLX5E_XDP_MIN_INLINE; - ds_cnt++; - } - - /* Pre initialize fixed WQE fields */ - for (i = 0; i < mlx5_wq_cyc_get_size(&sq->wq); i++) { - struct mlx5e_tx_wqe *wqe = mlx5_wq_cyc_get_wqe(&sq->wq, i); - struct mlx5_wqe_ctrl_seg *cseg = &wqe->ctrl; - struct mlx5_wqe_eth_seg *eseg = &wqe->eth; - - sq->db.wqe_info[i] = (struct mlx5e_xdp_wqe_info) { - .num_wqebbs = 1, - .num_pkts = 1, - }; - - cseg->qpn_ds = cpu_to_be32((sq->sqn << 8) | ds_cnt); - eseg->inline_hdr.sz = cpu_to_be16(inline_hdr_sz); - } - } - return 0; err_free_xdpsq: -- GitLab From a3a845ebc8f9848cc270727792175b23d98e7a5c Mon Sep 17 00:00:00 2001 From: Alexei Lazar Date: Sun, 9 Feb 2025 12:17:15 +0200 Subject: [PATCH 0405/2211] net/mlx5: Extend Ethtool loopback selftest to support non-linear SKB [ Upstream commit 95b9606b15bb3ce1198d28d2393dd0e1f0a5f3e9 ] Current loopback test validation ignores non-linear SKB case in the SKB access, which can lead to failures in scenarios such as when HW GRO is enabled. Linearize the SKB so both cases will be handled. Signed-off-by: Alexei Lazar Reviewed-by: Dragos Tatulea Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20250209101716.112774-15-tariqt@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c b/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c index 1d60465cc2ca4..2f7a543feca62 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c @@ -166,6 +166,9 @@ mlx5e_test_loopback_validate(struct sk_buff *skb, struct udphdr *udph; struct iphdr *iph; + if (skb_linearize(skb)) + goto out; + /* We are only going to peek, no need to clone the SKB */ if (MLX5E_TEST_PKT_SIZE - ETH_HLEN > skb_headlen(skb)) goto out; -- GitLab From af94d4f46c09a52ecf70a8fb58186cfd16b334d9 Mon Sep 17 00:00:00 2001 From: William Tu Date: Sun, 9 Feb 2025 12:17:09 +0200 Subject: [PATCH 0406/2211] net/mlx5e: set the tx_queue_len for pfifo_fast [ Upstream commit a38cc5706fb9f7dc4ee3a443f61de13ce1e410ed ] By default, the mq netdev creates a pfifo_fast qdisc. On a system with 16 core, the pfifo_fast with 3 bands consumes 16 * 3 * 8 (size of pointer) * 1024 (default tx queue len) = 393KB. The patch sets the tx qlen to representor default value, 128 (1< Reviewed-by: Daniel Jurgens Signed-off-by: Tariq Toukan Reviewed-by: Michal Swiatkowski Link: https://patch.msgid.link/20250209101716.112774-9-tariqt@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c index 0657d10765357..fd1f460b7be65 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c @@ -885,6 +885,8 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev, netdev->ethtool_ops = &mlx5e_rep_ethtool_ops; netdev->watchdog_timeo = 15 * HZ; + if (mlx5_core_is_ecpf(mdev)) + netdev->tx_queue_len = 1 << MLX5E_REP_PARAMS_DEF_LOG_SQ_SIZE; #if IS_ENABLED(CONFIG_MLX5_CLS_ACT) netdev->hw_features |= NETIF_F_HW_TC; -- GitLab From 74d153d8ec150e2227dd0ca3cf3e512e3401bc0e Mon Sep 17 00:00:00 2001 From: William Tu Date: Sun, 9 Feb 2025 12:17:08 +0200 Subject: [PATCH 0407/2211] net/mlx5e: reduce rep rxq depth to 256 for ECPF [ Upstream commit b9cc8f9d700867aaa77aedddfea85e53d5e5d584 ] By experiments, a single queue representor netdev consumes kernel memory around 2.8MB, and 1.8MB out of the 2.8MB is due to page pool for the RXQ. Scaling to a thousand representors consumes 2.8GB, which becomes a memory pressure issue for embedded devices such as BlueField-2 16GB / BlueField-3 32GB memory. Since representor netdevs mostly handles miss traffic, and ideally, most of the traffic will be offloaded, reduce the default non-uplink rep netdev's RXQ default depth from 1024 to 256 if mdev is ecpf eswitch manager. This saves around 1MB of memory per regular RQ, (1024 - 256) * 2KB, allocated from page pool. With rxq depth of 256, the netlink page pool tool reports $./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ --dump page-pool-get {'id': 277, 'ifindex': 9, 'inflight': 128, 'inflight-mem': 786432, 'napi-id': 775}] This is due to mtu 1500 + headroom consumes half pages, so 256 rxq entries consumes around 128 pages (thus create a page pool with size 128), shown above at inflight. Note that each netdev has multiple types of RQs, including Regular RQ, XSK, PTP, Drop, Trap RQ. Since non-uplink representor only supports regular rq, this patch only changes the regular RQ's default depth. Signed-off-by: William Tu Reviewed-by: Bodong Wang Reviewed-by: Saeed Mahameed Signed-off-by: Tariq Toukan Reviewed-by: Michal Swiatkowski Link: https://patch.msgid.link/20250209101716.112774-8-tariqt@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c index fd1f460b7be65..18ec392d17404 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c @@ -65,6 +65,7 @@ #define MLX5E_REP_PARAMS_DEF_LOG_SQ_SIZE \ max(0x7, MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE) #define MLX5E_REP_PARAMS_DEF_NUM_CHANNELS 1 +#define MLX5E_REP_PARAMS_DEF_LOG_RQ_SIZE 0x8 static const char mlx5e_rep_driver_name[] = "mlx5e_rep"; @@ -854,6 +855,8 @@ static void mlx5e_build_rep_params(struct net_device *netdev) /* RQ */ mlx5e_build_rq_params(mdev, params); + if (!mlx5e_is_uplink_rep(priv) && mlx5_core_is_ecpf(mdev)) + params->log_rq_mtu_frames = MLX5E_REP_PARAMS_DEF_LOG_RQ_SIZE; /* If netdev is already registered (e.g. move from nic profile to uplink, * RTNL lock must be held before triggering netdev notifiers. -- GitLab From e5a69d1696323176e06ea494abd9acbed2f7b3b2 Mon Sep 17 00:00:00 2001 From: William Tu Date: Sun, 9 Feb 2025 12:17:07 +0200 Subject: [PATCH 0408/2211] net/mlx5e: reduce the max log mpwrq sz for ECPF and reps [ Upstream commit e1d68ea58c7e9ebacd9ad7a99b25a3578fa62182 ] For the ECPF and representors, reduce the max MPWRQ size from 256KB (18) to 128KB (17). This prepares the later patch for saving representor memory. With Striding RQ, there is a minimum of 4 MPWQEs. So with 128KB of max MPWRQ size, the minimal memory is 4 * 128KB = 512KB. When creating page pool, consider 1500 mtu, the minimal page pool size will be 512KB/4KB = 128 pages = 256 rx ring entries (2 entries per page). Before this patch, setting RX ringsize (ethtool -G rx) to 256 causes driver to allocate page pool size more than it needs due to max MPWRQ is 256KB (18). Ex: 4 * 256KB = 1MB, 1MB/4KB = 256 pages, but actually 128 pages is good enough. Reducing the max MPWRQ to 128KB fixes the limitation. Signed-off-by: William Tu Signed-off-by: Tariq Toukan Reviewed-by: Michal Swiatkowski Link: https://patch.msgid.link/20250209101716.112774-7-tariqt@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/en.h | 2 -- .../net/ethernet/mellanox/mlx5/core/en/params.c | 15 +++++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h index d6266f6a96d6e..e048a667e0758 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h @@ -94,8 +94,6 @@ struct page_pool; #define MLX5_MPWRQ_DEF_LOG_STRIDE_SZ(mdev) \ MLX5_MPWRQ_LOG_STRIDE_SZ(mdev, order_base_2(MLX5E_RX_MAX_HEAD)) -#define MLX5_MPWRQ_MAX_LOG_WQE_SZ 18 - /* Keep in sync with mlx5e_mpwrq_log_wqe_sz. * These are theoretical maximums, which can be further restricted by * capabilities. These values are used for static resource allocations and diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/params.c b/drivers/net/ethernet/mellanox/mlx5/core/en/params.c index 8c4d710e85675..58ec5e44aa7ad 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/params.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/params.c @@ -10,6 +10,9 @@ #include #include +#define MLX5_MPWRQ_MAX_LOG_WQE_SZ 18 +#define MLX5_REP_MPWRQ_MAX_LOG_WQE_SZ 17 + static u8 mlx5e_mpwrq_min_page_shift(struct mlx5_core_dev *mdev) { u8 min_page_shift = MLX5_CAP_GEN_2(mdev, log_min_mkey_entity_size); @@ -103,18 +106,22 @@ u8 mlx5e_mpwrq_log_wqe_sz(struct mlx5_core_dev *mdev, u8 page_shift, enum mlx5e_mpwrq_umr_mode umr_mode) { u8 umr_entry_size = mlx5e_mpwrq_umr_entry_size(umr_mode); - u8 max_pages_per_wqe, max_log_mpwqe_size; + u8 max_pages_per_wqe, max_log_wqe_size_calc; + u8 max_log_wqe_size_cap; u16 max_wqe_size; /* Keep in sync with MLX5_MPWRQ_MAX_PAGES_PER_WQE. */ max_wqe_size = mlx5e_get_max_sq_aligned_wqebbs(mdev) * MLX5_SEND_WQE_BB; max_pages_per_wqe = ALIGN_DOWN(max_wqe_size - sizeof(struct mlx5e_umr_wqe), MLX5_UMR_FLEX_ALIGNMENT) / umr_entry_size; - max_log_mpwqe_size = ilog2(max_pages_per_wqe) + page_shift; + max_log_wqe_size_calc = ilog2(max_pages_per_wqe) + page_shift; + + WARN_ON_ONCE(max_log_wqe_size_calc < MLX5E_ORDER2_MAX_PACKET_MTU); - WARN_ON_ONCE(max_log_mpwqe_size < MLX5E_ORDER2_MAX_PACKET_MTU); + max_log_wqe_size_cap = mlx5_core_is_ecpf(mdev) ? + MLX5_REP_MPWRQ_MAX_LOG_WQE_SZ : MLX5_MPWRQ_MAX_LOG_WQE_SZ; - return min_t(u8, max_log_mpwqe_size, MLX5_MPWRQ_MAX_LOG_WQE_SZ); + return min_t(u8, max_log_wqe_size_calc, max_log_wqe_size_cap); } u8 mlx5e_mpwrq_pages_per_wqe(struct mlx5_core_dev *mdev, u8 page_shift, -- GitLab From bbd6dc1fb6c56267ad1d58810d92287fcd5b0058 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Sat, 1 Feb 2025 13:50:46 +0100 Subject: [PATCH 0409/2211] drm/v3d: Add clock handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 4dd40b5f9c3d89b67af0dbe059cf4a51aac6bf06 ] Since the initial commit 57692c94dcbe ("drm/v3d: Introduce a new DRM driver for Broadcom V3D V3.x+") the struct v3d_dev reserved a pointer for an optional V3D clock. But there wasn't any code, which fetched it. So add the missing clock handling before accessing any V3D registers. Signed-off-by: Stefan Wahren Reviewed-by: Maíra Canal Signed-off-by: Maíra Canal Link: https://patchwork.freedesktop.org/patch/msgid/20250201125046.33030-1-wahrenst@gmx.net Signed-off-by: Sasha Levin --- drivers/gpu/drm/v3d/v3d_drv.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c index d7ff1f5fa481f..7c17108da7d2d 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.c +++ b/drivers/gpu/drm/v3d/v3d_drv.c @@ -286,11 +286,21 @@ static int v3d_platform_drm_probe(struct platform_device *pdev) if (ret) return ret; + v3d->clk = devm_clk_get_optional(dev, NULL); + if (IS_ERR(v3d->clk)) + return dev_err_probe(dev, PTR_ERR(v3d->clk), "Failed to get V3D clock\n"); + + ret = clk_prepare_enable(v3d->clk); + if (ret) { + dev_err(&pdev->dev, "Couldn't enable the V3D clock\n"); + return ret; + } + mmu_debug = V3D_READ(V3D_MMU_DEBUG_INFO); mask = DMA_BIT_MASK(30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_PA_WIDTH)); ret = dma_set_mask_and_coherent(dev, mask); if (ret) - return ret; + goto clk_disable; v3d->va_width = 30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_VA_WIDTH); @@ -310,28 +320,29 @@ static int v3d_platform_drm_probe(struct platform_device *pdev) ret = PTR_ERR(v3d->reset); if (ret == -EPROBE_DEFER) - return ret; + goto clk_disable; v3d->reset = NULL; ret = map_regs(v3d, &v3d->bridge_regs, "bridge"); if (ret) { dev_err(dev, "Failed to get reset control or bridge regs\n"); - return ret; + goto clk_disable; } } if (v3d->ver < 41) { ret = map_regs(v3d, &v3d->gca_regs, "gca"); if (ret) - return ret; + goto clk_disable; } v3d->mmu_scratch = dma_alloc_wc(dev, 4096, &v3d->mmu_scratch_paddr, GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO); if (!v3d->mmu_scratch) { dev_err(dev, "Failed to allocate MMU scratch page\n"); - return -ENOMEM; + ret = -ENOMEM; + goto clk_disable; } ret = v3d_gem_init(drm); @@ -360,6 +371,8 @@ gem_destroy: v3d_gem_destroy(drm); dma_free: dma_free_wc(dev, 4096, v3d->mmu_scratch, v3d->mmu_scratch_paddr); +clk_disable: + clk_disable_unprepare(v3d->clk); return ret; } @@ -377,6 +390,8 @@ static void v3d_platform_drm_remove(struct platform_device *pdev) dma_free_wc(v3d->drm.dev, 4096, v3d->mmu_scratch, v3d->mmu_scratch_paddr); + + clk_disable_unprepare(v3d->clk); } static struct platform_driver v3d_platform_driver = { -- GitLab From 06daedb4439bb5a79c0dc13109a330ecf7fa5ce7 Mon Sep 17 00:00:00 2001 From: Leon Romanovsky Date: Wed, 5 Feb 2025 20:27:49 +0200 Subject: [PATCH 0410/2211] xfrm: prevent high SEQ input in non-ESN mode [ Upstream commit e3aa43a50a6455831e3c32dabc7ece38d9cd9d05 ] In non-ESN mode, the SEQ numbers are limited to 32 bits and seq_hi/oseq_hi are not used. So make sure that user gets proper error message, in case such assignment occurred. Signed-off-by: Leon Romanovsky Signed-off-by: Steffen Klassert Signed-off-by: Sasha Levin --- net/xfrm/xfrm_user.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 87013623773a2..da2a1c00ca8a6 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -178,6 +178,12 @@ static inline int verify_replay(struct xfrm_usersa_info *p, "Replay seq and seq_hi should be 0 for output SA"); return -EINVAL; } + if (rs->oseq_hi && !(p->flags & XFRM_STATE_ESN)) { + NL_SET_ERR_MSG( + extack, + "Replay oseq_hi should be 0 in non-ESN mode for output SA"); + return -EINVAL; + } if (rs->bmp_len) { NL_SET_ERR_MSG(extack, "Replay bmp_len should 0 for output SA"); return -EINVAL; @@ -190,6 +196,12 @@ static inline int verify_replay(struct xfrm_usersa_info *p, "Replay oseq and oseq_hi should be 0 for input SA"); return -EINVAL; } + if (rs->seq_hi && !(p->flags & XFRM_STATE_ESN)) { + NL_SET_ERR_MSG( + extack, + "Replay seq_hi should be 0 in non-ESN mode for input SA"); + return -EINVAL; + } } return 0; -- GitLab From 6a0997d78ffa367ce5077269b603551c7ba4f08c Mon Sep 17 00:00:00 2001 From: P Praneesh Date: Thu, 6 Feb 2025 07:08:51 +0530 Subject: [PATCH 0411/2211] wifi: ath12k: fix the ampdu id fetch in the HAL_RX_MPDU_START TLV [ Upstream commit dff4f278ee1ef12d822b7ed2a1048d27037209bb ] Currently, ampdu id is update with peer id mask which is incorrect. Therefore, update the ampdu id with PPDU id mask value. Also move the ampdu_id field inside the user stats since it is a user id based statistics. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Signed-off-by: P Praneesh Reviewed-by: Vasanthakumar Thiagarajan Signed-off-by: Karthikeyan Periyasamy Link: https://patch.msgid.link/20250206013854.174765-7-quic_periyasa@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/dp_mon.c | 16 ++++++++++------ drivers/net/wireless/ath/ath12k/hal_rx.h | 3 ++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/dp_mon.c b/drivers/net/wireless/ath/ath12k/dp_mon.c index 4c98b9de1e584..6a88745369447 100644 --- a/drivers/net/wireless/ath/ath12k/dp_mon.c +++ b/drivers/net/wireless/ath/ath12k/dp_mon.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear /* * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #include "dp_mon.h" @@ -666,6 +666,11 @@ ath12k_dp_mon_rx_parse_status_tlv(struct ath12k_base *ab, if (userid < HAL_MAX_UL_MU_USERS) { struct hal_rx_user_status *rxuser_stats = &ppdu_info->userstats[userid]; + + if (ppdu_info->num_mpdu_fcs_ok > 1 || + ppdu_info->num_mpdu_fcs_err > 1) + ppdu_info->userstats[userid].ampdu_present = true; + ppdu_info->num_users += 1; ath12k_dp_mon_rx_handle_ofdma_info(tlv_data, rxuser_stats); @@ -783,8 +788,8 @@ ath12k_dp_mon_rx_parse_status_tlv(struct ath12k_base *ab, if (userid < HAL_MAX_UL_MU_USERS) { info[0] = __le32_to_cpu(mpdu_start->info0); ppdu_info->userid = userid; - ppdu_info->ampdu_id[userid] = - u32_get_bits(info[0], HAL_RX_MPDU_START_INFO1_PEERID); + ppdu_info->userstats[userid].ampdu_id = + u32_get_bits(info[0], HAL_RX_MPDU_START_INFO0_PPDU_ID); } mon_mpdu = kzalloc(sizeof(*mon_mpdu), GFP_ATOMIC); @@ -1020,15 +1025,14 @@ static void ath12k_dp_mon_update_radiotap(struct ath12k *ar, { struct ieee80211_supported_band *sband; u8 *ptr = NULL; - u16 ampdu_id = ppduinfo->ampdu_id[ppduinfo->userid]; rxs->flag |= RX_FLAG_MACTIME_START; rxs->signal = ppduinfo->rssi_comb + ATH12K_DEFAULT_NOISE_FLOOR; rxs->nss = ppduinfo->nss + 1; - if (ampdu_id) { + if (ppduinfo->userstats[ppduinfo->userid].ampdu_present) { rxs->flag |= RX_FLAG_AMPDU_DETAILS; - rxs->ampdu_reference = ampdu_id; + rxs->ampdu_reference = ppduinfo->userstats[ppduinfo->userid].ampdu_id; } if (ppduinfo->he_mu_flags) { diff --git a/drivers/net/wireless/ath/ath12k/hal_rx.h b/drivers/net/wireless/ath/ath12k/hal_rx.h index 095216eabc01d..8c37cbc01b1c5 100644 --- a/drivers/net/wireless/ath/ath12k/hal_rx.h +++ b/drivers/net/wireless/ath/ath12k/hal_rx.h @@ -143,6 +143,8 @@ struct hal_rx_user_status { u32 mpdu_fcs_ok_bitmap[HAL_RX_NUM_WORDS_PER_PPDU_BITMAP]; u32 mpdu_ok_byte_count; u32 mpdu_err_byte_count; + bool ampdu_present; + u16 ampdu_id; }; #define HAL_MAX_UL_MU_USERS 37 @@ -226,7 +228,6 @@ struct hal_rx_mon_ppdu_info { u8 addr4[ETH_ALEN]; struct hal_rx_user_status userstats[HAL_MAX_UL_MU_USERS]; u8 userid; - u16 ampdu_id[HAL_MAX_UL_MU_USERS]; bool first_msdu_in_mpdu; bool is_ampdu; u8 medium_prot_type; -- GitLab From 4d8fd111e0f553025bbaa9b683ac141992637b46 Mon Sep 17 00:00:00 2001 From: "Matthieu Baerts (NGI0)" Date: Fri, 7 Feb 2025 14:59:20 +0100 Subject: [PATCH 0412/2211] mptcp: pm: userspace: flags: clearer msg if no remote addr [ Upstream commit 58b21309f97b08b6b9814d1ee1419249eba9ef08 ] Since its introduction in commit 892f396c8e68 ("mptcp: netlink: issue MP_PRIO signals from userspace PMs"), it was mandatory to specify the remote address, because of the 'if (rem->addr.family == AF_UNSPEC)' check done later one. In theory, this attribute can be optional, but it sounds better to be precise to avoid sending the MP_PRIO on the wrong subflow, e.g. if there are multiple subflows attached to the same local ID. This can be relaxed later on if there is a need to act on multiple subflows with one command. For the moment, the check to see if attr_rem is NULL can be removed, because mptcp_pm_parse_entry() will do this check as well, no need to do that differently here. Reviewed-by: Geliang Tang Signed-off-by: Matthieu Baerts (NGI0) Reviewed-by: Simon Horman Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/mptcp/pm_userspace.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index e35178f5205fa..bb76295d04c56 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -589,11 +589,9 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info) if (ret < 0) goto set_flags_err; - if (attr_rem) { - ret = mptcp_pm_parse_entry(attr_rem, info, false, &rem); - if (ret < 0) - goto set_flags_err; - } + ret = mptcp_pm_parse_entry(attr_rem, info, false, &rem); + if (ret < 0) + goto set_flags_err; if (loc.addr.family == AF_UNSPEC || rem.addr.family == AF_UNSPEC) { -- GitLab From 15d8ceef9289f2018702a9ac273164c8ef75a06c Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Wed, 5 Feb 2025 14:55:46 +0200 Subject: [PATCH 0413/2211] wifi: iwlwifi: use correct IMR dump variable [ Upstream commit 21e4d29ac0def546d57bacebe4a51cbed1209b03 ] We shouldn't dump the reg_data here which dumps the last entry again, it should use the imr_reg_data. Signed-off-by: Johannes Berg Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250205145347.3313b18667d1.Iaa9ab66b1d397912a573525e060d39ea01b29d19@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c index 6594216f873c4..cd284767ff4ba 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* - * Copyright (C) 2005-2014, 2018-2024 Intel Corporation + * Copyright (C) 2005-2014, 2018-2025 Intel Corporation * Copyright (C) 2013-2015 Intel Mobile Communications GmbH * Copyright (C) 2015-2017 Intel Deutschland GmbH */ @@ -2691,7 +2691,7 @@ static u32 iwl_dump_ini_trigger(struct iwl_fw_runtime *fwrt, } /* collect DRAM_IMR region in the last */ if (imr_reg_data.reg_tlv) - size += iwl_dump_ini_mem(fwrt, list, ®_data, + size += iwl_dump_ini_mem(fwrt, list, &imr_reg_data, &iwl_dump_ini_region_ops[IWL_FW_INI_REGION_DRAM_IMR]); if (size) { -- GitLab From 8e1800f1db7eb3230cc5f0828807c11bdf2809d9 Mon Sep 17 00:00:00 2001 From: Miri Korenblit Date: Wed, 5 Feb 2025 14:55:35 +0200 Subject: [PATCH 0414/2211] wifi: iwlwifi: don't warn during reprobe [ Upstream commit 696cca64308dc641d0bbe4aa2c09dd9752aa288d ] During reprobe, the sw state is being destroyd, and so is the connection. When the peer STA is being removed, the opmode sends a command to flush the TXQs of the STA and uses iwl_trans_wait_txq_empty. This one warns if the FW is not alive, but it really shouldn't if there is a FW error - and return silently instead, just like we do when sending a hcmd. Signed-off-by: Miri Korenblit Reviewed-by: Johannes Berg Link: https://patch.msgid.link/20250205145347.76425b10e5a0.I3bf0de2eb090a8b94c4e36d93dd91df61fadb808@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/iwl-trans.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c index 311b167ea09ed..510e04b721da6 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c +++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c @@ -454,6 +454,9 @@ IWL_EXPORT_SYMBOL(iwl_trans_txq_enable_cfg); int iwl_trans_wait_txq_empty(struct iwl_trans *trans, int queue) { + if (unlikely(test_bit(STATUS_FW_ERROR, &trans->status))) + return -EIO; + if (WARN_ONCE(trans->state != IWL_TRANS_FW_ALIVE, "bad state = %d\n", trans->state)) return -EIO; -- GitLab From 26e384fafda89293032d95c7fd0fe3b3a1836bd6 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Wed, 5 Feb 2025 11:39:22 +0200 Subject: [PATCH 0415/2211] wifi: mac80211: don't unconditionally call drv_mgd_complete_tx() [ Upstream commit 1798271b3604b902d45033ec569f2bf77e94ecc2 ] We might not have called drv_mgd_prepare_tx(), so only call drv_mgd_complete_tx() under the same conditions. Signed-off-by: Johannes Berg Reviewed-by: Emmanuel Grumbach Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250205110958.e091fc39a351.Ie6a3cdca070612a0aa4b3c6914ab9ed602d1f456@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- net/mac80211/mlme.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 3a279ded46c2f..6a29877fd7b37 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -3589,7 +3589,8 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, if (tx) ieee80211_flush_queues(local, sdata, false); - drv_mgd_complete_tx(sdata->local, sdata, &info); + if (tx || frame_buf) + drv_mgd_complete_tx(sdata->local, sdata, &info); /* clear AP addr only after building the needed mgmt frames */ eth_zero_addr(sdata->deflink.u.mgd.bssid); -- GitLab From 8315b79220d2d757134133e2f35a3bac39a17445 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Wed, 5 Feb 2025 11:39:21 +0200 Subject: [PATCH 0416/2211] wifi: mac80211: remove misplaced drv_mgd_complete_tx() call [ Upstream commit f4995cdc4d02d0abc8e9fcccad5c71ce676c1e3f ] In the original commit 15fae3410f1d ("mac80211: notify driver on mgd TX completion") I evidently made a mistake and placed the call in the "associated" if, rather than the "assoc_data". Later I noticed the missing call and placed it in commit c042600c17d8 ("wifi: mac80211: adding missing drv_mgd_complete_tx() call"), but didn't remove the wrong one. Remove it now. Signed-off-by: Johannes Berg Reviewed-by: Emmanuel Grumbach Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250205110958.6ed954179bbf.Id8ef8835b7e6da3bf913c76f77d201017dc8a3c9@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- net/mac80211/mlme.c | 1 - 1 file changed, 1 deletion(-) diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 6a29877fd7b37..6a23a24f7d794 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -9220,7 +9220,6 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, req->reason_code, false); - drv_mgd_complete_tx(sdata->local, sdata, &info); return 0; } -- GitLab From 641ad8d64a08c458a6c0ebd62fe196ab571d388c Mon Sep 17 00:00:00 2001 From: Emmanuel Grumbach Date: Wed, 5 Feb 2025 11:39:20 +0200 Subject: [PATCH 0417/2211] wifi: mac80211: set ieee80211_prep_tx_info::link_id upon Auth Rx [ Upstream commit 8c60179b64434894eac1ffab7396bac131bc8b6e ] This will be used by the low level driver. Note that link_id will be 0 in case of a non-MLO authentication. Also fix a call-site of mgd_prepare_tx() where the link_id was not populated. Update the documentation to reflect the current state ieee80211_prep_tx_info::link_id is also available in mgd_complete_tx(). Signed-off-by: Emmanuel Grumbach Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250205110958.6a590f189ce5.I1fc5c0da26b143f5b07191eb592f01f7083d55ae@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- include/net/mac80211.h | 4 ++-- net/mac80211/driver-ops.h | 3 ++- net/mac80211/mlme.c | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 3b964f8834e71..fee854892bec5 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -7,7 +7,7 @@ * Copyright 2007-2010 Johannes Berg * Copyright 2013-2014 Intel Mobile Communications GmbH * Copyright (C) 2015 - 2017 Intel Deutschland GmbH - * Copyright (C) 2018 - 2024 Intel Corporation + * Copyright (C) 2018 - 2025 Intel Corporation */ #ifndef MAC80211_H @@ -3803,7 +3803,7 @@ enum ieee80211_reconfig_type { * @was_assoc: set if this call is due to deauth/disassoc * while just having been associated * @link_id: the link id on which the frame will be TX'ed. - * Only used with the mgd_prepare_tx() method. + * 0 for a non-MLO connection. */ struct ieee80211_prep_tx_info { u16 duration; diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index a06644084d15d..d1c10f5f95160 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h @@ -2,7 +2,7 @@ /* * Portions of this file * Copyright(c) 2016 Intel Deutschland GmbH -* Copyright (C) 2018-2019, 2021-2024 Intel Corporation +* Copyright (C) 2018-2019, 2021-2025 Intel Corporation */ #ifndef __MAC80211_DRIVER_OPS @@ -955,6 +955,7 @@ static inline void drv_mgd_complete_tx(struct ieee80211_local *local, return; WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION); + info->link_id = info->link_id < 0 ? 0 : info->link_id; trace_drv_mgd_complete_tx(local, sdata, info->duration, info->subtype, info->success); if (local->ops->mgd_complete_tx) diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 6a23a24f7d794..8fa9b9dd46118 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -8,7 +8,7 @@ * Copyright 2007, Michael Wu * Copyright 2013-2014 Intel Mobile Communications GmbH * Copyright (C) 2015 - 2017 Intel Deutschland GmbH - * Copyright (C) 2018 - 2024 Intel Corporation + * Copyright (C) 2018 - 2025 Intel Corporation */ #include @@ -4307,6 +4307,8 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction); status_code = le16_to_cpu(mgmt->u.auth.status_code); + info.link_id = ifmgd->auth_data->link_id; + if (auth_alg != ifmgd->auth_data->algorithm || (auth_alg != WLAN_AUTH_SAE && auth_transaction != ifmgd->auth_data->expected_transaction) || -- GitLab From 701118e6f621f1379add73f9546f4e7f21d0da7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cs=C3=B3k=C3=A1s=2C=20Bence?= Date: Fri, 7 Feb 2025 13:12:55 +0100 Subject: [PATCH 0418/2211] net: fec: Refactor MAC reset to function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 67800d296191d0a9bde0a7776f99ca1ddfa0fc26 ] The core is reset both in `fec_restart()` (called on link-up) and `fec_stop()` (going to sleep, driver remove etc.). These two functions had their separate implementations, which was at first only a register write and a `udelay()` (and the accompanying block comment). However, since then we got soft-reset (MAC disable) and Wake-on-LAN support, which meant that these implementations diverged, often causing bugs. For instance, as of now, `fec_stop()` does not check for `FEC_QUIRK_NO_HARD_RESET`, meaning the MII/RMII mode is cleared on eg. a PM power-down event; and `fec_restart()` missed the refactor renaming the "magic" constant `1` to `FEC_ECR_RESET`. To harmonize current implementations, and eliminate this source of potential future bugs, refactor implementation to a common function. Reviewed-by: Michal Swiatkowski Reviewed-by: Jacob Keller Reviewed-by: Simon Horman Signed-off-by: Csókás, Bence Link: https://patch.msgid.link/20250207121255.161146-2-csokas.bence@prolan.hu Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/freescale/fec_main.c | 52 +++++++++++------------ 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 04906897615d8..479ced24096b8 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1098,6 +1098,29 @@ static void fec_enet_enable_ring(struct net_device *ndev) } } +/* Whack a reset. We should wait for this. + * For i.MX6SX SOC, enet use AXI bus, we use disable MAC + * instead of reset MAC itself. + */ +static void fec_ctrl_reset(struct fec_enet_private *fep, bool allow_wol) +{ + u32 val; + + if (!allow_wol || !(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) { + if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES || + ((fep->quirks & FEC_QUIRK_NO_HARD_RESET) && fep->link)) { + writel(0, fep->hwp + FEC_ECNTRL); + } else { + writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL); + udelay(10); + } + } else { + val = readl(fep->hwp + FEC_ECNTRL); + val |= (FEC_ECR_MAGICEN | FEC_ECR_SLEEP); + writel(val, fep->hwp + FEC_ECNTRL); + } +} + /* * This function is called to start or restart the FEC during a link * change, transmit timeout, or to reconfigure the FEC. The network @@ -1114,17 +1137,7 @@ fec_restart(struct net_device *ndev) if (fep->bufdesc_ex) fec_ptp_save_state(fep); - /* Whack a reset. We should wait for this. - * For i.MX6SX SOC, enet use AXI bus, we use disable MAC - * instead of reset MAC itself. - */ - if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES || - ((fep->quirks & FEC_QUIRK_NO_HARD_RESET) && fep->link)) { - writel(0, fep->hwp + FEC_ECNTRL); - } else { - writel(1, fep->hwp + FEC_ECNTRL); - udelay(10); - } + fec_ctrl_reset(fep, false); /* * enet-mac reset will reset mac address registers too, @@ -1378,22 +1391,7 @@ fec_stop(struct net_device *ndev) if (fep->bufdesc_ex) fec_ptp_save_state(fep); - /* Whack a reset. We should wait for this. - * For i.MX6SX SOC, enet use AXI bus, we use disable MAC - * instead of reset MAC itself. - */ - if (!(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) { - if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES) { - writel(0, fep->hwp + FEC_ECNTRL); - } else { - writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL); - udelay(10); - } - } else { - val = readl(fep->hwp + FEC_ECNTRL); - val |= (FEC_ECR_MAGICEN | FEC_ECR_SLEEP); - writel(val, fep->hwp + FEC_ECNTRL); - } + fec_ctrl_reset(fep, true); writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK); -- GitLab From 9aeaf1956e75a1a3c0355b1f82c972a29444f56a Mon Sep 17 00:00:00 2001 From: Gaurav Batra Date: Thu, 30 Jan 2025 12:38:54 -0600 Subject: [PATCH 0419/2211] powerpc/pseries/iommu: memory notifier incorrectly adds TCEs for pmemory [ Upstream commit 6aa989ab2bd0d37540c812b4270006ff794662e7 ] iommu_mem_notifier() is invoked when RAM is dynamically added/removed. This notifier call is responsible to add/remove TCEs from the Dynamic DMA Window (DDW) when TCEs are pre-mapped. TCEs are pre-mapped only for RAM and not for persistent memory (pmemory). For DMA buffers in pmemory, TCEs are dynamically mapped when the device driver instructs to do so. The issue is 'daxctl' command is capable of adding pmemory as "System RAM" after LPAR boot. The command to do so is - daxctl reconfigure-device --mode=system-ram dax0.0 --force This will dynamically add pmemory range to LPAR RAM eventually invoking iommu_mem_notifier(). The address range of pmemory is way beyond the Max RAM that the LPAR can have. Which means, this range is beyond the DDW created for the device, at device initialization time. As a result when TCEs are pre-mapped for the pmemory range, by iommu_mem_notifier(), PHYP HCALL returns H_PARAMETER. This failed the command, daxctl, to add pmemory as RAM. The solution is to not pre-map TCEs for pmemory. Signed-off-by: Gaurav Batra Tested-by: Donet Tom Reviewed-by: Donet Tom Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/20250130183854.92258-1-gbatra@linux.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/include/asm/mmzone.h | 1 + arch/powerpc/mm/numa.c | 2 +- arch/powerpc/platforms/pseries/iommu.c | 29 ++++++++++++++------------ 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/arch/powerpc/include/asm/mmzone.h b/arch/powerpc/include/asm/mmzone.h index d99863cd6cde4..049152f8d597a 100644 --- a/arch/powerpc/include/asm/mmzone.h +++ b/arch/powerpc/include/asm/mmzone.h @@ -29,6 +29,7 @@ extern cpumask_var_t node_to_cpumask_map[]; #ifdef CONFIG_MEMORY_HOTPLUG extern unsigned long max_pfn; u64 memory_hotplug_max(void); +u64 hot_add_drconf_memory_max(void); #else #define memory_hotplug_max() memblock_end_of_DRAM() #endif diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index 3c1da08304d03..603a0f652ba61 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c @@ -1336,7 +1336,7 @@ int hot_add_scn_to_nid(unsigned long scn_addr) return nid; } -static u64 hot_add_drconf_memory_max(void) +u64 hot_add_drconf_memory_max(void) { struct device_node *memory = NULL; struct device_node *dn = NULL; diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index ae6f7a235d8b2..8f32340960e21 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c @@ -1284,17 +1284,13 @@ static LIST_HEAD(failed_ddw_pdn_list); static phys_addr_t ddw_memory_hotplug_max(void) { - resource_size_t max_addr = memory_hotplug_max(); - struct device_node *memory; + resource_size_t max_addr; - for_each_node_by_type(memory, "memory") { - struct resource res; - - if (of_address_to_resource(memory, 0, &res)) - continue; - - max_addr = max_t(resource_size_t, max_addr, res.end + 1); - } +#if defined(CONFIG_NUMA) && defined(CONFIG_MEMORY_HOTPLUG) + max_addr = hot_add_drconf_memory_max(); +#else + max_addr = memblock_end_of_DRAM(); +#endif return max_addr; } @@ -1600,7 +1596,7 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn) if (direct_mapping) { /* DDW maps the whole partition, so enable direct DMA mapping */ - ret = walk_system_ram_range(0, memblock_end_of_DRAM() >> PAGE_SHIFT, + ret = walk_system_ram_range(0, ddw_memory_hotplug_max() >> PAGE_SHIFT, win64->value, tce_setrange_multi_pSeriesLP_walk); if (ret) { dev_info(&dev->dev, "failed to map DMA window for %pOF: %d\n", @@ -2349,11 +2345,17 @@ static int iommu_mem_notifier(struct notifier_block *nb, unsigned long action, struct memory_notify *arg = data; int ret = 0; + /* This notifier can get called when onlining persistent memory as well. + * TCEs are not pre-mapped for persistent memory. Persistent memory will + * always be above ddw_memory_hotplug_max() + */ + switch (action) { case MEM_GOING_ONLINE: spin_lock(&dma_win_list_lock); list_for_each_entry(window, &dma_win_list, list) { - if (window->direct) { + if (window->direct && (arg->start_pfn << PAGE_SHIFT) < + ddw_memory_hotplug_max()) { ret |= tce_setrange_multi_pSeriesLP(arg->start_pfn, arg->nr_pages, window->prop); } @@ -2365,7 +2367,8 @@ static int iommu_mem_notifier(struct notifier_block *nb, unsigned long action, case MEM_OFFLINE: spin_lock(&dma_win_list_lock); list_for_each_entry(window, &dma_win_list, list) { - if (window->direct) { + if (window->direct && (arg->start_pfn << PAGE_SHIFT) < + ddw_memory_hotplug_max()) { ret |= tce_clearrange_multi_pSeriesLP(arg->start_pfn, arg->nr_pages, window->prop); } -- GitLab From c2e02e2b21591b6f31d5cad4afde04b7e01d4e7b Mon Sep 17 00:00:00 2001 From: Gaurav Batra Date: Wed, 8 Jan 2025 10:48:14 -0600 Subject: [PATCH 0420/2211] powerpc/pseries/iommu: create DDW for devices with DMA mask less than 64-bits [ Upstream commit 67dfc11982f7e3c37f0977e74671da2391b29181 ] Starting with PAPR level 2.13, platform supports placing PHB in limited address mode. Devices that support DMA masks less that 64-bit but greater than 32-bits are placed in limited address mode. In this mode, the starting DMA address returned by the DDW is 4GB. When the device driver calls dma_supported, with mask less then 64-bit, the PowerPC IOMMU driver places PHB in the Limited Addressing Mode before creating DDW. Signed-off-by: Gaurav Batra Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/20250108164814.73250-1-gbatra@linux.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/platforms/pseries/iommu.c | 110 +++++++++++++++++++++---- 1 file changed, 94 insertions(+), 16 deletions(-) diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index 8f32340960e21..d6ebc19fb99c5 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c @@ -52,7 +52,8 @@ enum { enum { DDW_EXT_SIZE = 0, DDW_EXT_RESET_DMA_WIN = 1, - DDW_EXT_QUERY_OUT_SIZE = 2 + DDW_EXT_QUERY_OUT_SIZE = 2, + DDW_EXT_LIMITED_ADDR_MODE = 3 }; static struct iommu_table *iommu_pseries_alloc_table(int node) @@ -1327,6 +1328,54 @@ static void reset_dma_window(struct pci_dev *dev, struct device_node *par_dn) ret); } +/* + * Platforms support placing PHB in limited address mode starting with LoPAR + * level 2.13 implement. In this mode, the DMA address returned by DDW is over + * 4GB but, less than 64-bits. This benefits IO adapters that don't support + * 64-bits for DMA addresses. + */ +static int limited_dma_window(struct pci_dev *dev, struct device_node *par_dn) +{ + int ret; + u32 cfg_addr, reset_dma_win, las_supported; + u64 buid; + struct device_node *dn; + struct pci_dn *pdn; + + ret = ddw_read_ext(par_dn, DDW_EXT_RESET_DMA_WIN, &reset_dma_win); + if (ret) + goto out; + + ret = ddw_read_ext(par_dn, DDW_EXT_LIMITED_ADDR_MODE, &las_supported); + + /* Limited Address Space extension available on the platform but DDW in + * limited addressing mode not supported + */ + if (!ret && !las_supported) + ret = -EPROTO; + + if (ret) { + dev_info(&dev->dev, "Limited Address Space for DDW not Supported, err: %d", ret); + goto out; + } + + dn = pci_device_to_OF_node(dev); + pdn = PCI_DN(dn); + buid = pdn->phb->buid; + cfg_addr = (pdn->busno << 16) | (pdn->devfn << 8); + + ret = rtas_call(reset_dma_win, 4, 1, NULL, cfg_addr, BUID_HI(buid), + BUID_LO(buid), 1); + if (ret) + dev_info(&dev->dev, + "ibm,reset-pe-dma-windows(%x) for Limited Addr Support: %x %x %x returned %d ", + reset_dma_win, cfg_addr, BUID_HI(buid), BUID_LO(buid), + ret); + +out: + return ret; +} + /* Return largest page shift based on "IO Page Sizes" output of ibm,query-pe-dma-window. */ static int iommu_get_page_shift(u32 query_page_size) { @@ -1394,7 +1443,7 @@ static struct property *ddw_property_create(const char *propname, u32 liobn, u64 * * returns true if can map all pages (direct mapping), false otherwise.. */ -static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn) +static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn, u64 dma_mask) { int len = 0, ret; int max_ram_len = order_base_2(ddw_memory_hotplug_max()); @@ -1413,6 +1462,9 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn) bool pmem_present; struct pci_dn *pci = PCI_DN(pdn); struct property *default_win = NULL; + bool limited_addr_req = false, limited_addr_enabled = false; + int dev_max_ddw; + int ddw_sz; dn = of_find_node_by_type(NULL, "ibm,pmemory"); pmem_present = dn != NULL; @@ -1439,7 +1491,6 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn) * the ibm,ddw-applicable property holds the tokens for: * ibm,query-pe-dma-window * ibm,create-pe-dma-window - * ibm,remove-pe-dma-window * for the given node in that order. * the property is actually in the parent, not the PE */ @@ -1459,6 +1510,20 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn) if (ret != 0) goto out_failed; + /* DMA Limited Addressing required? This is when the driver has + * requested to create DDW but supports mask which is less than 64-bits + */ + limited_addr_req = (dma_mask != DMA_BIT_MASK(64)); + + /* place the PHB in Limited Addressing mode */ + if (limited_addr_req) { + if (limited_dma_window(dev, pdn)) + goto out_failed; + + /* PHB is in Limited address mode */ + limited_addr_enabled = true; + } + /* * If there is no window available, remove the default DMA window, * if it's present. This will make all the resources available to the @@ -1505,6 +1570,15 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn) goto out_failed; } + /* Maximum DMA window size that the device can address (in log2) */ + dev_max_ddw = fls64(dma_mask); + + /* If the device DMA mask is less than 64-bits, make sure the DMA window + * size is not bigger than what the device can access + */ + ddw_sz = min(order_base_2(query.largest_available_block << page_shift), + dev_max_ddw); + /* * The "ibm,pmemory" can appear anywhere in the address space. * Assuming it is still backed by page structs, try MAX_PHYSMEM_BITS @@ -1513,23 +1587,21 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn) */ len = max_ram_len; if (pmem_present) { - if (query.largest_available_block >= - (1ULL << (MAX_PHYSMEM_BITS - page_shift))) + if (ddw_sz >= MAX_PHYSMEM_BITS) len = MAX_PHYSMEM_BITS; else dev_info(&dev->dev, "Skipping ibm,pmemory"); } /* check if the available block * number of ptes will map everything */ - if (query.largest_available_block < (1ULL << (len - page_shift))) { + if (ddw_sz < len) { dev_dbg(&dev->dev, "can't map partition max 0x%llx with %llu %llu-sized pages\n", 1ULL << len, query.largest_available_block, 1ULL << page_shift); - len = order_base_2(query.largest_available_block << page_shift); - + len = ddw_sz; dynamic_mapping = true; } else { direct_mapping = !default_win_removed || @@ -1543,8 +1615,9 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn) */ if (default_win_removed && pmem_present && !direct_mapping) { /* DDW is big enough to be split */ - if ((query.largest_available_block << page_shift) >= - MIN_DDW_VPMEM_DMA_WINDOW + (1ULL << max_ram_len)) { + if ((1ULL << ddw_sz) >= + MIN_DDW_VPMEM_DMA_WINDOW + (1ULL << max_ram_len)) { + direct_mapping = true; /* offset of the Dynamic part of DDW */ @@ -1555,8 +1628,7 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn) dynamic_mapping = true; /* create max size DDW possible */ - len = order_base_2(query.largest_available_block - << page_shift); + len = ddw_sz; } } @@ -1685,7 +1757,7 @@ out_remove_win: __remove_dma_window(pdn, ddw_avail, create.liobn); out_failed: - if (default_win_removed) + if (default_win_removed || limited_addr_enabled) reset_dma_window(dev, pdn); fpdn = kzalloc(sizeof(*fpdn), GFP_KERNEL); @@ -1704,6 +1776,9 @@ out_unlock: dev->dev.bus_dma_limit = dev->dev.archdata.dma_offset + (1ULL << max_ram_len); + dev_info(&dev->dev, "lsa_required: %x, lsa_enabled: %x, direct mapping: %x\n", + limited_addr_req, limited_addr_enabled, direct_mapping); + return direct_mapping; } @@ -1829,8 +1904,11 @@ static bool iommu_bypass_supported_pSeriesLP(struct pci_dev *pdev, u64 dma_mask) { struct device_node *dn = pci_device_to_OF_node(pdev), *pdn; - /* only attempt to use a new window if 64-bit DMA is requested */ - if (dma_mask < DMA_BIT_MASK(64)) + /* For DDW, DMA mask should be more than 32-bits. For mask more then + * 32-bits but less then 64-bits, DMA addressing is supported in + * Limited Addressing mode. + */ + if (dma_mask <= DMA_BIT_MASK(32)) return false; dev_dbg(&pdev->dev, "node is %pOF\n", dn); @@ -1843,7 +1921,7 @@ static bool iommu_bypass_supported_pSeriesLP(struct pci_dev *pdev, u64 dma_mask) */ pdn = pci_dma_find(dn, NULL); if (pdn && PCI_DN(pdn)) - return enable_ddw(pdev, pdn); + return enable_ddw(pdev, pdn, dma_mask); return false; } -- GitLab From f9ab6efdee1ff6dc8b1d3e2c6063e9c1e8f8e55b Mon Sep 17 00:00:00 2001 From: Athira Rajeev Date: Tue, 21 Jan 2025 18:46:20 +0530 Subject: [PATCH 0421/2211] arch/powerpc/perf: Check the instruction type before creating sample with perf_mem_data_src [ Upstream commit 2ffb26afa64261139e608bf087a0c1fe24d76d4d ] perf mem report aborts as below sometimes (during some corner case) in powerpc: # ./perf mem report 1>out *** stack smashing detected ***: terminated Aborted (core dumped) The backtrace is as below: __pthread_kill_implementation () raise () abort () __libc_message __fortify_fail __stack_chk_fail hist_entry.lvl_snprintf __sort__hpp_entry __hist_entry__snprintf hists.fprintf cmd_report cmd_mem Snippet of code which triggers the issue from tools/perf/util/sort.c static int hist_entry__lvl_snprintf(struct hist_entry *he, char *bf, size_t size, unsigned int width) { char out[64]; perf_mem__lvl_scnprintf(out, sizeof(out), he->mem_info); return repsep_snprintf(bf, size, "%-*s", width, out); } The value of "out" is filled from perf_mem_data_src value. Debugging this further showed that for some corner cases, the value of "data_src" was pointing to wrong value. This resulted in bigger size of string and causing stack check fail. The perf mem data source values are captured in the sample via isa207_get_mem_data_src function. The initial check is to fetch the type of sampled instruction. If the type of instruction is not valid (not a load/store instruction), the function returns. Since 'commit e16fd7f2cb1a ("perf: Use sample_flags for data_src")', data_src field is not initialized by the perf_sample_data_init() function. If the PMU driver doesn't set the data_src value to zero if type is not valid, this will result in uninitailised value for data_src. The uninitailised value of data_src resulted in stack check fail followed by abort for "perf mem report". When requesting for data source information in the sample, the instruction type is expected to be load or store instruction. In ISA v3.0, due to hardware limitation, there are corner cases where the instruction type other than load or store is observed. In ISA v3.0 and before values "0" and "7" are considered reserved. In ISA v3.1, value "7" has been used to indicate "larx/stcx". Drop the sample if instruction type has reserved values for this field with a ISA version check. Initialize data_src to zero in isa207_get_mem_data_src if the instruction type is not load/store. Reported-by: Disha Goel Signed-off-by: Athira Rajeev Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/20250121131621.39054-1-atrajeev@linux.vnet.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/perf/core-book3s.c | 20 ++++++++++++++++++++ arch/powerpc/perf/isa207-common.c | 4 +++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index 42867469752d7..33d726bb99e3d 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c @@ -2222,6 +2222,10 @@ static struct pmu power_pmu = { #define PERF_SAMPLE_ADDR_TYPE (PERF_SAMPLE_ADDR | \ PERF_SAMPLE_PHYS_ADDR | \ PERF_SAMPLE_DATA_PAGE_SIZE) + +#define SIER_TYPE_SHIFT 15 +#define SIER_TYPE_MASK (0x7ull << SIER_TYPE_SHIFT) + /* * A counter has overflowed; update its count and record * things if requested. Note that interrupts are hard-disabled @@ -2290,6 +2294,22 @@ static void record_and_restart(struct perf_event *event, unsigned long val, is_kernel_addr(mfspr(SPRN_SIAR))) record = 0; + /* + * SIER[46-48] presents instruction type of the sampled instruction. + * In ISA v3.0 and before values "0" and "7" are considered reserved. + * In ISA v3.1, value "7" has been used to indicate "larx/stcx". + * Drop the sample if "type" has reserved values for this field with a + * ISA version check. + */ + if (event->attr.sample_type & PERF_SAMPLE_DATA_SRC && + ppmu->get_mem_data_src) { + val = (regs->dar & SIER_TYPE_MASK) >> SIER_TYPE_SHIFT; + if (val == 0 || (val == 7 && !cpu_has_feature(CPU_FTR_ARCH_31))) { + record = 0; + atomic64_inc(&event->lost_samples); + } + } + /* * Finally record data if requested. */ diff --git a/arch/powerpc/perf/isa207-common.c b/arch/powerpc/perf/isa207-common.c index 56301b2bc8ae8..031a2b63c171d 100644 --- a/arch/powerpc/perf/isa207-common.c +++ b/arch/powerpc/perf/isa207-common.c @@ -321,8 +321,10 @@ void isa207_get_mem_data_src(union perf_mem_data_src *dsrc, u32 flags, sier = mfspr(SPRN_SIER); val = (sier & ISA207_SIER_TYPE_MASK) >> ISA207_SIER_TYPE_SHIFT; - if (val != 1 && val != 2 && !(val == 7 && cpu_has_feature(CPU_FTR_ARCH_31))) + if (val != 1 && val != 2 && !(val == 7 && cpu_has_feature(CPU_FTR_ARCH_31))) { + dsrc->val = 0; return; + } idx = (sier & ISA207_SIER_LDST_MASK) >> ISA207_SIER_LDST_SHIFT; sub_idx = (sier & ISA207_SIER_DATA_SRC_MASK) >> ISA207_SIER_DATA_SRC_SHIFT; -- GitLab From 9f2911868a73342ec950e67a0d19adc933bdd45e Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Fri, 7 Feb 2025 16:24:58 +0900 Subject: [PATCH 0422/2211] ip: fib_rules: Fetch net from fib_rule in fib[46]_rule_configure(). [ Upstream commit 5a1ccffd30a08f5a2428cd5fbb3ab03e8eb6c66d ] The following patch will not set skb->sk from VRF path. Let's fetch net from fib_rule->fr_net instead of sock_net(skb->sk) in fib[46]_rule_configure(). Signed-off-by: Kuniyuki Iwashima Reviewed-by: Eric Dumazet Reviewed-by: Ido Schimmel Tested-by: Ido Schimmel Link: https://patch.msgid.link/20250207072502.87775-5-kuniyu@amazon.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/ipv4/fib_rules.c | 4 ++-- net/ipv6/fib6_rules.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c index b07292d50ee76..4563e5303c1a8 100644 --- a/net/ipv4/fib_rules.c +++ b/net/ipv4/fib_rules.c @@ -245,9 +245,9 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, struct nlattr **tb, struct netlink_ext_ack *extack) { - struct net *net = sock_net(skb->sk); + struct fib4_rule *rule4 = (struct fib4_rule *)rule; + struct net *net = rule->fr_net; int err = -EINVAL; - struct fib4_rule *rule4 = (struct fib4_rule *) rule; if (!inet_validate_dscp(frh->tos)) { NL_SET_ERR_MSG(extack, diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c index 04a9ed5e8310f..29185c9ebd020 100644 --- a/net/ipv6/fib6_rules.c +++ b/net/ipv6/fib6_rules.c @@ -365,9 +365,9 @@ static int fib6_rule_configure(struct fib_rule *rule, struct sk_buff *skb, struct nlattr **tb, struct netlink_ext_ack *extack) { + struct fib6_rule *rule6 = (struct fib6_rule *)rule; + struct net *net = rule->fr_net; int err = -EINVAL; - struct net *net = sock_net(skb->sk); - struct fib6_rule *rule6 = (struct fib6_rule *) rule; if (!inet_validate_dscp(frh->tos)) { NL_SET_ERR_MSG(extack, -- GitLab From 7fea5a914001a64ac149331cf0d423b490a59f61 Mon Sep 17 00:00:00 2001 From: Aleksander Jan Bajkowski Date: Thu, 6 Feb 2025 23:40:33 +0100 Subject: [PATCH 0423/2211] r8152: add vendor/device ID pair for Dell Alienware AW1022z [ Upstream commit 848b09d53d923b4caee5491f57a5c5b22d81febc ] The Dell AW1022z is an RTL8156B based 2.5G Ethernet controller. Add the vendor and product ID values to the driver. This makes Ethernet work with the adapter. Signed-off-by: Aleksander Jan Bajkowski Link: https://patch.msgid.link/20250206224033.980115-1-olek2@wp.pl Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/usb/r8152.c | 1 + include/linux/usb/r8152.h | 1 + 2 files changed, 2 insertions(+) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 96fa3857d8e25..2cab046749a92 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -10085,6 +10085,7 @@ static const struct usb_device_id rtl8152_table[] = { { USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) }, { USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) }, { USB_DEVICE(VENDOR_ID_DLINK, 0xb301) }, + { USB_DEVICE(VENDOR_ID_DELL, 0xb097) }, { USB_DEVICE(VENDOR_ID_ASUS, 0x1976) }, {} }; diff --git a/include/linux/usb/r8152.h b/include/linux/usb/r8152.h index 33a4c146dc19c..2ca60828f28bb 100644 --- a/include/linux/usb/r8152.h +++ b/include/linux/usb/r8152.h @@ -30,6 +30,7 @@ #define VENDOR_ID_NVIDIA 0x0955 #define VENDOR_ID_TPLINK 0x2357 #define VENDOR_ID_DLINK 0x2001 +#define VENDOR_ID_DELL 0x413c #define VENDOR_ID_ASUS 0x0b05 #if IS_REACHABLE(CONFIG_USB_RTL8152) -- GitLab From 556f53a8ec3749f5f6d00b1f520996773e596744 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Fri, 7 Feb 2025 14:09:07 -0600 Subject: [PATCH 0424/2211] iio: adc: ad7944: don't use storagebits for sizing [ Upstream commit 503d20ed8cf7c7b40ec0bd94f53c490c1d91c31b ] Replace use of storagebits with realbits for determining the number of bytes needed for SPI transfers. When adding SPI offload support, storagebits will always be 32 rather than 16 for 16-bit 16-bit chips so we can no longer rely on storagebits being the correct size expected by the SPI framework (it always uses 4 bytes for > 16-bit xfers and 2 bytes for > 8-bit xfers). Instead, derive the correct size from realbits since it will always be correct even when SPI offloading is used. Reviewed-by: Jonathan Cameron Reviewed-vy: Nuno Sa Signed-off-by: David Lechner Link: https://patch.msgid.link/20250207-dlech-mainline-spi-engine-offload-2-v8-10-e48a489be48c@baylibre.com Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/adc/ad7944.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/drivers/iio/adc/ad7944.c b/drivers/iio/adc/ad7944.c index 0f36138a71445..58a25792cec37 100644 --- a/drivers/iio/adc/ad7944.c +++ b/drivers/iio/adc/ad7944.c @@ -98,6 +98,9 @@ struct ad7944_chip_info { const struct iio_chan_spec channels[2]; }; +/* get number of bytes for SPI xfer */ +#define AD7944_SPI_BYTES(scan_type) ((scan_type).realbits > 16 ? 4 : 2) + /* * AD7944_DEFINE_CHIP_INFO - Define a chip info structure for a specific chip * @_name: The name of the chip @@ -164,7 +167,7 @@ static int ad7944_3wire_cs_mode_init_msg(struct device *dev, struct ad7944_adc * /* Then we can read the data during the acquisition phase */ xfers[2].rx_buf = &adc->sample.raw; - xfers[2].len = BITS_TO_BYTES(chan->scan_type.storagebits); + xfers[2].len = AD7944_SPI_BYTES(chan->scan_type); xfers[2].bits_per_word = chan->scan_type.realbits; spi_message_init_with_transfers(&adc->msg, xfers, 3); @@ -193,7 +196,7 @@ static int ad7944_4wire_mode_init_msg(struct device *dev, struct ad7944_adc *adc xfers[0].delay.unit = SPI_DELAY_UNIT_NSECS; xfers[1].rx_buf = &adc->sample.raw; - xfers[1].len = BITS_TO_BYTES(chan->scan_type.storagebits); + xfers[1].len = AD7944_SPI_BYTES(chan->scan_type); xfers[1].bits_per_word = chan->scan_type.realbits; spi_message_init_with_transfers(&adc->msg, xfers, 2); @@ -228,7 +231,7 @@ static int ad7944_chain_mode_init_msg(struct device *dev, struct ad7944_adc *adc xfers[0].delay.unit = SPI_DELAY_UNIT_NSECS; xfers[1].rx_buf = adc->chain_mode_buf; - xfers[1].len = BITS_TO_BYTES(chan->scan_type.storagebits) * n_chain_dev; + xfers[1].len = AD7944_SPI_BYTES(chan->scan_type) * n_chain_dev; xfers[1].bits_per_word = chan->scan_type.realbits; spi_message_init_with_transfers(&adc->msg, xfers, 2); @@ -274,12 +277,12 @@ static int ad7944_single_conversion(struct ad7944_adc *adc, return ret; if (adc->spi_mode == AD7944_SPI_MODE_CHAIN) { - if (chan->scan_type.storagebits > 16) + if (chan->scan_type.realbits > 16) *val = ((u32 *)adc->chain_mode_buf)[chan->scan_index]; else *val = ((u16 *)adc->chain_mode_buf)[chan->scan_index]; } else { - if (chan->scan_type.storagebits > 16) + if (chan->scan_type.realbits > 16) *val = adc->sample.raw.u32; else *val = adc->sample.raw.u16; @@ -409,8 +412,7 @@ static int ad7944_chain_mode_alloc(struct device *dev, /* 1 word for each voltage channel + aligned u64 for timestamp */ chain_mode_buf_size = ALIGN(n_chain_dev * - BITS_TO_BYTES(chan[0].scan_type.storagebits), sizeof(u64)) - + sizeof(u64); + AD7944_SPI_BYTES(chan[0].scan_type), sizeof(u64)) + sizeof(u64); buf = devm_kzalloc(dev, chain_mode_buf_size, GFP_KERNEL); if (!buf) return -ENOMEM; -- GitLab From 16ddd67bb5579a14cb91c9692a11b1fd0349be45 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Thu, 6 Feb 2025 11:16:59 -0800 Subject: [PATCH 0425/2211] pstore: Change kmsg_bytes storage size to u32 [ Upstream commit 5674609535bafa834ab014d90d9bbe8e89223a0b ] The types around kmsg_bytes were inconsistent. The global was unsigned long, the argument to pstore_set_kmsg_bytes() was int, and the filesystem option was u32. Given other internal limits, there's not much sense in making a single pstore record larger than INT_MAX and it can't be negative, so use u32 everywhere. Additionally, use READ/WRITE_ONCE and a local variable in pstore_dump() to avoid kmsg_bytes changing during a dump. Link: https://lore.kernel.org/r/20250206191655.work.798-kees@kernel.org Signed-off-by: Kees Cook Signed-off-by: Sasha Levin --- fs/pstore/inode.c | 2 +- fs/pstore/internal.h | 4 ++-- fs/pstore/platform.c | 11 ++++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index 56815799ce798..9de6b280c4f41 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c @@ -265,7 +265,7 @@ static void parse_options(char *options) static int pstore_show_options(struct seq_file *m, struct dentry *root) { if (kmsg_bytes != CONFIG_PSTORE_DEFAULT_KMSG_BYTES) - seq_printf(m, ",kmsg_bytes=%lu", kmsg_bytes); + seq_printf(m, ",kmsg_bytes=%u", kmsg_bytes); return 0; } diff --git a/fs/pstore/internal.h b/fs/pstore/internal.h index 801d6c0b170c3..a0fc511969100 100644 --- a/fs/pstore/internal.h +++ b/fs/pstore/internal.h @@ -6,7 +6,7 @@ #include #include -extern unsigned long kmsg_bytes; +extern unsigned int kmsg_bytes; #ifdef CONFIG_PSTORE_FTRACE extern void pstore_register_ftrace(void); @@ -35,7 +35,7 @@ static inline void pstore_unregister_pmsg(void) {} extern struct pstore_info *psinfo; -extern void pstore_set_kmsg_bytes(int); +extern void pstore_set_kmsg_bytes(unsigned int bytes); extern void pstore_get_records(int); extern void pstore_get_backend_records(struct pstore_info *psi, struct dentry *root, int quiet); diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index f56b066ab80ce..557cf9d40177f 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c @@ -92,8 +92,8 @@ module_param(compress, charp, 0444); MODULE_PARM_DESC(compress, "compression to use"); /* How much of the kernel log to snapshot */ -unsigned long kmsg_bytes = CONFIG_PSTORE_DEFAULT_KMSG_BYTES; -module_param(kmsg_bytes, ulong, 0444); +unsigned int kmsg_bytes = CONFIG_PSTORE_DEFAULT_KMSG_BYTES; +module_param(kmsg_bytes, uint, 0444); MODULE_PARM_DESC(kmsg_bytes, "amount of kernel log to snapshot (in bytes)"); static void *compress_workspace; @@ -107,9 +107,9 @@ static void *compress_workspace; static char *big_oops_buf; static size_t max_compressed_size; -void pstore_set_kmsg_bytes(int bytes) +void pstore_set_kmsg_bytes(unsigned int bytes) { - kmsg_bytes = bytes; + WRITE_ONCE(kmsg_bytes, bytes); } /* Tag each group of saved records with a sequence number */ @@ -278,6 +278,7 @@ static void pstore_dump(struct kmsg_dumper *dumper, struct kmsg_dump_detail *detail) { struct kmsg_dump_iter iter; + unsigned int remaining = READ_ONCE(kmsg_bytes); unsigned long total = 0; const char *why; unsigned int part = 1; @@ -300,7 +301,7 @@ static void pstore_dump(struct kmsg_dumper *dumper, kmsg_dump_rewind(&iter); oopscount++; - while (total < kmsg_bytes) { + while (total < remaining) { char *dst; size_t dst_size; int header_size; -- GitLab From 39255ab2edfb01707cade37b05a20328c9873e01 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Mon, 20 Jan 2025 12:36:53 +0100 Subject: [PATCH 0426/2211] leds: trigger: netdev: Configure LED blink interval for HW offload [ Upstream commit c629c972b310af41e9e072febb6dae9a299edde6 ] In case a PHY LED implements .blink_set callback to set LED blink interval, call it even if .hw_control is already set, as that LED blink interval likely controls the blink rate of that HW offloaded LED. For PHY LEDs, that can be their activity blinking interval. The software blinking is not affected by this change. With this change, the LED interval setting looks something like this: $ echo netdev > /sys/class/leds/led:green:lan/trigger $ echo 1 > /sys/class/leds/led:green:lan/brightness $ echo 250 > /sys/class/leds/led:green:lan/interval Signed-off-by: Marek Vasut Link: https://lore.kernel.org/r/20250120113740.91807-1-marex@denx.de Signed-off-by: Lee Jones Signed-off-by: Sasha Levin --- drivers/leds/trigger/ledtrig-netdev.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/leds/trigger/ledtrig-netdev.c b/drivers/leds/trigger/ledtrig-netdev.c index 4b0863db901a9..356a55ced2c28 100644 --- a/drivers/leds/trigger/ledtrig-netdev.c +++ b/drivers/leds/trigger/ledtrig-netdev.c @@ -68,6 +68,7 @@ struct led_netdev_data { unsigned int last_activity; unsigned long mode; + unsigned long blink_delay; int link_speed; __ETHTOOL_DECLARE_LINK_MODE_MASK(supported_link_modes); u8 duplex; @@ -86,6 +87,10 @@ static void set_baseline_state(struct led_netdev_data *trigger_data) /* Already validated, hw control is possible with the requested mode */ if (trigger_data->hw_control) { led_cdev->hw_control_set(led_cdev, trigger_data->mode); + if (led_cdev->blink_set) { + led_cdev->blink_set(led_cdev, &trigger_data->blink_delay, + &trigger_data->blink_delay); + } return; } @@ -454,10 +459,11 @@ static ssize_t interval_store(struct device *dev, size_t size) { struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev); + struct led_classdev *led_cdev = trigger_data->led_cdev; unsigned long value; int ret; - if (trigger_data->hw_control) + if (trigger_data->hw_control && !led_cdev->blink_set) return -EINVAL; ret = kstrtoul(buf, 0, &value); @@ -466,9 +472,13 @@ static ssize_t interval_store(struct device *dev, /* impose some basic bounds on the timer interval */ if (value >= 5 && value <= 10000) { - cancel_delayed_work_sync(&trigger_data->work); + if (trigger_data->hw_control) { + trigger_data->blink_delay = value; + } else { + cancel_delayed_work_sync(&trigger_data->work); - atomic_set(&trigger_data->interval, msecs_to_jiffies(value)); + atomic_set(&trigger_data->interval, msecs_to_jiffies(value)); + } set_baseline_state(trigger_data); /* resets timer */ } -- GitLab From 73733c2fdb378ea072e05b7c67189fe4e2cd8603 Mon Sep 17 00:00:00 2001 From: Zhang Yi Date: Fri, 20 Dec 2024 09:16:30 +0800 Subject: [PATCH 0427/2211] ext4: don't write back data before punch hole in nojournal mode [ Upstream commit 43d0105e2c7523cc6b14cad65e2044e829c0a07a ] There is no need to write back all data before punching a hole in non-journaled mode since it will be dropped soon after removing space. Therefore, the call to filemap_write_and_wait_range() can be eliminated. Besides, similar to ext4_zero_range(), we must address the case of partially punched folios when block size < page size. It is essential to remove writable userspace mappings to ensure that the folio can be faulted again during subsequent mmap write access. In journaled mode, we need to write dirty pages out before discarding page cache in case of crash before committing the freeing data transaction, which could expose old, stale data, even if synchronization has been performed. Signed-off-by: Zhang Yi Reviewed-by: Jan Kara Reviewed-by: Ojaswin Mujoo Link: https://patch.msgid.link/20241220011637.1157197-4-yi.zhang@huaweicloud.com Signed-off-by: Theodore Ts'o Signed-off-by: Sasha Levin --- fs/ext4/inode.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 487d9aec56c9d..819be57bb4ecf 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3933,17 +3933,6 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length) trace_ext4_punch_hole(inode, offset, length, 0); - /* - * Write out all dirty pages to avoid race conditions - * Then release them. - */ - if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) { - ret = filemap_write_and_wait_range(mapping, offset, - offset + length - 1); - if (ret) - return ret; - } - inode_lock(inode); /* No need to punch hole beyond i_size */ @@ -4005,8 +3994,11 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length) ret = ext4_update_disksize_before_punch(inode, offset, length); if (ret) goto out_dio; - truncate_pagecache_range(inode, first_block_offset, - last_block_offset); + + ret = ext4_truncate_page_cache_block_range(inode, + first_block_offset, last_block_offset + 1); + if (ret) + goto out_dio; } if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) -- GitLab From 2a25d61107c6e32600e11697b91ab75feb11d0ac Mon Sep 17 00:00:00 2001 From: Zhang Yi Date: Fri, 20 Dec 2024 09:16:28 +0800 Subject: [PATCH 0428/2211] ext4: remove writable userspace mappings before truncating page cache [ Upstream commit 17207d0bb209e8b40f27d7f3f96e82a78af0bf2c ] When zeroing a range of folios on the filesystem which block size is less than the page size, the file's mapped blocks within one page will be marked as unwritten, we should remove writable userspace mappings to ensure that ext4_page_mkwrite() can be called during subsequent write access to these partial folios. Otherwise, data written by subsequent mmap writes may not be saved to disk. $mkfs.ext4 -b 1024 /dev/vdb $mount /dev/vdb /mnt $xfs_io -t -f -c "pwrite -S 0x58 0 4096" -c "mmap -rw 0 4096" \ -c "mwrite -S 0x5a 2048 2048" -c "fzero 2048 2048" \ -c "mwrite -S 0x59 2048 2048" -c "close" /mnt/foo $od -Ax -t x1z /mnt/foo 000000 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 * 000800 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 * 001000 $umount /mnt && mount /dev/vdb /mnt $od -Ax -t x1z /mnt/foo 000000 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 * 000800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 001000 Fix this by introducing ext4_truncate_page_cache_block_range() to remove writable userspace mappings when truncating a partial folio range. Additionally, move the journal data mode-specific handlers and truncate_pagecache_range() into this function, allowing it to serve as a common helper that correctly manages the page cache in preparation for block range manipulations. Signed-off-by: Zhang Yi Reviewed-by: Jan Kara Reviewed-by: Ojaswin Mujoo Link: https://patch.msgid.link/20241220011637.1157197-2-yi.zhang@huaweicloud.com Signed-off-by: Theodore Ts'o Signed-off-by: Sasha Levin --- fs/ext4/ext4.h | 2 ++ fs/ext4/extents.c | 19 ++++---------- fs/ext4/inode.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 14 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 75df7eeee50d8..c2e6989a568c2 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -3013,6 +3013,8 @@ extern int ext4_inode_attach_jinode(struct inode *inode); extern int ext4_can_truncate(struct inode *inode); extern int ext4_truncate(struct inode *); extern int ext4_break_layouts(struct inode *); +extern int ext4_truncate_page_cache_block_range(struct inode *inode, + loff_t start, loff_t end); extern int ext4_punch_hole(struct file *file, loff_t offset, loff_t length); extern void ext4_set_inode_flags(struct inode *, bool init); extern int ext4_alloc_da_blocks(struct inode *inode); diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 60909af2d4a53..ba3419958a832 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4667,22 +4667,13 @@ static long ext4_zero_range(struct file *file, loff_t offset, goto out_mutex; } - /* - * For journalled data we need to write (and checkpoint) pages - * before discarding page cache to avoid inconsitent data on - * disk in case of crash before zeroing trans is committed. - */ - if (ext4_should_journal_data(inode)) { - ret = filemap_write_and_wait_range(mapping, start, - end - 1); - if (ret) { - filemap_invalidate_unlock(mapping); - goto out_mutex; - } + /* Now release the pages and zero block aligned part of pages */ + ret = ext4_truncate_page_cache_block_range(inode, start, end); + if (ret) { + filemap_invalidate_unlock(mapping); + goto out_mutex; } - /* Now release the pages and zero block aligned part of pages */ - truncate_pagecache_range(inode, start, end - 1); inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); ret = ext4_alloc_file_blocks(file, lblk, max_blocks, new_size, diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 819be57bb4ecf..38fe9a213d09b 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -3879,6 +3880,68 @@ int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset, return ret; } +static inline void ext4_truncate_folio(struct inode *inode, + loff_t start, loff_t end) +{ + unsigned long blocksize = i_blocksize(inode); + struct folio *folio; + + /* Nothing to be done if no complete block needs to be truncated. */ + if (round_up(start, blocksize) >= round_down(end, blocksize)) + return; + + folio = filemap_lock_folio(inode->i_mapping, start >> PAGE_SHIFT); + if (IS_ERR(folio)) + return; + + if (folio_mkclean(folio)) + folio_mark_dirty(folio); + folio_unlock(folio); + folio_put(folio); +} + +int ext4_truncate_page_cache_block_range(struct inode *inode, + loff_t start, loff_t end) +{ + unsigned long blocksize = i_blocksize(inode); + int ret; + + /* + * For journalled data we need to write (and checkpoint) pages + * before discarding page cache to avoid inconsitent data on disk + * in case of crash before freeing or unwritten converting trans + * is committed. + */ + if (ext4_should_journal_data(inode)) { + ret = filemap_write_and_wait_range(inode->i_mapping, start, + end - 1); + if (ret) + return ret; + goto truncate_pagecache; + } + + /* + * If the block size is less than the page size, the file's mapped + * blocks within one page could be freed or converted to unwritten. + * So it's necessary to remove writable userspace mappings, and then + * ext4_page_mkwrite() can be called during subsequent write access + * to these partial folios. + */ + if (!IS_ALIGNED(start | end, PAGE_SIZE) && + blocksize < PAGE_SIZE && start < inode->i_size) { + loff_t page_boundary = round_up(start, PAGE_SIZE); + + ext4_truncate_folio(inode, start, min(page_boundary, end)); + if (end > page_boundary) + ext4_truncate_folio(inode, + round_down(end, PAGE_SIZE), end); + } + +truncate_pagecache: + truncate_pagecache_range(inode, start, end - 1); + return 0; +} + static void ext4_wait_dax_page(struct inode *inode) { filemap_invalidate_unlock(inode->i_mapping); -- GitLab From 1c564864438b2af596c0715df6b0084df2fce9c8 Mon Sep 17 00:00:00 2001 From: Bitterblue Smith Date: Tue, 4 Feb 2025 20:37:36 +0200 Subject: [PATCH 0429/2211] wifi: rtw88: Fix download_firmware_validate() for RTL8814AU [ Upstream commit 9e8243025cc06abc975c876dffda052073207ab3 ] After the firmware is uploaded, download_firmware_validate() checks some bits in REG_MCUFW_CTRL to see if everything went okay. The RTL8814AU power on sequence sets bits 13 and 12 to 2, which this function does not expect, so it thinks the firmware upload failed. Make download_firmware_validate() ignore bits 13 and 12. Signed-off-by: Bitterblue Smith Acked-by: Ping-Ke Shih Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/049d2887-22fc-47b7-9e59-62627cb525f8@gmail.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw88/reg.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h index 4d9b8668e8b04..2708ee2f12a47 100644 --- a/drivers/net/wireless/realtek/rtw88/reg.h +++ b/drivers/net/wireless/realtek/rtw88/reg.h @@ -109,6 +109,7 @@ #define BIT_SHIFT_ROM_PGE 16 #define BIT_FW_INIT_RDY BIT(15) #define BIT_FW_DW_RDY BIT(14) +#define BIT_CPU_CLK_SEL (BIT(12) | BIT(13)) #define BIT_RPWM_TOGGLE BIT(7) #define BIT_RAM_DL_SEL BIT(7) /* legacy only */ #define BIT_DMEM_CHKSUM_OK BIT(6) @@ -126,7 +127,7 @@ BIT_CHECK_SUM_OK) #define FW_READY_LEGACY (BIT_MCUFWDL_RDY | BIT_FWDL_CHK_RPT | \ BIT_WINTINI_RDY | BIT_RAM_DL_SEL) -#define FW_READY_MASK 0xffff +#define FW_READY_MASK (0xffff & ~BIT_CPU_CLK_SEL) #define REG_MCU_TST_CFG 0x84 #define VAL_FW_TRIGGER 0x1 -- GitLab From 50f78100b9393c5a96fd44a7f3f28712ceb34e8d Mon Sep 17 00:00:00 2001 From: Bitterblue Smith Date: Tue, 4 Feb 2025 20:36:56 +0200 Subject: [PATCH 0430/2211] wifi: rtw88: Fix __rtw_download_firmware() for RTL8814AU [ Upstream commit 8425f5c8f04dbcf11ade78f984a494fc0b90e7a0 ] Don't call ltecoex_read_reg() and ltecoex_reg_write() when the ltecoex_addr member of struct rtw_chip_info is NULL. The RTL8814AU doesn't have this feature. Signed-off-by: Bitterblue Smith Acked-by: Ping-Ke Shih Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/55b5641f-094e-4f94-9f79-ac053733f2cf@gmail.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw88/mac.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c index 564f5988ee82a..d1c4f5cdcb21d 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.c +++ b/drivers/net/wireless/realtek/rtw88/mac.c @@ -783,7 +783,8 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev, if (!check_firmware_size(data, size)) return -EINVAL; - if (!ltecoex_read_reg(rtwdev, 0x38, <ecoex_bckp)) + if (rtwdev->chip->ltecoex_addr && + !ltecoex_read_reg(rtwdev, 0x38, <ecoex_bckp)) return -EBUSY; wlan_cpu_enable(rtwdev, false); @@ -801,7 +802,8 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev, wlan_cpu_enable(rtwdev, true); - if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) { + if (rtwdev->chip->ltecoex_addr && + !ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) { ret = -EBUSY; goto dlfw_fail; } -- GitLab From 2eb2cfca35801ad7274102cfc2e2ef4bb4b72abb Mon Sep 17 00:00:00 2001 From: Ching-Te Ku Date: Wed, 5 Feb 2025 09:32:31 +0800 Subject: [PATCH 0431/2211] wifi: rtw89: coex: Assign value over than 0 to avoid firmware timer hang [ Upstream commit 2e4c4717b3f6f019c71af984564b6e4d0ae8d0bd ] If the slot duration is 0, the firmware timer will trigger timer hang at the timer initializing state in a low rate due to hardware algorithm. Signed-off-by: Ching-Te Ku Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250205013233.10945-2-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/coex.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw89/coex.c b/drivers/net/wireless/realtek/rtw89/coex.c index 8d54d71fcf539..5f878f086f7cf 100644 --- a/drivers/net/wireless/realtek/rtw89/coex.c +++ b/drivers/net/wireless/realtek/rtw89/coex.c @@ -89,10 +89,10 @@ static const struct rtw89_btc_fbtc_slot s_def[] = { [CXST_B4] = __DEF_FBTC_SLOT(50, 0xe5555555, SLOT_MIX), [CXST_LK] = __DEF_FBTC_SLOT(20, 0xea5a5a5a, SLOT_ISO), [CXST_BLK] = __DEF_FBTC_SLOT(500, 0x55555555, SLOT_MIX), - [CXST_E2G] = __DEF_FBTC_SLOT(0, 0xea5a5a5a, SLOT_MIX), - [CXST_E5G] = __DEF_FBTC_SLOT(0, 0xffffffff, SLOT_ISO), + [CXST_E2G] = __DEF_FBTC_SLOT(5, 0xea5a5a5a, SLOT_MIX), + [CXST_E5G] = __DEF_FBTC_SLOT(5, 0xffffffff, SLOT_ISO), [CXST_EBT] = __DEF_FBTC_SLOT(5, 0xe5555555, SLOT_MIX), - [CXST_ENULL] = __DEF_FBTC_SLOT(0, 0xaaaaaaaa, SLOT_ISO), + [CXST_ENULL] = __DEF_FBTC_SLOT(5, 0xaaaaaaaa, SLOT_ISO), [CXST_WLK] = __DEF_FBTC_SLOT(250, 0xea5a5a5a, SLOT_MIX), [CXST_W1FDD] = __DEF_FBTC_SLOT(50, 0xffffffff, SLOT_ISO), [CXST_B1FDD] = __DEF_FBTC_SLOT(50, 0xffffdfff, SLOT_ISO), -- GitLab From f4c99c7b710b1e232ddad7448b22cc962af779ae Mon Sep 17 00:00:00 2001 From: Ping-Ke Shih Date: Mon, 3 Feb 2025 15:29:11 +0800 Subject: [PATCH 0432/2211] wifi: rtw89: fw: validate multi-firmware header before getting its size [ Upstream commit 2b8bdc5237014cc61784b3676cbaca5325959f3d ] To access firmware elements appended after multi-firmware, add its size as offset to get start address of firmware elements. +-----+-------+------+---------+--------------+ -- | sig | fw_nr | rsvd | version | reserved | \ +---------------------------------------------+ | fw 0 | cv | type | mp | rsvd | shift | size | rsvd | | +---------------------------------------------+ | fw 1 | cv | type | mp | rsvd | shift | size | rsvd | | +---------------------------------------------+ | fw N-1 | ... | | +=============================================+ | mfw size | fw 0 content | | +=============================================+ | | fw 1 content | | +=============================================+ | | ... | | +=============================================+ | | fw N -1 content | | +=============================================+ --/ | fw element TLV X | +=============================================+ | fw element TLV Y | +=============================================+ | fw element TLV Z | +=============================================+ To avoid Coverity warning when getting mfw size, validate it header ahead. Addresses-Coverity-ID: 1544385 ("Untrusted array index read") Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250203072911.47313-5-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/fw.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c index 9346fe082040c..520dc0bc01956 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.c +++ b/drivers/net/wireless/realtek/rtw89/fw.c @@ -563,12 +563,17 @@ static u32 rtw89_mfw_get_size(struct rtw89_dev *rtwdev) (const struct rtw89_mfw_hdr *)firmware->data; const struct rtw89_mfw_info *mfw_info; u32 size; + int ret; if (mfw_hdr->sig != RTW89_MFW_SIG) { rtw89_warn(rtwdev, "not mfw format\n"); return 0; } + ret = rtw89_mfw_validate_hdr(rtwdev, firmware, mfw_hdr); + if (ret) + return ret; + mfw_info = &mfw_hdr->info[mfw_hdr->fw_nr - 1]; size = le32_to_cpu(mfw_info->shift) + le32_to_cpu(mfw_info->size); -- GitLab From 01edf9255f33dac1bee463c84a3dcb445a4d517c Mon Sep 17 00:00:00 2001 From: Ping-Ke Shih Date: Mon, 3 Feb 2025 15:29:10 +0800 Subject: [PATCH 0433/2211] wifi: rtw89: fw: validate multi-firmware header before accessing [ Upstream commit 1f0efffd597893404aea5c3d4f1bdaa1c61d4434 ] A firmeware file contains multi-firmware with a header to represent contents. The mfw_hdr->fw_nr is to define number of firmware in file. +-----+-------+------+---------+--------------+ | sig | fw_nr | rsvd | version | reserved | +---------------------------------------------+ -- fw 0 | cv | type | mp | rsvd | shift | size | rsvd | \ +---------------------------------------------+ | fw 1 | cv | type | mp | rsvd | shift | size | rsvd | | mfw_hdr->fw_nr +---------------------------------------------+ | fw N-1 | ... | / +=============================================+ -- | fw 0 content | | (pointed by fw0 shift/size) | +=============================================+ To avoid Coverity warning, validate header is in range of firmware size, and also validate the range of actual firmware content is in range. Addresses-Coverity-ID: 1494046 ("Untrusted loop bound") Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250203072911.47313-4-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/fw.c | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c index 520dc0bc01956..e5c90050e7115 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.c +++ b/drivers/net/wireless/realtek/rtw89/fw.c @@ -501,6 +501,30 @@ static int rtw89_fw_hdr_parser(struct rtw89_dev *rtwdev, } } +static int rtw89_mfw_validate_hdr(struct rtw89_dev *rtwdev, + const struct firmware *firmware, + const struct rtw89_mfw_hdr *mfw_hdr) +{ + const void *mfw = firmware->data; + u32 mfw_len = firmware->size; + u8 fw_nr = mfw_hdr->fw_nr; + const void *ptr; + + if (fw_nr == 0) { + rtw89_err(rtwdev, "mfw header has no fw entry\n"); + return -ENOENT; + } + + ptr = &mfw_hdr->info[fw_nr]; + + if (ptr > mfw + mfw_len) { + rtw89_err(rtwdev, "mfw header out of address\n"); + return -EFAULT; + } + + return 0; +} + static int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type, struct rtw89_fw_suit *fw_suit, bool nowarn) @@ -511,6 +535,7 @@ int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type, u32 mfw_len = firmware->size; const struct rtw89_mfw_hdr *mfw_hdr = (const struct rtw89_mfw_hdr *)mfw; const struct rtw89_mfw_info *mfw_info = NULL, *tmp; + int ret; int i; if (mfw_hdr->sig != RTW89_MFW_SIG) { @@ -523,6 +548,10 @@ int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type, return 0; } + ret = rtw89_mfw_validate_hdr(rtwdev, firmware, mfw_hdr); + if (ret) + return ret; + for (i = 0; i < mfw_hdr->fw_nr; i++) { tmp = &mfw_hdr->info[i]; if (tmp->type != type) @@ -552,6 +581,12 @@ int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type, found: fw_suit->data = mfw + le32_to_cpu(mfw_info->shift); fw_suit->size = le32_to_cpu(mfw_info->size); + + if (fw_suit->data + fw_suit->size > mfw + mfw_len) { + rtw89_err(rtwdev, "fw_suit %d out of address\n", type); + return -EFAULT; + } + return 0; } -- GitLab From 2368794c0cf4126d144230cf296a644848b36f32 Mon Sep 17 00:00:00 2001 From: Ping-Ke Shih Date: Mon, 3 Feb 2025 15:29:08 +0800 Subject: [PATCH 0434/2211] wifi: rtw89: call power_on ahead before selecting firmware [ Upstream commit d078f5857a00c06fa0ddee26d3cb722e938e1688 ] Driver selects firmware by hardware version, which normally can be read from registers before selecting firmware. However, certain chips such as RTL8851B, it needs to read hardware version from efuse while doing power_on, but do power_on after selecting firmware in current flow. To resolve this flow problem, move power_on out from rtw89_mac_partial_init(), and call rtw89_mac_pwr_on() separately at proper places to have expected flow. Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250203072911.47313-2-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/core.c | 23 +++++++++++------- drivers/net/wireless/realtek/rtw89/mac.c | 29 ++++++++++++++++------- drivers/net/wireless/realtek/rtw89/mac.h | 1 + 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c index f82a26be6fa82..83b22bd0ce81a 100644 --- a/drivers/net/wireless/realtek/rtw89/core.c +++ b/drivers/net/wireless/realtek/rtw89/core.c @@ -4862,8 +4862,6 @@ static int rtw89_chip_efuse_info_setup(struct rtw89_dev *rtwdev) rtw89_hci_mac_pre_deinit(rtwdev); - rtw89_mac_pwr_off(rtwdev); - return 0; } @@ -4944,36 +4942,45 @@ int rtw89_chip_info_setup(struct rtw89_dev *rtwdev) rtw89_read_chip_ver(rtwdev); + ret = rtw89_mac_pwr_on(rtwdev); + if (ret) { + rtw89_err(rtwdev, "failed to power on\n"); + return ret; + } + ret = rtw89_wait_firmware_completion(rtwdev); if (ret) { rtw89_err(rtwdev, "failed to wait firmware completion\n"); - return ret; + goto out; } ret = rtw89_fw_recognize(rtwdev); if (ret) { rtw89_err(rtwdev, "failed to recognize firmware\n"); - return ret; + goto out; } ret = rtw89_chip_efuse_info_setup(rtwdev); if (ret) - return ret; + goto out; ret = rtw89_fw_recognize_elements(rtwdev); if (ret) { rtw89_err(rtwdev, "failed to recognize firmware elements\n"); - return ret; + goto out; } ret = rtw89_chip_board_info_setup(rtwdev); if (ret) - return ret; + goto out; rtw89_core_setup_rfe_parms(rtwdev); rtwdev->ps_mode = rtw89_update_ps_mode(rtwdev); - return 0; +out: + rtw89_mac_pwr_off(rtwdev); + + return ret; } EXPORT_SYMBOL(rtw89_chip_info_setup); diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c index 04e254bd6b17f..9b09d4b7dea59 100644 --- a/drivers/net/wireless/realtek/rtw89/mac.c +++ b/drivers/net/wireless/realtek/rtw89/mac.c @@ -1491,6 +1491,21 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on) #undef PWR_ACT } +int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev) +{ + int ret; + + ret = rtw89_mac_power_switch(rtwdev, true); + if (ret) { + rtw89_mac_power_switch(rtwdev, false); + ret = rtw89_mac_power_switch(rtwdev, true); + if (ret) + return ret; + } + + return 0; +} + void rtw89_mac_pwr_off(struct rtw89_dev *rtwdev) { rtw89_mac_power_switch(rtwdev, false); @@ -3918,14 +3933,6 @@ int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb) { int ret; - ret = rtw89_mac_power_switch(rtwdev, true); - if (ret) { - rtw89_mac_power_switch(rtwdev, false); - ret = rtw89_mac_power_switch(rtwdev, true); - if (ret) - return ret; - } - rtw89_mac_ctrl_hci_dma_trx(rtwdev, true); if (include_bb) { @@ -3958,6 +3965,10 @@ int rtw89_mac_init(struct rtw89_dev *rtwdev) bool include_bb = !!chip->bbmcu_nr; int ret; + ret = rtw89_mac_pwr_on(rtwdev); + if (ret) + return ret; + ret = rtw89_mac_partial_init(rtwdev, include_bb); if (ret) goto fail; @@ -3989,7 +4000,7 @@ int rtw89_mac_init(struct rtw89_dev *rtwdev) return ret; fail: - rtw89_mac_power_switch(rtwdev, false); + rtw89_mac_pwr_off(rtwdev); return ret; } diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h index 5ba1133b79d64..7974849f41e25 100644 --- a/drivers/net/wireless/realtek/rtw89/mac.h +++ b/drivers/net/wireless/realtek/rtw89/mac.h @@ -1120,6 +1120,7 @@ rtw89_write32_port_set(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_l rtw89_write32_set(rtwdev, reg, bit); } +int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev); void rtw89_mac_pwr_off(struct rtw89_dev *rtwdev); int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb); int rtw89_mac_init(struct rtw89_dev *rtwdev); -- GitLab From b063f36a929a39e17fb5622e10cecf2c5d94c6c3 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Wed, 22 Jan 2025 22:26:12 +0000 Subject: [PATCH 0435/2211] clk: qcom: camcc-sm8250: Use clk_rcg2_shared_ops for some RCGs [ Upstream commit 52b10b591f83dc6d9a1d6c2dc89433470a787ecd ] Update some RCGs on the sm8250 camera clock controller to use clk_rcg2_shared_ops. The shared_ops ensure the RCGs get parked to the XO during clock disable to prevent the clocks from locking up when the GDSC is enabled. These mirror similar fixes for other controllers such as commit e5c359f70e4b ("clk: qcom: camcc: Update the clock ops for the SC7180"). Signed-off-by: Jordan Crouse Reviewed-by: Dmitry Baryshkov Reviewed-by: Bryan O'Donoghue Link: https://lore.kernel.org/r/20250122222612.32351-1-jorcrous@amazon.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/clk/qcom/camcc-sm8250.c | 56 ++++++++++++++++----------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/drivers/clk/qcom/camcc-sm8250.c b/drivers/clk/qcom/camcc-sm8250.c index 34d2f17520dcc..450ddbebd35f2 100644 --- a/drivers/clk/qcom/camcc-sm8250.c +++ b/drivers/clk/qcom/camcc-sm8250.c @@ -411,7 +411,7 @@ static struct clk_rcg2 cam_cc_bps_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -433,7 +433,7 @@ static struct clk_rcg2 cam_cc_camnoc_axi_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -454,7 +454,7 @@ static struct clk_rcg2 cam_cc_cci_0_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -469,7 +469,7 @@ static struct clk_rcg2 cam_cc_cci_1_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -490,7 +490,7 @@ static struct clk_rcg2 cam_cc_cphy_rx_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -511,7 +511,7 @@ static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -526,7 +526,7 @@ static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -556,7 +556,7 @@ static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -571,7 +571,7 @@ static struct clk_rcg2 cam_cc_csi4phytimer_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -586,7 +586,7 @@ static struct clk_rcg2 cam_cc_csi5phytimer_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -611,7 +611,7 @@ static struct clk_rcg2 cam_cc_fast_ahb_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -634,7 +634,7 @@ static struct clk_rcg2 cam_cc_fd_core_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -649,7 +649,7 @@ static struct clk_rcg2 cam_cc_icp_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -673,7 +673,7 @@ static struct clk_rcg2 cam_cc_ife_0_clk_src = { .parent_data = cam_cc_parent_data_2, .num_parents = ARRAY_SIZE(cam_cc_parent_data_2), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -710,7 +710,7 @@ static struct clk_rcg2 cam_cc_ife_0_csid_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -734,7 +734,7 @@ static struct clk_rcg2 cam_cc_ife_1_clk_src = { .parent_data = cam_cc_parent_data_3, .num_parents = ARRAY_SIZE(cam_cc_parent_data_3), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -749,7 +749,7 @@ static struct clk_rcg2 cam_cc_ife_1_csid_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -771,7 +771,7 @@ static struct clk_rcg2 cam_cc_ife_lite_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -786,7 +786,7 @@ static struct clk_rcg2 cam_cc_ife_lite_csid_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -810,7 +810,7 @@ static struct clk_rcg2 cam_cc_ipe_0_clk_src = { .parent_data = cam_cc_parent_data_4, .num_parents = ARRAY_SIZE(cam_cc_parent_data_4), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -825,7 +825,7 @@ static struct clk_rcg2 cam_cc_jpeg_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -847,7 +847,7 @@ static struct clk_rcg2 cam_cc_mclk0_clk_src = { .parent_data = cam_cc_parent_data_1, .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -862,7 +862,7 @@ static struct clk_rcg2 cam_cc_mclk1_clk_src = { .parent_data = cam_cc_parent_data_1, .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -877,7 +877,7 @@ static struct clk_rcg2 cam_cc_mclk2_clk_src = { .parent_data = cam_cc_parent_data_1, .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -892,7 +892,7 @@ static struct clk_rcg2 cam_cc_mclk3_clk_src = { .parent_data = cam_cc_parent_data_1, .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -907,7 +907,7 @@ static struct clk_rcg2 cam_cc_mclk4_clk_src = { .parent_data = cam_cc_parent_data_1, .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -922,7 +922,7 @@ static struct clk_rcg2 cam_cc_mclk5_clk_src = { .parent_data = cam_cc_parent_data_1, .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; @@ -993,7 +993,7 @@ static struct clk_rcg2 cam_cc_slow_ahb_clk_src = { .parent_data = cam_cc_parent_data_0, .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, }; -- GitLab From 247b420fea7988dca0e1287f1d4eb1e0b16b20f1 Mon Sep 17 00:00:00 2001 From: Jakub Kicinski Date: Thu, 6 Feb 2025 14:56:37 -0800 Subject: [PATCH 0436/2211] net: page_pool: avoid false positive warning if NAPI was never added [ Upstream commit c1e00bc4be06cacee6307cedb9b55bbaddb5044d ] We expect NAPI to be in disabled state when page pool is torn down. But it is also legal if the NAPI is completely uninitialized. Reviewed-by: Mina Almasry Link: https://patch.msgid.link/20250206225638.1387810-4-kuba@kernel.org Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/core/dev.h | 12 ++++++++++++ net/core/page_pool.c | 7 ++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/net/core/dev.h b/net/core/dev.h index 2e3bb7669984a..764e0097ccf22 100644 --- a/net/core/dev.h +++ b/net/core/dev.h @@ -148,6 +148,18 @@ void xdp_do_check_flushed(struct napi_struct *napi); static inline void xdp_do_check_flushed(struct napi_struct *napi) { } #endif +/* Best effort check that NAPI is not idle (can't be scheduled to run) */ +static inline void napi_assert_will_not_race(const struct napi_struct *napi) +{ + /* uninitialized instance, can't race */ + if (!napi->poll_list.next) + return; + + /* SCHED bit is set on disabled instances */ + WARN_ON(!test_bit(NAPI_STATE_SCHED, &napi->state)); + WARN_ON(READ_ONCE(napi->list_owner) != -1); +} + void kick_defer_list_purge(struct softnet_data *sd, unsigned int cpu); #define XMIT_RECURSION_LIMIT 8 diff --git a/net/core/page_pool.c b/net/core/page_pool.c index 7b20f6fcb82c0..c8ce069605c42 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -25,6 +25,7 @@ #include +#include "dev.h" #include "mp_dmabuf_devmem.h" #include "netmem_priv.h" #include "page_pool_priv.h" @@ -1108,11 +1109,7 @@ void page_pool_disable_direct_recycling(struct page_pool *pool) if (!pool->p.napi) return; - /* To avoid races with recycling and additional barriers make sure - * pool and NAPI are unlinked when NAPI is disabled. - */ - WARN_ON(!test_bit(NAPI_STATE_SCHED, &pool->p.napi->state)); - WARN_ON(READ_ONCE(pool->p.napi->list_owner) != -1); + napi_assert_will_not_race(pool->p.napi); WRITE_ONCE(pool->p.napi, NULL); } -- GitLab From c4092cb06398fb571a863e59f607fc8a4de6c089 Mon Sep 17 00:00:00 2001 From: Len Brown Date: Thu, 6 Feb 2025 21:46:24 -0600 Subject: [PATCH 0437/2211] tools/power turbostat: Clustered Uncore MHz counters should honor show/hide options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 1c7c7388e6c31f46b26a884d80b45efbad8237b2 ] The clustered uncore frequency counters, UMHz*.* should honor the --show and --hide options. All non-specified counters should be implicityly hidden. But when --show was used, UMHz*.* showed up anyway: $ sudo turbostat -q -S --show Busy% Busy%  UMHz0.0  UMHz1.0  UMHz2.0  UMHz3.0  UMHz4.0 Indeed, there was no string that can be used to explicitly show or hide clustered uncore counters. Even through they are dynamically probed and added, group the clustered UMHz*.* counters with the legacy built-in-counter "UncMHz" for show/hide. turbostat --show Busy% does not show UMHz*.*. turbostat --show UncMHz shows either UncMHz or UMHz*.*, if present turbostat --hide UncMHz hides either UncMHz or UMHz*.*, if present Reported-by: Artem Bityutskiy Signed-off-by: Len Brown Tested-by: Artem Bityutskiy Signed-off-by: Sasha Levin --- tools/power/x86/turbostat/turbostat.8 | 1 + tools/power/x86/turbostat/turbostat.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/tools/power/x86/turbostat/turbostat.8 b/tools/power/x86/turbostat/turbostat.8 index a3cf1d17163ae..e4b00e13302b3 100644 --- a/tools/power/x86/turbostat/turbostat.8 +++ b/tools/power/x86/turbostat/turbostat.8 @@ -199,6 +199,7 @@ The system configuration dump (if --quiet is not used) is followed by statistics \fBUncMHz\fP per-package uncore MHz, instantaneous sample. .PP \fBUMHz1.0\fP per-package uncore MHz for domain=1 and fabric_cluster=0, instantaneous sample. System summary is the average of all packages. +For the "--show" and "--hide" options, use "UncMHz" to operate on all UMHz*.* as a group. .SH TOO MUCH INFORMATION EXAMPLE By default, turbostat dumps all possible information -- a system configuration header, followed by columns for all counters. This is ideal for remote debugging, use the "--out" option to save everything to a text file, and get that file to the expert helping you debug. diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 77ef60980ee58..12424bf08551d 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c @@ -6445,7 +6445,18 @@ static void probe_intel_uncore_frequency_cluster(void) sprintf(path, "%s/current_freq_khz", path_base); sprintf(name_buf, "UMHz%d.%d", domain_id, cluster_id); - add_counter(0, path, name_buf, 0, SCOPE_PACKAGE, COUNTER_K2M, FORMAT_AVERAGE, 0, package_id); + /* + * Once add_couter() is called, that counter is always read + * and reported -- So it is effectively (enabled & present). + * Only call add_counter() here if legacy BIC_UNCORE_MHZ (UncMHz) + * is (enabled). Since we are in this routine, we + * know we will not probe and set (present) the legacy counter. + * + * This allows "--show/--hide UncMHz" to be effective for + * the clustered MHz counters, as a group. + */ + if BIC_IS_ENABLED(BIC_UNCORE_MHZ) + add_counter(0, path, name_buf, 0, SCOPE_PACKAGE, COUNTER_K2M, FORMAT_AVERAGE, 0, package_id); if (quiet) continue; -- GitLab From 85e0e03303390af936323053e9b5a6a16f830e39 Mon Sep 17 00:00:00 2001 From: Depeng Shao Date: Mon, 13 Jan 2025 10:01:28 +0530 Subject: [PATCH 0438/2211] media: qcom: camss: csid: Only add TPG v4l2 ctrl if TPG hardware is available [ Upstream commit 2f1361f862a68063f37362f1beb400e78e289581 ] There is no CSID TPG on some SoCs, so the v4l2 ctrl in CSID driver shouldn't be registered. Checking the supported TPG modes to indicate if the TPG hardware exists or not and only registering v4l2 ctrl for CSID only when the TPG hardware is present. Signed-off-by: Depeng Shao Signed-off-by: Hans Verkuil Signed-off-by: Sasha Levin --- .../media/platform/qcom/camss/camss-csid.c | 60 +++++++++++-------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/drivers/media/platform/qcom/camss/camss-csid.c b/drivers/media/platform/qcom/camss/camss-csid.c index 858db5d4ca75c..e51f2ed3f0315 100644 --- a/drivers/media/platform/qcom/camss/camss-csid.c +++ b/drivers/media/platform/qcom/camss/camss-csid.c @@ -683,11 +683,13 @@ static int csid_set_stream(struct v4l2_subdev *sd, int enable) int ret; if (enable) { - ret = v4l2_ctrl_handler_setup(&csid->ctrls); - if (ret < 0) { - dev_err(csid->camss->dev, - "could not sync v4l2 controls: %d\n", ret); - return ret; + if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED) { + ret = v4l2_ctrl_handler_setup(&csid->ctrls); + if (ret < 0) { + dev_err(csid->camss->dev, + "could not sync v4l2 controls: %d\n", ret); + return ret; + } } if (!csid->testgen.enabled && @@ -761,7 +763,8 @@ static void csid_try_format(struct csid_device *csid, break; case MSM_CSID_PAD_SRC: - if (csid->testgen_mode->cur.val == 0) { + if (csid->testgen.nmodes == CSID_PAYLOAD_MODE_DISABLED || + csid->testgen_mode->cur.val == 0) { /* Test generator is disabled, */ /* keep pad formats in sync */ u32 code = fmt->code; @@ -811,7 +814,8 @@ static int csid_enum_mbus_code(struct v4l2_subdev *sd, code->code = csid->res->formats->formats[code->index].code; } else { - if (csid->testgen_mode->cur.val == 0) { + if (csid->testgen.nmodes == CSID_PAYLOAD_MODE_DISABLED || + csid->testgen_mode->cur.val == 0) { struct v4l2_mbus_framefmt *sink_fmt; sink_fmt = __csid_get_format(csid, sd_state, @@ -1190,7 +1194,8 @@ static int csid_link_setup(struct media_entity *entity, /* If test generator is enabled */ /* do not allow a link from CSIPHY to CSID */ - if (csid->testgen_mode->cur.val != 0) + if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED && + csid->testgen_mode->cur.val != 0) return -EBUSY; sd = media_entity_to_v4l2_subdev(remote->entity); @@ -1283,24 +1288,27 @@ int msm_csid_register_entity(struct csid_device *csid, MSM_CSID_NAME, csid->id); v4l2_set_subdevdata(sd, csid); - ret = v4l2_ctrl_handler_init(&csid->ctrls, 1); - if (ret < 0) { - dev_err(dev, "Failed to init ctrl handler: %d\n", ret); - return ret; - } + if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED) { + ret = v4l2_ctrl_handler_init(&csid->ctrls, 1); + if (ret < 0) { + dev_err(dev, "Failed to init ctrl handler: %d\n", ret); + return ret; + } - csid->testgen_mode = v4l2_ctrl_new_std_menu_items(&csid->ctrls, - &csid_ctrl_ops, V4L2_CID_TEST_PATTERN, - csid->testgen.nmodes, 0, 0, - csid->testgen.modes); + csid->testgen_mode = + v4l2_ctrl_new_std_menu_items(&csid->ctrls, + &csid_ctrl_ops, V4L2_CID_TEST_PATTERN, + csid->testgen.nmodes, 0, 0, + csid->testgen.modes); - if (csid->ctrls.error) { - dev_err(dev, "Failed to init ctrl: %d\n", csid->ctrls.error); - ret = csid->ctrls.error; - goto free_ctrl; - } + if (csid->ctrls.error) { + dev_err(dev, "Failed to init ctrl: %d\n", csid->ctrls.error); + ret = csid->ctrls.error; + goto free_ctrl; + } - csid->subdev.ctrl_handler = &csid->ctrls; + csid->subdev.ctrl_handler = &csid->ctrls; + } ret = csid_init_formats(sd, NULL); if (ret < 0) { @@ -1331,7 +1339,8 @@ int msm_csid_register_entity(struct csid_device *csid, media_cleanup: media_entity_cleanup(&sd->entity); free_ctrl: - v4l2_ctrl_handler_free(&csid->ctrls); + if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED) + v4l2_ctrl_handler_free(&csid->ctrls); return ret; } @@ -1344,7 +1353,8 @@ void msm_csid_unregister_entity(struct csid_device *csid) { v4l2_device_unregister_subdev(&csid->subdev); media_entity_cleanup(&csid->subdev.entity); - v4l2_ctrl_handler_free(&csid->ctrls); + if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED) + v4l2_ctrl_handler_free(&csid->ctrls); } inline bool csid_is_lite(struct csid_device *csid) -- GitLab From 91c53b8cd81cea29eb3eb8fa9bca602edafce0c7 Mon Sep 17 00:00:00 2001 From: Depeng Shao Date: Mon, 13 Jan 2025 10:01:27 +0530 Subject: [PATCH 0439/2211] media: qcom: camss: Add default case in vfe_src_pad_code [ Upstream commit 2f4204bb00b32eca3391a468d3b37e87feb96fa9 ] Add a default case in vfe_src_pad_code to get rid of a compile warning if a new hw enum is added. Signed-off-by: Depeng Shao Reviewed-by: Bryan O'Donoghue Signed-off-by: Hans Verkuil Signed-off-by: Sasha Levin --- drivers/media/platform/qcom/camss/camss-vfe.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c index 83c5a36d071fc..8f6b0eccefb48 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe.c +++ b/drivers/media/platform/qcom/camss/camss-vfe.c @@ -398,6 +398,10 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code, return sink_code; } break; + default: + WARN(1, "Unsupported HW version: %x\n", + vfe->camss->res->version); + break; } return 0; } -- GitLab From d2b58a10228a906d46155eb7c15d79f39be25b37 Mon Sep 17 00:00:00 2001 From: Cristian Ciocaltea Date: Tue, 4 Feb 2025 14:40:06 +0200 Subject: [PATCH 0440/2211] drm/rockchip: vop2: Improve display modes handling on RK3588 HDMI0 [ Upstream commit 2c1268e7aad0819f38e56134bbc2095fd95fde1b ] The RK3588 specific implementation is currently quite limited in terms of handling the full range of display modes supported by the connected screens, e.g. 2560x1440@75Hz, 2048x1152@60Hz, 1024x768@60Hz are just a few of them. Additionally, it doesn't cope well with non-integer refresh rates like 59.94, 29.97, 23.98, etc. Make use of HDMI0 PHY PLL as a more accurate DCLK source to handle all display modes up to 4K@60Hz. Tested-by: FUKAUMI Naoki Signed-off-by: Cristian Ciocaltea Signed-off-by: Heiko Stuebner Link: https://patchwork.freedesktop.org/patch/msgid/20250204-vop2-hdmi0-disp-modes-v3-3-d71c6a196e58@collabora.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 34 ++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 2aab2a0956788..5d7df4c3b08c4 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -157,6 +157,7 @@ struct vop2_video_port { struct drm_crtc crtc; struct vop2 *vop2; struct clk *dclk; + struct clk *dclk_src; unsigned int id; const struct vop2_video_port_data *data; @@ -211,6 +212,7 @@ struct vop2 { struct clk *hclk; struct clk *aclk; struct clk *pclk; + struct clk *pll_hdmiphy0; /* optional internal rgb encoder */ struct rockchip_rgb *rgb; @@ -219,6 +221,8 @@ struct vop2 { struct vop2_win win[]; }; +#define VOP2_MAX_DCLK_RATE 600000000 + #define vop2_output_if_is_hdmi(x) ((x) == ROCKCHIP_VOP2_EP_HDMI0 || \ (x) == ROCKCHIP_VOP2_EP_HDMI1) @@ -1051,6 +1055,9 @@ static void vop2_crtc_atomic_disable(struct drm_crtc *crtc, vop2_crtc_disable_irq(vp, VP_INT_DSP_HOLD_VALID); + if (vp->dclk_src) + clk_set_parent(vp->dclk, vp->dclk_src); + clk_disable_unprepare(vp->dclk); vop2->enable_count--; @@ -2071,6 +2078,27 @@ static void vop2_crtc_atomic_enable(struct drm_crtc *crtc, vop2_vp_write(vp, RK3568_VP_MIPI_CTRL, 0); + /* + * Switch to HDMI PHY PLL as DCLK source for display modes up + * to 4K@60Hz, if available, otherwise keep using the system CRU. + */ + if (vop2->pll_hdmiphy0 && clock <= VOP2_MAX_DCLK_RATE) { + drm_for_each_encoder_mask(encoder, crtc->dev, crtc_state->encoder_mask) { + struct rockchip_encoder *rkencoder = to_rockchip_encoder(encoder); + + if (rkencoder->crtc_endpoint_id == ROCKCHIP_VOP2_EP_HDMI0) { + if (!vp->dclk_src) + vp->dclk_src = clk_get_parent(vp->dclk); + + ret = clk_set_parent(vp->dclk, vop2->pll_hdmiphy0); + if (ret < 0) + drm_warn(vop2->drm, + "Could not switch to HDMI0 PHY PLL: %d\n", ret); + break; + } + } + } + clk_set_rate(vp->dclk, clock); vop2_post_config(crtc); @@ -3242,6 +3270,12 @@ static int vop2_bind(struct device *dev, struct device *master, void *data) return PTR_ERR(vop2->pclk); } + vop2->pll_hdmiphy0 = devm_clk_get_optional(vop2->dev, "pll_hdmiphy0"); + if (IS_ERR(vop2->pll_hdmiphy0)) { + drm_err(vop2->drm, "failed to get pll_hdmiphy0\n"); + return PTR_ERR(vop2->pll_hdmiphy0); + } + vop2->irq = platform_get_irq(pdev, 0); if (vop2->irq < 0) { drm_err(vop2->drm, "cannot find irq for vop2\n"); -- GitLab From 37c07516ac6a527ef1e577eb69cbad6028f74ce5 Mon Sep 17 00:00:00 2001 From: Alexander Duyck Date: Mon, 3 Feb 2025 17:00:38 -0800 Subject: [PATCH 0441/2211] eth: fbnic: set IFF_UNICAST_FLT to avoid enabling promiscuous mode when adding unicast addrs [ Upstream commit 09717c28b76c30b1dc8c261c855ffb2406abab2e ] I realized when we were adding unicast addresses we were enabling promiscuous mode. I did a bit of digging and realized we had overlooked setting the driver private flag to indicate we supported unicast filtering. Example below shows the table with 00deadbeef01 as the main NIC address, and 5 additional addresses in the 00deadbeefX0 format. # cat $dbgfs/mac_addr Idx S TCAM Bitmap Addr/Mask ---------------------------------- 00 0 00000000,00000000 000000000000 000000000000 01 0 00000000,00000000 000000000000 000000000000 02 0 00000000,00000000 000000000000 000000000000 ... 24 0 00000000,00000000 000000000000 000000000000 25 1 00100000,00000000 00deadbeef50 000000000000 26 1 00100000,00000000 00deadbeef40 000000000000 27 1 00100000,00000000 00deadbeef30 000000000000 28 1 00100000,00000000 00deadbeef20 000000000000 29 1 00100000,00000000 00deadbeef10 000000000000 30 1 00100000,00000000 00deadbeef01 000000000000 31 0 00000000,00000000 000000000000 000000000000 Before rule 31 would be active. With this change it correctly sticks to just the unicast filters. Signed-off-by: Alexander Duyck Signed-off-by: Jakub Kicinski Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250204010038.1404268-2-kuba@kernel.org Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/meta/fbnic/fbnic_netdev.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c index a400616a24d41..79e94632533c8 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c @@ -544,6 +544,8 @@ struct net_device *fbnic_netdev_alloc(struct fbnic_dev *fbd) fbnic_rss_key_fill(fbn->rss_key); fbnic_rss_init_en_mask(fbn); + netdev->priv_flags |= IFF_UNICAST_FLT; + netdev->features |= NETIF_F_RXHASH | NETIF_F_SG | -- GitLab From 91526279362d3708117194ad21372ffc8806ba3f Mon Sep 17 00:00:00 2001 From: Jakub Kicinski Date: Mon, 3 Feb 2025 13:55:09 -0800 Subject: [PATCH 0442/2211] tools: ynl-gen: don't output external constants [ Upstream commit 7e8b24e24ac46038e48c9a042e7d9b31855cbca5 ] A definition with a "header" property is an "external" definition for C code, as in it is defined already in another C header file. Other languages will need the exact value but C codegen should not recreate it. So don't output those definitions in the uAPI header. Signed-off-by: Jakub Kicinski Link: https://patch.msgid.link/20250203215510.1288728-1-kuba@kernel.org Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- tools/net/ynl/ynl-gen-c.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/net/ynl/ynl-gen-c.py b/tools/net/ynl/ynl-gen-c.py index 463f1394ab971..c78f1c1bca75c 100755 --- a/tools/net/ynl/ynl-gen-c.py +++ b/tools/net/ynl/ynl-gen-c.py @@ -2417,6 +2417,9 @@ def render_uapi(family, cw): defines = [] for const in family['definitions']: + if const.get('header'): + continue + if const['type'] != 'const': cw.writes_defines(defines) defines = [] -- GitLab From 77818483460b5f95295ab6a3d8b36e4dcf6d4576 Mon Sep 17 00:00:00 2001 From: Andrey Vatoropin Date: Tue, 4 Feb 2025 09:54:08 +0000 Subject: [PATCH 0443/2211] hwmon: (xgene-hwmon) use appropriate type for the latency value [ Upstream commit 8df0f002827e18632dcd986f7546c1abf1953a6f ] The expression PCC_NUM_RETRIES * pcc_chan->latency is currently being evaluated using 32-bit arithmetic. Since a value of type 'u64' is used to store the eventual result, and this result is later sent to the function usecs_to_jiffies with input parameter unsigned int, the current data type is too wide to store the value of ctx->usecs_lat. Change the data type of "usecs_lat" to a more suitable (narrower) type. Found by Linux Verification Center (linuxtesting.org) with SVACE. Signed-off-by: Andrey Vatoropin Link: https://lore.kernel.org/r/20250204095400.95013-1-a.vatoropin@crpt.ru Signed-off-by: Guenter Roeck Signed-off-by: Sasha Levin --- drivers/hwmon/xgene-hwmon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/hwmon/xgene-hwmon.c b/drivers/hwmon/xgene-hwmon.c index 92d82faf237fc..4e05077e4256d 100644 --- a/drivers/hwmon/xgene-hwmon.c +++ b/drivers/hwmon/xgene-hwmon.c @@ -105,7 +105,7 @@ struct xgene_hwmon_dev { phys_addr_t comm_base_addr; void *pcc_comm_addr; - u64 usecs_lat; + unsigned int usecs_lat; }; /* -- GitLab From 1d15319323d84f1653ac7ea8d3684a225dbbf787 Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Thu, 30 Jan 2025 05:06:07 +0000 Subject: [PATCH 0444/2211] f2fs: introduce f2fs_base_attr for global sysfs entries [ Upstream commit 21925ede449e038ed6f9efdfe0e79f15bddc34bc ] In /sys/fs/f2fs/features, there's no f2fs_sb_info, so let's avoid to get the pointer. Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/sysfs.c | 74 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c index d9a44f03e558b..7df638f901a1f 100644 --- a/fs/f2fs/sysfs.c +++ b/fs/f2fs/sysfs.c @@ -61,6 +61,12 @@ struct f2fs_attr { int id; }; +struct f2fs_base_attr { + struct attribute attr; + ssize_t (*show)(struct f2fs_base_attr *a, char *buf); + ssize_t (*store)(struct f2fs_base_attr *a, const char *buf, size_t len); +}; + static ssize_t f2fs_sbi_show(struct f2fs_attr *a, struct f2fs_sb_info *sbi, char *buf); @@ -864,6 +870,25 @@ static void f2fs_sb_release(struct kobject *kobj) complete(&sbi->s_kobj_unregister); } +static ssize_t f2fs_base_attr_show(struct kobject *kobj, + struct attribute *attr, char *buf) +{ + struct f2fs_base_attr *a = container_of(attr, + struct f2fs_base_attr, attr); + + return a->show ? a->show(a, buf) : 0; +} + +static ssize_t f2fs_base_attr_store(struct kobject *kobj, + struct attribute *attr, + const char *buf, size_t len) +{ + struct f2fs_base_attr *a = container_of(attr, + struct f2fs_base_attr, attr); + + return a->store ? a->store(a, buf, len) : 0; +} + /* * Note that there are three feature list entries: * 1) /sys/fs/f2fs/features @@ -882,14 +907,13 @@ static void f2fs_sb_release(struct kobject *kobj) * please add new on-disk feature in this list only. * - ref. F2FS_SB_FEATURE_RO_ATTR() */ -static ssize_t f2fs_feature_show(struct f2fs_attr *a, - struct f2fs_sb_info *sbi, char *buf) +static ssize_t f2fs_feature_show(struct f2fs_base_attr *a, char *buf) { return sysfs_emit(buf, "supported\n"); } #define F2FS_FEATURE_RO_ATTR(_name) \ -static struct f2fs_attr f2fs_attr_##_name = { \ +static struct f2fs_base_attr f2fs_base_attr_##_name = { \ .attr = {.name = __stringify(_name), .mode = 0444 }, \ .show = f2fs_feature_show, \ } @@ -1258,37 +1282,38 @@ static struct attribute *f2fs_attrs[] = { }; ATTRIBUTE_GROUPS(f2fs); +#define BASE_ATTR_LIST(name) (&f2fs_base_attr_##name.attr) static struct attribute *f2fs_feat_attrs[] = { #ifdef CONFIG_FS_ENCRYPTION - ATTR_LIST(encryption), - ATTR_LIST(test_dummy_encryption_v2), + BASE_ATTR_LIST(encryption), + BASE_ATTR_LIST(test_dummy_encryption_v2), #if IS_ENABLED(CONFIG_UNICODE) - ATTR_LIST(encrypted_casefold), + BASE_ATTR_LIST(encrypted_casefold), #endif #endif /* CONFIG_FS_ENCRYPTION */ #ifdef CONFIG_BLK_DEV_ZONED - ATTR_LIST(block_zoned), + BASE_ATTR_LIST(block_zoned), #endif - ATTR_LIST(atomic_write), - ATTR_LIST(extra_attr), - ATTR_LIST(project_quota), - ATTR_LIST(inode_checksum), - ATTR_LIST(flexible_inline_xattr), - ATTR_LIST(quota_ino), - ATTR_LIST(inode_crtime), - ATTR_LIST(lost_found), + BASE_ATTR_LIST(atomic_write), + BASE_ATTR_LIST(extra_attr), + BASE_ATTR_LIST(project_quota), + BASE_ATTR_LIST(inode_checksum), + BASE_ATTR_LIST(flexible_inline_xattr), + BASE_ATTR_LIST(quota_ino), + BASE_ATTR_LIST(inode_crtime), + BASE_ATTR_LIST(lost_found), #ifdef CONFIG_FS_VERITY - ATTR_LIST(verity), + BASE_ATTR_LIST(verity), #endif - ATTR_LIST(sb_checksum), + BASE_ATTR_LIST(sb_checksum), #if IS_ENABLED(CONFIG_UNICODE) - ATTR_LIST(casefold), + BASE_ATTR_LIST(casefold), #endif - ATTR_LIST(readonly), + BASE_ATTR_LIST(readonly), #ifdef CONFIG_F2FS_FS_COMPRESSION - ATTR_LIST(compression), + BASE_ATTR_LIST(compression), #endif - ATTR_LIST(pin_file), + BASE_ATTR_LIST(pin_file), NULL, }; ATTRIBUTE_GROUPS(f2fs_feat); @@ -1362,9 +1387,14 @@ static struct kset f2fs_kset = { .kobj = {.ktype = &f2fs_ktype}, }; +static const struct sysfs_ops f2fs_feat_attr_ops = { + .show = f2fs_base_attr_show, + .store = f2fs_base_attr_store, +}; + static const struct kobj_type f2fs_feat_ktype = { .default_groups = f2fs_feat_groups, - .sysfs_ops = &f2fs_attr_ops, + .sysfs_ops = &f2fs_feat_attr_ops, }; static struct kobject f2fs_feat = { -- GitLab From b82e496531c571caf8a2ef247f51c160bab2162e Mon Sep 17 00:00:00 2001 From: Carolina Jubran Date: Mon, 3 Feb 2025 23:35:16 +0200 Subject: [PATCH 0445/2211] net/mlx5e: Avoid WARN_ON when configuring MQPRIO with HTB offload enabled [ Upstream commit 689805dcc474c2accb5cffbbcea1c06ee4a54570 ] When attempting to enable MQPRIO while HTB offload is already configured, the driver currently returns `-EINVAL` and triggers a `WARN_ON`, leading to an unnecessary call trace. Update the code to handle this case more gracefully by returning `-EOPNOTSUPP` instead, while also providing a helpful user message. Signed-off-by: Carolina Jubran Reviewed-by: Yael Chemla Reviewed-by: Cosmin Ratiu Signed-off-by: Tariq Toukan Reviewed-by: Kalesh AP Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 38055537b12ac..4a2f58a9d7066 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -3759,8 +3759,11 @@ static int mlx5e_setup_tc_mqprio(struct mlx5e_priv *priv, /* MQPRIO is another toplevel qdisc that can't be attached * simultaneously with the offloaded HTB. */ - if (WARN_ON(mlx5e_selq_is_htb_enabled(&priv->selq))) - return -EINVAL; + if (mlx5e_selq_is_htb_enabled(&priv->selq)) { + NL_SET_ERR_MSG_MOD(mqprio->extack, + "MQPRIO cannot be configured when HTB offload is enabled."); + return -EOPNOTSUPP; + } switch (mqprio->mode) { case TC_MQPRIO_MODE_DCB: -- GitLab From 61e931ee145eeab8196e585ff4334870b130b744 Mon Sep 17 00:00:00 2001 From: Dhananjay Ugwekar Date: Thu, 30 Jan 2025 08:52:52 +0000 Subject: [PATCH 0446/2211] cpufreq: amd-pstate: Remove unnecessary driver_lock in set_boost [ Upstream commit db1cafc77aaaf871509da06f4a864e9af6d6791f ] set_boost is a per-policy function call, hence a driver wide lock is unnecessary. Also this mutex_acquire can collide with the mutex_acquire from the mode-switch path in status_store(), which can lead to a deadlock. So, remove it. Signed-off-by: Dhananjay Ugwekar Acked-by: Mario Limonciello Signed-off-by: Viresh Kumar Signed-off-by: Sasha Levin --- drivers/cpufreq/amd-pstate.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c index 9db5354fdb027..7a16d19322286 100644 --- a/drivers/cpufreq/amd-pstate.c +++ b/drivers/cpufreq/amd-pstate.c @@ -696,7 +696,6 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state) pr_err("Boost mode is not supported by this processor or SBIOS\n"); return -EOPNOTSUPP; } - guard(mutex)(&amd_pstate_driver_lock); ret = amd_pstate_cpu_boost_update(policy, state); WRITE_ONCE(cpudata->boost_state, !ret ? state : false); -- GitLab From a6644aeb8ddf196dec5f8e782293c36f065df4d7 Mon Sep 17 00:00:00 2001 From: Ido Schimmel Date: Tue, 4 Feb 2025 16:55:42 +0200 Subject: [PATCH 0447/2211] vxlan: Annotate FDB data races [ Upstream commit f6205f8215f12a96518ac9469ff76294ae7bd612 ] The 'used' and 'updated' fields in the FDB entry structure can be accessed concurrently by multiple threads, leading to reports such as [1]. Can be reproduced using [2]. Suppress these reports by annotating these accesses using READ_ONCE() / WRITE_ONCE(). [1] BUG: KCSAN: data-race in vxlan_xmit / vxlan_xmit write to 0xffff942604d263a8 of 8 bytes by task 286 on cpu 0: vxlan_xmit+0xb29/0x2380 dev_hard_start_xmit+0x84/0x2f0 __dev_queue_xmit+0x45a/0x1650 packet_xmit+0x100/0x150 packet_sendmsg+0x2114/0x2ac0 __sys_sendto+0x318/0x330 __x64_sys_sendto+0x76/0x90 x64_sys_call+0x14e8/0x1c00 do_syscall_64+0x9e/0x1a0 entry_SYSCALL_64_after_hwframe+0x77/0x7f read to 0xffff942604d263a8 of 8 bytes by task 287 on cpu 2: vxlan_xmit+0xadf/0x2380 dev_hard_start_xmit+0x84/0x2f0 __dev_queue_xmit+0x45a/0x1650 packet_xmit+0x100/0x150 packet_sendmsg+0x2114/0x2ac0 __sys_sendto+0x318/0x330 __x64_sys_sendto+0x76/0x90 x64_sys_call+0x14e8/0x1c00 do_syscall_64+0x9e/0x1a0 entry_SYSCALL_64_after_hwframe+0x77/0x7f value changed: 0x00000000fffbac6e -> 0x00000000fffbac6f Reported by Kernel Concurrency Sanitizer on: CPU: 2 UID: 0 PID: 287 Comm: mausezahn Not tainted 6.13.0-rc7-01544-gb4b270f11a02 #5 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-3.fc41 04/01/2014 [2] #!/bin/bash set +H echo whitelist > /sys/kernel/debug/kcsan echo !vxlan_xmit > /sys/kernel/debug/kcsan ip link add name vx0 up type vxlan id 10010 dstport 4789 local 192.0.2.1 bridge fdb add 00:11:22:33:44:55 dev vx0 self static dst 198.51.100.1 taskset -c 0 mausezahn vx0 -a own -b 00:11:22:33:44:55 -c 0 -q & taskset -c 2 mausezahn vx0 -a own -b 00:11:22:33:44:55 -c 0 -q & Reviewed-by: Petr Machata Signed-off-by: Ido Schimmel Reviewed-by: Eric Dumazet Reviewed-by: Nikolay Aleksandrov Link: https://patch.msgid.link/20250204145549.1216254-2-idosch@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/vxlan/vxlan_core.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c index 01f66760e1328..474faccf75fd9 100644 --- a/drivers/net/vxlan/vxlan_core.c +++ b/drivers/net/vxlan/vxlan_core.c @@ -227,9 +227,9 @@ static int vxlan_fdb_info(struct sk_buff *skb, struct vxlan_dev *vxlan, be32_to_cpu(fdb->vni))) goto nla_put_failure; - ci.ndm_used = jiffies_to_clock_t(now - fdb->used); + ci.ndm_used = jiffies_to_clock_t(now - READ_ONCE(fdb->used)); ci.ndm_confirmed = 0; - ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated); + ci.ndm_updated = jiffies_to_clock_t(now - READ_ONCE(fdb->updated)); ci.ndm_refcnt = 0; if (nla_put(skb, NDA_CACHEINFO, sizeof(ci), &ci)) @@ -434,8 +434,8 @@ static struct vxlan_fdb *vxlan_find_mac(struct vxlan_dev *vxlan, struct vxlan_fdb *f; f = __vxlan_find_mac(vxlan, mac, vni); - if (f && f->used != jiffies) - f->used = jiffies; + if (f && READ_ONCE(f->used) != jiffies) + WRITE_ONCE(f->used, jiffies); return f; } @@ -1009,12 +1009,12 @@ static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan, !(f->flags & NTF_VXLAN_ADDED_BY_USER)) { if (f->state != state) { f->state = state; - f->updated = jiffies; + WRITE_ONCE(f->updated, jiffies); notify = 1; } if (f->flags != fdb_flags) { f->flags = fdb_flags; - f->updated = jiffies; + WRITE_ONCE(f->updated, jiffies); notify = 1; } } @@ -1048,7 +1048,7 @@ static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan, } if (ndm_flags & NTF_USE) - f->used = jiffies; + WRITE_ONCE(f->used, jiffies); if (notify) { if (rd == NULL) @@ -1477,7 +1477,7 @@ static bool vxlan_snoop(struct net_device *dev, src_mac, &rdst->remote_ip.sa, &src_ip->sa); rdst->remote_ip = *src_ip; - f->updated = jiffies; + WRITE_ONCE(f->updated, jiffies); vxlan_fdb_notify(vxlan, f, rdst, RTM_NEWNEIGH, true, NULL); } else { u32 hash_index = fdb_head_index(vxlan, src_mac, vni); @@ -2825,7 +2825,7 @@ static void vxlan_cleanup(struct timer_list *t) if (f->flags & NTF_EXT_LEARNED) continue; - timeout = f->used + vxlan->cfg.age_interval * HZ; + timeout = READ_ONCE(f->used) + vxlan->cfg.age_interval * HZ; if (time_before_eq(timeout, jiffies)) { netdev_dbg(vxlan->dev, "garbage collect %pM\n", -- GitLab From ded26f9e4cdbec728c6f81850cf7c2191859c03c Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Tue, 4 Feb 2025 22:36:54 +0100 Subject: [PATCH 0448/2211] ipv4: ip_gre: Fix set but not used warning in ipgre_err() if IPv4-only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 50f37fc2a39c4a8cc4813629b4cf239b71c6097d ] if CONFIG_NET_IPGRE is enabled, but CONFIG_IPV6 is disabled: net/ipv4/ip_gre.c: In function ‘ipgre_err’: net/ipv4/ip_gre.c:144:22: error: variable ‘data_len’ set but not used [-Werror=unused-but-set-variable] 144 | unsigned int data_len = 0; | ^~~~~~~~ Fix this by moving all data_len processing inside the IPV6-only section that uses its result. Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202501121007.2GofXmh5-lkp@intel.com/ Signed-off-by: Geert Uytterhoeven Reviewed-by: Simon Horman Link: https://patch.msgid.link/d09113cfe2bfaca02f3dddf832fb5f48dd20958b.1738704881.git.geert@linux-m68k.org Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/ipv4/ip_gre.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index f1f31ebfc7934..9667f27740258 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -141,7 +141,6 @@ static int ipgre_err(struct sk_buff *skb, u32 info, const struct iphdr *iph; const int type = icmp_hdr(skb)->type; const int code = icmp_hdr(skb)->code; - unsigned int data_len = 0; struct ip_tunnel *t; if (tpi->proto == htons(ETH_P_TEB)) @@ -182,7 +181,6 @@ static int ipgre_err(struct sk_buff *skb, u32 info, case ICMP_TIME_EXCEEDED: if (code != ICMP_EXC_TTL) return 0; - data_len = icmp_hdr(skb)->un.reserved[1] * 4; /* RFC 4884 4.1 */ break; case ICMP_REDIRECT: @@ -190,10 +188,16 @@ static int ipgre_err(struct sk_buff *skb, u32 info, } #if IS_ENABLED(CONFIG_IPV6) - if (tpi->proto == htons(ETH_P_IPV6) && - !ip6_err_gen_icmpv6_unreach(skb, iph->ihl * 4 + tpi->hdr_len, - type, data_len)) - return 0; + if (tpi->proto == htons(ETH_P_IPV6)) { + unsigned int data_len = 0; + + if (type == ICMP_TIME_EXCEEDED) + data_len = icmp_hdr(skb)->un.reserved[1] * 4; /* RFC 4884 4.1 */ + + if (!ip6_err_gen_icmpv6_unreach(skb, iph->ihl * 4 + tpi->hdr_len, + type, data_len)) + return 0; + } #endif if (t->parms.iph.daddr == 0 || -- GitLab From ba59747562c49974cbace989d76b94a8331da442 Mon Sep 17 00:00:00 2001 From: Heiner Kallweit Date: Tue, 4 Feb 2025 07:58:17 +0100 Subject: [PATCH 0449/2211] r8169: don't scan PHY addresses > 0 [ Upstream commit faac69a4ae5abb49e62c79c66b51bb905c9aa5ec ] The PHY address is a dummy, because r8169 PHY access registers don't support a PHY address. Therefore scan address 0 only. Signed-off-by: Heiner Kallweit Reviewed-by: Andrew Lunn Link: https://patch.msgid.link/830637dd-4016-4a68-92b3-618fcac6589d@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/realtek/r8169_main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c index 3420b6cf8189f..85bb5121cd245 100644 --- a/drivers/net/ethernet/realtek/r8169_main.c +++ b/drivers/net/ethernet/realtek/r8169_main.c @@ -5258,6 +5258,7 @@ static int r8169_mdio_register(struct rtl8169_private *tp) new_bus->priv = tp; new_bus->parent = &pdev->dev; new_bus->irq[0] = PHY_MAC_INTERRUPT; + new_bus->phy_mask = GENMASK(31, 1); snprintf(new_bus->id, MII_BUS_ID_SIZE, "r8169-%x-%x", pci_domain_nr(pdev->bus), pci_dev_id(pdev)); -- GitLab From 76e56dbe508b3b5874ee069a6e50e4f6bc14ecba Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Tue, 4 Feb 2025 14:48:25 +0000 Subject: [PATCH 0450/2211] net: flush_backlog() small changes [ Upstream commit cbe08724c18078564abefbf6591078a7c98e5e0f ] Add READ_ONCE() around reads of skb->dev->reg_state, because this field can be changed from other threads/cpus. Instead of calling dev_kfree_skb_irq() and kfree_skb() while interrupts are masked and locks held, use a temporary list and use __skb_queue_purge_reason() Use SKB_DROP_REASON_DEV_READY drop reason to better describe why these skbs are dropped. Signed-off-by: Eric Dumazet Reviewed-by: Jason Xing Link: https://patch.msgid.link/20250204144825.316785-1-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/core/dev.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/net/core/dev.c b/net/core/dev.c index 7b7b36c43c82c..2ba2160dd093a 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -6034,16 +6034,18 @@ static DEFINE_PER_CPU(struct work_struct, flush_works); static void flush_backlog(struct work_struct *work) { struct sk_buff *skb, *tmp; + struct sk_buff_head list; struct softnet_data *sd; + __skb_queue_head_init(&list); local_bh_disable(); sd = this_cpu_ptr(&softnet_data); backlog_lock_irq_disable(sd); skb_queue_walk_safe(&sd->input_pkt_queue, skb, tmp) { - if (skb->dev->reg_state == NETREG_UNREGISTERING) { + if (READ_ONCE(skb->dev->reg_state) == NETREG_UNREGISTERING) { __skb_unlink(skb, &sd->input_pkt_queue); - dev_kfree_skb_irq(skb); + __skb_queue_tail(&list, skb); rps_input_queue_head_incr(sd); } } @@ -6051,14 +6053,16 @@ static void flush_backlog(struct work_struct *work) local_lock_nested_bh(&softnet_data.process_queue_bh_lock); skb_queue_walk_safe(&sd->process_queue, skb, tmp) { - if (skb->dev->reg_state == NETREG_UNREGISTERING) { + if (READ_ONCE(skb->dev->reg_state) == NETREG_UNREGISTERING) { __skb_unlink(skb, &sd->process_queue); - kfree_skb(skb); + __skb_queue_tail(&list, skb); rps_input_queue_head_incr(sd); } } local_unlock_nested_bh(&softnet_data.process_queue_bh_lock); local_bh_enable(); + + __skb_queue_purge_reason(&list, SKB_DROP_REASON_DEV_READY); } static bool flush_required(int cpu) -- GitLab From 58cdd1ee650b3e3af1b2f5ab3bf95f2005f09f4e Mon Sep 17 00:00:00 2001 From: Petr Machata Date: Tue, 4 Feb 2025 18:37:15 +0100 Subject: [PATCH 0451/2211] bridge: mdb: Allow replace of a host-joined group [ Upstream commit d9e9f6d7b7d0c520bb87f19d2cbc57aeeb2091d5 ] Attempts to replace an MDB group membership of the host itself are currently bounced: # ip link add name br up type bridge vlan_filtering 1 # bridge mdb replace dev br port br grp 239.0.0.1 vid 2 # bridge mdb replace dev br port br grp 239.0.0.1 vid 2 Error: bridge: Group is already joined by host. A similar operation done on a member port would succeed. Ignore the check for replacement of host group memberships as well. The bit of code that this enables is br_multicast_host_join(), which, for already-joined groups only refreshes the MC group expiration timer, which is desirable; and a userspace notification, also desirable. Change a selftest that exercises this code path from expecting a rejection to expecting a pass. The rest of MDB selftests pass without modification. Signed-off-by: Petr Machata Reviewed-by: Ido Schimmel Acked-by: Nikolay Aleksandrov Link: https://patch.msgid.link/e5c5188b9787ae806609e7ca3aa2a0a501b9b5c4.1738685648.git.petrm@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/bridge/br_mdb.c | 2 +- tools/testing/selftests/net/forwarding/bridge_mdb.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c index 1a52a0bca086d..7e1ad229e1330 100644 --- a/net/bridge/br_mdb.c +++ b/net/bridge/br_mdb.c @@ -1040,7 +1040,7 @@ static int br_mdb_add_group(const struct br_mdb_config *cfg, /* host join */ if (!port) { - if (mp->host_joined) { + if (mp->host_joined && !(cfg->nlflags & NLM_F_REPLACE)) { NL_SET_ERR_MSG_MOD(extack, "Group is already joined by host"); return -EEXIST; } diff --git a/tools/testing/selftests/net/forwarding/bridge_mdb.sh b/tools/testing/selftests/net/forwarding/bridge_mdb.sh index d9d587454d207..8c1597ebc2d38 100755 --- a/tools/testing/selftests/net/forwarding/bridge_mdb.sh +++ b/tools/testing/selftests/net/forwarding/bridge_mdb.sh @@ -149,7 +149,7 @@ cfg_test_host_common() check_err $? "Failed to add $name host entry" bridge mdb replace dev br0 port br0 grp $grp $state vid 10 &> /dev/null - check_fail $? "Managed to replace $name host entry" + check_err $? "Failed to replace $name host entry" bridge mdb del dev br0 port br0 grp $grp $state vid 10 bridge mdb get dev br0 grp $grp vid 10 &> /dev/null -- GitLab From 3c8b4657a6d7560c5e3cc9b4d8e259ce82ac0766 Mon Sep 17 00:00:00 2001 From: Michal Swiatkowski Date: Tue, 3 Dec 2024 07:58:17 +0100 Subject: [PATCH 0452/2211] ice: init flow director before RDMA [ Upstream commit d67627e7b53203ca150e54723abbed81a0716286 ] Flow director needs only one MSI-X. Load it before RDMA to save MSI-X for it. Reviewed-by: Jacob Keller Tested-by: Pucha Himasekhar Reddy Signed-off-by: Michal Swiatkowski Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ice/ice_main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index ca707dfcb286e..63d2105fce933 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -5175,11 +5175,12 @@ int ice_load(struct ice_pf *pf) ice_napi_add(vsi); + ice_init_features(pf); + err = ice_init_rdma(pf); if (err) goto err_init_rdma; - ice_init_features(pf); ice_service_task_restart(pf); clear_bit(ICE_DOWN, pf->state); @@ -5187,6 +5188,7 @@ int ice_load(struct ice_pf *pf) return 0; err_init_rdma: + ice_deinit_features(pf); ice_tc_indir_block_unregister(vsi); err_tc_indir_block_register: ice_unregister_netdev(vsi); @@ -5210,8 +5212,8 @@ void ice_unload(struct ice_pf *pf) devl_assert_locked(priv_to_devlink(pf)); - ice_deinit_features(pf); ice_deinit_rdma(pf); + ice_deinit_features(pf); ice_tc_indir_block_unregister(vsi); ice_unregister_netdev(vsi); ice_devlink_destroy_pf_port(pf); -- GitLab From 65daba41f935e8706ded5fc0eda686bcb28c9d0a Mon Sep 17 00:00:00 2001 From: Michal Swiatkowski Date: Tue, 3 Dec 2024 07:58:14 +0100 Subject: [PATCH 0453/2211] ice: treat dyn_allowed only as suggestion [ Upstream commit a8c2d3932c1106af2764cc6869b29bcf3cb5bc47 ] It can be needed to have some MSI-X allocated as static and rest as dynamic. For example on PF VSI. We want to always have minimum one MSI-X on it, because of that it is allocated as a static one, rest can be dynamic if it is supported. Change the ice_get_irq_res() to allow using static entries if they are free even if caller wants dynamic one. Adjust limit values to the new approach. Min and max in limit means the values that are valid, so decrease max and num_static by one. Set vsi::irq_dyn_alloc if dynamic allocation is supported. Reviewed-by: Jacob Keller Reviewed-by: Wojciech Drewek Tested-by: Pucha Himasekhar Reddy Signed-off-by: Michal Swiatkowski Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ice/ice_irq.c | 25 ++++++++++++------------ drivers/net/ethernet/intel/ice/ice_lib.c | 2 ++ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/drivers/net/ethernet/intel/ice/ice_irq.c b/drivers/net/ethernet/intel/ice/ice_irq.c index ad82ff7d19957..09f9c7ba52795 100644 --- a/drivers/net/ethernet/intel/ice/ice_irq.c +++ b/drivers/net/ethernet/intel/ice/ice_irq.c @@ -45,7 +45,7 @@ static void ice_free_irq_res(struct ice_pf *pf, u16 index) /** * ice_get_irq_res - get an interrupt resource * @pf: board private structure - * @dyn_only: force entry to be dynamically allocated + * @dyn_allowed: allow entry to be dynamically allocated * * Allocate new irq entry in the free slot of the tracker. Since xarray * is used, always allocate new entry at the lowest possible index. Set @@ -53,11 +53,12 @@ static void ice_free_irq_res(struct ice_pf *pf, u16 index) * * Returns allocated irq entry or NULL on failure. */ -static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf, bool dyn_only) +static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf, + bool dyn_allowed) { - struct xa_limit limit = { .max = pf->irq_tracker.num_entries, + struct xa_limit limit = { .max = pf->irq_tracker.num_entries - 1, .min = 0 }; - unsigned int num_static = pf->irq_tracker.num_static; + unsigned int num_static = pf->irq_tracker.num_static - 1; struct ice_irq_entry *entry; unsigned int index; int ret; @@ -66,9 +67,9 @@ static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf, bool dyn_only) if (!entry) return NULL; - /* skip preallocated entries if the caller says so */ - if (dyn_only) - limit.min = num_static; + /* only already allocated if the caller says so */ + if (!dyn_allowed) + limit.max = num_static; ret = xa_alloc(&pf->irq_tracker.entries, &index, entry, limit, GFP_KERNEL); @@ -78,7 +79,7 @@ static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf, bool dyn_only) entry = NULL; } else { entry->index = index; - entry->dynamic = index >= num_static; + entry->dynamic = index > num_static; } return entry; @@ -272,7 +273,7 @@ int ice_init_interrupt_scheme(struct ice_pf *pf) /** * ice_alloc_irq - Allocate new interrupt vector * @pf: board private structure - * @dyn_only: force dynamic allocation of the interrupt + * @dyn_allowed: allow dynamic allocation of the interrupt * * Allocate new interrupt vector for a given owner id. * return struct msi_map with interrupt details and track @@ -285,20 +286,20 @@ int ice_init_interrupt_scheme(struct ice_pf *pf) * interrupt will be allocated with pci_msix_alloc_irq_at. * * Some callers may only support dynamically allocated interrupts. - * This is indicated with dyn_only flag. + * This is indicated with dyn_allowed flag. * * On failure, return map with negative .index. The caller * is expected to check returned map index. * */ -struct msi_map ice_alloc_irq(struct ice_pf *pf, bool dyn_only) +struct msi_map ice_alloc_irq(struct ice_pf *pf, bool dyn_allowed) { int sriov_base_vector = pf->sriov_base_vector; struct msi_map map = { .index = -ENOENT }; struct device *dev = ice_pf_to_dev(pf); struct ice_irq_entry *entry; - entry = ice_get_irq_res(pf, dyn_only); + entry = ice_get_irq_res(pf, dyn_allowed); if (!entry) return map; diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c index 121a5ad5c8e10..8961eebe67aa2 100644 --- a/drivers/net/ethernet/intel/ice/ice_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_lib.c @@ -567,6 +567,8 @@ ice_vsi_alloc_def(struct ice_vsi *vsi, struct ice_channel *ch) return -ENOMEM; } + vsi->irq_dyn_alloc = pci_msix_can_alloc_dyn(vsi->back->pdev); + switch (vsi->type) { case ICE_VSI_PF: case ICE_VSI_SF: -- GitLab From 5cdaa970d73a4428531ebdd31934f4f081dd3916 Mon Sep 17 00:00:00 2001 From: Ankur Arora Date: Thu, 12 Dec 2024 20:06:56 -0800 Subject: [PATCH 0454/2211] rcu: handle quiescent states for PREEMPT_RCU=n, PREEMPT_COUNT=y [ Upstream commit 83b28cfe796464ebbde1cf7916c126da6d572685 ] With PREEMPT_RCU=n, cond_resched() provides urgently needed quiescent states for read-side critical sections via rcu_all_qs(). One reason why this was needed: lacking preempt-count, the tick handler has no way of knowing whether it is executing in a read-side critical section or not. With (PREEMPT_LAZY=y, PREEMPT_DYNAMIC=n), we get (PREEMPT_COUNT=y, PREEMPT_RCU=n). In this configuration cond_resched() is a stub and does not provide quiescent states via rcu_all_qs(). (PREEMPT_RCU=y provides this information via rcu_read_unlock() and its nesting counter.) So, use the availability of preempt_count() to report quiescent states in rcu_flavor_sched_clock_irq(). Suggested-by: Paul E. McKenney Reviewed-by: Sebastian Andrzej Siewior Signed-off-by: Ankur Arora Reviewed-by: Frederic Weisbecker Signed-off-by: Paul E. McKenney Signed-off-by: Boqun Feng Signed-off-by: Sasha Levin --- kernel/rcu/tree_plugin.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h index 1c7cbd145d5e3..75ba4d5788c0f 100644 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h @@ -974,13 +974,16 @@ static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp) */ static void rcu_flavor_sched_clock_irq(int user) { - if (user || rcu_is_cpu_rrupt_from_idle()) { + if (user || rcu_is_cpu_rrupt_from_idle() || + (IS_ENABLED(CONFIG_PREEMPT_COUNT) && + (preempt_count() == HARDIRQ_OFFSET))) { /* * Get here if this CPU took its interrupt from user - * mode or from the idle loop, and if this is not a - * nested interrupt. In this case, the CPU is in - * a quiescent state, so note it. + * mode, from the idle loop without this being a nested + * interrupt, or while not holding the task preempt count + * (with PREEMPT_COUNT=y). In this case, the CPU is in a + * quiescent state, so note it. * * No memory barrier is required here because rcu_qs() * references only CPU-local variables that other CPUs -- GitLab From fcabb696743a4ec2e95531a90a2c0aeec2140a36 Mon Sep 17 00:00:00 2001 From: Ankur Arora Date: Thu, 12 Dec 2024 20:06:55 -0800 Subject: [PATCH 0455/2211] rcu: handle unstable rdp in rcu_read_unlock_strict() [ Upstream commit fcf0e25ad4c8d14d2faab4d9a17040f31efce205 ] rcu_read_unlock_strict() can be called with preemption enabled which can make for an unstable rdp and a racy norm value. Fix this by dropping the preempt-count in __rcu_read_unlock() after the call to rcu_read_unlock_strict(), adjusting the preempt-count check appropriately. Suggested-by: Frederic Weisbecker Signed-off-by: Ankur Arora Reviewed-by: Frederic Weisbecker Signed-off-by: Paul E. McKenney Signed-off-by: Boqun Feng Signed-off-by: Sasha Levin --- include/linux/rcupdate.h | 2 +- kernel/rcu/tree_plugin.h | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index bd69ddc102fbc..0844ab3288519 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -95,9 +95,9 @@ static inline void __rcu_read_lock(void) static inline void __rcu_read_unlock(void) { - preempt_enable(); if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD)) rcu_read_unlock_strict(); + preempt_enable(); } static inline int rcu_preempt_depth(void) diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h index 75ba4d5788c0f..304e3405e6ec7 100644 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h @@ -832,8 +832,17 @@ void rcu_read_unlock_strict(void) { struct rcu_data *rdp; - if (irqs_disabled() || preempt_count() || !rcu_state.gp_kthread) + if (irqs_disabled() || in_atomic_preempt_off() || !rcu_state.gp_kthread) return; + + /* + * rcu_report_qs_rdp() can only be invoked with a stable rdp and + * from the local CPU. + * + * The in_atomic_preempt_off() check ensures that we come here holding + * the last preempt_count (which will get dropped once we return to + * __rcu_read_unlock(). + */ rdp = this_cpu_ptr(&rcu_data); rdp->cpu_no_qs.b.norm = false; rcu_report_qs_rdp(rdp); -- GitLab From d402437cde36cce8e34f32a53322b3f60ca292d2 Mon Sep 17 00:00:00 2001 From: Ankur Arora Date: Thu, 12 Dec 2024 20:06:52 -0800 Subject: [PATCH 0456/2211] rcu: fix header guard for rcu_all_qs() [ Upstream commit ad6b5b73ff565e88aca7a7d1286788d80c97ba71 ] rcu_all_qs() is defined for !CONFIG_PREEMPT_RCU but the declaration is conditioned on CONFIG_PREEMPTION. With CONFIG_PREEMPT_LAZY, CONFIG_PREEMPTION=y does not imply CONFIG_PREEMPT_RCU=y. Decouple the two. Cc: Paul E. McKenney Reviewed-by: Frederic Weisbecker Reviewed-by: Sebastian Andrzej Siewior Signed-off-by: Ankur Arora Signed-off-by: Paul E. McKenney Signed-off-by: Boqun Feng Signed-off-by: Sasha Levin --- include/linux/rcutree.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h index 90a684f94776e..ae8b5cb475a36 100644 --- a/include/linux/rcutree.h +++ b/include/linux/rcutree.h @@ -104,7 +104,7 @@ extern int rcu_scheduler_active; void rcu_end_inkernel_boot(void); bool rcu_inkernel_boot_has_ended(void); bool rcu_is_watching(void); -#ifndef CONFIG_PREEMPTION +#ifndef CONFIG_PREEMPT_RCU void rcu_all_qs(void); #endif -- GitLab From 887e39ac4704e2285dc3622e1ea40cd3130199d2 Mon Sep 17 00:00:00 2001 From: "Peter Zijlstra (Intel)" Date: Tue, 21 Jan 2025 07:23:02 -0800 Subject: [PATCH 0457/2211] perf: Avoid the read if the count is already updated [ Upstream commit 8ce939a0fa194939cc1f92dbd8bc1a7806e7d40a ] The event may have been updated in the PMU-specific implementation, e.g., Intel PEBS counters snapshotting. The common code should not read and overwrite the value. The PERF_SAMPLE_READ in the data->sample_type can be used to detect whether the PMU-specific value is available. If yes, avoid the pmu->read() in the common code. Add a new flag, skip_read, to track the case. Factor out a perf_pmu_read() to clean up the code. Signed-off-by: Peter Zijlstra (Intel) Signed-off-by: Kan Liang Signed-off-by: Peter Zijlstra (Intel) Link: https://lkml.kernel.org/r/20250121152303.3128733-3-kan.liang@linux.intel.com Signed-off-by: Sasha Levin --- include/linux/perf_event.h | 8 +++++++- kernel/events/core.c | 33 ++++++++++++++++----------------- kernel/events/ring_buffer.c | 1 + 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 0997077bcc52a..ce64b4b937f06 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -1063,7 +1063,13 @@ struct perf_output_handle { struct perf_buffer *rb; unsigned long wakeup; unsigned long size; - u64 aux_flags; + union { + u64 flags; /* perf_output*() */ + u64 aux_flags; /* perf_aux_output*() */ + struct { + u64 skip_read : 1; + }; + }; union { void *addr; unsigned long head; diff --git a/kernel/events/core.c b/kernel/events/core.c index 19dde12f23b83..285a4548450bd 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -1195,6 +1195,12 @@ static void perf_assert_pmu_disabled(struct pmu *pmu) WARN_ON_ONCE(*this_cpu_ptr(pmu->pmu_disable_count) == 0); } +static inline void perf_pmu_read(struct perf_event *event) +{ + if (event->state == PERF_EVENT_STATE_ACTIVE) + event->pmu->read(event); +} + static void get_ctx(struct perf_event_context *ctx) { refcount_inc(&ctx->refcount); @@ -3482,8 +3488,7 @@ static void __perf_event_sync_stat(struct perf_event *event, * we know the event must be on the current CPU, therefore we * don't need to use it. */ - if (event->state == PERF_EVENT_STATE_ACTIVE) - event->pmu->read(event); + perf_pmu_read(event); perf_event_update_time(event); @@ -4634,15 +4639,8 @@ static void __perf_event_read(void *info) pmu->read(event); - for_each_sibling_event(sub, event) { - if (sub->state == PERF_EVENT_STATE_ACTIVE) { - /* - * Use sibling's PMU rather than @event's since - * sibling could be on different (eg: software) PMU. - */ - sub->pmu->read(sub); - } - } + for_each_sibling_event(sub, event) + perf_pmu_read(sub); data->ret = pmu->commit_txn(pmu); @@ -7408,9 +7406,8 @@ static void perf_output_read_group(struct perf_output_handle *handle, if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) values[n++] = running; - if ((leader != event) && - (leader->state == PERF_EVENT_STATE_ACTIVE)) - leader->pmu->read(leader); + if ((leader != event) && !handle->skip_read) + perf_pmu_read(leader); values[n++] = perf_event_count(leader, self); if (read_format & PERF_FORMAT_ID) @@ -7423,9 +7420,8 @@ static void perf_output_read_group(struct perf_output_handle *handle, for_each_sibling_event(sub, leader) { n = 0; - if ((sub != event) && - (sub->state == PERF_EVENT_STATE_ACTIVE)) - sub->pmu->read(sub); + if ((sub != event) && !handle->skip_read) + perf_pmu_read(sub); values[n++] = perf_event_count(sub, self); if (read_format & PERF_FORMAT_ID) @@ -7484,6 +7480,9 @@ void perf_output_sample(struct perf_output_handle *handle, { u64 sample_type = data->type; + if (data->sample_flags & PERF_SAMPLE_READ) + handle->skip_read = 1; + perf_output_put(handle, *header); if (sample_type & PERF_SAMPLE_IDENTIFIER) diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c index bbfa22c0a1597..6ecbbc57cdfde 100644 --- a/kernel/events/ring_buffer.c +++ b/kernel/events/ring_buffer.c @@ -185,6 +185,7 @@ __perf_output_begin(struct perf_output_handle *handle, handle->rb = rb; handle->event = event; + handle->flags = 0; have_lost = local_read(&rb->lost); if (unlikely(have_lost)) { -- GitLab From e2017f44c6d4aaa4450cf515a4006c2ef7e8c6d1 Mon Sep 17 00:00:00 2001 From: Michal Swiatkowski Date: Tue, 3 Dec 2024 07:58:09 +0100 Subject: [PATCH 0458/2211] ice: count combined queues using Rx/Tx count [ Upstream commit c3a392bdd31adc474f1009ee85c13fdd01fe800d ] Previous implementation assumes that there is 1:1 matching between vectors and queues. It isn't always true. Get minimum value from Rx/Tx queues to determine combined queues number. Reviewed-by: Jacob Keller Tested-by: Pucha Himasekhar Reddy Signed-off-by: Michal Swiatkowski Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ice/ice_ethtool.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c index 7d1feeb317be3..2a2acbeb57221 100644 --- a/drivers/net/ethernet/intel/ice/ice_ethtool.c +++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c @@ -3817,8 +3817,7 @@ static u32 ice_get_combined_cnt(struct ice_vsi *vsi) ice_for_each_q_vector(vsi, q_idx) { struct ice_q_vector *q_vector = vsi->q_vectors[q_idx]; - if (q_vector->rx.rx_ring && q_vector->tx.tx_ring) - combined++; + combined += min(q_vector->num_ring_tx, q_vector->num_ring_rx); } return combined; -- GitLab From 7cc781374e20e8198f388fd0b6a1e2af58d36740 Mon Sep 17 00:00:00 2001 From: Michal Wajdeczko Date: Fri, 31 Jan 2025 16:37:13 +0100 Subject: [PATCH 0459/2211] drm/xe/relay: Don't use GFP_KERNEL for new transactions [ Upstream commit 78d5d1e20d1de9422f013338a0f2311448588ba7 ] VFs use a relay transaction during the resume/reset flow and use of the GFP_KERNEL flag may conflict with the reclaim: -> #0 (fs_reclaim){+.+.}-{0:0}: [ ] __lock_acquire+0x1874/0x2bc0 [ ] lock_acquire+0xd2/0x310 [ ] fs_reclaim_acquire+0xc5/0x100 [ ] mempool_alloc_noprof+0x5c/0x1b0 [ ] __relay_get_transaction+0xdc/0xa10 [xe] [ ] relay_send_to+0x251/0xe50 [xe] [ ] xe_guc_relay_send_to_pf+0x79/0x3a0 [xe] [ ] xe_gt_sriov_vf_connect+0x90/0x4d0 [xe] [ ] xe_uc_init_hw+0x157/0x3b0 [xe] [ ] do_gt_restart+0x1ae/0x650 [xe] [ ] xe_gt_resume+0xb6/0x120 [xe] [ ] xe_pm_runtime_resume+0x15b/0x370 [xe] [ ] xe_pci_runtime_resume+0x73/0x90 [xe] [ ] pci_pm_runtime_resume+0xa0/0x100 [ ] __rpm_callback+0x4d/0x170 [ ] rpm_callback+0x64/0x70 [ ] rpm_resume+0x594/0x790 [ ] __pm_runtime_resume+0x4e/0x90 [ ] xe_pm_runtime_get_ioctl+0x9c/0x160 [xe] Since we have a preallocated pool of relay transactions, which should cover all our normal relay use cases, we may use the GFP_NOWAIT flag when allocating new outgoing transactions. Signed-off-by: Michal Wajdeczko Tested-by: Marcin Bernatowicz Reviewed-by: Marcin Bernatowicz Link: https://patchwork.freedesktop.org/patch/msgid/20250131153713.808-1-michal.wajdeczko@intel.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_guc_relay.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/xe/xe_guc_relay.c b/drivers/gpu/drm/xe/xe_guc_relay.c index ade6162dc2598..0e5b43e1518ea 100644 --- a/drivers/gpu/drm/xe/xe_guc_relay.c +++ b/drivers/gpu/drm/xe/xe_guc_relay.c @@ -224,7 +224,7 @@ __relay_get_transaction(struct xe_guc_relay *relay, bool incoming, u32 remote, u * with CTB lock held which is marked as used in the reclaim path. * Btw, that's one of the reason why we use mempool here! */ - txn = mempool_alloc(&relay->pool, incoming ? GFP_ATOMIC : GFP_KERNEL); + txn = mempool_alloc(&relay->pool, incoming ? GFP_ATOMIC : GFP_NOWAIT); if (!txn) return ERR_PTR(-ENOMEM); -- GitLab From f5ce5628576dd8d7fdce265ee642f1b6d48cfc0b Mon Sep 17 00:00:00 2001 From: Konstantin Taranov Date: Mon, 20 Jan 2025 09:27:14 -0800 Subject: [PATCH 0460/2211] net/mana: fix warning in the writer of client oob [ Upstream commit 5ec7e1c86c441c46a374577bccd9488abea30037 ] Do not warn on missing pad_data when oob is in sgl. Signed-off-by: Konstantin Taranov Link: https://patch.msgid.link/1737394039-28772-9-git-send-email-kotaranov@linux.microsoft.com Reviewed-by: Shiraz Saleem Reviewed-by: Long Li Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/net/ethernet/microsoft/mana/gdma_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/ethernet/microsoft/mana/gdma_main.c index 36802e0a8b570..9bac4083d8a09 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c @@ -1044,7 +1044,7 @@ static u32 mana_gd_write_client_oob(const struct gdma_wqe_request *wqe_req, header->inline_oob_size_div4 = client_oob_size / sizeof(u32); if (oob_in_sgl) { - WARN_ON_ONCE(!pad_data || wqe_req->num_sge < 2); + WARN_ON_ONCE(wqe_req->num_sge < 2); header->client_oob_in_sgl = 1; -- GitLab From c670902775c2000e956c83a39d8bfb3cf8dd6535 Mon Sep 17 00:00:00 2001 From: Justin Tee Date: Thu, 30 Jan 2025 16:05:22 -0800 Subject: [PATCH 0461/2211] scsi: lpfc: Handle duplicate D_IDs in ndlp search-by D_ID routine [ Upstream commit 56c3d809b7b450379162d0b8a70bbe71ab8db706 ] After a port swap between separate fabrics, there may be multiple nodes in the vport's fc_nodes list with the same fabric well known address. Duplication is temporary and eventually resolves itself after dev_loss_tmo expires, but nameserver queries may still occur before dev_loss_tmo. This possibly results in returning stale fabric ndlp objects. Fix by adding an nlp_state check to ensure the ndlp search routine returns the correct newer allocated ndlp fabric object. Signed-off-by: Justin Tee Link: https://lore.kernel.org/r/20250131000524.163662-5-justintee8345@gmail.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/lpfc/lpfc_hbadisc.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 6e8d8a96c54fb..31dcabebc9b6d 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -5622,6 +5622,7 @@ static struct lpfc_nodelist * __lpfc_findnode_did(struct lpfc_vport *vport, uint32_t did) { struct lpfc_nodelist *ndlp; + struct lpfc_nodelist *np = NULL; uint32_t data1; list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { @@ -5636,14 +5637,20 @@ __lpfc_findnode_did(struct lpfc_vport *vport, uint32_t did) ndlp, ndlp->nlp_DID, ndlp->nlp_flag, data1, ndlp->nlp_rpi, ndlp->active_rrqs_xri_bitmap); - return ndlp; + + /* Check for new or potentially stale node */ + if (ndlp->nlp_state != NLP_STE_UNUSED_NODE) + return ndlp; + np = ndlp; } } - /* FIND node did NOT FOUND */ - lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE, - "0932 FIND node did x%x NOT FOUND.\n", did); - return NULL; + if (!np) + /* FIND node did NOT FOUND */ + lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE, + "0932 FIND node did x%x NOT FOUND.\n", did); + + return np; } struct lpfc_nodelist * -- GitLab From 609bc6e9c1869b478c0d7e803a5ff8fe15d291e9 Mon Sep 17 00:00:00 2001 From: Justin Tee Date: Thu, 30 Jan 2025 16:05:21 -0800 Subject: [PATCH 0462/2211] scsi: lpfc: Ignore ndlp rport mismatch in dev_loss_tmo callbk [ Upstream commit 23ed62897746f49f195d819ce6edeb1db27d1b72 ] With repeated port swaps between separate fabrics, there can be multiple registrations for fabric well known address 0xfffffe. This can cause ndlp reference confusion due to the usage of a single ndlp ptr that stores the rport object in fc_rport struct private storage during transport registration. Subsequent registrations update the ndlp->rport field with the newer rport, so when transport layer triggers dev_loss_tmo for the earlier registered rport the ndlp->rport private storage is referencing the newer rport instead of the older rport in dev_loss_tmo callbk. Because the older ndlp->rport object is already cleaned up elsewhere in driver code during the time of fabric swap, check that the rport provided in dev_loss_tmo callbk actually matches the rport stored in the LLDD's ndlp->rport field. Otherwise, skip dev_loss_tmo work on a stale rport. Signed-off-by: Justin Tee Link: https://lore.kernel.org/r/20250131000524.163662-4-justintee8345@gmail.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/lpfc/lpfc_hbadisc.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 31dcabebc9b6d..f2e4237ff3d99 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -227,10 +227,16 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport) if (ndlp->nlp_state == NLP_STE_MAPPED_NODE) return; - /* check for recovered fabric node */ - if (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE && - ndlp->nlp_DID == Fabric_DID) + /* Ignore callback for a mismatched (stale) rport */ + if (ndlp->rport != rport) { + lpfc_vlog_msg(vport, KERN_WARNING, LOG_NODE, + "6788 fc rport mismatch: d_id x%06x ndlp x%px " + "fc rport x%px node rport x%px state x%x " + "refcnt %u\n", + ndlp->nlp_DID, ndlp, rport, ndlp->rport, + ndlp->nlp_state, kref_read(&ndlp->kref)); return; + } if (rport->port_name != wwn_to_u64(ndlp->nlp_portname.u.wwn)) lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, -- GitLab From 1be28b37a6a7b4cfc614caa3cb0ffa2b0cf2fce0 Mon Sep 17 00:00:00 2001 From: Justin Tee Date: Thu, 30 Jan 2025 16:05:20 -0800 Subject: [PATCH 0463/2211] scsi: lpfc: Free phba irq in lpfc_sli4_enable_msi() when pci_irq_vector() fails [ Upstream commit f0842902b383982d1f72c490996aa8fc29a7aa0d ] Fix smatch warning regarding missed calls to free_irq(). Free the phba IRQ in the failed pci_irq_vector cases. lpfc_init.c: lpfc_sli4_enable_msi() warn: 'phba->pcidev->irq' from request_irq() not released. Signed-off-by: Justin Tee Link: https://lore.kernel.org/r/20250131000524.163662-3-justintee8345@gmail.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/lpfc/lpfc_init.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index a3658ef1141b2..50c761991191f 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -13190,6 +13190,7 @@ lpfc_sli4_enable_msi(struct lpfc_hba *phba) eqhdl = lpfc_get_eq_hdl(0); rc = pci_irq_vector(phba->pcidev, 0); if (rc < 0) { + free_irq(phba->pcidev->irq, phba); pci_free_irq_vectors(phba->pcidev); lpfc_printf_log(phba, KERN_WARNING, LOG_INIT, "0496 MSI pci_irq_vec failed (%d)\n", rc); @@ -13270,6 +13271,7 @@ lpfc_sli4_enable_intr(struct lpfc_hba *phba, uint32_t cfg_mode) eqhdl = lpfc_get_eq_hdl(0); retval = pci_irq_vector(phba->pcidev, 0); if (retval < 0) { + free_irq(phba->pcidev->irq, phba); lpfc_printf_log(phba, KERN_WARNING, LOG_INIT, "0502 INTR pci_irq_vec failed (%d)\n", retval); -- GitLab From dbb6efb3d8f34a2f2b4b0cb959ef74499f1794bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20M=C3=A4kisara?= Date: Mon, 20 Jan 2025 21:49:22 +0200 Subject: [PATCH 0464/2211] scsi: st: Restore some drive settings after reset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 7081dc75df79696d8322d01821c28e53416c932c ] Some of the allowed operations put the tape into a known position to continue operation assuming only the tape position has changed. But reset sets partition, density and block size to drive default values. These should be restored to the values before reset. Normally the current block size and density are stored by the drive. If the settings have been changed, the changed values have to be saved by the driver across reset. Signed-off-by: Kai Mäkisara Link: https://lore.kernel.org/r/20250120194925.44432-2-Kai.Makisara@kolumbus.fi Reviewed-by: John Meneghini Tested-by: John Meneghini Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/st.c | 24 +++++++++++++++++++++--- drivers/scsi/st.h | 2 ++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 1cfd7e71dcdde..3e982c166baf9 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -952,7 +952,6 @@ static void reset_state(struct scsi_tape *STp) STp->partition = find_partition(STp); if (STp->partition < 0) STp->partition = 0; - STp->new_partition = STp->partition; } } @@ -2926,14 +2925,17 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon if (cmd_in == MTSETDENSITY) { (STp->buffer)->b_data[4] = arg; STp->density_changed = 1; /* At least we tried ;-) */ + STp->changed_density = arg; } else if (cmd_in == SET_DENS_AND_BLK) (STp->buffer)->b_data[4] = arg >> 24; else (STp->buffer)->b_data[4] = STp->density; if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK) { ltmp = arg & MT_ST_BLKSIZE_MASK; - if (cmd_in == MTSETBLK) + if (cmd_in == MTSETBLK) { STp->blksize_changed = 1; /* At least we tried ;-) */ + STp->changed_blksize = arg; + } } else ltmp = STp->block_size; (STp->buffer)->b_data[9] = (ltmp >> 16); @@ -3634,9 +3636,25 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) retval = (-EIO); goto out; } - reset_state(STp); + reset_state(STp); /* Clears pos_unknown */ /* remove this when the midlevel properly clears was_reset */ STp->device->was_reset = 0; + + /* Fix the device settings after reset, ignore errors */ + if (mtc.mt_op == MTREW || mtc.mt_op == MTSEEK || + mtc.mt_op == MTEOM) { + if (STp->can_partitions) { + /* STp->new_partition contains the + * latest partition set + */ + STp->partition = 0; + switch_partition(STp); + } + if (STp->density_changed) + st_int_ioctl(STp, MTSETDENSITY, STp->changed_density); + if (STp->blksize_changed) + st_int_ioctl(STp, MTSETBLK, STp->changed_blksize); + } } if (mtc.mt_op != MTNOP && mtc.mt_op != MTSETBLK && diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h index 1aaaf5369a40f..6d31b894ee84c 100644 --- a/drivers/scsi/st.h +++ b/drivers/scsi/st.h @@ -165,6 +165,7 @@ struct scsi_tape { unsigned char compression_changed; unsigned char drv_buffer; unsigned char density; + unsigned char changed_density; unsigned char door_locked; unsigned char autorew_dev; /* auto-rewind device */ unsigned char rew_at_close; /* rewind necessary at close */ @@ -172,6 +173,7 @@ struct scsi_tape { unsigned char cleaning_req; /* cleaning requested? */ unsigned char first_tur; /* first TEST UNIT READY */ int block_size; + int changed_blksize; int min_block; int max_block; int recover_count; /* From tape opening */ -- GitLab From b5a1ef646ce135a8d4c12b48fe35de26e7c58b32 Mon Sep 17 00:00:00 2001 From: Avula Sri Charan Date: Fri, 24 Jan 2025 14:30:58 +0530 Subject: [PATCH 0465/2211] wifi: ath12k: Avoid napi_sync() before napi_enable() [ Upstream commit 268c73d470a5790a492a2fc2ded084b909d144f3 ] In case of MHI error a reset work will be queued which will try napi_disable() after napi_synchronize(). As the napi will be only enabled after qmi_firmware_ready event, trying napi_synchronize() before napi_enable() will result in indefinite sleep in case of a firmware crash in QMI init sequence. To avoid this, introduce napi_enabled flag to check if napi is enabled or not before calling napi_synchronize(). Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Signed-off-by: Avula Sri Charan Signed-off-by: Tamizh Chelvam Raja Reviewed-by: Aditya Kumar Singh Link: https://patch.msgid.link/20250124090058.3194299-1-quic_tamizhr@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/core.h | 1 + drivers/net/wireless/ath/ath12k/pci.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/core.h b/drivers/net/wireless/ath/ath12k/core.h index 7f2e9a9b40977..3faf3430effb9 100644 --- a/drivers/net/wireless/ath/ath12k/core.h +++ b/drivers/net/wireless/ath/ath12k/core.h @@ -148,6 +148,7 @@ struct ath12k_ext_irq_grp { u32 num_irq; u32 grp_id; u64 timestamp; + bool napi_enabled; struct napi_struct napi; struct net_device *napi_ndev; }; diff --git a/drivers/net/wireless/ath/ath12k/pci.c b/drivers/net/wireless/ath/ath12k/pci.c index 2ff866e1d7d5b..45d537066345a 100644 --- a/drivers/net/wireless/ath/ath12k/pci.c +++ b/drivers/net/wireless/ath/ath12k/pci.c @@ -481,8 +481,11 @@ static void __ath12k_pci_ext_irq_disable(struct ath12k_base *ab) ath12k_pci_ext_grp_disable(irq_grp); - napi_synchronize(&irq_grp->napi); - napi_disable(&irq_grp->napi); + if (irq_grp->napi_enabled) { + napi_synchronize(&irq_grp->napi); + napi_disable(&irq_grp->napi); + irq_grp->napi_enabled = false; + } } } @@ -1112,7 +1115,11 @@ void ath12k_pci_ext_irq_enable(struct ath12k_base *ab) for (i = 0; i < ATH12K_EXT_IRQ_GRP_NUM_MAX; i++) { struct ath12k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; - napi_enable(&irq_grp->napi); + if (!irq_grp->napi_enabled) { + napi_enable(&irq_grp->napi); + irq_grp->napi_enabled = true; + } + ath12k_pci_ext_grp_enable(irq_grp); } -- GitLab From 9e3eaf7f750e1048cabd0e186fc56abb2bc6d054 Mon Sep 17 00:00:00 2001 From: junan Date: Thu, 28 Nov 2024 10:35:18 +0800 Subject: [PATCH 0466/2211] HID: usbkbd: Fix the bit shift number for LED_KANA [ Upstream commit d73a4bfa2881a6859b384b75a414c33d4898b055 ] Since "LED_KANA" was defined as "0x04", the shift number should be "4". Signed-off-by: junan Signed-off-by: Jiri Kosina Signed-off-by: Sasha Levin --- drivers/hid/usbhid/usbkbd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/hid/usbhid/usbkbd.c b/drivers/hid/usbhid/usbkbd.c index c439ed2f16dbc..af6bc76dbf649 100644 --- a/drivers/hid/usbhid/usbkbd.c +++ b/drivers/hid/usbhid/usbkbd.c @@ -160,7 +160,7 @@ static int usb_kbd_event(struct input_dev *dev, unsigned int type, return -1; spin_lock_irqsave(&kbd->leds_lock, flags); - kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 3) | (!!test_bit(LED_COMPOSE, dev->led) << 3) | + kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 4) | (!!test_bit(LED_COMPOSE, dev->led) << 3) | (!!test_bit(LED_SCROLLL, dev->led) << 2) | (!!test_bit(LED_CAPSL, dev->led) << 1) | (!!test_bit(LED_NUML, dev->led)); -- GitLab From b99c2faf4021596a7ededb92a7224b60ff6cf0bd Mon Sep 17 00:00:00 2001 From: Naman Trivedi Date: Fri, 22 Nov 2024 01:57:12 -0800 Subject: [PATCH 0467/2211] arm64: zynqmp: add clock-output-names property in clock nodes [ Upstream commit 385a59e7f7fb3438466a0712cc14672c708bbd57 ] Add clock-output-names property to clock nodes, so that the resulting clock name do not change when clock node name is changed. Also, replace underscores with hyphens in the clock node names as per dt-schema rule. Signed-off-by: Naman Trivedi Acked-by: Senthil Nathan Thangaraj Link: https://lore.kernel.org/r/20241122095712.1166883-1-naman.trivedimanojbhai@amd.com Signed-off-by: Michal Simek Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/xilinx/zynqmp-clk-ccf.dtsi | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-clk-ccf.dtsi b/arch/arm64/boot/dts/xilinx/zynqmp-clk-ccf.dtsi index 60d1b1acf9a03..385fed8a852af 100644 --- a/arch/arm64/boot/dts/xilinx/zynqmp-clk-ccf.dtsi +++ b/arch/arm64/boot/dts/xilinx/zynqmp-clk-ccf.dtsi @@ -10,39 +10,44 @@ #include / { - pss_ref_clk: pss_ref_clk { + pss_ref_clk: pss-ref-clk { bootph-all; compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <33333333>; + clock-output-names = "pss_ref_clk"; }; - video_clk: video_clk { + video_clk: video-clk { bootph-all; compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <27000000>; + clock-output-names = "video_clk"; }; - pss_alt_ref_clk: pss_alt_ref_clk { + pss_alt_ref_clk: pss-alt-ref-clk { bootph-all; compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <0>; + clock-output-names = "pss_alt_ref_clk"; }; - gt_crx_ref_clk: gt_crx_ref_clk { + gt_crx_ref_clk: gt-crx-ref-clk { bootph-all; compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <108000000>; + clock-output-names = "gt_crx_ref_clk"; }; - aux_ref_clk: aux_ref_clk { + aux_ref_clk: aux-ref-clk { bootph-all; compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <27000000>; + clock-output-names = "aux_ref_clk"; }; }; -- GitLab From 67f7080cb30e5e1f0b38cc2f33c9c86416e42311 Mon Sep 17 00:00:00 2001 From: Cezary Rojewski Date: Mon, 3 Feb 2025 15:10:43 +0100 Subject: [PATCH 0468/2211] ASoC: codecs: pcm3168a: Allow for 24-bit in provider mode [ Upstream commit 7d92a38d67e5d937b64b20aa4fd14451ee1772f3 ] As per codec device specification, 24-bit is allowed in provider mode. Update the code to reflect that. Signed-off-by: Cezary Rojewski Link: https://patch.msgid.link/20250203141051.2361323-4-cezary.rojewski@intel.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/pcm3168a.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sound/soc/codecs/pcm3168a.c b/sound/soc/codecs/pcm3168a.c index fac0617ab95b6..6cbb8d0535b02 100644 --- a/sound/soc/codecs/pcm3168a.c +++ b/sound/soc/codecs/pcm3168a.c @@ -493,9 +493,9 @@ static int pcm3168a_hw_params(struct snd_pcm_substream *substream, } break; case 24: - if (provider_mode || (format == SND_SOC_DAIFMT_DSP_A) || - (format == SND_SOC_DAIFMT_DSP_B)) { - dev_err(component->dev, "24-bit slots not supported in provider mode, or consumer mode using DSP\n"); + if (!provider_mode && ((format == SND_SOC_DAIFMT_DSP_A) || + (format == SND_SOC_DAIFMT_DSP_B))) { + dev_err(component->dev, "24-bit slots not supported in consumer mode using DSP\n"); return -EINVAL; } break; -- GitLab From a3300021d4875391f356d03432635828c9c75522 Mon Sep 17 00:00:00 2001 From: Charles Keepax Date: Tue, 7 Jan 2025 15:44:07 +0000 Subject: [PATCH 0469/2211] ASoC: rt722-sdca: Add some missing readable registers [ Upstream commit f9a5c4b6afc79073491acdab7f1e943ee3a19fbb ] Add a few missing registers from the readable register callback. Suggested-by: Shuming Fan Signed-off-by: Charles Keepax Reviewed-by: Pierre-Louis Bossart Link: https://patch.msgid.link/20250107154408.814455-6-ckeepax@opensource.cirrus.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/rt722-sdca-sdw.c | 49 +++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/sound/soc/codecs/rt722-sdca-sdw.c b/sound/soc/codecs/rt722-sdca-sdw.c index 5449d6b5cf3d1..bf83f4bc94fc1 100644 --- a/sound/soc/codecs/rt722-sdca-sdw.c +++ b/sound/soc/codecs/rt722-sdca-sdw.c @@ -28,9 +28,50 @@ static bool rt722_sdca_readable_register(struct device *dev, unsigned int reg) 0): case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_GE49, RT722_SDCA_CTL_DETECTED_MODE, 0): - case SDW_SDCA_CTL(FUNC_NUM_HID, RT722_SDCA_ENT_HID01, RT722_SDCA_CTL_HIDTX_CURRENT_OWNER, - 0) ... SDW_SDCA_CTL(FUNC_NUM_HID, RT722_SDCA_ENT_HID01, - RT722_SDCA_CTL_HIDTX_MESSAGE_LENGTH, 0): + case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_XU03, RT722_SDCA_CTL_SELECTED_MODE, + 0): + case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU05, + RT722_SDCA_CTL_FU_MUTE, CH_L) ... + SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU05, + RT722_SDCA_CTL_FU_MUTE, CH_R): + case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_XU0D, + RT722_SDCA_CTL_SELECTED_MODE, 0): + case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU0F, + RT722_SDCA_CTL_FU_MUTE, CH_L) ... + SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU0F, + RT722_SDCA_CTL_FU_MUTE, CH_R): + case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_PDE40, + RT722_SDCA_CTL_REQ_POWER_STATE, 0): + case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_PDE12, + RT722_SDCA_CTL_REQ_POWER_STATE, 0): + case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_CS01, + RT722_SDCA_CTL_SAMPLE_FREQ_INDEX, 0): + case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_CS11, + RT722_SDCA_CTL_SAMPLE_FREQ_INDEX, 0): + case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_USER_FU1E, + RT722_SDCA_CTL_FU_MUTE, CH_01) ... + SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_USER_FU1E, + RT722_SDCA_CTL_FU_MUTE, CH_04): + case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_IT26, + RT722_SDCA_CTL_VENDOR_DEF, 0): + case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_PDE2A, + RT722_SDCA_CTL_REQ_POWER_STATE, 0): + case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_CS1F, + RT722_SDCA_CTL_SAMPLE_FREQ_INDEX, 0): + case SDW_SDCA_CTL(FUNC_NUM_HID, RT722_SDCA_ENT_HID01, + RT722_SDCA_CTL_HIDTX_CURRENT_OWNER, 0) ... + SDW_SDCA_CTL(FUNC_NUM_HID, RT722_SDCA_ENT_HID01, + RT722_SDCA_CTL_HIDTX_MESSAGE_LENGTH, 0): + case SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_USER_FU06, + RT722_SDCA_CTL_FU_MUTE, CH_L) ... + SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_USER_FU06, + RT722_SDCA_CTL_FU_MUTE, CH_R): + case SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_OT23, + RT722_SDCA_CTL_VENDOR_DEF, CH_08): + case SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_PDE23, + RT722_SDCA_CTL_REQ_POWER_STATE, 0): + case SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_CS31, + RT722_SDCA_CTL_SAMPLE_FREQ_INDEX, 0): case RT722_BUF_ADDR_HID1 ... RT722_BUF_ADDR_HID2: return true; default: @@ -74,6 +115,7 @@ static bool rt722_sdca_mbq_readable_register(struct device *dev, unsigned int re case 0x5600000 ... 0x5600007: case 0x5700000 ... 0x5700004: case 0x5800000 ... 0x5800004: + case 0x5810000: case 0x5b00003: case 0x5c00011: case 0x5d00006: @@ -81,6 +123,7 @@ static bool rt722_sdca_mbq_readable_register(struct device *dev, unsigned int re case 0x5f00030: case 0x6100000 ... 0x6100051: case 0x6100055 ... 0x6100057: + case 0x6100060: case 0x6100062: case 0x6100064 ... 0x6100065: case 0x6100067: -- GitLab From 0cc2aa747208558c618e5afe06df8362eaf7b9e5 Mon Sep 17 00:00:00 2001 From: Vladimir Kondratiev Date: Wed, 29 Jan 2025 11:16:37 +0200 Subject: [PATCH 0470/2211] irqchip/riscv-aplic: Add support for hart indexes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit b93afe8a3ac53ae52296d65acfaa9c5f582a48cc ] RISC-V APLIC specification defines "hart index" in: https://github.com/riscv/riscv-aia Within a given interrupt domain, each of the domain’s harts has a unique index number in the range 0 to 2^14 − 1 (= 16,383). The index number a domain associates with a hart may or may not have any relationship to the unique hart identifier (“hart ID”) that the RISC-V Privileged Architecture assigns to the hart. Two different interrupt domains may employ entirely different index numbers for the same set of harts. Further, this document says in "4.5 Memory-mapped control region for an interrupt domain": The array of IDC structures may include some for potential hart index numbers that are not actual hart index numbers in the domain. For example, the first IDC structure is always for hart index 0, but 0 is not necessarily a valid index number for any hart in the domain. Support arbitrary hart indices specified in an optional APLIC property "riscv,hart-indexes" which is specified as an array of u32 elements, one per interrupt target. If this property is not specified, fallback to use logical hart indices within the domain. Signed-off-by: Vladimir Kondratiev Signed-off-by: Thomas Gleixner Reviewed-by: Anup Patel Link: https://lore.kernel.org/all/20250129091637.1667279-3-vladimir.kondratiev@mobileye.com Signed-off-by: Sasha Levin --- drivers/irqchip/irq-riscv-aplic-direct.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/drivers/irqchip/irq-riscv-aplic-direct.c b/drivers/irqchip/irq-riscv-aplic-direct.c index 7cd6b646774b9..205ad61d15e49 100644 --- a/drivers/irqchip/irq-riscv-aplic-direct.c +++ b/drivers/irqchip/irq-riscv-aplic-direct.c @@ -31,7 +31,7 @@ struct aplic_direct { }; struct aplic_idc { - unsigned int hart_index; + u32 hart_index; void __iomem *regs; struct aplic_direct *direct; }; @@ -219,6 +219,20 @@ static int aplic_direct_parse_parent_hwirq(struct device *dev, u32 index, return 0; } +static int aplic_direct_get_hart_index(struct device *dev, u32 logical_index, + u32 *hart_index) +{ + const char *prop_hart_index = "riscv,hart-indexes"; + struct device_node *np = to_of_node(dev->fwnode); + + if (!np || !of_property_present(np, prop_hart_index)) { + *hart_index = logical_index; + return 0; + } + + return of_property_read_u32_index(np, prop_hart_index, logical_index, hart_index); +} + int aplic_direct_setup(struct device *dev, void __iomem *regs) { int i, j, rc, cpu, current_cpu, setup_count = 0; @@ -265,8 +279,12 @@ int aplic_direct_setup(struct device *dev, void __iomem *regs) cpumask_set_cpu(cpu, &direct->lmask); idc = per_cpu_ptr(&aplic_idcs, cpu); - idc->hart_index = i; - idc->regs = priv->regs + APLIC_IDC_BASE + i * APLIC_IDC_SIZE; + rc = aplic_direct_get_hart_index(dev, i, &idc->hart_index); + if (rc) { + dev_warn(dev, "hart index not found for IDC%d\n", i); + continue; + } + idc->regs = priv->regs + APLIC_IDC_BASE + idc->hart_index * APLIC_IDC_SIZE; idc->direct = direct; aplic_idc_set_delivery(idc, true); -- GitLab From f8b4edbcf353117acd5f63702d9ea53c820b2365 Mon Sep 17 00:00:00 2001 From: Chung Chung Date: Wed, 29 Jan 2025 18:27:12 -0500 Subject: [PATCH 0471/2211] dm vdo indexer: prevent unterminated string warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit f4e99b846c90163d350c69d6581ac38dd5818eb8 ] Fix array initialization that triggers a warning: error: initializer-string for array of ‘unsigned char’ is too long [-Werror=unterminated-string-initialization] Signed-off-by: Chung Chung Signed-off-by: Matthew Sakai Signed-off-by: Mikulas Patocka Signed-off-by: Sasha Levin --- drivers/md/dm-vdo/indexer/index-layout.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/md/dm-vdo/indexer/index-layout.c b/drivers/md/dm-vdo/indexer/index-layout.c index 627adc24af3b7..053b7845d1f34 100644 --- a/drivers/md/dm-vdo/indexer/index-layout.c +++ b/drivers/md/dm-vdo/indexer/index-layout.c @@ -54,7 +54,6 @@ * Each save also has a unique nonce. */ -#define MAGIC_SIZE 32 #define NONCE_INFO_SIZE 32 #define MAX_SAVES 2 @@ -98,9 +97,11 @@ enum region_type { #define SUPER_VERSION_CURRENT 3 #define SUPER_VERSION_MAXIMUM 7 -static const u8 LAYOUT_MAGIC[MAGIC_SIZE] = "*ALBIREO*SINGLE*FILE*LAYOUT*001*"; +static const u8 LAYOUT_MAGIC[] = "*ALBIREO*SINGLE*FILE*LAYOUT*001*"; static const u64 REGION_MAGIC = 0x416c6252676e3031; /* 'AlbRgn01' */ +#define MAGIC_SIZE (sizeof(LAYOUT_MAGIC) - 1) + struct region_header { u64 magic; u64 region_blocks; -- GitLab From 538a82168e52bdefe98f39ada155cd06a0679fa6 Mon Sep 17 00:00:00 2001 From: Matthew Sakai Date: Wed, 29 Jan 2025 18:26:05 -0500 Subject: [PATCH 0472/2211] dm vdo: use a short static string for thread name prefix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 3280c9313c9adce01550cc9f00edfb1dc7c744da ] Also remove MODULE_NAME and a BUG_ON check, both unneeded. This fixes a warning about string truncation in snprintf that will never happen in practice: drivers/md/dm-vdo/vdo.c: In function ‘vdo_make’: drivers/md/dm-vdo/vdo.c:564:5: error: ‘%s’ directive output may be truncated writing up to 55 bytes into a region of size 16 [-Werror=format-truncation=] "%s%u", MODULE_NAME, instance); ^~ drivers/md/dm-vdo/vdo.c:563:2: note: ‘snprintf’ output between 2 and 66 bytes into a destination of size 16 snprintf(vdo->thread_name_prefix, sizeof(vdo->thread_name_prefix), ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "%s%u", MODULE_NAME, instance); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Reported-by: John Garry Reviewed-by: John Garry Signed-off-by: Matthew Sakai Signed-off-by: Mikulas Patocka Signed-off-by: Sasha Levin --- drivers/md/dm-vdo/vdo.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/drivers/md/dm-vdo/vdo.c b/drivers/md/dm-vdo/vdo.c index fff847767755a..b897f88250d2a 100644 --- a/drivers/md/dm-vdo/vdo.c +++ b/drivers/md/dm-vdo/vdo.c @@ -31,9 +31,7 @@ #include #include -#include #include -#include #include #include #include @@ -142,12 +140,6 @@ static void finish_vdo_request_queue(void *ptr) vdo_unregister_allocating_thread(); } -#ifdef MODULE -#define MODULE_NAME THIS_MODULE->name -#else -#define MODULE_NAME "dm-vdo" -#endif /* MODULE */ - static const struct vdo_work_queue_type default_queue_type = { .start = start_vdo_request_queue, .finish = finish_vdo_request_queue, @@ -559,8 +551,7 @@ int vdo_make(unsigned int instance, struct device_config *config, char **reason, *vdo_ptr = vdo; snprintf(vdo->thread_name_prefix, sizeof(vdo->thread_name_prefix), - "%s%u", MODULE_NAME, instance); - BUG_ON(vdo->thread_name_prefix[0] == '\0'); + "vdo%u", instance); result = vdo_allocate(vdo->thread_config.thread_count, struct vdo_thread, __func__, &vdo->threads); if (result != VDO_SUCCESS) { -- GitLab From c3fd672e6644a30597abcb44fc867723d4ac6f6b Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Fri, 31 Jan 2025 10:21:08 +0100 Subject: [PATCH 0473/2211] drm/ast: Find VBIOS mode from regular display size [ Upstream commit c81202906b5cd56db403e95db3d29c9dfc8c74c1 ] The ast driver looks up supplied display modes from an internal list of display modes supported by the VBIOS. Do not use the crtc_-prefixed display values from struct drm_display_mode for looking up the VBIOS mode. The fields contain raw values that the driver programs to hardware. They are affected by display settings like double-scan or interlace. Instead use the regular vdisplay and hdisplay fields for lookup. As the programmed values can now differ from the values used for lookup, set struct drm_display_mode.crtc_vdisplay and .crtc_hdisplay from the VBIOS mode. Signed-off-by: Thomas Zimmermann Reviewed-by: Jocelyn Falempe Link: https://patchwork.freedesktop.org/patch/msgid/20250131092257.115596-9-tzimmermann@suse.de Signed-off-by: Sasha Levin --- drivers/gpu/drm/ast/ast_mode.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index ed496fb32bf34..24ed1cd3caf17 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c @@ -131,7 +131,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format, return false; } - switch (mode->crtc_hdisplay) { + switch (mode->hdisplay) { case 640: vbios_mode->enh_table = &res_640x480[refresh_rate_index]; break; @@ -145,7 +145,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format, vbios_mode->enh_table = &res_1152x864[refresh_rate_index]; break; case 1280: - if (mode->crtc_vdisplay == 800) + if (mode->vdisplay == 800) vbios_mode->enh_table = &res_1280x800[refresh_rate_index]; else vbios_mode->enh_table = &res_1280x1024[refresh_rate_index]; @@ -157,7 +157,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format, vbios_mode->enh_table = &res_1440x900[refresh_rate_index]; break; case 1600: - if (mode->crtc_vdisplay == 900) + if (mode->vdisplay == 900) vbios_mode->enh_table = &res_1600x900[refresh_rate_index]; else vbios_mode->enh_table = &res_1600x1200[refresh_rate_index]; @@ -166,7 +166,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format, vbios_mode->enh_table = &res_1680x1050[refresh_rate_index]; break; case 1920: - if (mode->crtc_vdisplay == 1080) + if (mode->vdisplay == 1080) vbios_mode->enh_table = &res_1920x1080[refresh_rate_index]; else vbios_mode->enh_table = &res_1920x1200[refresh_rate_index]; @@ -210,6 +210,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format, hborder = (vbios_mode->enh_table->flags & HBorder) ? 8 : 0; vborder = (vbios_mode->enh_table->flags & VBorder) ? 8 : 0; + adjusted_mode->crtc_hdisplay = vbios_mode->enh_table->hde; adjusted_mode->crtc_htotal = vbios_mode->enh_table->ht; adjusted_mode->crtc_hblank_start = vbios_mode->enh_table->hde + hborder; adjusted_mode->crtc_hblank_end = vbios_mode->enh_table->ht - hborder; @@ -219,6 +220,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format, vbios_mode->enh_table->hfp + vbios_mode->enh_table->hsync); + adjusted_mode->crtc_vdisplay = vbios_mode->enh_table->vde; adjusted_mode->crtc_vtotal = vbios_mode->enh_table->vt; adjusted_mode->crtc_vblank_start = vbios_mode->enh_table->vde + vborder; adjusted_mode->crtc_vblank_end = vbios_mode->enh_table->vt - vborder; -- GitLab From c80b2d159c31fa5be7daff9f1572757481e916c9 Mon Sep 17 00:00:00 2001 From: Martin KaFai Lau Date: Mon, 27 Jan 2025 14:27:19 -0800 Subject: [PATCH 0474/2211] bpf: Use kallsyms to find the function name of a struct_ops's stub function [ Upstream commit 12fdd29d5d71d2987a1aec434b704d850a4d7fcb ] In commit 1611603537a4 ("bpf: Create argument information for nullable arguments."), it introduced a "__nullable" tagging at the argument name of a stub function. Some background on the commit: it requires to tag the stub function instead of directly tagging the "ops" of a struct. This is because the btf func_proto of the "ops" does not have the argument name and the "__nullable" is tagged at the argument name. To find the stub function of a "ops", it currently relies on a naming convention on the stub function "st_ops__ops_name". e.g. tcp_congestion_ops__ssthresh. However, the new kernel sub system implementing bpf_struct_ops have missed this and have been surprised that the "__nullable" and the to-be-landed "__ref" tagging was not effective. One option would be to give a warning whenever the stub function does not follow the naming convention, regardless if it requires arg tagging or not. Instead, this patch uses the kallsyms_lookup approach and removes the requirement on the naming convention. The st_ops->cfi_stubs has all the stub function kernel addresses. kallsyms_lookup() is used to lookup the function name. With the function name, BTF can be used to find the BTF func_proto. The existing "__nullable" arg name searching logic will then fall through. One notable change is, if it failed in kallsyms_lookup or it failed in looking up the stub function name from the BTF, the bpf_struct_ops registration will fail. This is different from the previous behavior that it silently ignored the "st_ops__ops_name" function not found error. The "tcp_congestion_ops", "sched_ext_ops", and "hid_bpf_ops" can still be registered successfully after this patch. There is struct_ops_maybe_null selftest to cover the "__nullable" tagging. Other minor changes: 1. Removed the "%s__%s" format from the pr_warn because the naming convention is removed. 2. The existing bpf_struct_ops_supported() is also moved earlier because prepare_arg_info needs to use it to decide if the stub function is NULL before calling the prepare_arg_info. Cc: Tejun Heo Cc: Benjamin Tissoires Cc: Yonghong Song Cc: Amery Hung Signed-off-by: Martin KaFai Lau Reviewed-by: Amery Hung Link: https://lore.kernel.org/r/20250127222719.2544255-1-martin.lau@linux.dev Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- kernel/bpf/bpf_struct_ops.c | 98 +++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 54 deletions(-) diff --git a/kernel/bpf/bpf_struct_ops.c b/kernel/bpf/bpf_struct_ops.c index b70d0eef8a284..477947456371a 100644 --- a/kernel/bpf/bpf_struct_ops.c +++ b/kernel/bpf/bpf_struct_ops.c @@ -147,39 +147,6 @@ void bpf_struct_ops_image_free(void *image) } #define MAYBE_NULL_SUFFIX "__nullable" -#define MAX_STUB_NAME 128 - -/* Return the type info of a stub function, if it exists. - * - * The name of a stub function is made up of the name of the struct_ops and - * the name of the function pointer member, separated by "__". For example, - * if the struct_ops type is named "foo_ops" and the function pointer - * member is named "bar", the stub function name would be "foo_ops__bar". - */ -static const struct btf_type * -find_stub_func_proto(const struct btf *btf, const char *st_op_name, - const char *member_name) -{ - char stub_func_name[MAX_STUB_NAME]; - const struct btf_type *func_type; - s32 btf_id; - int cp; - - cp = snprintf(stub_func_name, MAX_STUB_NAME, "%s__%s", - st_op_name, member_name); - if (cp >= MAX_STUB_NAME) { - pr_warn("Stub function name too long\n"); - return NULL; - } - btf_id = btf_find_by_name_kind(btf, stub_func_name, BTF_KIND_FUNC); - if (btf_id < 0) - return NULL; - func_type = btf_type_by_id(btf, btf_id); - if (!func_type) - return NULL; - - return btf_type_by_id(btf, func_type->type); /* FUNC_PROTO */ -} /* Prepare argument info for every nullable argument of a member of a * struct_ops type. @@ -204,27 +171,42 @@ find_stub_func_proto(const struct btf *btf, const char *st_op_name, static int prepare_arg_info(struct btf *btf, const char *st_ops_name, const char *member_name, - const struct btf_type *func_proto, + const struct btf_type *func_proto, void *stub_func_addr, struct bpf_struct_ops_arg_info *arg_info) { const struct btf_type *stub_func_proto, *pointed_type; const struct btf_param *stub_args, *args; struct bpf_ctx_arg_aux *info, *info_buf; u32 nargs, arg_no, info_cnt = 0; + char ksym[KSYM_SYMBOL_LEN]; + const char *stub_fname; + s32 stub_func_id; u32 arg_btf_id; int offset; - stub_func_proto = find_stub_func_proto(btf, st_ops_name, member_name); - if (!stub_func_proto) - return 0; + stub_fname = kallsyms_lookup((unsigned long)stub_func_addr, NULL, NULL, NULL, ksym); + if (!stub_fname) { + pr_warn("Cannot find the stub function name for the %s in struct %s\n", + member_name, st_ops_name); + return -ENOENT; + } + + stub_func_id = btf_find_by_name_kind(btf, stub_fname, BTF_KIND_FUNC); + if (stub_func_id < 0) { + pr_warn("Cannot find the stub function %s in btf\n", stub_fname); + return -ENOENT; + } + + stub_func_proto = btf_type_by_id(btf, stub_func_id); + stub_func_proto = btf_type_by_id(btf, stub_func_proto->type); /* Check if the number of arguments of the stub function is the same * as the number of arguments of the function pointer. */ nargs = btf_type_vlen(func_proto); if (nargs != btf_type_vlen(stub_func_proto)) { - pr_warn("the number of arguments of the stub function %s__%s does not match the number of arguments of the member %s of struct %s\n", - st_ops_name, member_name, member_name, st_ops_name); + pr_warn("the number of arguments of the stub function %s does not match the number of arguments of the member %s of struct %s\n", + stub_fname, member_name, st_ops_name); return -EINVAL; } @@ -254,21 +236,21 @@ static int prepare_arg_info(struct btf *btf, &arg_btf_id); if (!pointed_type || !btf_type_is_struct(pointed_type)) { - pr_warn("stub function %s__%s has %s tagging to an unsupported type\n", - st_ops_name, member_name, MAYBE_NULL_SUFFIX); + pr_warn("stub function %s has %s tagging to an unsupported type\n", + stub_fname, MAYBE_NULL_SUFFIX); goto err_out; } offset = btf_ctx_arg_offset(btf, func_proto, arg_no); if (offset < 0) { - pr_warn("stub function %s__%s has an invalid trampoline ctx offset for arg#%u\n", - st_ops_name, member_name, arg_no); + pr_warn("stub function %s has an invalid trampoline ctx offset for arg#%u\n", + stub_fname, arg_no); goto err_out; } if (args[arg_no].type != stub_args[arg_no].type) { - pr_warn("arg#%u type in stub function %s__%s does not match with its original func_proto\n", - arg_no, st_ops_name, member_name); + pr_warn("arg#%u type in stub function %s does not match with its original func_proto\n", + arg_no, stub_fname); goto err_out; } @@ -325,6 +307,13 @@ static bool is_module_member(const struct btf *btf, u32 id) return !strcmp(btf_name_by_offset(btf, t->name_off), "module"); } +int bpf_struct_ops_supported(const struct bpf_struct_ops *st_ops, u32 moff) +{ + void *func_ptr = *(void **)(st_ops->cfi_stubs + moff); + + return func_ptr ? 0 : -ENOTSUPP; +} + int bpf_struct_ops_desc_init(struct bpf_struct_ops_desc *st_ops_desc, struct btf *btf, struct bpf_verifier_log *log) @@ -388,7 +377,10 @@ int bpf_struct_ops_desc_init(struct bpf_struct_ops_desc *st_ops_desc, for_each_member(i, t, member) { const struct btf_type *func_proto; + void **stub_func_addr; + u32 moff; + moff = __btf_member_bit_offset(t, member) / 8; mname = btf_name_by_offset(btf, member->name_off); if (!*mname) { pr_warn("anon member in struct %s is not supported\n", @@ -414,7 +406,11 @@ int bpf_struct_ops_desc_init(struct bpf_struct_ops_desc *st_ops_desc, func_proto = btf_type_resolve_func_ptr(btf, member->type, NULL); - if (!func_proto) + + /* The member is not a function pointer or + * the function pointer is not supported. + */ + if (!func_proto || bpf_struct_ops_supported(st_ops, moff)) continue; if (btf_distill_func_proto(log, btf, @@ -426,8 +422,9 @@ int bpf_struct_ops_desc_init(struct bpf_struct_ops_desc *st_ops_desc, goto errout; } + stub_func_addr = *(void **)(st_ops->cfi_stubs + moff); err = prepare_arg_info(btf, st_ops->name, mname, - func_proto, + func_proto, stub_func_addr, arg_info + i); if (err) goto errout; @@ -1153,13 +1150,6 @@ void bpf_struct_ops_put(const void *kdata) bpf_map_put(&st_map->map); } -int bpf_struct_ops_supported(const struct bpf_struct_ops *st_ops, u32 moff) -{ - void *func_ptr = *(void **)(st_ops->cfi_stubs + moff); - - return func_ptr ? 0 : -ENOTSUPP; -} - static bool bpf_struct_ops_valid_to_reg(struct bpf_map *map) { struct bpf_struct_ops_map *st_map = (struct bpf_struct_ops_map *)map; -- GitLab From ff84436446a022072bafc6a8ec30e4d5fa078d09 Mon Sep 17 00:00:00 2001 From: Viktor Malik Date: Wed, 29 Jan 2025 08:18:57 +0100 Subject: [PATCH 0475/2211] bpftool: Fix readlink usage in get_fd_type [ Upstream commit 0053f7d39d491b6138d7c526876d13885cbb65f1 ] The `readlink(path, buf, sizeof(buf))` call reads at most sizeof(buf) bytes and *does not* append null-terminator to buf. With respect to that, fix two pieces in get_fd_type: 1. Change the truncation check to contain sizeof(buf) rather than sizeof(path). 2. Append null-terminator to buf. Reported by Coverity. Signed-off-by: Viktor Malik Signed-off-by: Andrii Nakryiko Reviewed-by: Quentin Monnet Link: https://lore.kernel.org/bpf/20250129071857.75182-1-vmalik@redhat.com Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- tools/bpf/bpftool/common.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c index 9b75639434b81..0a764426d9358 100644 --- a/tools/bpf/bpftool/common.c +++ b/tools/bpf/bpftool/common.c @@ -461,10 +461,11 @@ int get_fd_type(int fd) p_err("can't read link type: %s", strerror(errno)); return -1; } - if (n == sizeof(path)) { + if (n == sizeof(buf)) { p_err("can't read link type: path too long!"); return -1; } + buf[n] = '\0'; if (strstr(buf, "bpf-map")) return BPF_OBJ_MAP; -- GitLab From 46f1c2b508e3309e6f2a121e045f0e11571974c3 Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Fri, 31 Jan 2025 14:18:20 +0000 Subject: [PATCH 0476/2211] firmware: arm_scmi: Relax duplicate name constraint across protocol ids [ Upstream commit 21ee965267bcbdd733be0f35344fa0f0226d7861 ] Currently in scmi_protocol_device_request(), no duplicate scmi device name is allowed across any protocol. However scmi_dev_match_id() first matches the protocol id and then the name. So, there is no strict requirement to keep this scmi device name unique across all the protocols. Relax the constraint on the duplicate name across the protocols and inhibit only within the same protocol id. Message-Id: <20250131141822.514342-1-sudeep.holla@arm.com> Reviewed-by: Dhruva Gole Reviewed-by: Peng Fan Signed-off-by: Sudeep Holla Signed-off-by: Sasha Levin --- drivers/firmware/arm_scmi/bus.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/drivers/firmware/arm_scmi/bus.c b/drivers/firmware/arm_scmi/bus.c index 782c9bec8361c..73a6ab4a224d7 100644 --- a/drivers/firmware/arm_scmi/bus.c +++ b/drivers/firmware/arm_scmi/bus.c @@ -42,7 +42,7 @@ static atomic_t scmi_syspower_registered = ATOMIC_INIT(0); * This helper let an SCMI driver request specific devices identified by the * @id_table to be created for each active SCMI instance. * - * The requested device name MUST NOT be already existent for any protocol; + * The requested device name MUST NOT be already existent for this protocol; * at first the freshly requested @id_table is annotated in the IDR table * @scmi_requested_devices and then the requested device is advertised to any * registered party via the @scmi_requested_devices_nh notification chain. @@ -52,7 +52,6 @@ static atomic_t scmi_syspower_registered = ATOMIC_INIT(0); static int scmi_protocol_device_request(const struct scmi_device_id *id_table) { int ret = 0; - unsigned int id = 0; struct list_head *head, *phead = NULL; struct scmi_requested_dev *rdev; @@ -67,19 +66,13 @@ static int scmi_protocol_device_request(const struct scmi_device_id *id_table) } /* - * Search for the matching protocol rdev list and then search - * of any existent equally named device...fails if any duplicate found. + * Find the matching protocol rdev list and then search of any + * existent equally named device...fails if any duplicate found. */ mutex_lock(&scmi_requested_devices_mtx); - idr_for_each_entry(&scmi_requested_devices, head, id) { - if (!phead) { - /* A list found registered in the IDR is never empty */ - rdev = list_first_entry(head, struct scmi_requested_dev, - node); - if (rdev->id_table->protocol_id == - id_table->protocol_id) - phead = head; - } + phead = idr_find(&scmi_requested_devices, id_table->protocol_id); + if (phead) { + head = phead; list_for_each_entry(rdev, head, node) { if (!strcmp(rdev->id_table->name, id_table->name)) { pr_err("Ignoring duplicate request [%d] %s\n", -- GitLab From e225dbb03af653ff3ab97908e96bcde9882f839d Mon Sep 17 00:00:00 2001 From: Ravi Bangoria Date: Wed, 15 Jan 2025 05:44:33 +0000 Subject: [PATCH 0477/2211] perf/amd/ibs: Fix perf_ibs_op.cnt_mask for CurCnt [ Upstream commit 46dcf85566170d4528b842bf83ffc350d71771fa ] IBS Op uses two counters: MaxCnt and CurCnt. MaxCnt is programmed with the desired sample period. IBS hw generates sample when CurCnt reaches to MaxCnt. The size of these counter used to be 20 bits but later they were extended to 27 bits. The 7 bit extension is indicated by CPUID Fn8000_001B_EAX[6 / OpCntExt]. perf_ibs->cnt_mask variable contains bit masks for MaxCnt and CurCnt. But IBS driver does not set upper 7 bits of CurCnt in cnt_mask even when OpCntExt CPUID bit is set. Fix this. IBS driver uses cnt_mask[CurCnt] bits only while disabling an event. Fortunately, CurCnt bits are not read from MSR while re-enabling the event, instead MaxCnt is programmed with desired period and CurCnt is set to 0. Hence, we did not see any issues so far. Signed-off-by: Ravi Bangoria Signed-off-by: Peter Zijlstra (Intel) Acked-by: Namhyung Kim Link: https://lkml.kernel.org/r/20250115054438.1021-5-ravi.bangoria@amd.com Signed-off-by: Sasha Levin --- arch/x86/events/amd/ibs.c | 3 ++- arch/x86/include/asm/perf_event.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c index c3a2f6f57770a..8f3b5764e139d 100644 --- a/arch/x86/events/amd/ibs.c +++ b/arch/x86/events/amd/ibs.c @@ -1222,7 +1222,8 @@ static __init int perf_ibs_op_init(void) if (ibs_caps & IBS_CAPS_OPCNTEXT) { perf_ibs_op.max_period |= IBS_OP_MAX_CNT_EXT_MASK; perf_ibs_op.config_mask |= IBS_OP_MAX_CNT_EXT_MASK; - perf_ibs_op.cnt_mask |= IBS_OP_MAX_CNT_EXT_MASK; + perf_ibs_op.cnt_mask |= (IBS_OP_MAX_CNT_EXT_MASK | + IBS_OP_CUR_CNT_EXT_MASK); } if (ibs_caps & IBS_CAPS_ZEN4) diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h index 7505bb5d260ab..aa351c4a20eee 100644 --- a/arch/x86/include/asm/perf_event.h +++ b/arch/x86/include/asm/perf_event.h @@ -520,6 +520,7 @@ struct pebs_xmm { */ #define IBS_OP_CUR_CNT (0xFFF80ULL<<32) #define IBS_OP_CUR_CNT_RAND (0x0007FULL<<32) +#define IBS_OP_CUR_CNT_EXT_MASK (0x7FULL<<52) #define IBS_OP_CNT_CTL (1ULL<<19) #define IBS_OP_VAL (1ULL<<18) #define IBS_OP_ENABLE (1ULL<<17) -- GitLab From 3a95341c65e4e80eac8d3221f944d27ea6e9d7c7 Mon Sep 17 00:00:00 2001 From: Ravi Bangoria Date: Wed, 15 Jan 2025 05:44:32 +0000 Subject: [PATCH 0478/2211] perf/amd/ibs: Fix ->config to sample period calculation for OP PMU [ Upstream commit 598bdf4fefff5af4ce6d26d16f7b2a20808fc4cb ] Instead of using standard perf_event_attr->freq=0 and ->sample_period fields, IBS event in 'sample period mode' can also be opened by setting period value directly in perf_event_attr->config in a MaxCnt bit-field format. IBS OP MaxCnt bits are defined as: (high bits) IbsOpCtl[26:20] = IbsOpMaxCnt[26:20] (low bits) IbsOpCtl[15:0] = IbsOpMaxCnt[19:4] Perf event sample period can be derived from MaxCnt bits as: sample_period = (high bits) | ((low_bits) << 4); However, current code just masks MaxCnt bits and shifts all of them, including high bits, which is incorrect. Fix it. Signed-off-by: Ravi Bangoria Signed-off-by: Peter Zijlstra (Intel) Acked-by: Namhyung Kim Link: https://lkml.kernel.org/r/20250115054438.1021-4-ravi.bangoria@amd.com Signed-off-by: Sasha Levin --- arch/x86/events/amd/ibs.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c index 8f3b5764e139d..d34ee6f04f18f 100644 --- a/arch/x86/events/amd/ibs.c +++ b/arch/x86/events/amd/ibs.c @@ -272,7 +272,7 @@ static int perf_ibs_init(struct perf_event *event) { struct hw_perf_event *hwc = &event->hw; struct perf_ibs *perf_ibs; - u64 max_cnt, config; + u64 config; int ret; perf_ibs = get_ibs_pmu(event->attr.type); @@ -309,10 +309,19 @@ static int perf_ibs_init(struct perf_event *event) if (!hwc->sample_period) hwc->sample_period = 0x10; } else { - max_cnt = config & perf_ibs->cnt_mask; + u64 period = 0; + + if (perf_ibs == &perf_ibs_op) { + period = (config & IBS_OP_MAX_CNT) << 4; + if (ibs_caps & IBS_CAPS_OPCNTEXT) + period |= config & IBS_OP_MAX_CNT_EXT_MASK; + } else { + period = (config & IBS_FETCH_MAX_CNT) << 4; + } + config &= ~perf_ibs->cnt_mask; - event->attr.sample_period = max_cnt << 4; - hwc->sample_period = event->attr.sample_period; + event->attr.sample_period = period; + hwc->sample_period = period; } if (!hwc->sample_period) -- GitLab From ff5c6e3d251ea13f28a8e4ba39e8cf2ee003a5d4 Mon Sep 17 00:00:00 2001 From: Lad Prabhakar Date: Mon, 16 Dec 2024 21:02:01 +0000 Subject: [PATCH 0479/2211] clk: renesas: rzg2l-cpg: Refactor Runtime PM clock validation [ Upstream commit f6f73b891bf6beff069fcacc7b4a796e1009bf26 ] Refactor rzg2l_cpg_attach_dev to delegate clock validation for Runtime PM to the updated rzg2l_cpg_is_pm_clk function. Ensure validation of clocks associated with the power domain while excluding external and core clocks. Prevent incorrect Runtime PM management for clocks outside the domain's scope. Update rzg2l_cpg_is_pm_clk to operate on a per-power-domain basis. Verify clkspec.np against the domain's device node, check argument validity, and validate clock type (CPG_MOD). Use the no_pm_mod_clks array to exclude specific clocks from PM management. Signed-off-by: Lad Prabhakar Reviewed-by: Geert Uytterhoeven Link: https://lore.kernel.org/20241216210201.239855-1-prabhakar.mahadev-lad.rj@bp.renesas.com Signed-off-by: Geert Uytterhoeven Signed-off-by: Sasha Levin --- drivers/clk/renesas/rzg2l-cpg.c | 102 +++++++++++++++++--------------- 1 file changed, 54 insertions(+), 48 deletions(-) diff --git a/drivers/clk/renesas/rzg2l-cpg.c b/drivers/clk/renesas/rzg2l-cpg.c index 229f4540b219e..97d42328fa81a 100644 --- a/drivers/clk/renesas/rzg2l-cpg.c +++ b/drivers/clk/renesas/rzg2l-cpg.c @@ -1549,28 +1549,6 @@ static int rzg2l_cpg_reset_controller_register(struct rzg2l_cpg_priv *priv) return devm_reset_controller_register(priv->dev, &priv->rcdev); } -static bool rzg2l_cpg_is_pm_clk(struct rzg2l_cpg_priv *priv, - const struct of_phandle_args *clkspec) -{ - const struct rzg2l_cpg_info *info = priv->info; - unsigned int id; - unsigned int i; - - if (clkspec->args_count != 2) - return false; - - if (clkspec->args[0] != CPG_MOD) - return false; - - id = clkspec->args[1] + info->num_total_core_clks; - for (i = 0; i < info->num_no_pm_mod_clks; i++) { - if (info->no_pm_mod_clks[i] == id) - return false; - } - - return true; -} - /** * struct rzg2l_cpg_pm_domains - RZ/G2L PM domains data structure * @onecell_data: cell data @@ -1595,45 +1573,73 @@ struct rzg2l_cpg_pd { u16 id; }; +static bool rzg2l_cpg_is_pm_clk(struct rzg2l_cpg_pd *pd, + const struct of_phandle_args *clkspec) +{ + if (clkspec->np != pd->genpd.dev.of_node || clkspec->args_count != 2) + return false; + + switch (clkspec->args[0]) { + case CPG_MOD: { + struct rzg2l_cpg_priv *priv = pd->priv; + const struct rzg2l_cpg_info *info = priv->info; + unsigned int id = clkspec->args[1]; + + if (id >= priv->num_mod_clks) + return false; + + id += info->num_total_core_clks; + + for (unsigned int i = 0; i < info->num_no_pm_mod_clks; i++) { + if (info->no_pm_mod_clks[i] == id) + return false; + } + + return true; + } + + case CPG_CORE: + default: + return false; + } +} + static int rzg2l_cpg_attach_dev(struct generic_pm_domain *domain, struct device *dev) { struct rzg2l_cpg_pd *pd = container_of(domain, struct rzg2l_cpg_pd, genpd); - struct rzg2l_cpg_priv *priv = pd->priv; struct device_node *np = dev->of_node; struct of_phandle_args clkspec; bool once = true; struct clk *clk; + unsigned int i; int error; - int i = 0; - - while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i, - &clkspec)) { - if (rzg2l_cpg_is_pm_clk(priv, &clkspec)) { - if (once) { - once = false; - error = pm_clk_create(dev); - if (error) { - of_node_put(clkspec.np); - goto err; - } - } - clk = of_clk_get_from_provider(&clkspec); + + for (i = 0; !of_parse_phandle_with_args(np, "clocks", "#clock-cells", i, &clkspec); i++) { + if (!rzg2l_cpg_is_pm_clk(pd, &clkspec)) { of_node_put(clkspec.np); - if (IS_ERR(clk)) { - error = PTR_ERR(clk); - goto fail_destroy; - } + continue; + } - error = pm_clk_add_clk(dev, clk); + if (once) { + once = false; + error = pm_clk_create(dev); if (error) { - dev_err(dev, "pm_clk_add_clk failed %d\n", - error); - goto fail_put; + of_node_put(clkspec.np); + goto err; } - } else { - of_node_put(clkspec.np); } - i++; + clk = of_clk_get_from_provider(&clkspec); + of_node_put(clkspec.np); + if (IS_ERR(clk)) { + error = PTR_ERR(clk); + goto fail_destroy; + } + + error = pm_clk_add_clk(dev, clk); + if (error) { + dev_err(dev, "pm_clk_add_clk failed %d\n", error); + goto fail_put; + } } return 0; -- GitLab From 0b63d246248f51c211a0626e28f762969343a677 Mon Sep 17 00:00:00 2001 From: Soeren Moch Date: Mon, 27 Jan 2025 20:48:28 +0100 Subject: [PATCH 0480/2211] wifi: rtl8xxxu: retry firmware download on error [ Upstream commit 3d3e28feca7ac8c6cf2a390dbbe1f97e3feb7f36 ] Occasionally there is an EPROTO error during firmware download. This error is converted to EAGAIN in the download function. But nobody tries again and so device probe fails. Implement download retry to fix this. This error was observed (and fix tested) on a tbs2910 board [1] with an embedded RTL8188EU (0bda:8179) device behind a USB hub. [1] arch/arm/boot/dts/nxp/imx/imx6q-tbs2910.dts Signed-off-by: Soeren Moch Acked-by: Ping-Ke Shih Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250127194828.599379-1-smoch@web.de Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtl8xxxu/core.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/realtek/rtl8xxxu/core.c b/drivers/net/wireless/realtek/rtl8xxxu/core.c index 4ce0c05c51291..569856ca677f6 100644 --- a/drivers/net/wireless/realtek/rtl8xxxu/core.c +++ b/drivers/net/wireless/realtek/rtl8xxxu/core.c @@ -860,9 +860,10 @@ rtl8xxxu_writeN(struct rtl8xxxu_priv *priv, u16 addr, u8 *buf, u16 len) return len; write_error: - dev_info(&udev->dev, - "%s: Failed to write block at addr: %04x size: %04x\n", - __func__, addr, blocksize); + if (rtl8xxxu_debug & RTL8XXXU_DEBUG_REG_WRITE) + dev_info(&udev->dev, + "%s: Failed to write block at addr: %04x size: %04x\n", + __func__, addr, blocksize); return -EAGAIN; } @@ -4064,8 +4065,14 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw) */ rtl8xxxu_write16(priv, REG_TRXFF_BNDY + 2, fops->trxff_boundary); - ret = rtl8xxxu_download_firmware(priv); - dev_dbg(dev, "%s: download_firmware %i\n", __func__, ret); + for (int retry = 5; retry >= 0 ; retry--) { + ret = rtl8xxxu_download_firmware(priv); + dev_dbg(dev, "%s: download_firmware %i\n", __func__, ret); + if (ret != -EAGAIN) + break; + if (retry) + dev_dbg(dev, "%s: retry firmware download\n", __func__); + } if (ret) goto exit; ret = rtl8xxxu_start_firmware(priv); -- GitLab From 9e9e9749159087894bcd31fee866ce2d7cb833d3 Mon Sep 17 00:00:00 2001 From: Bitterblue Smith Date: Sun, 26 Jan 2025 16:03:11 +0200 Subject: [PATCH 0481/2211] wifi: rtw88: Don't use static local variable in rtw8822b_set_tx_power_index_by_rate [ Upstream commit 00451eb3bec763f708e7e58326468c1e575e5a66 ] Some users want to plug two identical USB devices at the same time. This static variable could theoretically cause them to use incorrect TX power values. Move the variable to the caller and pass a pointer to it to rtw8822b_set_tx_power_index_by_rate(). Signed-off-by: Bitterblue Smith Acked-by: Ping-Ke Shih Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/8a60f581-0ab5-4d98-a97d-dd83b605008f@gmail.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw88/rtw8822b.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c index 6edb17aea90e0..4a6c0a9266a09 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c @@ -976,11 +976,11 @@ static void rtw8822b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc, } static void -rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs) +rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, + u8 rs, u32 *phy_pwr_idx) { struct rtw_hal *hal = &rtwdev->hal; static const u32 offset_txagc[2] = {0x1d00, 0x1d80}; - static u32 phy_pwr_idx; u8 rate, rate_idx, pwr_index, shift; int j; @@ -988,12 +988,12 @@ rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs) rate = rtw_rate_section[rs][j]; pwr_index = hal->tx_pwr_tbl[path][rate]; shift = rate & 0x3; - phy_pwr_idx |= ((u32)pwr_index << (shift * 8)); + *phy_pwr_idx |= ((u32)pwr_index << (shift * 8)); if (shift == 0x3) { rate_idx = rate & 0xfc; rtw_write32(rtwdev, offset_txagc[path] + rate_idx, - phy_pwr_idx); - phy_pwr_idx = 0; + *phy_pwr_idx); + *phy_pwr_idx = 0; } } } @@ -1001,11 +1001,13 @@ rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs) static void rtw8822b_set_tx_power_index(struct rtw_dev *rtwdev) { struct rtw_hal *hal = &rtwdev->hal; + u32 phy_pwr_idx = 0; int rs, path; for (path = 0; path < hal->rf_path_num; path++) { for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) - rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs); + rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs, + &phy_pwr_idx); } } -- GitLab From c533839e0a48daaba4820c5596735911a230dadc Mon Sep 17 00:00:00 2001 From: Ping-Ke Shih Date: Wed, 22 Jan 2025 14:03:01 +0800 Subject: [PATCH 0482/2211] wifi: rtw89: add wiphy_lock() to work that isn't held wiphy_lock() yet [ Upstream commit ebfc9199df05d37b67f4d1b7ee997193f3d2e7c8 ] To ensure where are protected by driver mutex can also be protected by wiphy_lock(), so afterward we can remove driver mutex safely. Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250122060310.31976-2-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/regd.c | 2 ++ drivers/net/wireless/realtek/rtw89/ser.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw89/regd.c b/drivers/net/wireless/realtek/rtw89/regd.c index bb064a086970b..e8df68818da01 100644 --- a/drivers/net/wireless/realtek/rtw89/regd.c +++ b/drivers/net/wireless/realtek/rtw89/regd.c @@ -695,6 +695,7 @@ void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); struct rtw89_dev *rtwdev = hw->priv; + wiphy_lock(wiphy); mutex_lock(&rtwdev->mutex); rtw89_leave_ps_mode(rtwdev); @@ -712,6 +713,7 @@ void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request exit: mutex_unlock(&rtwdev->mutex); + wiphy_unlock(wiphy); } /* Maximum Transmit Power field (@raw) can be EIRP or PSD. diff --git a/drivers/net/wireless/realtek/rtw89/ser.c b/drivers/net/wireless/realtek/rtw89/ser.c index 7b203bb7f151a..02c2ac12f197a 100644 --- a/drivers/net/wireless/realtek/rtw89/ser.c +++ b/drivers/net/wireless/realtek/rtw89/ser.c @@ -156,9 +156,11 @@ static void ser_state_run(struct rtw89_ser *ser, u8 evt) rtw89_debug(rtwdev, RTW89_DBG_SER, "ser: %s receive %s\n", ser_st_name(ser), ser_ev_name(ser, evt)); + wiphy_lock(rtwdev->hw->wiphy); mutex_lock(&rtwdev->mutex); rtw89_leave_lps(rtwdev); mutex_unlock(&rtwdev->mutex); + wiphy_unlock(rtwdev->hw->wiphy); ser->st_tbl[ser->state].st_func(ser, evt); } @@ -707,9 +709,11 @@ static void ser_l2_reset_st_hdl(struct rtw89_ser *ser, u8 evt) switch (evt) { case SER_EV_STATE_IN: + wiphy_lock(rtwdev->hw->wiphy); mutex_lock(&rtwdev->mutex); ser_l2_reset_st_pre_hdl(ser); mutex_unlock(&rtwdev->mutex); + wiphy_unlock(rtwdev->hw->wiphy); ieee80211_restart_hw(rtwdev->hw); ser_set_alarm(ser, SER_RECFG_TIMEOUT, SER_EV_L2_RECFG_TIMEOUT); -- GitLab From 697a6f8a91063cfd47c330c81281e42ef398ea97 Mon Sep 17 00:00:00 2001 From: Sean Anderson Date: Thu, 16 Jan 2025 17:41:30 -0500 Subject: [PATCH 0483/2211] spi: zynqmp-gqspi: Always acknowledge interrupts [ Upstream commit 89785306453ce6d949e783f6936821a0b7649ee2 ] RXEMPTY can cause an IRQ, even though we may not do anything about it (such as if we are waiting for more received data). We must still handle these IRQs because we can tell they were caused by the device. Signed-off-by: Sean Anderson Link: https://patch.msgid.link/20250116224130.2684544-6-sean.anderson@linux.dev Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-zynqmp-gqspi.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/drivers/spi/spi-zynqmp-gqspi.c b/drivers/spi/spi-zynqmp-gqspi.c index b9df39e06e7cd..4b091b4d4ff37 100644 --- a/drivers/spi/spi-zynqmp-gqspi.c +++ b/drivers/spi/spi-zynqmp-gqspi.c @@ -799,7 +799,6 @@ static void zynqmp_process_dma_irq(struct zynqmp_qspi *xqspi) static irqreturn_t zynqmp_qspi_irq(int irq, void *dev_id) { struct zynqmp_qspi *xqspi = (struct zynqmp_qspi *)dev_id; - irqreturn_t ret = IRQ_NONE; u32 status, mask, dma_status = 0; status = zynqmp_gqspi_read(xqspi, GQSPI_ISR_OFST); @@ -814,27 +813,24 @@ static irqreturn_t zynqmp_qspi_irq(int irq, void *dev_id) dma_status); } - if (mask & GQSPI_ISR_TXNOT_FULL_MASK) { + if (!mask && !dma_status) + return IRQ_NONE; + + if (mask & GQSPI_ISR_TXNOT_FULL_MASK) zynqmp_qspi_filltxfifo(xqspi, GQSPI_TX_FIFO_FILL); - ret = IRQ_HANDLED; - } - if (dma_status & GQSPI_QSPIDMA_DST_I_STS_DONE_MASK) { + if (dma_status & GQSPI_QSPIDMA_DST_I_STS_DONE_MASK) zynqmp_process_dma_irq(xqspi); - ret = IRQ_HANDLED; - } else if (!(mask & GQSPI_IER_RXEMPTY_MASK) && - (mask & GQSPI_IER_GENFIFOEMPTY_MASK)) { + else if (!(mask & GQSPI_IER_RXEMPTY_MASK) && + (mask & GQSPI_IER_GENFIFOEMPTY_MASK)) zynqmp_qspi_readrxfifo(xqspi, GQSPI_RX_FIFO_FILL); - ret = IRQ_HANDLED; - } if (xqspi->bytes_to_receive == 0 && xqspi->bytes_to_transfer == 0 && ((status & GQSPI_IRQ_MASK) == GQSPI_IRQ_MASK)) { zynqmp_gqspi_write(xqspi, GQSPI_IDR_OFST, GQSPI_ISR_IDR_MASK); complete(&xqspi->data_completion); - ret = IRQ_HANDLED; } - return ret; + return IRQ_HANDLED; } /** -- GitLab From ff56fbf50eff94a5f26a966b855e481765e02e95 Mon Sep 17 00:00:00 2001 From: Isaac Scott Date: Tue, 28 Jan 2025 17:31:43 +0000 Subject: [PATCH 0484/2211] regulator: ad5398: Add device tree support [ Upstream commit 5a6a461079decea452fdcae955bccecf92e07e97 ] Previously, the ad5398 driver used only platform_data, which is deprecated in favour of device tree. This caused the AD5398 to fail to probe as it could not load its init_data. If the AD5398 has a device tree node, pull the init_data from there using of_get_regulator_init_data. Signed-off-by: Isaac Scott Acked-by: Michael Hennerich Link: https://patch.msgid.link/20250128173143.959600-4-isaac.scott@ideasonboard.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/regulator/ad5398.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/regulator/ad5398.c b/drivers/regulator/ad5398.c index 40f7dba42b5ad..404cbe32711e7 100644 --- a/drivers/regulator/ad5398.c +++ b/drivers/regulator/ad5398.c @@ -14,6 +14,7 @@ #include #include #include +#include #define AD5398_CURRENT_EN_MASK 0x8000 @@ -221,15 +222,20 @@ static int ad5398_probe(struct i2c_client *client) const struct ad5398_current_data_format *df = (struct ad5398_current_data_format *)id->driver_data; - if (!init_data) - return -EINVAL; - chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); if (!chip) return -ENOMEM; config.dev = &client->dev; + if (client->dev.of_node) + init_data = of_get_regulator_init_data(&client->dev, + client->dev.of_node, + &ad5398_reg); + if (!init_data) + return -EINVAL; + config.init_data = init_data; + config.of_node = client->dev.of_node; config.driver_data = chip; chip->client = client; -- GitLab From a1e3f2ea66c0ddb62cfa25fba6153c6ed3d63eb4 Mon Sep 17 00:00:00 2001 From: Nicolas Escande Date: Mon, 27 Jan 2025 08:13:06 +0100 Subject: [PATCH 0485/2211] wifi: ath12k: fix ath12k_hal_tx_cmd_ext_desc_setup() info1 override [ Upstream commit df11edfba49e5fb69f4c9e7cb76082b89c417f78 ] Since inception there is an obvious typo laying around in ath12k_hal_tx_cmd_ext_desc_setup(). Instead of initializing + adding flags to tcl_ext_cmd->info1, we initialize + override. This will be needed in the future to make broadcast frames work with ethernet encapsulation. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 Signed-off-by: Nicolas Escande Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250127071306.1454699-1-nico.escande@gmail.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/dp_tx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath12k/dp_tx.c b/drivers/net/wireless/ath/ath12k/dp_tx.c index ad21fbfbcbe22..201ffdb8c44ae 100644 --- a/drivers/net/wireless/ath/ath12k/dp_tx.c +++ b/drivers/net/wireless/ath/ath12k/dp_tx.c @@ -117,7 +117,7 @@ static void ath12k_hal_tx_cmd_ext_desc_setup(struct ath12k_base *ab, le32_encode_bits(ti->data_len, HAL_TX_MSDU_EXT_INFO1_BUF_LEN); - tcl_ext_cmd->info1 = le32_encode_bits(1, HAL_TX_MSDU_EXT_INFO1_EXTN_OVERRIDE) | + tcl_ext_cmd->info1 |= le32_encode_bits(1, HAL_TX_MSDU_EXT_INFO1_EXTN_OVERRIDE) | le32_encode_bits(ti->encap_type, HAL_TX_MSDU_EXT_INFO1_ENCAP_TYPE) | le32_encode_bits(ti->encrypt_type, -- GitLab From 63780d7352f0f36c900c29b8a134cdf23dd1f534 Mon Sep 17 00:00:00 2001 From: Youssef Samir Date: Fri, 17 Jan 2025 10:09:41 -0700 Subject: [PATCH 0486/2211] accel/qaic: Mask out SR-IOV PCI resources [ Upstream commit 8685520474bfc0fe4be83c3cbfe3fb3e1ca1514a ] During the initialization of the qaic device, pci_select_bars() is used to fetch a bitmask of the BARs exposed by the device. On devices that have Virtual Functions capabilities, the bitmask includes SR-IOV BARs. Use a mask to filter out SR-IOV BARs if they exist. Signed-off-by: Youssef Samir Reviewed-by: Jeffrey Hugo Signed-off-by: Jeffrey Hugo Reviewed-by: Lizhi Hou Link: https://patchwork.freedesktop.org/patch/msgid/20250117170943.2643280-6-quic_jhugo@quicinc.com Signed-off-by: Sasha Levin --- drivers/accel/qaic/qaic_drv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/accel/qaic/qaic_drv.c b/drivers/accel/qaic/qaic_drv.c index f139c564eadf9..10e711c96a670 100644 --- a/drivers/accel/qaic/qaic_drv.c +++ b/drivers/accel/qaic/qaic_drv.c @@ -432,7 +432,7 @@ static int init_pci(struct qaic_device *qdev, struct pci_dev *pdev) int bars; int ret; - bars = pci_select_bars(pdev, IORESOURCE_MEM); + bars = pci_select_bars(pdev, IORESOURCE_MEM) & 0x3f; /* make sure the device has the expected BARs */ if (bars != (BIT(0) | BIT(2) | BIT(4))) { -- GitLab From 331c0af96c0347be253f5f5610530d3ab819dc33 Mon Sep 17 00:00:00 2001 From: Michal Wajdeczko Date: Wed, 29 Jan 2025 20:59:47 +0100 Subject: [PATCH 0487/2211] drm/xe/pf: Reset GuC VF config when unprovisioning critical resource MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 33f17e2cbd930a2a00eb007d9b241b6db010a880 ] GuC firmware counts received VF configuration KLVs and may start validation of the complete VF config even if some resources where unprovisioned in the meantime, leading to unexpected errors like: $ echo 1 | sudo tee /sys/kernel/debug/dri/0000:00:02.0/gt0/vf1/contexts_quota $ echo 0 | sudo tee /sys/kernel/debug/dri/0000:00:02.0/gt0/vf1/contexts_quota $ echo 1 | sudo tee /sys/kernel/debug/dri/0000:00:02.0/gt0/vf1/doorbells_quota $ echo 0 | sudo tee /sys/kernel/debug/dri/0000:00:02.0/gt0/vf1/doorbells_quota $ echo 1 | sudo tee /sys/kernel/debug/dri/0000:00:02.0/gt0/vf1/ggtt_quota tee: '/sys/kernel/debug/dri/0000:00:02.0/gt0/vf1/ggtt_quota': Input/output error To mitigate this problem trigger explicit VF config reset after unprovisioning any of the critical resources (GGTT, context or doorbell IDs) that GuC is monitoring. Signed-off-by: Michal Wajdeczko Reviewed-by: Michał Winiarski Link: https://patchwork.freedesktop.org/patch/msgid/20250129195947.764-3-michal.wajdeczko@intel.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c | 37 +++++++++++++++++++--- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c index c9ed996b9cb0c..786f0dba41437 100644 --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c @@ -323,6 +323,26 @@ static int pf_push_full_vf_config(struct xe_gt *gt, unsigned int vfid) return err; } +static int pf_push_vf_cfg(struct xe_gt *gt, unsigned int vfid, bool reset) +{ + int err = 0; + + xe_gt_assert(gt, vfid); + lockdep_assert_held(xe_gt_sriov_pf_master_mutex(gt)); + + if (reset) + err = pf_send_vf_cfg_reset(gt, vfid); + if (!err) + err = pf_push_full_vf_config(gt, vfid); + + return err; +} + +static int pf_refresh_vf_cfg(struct xe_gt *gt, unsigned int vfid) +{ + return pf_push_vf_cfg(gt, vfid, true); +} + static u64 pf_get_ggtt_alignment(struct xe_gt *gt) { struct xe_device *xe = gt_to_xe(gt); @@ -419,6 +439,10 @@ static int pf_provision_vf_ggtt(struct xe_gt *gt, unsigned int vfid, u64 size) return err; pf_release_vf_config_ggtt(gt, config); + + err = pf_refresh_vf_cfg(gt, vfid); + if (unlikely(err)) + return err; } xe_gt_assert(gt, !xe_ggtt_node_allocated(config->ggtt_region)); @@ -744,6 +768,10 @@ static int pf_provision_vf_ctxs(struct xe_gt *gt, unsigned int vfid, u32 num_ctx return ret; pf_release_config_ctxs(gt, config); + + ret = pf_refresh_vf_cfg(gt, vfid); + if (unlikely(ret)) + return ret; } if (!num_ctxs) @@ -1041,6 +1069,10 @@ static int pf_provision_vf_dbs(struct xe_gt *gt, unsigned int vfid, u32 num_dbs) return ret; pf_release_config_dbs(gt, config); + + ret = pf_refresh_vf_cfg(gt, vfid); + if (unlikely(ret)) + return ret; } if (!num_dbs) @@ -2003,10 +2035,7 @@ int xe_gt_sriov_pf_config_push(struct xe_gt *gt, unsigned int vfid, bool refresh xe_gt_assert(gt, vfid); mutex_lock(xe_gt_sriov_pf_master_mutex(gt)); - if (refresh) - err = pf_send_vf_cfg_reset(gt, vfid); - if (!err) - err = pf_push_full_vf_config(gt, vfid); + err = pf_push_vf_cfg(gt, vfid, refresh); mutex_unlock(xe_gt_sriov_pf_master_mutex(gt)); if (unlikely(err)) { -- GitLab From a3f6e4682f3d4bd811a588713f27133ca57e049b Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Tue, 5 Nov 2024 14:23:26 -0800 Subject: [PATCH 0488/2211] wifi: ath9k: return by of_get_mac_address MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit dfffb317519f88534bb82797f055f0a2fd867e7b ] When using nvmem, ath9k could potentially be loaded before nvmem, which loads after mtd. This is an issue if DT contains an nvmem mac address. If nvmem is not ready in time for ath9k, -EPROBE_DEFER is returned. Pass it to _probe so that ath9k can properly grab a potentially present MAC address. Signed-off-by: Rosen Penev Acked-by: Toke Høiland-Jørgensen Link: https://patch.msgid.link/20241105222326.194417-1-rosenp@gmail.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath9k/init.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index 7fad7e75af6a3..619bebd389bd2 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c @@ -691,7 +691,9 @@ static int ath9k_of_init(struct ath_softc *sc) ah->ah_flags |= AH_NO_EEP_SWAP; } - of_get_mac_address(np, common->macaddr); + ret = of_get_mac_address(np, common->macaddr); + if (ret == -EPROBE_DEFER) + return ret; return 0; } -- GitLab From bb2d55681ee70eaabd88fe1e04c35f681ec3586d Mon Sep 17 00:00:00 2001 From: Aaradhana Sahu Date: Thu, 16 Jan 2025 08:58:35 +0530 Subject: [PATCH 0489/2211] wifi: ath12k: Fetch regdb.bin file from board-2.bin [ Upstream commit 24f587572acf7509127dbdfcbf1b681ef84eeba0 ] Currently, ath12k_core_fetch_regdb() finds regdb.bin file through board id's but in board-2.bin file regdb.bin file is present with default board id because of which regdb.bin is not fetched. Add support to fetch regdb.bin file from board-2.bin through default board id. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Signed-off-by: Aaradhana Sahu Reviewed-by: Aditya Kumar Singh Link: https://patch.msgid.link/20250116032835.118397-1-quic_aarasahu@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/core.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/core.c b/drivers/net/wireless/ath/ath12k/core.c index 51252e8bc1ae9..8bb8ee98188bf 100644 --- a/drivers/net/wireless/ath/ath12k/core.c +++ b/drivers/net/wireless/ath/ath12k/core.c @@ -161,7 +161,7 @@ EXPORT_SYMBOL(ath12k_core_resume); static int __ath12k_core_create_board_name(struct ath12k_base *ab, char *name, size_t name_len, bool with_variant, - bool bus_type_mode) + bool bus_type_mode, bool with_default) { /* strlen(',variant=') + strlen(ab->qmi.target.bdf_ext) */ char variant[9 + ATH12K_QMI_BDF_EXT_STR_LENGTH] = { 0 }; @@ -192,7 +192,9 @@ static int __ath12k_core_create_board_name(struct ath12k_base *ab, char *name, "bus=%s,qmi-chip-id=%d,qmi-board-id=%d%s", ath12k_bus_str(ab->hif.bus), ab->qmi.target.chip_id, - ab->qmi.target.board_id, variant); + with_default ? + ATH12K_BOARD_ID_DEFAULT : ab->qmi.target.board_id, + variant); break; } @@ -204,19 +206,19 @@ static int __ath12k_core_create_board_name(struct ath12k_base *ab, char *name, static int ath12k_core_create_board_name(struct ath12k_base *ab, char *name, size_t name_len) { - return __ath12k_core_create_board_name(ab, name, name_len, true, false); + return __ath12k_core_create_board_name(ab, name, name_len, true, false, false); } static int ath12k_core_create_fallback_board_name(struct ath12k_base *ab, char *name, size_t name_len) { - return __ath12k_core_create_board_name(ab, name, name_len, false, false); + return __ath12k_core_create_board_name(ab, name, name_len, false, false, true); } static int ath12k_core_create_bus_type_board_name(struct ath12k_base *ab, char *name, size_t name_len) { - return __ath12k_core_create_board_name(ab, name, name_len, false, true); + return __ath12k_core_create_board_name(ab, name, name_len, false, true, true); } const struct firmware *ath12k_core_firmware_request(struct ath12k_base *ab, -- GitLab From fb0d82562c07806c7b337c222c69f3c3323c01e1 Mon Sep 17 00:00:00 2001 From: P Praneesh Date: Mon, 23 Dec 2024 11:31:25 +0530 Subject: [PATCH 0490/2211] wifi: ath12k: Fix end offset bit definition in monitor ring descriptor [ Upstream commit 6788a666000d600bd8f2e9f991cad9cc805e7f01 ] End offset for the monitor destination ring descriptor is defined as 16 bits, while the firmware definition specifies only 12 bits. The remaining bits (bit 12 to bit 15) are reserved and may contain junk values, leading to invalid information retrieval. Fix this issue by updating the correct genmask values. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Signed-off-by: P Praneesh Link: https://patch.msgid.link/20241223060132.3506372-8-quic_ppranees@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/hal_desc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath12k/hal_desc.h b/drivers/net/wireless/ath/ath12k/hal_desc.h index 739f73370015e..4f745cfd7d8e7 100644 --- a/drivers/net/wireless/ath/ath12k/hal_desc.h +++ b/drivers/net/wireless/ath/ath12k/hal_desc.h @@ -2966,7 +2966,7 @@ struct hal_mon_buf_ring { #define HAL_MON_DEST_COOKIE_BUF_ID GENMASK(17, 0) -#define HAL_MON_DEST_INFO0_END_OFFSET GENMASK(15, 0) +#define HAL_MON_DEST_INFO0_END_OFFSET GENMASK(11, 0) #define HAL_MON_DEST_INFO0_FLUSH_DETECTED BIT(16) #define HAL_MON_DEST_INFO0_END_OF_PPDU BIT(17) #define HAL_MON_DEST_INFO0_INITIATOR BIT(18) -- GitLab From 878ccaf79c95f0732b90479da0ac683052c7aec1 Mon Sep 17 00:00:00 2001 From: Olivier Moysan Date: Wed, 8 Jan 2025 18:03:54 +0100 Subject: [PATCH 0491/2211] drm: bridge: adv7511: fill stream capabilities [ Upstream commit c852646f12d4cd5b4f19eeec2976c5d98c0382f8 ] Set no_i2s_capture and no_spdif_capture flags in hdmi_codec_pdata structure to report that the ADV7511 HDMI bridge does not support i2s or spdif audio capture. Signed-off-by: Olivier Moysan Reviewed-by: Dmitry Baryshkov Link: https://patchwork.freedesktop.org/patch/msgid/20250108170356.413063-2-olivier.moysan@foss.st.com Signed-off-by: Dmitry Baryshkov Signed-off-by: Sasha Levin --- drivers/gpu/drm/bridge/adv7511/adv7511_audio.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c b/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c index 8f786592143b6..24e1e11acf697 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c @@ -244,7 +244,9 @@ static const struct hdmi_codec_pdata codec_data = { .ops = &adv7511_codec_ops, .max_i2s_channels = 2, .i2s = 1, + .no_i2s_capture = 1, .spdif = 1, + .no_spdif_capture = 1, }; int adv7511_audio_init(struct device *dev, struct adv7511 *adv7511) -- GitLab From e1fffcd1d75db23797a842ccbd5ef9439e6a419d Mon Sep 17 00:00:00 2001 From: Zhi Wang Date: Fri, 24 Jan 2025 10:29:50 -0800 Subject: [PATCH 0492/2211] drm/nouveau: fix the broken marco GSP_MSG_MAX_SIZE [ Upstream commit bbae6680cfe38b033250b483722e60ccd865976f ] The macro GSP_MSG_MAX_SIZE refers to another macro that doesn't exist. It represents the max GSP message element size. Fix the broken marco so it can be used to replace some magic numbers in the code. Signed-off-by: Zhi Wang Signed-off-by: Danilo Krummrich Link: https://patchwork.freedesktop.org/patch/msgid/20250124182958.2040494-8-zhiw@nvidia.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c index 9c83bab0a5309..fc84ca214f247 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c @@ -58,7 +58,7 @@ #include #define GSP_MSG_MIN_SIZE GSP_PAGE_SIZE -#define GSP_MSG_MAX_SIZE GSP_PAGE_MIN_SIZE * 16 +#define GSP_MSG_MAX_SIZE (GSP_MSG_MIN_SIZE * 16) struct r535_gsp_msg { u8 auth_tag_buffer[16]; -- GitLab From 115360031be90aa6cf11d718caf19fea94824285 Mon Sep 17 00:00:00 2001 From: P Praneesh Date: Sun, 19 Jan 2025 22:12:19 +0530 Subject: [PATCH 0493/2211] wifi: ath11k: Use dma_alloc_noncoherent for rx_tid buffer allocation [ Upstream commit eeadc6baf8b3dcd32787cc84f0473dc2a2850370 ] Currently, the driver allocates cacheable DMA buffers for the rx_tid structure using kzalloc() and dma_map_single(). These buffers are long-lived and can persist for the lifetime of the peer, which is not advisable. Instead of using kzalloc() and dma_map_single() for allocating cacheable DMA buffers, utilize the dma_alloc_noncoherent() helper for the allocation of long-lived cacheable DMA buffers, such as the peer's rx_tid. Since dma_alloc_noncoherent() returns unaligned physical and virtual addresses, align them internally before use within the driver. This ensures proper allocation of non-coherent memory through the kernel helper. Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3 Signed-off-by: P Praneesh Tested-by: Tim Harvey Link: https://patch.msgid.link/20250119164219.647059-3-quic_ppranees@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath11k/dp.h | 6 +- drivers/net/wireless/ath/ath11k/dp_rx.c | 117 +++++++++++------------- 2 files changed, 58 insertions(+), 65 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/dp.h b/drivers/net/wireless/ath/ath11k/dp.h index 65d2bc0687c88..eaf902c25e192 100644 --- a/drivers/net/wireless/ath/ath11k/dp.h +++ b/drivers/net/wireless/ath/ath11k/dp.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause-Clear */ /* * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023, 2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef ATH11K_DP_H @@ -20,7 +20,6 @@ struct ath11k_ext_irq_grp; struct dp_rx_tid { u8 tid; - u32 *vaddr; dma_addr_t paddr; u32 size; u32 ba_win_sz; @@ -37,6 +36,9 @@ struct dp_rx_tid { /* Timer info related to fragments */ struct timer_list frag_timer; struct ath11k_base *ab; + u32 *vaddr_unaligned; + dma_addr_t paddr_unaligned; + u32 unaligned_size; }; #define DP_REO_DESC_FREE_THRESHOLD 64 diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.c b/drivers/net/wireless/ath/ath11k/dp_rx.c index 40b52d12b4323..bfb8e7b1a300c 100644 --- a/drivers/net/wireless/ath/ath11k/dp_rx.c +++ b/drivers/net/wireless/ath/ath11k/dp_rx.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear /* * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -675,11 +675,11 @@ void ath11k_dp_reo_cmd_list_cleanup(struct ath11k_base *ab) list_for_each_entry_safe(cmd, tmp, &dp->reo_cmd_list, list) { list_del(&cmd->list); rx_tid = &cmd->data; - if (rx_tid->vaddr) { - dma_unmap_single(ab->dev, rx_tid->paddr, - rx_tid->size, DMA_BIDIRECTIONAL); - kfree(rx_tid->vaddr); - rx_tid->vaddr = NULL; + if (rx_tid->vaddr_unaligned) { + dma_free_noncoherent(ab->dev, rx_tid->unaligned_size, + rx_tid->vaddr_unaligned, + rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); + rx_tid->vaddr_unaligned = NULL; } kfree(cmd); } @@ -689,11 +689,11 @@ void ath11k_dp_reo_cmd_list_cleanup(struct ath11k_base *ab) list_del(&cmd_cache->list); dp->reo_cmd_cache_flush_count--; rx_tid = &cmd_cache->data; - if (rx_tid->vaddr) { - dma_unmap_single(ab->dev, rx_tid->paddr, - rx_tid->size, DMA_BIDIRECTIONAL); - kfree(rx_tid->vaddr); - rx_tid->vaddr = NULL; + if (rx_tid->vaddr_unaligned) { + dma_free_noncoherent(ab->dev, rx_tid->unaligned_size, + rx_tid->vaddr_unaligned, + rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); + rx_tid->vaddr_unaligned = NULL; } kfree(cmd_cache); } @@ -708,11 +708,11 @@ static void ath11k_dp_reo_cmd_free(struct ath11k_dp *dp, void *ctx, if (status != HAL_REO_CMD_SUCCESS) ath11k_warn(dp->ab, "failed to flush rx tid hw desc, tid %d status %d\n", rx_tid->tid, status); - if (rx_tid->vaddr) { - dma_unmap_single(dp->ab->dev, rx_tid->paddr, rx_tid->size, - DMA_BIDIRECTIONAL); - kfree(rx_tid->vaddr); - rx_tid->vaddr = NULL; + if (rx_tid->vaddr_unaligned) { + dma_free_noncoherent(dp->ab->dev, rx_tid->unaligned_size, + rx_tid->vaddr_unaligned, + rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); + rx_tid->vaddr_unaligned = NULL; } } @@ -749,10 +749,10 @@ static void ath11k_dp_reo_cache_flush(struct ath11k_base *ab, if (ret) { ath11k_err(ab, "failed to send HAL_REO_CMD_FLUSH_CACHE cmd, tid %d (%d)\n", rx_tid->tid, ret); - dma_unmap_single(ab->dev, rx_tid->paddr, rx_tid->size, - DMA_BIDIRECTIONAL); - kfree(rx_tid->vaddr); - rx_tid->vaddr = NULL; + dma_free_noncoherent(ab->dev, rx_tid->unaligned_size, + rx_tid->vaddr_unaligned, + rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); + rx_tid->vaddr_unaligned = NULL; } } @@ -802,10 +802,10 @@ static void ath11k_dp_rx_tid_del_func(struct ath11k_dp *dp, void *ctx, return; free_desc: - dma_unmap_single(ab->dev, rx_tid->paddr, rx_tid->size, - DMA_BIDIRECTIONAL); - kfree(rx_tid->vaddr); - rx_tid->vaddr = NULL; + dma_free_noncoherent(ab->dev, rx_tid->unaligned_size, + rx_tid->vaddr_unaligned, + rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); + rx_tid->vaddr_unaligned = NULL; } void ath11k_peer_rx_tid_delete(struct ath11k *ar, @@ -831,14 +831,16 @@ void ath11k_peer_rx_tid_delete(struct ath11k *ar, if (ret != -ESHUTDOWN) ath11k_err(ar->ab, "failed to send HAL_REO_CMD_UPDATE_RX_QUEUE cmd, tid %d (%d)\n", tid, ret); - dma_unmap_single(ar->ab->dev, rx_tid->paddr, rx_tid->size, - DMA_BIDIRECTIONAL); - kfree(rx_tid->vaddr); - rx_tid->vaddr = NULL; + dma_free_noncoherent(ar->ab->dev, rx_tid->unaligned_size, + rx_tid->vaddr_unaligned, + rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); + rx_tid->vaddr_unaligned = NULL; } rx_tid->paddr = 0; + rx_tid->paddr_unaligned = 0; rx_tid->size = 0; + rx_tid->unaligned_size = 0; } static int ath11k_dp_rx_link_desc_return(struct ath11k_base *ab, @@ -982,10 +984,9 @@ static void ath11k_dp_rx_tid_mem_free(struct ath11k_base *ab, if (!rx_tid->active) goto unlock_exit; - dma_unmap_single(ab->dev, rx_tid->paddr, rx_tid->size, - DMA_BIDIRECTIONAL); - kfree(rx_tid->vaddr); - rx_tid->vaddr = NULL; + dma_free_noncoherent(ab->dev, rx_tid->unaligned_size, rx_tid->vaddr_unaligned, + rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL); + rx_tid->vaddr_unaligned = NULL; rx_tid->active = false; @@ -1000,9 +1001,8 @@ int ath11k_peer_rx_tid_setup(struct ath11k *ar, const u8 *peer_mac, int vdev_id, struct ath11k_base *ab = ar->ab; struct ath11k_peer *peer; struct dp_rx_tid *rx_tid; - u32 hw_desc_sz; - u32 *addr_aligned; - void *vaddr; + u32 hw_desc_sz, *vaddr; + void *vaddr_unaligned; dma_addr_t paddr; int ret; @@ -1050,49 +1050,40 @@ int ath11k_peer_rx_tid_setup(struct ath11k *ar, const u8 *peer_mac, int vdev_id, else hw_desc_sz = ath11k_hal_reo_qdesc_size(DP_BA_WIN_SZ_MAX, tid); - vaddr = kzalloc(hw_desc_sz + HAL_LINK_DESC_ALIGN - 1, GFP_ATOMIC); - if (!vaddr) { + rx_tid->unaligned_size = hw_desc_sz + HAL_LINK_DESC_ALIGN - 1; + vaddr_unaligned = dma_alloc_noncoherent(ab->dev, rx_tid->unaligned_size, &paddr, + DMA_BIDIRECTIONAL, GFP_ATOMIC); + if (!vaddr_unaligned) { spin_unlock_bh(&ab->base_lock); return -ENOMEM; } - addr_aligned = PTR_ALIGN(vaddr, HAL_LINK_DESC_ALIGN); - - ath11k_hal_reo_qdesc_setup(addr_aligned, tid, ba_win_sz, - ssn, pn_type); - - paddr = dma_map_single(ab->dev, addr_aligned, hw_desc_sz, - DMA_BIDIRECTIONAL); - - ret = dma_mapping_error(ab->dev, paddr); - if (ret) { - spin_unlock_bh(&ab->base_lock); - ath11k_warn(ab, "failed to setup dma map for peer %pM rx tid %d: %d\n", - peer_mac, tid, ret); - goto err_mem_free; - } - - rx_tid->vaddr = vaddr; - rx_tid->paddr = paddr; + rx_tid->vaddr_unaligned = vaddr_unaligned; + vaddr = PTR_ALIGN(vaddr_unaligned, HAL_LINK_DESC_ALIGN); + rx_tid->paddr_unaligned = paddr; + rx_tid->paddr = rx_tid->paddr_unaligned + ((unsigned long)vaddr - + (unsigned long)rx_tid->vaddr_unaligned); + ath11k_hal_reo_qdesc_setup(vaddr, tid, ba_win_sz, ssn, pn_type); rx_tid->size = hw_desc_sz; rx_tid->active = true; + /* After dma_alloc_noncoherent, vaddr is being modified for reo qdesc setup. + * Since these changes are not reflected in the device, driver now needs to + * explicitly call dma_sync_single_for_device. + */ + dma_sync_single_for_device(ab->dev, rx_tid->paddr, + rx_tid->size, + DMA_TO_DEVICE); spin_unlock_bh(&ab->base_lock); - ret = ath11k_wmi_peer_rx_reorder_queue_setup(ar, vdev_id, peer_mac, - paddr, tid, 1, ba_win_sz); + ret = ath11k_wmi_peer_rx_reorder_queue_setup(ar, vdev_id, peer_mac, rx_tid->paddr, + tid, 1, ba_win_sz); if (ret) { ath11k_warn(ar->ab, "failed to setup rx reorder queue for peer %pM tid %d: %d\n", peer_mac, tid, ret); ath11k_dp_rx_tid_mem_free(ab, peer_mac, vdev_id, tid); } - return ret; - -err_mem_free: - kfree(rx_tid->vaddr); - rx_tid->vaddr = NULL; - return ret; } -- GitLab From 274ae1044bd2cd637a05295713eb5ce49001e5cc Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Tue, 10 Dec 2024 09:31:03 +0100 Subject: [PATCH 0494/2211] drm/xe: Move suballocator init to after display init [ Upstream commit 380b0cdaa76bc8f5c16db16eaf48751e792ff041 ] No allocations should be done before we have had a chance to preserve the display fb. Reviewed-by: Rodrigo Vivi Link: https://patchwork.freedesktop.org/patch/msgid/20241210083111.230484-4-dev@lankhorst.se Signed-off-by: Maarten Lankhorst Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_device.c | 6 ++++++ drivers/gpu/drm/xe/xe_tile.c | 12 ++++++++---- drivers/gpu/drm/xe/xe_tile.h | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c index 5c37bed3c948f..23e02372a49db 100644 --- a/drivers/gpu/drm/xe/xe_device.c +++ b/drivers/gpu/drm/xe/xe_device.c @@ -708,6 +708,12 @@ int xe_device_probe(struct xe_device *xe) if (err) goto err; + for_each_tile(tile, xe, id) { + err = xe_tile_init(tile); + if (err) + goto err; + } + for_each_gt(gt, xe, id) { last_gt = id; diff --git a/drivers/gpu/drm/xe/xe_tile.c b/drivers/gpu/drm/xe/xe_tile.c index 349beddf9b383..36c87d7c72fbc 100644 --- a/drivers/gpu/drm/xe/xe_tile.c +++ b/drivers/gpu/drm/xe/xe_tile.c @@ -167,15 +167,19 @@ int xe_tile_init_noalloc(struct xe_tile *tile) if (err) return err; - tile->mem.kernel_bb_pool = xe_sa_bo_manager_init(tile, SZ_1M, 16); - if (IS_ERR(tile->mem.kernel_bb_pool)) - return PTR_ERR(tile->mem.kernel_bb_pool); - xe_wa_apply_tile_workarounds(tile); return xe_tile_sysfs_init(tile); } +int xe_tile_init(struct xe_tile *tile) +{ + tile->mem.kernel_bb_pool = xe_sa_bo_manager_init(tile, SZ_1M, 16); + if (IS_ERR(tile->mem.kernel_bb_pool)) + return PTR_ERR(tile->mem.kernel_bb_pool); + + return 0; +} void xe_tile_migrate_wait(struct xe_tile *tile) { xe_migrate_wait(tile->migrate); diff --git a/drivers/gpu/drm/xe/xe_tile.h b/drivers/gpu/drm/xe/xe_tile.h index 1c9e42ade6b05..eb939316d55b0 100644 --- a/drivers/gpu/drm/xe/xe_tile.h +++ b/drivers/gpu/drm/xe/xe_tile.h @@ -12,6 +12,7 @@ struct xe_tile; int xe_tile_init_early(struct xe_tile *tile, struct xe_device *xe, u8 id); int xe_tile_init_noalloc(struct xe_tile *tile); +int xe_tile_init(struct xe_tile *tile); void xe_tile_migrate_wait(struct xe_tile *tile); -- GitLab From c9db43696ed0e2f834d1a525a6bf8433374ad3c2 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Tue, 10 Dec 2024 09:31:11 +0100 Subject: [PATCH 0495/2211] drm/xe: Do not attempt to bootstrap VF in execlists mode [ Upstream commit f3b59457808f61d88178b0afa67cbd017d7ce79e ] It was mentioned in a review that there is a possibility of choosing to load the module with VF in execlists mode. Of course this doesn't work, just bomb out as hard as possible. Reviewed-by: Lucas De Marchi Link: https://patchwork.freedesktop.org/patch/msgid/20241210083111.230484-12-dev@lankhorst.se Signed-off-by: Maarten Lankhorst Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c index 7ddbfeaf494ac..29badbd829ab6 100644 --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c @@ -235,6 +235,9 @@ int xe_gt_sriov_vf_bootstrap(struct xe_gt *gt) { int err; + if (!xe_device_uc_enabled(gt_to_xe(gt))) + return -ENODEV; + err = vf_reset_guc_state(gt); if (unlikely(err)) return err; -- GitLab From 1cc37163730aa0b6ff7c5cdf51c72aa24e9de91c Mon Sep 17 00:00:00 2001 From: Ching-Te Ku Date: Fri, 10 Jan 2025 09:54:15 +0800 Subject: [PATCH 0496/2211] wifi: rtw89: coex: Separated Wi-Fi connecting event from Wi-Fi scan event [ Upstream commit 4a57346652154bb339c48b41166df9154cff33f5 ] Wi-Fi connecting process don't need to assign to firmware slot control, if assign firmware slot control for Wi-Fi connecting event, firmware will not toggle slots because driver don't tell the slot schedule to firmware. Wi-Fi connecting event end should also cancel the 4way handshake status. Signed-off-by: Ching-Te Ku Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250110015416.10704-3-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/coex.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw89/coex.c b/drivers/net/wireless/realtek/rtw89/coex.c index 5f878f086f7cf..6cdbf02f405ae 100644 --- a/drivers/net/wireless/realtek/rtw89/coex.c +++ b/drivers/net/wireless/realtek/rtw89/coex.c @@ -5356,7 +5356,8 @@ static void _action_wl_scan(struct rtw89_dev *rtwdev) struct rtw89_btc_wl_info *wl = &btc->cx.wl; struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; - if (RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) { + if (btc->cx.state_map != BTC_WLINKING && + RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) { _action_wl_25g_mcc(rtwdev); rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], Scan offload!\n"); } else if (rtwdev->dbcc_en) { @@ -7178,6 +7179,8 @@ void rtw89_btc_ntfy_scan_finish(struct rtw89_dev *rtwdev, u8 phy_idx) _fw_set_drv_info(rtwdev, CXDRVINFO_DBCC); } + btc->dm.tdma_instant_excute = 1; + _run_coex(rtwdev, BTC_RSN_NTFY_SCAN_FINISH); } @@ -7630,7 +7633,8 @@ void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, else wl->status.map.connecting = 0; - if (state == BTC_ROLE_MSTS_STA_DIS_CONN) + if (state == BTC_ROLE_MSTS_STA_DIS_CONN || + state == BTC_ROLE_MSTS_STA_CONN_END) wl->status.map._4way = false; _run_coex(rtwdev, BTC_RSN_NTFY_ROLE_INFO); -- GitLab From 650c1769cfe9df648d212322d34f4c30b284d85c Mon Sep 17 00:00:00 2001 From: Michal Wajdeczko Date: Fri, 20 Dec 2024 20:41:54 +0100 Subject: [PATCH 0497/2211] drm/xe/sa: Always call drm_suballoc_manager_fini() [ Upstream commit 9cd3f4efc870463f17f6c29114c61fb6bfcaa291 ] After successful call to drm_suballoc_manager_init() we should make sure to call drm_suballoc_manager_fini() as it may include some cleanup code even if we didn't start using it for real. As we can abort init() early due to kvzalloc() failure, we should either explicitly call drm_suballoc_manager_fini() or, even better, postpone drm_suballoc_manager_init() once we finish all other preparation steps, so we can rely on fini() that will do cleanup. Signed-off-by: Michal Wajdeczko Cc: Matthew Brost Reviewed-by: Matthew Brost Link: https://patchwork.freedesktop.org/patch/msgid/20241220194205.995-2-michal.wajdeczko@intel.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_sa.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_sa.c b/drivers/gpu/drm/xe/xe_sa.c index fe2cb2a96f788..1d42547590067 100644 --- a/drivers/gpu/drm/xe/xe_sa.c +++ b/drivers/gpu/drm/xe/xe_sa.c @@ -57,8 +57,6 @@ struct xe_sa_manager *xe_sa_bo_manager_init(struct xe_tile *tile, u32 size, u32 } sa_manager->bo = bo; sa_manager->is_iomem = bo->vmap.is_iomem; - - drm_suballoc_manager_init(&sa_manager->base, managed_size, align); sa_manager->gpu_addr = xe_bo_ggtt_addr(bo); if (bo->vmap.is_iomem) { @@ -72,6 +70,7 @@ struct xe_sa_manager *xe_sa_bo_manager_init(struct xe_tile *tile, u32 size, u32 memset(sa_manager->cpu_ptr, 0, bo->ttm.base.size); } + drm_suballoc_manager_init(&sa_manager->base, managed_size, align); ret = drmm_add_action_or_reset(&xe->drm, xe_sa_bo_manager_fini, sa_manager); if (ret) -- GitLab From 6ceef704e2bcef5c75be418ee06699158b3000bd Mon Sep 17 00:00:00 2001 From: Oak Zeng Date: Fri, 10 Jan 2025 16:01:37 -0500 Subject: [PATCH 0498/2211] drm/xe: Reject BO eviction if BO is bound to current VM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 0af944f0e3082ff517958b1cea76fb9b8cb379dd ] This is a follow up fix for https://patchwork.freedesktop.org/patch/msgid/20241203021929.1919730-1-oak.zeng@intel.com The overall goal is to fail vm_bind when there is memory pressure. See more details in the commit message of above patch. Abbove patch fixes the issue when user pass in a vm_id parameter during gem_create. If user doesn't pass in a vm_id during gem_create, above patch doesn't help. This patch further reject BO eviction (which could be triggered by bo validation) if BO is bound to the current VM. vm_bind could fail due to the eviction failure. The BO to VM reverse mapping structure is used to determine whether BO is bound to VM. v2: Move vm_bo definition from function scope to if(evict) clause (Thomas) Further constraint the condition by adding ctx->resv (Thomas) Add a short comment describe the change. Suggested-by: Thomas Hellström Signed-off-by: Oak Zeng Reviewed-by: Thomas Hellström Signed-off-by: Thomas Hellström Link: https://patchwork.freedesktop.org/patch/msgid/20250110210137.3181576-1-oak.zeng@intel.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_bo.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c index 35a8242a9f541..8acc4640f0a28 100644 --- a/drivers/gpu/drm/xe/xe_bo.c +++ b/drivers/gpu/drm/xe/xe_bo.c @@ -702,6 +702,21 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict, goto out; } + /* Reject BO eviction if BO is bound to current VM. */ + if (evict && ctx->resv) { + struct drm_gpuvm_bo *vm_bo; + + drm_gem_for_each_gpuvm_bo(vm_bo, &bo->ttm.base) { + struct xe_vm *vm = gpuvm_to_vm(vm_bo->vm); + + if (xe_vm_resv(vm) == ctx->resv && + xe_vm_in_preempt_fence_mode(vm)) { + ret = -EBUSY; + goto out; + } + } + } + /* * Failed multi-hop where the old_mem is still marked as * TTM_PL_FLAG_TEMPORARY, should just be a dummy move. -- GitLab From 135105287781eb6693f0075c63c0b3e6d68f7e62 Mon Sep 17 00:00:00 2001 From: Simona Vetter Date: Wed, 8 Jan 2025 18:24:16 +0100 Subject: [PATCH 0499/2211] drm/atomic: clarify the rules around drm_atomic_state->allow_modeset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit c5e3306a424b52e38ad2c28c7f3399fcd03e383d ] msm is automagically upgrading normal commits to full modesets, and that's a big no-no: - for one this results in full on->off->on transitions on all these crtc, at least if you're using the usual helpers. Which seems to be the case, and is breaking uapi - further even if the ctm change itself would not result in flicker, this can hide modesets for other reasons. Which again breaks the uapi v2: I forgot the case of adding unrelated crtc state. Add that case and link to the existing kerneldoc explainers. This has come up in an irc discussion with Manasi and Ville about intel's bigjoiner mode. Also cc everyone involved in the msm irc discussion, more people joined after I sent out v1. v3: Wording polish from Pekka and Thomas Acked-by: Pekka Paalanen Acked-by: Dmitry Baryshkov Cc: Maarten Lankhorst Cc: Maxime Ripard Cc: Thomas Zimmermann Cc: David Airlie Cc: Daniel Vetter Cc: Pekka Paalanen Cc: Rob Clark Cc: Simon Ser Cc: Manasi Navare Cc: Ville Syrjälä Cc: Abhinav Kumar Cc: Dmitry Baryshkov Signed-off-by: Simona Vetter Signed-off-by: Simona Vetter Link: https://patchwork.freedesktop.org/patch/msgid/20250108172417.160831-1-simona.vetter@ffwll.ch Signed-off-by: Sasha Levin --- include/drm/drm_atomic.h | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h index 31ca88deb10d2..1ded9a8d4e84d 100644 --- a/include/drm/drm_atomic.h +++ b/include/drm/drm_atomic.h @@ -376,8 +376,27 @@ struct drm_atomic_state { * * Allow full modeset. This is used by the ATOMIC IOCTL handler to * implement the DRM_MODE_ATOMIC_ALLOW_MODESET flag. Drivers should - * never consult this flag, instead looking at the output of - * drm_atomic_crtc_needs_modeset(). + * generally not consult this flag, but instead look at the output of + * drm_atomic_crtc_needs_modeset(). The detailed rules are: + * + * - Drivers must not consult @allow_modeset in the atomic commit path. + * Use drm_atomic_crtc_needs_modeset() instead. + * + * - Drivers must consult @allow_modeset before adding unrelated struct + * drm_crtc_state to this commit by calling + * drm_atomic_get_crtc_state(). See also the warning in the + * documentation for that function. + * + * - Drivers must never change this flag, it is under the exclusive + * control of userspace. + * + * - Drivers may consult @allow_modeset in the atomic check path, if + * they have the choice between an optimal hardware configuration + * which requires a modeset, and a less optimal configuration which + * can be committed without a modeset. An example would be suboptimal + * scanout FIFO allocation resulting in increased idle power + * consumption. This allows userspace to avoid flickering and delays + * for the normal composition loop at reasonable cost. */ bool allow_modeset : 1; /** -- GitLab From aa52c70ae1322430da509e5ee98f817f2dcae2ed Mon Sep 17 00:00:00 2001 From: "Lin.Cao" Date: Thu, 26 Dec 2024 12:31:15 +0530 Subject: [PATCH 0500/2211] drm/buddy: fix issue that force_merge cannot free all roots [ Upstream commit 467dce3817bd2b62ccd6fcfd7aae76f242ac907e ] If buddy manager have more than one roots and each root have sub-block need to be free. When drm_buddy_fini called, the first loop of force_merge will merge and free all of the sub block of first root, which offset is 0x0 and size is biggest(more than have of the mm size). In subsequent force_merge rounds, if we use 0 as start and use remaining mm size as end, the block of other roots will be skipped in __force_merge function. It will cause the other roots can not be freed. Solution: use roots' offset as the start could fix this issue. Signed-off-by: Lin.Cao Signed-off-by: Arunpravin Paneer Selvam Reviewed-by: Matthew Auld Link: https://patchwork.freedesktop.org/patch/msgid/20241226070116.309290-1-Arunpravin.PaneerSelvam@amd.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/drm_buddy.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c index 103c185bb1c8a..ca42e6081d27c 100644 --- a/drivers/gpu/drm/drm_buddy.c +++ b/drivers/gpu/drm/drm_buddy.c @@ -324,7 +324,7 @@ EXPORT_SYMBOL(drm_buddy_init); */ void drm_buddy_fini(struct drm_buddy *mm) { - u64 root_size, size; + u64 root_size, size, start; unsigned int order; int i; @@ -332,7 +332,8 @@ void drm_buddy_fini(struct drm_buddy *mm) for (i = 0; i < mm->n_roots; ++i) { order = ilog2(size) - ilog2(mm->chunk_size); - __force_merge(mm, 0, size, order); + start = drm_buddy_block_offset(mm->roots[i]); + __force_merge(mm, start, start + size, order); WARN_ON(!drm_buddy_block_is_free(mm->roots[i])); drm_block_free(mm, mm->roots[i]); -- GitLab From 08150a6c83a9a8e6667eb9db75561ae5c8c16e92 Mon Sep 17 00:00:00 2001 From: Douglas Anderson Date: Thu, 9 Jan 2025 14:28:53 -0800 Subject: [PATCH 0501/2211] drm/panel-edp: Add Starry 116KHD024006 [ Upstream commit 749b5b279e5636cdcef51e15d67b77162cca6caa ] We have a few reports of sc7180-trogdor-pompom devices that have a panel in them that IDs as STA 0x0004 and has the following raw EDID: 00 ff ff ff ff ff ff 00 4e 81 04 00 00 00 00 00 10 20 01 04 a5 1a 0e 78 0a dc dd 96 5b 5b 91 28 1f 52 54 00 00 00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 8e 1c 56 a0 50 00 1e 30 28 20 55 00 00 90 10 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fe 00 31 31 36 4b 48 44 30 32 34 30 30 36 0a 00 e6 We've been unable to locate a datasheet for this panel and our partner has not been responsive, but all Starry eDP datasheets that we can find agree on the same timing (delay_100_500_e200) so it should be safe to use that here instead of the super conservative timings. We'll still go a little extra conservative and allow `hpd_absent` of 200 instead of 100 because that won't add any real-world delay in most cases. We'll associate the string from the EDID ("116KHD024006") with this panel. Given that the ID is the suspicious value of 0x0004 it seems likely that Starry doesn't always update their IDs but the string will still work to differentiate if we ever need to in the future. Reviewed-by: Neil Armstrong Signed-off-by: Douglas Anderson Link: https://patchwork.freedesktop.org/patch/msgid/20250109142853.1.Ibcc3009933fd19507cc9c713ad0c99c7a9e4fe17@changeid Signed-off-by: Sasha Levin --- drivers/gpu/drm/panel/panel-edp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/panel/panel-edp.c b/drivers/gpu/drm/panel/panel-edp.c index 767e47a2b0c14..663af985d1b38 100644 --- a/drivers/gpu/drm/panel/panel-edp.c +++ b/drivers/gpu/drm/panel/panel-edp.c @@ -1983,6 +1983,7 @@ static const struct edp_panel_entry edp_panels[] = { EDP_PANEL_ENTRY('S', 'H', 'P', 0x153a, &delay_200_500_e50, "LQ140T1JH01"), EDP_PANEL_ENTRY('S', 'H', 'P', 0x154c, &delay_200_500_p2e100, "LQ116M1JW10"), + EDP_PANEL_ENTRY('S', 'T', 'A', 0x0004, &delay_200_500_e200, "116KHD024006"), EDP_PANEL_ENTRY('S', 'T', 'A', 0x0100, &delay_100_500_e200, "2081116HHD028001-51D"), { /* sentinal */ } -- GitLab From 9fddd1f15465ffa53aa533a65b57492d9667cc41 Mon Sep 17 00:00:00 2001 From: Jessica Zhang Date: Mon, 16 Dec 2024 16:43:14 -0800 Subject: [PATCH 0502/2211] drm: Add valid clones check [ Upstream commit 41b4b11da02157c7474caf41d56baae0e941d01a ] Check that all encoders attached to a given CRTC are valid possible_clones of each other. Signed-off-by: Jessica Zhang Reviewed-by: Maxime Ripard Link: https://patchwork.freedesktop.org/patch/msgid/20241216-concurrent-wb-v4-3-fe220297a7f0@quicinc.com Signed-off-by: Dmitry Baryshkov Signed-off-by: Sasha Levin --- drivers/gpu/drm/drm_atomic_helper.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 32902f77f00dd..40e4e1b6c9110 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -574,6 +574,30 @@ mode_valid(struct drm_atomic_state *state) return 0; } +static int drm_atomic_check_valid_clones(struct drm_atomic_state *state, + struct drm_crtc *crtc) +{ + struct drm_encoder *drm_enc; + struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, + crtc); + + drm_for_each_encoder_mask(drm_enc, crtc->dev, crtc_state->encoder_mask) { + if (!drm_enc->possible_clones) { + DRM_DEBUG("enc%d possible_clones is 0\n", drm_enc->base.id); + continue; + } + + if ((crtc_state->encoder_mask & drm_enc->possible_clones) != + crtc_state->encoder_mask) { + DRM_DEBUG("crtc%d failed valid clone check for mask 0x%x\n", + crtc->base.id, crtc_state->encoder_mask); + return -EINVAL; + } + } + + return 0; +} + /** * drm_atomic_helper_check_modeset - validate state object for modeset changes * @dev: DRM device @@ -745,6 +769,10 @@ drm_atomic_helper_check_modeset(struct drm_device *dev, ret = drm_atomic_add_affected_planes(state, crtc); if (ret != 0) return ret; + + ret = drm_atomic_check_valid_clones(state, crtc); + if (ret != 0) + return ret; } /* -- GitLab From b5aa85b9b0c4c7c6db39c31a56b01aaa331a5589 Mon Sep 17 00:00:00 2001 From: Chenyuan Yang Date: Sun, 6 Apr 2025 16:08:54 -0500 Subject: [PATCH 0503/2211] ASoC: imx-card: Adjust over allocation of memory in imx_card_parse_of() [ Upstream commit a9a69c3b38c89d7992fb53db4abb19104b531d32 ] Incorrect types are used as sizeof() arguments in devm_kcalloc(). It should be sizeof(dai_link_data) for link_data instead of sizeof(snd_soc_dai_link). This is found by our static analysis tool. Signed-off-by: Chenyuan Yang Link: https://patch.msgid.link/20250406210854.149316-1-chenyuan0y@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/fsl/imx-card.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/fsl/imx-card.c b/sound/soc/fsl/imx-card.c index 93dbe40008c00..e5ae435171d68 100644 --- a/sound/soc/fsl/imx-card.c +++ b/sound/soc/fsl/imx-card.c @@ -516,7 +516,7 @@ static int imx_card_parse_of(struct imx_card_data *data) if (!card->dai_link) return -ENOMEM; - data->link_data = devm_kcalloc(dev, num_links, sizeof(*link), GFP_KERNEL); + data->link_data = devm_kcalloc(dev, num_links, sizeof(*link_data), GFP_KERNEL); if (!data->link_data) return -ENOMEM; -- GitLab From 5863bd44ed2fa27c6bb7b3f2b7bf9450b67e02d2 Mon Sep 17 00:00:00 2001 From: "Ritesh Harjani (IBM)" Date: Mon, 10 Mar 2025 07:44:09 -0500 Subject: [PATCH 0504/2211] book3s64/radix: Fix compile errors when CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=n [ Upstream commit 29bdc1f1c1df80868fb35bc69d1f073183adc6de ] Fix compile errors when CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=n Signed-off-by: Ritesh Harjani (IBM) Signed-off-by: Donet Tom Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/8231763344223c193e3452eab0ae8ea966aff466.1741609795.git.donettom@linux.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/mm/book3s64/radix_pgtable.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/mm/book3s64/radix_pgtable.c b/arch/powerpc/mm/book3s64/radix_pgtable.c index 04189689c127e..0d807bf2328d8 100644 --- a/arch/powerpc/mm/book3s64/radix_pgtable.c +++ b/arch/powerpc/mm/book3s64/radix_pgtable.c @@ -988,7 +988,7 @@ int __meminit radix__vmemmap_create_mapping(unsigned long start, return 0; } - +#ifdef CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP bool vmemmap_can_optimize(struct vmem_altmap *altmap, struct dev_pagemap *pgmap) { if (radix_enabled()) @@ -996,6 +996,7 @@ bool vmemmap_can_optimize(struct vmem_altmap *altmap, struct dev_pagemap *pgmap) return false; } +#endif int __meminit vmemmap_check_pmd(pmd_t *pmdp, int node, unsigned long addr, unsigned long next) -- GitLab From c134c62b9e97b2bd789e72d6fa89a37a3ab084fe Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl Date: Sat, 29 Mar 2025 20:01:32 +0100 Subject: [PATCH 0505/2211] pinctrl: meson: define the pull up/down resistor value as 60 kOhm [ Upstream commit e56088a13708757da68ad035269d69b93ac8c389 ] The public datasheets of the following Amlogic SoCs describe a typical resistor value for the built-in pull up/down resistor: - Meson8/8b/8m2: not documented - GXBB (S905): 60 kOhm - GXL (S905X): 60 kOhm - GXM (S912): 60 kOhm - G12B (S922X): 60 kOhm - SM1 (S905D3): 60 kOhm The public G12B and SM1 datasheets additionally state min and max values: - min value: 50 kOhm for both, pull-up and pull-down - max value for the pull-up: 70 kOhm - max value for the pull-down: 130 kOhm Use 60 kOhm in the pinctrl-meson driver as well so it's shown in the debugfs output. It may not be accurate for Meson8/8b/8m2 but in reality 60 kOhm is closer to the actual value than 1 Ohm. Signed-off-by: Martin Blumenstingl Reviewed-by: Neil Armstrong Link: https://lore.kernel.org/20250329190132.855196-1-martin.blumenstingl@googlemail.com Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/meson/pinctrl-meson.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c index 253a0cc57e396..e5a32a0532eee 100644 --- a/drivers/pinctrl/meson/pinctrl-meson.c +++ b/drivers/pinctrl/meson/pinctrl-meson.c @@ -487,7 +487,7 @@ static int meson_pinconf_get(struct pinctrl_dev *pcdev, unsigned int pin, case PIN_CONFIG_BIAS_PULL_DOWN: case PIN_CONFIG_BIAS_PULL_UP: if (meson_pinconf_get_pull(pc, pin) == param) - arg = 1; + arg = 60000; else return -EINVAL; break; -- GitLab From aa000a4ee9897762a254bd190ac314366fb7f0f3 Mon Sep 17 00:00:00 2001 From: Salah Triki Date: Wed, 16 Apr 2025 20:26:25 +0100 Subject: [PATCH 0506/2211] smb: server: smb2pdu: check return value of xa_store() [ Upstream commit af5226abb40cae959f424f7ca614787a1c87ce48 ] xa_store() may fail so check its return value and return error code if error occurred. Signed-off-by: Salah Triki Acked-by: Namjae Jeon Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/server/smb2pdu.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index f0760d786502f..08d9a7cfba8cd 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -1448,7 +1448,7 @@ static int ntlm_authenticate(struct ksmbd_work *work, { struct ksmbd_conn *conn = work->conn; struct ksmbd_session *sess = work->sess; - struct channel *chann = NULL; + struct channel *chann = NULL, *old; struct ksmbd_user *user; u64 prev_id; int sz, rc; @@ -1560,7 +1560,12 @@ binding_session: return -ENOMEM; chann->conn = conn; - xa_store(&sess->ksmbd_chann_list, (long)conn, chann, KSMBD_DEFAULT_GFP); + old = xa_store(&sess->ksmbd_chann_list, (long)conn, chann, + KSMBD_DEFAULT_GFP); + if (xa_is_err(old)) { + kfree(chann); + return xa_err(old); + } } } -- GitLab From 00fe4c0e469596e339d084d0d258af03c80fc790 Mon Sep 17 00:00:00 2001 From: Saranya Gopal Date: Mon, 21 Apr 2025 09:43:32 +0530 Subject: [PATCH 0507/2211] platform/x86/intel: hid: Add Pantherlake support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 12df9ec3e1955aed6a0c839f2375cd8e5d5150cf ] Add Pantherlake ACPI device ID to the Intel HID driver. While there, clean up the device ID table to remove the ", 0" parts. Suggested-by: Andy Shevchenko Signed-off-by: Saranya Gopal Reviewed-by: Andy Shevchenko Link: https://lore.kernel.org/r/20250421041332.830136-1-saranya.gopal@intel.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/intel/hid.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/drivers/platform/x86/intel/hid.c b/drivers/platform/x86/intel/hid.c index 9a609358956f3..59392f1a0d8ad 100644 --- a/drivers/platform/x86/intel/hid.c +++ b/drivers/platform/x86/intel/hid.c @@ -44,16 +44,17 @@ MODULE_LICENSE("GPL"); MODULE_AUTHOR("Alex Hung"); static const struct acpi_device_id intel_hid_ids[] = { - {"INT33D5", 0}, - {"INTC1051", 0}, - {"INTC1054", 0}, - {"INTC1070", 0}, - {"INTC1076", 0}, - {"INTC1077", 0}, - {"INTC1078", 0}, - {"INTC107B", 0}, - {"INTC10CB", 0}, - {"", 0}, + { "INT33D5" }, + { "INTC1051" }, + { "INTC1054" }, + { "INTC1070" }, + { "INTC1076" }, + { "INTC1077" }, + { "INTC1078" }, + { "INTC107B" }, + { "INTC10CB" }, + { "INTC10CC" }, + { } }; MODULE_DEVICE_TABLE(acpi, intel_hid_ids); -- GitLab From 2418bf5d383fa52b54560f3a91a0a8c2ab0d848f Mon Sep 17 00:00:00 2001 From: Pavel Nikulin Date: Fri, 18 Apr 2025 20:06:08 +0600 Subject: [PATCH 0508/2211] platform/x86: asus-wmi: Disable OOBE state after resume from hibernation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 77bdac73754e4c0c564c1ca80fe3d9c93b0e715a ] ASUS firmware resets OOBE state during S4 suspend, so the keyboard blinks during resume from hibernation. This patch disables OOBE state after resume from hibernation. Signed-off-by: Pavel Nikulin Link: https://lore.kernel.org/r/20250418140706.1691-1-pavel@noa-labs.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/asus-wmi.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c index a1cff9ff35a92..9d79c5ea8b495 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -304,6 +304,7 @@ struct asus_wmi { u32 kbd_rgb_dev; bool kbd_rgb_state_available; + bool oobe_state_available; u8 throttle_thermal_policy_mode; u32 throttle_thermal_policy_dev; @@ -1826,7 +1827,7 @@ static int asus_wmi_led_init(struct asus_wmi *asus) goto error; } - if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_OOBE)) { + if (asus->oobe_state_available) { /* * Disable OOBE state, so that e.g. the keyboard backlight * works. @@ -4741,6 +4742,7 @@ static int asus_wmi_add(struct platform_device *pdev) asus->egpu_enable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU); asus->dgpu_disable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_DGPU); asus->kbd_rgb_state_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_STATE); + asus->oobe_state_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_OOBE); asus->ally_mcu_usb_switch = acpi_has_method(NULL, ASUS_USB0_PWR_EC0_CSEE) && dmi_check_system(asus_ally_mcu_quirk); @@ -4994,6 +4996,13 @@ static int asus_hotk_restore(struct device *device) } if (!IS_ERR_OR_NULL(asus->kbd_led.dev)) kbd_led_update(asus); + if (asus->oobe_state_available) { + /* + * Disable OOBE state, so that e.g. the keyboard backlight + * works. + */ + asus_wmi_set_devstate(ASUS_WMI_DEVID_OOBE, 1, NULL); + } if (asus_wmi_has_fnlock_key(asus)) asus_wmi_fnlock_update(asus); -- GitLab From 4c7a0425fb6209a756f8e63cd2a6f7bf0a1f962a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C5=A1per=20Nemgar?= Date: Fri, 18 Apr 2025 09:07:38 +0200 Subject: [PATCH 0509/2211] platform/x86: ideapad-laptop: add support for some new buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 02c6e43397c39edd0c172859bf8c851b46be09a8 ] Add entries to unsupported WMI codes in ideapad_keymap[] and one check for WMI code 0x13d to trigger platform_profile_cycle(). Signed-off-by: Gašper Nemgar Reviewed-by: Hans de Goede Link: https://lore.kernel.org/r/20250418070738.7171-1-gasper.nemgar@gmail.com [ij: joined nested if ()s & major tweaks to changelog] Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/ideapad-laptop.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c index c908f52ed717b..bdb4cbee42058 100644 --- a/drivers/platform/x86/ideapad-laptop.c +++ b/drivers/platform/x86/ideapad-laptop.c @@ -1297,6 +1297,16 @@ static const struct key_entry ideapad_keymap[] = { /* Specific to some newer models */ { KE_KEY, 0x3e | IDEAPAD_WMI_KEY, { KEY_MICMUTE } }, { KE_KEY, 0x3f | IDEAPAD_WMI_KEY, { KEY_RFKILL } }, + /* Star- (User Assignable Key) */ + { KE_KEY, 0x44 | IDEAPAD_WMI_KEY, { KEY_PROG1 } }, + /* Eye */ + { KE_KEY, 0x45 | IDEAPAD_WMI_KEY, { KEY_PROG3 } }, + /* Performance toggle also Fn+Q, handled inside ideapad_wmi_notify() */ + { KE_KEY, 0x3d | IDEAPAD_WMI_KEY, { KEY_PROG4 } }, + /* shift + prtsc */ + { KE_KEY, 0x2d | IDEAPAD_WMI_KEY, { KEY_CUT } }, + { KE_KEY, 0x29 | IDEAPAD_WMI_KEY, { KEY_TOUCHPAD_TOGGLE } }, + { KE_KEY, 0x2a | IDEAPAD_WMI_KEY, { KEY_ROOT_MENU } }, { KE_END }, }; @@ -2083,6 +2093,12 @@ static void ideapad_wmi_notify(struct wmi_device *wdev, union acpi_object *data) dev_dbg(&wdev->dev, "WMI fn-key event: 0x%llx\n", data->integer.value); + /* performance button triggered by 0x3d */ + if (data->integer.value == 0x3d && priv->dytc) { + platform_profile_cycle(); + break; + } + /* 0x02 FnLock, 0x03 Esc */ if (data->integer.value == 0x02 || data->integer.value == 0x03) ideapad_fn_lock_led_notify(priv, data->integer.value == 0x02); -- GitLab From 63affdae7ff494a9f685726f23dfafdec12fd241 Mon Sep 17 00:00:00 2001 From: Charles Keepax Date: Wed, 23 Apr 2025 10:09:44 +0100 Subject: [PATCH 0510/2211] ASoC: cs42l43: Disable headphone clamps during type detection [ Upstream commit 70ad2e6bd180f94be030aef56e59693e36d945f3 ] The headphone clamps cause fairly loud pops during type detect because they sink current from the detection process itself. Disable the clamps whilst the type detect runs, to improve the detection pop performance. Signed-off-by: Charles Keepax Link: https://patch.msgid.link/20250423090944.1504538-1-ckeepax@opensource.cirrus.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/cs42l43-jack.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sound/soc/codecs/cs42l43-jack.c b/sound/soc/codecs/cs42l43-jack.c index 73d764fc85392..984a7f470a31f 100644 --- a/sound/soc/codecs/cs42l43-jack.c +++ b/sound/soc/codecs/cs42l43-jack.c @@ -654,6 +654,10 @@ static int cs42l43_run_type_detect(struct cs42l43_codec *priv) reinit_completion(&priv->type_detect); + regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL, + CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK, + CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK); + cs42l43_start_hs_bias(priv, true); regmap_update_bits(cs42l43->regmap, CS42L43_HS2, CS42L43_HSDET_MODE_MASK, 0x3 << CS42L43_HSDET_MODE_SHIFT); @@ -665,6 +669,9 @@ static int cs42l43_run_type_detect(struct cs42l43_codec *priv) CS42L43_HSDET_MODE_MASK, 0x2 << CS42L43_HSDET_MODE_SHIFT); cs42l43_stop_hs_bias(priv); + regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL, + CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK, 0); + if (!time_left) return -ETIMEDOUT; -- GitLab From 8f76431c00b2dab4fbc0b359747a5f7a2f9d126a Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Sun, 20 Apr 2025 10:56:59 +0200 Subject: [PATCH 0511/2211] ASoC: Intel: bytcr_rt5640: Add DMI quirk for Acer Aspire SW3-013 [ Upstream commit a549b927ea3f5e50b1394209b64e6e17e31d4db8 ] Acer Aspire SW3-013 requires the very same quirk as other Acer Aspire model for making it working. Link: https://bugzilla.kernel.org/show_bug.cgi?id=220011 Signed-off-by: Takashi Iwai Link: https://patch.msgid.link/20250420085716.12095-1-tiwai@suse.de Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/intel/boards/bytcr_rt5640.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c index 1148e9498d8e8..b6434b4731261 100644 --- a/sound/soc/intel/boards/bytcr_rt5640.c +++ b/sound/soc/intel/boards/bytcr_rt5640.c @@ -576,6 +576,19 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = { BYT_RT5640_SSP0_AIF2 | BYT_RT5640_MCLK_EN), }, + { /* Acer Aspire SW3-013 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW3-013"), + }, + .driver_data = (void *)(BYT_RT5640_DMIC1_MAP | + BYT_RT5640_JD_SRC_JD2_IN4N | + BYT_RT5640_OVCD_TH_2000UA | + BYT_RT5640_OVCD_SF_0P75 | + BYT_RT5640_DIFF_MIC | + BYT_RT5640_SSP0_AIF1 | + BYT_RT5640_MCLK_EN), + }, { .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Acer"), -- GitLab From 35ec11b38588cfb336127ad45a989f13b88804b0 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Sun, 27 Apr 2025 10:10:34 +0200 Subject: [PATCH 0512/2211] ALSA: hda/realtek: Add quirk for HP Spectre x360 15-df1xxx [ Upstream commit be0c40da888840fe91b45474cb70779e6cbaf7ca ] HP Spectre x360 15-df1xxx with SSID 13c:863e requires similar workarounds that were applied to another HP Spectre x360 models; it has a mute LED only, no micmute LEDs, and needs the speaker GPIO seup. Link: https://bugzilla.kernel.org/show_bug.cgi?id=220054 Link: https://patch.msgid.link/20250427081035.11567-1-tiwai@suse.de Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/pci/hda/patch_realtek.c | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 0b243adac8cf4..015c66b9003a4 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -6965,6 +6965,41 @@ static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec, } } +/* GPIO1 = amplifier on/off */ +static void alc285_fixup_hp_spectre_x360_df1(struct hda_codec *codec, + const struct hda_fixup *fix, + int action) +{ + struct alc_spec *spec = codec->spec; + static const hda_nid_t conn[] = { 0x02 }; + static const struct hda_pintbl pincfgs[] = { + { 0x14, 0x90170110 }, /* front/high speakers */ + { 0x17, 0x90170130 }, /* back/bass speakers */ + { } + }; + + // enable mute led + alc285_fixup_hp_mute_led_coefbit(codec, fix, action); + + switch (action) { + case HDA_FIXUP_ACT_PRE_PROBE: + /* needed for amp of back speakers */ + spec->gpio_mask |= 0x01; + spec->gpio_dir |= 0x01; + snd_hda_apply_pincfgs(codec, pincfgs); + /* share DAC to have unified volume control */ + snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn); + snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); + break; + case HDA_FIXUP_ACT_INIT: + /* need to toggle GPIO to enable the amp of back speakers */ + alc_update_gpio_data(codec, 0x01, true); + msleep(100); + alc_update_gpio_data(codec, 0x01, false); + break; + } +} + static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec, const struct hda_fixup *fix, int action) { @@ -7730,6 +7765,7 @@ enum { ALC280_FIXUP_HP_9480M, ALC245_FIXUP_HP_X360_AMP, ALC285_FIXUP_HP_SPECTRE_X360_EB1, + ALC285_FIXUP_HP_SPECTRE_X360_DF1, ALC285_FIXUP_HP_ENVY_X360, ALC288_FIXUP_DELL_HEADSET_MODE, ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, @@ -9798,6 +9834,10 @@ static const struct hda_fixup alc269_fixups[] = { .type = HDA_FIXUP_FUNC, .v.func = alc285_fixup_hp_spectre_x360_eb1 }, + [ALC285_FIXUP_HP_SPECTRE_X360_DF1] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc285_fixup_hp_spectre_x360_df1 + }, [ALC285_FIXUP_HP_ENVY_X360] = { .type = HDA_FIXUP_FUNC, .v.func = alc285_fixup_hp_envy_x360, @@ -10515,6 +10555,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x86c1, "HP Laptop 15-da3001TU", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO), SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1), + SND_PCI_QUIRK(0x103c, 0x863e, "HP Spectre x360 15-df1xxx", ALC285_FIXUP_HP_SPECTRE_X360_DF1), SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1), SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED), SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT), @@ -11404,6 +11445,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = { {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"}, {.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"}, {.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"}, + {.id = ALC285_FIXUP_HP_SPECTRE_X360_DF1, .name = "alc285-hp-spectre-x360-df1"}, {.id = ALC285_FIXUP_HP_ENVY_X360, .name = "alc285-hp-envy-x360"}, {.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"}, {.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"}, -- GitLab From ff214b079d55ed596b7e820d2a3a5a6116434f19 Mon Sep 17 00:00:00 2001 From: Wentao Guan Date: Tue, 22 Apr 2025 20:17:25 +0800 Subject: [PATCH 0513/2211] nvme-pci: add quirks for device 126f:1001 [ Upstream commit 5b960f92ac3e5b4d7f60a506a6b6735eead1da01 ] This commit adds NVME_QUIRK_NO_DEEPEST_PS and NVME_QUIRK_BOGUS_NID for device [126f:1001]. It is similar to commit e89086c43f05 ("drivers/nvme: Add quirks for device 126f:2262") Diff is according the dmesg, use NVME_QUIRK_IGNORE_DEV_SUBNQN. dmesg | grep -i nvme0: nvme nvme0: pci function 0000:01:00.0 nvme nvme0: missing or invalid SUBNQN field. nvme nvme0: 12/0/0 default/read/poll queues Link:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e89086c43f0500bc7c4ce225495b73b8ce234c1f Signed-off-by: Wentao Guan Signed-off-by: WangYuli Reviewed-by: Sagi Grimberg Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/host/pci.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 265b3608ae26e..f2c06bb96c8d2 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -3587,6 +3587,9 @@ static const struct pci_device_id nvme_id_table[] = { .driver_data = NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(0x1217, 0x8760), /* O2 Micro 64GB Steam Deck */ .driver_data = NVME_QUIRK_DMAPOOL_ALIGN_512, }, + { PCI_DEVICE(0x126f, 0x1001), /* Silicon Motion generic */ + .driver_data = NVME_QUIRK_NO_DEEPEST_PS | + NVME_QUIRK_IGNORE_DEV_SUBNQN, }, { PCI_DEVICE(0x126f, 0x2262), /* Silicon Motion generic */ .driver_data = NVME_QUIRK_NO_DEEPEST_PS | NVME_QUIRK_BOGUS_NID, }, -- GitLab From 6d196cae4b0b2432f2638eced6f4a8989974dd56 Mon Sep 17 00:00:00 2001 From: Wentao Guan Date: Thu, 24 Apr 2025 10:40:10 +0800 Subject: [PATCH 0514/2211] nvme-pci: add quirks for WDC Blue SN550 15b7:5009 [ Upstream commit ab35ad950d439ec3409509835d229b3d93d3c7f9 ] Add two quirks for the WDC Blue SN550 (PCI ID 15b7:5009) based on user reports and hardware analysis: - NVME_QUIRK_NO_DEEPEST_PS: liaozw talked to me the problem and solved with nvme_core.default_ps_max_latency_us=0, so add the quirk. I also found some reports in the following link. - NVME_QUIRK_BROKEN_MSI: after get the lspci from Jack Rio. I think that the disk also have NVME_QUIRK_BROKEN_MSI. described in commit d5887dc6b6c0 ("nvme-pci: Add quirk for broken MSIs") as sean said in link which match the MSI 1/32 and MSI-X 17. Log: lspci -nn | grep -i memory 03:00.0 Non-Volatile memory controller [0108]: Sandisk Corp SanDisk Ultra 3D / WD PC SN530, IX SN530, Blue SN550 NVMe SSD (DRAM-less) [15b7:5009] (rev 01) lspci -v -d 15b7:5009 03:00.0 Non-Volatile memory controller: Sandisk Corp SanDisk Ultra 3D / WD PC SN530, IX SN530, Blue SN550 NVMe SSD (DRAM-less) (rev 01) (prog-if 02 [NVM Express]) Subsystem: Sandisk Corp WD Blue SN550 NVMe SSD Flags: bus master, fast devsel, latency 0, IRQ 35, IOMMU group 10 Memory at fe800000 (64-bit, non-prefetchable) [size=16K] Memory at fe804000 (64-bit, non-prefetchable) [size=256] Capabilities: [80] Power Management version 3 Capabilities: [90] MSI: Enable- Count=1/32 Maskable- 64bit+ Capabilities: [b0] MSI-X: Enable+ Count=17 Masked- Capabilities: [c0] Express Endpoint, MSI 00 Capabilities: [100] Advanced Error Reporting Capabilities: [150] Device Serial Number 00-00-00-00-00-00-00-00 Capabilities: [1b8] Latency Tolerance Reporting Capabilities: [300] Secondary PCI Express Capabilities: [900] L1 PM Substates Kernel driver in use: nvme dmesg | grep nvme [ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-6.12.20-amd64-desktop-rolling root=UUID= ro splash quiet nvme_core.default_ps_max_latency_us=0 DEEPIN_GFXMODE= [ 0.059301] Kernel command line: BOOT_IMAGE=/vmlinuz-6.12.20-amd64-desktop-rolling root=UUID= ro splash quiet nvme_core.default_ps_max_latency_us=0 DEEPIN_GFXMODE= [ 0.542430] nvme nvme0: pci function 0000:03:00.0 [ 0.560426] nvme nvme0: allocated 32 MiB host memory buffer. [ 0.562491] nvme nvme0: 16/0/0 default/read/poll queues [ 0.567764] nvme0n1: p1 p2 p3 p4 p5 p6 p7 p8 p9 [ 6.388726] EXT4-fs (nvme0n1p7): mounted filesystem ro with ordered data mode. Quota mode: none. [ 6.893421] EXT4-fs (nvme0n1p7): re-mounted r/w. Quota mode: none. [ 7.125419] Adding 16777212k swap on /dev/nvme0n1p8. Priority:-2 extents:1 across:16777212k SS [ 7.157588] EXT4-fs (nvme0n1p6): mounted filesystem r/w with ordered data mode. Quota mode: none. [ 7.165021] EXT4-fs (nvme0n1p9): mounted filesystem r/w with ordered data mode. Quota mode: none. [ 8.036932] nvme nvme0: using unchecked data buffer [ 8.096023] block nvme0n1: No UUID available providing old NGUID Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d5887dc6b6c054d0da3cd053afc15b7be1f45ff6 Link: https://lore.kernel.org/all/20240422162822.3539156-1-sean.anderson@linux.dev/ Reported-by: liaozw Closes: https://bbs.deepin.org.cn/post/286300 Reported-by: rugk Closes: https://bugzilla.kernel.org/show_bug.cgi?id=208123 Signed-off-by: Wentao Guan Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/host/pci.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index f2c06bb96c8d2..cd8a10f6accff 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -3613,6 +3613,9 @@ static const struct pci_device_id nvme_id_table[] = { NVME_QUIRK_IGNORE_DEV_SUBNQN, }, { PCI_DEVICE(0x15b7, 0x5008), /* Sandisk SN530 */ .driver_data = NVME_QUIRK_BROKEN_MSI }, + { PCI_DEVICE(0x15b7, 0x5009), /* Sandisk SN550 */ + .driver_data = NVME_QUIRK_BROKEN_MSI | + NVME_QUIRK_NO_DEEPEST_PS }, { PCI_DEVICE(0x1987, 0x5012), /* Phison E12 */ .driver_data = NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(0x1987, 0x5016), /* Phison E16 */ -- GitLab From 6a09b6bad09a6f0bb499430ae3aa58a4a085ec6e Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Tue, 29 Apr 2025 20:36:15 +0200 Subject: [PATCH 0515/2211] ALSA: usb-audio: Fix duplicated name in MIDI substream names [ Upstream commit 0759e77a6d9bd34a874da73721ce4a7dc6665023 ] The MIDI substream name string is constructed from the combination of the card shortname (which is taken from USB iProduct) and the USB iJack. The problem is that some devices put the product name to the iJack field, too. For example, aplaymidi -l output on the Lanchkey MK 49 are like: % aplaymidi -l Port Client name Port name 44:0 Launchkey MK4 49 Launchkey MK4 49 Launchkey MK4 44:1 Launchkey MK4 49 Launchkey MK4 49 Launchkey MK4 where the actual iJack name can't be seen because it's truncated due to the doubly words. For resolving those situations, this patch compares the iJack string with the card shortname, and drops if both start with the same words. Then the result becomes like: % aplaymidi -l Port Client name Port name 40:0 Launchkey MK4 49 Launchkey MK4 49 MIDI In 40:1 Launchkey MK4 49 Launchkey MK4 49 DAW In A caveat is that there are some pre-defined names for certain devices in the driver code, and this workaround shouldn't be applied to them. Similarly, when the iJack isn't specified, we should skip this check, too. The patch added those checks in addition to the string comparison. Suggested-by: Paul Davis Tested-by: Paul Davis Link: https://lore.kernel.org/CAFa_cKmEDQWcJatbYWi6A58Zg4Ma9_6Nr3k5LhqwyxC-P_kXtw@mail.gmail.com Link: https://patch.msgid.link/20250429183626.20773-1-tiwai@suse.de Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/usb/midi.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/sound/usb/midi.c b/sound/usb/midi.c index 826ac870f2469..a792ada18863a 100644 --- a/sound/usb/midi.c +++ b/sound/usb/midi.c @@ -1885,10 +1885,18 @@ static void snd_usbmidi_init_substream(struct snd_usb_midi *umidi, } port_info = find_port_info(umidi, number); - name_format = port_info ? port_info->name : - (jack_name != default_jack_name ? "%s %s" : "%s %s %d"); - snprintf(substream->name, sizeof(substream->name), - name_format, umidi->card->shortname, jack_name, number + 1); + if (port_info || jack_name == default_jack_name || + strncmp(umidi->card->shortname, jack_name, strlen(umidi->card->shortname)) != 0) { + name_format = port_info ? port_info->name : + (jack_name != default_jack_name ? "%s %s" : "%s %s %d"); + snprintf(substream->name, sizeof(substream->name), + name_format, umidi->card->shortname, jack_name, number + 1); + } else { + /* The manufacturer included the iProduct name in the jack + * name, do not use both + */ + strscpy(substream->name, jack_name); + } *rsubstream = substream; } -- GitLab From ec462449f4cf616b0aa2ed119f5f44b5fdfcefab Mon Sep 17 00:00:00 2001 From: Alistair Francis Date: Wed, 23 Apr 2025 16:06:21 +1000 Subject: [PATCH 0516/2211] nvmet-tcp: don't restore null sk_state_change [ Upstream commit 46d22b47df2741996af277a2838b95f130436c13 ] queue->state_change is set as part of nvmet_tcp_set_queue_sock(), but if the TCP connection isn't established when nvmet_tcp_set_queue_sock() is called then queue->state_change isn't set and sock->sk->sk_state_change isn't replaced. As such we don't need to restore sock->sk->sk_state_change if queue->state_change is NULL. This avoids NULL pointer dereferences such as this: [ 286.462026][ C0] BUG: kernel NULL pointer dereference, address: 0000000000000000 [ 286.462814][ C0] #PF: supervisor instruction fetch in kernel mode [ 286.463796][ C0] #PF: error_code(0x0010) - not-present page [ 286.464392][ C0] PGD 8000000140620067 P4D 8000000140620067 PUD 114201067 PMD 0 [ 286.465086][ C0] Oops: Oops: 0010 [#1] SMP KASAN PTI [ 286.465559][ C0] CPU: 0 UID: 0 PID: 1628 Comm: nvme Not tainted 6.15.0-rc2+ #11 PREEMPT(voluntary) [ 286.466393][ C0] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-3.fc41 04/01/2014 [ 286.467147][ C0] RIP: 0010:0x0 [ 286.467420][ C0] Code: Unable to access opcode bytes at 0xffffffffffffffd6. [ 286.467977][ C0] RSP: 0018:ffff8883ae008580 EFLAGS: 00010246 [ 286.468425][ C0] RAX: 0000000000000000 RBX: ffff88813fd34100 RCX: ffffffffa386cc43 [ 286.469019][ C0] RDX: 1ffff11027fa68b6 RSI: 0000000000000008 RDI: ffff88813fd34100 [ 286.469545][ C0] RBP: ffff88813fd34160 R08: 0000000000000000 R09: ffffed1027fa682c [ 286.470072][ C0] R10: ffff88813fd34167 R11: 0000000000000000 R12: ffff88813fd344c3 [ 286.470585][ C0] R13: ffff88813fd34112 R14: ffff88813fd34aec R15: ffff888132cdd268 [ 286.471070][ C0] FS: 00007fe3c04c7d80(0000) GS:ffff88840743f000(0000) knlGS:0000000000000000 [ 286.471644][ C0] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 286.472543][ C0] CR2: ffffffffffffffd6 CR3: 000000012daca000 CR4: 00000000000006f0 [ 286.473500][ C0] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 286.474467][ C0] DR3: 0000000000000000 DR6: 00000000ffff07f0 DR7: 0000000000000400 [ 286.475453][ C0] Call Trace: [ 286.476102][ C0] [ 286.476719][ C0] tcp_fin+0x2bb/0x440 [ 286.477429][ C0] tcp_data_queue+0x190f/0x4e60 [ 286.478174][ C0] ? __build_skb_around+0x234/0x330 [ 286.478940][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.479659][ C0] ? __pfx_tcp_data_queue+0x10/0x10 [ 286.480431][ C0] ? tcp_try_undo_loss+0x640/0x6c0 [ 286.481196][ C0] ? seqcount_lockdep_reader_access.constprop.0+0x82/0x90 [ 286.482046][ C0] ? kvm_clock_get_cycles+0x14/0x30 [ 286.482769][ C0] ? ktime_get+0x66/0x150 [ 286.483433][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.484146][ C0] tcp_rcv_established+0x6e4/0x2050 [ 286.484857][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.485523][ C0] ? ipv4_dst_check+0x160/0x2b0 [ 286.486203][ C0] ? __pfx_tcp_rcv_established+0x10/0x10 [ 286.486917][ C0] ? lock_release+0x217/0x2c0 [ 286.487595][ C0] tcp_v4_do_rcv+0x4d6/0x9b0 [ 286.488279][ C0] tcp_v4_rcv+0x2af8/0x3e30 [ 286.488904][ C0] ? raw_local_deliver+0x51b/0xad0 [ 286.489551][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.490198][ C0] ? __pfx_tcp_v4_rcv+0x10/0x10 [ 286.490813][ C0] ? __pfx_raw_local_deliver+0x10/0x10 [ 286.491487][ C0] ? __pfx_nf_confirm+0x10/0x10 [nf_conntrack] [ 286.492275][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.492900][ C0] ip_protocol_deliver_rcu+0x8f/0x370 [ 286.493579][ C0] ip_local_deliver_finish+0x297/0x420 [ 286.494268][ C0] ip_local_deliver+0x168/0x430 [ 286.494867][ C0] ? __pfx_ip_local_deliver+0x10/0x10 [ 286.495498][ C0] ? __pfx_ip_local_deliver_finish+0x10/0x10 [ 286.496204][ C0] ? ip_rcv_finish_core+0x19a/0x1f20 [ 286.496806][ C0] ? lock_release+0x217/0x2c0 [ 286.497414][ C0] ip_rcv+0x455/0x6e0 [ 286.497945][ C0] ? __pfx_ip_rcv+0x10/0x10 [ 286.498550][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.499137][ C0] ? __pfx_ip_rcv_finish+0x10/0x10 [ 286.499763][ C0] ? lock_release+0x217/0x2c0 [ 286.500327][ C0] ? dl_scaled_delta_exec+0xd1/0x2c0 [ 286.500922][ C0] ? __pfx_ip_rcv+0x10/0x10 [ 286.501480][ C0] __netif_receive_skb_one_core+0x166/0x1b0 [ 286.502173][ C0] ? __pfx___netif_receive_skb_one_core+0x10/0x10 [ 286.502903][ C0] ? lock_acquire+0x2b2/0x310 [ 286.503487][ C0] ? process_backlog+0x372/0x1350 [ 286.504087][ C0] ? lock_release+0x217/0x2c0 [ 286.504642][ C0] process_backlog+0x3b9/0x1350 [ 286.505214][ C0] ? process_backlog+0x372/0x1350 [ 286.505779][ C0] __napi_poll.constprop.0+0xa6/0x490 [ 286.506363][ C0] net_rx_action+0x92e/0xe10 [ 286.506889][ C0] ? __pfx_net_rx_action+0x10/0x10 [ 286.507437][ C0] ? timerqueue_add+0x1f0/0x320 [ 286.507977][ C0] ? sched_clock_cpu+0x68/0x540 [ 286.508492][ C0] ? lock_acquire+0x2b2/0x310 [ 286.509043][ C0] ? kvm_sched_clock_read+0xd/0x20 [ 286.509607][ C0] ? handle_softirqs+0x1aa/0x7d0 [ 286.510187][ C0] handle_softirqs+0x1f2/0x7d0 [ 286.510754][ C0] ? __pfx_handle_softirqs+0x10/0x10 [ 286.511348][ C0] ? irqtime_account_irq+0x181/0x290 [ 286.511937][ C0] ? __dev_queue_xmit+0x85d/0x3450 [ 286.512510][ C0] do_softirq.part.0+0x89/0xc0 [ 286.513100][ C0] [ 286.513548][ C0] [ 286.513953][ C0] __local_bh_enable_ip+0x112/0x140 [ 286.514522][ C0] ? __dev_queue_xmit+0x85d/0x3450 [ 286.515072][ C0] __dev_queue_xmit+0x872/0x3450 [ 286.515619][ C0] ? nft_do_chain+0xe16/0x15b0 [nf_tables] [ 286.516252][ C0] ? __pfx___dev_queue_xmit+0x10/0x10 [ 286.516817][ C0] ? selinux_ip_postroute+0x43c/0xc50 [ 286.517433][ C0] ? __pfx_selinux_ip_postroute+0x10/0x10 [ 286.518061][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.518606][ C0] ? ip_output+0x164/0x4a0 [ 286.519149][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.519671][ C0] ? ip_finish_output2+0x17d5/0x1fb0 [ 286.520258][ C0] ip_finish_output2+0xb4b/0x1fb0 [ 286.520787][ C0] ? __pfx_ip_finish_output2+0x10/0x10 [ 286.521355][ C0] ? __ip_finish_output+0x15d/0x750 [ 286.521890][ C0] ip_output+0x164/0x4a0 [ 286.522372][ C0] ? __pfx_ip_output+0x10/0x10 [ 286.522872][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.523402][ C0] ? _raw_spin_unlock_irqrestore+0x4c/0x60 [ 286.524031][ C0] ? __pfx_ip_finish_output+0x10/0x10 [ 286.524605][ C0] ? __ip_queue_xmit+0x999/0x2260 [ 286.525200][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.525744][ C0] ? ipv4_dst_check+0x16a/0x2b0 [ 286.526279][ C0] ? lock_release+0x217/0x2c0 [ 286.526793][ C0] __ip_queue_xmit+0x1883/0x2260 [ 286.527324][ C0] ? __skb_clone+0x54c/0x730 [ 286.527827][ C0] __tcp_transmit_skb+0x209b/0x37a0 [ 286.528374][ C0] ? __pfx___tcp_transmit_skb+0x10/0x10 [ 286.528952][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.529472][ C0] ? seqcount_lockdep_reader_access.constprop.0+0x82/0x90 [ 286.530152][ C0] ? trace_hardirqs_on+0x12/0x120 [ 286.530691][ C0] tcp_write_xmit+0xb81/0x88b0 [ 286.531224][ C0] ? mod_memcg_state+0x4d/0x60 [ 286.531736][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.532253][ C0] __tcp_push_pending_frames+0x90/0x320 [ 286.532826][ C0] tcp_send_fin+0x141/0xb50 [ 286.533352][ C0] ? __pfx_tcp_send_fin+0x10/0x10 [ 286.533908][ C0] ? __local_bh_enable_ip+0xab/0x140 [ 286.534495][ C0] inet_shutdown+0x243/0x320 [ 286.535077][ C0] nvme_tcp_alloc_queue+0xb3b/0x2590 [nvme_tcp] [ 286.535709][ C0] ? do_raw_spin_lock+0x129/0x260 [ 286.536314][ C0] ? __pfx_nvme_tcp_alloc_queue+0x10/0x10 [nvme_tcp] [ 286.536996][ C0] ? do_raw_spin_unlock+0x54/0x1e0 [ 286.537550][ C0] ? _raw_spin_unlock+0x29/0x50 [ 286.538127][ C0] ? do_raw_spin_lock+0x129/0x260 [ 286.538664][ C0] ? __pfx_do_raw_spin_lock+0x10/0x10 [ 286.539249][ C0] ? nvme_tcp_alloc_admin_queue+0xd5/0x340 [nvme_tcp] [ 286.539892][ C0] ? __wake_up+0x40/0x60 [ 286.540392][ C0] nvme_tcp_alloc_admin_queue+0xd5/0x340 [nvme_tcp] [ 286.541047][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.541589][ C0] nvme_tcp_setup_ctrl+0x8b/0x7a0 [nvme_tcp] [ 286.542254][ C0] ? _raw_spin_unlock_irqrestore+0x4c/0x60 [ 286.542887][ C0] ? __pfx_nvme_tcp_setup_ctrl+0x10/0x10 [nvme_tcp] [ 286.543568][ C0] ? trace_hardirqs_on+0x12/0x120 [ 286.544166][ C0] ? _raw_spin_unlock_irqrestore+0x35/0x60 [ 286.544792][ C0] ? nvme_change_ctrl_state+0x196/0x2e0 [nvme_core] [ 286.545477][ C0] nvme_tcp_create_ctrl+0x839/0xb90 [nvme_tcp] [ 286.546126][ C0] nvmf_dev_write+0x3db/0x7e0 [nvme_fabrics] [ 286.546775][ C0] ? rw_verify_area+0x69/0x520 [ 286.547334][ C0] vfs_write+0x218/0xe90 [ 286.547854][ C0] ? do_syscall_64+0x9f/0x190 [ 286.548408][ C0] ? trace_hardirqs_on_prepare+0xdb/0x120 [ 286.549037][ C0] ? syscall_exit_to_user_mode+0x93/0x280 [ 286.549659][ C0] ? __pfx_vfs_write+0x10/0x10 [ 286.550259][ C0] ? do_syscall_64+0x9f/0x190 [ 286.550840][ C0] ? syscall_exit_to_user_mode+0x8e/0x280 [ 286.551516][ C0] ? trace_hardirqs_on_prepare+0xdb/0x120 [ 286.552180][ C0] ? syscall_exit_to_user_mode+0x93/0x280 [ 286.552834][ C0] ? ksys_read+0xf5/0x1c0 [ 286.553386][ C0] ? __pfx_ksys_read+0x10/0x10 [ 286.553964][ C0] ksys_write+0xf5/0x1c0 [ 286.554499][ C0] ? __pfx_ksys_write+0x10/0x10 [ 286.555072][ C0] ? trace_hardirqs_on_prepare+0xdb/0x120 [ 286.555698][ C0] ? syscall_exit_to_user_mode+0x93/0x280 [ 286.556319][ C0] ? do_syscall_64+0x54/0x190 [ 286.556866][ C0] do_syscall_64+0x93/0x190 [ 286.557420][ C0] ? rcu_read_unlock+0x17/0x60 [ 286.557986][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.558526][ C0] ? lock_release+0x217/0x2c0 [ 286.559087][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.559659][ C0] ? count_memcg_events.constprop.0+0x4a/0x60 [ 286.560476][ C0] ? exc_page_fault+0x7a/0x110 [ 286.561064][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.561647][ C0] ? lock_release+0x217/0x2c0 [ 286.562257][ C0] ? do_user_addr_fault+0x171/0xa00 [ 286.562839][ C0] ? do_user_addr_fault+0x4a2/0xa00 [ 286.563453][ C0] ? irqentry_exit_to_user_mode+0x84/0x270 [ 286.564112][ C0] ? rcu_is_watching+0x11/0xb0 [ 286.564677][ C0] ? irqentry_exit_to_user_mode+0x84/0x270 [ 286.565317][ C0] ? trace_hardirqs_on_prepare+0xdb/0x120 [ 286.565922][ C0] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 286.566542][ C0] RIP: 0033:0x7fe3c05e6504 [ 286.567102][ C0] Code: c7 00 16 00 00 00 b8 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 f3 0f 1e fa 80 3d c5 8b 10 00 00 74 13 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 54 c3 0f 1f 00 55 48 89 e5 48 83 ec 20 48 89 [ 286.568931][ C0] RSP: 002b:00007fff76444f58 EFLAGS: 00000202 ORIG_RAX: 0000000000000001 [ 286.569807][ C0] RAX: ffffffffffffffda RBX: 000000003b40d930 RCX: 00007fe3c05e6504 [ 286.570621][ C0] RDX: 00000000000000cf RSI: 000000003b40d930 RDI: 0000000000000003 [ 286.571443][ C0] RBP: 0000000000000003 R08: 00000000000000cf R09: 000000003b40d930 [ 286.572246][ C0] R10: 0000000000000000 R11: 0000000000000202 R12: 000000003b40cd60 [ 286.573069][ C0] R13: 00000000000000cf R14: 00007fe3c07417f8 R15: 00007fe3c073502e [ 286.573886][ C0] Closes: https://lore.kernel.org/linux-nvme/5hdonndzoqa265oq3bj6iarwtfk5dewxxjtbjvn5uqnwclpwt6@a2n6w3taxxex/ Signed-off-by: Alistair Francis Reviewed-by: Sagi Grimberg Tested-by: Shin'ichiro Kawasaki Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/target/tcp.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index 4f9cac8a5abe0..259ad77c03c50 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -1560,6 +1560,9 @@ static void nvmet_tcp_restore_socket_callbacks(struct nvmet_tcp_queue *queue) { struct socket *sock = queue->sock; + if (!queue->state_change) + return; + write_lock_bh(&sock->sk->sk_callback_lock); sock->sk->sk_data_ready = queue->data_ready; sock->sk->sk_state_change = queue->state_change; -- GitLab From ad3e83a6c80335e285b62786097b4dc53dbad170 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 30 Apr 2025 07:17:17 -0600 Subject: [PATCH 0517/2211] io_uring/fdinfo: annotate racy sq/cq head/tail reads [ Upstream commit f024d3a8ded0d8d2129ae123d7a5305c29ca44ce ] syzbot complains about the cached sq head read, and it's totally right. But we don't need to care, it's just reading fdinfo, and reading the CQ or SQ tail/head entries are known racy in that they are just a view into that very instant and may of course be outdated by the time they are reported. Annotate both the SQ head and CQ tail read with data_race() to avoid this syzbot complaint. Link: https://lore.kernel.org/io-uring/6811f6dc.050a0220.39e3a1.0d0e.GAE@google.com/ Reported-by: syzbot+3e77fd302e99f5af9394@syzkaller.appspotmail.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- io_uring/fdinfo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/io_uring/fdinfo.c b/io_uring/fdinfo.c index 6b1247664b355..ecdbe473a49f7 100644 --- a/io_uring/fdinfo.c +++ b/io_uring/fdinfo.c @@ -83,11 +83,11 @@ __cold void io_uring_show_fdinfo(struct seq_file *m, struct file *file) seq_printf(m, "SqMask:\t0x%x\n", sq_mask); seq_printf(m, "SqHead:\t%u\n", sq_head); seq_printf(m, "SqTail:\t%u\n", sq_tail); - seq_printf(m, "CachedSqHead:\t%u\n", ctx->cached_sq_head); + seq_printf(m, "CachedSqHead:\t%u\n", data_race(ctx->cached_sq_head)); seq_printf(m, "CqMask:\t0x%x\n", cq_mask); seq_printf(m, "CqHead:\t%u\n", cq_head); seq_printf(m, "CqTail:\t%u\n", cq_tail); - seq_printf(m, "CachedCqTail:\t%u\n", ctx->cached_cq_tail); + seq_printf(m, "CachedCqTail:\t%u\n", data_race(ctx->cached_cq_tail)); seq_printf(m, "SQEs:\t%u\n", sq_tail - sq_head); sq_entries = min(sq_tail - sq_head, ctx->sq_entries); for (i = 0; i < sq_entries; i++) { -- GitLab From 0a9920e1ff67d17dd605e5ed9cd4778d42e9051e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Mon, 30 Dec 2024 20:34:18 +0100 Subject: [PATCH 0518/2211] cifs: Fix and improve cifs_query_path_info() and cifs_query_file_info() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 1041c117a2c33cdffc4f695ac4b469e9124d24d5 ] When CAP_NT_SMBS was not negotiated then do not issue CIFSSMBQPathInfo() and CIFSSMBQFileInfo() commands. CIFSSMBQPathInfo() is not supported by non-NT Win9x SMB server and CIFSSMBQFileInfo() returns from Win9x SMB server bogus data in Attributes field (for example lot of files are marked as reparse points, even Win9x does not support them and read-only bit is not marked for read-only files). Correct information is returned by CIFSFindFirst() or SMBQueryInformation() command. So as a fallback in cifs_query_path_info() function use CIFSFindFirst() with SMB_FIND_FILE_FULL_DIRECTORY_INFO level which is supported by both NT and non-NT servers and as a last option use SMBQueryInformation() as it was before. And in function cifs_query_file_info() immediately returns -EOPNOTSUPP when not communicating with NT server. Client then revalidate inode entry by the cifs_query_path_info() call, which is working fine. So fstat() syscall on already opened file will receive correct information. Note that both fallback functions in non-UNICODE mode expands wildcards. Therefore those fallback functions cannot be used on paths which contain SMB wildcard characters (* ? " > <). CIFSFindFirst() returns all 4 time attributes as opposite of SMBQueryInformation() which returns only one. With this change it is possible to query all 4 times attributes from Win9x server and at the same time, client minimize sending of unsupported commands to server. Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/smb1ops.c | 103 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 95 insertions(+), 8 deletions(-) diff --git a/fs/smb/client/smb1ops.c b/fs/smb/client/smb1ops.c index 71fe5aa52630d..088fd84188b95 100644 --- a/fs/smb/client/smb1ops.c +++ b/fs/smb/client/smb1ops.c @@ -541,24 +541,104 @@ static int cifs_query_path_info(const unsigned int xid, const char *full_path, struct cifs_open_info_data *data) { - int rc; + int rc = -EOPNOTSUPP; FILE_ALL_INFO fi = {}; + struct cifs_search_info search_info = {}; + bool non_unicode_wildcard = false; data->reparse_point = false; data->adjust_tz = false; - /* could do find first instead but this returns more info */ - rc = CIFSSMBQPathInfo(xid, tcon, full_path, &fi, 0 /* not legacy */, cifs_sb->local_nls, - cifs_remap(cifs_sb)); /* - * BB optimize code so we do not make the above call when server claims - * no NT SMB support and the above call failed at least once - set flag - * in tcon or mount. + * First try CIFSSMBQPathInfo() function which returns more info + * (NumberOfLinks) than CIFSFindFirst() fallback function. + * Some servers like Win9x do not support SMB_QUERY_FILE_ALL_INFO over + * TRANS2_QUERY_PATH_INFORMATION, but supports it with filehandle over + * TRANS2_QUERY_FILE_INFORMATION (function CIFSSMBQFileInfo(). But SMB + * Open command on non-NT servers works only for files, does not work + * for directories. And moreover Win9x SMB server returns bogus data in + * SMB_QUERY_FILE_ALL_INFO Attributes field. So for non-NT servers, + * do not even use CIFSSMBQPathInfo() or CIFSSMBQFileInfo() function. + */ + if (tcon->ses->capabilities & CAP_NT_SMBS) + rc = CIFSSMBQPathInfo(xid, tcon, full_path, &fi, 0 /* not legacy */, + cifs_sb->local_nls, cifs_remap(cifs_sb)); + + /* + * Non-UNICODE variant of fallback functions below expands wildcards, + * so they cannot be used for querying paths with wildcard characters. */ - if ((rc == -EOPNOTSUPP) || (rc == -EINVAL)) { + if (rc && !(tcon->ses->capabilities & CAP_UNICODE) && strpbrk(full_path, "*?\"><")) + non_unicode_wildcard = true; + + /* + * Then fallback to CIFSFindFirst() which works also with non-NT servers + * but does not does not provide NumberOfLinks. + */ + if ((rc == -EOPNOTSUPP || rc == -EINVAL) && + !non_unicode_wildcard) { + if (!(tcon->ses->capabilities & tcon->ses->server->vals->cap_nt_find)) + search_info.info_level = SMB_FIND_FILE_INFO_STANDARD; + else + search_info.info_level = SMB_FIND_FILE_FULL_DIRECTORY_INFO; + rc = CIFSFindFirst(xid, tcon, full_path, cifs_sb, NULL, + CIFS_SEARCH_CLOSE_ALWAYS | CIFS_SEARCH_CLOSE_AT_END, + &search_info, false); + if (rc == 0) { + if (!(tcon->ses->capabilities & tcon->ses->server->vals->cap_nt_find)) { + FIND_FILE_STANDARD_INFO *di; + int offset = tcon->ses->server->timeAdj; + + di = (FIND_FILE_STANDARD_INFO *)search_info.srch_entries_start; + fi.CreationTime = cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm( + di->CreationDate, di->CreationTime, offset))); + fi.LastAccessTime = cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm( + di->LastAccessDate, di->LastAccessTime, offset))); + fi.LastWriteTime = cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm( + di->LastWriteDate, di->LastWriteTime, offset))); + fi.ChangeTime = fi.LastWriteTime; + fi.Attributes = cpu_to_le32(le16_to_cpu(di->Attributes)); + fi.AllocationSize = cpu_to_le64(le32_to_cpu(di->AllocationSize)); + fi.EndOfFile = cpu_to_le64(le32_to_cpu(di->DataSize)); + } else { + FILE_FULL_DIRECTORY_INFO *di; + + di = (FILE_FULL_DIRECTORY_INFO *)search_info.srch_entries_start; + fi.CreationTime = di->CreationTime; + fi.LastAccessTime = di->LastAccessTime; + fi.LastWriteTime = di->LastWriteTime; + fi.ChangeTime = di->ChangeTime; + fi.Attributes = di->ExtFileAttributes; + fi.AllocationSize = di->AllocationSize; + fi.EndOfFile = di->EndOfFile; + fi.EASize = di->EaSize; + } + fi.NumberOfLinks = cpu_to_le32(1); + fi.DeletePending = 0; + fi.Directory = !!(le32_to_cpu(fi.Attributes) & ATTR_DIRECTORY); + cifs_buf_release(search_info.ntwrk_buf_start); + } else if (!full_path[0]) { + /* + * CIFSFindFirst() does not work on root path if the + * root path was exported on the server from the top + * level path (drive letter). + */ + rc = -EOPNOTSUPP; + } + } + + /* + * If everything failed then fallback to the legacy SMB command + * SMB_COM_QUERY_INFORMATION which works with all servers, but + * provide just few information. + */ + if ((rc == -EOPNOTSUPP || rc == -EINVAL) && !non_unicode_wildcard) { rc = SMBQueryInformation(xid, tcon, full_path, &fi, cifs_sb->local_nls, cifs_remap(cifs_sb)); data->adjust_tz = true; + } else if ((rc == -EOPNOTSUPP || rc == -EINVAL) && non_unicode_wildcard) { + /* Path with non-UNICODE wildcard character cannot exist. */ + rc = -ENOENT; } if (!rc) { @@ -655,6 +735,13 @@ static int cifs_query_file_info(const unsigned int xid, struct cifs_tcon *tcon, int rc; FILE_ALL_INFO fi = {}; + /* + * CIFSSMBQFileInfo() for non-NT servers returns bogus data in + * Attributes fields. So do not use this command for non-NT servers. + */ + if (!(tcon->ses->capabilities & CAP_NT_SMBS)) + return -EOPNOTSUPP; + if (cfile->symlink_target) { data->symlink_target = kstrdup(cfile->symlink_target, GFP_KERNEL); if (!data->symlink_target) -- GitLab From 6b1a9a76470971a3a3ac222a1aea75c25309af39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Mon, 30 Dec 2024 21:32:39 +0100 Subject: [PATCH 0519/2211] cifs: Fix changing times and read-only attr over SMB1 smb_set_file_info() function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit f122121796f91168d0894c2710b8dd71330a34f8 ] Function CIFSSMBSetPathInfo() is not supported by non-NT servers and returns error. Fallback code via open filehandle and CIFSSMBSetFileInfo() does not work neither because CIFS_open() works also only on NT server. Therefore currently the whole smb_set_file_info() function as a SMB1 callback for the ->set_file_info() does not work with older non-NT SMB servers, like Win9x and others. This change implements fallback code in smb_set_file_info() which will works with any server and allows to change time values and also to set or clear read-only attributes. To make existing fallback code via CIFSSMBSetFileInfo() working with also non-NT servers, it is needed to change open function from CIFS_open() (which is NT specific) to cifs_open_file() which works with any server (this is just a open wrapper function which choose the correct open function supported by the server). CIFSSMBSetFileInfo() is working also on non-NT servers, but zero time values are not treated specially. So first it is needed to fill all time values if some of them are missing, via cifs_query_path_info() call. There is another issue, opening file in write-mode (needed for changing attributes) is not possible when the file has read-only attribute set. The only option how to clear read-only attribute is via SMB_COM_SETATTR command. And opening directory is not possible neither and here the SMB_COM_SETATTR command is the only option how to change attributes. And CIFSSMBSetFileInfo() does not honor setting read-only attribute, so for setting is also needed to use SMB_COM_SETATTR command. Existing code in cifs_query_path_info() is already using SMB_COM_GETATTR as a fallback code path (function SMBQueryInformation()), so introduce a new function SMBSetInformation which will implement SMB_COM_SETATTR command. My testing showed that Windows XP SMB1 client is also using SMB_COM_SETATTR command for setting or clearing read-only attribute against non-NT server. So this can prove that this is the correct way how to do it. With this change it is possible set all 4 time values and all attributes, including clearing and setting read-only bit on non-NT SMB servers. Tested against Win98 SMB1 server. This change fixes "touch" command which was failing when called on existing file. And fixes also "chmod +w" and "chmod -w" commands which were also failing (as they are changing read-only attribute). Note that this change depends on following change "cifs: Improve cifs_query_path_info() and cifs_query_file_info()" as it require to query all 4 time attribute values. Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/cifspdu.h | 5 +- fs/smb/client/cifsproto.h | 4 ++ fs/smb/client/cifssmb.c | 57 +++++++++++++++++++ fs/smb/client/smb1ops.c | 112 +++++++++++++++++++++++++++++++++++--- 4 files changed, 166 insertions(+), 12 deletions(-) diff --git a/fs/smb/client/cifspdu.h b/fs/smb/client/cifspdu.h index ee78bb6741d62..28f8ca470770d 100644 --- a/fs/smb/client/cifspdu.h +++ b/fs/smb/client/cifspdu.h @@ -1226,10 +1226,9 @@ typedef struct smb_com_query_information_rsp { typedef struct smb_com_setattr_req { struct smb_hdr hdr; /* wct = 8 */ __le16 attr; - __le16 time_low; - __le16 time_high; + __le32 last_write_time; __le16 reserved[5]; /* must be zero */ - __u16 ByteCount; + __le16 ByteCount; __u8 BufferFormat; /* 4 = ASCII */ unsigned char fileName[]; } __attribute__((packed)) SETATTR_REQ; diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index 306386e5c171f..6e938b17875f5 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -396,6 +396,10 @@ extern int CIFSSMBQFSUnixInfo(const unsigned int xid, struct cifs_tcon *tcon); extern int CIFSSMBQFSPosixInfo(const unsigned int xid, struct cifs_tcon *tcon, struct kstatfs *FSData); +extern int SMBSetInformation(const unsigned int xid, struct cifs_tcon *tcon, + const char *fileName, __le32 attributes, __le64 write_time, + const struct nls_table *nls_codepage, + struct cifs_sb_info *cifs_sb); extern int CIFSSMBSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon, const char *fileName, const FILE_BASIC_INFO *data, const struct nls_table *nls_codepage, diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index e2a14e25da87c..8667f403a0ab6 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -5199,6 +5199,63 @@ CIFSSMBSetFileSize(const unsigned int xid, struct cifs_tcon *tcon, return rc; } +int +SMBSetInformation(const unsigned int xid, struct cifs_tcon *tcon, + const char *fileName, __le32 attributes, __le64 write_time, + const struct nls_table *nls_codepage, + struct cifs_sb_info *cifs_sb) +{ + SETATTR_REQ *pSMB; + SETATTR_RSP *pSMBr; + struct timespec64 ts; + int bytes_returned; + int name_len; + int rc; + + cifs_dbg(FYI, "In %s path %s\n", __func__, fileName); + +retry: + rc = smb_init(SMB_COM_SETATTR, 8, tcon, (void **) &pSMB, + (void **) &pSMBr); + if (rc) + return rc; + + if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { + name_len = + cifsConvertToUTF16((__le16 *) pSMB->fileName, + fileName, PATH_MAX, nls_codepage, + cifs_remap(cifs_sb)); + name_len++; /* trailing null */ + name_len *= 2; + } else { + name_len = copy_path_name(pSMB->fileName, fileName); + } + /* Only few attributes can be set by this command, others are not accepted by Win9x. */ + pSMB->attr = cpu_to_le16(le32_to_cpu(attributes) & + (ATTR_READONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_ARCHIVE)); + /* Zero write time value (in both NT and SETATTR formats) means to not change it. */ + if (le64_to_cpu(write_time) != 0) { + ts = cifs_NTtimeToUnix(write_time); + pSMB->last_write_time = cpu_to_le32(ts.tv_sec); + } + pSMB->BufferFormat = 0x04; + name_len++; /* account for buffer type byte */ + inc_rfc1001_len(pSMB, (__u16)name_len); + pSMB->ByteCount = cpu_to_le16(name_len); + + rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, + (struct smb_hdr *) pSMBr, &bytes_returned, 0); + if (rc) + cifs_dbg(FYI, "Send error in %s = %d\n", __func__, rc); + + cifs_buf_release(pSMB); + + if (rc == -EAGAIN) + goto retry; + + return rc; +} + /* Some legacy servers such as NT4 require that the file times be set on an open handle, rather than by pathname - this is awkward due to potential access conflicts on the open, but it is unavoidable for these diff --git a/fs/smb/client/smb1ops.c b/fs/smb/client/smb1ops.c index 088fd84188b95..0385a514f59e9 100644 --- a/fs/smb/client/smb1ops.c +++ b/fs/smb/client/smb1ops.c @@ -912,6 +912,9 @@ smb_set_file_info(struct inode *inode, const char *full_path, struct cifs_fid fid; struct cifs_open_parms oparms; struct cifsFileInfo *open_file; + FILE_BASIC_INFO new_buf; + struct cifs_open_info_data query_data; + __le64 write_time = buf->LastWriteTime; struct cifsInodeInfo *cinode = CIFS_I(inode); struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); struct tcon_link *tlink = NULL; @@ -919,20 +922,58 @@ smb_set_file_info(struct inode *inode, const char *full_path, /* if the file is already open for write, just use that fileid */ open_file = find_writable_file(cinode, FIND_WR_FSUID_ONLY); + if (open_file) { fid.netfid = open_file->fid.netfid; netpid = open_file->pid; tcon = tlink_tcon(open_file->tlink); - goto set_via_filehandle; + } else { + tlink = cifs_sb_tlink(cifs_sb); + if (IS_ERR(tlink)) { + rc = PTR_ERR(tlink); + tlink = NULL; + goto out; + } + tcon = tlink_tcon(tlink); } - tlink = cifs_sb_tlink(cifs_sb); - if (IS_ERR(tlink)) { - rc = PTR_ERR(tlink); - tlink = NULL; - goto out; + /* + * Non-NT servers interprets zero time value in SMB_SET_FILE_BASIC_INFO + * over TRANS2_SET_FILE_INFORMATION as a valid time value. NT servers + * interprets zero time value as do not change existing value on server. + * API of ->set_file_info() callback expects that zero time value has + * the NT meaning - do not change. Therefore if server is non-NT and + * some time values in "buf" are zero, then fetch missing time values. + */ + if (!(tcon->ses->capabilities & CAP_NT_SMBS) && + (!buf->CreationTime || !buf->LastAccessTime || + !buf->LastWriteTime || !buf->ChangeTime)) { + rc = cifs_query_path_info(xid, tcon, cifs_sb, full_path, &query_data); + if (rc) { + if (open_file) { + cifsFileInfo_put(open_file); + open_file = NULL; + } + goto out; + } + /* + * Original write_time from buf->LastWriteTime is preserved + * as SMBSetInformation() interprets zero as do not change. + */ + new_buf = *buf; + buf = &new_buf; + if (!buf->CreationTime) + buf->CreationTime = query_data.fi.CreationTime; + if (!buf->LastAccessTime) + buf->LastAccessTime = query_data.fi.LastAccessTime; + if (!buf->LastWriteTime) + buf->LastWriteTime = query_data.fi.LastWriteTime; + if (!buf->ChangeTime) + buf->ChangeTime = query_data.fi.ChangeTime; } - tcon = tlink_tcon(tlink); + + if (open_file) + goto set_via_filehandle; rc = CIFSSMBSetPathInfo(xid, tcon, full_path, buf, cifs_sb->local_nls, cifs_sb); @@ -953,8 +994,45 @@ smb_set_file_info(struct inode *inode, const char *full_path, .fid = &fid, }; - cifs_dbg(FYI, "calling SetFileInfo since SetPathInfo for times not supported by this server\n"); - rc = CIFS_open(xid, &oparms, &oplock, NULL); + if (S_ISDIR(inode->i_mode) && !(tcon->ses->capabilities & CAP_NT_SMBS)) { + /* Opening directory path is not possible on non-NT servers. */ + rc = -EOPNOTSUPP; + } else { + /* + * Use cifs_open_file() instead of CIFS_open() as the + * cifs_open_file() selects the correct function which + * works also on non-NT servers. + */ + rc = cifs_open_file(xid, &oparms, &oplock, NULL); + /* + * Opening path for writing on non-NT servers is not + * possible when the read-only attribute is already set. + * Non-NT server in this case returns -EACCES. For those + * servers the only possible way how to clear the read-only + * bit is via SMB_COM_SETATTR command. + */ + if (rc == -EACCES && + (cinode->cifsAttrs & ATTR_READONLY) && + le32_to_cpu(buf->Attributes) != 0 && /* 0 = do not change attrs */ + !(le32_to_cpu(buf->Attributes) & ATTR_READONLY) && + !(tcon->ses->capabilities & CAP_NT_SMBS)) + rc = -EOPNOTSUPP; + } + + /* Fallback to SMB_COM_SETATTR command when absolutelty needed. */ + if (rc == -EOPNOTSUPP) { + cifs_dbg(FYI, "calling SetInformation since SetPathInfo for attrs/times not supported by this server\n"); + rc = SMBSetInformation(xid, tcon, full_path, + buf->Attributes != 0 ? buf->Attributes : cpu_to_le32(cinode->cifsAttrs), + write_time, + cifs_sb->local_nls, cifs_sb); + if (rc == 0) + cinode->cifsAttrs = le32_to_cpu(buf->Attributes); + else + rc = -EACCES; + goto out; + } + if (rc != 0) { if (rc == -EIO) rc = -EINVAL; @@ -962,6 +1040,7 @@ smb_set_file_info(struct inode *inode, const char *full_path, } netpid = current->tgid; + cifs_dbg(FYI, "calling SetFileInfo since SetPathInfo for attrs/times not supported by this server\n"); set_via_filehandle: rc = CIFSSMBSetFileInfo(xid, tcon, buf, fid.netfid, netpid); @@ -972,6 +1051,21 @@ set_via_filehandle: CIFSSMBClose(xid, tcon, fid.netfid); else cifsFileInfo_put(open_file); + + /* + * Setting the read-only bit is not honered on non-NT servers when done + * via open-semantics. So for setting it, use SMB_COM_SETATTR command. + * This command works only after the file is closed, so use it only when + * operation was called without the filehandle. + */ + if (open_file == NULL && + !(tcon->ses->capabilities & CAP_NT_SMBS) && + le32_to_cpu(buf->Attributes) & ATTR_READONLY) { + SMBSetInformation(xid, tcon, full_path, + buf->Attributes, + 0 /* do not change write time */, + cifs_sb->local_nls, cifs_sb); + } out: if (tlink != NULL) cifs_put_tlink(tlink); -- GitLab From 5926bc887da2f044c92ec270bdc73ac9681d99fa Mon Sep 17 00:00:00 2001 From: Stefan Binding Date: Wed, 30 Apr 2025 11:31:19 +0100 Subject: [PATCH 0520/2211] ASoC: intel/sdw_utils: Add volume limit to cs42l43 speakers [ Upstream commit 02b44a2b2bdcee03cbb92484d31e9ca1b91b2a38 ] The volume control for cs42l43 speakers has a maximum gain of +31.5 dB. However, for many use cases, this can cause distorted audio, depending various factors, such as other signal-processing elements in the chain, for example if the audio passes through a gain control before reaching the codec or the signal path has been tuned for a particular maximum gain in the codec. In the case of systems which use the soc_sdw_cs42l43 driver, audio will likely be distorted in all cases above 0 dB, therefore add a volume limit of 128, which is 0 dB maximum volume inside this driver. Signed-off-by: Stefan Binding Reviewed-by: Charles Keepax Link: https://patch.msgid.link/20250430103134.24579-2-sbinding@opensource.cirrus.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/sdw_utils/soc_sdw_cs42l43.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sound/soc/sdw_utils/soc_sdw_cs42l43.c b/sound/soc/sdw_utils/soc_sdw_cs42l43.c index adb1c008e871d..2dc7787234c36 100644 --- a/sound/soc/sdw_utils/soc_sdw_cs42l43.c +++ b/sound/soc/sdw_utils/soc_sdw_cs42l43.c @@ -20,6 +20,8 @@ #include #include +#define CS42L43_SPK_VOLUME_0DB 128 /* 0dB Max */ + static const struct snd_soc_dapm_route cs42l43_hs_map[] = { { "Headphone", NULL, "cs42l43 AMP3_OUT" }, { "Headphone", NULL, "cs42l43 AMP4_OUT" }, @@ -117,6 +119,14 @@ int asoc_sdw_cs42l43_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_so return -ENOMEM; } + ret = snd_soc_limit_volume(card, "cs42l43 Speaker Digital Volume", + CS42L43_SPK_VOLUME_0DB); + if (ret) + dev_err(card->dev, "cs42l43 speaker volume limit failed: %d\n", ret); + else + dev_info(card->dev, "Setting CS42L43 Speaker volume limit to %d\n", + CS42L43_SPK_VOLUME_0DB); + ret = snd_soc_dapm_add_routes(&card->dapm, cs42l43_spk_map, ARRAY_SIZE(cs42l43_spk_map)); if (ret) -- GitLab From 92dff981dddffe6f5f7a4ed53d28623627a3151b Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 25 Apr 2025 23:23:29 -0700 Subject: [PATCH 0521/2211] btrfs: compression: adjust cb->compressed_folios allocation type [ Upstream commit 6f9a8ab796c6528d22de3c504c81fce7dde63d8a ] In preparation for making the kmalloc() family of allocators type aware, we need to make sure that the returned type from the allocation matches the type of the variable being assigned. (Before, the allocator would always return "void *", which can be implicitly cast to any pointer type.) The assigned type is "struct folio **" but the returned type will be "struct page **". These are the same allocation size (pointer size), but the types don't match. Adjust the allocation type to match the assignment. Reviewed-by: Qu Wenruo Signed-off-by: Kees Cook Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/compression.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 40332ab62f101..65d883da86c60 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -606,7 +606,7 @@ void btrfs_submit_compressed_read(struct btrfs_bio *bbio) free_extent_map(em); cb->nr_folios = DIV_ROUND_UP(compressed_len, PAGE_SIZE); - cb->compressed_folios = kcalloc(cb->nr_folios, sizeof(struct page *), GFP_NOFS); + cb->compressed_folios = kcalloc(cb->nr_folios, sizeof(struct folio *), GFP_NOFS); if (!cb->compressed_folios) { ret = BLK_STS_RESOURCE; goto out_free_bio; -- GitLab From 7f7c8c03feba5f2454792fab3bb8bd45bd6883f9 Mon Sep 17 00:00:00 2001 From: Goldwyn Rodrigues Date: Fri, 25 Apr 2025 09:25:06 -0400 Subject: [PATCH 0522/2211] btrfs: correct the order of prelim_ref arguments in btrfs__prelim_ref [ Upstream commit bc7e0975093567f51be8e1bdf4aa5900a3cf0b1e ] btrfs_prelim_ref() calls the old and new reference variables in the incorrect order. This causes a NULL pointer dereference because oldref is passed as NULL to trace_btrfs_prelim_ref_insert(). Note, trace_btrfs_prelim_ref_insert() is being called with newref as oldref (and oldref as NULL) on purpose in order to print out the values of newref. To reproduce: echo 1 > /sys/kernel/debug/tracing/events/btrfs/btrfs_prelim_ref_insert/enable Perform some writeback operations. Backtrace: BUG: kernel NULL pointer dereference, address: 0000000000000018 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 115949067 P4D 115949067 PUD 11594a067 PMD 0 Oops: Oops: 0000 [#1] SMP NOPTI CPU: 1 UID: 0 PID: 1188 Comm: fsstress Not tainted 6.15.0-rc2-tester+ #47 PREEMPT(voluntary) 7ca2cef72d5e9c600f0c7718adb6462de8149622 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-2-gc13ff2cd-prebuilt.qemu.org 04/01/2014 RIP: 0010:trace_event_raw_event_btrfs__prelim_ref+0x72/0x130 Code: e8 43 81 9f ff 48 85 c0 74 78 4d 85 e4 0f 84 8f 00 00 00 49 8b 94 24 c0 06 00 00 48 8b 0a 48 89 48 08 48 8b 52 08 48 89 50 10 <49> 8b 55 18 48 89 50 18 49 8b 55 20 48 89 50 20 41 0f b6 55 28 88 RSP: 0018:ffffce44820077a0 EFLAGS: 00010286 RAX: ffff8c6b403f9014 RBX: ffff8c6b55825730 RCX: 304994edf9cf506b RDX: d8b11eb7f0fdb699 RSI: ffff8c6b403f9010 RDI: ffff8c6b403f9010 RBP: 0000000000000001 R08: 0000000000000001 R09: 0000000000000010 R10: 00000000ffffffff R11: 0000000000000000 R12: ffff8c6b4e8fb000 R13: 0000000000000000 R14: ffffce44820077a8 R15: ffff8c6b4abd1540 FS: 00007f4dc6813740(0000) GS:ffff8c6c1d378000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000018 CR3: 000000010eb42000 CR4: 0000000000750ef0 PKRU: 55555554 Call Trace: prelim_ref_insert+0x1c1/0x270 find_parent_nodes+0x12a6/0x1ee0 ? __entry_text_end+0x101f06/0x101f09 ? srso_alias_return_thunk+0x5/0xfbef5 ? srso_alias_return_thunk+0x5/0xfbef5 ? srso_alias_return_thunk+0x5/0xfbef5 ? srso_alias_return_thunk+0x5/0xfbef5 btrfs_is_data_extent_shared+0x167/0x640 ? fiemap_process_hole+0xd0/0x2c0 extent_fiemap+0xa5c/0xbc0 ? __entry_text_end+0x101f05/0x101f09 btrfs_fiemap+0x7e/0xd0 do_vfs_ioctl+0x425/0x9d0 __x64_sys_ioctl+0x75/0xc0 Signed-off-by: Goldwyn Rodrigues Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- include/trace/events/btrfs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h index af6b3827fb1d0..3b16b0cc1b7a6 100644 --- a/include/trace/events/btrfs.h +++ b/include/trace/events/btrfs.h @@ -1924,7 +1924,7 @@ DECLARE_EVENT_CLASS(btrfs__prelim_ref, TP_PROTO(const struct btrfs_fs_info *fs_info, const struct prelim_ref *oldref, const struct prelim_ref *newref, u64 tree_size), - TP_ARGS(fs_info, newref, oldref, tree_size), + TP_ARGS(fs_info, oldref, newref, tree_size), TP_STRUCT__entry_btrfs( __field( u64, root_id ) -- GitLab From 230c94ca3527dafc206666a56cb7823a7edc66a5 Mon Sep 17 00:00:00 2001 From: Boris Burkov Date: Fri, 25 Apr 2025 12:47:50 -0700 Subject: [PATCH 0523/2211] btrfs: handle empty eb->folios in num_extent_folios() [ Upstream commit d6fe0c69b3aa5c985380b794bdf8e6e9b1811e60 ] num_extent_folios() unconditionally calls folio_order() on eb->folios[0]. If that is NULL this will be a segfault. It is reasonable for it to return 0 as the number of folios in the eb when the first entry is NULL, so do that instead. Reviewed-by: Qu Wenruo Signed-off-by: Boris Burkov Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/extent_io.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index 8a36117ed4532..fcb60837d7dc6 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h @@ -293,6 +293,8 @@ static inline int num_extent_pages(const struct extent_buffer *eb) */ static inline int num_extent_folios(const struct extent_buffer *eb) { + if (!eb->folios[0]) + return 0; if (folio_order(eb->folios[0])) return 1; return num_extent_pages(eb); -- GitLab From 6e9770de024964b1017f99ee94f71967bd6edaeb Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Tue, 29 Apr 2025 15:17:50 +0930 Subject: [PATCH 0524/2211] btrfs: avoid NULL pointer dereference if no valid csum tree [ Upstream commit f95d186255b319c48a365d47b69bd997fecb674e ] [BUG] When trying read-only scrub on a btrfs with rescue=idatacsums mount option, it will crash with the following call trace: BUG: kernel NULL pointer dereference, address: 0000000000000208 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page CPU: 1 UID: 0 PID: 835 Comm: btrfs Tainted: G O 6.15.0-rc3-custom+ #236 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS unknown 02/02/2022 RIP: 0010:btrfs_lookup_csums_bitmap+0x49/0x480 [btrfs] Call Trace: scrub_find_fill_first_stripe+0x35b/0x3d0 [btrfs] scrub_simple_mirror+0x175/0x290 [btrfs] scrub_stripe+0x5f7/0x6f0 [btrfs] scrub_chunk+0x9a/0x150 [btrfs] scrub_enumerate_chunks+0x333/0x660 [btrfs] btrfs_scrub_dev+0x23e/0x600 [btrfs] btrfs_ioctl+0x1dcf/0x2f80 [btrfs] __x64_sys_ioctl+0x97/0xc0 do_syscall_64+0x4f/0x120 entry_SYSCALL_64_after_hwframe+0x76/0x7e [CAUSE] Mount option "rescue=idatacsums" will completely skip loading the csum tree, so that any data read will not find any data csum thus we will ignore data checksum verification. Normally call sites utilizing csum tree will check the fs state flag NO_DATA_CSUMS bit, but unfortunately scrub does not check that bit at all. This results in scrub to call btrfs_search_slot() on a NULL pointer and triggered above crash. [FIX] Check both extent and csum tree root before doing any tree search. Reviewed-by: Johannes Thumshirn Signed-off-by: Qu Wenruo Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/scrub.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index c73a41b1ad560..d8fcc3eb85c88 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -1541,8 +1541,8 @@ static int scrub_find_fill_first_stripe(struct btrfs_block_group *bg, u64 extent_gen; int ret; - if (unlikely(!extent_root)) { - btrfs_err(fs_info, "no valid extent root for scrub"); + if (unlikely(!extent_root || !csum_root)) { + btrfs_err(fs_info, "no valid extent or csum root for scrub"); return -EUCLEAN; } memset(stripe->sectors, 0, sizeof(struct scrub_sector_verification) * -- GitLab From 511ea82e344e044aad215a4456ab400a70565e54 Mon Sep 17 00:00:00 2001 From: David Wei Date: Fri, 2 May 2025 21:30:50 -0700 Subject: [PATCH 0525/2211] tools: ynl-gen: validate 0 len strings from kernel [ Upstream commit 4720f9707c783f642332dee3d56dccaefa850e42 ] Strings from the kernel are guaranteed to be null terminated and ynl_attr_validate() checks for this. But it doesn't check if the string has a len of 0, which would cause problems when trying to access data[len - 1]. Fix this by checking that len is positive. Signed-off-by: David Wei Link: https://patch.msgid.link/20250503043050.861238-1-dw@davidwei.uk Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- tools/net/ynl/lib/ynl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/net/ynl/lib/ynl.c b/tools/net/ynl/lib/ynl.c index ce32cb35007d6..c4da34048ef85 100644 --- a/tools/net/ynl/lib/ynl.c +++ b/tools/net/ynl/lib/ynl.c @@ -364,7 +364,7 @@ int ynl_attr_validate(struct ynl_parse_arg *yarg, const struct nlattr *attr) "Invalid attribute (binary %s)", policy->name); return -1; case YNL_PT_NUL_STR: - if ((!policy->len || len <= policy->len) && !data[len - 1]) + if (len && (!policy->len || len <= policy->len) && !data[len - 1]) break; yerr(yarg->ys, YNL_ERROR_ATTR_INVALID, "Invalid attribute (string %s)", policy->name); -- GitLab From 1645fc1849ef0e116e8a03d8a11e980d6b356290 Mon Sep 17 00:00:00 2001 From: Johannes Thumshirn Date: Tue, 6 May 2025 13:27:30 +0200 Subject: [PATCH 0526/2211] block: only update request sector if needed [ Upstream commit db492e24f9b05547ba12b4783f09c9d943cf42fe ] In case of a ZONE APPEND write, regardless of native ZONE APPEND or the emulation layer in the zone write plugging code, the sector the data got written to by the device needs to be updated in the bio. At the moment, this is done for every native ZONE APPEND write and every request that is flagged with 'BIO_ZONE_WRITE_PLUGGING'. But thus superfluously updates the sector for regular writes to a zoned block device. Check if a bio is a native ZONE APPEND write or if the bio is flagged as 'BIO_EMULATES_ZONE_APPEND', meaning the block layer's zone write plugging code handles the ZONE APPEND and translates it into a regular write and back. Only if one of these two criterion is met, update the sector in the bio upon completion. Signed-off-by: Johannes Thumshirn Reviewed-by: Christoph Hellwig Link: https://lore.kernel.org/r/dea089581cb6b777c1cd1500b38ac0b61df4b2d1.1746530748.git.jth@kernel.org Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- block/blk.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/block/blk.h b/block/blk.h index 1426f9c281973..e91012247ff29 100644 --- a/block/blk.h +++ b/block/blk.h @@ -482,7 +482,8 @@ static inline void blk_zone_update_request_bio(struct request *rq, * the original BIO sector so that blk_zone_write_plug_bio_endio() can * lookup the zone write plug. */ - if (req_op(rq) == REQ_OP_ZONE_APPEND || bio_zone_write_plugging(bio)) + if (req_op(rq) == REQ_OP_ZONE_APPEND || + bio_flagged(bio, BIO_EMULATES_ZONE_APPEND)) bio->bi_iter.bi_sector = rq->__sector; } void blk_zone_write_plug_bio_endio(struct bio *bio); -- GitLab From b8581b4e4d96ededfe28778bb27ca585fc092b59 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Tue, 6 May 2025 21:42:59 +0200 Subject: [PATCH 0527/2211] wifi: iwlwifi: add support for Killer on MTL [ Upstream commit ebedf8b7f05b9c886d68d63025db8d1b12343157 ] For now, we need another entry for these devices, this will be changed completely for 6.16. Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219926 Link: https://patch.msgid.link/20250506214258.2efbdc9e9a82.I31915ec252bd1c74bd53b89a0e214e42a74b6f2e@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c index 9141ea57abfce..68989d183e82a 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c @@ -587,6 +587,8 @@ VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info iwl_dev_info_table[] = { IWL_DEV_INFO(0x7A70, 0x1692, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690i_name), IWL_DEV_INFO(0x7AF0, 0x1691, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690s_name), IWL_DEV_INFO(0x7AF0, 0x1692, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690i_name), + IWL_DEV_INFO(0x7F70, 0x1691, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690s_name), + IWL_DEV_INFO(0x7F70, 0x1692, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690i_name), IWL_DEV_INFO(0x271C, 0x0214, iwl9260_2ac_cfg, iwl9260_1_name), IWL_DEV_INFO(0x7E40, 0x1691, iwl_cfg_ma, iwl_ax411_killer_1690s_name), -- GitLab From 5a8d073d87da4ad1496b35adaee5719e94665d81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Anikiel?= Date: Thu, 10 Apr 2025 11:54:20 +0000 Subject: [PATCH 0528/2211] x86/Kconfig: make CFI_AUTO_DEFAULT depend on !RUST or Rust >= 1.88 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 5595c31c370957aabe739ac3996aedba8267603f ] Calling core::fmt::write() from rust code while FineIBT is enabled results in a kernel panic: [ 4614.199779] kernel BUG at arch/x86/kernel/cet.c:132! [ 4614.205343] Oops: invalid opcode: 0000 [#1] PREEMPT SMP NOPTI [ 4614.211781] CPU: 2 UID: 0 PID: 6057 Comm: dmabuf_dump Tainted: G U O 6.12.17-android16-0-g6ab38c534a43 #1 9da040f27673ec3945e23b998a0f8bd64c846599 [ 4614.227832] Tainted: [U]=USER, [O]=OOT_MODULE [ 4614.241247] RIP: 0010:do_kernel_cp_fault+0xea/0xf0 ... [ 4614.398144] RIP: 0010:_RNvXs5_NtNtNtCs3o2tGsuHyou_4core3fmt3num3impyNtB9_7Display3fmt+0x0/0x20 [ 4614.407792] Code: 48 f7 df 48 0f 48 f9 48 89 f2 89 c6 5d e9 18 fd ff ff 0f 1f 84 00 00 00 00 00 f3 0f 1e fa 41 81 ea 14 61 af 2c 74 03 0f 0b 90 <66> 0f 1f 00 55 48 89 e5 48 89 f2 48 8b 3f be 01 00 00 00 5d e9 e7 [ 4614.428775] RSP: 0018:ffffb95acfa4ba68 EFLAGS: 00010246 [ 4614.434609] RAX: 0000000000000000 RBX: 0000000000000010 RCX: 0000000000000000 [ 4614.442587] RDX: 0000000000000007 RSI: ffffb95acfa4ba70 RDI: ffffb95acfa4bc88 [ 4614.450557] RBP: ffffb95acfa4bae0 R08: ffff0a00ffffff05 R09: 0000000000000070 [ 4614.458527] R10: 0000000000000000 R11: ffffffffab67eaf0 R12: ffffb95acfa4bcc8 [ 4614.466493] R13: ffffffffac5d50f0 R14: 0000000000000000 R15: 0000000000000000 [ 4614.474473] ? __cfi__RNvXs5_NtNtNtCs3o2tGsuHyou_4core3fmt3num3impyNtB9_7Display3fmt+0x10/0x10 [ 4614.484118] ? _RNvNtCs3o2tGsuHyou_4core3fmt5write+0x1d2/0x250 This happens because core::fmt::write() calls core::fmt::rt::Argument::fmt(), which currently has CFI disabled: library/core/src/fmt/rt.rs: 171 // FIXME: Transmuting formatter in new and indirectly branching to/calling 172 // it here is an explicit CFI violation. 173 #[allow(inline_no_sanitize)] 174 #[no_sanitize(cfi, kcfi)] 175 #[inline] 176 pub(super) unsafe fn fmt(&self, f: &mut Formatter<'_>) -> Result { This causes a Control Protection exception, because FineIBT has sealed off the original function's endbr64. This makes rust currently incompatible with FineIBT. Add a Kconfig dependency that prevents FineIBT from getting turned on by default if rust is enabled. [ Rust 1.88.0 (scheduled for 2025-06-26) should have this fixed [1], and thus we relaxed the condition with Rust >= 1.88. When `objtool` lands checking for this with e.g. [2], the plan is to ideally run that in upstream Rust's CI to prevent regressions early [3], since we do not control `core`'s source code. Alice tested the Rust PR backported to an older compiler. Peter would like that Rust provides a stable `core` which can be pulled into the kernel: "Relying on that much out of tree code is 'unfortunate'". - Miguel ] Signed-off-by: Paweł Anikiel Reviewed-by: Alice Ryhl Acked-by: Peter Zijlstra Link: https://github.com/rust-lang/rust/pull/139632 [1] Link: https://lore.kernel.org/rust-for-linux/20250410154556.GB9003@noisy.programming.kicks-ass.net/ [2] Link: https://github.com/rust-lang/rust/pull/139632#issuecomment-2801950873 [3] Link: https://lore.kernel.org/r/20250410115420.366349-1-panikiel@google.com Link: https://lore.kernel.org/r/att0-CANiq72kjDM0cKALVy4POEzhfdT4nO7tqz0Pm7xM+3=_0+L1t=A@mail.gmail.com [ Reduced splat. - Miguel ] Signed-off-by: Miguel Ojeda Signed-off-by: Sasha Levin --- arch/x86/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 7b3622ba4c3c8..15425c9bdc2bc 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2420,6 +2420,7 @@ config STRICT_SIGALTSTACK_SIZE config CFI_AUTO_DEFAULT bool "Attempt to use FineIBT by default at boot time" depends on FINEIBT + depends on !RUST || RUSTC_VERSION >= 108800 default y help Attempt to use FineIBT by default at boot time. If enabled, -- GitLab From 211f58920645951259520cd41be6fa00fa9ebbda Mon Sep 17 00:00:00 2001 From: Jason Andryuk Date: Tue, 6 May 2025 16:44:56 -0400 Subject: [PATCH 0529/2211] xenbus: Allow PVH dom0 a non-local xenstore [ Upstream commit 90989869baae47ee2aa3bcb6f6eb9fbbe4287958 ] Make xenbus_init() allow a non-local xenstore for a PVH dom0 - it is currently forced to XS_LOCAL. With Hyperlaunch booting dom0 and a xenstore stubdom, dom0 can be handled as a regular XS_HVM following the late init path. Ideally we'd drop the use of xen_initial_domain() and just check for the event channel instead. However, ARM has a xen,enhanced no-xenstore mode, where the event channel and PFN would both be 0. Retain the xen_initial_domain() check, and use that for an additional check when the event channel is 0. Check the full 64bit HVM_PARAM_STORE_EVTCHN value to catch the off chance that high bits are set for the 32bit event channel. Signed-off-by: Jason Andryuk Change-Id: I5506da42e4c6b8e85079fefb2f193c8de17c7437 Reviewed-by: Stefano Stabellini Signed-off-by: Juergen Gross Message-ID: <20250506204456.5220-1-jason.andryuk@amd.com> Signed-off-by: Sasha Levin --- drivers/xen/xenbus/xenbus_probe.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c index 6d32ffb011365..86fe6e7790566 100644 --- a/drivers/xen/xenbus/xenbus_probe.c +++ b/drivers/xen/xenbus/xenbus_probe.c @@ -966,9 +966,15 @@ static int __init xenbus_init(void) if (xen_pv_domain()) xen_store_domain_type = XS_PV; if (xen_hvm_domain()) + { xen_store_domain_type = XS_HVM; - if (xen_hvm_domain() && xen_initial_domain()) - xen_store_domain_type = XS_LOCAL; + err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v); + if (err) + goto out_error; + xen_store_evtchn = (int)v; + if (!v && xen_initial_domain()) + xen_store_domain_type = XS_LOCAL; + } if (xen_pv_domain() && !xen_start_info->store_evtchn) xen_store_domain_type = XS_LOCAL; if (xen_pv_domain() && xen_start_info->store_evtchn) @@ -987,10 +993,6 @@ static int __init xenbus_init(void) xen_store_interface = gfn_to_virt(xen_store_gfn); break; case XS_HVM: - err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v); - if (err) - goto out_error; - xen_store_evtchn = (int)v; err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v); if (err) goto out_error; -- GitLab From a0c50c9f9c912507ef8111ba5d5e595b7e699d61 Mon Sep 17 00:00:00 2001 From: Austin Zheng Date: Thu, 17 Apr 2025 10:24:29 -0400 Subject: [PATCH 0530/2211] drm/amd/display: Call FP Protect Before Mode Programming/Mode Support [ Upstream commit eba692ca3abca258b3214a6e4126afefad1822f0 ] [Why] Memory allocation occurs within dml21_validate() for adding phantom planes. May cause kernel to be tainted due to usage of FP Start. [How] Move FP start from dml21_validate to before mode programming/mode support. Calculations requiring floating point are all done within mode programming or mode support. Reviewed-by: Alvin Lee Signed-off-by: Austin Zheng Signed-off-by: Ray Wu Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher (cherry picked from commit fe3250f10819b411808ab9ae1d824c5fc9b59170) Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c b/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c index e3e4f40bd4123..dcbe327209d5d 100644 --- a/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c @@ -221,7 +221,9 @@ static bool dml21_mode_check_and_programming(const struct dc *in_dc, struct dc_s if (!result) return false; + DC_FP_START(); result = dml2_build_mode_programming(mode_programming); + DC_FP_END(); if (!result) return false; @@ -271,7 +273,9 @@ static bool dml21_check_mode_support(const struct dc *in_dc, struct dc_state *co mode_support->dml2_instance = dml_init->dml2_instance; dml21_map_dc_state_into_dml_display_cfg(in_dc, context, dml_ctx); dml_ctx->v21.mode_programming.dml2_instance->scratch.build_mode_programming_locals.mode_programming_params.programming = dml_ctx->v21.mode_programming.programming; + DC_FP_START(); is_supported = dml2_check_mode_supported(mode_support); + DC_FP_END(); if (!is_supported) return false; @@ -282,16 +286,12 @@ bool dml21_validate(const struct dc *in_dc, struct dc_state *context, struct dml { bool out = false; - DC_FP_START(); - /* Use dml_validate_only for fast_validate path */ if (fast_validate) out = dml21_check_mode_support(in_dc, context, dml_ctx); else out = dml21_mode_check_and_programming(in_dc, context, dml_ctx); - DC_FP_END(); - return out; } -- GitLab From 8cafd7266fa02e0863bacbf872fe635c0b9725eb Mon Sep 17 00:00:00 2001 From: Al Viro Date: Sun, 27 Apr 2025 15:41:51 -0400 Subject: [PATCH 0531/2211] __legitimize_mnt(): check for MNT_SYNC_UMOUNT should be under mount_lock [ Upstream commit 250cf3693060a5f803c5f1ddc082bb06b16112a9 ] ... or we risk stealing final mntput from sync umount - raising mnt_count after umount(2) has verified that victim is not busy, but before it has set MNT_SYNC_UMOUNT; in that case __legitimize_mnt() doesn't see that it's safe to quietly undo mnt_count increment and leaves dropping the reference to caller, where it'll be a full-blown mntput(). Check under mount_lock is needed; leaving the current one done before taking that makes no sense - it's nowhere near common enough to bother with. Reviewed-by: Christian Brauner Signed-off-by: Al Viro Signed-off-by: Sasha Levin --- fs/namespace.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/fs/namespace.c b/fs/namespace.c index c3c1e8c644f2e..c1ac585e41e36 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -750,12 +750,8 @@ int __legitimize_mnt(struct vfsmount *bastard, unsigned seq) smp_mb(); // see mntput_no_expire() and do_umount() if (likely(!read_seqretry(&mount_lock, seq))) return 0; - if (bastard->mnt_flags & MNT_SYNC_UMOUNT) { - mnt_add_count(mnt, -1); - return 1; - } lock_mount_hash(); - if (unlikely(bastard->mnt_flags & MNT_DOOMED)) { + if (unlikely(bastard->mnt_flags & (MNT_SYNC_UMOUNT | MNT_DOOMED))) { mnt_add_count(mnt, -1); unlock_mount_hash(); return 1; -- GitLab From 153bc79b5d02c167385afb05ab0e35d4baea3c96 Mon Sep 17 00:00:00 2001 From: Charles Keepax Date: Wed, 9 Apr 2025 13:22:39 +0100 Subject: [PATCH 0532/2211] soundwire: bus: Fix race on the creation of the IRQ domain [ Upstream commit fd15594ba7d559d9da741504c322b9f57c4981e5 ] The SoundWire IRQ domain needs to be created before any slaves are added to the bus, such that the domain is always available when needed. Move the call to sdw_irq_create() before the calls to sdw_acpi_find_slaves() and sdw_of_find_slaves(). Fixes: 12a95123bfe1 ("soundwire: bus: Allow SoundWire peripherals to register IRQ handlers") Signed-off-by: Charles Keepax Link: https://lore.kernel.org/r/20250409122239.1396489-1-ckeepax@opensource.cirrus.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/soundwire/bus.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c index 263ca32f0c5c3..6ca06cce41d3c 100644 --- a/drivers/soundwire/bus.c +++ b/drivers/soundwire/bus.c @@ -121,6 +121,10 @@ int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent, set_bit(SDW_GROUP13_DEV_NUM, bus->assigned); set_bit(SDW_MASTER_DEV_NUM, bus->assigned); + ret = sdw_irq_create(bus, fwnode); + if (ret) + return ret; + /* * SDW is an enumerable bus, but devices can be powered off. So, * they won't be able to report as present. @@ -137,6 +141,7 @@ int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent, if (ret < 0) { dev_err(bus->dev, "Finding slaves failed:%d\n", ret); + sdw_irq_delete(bus); return ret; } @@ -155,10 +160,6 @@ int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent, bus->params.curr_bank = SDW_BANK0; bus->params.next_bank = SDW_BANK1; - ret = sdw_irq_create(bus, fwnode); - if (ret) - return ret; - return 0; } EXPORT_SYMBOL(sdw_bus_master_add); -- GitLab From 28756f22de48d25256ed89234b66b9037a3f0157 Mon Sep 17 00:00:00 2001 From: Sabrina Dubroca Date: Wed, 9 Apr 2025 15:59:56 +0200 Subject: [PATCH 0533/2211] espintcp: fix skb leaks [ Upstream commit 63c1f19a3be3169e51a5812d22a6d0c879414076 ] A few error paths are missing a kfree_skb. Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)") Signed-off-by: Sabrina Dubroca Reviewed-by: Simon Horman Signed-off-by: Steffen Klassert Signed-off-by: Sasha Levin --- net/ipv4/esp4.c | 4 +++- net/ipv6/esp6.c | 4 +++- net/xfrm/espintcp.c | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index f3281312eb5eb..f0a7f06df3ade 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c @@ -199,8 +199,10 @@ static int esp_output_tcp_finish(struct xfrm_state *x, struct sk_buff *skb) sk = esp_find_tcp_sk(x); err = PTR_ERR_OR_ZERO(sk); - if (err) + if (err) { + kfree_skb(skb); goto out; + } bh_lock_sock(sk); if (sock_owned_by_user(sk)) diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index b2400c226a325..3810cfbc44103 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c @@ -216,8 +216,10 @@ static int esp_output_tcp_finish(struct xfrm_state *x, struct sk_buff *skb) sk = esp6_find_tcp_sk(x); err = PTR_ERR_OR_ZERO(sk); - if (err) + if (err) { + kfree_skb(skb); goto out; + } bh_lock_sock(sk); if (sock_owned_by_user(sk)) diff --git a/net/xfrm/espintcp.c b/net/xfrm/espintcp.c index fe82e2d073006..fc7a603b04f13 100644 --- a/net/xfrm/espintcp.c +++ b/net/xfrm/espintcp.c @@ -171,8 +171,10 @@ int espintcp_queue_out(struct sock *sk, struct sk_buff *skb) struct espintcp_ctx *ctx = espintcp_getctx(sk); if (skb_queue_len(&ctx->out_queue) >= - READ_ONCE(net_hotdata.max_backlog)) + READ_ONCE(net_hotdata.max_backlog)) { + kfree_skb(skb); return -ENOBUFS; + } __skb_queue_tail(&ctx->out_queue, skb); -- GitLab From 9cbca30102028f9ad3d2098f935c4368f581fd07 Mon Sep 17 00:00:00 2001 From: Sabrina Dubroca Date: Wed, 9 Apr 2025 15:59:57 +0200 Subject: [PATCH 0534/2211] espintcp: remove encap socket caching to avoid reference leak [ Upstream commit 028363685bd0b7a19b4a820f82dd905b1dc83999 ] The current scheme for caching the encap socket can lead to reference leaks when we try to delete the netns. The reference chain is: xfrm_state -> enacp_sk -> netns Since the encap socket is a userspace socket, it holds a reference on the netns. If we delete the espintcp state (through flush or individual delete) before removing the netns, the reference on the socket is dropped and the netns is correctly deleted. Otherwise, the netns may not be reachable anymore (if all processes within the ns have terminated), so we cannot delete the xfrm state to drop its reference on the socket. This patch results in a small (~2% in my tests) performance regression. A GC-type mechanism could be added for the socket cache, to clear references if the state hasn't been used "recently", but it's a lot more complex than just not caching the socket. Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)") Signed-off-by: Sabrina Dubroca Reviewed-by: Simon Horman Signed-off-by: Steffen Klassert Signed-off-by: Sasha Levin --- include/net/xfrm.h | 1 - net/ipv4/esp4.c | 49 ++++--------------------------------------- net/ipv6/esp6.c | 49 ++++--------------------------------------- net/xfrm/xfrm_state.c | 3 --- 4 files changed, 8 insertions(+), 94 deletions(-) diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 83e9ef25b8d0d..1484dd15a3694 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -233,7 +233,6 @@ struct xfrm_state { /* Data for encapsulator */ struct xfrm_encap_tmpl *encap; - struct sock __rcu *encap_sk; /* NAT keepalive */ u32 nat_keepalive_interval; /* seconds */ diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index f0a7f06df3ade..cbe4c6fc8b8e9 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c @@ -120,47 +120,16 @@ static void esp_ssg_unref(struct xfrm_state *x, void *tmp, struct sk_buff *skb) } #ifdef CONFIG_INET_ESPINTCP -struct esp_tcp_sk { - struct sock *sk; - struct rcu_head rcu; -}; - -static void esp_free_tcp_sk(struct rcu_head *head) -{ - struct esp_tcp_sk *esk = container_of(head, struct esp_tcp_sk, rcu); - - sock_put(esk->sk); - kfree(esk); -} - static struct sock *esp_find_tcp_sk(struct xfrm_state *x) { struct xfrm_encap_tmpl *encap = x->encap; struct net *net = xs_net(x); - struct esp_tcp_sk *esk; __be16 sport, dport; - struct sock *nsk; struct sock *sk; - sk = rcu_dereference(x->encap_sk); - if (sk && sk->sk_state == TCP_ESTABLISHED) - return sk; - spin_lock_bh(&x->lock); sport = encap->encap_sport; dport = encap->encap_dport; - nsk = rcu_dereference_protected(x->encap_sk, - lockdep_is_held(&x->lock)); - if (sk && sk == nsk) { - esk = kmalloc(sizeof(*esk), GFP_ATOMIC); - if (!esk) { - spin_unlock_bh(&x->lock); - return ERR_PTR(-ENOMEM); - } - RCU_INIT_POINTER(x->encap_sk, NULL); - esk->sk = sk; - call_rcu(&esk->rcu, esp_free_tcp_sk); - } spin_unlock_bh(&x->lock); sk = inet_lookup_established(net, net->ipv4.tcp_death_row.hashinfo, x->id.daddr.a4, @@ -173,20 +142,6 @@ static struct sock *esp_find_tcp_sk(struct xfrm_state *x) return ERR_PTR(-EINVAL); } - spin_lock_bh(&x->lock); - nsk = rcu_dereference_protected(x->encap_sk, - lockdep_is_held(&x->lock)); - if (encap->encap_sport != sport || - encap->encap_dport != dport) { - sock_put(sk); - sk = nsk ?: ERR_PTR(-EREMCHG); - } else if (sk == nsk) { - sock_put(sk); - } else { - rcu_assign_pointer(x->encap_sk, sk); - } - spin_unlock_bh(&x->lock); - return sk; } @@ -211,6 +166,8 @@ static int esp_output_tcp_finish(struct xfrm_state *x, struct sk_buff *skb) err = espintcp_push_skb(sk, skb); bh_unlock_sock(sk); + sock_put(sk); + out: rcu_read_unlock(); return err; @@ -394,6 +351,8 @@ static struct ip_esp_hdr *esp_output_tcp_encap(struct xfrm_state *x, if (IS_ERR(sk)) return ERR_CAST(sk); + sock_put(sk); + *lenp = htons(len); esph = (struct ip_esp_hdr *)(lenp + 1); diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index 3810cfbc44103..62d17d7f6d9a9 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c @@ -137,47 +137,16 @@ static void esp_ssg_unref(struct xfrm_state *x, void *tmp, struct sk_buff *skb) } #ifdef CONFIG_INET6_ESPINTCP -struct esp_tcp_sk { - struct sock *sk; - struct rcu_head rcu; -}; - -static void esp_free_tcp_sk(struct rcu_head *head) -{ - struct esp_tcp_sk *esk = container_of(head, struct esp_tcp_sk, rcu); - - sock_put(esk->sk); - kfree(esk); -} - static struct sock *esp6_find_tcp_sk(struct xfrm_state *x) { struct xfrm_encap_tmpl *encap = x->encap; struct net *net = xs_net(x); - struct esp_tcp_sk *esk; __be16 sport, dport; - struct sock *nsk; struct sock *sk; - sk = rcu_dereference(x->encap_sk); - if (sk && sk->sk_state == TCP_ESTABLISHED) - return sk; - spin_lock_bh(&x->lock); sport = encap->encap_sport; dport = encap->encap_dport; - nsk = rcu_dereference_protected(x->encap_sk, - lockdep_is_held(&x->lock)); - if (sk && sk == nsk) { - esk = kmalloc(sizeof(*esk), GFP_ATOMIC); - if (!esk) { - spin_unlock_bh(&x->lock); - return ERR_PTR(-ENOMEM); - } - RCU_INIT_POINTER(x->encap_sk, NULL); - esk->sk = sk; - call_rcu(&esk->rcu, esp_free_tcp_sk); - } spin_unlock_bh(&x->lock); sk = __inet6_lookup_established(net, net->ipv4.tcp_death_row.hashinfo, &x->id.daddr.in6, @@ -190,20 +159,6 @@ static struct sock *esp6_find_tcp_sk(struct xfrm_state *x) return ERR_PTR(-EINVAL); } - spin_lock_bh(&x->lock); - nsk = rcu_dereference_protected(x->encap_sk, - lockdep_is_held(&x->lock)); - if (encap->encap_sport != sport || - encap->encap_dport != dport) { - sock_put(sk); - sk = nsk ?: ERR_PTR(-EREMCHG); - } else if (sk == nsk) { - sock_put(sk); - } else { - rcu_assign_pointer(x->encap_sk, sk); - } - spin_unlock_bh(&x->lock); - return sk; } @@ -228,6 +183,8 @@ static int esp_output_tcp_finish(struct xfrm_state *x, struct sk_buff *skb) err = espintcp_push_skb(sk, skb); bh_unlock_sock(sk); + sock_put(sk); + out: rcu_read_unlock(); return err; @@ -424,6 +381,8 @@ static struct ip_esp_hdr *esp6_output_tcp_encap(struct xfrm_state *x, if (IS_ERR(sk)) return ERR_CAST(sk); + sock_put(sk); + *lenp = htons(len); esph = (struct ip_esp_hdr *)(lenp + 1); diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 711e816fc4041..a526b3bb8b88e 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -773,9 +773,6 @@ int __xfrm_state_delete(struct xfrm_state *x) xfrm_nat_keepalive_state_updated(x); spin_unlock(&net->xfrm.xfrm_state_lock); - if (x->encap_sk) - sock_put(rcu_dereference_raw(x->encap_sk)); - xfrm_dev_state_delete(x); /* All xfrm_state objects are created by xfrm_state_alloc. -- GitLab From b1a687eb15bcf5cec5213a43b1236710a79526bf Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 15 Apr 2025 13:13:18 +0200 Subject: [PATCH 0535/2211] xfrm: Fix UDP GRO handling for some corner cases [ Upstream commit e3fd0577768584ece824c8b661c40fb3d912812a ] This fixes an issue that's caused if there is a mismatch between the data offset in the GRO header and the length fields in the regular sk_buff due to the pskb_pull()/skb_push() calls. That's because the UDP GRO layer stripped off the UDP header via skb_gro_pull() already while the UDP header was explicitly not pulled/pushed in this function. For example, an IKE packet that triggered this had len=data_len=1268 and the data_offset in the GRO header was 28 (IPv4 + UDP). So pskb_pull() was called with an offset of 28-8=20, which reduced len to 1248 and via pskb_may_pull() and __pskb_pull_tail() it also set data_len to 1248. As the ESP offload module was not loaded, the function bailed out and called skb_push(), which restored len to 1268, however, data_len remained at 1248. So while skb_headlen() was 0 before, it was now 20. The latter caused a difference of 8 instead of 28 (or 0 if pskb_pull()/skb_push() was called with the complete GRO data_offset) in gro_try_pull_from_frag0() that triggered a call to gro_pull_from_frag0() that corrupted the packet. This change uses a more GRO-like approach seen in other GRO receivers via skb_gro_header() to just read the actual data we are interested in and does not try to "restore" the UDP header at this point to call the existing function. If the offload module is not loaded, it immediately bails out, otherwise, it only does a quick check to see if the packet is an IKE or keepalive packet instead of calling the existing function. Fixes: 172bf009c18d ("xfrm: Support GRO for IPv4 ESP in UDP encapsulation") Fixes: 221ddb723d90 ("xfrm: Support GRO for IPv6 ESP in UDP encapsulation") Signed-off-by: Tobias Brunner Signed-off-by: Steffen Klassert Signed-off-by: Sasha Levin --- net/ipv4/xfrm4_input.c | 18 ++++++++++-------- net/ipv6/xfrm6_input.c | 18 ++++++++++-------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/net/ipv4/xfrm4_input.c b/net/ipv4/xfrm4_input.c index a620618cc568a..17d3fc2fab4cc 100644 --- a/net/ipv4/xfrm4_input.c +++ b/net/ipv4/xfrm4_input.c @@ -182,11 +182,15 @@ struct sk_buff *xfrm4_gro_udp_encap_rcv(struct sock *sk, struct list_head *head, int offset = skb_gro_offset(skb); const struct net_offload *ops; struct sk_buff *pp = NULL; - int ret; - - offset = offset - sizeof(struct udphdr); + int len, dlen; + __u8 *udpdata; + __be32 *udpdata32; - if (!pskb_pull(skb, offset)) + len = skb->len - offset; + dlen = offset + min(len, 8); + udpdata = skb_gro_header(skb, dlen, offset); + udpdata32 = (__be32 *)udpdata; + if (unlikely(!udpdata)) return NULL; rcu_read_lock(); @@ -194,11 +198,10 @@ struct sk_buff *xfrm4_gro_udp_encap_rcv(struct sock *sk, struct list_head *head, if (!ops || !ops->callbacks.gro_receive) goto out; - ret = __xfrm4_udp_encap_rcv(sk, skb, false); - if (ret) + /* check if it is a keepalive or IKE packet */ + if (len <= sizeof(struct ip_esp_hdr) || udpdata32[0] == 0) goto out; - skb_push(skb, offset); NAPI_GRO_CB(skb)->proto = IPPROTO_UDP; pp = call_gro_receive(ops->callbacks.gro_receive, head, skb); @@ -208,7 +211,6 @@ struct sk_buff *xfrm4_gro_udp_encap_rcv(struct sock *sk, struct list_head *head, out: rcu_read_unlock(); - skb_push(skb, offset); NAPI_GRO_CB(skb)->same_flow = 0; NAPI_GRO_CB(skb)->flush = 1; diff --git a/net/ipv6/xfrm6_input.c b/net/ipv6/xfrm6_input.c index 4abc5e9d63227..841c81abaaf4f 100644 --- a/net/ipv6/xfrm6_input.c +++ b/net/ipv6/xfrm6_input.c @@ -179,14 +179,18 @@ struct sk_buff *xfrm6_gro_udp_encap_rcv(struct sock *sk, struct list_head *head, int offset = skb_gro_offset(skb); const struct net_offload *ops; struct sk_buff *pp = NULL; - int ret; + int len, dlen; + __u8 *udpdata; + __be32 *udpdata32; if (skb->protocol == htons(ETH_P_IP)) return xfrm4_gro_udp_encap_rcv(sk, head, skb); - offset = offset - sizeof(struct udphdr); - - if (!pskb_pull(skb, offset)) + len = skb->len - offset; + dlen = offset + min(len, 8); + udpdata = skb_gro_header(skb, dlen, offset); + udpdata32 = (__be32 *)udpdata; + if (unlikely(!udpdata)) return NULL; rcu_read_lock(); @@ -194,11 +198,10 @@ struct sk_buff *xfrm6_gro_udp_encap_rcv(struct sock *sk, struct list_head *head, if (!ops || !ops->callbacks.gro_receive) goto out; - ret = __xfrm6_udp_encap_rcv(sk, skb, false); - if (ret) + /* check if it is a keepalive or IKE packet */ + if (len <= sizeof(struct ip_esp_hdr) || udpdata32[0] == 0) goto out; - skb_push(skb, offset); NAPI_GRO_CB(skb)->proto = IPPROTO_UDP; pp = call_gro_receive(ops->callbacks.gro_receive, head, skb); @@ -208,7 +211,6 @@ struct sk_buff *xfrm6_gro_udp_encap_rcv(struct sock *sk, struct list_head *head, out: rcu_read_unlock(); - skb_push(skb, offset); NAPI_GRO_CB(skb)->same_flow = 0; NAPI_GRO_CB(skb)->flush = 1; -- GitLab From d91576a2321d7c4ccba879bd5135061713261fa3 Mon Sep 17 00:00:00 2001 From: Vinicius Costa Gomes Date: Mon, 21 Apr 2025 10:03:37 -0700 Subject: [PATCH 0536/2211] dmaengine: idxd: Fix allowing write() from different address spaces [ Upstream commit 8dfa57aabff625bf445548257f7711ef294cd30e ] Check if the process submitting the descriptor belongs to the same address space as the one that opened the file, reject otherwise. Fixes: 6827738dc684 ("dmaengine: idxd: add a write() method for applications to submit work") Signed-off-by: Vinicius Costa Gomes Signed-off-by: Dave Jiang Link: https://lore.kernel.org/r/20250421170337.3008875-1-dave.jiang@intel.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/dma/idxd/cdev.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c index 57f1bf2ab20be..928b8ab8499a7 100644 --- a/drivers/dma/idxd/cdev.c +++ b/drivers/dma/idxd/cdev.c @@ -412,6 +412,9 @@ static int idxd_cdev_mmap(struct file *filp, struct vm_area_struct *vma) if (!idxd->user_submission_safe && !capable(CAP_SYS_RAWIO)) return -EPERM; + if (current->mm != ctx->mm) + return -EPERM; + rc = check_vma(wq, vma, __func__); if (rc < 0) return rc; @@ -478,6 +481,9 @@ static ssize_t idxd_cdev_write(struct file *filp, const char __user *buf, size_t ssize_t written = 0; int i; + if (current->mm != ctx->mm) + return -EPERM; + for (i = 0; i < len/sizeof(struct dsa_hw_desc); i++) { int rc = idxd_submit_user_descriptor(ctx, udesc + i); @@ -498,6 +504,9 @@ static __poll_t idxd_cdev_poll(struct file *filp, struct idxd_device *idxd = wq->idxd; __poll_t out = 0; + if (current->mm != ctx->mm) + return -EPERM; + poll_wait(filp, &wq->err_queue, wait); spin_lock(&idxd->dev_lock); if (idxd->sw_err.valid) -- GitLab From 7f5dc43b462051fe2c4084f040cad96d94ed67b9 Mon Sep 17 00:00:00 2001 From: Seongman Lee Date: Sun, 11 May 2025 18:23:28 +0900 Subject: [PATCH 0537/2211] x86/sev: Fix operator precedence in GHCB_MSR_VMPL_REQ_LEVEL macro [ Upstream commit f7387eff4bad33d12719c66c43541c095556ae4e ] The GHCB_MSR_VMPL_REQ_LEVEL macro lacked parentheses around the bitmask expression, causing the shift operation to bind too early. As a result, when requesting VMPL1 (e.g., GHCB_MSR_VMPL_REQ_LEVEL(1)), incorrect values such as 0x000000016 were generated instead of the intended 0x100000016 (the requested VMPL level is specified in GHCBData[39:32]). Fix the precedence issue by grouping the masked value before applying the shift. [ bp: Massage commit message. ] Fixes: 34ff65901735 ("x86/sev: Use kernel provided SVSM Calling Areas") Signed-off-by: Seongman Lee Signed-off-by: Borislav Petkov (AMD) Link: https://lore.kernel.org/20250511092329.12680-1-cloudlee1719@gmail.com Signed-off-by: Sasha Levin --- arch/x86/include/asm/sev-common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/include/asm/sev-common.h b/arch/x86/include/asm/sev-common.h index 98726c2b04f85..ddaf3c62efb52 100644 --- a/arch/x86/include/asm/sev-common.h +++ b/arch/x86/include/asm/sev-common.h @@ -116,7 +116,7 @@ enum psc_op { #define GHCB_MSR_VMPL_REQ 0x016 #define GHCB_MSR_VMPL_REQ_LEVEL(v) \ /* GHCBData[39:32] */ \ - (((u64)(v) & GENMASK_ULL(7, 0) << 32) | \ + ((((u64)(v) & GENMASK_ULL(7, 0)) << 32) | \ /* GHCBDdata[11:0] */ \ GHCB_MSR_VMPL_REQ) -- GitLab From 447c8f0c06190b582824144c5264b93e0de3b161 Mon Sep 17 00:00:00 2001 From: David Hildenbrand Date: Tue, 22 Apr 2025 16:49:42 +0200 Subject: [PATCH 0538/2211] kernel/fork: only call untrack_pfn_clear() on VMAs duplicated for fork() [ Upstream commit e9f180d7cfde23b9f8eebd60272465176373ab2c ] Not intuitive, but vm_area_dup() located in kernel/fork.c is not only used for duplicating VMAs during fork(), but also for duplicating VMAs when splitting VMAs or when mremap()'ing them. VM_PFNMAP mappings can at least get ordinarily mremap()'ed (no change in size) and apparently also shrunk during mremap(), which implies duplicating the VMA in __split_vma() first. In case of ordinary mremap() (no change in size), we first duplicate the VMA in copy_vma_and_data()->copy_vma() to then call untrack_pfn_clear() on the old VMA: we effectively move the VM_PAT reservation. So the untrack_pfn_clear() call on the new VMA duplicating is wrong in that context. Splitting of VMAs seems problematic, because we don't duplicate/adjust the reservation when splitting the VMA. Instead, in memtype_erase() -- called during zapping/munmap -- we shrink a reservation in case only the end address matches: Assume we split a VMA into A and B, both would share a reservation until B is unmapped. So when unmapping B, the reservation would be updated to cover only A. When unmapping A, we would properly remove the now-shrunk reservation. That scenario describes the mremap() shrinking (old_size > new_size), where we split + unmap B, and the untrack_pfn_clear() on the new VMA when is wrong. What if we manage to split a VM_PFNMAP VMA into A and B and unmap A first? It would be broken because we would never free the reservation. Likely, there are ways to trigger such a VMA split outside of mremap(). Affecting other VMA duplication was not intended, vm_area_dup() being used outside of kernel/fork.c was an oversight. So let's fix that for; how to handle VMA splits better should be investigated separately. With a simple reproducer that uses mprotect() to split such a VMA I can trigger x86/PAT: pat_mremap:26448 freeing invalid memtype [mem 0x00000000-0x00000fff] Link: https://lkml.kernel.org/r/20250422144942.2871395-1-david@redhat.com Fixes: dc84bc2aba85 ("x86/mm/pat: Fix VM_PAT handling when fork() fails in copy_page_range()") Signed-off-by: David Hildenbrand Reviewed-by: Lorenzo Stoakes Cc: Ingo Molnar Cc: Dave Hansen Cc: Andy Lutomirski Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Borislav Petkov Cc: Rik van Riel Cc: "H. Peter Anvin" Cc: Linus Torvalds Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin --- kernel/fork.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/kernel/fork.c b/kernel/fork.c index 12decadff468f..97c9afe3efc38 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -505,10 +505,6 @@ struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) vma_numab_state_init(new); dup_anon_vma_name(orig, new); - /* track_pfn_copy() will later take care of copying internal state. */ - if (unlikely(new->vm_flags & VM_PFNMAP)) - untrack_pfn_clear(new); - return new; } @@ -699,6 +695,11 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, tmp = vm_area_dup(mpnt); if (!tmp) goto fail_nomem; + + /* track_pfn_copy() will later take care of copying internal state. */ + if (unlikely(tmp->vm_flags & VM_PFNMAP)) + untrack_pfn_clear(tmp); + retval = vma_dup_policy(mpnt, tmp); if (retval) goto fail_nomem_policy; -- GitLab From 090aa8d51ec6c2413e14859edfa81c9def5782ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matti=20Lehtim=C3=A4ki?= Date: Mon, 12 May 2025 02:40:15 +0300 Subject: [PATCH 0539/2211] remoteproc: qcom_wcnss: Fix on platforms without fallback regulators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 4ca45af0a56d00b86285d6fdd720dca3215059a7 ] Recent change to handle platforms with only single power domain broke pronto-v3 which requires power domains and doesn't have fallback voltage regulators in case power domains are missing. Add a check to verify the number of fallback voltage regulators before using the code which handles single power domain situation. Fixes: 65991ea8a6d1 ("remoteproc: qcom_wcnss: Handle platforms with only single power domain") Signed-off-by: Matti Lehtimäki Tested-by: Luca Weiss # sdm632-fairphone-fp3 Link: https://lore.kernel.org/r/20250511234026.94735-1-matti.lehtimaki@gmail.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/remoteproc/qcom_wcnss.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/remoteproc/qcom_wcnss.c b/drivers/remoteproc/qcom_wcnss.c index 735d373a9f636..a2ae6adf0053a 100644 --- a/drivers/remoteproc/qcom_wcnss.c +++ b/drivers/remoteproc/qcom_wcnss.c @@ -456,7 +456,8 @@ static int wcnss_init_regulators(struct qcom_wcnss *wcnss, if (wcnss->num_pds) { info += wcnss->num_pds; /* Handle single power domain case */ - num_vregs += num_pd_vregs - wcnss->num_pds; + if (wcnss->num_pds < num_pd_vregs) + num_vregs += num_pd_vregs - wcnss->num_pds; } else { num_vregs += num_pd_vregs; } -- GitLab From ae5e975a46e268e2ce95094314762449549462ca Mon Sep 17 00:00:00 2001 From: Andre Przywara Date: Thu, 1 May 2025 13:06:31 +0100 Subject: [PATCH 0540/2211] clk: sunxi-ng: d1: Add missing divider for MMC mod clocks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 98e6da673cc6dd46ca9a599802bd2c8f83606710 ] The D1/R528/T113 SoCs have a hidden divider of 2 in the MMC mod clocks, just as other recent SoCs. So far we did not describe that, which led to the resulting MMC clock rate to be only half of its intended value. Use a macro that allows to describe a fixed post-divider, to compensate for that divisor. This brings the MMC performance on those SoCs to its expected level, so about 23 MB/s for SD cards, instead of the 11 MB/s measured so far. Fixes: 35b97bb94111 ("clk: sunxi-ng: Add support for the D1 SoC clocks") Reported-by: Kuba Szczodrzyński Signed-off-by: Andre Przywara Link: https://patch.msgid.link/20250501120631.837186-1-andre.przywara@arm.com Signed-off-by: Chen-Yu Tsai Signed-off-by: Sasha Levin --- drivers/clk/sunxi-ng/ccu-sun20i-d1.c | 44 ++++++++++++++++------------ drivers/clk/sunxi-ng/ccu_mp.h | 22 ++++++++++++++ 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/drivers/clk/sunxi-ng/ccu-sun20i-d1.c b/drivers/clk/sunxi-ng/ccu-sun20i-d1.c index 3f095515f54f9..54d2c7f0ed632 100644 --- a/drivers/clk/sunxi-ng/ccu-sun20i-d1.c +++ b/drivers/clk/sunxi-ng/ccu-sun20i-d1.c @@ -412,19 +412,23 @@ static const struct clk_parent_data mmc0_mmc1_parents[] = { { .hw = &pll_periph0_2x_clk.common.hw }, { .hw = &pll_audio1_div2_clk.common.hw }, }; -static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc0_clk, "mmc0", mmc0_mmc1_parents, 0x830, - 0, 4, /* M */ - 8, 2, /* P */ - 24, 3, /* mux */ - BIT(31), /* gate */ - 0); - -static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc1_clk, "mmc1", mmc0_mmc1_parents, 0x834, - 0, 4, /* M */ - 8, 2, /* P */ - 24, 3, /* mux */ - BIT(31), /* gate */ - 0); +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE_POSTDIV(mmc0_clk, "mmc0", + mmc0_mmc1_parents, 0x830, + 0, 4, /* M */ + 8, 2, /* P */ + 24, 3, /* mux */ + BIT(31), /* gate */ + 2, /* post-div */ + 0); + +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE_POSTDIV(mmc1_clk, "mmc1", + mmc0_mmc1_parents, 0x834, + 0, 4, /* M */ + 8, 2, /* P */ + 24, 3, /* mux */ + BIT(31), /* gate */ + 2, /* post-div */ + 0); static const struct clk_parent_data mmc2_parents[] = { { .fw_name = "hosc" }, @@ -433,12 +437,14 @@ static const struct clk_parent_data mmc2_parents[] = { { .hw = &pll_periph0_800M_clk.common.hw }, { .hw = &pll_audio1_div2_clk.common.hw }, }; -static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc2_clk, "mmc2", mmc2_parents, 0x838, - 0, 4, /* M */ - 8, 2, /* P */ - 24, 3, /* mux */ - BIT(31), /* gate */ - 0); +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE_POSTDIV(mmc2_clk, "mmc2", mmc2_parents, + 0x838, + 0, 4, /* M */ + 8, 2, /* P */ + 24, 3, /* mux */ + BIT(31), /* gate */ + 2, /* post-div */ + 0); static SUNXI_CCU_GATE_HWS(bus_mmc0_clk, "bus-mmc0", psi_ahb_hws, 0x84c, BIT(0), 0); diff --git a/drivers/clk/sunxi-ng/ccu_mp.h b/drivers/clk/sunxi-ng/ccu_mp.h index 6e50f3728fb5f..7d836a9fb3db3 100644 --- a/drivers/clk/sunxi-ng/ccu_mp.h +++ b/drivers/clk/sunxi-ng/ccu_mp.h @@ -52,6 +52,28 @@ struct ccu_mp { } \ } +#define SUNXI_CCU_MP_DATA_WITH_MUX_GATE_POSTDIV(_struct, _name, _parents, \ + _reg, \ + _mshift, _mwidth, \ + _pshift, _pwidth, \ + _muxshift, _muxwidth, \ + _gate, _postdiv, _flags)\ + struct ccu_mp _struct = { \ + .enable = _gate, \ + .m = _SUNXI_CCU_DIV(_mshift, _mwidth), \ + .p = _SUNXI_CCU_DIV(_pshift, _pwidth), \ + .mux = _SUNXI_CCU_MUX(_muxshift, _muxwidth), \ + .fixed_post_div = _postdiv, \ + .common = { \ + .reg = _reg, \ + .features = CCU_FEATURE_FIXED_POSTDIV, \ + .hw.init = CLK_HW_INIT_PARENTS_DATA(_name, \ + _parents, \ + &ccu_mp_ops, \ + _flags), \ + } \ + } + #define SUNXI_CCU_MP_WITH_MUX_GATE(_struct, _name, _parents, _reg, \ _mshift, _mwidth, \ _pshift, _pwidth, \ -- GitLab From 252f78a9317acfaca9ba2d3154a107e281295bdf Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 7 May 2025 13:31:58 +0200 Subject: [PATCH 0541/2211] xfrm: Sanitize marks before insert [ Upstream commit 0b91fda3a1f044141e1e615456ff62508c32b202 ] Prior to this patch, the mark is sanitized (applying the state's mask to the state's value) only on inserts when checking if a conflicting XFRM state or policy exists. We discovered in Cilium that this same sanitization does not occur in the hot-path __xfrm_state_lookup. In the hot-path, the sk_buff's mark is simply compared to the state's value: if ((mark & x->mark.m) != x->mark.v) continue; Therefore, users can define unsanitized marks (ex. 0xf42/0xf00) which will never match any packet. This commit updates __xfrm_state_insert and xfrm_policy_insert to store the sanitized marks, thus removing this footgun. This has the side effect of changing the ip output, as the returned mark will have the mask applied to it when printed. Fixes: 3d6acfa7641f ("xfrm: SA lookups with mark") Signed-off-by: Paul Chaignon Signed-off-by: Louis DeLosSantos Co-developed-by: Louis DeLosSantos Signed-off-by: Steffen Klassert Signed-off-by: Sasha Levin --- net/xfrm/xfrm_policy.c | 3 +++ net/xfrm/xfrm_state.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 8a1b83191a6cd..2c42d83fbaa2d 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -1581,6 +1581,9 @@ int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl) struct xfrm_policy *delpol; struct hlist_head *chain; + /* Sanitize mark before store */ + policy->mark.v &= policy->mark.m; + spin_lock_bh(&net->xfrm.xfrm_policy_lock); chain = policy_hash_bysel(net, &policy->selector, policy->family, dir); if (chain) diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index a526b3bb8b88e..abd725386cb60 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -1653,6 +1653,9 @@ static void __xfrm_state_insert(struct xfrm_state *x) list_add(&x->km.all, &net->xfrm.state_all); + /* Sanitize mark before store */ + x->mark.v &= x->mark.m; + h = xfrm_dst_hash(net, &x->id.daddr, &x->props.saddr, x->props.reqid, x->props.family); XFRM_STATE_INSERT(bydst, &x->bydst, net->xfrm.state_bydst + h, -- GitLab From d31daa83efbab525ebadb79a8ae26c75e325b547 Mon Sep 17 00:00:00 2001 From: Dave Jiang Date: Thu, 8 May 2025 10:05:48 -0700 Subject: [PATCH 0542/2211] dmaengine: idxd: Fix ->poll() return value [ Upstream commit ae74cd15ade833adc289279b5c6f12e78f64d4d7 ] The fix to block access from different address space did not return a correct value for ->poll() change. kernel test bot reported that a return value of type __poll_t is expected rather than int. Fix to return POLLNVAL to indicate invalid request. Fixes: 8dfa57aabff6 ("dmaengine: idxd: Fix allowing write() from different address spaces") Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202505081851.rwD7jVxg-lkp@intel.com/ Signed-off-by: Dave Jiang Link: https://lore.kernel.org/r/20250508170548.2747425-1-dave.jiang@intel.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/dma/idxd/cdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c index 928b8ab8499a7..22aa2bab3693c 100644 --- a/drivers/dma/idxd/cdev.c +++ b/drivers/dma/idxd/cdev.c @@ -505,7 +505,7 @@ static __poll_t idxd_cdev_poll(struct file *filp, __poll_t out = 0; if (current->mm != ctx->mm) - return -EPERM; + return POLLNVAL; poll_wait(filp, &wq->err_queue, wait); spin_lock(&idxd->dev_lock); -- GitLab From ae344b9f842d99c95a1df7006b901cf3ab8bc8bf Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Thu, 24 Apr 2025 13:48:29 +0200 Subject: [PATCH 0543/2211] dmaengine: fsl-edma: Fix return code for unhandled interrupts [ Upstream commit 5e27af0514e2249a9ccc9a762abd3b74e03a1f90 ] For fsl,imx93-edma4 two DMA channels share the same interrupt. So in case fsl_edma3_tx_handler is called for the "wrong" channel, the return code must be IRQ_NONE. This signalize that the interrupt wasn't handled. Fixes: 72f5801a4e2b ("dmaengine: fsl-edma: integrate v3 support") Signed-off-by: Stefan Wahren Reviewed-by: Joy Zou Link: https://lore.kernel.org/r/20250424114829.9055-1-wahrenst@gmx.net Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/dma/fsl-edma-main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/dma/fsl-edma-main.c b/drivers/dma/fsl-edma-main.c index 27645606f900b..4794d58dab556 100644 --- a/drivers/dma/fsl-edma-main.c +++ b/drivers/dma/fsl-edma-main.c @@ -56,7 +56,7 @@ static irqreturn_t fsl_edma3_tx_handler(int irq, void *dev_id) intr = edma_readl_chreg(fsl_chan, ch_int); if (!intr) - return IRQ_HANDLED; + return IRQ_NONE; edma_writel_chreg(fsl_chan, 1, ch_int); -- GitLab From 7207effe4743f49eb8b74ceb66e170b70e4746d2 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Wed, 12 Feb 2025 11:55:03 +0530 Subject: [PATCH 0544/2211] driver core: Split devres APIs to device/devres.h [ Upstream commit a21cad9312767d26b5257ce0662699bb202cdda1 ] device.h is a huge header which is hard to follow and easy to miss something. Improve that by splitting devres APIs to device/devres.h. In particular this helps to speedup the build of the code that includes device.h solely for a devres APIs. While at it, cast the error pointers to __iomem using IOMEM_ERR_PTR() and fix sparse warnings. Signed-off-by: Raag Jadav Acked-by: Arnd Bergmann Reviewed-by: Greg Kroah-Hartman Signed-off-by: Andy Shevchenko Stable-dep-of: 7dd7f39fce00 ("ASoC: SOF: Intel: hda: Fix UAF when reloading module") Signed-off-by: Sasha Levin --- include/linux/device.h | 119 +------------------------------- include/linux/device/devres.h | 124 ++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 118 deletions(-) create mode 100644 include/linux/device/devres.h diff --git a/include/linux/device.h b/include/linux/device.h index 667cb6db90193..39120b172992e 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -26,9 +26,9 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -281,123 +281,6 @@ int __must_check device_create_bin_file(struct device *dev, void device_remove_bin_file(struct device *dev, const struct bin_attribute *attr); -/* device resource management */ -typedef void (*dr_release_t)(struct device *dev, void *res); -typedef int (*dr_match_t)(struct device *dev, void *res, void *match_data); - -void *__devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, - int nid, const char *name) __malloc; -#define devres_alloc(release, size, gfp) \ - __devres_alloc_node(release, size, gfp, NUMA_NO_NODE, #release) -#define devres_alloc_node(release, size, gfp, nid) \ - __devres_alloc_node(release, size, gfp, nid, #release) - -void devres_for_each_res(struct device *dev, dr_release_t release, - dr_match_t match, void *match_data, - void (*fn)(struct device *, void *, void *), - void *data); -void devres_free(void *res); -void devres_add(struct device *dev, void *res); -void *devres_find(struct device *dev, dr_release_t release, - dr_match_t match, void *match_data); -void *devres_get(struct device *dev, void *new_res, - dr_match_t match, void *match_data); -void *devres_remove(struct device *dev, dr_release_t release, - dr_match_t match, void *match_data); -int devres_destroy(struct device *dev, dr_release_t release, - dr_match_t match, void *match_data); -int devres_release(struct device *dev, dr_release_t release, - dr_match_t match, void *match_data); - -/* devres group */ -void * __must_check devres_open_group(struct device *dev, void *id, gfp_t gfp); -void devres_close_group(struct device *dev, void *id); -void devres_remove_group(struct device *dev, void *id); -int devres_release_group(struct device *dev, void *id); - -/* managed devm_k.alloc/kfree for device drivers */ -void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp) __alloc_size(2); -void *devm_krealloc(struct device *dev, void *ptr, size_t size, - gfp_t gfp) __must_check __realloc_size(3); -__printf(3, 0) char *devm_kvasprintf(struct device *dev, gfp_t gfp, - const char *fmt, va_list ap) __malloc; -__printf(3, 4) char *devm_kasprintf(struct device *dev, gfp_t gfp, - const char *fmt, ...) __malloc; -static inline void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp) -{ - return devm_kmalloc(dev, size, gfp | __GFP_ZERO); -} -static inline void *devm_kmalloc_array(struct device *dev, - size_t n, size_t size, gfp_t flags) -{ - size_t bytes; - - if (unlikely(check_mul_overflow(n, size, &bytes))) - return NULL; - - return devm_kmalloc(dev, bytes, flags); -} -static inline void *devm_kcalloc(struct device *dev, - size_t n, size_t size, gfp_t flags) -{ - return devm_kmalloc_array(dev, n, size, flags | __GFP_ZERO); -} -static inline __realloc_size(3, 4) void * __must_check -devm_krealloc_array(struct device *dev, void *p, size_t new_n, size_t new_size, gfp_t flags) -{ - size_t bytes; - - if (unlikely(check_mul_overflow(new_n, new_size, &bytes))) - return NULL; - - return devm_krealloc(dev, p, bytes, flags); -} - -void devm_kfree(struct device *dev, const void *p); -char *devm_kstrdup(struct device *dev, const char *s, gfp_t gfp) __malloc; -const char *devm_kstrdup_const(struct device *dev, const char *s, gfp_t gfp); -void *devm_kmemdup(struct device *dev, const void *src, size_t len, gfp_t gfp) - __realloc_size(3); - -unsigned long devm_get_free_pages(struct device *dev, - gfp_t gfp_mask, unsigned int order); -void devm_free_pages(struct device *dev, unsigned long addr); - -#ifdef CONFIG_HAS_IOMEM -void __iomem *devm_ioremap_resource(struct device *dev, - const struct resource *res); -void __iomem *devm_ioremap_resource_wc(struct device *dev, - const struct resource *res); - -void __iomem *devm_of_iomap(struct device *dev, - struct device_node *node, int index, - resource_size_t *size); -#else - -static inline -void __iomem *devm_ioremap_resource(struct device *dev, - const struct resource *res) -{ - return ERR_PTR(-EINVAL); -} - -static inline -void __iomem *devm_ioremap_resource_wc(struct device *dev, - const struct resource *res) -{ - return ERR_PTR(-EINVAL); -} - -static inline -void __iomem *devm_of_iomap(struct device *dev, - struct device_node *node, int index, - resource_size_t *size) -{ - return ERR_PTR(-EINVAL); -} - -#endif - /* allows to add/remove a custom action to devres stack */ void devm_remove_action(struct device *dev, void (*action)(void *), void *data); void devm_release_action(struct device *dev, void (*action)(void *), void *data); diff --git a/include/linux/device/devres.h b/include/linux/device/devres.h new file mode 100644 index 0000000000000..6b0b265058bcc --- /dev/null +++ b/include/linux/device/devres.h @@ -0,0 +1,124 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _DEVICE_DEVRES_H_ +#define _DEVICE_DEVRES_H_ + +#include +#include +#include +#include +#include +#include + +struct device; +struct device_node; +struct resource; + +/* device resource management */ +typedef void (*dr_release_t)(struct device *dev, void *res); +typedef int (*dr_match_t)(struct device *dev, void *res, void *match_data); + +void * __malloc +__devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid, const char *name); +#define devres_alloc(release, size, gfp) \ + __devres_alloc_node(release, size, gfp, NUMA_NO_NODE, #release) +#define devres_alloc_node(release, size, gfp, nid) \ + __devres_alloc_node(release, size, gfp, nid, #release) + +void devres_for_each_res(struct device *dev, dr_release_t release, + dr_match_t match, void *match_data, + void (*fn)(struct device *, void *, void *), + void *data); +void devres_free(void *res); +void devres_add(struct device *dev, void *res); +void *devres_find(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); +void *devres_get(struct device *dev, void *new_res, dr_match_t match, void *match_data); +void *devres_remove(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); +int devres_destroy(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); +int devres_release(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); + +/* devres group */ +void * __must_check devres_open_group(struct device *dev, void *id, gfp_t gfp); +void devres_close_group(struct device *dev, void *id); +void devres_remove_group(struct device *dev, void *id); +int devres_release_group(struct device *dev, void *id); + +/* managed devm_k.alloc/kfree for device drivers */ +void * __alloc_size(2) +devm_kmalloc(struct device *dev, size_t size, gfp_t gfp); +void * __must_check __realloc_size(3) +devm_krealloc(struct device *dev, void *ptr, size_t size, gfp_t gfp); +static inline void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp) +{ + return devm_kmalloc(dev, size, gfp | __GFP_ZERO); +} +static inline void *devm_kmalloc_array(struct device *dev, size_t n, size_t size, gfp_t flags) +{ + size_t bytes; + + if (unlikely(check_mul_overflow(n, size, &bytes))) + return NULL; + + return devm_kmalloc(dev, bytes, flags); +} +static inline void *devm_kcalloc(struct device *dev, size_t n, size_t size, gfp_t flags) +{ + return devm_kmalloc_array(dev, n, size, flags | __GFP_ZERO); +} +static inline __realloc_size(3, 4) void * __must_check +devm_krealloc_array(struct device *dev, void *p, size_t new_n, size_t new_size, gfp_t flags) +{ + size_t bytes; + + if (unlikely(check_mul_overflow(new_n, new_size, &bytes))) + return NULL; + + return devm_krealloc(dev, p, bytes, flags); +} + +void devm_kfree(struct device *dev, const void *p); + +void * __realloc_size(3) +devm_kmemdup(struct device *dev, const void *src, size_t len, gfp_t gfp); + +char * __malloc +devm_kstrdup(struct device *dev, const char *s, gfp_t gfp); +const char *devm_kstrdup_const(struct device *dev, const char *s, gfp_t gfp); +char * __printf(3, 0) __malloc +devm_kvasprintf(struct device *dev, gfp_t gfp, const char *fmt, va_list ap); +char * __printf(3, 4) __malloc +devm_kasprintf(struct device *dev, gfp_t gfp, const char *fmt, ...); + +unsigned long devm_get_free_pages(struct device *dev, gfp_t gfp_mask, unsigned int order); +void devm_free_pages(struct device *dev, unsigned long addr); + +#ifdef CONFIG_HAS_IOMEM + +void __iomem *devm_ioremap_resource(struct device *dev, const struct resource *res); +void __iomem *devm_ioremap_resource_wc(struct device *dev, const struct resource *res); + +void __iomem *devm_of_iomap(struct device *dev, struct device_node *node, int index, + resource_size_t *size); +#else + +static inline +void __iomem *devm_ioremap_resource(struct device *dev, const struct resource *res) +{ + return IOMEM_ERR_PTR(-EINVAL); +} + +static inline +void __iomem *devm_ioremap_resource_wc(struct device *dev, const struct resource *res) +{ + return IOMEM_ERR_PTR(-EINVAL); +} + +static inline +void __iomem *devm_of_iomap(struct device *dev, struct device_node *node, int index, + resource_size_t *size) +{ + return IOMEM_ERR_PTR(-EINVAL); +} + +#endif + +#endif /* _DEVICE_DEVRES_H_ */ -- GitLab From 4a39fbffad5cd3379d517fc034b9cc43771a7854 Mon Sep 17 00:00:00 2001 From: Raag Jadav Date: Wed, 12 Feb 2025 11:55:05 +0530 Subject: [PATCH 0545/2211] devres: Introduce devm_kmemdup_array() [ Upstream commit a103b833ac3806b816bc993cba77d0b17cf801f1 ] Introduce '_array' variant of devm_kmemdup() which is more robust and consistent with alloc family of helpers. Suggested-by: Andy Shevchenko Signed-off-by: Raag Jadav Reviewed-by: Dmitry Torokhov Reviewed-by: Linus Walleij Signed-off-by: Andy Shevchenko Stable-dep-of: 7dd7f39fce00 ("ASoC: SOF: Intel: hda: Fix UAF when reloading module") Signed-off-by: Sasha Levin --- include/linux/device/devres.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/linux/device/devres.h b/include/linux/device/devres.h index 6b0b265058bcc..9b49f99158508 100644 --- a/include/linux/device/devres.h +++ b/include/linux/device/devres.h @@ -79,6 +79,11 @@ void devm_kfree(struct device *dev, const void *p); void * __realloc_size(3) devm_kmemdup(struct device *dev, const void *src, size_t len, gfp_t gfp); +static inline void *devm_kmemdup_array(struct device *dev, const void *src, + size_t n, size_t size, gfp_t flags) +{ + return devm_kmemdup(dev, src, size_mul(size, n), flags); +} char * __malloc devm_kstrdup(struct device *dev, const char *s, gfp_t gfp); -- GitLab From 2b49e68360eb6a1c03dc1642a51f7d9f6784c034 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Wed, 14 May 2025 09:37:49 -0400 Subject: [PATCH 0546/2211] ASoC: SOF: Intel: hda: Fix UAF when reloading module [ Upstream commit 7dd7f39fce0022b386ef1ea5ffef92ecc7dfc6af ] hda_generic_machine_select() appends -idisp to the tplg filename by allocating a new string with devm_kasprintf(), then stores the string right back into the global variable snd_soc_acpi_intel_hda_machines. When the module is unloaded, this memory is freed, resulting in a global variable pointing to freed memory. Reloading the module then triggers a use-after-free: BUG: KFENCE: use-after-free read in string+0x48/0xe0 Use-after-free read at 0x00000000967e0109 (in kfence-#99): string+0x48/0xe0 vsnprintf+0x329/0x6e0 devm_kvasprintf+0x54/0xb0 devm_kasprintf+0x58/0x80 hda_machine_select.cold+0x198/0x17a2 [snd_sof_intel_hda_generic] sof_probe_work+0x7f/0x600 [snd_sof] process_one_work+0x17b/0x330 worker_thread+0x2ce/0x3f0 kthread+0xcf/0x100 ret_from_fork+0x31/0x50 ret_from_fork_asm+0x1a/0x30 kfence-#99: 0x00000000198a940f-0x00000000ace47d9d, size=64, cache=kmalloc-64 allocated by task 333 on cpu 8 at 17.798069s (130.453553s ago): devm_kmalloc+0x52/0x120 devm_kvasprintf+0x66/0xb0 devm_kasprintf+0x58/0x80 hda_machine_select.cold+0x198/0x17a2 [snd_sof_intel_hda_generic] sof_probe_work+0x7f/0x600 [snd_sof] process_one_work+0x17b/0x330 worker_thread+0x2ce/0x3f0 kthread+0xcf/0x100 ret_from_fork+0x31/0x50 ret_from_fork_asm+0x1a/0x30 freed by task 1543 on cpu 4 at 141.586686s (6.665010s ago): release_nodes+0x43/0xb0 devres_release_all+0x90/0xf0 device_unbind_cleanup+0xe/0x70 device_release_driver_internal+0x1c1/0x200 driver_detach+0x48/0x90 bus_remove_driver+0x6d/0xf0 pci_unregister_driver+0x42/0xb0 __do_sys_delete_module+0x1d1/0x310 do_syscall_64+0x82/0x190 entry_SYSCALL_64_after_hwframe+0x76/0x7e Fix it by copying the match array with devm_kmemdup_array() before we modify it. Fixes: 5458411d7594 ("ASoC: SOF: Intel: hda: refactoring topology name fixup for HDA mach") Suggested-by: Peter Ujfalusi Acked-by: Peter Ujfalusi Signed-off-by: Tavian Barnes Link: https://patch.msgid.link/570b15570b274520a0d9052f4e0f064a29c950ef.1747229716.git.tavianator@tavianator.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/sof/intel/hda.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c index c924a998d6f90..9c8f79e55ec5d 100644 --- a/sound/soc/sof/intel/hda.c +++ b/sound/soc/sof/intel/hda.c @@ -1007,7 +1007,21 @@ static void hda_generic_machine_select(struct snd_sof_dev *sdev, if (!*mach && codec_num <= 2) { bool tplg_fixup = false; - hda_mach = snd_soc_acpi_intel_hda_machines; + /* + * make a local copy of the match array since we might + * be modifying it + */ + hda_mach = devm_kmemdup_array(sdev->dev, + snd_soc_acpi_intel_hda_machines, + 2, /* we have one entry + sentinel in the array */ + sizeof(snd_soc_acpi_intel_hda_machines[0]), + GFP_KERNEL); + if (!hda_mach) { + dev_err(bus->dev, + "%s: failed to duplicate the HDA match table\n", + __func__); + return; + } dev_info(bus->dev, "using HDA machine driver %s now\n", hda_mach->drv_name); -- GitLab From 1c1fb885e5885bdba13e0e65597aa5e4aaa75967 Mon Sep 17 00:00:00 2001 From: Andrew Bresticker Date: Wed, 14 May 2025 10:13:20 -0700 Subject: [PATCH 0547/2211] irqchip/riscv-imsic: Start local sync timer on correct CPU [ Upstream commit 08fb624802d8786253994d8ebdbbcdaa186f04f5 ] When starting the local sync timer to synchronize the state of a remote CPU it should be added on the CPU to be synchronized, not the initiating CPU. This results in interrupt delivery being delayed until the timer eventually runs (due to another mask/unmask/migrate operation) on the target CPU. Fixes: 0f67911e821c ("irqchip/riscv-imsic: Separate next and previous pointers in IMSIC vector") Signed-off-by: Andrew Bresticker Signed-off-by: Thomas Gleixner Reviewed-by: Anup Patel Link: https://lore.kernel.org/all/20250514171320.3494917-1-abrestic@rivosinc.com Signed-off-by: Sasha Levin --- drivers/irqchip/irq-riscv-imsic-state.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/irqchip/irq-riscv-imsic-state.c b/drivers/irqchip/irq-riscv-imsic-state.c index 1aeba76d72795..06ff0e17c0c33 100644 --- a/drivers/irqchip/irq-riscv-imsic-state.c +++ b/drivers/irqchip/irq-riscv-imsic-state.c @@ -186,17 +186,17 @@ skip: } #ifdef CONFIG_SMP -static void __imsic_local_timer_start(struct imsic_local_priv *lpriv) +static void __imsic_local_timer_start(struct imsic_local_priv *lpriv, unsigned int cpu) { lockdep_assert_held(&lpriv->lock); if (!timer_pending(&lpriv->timer)) { lpriv->timer.expires = jiffies + 1; - add_timer_on(&lpriv->timer, smp_processor_id()); + add_timer_on(&lpriv->timer, cpu); } } #else -static inline void __imsic_local_timer_start(struct imsic_local_priv *lpriv) +static inline void __imsic_local_timer_start(struct imsic_local_priv *lpriv, unsigned int cpu) { } #endif @@ -211,7 +211,7 @@ void imsic_local_sync_all(bool force_all) if (force_all) bitmap_fill(lpriv->dirty_bitmap, imsic->global.nr_ids + 1); if (!__imsic_local_sync(lpriv)) - __imsic_local_timer_start(lpriv); + __imsic_local_timer_start(lpriv, smp_processor_id()); raw_spin_unlock_irqrestore(&lpriv->lock, flags); } @@ -256,7 +256,7 @@ static void __imsic_remote_sync(struct imsic_local_priv *lpriv, unsigned int cpu return; } - __imsic_local_timer_start(lpriv); + __imsic_local_timer_start(lpriv, cpu); } } #else -- GitLab From ca51db23166767a8445deb8331c9b8d5205d9287 Mon Sep 17 00:00:00 2001 From: Adrian Hunter Date: Thu, 8 May 2025 16:44:52 +0300 Subject: [PATCH 0548/2211] perf/x86/intel: Fix segfault with PEBS-via-PT with sample_freq [ Upstream commit 99bcd91fabada0dbb1d5f0de44532d8008db93c6 ] Currently, using PEBS-via-PT with a sample frequency instead of a sample period, causes a segfault. For example: BUG: kernel NULL pointer dereference, address: 0000000000000195 ? __die_body.cold+0x19/0x27 ? page_fault_oops+0xca/0x290 ? exc_page_fault+0x7e/0x1b0 ? asm_exc_page_fault+0x26/0x30 ? intel_pmu_pebs_event_update_no_drain+0x40/0x60 ? intel_pmu_pebs_event_update_no_drain+0x32/0x60 intel_pmu_drain_pebs_icl+0x333/0x350 handle_pmi_common+0x272/0x3c0 intel_pmu_handle_irq+0x10a/0x2e0 perf_event_nmi_handler+0x2a/0x50 That happens because intel_pmu_pebs_event_update_no_drain() assumes all the pebs_enabled bits represent counter indexes, which is not always the case. In this particular case, bits 60 and 61 are set for PEBS-via-PT purposes. The behaviour of PEBS-via-PT with sample frequency is questionable because although a PMI is generated (PEBS_PMI_AFTER_EACH_RECORD), the period is not adjusted anyway. Putting that aside, fix intel_pmu_pebs_event_update_no_drain() by passing the mask of counter bits instead of 'size'. Note, prior to the Fixes commit, 'size' would be limited to the maximum counter index, so the issue was not hit. Fixes: 722e42e45c2f1 ("perf/x86: Support counter mask") Signed-off-by: Adrian Hunter Signed-off-by: Ingo Molnar Reviewed-by: Kan Liang Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Alexander Shishkin Cc: Arnaldo Carvalho de Melo Cc: Jiri Olsa Cc: Namhyung Kim Cc: Ian Rogers Cc: linux-perf-users@vger.kernel.org Link: https://lore.kernel.org/r/20250508134452.73960-1-adrian.hunter@intel.com Signed-off-by: Sasha Levin --- arch/x86/events/intel/ds.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c index 1b82bcc6fa556..54007174c15b5 100644 --- a/arch/x86/events/intel/ds.c +++ b/arch/x86/events/intel/ds.c @@ -2240,8 +2240,9 @@ static void intel_pmu_drain_pebs_core(struct pt_regs *iregs, struct perf_sample_ setup_pebs_fixed_sample_data); } -static void intel_pmu_pebs_event_update_no_drain(struct cpu_hw_events *cpuc, int size) +static void intel_pmu_pebs_event_update_no_drain(struct cpu_hw_events *cpuc, u64 mask) { + u64 pebs_enabled = cpuc->pebs_enabled & mask; struct perf_event *event; int bit; @@ -2252,7 +2253,7 @@ static void intel_pmu_pebs_event_update_no_drain(struct cpu_hw_events *cpuc, int * It needs to call intel_pmu_save_and_restart_reload() to * update the event->count for this case. */ - for_each_set_bit(bit, (unsigned long *)&cpuc->pebs_enabled, size) { + for_each_set_bit(bit, (unsigned long *)&pebs_enabled, X86_PMC_IDX_MAX) { event = cpuc->events[bit]; if (event->hw.flags & PERF_X86_EVENT_AUTO_RELOAD) intel_pmu_save_and_restart_reload(event, 0); @@ -2287,7 +2288,7 @@ static void intel_pmu_drain_pebs_nhm(struct pt_regs *iregs, struct perf_sample_d } if (unlikely(base >= top)) { - intel_pmu_pebs_event_update_no_drain(cpuc, size); + intel_pmu_pebs_event_update_no_drain(cpuc, mask); return; } @@ -2397,7 +2398,7 @@ static void intel_pmu_drain_pebs_icl(struct pt_regs *iregs, struct perf_sample_d (hybrid(cpuc->pmu, fixed_cntr_mask64) << INTEL_PMC_IDX_FIXED); if (unlikely(base >= top)) { - intel_pmu_pebs_event_update_no_drain(cpuc, X86_PMC_IDX_MAX); + intel_pmu_pebs_event_update_no_drain(cpuc, mask); return; } -- GitLab From 1e8b7e96f71fe0fe01fb1a26383f36d62a315d45 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 7 May 2025 15:00:30 -0400 Subject: [PATCH 0549/2211] Bluetooth: L2CAP: Fix not checking l2cap_chan security level [ Upstream commit 7af8479d9eb4319b4ba7b47a8c4d2c55af1c31e1 ] l2cap_check_enc_key_size shall check the security level of the l2cap_chan rather than the hci_conn since for incoming connection request that may be different as hci_conn may already been encrypted using a different security level. Fixes: 522e9ed157e3 ("Bluetooth: l2cap: Check encryption key size on incoming connection") Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- net/bluetooth/l2cap_core.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index c219a8c596d3e..66fa5d6fea6ca 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -1411,7 +1411,8 @@ static void l2cap_request_info(struct l2cap_conn *conn) sizeof(req), &req); } -static bool l2cap_check_enc_key_size(struct hci_conn *hcon) +static bool l2cap_check_enc_key_size(struct hci_conn *hcon, + struct l2cap_chan *chan) { /* The minimum encryption key size needs to be enforced by the * host stack before establishing any L2CAP connections. The @@ -1425,7 +1426,7 @@ static bool l2cap_check_enc_key_size(struct hci_conn *hcon) int min_key_size = hcon->hdev->min_enc_key_size; /* On FIPS security level, key size must be 16 bytes */ - if (hcon->sec_level == BT_SECURITY_FIPS) + if (chan->sec_level == BT_SECURITY_FIPS) min_key_size = 16; return (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags) || @@ -1453,7 +1454,7 @@ static void l2cap_do_start(struct l2cap_chan *chan) !__l2cap_no_conn_pending(chan)) return; - if (l2cap_check_enc_key_size(conn->hcon)) + if (l2cap_check_enc_key_size(conn->hcon, chan)) l2cap_start_connection(chan); else __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); @@ -1528,7 +1529,7 @@ static void l2cap_conn_start(struct l2cap_conn *conn) continue; } - if (l2cap_check_enc_key_size(conn->hcon)) + if (l2cap_check_enc_key_size(conn->hcon, chan)) l2cap_start_connection(chan); else l2cap_chan_close(chan, ECONNREFUSED); @@ -3957,7 +3958,7 @@ static void l2cap_connect(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, /* Check if the ACL is secure enough (if not SDP) */ if (psm != cpu_to_le16(L2CAP_PSM_SDP) && (!hci_conn_check_link_mode(conn->hcon) || - !l2cap_check_enc_key_size(conn->hcon))) { + !l2cap_check_enc_key_size(conn->hcon, pchan))) { conn->disc_reason = HCI_ERROR_AUTH_FAILURE; result = L2CAP_CR_SEC_BLOCK; goto response; @@ -7317,7 +7318,7 @@ static void l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) } if (chan->state == BT_CONNECT) { - if (!status && l2cap_check_enc_key_size(hcon)) + if (!status && l2cap_check_enc_key_size(hcon, chan)) l2cap_start_connection(chan); else __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); @@ -7327,7 +7328,7 @@ static void l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) struct l2cap_conn_rsp rsp; __u16 res, stat; - if (!status && l2cap_check_enc_key_size(hcon)) { + if (!status && l2cap_check_enc_key_size(hcon, chan)) { if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { res = L2CAP_CR_PEND; stat = L2CAP_CS_AUTHOR_PEND; -- GitLab From 6a1f9a709a6164633af8cb494bc497fe5f578654 Mon Sep 17 00:00:00 2001 From: En-Wei Wu Date: Thu, 8 May 2025 22:15:20 +0800 Subject: [PATCH 0550/2211] Bluetooth: btusb: use skb_pull to avoid unsafe access in QCA dump handling [ Upstream commit 4bcb0c7dc25446b99fc7a8fa2a143d69f3314162 ] Use skb_pull() and skb_pull_data() to safely parse QCA dump packets. This avoids direct pointer math on skb->data, which could lead to invalid access if the packet is shorter than expected. Fixes: 20981ce2d5a5 ("Bluetooth: btusb: Add WCN6855 devcoredump support") Signed-off-by: En-Wei Wu Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- drivers/bluetooth/btusb.c | 98 ++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 58 deletions(-) diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 7e1f03231b4c9..af2be0271806f 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -2979,9 +2979,8 @@ static void btusb_coredump_qca(struct hci_dev *hdev) static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb) { int ret = 0; + unsigned int skip = 0; u8 pkt_type; - u8 *sk_ptr; - unsigned int sk_len; u16 seqno; u32 dump_size; @@ -2990,18 +2989,13 @@ static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb) struct usb_device *udev = btdata->udev; pkt_type = hci_skb_pkt_type(skb); - sk_ptr = skb->data; - sk_len = skb->len; + skip = sizeof(struct hci_event_hdr); + if (pkt_type == HCI_ACLDATA_PKT) + skip += sizeof(struct hci_acl_hdr); - if (pkt_type == HCI_ACLDATA_PKT) { - sk_ptr += HCI_ACL_HDR_SIZE; - sk_len -= HCI_ACL_HDR_SIZE; - } - - sk_ptr += HCI_EVENT_HDR_SIZE; - sk_len -= HCI_EVENT_HDR_SIZE; + skb_pull(skb, skip); + dump_hdr = (struct qca_dump_hdr *)skb->data; - dump_hdr = (struct qca_dump_hdr *)sk_ptr; seqno = le16_to_cpu(dump_hdr->seqno); if (seqno == 0) { set_bit(BTUSB_HW_SSR_ACTIVE, &btdata->flags); @@ -3021,16 +3015,15 @@ static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb) btdata->qca_dump.ram_dump_size = dump_size; btdata->qca_dump.ram_dump_seqno = 0; - sk_ptr += offsetof(struct qca_dump_hdr, data0); - sk_len -= offsetof(struct qca_dump_hdr, data0); + + skb_pull(skb, offsetof(struct qca_dump_hdr, data0)); usb_disable_autosuspend(udev); bt_dev_info(hdev, "%s memdump size(%u)\n", (pkt_type == HCI_ACLDATA_PKT) ? "ACL" : "event", dump_size); } else { - sk_ptr += offsetof(struct qca_dump_hdr, data); - sk_len -= offsetof(struct qca_dump_hdr, data); + skb_pull(skb, offsetof(struct qca_dump_hdr, data)); } if (!btdata->qca_dump.ram_dump_size) { @@ -3050,7 +3043,6 @@ static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb) return ret; } - skb_pull(skb, skb->len - sk_len); hci_devcd_append(hdev, skb); btdata->qca_dump.ram_dump_seqno++; if (seqno == QCA_LAST_SEQUENCE_NUM) { @@ -3078,68 +3070,58 @@ out: /* Return: true if the ACL packet is a dump packet, false otherwise. */ static bool acl_pkt_is_dump_qca(struct hci_dev *hdev, struct sk_buff *skb) { - u8 *sk_ptr; - unsigned int sk_len; - struct hci_event_hdr *event_hdr; struct hci_acl_hdr *acl_hdr; struct qca_dump_hdr *dump_hdr; + struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC); + bool is_dump = false; - sk_ptr = skb->data; - sk_len = skb->len; - - acl_hdr = hci_acl_hdr(skb); - if (le16_to_cpu(acl_hdr->handle) != QCA_MEMDUMP_ACL_HANDLE) + if (!clone) return false; - sk_ptr += HCI_ACL_HDR_SIZE; - sk_len -= HCI_ACL_HDR_SIZE; - event_hdr = (struct hci_event_hdr *)sk_ptr; - - if ((event_hdr->evt != HCI_VENDOR_PKT) || - (event_hdr->plen != (sk_len - HCI_EVENT_HDR_SIZE))) - return false; + acl_hdr = skb_pull_data(clone, sizeof(*acl_hdr)); + if (!acl_hdr || (le16_to_cpu(acl_hdr->handle) != QCA_MEMDUMP_ACL_HANDLE)) + goto out; - sk_ptr += HCI_EVENT_HDR_SIZE; - sk_len -= HCI_EVENT_HDR_SIZE; + event_hdr = skb_pull_data(clone, sizeof(*event_hdr)); + if (!event_hdr || (event_hdr->evt != HCI_VENDOR_PKT)) + goto out; - dump_hdr = (struct qca_dump_hdr *)sk_ptr; - if ((sk_len < offsetof(struct qca_dump_hdr, data)) || - (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) || - (dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE)) - return false; + dump_hdr = skb_pull_data(clone, sizeof(*dump_hdr)); + if (!dump_hdr || (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) || + (dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE)) + goto out; - return true; + is_dump = true; +out: + consume_skb(clone); + return is_dump; } /* Return: true if the event packet is a dump packet, false otherwise. */ static bool evt_pkt_is_dump_qca(struct hci_dev *hdev, struct sk_buff *skb) { - u8 *sk_ptr; - unsigned int sk_len; - struct hci_event_hdr *event_hdr; struct qca_dump_hdr *dump_hdr; + struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC); + bool is_dump = false; - sk_ptr = skb->data; - sk_len = skb->len; - - event_hdr = hci_event_hdr(skb); - - if ((event_hdr->evt != HCI_VENDOR_PKT) - || (event_hdr->plen != (sk_len - HCI_EVENT_HDR_SIZE))) + if (!clone) return false; - sk_ptr += HCI_EVENT_HDR_SIZE; - sk_len -= HCI_EVENT_HDR_SIZE; + event_hdr = skb_pull_data(clone, sizeof(*event_hdr)); + if (!event_hdr || (event_hdr->evt != HCI_VENDOR_PKT)) + goto out; - dump_hdr = (struct qca_dump_hdr *)sk_ptr; - if ((sk_len < offsetof(struct qca_dump_hdr, data)) || - (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) || - (dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE)) - return false; + dump_hdr = skb_pull_data(clone, sizeof(*dump_hdr)); + if (!dump_hdr || (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) || + (dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE)) + goto out; - return true; + is_dump = true; +out: + consume_skb(clone); + return is_dump; } static int btusb_recv_acl_qca(struct hci_dev *hdev, struct sk_buff *skb) -- GitLab From 0b7d3e782027ac3b6fec56159e8e348042000aef Mon Sep 17 00:00:00 2001 From: Sagi Maimon Date: Wed, 14 May 2025 10:35:41 +0300 Subject: [PATCH 0551/2211] ptp: ocp: Limit signal/freq counts in summary output functions [ Upstream commit c9e455581e2ba87ee38c126e8dc49a424b9df0cf ] The debugfs summary output could access uninitialized elements in the freq_in[] and signal_out[] arrays, causing NULL pointer dereferences and triggering a kernel Oops (page_fault_oops). This patch adds u8 fields (nr_freq_in, nr_signal_out) to track the number of initialized elements, with a maximum of 4 per array. The summary output functions are updated to respect these limits, preventing out-of-bounds access and ensuring safe array handling. Widen the label variables because the change confuses GCC about max length of the strings. Fixes: ef61f5528fca ("ptp: ocp: add Adva timecard support") Signed-off-by: Sagi Maimon Reviewed-by: Simon Horman Reviewed-by: Vadim Fedorenko Link: https://patch.msgid.link/20250514073541.35817-1-maimon.sagi@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/ptp/ptp_ocp.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/ptp/ptp_ocp.c b/drivers/ptp/ptp_ocp.c index 1a936829975e1..efbd80db778d6 100644 --- a/drivers/ptp/ptp_ocp.c +++ b/drivers/ptp/ptp_ocp.c @@ -315,6 +315,8 @@ struct ptp_ocp_serial_port { #define OCP_BOARD_ID_LEN 13 #define OCP_SERIAL_LEN 6 #define OCP_SMA_NUM 4 +#define OCP_SIGNAL_NUM 4 +#define OCP_FREQ_NUM 4 enum { PORT_GNSS, @@ -342,8 +344,8 @@ struct ptp_ocp { struct dcf_master_reg __iomem *dcf_out; struct dcf_slave_reg __iomem *dcf_in; struct tod_reg __iomem *nmea_out; - struct frequency_reg __iomem *freq_in[4]; - struct ptp_ocp_ext_src *signal_out[4]; + struct frequency_reg __iomem *freq_in[OCP_FREQ_NUM]; + struct ptp_ocp_ext_src *signal_out[OCP_SIGNAL_NUM]; struct ptp_ocp_ext_src *pps; struct ptp_ocp_ext_src *ts0; struct ptp_ocp_ext_src *ts1; @@ -378,10 +380,12 @@ struct ptp_ocp { u32 utc_tai_offset; u32 ts_window_adjust; u64 fw_cap; - struct ptp_ocp_signal signal[4]; + struct ptp_ocp_signal signal[OCP_SIGNAL_NUM]; struct ptp_ocp_sma_connector sma[OCP_SMA_NUM]; const struct ocp_sma_op *sma_op; struct dpll_device *dpll; + int signals_nr; + int freq_in_nr; }; #define OCP_REQ_TIMESTAMP BIT(0) @@ -2693,6 +2697,8 @@ ptp_ocp_fb_board_init(struct ptp_ocp *bp, struct ocp_resource *r) bp->eeprom_map = fb_eeprom_map; bp->fw_version = ioread32(&bp->image->version); bp->sma_op = &ocp_fb_sma_op; + bp->signals_nr = 4; + bp->freq_in_nr = 4; ptp_ocp_fb_set_version(bp); @@ -2858,6 +2864,8 @@ ptp_ocp_art_board_init(struct ptp_ocp *bp, struct ocp_resource *r) bp->fw_version = ioread32(&bp->reg->version); bp->fw_tag = 2; bp->sma_op = &ocp_art_sma_op; + bp->signals_nr = 4; + bp->freq_in_nr = 4; /* Enable MAC serial port during initialisation */ iowrite32(1, &bp->board_config->mro50_serial_activate); @@ -2884,6 +2892,8 @@ ptp_ocp_adva_board_init(struct ptp_ocp *bp, struct ocp_resource *r) bp->flash_start = 0xA00000; bp->eeprom_map = fb_eeprom_map; bp->sma_op = &ocp_adva_sma_op; + bp->signals_nr = 2; + bp->freq_in_nr = 2; version = ioread32(&bp->image->version); /* if lower 16 bits are empty, this is the fw loader. */ @@ -4004,7 +4014,7 @@ _signal_summary_show(struct seq_file *s, struct ptp_ocp *bp, int nr) { struct signal_reg __iomem *reg = bp->signal_out[nr]->mem; struct ptp_ocp_signal *signal = &bp->signal[nr]; - char label[8]; + char label[16]; bool on; u32 val; @@ -4030,7 +4040,7 @@ static void _frequency_summary_show(struct seq_file *s, int nr, struct frequency_reg __iomem *reg) { - char label[8]; + char label[16]; bool on; u32 val; @@ -4174,11 +4184,11 @@ ptp_ocp_summary_show(struct seq_file *s, void *data) } if (bp->fw_cap & OCP_CAP_SIGNAL) - for (i = 0; i < 4; i++) + for (i = 0; i < bp->signals_nr; i++) _signal_summary_show(s, bp, i); if (bp->fw_cap & OCP_CAP_FREQ) - for (i = 0; i < 4; i++) + for (i = 0; i < bp->freq_in_nr; i++) _frequency_summary_show(s, i, bp->freq_in[i]); if (bp->irig_out) { -- GitLab From 233a227a317b0bb99cf19aed3e530401774014b2 Mon Sep 17 00:00:00 2001 From: Ido Schimmel Date: Thu, 15 May 2025 11:48:48 +0300 Subject: [PATCH 0552/2211] bridge: netfilter: Fix forwarding of fragmented packets [ Upstream commit 91b6dbced0ef1d680afdd69b14fc83d50ebafaf3 ] When netfilter defrag hooks are loaded (due to the presence of conntrack rules, for example), fragmented packets entering the bridge will be defragged by the bridge's pre-routing hook (br_nf_pre_routing() -> ipv4_conntrack_defrag()). Later on, in the bridge's post-routing hook, the defragged packet will be fragmented again. If the size of the largest fragment is larger than what the kernel has determined as the destination MTU (using ip_skb_dst_mtu()), the defragged packet will be dropped. Before commit ac6627a28dbf ("net: ipv4: Consolidate ipv4_mtu and ip_dst_mtu_maybe_forward"), ip_skb_dst_mtu() would return dst_mtu() as the destination MTU. Assuming the dst entry attached to the packet is the bridge's fake rtable one, this would simply be the bridge's MTU (see fake_mtu()). However, after above mentioned commit, ip_skb_dst_mtu() ends up returning the route's MTU stored in the dst entry's metrics. Ideally, in case the dst entry is the bridge's fake rtable one, this should be the bridge's MTU as the bridge takes care of updating this metric when its MTU changes (see br_change_mtu()). Unfortunately, the last operation is a no-op given the metrics attached to the fake rtable entry are marked as read-only. Therefore, ip_skb_dst_mtu() ends up returning 1500 (the initial MTU value) and defragged packets are dropped during fragmentation when dealing with large fragments and high MTU (e.g., 9k). Fix by moving the fake rtable entry's metrics to be per-bridge (in a similar fashion to the fake rtable entry itself) and marking them as writable, thereby allowing MTU changes to be reflected. Fixes: 62fa8a846d7d ("net: Implement read-only protection and COW'ing of metrics.") Fixes: 33eb9873a283 ("bridge: initialize fake_rtable metrics") Reported-by: Venkat Venkatsubra Closes: https://lore.kernel.org/netdev/PH0PR10MB4504888284FF4CBA648197D0ACB82@PH0PR10MB4504.namprd10.prod.outlook.com/ Tested-by: Venkat Venkatsubra Signed-off-by: Ido Schimmel Acked-by: Nikolay Aleksandrov Link: https://patch.msgid.link/20250515084848.727706-1-idosch@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/bridge/br_nf_core.c | 7 ++----- net/bridge/br_private.h | 1 + 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/net/bridge/br_nf_core.c b/net/bridge/br_nf_core.c index 98aea5485aaef..a8c67035e23c0 100644 --- a/net/bridge/br_nf_core.c +++ b/net/bridge/br_nf_core.c @@ -65,17 +65,14 @@ static struct dst_ops fake_dst_ops = { * ipt_REJECT needs it. Future netfilter modules might * require us to fill additional fields. */ -static const u32 br_dst_default_metrics[RTAX_MAX] = { - [RTAX_MTU - 1] = 1500, -}; - void br_netfilter_rtable_init(struct net_bridge *br) { struct rtable *rt = &br->fake_rtable; rcuref_init(&rt->dst.__rcuref, 1); rt->dst.dev = br->dev; - dst_init_metrics(&rt->dst, br_dst_default_metrics, true); + dst_init_metrics(&rt->dst, br->metrics, false); + dst_metric_set(&rt->dst, RTAX_MTU, br->dev->mtu); rt->dst.flags = DST_NOXFRM | DST_FAKE_RTABLE; rt->dst.ops = &fake_dst_ops; } diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index 041f6e571a209..df502cc1191c3 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -505,6 +505,7 @@ struct net_bridge { struct rtable fake_rtable; struct rt6_info fake_rt6_info; }; + u32 metrics[RTAX_MAX]; #endif u16 group_fwd_mask; u16 group_fwd_mask_required; -- GitLab From 7191b69eae0f5b2b7f3432c86ebc5f7ef1fd5787 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Thu, 10 Apr 2025 11:13:52 -0700 Subject: [PATCH 0553/2211] ice: fix vf->num_mac count with port representors [ Upstream commit bbd95160a03dbfcd01a541f25c27ddb730dfbbd5 ] The ice_vc_repr_add_mac() function indicates that it does not store the MAC address filters in the firmware. However, it still increments vf->num_mac. This is incorrect, as vf->num_mac should represent the number of MAC filters currently programmed to firmware. Indeed, we only perform this increment if the requested filter is a unicast address that doesn't match the existing vf->hw_lan_addr. In addition, ice_vc_repr_del_mac() does not decrement the vf->num_mac counter. This results in the counter becoming out of sync with the actual count. As it turns out, vf->num_mac is currently only used in legacy made without port representors. The single place where the value is checked is for enforcing a filter limit on untrusted VFs. Upcoming patches to support VF Live Migration will use this value when determining the size of the TLV for MAC address filters. Fix the representor mode function to stop incrementing the counter incorrectly. Fixes: ac19e03ef780 ("ice: allow process VF opcodes in different ways") Signed-off-by: Jacob Keller Reviewed-by: Michal Swiatkowski Reviewed-by: Simon Horman Tested-by: Sujai Buvaneswaran Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ice/ice_virtchnl.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl.c b/drivers/net/ethernet/intel/ice/ice_virtchnl.c index c8c1d48ff793d..87ffd25b268a2 100644 --- a/drivers/net/ethernet/intel/ice/ice_virtchnl.c +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl.c @@ -3877,7 +3877,6 @@ static int ice_vc_repr_add_mac(struct ice_vf *vf, u8 *msg) } ice_vfhw_mac_add(vf, &al->list[i]); - vf->num_mac++; break; } -- GitLab From 8c3b8ace9ce4a3d2aef5ca452e34791930184b95 Mon Sep 17 00:00:00 2001 From: Dave Ertman Date: Mon, 28 Apr 2025 15:33:39 -0400 Subject: [PATCH 0554/2211] ice: Fix LACP bonds without SRIOV environment [ Upstream commit 6c778f1b839b63525b30046c9d1899424a62be0a ] If an aggregate has the following conditions: - The SRIOV LAG DDP package has been enabled - The bond is in 802.3ad LACP mode - The bond is disqualified from supporting SRIOV VF LAG - Both interfaces were added simultaneously to the bond (same command) Then there is a chance that the two interfaces will be assigned different LACP Aggregator ID's. This will cause a failure of the LACP control over the bond. To fix this, we can detect if the primary interface for the bond (as defined by the driver) is not in switchdev mode, and exit the setup flow if so. Reproduction steps: %> ip link add bond0 type bond mode 802.3ad miimon 100 %> ip link set bond0 up %> ifenslave bond0 eth0 eth1 %> cat /proc/net/bonding/bond0 | grep Agg Check for Aggregator IDs that differ. Fixes: ec5a6c5f79ed ("ice: process events created by lag netdev event handler") Reviewed-by: Aleksandr Loktionov Signed-off-by: Dave Ertman Tested-by: Sujai Buvaneswaran Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ice/ice_lag.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/net/ethernet/intel/ice/ice_lag.c b/drivers/net/ethernet/intel/ice/ice_lag.c index 22371011c2492..2410aee59fb2d 100644 --- a/drivers/net/ethernet/intel/ice/ice_lag.c +++ b/drivers/net/ethernet/intel/ice/ice_lag.c @@ -1321,12 +1321,18 @@ static void ice_lag_changeupper_event(struct ice_lag *lag, void *ptr) */ if (!primary_lag) { lag->primary = true; + if (!ice_is_switchdev_running(lag->pf)) + return; + /* Configure primary's SWID to be shared */ ice_lag_primary_swid(lag, true); primary_lag = lag; } else { u16 swid; + if (!ice_is_switchdev_running(primary_lag->pf)) + return; + swid = primary_lag->pf->hw.port_info->sw_id; ice_lag_set_swid(swid, lag, true); ice_lag_add_prune_list(primary_lag, lag->pf); -- GitLab From f6f5e9c8cb680c3cb9771fd9fa114319cbc4f514 Mon Sep 17 00:00:00 2001 From: Pavan Kumar Linga Date: Fri, 11 Apr 2025 09:00:35 -0700 Subject: [PATCH 0555/2211] idpf: fix null-ptr-deref in idpf_features_check [ Upstream commit 2dabe349f7882ff1407a784d54d8541909329088 ] idpf_features_check is used to validate the TX packet. skb header length is compared with the hardware supported value received from the device control plane. The value is stored in the adapter structure and to access it, vport pointer is used. During reset all the vports are released and the vport pointer that the netdev private structure points to is NULL. To avoid null-ptr-deref, store the max header length value in netdev private structure. This also helps to cache the value and avoid accessing adapter pointer in hot path. BUG: kernel NULL pointer dereference, address: 0000000000000068 ... RIP: 0010:idpf_features_check+0x6d/0xe0 [idpf] Call Trace: ? __die+0x23/0x70 ? page_fault_oops+0x154/0x520 ? exc_page_fault+0x76/0x190 ? asm_exc_page_fault+0x26/0x30 ? idpf_features_check+0x6d/0xe0 [idpf] netif_skb_features+0x88/0x310 validate_xmit_skb+0x2a/0x2b0 validate_xmit_skb_list+0x4c/0x70 sch_direct_xmit+0x19d/0x3a0 __dev_queue_xmit+0xb74/0xe70 ... Fixes: a251eee62133 ("idpf: add SRIOV support and other ndo_ops") Reviewed-by: Madhu Chititm Signed-off-by: Pavan Kumar Linga Reviewed-by: Simon Horman Tested-by: Samuel Salin Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/idpf/idpf.h | 2 ++ drivers/net/ethernet/intel/idpf/idpf_lib.c | 10 ++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/intel/idpf/idpf.h b/drivers/net/ethernet/intel/idpf/idpf.h index aef0e9775a330..70dbf80f3bb75 100644 --- a/drivers/net/ethernet/intel/idpf/idpf.h +++ b/drivers/net/ethernet/intel/idpf/idpf.h @@ -143,6 +143,7 @@ enum idpf_vport_state { * @vport_id: Vport identifier * @link_speed_mbps: Link speed in mbps * @vport_idx: Relative vport index + * @max_tx_hdr_size: Max header length hardware can support * @state: See enum idpf_vport_state * @netstats: Packet and byte stats * @stats_lock: Lock to protect stats update @@ -153,6 +154,7 @@ struct idpf_netdev_priv { u32 vport_id; u32 link_speed_mbps; u16 vport_idx; + u16 max_tx_hdr_size; enum idpf_vport_state state; struct rtnl_link_stats64 netstats; spinlock_t stats_lock; diff --git a/drivers/net/ethernet/intel/idpf/idpf_lib.c b/drivers/net/ethernet/intel/idpf/idpf_lib.c index 5ce663d04de00..615e74d038457 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_lib.c +++ b/drivers/net/ethernet/intel/idpf/idpf_lib.c @@ -723,6 +723,7 @@ static int idpf_cfg_netdev(struct idpf_vport *vport) np->vport = vport; np->vport_idx = vport->idx; np->vport_id = vport->vport_id; + np->max_tx_hdr_size = idpf_get_max_tx_hdr_size(adapter); vport->netdev = netdev; return idpf_init_mac_addr(vport, netdev); @@ -740,6 +741,7 @@ static int idpf_cfg_netdev(struct idpf_vport *vport) np->adapter = adapter; np->vport_idx = vport->idx; np->vport_id = vport->vport_id; + np->max_tx_hdr_size = idpf_get_max_tx_hdr_size(adapter); spin_lock_init(&np->stats_lock); @@ -2189,8 +2191,8 @@ static netdev_features_t idpf_features_check(struct sk_buff *skb, struct net_device *netdev, netdev_features_t features) { - struct idpf_vport *vport = idpf_netdev_to_vport(netdev); - struct idpf_adapter *adapter = vport->adapter; + struct idpf_netdev_priv *np = netdev_priv(netdev); + u16 max_tx_hdr_size = np->max_tx_hdr_size; size_t len; /* No point in doing any of this if neither checksum nor GSO are @@ -2213,7 +2215,7 @@ static netdev_features_t idpf_features_check(struct sk_buff *skb, goto unsupported; len = skb_network_header_len(skb); - if (unlikely(len > idpf_get_max_tx_hdr_size(adapter))) + if (unlikely(len > max_tx_hdr_size)) goto unsupported; if (!skb->encapsulation) @@ -2226,7 +2228,7 @@ static netdev_features_t idpf_features_check(struct sk_buff *skb, /* IPLEN can support at most 127 dwords */ len = skb_inner_network_header_len(skb); - if (unlikely(len > idpf_get_max_tx_hdr_size(adapter))) + if (unlikely(len > max_tx_hdr_size)) goto unsupported; /* No need to validate L4LEN as TCP is the only protocol with a -- GitLab From cd7f022296972daf35b750c3fa71a6bc9ebc0abf Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Tue, 20 May 2025 15:54:20 +0200 Subject: [PATCH 0556/2211] loop: don't require ->write_iter for writable files in loop_configure [ Upstream commit 355341e4359b2d5edf0ed5e117f7e9e7a0a5dac0 ] Block devices can be opened read-write even if they can't be written to for historic reasons. Remove the check requiring file->f_op->write_iter when the block devices was opened in loop_configure. The call to loop_check_backing_file just below ensures the ->write_iter is present for backing files opened for writing, which is the only check that is actually needed. Fixes: f5c84eff634b ("loop: Add sanity check for read/write_iter") Reported-by: Christian Hesse Signed-off-by: Christoph Hellwig Link: https://lore.kernel.org/r/20250520135420.1177312-1-hch@lst.de Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/block/loop.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index fa9c77b8f4d23..0843d229b0f76 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -969,9 +969,6 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, if (!file) return -EBADF; - if ((mode & BLK_OPEN_WRITE) && !file->f_op->write_iter) - return -EINVAL; - error = loop_check_backing_file(file); if (error) return error; -- GitLab From 3e79182c82a11a2f55b3975c7c64403c4b87212d Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Tue, 13 May 2025 21:38:58 +0300 Subject: [PATCH 0557/2211] pinctrl: qcom: switch to devm_register_sys_off_handler() [ Upstream commit 41e452e6933d14146381ea25cff5e4d1ac2abea1 ] Error-handling paths in msm_pinctrl_probe() don't call a function required to unroll restart handler registration, unregister_restart_handler(). Instead of adding calls to this function, switch the msm pinctrl code into using devm_register_sys_off_handler(). Fixes: cf1fc1876289 ("pinctrl: qcom: use restart_notifier mechanism for ps_hold") Signed-off-by: Dmitry Baryshkov Link: https://lore.kernel.org/20250513-pinctrl-msm-fix-v2-2-249999af0fc1@oss.qualcomm.com Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/qcom/pinctrl-msm.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c index a6bdff7a0bb25..018e96d921c05 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm.c +++ b/drivers/pinctrl/qcom/pinctrl-msm.c @@ -43,7 +43,6 @@ * @pctrl: pinctrl handle. * @chip: gpiochip handle. * @desc: pin controller descriptor - * @restart_nb: restart notifier block. * @irq: parent irq for the TLMM irq_chip. * @intr_target_use_scm: route irq to application cpu using scm calls * @lock: Spinlock to protect register resources as well @@ -63,7 +62,6 @@ struct msm_pinctrl { struct pinctrl_dev *pctrl; struct gpio_chip chip; struct pinctrl_desc desc; - struct notifier_block restart_nb; int irq; @@ -1470,10 +1468,9 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) return 0; } -static int msm_ps_hold_restart(struct notifier_block *nb, unsigned long action, - void *data) +static int msm_ps_hold_restart(struct sys_off_data *data) { - struct msm_pinctrl *pctrl = container_of(nb, struct msm_pinctrl, restart_nb); + struct msm_pinctrl *pctrl = data->cb_data; writel(0, pctrl->regs[0] + PS_HOLD_OFFSET); mdelay(1000); @@ -1484,7 +1481,11 @@ static struct msm_pinctrl *poweroff_pctrl; static void msm_ps_hold_poweroff(void) { - msm_ps_hold_restart(&poweroff_pctrl->restart_nb, 0, NULL); + struct sys_off_data data = { + .cb_data = poweroff_pctrl, + }; + + msm_ps_hold_restart(&data); } static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl) @@ -1494,9 +1495,11 @@ static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl) for (i = 0; i < pctrl->soc->nfunctions; i++) if (!strcmp(func[i].name, "ps_hold")) { - pctrl->restart_nb.notifier_call = msm_ps_hold_restart; - pctrl->restart_nb.priority = 128; - if (register_restart_handler(&pctrl->restart_nb)) + if (devm_register_sys_off_handler(pctrl->dev, + SYS_OFF_MODE_RESTART, + 128, + msm_ps_hold_restart, + pctrl)) dev_err(pctrl->dev, "failed to setup restart handler.\n"); poweroff_pctrl = pctrl; @@ -1598,8 +1601,6 @@ void msm_pinctrl_remove(struct platform_device *pdev) struct msm_pinctrl *pctrl = platform_get_drvdata(pdev); gpiochip_remove(&pctrl->chip); - - unregister_restart_handler(&pctrl->restart_nb); } EXPORT_SYMBOL(msm_pinctrl_remove); -- GitLab From 8e4fd8e76dd7e0f505d12191b166397ab402ee82 Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski Date: Mon, 19 May 2025 18:49:36 +0200 Subject: [PATCH 0558/2211] net: dwmac-sun8i: Use parsed internal PHY address instead of 1 [ Upstream commit 47653e4243f2b0a26372e481ca098936b51ec3a8 ] While the MDIO address of the internal PHY on Allwinner sun8i chips is generally 1, of_mdio_parse_addr is used to cleanly parse the address from the device-tree instead of hardcoding it. A commit reworking the code ditched the parsed value and hardcoded the value 1 instead, which didn't really break anything but is more fragile and not future-proof. Restore the initial behavior using the parsed address returned from the helper. Fixes: 634db83b8265 ("net: stmmac: dwmac-sun8i: Handle integrated/external MDIOs") Signed-off-by: Paul Kocialkowski Reviewed-by: Andrew Lunn Acked-by: Corentin LABBE Tested-by: Corentin LABBE Link: https://patch.msgid.link/20250519164936.4172658-1-paulk@sys-base.io Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c index 4a0ae92b3055c..ce8367b63823a 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c @@ -964,7 +964,7 @@ static int sun8i_dwmac_set_syscon(struct device *dev, /* of_mdio_parse_addr returns a valid (0 ~ 31) PHY * address. No need to mask it again. */ - reg |= 1 << H3_EPHY_ADDR_SHIFT; + reg |= ret << H3_EPHY_ADDR_SHIFT; } else { /* For SoCs without internal PHY the PHY selection bit should be * set to 0 (external PHY). -- GitLab From 845ef0462ac7064f9df5fbe2982a6418bd5644a9 Mon Sep 17 00:00:00 2001 From: Thangaraj Samynathan Date: Fri, 16 May 2025 09:27:19 +0530 Subject: [PATCH 0559/2211] net: lan743x: Restore SGMII CTRL register on resume [ Upstream commit 293e38ff4e4c2ba53f3fd47d8a4a9f0f0414a7a6 ] SGMII_CTRL register, which specifies the active interface, was not properly restored when resuming from suspend. This led to incorrect interface selection after resume particularly in scenarios involving the FPGA. To fix this: - Move the SGMII_CTRL setup out of the probe function. - Initialize the register in the hardware initialization helper function, which is called during both device initialization and resume. This ensures the interface configuration is consistently restored after suspend/resume cycles. Fixes: a46d9d37c4f4f ("net: lan743x: Add support for SGMII interface") Signed-off-by: Thangaraj Samynathan Link: https://patch.msgid.link/20250516035719.117960-1-thangaraj.s@microchip.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/microchip/lan743x_main.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c index 547255ca1c4ef..812ad9d61676a 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -3466,6 +3466,7 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter, struct pci_dev *pdev) { struct lan743x_tx *tx; + u32 sgmii_ctl; int index; int ret; @@ -3478,6 +3479,15 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter, spin_lock_init(&adapter->eth_syslock_spinlock); mutex_init(&adapter->sgmii_rw_lock); pci11x1x_set_rfe_rd_fifo_threshold(adapter); + sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL); + if (adapter->is_sgmii_en) { + sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_; + sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_; + } else { + sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_; + sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_; + } + lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl); } else { adapter->max_tx_channels = LAN743X_MAX_TX_CHANNELS; adapter->used_tx_channels = LAN743X_USED_TX_CHANNELS; @@ -3526,7 +3536,6 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter, static int lan743x_mdiobus_init(struct lan743x_adapter *adapter) { - u32 sgmii_ctl; int ret; adapter->mdiobus = devm_mdiobus_alloc(&adapter->pdev->dev); @@ -3538,10 +3547,6 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter) adapter->mdiobus->priv = (void *)adapter; if (adapter->is_pci11x1x) { if (adapter->is_sgmii_en) { - sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL); - sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_; - sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_; - lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl); netif_dbg(adapter, drv, adapter->netdev, "SGMII operation\n"); adapter->mdiobus->read = lan743x_mdiobus_read_c22; @@ -3552,10 +3557,6 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter) netif_dbg(adapter, drv, adapter->netdev, "lan743x-mdiobus-c45\n"); } else { - sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL); - sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_; - sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_; - lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl); netif_dbg(adapter, drv, adapter->netdev, "RGMII operation\n"); // Only C22 support when RGMII I/F -- GitLab From 873ebaf3c111337277bc69722128492887cc0ba6 Mon Sep 17 00:00:00 2001 From: Pavel Begunkov Date: Sat, 17 May 2025 13:27:37 +0100 Subject: [PATCH 0560/2211] io_uring: fix overflow resched cqe reordering [ Upstream commit a7d755ed9ce9738af3db602eb29d32774a180bc7 ] Leaving the CQ critical section in the middle of a overflow flushing can cause cqe reordering since the cache cq pointers are reset and any new cqe emitters that might get called in between are not going to be forced into io_cqe_cache_refill(). Fixes: eac2ca2d682f9 ("io_uring: check if we need to reschedule during overflow flush") Signed-off-by: Pavel Begunkov Link: https://lore.kernel.org/r/90ba817f1a458f091f355f407de1c911d2b93bbf.1747483784.git.asml.silence@gmail.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- io_uring/io_uring.c | 1 + 1 file changed, 1 insertion(+) diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index 985c87ea09a90..bd3b3f7a6f6ca 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -630,6 +630,7 @@ static void __io_cqring_overflow_flush(struct io_ring_ctx *ctx, bool dying) * to care for a non-real case. */ if (need_resched()) { + ctx->cqe_sentinel = ctx->cqe_cached; io_cq_unlock_post(ctx); mutex_unlock(&ctx->uring_lock); cond_resched(); -- GitLab From 0a2422f97651cb9517fe6f5f1ab62c97db5c12df Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Tue, 20 May 2025 12:40:30 +0000 Subject: [PATCH 0561/2211] idpf: fix idpf_vport_splitq_napi_poll() [ Upstream commit 407e0efdf8baf1672876d5948b75049860a93e59 ] idpf_vport_splitq_napi_poll() can incorrectly return @budget after napi_complete_done() has been called. This violates NAPI rules, because after napi_complete_done(), current thread lost napi ownership. Move the test against POLL_MODE before the napi_complete_done(). Fixes: c2d548cad150 ("idpf: add TX splitq napi poll support") Reported-by: Peter Newman Closes: https://lore.kernel.org/netdev/20250520121908.1805732-1-edumazet@google.com/T/#u Signed-off-by: Eric Dumazet Cc: Joshua Hay Cc: Alan Brady Cc: Madhu Chittim Cc: Phani Burra Cc: Pavan Kumar Linga Link: https://patch.msgid.link/20250520124030.1983936-1-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/idpf/idpf_txrx.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c index afc902ae4763e..623bf17f87f9c 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c +++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c @@ -4022,6 +4022,14 @@ static int idpf_vport_splitq_napi_poll(struct napi_struct *napi, int budget) return budget; } + /* Switch to poll mode in the tear-down path after sending disable + * queues virtchnl message, as the interrupts will be disabled after + * that. + */ + if (unlikely(q_vector->num_txq && idpf_queue_has(POLL_MODE, + q_vector->tx[0]))) + return budget; + work_done = min_t(int, work_done, budget - 1); /* Exit the polling mode, but don't re-enable interrupts if stack might @@ -4032,15 +4040,7 @@ static int idpf_vport_splitq_napi_poll(struct napi_struct *napi, int budget) else idpf_vport_intr_set_wb_on_itr(q_vector); - /* Switch to poll mode in the tear-down path after sending disable - * queues virtchnl message, as the interrupts will be disabled after - * that - */ - if (unlikely(q_vector->num_txq && idpf_queue_has(POLL_MODE, - q_vector->tx[0]))) - return budget; - else - return work_done; + return work_done; } /** -- GitLab From 49b21795b8e5654a7df3d910a12e1060da4c04cf Mon Sep 17 00:00:00 2001 From: Cong Wang Date: Sun, 18 May 2025 15:20:37 -0700 Subject: [PATCH 0562/2211] sch_hfsc: Fix qlen accounting bug when using peek in hfsc_enqueue() [ Upstream commit 3f981138109f63232a5fb7165938d4c945cc1b9d ] When enqueuing the first packet to an HFSC class, hfsc_enqueue() calls the child qdisc's peek() operation before incrementing sch->q.qlen and sch->qstats.backlog. If the child qdisc uses qdisc_peek_dequeued(), this may trigger an immediate dequeue and potential packet drop. In such cases, qdisc_tree_reduce_backlog() is called, but the HFSC qdisc's qlen and backlog have not yet been updated, leading to inconsistent queue accounting. This can leave an empty HFSC class in the active list, causing further consequences like use-after-free. This patch fixes the bug by moving the increment of sch->q.qlen and sch->qstats.backlog before the call to the child qdisc's peek() operation. This ensures that queue length and backlog are always accurate when packet drops or dequeues are triggered during the peek. Fixes: 12d0ad3be9c3 ("net/sched/sch_hfsc.c: handle corner cases where head may change invalidating calculated deadline") Reported-by: Mingi Cho Signed-off-by: Cong Wang Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250518222038.58538-2-xiyou.wangcong@gmail.com Reviewed-by: Jamal Hadi Salim Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/sched/sch_hfsc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index cb8c525ea20ea..7986145a527cb 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c @@ -1569,6 +1569,9 @@ hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free) return err; } + sch->qstats.backlog += len; + sch->q.qlen++; + if (first && !cl->cl_nactive) { if (cl->cl_flags & HFSC_RSC) init_ed(cl, len); @@ -1584,9 +1587,6 @@ hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free) } - sch->qstats.backlog += len; - sch->q.qlen++; - return NET_XMIT_SUCCESS; } -- GitLab From 41678d7222850a053d18f116e11f96b060df69d2 Mon Sep 17 00:00:00 2001 From: Suman Ghosh Date: Thu, 13 Feb 2025 11:01:37 +0530 Subject: [PATCH 0563/2211] octeontx2-pf: Add AF_XDP non-zero copy support [ Upstream commit b4164de5041b51cda3438e75bce668e2556057c3 ] Set xdp rx ring memory type as MEM_TYPE_PAGE_POOL for af-xdp to work. This is needed since xdp_return_frame internally will use page pools. Fixes: 06059a1a9a4a ("octeontx2-pf: Add XDP support to netdev PF") Signed-off-by: Suman Ghosh Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c index 7510a918d942c..f75afcf5f5aef 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c @@ -988,6 +988,7 @@ static int otx2_cq_init(struct otx2_nic *pfvf, u16 qidx) int err, pool_id, non_xdp_queues; struct nix_aq_enq_req *aq; struct otx2_cq_queue *cq; + struct otx2_pool *pool; cq = &qset->cq[qidx]; cq->cq_idx = qidx; @@ -996,8 +997,13 @@ static int otx2_cq_init(struct otx2_nic *pfvf, u16 qidx) cq->cq_type = CQ_RX; cq->cint_idx = qidx; cq->cqe_cnt = qset->rqe_cnt; - if (pfvf->xdp_prog) + if (pfvf->xdp_prog) { + pool = &qset->pool[qidx]; xdp_rxq_info_reg(&cq->xdp_rxq, pfvf->netdev, qidx, 0); + xdp_rxq_info_reg_mem_model(&cq->xdp_rxq, + MEM_TYPE_PAGE_POOL, + pool->page_pool); + } } else if (qidx < non_xdp_queues) { cq->cq_type = CQ_TX; cq->cint_idx = qidx - pfvf->hw.rx_queues; -- GitLab From 689a205cd968a1572ab561b0c4c2d50a10e9d3b0 Mon Sep 17 00:00:00 2001 From: Wang Liang Date: Tue, 20 May 2025 18:14:04 +0800 Subject: [PATCH 0564/2211] net/tipc: fix slab-use-after-free Read in tipc_aead_encrypt_done [ Upstream commit e279024617134c94fd3e37470156534d5f2b3472 ] Syzbot reported a slab-use-after-free with the following call trace: ================================================================== BUG: KASAN: slab-use-after-free in tipc_aead_encrypt_done+0x4bd/0x510 net/tipc/crypto.c:840 Read of size 8 at addr ffff88807a733000 by task kworker/1:0/25 Call Trace: kasan_report+0xd9/0x110 mm/kasan/report.c:601 tipc_aead_encrypt_done+0x4bd/0x510 net/tipc/crypto.c:840 crypto_request_complete include/crypto/algapi.h:266 aead_request_complete include/crypto/internal/aead.h:85 cryptd_aead_crypt+0x3b8/0x750 crypto/cryptd.c:772 crypto_request_complete include/crypto/algapi.h:266 cryptd_queue_worker+0x131/0x200 crypto/cryptd.c:181 process_one_work+0x9fb/0x1b60 kernel/workqueue.c:3231 Allocated by task 8355: kzalloc_noprof include/linux/slab.h:778 tipc_crypto_start+0xcc/0x9e0 net/tipc/crypto.c:1466 tipc_init_net+0x2dd/0x430 net/tipc/core.c:72 ops_init+0xb9/0x650 net/core/net_namespace.c:139 setup_net+0x435/0xb40 net/core/net_namespace.c:343 copy_net_ns+0x2f0/0x670 net/core/net_namespace.c:508 create_new_namespaces+0x3ea/0xb10 kernel/nsproxy.c:110 unshare_nsproxy_namespaces+0xc0/0x1f0 kernel/nsproxy.c:228 ksys_unshare+0x419/0x970 kernel/fork.c:3323 __do_sys_unshare kernel/fork.c:3394 Freed by task 63: kfree+0x12a/0x3b0 mm/slub.c:4557 tipc_crypto_stop+0x23c/0x500 net/tipc/crypto.c:1539 tipc_exit_net+0x8c/0x110 net/tipc/core.c:119 ops_exit_list+0xb0/0x180 net/core/net_namespace.c:173 cleanup_net+0x5b7/0xbf0 net/core/net_namespace.c:640 process_one_work+0x9fb/0x1b60 kernel/workqueue.c:3231 After freed the tipc_crypto tx by delete namespace, tipc_aead_encrypt_done may still visit it in cryptd_queue_worker workqueue. I reproduce this issue by: ip netns add ns1 ip link add veth1 type veth peer name veth2 ip link set veth1 netns ns1 ip netns exec ns1 tipc bearer enable media eth dev veth1 ip netns exec ns1 tipc node set key this_is_a_master_key master ip netns exec ns1 tipc bearer disable media eth dev veth1 ip netns del ns1 The key of reproduction is that, simd_aead_encrypt is interrupted, leading to crypto_simd_usable() return false. Thus, the cryptd_queue_worker is triggered, and the tipc_crypto tx will be visited. tipc_disc_timeout tipc_bearer_xmit_skb tipc_crypto_xmit tipc_aead_encrypt crypto_aead_encrypt // encrypt() simd_aead_encrypt // crypto_simd_usable() is false child = &ctx->cryptd_tfm->base; simd_aead_encrypt crypto_aead_encrypt // encrypt() cryptd_aead_encrypt_enqueue cryptd_aead_enqueue cryptd_enqueue_request // trigger cryptd_queue_worker queue_work_on(smp_processor_id(), cryptd_wq, &cpu_queue->work) Fix this by holding net reference count before encrypt. Reported-by: syzbot+55c12726619ff85ce1f6@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=55c12726619ff85ce1f6 Fixes: fc1b6d6de220 ("tipc: introduce TIPC encryption & authentication") Signed-off-by: Wang Liang Link: https://patch.msgid.link/20250520101404.1341730-1-wangliang74@huawei.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/tipc/crypto.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c index c524421ec6525..8584893b47851 100644 --- a/net/tipc/crypto.c +++ b/net/tipc/crypto.c @@ -817,12 +817,16 @@ static int tipc_aead_encrypt(struct tipc_aead *aead, struct sk_buff *skb, goto exit; } + /* Get net to avoid freed tipc_crypto when delete namespace */ + get_net(aead->crypto->net); + /* Now, do encrypt */ rc = crypto_aead_encrypt(req); if (rc == -EINPROGRESS || rc == -EBUSY) return rc; tipc_bearer_put(b); + put_net(aead->crypto->net); exit: kfree(ctx); @@ -860,6 +864,7 @@ static void tipc_aead_encrypt_done(void *data, int err) kfree(tx_ctx); tipc_bearer_put(b); tipc_aead_put(aead); + put_net(net); } /** -- GitLab From 92b04bac366f06bb3e0b762842aa5ab5a80ac81a Mon Sep 17 00:00:00 2001 From: Subbaraya Sundeep Date: Wed, 21 May 2025 11:38:33 +0530 Subject: [PATCH 0565/2211] octeontx2-af: Set LMT_ENA bit for APR table entries [ Upstream commit 0eefa27b493306928d88af6368193b134c98fd64 ] This patch enables the LMT line for a PF/VF by setting the LMT_ENA bit in the APR_LMT_MAP_ENTRY_S structure. Additionally, it simplifies the logic for calculating the LMTST table index by consistently using the maximum number of hw supported VFs (i.e., 256). Fixes: 873a1e3d207a ("octeontx2-af: cn10k: Setting up lmtst map table"). Signed-off-by: Subbaraya Sundeep Signed-off-by: Geetha sowjanya Reviewed-by: Michal Swiatkowski Link: https://patch.msgid.link/20250521060834.19780-2-gakula@marvell.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- .../net/ethernet/marvell/octeontx2/af/rvu_cn10k.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c index 7fa98aeb3663c..3838c04b78c22 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c @@ -15,13 +15,17 @@ #define LMT_TBL_OP_WRITE 1 #define LMT_MAP_TABLE_SIZE (128 * 1024) #define LMT_MAPTBL_ENTRY_SIZE 16 +#define LMT_MAX_VFS 256 + +#define LMT_MAP_ENTRY_ENA BIT_ULL(20) +#define LMT_MAP_ENTRY_LINES GENMASK_ULL(18, 16) /* Function to perform operations (read/write) on lmtst map table */ static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val, int lmt_tbl_op) { void __iomem *lmt_map_base; - u64 tbl_base; + u64 tbl_base, cfg; tbl_base = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_MAP_BASE); @@ -35,6 +39,13 @@ static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val, *val = readq(lmt_map_base + index); } else { writeq((*val), (lmt_map_base + index)); + + cfg = FIELD_PREP(LMT_MAP_ENTRY_ENA, 0x1); + /* 2048 LMTLINES */ + cfg |= FIELD_PREP(LMT_MAP_ENTRY_LINES, 0x6); + + writeq(cfg, (lmt_map_base + (index + 8))); + /* Flushing the AP interceptor cache to make APR_LMT_MAP_ENTRY_S * changes effective. Write 1 for flush and read is being used as a * barrier and sets up a data dependency. Write to 0 after a write @@ -52,7 +63,7 @@ static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val, #define LMT_MAP_TBL_W1_OFF 8 static u32 rvu_get_lmtst_tbl_index(struct rvu *rvu, u16 pcifunc) { - return ((rvu_get_pf(pcifunc) * rvu->hw->total_vfs) + + return ((rvu_get_pf(pcifunc) * LMT_MAX_VFS) + (pcifunc & RVU_PFVF_FUNC_MASK)) * LMT_MAPTBL_ENTRY_SIZE; } -- GitLab From 4a7261089d1aa4038f21716d2456b2a39354b1f6 Mon Sep 17 00:00:00 2001 From: Geetha sowjanya Date: Wed, 21 May 2025 11:38:34 +0530 Subject: [PATCH 0566/2211] octeontx2-af: Fix APR entry mapping based on APR_LMT_CFG [ Upstream commit a6ae7129819ad20788e610261246e71736543b8b ] The current implementation maps the APR table using a fixed size, which can lead to incorrect mapping when the number of PFs and VFs varies. This patch corrects the mapping by calculating the APR table size dynamically based on the values configured in the APR_LMT_CFG register, ensuring accurate representation of APR entries in debugfs. Fixes: 0daa55d033b0 ("octeontx2-af: cn10k: debugfs for dumping LMTST map table"). Signed-off-by: Geetha sowjanya Link: https://patch.msgid.link/20250521060834.19780-3-gakula@marvell.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c | 9 ++++++--- .../net/ethernet/marvell/octeontx2/af/rvu_debugfs.c | 11 ++++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c index 3838c04b78c22..4a3370a40dd88 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c @@ -13,7 +13,6 @@ /* RVU LMTST */ #define LMT_TBL_OP_READ 0 #define LMT_TBL_OP_WRITE 1 -#define LMT_MAP_TABLE_SIZE (128 * 1024) #define LMT_MAPTBL_ENTRY_SIZE 16 #define LMT_MAX_VFS 256 @@ -26,10 +25,14 @@ static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val, { void __iomem *lmt_map_base; u64 tbl_base, cfg; + int pfs, vfs; tbl_base = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_MAP_BASE); + cfg = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_CFG); + vfs = 1 << (cfg & 0xF); + pfs = 1 << ((cfg >> 4) & 0x7); - lmt_map_base = ioremap_wc(tbl_base, LMT_MAP_TABLE_SIZE); + lmt_map_base = ioremap_wc(tbl_base, pfs * vfs * LMT_MAPTBL_ENTRY_SIZE); if (!lmt_map_base) { dev_err(rvu->dev, "Failed to setup lmt map table mapping!!\n"); return -ENOMEM; @@ -80,7 +83,7 @@ static int rvu_get_lmtaddr(struct rvu *rvu, u16 pcifunc, mutex_lock(&rvu->rsrc_lock); rvu_write64(rvu, BLKADDR_RVUM, RVU_AF_SMMU_ADDR_REQ, iova); - pf = rvu_get_pf(pcifunc) & 0x1F; + pf = rvu_get_pf(pcifunc) & RVU_PFVF_PF_MASK; val = BIT_ULL(63) | BIT_ULL(14) | BIT_ULL(13) | pf << 8 | ((pcifunc & RVU_PFVF_FUNC_MASK) & 0xFF); rvu_write64(rvu, BLKADDR_RVUM, RVU_AF_SMMU_TXN_REQ, val); diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c index 87ba77e5026a0..e24accfecb3fb 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c @@ -580,6 +580,7 @@ static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp, u64 lmt_addr, val, tbl_base; int pf, vf, num_vfs, hw_vfs; void __iomem *lmt_map_base; + int apr_pfs, apr_vfs; int buf_size = 10240; size_t off = 0; int index = 0; @@ -595,8 +596,12 @@ static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp, return -ENOMEM; tbl_base = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_MAP_BASE); + val = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_CFG); + apr_vfs = 1 << (val & 0xF); + apr_pfs = 1 << ((val >> 4) & 0x7); - lmt_map_base = ioremap_wc(tbl_base, 128 * 1024); + lmt_map_base = ioremap_wc(tbl_base, apr_pfs * apr_vfs * + LMT_MAPTBL_ENTRY_SIZE); if (!lmt_map_base) { dev_err(rvu->dev, "Failed to setup lmt map table mapping!!\n"); kfree(buf); @@ -618,7 +623,7 @@ static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp, off += scnprintf(&buf[off], buf_size - 1 - off, "PF%d \t\t\t", pf); - index = pf * rvu->hw->total_vfs * LMT_MAPTBL_ENTRY_SIZE; + index = pf * apr_vfs * LMT_MAPTBL_ENTRY_SIZE; off += scnprintf(&buf[off], buf_size - 1 - off, " 0x%llx\t\t", (tbl_base + index)); lmt_addr = readq(lmt_map_base + index); @@ -631,7 +636,7 @@ static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp, /* Reading num of VFs per PF */ rvu_get_pf_numvfs(rvu, pf, &num_vfs, &hw_vfs); for (vf = 0; vf < num_vfs; vf++) { - index = (pf * rvu->hw->total_vfs * 16) + + index = (pf * apr_vfs * LMT_MAPTBL_ENTRY_SIZE) + ((vf + 1) * LMT_MAPTBL_ENTRY_SIZE); off += scnprintf(&buf[off], buf_size - 1 - off, "PF%d:VF%d \t\t", pf, vf); -- GitLab From bcb1c946c761d9a6f23b56003cfef3c5aef28875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Draszik?= Date: Wed, 26 Mar 2025 12:08:00 +0000 Subject: [PATCH 0567/2211] clk: s2mps11: initialise clk_hw_onecell_data::num before accessing ::hws[] in probe() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 3e14c7207a975eefcda1929b2134a9f4119dde45 upstream. With UBSAN enabled, we're getting the following trace: UBSAN: array-index-out-of-bounds in .../drivers/clk/clk-s2mps11.c:186:3 index 0 is out of range for type 'struct clk_hw *[] __counted_by(num)' (aka 'struct clk_hw *[]') This is because commit f316cdff8d67 ("clk: Annotate struct clk_hw_onecell_data with __counted_by") annotated the hws member of that struct with __counted_by, which informs the bounds sanitizer about the number of elements in hws, so that it can warn when hws is accessed out of bounds. As noted in that change, the __counted_by member must be initialised with the number of elements before the first array access happens, otherwise there will be a warning from each access prior to the initialisation because the number of elements is zero. This occurs in s2mps11_clk_probe() due to ::num being assigned after ::hws access. Move the assignment to satisfy the requirement of assign-before-access. Cc: stable@vger.kernel.org Fixes: f316cdff8d67 ("clk: Annotate struct clk_hw_onecell_data with __counted_by") Signed-off-by: André Draszik Link: https://lore.kernel.org/r/20250326-s2mps11-ubsan-v1-1-fcc6fce5c8a9@linaro.org Reviewed-by: Krzysztof Kozlowski Signed-off-by: Stephen Boyd Signed-off-by: Greg Kroah-Hartman --- drivers/clk/clk-s2mps11.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c index 014db63866240..8ddf3a9a53dfd 100644 --- a/drivers/clk/clk-s2mps11.c +++ b/drivers/clk/clk-s2mps11.c @@ -137,6 +137,8 @@ static int s2mps11_clk_probe(struct platform_device *pdev) if (!clk_data) return -ENOMEM; + clk_data->num = S2MPS11_CLKS_NUM; + switch (hwid) { case S2MPS11X: s2mps11_reg = S2MPS11_REG_RTC_CTRL; @@ -186,7 +188,6 @@ static int s2mps11_clk_probe(struct platform_device *pdev) clk_data->hws[i] = &s2mps11_clks[i].hw; } - clk_data->num = S2MPS11_CLKS_NUM; of_clk_add_hw_provider(s2mps11_clks->clk_np, of_clk_hw_onecell_get, clk_data); -- GitLab From 2f45a8d64fb4ed4830a4b3273834ecd6ca504896 Mon Sep 17 00:00:00 2001 From: Ivan Pravdin Date: Sun, 18 May 2025 18:41:02 -0400 Subject: [PATCH 0568/2211] crypto: algif_hash - fix double free in hash_accept commit b2df03ed4052e97126267e8c13ad4204ea6ba9b6 upstream. If accept(2) is called on socket type algif_hash with MSG_MORE flag set and crypto_ahash_import fails, sk2 is freed. However, it is also freed in af_alg_release, leading to slab-use-after-free error. Fixes: fe869cdb89c9 ("crypto: algif_hash - User-space interface for hash operations") Cc: Signed-off-by: Ivan Pravdin Signed-off-by: Herbert Xu Signed-off-by: Greg Kroah-Hartman --- crypto/algif_hash.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c index 5498a87249d3e..e3f1a4852737b 100644 --- a/crypto/algif_hash.c +++ b/crypto/algif_hash.c @@ -265,10 +265,6 @@ static int hash_accept(struct socket *sock, struct socket *newsock, goto out_free_state; err = crypto_ahash_import(&ctx2->req, state); - if (err) { - sock_orphan(sk2); - sock_put(sk2); - } out_free_state: kfree_sensitive(state); -- GitLab From 5300e487487d7a2e3e1e6e9d8f03ed9452e4019e Mon Sep 17 00:00:00 2001 From: Dominik Grzegorzek Date: Sun, 18 May 2025 19:45:31 +0200 Subject: [PATCH 0569/2211] padata: do not leak refcount in reorder_work commit d6ebcde6d4ecf34f8495fb30516645db3aea8993 upstream. A recent patch that addressed a UAF introduced a reference count leak: the parallel_data refcount is incremented unconditionally, regardless of the return value of queue_work(). If the work item is already queued, the incremented refcount is never decremented. Fix this by checking the return value of queue_work() and decrementing the refcount when necessary. Resolves: Unreferenced object 0xffff9d9f421e3d80 (size 192): comm "cryptomgr_probe", pid 157, jiffies 4294694003 hex dump (first 32 bytes): 80 8b cf 41 9f 9d ff ff b8 97 e0 89 ff ff ff ff ...A............ d0 97 e0 89 ff ff ff ff 19 00 00 00 1f 88 23 00 ..............#. backtrace (crc 838fb36): __kmalloc_cache_noprof+0x284/0x320 padata_alloc_pd+0x20/0x1e0 padata_alloc_shell+0x3b/0xa0 0xffffffffc040a54d cryptomgr_probe+0x43/0xc0 kthread+0xf6/0x1f0 ret_from_fork+0x2f/0x50 ret_from_fork_asm+0x1a/0x30 Fixes: dd7d37ccf6b1 ("padata: avoid UAF for reorder_work") Cc: Signed-off-by: Dominik Grzegorzek Signed-off-by: Herbert Xu Signed-off-by: Greg Kroah-Hartman --- kernel/padata.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/padata.c b/kernel/padata.c index 22770372bdf32..3e0ef0753e73e 100644 --- a/kernel/padata.c +++ b/kernel/padata.c @@ -358,7 +358,8 @@ static void padata_reorder(struct parallel_data *pd) * To avoid UAF issue, add pd ref here, and put pd ref after reorder_work finish. */ padata_get_pd(pd); - queue_work(pinst->serial_wq, &pd->reorder_work); + if (!queue_work(pinst->serial_wq, &pd->reorder_work)) + padata_put_pd(pd); } } -- GitLab From adb05149a90558029b1ecd9ba1cbb46c7635e4be Mon Sep 17 00:00:00 2001 From: Carlos Sanchez Date: Tue, 20 May 2025 12:23:05 +0200 Subject: [PATCH 0570/2211] can: slcan: allow reception of short error messages commit ef0841e4cb08754be6cb42bf97739fce5d086e5f upstream. Allows slcan to receive short messages (typically errors) from the serial interface. When error support was added to slcan protocol in b32ff4668544e1333b694fcc7812b2d7397b4d6a ("can: slcan: extend the protocol with error info") the minimum valid message size changed from 5 (minimum standard can frame tIII0) to 3 ("e1a" is a valid protocol message, it is one of the examples given in the comments for slcan_bump_err() ), but the check for minimum message length prodicating all decoding was not adjusted. This makes short error messages discarded and error frames not being generated. This patch changes the minimum length to the new minimum (3 characters, excluding terminator, is now a valid message). Signed-off-by: Carlos Sanchez Fixes: b32ff4668544 ("can: slcan: extend the protocol with error info") Reviewed-by: Vincent Mailhol Link: https://patch.msgid.link/20250520102305.1097494-1-carlossanchez@geotab.com Cc: stable@vger.kernel.org Signed-off-by: Marc Kleine-Budde Signed-off-by: Greg Kroah-Hartman --- drivers/net/can/slcan/slcan-core.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/drivers/net/can/slcan/slcan-core.c b/drivers/net/can/slcan/slcan-core.c index 24c6622d36bd8..58ff2ec1d9757 100644 --- a/drivers/net/can/slcan/slcan-core.c +++ b/drivers/net/can/slcan/slcan-core.c @@ -71,12 +71,21 @@ MODULE_AUTHOR("Dario Binacchi "); #define SLCAN_CMD_LEN 1 #define SLCAN_SFF_ID_LEN 3 #define SLCAN_EFF_ID_LEN 8 +#define SLCAN_DATA_LENGTH_LEN 1 +#define SLCAN_ERROR_LEN 1 #define SLCAN_STATE_LEN 1 #define SLCAN_STATE_BE_RXCNT_LEN 3 #define SLCAN_STATE_BE_TXCNT_LEN 3 -#define SLCAN_STATE_FRAME_LEN (1 + SLCAN_CMD_LEN + \ - SLCAN_STATE_BE_RXCNT_LEN + \ - SLCAN_STATE_BE_TXCNT_LEN) +#define SLCAN_STATE_MSG_LEN (SLCAN_CMD_LEN + \ + SLCAN_STATE_LEN + \ + SLCAN_STATE_BE_RXCNT_LEN + \ + SLCAN_STATE_BE_TXCNT_LEN) +#define SLCAN_ERROR_MSG_LEN_MIN (SLCAN_CMD_LEN + \ + SLCAN_ERROR_LEN + \ + SLCAN_DATA_LENGTH_LEN) +#define SLCAN_FRAME_MSG_LEN_MIN (SLCAN_CMD_LEN + \ + SLCAN_SFF_ID_LEN + \ + SLCAN_DATA_LENGTH_LEN) struct slcan { struct can_priv can; @@ -176,6 +185,9 @@ static void slcan_bump_frame(struct slcan *sl) u32 tmpid; char *cmd = sl->rbuff; + if (sl->rcount < SLCAN_FRAME_MSG_LEN_MIN) + return; + skb = alloc_can_skb(sl->dev, &cf); if (unlikely(!skb)) { sl->dev->stats.rx_dropped++; @@ -281,7 +293,7 @@ static void slcan_bump_state(struct slcan *sl) return; } - if (state == sl->can.state || sl->rcount < SLCAN_STATE_FRAME_LEN) + if (state == sl->can.state || sl->rcount != SLCAN_STATE_MSG_LEN) return; cmd += SLCAN_STATE_BE_RXCNT_LEN + SLCAN_CMD_LEN + 1; @@ -328,6 +340,9 @@ static void slcan_bump_err(struct slcan *sl) bool rx_errors = false, tx_errors = false, rx_over_errors = false; int i, len; + if (sl->rcount < SLCAN_ERROR_MSG_LEN_MIN) + return; + /* get len from sanitized ASCII value */ len = cmd[1]; if (len >= '0' && len < '9') @@ -456,8 +471,7 @@ static void slcan_bump(struct slcan *sl) static void slcan_unesc(struct slcan *sl, unsigned char s) { if ((s == '\r') || (s == '\a')) { /* CR or BEL ends the pdu */ - if (!test_and_clear_bit(SLF_ERROR, &sl->flags) && - sl->rcount > 4) + if (!test_and_clear_bit(SLF_ERROR, &sl->flags)) slcan_bump(sl); sl->rcount = 0; -- GitLab From cc55dd28c20a6611e30596019b3b2f636819a4c0 Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Mon, 19 May 2025 14:50:26 +0200 Subject: [PATCH 0571/2211] can: bcm: add locking for bcm_op runtime updates commit c2aba69d0c36a496ab4f2e81e9c2b271f2693fd7 upstream. The CAN broadcast manager (CAN BCM) can send a sequence of CAN frames via hrtimer. The content and also the length of the sequence can be changed resp reduced at runtime where the 'currframe' counter is then set to zero. Although this appeared to be a safe operation the updates of 'currframe' can be triggered from user space and hrtimer context in bcm_can_tx(). Anderson Nascimento created a proof of concept that triggered a KASAN slab-out-of-bounds read access which can be prevented with a spin_lock_bh. At the rework of bcm_can_tx() the 'count' variable has been moved into the protected section as this variable can be modified from both contexts too. Fixes: ffd980f976e7 ("[CAN]: Add broadcast manager (bcm) protocol") Reported-by: Anderson Nascimento Tested-by: Anderson Nascimento Reviewed-by: Marc Kleine-Budde Signed-off-by: Oliver Hartkopp Link: https://patch.msgid.link/20250519125027.11900-1-socketcan@hartkopp.net Cc: stable@vger.kernel.org Signed-off-by: Marc Kleine-Budde Signed-off-by: Greg Kroah-Hartman --- net/can/bcm.c | 66 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/net/can/bcm.c b/net/can/bcm.c index 217049fa496e9..d5bbccb0da360 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c @@ -58,6 +58,7 @@ #include #include #include +#include #include #include @@ -122,6 +123,7 @@ struct bcm_op { struct canfd_frame last_sframe; struct sock *sk; struct net_device *rx_reg_dev; + spinlock_t bcm_tx_lock; /* protect currframe/count in runtime updates */ }; struct bcm_sock { @@ -285,13 +287,18 @@ static void bcm_can_tx(struct bcm_op *op) { struct sk_buff *skb; struct net_device *dev; - struct canfd_frame *cf = op->frames + op->cfsiz * op->currframe; + struct canfd_frame *cf; int err; /* no target device? => exit */ if (!op->ifindex) return; + /* read currframe under lock protection */ + spin_lock_bh(&op->bcm_tx_lock); + cf = op->frames + op->cfsiz * op->currframe; + spin_unlock_bh(&op->bcm_tx_lock); + dev = dev_get_by_index(sock_net(op->sk), op->ifindex); if (!dev) { /* RFC: should this bcm_op remove itself here? */ @@ -312,6 +319,10 @@ static void bcm_can_tx(struct bcm_op *op) skb->dev = dev; can_skb_set_owner(skb, op->sk); err = can_send(skb, 1); + + /* update currframe and count under lock protection */ + spin_lock_bh(&op->bcm_tx_lock); + if (!err) op->frames_abs++; @@ -320,6 +331,11 @@ static void bcm_can_tx(struct bcm_op *op) /* reached last frame? */ if (op->currframe >= op->nframes) op->currframe = 0; + + if (op->count > 0) + op->count--; + + spin_unlock_bh(&op->bcm_tx_lock); out: dev_put(dev); } @@ -430,7 +446,7 @@ static enum hrtimer_restart bcm_tx_timeout_handler(struct hrtimer *hrtimer) struct bcm_msg_head msg_head; if (op->kt_ival1 && (op->count > 0)) { - op->count--; + bcm_can_tx(op); if (!op->count && (op->flags & TX_COUNTEVT)) { /* create notification to user */ @@ -445,7 +461,6 @@ static enum hrtimer_restart bcm_tx_timeout_handler(struct hrtimer *hrtimer) bcm_send_to_user(op, &msg_head, NULL, 0); } - bcm_can_tx(op); } else if (op->kt_ival2) { bcm_can_tx(op); @@ -956,6 +971,27 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, } op->flags = msg_head->flags; + /* only lock for unlikely count/nframes/currframe changes */ + if (op->nframes != msg_head->nframes || + op->flags & TX_RESET_MULTI_IDX || + op->flags & SETTIMER) { + + spin_lock_bh(&op->bcm_tx_lock); + + if (op->nframes != msg_head->nframes || + op->flags & TX_RESET_MULTI_IDX) { + /* potentially update changed nframes */ + op->nframes = msg_head->nframes; + /* restart multiple frame transmission */ + op->currframe = 0; + } + + if (op->flags & SETTIMER) + op->count = msg_head->count; + + spin_unlock_bh(&op->bcm_tx_lock); + } + } else { /* insert new BCM operation for the given can_id */ @@ -963,9 +999,14 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, if (!op) return -ENOMEM; + spin_lock_init(&op->bcm_tx_lock); op->can_id = msg_head->can_id; op->cfsiz = CFSIZ(msg_head->flags); op->flags = msg_head->flags; + op->nframes = msg_head->nframes; + + if (op->flags & SETTIMER) + op->count = msg_head->count; /* create array for CAN frames and copy the data */ if (msg_head->nframes > 1) { @@ -1024,22 +1065,8 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, } /* if ((op = bcm_find_op(&bo->tx_ops, msg_head->can_id, ifindex))) */ - if (op->nframes != msg_head->nframes) { - op->nframes = msg_head->nframes; - /* start multiple frame transmission with index 0 */ - op->currframe = 0; - } - - /* check flags */ - - if (op->flags & TX_RESET_MULTI_IDX) { - /* start multiple frame transmission with index 0 */ - op->currframe = 0; - } - if (op->flags & SETTIMER) { /* set timer values */ - op->count = msg_head->count; op->ival1 = msg_head->ival1; op->ival2 = msg_head->ival2; op->kt_ival1 = bcm_timeval_to_ktime(msg_head->ival1); @@ -1056,11 +1083,8 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, op->flags |= TX_ANNOUNCE; } - if (op->flags & TX_ANNOUNCE) { + if (op->flags & TX_ANNOUNCE) bcm_can_tx(op); - if (op->count) - op->count--; - } if (op->flags & STARTTIMER) bcm_tx_start_timer(op); -- GitLab From 63567ecd99a24495208dc860d50fb17440043006 Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Mon, 19 May 2025 14:50:27 +0200 Subject: [PATCH 0572/2211] can: bcm: add missing rcu read protection for procfs content commit dac5e6249159ac255dad9781793dbe5908ac9ddb upstream. When the procfs content is generated for a bcm_op which is in the process to be removed the procfs output might show unreliable data (UAF). As the removal of bcm_op's is already implemented with rcu handling this patch adds the missing rcu_read_lock() and makes sure the list entries are properly removed under rcu protection. Fixes: f1b4e32aca08 ("can: bcm: use call_rcu() instead of costly synchronize_rcu()") Reported-by: Anderson Nascimento Suggested-by: Anderson Nascimento Tested-by: Anderson Nascimento Signed-off-by: Oliver Hartkopp Link: https://patch.msgid.link/20250519125027.11900-2-socketcan@hartkopp.net Cc: stable@vger.kernel.org # >= 5.4 Signed-off-by: Marc Kleine-Budde Signed-off-by: Greg Kroah-Hartman --- net/can/bcm.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/net/can/bcm.c b/net/can/bcm.c index d5bbccb0da360..e33ff2a5b20cc 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c @@ -219,7 +219,9 @@ static int bcm_proc_show(struct seq_file *m, void *v) seq_printf(m, " / bound %s", bcm_proc_getifname(net, ifname, bo->ifindex)); seq_printf(m, " <<<\n"); - list_for_each_entry(op, &bo->rx_ops, list) { + rcu_read_lock(); + + list_for_each_entry_rcu(op, &bo->rx_ops, list) { unsigned long reduction; @@ -275,6 +277,9 @@ static int bcm_proc_show(struct seq_file *m, void *v) seq_printf(m, "# sent %ld\n", op->frames_abs); } seq_putc(m, '\n'); + + rcu_read_unlock(); + return 0; } #endif /* CONFIG_PROC_FS */ @@ -858,7 +863,7 @@ static int bcm_delete_rx_op(struct list_head *ops, struct bcm_msg_head *mh, REGMASK(op->can_id), bcm_rx_handler, op); - list_del(&op->list); + list_del_rcu(&op->list); bcm_remove_op(op); return 1; /* done */ } @@ -878,7 +883,7 @@ static int bcm_delete_tx_op(struct list_head *ops, struct bcm_msg_head *mh, list_for_each_entry_safe(op, n, ops, list) { if ((op->can_id == mh->can_id) && (op->ifindex == ifindex) && (op->flags & CAN_FD_FRAME) == (mh->flags & CAN_FD_FRAME)) { - list_del(&op->list); + list_del_rcu(&op->list); bcm_remove_op(op); return 1; /* done */ } @@ -1300,7 +1305,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, bcm_rx_handler, op, "bcm", sk); if (err) { /* this bcm rx op is broken -> remove it */ - list_del(&op->list); + list_del_rcu(&op->list); bcm_remove_op(op); return err; } -- GitLab From 964d355832700c239f58dedf6a1cdaeffc71f911 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Fri, 9 May 2025 11:56:33 +0300 Subject: [PATCH 0573/2211] ASoC: SOF: ipc4-control: Use SOF_CTRL_CMD_BINARY as numid for bytes_ext commit 4d14b1069e9e672dbe1adab52594076da6f4a62d upstream. The header.numid is set to scontrol->comp_id in bytes_ext_get and it is ignored during bytes_ext_put. The use of comp_id is not quite great as it is kernel internal identification number. Set the header.numid to SOF_CTRL_CMD_BINARY during get and validate the numid during put to provide consistent and compatible identification number as IPC3. For IPC4 existing tooling also ignored the numid but with the use of SOF_CTRL_CMD_BINARY the different handling of the blobs can be dropped, providing better user experience. Reported-by: Seppo Ingalsuo Closes: https://github.com/thesofproject/linux/issues/5282 Fixes: a062c8899fed ("ASoC: SOF: ipc4-control: Add support for bytes control get and put") Cc: stable@vger.kernel.org Signed-off-by: Peter Ujfalusi Reviewed-by: Seppo Ingalsuo Reviewed-by: Ranjani Sridharan Reviewed-by: Liam Girdwood Link: https://patch.msgid.link/20250509085633.14930-1-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- sound/soc/sof/ipc4-control.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sound/soc/sof/ipc4-control.c b/sound/soc/sof/ipc4-control.c index 576f407cd456a..976a4794d6100 100644 --- a/sound/soc/sof/ipc4-control.c +++ b/sound/soc/sof/ipc4-control.c @@ -531,6 +531,14 @@ static int sof_ipc4_bytes_ext_put(struct snd_sof_control *scontrol, return -EINVAL; } + /* Check header id */ + if (header.numid != SOF_CTRL_CMD_BINARY) { + dev_err_ratelimited(scomp->dev, + "Incorrect numid for bytes put %d\n", + header.numid); + return -EINVAL; + } + /* Verify the ABI header first */ if (copy_from_user(&abi_hdr, tlvd->tlv, sizeof(abi_hdr))) return -EFAULT; @@ -613,7 +621,8 @@ static int _sof_ipc4_bytes_ext_get(struct snd_sof_control *scontrol, if (data_size > size) return -ENOSPC; - header.numid = scontrol->comp_id; + /* Set header id and length */ + header.numid = SOF_CTRL_CMD_BINARY; header.length = data_size; if (copy_to_user(tlvd, &header, sizeof(struct snd_ctl_tlv))) -- GitLab From 6a62b917fb55bd7eece93b4e4917e429afb247fa Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Fri, 9 May 2025 11:13:08 +0300 Subject: [PATCH 0574/2211] ASoC: SOF: Intel: hda-bus: Use PIO mode on ACE2+ platforms commit 4e7010826e96702d7fad13dbe85de4e94052f833 upstream. Keep using the PIO mode for commands on ACE2+ platforms, similarly how the legacy stack is configured. Fixes: 05cf17f1bf6d ("ASoC: SOF: Intel: hda-bus: Use PIO mode for Lunar Lake") Signed-off-by: Peter Ujfalusi Reviewed-by: Bard Liao Reviewed-by: Ranjani Sridharan Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20250509081308.13784-1-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- sound/soc/sof/intel/hda-bus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/sof/intel/hda-bus.c b/sound/soc/sof/intel/hda-bus.c index 1989147aa6a46..5fe237688b912 100644 --- a/sound/soc/sof/intel/hda-bus.c +++ b/sound/soc/sof/intel/hda-bus.c @@ -76,7 +76,7 @@ void sof_hda_bus_init(struct snd_sof_dev *sdev, struct device *dev) snd_hdac_ext_bus_init(bus, dev, &bus_core_ops, sof_hda_ext_ops); - if (chip && chip->hw_ip_version == SOF_INTEL_ACE_2_0) + if (chip && chip->hw_ip_version >= SOF_INTEL_ACE_2_0) bus->use_pio_for_commands = true; #else snd_hdac_ext_bus_init(bus, dev, NULL, NULL); -- GitLab From 20e3fa3b7df9d9d58ca1be8b01da989e952437ac Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Fri, 9 May 2025 11:53:18 +0300 Subject: [PATCH 0575/2211] ASoc: SOF: topology: connect DAI to a single DAI link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 6052f05254b4fe7b16bbd8224779af52fba98b71 upstream. The partial matching of DAI widget to link names, can cause problems if one of the widget names is a substring of another. E.g. with names "Foo1" and Foo10", it's not possible to correctly link up "Foo1". Modify the logic so that if multiple DAI links match the widget stream name, prioritize a full match if one is found. Fixes: fe88788779fc ("ASoC: SOF: topology: Use partial match for connecting DAI link and DAI widget") Link: https://github.com/thesofproject/linux/issues/5308 Signed-off-by: Kai Vehmanen Reviewed-by: Péter Ujfalusi Reviewed-by: Ranjani Sridharan Cc: stable@vger.kernel.org Signed-off-by: Peter Ujfalusi Link: https://patch.msgid.link/20250509085318.13936-1-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- sound/soc/sof/topology.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c index 37ca15cc5728c..f9708b8fd73b6 100644 --- a/sound/soc/sof/topology.c +++ b/sound/soc/sof/topology.c @@ -1059,7 +1059,7 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp, struct snd_sof_dai *dai) { struct snd_soc_card *card = scomp->card; - struct snd_soc_pcm_runtime *rtd; + struct snd_soc_pcm_runtime *rtd, *full, *partial; struct snd_soc_dai *cpu_dai; int stream; int i; @@ -1076,12 +1076,22 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp, else goto end; + full = NULL; + partial = NULL; list_for_each_entry(rtd, &card->rtd_list, list) { /* does stream match DAI link ? */ - if (!rtd->dai_link->stream_name || - !strstr(rtd->dai_link->stream_name, w->sname)) - continue; + if (rtd->dai_link->stream_name) { + if (!strcmp(rtd->dai_link->stream_name, w->sname)) { + full = rtd; + break; + } else if (strstr(rtd->dai_link->stream_name, w->sname)) { + partial = rtd; + } + } + } + rtd = full ? full : partial; + if (rtd) { for_each_rtd_cpu_dais(rtd, i, cpu_dai) { /* * Please create DAI widget in the right order -- GitLab From 799d48c95f9b6ea0b2542616c125347903c33801 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Fri, 9 May 2025 11:59:51 +0300 Subject: [PATCH 0576/2211] ASoC: SOF: ipc4-pcm: Delay reporting is only supported for playback direction commit 98db16f314b3a0d6e5acd94708ea69751436467f upstream. The firmware does not provide any information for capture streams via the shared pipeline registers. To avoid reporting invalid delay value for capture streams to user space we need to disable it. Fixes: af74dbd0dbcf ("ASoC: SOF: ipc4-pcm: allocate time info for pcm delay feature") Cc: stable@vger.kernel.org Signed-off-by: Peter Ujfalusi Reviewed-by: Bard Liao Reviewed-by: Liam Girdwood Link: https://patch.msgid.link/20250509085951.15696-1-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- sound/soc/sof/ipc4-pcm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sound/soc/sof/ipc4-pcm.c b/sound/soc/sof/ipc4-pcm.c index 4df2be3d39eba..2fe4969cdc3b4 100644 --- a/sound/soc/sof/ipc4-pcm.c +++ b/sound/soc/sof/ipc4-pcm.c @@ -794,7 +794,8 @@ static int sof_ipc4_pcm_setup(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm spcm->stream[stream].private = stream_priv; - if (!support_info) + /* Delay reporting is only supported on playback */ + if (!support_info || stream == SNDRV_PCM_STREAM_CAPTURE) continue; time_info = kzalloc(sizeof(*time_info), GFP_KERNEL); -- GitLab From bf85e49aaf3a3c5775ea87369ea5f159c2148db4 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 16 May 2025 10:08:16 +0200 Subject: [PATCH 0577/2211] ALSA: pcm: Fix race of buffer access at PCM OSS layer commit 93a81ca0657758b607c3f4ba889ae806be9beb73 upstream. The PCM OSS layer tries to clear the buffer with the silence data at initialization (or reconfiguration) of a stream with the explicit call of snd_pcm_format_set_silence() with runtime->dma_area. But this may lead to a UAF because the accessed runtime->dma_area might be freed concurrently, as it's performed outside the PCM ops. For avoiding it, move the code into the PCM core and perform it inside the buffer access lock, so that it won't be changed during the operation. Reported-by: syzbot+32d4647f551007595173@syzkaller.appspotmail.com Closes: https://lore.kernel.org/68164d8e.050a0220.11da1b.0019.GAE@google.com Cc: Link: https://patch.msgid.link/20250516080817.20068-1-tiwai@suse.de Signed-off-by: Takashi Iwai Signed-off-by: Greg Kroah-Hartman --- include/sound/pcm.h | 2 ++ sound/core/oss/pcm_oss.c | 3 +-- sound/core/pcm_native.c | 11 +++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/sound/pcm.h b/include/sound/pcm.h index 0bf7d25434d7f..d9baf24b8cebf 100644 --- a/include/sound/pcm.h +++ b/include/sound/pcm.h @@ -1428,6 +1428,8 @@ int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, struct vm_area_s #define snd_pcm_lib_mmap_iomem NULL #endif +void snd_pcm_runtime_buffer_set_silence(struct snd_pcm_runtime *runtime); + /** * snd_pcm_limit_isa_dma_size - Get the max size fitting with ISA DMA transfer * @dma: DMA number diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index 4683b9139c566..4ecb17bd5436e 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c @@ -1074,8 +1074,7 @@ static int snd_pcm_oss_change_params_locked(struct snd_pcm_substream *substream) runtime->oss.params = 0; runtime->oss.prepare = 1; runtime->oss.buffer_used = 0; - if (runtime->dma_area) - snd_pcm_format_set_silence(runtime->format, runtime->dma_area, bytes_to_samples(runtime, runtime->dma_bytes)); + snd_pcm_runtime_buffer_set_silence(runtime); runtime->oss.period_frames = snd_pcm_alsa_frames(substream, oss_period_size); diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 0790b5fd917e1..0a1ba26872f84 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -723,6 +723,17 @@ static void snd_pcm_buffer_access_unlock(struct snd_pcm_runtime *runtime) atomic_inc(&runtime->buffer_accessing); } +/* fill the PCM buffer with the current silence format; called from pcm_oss.c */ +void snd_pcm_runtime_buffer_set_silence(struct snd_pcm_runtime *runtime) +{ + snd_pcm_buffer_access_lock(runtime); + if (runtime->dma_area) + snd_pcm_format_set_silence(runtime->format, runtime->dma_area, + bytes_to_samples(runtime, runtime->dma_bytes)); + snd_pcm_buffer_access_unlock(runtime); +} +EXPORT_SYMBOL_GPL(snd_pcm_runtime_buffer_set_silence); + #if IS_ENABLED(CONFIG_SND_PCM_OSS) #define is_oss_stream(substream) ((substream)->oss.oss) #else -- GitLab From 4e22325b98245836aeea3b66c659273dff983ec1 Mon Sep 17 00:00:00 2001 From: Ed Burcher Date: Mon, 19 May 2025 23:49:07 +0100 Subject: [PATCH 0578/2211] ALSA: hda/realtek: Add quirk for Lenovo Yoga Pro 7 14ASP10 commit 8d70503068510e6080c2c649cccb154f16de26c9 upstream. Lenovo Yoga Pro 7 (gen 10) with Realtek ALC3306 and combined CS35L56 amplifiers need quirk ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN to enable bass Signed-off-by: Ed Burcher Cc: Link: https://patch.msgid.link/20250519224907.31265-2-git@edburcher.com Signed-off-by: Takashi Iwai Signed-off-by: Greg Kroah-Hartman --- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 015c66b9003a4..13ffc9a6555f6 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -11182,6 +11182,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x38fa, "Thinkbook 16P Gen5", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), SND_PCI_QUIRK(0x17aa, 0x38fd, "ThinkBook plus Gen5 Hybrid", ALC287_FIXUP_TAS2781_I2C), SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), + SND_PCI_QUIRK(0x17aa, 0x390d, "Lenovo Yoga Pro 7 14ASP10", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), SND_PCI_QUIRK(0x17aa, 0x3913, "Lenovo 145", ALC236_FIXUP_LENOVO_INV_DMIC), SND_PCI_QUIRK(0x17aa, 0x391f, "Yoga S990-16 pro Quad YC Quad", ALC287_FIXUP_TAS2781_I2C), SND_PCI_QUIRK(0x17aa, 0x3920, "Yoga S990-16 pro Quad VECO Quad", ALC287_FIXUP_TAS2781_I2C), -- GitLab From 80702f002b136396fcd7957ec635afb010435687 Mon Sep 17 00:00:00 2001 From: Ilia Gavrilov Date: Thu, 15 May 2025 12:20:15 +0000 Subject: [PATCH 0579/2211] llc: fix data loss when reading from a socket in llc_ui_recvmsg() commit 239af1970bcb039a1551d2c438d113df0010c149 upstream. For SOCK_STREAM sockets, if user buffer size (len) is less than skb size (skb->len), the remaining data from skb will be lost after calling kfree_skb(). To fix this, move the statement for partial reading above skb deletion. Found by InfoTeCS on behalf of Linux Verification Center (linuxtesting.org) Fixes: 30a584d944fb ("[LLX]: SOCK_DGRAM interface fixes") Cc: stable@vger.kernel.org Signed-off-by: Ilia Gavrilov Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/llc/af_llc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 0259cde394ba0..cc77ec5769d82 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c @@ -887,15 +887,15 @@ static int llc_ui_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, if (sk->sk_type != SOCK_STREAM) goto copy_uaddr; + /* Partial read */ + if (used + offset < skb_len) + continue; + if (!(flags & MSG_PEEK)) { skb_unlink(skb, &sk->sk_receive_queue); kfree_skb(skb); *seq = 0; } - - /* Partial read */ - if (used + offset < skb_len) - continue; } while (len > 0); out: -- GitLab From 8654c8a0528d0497861bbb0e6b0ad39e315ddfa1 Mon Sep 17 00:00:00 2001 From: Axel Forsman Date: Tue, 20 May 2025 13:43:32 +0200 Subject: [PATCH 0580/2211] can: kvaser_pciefd: Continue parsing DMA buf after dropped RX commit 6d820b81c4dc4a4023e45c3cd6707a07dd838649 upstream. Going bus-off on a channel doing RX could result in dropped packets. As netif_running() gets cleared before the channel abort procedure, the handling of any last RDATA packets would see netif_rx() return non-zero to signal a dropped packet. kvaser_pciefd_read_buffer() dealt with this "error" by breaking out of processing the remaining DMA RX buffer. Only return an error from kvaser_pciefd_read_buffer() due to packet corruption, otherwise handle it internally. Cc: stable@vger.kernel.org Signed-off-by: Axel Forsman Tested-by: Jimmy Assarsson Reviewed-by: Jimmy Assarsson Link: https://patch.msgid.link/20250520114332.8961-4-axfo@kvaser.com Signed-off-by: Marc Kleine-Budde Signed-off-by: Greg Kroah-Hartman --- drivers/net/can/kvaser_pciefd.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c index fee012b57f337..caa5124447fb5 100644 --- a/drivers/net/can/kvaser_pciefd.c +++ b/drivers/net/can/kvaser_pciefd.c @@ -1200,7 +1200,7 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie, skb = alloc_canfd_skb(priv->dev, &cf); if (!skb) { priv->dev->stats.rx_dropped++; - return -ENOMEM; + return 0; } cf->len = can_fd_dlc2len(dlc); @@ -1212,7 +1212,7 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie, skb = alloc_can_skb(priv->dev, (struct can_frame **)&cf); if (!skb) { priv->dev->stats.rx_dropped++; - return -ENOMEM; + return 0; } can_frame_set_cc_len((struct can_frame *)cf, dlc, priv->ctrlmode); } @@ -1230,7 +1230,9 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie, priv->dev->stats.rx_packets++; kvaser_pciefd_set_skb_timestamp(pcie, skb, p->timestamp); - return netif_rx(skb); + netif_rx(skb); + + return 0; } static void kvaser_pciefd_change_state(struct kvaser_pciefd_can *can, -- GitLab From 352fbde14177d608a54120b6ff559ce5b3cf6238 Mon Sep 17 00:00:00 2001 From: Axel Forsman Date: Tue, 20 May 2025 13:43:31 +0200 Subject: [PATCH 0581/2211] can: kvaser_pciefd: Fix echo_skb race commit 8256e0ca601051933e9395746817f3801fa9a6bf upstream. The functions kvaser_pciefd_start_xmit() and kvaser_pciefd_handle_ack_packet() raced to stop/wake TX queues and get/put echo skbs, as kvaser_pciefd_can->echo_lock was only ever taken when transmitting and KCAN_TX_NR_PACKETS_CURRENT gets decremented prior to handling of ACKs. E.g., this caused the following error: can_put_echo_skb: BUG! echo_skb 5 is occupied! Instead, use the synchronization helpers in netdev_queues.h. As those piggyback on BQL barriers, start updating in-flight packets and bytes counts as well. Cc: stable@vger.kernel.org Signed-off-by: Axel Forsman Tested-by: Jimmy Assarsson Reviewed-by: Jimmy Assarsson Link: https://patch.msgid.link/20250520114332.8961-3-axfo@kvaser.com Signed-off-by: Marc Kleine-Budde Signed-off-by: Greg Kroah-Hartman --- drivers/net/can/kvaser_pciefd.c | 93 +++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 34 deletions(-) diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c index caa5124447fb5..020e5897812fe 100644 --- a/drivers/net/can/kvaser_pciefd.c +++ b/drivers/net/can/kvaser_pciefd.c @@ -16,6 +16,7 @@ #include #include #include +#include MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Kvaser AB "); @@ -410,10 +411,13 @@ struct kvaser_pciefd_can { void __iomem *reg_base; struct can_berr_counter bec; u8 cmd_seq; + u8 tx_max_count; + u8 tx_idx; + u8 ack_idx; int err_rep_cnt; - int echo_idx; + unsigned int completed_tx_pkts; + unsigned int completed_tx_bytes; spinlock_t lock; /* Locks sensitive registers (e.g. MODE) */ - spinlock_t echo_lock; /* Locks the message echo buffer */ struct timer_list bec_poll_timer; struct completion start_comp, flush_comp; }; @@ -714,6 +718,9 @@ static int kvaser_pciefd_open(struct net_device *netdev) int ret; struct kvaser_pciefd_can *can = netdev_priv(netdev); + can->tx_idx = 0; + can->ack_idx = 0; + ret = open_candev(netdev); if (ret) return ret; @@ -745,21 +752,26 @@ static int kvaser_pciefd_stop(struct net_device *netdev) del_timer(&can->bec_poll_timer); } can->can.state = CAN_STATE_STOPPED; + netdev_reset_queue(netdev); close_candev(netdev); return ret; } +static unsigned int kvaser_pciefd_tx_avail(const struct kvaser_pciefd_can *can) +{ + return can->tx_max_count - (READ_ONCE(can->tx_idx) - READ_ONCE(can->ack_idx)); +} + static int kvaser_pciefd_prepare_tx_packet(struct kvaser_pciefd_tx_packet *p, - struct kvaser_pciefd_can *can, + struct can_priv *can, u8 seq, struct sk_buff *skb) { struct canfd_frame *cf = (struct canfd_frame *)skb->data; int packet_size; - int seq = can->echo_idx; memset(p, 0, sizeof(*p)); - if (can->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT) + if (can->ctrlmode & CAN_CTRLMODE_ONE_SHOT) p->header[1] |= KVASER_PCIEFD_TPACKET_SMS; if (cf->can_id & CAN_RTR_FLAG) @@ -782,7 +794,7 @@ static int kvaser_pciefd_prepare_tx_packet(struct kvaser_pciefd_tx_packet *p, } else { p->header[1] |= FIELD_PREP(KVASER_PCIEFD_RPACKET_DLC_MASK, - can_get_cc_dlc((struct can_frame *)cf, can->can.ctrlmode)); + can_get_cc_dlc((struct can_frame *)cf, can->ctrlmode)); } p->header[1] |= FIELD_PREP(KVASER_PCIEFD_PACKET_SEQ_MASK, seq); @@ -797,22 +809,24 @@ static netdev_tx_t kvaser_pciefd_start_xmit(struct sk_buff *skb, struct net_device *netdev) { struct kvaser_pciefd_can *can = netdev_priv(netdev); - unsigned long irq_flags; struct kvaser_pciefd_tx_packet packet; + unsigned int seq = can->tx_idx & (can->can.echo_skb_max - 1); + unsigned int frame_len; int nr_words; - u8 count; if (can_dev_dropped_skb(netdev, skb)) return NETDEV_TX_OK; + if (!netif_subqueue_maybe_stop(netdev, 0, kvaser_pciefd_tx_avail(can), 1, 1)) + return NETDEV_TX_BUSY; - nr_words = kvaser_pciefd_prepare_tx_packet(&packet, can, skb); + nr_words = kvaser_pciefd_prepare_tx_packet(&packet, &can->can, seq, skb); - spin_lock_irqsave(&can->echo_lock, irq_flags); /* Prepare and save echo skb in internal slot */ - can_put_echo_skb(skb, netdev, can->echo_idx, 0); - - /* Move echo index to the next slot */ - can->echo_idx = (can->echo_idx + 1) % can->can.echo_skb_max; + WRITE_ONCE(can->can.echo_skb[seq], NULL); + frame_len = can_skb_get_frame_len(skb); + can_put_echo_skb(skb, netdev, seq, frame_len); + netdev_sent_queue(netdev, frame_len); + WRITE_ONCE(can->tx_idx, can->tx_idx + 1); /* Write header to fifo */ iowrite32(packet.header[0], @@ -836,14 +850,7 @@ static netdev_tx_t kvaser_pciefd_start_xmit(struct sk_buff *skb, KVASER_PCIEFD_KCAN_FIFO_LAST_REG); } - count = FIELD_GET(KVASER_PCIEFD_KCAN_TX_NR_PACKETS_CURRENT_MASK, - ioread32(can->reg_base + KVASER_PCIEFD_KCAN_TX_NR_PACKETS_REG)); - /* No room for a new message, stop the queue until at least one - * successful transmit - */ - if (count >= can->can.echo_skb_max || can->can.echo_skb[can->echo_idx]) - netif_stop_queue(netdev); - spin_unlock_irqrestore(&can->echo_lock, irq_flags); + netif_subqueue_maybe_stop(netdev, 0, kvaser_pciefd_tx_avail(can), 1, 1); return NETDEV_TX_OK; } @@ -970,6 +977,8 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie) can->kv_pcie = pcie; can->cmd_seq = 0; can->err_rep_cnt = 0; + can->completed_tx_pkts = 0; + can->completed_tx_bytes = 0; can->bec.txerr = 0; can->bec.rxerr = 0; @@ -983,11 +992,10 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie) tx_nr_packets_max = FIELD_GET(KVASER_PCIEFD_KCAN_TX_NR_PACKETS_MAX_MASK, ioread32(can->reg_base + KVASER_PCIEFD_KCAN_TX_NR_PACKETS_REG)); + can->tx_max_count = min(KVASER_PCIEFD_CAN_TX_MAX_COUNT, tx_nr_packets_max - 1); can->can.clock.freq = pcie->freq; - can->can.echo_skb_max = min(KVASER_PCIEFD_CAN_TX_MAX_COUNT, tx_nr_packets_max - 1); - can->echo_idx = 0; - spin_lock_init(&can->echo_lock); + can->can.echo_skb_max = roundup_pow_of_two(can->tx_max_count); spin_lock_init(&can->lock); can->can.bittiming_const = &kvaser_pciefd_bittiming_const; @@ -1509,19 +1517,21 @@ static int kvaser_pciefd_handle_ack_packet(struct kvaser_pciefd *pcie, netdev_dbg(can->can.dev, "Packet was flushed\n"); } else { int echo_idx = FIELD_GET(KVASER_PCIEFD_PACKET_SEQ_MASK, p->header[0]); - int len; - u8 count; + unsigned int len, frame_len = 0; struct sk_buff *skb; + if (echo_idx != (can->ack_idx & (can->can.echo_skb_max - 1))) + return 0; skb = can->can.echo_skb[echo_idx]; - if (skb) - kvaser_pciefd_set_skb_timestamp(pcie, skb, p->timestamp); - len = can_get_echo_skb(can->can.dev, echo_idx, NULL); - count = FIELD_GET(KVASER_PCIEFD_KCAN_TX_NR_PACKETS_CURRENT_MASK, - ioread32(can->reg_base + KVASER_PCIEFD_KCAN_TX_NR_PACKETS_REG)); + if (!skb) + return 0; + kvaser_pciefd_set_skb_timestamp(pcie, skb, p->timestamp); + len = can_get_echo_skb(can->can.dev, echo_idx, &frame_len); - if (count < can->can.echo_skb_max && netif_queue_stopped(can->can.dev)) - netif_wake_queue(can->can.dev); + /* Pairs with barrier in kvaser_pciefd_start_xmit() */ + smp_store_release(&can->ack_idx, can->ack_idx + 1); + can->completed_tx_pkts++; + can->completed_tx_bytes += frame_len; if (!one_shot_fail) { can->can.dev->stats.tx_bytes += len; @@ -1637,11 +1647,26 @@ static int kvaser_pciefd_read_buffer(struct kvaser_pciefd *pcie, int dma_buf) { int pos = 0; int res = 0; + unsigned int i; do { res = kvaser_pciefd_read_packet(pcie, &pos, dma_buf); } while (!res && pos > 0 && pos < KVASER_PCIEFD_DMA_SIZE); + /* Report ACKs in this buffer to BQL en masse for correct periods */ + for (i = 0; i < pcie->nr_channels; ++i) { + struct kvaser_pciefd_can *can = pcie->can[i]; + + if (!can->completed_tx_pkts) + continue; + netif_subqueue_completed_wake(can->can.dev, 0, + can->completed_tx_pkts, + can->completed_tx_bytes, + kvaser_pciefd_tx_avail(can), 1); + can->completed_tx_pkts = 0; + can->completed_tx_bytes = 0; + } + return res; } -- GitLab From ba689e089369d6821e776b1bc4d25e39450ad506 Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Thu, 15 May 2025 09:29:19 +0200 Subject: [PATCH 0582/2211] net: dsa: microchip: linearize skb for tail-tagging switches commit ba54bce747fa9e07896c1abd9b48545f7b4b31d2 upstream. The pointer arithmentic for accessing the tail tag only works for linear skbs. For nonlinear skbs, it reads uninitialized memory inside the skb headroom, essentially randomizing the tag. I have observed it gets set to 6 most of the time. Example where ksz9477_rcv thinks that the packet from port 1 comes from port 6 (which does not exist for the ksz9896 that's in use), dropping the packet. Debug prints added by me (not included in this patch): [ 256.645337] ksz9477_rcv:323 tag0=6 [ 256.645349] skb len=47 headroom=78 headlen=0 tailroom=0 mac=(64,14) mac_len=14 net=(78,0) trans=78 shinfo(txflags=0 nr_frags=1 gso(size=0 type=0 segs=0)) csum(0x0 start=0 offset=0 ip_summed=0 complete_sw=0 valid=0 level=0) hash(0x0 sw=0 l4=0) proto=0x00f8 pkttype=1 iif=3 priority=0x0 mark=0x0 alloc_cpu=0 vlan_all=0x0 encapsulation=0 inner(proto=0x0000, mac=0, net=0, trans=0) [ 256.645377] dev name=end1 feat=0x0002e10200114bb3 [ 256.645386] skb headroom: 00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 256.645395] skb headroom: 00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 256.645403] skb headroom: 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 256.645411] skb headroom: 00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 256.645420] skb headroom: 00000040: ff ff ff ff ff ff 00 1c 19 f2 e2 db 08 06 [ 256.645428] skb frag: 00000000: 00 01 08 00 06 04 00 01 00 1c 19 f2 e2 db 0a 02 [ 256.645436] skb frag: 00000010: 00 83 00 00 00 00 00 00 0a 02 a0 2f 00 00 00 00 [ 256.645444] skb frag: 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 [ 256.645452] ksz_common_rcv:92 dsa_conduit_find_user returned NULL Call skb_linearize before trying to access the tag. This patch fixes ksz9477_rcv which is used by the ksz9896 I have at hand, and also applies the same fix to ksz8795_rcv which seems to have the same problem. Signed-off-by: Jakob Unterwurzacher CC: stable@vger.kernel.org Fixes: 016e43a26bab ("net: dsa: ksz: Add KSZ8795 tag code") Fixes: 8b8010fb7876 ("dsa: add support for Microchip KSZ tail tagging") Reviewed-by: Vladimir Oltean Link: https://patch.msgid.link/20250515072920.2313014-1-jakob.unterwurzacher@cherry.de Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- net/dsa/tag_ksz.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c index 281bbac5539d1..75197861bc91f 100644 --- a/net/dsa/tag_ksz.c +++ b/net/dsa/tag_ksz.c @@ -140,7 +140,12 @@ static struct sk_buff *ksz8795_xmit(struct sk_buff *skb, struct net_device *dev) static struct sk_buff *ksz8795_rcv(struct sk_buff *skb, struct net_device *dev) { - u8 *tag = skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN; + u8 *tag; + + if (skb_linearize(skb)) + return NULL; + + tag = skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN; return ksz_common_rcv(skb, dev, tag[0] & KSZ8795_TAIL_TAG_EG_PORT_M, KSZ_EGRESS_TAG_LEN); @@ -311,10 +316,16 @@ static struct sk_buff *ksz9477_xmit(struct sk_buff *skb, static struct sk_buff *ksz9477_rcv(struct sk_buff *skb, struct net_device *dev) { - /* Tag decoding */ - u8 *tag = skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN; - unsigned int port = tag[0] & KSZ9477_TAIL_TAG_EG_PORT_M; unsigned int len = KSZ_EGRESS_TAG_LEN; + unsigned int port; + u8 *tag; + + if (skb_linearize(skb)) + return NULL; + + /* Tag decoding */ + tag = skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN; + port = tag[0] & KSZ9477_TAIL_TAG_EG_PORT_M; /* Extra 4-bytes PTP timestamp */ if (tag[0] & KSZ9477_PTP_TAG_INDICATION) { -- GitLab From a6ddbf9ae7884bf484abefb95d01fcb470baf2a0 Mon Sep 17 00:00:00 2001 From: Ronak Doshi Date: Thu, 15 May 2025 19:04:56 +0000 Subject: [PATCH 0583/2211] vmxnet3: update MTU after device quiesce commit 43f0999af011fba646e015f0bb08b6c3002a0170 upstream. Currently, when device mtu is updated, vmxnet3 updates netdev mtu, quiesces the device and then reactivates it for the ESXi to know about the new mtu. So, technically the OS stack can start using the new mtu before ESXi knows about the new mtu. This can lead to issues for TSO packets which use mss as per the new mtu configured. This patch fixes this issue by moving the mtu write after device quiesce. Cc: stable@vger.kernel.org Fixes: d1a890fa37f2 ("net: VMware virtual Ethernet NIC driver: vmxnet3") Signed-off-by: Ronak Doshi Acked-by: Guolin Yang Changes v1-> v2: Moved MTU write after destroy of rx rings Link: https://patch.msgid.link/20250515190457.8597-1-ronak.doshi@broadcom.com Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- drivers/net/vmxnet3/vmxnet3_drv.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index b70654c7ad34e..151d7cdfc4802 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c @@ -3599,8 +3599,6 @@ vmxnet3_change_mtu(struct net_device *netdev, int new_mtu) struct vmxnet3_adapter *adapter = netdev_priv(netdev); int err = 0; - WRITE_ONCE(netdev->mtu, new_mtu); - /* * Reset_work may be in the middle of resetting the device, wait for its * completion. @@ -3614,6 +3612,7 @@ vmxnet3_change_mtu(struct net_device *netdev, int new_mtu) /* we need to re-create the rx queue based on the new mtu */ vmxnet3_rq_destroy_all(adapter); + WRITE_ONCE(netdev->mtu, new_mtu); vmxnet3_adjust_rx_ring_size(adapter); err = vmxnet3_rq_create_all(adapter); if (err) { @@ -3630,6 +3629,8 @@ vmxnet3_change_mtu(struct net_device *netdev, int new_mtu) "Closing it\n", err); goto out; } + } else { + WRITE_ONCE(netdev->mtu, new_mtu); } out: -- GitLab From 0ae82a7abff8f92f96233f63aaf62ded78095fb8 Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Mon, 28 Apr 2025 13:47:52 +0200 Subject: [PATCH 0584/2211] pmdomain: renesas: rcar: Remove obsolete nullify checks commit 13a6d4265665201a795a2ff5a3e6e4d183fc9c33 upstream. All nullify users and helpers were removed, but the R-Car SYSC drivers still checked for nullified domains. Remove the obsolete checks. Fixes: c8d87704444a8ac7 ("pmdomain: renesas: rcar-sysc: Remove rcar_sysc_nullify() helper") Signed-off-by: Geert Uytterhoeven Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/107f2bf9f13b29f0f623d2959a5347ec151fb089.1745840768.git.geert+renesas@glider.be Signed-off-by: Ulf Hansson Signed-off-by: Greg Kroah-Hartman --- drivers/pmdomain/renesas/rcar-gen4-sysc.c | 5 ----- drivers/pmdomain/renesas/rcar-sysc.c | 5 ----- 2 files changed, 10 deletions(-) diff --git a/drivers/pmdomain/renesas/rcar-gen4-sysc.c b/drivers/pmdomain/renesas/rcar-gen4-sysc.c index 66409cff2083f..e001b5c25bed0 100644 --- a/drivers/pmdomain/renesas/rcar-gen4-sysc.c +++ b/drivers/pmdomain/renesas/rcar-gen4-sysc.c @@ -338,11 +338,6 @@ static int __init rcar_gen4_sysc_pd_init(void) struct rcar_gen4_sysc_pd *pd; size_t n; - if (!area->name) { - /* Skip NULLified area */ - continue; - } - n = strlen(area->name) + 1; pd = kzalloc(sizeof(*pd) + n, GFP_KERNEL); if (!pd) { diff --git a/drivers/pmdomain/renesas/rcar-sysc.c b/drivers/pmdomain/renesas/rcar-sysc.c index b99326917330f..1e29485237894 100644 --- a/drivers/pmdomain/renesas/rcar-sysc.c +++ b/drivers/pmdomain/renesas/rcar-sysc.c @@ -396,11 +396,6 @@ static int __init rcar_sysc_pd_init(void) struct rcar_sysc_pd *pd; size_t n; - if (!area->name) { - /* Skip NULLified area */ - continue; - } - n = strlen(area->name) + 1; pd = kzalloc(sizeof(*pd) + n, GFP_KERNEL); if (!pd) { -- GitLab From e78908caf17cbddbceeac35bb54b1ada9610c4e6 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 8 May 2025 09:29:23 +0300 Subject: [PATCH 0585/2211] pmdomain: core: Fix error checking in genpd_dev_pm_attach_by_id() commit 0f5757667ec0aaf2456c3b76fcf0c6c3ea3591fe upstream. The error checking for of_count_phandle_with_args() does not handle negative error codes correctly. The problem is that "index" is a u32 so in the condition "if (index >= num_domains)" negative error codes stored in "num_domains" are type promoted to very high positive values and "index" is always going to be valid. Test for negative error codes first and then test if "index" is valid. Fixes: 3ccf3f0cd197 ("PM / Domains: Enable genpd_dev_pm_attach_by_id|name() for single PM domain") Signed-off-by: Dan Carpenter Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/aBxPQ8AI8N5v-7rL@stanley.mountain Signed-off-by: Ulf Hansson Signed-off-by: Greg Kroah-Hartman --- drivers/pmdomain/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pmdomain/core.c b/drivers/pmdomain/core.c index 88819659df83a..05913e9fe0821 100644 --- a/drivers/pmdomain/core.c +++ b/drivers/pmdomain/core.c @@ -3043,7 +3043,7 @@ struct device *genpd_dev_pm_attach_by_id(struct device *dev, /* Verify that the index is within a valid range. */ num_domains = of_count_phandle_with_args(dev->of_node, "power-domains", "#power-domain-cells"); - if (index >= num_domains) + if (num_domains < 0 || index >= num_domains) return NULL; /* Allocate and register device on the genpd bus. */ -- GitLab From 8594a123cfa23d708582dc6fb36da34479ef8a5b Mon Sep 17 00:00:00 2001 From: Vladimir Moskovkin Date: Wed, 14 May 2025 12:12:55 +0000 Subject: [PATCH 0586/2211] platform/x86: dell-wmi-sysman: Avoid buffer overflow in current_password_store() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 4e89a4077490f52cde652d17e32519b666abf3a6 upstream. If the 'buf' array received from the user contains an empty string, the 'length' variable will be zero. Accessing the 'buf' array element with index 'length - 1' will result in a buffer overflow. Add a check for an empty string. Found by Linux Verification Center (linuxtesting.org) with SVACE. Fixes: e8a60aa7404b ("platform/x86: Introduce support for Systems Management Driver over WMI for Dell Systems") Cc: stable@vger.kernel.org Signed-off-by: Vladimir Moskovkin Link: https://lore.kernel.org/r/39973642a4f24295b4a8fad9109c5b08@kaspersky.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Greg Kroah-Hartman --- drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c b/drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c index 230e6ee966366..d8f1bf5e58a0f 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c @@ -45,7 +45,7 @@ static ssize_t current_password_store(struct kobject *kobj, int length; length = strlen(buf); - if (buf[length-1] == '\n') + if (length && buf[length - 1] == '\n') length--; /* firmware does verifiation of min/max password length, -- GitLab From 56081f5d14c6729fd7d843a0a1075aeca614ca65 Mon Sep 17 00:00:00 2001 From: Zhang Rui Date: Mon, 19 May 2025 15:09:01 +0800 Subject: [PATCH 0587/2211] thermal: intel: x86_pkg_temp_thermal: Fix bogus trip temperature commit cf948c8e274e8b406e846cdf6cc48fe47f98cf57 upstream. The tj_max value obtained from the Intel TCC library are in Celsius, whereas the thermal subsystem operates in milli-Celsius. This discrepancy leads to incorrect trip temperature calculations. Fix bogus trip temperature by converting tj_max to milli-Celsius Unit. Fixes: 8ef0ca4a177d ("Merge back other thermal control material for 6.3.") Signed-off-by: Zhang Rui Reported-by: zhang ning Closes: https://lore.kernel.org/all/TY2PR01MB3786EF0FE24353026293F5ACCD97A@TY2PR01MB3786.jpnprd01.prod.outlook.com/ Tested-by: zhang ning Cc: 6.3+ # 6.3+ Link: https://patch.msgid.link/20250519070901.1031233-1-rui.zhang@intel.com Signed-off-by: Rafael J. Wysocki Signed-off-by: Greg Kroah-Hartman --- drivers/thermal/intel/x86_pkg_temp_thermal.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/thermal/intel/x86_pkg_temp_thermal.c b/drivers/thermal/intel/x86_pkg_temp_thermal.c index 65b33b56a9be5..8c44f378b61ef 100644 --- a/drivers/thermal/intel/x86_pkg_temp_thermal.c +++ b/drivers/thermal/intel/x86_pkg_temp_thermal.c @@ -329,6 +329,7 @@ static int pkg_temp_thermal_device_add(unsigned int cpu) tj_max = intel_tcc_get_tjmax(cpu); if (tj_max < 0) return tj_max; + tj_max *= 1000; zonedev = kzalloc(sizeof(*zonedev), GFP_KERNEL); if (!zonedev) -- GitLab From dc9bdfb9b02868aca92aa6546c5113bcc9aeea8d Mon Sep 17 00:00:00 2001 From: "feijuan.li" Date: Wed, 14 May 2025 14:35:11 +0800 Subject: [PATCH 0588/2211] drm/edid: fixed the bug that hdr metadata was not reset commit 6692dbc15e5ed40a3aa037aced65d7b8826c58cd upstream. When DP connected to a device with HDR capability, the hdr structure was filled.Then connected to another sink device without hdr capability, but the hdr info still exist. Fixes: e85959d6cbe0 ("drm: Parse HDR metadata info from EDID") Cc: # v5.3+ Signed-off-by: "feijuan.li" Reviewed-by: Jani Nikula Link: https://lore.kernel.org/r/20250514063511.4151780-1-feijuan.li@samsung.com Signed-off-by: Jani Nikula Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/drm_edid.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 13bc4c290b17d..9edb3247c767b 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -6596,6 +6596,7 @@ static void drm_reset_display_info(struct drm_connector *connector) info->has_hdmi_infoframe = false; info->rgb_quant_range_selectable = false; memset(&info->hdmi, 0, sizeof(info->hdmi)); + memset(&connector->hdr_sink_metadata, 0, sizeof(connector->hdr_sink_metadata)); info->edid_hdmi_rgb444_dc_modes = 0; info->edid_hdmi_ycbcr444_dc_modes = 0; -- GitLab From 9bea368648ac46f8593a780760362e40291d22a9 Mon Sep 17 00:00:00 2001 From: Wang Zhaolong Date: Fri, 16 May 2025 17:12:55 +0800 Subject: [PATCH 0589/2211] smb: client: Fix use-after-free in cifs_fill_dirent commit a7a8fe56e932a36f43e031b398aef92341bf5ea0 upstream. There is a race condition in the readdir concurrency process, which may access the rsp buffer after it has been released, triggering the following KASAN warning. ================================================================== BUG: KASAN: slab-use-after-free in cifs_fill_dirent+0xb03/0xb60 [cifs] Read of size 4 at addr ffff8880099b819c by task a.out/342975 CPU: 2 UID: 0 PID: 342975 Comm: a.out Not tainted 6.15.0-rc6+ #240 PREEMPT(full) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.1-2.fc37 04/01/2014 Call Trace: dump_stack_lvl+0x53/0x70 print_report+0xce/0x640 kasan_report+0xb8/0xf0 cifs_fill_dirent+0xb03/0xb60 [cifs] cifs_readdir+0x12cb/0x3190 [cifs] iterate_dir+0x1a1/0x520 __x64_sys_getdents+0x134/0x220 do_syscall_64+0x4b/0x110 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7f996f64b9f9 Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0d f7 c3 0c 00 f7 d8 64 89 8 RSP: 002b:00007f996f53de78 EFLAGS: 00000207 ORIG_RAX: 000000000000004e RAX: ffffffffffffffda RBX: 00007f996f53ecdc RCX: 00007f996f64b9f9 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000003 RBP: 00007f996f53dea0 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000207 R12: ffffffffffffff88 R13: 0000000000000000 R14: 00007ffc8cd9a500 R15: 00007f996f51e000 Allocated by task 408: kasan_save_stack+0x20/0x40 kasan_save_track+0x14/0x30 __kasan_slab_alloc+0x6e/0x70 kmem_cache_alloc_noprof+0x117/0x3d0 mempool_alloc_noprof+0xf2/0x2c0 cifs_buf_get+0x36/0x80 [cifs] allocate_buffers+0x1d2/0x330 [cifs] cifs_demultiplex_thread+0x22b/0x2690 [cifs] kthread+0x394/0x720 ret_from_fork+0x34/0x70 ret_from_fork_asm+0x1a/0x30 Freed by task 342979: kasan_save_stack+0x20/0x40 kasan_save_track+0x14/0x30 kasan_save_free_info+0x3b/0x60 __kasan_slab_free+0x37/0x50 kmem_cache_free+0x2b8/0x500 cifs_buf_release+0x3c/0x70 [cifs] cifs_readdir+0x1c97/0x3190 [cifs] iterate_dir+0x1a1/0x520 __x64_sys_getdents64+0x134/0x220 do_syscall_64+0x4b/0x110 entry_SYSCALL_64_after_hwframe+0x76/0x7e The buggy address belongs to the object at ffff8880099b8000 which belongs to the cache cifs_request of size 16588 The buggy address is located 412 bytes inside of freed 16588-byte region [ffff8880099b8000, ffff8880099bc0cc) The buggy address belongs to the physical page: page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x99b8 head: order:3 mapcount:0 entire_mapcount:0 nr_pages_mapped:0 pincount:0 anon flags: 0x80000000000040(head|node=0|zone=1) page_type: f5(slab) raw: 0080000000000040 ffff888001e03400 0000000000000000 dead000000000001 raw: 0000000000000000 0000000000010001 00000000f5000000 0000000000000000 head: 0080000000000040 ffff888001e03400 0000000000000000 dead000000000001 head: 0000000000000000 0000000000010001 00000000f5000000 0000000000000000 head: 0080000000000003 ffffea0000266e01 00000000ffffffff 00000000ffffffff head: ffffffffffffffff 0000000000000000 00000000ffffffff 0000000000000008 page dumped because: kasan: bad access detected Memory state around the buggy address: ffff8880099b8080: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ffff8880099b8100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb >ffff8880099b8180: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ^ ffff8880099b8200: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ffff8880099b8280: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ================================================================== POC is available in the link [1]. The problem triggering process is as follows: Process 1 Process 2 ----------------------------------------------------------------- cifs_readdir /* file->private_data == NULL */ initiate_cifs_search cifsFile = kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL); smb2_query_dir_first ->query_dir_first() SMB2_query_directory SMB2_query_directory_init cifs_send_recv smb2_parse_query_directory srch_inf->ntwrk_buf_start = (char *)rsp; srch_inf->srch_entries_start = (char *)rsp + ... srch_inf->last_entry = (char *)rsp + ... srch_inf->smallBuf = true; find_cifs_entry /* if (cfile->srch_inf.ntwrk_buf_start) */ cifs_small_buf_release(cfile->srch_inf // free cifs_readdir ->iterate_shared() /* file->private_data != NULL */ find_cifs_entry /* in while (...) loop */ smb2_query_dir_next ->query_dir_next() SMB2_query_directory SMB2_query_directory_init cifs_send_recv compound_send_recv smb_send_rqst __smb_send_rqst rc = -ERESTARTSYS; /* if (fatal_signal_pending()) */ goto out; return rc /* if (cfile->srch_inf.last_entry) */ cifs_save_resume_key() cifs_fill_dirent // UAF /* if (rc) */ return -ENOENT; Fix this by ensuring the return code is checked before using pointers from the srch_inf. Link: https://bugzilla.kernel.org/show_bug.cgi?id=220131 [1] Fixes: a364bc0b37f1 ("[CIFS] fix saving of resume key before CIFSFindNext") Cc: stable@vger.kernel.org Reviewed-by: Paulo Alcantara (Red Hat) Signed-off-by: Wang Zhaolong Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/readdir.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/smb/client/readdir.c b/fs/smb/client/readdir.c index 50f96259d9adc..67d7dd64b5e2e 100644 --- a/fs/smb/client/readdir.c +++ b/fs/smb/client/readdir.c @@ -756,11 +756,11 @@ find_cifs_entry(const unsigned int xid, struct cifs_tcon *tcon, loff_t pos, rc = server->ops->query_dir_next(xid, tcon, &cfile->fid, search_flags, &cfile->srch_inf); + if (rc) + return -ENOENT; /* FindFirst/Next set last_entry to NULL on malformed reply */ if (cfile->srch_inf.last_entry) cifs_save_resume_key(cfile->srch_inf.last_entry, cfile); - if (rc) - return -ENOENT; } if (index_to_find < cfile->srch_inf.index_of_last_entry) { /* we found the buffer that contains the entry */ -- GitLab From 56b06539b67823dc263656453a79310d00d2e295 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Fri, 9 May 2025 15:48:52 +0200 Subject: [PATCH 0590/2211] arm64: dts: marvell: uDPU: define pinctrl state for alarm LEDs commit b04f0d89e880bc2cca6a5c73cf287082c91878da upstream. The two alarm LEDs of on the uDPU board are stopped working since commit 78efa53e715e ("leds: Init leds class earlier"). The LEDs are driven by the GPIO{15,16} pins of the North Bridge GPIO controller. These pins are part of the 'spi_quad' pin group for which the 'spi' function is selected via the default pinctrl state of the 'spi' node. This is wrong however, since in order to allow controlling the LEDs, the pins should use the 'gpio' function. Before the commit mentined above, the 'spi' function is selected first by the pinctrl core before probing the spi driver, but then it gets overridden to 'gpio' implicitly via the devm_gpiod_get_index_optional() call from the 'leds-gpio' driver. After the commit, the LED subsystem gets initialized before the SPI subsystem, so the function of the pin group remains 'spi' which in turn prevents controlling of the LEDs. Despite the change of the initialization order, the root cause is that the pinctrl state definition is wrong since its initial commit 0d45062cfc89 ("arm64: dts: marvell: Add device tree for uDPU board"), To fix the problem, override the function in the 'spi_quad_pins' node to 'gpio' and move the pinctrl state definition from the 'spi' node into the 'leds' node. Cc: stable@vger.kernel.org # needs adjustment for < 6.1 Fixes: 0d45062cfc89 ("arm64: dts: marvell: Add device tree for uDPU board") Signed-off-by: Gabor Juhos Signed-off-by: Imre Kaloz Signed-off-by: Gregory CLEMENT Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi b/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi index 3a9b6907185d0..2428208457078 100644 --- a/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi +++ b/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi @@ -26,6 +26,8 @@ leds { compatible = "gpio-leds"; + pinctrl-names = "default"; + pinctrl-0 = <&spi_quad_pins>; led-power1 { label = "udpu:green:power"; @@ -82,8 +84,6 @@ &spi0 { status = "okay"; - pinctrl-names = "default"; - pinctrl-0 = <&spi_quad_pins>; flash@0 { compatible = "jedec,spi-nor"; @@ -108,6 +108,10 @@ }; }; +&spi_quad_pins { + function = "gpio"; +}; + &pinctrl_nb { i2c2_recovery_pins: i2c2-recovery-pins { groups = "i2c2"; -- GitLab From b4f801e8cfcc12e206ef5be3cc9cf85b75aeb8dd Mon Sep 17 00:00:00 2001 From: Wang Zhaolong Date: Fri, 16 May 2025 17:12:56 +0800 Subject: [PATCH 0591/2211] smb: client: Reset all search buffer pointers when releasing buffer commit e48f9d849bfdec276eebf782a84fd4dfbe1c14c0 upstream. Multiple pointers in struct cifs_search_info (ntwrk_buf_start, srch_entries_start, and last_entry) point to the same allocated buffer. However, when freeing this buffer, only ntwrk_buf_start was set to NULL, while the other pointers remained pointing to freed memory. This is defensive programming to prevent potential issues with stale pointers. While the active UAF vulnerability is fixed by the previous patch, this change ensures consistent pointer state and more robust error handling. Signed-off-by: Wang Zhaolong Cc: stable@vger.kernel.org Reviewed-by: Paulo Alcantara (Red Hat) Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/readdir.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/smb/client/readdir.c b/fs/smb/client/readdir.c index 67d7dd64b5e2e..787d6bcb5d1dc 100644 --- a/fs/smb/client/readdir.c +++ b/fs/smb/client/readdir.c @@ -733,7 +733,10 @@ find_cifs_entry(const unsigned int xid, struct cifs_tcon *tcon, loff_t pos, else cifs_buf_release(cfile->srch_inf. ntwrk_buf_start); + /* Reset all pointers to the network buffer to prevent stale references */ cfile->srch_inf.ntwrk_buf_start = NULL; + cfile->srch_inf.srch_entries_start = NULL; + cfile->srch_inf.last_entry = NULL; } rc = initiate_cifs_search(xid, file, full_path); if (rc) { -- GitLab From 7c220f89add8e7d6db63c9c4d9566917f8175a0b Mon Sep 17 00:00:00 2001 From: Mario Limonciello Date: Thu, 22 May 2025 09:13:28 -0500 Subject: [PATCH 0592/2211] Revert "drm/amd: Keep display off while going into S4" commit 7e7cb7a13c81073d38a10fa7b450d23712281ec4 upstream. commit 68bfdc8dc0a1a ("drm/amd: Keep display off while going into S4") attempted to keep displays off during the S4 sequence by not resuming display IP. This however leads to hangs because DRM clients such as the console can try to access registers and cause a hang. Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4155 Fixes: 68bfdc8dc0a1a ("drm/amd: Keep display off while going into S4") Reviewed-by: Alex Deucher Link: https://lore.kernel.org/r/20250522141328.115095-1-mario.limonciello@amd.com Signed-off-by: Mario Limonciello Signed-off-by: Alex Deucher (cherry picked from commit e485502c37b097b0bd773baa7e2741bf7bd2909a) Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 09ef87c69230e..5f9452b22596a 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -3315,11 +3315,6 @@ static int dm_resume(void *handle) return 0; } - - /* leave display off for S4 sequence */ - if (adev->in_s4) - return 0; - /* Recreate dc_state - DC invalidates it when setting power state to S3. */ dc_state_release(dm_state->context); dm_state->context = dc_state_create(dm->dc, NULL); -- GitLab From cb9a1019a63fe30ed769f2cf4e864c492c3f361d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 13 May 2025 15:59:48 -0700 Subject: [PATCH 0593/2211] Input: xpad - add more controllers commit f0d17942ea3edec191f1c0fc0d2cd7feca8de2f0 upstream. Adds support for a revision of the Turtle Beach Recon Wired Controller, the Turtle Beach Stealth Ultra, and the PowerA Wired Controller. Signed-off-by: Vicki Pfau Link: https://lore.kernel.org/r/20250513225950.2719387-1-vi@endrift.com Cc: stable@vger.kernel.org Signed-off-by: Dmitry Torokhov Signed-off-by: Greg Kroah-Hartman --- drivers/input/joystick/xpad.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index e14d8f316ad8f..da5b14602a761 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c @@ -289,6 +289,8 @@ static const struct xpad_device { { 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 }, { 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 }, { 0x10f5, 0x7005, "Turtle Beach Recon Controller", 0, XTYPE_XBOXONE }, + { 0x10f5, 0x7008, "Turtle Beach Recon Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, + { 0x10f5, 0x7073, "Turtle Beach Stealth Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, { 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 }, { 0x11ff, 0x0511, "PXN V900", 0, XTYPE_XBOX360 }, { 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 }, @@ -353,6 +355,7 @@ static const struct xpad_device { { 0x1ee9, 0x1590, "ZOTAC Gaming Zone", 0, XTYPE_XBOX360 }, { 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE }, { 0x20d6, 0x2009, "PowerA Enhanced Wired Controller for Xbox Series X|S", 0, XTYPE_XBOXONE }, + { 0x20d6, 0x2064, "PowerA Wired Controller for Xbox", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, { 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 }, { 0x2345, 0xe00b, "Machenike G5 Pro Controller", 0, XTYPE_XBOX360 }, { 0x24c6, 0x5000, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, -- GitLab From 9b8263cae64a6e51ec643cfcec7042d55f3af348 Mon Sep 17 00:00:00 2001 From: "Matthew Wilcox (Oracle)" Date: Wed, 14 May 2025 18:06:02 +0100 Subject: [PATCH 0594/2211] highmem: add folio_test_partial_kmap() commit 97dfbbd135cb5e4426f37ca53a8fa87eaaa4e376 upstream. In commit c749d9b7ebbc ("iov_iter: fix copy_page_from_iter_atomic() if KMAP_LOCAL_FORCE_MAP"), Hugh correctly noted that if KMAP_LOCAL_FORCE_MAP is enabled, we must limit ourselves to PAGE_SIZE bytes per call to kmap_local(). The same problem exists in memcpy_from_folio(), memcpy_to_folio(), folio_zero_tail(), folio_fill_tail() and memcpy_from_file_folio(), so add folio_test_partial_kmap() to do this more succinctly. Link: https://lkml.kernel.org/r/20250514170607.3000994-2-willy@infradead.org Fixes: 00cdf76012ab ("mm: add memcpy_from_file_folio()") Signed-off-by: Matthew Wilcox (Oracle) Cc: Al Viro Cc: Hugh Dickins Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- include/linux/highmem.h | 10 +++++----- include/linux/page-flags.h | 7 +++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 930a591b9b616..3c3f6996f29fa 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -461,7 +461,7 @@ static inline void memcpy_from_folio(char *to, struct folio *folio, const char *from = kmap_local_folio(folio, offset); size_t chunk = len; - if (folio_test_highmem(folio) && + if (folio_test_partial_kmap(folio) && chunk > PAGE_SIZE - offset_in_page(offset)) chunk = PAGE_SIZE - offset_in_page(offset); memcpy(to, from, chunk); @@ -489,7 +489,7 @@ static inline void memcpy_to_folio(struct folio *folio, size_t offset, char *to = kmap_local_folio(folio, offset); size_t chunk = len; - if (folio_test_highmem(folio) && + if (folio_test_partial_kmap(folio) && chunk > PAGE_SIZE - offset_in_page(offset)) chunk = PAGE_SIZE - offset_in_page(offset); memcpy(to, from, chunk); @@ -522,7 +522,7 @@ static inline __must_check void *folio_zero_tail(struct folio *folio, { size_t len = folio_size(folio) - offset; - if (folio_test_highmem(folio)) { + if (folio_test_partial_kmap(folio)) { size_t max = PAGE_SIZE - offset_in_page(offset); while (len > max) { @@ -560,7 +560,7 @@ static inline void folio_fill_tail(struct folio *folio, size_t offset, VM_BUG_ON(offset + len > folio_size(folio)); - if (folio_test_highmem(folio)) { + if (folio_test_partial_kmap(folio)) { size_t max = PAGE_SIZE - offset_in_page(offset); while (len > max) { @@ -597,7 +597,7 @@ static inline size_t memcpy_from_file_folio(char *to, struct folio *folio, size_t offset = offset_in_folio(folio, pos); char *from = kmap_local_folio(folio, offset); - if (folio_test_highmem(folio)) { + if (folio_test_partial_kmap(folio)) { offset = offset_in_page(offset); len = min_t(size_t, len, PAGE_SIZE - offset); } else diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index a9244291f5067..4e8c6d0511c56 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -573,6 +573,13 @@ FOLIO_FLAG(readahead, FOLIO_HEAD_PAGE) PAGEFLAG_FALSE(HighMem, highmem) #endif +/* Does kmap_local_folio() only allow access to one page of the folio? */ +#ifdef CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP +#define folio_test_partial_kmap(f) true +#else +#define folio_test_partial_kmap(f) folio_test_highmem(f) +#endif + #ifdef CONFIG_SWAP static __always_inline bool folio_test_swapcache(const struct folio *folio) { -- GitLab From 314bf771cb87ceef3fe580b4af980127b8ecea09 Mon Sep 17 00:00:00 2001 From: Breno Leitao Date: Fri, 23 May 2025 10:21:06 -0700 Subject: [PATCH 0595/2211] memcg: always call cond_resched() after fn() commit 06717a7b6c86514dbd6ab322e8083ffaa4db5712 upstream. I am seeing soft lockup on certain machine types when a cgroup OOMs. This is happening because killing the process in certain machine might be very slow, which causes the soft lockup and RCU stalls. This happens usually when the cgroup has MANY processes and memory.oom.group is set. Example I am seeing in real production: [462012.244552] Memory cgroup out of memory: Killed process 3370438 (crosvm) .... .... [462037.318059] Memory cgroup out of memory: Killed process 4171372 (adb) .... [462037.348314] watchdog: BUG: soft lockup - CPU#64 stuck for 26s! [stat_manager-ag:1618982] .... Quick look at why this is so slow, it seems to be related to serial flush for certain machine types. For all the crashes I saw, the target CPU was at console_flush_all(). In the case above, there are thousands of processes in the cgroup, and it is soft locking up before it reaches the 1024 limit in the code (which would call the cond_resched()). So, cond_resched() in 1024 blocks is not sufficient. Remove the counter-based conditional rescheduling logic and call cond_resched() unconditionally after each task iteration, after fn() is called. This avoids the lockup independently of how slow fn() is. Link: https://lkml.kernel.org/r/20250523-memcg_fix-v1-1-ad3eafb60477@debian.org Fixes: ade81479c7dd ("memcg: fix soft lockup in the OOM process") Signed-off-by: Breno Leitao Suggested-by: Rik van Riel Acked-by: Shakeel Butt Cc: Michael van der Westhuizen Cc: Usama Arif Cc: Pavel Begunkov Cc: Chen Ridong Cc: Greg Kroah-Hartman Cc: Johannes Weiner Cc: Michal Hocko Cc: Michal Hocko Cc: Muchun Song Cc: Roman Gushchin Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- mm/memcontrol.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 2d1e402f06f22..dcd2d0e15e13b 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1139,7 +1139,6 @@ void mem_cgroup_scan_tasks(struct mem_cgroup *memcg, { struct mem_cgroup *iter; int ret = 0; - int i = 0; BUG_ON(mem_cgroup_is_root(memcg)); @@ -1149,10 +1148,9 @@ void mem_cgroup_scan_tasks(struct mem_cgroup *memcg, css_task_iter_start(&iter->css, CSS_TASK_ITER_PROCS, &it); while (!ret && (task = css_task_iter_next(&it))) { - /* Avoid potential softlockup warning */ - if ((++i & 1023) == 0) - cond_resched(); ret = fn(task, arg); + /* Avoid potential softlockup warning */ + cond_resched(); } css_task_iter_end(&it); if (ret) { -- GitLab From 9da33ce1142b5bfbcdc18bbde9494f2c2bb4ee5e Mon Sep 17 00:00:00 2001 From: Tianyang Zhang Date: Wed, 16 Apr 2025 16:24:05 +0800 Subject: [PATCH 0596/2211] mm/page_alloc.c: avoid infinite retries caused by cpuset race commit e05741fb10c38d70bbd7ec12b23c197b6355d519 upstream. __alloc_pages_slowpath has no change detection for ac->nodemask in the part of retry path, while cpuset can modify it in parallel. For some processes that set mempolicy as MPOL_BIND, this results ac->nodemask changes, and then the should_reclaim_retry will judge based on the latest nodemask and jump to retry, while the get_page_from_freelist only traverses the zonelist from ac->preferred_zoneref, which selected by a expired nodemask and may cause infinite retries in some cases cpu 64: __alloc_pages_slowpath { /* ..... */ retry: /* ac->nodemask = 0x1, ac->preferred->zone->nid = 1 */ if (alloc_flags & ALLOC_KSWAPD) wake_all_kswapds(order, gfp_mask, ac); /* cpu 1: cpuset_write_resmask update_nodemask update_nodemasks_hier update_tasks_nodemask mpol_rebind_task mpol_rebind_policy mpol_rebind_nodemask // mempolicy->nodes has been modified, // which ac->nodemask point to */ /* ac->nodemask = 0x3, ac->preferred->zone->nid = 1 */ if (should_reclaim_retry(gfp_mask, order, ac, alloc_flags, did_some_progress > 0, &no_progress_loops)) goto retry; } Simultaneously starting multiple cpuset01 from LTP can quickly reproduce this issue on a multi node server when the maximum memory pressure is reached and the swap is enabled Link: https://lkml.kernel.org/r/20250416082405.20988-1-zhangtianyang@loongson.cn Fixes: c33d6c06f60f ("mm, page_alloc: avoid looking up the first zone in a zonelist twice") Signed-off-by: Tianyang Zhang Reviewed-by: Suren Baghdasaryan Reviewed-by: Vlastimil Babka Cc: Michal Hocko Cc: Brendan Jackman Cc: Johannes Weiner Cc: Zi Yan Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- mm/page_alloc.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index ebe1ec6614926..882903f42300b 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -4381,6 +4381,14 @@ restart: } retry: + /* + * Deal with possible cpuset update races or zonelist updates to avoid + * infinite retries. + */ + if (check_retry_cpuset(cpuset_mems_cookie, ac) || + check_retry_zonelist(zonelist_iter_cookie)) + goto restart; + /* Ensure kswapd doesn't accidentally go to sleep as long as we loop */ if (alloc_flags & ALLOC_KSWAPD) wake_all_kswapds(order, gfp_mask, ac); -- GitLab From 9f9517f15686652036909400d954cd236365d8b8 Mon Sep 17 00:00:00 2001 From: Ignacio Moreno Gonzalez Date: Wed, 7 May 2025 15:28:06 +0200 Subject: [PATCH 0597/2211] mm: mmap: map MAP_STACK to VM_NOHUGEPAGE only if THP is enabled commit 7190b3c8bd2b0cde483bd440cf91ba1c518b4261 upstream. commit c4608d1bf7c6 ("mm: mmap: map MAP_STACK to VM_NOHUGEPAGE") maps the mmap option MAP_STACK to VM_NOHUGEPAGE. This is also done if CONFIG_TRANSPARENT_HUGEPAGE is not defined. But in that case, the VM_NOHUGEPAGE does not make sense. I discovered this issue when trying to use the tool CRIU to checkpoint and restore a container. Our running kernel is compiled without CONFIG_TRANSPARENT_HUGEPAGE. CRIU parses the output of /proc//smaps and saves the "nh" flag. When trying to restore the container, CRIU fails to restore the "nh" mappings, since madvise() MADV_NOHUGEPAGE always returns an error because CONFIG_TRANSPARENT_HUGEPAGE is not defined. Link: https://lkml.kernel.org/r/20250507-map-map_stack-to-vm_nohugepage-only-if-thp-is-enabled-v5-1-c6c38cfefd6e@kuka.com Fixes: c4608d1bf7c6 ("mm: mmap: map MAP_STACK to VM_NOHUGEPAGE") Signed-off-by: Ignacio Moreno Gonzalez Acked-by: David Hildenbrand Reviewed-by: Lorenzo Stoakes Reviewed-by: Yang Shi Reviewed-by: Liam R. Howlett Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- include/linux/mman.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/mman.h b/include/linux/mman.h index a842783ffa62b..03a9102462225 100644 --- a/include/linux/mman.h +++ b/include/linux/mman.h @@ -157,7 +157,9 @@ calc_vm_flag_bits(struct file *file, unsigned long flags) return _calc_vm_trans(flags, MAP_GROWSDOWN, VM_GROWSDOWN ) | _calc_vm_trans(flags, MAP_LOCKED, VM_LOCKED ) | _calc_vm_trans(flags, MAP_SYNC, VM_SYNC ) | +#ifdef CONFIG_TRANSPARENT_HUGEPAGE _calc_vm_trans(flags, MAP_STACK, VM_NOHUGEPAGE) | +#endif arch_calc_vm_flag_bits(file, flags); } -- GitLab From 94efb0d6569029ab2a554309dafaba6b95e97869 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Thu, 15 May 2025 14:42:15 -0700 Subject: [PATCH 0598/2211] mm: vmalloc: actually use the in-place vrealloc region commit f7a35a3c36d1e36059c5654737d9bee3454f01a3 upstream. Patch series "mm: vmalloc: Actually use the in-place vrealloc region". This fixes a performance regression[1] with vrealloc()[1]. The refactoring to not build a new vmalloc region only actually worked when shrinking. Actually return the resized area when it grows. Ugh. Link: https://lkml.kernel.org/r/20250515214217.619685-1-kees@kernel.org Fixes: a0309faf1cb0 ("mm: vmalloc: support more granular vrealloc() sizing") Signed-off-by: Kees Cook Reported-by: Shung-Hsi Yu Closes: https://lore.kernel.org/all/20250515-bpf-verifier-slowdown-vwo2meju4cgp2su5ckj@6gi6ssxbnfqg [1] Tested-by: Eduard Zingerman Tested-by: Pawan Gupta Tested-by: Shung-Hsi Yu Reviewed-by: "Uladzislau Rezki (Sony)" Reviewed-by: Danilo Krummrich Cc: "Erhard F." Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- mm/vmalloc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 358bd3083b888..d7b15cf9f2ccf 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -4115,6 +4115,7 @@ void *vrealloc_noprof(const void *p, size_t size, gfp_t flags) if (want_init_on_alloc(flags)) memset((void *)p + old_size, 0, size - old_size); vm->requested_size = size; + return (void *)p; } /* TODO: Grow the vm_area, i.e. allocate and map additional pages. */ -- GitLab From 483ac74183e1e85c7d263f3be5a5c55a029b32e8 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Thu, 15 May 2025 14:42:16 -0700 Subject: [PATCH 0599/2211] mm: vmalloc: only zero-init on vrealloc shrink commit 70d1eb031a68cbde4eed8099674be21778441c94 upstream. The common case is to grow reallocations, and since init_on_alloc will have already zeroed the whole allocation, we only need to zero when shrinking the allocation. Link: https://lkml.kernel.org/r/20250515214217.619685-2-kees@kernel.org Fixes: a0309faf1cb0 ("mm: vmalloc: support more granular vrealloc() sizing") Signed-off-by: Kees Cook Tested-by: Pawan Gupta Cc: Danilo Krummrich Cc: Eduard Zingerman Cc: "Erhard F." Cc: Shung-Hsi Yu Cc: "Uladzislau Rezki (Sony)" Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- mm/vmalloc.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index d7b15cf9f2ccf..cc04e501b1c53 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -4097,8 +4097,8 @@ void *vrealloc_noprof(const void *p, size_t size, gfp_t flags) * would be a good heuristic for when to shrink the vm_area? */ if (size <= old_size) { - /* Zero out "freed" memory. */ - if (want_init_on_free()) + /* Zero out "freed" memory, potentially for future realloc. */ + if (want_init_on_free() || want_init_on_alloc(flags)) memset((void *)p + size, 0, old_size - size); vm->requested_size = size; kasan_poison_vmalloc(p + size, old_size - size); @@ -4111,9 +4111,11 @@ void *vrealloc_noprof(const void *p, size_t size, gfp_t flags) if (size <= alloced_size) { kasan_unpoison_vmalloc(p + old_size, size - old_size, KASAN_VMALLOC_PROT_NORMAL); - /* Zero out "alloced" memory. */ - if (want_init_on_alloc(flags)) - memset((void *)p + old_size, 0, size - old_size); + /* + * No need to zero memory here, as unused memory will have + * already been zeroed at initial allocation time or during + * realloc shrink time. + */ vm->requested_size = size; return (void *)p; } -- GitLab From fedd2a1443600c8a91c2c75940ad1527bae1e649 Mon Sep 17 00:00:00 2001 From: Ryusuke Konishi Date: Sat, 3 May 2025 14:33:14 +0900 Subject: [PATCH 0600/2211] nilfs2: fix deadlock warnings caused by lock dependency in init_nilfs() commit fb881cd7604536b17a1927fb0533f9a6982ffcc5 upstream. After commit c0e473a0d226 ("block: fix race between set_blocksize and read paths") was merged, set_blocksize() called by sb_set_blocksize() now locks the inode of the backing device file. As a result of this change, syzbot started reporting deadlock warnings due to a circular dependency involving the semaphore "ns_sem" of the nilfs object, the inode lock of the backing device file, and the locks that this inode lock is transitively dependent on. This is caused by a new lock dependency added by the above change, since init_nilfs() calls sb_set_blocksize() in the lock section of "ns_sem". However, these warnings are false positives because init_nilfs() is called in the early stage of the mount operation and the filesystem has not yet started. The reason why "ns_sem" is locked in init_nilfs() was to avoid a race condition in nilfs_fill_super() caused by sharing a nilfs object among multiple filesystem instances (super block structures) in the early implementation. However, nilfs objects and super block structures have long ago become one-to-one, and there is no longer any need to use the semaphore there. So, fix this issue by removing the use of the semaphore "ns_sem" in init_nilfs(). Link: https://lkml.kernel.org/r/20250503053327.12294-1-konishi.ryusuke@gmail.com Fixes: c0e473a0d226 ("block: fix race between set_blocksize and read paths") Signed-off-by: Ryusuke Konishi Reported-by: syzbot+00f7f5b884b117ee6773@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=00f7f5b884b117ee6773 Tested-by: syzbot+00f7f5b884b117ee6773@syzkaller.appspotmail.com Reported-by: syzbot+f30591e72bfc24d4715b@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=f30591e72bfc24d4715b Tested-by: syzbot+f30591e72bfc24d4715b@syzkaller.appspotmail.com> Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- fs/nilfs2/the_nilfs.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c index ac03fd3c330c6..ecd71c1908859 100644 --- a/fs/nilfs2/the_nilfs.c +++ b/fs/nilfs2/the_nilfs.c @@ -693,8 +693,6 @@ int init_nilfs(struct the_nilfs *nilfs, struct super_block *sb) int blocksize; int err; - down_write(&nilfs->ns_sem); - blocksize = sb_min_blocksize(sb, NILFS_MIN_BLOCK_SIZE); if (!blocksize) { nilfs_err(sb, "unable to set blocksize"); @@ -767,7 +765,6 @@ int init_nilfs(struct the_nilfs *nilfs, struct super_block *sb) set_nilfs_init(nilfs); err = 0; out: - up_write(&nilfs->ns_sem); return err; failed_sbh: -- GitLab From 3e0dc2b4f678c17585ad1371fe3b626b7203c3f1 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 22 Apr 2025 09:21:55 +0800 Subject: [PATCH 0601/2211] Bluetooth: btmtksdio: Check function enabled before doing close commit 07e90048e356a29079fbc011cfc2e1fa1d1c5ac9 upstream. Check BTMTKSDIO_FUNC_ENABLED flag before doing close to prevent btmtksdio_close been called twice. Fixes: 6ac4233afb9a ("Bluetooth: btmtksdio: Prevent enabling interrupts after IRQ handler removal") Signed-off-by: Chris Lu Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Greg Kroah-Hartman --- drivers/bluetooth/btmtksdio.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/bluetooth/btmtksdio.c b/drivers/bluetooth/btmtksdio.c index d4ea1ff07b3e7..b01aa85bd03fe 100644 --- a/drivers/bluetooth/btmtksdio.c +++ b/drivers/bluetooth/btmtksdio.c @@ -723,6 +723,10 @@ static int btmtksdio_close(struct hci_dev *hdev) { struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); + /* Skip btmtksdio_close if BTMTKSDIO_FUNC_ENABLED isn't set */ + if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state)) + return 0; + sdio_claim_host(bdev->func); /* Disable interrupt */ -- GitLab From 111a892a235d50b02b7149cc2d655187a91207d8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 22 Apr 2025 09:21:56 +0800 Subject: [PATCH 0602/2211] Bluetooth: btmtksdio: Do close if SDIO card removed without close commit 0b6d58bc6ea85e57de25c828444928e4a0aa79cb upstream. To prevent Bluetooth SDIO card from be physically removed suddenly, driver needs to ensure btmtksdio_close is called before btmtksdio_remove to disable interrupts and txrx workqueue. Fixes: 6ac4233afb9a ("Bluetooth: btmtksdio: Prevent enabling interrupts after IRQ handler removal") Signed-off-by: Chris Lu Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Greg Kroah-Hartman --- drivers/bluetooth/btmtksdio.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/bluetooth/btmtksdio.c b/drivers/bluetooth/btmtksdio.c index b01aa85bd03fe..13dcc0077732b 100644 --- a/drivers/bluetooth/btmtksdio.c +++ b/drivers/bluetooth/btmtksdio.c @@ -1434,11 +1434,15 @@ static void btmtksdio_remove(struct sdio_func *func) if (!bdev) return; + hdev = bdev->hdev; + + /* Make sure to call btmtksdio_close before removing sdio card */ + if (test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state)) + btmtksdio_close(hdev); + /* Be consistent the state in btmtksdio_probe */ pm_runtime_get_noresume(bdev->dev); - hdev = bdev->hdev; - sdio_set_drvdata(func, NULL); hci_unregister_dev(hdev); hci_free_dev(hdev); -- GitLab From 544ff7fb1972778acbe0a11a0548305c7384f854 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sun, 13 Apr 2025 15:58:48 +0200 Subject: [PATCH 0603/2211] Revert "arm64: dts: allwinner: h6: Use RSB for AXP805 PMIC connection" [ Upstream commit 573f99c7585f597630f14596550c79e73ffaeef4 ] This reverts commit 531fdbeedeb89bd32018a35c6e137765c9cc9e97. Hardware that uses I2C wasn't designed with high speeds in mind, so communication with PMIC via RSB can intermittently fail. Go back to I2C as higher speed and efficiency isn't worth the trouble. Fixes: 531fdbeedeb8 ("arm64: dts: allwinner: h6: Use RSB for AXP805 PMIC connection") Link: https://github.com/LibreELEC/LibreELEC.tv/issues/7731 Signed-off-by: Jernej Skrabec Link: https://patch.msgid.link/20250413135848.67283-1-jernej.skrabec@gmail.com Signed-off-by: Chen-Yu Tsai Signed-off-by: Sasha Levin --- .../dts/allwinner/sun50i-h6-beelink-gs1.dts | 38 +++++++++---------- .../dts/allwinner/sun50i-h6-orangepi-3.dts | 14 +++---- .../dts/allwinner/sun50i-h6-orangepi.dtsi | 22 +++++------ 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts index 3be1e8c2fdb9c..1012103df25f7 100644 --- a/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts @@ -151,28 +151,12 @@ vcc-pg-supply = <®_aldo1>; }; -&r_ir { - linux,rc-map-name = "rc-beelink-gs1"; - status = "okay"; -}; - -&r_pio { - /* - * FIXME: We can't add that supply for now since it would - * create a circular dependency between pinctrl, the regulator - * and the RSB Bus. - * - * vcc-pl-supply = <®_aldo1>; - */ - vcc-pm-supply = <®_aldo1>; -}; - -&r_rsb { +&r_i2c { status = "okay"; - axp805: pmic@745 { + axp805: pmic@36 { compatible = "x-powers,axp805", "x-powers,axp806"; - reg = <0x745>; + reg = <0x36>; interrupt-parent = <&r_intc>; interrupts = ; interrupt-controller; @@ -290,6 +274,22 @@ }; }; +&r_ir { + linux,rc-map-name = "rc-beelink-gs1"; + status = "okay"; +}; + +&r_pio { + /* + * PL0 and PL1 are used for PMIC I2C + * don't enable the pl-supply else + * it will fail at boot + * + * vcc-pl-supply = <®_aldo1>; + */ + vcc-pm-supply = <®_aldo1>; +}; + &spdif { pinctrl-names = "default"; pinctrl-0 = <&spdif_tx_pin>; diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts index 6c3bfe3d09d9a..14cc99b216224 100644 --- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts @@ -175,16 +175,12 @@ vcc-pg-supply = <®_vcc_wifi_io>; }; -&r_ir { - status = "okay"; -}; - -&r_rsb { +&r_i2c { status = "okay"; - axp805: pmic@745 { + axp805: pmic@36 { compatible = "x-powers,axp805", "x-powers,axp806"; - reg = <0x745>; + reg = <0x36>; interrupt-parent = <&r_intc>; interrupts = ; interrupt-controller; @@ -295,6 +291,10 @@ }; }; +&r_ir { + status = "okay"; +}; + &rtc { clocks = <&ext_osc32k>; }; diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi.dtsi index 13b07141c3344..bab0f63dcc5be 100644 --- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi.dtsi @@ -112,20 +112,12 @@ vcc-pg-supply = <®_aldo1>; }; -&r_ir { - status = "okay"; -}; - -&r_pio { - vcc-pm-supply = <®_bldo3>; -}; - -&r_rsb { +&r_i2c { status = "okay"; - axp805: pmic@745 { + axp805: pmic@36 { compatible = "x-powers,axp805", "x-powers,axp806"; - reg = <0x745>; + reg = <0x36>; interrupt-parent = <&r_intc>; interrupts = ; interrupt-controller; @@ -240,6 +232,14 @@ }; }; +&r_ir { + status = "okay"; +}; + +&r_pio { + vcc-pm-supply = <®_bldo3>; +}; + &rtc { clocks = <&ext_osc32k>; }; -- GitLab From 5c54a557bde18c0ee0e6adb135230b81b7e2c883 Mon Sep 17 00:00:00 2001 From: Namjae Jeon Date: Thu, 8 May 2025 16:46:11 +0900 Subject: [PATCH 0604/2211] ksmbd: fix stream write failure [ Upstream commit 1f4bbedd4e5a69b01cde2cc21d01151ab2d0884f ] If there is no stream data in file, v_len is zero. So, If position(*pos) is zero, stream write will fail due to stream write position validation check. This patch reorganize stream write position validation. Fixes: 0ca6df4f40cf ("ksmbd: prevent out-of-bounds stream writes by validating *pos") Signed-off-by: Namjae Jeon Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/server/vfs.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c index e059316be36fd..59ae63ab86857 100644 --- a/fs/smb/server/vfs.c +++ b/fs/smb/server/vfs.c @@ -426,10 +426,15 @@ static int ksmbd_vfs_stream_write(struct ksmbd_file *fp, char *buf, loff_t *pos, ksmbd_debug(VFS, "write stream data pos : %llu, count : %zd\n", *pos, count); + if (*pos >= XATTR_SIZE_MAX) { + pr_err("stream write position %lld is out of bounds\n", *pos); + return -EINVAL; + } + size = *pos + count; if (size > XATTR_SIZE_MAX) { size = XATTR_SIZE_MAX; - count = (*pos + count) - XATTR_SIZE_MAX; + count = XATTR_SIZE_MAX - *pos; } v_len = ksmbd_vfs_getcasexattr(idmap, @@ -443,13 +448,6 @@ static int ksmbd_vfs_stream_write(struct ksmbd_file *fp, char *buf, loff_t *pos, goto out; } - if (v_len <= *pos) { - pr_err("stream write position %lld is out of bounds (stream length: %zd)\n", - *pos, v_len); - err = -EINVAL; - goto out; - } - if (v_len < size) { wbuf = kvzalloc(size, KSMBD_DEFAULT_GFP); if (!wbuf) { -- GitLab From 92f077ff52f2895c33c0e2802983fae7a28acf31 Mon Sep 17 00:00:00 2001 From: Mark Pearson Date: Mon, 19 May 2025 20:50:18 -0400 Subject: [PATCH 0605/2211] platform/x86: think-lmi: Fix attribute name usage for non-compliant items MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 8508427a6e21c1ef01ae4c9f4e2675fc99deb949 ] A few, quite rare, WMI attributes have names that are not compatible with filenames, e.g. "Intel VT for Directed I/O (VT-d)". For these cases the '/' gets replaced with '\' for display, but doesn't get switched again when doing the WMI access. Fix this by keeping the original attribute name and using that for sending commands to the BIOS Fixes: a40cd7ef22fb ("platform/x86: think-lmi: Add WMI interface support on Lenovo platforms") Signed-off-by: Mark Pearson Link: https://lore.kernel.org/r/20250520005027.3840705-1-mpearson-lenovo@squebb.ca Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/think-lmi.c | 26 ++++++++++++++------------ drivers/platform/x86/think-lmi.h | 1 + 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/drivers/platform/x86/think-lmi.c b/drivers/platform/x86/think-lmi.c index 4cfb53206cb84..1abd8378f158d 100644 --- a/drivers/platform/x86/think-lmi.c +++ b/drivers/platform/x86/think-lmi.c @@ -995,8 +995,8 @@ static ssize_t current_value_store(struct kobject *kobj, ret = -EINVAL; goto out; } - set_str = kasprintf(GFP_KERNEL, "%s,%s,%s", setting->display_name, - new_setting, tlmi_priv.pwd_admin->signature); + set_str = kasprintf(GFP_KERNEL, "%s,%s,%s", setting->name, + new_setting, tlmi_priv.pwd_admin->signature); if (!set_str) { ret = -ENOMEM; goto out; @@ -1026,7 +1026,7 @@ static ssize_t current_value_store(struct kobject *kobj, goto out; } - set_str = kasprintf(GFP_KERNEL, "%s,%s;", setting->display_name, + set_str = kasprintf(GFP_KERNEL, "%s,%s;", setting->name, new_setting); if (!set_str) { ret = -ENOMEM; @@ -1054,11 +1054,11 @@ static ssize_t current_value_store(struct kobject *kobj, } if (auth_str) - set_str = kasprintf(GFP_KERNEL, "%s,%s,%s", setting->display_name, - new_setting, auth_str); + set_str = kasprintf(GFP_KERNEL, "%s,%s,%s", setting->name, + new_setting, auth_str); else - set_str = kasprintf(GFP_KERNEL, "%s,%s;", setting->display_name, - new_setting); + set_str = kasprintf(GFP_KERNEL, "%s,%s;", setting->name, + new_setting); if (!set_str) { ret = -ENOMEM; goto out; @@ -1568,9 +1568,6 @@ static int tlmi_analyze(void) continue; } - /* It is not allowed to have '/' for file name. Convert it into '\'. */ - strreplace(item, '/', '\\'); - /* Remove the value part */ strreplace(item, ',', '\0'); @@ -1582,11 +1579,16 @@ static int tlmi_analyze(void) goto fail_clear_attr; } setting->index = i; + + strscpy(setting->name, item); + /* It is not allowed to have '/' for file name. Convert it into '\'. */ + strreplace(item, '/', '\\'); strscpy(setting->display_name, item); + /* If BIOS selections supported, load those */ if (tlmi_priv.can_get_bios_selections) { - ret = tlmi_get_bios_selections(setting->display_name, - &setting->possible_values); + ret = tlmi_get_bios_selections(setting->name, + &setting->possible_values); if (ret || !setting->possible_values) pr_info("Error retrieving possible values for %d : %s\n", i, setting->display_name); diff --git a/drivers/platform/x86/think-lmi.h b/drivers/platform/x86/think-lmi.h index e1975ffebeb42..7f9632a53736f 100644 --- a/drivers/platform/x86/think-lmi.h +++ b/drivers/platform/x86/think-lmi.h @@ -84,6 +84,7 @@ struct tlmi_pwd_setting { struct tlmi_attr_setting { struct kobject kobj; int index; + char name[TLMI_SETTINGS_MAXLEN]; char display_name[TLMI_SETTINGS_MAXLEN]; char *possible_values; }; -- GitLab From 1d45e0170cf0012205d8e6f4181986d6008dcf83 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 22 May 2025 12:47:31 +0200 Subject: [PATCH 0606/2211] spi: use container_of_cont() for to_spi_device() [ Upstream commit 1007ae0d464ceb55a3740634790521d3543aaab9 ] Some places in the spi core pass in a const pointer to a device and the default container_of() casts that away, which is not a good idea. Preserve the proper const attribute by using container_of_const() for to_spi_device() instead, which is what it was designed for. Note, this removes the NULL check for a device pointer in the call, but no one was ever checking for that return value, and a device pointer should never be NULL overall anyway, so this should be a safe change. Cc: Mark Brown Fixes: d69d80484598 ("driver core: have match() callback in struct bus_type take a const *") Signed-off-by: Greg Kroah-Hartman Link: https://patch.msgid.link/2025052230-fidgeting-stooge-66f5@gregkh Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- include/linux/spi/spi.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 4b95663163e0b..71ad766932d31 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -247,10 +247,7 @@ struct spi_device { static_assert((SPI_MODE_KERNEL_MASK & SPI_MODE_USER_MASK) == 0, "SPI_MODE_USER_MASK & SPI_MODE_KERNEL_MASK must not overlap"); -static inline struct spi_device *to_spi_device(const struct device *dev) -{ - return dev ? container_of(dev, struct spi_device, dev) : NULL; -} +#define to_spi_device(__dev) container_of_const(__dev, struct spi_device, dev) /* Most drivers won't need to care about device refcounting */ static inline struct spi_device *spi_dev_get(struct spi_device *spi) -- GitLab From b9fbbcf61e7c7a00def2ca3e8b91a19dba096102 Mon Sep 17 00:00:00 2001 From: Larisa Grigore Date: Thu, 22 May 2025 15:51:30 +0100 Subject: [PATCH 0607/2211] spi: spi-fsl-dspi: restrict register range for regmap access [ Upstream commit 283ae0c65e9c592f4a1ba4f31917f5e766da7f31 ] DSPI registers are NOT continuous, some registers are reserved and accessing them from userspace will trigger external abort, add regmap register access table to avoid below abort. For example on S32G: # cat /sys/kernel/debug/regmap/401d8000.spi/registers Internal error: synchronous external abort: 96000210 1 PREEMPT SMP ... Call trace: regmap_mmio_read32le+0x24/0x48 regmap_mmio_read+0x48/0x70 _regmap_bus_reg_read+0x38/0x48 _regmap_read+0x68/0x1b0 regmap_read+0x50/0x78 regmap_read_debugfs+0x120/0x338 Fixes: 1acbdeb92c87 ("spi/fsl-dspi: Convert to use regmap and add big-endian support") Co-developed-by: Xulin Sun Signed-off-by: Xulin Sun Signed-off-by: Larisa Grigore Signed-off-by: James Clark Link: https://patch.msgid.link/20250522-james-nxp-spi-v2-1-bea884630cfb@linaro.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-fsl-dspi.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 3fa990fb59c78..b8e7e6dbe0030 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0+ // // Copyright 2013 Freescale Semiconductor, Inc. -// Copyright 2020 NXP +// Copyright 2020-2025 NXP // // Freescale DSPI driver // This file contains a driver for the Freescale DSPI @@ -1167,6 +1167,20 @@ static int dspi_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(dspi_pm, dspi_suspend, dspi_resume); +static const struct regmap_range dspi_yes_ranges[] = { + regmap_reg_range(SPI_MCR, SPI_MCR), + regmap_reg_range(SPI_TCR, SPI_CTAR(3)), + regmap_reg_range(SPI_SR, SPI_TXFR3), + regmap_reg_range(SPI_RXFR0, SPI_RXFR3), + regmap_reg_range(SPI_CTARE(0), SPI_CTARE(3)), + regmap_reg_range(SPI_SREX, SPI_SREX), +}; + +static const struct regmap_access_table dspi_access_table = { + .yes_ranges = dspi_yes_ranges, + .n_yes_ranges = ARRAY_SIZE(dspi_yes_ranges), +}; + static const struct regmap_range dspi_volatile_ranges[] = { regmap_reg_range(SPI_MCR, SPI_TCR), regmap_reg_range(SPI_SR, SPI_SR), @@ -1184,6 +1198,8 @@ static const struct regmap_config dspi_regmap_config = { .reg_stride = 4, .max_register = 0x88, .volatile_table = &dspi_volatile_table, + .rd_table = &dspi_access_table, + .wr_table = &dspi_access_table, }; static const struct regmap_range dspi_xspi_volatile_ranges[] = { @@ -1205,6 +1221,8 @@ static const struct regmap_config dspi_xspi_regmap_config[] = { .reg_stride = 4, .max_register = 0x13c, .volatile_table = &dspi_xspi_volatile_table, + .rd_table = &dspi_access_table, + .wr_table = &dspi_access_table, }, { .name = "pushr", -- GitLab From b1781bd47e6d40b29d2cbb39e6b48b837e2dfad0 Mon Sep 17 00:00:00 2001 From: Bogdan-Gabriel Roman Date: Thu, 22 May 2025 15:51:31 +0100 Subject: [PATCH 0608/2211] spi: spi-fsl-dspi: Halt the module after a new message transfer [ Upstream commit 8a30a6d35a11ff5ccdede7d6740765685385a917 ] The XSPI mode implementation in this driver still uses the EOQ flag to signal the last word in a transmission and deassert the PCS signal. However, at speeds lower than ~200kHZ, the PCS signal seems to remain asserted even when SR[EOQF] = 1 indicates the end of a transmission. This is a problem for target devices which require the deassertation of the PCS signal between transfers. Hence, this commit 'forces' the deassertation of the PCS by stopping the module through MCR[HALT] after completing a new transfer. According to the reference manual, the module stops or transitions from the Running state to the Stopped state after the current frame, when any one of the following conditions exist: - The value of SR[EOQF] = 1. - The chip is in Debug mode and the value of MCR[FRZ] = 1. - The value of MCR[HALT] = 1. This shouldn't be done if the last transfer in the message has cs_change set. Fixes: ea93ed4c181b ("spi: spi-fsl-dspi: Use EOQ for last word in buffer even for XSPI mode") Signed-off-by: Bogdan-Gabriel Roman Signed-off-by: Larisa Grigore Signed-off-by: James Clark Link: https://patch.msgid.link/20250522-james-nxp-spi-v2-2-bea884630cfb@linaro.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-fsl-dspi.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index b8e7e6dbe0030..0466a94ea6b5c 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c @@ -62,6 +62,7 @@ #define SPI_SR_TFIWF BIT(18) #define SPI_SR_RFDF BIT(17) #define SPI_SR_CMDFFF BIT(16) +#define SPI_SR_TXRXS BIT(30) #define SPI_SR_CLEAR (SPI_SR_TCFQF | \ SPI_SR_TFUF | SPI_SR_TFFF | \ SPI_SR_CMDTCF | SPI_SR_SPEF | \ @@ -921,9 +922,20 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr, struct spi_transfer *transfer; bool cs = false; int status = 0; + u32 val = 0; + bool cs_change = false; message->actual_length = 0; + /* Put DSPI in running mode if halted. */ + regmap_read(dspi->regmap, SPI_MCR, &val); + if (val & SPI_MCR_HALT) { + regmap_update_bits(dspi->regmap, SPI_MCR, SPI_MCR_HALT, 0); + while (regmap_read(dspi->regmap, SPI_SR, &val) >= 0 && + !(val & SPI_SR_TXRXS)) + ; + } + list_for_each_entry(transfer, &message->transfers, transfer_list) { dspi->cur_transfer = transfer; dspi->cur_msg = message; @@ -953,6 +965,7 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr, dspi->tx_cmd |= SPI_PUSHR_CMD_CONT; } + cs_change = transfer->cs_change; dspi->tx = transfer->tx_buf; dspi->rx = transfer->rx_buf; dspi->len = transfer->len; @@ -988,6 +1001,15 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr, dspi_deassert_cs(spi, &cs); } + if (status || !cs_change) { + /* Put DSPI in stop mode */ + regmap_update_bits(dspi->regmap, SPI_MCR, + SPI_MCR_HALT, SPI_MCR_HALT); + while (regmap_read(dspi->regmap, SPI_SR, &val) >= 0 && + val & SPI_SR_TXRXS) + ; + } + message->status = status; spi_finalize_current_message(ctlr); @@ -1245,6 +1267,8 @@ static int dspi_init(struct fsl_dspi *dspi) if (!spi_controller_is_target(dspi->ctlr)) mcr |= SPI_MCR_HOST; + mcr |= SPI_MCR_HALT; + regmap_write(dspi->regmap, SPI_MCR, mcr); regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR); -- GitLab From 96537d8c67e5e5025221c7f397bddb7ee927d66c Mon Sep 17 00:00:00 2001 From: Larisa Grigore Date: Thu, 22 May 2025 15:51:32 +0100 Subject: [PATCH 0609/2211] spi: spi-fsl-dspi: Reset SR flags before sending a new message [ Upstream commit 7aba292eb15389073c7f3bd7847e3862dfdf604d ] If, in a previous transfer, the controller sends more data than expected by the DSPI target, SR.RFDF (RX FIFO is not empty) will remain asserted. When flushing the FIFOs at the beginning of a new transfer (writing 1 into MCR.CLR_TXF and MCR.CLR_RXF), SR.RFDF should also be cleared. Otherwise, when running in target mode with DMA, if SR.RFDF remains asserted, the DMA callback will be fired before the controller sends any data. Take this opportunity to reset all Status Register fields. Fixes: 5ce3cc567471 ("spi: spi-fsl-dspi: Provide support for DSPI slave mode operation (Vybryd vf610)") Signed-off-by: Larisa Grigore Signed-off-by: James Clark Link: https://patch.msgid.link/20250522-james-nxp-spi-v2-3-bea884630cfb@linaro.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-fsl-dspi.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 0466a94ea6b5c..7c43df252328d 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c @@ -975,6 +975,8 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr, SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF, SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF); + regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR); + spi_take_timestamp_pre(dspi->ctlr, dspi->cur_transfer, dspi->progress, !dspi->irq); -- GitLab From d28b0305f711e5b1f30812e4d62169835f481e6b Mon Sep 17 00:00:00 2001 From: Raag Jadav Date: Wed, 12 Feb 2025 11:55:02 +0530 Subject: [PATCH 0610/2211] err.h: move IOMEM_ERR_PTR() to err.h commit 18311a766c587fc69b1806f1d5943305903b7e6e upstream. Since IOMEM_ERR_PTR() macro deals with an error pointer, a better place for it is err.h. This helps avoid dependency on io.h for the users that don't need it. Suggested-by: Andy Shevchenko Signed-off-by: Raag Jadav Acked-by: Arnd Bergmann Signed-off-by: Andy Shevchenko Signed-off-by: Greg Kroah-Hartman --- include/linux/err.h | 3 +++ include/linux/io.h | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/linux/err.h b/include/linux/err.h index a4dacd745fcf4..1d60aa86db53b 100644 --- a/include/linux/err.h +++ b/include/linux/err.h @@ -44,6 +44,9 @@ static inline void * __must_check ERR_PTR(long error) /* Return the pointer in the percpu address space. */ #define ERR_PTR_PCPU(error) ((void __percpu *)(unsigned long)ERR_PTR(error)) +/* Cast an error pointer to __iomem. */ +#define IOMEM_ERR_PTR(error) (__force void __iomem *)ERR_PTR(error) + /** * PTR_ERR - Extract the error code from an error pointer. * @ptr: An error pointer. diff --git a/include/linux/io.h b/include/linux/io.h index 59ec5eea696c4..40cb2de73f5ec 100644 --- a/include/linux/io.h +++ b/include/linux/io.h @@ -65,8 +65,6 @@ static inline void devm_ioport_unmap(struct device *dev, void __iomem *addr) } #endif -#define IOMEM_ERR_PTR(err) (__force void __iomem *)ERR_PTR(err) - void __iomem *devm_ioremap(struct device *dev, resource_size_t offset, resource_size_t size); void __iomem *devm_ioremap_uc(struct device *dev, resource_size_t offset, -- GitLab From 9f58537e9b8f07d56aca68308dc73db60fbc7ad3 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sun, 20 Apr 2025 10:33:23 -0700 Subject: [PATCH 0611/2211] gcc-15: make 'unterminated string initialization' just a warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit d5d45a7f26194460964eb5677a9226697f7b7fdd upstream. gcc-15 enabling -Wunterminated-string-initialization in -Wextra by default was done with the best intentions, but the warning is still quite broken. What annoys me about the warning is that this is a very traditional AND CORRECT way to initialize fixed byte arrays in C: unsigned char hex[16] = "0123456789abcdef"; and we use this all over the kernel. And the warning is fine, but gcc developers apparently never made a reasonable way to disable it. As is (sadly) tradition with these things. Yes, there's "__attribute__((nonstring))", and we have a macro to make that absolutely disgusting syntax more palatable (ie the kernel syntax for that monstrosity is just "__nonstring"). But that attribute is misdesigned. What you'd typically want to do is tell the compiler that you are using a type that isn't a string but a byte array, but that doesn't work at all: warning: ‘nonstring’ attribute does not apply to types [-Wattributes] and because of this fundamental mis-design, you then have to mark each instance of that pattern. This is particularly noticeable in our ACPI code, because ACPI has this notion of a 4-byte "type name" that gets used all over, and is exactly this kind of byte array. This is a sad oversight, because the warning is useful, but really would be so much better if gcc had also given a sane way to indicate that we really just want a byte array type at a type level, not the broken "each and every array definition" level. So now instead of creating a nice "ACPI name" type using something like typedef char acpi_name_t[4] __nonstring; we have to do things like char name[ACPI_NAMESEG_SIZE] __nonstring; in every place that uses this concept and then happens to have the typical initializers. This is annoying me mainly because I think the warning _is_ a good warning, which is why I'm not just turning it off in disgust. But it is hampered by this bad implementation detail. [ And obviously I'm doing this now because system upgrades for me are something that happen in the middle of the release cycle: don't do it before or during travel, or just before or during the busy merge window period. ] Signed-off-by: Linus Torvalds Signed-off-by: Nathan Chancellor Signed-off-by: Greg Kroah-Hartman --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 6e8afa78bbef6..74dc1572a2000 100644 --- a/Makefile +++ b/Makefile @@ -1001,6 +1001,9 @@ KBUILD_CFLAGS += $(call cc-option, -fstrict-flex-arrays=3) KBUILD_CFLAGS-$(CONFIG_CC_NO_STRINGOP_OVERFLOW) += $(call cc-option, -Wno-stringop-overflow) KBUILD_CFLAGS-$(CONFIG_CC_STRINGOP_OVERFLOW) += $(call cc-option, -Wstringop-overflow) +#Currently, disable -Wunterminated-string-initialization as an error +KBUILD_CFLAGS += $(call cc-option, -Wno-error=unterminated-string-initialization) + # disable invalid "can't wrap" optimizations for signed / pointers KBUILD_CFLAGS += -fno-strict-overflow -- GitLab From d66cf772bebd789448121cdfc42734fb042c9c4b Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sun, 20 Apr 2025 15:30:53 -0700 Subject: [PATCH 0612/2211] gcc-15: disable '-Wunterminated-string-initialization' entirely for now commit 9d7a0577c9db35c4cc52db90bc415ea248446472 upstream. From: Linus Torvalds I had left the warning around but as a non-fatal error to get my gcc-15 builds going, but fixed up some of the most annoying warning cases so that it wouldn't be *too* verbose. Because I like the _concept_ of the warning, even if I detested the implementation to shut it up. It turns out the implementation to shut it up is even more broken than I thought, and my "shut up most of the warnings" patch just caused fatal errors on gcc-14 instead. I had tested with clang, but when I upgrade my development environment, I try to do it on all machines because I hate having different systems to maintain, and hadn't realized that gcc-14 now had issues. The ACPI case is literally why I wanted to have a *type* that doesn't trigger the warning (see commit d5d45a7f2619: "gcc-15: make 'unterminated string initialization' just a warning"), instead of marking individual places as "__nonstring". But gcc-14 doesn't like that __nonstring location that shut gcc-15 up, because it's on an array of char arrays, not on one single array: drivers/acpi/tables.c:399:1: error: 'nonstring' attribute ignored on objects of type 'const char[][4]' [-Werror=attributes] 399 | static const char table_sigs[][ACPI_NAMESEG_SIZE] __initconst __nonstring = { | ^~~~~~ and my attempts to nest it properly with a type had failed, because of how gcc doesn't like marking the types as having attributes, only symbols. There may be some trick to it, but I was already annoyed by the bad attribute design, now I'm just entirely fed up with it. I wish gcc had a proper way to say "this type is a *byte* array, not a string". The obvious thing would be to distinguish between "char []" and an explicitly signed "unsigned char []" (as opposed to an implicitly unsigned char, which is typically an architecture-specific default, but for the kernel is universal thanks to '-funsigned-char'). But any "we can typedef a 8-bit type to not become a string just because it's an array" model would be fine. But "__attribute__((nonstring))" is sadly not that sane model. Reported-by: Chris Clayton Fixes: 4b4bd8c50f48 ("gcc-15: acpi: sprinkle random '__nonstring' crumbles around") Fixes: d5d45a7f2619 ("gcc-15: make 'unterminated string initialization' just a warning") Signed-off-by: Linus Torvalds [nathan: drivers/acpi diff dropped due to lack of 4b4bd8c50f48 in stable] Signed-off-by: Nathan Chancellor Signed-off-by: Greg Kroah-Hartman --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 74dc1572a2000..6579a7cae11d0 100644 --- a/Makefile +++ b/Makefile @@ -1001,8 +1001,8 @@ KBUILD_CFLAGS += $(call cc-option, -fstrict-flex-arrays=3) KBUILD_CFLAGS-$(CONFIG_CC_NO_STRINGOP_OVERFLOW) += $(call cc-option, -Wno-stringop-overflow) KBUILD_CFLAGS-$(CONFIG_CC_STRINGOP_OVERFLOW) += $(call cc-option, -Wstringop-overflow) -#Currently, disable -Wunterminated-string-initialization as an error -KBUILD_CFLAGS += $(call cc-option, -Wno-error=unterminated-string-initialization) +#Currently, disable -Wunterminated-string-initialization as broken +KBUILD_CFLAGS += $(call cc-option, -Wno-unterminated-string-initialization) # disable invalid "can't wrap" optimizations for signed / pointers KBUILD_CFLAGS += -fno-strict-overflow -- GitLab From 3f856d5d84467c7fba0bf3cca405089c497e37eb Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Wed, 23 Apr 2025 10:08:29 -0700 Subject: [PATCH 0613/2211] Fix mis-uses of 'cc-option' for warning disablement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit a79be02bba5c31f967885c7f3bf3a756d77d11d9 upstream. This was triggered by one of my mis-uses causing odd build warnings on sparc in linux-next, but while figuring out why the "obviously correct" use of cc-option caused such odd breakage, I found eight other cases of the same thing in the tree. The root cause is that 'cc-option' doesn't work for checking negative warning options (ie things like '-Wno-stringop-overflow') because gcc will silently accept options it doesn't recognize, and so 'cc-option' ends up thinking they are perfectly fine. And it all works, until you have a situation where _another_ warning is emitted. At that point the compiler will go "Hmm, maybe the user intended to disable this warning but used that wrong option that I didn't recognize", and generate a warning for the unrecognized negative option. Which explains why we have several cases of this in the tree: the 'cc-option' test really doesn't work for this situation, but most of the time it simply doesn't matter that ity doesn't work. The reason my recently added case caused problems on sparc was pointed out by Thomas Weißschuh: the sparc build had a previous explicit warning that then triggered the new one. I think the best fix for this would be to make 'cc-option' a bit smarter about this sitation, possibly by adding an intentional warning to the test case that then triggers the unrecognized option warning reliably. But the short-term fix is to replace 'cc-option' with an existing helper designed for this exact case: 'cc-disable-warning', which picks the negative warning but uses the positive form for testing the compiler support. Reported-by: Stephen Rothwell Link: https://lore.kernel.org/all/20250422204718.0b4e3f81@canb.auug.org.au/ Explained-by: Thomas Weißschuh Signed-off-by: Linus Torvalds Signed-off-by: Nathan Chancellor Signed-off-by: Greg Kroah-Hartman --- Makefile | 4 ++-- arch/loongarch/kernel/Makefile | 8 ++++---- arch/loongarch/kvm/Makefile | 2 +- arch/riscv/kernel/Makefile | 4 ++-- scripts/Makefile.extrawarn | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 6579a7cae11d0..7f4436415bf44 100644 --- a/Makefile +++ b/Makefile @@ -998,11 +998,11 @@ NOSTDINC_FLAGS += -nostdinc KBUILD_CFLAGS += $(call cc-option, -fstrict-flex-arrays=3) #Currently, disable -Wstringop-overflow for GCC 11, globally. -KBUILD_CFLAGS-$(CONFIG_CC_NO_STRINGOP_OVERFLOW) += $(call cc-option, -Wno-stringop-overflow) +KBUILD_CFLAGS-$(CONFIG_CC_NO_STRINGOP_OVERFLOW) += $(call cc-disable-warning, stringop-overflow) KBUILD_CFLAGS-$(CONFIG_CC_STRINGOP_OVERFLOW) += $(call cc-option, -Wstringop-overflow) #Currently, disable -Wunterminated-string-initialization as broken -KBUILD_CFLAGS += $(call cc-option, -Wno-unterminated-string-initialization) +KBUILD_CFLAGS += $(call cc-disable-warning, unterminated-string-initialization) # disable invalid "can't wrap" optimizations for signed / pointers KBUILD_CFLAGS += -fno-strict-overflow diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile index c9bfeda89e407..66132683f1ed5 100644 --- a/arch/loongarch/kernel/Makefile +++ b/arch/loongarch/kernel/Makefile @@ -21,10 +21,10 @@ obj-$(CONFIG_CPU_HAS_LBT) += lbt.o obj-$(CONFIG_ARCH_STRICT_ALIGN) += unaligned.o -CFLAGS_module.o += $(call cc-option,-Wno-override-init,) -CFLAGS_syscall.o += $(call cc-option,-Wno-override-init,) -CFLAGS_traps.o += $(call cc-option,-Wno-override-init,) -CFLAGS_perf_event.o += $(call cc-option,-Wno-override-init,) +CFLAGS_module.o += $(call cc-disable-warning, override-init) +CFLAGS_syscall.o += $(call cc-disable-warning, override-init) +CFLAGS_traps.o += $(call cc-disable-warning, override-init) +CFLAGS_perf_event.o += $(call cc-disable-warning, override-init) ifdef CONFIG_FUNCTION_TRACER ifndef CONFIG_DYNAMIC_FTRACE diff --git a/arch/loongarch/kvm/Makefile b/arch/loongarch/kvm/Makefile index b2f4cbe01ae80..2e188e8f14687 100644 --- a/arch/loongarch/kvm/Makefile +++ b/arch/loongarch/kvm/Makefile @@ -19,4 +19,4 @@ kvm-y += tlb.o kvm-y += vcpu.o kvm-y += vm.o -CFLAGS_exit.o += $(call cc-option,-Wno-override-init,) +CFLAGS_exit.o += $(call cc-disable-warning, override-init) diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile index 69dc8aaab3fb3..6b3b5255c8892 100644 --- a/arch/riscv/kernel/Makefile +++ b/arch/riscv/kernel/Makefile @@ -9,8 +9,8 @@ CFLAGS_REMOVE_patch.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_return_address.o = $(CC_FLAGS_FTRACE) endif -CFLAGS_syscall_table.o += $(call cc-option,-Wno-override-init,) -CFLAGS_compat_syscall_table.o += $(call cc-option,-Wno-override-init,) +CFLAGS_syscall_table.o += $(call cc-disable-warning, override-init) +CFLAGS_compat_syscall_table.o += $(call cc-disable-warning, override-init) ifdef CONFIG_KEXEC_CORE AFLAGS_kexec_relocate.o := -mcmodel=medany $(call cc-option,-mno-relax) diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn index 686197407c3c6..32dcf9eb4fa88 100644 --- a/scripts/Makefile.extrawarn +++ b/scripts/Makefile.extrawarn @@ -15,7 +15,7 @@ KBUILD_CFLAGS += -Werror=return-type KBUILD_CFLAGS += -Werror=strict-prototypes KBUILD_CFLAGS += -Wno-format-security KBUILD_CFLAGS += -Wno-trigraphs -KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,) +KBUILD_CFLAGS += $(call cc-disable-warning, frame-address) KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member) KBUILD_CFLAGS += -Wmissing-declarations KBUILD_CFLAGS += -Wmissing-prototypes -- GitLab From dd8a734155ae28094d27b96c00a478fa0ee6d5d7 Mon Sep 17 00:00:00 2001 From: Nathan Chancellor Date: Wed, 30 Apr 2025 15:56:34 -0700 Subject: [PATCH 0614/2211] kbuild: Properly disable -Wunterminated-string-initialization for clang MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 4f79eaa2ceac86a0e0f304b0bab556cca5bf4f30 upstream. Clang and GCC have different behaviors around disabling warnings included in -Wall and -Wextra and the order in which flags are specified, which is exposed by clang's new support for -Wunterminated-string-initialization. $ cat test.c const char foo[3] = "FOO"; const char bar[3] __attribute__((__nonstring__)) = "BAR"; $ clang -fsyntax-only -Wextra test.c test.c:1:21: warning: initializer-string for character array is too long, array size is 3 but initializer has size 4 (including the null terminating character); did you mean to use the 'nonstring' attribute? [-Wunterminated-string-initialization] 1 | const char foo[3] = "FOO"; | ^~~~~ $ clang -fsyntax-only -Wextra -Wno-unterminated-string-initialization test.c $ clang -fsyntax-only -Wno-unterminated-string-initialization -Wextra test.c test.c:1:21: warning: initializer-string for character array is too long, array size is 3 but initializer has size 4 (including the null terminating character); did you mean to use the 'nonstring' attribute? [-Wunterminated-string-initialization] 1 | const char foo[3] = "FOO"; | ^~~~~ $ gcc -fsyntax-only -Wextra test.c test.c:1:21: warning: initializer-string for array of ‘char’ truncates NUL terminator but destination lacks ‘nonstring’ attribute (4 chars into 3 available) [-Wunterminated-string-initialization] 1 | const char foo[3] = "FOO"; | ^~~~~ $ gcc -fsyntax-only -Wextra -Wno-unterminated-string-initialization test.c $ gcc -fsyntax-only -Wno-unterminated-string-initialization -Wextra test.c Move -Wextra up right below -Wall in Makefile.extrawarn to ensure these flags are at the beginning of the warning options list. Move the couple of warning options that have been added to the main Makefile since commit e88ca24319e4 ("kbuild: consolidate warning flags in scripts/Makefile.extrawarn") to scripts/Makefile.extrawarn after -Wall / -Wextra to ensure they get properly disabled for all compilers. Fixes: 9d7a0577c9db ("gcc-15: disable '-Wunterminated-string-initialization' entirely for now") Link: https://github.com/llvm/llvm-project/issues/10359 Signed-off-by: Nathan Chancellor Signed-off-by: Linus Torvalds Signed-off-by: Nathan Chancellor Signed-off-by: Greg Kroah-Hartman --- Makefile | 7 ------- scripts/Makefile.extrawarn | 9 ++++++++- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 7f4436415bf44..551d7556e88ab 100644 --- a/Makefile +++ b/Makefile @@ -997,13 +997,6 @@ NOSTDINC_FLAGS += -nostdinc # perform bounds checking. KBUILD_CFLAGS += $(call cc-option, -fstrict-flex-arrays=3) -#Currently, disable -Wstringop-overflow for GCC 11, globally. -KBUILD_CFLAGS-$(CONFIG_CC_NO_STRINGOP_OVERFLOW) += $(call cc-disable-warning, stringop-overflow) -KBUILD_CFLAGS-$(CONFIG_CC_STRINGOP_OVERFLOW) += $(call cc-option, -Wstringop-overflow) - -#Currently, disable -Wunterminated-string-initialization as broken -KBUILD_CFLAGS += $(call cc-disable-warning, unterminated-string-initialization) - # disable invalid "can't wrap" optimizations for signed / pointers KBUILD_CFLAGS += -fno-strict-overflow diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn index 32dcf9eb4fa88..5652d90352320 100644 --- a/scripts/Makefile.extrawarn +++ b/scripts/Makefile.extrawarn @@ -8,6 +8,7 @@ # Default set of warnings, always enabled KBUILD_CFLAGS += -Wall +KBUILD_CFLAGS += -Wextra KBUILD_CFLAGS += -Wundef KBUILD_CFLAGS += -Werror=implicit-function-declaration KBUILD_CFLAGS += -Werror=implicit-int @@ -68,6 +69,13 @@ KBUILD_CFLAGS += -Wno-pointer-sign # globally built with -Wcast-function-type. KBUILD_CFLAGS += $(call cc-option, -Wcast-function-type) +# Currently, disable -Wstringop-overflow for GCC 11, globally. +KBUILD_CFLAGS-$(CONFIG_CC_NO_STRINGOP_OVERFLOW) += $(call cc-disable-warning, stringop-overflow) +KBUILD_CFLAGS-$(CONFIG_CC_STRINGOP_OVERFLOW) += $(call cc-option, -Wstringop-overflow) + +# Currently, disable -Wunterminated-string-initialization as broken +KBUILD_CFLAGS += $(call cc-disable-warning, unterminated-string-initialization) + # The allocators already balk at large sizes, so silence the compiler # warnings for bounds checks involving those possible values. While # -Wno-alloc-size-larger-than would normally be used here, earlier versions @@ -97,7 +105,6 @@ KBUILD_CFLAGS += $(call cc-option,-Wenum-conversion) # Explicitly clear padding bits during variable initialization KBUILD_CFLAGS += $(call cc-option,-fzero-init-padding-bits=all) -KBUILD_CFLAGS += -Wextra KBUILD_CFLAGS += -Wunused # -- GitLab From fdee1dc816b4c50c04c34cb8dec5f704e7e75189 Mon Sep 17 00:00:00 2001 From: Ovidiu Bunea Date: Mon, 3 Feb 2025 15:43:32 -0500 Subject: [PATCH 0615/2211] drm/amd/display: Exit idle optimizations before accessing PHY commit c488967488d7eff7b9c527d5469c424c15377502 upstream. [why & how] By default, DCN HW is in idle optimized state which does not allow access to PHY registers. If BIOS powers up the DCN, it is fine because they will power up everything. Only exit idle optimized state when not taking control from VBIOS. Fixes: be704e5ef4bd ("Revert "drm/amd/display: Exit idle optimizations before attempt to access PHY"") Reviewed-by: Charlene Liu Signed-off-by: Ovidiu Bunea Signed-off-by: Roman Li Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c index ccdc9d4101863..59457ca24e1dc 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c @@ -1888,6 +1888,7 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context) bool can_apply_edp_fast_boot = false; bool can_apply_seamless_boot = false; bool keep_edp_vdd_on = false; + struct dc_bios *dcb = dc->ctx->dc_bios; DC_LOGGER_INIT(); @@ -1964,6 +1965,8 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context) hws->funcs.edp_backlight_control(edp_link_with_sink, false); } /*resume from S3, no vbios posting, no need to power down again*/ + if (dcb && dcb->funcs && !dcb->funcs->is_accelerated_mode(dcb)) + clk_mgr_exit_optimized_pwr_state(dc, dc->clk_mgr); power_down_all_hw_blocks(dc); @@ -1976,6 +1979,8 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context) disable_vga_and_power_gate_all_controllers(dc); if (edp_link_with_sink && !keep_edp_vdd_on) dc->hwss.edp_power_control(edp_link_with_sink, false); + if (dcb && dcb->funcs && !dcb->funcs->is_accelerated_mode(dcb)) + clk_mgr_optimize_pwr_state(dc, dc->clk_mgr); } bios_set_scratch_acc_mode_change(dc->ctx->dc_bios, 1); } -- GitLab From 80eb73778debad263e53843cad276dfe92924f66 Mon Sep 17 00:00:00 2001 From: Eduard Zingerman Date: Mon, 24 Feb 2025 16:38:38 -0800 Subject: [PATCH 0616/2211] bpf: abort verification if env->cur_state->loop_entry != NULL commit f3c2d243a36ef23be07bc2bce7c6a5cb6e07d9e3 upstream. In addition to warning abort verification with -EFAULT. If env->cur_state->loop_entry != NULL something is irrecoverably buggy. Fixes: bbbc02b7445e ("bpf: copy_verifier_state() should copy 'loop_entry' field") Suggested-by: Andrii Nakryiko Signed-off-by: Eduard Zingerman Acked-by: Andrii Nakryiko Link: https://lore.kernel.org/r/20250225003838.135319-1-eddyz87@gmail.com Signed-off-by: Alexei Starovoitov Signed-off-by: Greg Kroah-Hartman --- kernel/bpf/verifier.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 1437108f9d7af..39a3d750f2ff9 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -18721,8 +18721,10 @@ process_bpf_exit: return err; break; } else { - if (WARN_ON_ONCE(env->cur_state->loop_entry)) - env->cur_state->loop_entry = NULL; + if (WARN_ON_ONCE(env->cur_state->loop_entry)) { + verbose(env, "verifier bug: env->cur_state->loop_entry != NULL\n"); + return -EFAULT; + } do_print_state = true; continue; } -- GitLab From a8a34fbf915dd5c472ada04e7c969da65f7d693a Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Tue, 4 Mar 2025 20:06:11 +0100 Subject: [PATCH 0617/2211] serial: sh-sci: Save and restore more registers commit 81100b9a7b0515132996d62a7a676a77676cb6e3 upstream. On (H)SCIF with a Baud Rate Generator for External Clock (BRG), there are multiple ways to configure the requested serial speed. If firmware uses a different method than Linux, and if any debug info is printed after the Bit Rate Register (SCBRR) is restored, but before termios is reconfigured (which configures the alternative method), the system may lock-up during resume. Fix this by saving and restoring the contents of the BRG Frequency Division (SCDL) and Clock Select (SCCKS) registers as well. Also save and restore the HSCIF's Sampling Rate Register (HSSRR), which configures the sampling point, and the SCIFA/SCIFB's Serial Port Control and Data Registers (SCPCR/SCPDR), which configure the optional control flow signals. After this, all registers that are not saved/restored are either: - read-only, - write-only, - status registers containing flags with clear-after-set semantics, - FIFO Data Count Trigger registers, which do not matter much for the serial console. Fixes: 22a6984c5b5df8ea ("serial: sh-sci: Update the suspend/resume support") Signed-off-by: Geert Uytterhoeven Tested-by: Claudiu Beznea Reviewed-by: Claudiu Beznea Link: https://lore.kernel.org/r/11c2eab45d48211e75d8b8202cce60400880fe55.1741114989.git.geert+renesas@glider.be Signed-off-by: Greg Kroah-Hartman Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/sh-sci.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 779074b1c2be4..76cf177b040eb 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -105,10 +105,15 @@ struct plat_sci_reg { }; struct sci_suspend_regs { + u16 scdl; + u16 sccks; u16 scsmr; u16 scscr; u16 scfcr; u16 scsptr; + u16 hssrr; + u16 scpcr; + u16 scpdr; u8 scbrr; u8 semr; }; @@ -3550,6 +3555,10 @@ static void sci_console_save(struct sci_port *s) struct sci_suspend_regs *regs = &s->suspend_regs; struct uart_port *port = &s->port; + if (sci_getreg(port, SCDL)->size) + regs->scdl = sci_serial_in(port, SCDL); + if (sci_getreg(port, SCCKS)->size) + regs->sccks = sci_serial_in(port, SCCKS); if (sci_getreg(port, SCSMR)->size) regs->scsmr = sci_serial_in(port, SCSMR); if (sci_getreg(port, SCSCR)->size) @@ -3560,6 +3569,12 @@ static void sci_console_save(struct sci_port *s) regs->scsptr = sci_serial_in(port, SCSPTR); if (sci_getreg(port, SCBRR)->size) regs->scbrr = sci_serial_in(port, SCBRR); + if (sci_getreg(port, HSSRR)->size) + regs->hssrr = sci_serial_in(port, HSSRR); + if (sci_getreg(port, SCPCR)->size) + regs->scpcr = sci_serial_in(port, SCPCR); + if (sci_getreg(port, SCPDR)->size) + regs->scpdr = sci_serial_in(port, SCPDR); if (sci_getreg(port, SEMR)->size) regs->semr = sci_serial_in(port, SEMR); } @@ -3569,6 +3584,10 @@ static void sci_console_restore(struct sci_port *s) struct sci_suspend_regs *regs = &s->suspend_regs; struct uart_port *port = &s->port; + if (sci_getreg(port, SCDL)->size) + sci_serial_out(port, SCDL, regs->scdl); + if (sci_getreg(port, SCCKS)->size) + sci_serial_out(port, SCCKS, regs->sccks); if (sci_getreg(port, SCSMR)->size) sci_serial_out(port, SCSMR, regs->scsmr); if (sci_getreg(port, SCSCR)->size) @@ -3579,6 +3598,12 @@ static void sci_console_restore(struct sci_port *s) sci_serial_out(port, SCSPTR, regs->scsptr); if (sci_getreg(port, SCBRR)->size) sci_serial_out(port, SCBRR, regs->scbrr); + if (sci_getreg(port, HSSRR)->size) + sci_serial_out(port, HSSRR, regs->hssrr); + if (sci_getreg(port, SCPCR)->size) + sci_serial_out(port, SCPCR, regs->scpcr); + if (sci_getreg(port, SCPDR)->size) + sci_serial_out(port, SCPDR, regs->scpdr); if (sci_getreg(port, SEMR)->size) sci_serial_out(port, SEMR, regs->semr); } -- GitLab From c3e1091eb054cf62ed19b60df7abde03bbbffaae Mon Sep 17 00:00:00 2001 From: Amber Lin Date: Wed, 12 Mar 2025 21:14:43 -0400 Subject: [PATCH 0618/2211] drm/amdkfd: Correct F8_MODE for gfx950 commit 0c7e053448945e5a4379dc4396c762d7422b11ca upstream. Correct F8_MODE setting for gfx950 that was removed Fixes: 61972cd93af7 ("drm/amdkfd: Set per-process flags only once for gfx9/10/11/12") Signed-off-by: Amber Lin Reviewed-by: Harish Kasiviswanathan Signed-off-by: Alex Deucher Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c index 3264509408bc8..d85eadaa1e11b 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c @@ -69,8 +69,7 @@ static bool set_cache_memory_policy_v9(struct device_queue_manager *dqm, qpd->sh_mem_config |= 1 << SH_MEM_CONFIG__RETRY_DISABLE__SHIFT; if (KFD_GC_VERSION(dqm->dev->kfd) == IP_VERSION(9, 4, 3) || - KFD_GC_VERSION(dqm->dev->kfd) == IP_VERSION(9, 4, 4) || - KFD_GC_VERSION(dqm->dev->kfd) == IP_VERSION(9, 5, 0)) + KFD_GC_VERSION(dqm->dev->kfd) == IP_VERSION(9, 4, 4)) qpd->sh_mem_config |= (1 << SH_MEM_CONFIG__F8_MODE__SHIFT); qpd->sh_mem_ape1_limit = 0; -- GitLab From ecb9d3123bef7307a5ad16d05ce65fe9d9cf8afb Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Fri, 14 Mar 2025 17:02:44 +0100 Subject: [PATCH 0619/2211] watchdog: aspeed: fix 64-bit division commit 48a136639ec233614a61653e19f559977d5da2b5 upstream. On 32-bit architectures, the new calculation causes a build failure: ld.lld-21: error: undefined symbol: __aeabi_uldivmod Since neither value is ever larger than a register, cast both sides into a uintptr_t. Fixes: 5c03f9f4d362 ("watchdog: aspeed: Update bootstatus handling") Signed-off-by: Arnd Bergmann Reviewed-by: Guenter Roeck Link: https://lore.kernel.org/r/20250314160248.502324-1-arnd@kernel.org Signed-off-by: Guenter Roeck Signed-off-by: Wim Van Sebroeck Signed-off-by: Greg Kroah-Hartman --- drivers/watchdog/aspeed_wdt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/watchdog/aspeed_wdt.c b/drivers/watchdog/aspeed_wdt.c index 369635b38ca0e..837e15701c0e2 100644 --- a/drivers/watchdog/aspeed_wdt.c +++ b/drivers/watchdog/aspeed_wdt.c @@ -254,7 +254,7 @@ static void aspeed_wdt_update_bootstatus(struct platform_device *pdev, if (!of_device_is_compatible(pdev->dev.of_node, "aspeed,ast2400-wdt")) { res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - idx = ((intptr_t)wdt->base & 0x00000fff) / resource_size(res); + idx = ((intptr_t)wdt->base & 0x00000fff) / (uintptr_t)resource_size(res); } scu_base = syscon_regmap_lookup_by_compatible(scu.compatible); -- GitLab From 73c4707510f27f61b62303923814f624583bedff Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Wed, 19 Mar 2025 10:05:47 +0300 Subject: [PATCH 0620/2211] pinctrl: tegra: Fix off by one in tegra_pinctrl_get_group() commit 5a062c3c3b82004766bc3ece82b594d337076152 upstream. This should be >= pmx->soc->ngroups instead of > to avoid an out of bounds access. The pmx->soc->groups[] array is allocated in tegra_pinctrl_probe(). Fixes: c12bfa0fee65 ("pinctrl-tegra: Restore SFSEL bit when freeing pins") Signed-off-by: Dan Carpenter Reviewed-by: Kunwu Chan Link: https://lore.kernel.org/82b40d9d-b437-42a9-9eb3-2328aa6877ac@stanley.mountain Signed-off-by: Linus Walleij Signed-off-by: Greg Kroah-Hartman --- drivers/pinctrl/tegra/pinctrl-tegra.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pinctrl/tegra/pinctrl-tegra.c b/drivers/pinctrl/tegra/pinctrl-tegra.c index 27823e4207347..edcc78ebce456 100644 --- a/drivers/pinctrl/tegra/pinctrl-tegra.c +++ b/drivers/pinctrl/tegra/pinctrl-tegra.c @@ -305,7 +305,7 @@ static const struct tegra_pingroup *tegra_pinctrl_get_group(struct pinctrl_dev * { struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); - if (group_index < 0 || group_index > pmx->soc->ngroups) + if (group_index < 0 || group_index >= pmx->soc->ngroups) return NULL; return &pmx->soc->groups[group_index]; -- GitLab From ae0d63ec390534606733cd63ef6d0484a04efd92 Mon Sep 17 00:00:00 2001 From: Nathan Chancellor Date: Wed, 19 Mar 2025 09:08:01 -0700 Subject: [PATCH 0621/2211] i3c: master: svc: Fix implicit fallthrough in svc_i3c_master_ibi_work() commit e8d2d287e26d9bd9114cf258a123a6b70812442e upstream. Clang warns (or errors with CONFIG_WERROR=y): drivers/i3c/master/svc-i3c-master.c:596:2: error: unannotated fall-through between switch labels [-Werror,-Wimplicit-fallthrough] 596 | default: | ^ drivers/i3c/master/svc-i3c-master.c:596:2: note: insert 'break;' to avoid fall-through 596 | default: | ^ | break; 1 error generated. Clang is a little more pedantic than GCC, which does not warn when falling through to a case that is just break or return. Clang's version is more in line with the kernel's own stance in deprecated.rst, which states that all switch/case blocks must end in either break, fallthrough, continue, goto, or return. Add the missing break to silence the warning. Fixes: 0430bf9bc1ac ("i3c: master: svc: Fix missing STOP for master request") Signed-off-by: Nathan Chancellor Link: https://lore.kernel.org/r/20250319-i3c-fix-clang-fallthrough-v1-1-d8e02be1ef5c@kernel.org Signed-off-by: Alexandre Belloni Signed-off-by: Greg Kroah-Hartman --- drivers/i3c/master/svc-i3c-master.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c index 62913feae45dd..474a96ebda226 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -512,6 +512,7 @@ static void svc_i3c_master_ibi_work(struct work_struct *work) break; case SVC_I3C_MSTATUS_IBITYPE_MASTER_REQUEST: svc_i3c_master_emit_stop(master); + break; default: break; } -- GitLab From ee2a06bbbb8a01e40abaf1f0e1d49aaf78a55c9e Mon Sep 17 00:00:00 2001 From: Balbir Singh Date: Tue, 1 Apr 2025 11:07:52 +1100 Subject: [PATCH 0622/2211] x86/mm/init: Handle the special case of device private pages in add_pages(), to not increase max_pfn and trigger dma_addressing_limited() bounce buffers bounce buffers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 7170130e4c72ce0caa0cb42a1627c635cc262821 upstream. As Bert Karwatzki reported, the following recent commit causes a performance regression on AMD iGPU and dGPU systems: 7ffb791423c7 ("x86/kaslr: Reduce KASLR entropy on most x86 systems") It exposed a bug with nokaslr and zone device interaction. The root cause of the bug is that, the GPU driver registers a zone device private memory region. When KASLR is disabled or the above commit is applied, the direct_map_physmem_end is set to much higher than 10 TiB typically to the 64TiB address. When zone device private memory is added to the system via add_pages(), it bumps up the max_pfn to the same value. This causes dma_addressing_limited() to return true, since the device cannot address memory all the way up to max_pfn. This caused a regression for games played on the iGPU, as it resulted in the DMA32 zone being used for GPU allocations. Fix this by not bumping up max_pfn on x86 systems, when pgmap is passed into add_pages(). The presence of pgmap is used to determine if device private memory is being added via add_pages(). More details: devm_request_mem_region() and request_free_mem_region() request for device private memory. iomem_resource is passed as the base resource with start and end parameters. iomem_resource's end depends on several factors, including the platform and virtualization. On x86 for example on bare metal, this value is set to boot_cpu_data.x86_phys_bits. boot_cpu_data.x86_phys_bits can change depending on support for MKTME. By default it is set to the same as log2(direct_map_physmem_end) which is 46 to 52 bits depending on the number of levels in the page table. The allocation routines used iomem_resource's end and direct_map_physmem_end to figure out where to allocate the region. [ arch/powerpc is also impacted by this problem, but this patch does not fix the issue for PowerPC. ] Testing: 1. Tested on a virtual machine with test_hmm for zone device inseration 2. A previous version of this patch was tested by Bert, please see: https://lore.kernel.org/lkml/d87680bab997fdc9fb4e638983132af235d9a03a.camel@web.de/ [ mingo: Clarified the comments and the changelog. ] Reported-by: Bert Karwatzki Tested-by: Bert Karwatzki Fixes: 7ffb791423c7 ("x86/kaslr: Reduce KASLR entropy on most x86 systems") Signed-off-by: Balbir Singh Signed-off-by: Ingo Molnar Cc: Brian Gerst Cc: Juergen Gross Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Andrew Morton Cc: Christoph Hellwig Cc: Pierre-Eric Pelloux-Prayer Cc: Alex Deucher Cc: Christian König Cc: David Airlie Cc: Simona Vetter Link: https://lore.kernel.org/r/20250401000752.249348-1-balbirs@nvidia.com Signed-off-by: Greg Kroah-Hartman --- arch/x86/mm/init_64.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index ff253648706fa..d8853afd314b2 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -967,9 +967,18 @@ int add_pages(int nid, unsigned long start_pfn, unsigned long nr_pages, ret = __add_pages(nid, start_pfn, nr_pages, params); WARN_ON_ONCE(ret); - /* update max_pfn, max_low_pfn and high_memory */ - update_end_of_memory_vars(start_pfn << PAGE_SHIFT, - nr_pages << PAGE_SHIFT); + /* + * Special case: add_pages() is called by memremap_pages() for adding device + * private pages. Do not bump up max_pfn in the device private path, + * because max_pfn changes affect dma_addressing_limited(). + * + * dma_addressing_limited() returning true when max_pfn is the device's + * addressable memory can force device drivers to use bounce buffers + * and impact their performance negatively: + */ + if (!params->pgmap) + /* update max_pfn, max_low_pfn and high_memory */ + update_end_of_memory_vars(start_pfn << PAGE_SHIFT, nr_pages << PAGE_SHIFT); return ret; } -- GitLab From 85fb1edd059bf7ac3070ec98b64486fc54da3b65 Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Wed, 16 Apr 2025 08:57:45 +0200 Subject: [PATCH 0623/2211] drm/gem: Internally test import_attach for imported objects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 8260731ccad0451207b45844bb66eb161a209218 upstream. Test struct drm_gem_object.import_attach to detect imported objects. During object clenanup, the dma_buf field might be NULL. Testing it in an object's free callback then incorrectly does a cleanup as for native objects. Happens for calls to drm_mode_destroy_dumb_ioctl() that clears the dma_buf field in drm_gem_object_exported_dma_buf_free(). v3: - only test for import_attach (Boris) v2: - use import_attach.dmabuf instead of dma_buf (Christian) Signed-off-by: Thomas Zimmermann Fixes: b57aa47d39e9 ("drm/gem: Test for imported GEM buffers with helper") Reported-by: Andy Yan Closes: https://lore.kernel.org/dri-devel/38d09d34.4354.196379aa560.Coremail.andyshrk@163.com/ Tested-by: Andy Yan Cc: Thomas Zimmermann Cc: Anusha Srivatsa Cc: Christian König Cc: Maarten Lankhorst Cc: Maxime Ripard Cc: David Airlie Cc: Simona Vetter Cc: Sumit Semwal Cc: "Christian König" Cc: dri-devel@lists.freedesktop.org Cc: linux-media@vger.kernel.org Cc: linaro-mm-sig@lists.linaro.org Reviewed-by: Boris Brezillon Reviewed-by: Simona Vetter Link: https://lore.kernel.org/r/20250416065820.26076-1-tzimmermann@suse.de Signed-off-by: Greg Kroah-Hartman --- include/drm/drm_gem.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index 70c0f8c83629d..ff251745de18f 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -580,8 +580,7 @@ static inline bool drm_gem_object_is_shared_for_memory_stats(struct drm_gem_obje */ static inline bool drm_gem_is_imported(const struct drm_gem_object *obj) { - /* The dma-buf's priv field points to the original GEM object. */ - return obj->dma_buf && (obj->dma_buf->priv != obj); + return !!obj->import_attach; } #ifdef CONFIG_LOCKDEP -- GitLab From df3f6d10f353de274cc7c87f52dba5d26f185393 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 29 May 2025 11:03:27 +0200 Subject: [PATCH 0624/2211] Linux 6.12.31 Link: https://lore.kernel.org/r/20250527162445.028718347@linuxfoundation.org Tested-by: Florian Fainelli Tested-by: Shuah Khan Tested-by: Peter Schneider Tested-by: Miguel Ojeda Tested-by: Harshit Mogalapalli Tested-by: Salvatore Bonaccorso Tested-by: Ron Economos Tested-by: Linux Kernel Functional Testing Tested-by: Mark Brown Tested-by: Brett Mastbergen Tested-by: Markus Reichelt Signed-off-by: Greg Kroah-Hartman --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 551d7556e88ab..18c2a7cf9e913 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 12 -SUBLEVEL = 30 +SUBLEVEL = 31 EXTRAVERSION = NAME = Baby Opossum Posse -- GitLab From e3dfd77a7fca76c1982647d525e19e80a8a29a2a Mon Sep 17 00:00:00 2001 From: Axel Forsman Date: Tue, 20 May 2025 13:43:30 +0200 Subject: [PATCH 0625/2211] can: kvaser_pciefd: Force IRQ edge in case of nested IRQ commit 9176bd205ee0b2cd35073a9973c2a0936bcb579e upstream. Avoid the driver missing IRQs by temporarily masking IRQs in the ISR to enforce an edge even if a different IRQ is signalled before handled IRQs are cleared. Fixes: 48f827d4f48f ("can: kvaser_pciefd: Move reset of DMA RX buffers to the end of the ISR") Cc: stable@vger.kernel.org Signed-off-by: Axel Forsman Tested-by: Jimmy Assarsson Reviewed-by: Jimmy Assarsson Link: https://patch.msgid.link/20250520114332.8961-2-axfo@kvaser.com Signed-off-by: Marc Kleine-Budde Signed-off-by: Greg Kroah-Hartman --- drivers/net/can/kvaser_pciefd.c | 81 ++++++++++++++++----------------- 1 file changed, 38 insertions(+), 43 deletions(-) diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c index 020e5897812fe..3cf1007805995 100644 --- a/drivers/net/can/kvaser_pciefd.c +++ b/drivers/net/can/kvaser_pciefd.c @@ -1670,24 +1670,28 @@ static int kvaser_pciefd_read_buffer(struct kvaser_pciefd *pcie, int dma_buf) return res; } -static u32 kvaser_pciefd_receive_irq(struct kvaser_pciefd *pcie) +static void kvaser_pciefd_receive_irq(struct kvaser_pciefd *pcie) { + void __iomem *srb_cmd_reg = KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG; u32 irq = ioread32(KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IRQ_REG); - if (irq & KVASER_PCIEFD_SRB_IRQ_DPD0) + iowrite32(irq, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IRQ_REG); + + if (irq & KVASER_PCIEFD_SRB_IRQ_DPD0) { kvaser_pciefd_read_buffer(pcie, 0); + iowrite32(KVASER_PCIEFD_SRB_CMD_RDB0, srb_cmd_reg); /* Rearm buffer */ + } - if (irq & KVASER_PCIEFD_SRB_IRQ_DPD1) + if (irq & KVASER_PCIEFD_SRB_IRQ_DPD1) { kvaser_pciefd_read_buffer(pcie, 1); + iowrite32(KVASER_PCIEFD_SRB_CMD_RDB1, srb_cmd_reg); /* Rearm buffer */ + } if (unlikely(irq & KVASER_PCIEFD_SRB_IRQ_DOF0 || irq & KVASER_PCIEFD_SRB_IRQ_DOF1 || irq & KVASER_PCIEFD_SRB_IRQ_DUF0 || irq & KVASER_PCIEFD_SRB_IRQ_DUF1)) dev_err(&pcie->pci->dev, "DMA IRQ error 0x%08X\n", irq); - - iowrite32(irq, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IRQ_REG); - return irq; } static void kvaser_pciefd_transmit_irq(struct kvaser_pciefd_can *can) @@ -1715,29 +1719,22 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev) struct kvaser_pciefd *pcie = (struct kvaser_pciefd *)dev; const struct kvaser_pciefd_irq_mask *irq_mask = pcie->driver_data->irq_mask; u32 pci_irq = ioread32(KVASER_PCIEFD_PCI_IRQ_ADDR(pcie)); - u32 srb_irq = 0; - u32 srb_release = 0; int i; if (!(pci_irq & irq_mask->all)) return IRQ_NONE; + iowrite32(0, KVASER_PCIEFD_PCI_IEN_ADDR(pcie)); + if (pci_irq & irq_mask->kcan_rx0) - srb_irq = kvaser_pciefd_receive_irq(pcie); + kvaser_pciefd_receive_irq(pcie); for (i = 0; i < pcie->nr_channels; i++) { if (pci_irq & irq_mask->kcan_tx[i]) kvaser_pciefd_transmit_irq(pcie->can[i]); } - if (srb_irq & KVASER_PCIEFD_SRB_IRQ_DPD0) - srb_release |= KVASER_PCIEFD_SRB_CMD_RDB0; - - if (srb_irq & KVASER_PCIEFD_SRB_IRQ_DPD1) - srb_release |= KVASER_PCIEFD_SRB_CMD_RDB1; - - if (srb_release) - iowrite32(srb_release, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG); + iowrite32(irq_mask->all, KVASER_PCIEFD_PCI_IEN_ADDR(pcie)); return IRQ_HANDLED; } @@ -1757,13 +1754,22 @@ static void kvaser_pciefd_teardown_can_ctrls(struct kvaser_pciefd *pcie) } } +static void kvaser_pciefd_disable_irq_srcs(struct kvaser_pciefd *pcie) +{ + unsigned int i; + + /* Masking PCI_IRQ is insufficient as running ISR will unmask it */ + iowrite32(0, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IEN_REG); + for (i = 0; i < pcie->nr_channels; ++i) + iowrite32(0, pcie->can[i]->reg_base + KVASER_PCIEFD_KCAN_IEN_REG); +} + static int kvaser_pciefd_probe(struct pci_dev *pdev, const struct pci_device_id *id) { int ret; struct kvaser_pciefd *pcie; const struct kvaser_pciefd_irq_mask *irq_mask; - void __iomem *irq_en_base; pcie = devm_kzalloc(&pdev->dev, sizeof(*pcie), GFP_KERNEL); if (!pcie) @@ -1829,8 +1835,7 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IEN_REG); /* Enable PCI interrupts */ - irq_en_base = KVASER_PCIEFD_PCI_IEN_ADDR(pcie); - iowrite32(irq_mask->all, irq_en_base); + iowrite32(irq_mask->all, KVASER_PCIEFD_PCI_IEN_ADDR(pcie)); /* Ready the DMA buffers */ iowrite32(KVASER_PCIEFD_SRB_CMD_RDB0, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG); @@ -1844,8 +1849,7 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev, return 0; err_free_irq: - /* Disable PCI interrupts */ - iowrite32(0, irq_en_base); + kvaser_pciefd_disable_irq_srcs(pcie); free_irq(pcie->pci->irq, pcie); err_pci_free_irq_vectors: @@ -1868,35 +1872,26 @@ err_disable_pci: return ret; } -static void kvaser_pciefd_remove_all_ctrls(struct kvaser_pciefd *pcie) -{ - int i; - - for (i = 0; i < pcie->nr_channels; i++) { - struct kvaser_pciefd_can *can = pcie->can[i]; - - if (can) { - iowrite32(0, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG); - unregister_candev(can->can.dev); - del_timer(&can->bec_poll_timer); - kvaser_pciefd_pwm_stop(can); - free_candev(can->can.dev); - } - } -} - static void kvaser_pciefd_remove(struct pci_dev *pdev) { struct kvaser_pciefd *pcie = pci_get_drvdata(pdev); + unsigned int i; - kvaser_pciefd_remove_all_ctrls(pcie); + for (i = 0; i < pcie->nr_channels; ++i) { + struct kvaser_pciefd_can *can = pcie->can[i]; - /* Disable interrupts */ - iowrite32(0, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CTRL_REG); - iowrite32(0, KVASER_PCIEFD_PCI_IEN_ADDR(pcie)); + unregister_candev(can->can.dev); + del_timer(&can->bec_poll_timer); + kvaser_pciefd_pwm_stop(can); + } + kvaser_pciefd_disable_irq_srcs(pcie); free_irq(pcie->pci->irq, pcie); pci_free_irq_vectors(pcie->pci); + + for (i = 0; i < pcie->nr_channels; ++i) + free_candev(pcie->can[i]->can.dev); + pci_iounmap(pdev, pcie->reg_base); pci_release_regions(pdev); pci_disable_device(pdev); -- GitLab From 61ffb2e73d7539db6fac6f6f81e51452b9e15c85 Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Wed, 12 Feb 2025 18:03:52 +0100 Subject: [PATCH 0626/2211] arm64: dts: qcom: ipq9574: Add missing properties for cryptobam commit b4cd966edb2deb5c75fe356191422e127445b830 upstream. num-channels and qcom,num-ees are required for BAM nodes without clock, because the driver cannot ensure the hardware is powered on when trying to obtain the information from the hardware registers. Specifying the node without these properties is unsafe and has caused early boot crashes for other SoCs before [1, 2]. Add the missing information from the hardware registers to ensure the driver can probe successfully without causing crashes. [1]: https://lore.kernel.org/r/CY01EKQVWE36.B9X5TDXAREPF@fairphone.com/ [2]: https://lore.kernel.org/r/20230626145959.646747-1-krzysztof.kozlowski@linaro.org/ Cc: stable@vger.kernel.org Tested-by: Md Sadre Alam Fixes: ffadc79ed99f ("arm64: dts: qcom: ipq9574: Enable crypto nodes") Signed-off-by: Stephan Gerhold Link: https://lore.kernel.org/r/20250212-bam-dma-fixes-v1-6-f560889e65d8@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/ipq9574.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi index 08a82a5cf6675..81ccd0600c5ab 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi @@ -261,6 +261,8 @@ interrupts = ; #dma-cells = <1>; qcom,ee = <1>; + qcom,num-ees = <4>; + num-channels = <16>; qcom,controlled-remotely; }; -- GitLab From 920c14a3772dd501e65475c5135040ea0ec23cf8 Mon Sep 17 00:00:00 2001 From: Ling Xu Date: Tue, 11 Feb 2025 13:44:14 +0530 Subject: [PATCH 0627/2211] arm64: dts: qcom: sa8775p: Remove extra entries from the iommus property commit eb73f500548a3205741330cbd7d0e209a7a6a9af upstream. There are some items come out to be same value if we do SID & ~MASK. Remove extra entries from the iommus property for sa8775p to simplify. Fixes: f7b01bfb4b47 ("arm64: qcom: sa8775p: Add ADSP and CDSP0 fastrpc nodes") Cc: stable@kernel.org Reviewed-by: Dmitry Baryshkov Signed-off-by: Ling Xu Link: https://lore.kernel.org/r/49f463415c8fa2b08fbc2317e31493362056f403.1739260973.git.quic_lxu5@quicinc.com Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/sa8775p.dtsi | 240 +++----------------------- 1 file changed, 24 insertions(+), 216 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/sa8775p.dtsi b/arch/arm64/boot/dts/qcom/sa8775p.dtsi index 8a21448c0fa84..67f911e536a6b 100644 --- a/arch/arm64/boot/dts/qcom/sa8775p.dtsi +++ b/arch/arm64/boot/dts/qcom/sa8775p.dtsi @@ -4012,15 +4012,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <1>; iommus = <&apps_smmu 0x2141 0x04a0>, - <&apps_smmu 0x2161 0x04a0>, - <&apps_smmu 0x2181 0x0400>, - <&apps_smmu 0x21c1 0x04a0>, - <&apps_smmu 0x21e1 0x04a0>, - <&apps_smmu 0x2541 0x04a0>, - <&apps_smmu 0x2561 0x04a0>, - <&apps_smmu 0x2581 0x0400>, - <&apps_smmu 0x25c1 0x04a0>, - <&apps_smmu 0x25e1 0x04a0>; + <&apps_smmu 0x2181 0x0400>; dma-coherent; }; @@ -4028,15 +4020,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <2>; iommus = <&apps_smmu 0x2142 0x04a0>, - <&apps_smmu 0x2162 0x04a0>, - <&apps_smmu 0x2182 0x0400>, - <&apps_smmu 0x21c2 0x04a0>, - <&apps_smmu 0x21e2 0x04a0>, - <&apps_smmu 0x2542 0x04a0>, - <&apps_smmu 0x2562 0x04a0>, - <&apps_smmu 0x2582 0x0400>, - <&apps_smmu 0x25c2 0x04a0>, - <&apps_smmu 0x25e2 0x04a0>; + <&apps_smmu 0x2182 0x0400>; dma-coherent; }; @@ -4044,15 +4028,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <3>; iommus = <&apps_smmu 0x2143 0x04a0>, - <&apps_smmu 0x2163 0x04a0>, - <&apps_smmu 0x2183 0x0400>, - <&apps_smmu 0x21c3 0x04a0>, - <&apps_smmu 0x21e3 0x04a0>, - <&apps_smmu 0x2543 0x04a0>, - <&apps_smmu 0x2563 0x04a0>, - <&apps_smmu 0x2583 0x0400>, - <&apps_smmu 0x25c3 0x04a0>, - <&apps_smmu 0x25e3 0x04a0>; + <&apps_smmu 0x2183 0x0400>; dma-coherent; }; @@ -4060,15 +4036,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <4>; iommus = <&apps_smmu 0x2144 0x04a0>, - <&apps_smmu 0x2164 0x04a0>, - <&apps_smmu 0x2184 0x0400>, - <&apps_smmu 0x21c4 0x04a0>, - <&apps_smmu 0x21e4 0x04a0>, - <&apps_smmu 0x2544 0x04a0>, - <&apps_smmu 0x2564 0x04a0>, - <&apps_smmu 0x2584 0x0400>, - <&apps_smmu 0x25c4 0x04a0>, - <&apps_smmu 0x25e4 0x04a0>; + <&apps_smmu 0x2184 0x0400>; dma-coherent; }; @@ -4076,15 +4044,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <5>; iommus = <&apps_smmu 0x2145 0x04a0>, - <&apps_smmu 0x2165 0x04a0>, - <&apps_smmu 0x2185 0x0400>, - <&apps_smmu 0x21c5 0x04a0>, - <&apps_smmu 0x21e5 0x04a0>, - <&apps_smmu 0x2545 0x04a0>, - <&apps_smmu 0x2565 0x04a0>, - <&apps_smmu 0x2585 0x0400>, - <&apps_smmu 0x25c5 0x04a0>, - <&apps_smmu 0x25e5 0x04a0>; + <&apps_smmu 0x2185 0x0400>; dma-coherent; }; @@ -4092,15 +4052,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <6>; iommus = <&apps_smmu 0x2146 0x04a0>, - <&apps_smmu 0x2166 0x04a0>, - <&apps_smmu 0x2186 0x0400>, - <&apps_smmu 0x21c6 0x04a0>, - <&apps_smmu 0x21e6 0x04a0>, - <&apps_smmu 0x2546 0x04a0>, - <&apps_smmu 0x2566 0x04a0>, - <&apps_smmu 0x2586 0x0400>, - <&apps_smmu 0x25c6 0x04a0>, - <&apps_smmu 0x25e6 0x04a0>; + <&apps_smmu 0x2186 0x0400>; dma-coherent; }; @@ -4108,15 +4060,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <7>; iommus = <&apps_smmu 0x2147 0x04a0>, - <&apps_smmu 0x2167 0x04a0>, - <&apps_smmu 0x2187 0x0400>, - <&apps_smmu 0x21c7 0x04a0>, - <&apps_smmu 0x21e7 0x04a0>, - <&apps_smmu 0x2547 0x04a0>, - <&apps_smmu 0x2567 0x04a0>, - <&apps_smmu 0x2587 0x0400>, - <&apps_smmu 0x25c7 0x04a0>, - <&apps_smmu 0x25e7 0x04a0>; + <&apps_smmu 0x2187 0x0400>; dma-coherent; }; @@ -4124,15 +4068,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <8>; iommus = <&apps_smmu 0x2148 0x04a0>, - <&apps_smmu 0x2168 0x04a0>, - <&apps_smmu 0x2188 0x0400>, - <&apps_smmu 0x21c8 0x04a0>, - <&apps_smmu 0x21e8 0x04a0>, - <&apps_smmu 0x2548 0x04a0>, - <&apps_smmu 0x2568 0x04a0>, - <&apps_smmu 0x2588 0x0400>, - <&apps_smmu 0x25c8 0x04a0>, - <&apps_smmu 0x25e8 0x04a0>; + <&apps_smmu 0x2188 0x0400>; dma-coherent; }; @@ -4140,15 +4076,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <9>; iommus = <&apps_smmu 0x2149 0x04a0>, - <&apps_smmu 0x2169 0x04a0>, - <&apps_smmu 0x2189 0x0400>, - <&apps_smmu 0x21c9 0x04a0>, - <&apps_smmu 0x21e9 0x04a0>, - <&apps_smmu 0x2549 0x04a0>, - <&apps_smmu 0x2569 0x04a0>, - <&apps_smmu 0x2589 0x0400>, - <&apps_smmu 0x25c9 0x04a0>, - <&apps_smmu 0x25e9 0x04a0>; + <&apps_smmu 0x2189 0x0400>; dma-coherent; }; @@ -4156,15 +4084,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <10>; iommus = <&apps_smmu 0x214a 0x04a0>, - <&apps_smmu 0x216a 0x04a0>, - <&apps_smmu 0x218a 0x0400>, - <&apps_smmu 0x21ca 0x04a0>, - <&apps_smmu 0x21ea 0x04a0>, - <&apps_smmu 0x254a 0x04a0>, - <&apps_smmu 0x256a 0x04a0>, - <&apps_smmu 0x258a 0x0400>, - <&apps_smmu 0x25ca 0x04a0>, - <&apps_smmu 0x25ea 0x04a0>; + <&apps_smmu 0x218a 0x0400>; dma-coherent; }; @@ -4172,15 +4092,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <11>; iommus = <&apps_smmu 0x214b 0x04a0>, - <&apps_smmu 0x216b 0x04a0>, - <&apps_smmu 0x218b 0x0400>, - <&apps_smmu 0x21cb 0x04a0>, - <&apps_smmu 0x21eb 0x04a0>, - <&apps_smmu 0x254b 0x04a0>, - <&apps_smmu 0x256b 0x04a0>, - <&apps_smmu 0x258b 0x0400>, - <&apps_smmu 0x25cb 0x04a0>, - <&apps_smmu 0x25eb 0x04a0>; + <&apps_smmu 0x218b 0x0400>; dma-coherent; }; }; @@ -4240,15 +4152,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <1>; iommus = <&apps_smmu 0x2941 0x04a0>, - <&apps_smmu 0x2961 0x04a0>, - <&apps_smmu 0x2981 0x0400>, - <&apps_smmu 0x29c1 0x04a0>, - <&apps_smmu 0x29e1 0x04a0>, - <&apps_smmu 0x2d41 0x04a0>, - <&apps_smmu 0x2d61 0x04a0>, - <&apps_smmu 0x2d81 0x0400>, - <&apps_smmu 0x2dc1 0x04a0>, - <&apps_smmu 0x2de1 0x04a0>; + <&apps_smmu 0x2981 0x0400>; dma-coherent; }; @@ -4256,15 +4160,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <2>; iommus = <&apps_smmu 0x2942 0x04a0>, - <&apps_smmu 0x2962 0x04a0>, - <&apps_smmu 0x2982 0x0400>, - <&apps_smmu 0x29c2 0x04a0>, - <&apps_smmu 0x29e2 0x04a0>, - <&apps_smmu 0x2d42 0x04a0>, - <&apps_smmu 0x2d62 0x04a0>, - <&apps_smmu 0x2d82 0x0400>, - <&apps_smmu 0x2dc2 0x04a0>, - <&apps_smmu 0x2de2 0x04a0>; + <&apps_smmu 0x2982 0x0400>; dma-coherent; }; @@ -4272,15 +4168,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <3>; iommus = <&apps_smmu 0x2943 0x04a0>, - <&apps_smmu 0x2963 0x04a0>, - <&apps_smmu 0x2983 0x0400>, - <&apps_smmu 0x29c3 0x04a0>, - <&apps_smmu 0x29e3 0x04a0>, - <&apps_smmu 0x2d43 0x04a0>, - <&apps_smmu 0x2d63 0x04a0>, - <&apps_smmu 0x2d83 0x0400>, - <&apps_smmu 0x2dc3 0x04a0>, - <&apps_smmu 0x2de3 0x04a0>; + <&apps_smmu 0x2983 0x0400>; dma-coherent; }; @@ -4288,15 +4176,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <4>; iommus = <&apps_smmu 0x2944 0x04a0>, - <&apps_smmu 0x2964 0x04a0>, - <&apps_smmu 0x2984 0x0400>, - <&apps_smmu 0x29c4 0x04a0>, - <&apps_smmu 0x29e4 0x04a0>, - <&apps_smmu 0x2d44 0x04a0>, - <&apps_smmu 0x2d64 0x04a0>, - <&apps_smmu 0x2d84 0x0400>, - <&apps_smmu 0x2dc4 0x04a0>, - <&apps_smmu 0x2de4 0x04a0>; + <&apps_smmu 0x2984 0x0400>; dma-coherent; }; @@ -4304,15 +4184,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <5>; iommus = <&apps_smmu 0x2945 0x04a0>, - <&apps_smmu 0x2965 0x04a0>, - <&apps_smmu 0x2985 0x0400>, - <&apps_smmu 0x29c5 0x04a0>, - <&apps_smmu 0x29e5 0x04a0>, - <&apps_smmu 0x2d45 0x04a0>, - <&apps_smmu 0x2d65 0x04a0>, - <&apps_smmu 0x2d85 0x0400>, - <&apps_smmu 0x2dc5 0x04a0>, - <&apps_smmu 0x2de5 0x04a0>; + <&apps_smmu 0x2985 0x0400>; dma-coherent; }; @@ -4320,15 +4192,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <6>; iommus = <&apps_smmu 0x2946 0x04a0>, - <&apps_smmu 0x2966 0x04a0>, - <&apps_smmu 0x2986 0x0400>, - <&apps_smmu 0x29c6 0x04a0>, - <&apps_smmu 0x29e6 0x04a0>, - <&apps_smmu 0x2d46 0x04a0>, - <&apps_smmu 0x2d66 0x04a0>, - <&apps_smmu 0x2d86 0x0400>, - <&apps_smmu 0x2dc6 0x04a0>, - <&apps_smmu 0x2de6 0x04a0>; + <&apps_smmu 0x2986 0x0400>; dma-coherent; }; @@ -4336,15 +4200,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <7>; iommus = <&apps_smmu 0x2947 0x04a0>, - <&apps_smmu 0x2967 0x04a0>, - <&apps_smmu 0x2987 0x0400>, - <&apps_smmu 0x29c7 0x04a0>, - <&apps_smmu 0x29e7 0x04a0>, - <&apps_smmu 0x2d47 0x04a0>, - <&apps_smmu 0x2d67 0x04a0>, - <&apps_smmu 0x2d87 0x0400>, - <&apps_smmu 0x2dc7 0x04a0>, - <&apps_smmu 0x2de7 0x04a0>; + <&apps_smmu 0x2987 0x0400>; dma-coherent; }; @@ -4352,15 +4208,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <8>; iommus = <&apps_smmu 0x2948 0x04a0>, - <&apps_smmu 0x2968 0x04a0>, - <&apps_smmu 0x2988 0x0400>, - <&apps_smmu 0x29c8 0x04a0>, - <&apps_smmu 0x29e8 0x04a0>, - <&apps_smmu 0x2d48 0x04a0>, - <&apps_smmu 0x2d68 0x04a0>, - <&apps_smmu 0x2d88 0x0400>, - <&apps_smmu 0x2dc8 0x04a0>, - <&apps_smmu 0x2de8 0x04a0>; + <&apps_smmu 0x2988 0x0400>; dma-coherent; }; @@ -4368,15 +4216,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <9>; iommus = <&apps_smmu 0x2949 0x04a0>, - <&apps_smmu 0x2969 0x04a0>, - <&apps_smmu 0x2989 0x0400>, - <&apps_smmu 0x29c9 0x04a0>, - <&apps_smmu 0x29e9 0x04a0>, - <&apps_smmu 0x2d49 0x04a0>, - <&apps_smmu 0x2d69 0x04a0>, - <&apps_smmu 0x2d89 0x0400>, - <&apps_smmu 0x2dc9 0x04a0>, - <&apps_smmu 0x2de9 0x04a0>; + <&apps_smmu 0x2989 0x0400>; dma-coherent; }; @@ -4384,15 +4224,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <10>; iommus = <&apps_smmu 0x294a 0x04a0>, - <&apps_smmu 0x296a 0x04a0>, - <&apps_smmu 0x298a 0x0400>, - <&apps_smmu 0x29ca 0x04a0>, - <&apps_smmu 0x29ea 0x04a0>, - <&apps_smmu 0x2d4a 0x04a0>, - <&apps_smmu 0x2d6a 0x04a0>, - <&apps_smmu 0x2d8a 0x0400>, - <&apps_smmu 0x2dca 0x04a0>, - <&apps_smmu 0x2dea 0x04a0>; + <&apps_smmu 0x298a 0x0400>; dma-coherent; }; @@ -4400,15 +4232,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <11>; iommus = <&apps_smmu 0x294b 0x04a0>, - <&apps_smmu 0x296b 0x04a0>, - <&apps_smmu 0x298b 0x0400>, - <&apps_smmu 0x29cb 0x04a0>, - <&apps_smmu 0x29eb 0x04a0>, - <&apps_smmu 0x2d4b 0x04a0>, - <&apps_smmu 0x2d6b 0x04a0>, - <&apps_smmu 0x2d8b 0x0400>, - <&apps_smmu 0x2dcb 0x04a0>, - <&apps_smmu 0x2deb 0x04a0>; + <&apps_smmu 0x298b 0x0400>; dma-coherent; }; @@ -4416,15 +4240,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <12>; iommus = <&apps_smmu 0x294c 0x04a0>, - <&apps_smmu 0x296c 0x04a0>, - <&apps_smmu 0x298c 0x0400>, - <&apps_smmu 0x29cc 0x04a0>, - <&apps_smmu 0x29ec 0x04a0>, - <&apps_smmu 0x2d4c 0x04a0>, - <&apps_smmu 0x2d6c 0x04a0>, - <&apps_smmu 0x2d8c 0x0400>, - <&apps_smmu 0x2dcc 0x04a0>, - <&apps_smmu 0x2dec 0x04a0>; + <&apps_smmu 0x298c 0x0400>; dma-coherent; }; @@ -4432,15 +4248,7 @@ compatible = "qcom,fastrpc-compute-cb"; reg = <13>; iommus = <&apps_smmu 0x294d 0x04a0>, - <&apps_smmu 0x296d 0x04a0>, - <&apps_smmu 0x298d 0x0400>, - <&apps_smmu 0x29Cd 0x04a0>, - <&apps_smmu 0x29ed 0x04a0>, - <&apps_smmu 0x2d4d 0x04a0>, - <&apps_smmu 0x2d6d 0x04a0>, - <&apps_smmu 0x2d8d 0x0400>, - <&apps_smmu 0x2dcd 0x04a0>, - <&apps_smmu 0x2ded 0x04a0>; + <&apps_smmu 0x298d 0x0400>; dma-coherent; }; }; -- GitLab From c96762b6837d51d16b3b73bf6d698ebfd9cc8a43 Mon Sep 17 00:00:00 2001 From: Karthik Sanagavarapu Date: Tue, 11 Feb 2025 13:44:15 +0530 Subject: [PATCH 0628/2211] arm64: dts: qcom: sa8775p: Remove cdsp compute-cb@10 commit d180c2bd3b43d55f30c9b99de68bc6bb8420d1c1 upstream. Remove the context bank compute-cb@10 because these SMMU ids are S2-only which is not used for S1 transaction. Fixes: f7b01bfb4b47 ("arm64: qcom: sa8775p: Add ADSP and CDSP0 fastrpc nodes") Cc: stable@kernel.org Signed-off-by: Karthik Sanagavarapu Signed-off-by: Ling Xu Link: https://lore.kernel.org/r/4c9de858fda7848b77ea8c528c9b9d53600ad21a.1739260973.git.quic_lxu5@quicinc.com Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/sa8775p.dtsi | 8 -------- 1 file changed, 8 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/sa8775p.dtsi b/arch/arm64/boot/dts/qcom/sa8775p.dtsi index 67f911e536a6b..b28fa598cebb3 100644 --- a/arch/arm64/boot/dts/qcom/sa8775p.dtsi +++ b/arch/arm64/boot/dts/qcom/sa8775p.dtsi @@ -4080,14 +4080,6 @@ dma-coherent; }; - compute-cb@10 { - compatible = "qcom,fastrpc-compute-cb"; - reg = <10>; - iommus = <&apps_smmu 0x214a 0x04a0>, - <&apps_smmu 0x218a 0x0400>; - dma-coherent; - }; - compute-cb@11 { compatible = "qcom,fastrpc-compute-cb"; reg = <11>; -- GitLab From 87ec68b7e92cc70fce5bfffac39501b2efdeae5d Mon Sep 17 00:00:00 2001 From: Alok Tiwari Date: Wed, 14 May 2025 04:46:51 -0700 Subject: [PATCH 0629/2211] arm64: dts: qcom: sm8350: Fix typo in pil_camera_mem node commit 295217420a44403a33c30f99d8337fe7b07eb02b upstream. There is a typo in sm8350.dts where the node label mmeory@85200000 should be memory@85200000. This patch corrects the typo for clarity and consistency. Fixes: b7e8f433a673 ("arm64: dts: qcom: Add basic devicetree support for SM8350 SoC") Cc: stable@vger.kernel.org Signed-off-by: Alok Tiwari Link: https://lore.kernel.org/r/20250514114656.2307828-1-alok.a.tiwari@oracle.com Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/sm8350.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/qcom/sm8350.dtsi b/arch/arm64/boot/dts/qcom/sm8350.dtsi index 46adf10e5fe4d..404473fa491ae 100644 --- a/arch/arm64/boot/dts/qcom/sm8350.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8350.dtsi @@ -455,7 +455,7 @@ no-map; }; - pil_camera_mem: mmeory@85200000 { + pil_camera_mem: memory@85200000 { reg = <0x0 0x85200000 0x0 0x500000>; no-map; }; -- GitLab From b4412e855317ed63f01147571fa0028a7b0c4dc2 Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Wed, 12 Feb 2025 18:03:48 +0100 Subject: [PATCH 0630/2211] arm64: dts: qcom: sm8450: Add missing properties for cryptobam commit 0fe6357229cb15a64b6413c62f1c3d4de68ce55f upstream. num-channels and qcom,num-ees are required for BAM nodes without clock, because the driver cannot ensure the hardware is powered on when trying to obtain the information from the hardware registers. Specifying the node without these properties is unsafe and has caused early boot crashes for other SoCs before [1, 2]. Add the missing information from the hardware registers to ensure the driver can probe successfully without causing crashes. [1]: https://lore.kernel.org/r/CY01EKQVWE36.B9X5TDXAREPF@fairphone.com/ [2]: https://lore.kernel.org/r/20230626145959.646747-1-krzysztof.kozlowski@linaro.org/ Cc: stable@vger.kernel.org Fixes: b92b0d2f7582 ("arm64: dts: qcom: sm8450: add crypto nodes") Signed-off-by: Stephan Gerhold Link: https://lore.kernel.org/r/20250212-bam-dma-fixes-v1-2-f560889e65d8@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/sm8450.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/sm8450.dtsi b/arch/arm64/boot/dts/qcom/sm8450.dtsi index d664a88a018ef..58ed68f534e50 100644 --- a/arch/arm64/boot/dts/qcom/sm8450.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8450.dtsi @@ -4553,6 +4553,8 @@ interrupts = ; #dma-cells = <1>; qcom,ee = <0>; + qcom,num-ees = <4>; + num-channels = <16>; qcom,controlled-remotely; iommus = <&apps_smmu 0x584 0x11>, <&apps_smmu 0x588 0x0>, -- GitLab From 2a539505321a52f801703722834d6b027bbfcad7 Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Wed, 12 Feb 2025 18:03:49 +0100 Subject: [PATCH 0631/2211] arm64: dts: qcom: sm8550: Add missing properties for cryptobam commit 663cd2cad36da23cf1a3db7868fce9f1a19b2d61 upstream. num-channels and qcom,num-ees are required for BAM nodes without clock, because the driver cannot ensure the hardware is powered on when trying to obtain the information from the hardware registers. Specifying the node without these properties is unsafe and has caused early boot crashes for other SoCs before [1, 2]. Add the missing information from the hardware registers to ensure the driver can probe successfully without causing crashes. [1]: https://lore.kernel.org/r/CY01EKQVWE36.B9X5TDXAREPF@fairphone.com/ [2]: https://lore.kernel.org/r/20230626145959.646747-1-krzysztof.kozlowski@linaro.org/ Cc: stable@vger.kernel.org Fixes: 433477c3bf0b ("arm64: dts: qcom: sm8550: add QCrypto nodes") Signed-off-by: Stephan Gerhold Link: https://lore.kernel.org/r/20250212-bam-dma-fixes-v1-3-f560889e65d8@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/sm8550.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/sm8550.dtsi b/arch/arm64/boot/dts/qcom/sm8550.dtsi index 9ecf4a7fc3287..cfdd30009015f 100644 --- a/arch/arm64/boot/dts/qcom/sm8550.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8550.dtsi @@ -1952,6 +1952,8 @@ interrupts = ; #dma-cells = <1>; qcom,ee = <0>; + qcom,num-ees = <4>; + num-channels = <20>; qcom,controlled-remotely; iommus = <&apps_smmu 0x480 0x0>, <&apps_smmu 0x481 0x0>; -- GitLab From d3400824e096b45767d2a4ec7a57ae4283bc58b1 Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Wed, 12 Feb 2025 18:03:50 +0100 Subject: [PATCH 0632/2211] arm64: dts: qcom: sm8650: Add missing properties for cryptobam commit 38b88722bce07b6a5927f45fbf7a9a85e834572c upstream. num-channels and qcom,num-ees are required for BAM nodes without clock, because the driver cannot ensure the hardware is powered on when trying to obtain the information from the hardware registers. Specifying the node without these properties is unsafe and has caused early boot crashes for other SoCs before [1, 2]. Add the missing information from the hardware registers to ensure the driver can probe successfully without causing crashes. [1]: https://lore.kernel.org/r/CY01EKQVWE36.B9X5TDXAREPF@fairphone.com/ [2]: https://lore.kernel.org/r/20230626145959.646747-1-krzysztof.kozlowski@linaro.org/ Cc: stable@vger.kernel.org Fixes: 10e024671295 ("arm64: dts: qcom: sm8650: add interconnect dependent device nodes") Signed-off-by: Stephan Gerhold Link: https://lore.kernel.org/r/20250212-bam-dma-fixes-v1-4-f560889e65d8@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/sm8650.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/sm8650.dtsi b/arch/arm64/boot/dts/qcom/sm8650.dtsi index 416cfb71878a5..fddf979de38d1 100644 --- a/arch/arm64/boot/dts/qcom/sm8650.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8650.dtsi @@ -2495,6 +2495,8 @@ <&apps_smmu 0x481 0>; qcom,ee = <0>; + qcom,num-ees = <4>; + num-channels = <20>; qcom,controlled-remotely; }; -- GitLab From a5c10cc63dc683f004d0998ec3a0e896debf3dd2 Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Wed, 23 Apr 2025 09:30:09 +0200 Subject: [PATCH 0633/2211] arm64: dts: qcom: x1e80100-asus-vivobook-s15: Fix vreg_l2j_1p2 voltage commit 0fb9ecf8713a7a458f7378c86e0703467db2ad22 upstream. In the ACPI DSDT table, PPP_RESOURCE_ID_LDO2_J is configured with 1256000 uV instead of the 1200000 uV we have currently in the device tree. Use the same for consistency and correctness. Cc: stable@vger.kernel.org Fixes: d0e2f8f62dff ("arm64: dts: qcom: Add device tree for ASUS Vivobook S 15") Signed-off-by: Stephan Gerhold Reviewed-by: Johan Hovold Reviewed-by: Abel Vesa Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250423-x1e-vreg-l2j-voltage-v1-3-24b6a2043025@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/x1e80100-asus-vivobook-s15.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/x1e80100-asus-vivobook-s15.dts b/arch/arm64/boot/dts/qcom/x1e80100-asus-vivobook-s15.dts index b2cf080cab562..ce3fa29de7b4a 100644 --- a/arch/arm64/boot/dts/qcom/x1e80100-asus-vivobook-s15.dts +++ b/arch/arm64/boot/dts/qcom/x1e80100-asus-vivobook-s15.dts @@ -314,8 +314,8 @@ vreg_l2j_1p2: ldo2 { regulator-name = "vreg_l2j_1p2"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; + regulator-min-microvolt = <1256000>; + regulator-max-microvolt = <1256000>; regulator-initial-mode = ; }; -- GitLab From b2f571e0ba1d90231fe28cbca90f9f9ebd8d59c0 Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Wed, 23 Apr 2025 09:30:11 +0200 Subject: [PATCH 0634/2211] arm64: dts: qcom: x1e80100-lenovo-yoga-slim7x: Fix vreg_l2j_1p2 voltage commit 4f27ede34ca3369cdcde80c5a4ca84cdb28edbbb upstream. In the ACPI DSDT table, PPP_RESOURCE_ID_LDO2_J is configured with 1256000 uV instead of the 1200000 uV we have currently in the device tree. Use the same for consistency and correctness. Cc: stable@vger.kernel.org Fixes: 45247fe17db2 ("arm64: dts: qcom: x1e80100: add Lenovo Thinkpad Yoga slim 7x devicetree") Signed-off-by: Stephan Gerhold Reviewed-by: Johan Hovold Reviewed-by: Abel Vesa Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250423-x1e-vreg-l2j-voltage-v1-5-24b6a2043025@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts b/arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts index e9ed723f90381..171a49e808902 100644 --- a/arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts +++ b/arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts @@ -484,8 +484,8 @@ vreg_l2j_1p2: ldo2 { regulator-name = "vreg_l2j_1p2"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; + regulator-min-microvolt = <1256000>; + regulator-max-microvolt = <1256000>; regulator-initial-mode = ; }; -- GitLab From fa8939991bc4f5de797ecf1b3cc9b78adb90ecb5 Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Wed, 23 Apr 2025 09:30:12 +0200 Subject: [PATCH 0635/2211] arm64: dts: qcom: x1e80100-qcp: Fix vreg_l2j_1p2 voltage commit efdbeae860bf0278b050c6c9ad5921afba4596d0 upstream. In the ACPI DSDT table, PPP_RESOURCE_ID_LDO2_J is configured with 1256000 uV instead of the 1200000 uV we have currently in the device tree. Use the same for consistency and correctness. Cc: stable@vger.kernel.org Fixes: af16b00578a7 ("arm64: dts: qcom: Add base X1E80100 dtsi and the QCP dts") Signed-off-by: Stephan Gerhold Reviewed-by: Johan Hovold Reviewed-by: Abel Vesa Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250423-x1e-vreg-l2j-voltage-v1-6-24b6a2043025@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/x1e80100-qcp.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/x1e80100-qcp.dts b/arch/arm64/boot/dts/qcom/x1e80100-qcp.dts index af76aa034d0e1..99626c8a7355f 100644 --- a/arch/arm64/boot/dts/qcom/x1e80100-qcp.dts +++ b/arch/arm64/boot/dts/qcom/x1e80100-qcp.dts @@ -594,8 +594,8 @@ vreg_l2j_1p2: ldo2 { regulator-name = "vreg_l2j_1p2"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; + regulator-min-microvolt = <1256000>; + regulator-max-microvolt = <1256000>; regulator-initial-mode = ; }; -- GitLab From 660baafc9917451d5a57cd151a458bf7dde49079 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Fri, 14 Mar 2025 15:54:39 +0100 Subject: [PATCH 0636/2211] arm64: dts: qcom: x1e80100-qcp: mark l12b and l15b always-on commit ff6ba96378367133b66587bd3ee9f068a39ff3a9 upstream. The l12b and l15b supplies are used by components that are not (fully) described (and some never will be) and must never be disabled. Mark the regulators as always-on to prevent them from being disabled, for example, when consumers probe defer or suspend. Fixes: af16b00578a7 ("arm64: dts: qcom: Add base X1E80100 dtsi and the QCP dts") Cc: stable@vger.kernel.org # 6.8 Cc: Rajendra Nayak Reviewed-by: Konrad Dybcio Signed-off-by: Johan Hovold Link: https://lore.kernel.org/r/20250314145440.11371-8-johan+linaro@kernel.org Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/x1e80100-qcp.dts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/x1e80100-qcp.dts b/arch/arm64/boot/dts/qcom/x1e80100-qcp.dts index 99626c8a7355f..9062eb6766f2c 100644 --- a/arch/arm64/boot/dts/qcom/x1e80100-qcp.dts +++ b/arch/arm64/boot/dts/qcom/x1e80100-qcp.dts @@ -356,6 +356,7 @@ regulator-min-microvolt = <1200000>; regulator-max-microvolt = <1200000>; regulator-initial-mode = ; + regulator-always-on; }; vreg_l13b_3p0: ldo13 { @@ -377,6 +378,7 @@ regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-initial-mode = ; + regulator-always-on; }; vreg_l16b_2p9: ldo16 { -- GitLab From fc54ce9d78decde72226da7b0e0a7d8baccbd0b7 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Fri, 14 Mar 2025 15:54:38 +0100 Subject: [PATCH 0637/2211] arm64: dts: qcom: x1e80100-yoga-slim7x: mark l12b and l15b always-on commit f43a71dc6d8d8378af587675eec77c06e0298c79 upstream. The l12b and l15b supplies are used by components that are not (fully) described (and some never will be) and must never be disabled. Mark the regulators as always-on to prevent them from being disabled, for example, when consumers probe defer or suspend. Fixes: 45247fe17db2 ("arm64: dts: qcom: x1e80100: add Lenovo Thinkpad Yoga slim 7x devicetree") Cc: stable@vger.kernel.org # 6.11 Cc: Srinivas Kandagatla Reviewed-by: Konrad Dybcio Signed-off-by: Johan Hovold Link: https://lore.kernel.org/r/20250314145440.11371-7-johan+linaro@kernel.org Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts b/arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts index 171a49e808902..07c2fdfe7ce13 100644 --- a/arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts +++ b/arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts @@ -266,6 +266,7 @@ regulator-min-microvolt = <1200000>; regulator-max-microvolt = <1200000>; regulator-initial-mode = ; + regulator-always-on; }; vreg_l14b_3p0: ldo14 { @@ -280,8 +281,8 @@ regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-initial-mode = ; + regulator-always-on; }; - }; regulators-1 { -- GitLab From 1e5144b53cec2a268607a3be5cbced7407bb2ced Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Wed, 19 Feb 2025 12:36:18 +0100 Subject: [PATCH 0638/2211] arm64: dts: qcom: x1e80100: Fix video thermal zone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 801befff4c827aa72e3698367c5afc18987a6a3f upstream. A passive trip point at 125°C is pretty high, this is usually the temperature for the critical shutdown trip point. Also, we don't have any passive cooling devices attached to the video thermal zone. Change this to be a critical trip point, and add a "hot" trip point at 90°C for consistency with the other thermal zones. Cc: stable@vger.kernel.org Fixes: 4e915987ff5b ("arm64: dts: qcom: x1e80100: Enable tsens and thermal zone nodes") Signed-off-by: Stephan Gerhold Reviewed-by: Johan Hovold Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250219-x1e80100-thermal-fixes-v1-1-d110e44ac3f9@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/qcom/x1e80100.dtsi | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/x1e80100.dtsi b/arch/arm64/boot/dts/qcom/x1e80100.dtsi index 91e4fbca19f99..5a5abd5fa6585 100644 --- a/arch/arm64/boot/dts/qcom/x1e80100.dtsi +++ b/arch/arm64/boot/dts/qcom/x1e80100.dtsi @@ -6682,15 +6682,19 @@ }; video-thermal { - polling-delay-passive = <250>; - thermal-sensors = <&tsens0 12>; trips { trip-point0 { + temperature = <90000>; + hysteresis = <2000>; + type = "hot"; + }; + + video-critical { temperature = <125000>; hysteresis = <1000>; - type = "passive"; + type = "critical"; }; }; }; -- GitLab From ef60b9ba0df959202d6e958baf383dc876b99a77 Mon Sep 17 00:00:00 2001 From: Judith Mendez Date: Tue, 29 Apr 2025 11:33:35 -0500 Subject: [PATCH 0639/2211] arm64: dts: ti: k3-am62-main: Set eMMC clock parent to default commit 3a71cdfec94436079513d9adf4b1d4f7a7edd917 upstream. Set eMMC clock parents to the defaults which is MAIN_PLL0_HSDIV5_CLKOUT for eMMC. This change is necessary since DM is not implementing the correct procedure to switch PLL clock source for eMMC and MMC CLK mux is not glich-free. As a preventative action, lets switch back to the defaults. Fixes: c37c58fdeb8a ("arm64: dts: ti: k3-am62: Add more peripheral nodes") Cc: stable@vger.kernel.org Signed-off-by: Judith Mendez Acked-by: Udit Kumar Acked-by: Bryan Brattlof Link: https://lore.kernel.org/r/20250429163337.15634-2-jm@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-am62-main.dtsi | 2 -- 1 file changed, 2 deletions(-) diff --git a/arch/arm64/boot/dts/ti/k3-am62-main.dtsi b/arch/arm64/boot/dts/ti/k3-am62-main.dtsi index 60c6814206a1f..3f3a31eced970 100644 --- a/arch/arm64/boot/dts/ti/k3-am62-main.dtsi +++ b/arch/arm64/boot/dts/ti/k3-am62-main.dtsi @@ -552,8 +552,6 @@ power-domains = <&k3_pds 57 TI_SCI_PD_EXCLUSIVE>; clocks = <&k3_clks 57 5>, <&k3_clks 57 6>; clock-names = "clk_ahb", "clk_xin"; - assigned-clocks = <&k3_clks 57 6>; - assigned-clock-parents = <&k3_clks 57 8>; bus-width = <8>; mmc-ddr-1_8v; mmc-hs200-1_8v; -- GitLab From b605a449b689b8fe6498ceeb97c798334a03b7d0 Mon Sep 17 00:00:00 2001 From: Judith Mendez Date: Tue, 29 Apr 2025 11:33:36 -0500 Subject: [PATCH 0640/2211] arm64: dts: ti: k3-am62a-main: Set eMMC clock parent to default commit 6af731c5de59cc4e7cce193d446f1fe872ac711b upstream. Set eMMC clock parents to the defaults which is MAIN_PLL0_HSDIV5_CLKOUT for eMMC. This change is necessary since DM is not implementing the correct procedure to switch PLL clock source for eMMC and MMC CLK mux is not glich-free. As a preventative action, lets switch back to the defaults. Fixes: d3ae4e8d8b6a ("arm64: dts: ti: k3-am62a-main: Add sdhci0 instance") Cc: stable@vger.kernel.org Signed-off-by: Judith Mendez Acked-by: Udit Kumar Acked-by: Bryan Brattlof Link: https://lore.kernel.org/r/20250429163337.15634-3-jm@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-am62a-main.dtsi | 2 -- 1 file changed, 2 deletions(-) diff --git a/arch/arm64/boot/dts/ti/k3-am62a-main.dtsi b/arch/arm64/boot/dts/ti/k3-am62a-main.dtsi index 56945d29e0150..45d68a0d1b593 100644 --- a/arch/arm64/boot/dts/ti/k3-am62a-main.dtsi +++ b/arch/arm64/boot/dts/ti/k3-am62a-main.dtsi @@ -575,8 +575,6 @@ power-domains = <&k3_pds 57 TI_SCI_PD_EXCLUSIVE>; clocks = <&k3_clks 57 5>, <&k3_clks 57 6>; clock-names = "clk_ahb", "clk_xin"; - assigned-clocks = <&k3_clks 57 6>; - assigned-clock-parents = <&k3_clks 57 8>; bus-width = <8>; mmc-hs200-1_8v; ti,clkbuf-sel = <0x7>; -- GitLab From 8cc39fa7ddaba20fb90929f3e948efc264495986 Mon Sep 17 00:00:00 2001 From: Judith Mendez Date: Tue, 29 Apr 2025 11:33:37 -0500 Subject: [PATCH 0641/2211] arm64: dts: ti: k3-am62p-j722s-common-main: Set eMMC clock parent to default commit 9c6b73fc72e19c449147233587833ce20f84b660 upstream. Set eMMC clock parents to the defaults which is MAIN_PLL0_HSDIV5_CLKOUT for eMMC. This change is necessary since DM is not implementing the correct procedure to switch PLL clock source for eMMC and MMC CLK mux is not glich-free. As a preventative action, lets switch back to the defaults. Fixes: b5080c7c1f7e ("arm64: dts: ti: k3-am62p: Add nodes for more IPs") Cc: stable@vger.kernel.org Signed-off-by: Judith Mendez Acked-by: Udit Kumar Acked-by: Bryan Brattlof Link: https://lore.kernel.org/r/20250429163337.15634-4-jm@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-am62p-j722s-common-main.dtsi | 2 -- 1 file changed, 2 deletions(-) diff --git a/arch/arm64/boot/dts/ti/k3-am62p-j722s-common-main.dtsi b/arch/arm64/boot/dts/ti/k3-am62p-j722s-common-main.dtsi index 9b6f513791083..77fe2b27cb58d 100644 --- a/arch/arm64/boot/dts/ti/k3-am62p-j722s-common-main.dtsi +++ b/arch/arm64/boot/dts/ti/k3-am62p-j722s-common-main.dtsi @@ -564,8 +564,6 @@ power-domains = <&k3_pds 57 TI_SCI_PD_EXCLUSIVE>; clocks = <&k3_clks 57 1>, <&k3_clks 57 2>; clock-names = "clk_ahb", "clk_xin"; - assigned-clocks = <&k3_clks 57 2>; - assigned-clock-parents = <&k3_clks 57 4>; bus-width = <8>; mmc-ddr-1_8v; mmc-hs200-1_8v; -- GitLab From 8c32e3ca0e1ad990add192a15802eeb92402153e Mon Sep 17 00:00:00 2001 From: Yemike Abhilash Chandra Date: Tue, 15 Apr 2025 16:43:26 +0530 Subject: [PATCH 0642/2211] arm64: dts: ti: k3-am62x: Remove clock-names property from IMX219 overlay commit c68ab54a89a8c935732589a35ea2596e2329f167 upstream. The IMX219 sensor device tree bindings do not include a clock-names property. Remove the incorrectly added clock-names entry to avoid dtbs_check warnings. Fixes: 4111db03dc05 ("arm64: dts: ti: k3-am62x: Add overlay for IMX219") Cc: stable@vger.kernel.org Signed-off-by: Yemike Abhilash Chandra Reviewed-by: Neha Malcom Francis Reviewed-by: Jai Luthra Link: https://lore.kernel.org/r/20250415111328.3847502-6-y-abhilashchandra@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-imx219.dtso | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-imx219.dtso b/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-imx219.dtso index 76ca02127f95f..7a0d35eb04d33 100644 --- a/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-imx219.dtso +++ b/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-imx219.dtso @@ -39,7 +39,6 @@ reg = <0x10>; clocks = <&clk_imx219_fixed>; - clock-names = "xclk"; reset-gpios = <&exp1 13 GPIO_ACTIVE_HIGH>; -- GitLab From 0451eef436181a23618793f0fb79d5bf2b5249d9 Mon Sep 17 00:00:00 2001 From: Yemike Abhilash Chandra Date: Tue, 15 Apr 2025 16:43:27 +0530 Subject: [PATCH 0643/2211] arm64: dts: ti: k3-am62x: Rename I2C switch to I2C mux in IMX219 overlay commit 7b75dd2029ee01a8c11fcf4d97f3ccebbef9f8eb upstream. The IMX219 device tree overlay incorrectly defined an I2C switch instead of an I2C mux. According to the DT bindings, the correct terminology and node definition should use "i2c-mux" instead of "i2c-switch". Hence, update the same to avoid dtbs_check warnings. Fixes: 4111db03dc05 ("arm64: dts: ti: k3-am62x: Add overlay for IMX219") Cc: stable@vger.kernel.org Signed-off-by: Yemike Abhilash Chandra Reviewed-by: Neha Malcom Francis Reviewed-by: Jai Luthra Link: https://lore.kernel.org/r/20250415111328.3847502-7-y-abhilashchandra@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-imx219.dtso | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-imx219.dtso b/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-imx219.dtso index 7a0d35eb04d33..dd090813a32d6 100644 --- a/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-imx219.dtso +++ b/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-imx219.dtso @@ -22,7 +22,7 @@ #size-cells = <0>; status = "okay"; - i2c-switch@71 { + i2c-mux@71 { compatible = "nxp,pca9543"; #address-cells = <1>; #size-cells = <0>; -- GitLab From e539e3e611183acab4946c8077c92cc22ede795d Mon Sep 17 00:00:00 2001 From: Yemike Abhilash Chandra Date: Tue, 15 Apr 2025 16:43:28 +0530 Subject: [PATCH 0644/2211] arm64: dts: ti: k3-am62x: Rename I2C switch to I2C mux in OV5640 overlay commit b22cc402d38774ccc552d18e762c25dde02f7be0 upstream. The OV5640 device tree overlay incorrectly defined an I2C switch instead of an I2C mux. According to the DT bindings, the correct terminology and node definition should use "i2c-mux" instead of "i2c-switch". Hence, update the same to avoid dtbs_check warnings. Fixes: 635ed9715194 ("arm64: dts: ti: k3-am62x: Add overlays for OV5640") Cc: stable@vger.kernel.org Signed-off-by: Yemike Abhilash Chandra Reviewed-by: Neha Malcom Francis Reviewed-by: Jai Luthra Link: https://lore.kernel.org/r/20250415111328.3847502-8-y-abhilashchandra@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-ov5640.dtso | 2 +- arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-tevi-ov5640.dtso | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-ov5640.dtso b/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-ov5640.dtso index ccc7f5e43184f..7fc7c95f5cd57 100644 --- a/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-ov5640.dtso +++ b/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-ov5640.dtso @@ -22,7 +22,7 @@ #size-cells = <0>; status = "okay"; - i2c-switch@71 { + i2c-mux@71 { compatible = "nxp,pca9543"; #address-cells = <1>; #size-cells = <0>; diff --git a/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-tevi-ov5640.dtso b/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-tevi-ov5640.dtso index 4eaf9d757dd0a..b6bfdfbbdd984 100644 --- a/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-tevi-ov5640.dtso +++ b/arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-tevi-ov5640.dtso @@ -22,7 +22,7 @@ #size-cells = <0>; status = "okay"; - i2c-switch@71 { + i2c-mux@71 { compatible = "nxp,pca9543"; #address-cells = <1>; #size-cells = <0>; -- GitLab From a15e5630133b3d5de299a7416427011c51c75746 Mon Sep 17 00:00:00 2001 From: Judith Mendez Date: Tue, 29 Apr 2025 12:30:08 -0500 Subject: [PATCH 0645/2211] arm64: dts: ti: k3-am65-main: Add missing taps to sdhci0 commit f55c9f087cc2e2252d44ffd9d58def2066fc176e upstream. For am65x, add missing ITAPDLYSEL values for Default Speed and High Speed SDR modes to sdhci0 node according to the device datasheet [0]. [0] https://www.ti.com/lit/gpn/am6548 Fixes: eac99d38f861 ("arm64: dts: ti: k3-am654-main: Update otap-del-sel values") Cc: stable@vger.kernel.org Signed-off-by: Judith Mendez Reviewed-by: Moteen Shah Link: https://lore.kernel.org/r/20250429173009.33994-1-jm@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-am65-main.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/ti/k3-am65-main.dtsi b/arch/arm64/boot/dts/ti/k3-am65-main.dtsi index 1f1af7ea23305..0534b53483473 100644 --- a/arch/arm64/boot/dts/ti/k3-am65-main.dtsi +++ b/arch/arm64/boot/dts/ti/k3-am65-main.dtsi @@ -449,6 +449,8 @@ ti,otap-del-sel-mmc-hs = <0x0>; ti,otap-del-sel-ddr52 = <0x5>; ti,otap-del-sel-hs200 = <0x5>; + ti,itap-del-sel-legacy = <0xa>; + ti,itap-del-sel-mmc-hs = <0x1>; ti,itap-del-sel-ddr52 = <0x0>; dma-coherent; status = "disabled"; -- GitLab From 7d6fd34220a755bcabd3150b87ebe89e0592edcd Mon Sep 17 00:00:00 2001 From: Yemike Abhilash Chandra Date: Tue, 15 Apr 2025 16:43:23 +0530 Subject: [PATCH 0646/2211] arm64: dts: ti: k3-am68-sk: Fix regulator hierarchy commit 7edf0a4d3bb7f5cd84f172b76c380c4259bb4ef8 upstream. Update the vin-supply of the TLV71033 regulator from LM5141 (vsys_3v3) to LM61460 (vsys_5v0) to match the schematics. Add a fixed regulator node for the LM61460 5V supply to support this change. AM68-SK schematics: https://www.ti.com/lit/zip/sprr463 Fixes: a266c180b398 ("arm64: dts: ti: k3-am68-sk: Add support for AM68 SK base board") Cc: stable@vger.kernel.org Signed-off-by: Yemike Abhilash Chandra Reviewed-by: Neha Malcom Francis Reviewed-by: Udit Kumar Link: https://lore.kernel.org/r/20250415111328.3847502-3-y-abhilashchandra@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-am68-sk-base-board.dts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/ti/k3-am68-sk-base-board.dts b/arch/arm64/boot/dts/ti/k3-am68-sk-base-board.dts index d5ceab79536ca..b40496097f82d 100644 --- a/arch/arm64/boot/dts/ti/k3-am68-sk-base-board.dts +++ b/arch/arm64/boot/dts/ti/k3-am68-sk-base-board.dts @@ -44,6 +44,17 @@ regulator-boot-on; }; + vsys_5v0: regulator-vsys5v0 { + /* Output of LM61460 */ + compatible = "regulator-fixed"; + regulator-name = "vsys_5v0"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vusb_main>; + regulator-always-on; + regulator-boot-on; + }; + vsys_3v3: regulator-vsys3v3 { /* Output of LM5141 */ compatible = "regulator-fixed"; @@ -76,7 +87,7 @@ regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; regulator-boot-on; - vin-supply = <&vsys_3v3>; + vin-supply = <&vsys_5v0>; gpios = <&main_gpio0 49 GPIO_ACTIVE_HIGH>; states = <1800000 0x0>, <3300000 0x1>; -- GitLab From 8a26672180a0452a360293f1edc28d4f8186a6a7 Mon Sep 17 00:00:00 2001 From: Yemike Abhilash Chandra Date: Tue, 15 Apr 2025 16:43:22 +0530 Subject: [PATCH 0647/2211] arm64: dts: ti: k3-j721e-sk: Add DT nodes for power regulators commit 97b67cc102dc2cc8aa39a569c22a196e21af5a21 upstream. Add device tree nodes for two power regulators on the J721E SK board. vsys_5v0: A fixed regulator representing the 5V supply output from the LM61460 and vdd_sd_dv: A GPIO-controlled TLV71033 regulator. J721E-SK schematics: https://www.ti.com/lit/zip/sprr438 Fixes: 1bfda92a3a36 ("arm64: dts: ti: Add support for J721E SK") Cc: stable@vger.kernel.org Signed-off-by: Yemike Abhilash Chandra Reviewed-by: Udit Kumar Link: https://lore.kernel.org/r/20250415111328.3847502-2-y-abhilashchandra@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-j721e-sk.dts | 31 ++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/arch/arm64/boot/dts/ti/k3-j721e-sk.dts b/arch/arm64/boot/dts/ti/k3-j721e-sk.dts index 6285e8d94ddeb..c8d7eb1814f06 100644 --- a/arch/arm64/boot/dts/ti/k3-j721e-sk.dts +++ b/arch/arm64/boot/dts/ti/k3-j721e-sk.dts @@ -184,6 +184,17 @@ regulator-boot-on; }; + vsys_5v0: fixedregulator-vsys5v0 { + /* Output of LM61460 */ + compatible = "regulator-fixed"; + regulator-name = "vsys_5v0"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vusb_main>; + regulator-always-on; + regulator-boot-on; + }; + vdd_mmc1: fixedregulator-sd { compatible = "regulator-fixed"; pinctrl-names = "default"; @@ -211,6 +222,20 @@ <3300000 0x1>; }; + vdd_sd_dv: gpio-regulator-TLV71033 { + compatible = "regulator-gpio"; + pinctrl-names = "default"; + pinctrl-0 = <&vdd_sd_dv_pins_default>; + regulator-name = "tlv71033"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + regulator-boot-on; + vin-supply = <&vsys_5v0>; + gpios = <&main_gpio0 118 GPIO_ACTIVE_HIGH>; + states = <1800000 0x0>, + <3300000 0x1>; + }; + transceiver1: can-phy1 { compatible = "ti,tcan1042"; #phy-cells = <0>; @@ -608,6 +633,12 @@ >; }; + vdd_sd_dv_pins_default: vdd-sd-dv-default-pins { + pinctrl-single,pins = < + J721E_IOPAD(0x1dc, PIN_OUTPUT, 7) /* (Y1) SPI1_CLK.GPIO0_118 */ + >; + }; + wkup_uart0_pins_default: wkup-uart0-default-pins { pinctrl-single,pins = < J721E_WKUP_IOPAD(0xa0, PIN_INPUT, 0) /* (J29) WKUP_UART0_RXD */ -- GitLab From 110875e707022343e88800d53fd4286c5d498f69 Mon Sep 17 00:00:00 2001 From: Yemike Abhilash Chandra Date: Tue, 15 Apr 2025 16:43:24 +0530 Subject: [PATCH 0648/2211] arm64: dts: ti: k3-j721e-sk: Remove clock-names property from IMX219 overlay commit 24ab76e55ef15450c6681a2b5db4d78f45200939 upstream. The IMX219 sensor device tree bindings do not include a clock-names property. Remove the incorrectly added clock-names entry to avoid dtbs_check warnings. Fixes: f767eb918096 ("arm64: dts: ti: k3-j721e-sk: Add overlay for IMX219") Cc: stable@vger.kernel.org Signed-off-by: Yemike Abhilash Chandra Reviewed-by: Neha Malcom Francis Reviewed-by: Jai Luthra Link: https://lore.kernel.org/r/20250415111328.3847502-4-y-abhilashchandra@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-j721e-sk-csi2-dual-imx219.dtso | 2 -- 1 file changed, 2 deletions(-) diff --git a/arch/arm64/boot/dts/ti/k3-j721e-sk-csi2-dual-imx219.dtso b/arch/arm64/boot/dts/ti/k3-j721e-sk-csi2-dual-imx219.dtso index 47bb5480b5b00..4a395d1209c8f 100644 --- a/arch/arm64/boot/dts/ti/k3-j721e-sk-csi2-dual-imx219.dtso +++ b/arch/arm64/boot/dts/ti/k3-j721e-sk-csi2-dual-imx219.dtso @@ -34,7 +34,6 @@ reg = <0x10>; clocks = <&clk_imx219_fixed>; - clock-names = "xclk"; port { csi2_cam0: endpoint { @@ -56,7 +55,6 @@ reg = <0x10>; clocks = <&clk_imx219_fixed>; - clock-names = "xclk"; port { csi2_cam1: endpoint { -- GitLab From 5b9e29e74d4ac38110a0566d6eecf90da1073a5e Mon Sep 17 00:00:00 2001 From: Yemike Abhilash Chandra Date: Tue, 15 Apr 2025 16:43:25 +0530 Subject: [PATCH 0649/2211] arm64: dts: ti: k3-j721e-sk: Add requiried voltage supplies for IMX219 commit c6a20a250200da6fcaf80fe945b7b92cba8cfe0f upstream. The device tree overlay for the IMX219 sensor requires three voltage supplies to be defined: VANA (analog), VDIG (digital core), and VDDL (digital I/O). Add the corresponding voltage supply definitions to avoid dtbs_check warnings. Fixes: f767eb918096 ("arm64: dts: ti: k3-j721e-sk: Add overlay for IMX219") Cc: stable@vger.kernel.org Signed-off-by: Yemike Abhilash Chandra Link: https://lore.kernel.org/r/20250415111328.3847502-5-y-abhilashchandra@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- .../dts/ti/k3-j721e-sk-csi2-dual-imx219.dtso | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/arch/arm64/boot/dts/ti/k3-j721e-sk-csi2-dual-imx219.dtso b/arch/arm64/boot/dts/ti/k3-j721e-sk-csi2-dual-imx219.dtso index 4a395d1209c8f..4eb3cffab0321 100644 --- a/arch/arm64/boot/dts/ti/k3-j721e-sk-csi2-dual-imx219.dtso +++ b/arch/arm64/boot/dts/ti/k3-j721e-sk-csi2-dual-imx219.dtso @@ -19,6 +19,33 @@ #clock-cells = <0>; clock-frequency = <24000000>; }; + + reg_2p8v: regulator-2p8v { + compatible = "regulator-fixed"; + regulator-name = "2P8V"; + regulator-min-microvolt = <2800000>; + regulator-max-microvolt = <2800000>; + vin-supply = <&vdd_sd_dv>; + regulator-always-on; + }; + + reg_1p8v: regulator-1p8v { + compatible = "regulator-fixed"; + regulator-name = "1P8V"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vdd_sd_dv>; + regulator-always-on; + }; + + reg_1p2v: regulator-1p2v { + compatible = "regulator-fixed"; + regulator-name = "1P2V"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + vin-supply = <&vdd_sd_dv>; + regulator-always-on; + }; }; &csi_mux { @@ -34,6 +61,9 @@ reg = <0x10>; clocks = <&clk_imx219_fixed>; + VANA-supply = <®_2p8v>; + VDIG-supply = <®_1p8v>; + VDDL-supply = <®_1p2v>; port { csi2_cam0: endpoint { @@ -55,6 +85,9 @@ reg = <0x10>; clocks = <&clk_imx219_fixed>; + VANA-supply = <®_2p8v>; + VDIG-supply = <®_1p8v>; + VDDL-supply = <®_1p2v>; port { csi2_cam1: endpoint { -- GitLab From 07f51c8f01f9ea89fc0e77f82fda1e31704dc78c Mon Sep 17 00:00:00 2001 From: Siddharth Vadapalli Date: Thu, 17 Apr 2025 18:02:43 +0530 Subject: [PATCH 0650/2211] arm64: dts: ti: k3-j722s-evm: Enable "serdes_wiz0" and "serdes_wiz1" commit 9d76be5828be44ed7a104cc21b4f875be4a63322 upstream. In preparation for disabling "serdes_wiz0" and "serdes_wiz1" device-tree nodes in the SoC file, enable them in the board file. The motivation for this change is that of following the existing convention of disabling nodes in the SoC file and only enabling the required ones in the board file. Fixes: 485705df5d5f ("arm64: dts: ti: k3-j722s: Enable PCIe and USB support on J722S-EVM") Cc: stable@vger.kernel.org Signed-off-by: Siddharth Vadapalli Reviewed-by: Udit Kumar Link: https://lore.kernel.org/r/20250417123246.2733923-2-s-vadapalli@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-j722s-evm.dts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/arm64/boot/dts/ti/k3-j722s-evm.dts b/arch/arm64/boot/dts/ti/k3-j722s-evm.dts index a00f4a7d20d98..710f80a14b647 100644 --- a/arch/arm64/boot/dts/ti/k3-j722s-evm.dts +++ b/arch/arm64/boot/dts/ti/k3-j722s-evm.dts @@ -720,6 +720,10 @@ ; }; +&serdes_wiz0 { + status = "okay"; +}; + &serdes0 { status = "okay"; serdes0_usb_link: phy@0 { @@ -731,6 +735,10 @@ }; }; +&serdes_wiz1 { + status = "okay"; +}; + &serdes1 { status = "okay"; serdes1_pcie_link: phy@0 { -- GitLab From 2ee377336c73180ae47b288910bdc276b3c927ca Mon Sep 17 00:00:00 2001 From: Siddharth Vadapalli Date: Thu, 17 Apr 2025 18:02:44 +0530 Subject: [PATCH 0651/2211] arm64: dts: ti: k3-j722s-main: Disable "serdes_wiz0" and "serdes_wiz1" commit 320d8a84f6f045dc876d4c2983f9024c7ac9d6df upstream. Since "serdes0" and "serdes1" which are the sub-nodes of "serdes_wiz0" and "serdes_wiz1" respectively, have been disabled in the SoC file already, and, given that these sub-nodes will only be enabled in a board file if the board utilizes any of the SERDES instances and the peripherals bound to them, we end up in a situation where the board file doesn't explicitly disable "serdes_wiz0" and "serdes_wiz1". As a consequence of this, the following errors show up when booting Linux: wiz bus@f0000:phy@f000000: probe with driver wiz failed with error -12 ... wiz bus@f0000:phy@f010000: probe with driver wiz failed with error -12 To not only fix the above, but also, in order to follow the convention of disabling device-tree nodes in the SoC file and enabling them in the board files for those boards which require them, disable "serdes_wiz0" and "serdes_wiz1" device-tree nodes. Fixes: 628e0a0118e6 ("arm64: dts: ti: k3-j722s-main: Add SERDES and PCIe support") Cc: stable@vger.kernel.org Signed-off-by: Siddharth Vadapalli Reviewed-by: Udit Kumar Link: https://lore.kernel.org/r/20250417123246.2733923-3-s-vadapalli@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-j722s-main.dtsi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/arm64/boot/dts/ti/k3-j722s-main.dtsi b/arch/arm64/boot/dts/ti/k3-j722s-main.dtsi index ed6f4ba08afca..ec8fcf9d16d6a 100644 --- a/arch/arm64/boot/dts/ti/k3-j722s-main.dtsi +++ b/arch/arm64/boot/dts/ti/k3-j722s-main.dtsi @@ -32,6 +32,8 @@ assigned-clocks = <&k3_clks 279 1>; assigned-clock-parents = <&k3_clks 279 5>; + status = "disabled"; + serdes0: serdes@f000000 { compatible = "ti,j721e-serdes-10g"; reg = <0x0f000000 0x00010000>; @@ -70,6 +72,8 @@ assigned-clocks = <&k3_clks 280 1>; assigned-clock-parents = <&k3_clks 280 5>; + status = "disabled"; + serdes1: serdes@f010000 { compatible = "ti,j721e-serdes-10g"; reg = <0x0f010000 0x00010000>; -- GitLab From b7550a25840a238e4beb4b25aa2b64cb12b3f13d Mon Sep 17 00:00:00 2001 From: Siddharth Vadapalli Date: Wed, 23 Apr 2025 20:46:12 +0530 Subject: [PATCH 0652/2211] arm64: dts: ti: k3-j784s4-j742s2-main-common: Fix length of serdes_ln_ctrl commit 3b62bd1fde50d54cc59015e14869e6cc3d6899e0 upstream. Commit under Fixes corrected the "mux-reg-masks" property but did not update the "length" field of the "reg" property to account for the newly added register offsets which extend the region. Fix this. Fixes: 38e7f9092efb ("arm64: dts: ti: k3-j784s4-j742s2-main-common: Fix serdes_ln_ctrl reg-masks") Cc: stable@vger.kernel.org Signed-off-by: Siddharth Vadapalli Reviewed-by: Udit Kumar Link: https://lore.kernel.org/r/20250423151612.48848-1-s-vadapalli@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/boot/dts/ti/k3-j784s4-j742s2-main-common.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/ti/k3-j784s4-j742s2-main-common.dtsi b/arch/arm64/boot/dts/ti/k3-j784s4-j742s2-main-common.dtsi index 2bf4547485e1b..013c0d25d3481 100644 --- a/arch/arm64/boot/dts/ti/k3-j784s4-j742s2-main-common.dtsi +++ b/arch/arm64/boot/dts/ti/k3-j784s4-j742s2-main-common.dtsi @@ -77,7 +77,7 @@ serdes_ln_ctrl: mux-controller@4080 { compatible = "reg-mux"; - reg = <0x00004080 0x30>; + reg = <0x00004080 0x50>; #mux-control-cells = <1>; mux-reg-masks = <0x0 0x3>, <0x4 0x3>, /* SERDES0 lane0/1 select */ <0x8 0x3>, <0xc 0x3>, /* SERDES0 lane2/3 select */ -- GitLab From 2f2190ce4ca972051cac6a8d7937448f8cb9673c Mon Sep 17 00:00:00 2001 From: Pedro Tammela Date: Thu, 22 May 2025 15:14:47 -0300 Subject: [PATCH 0653/2211] net_sched: hfsc: Address reentrant enqueue adding class to eltree twice commit ac9fe7dd8e730a103ae4481147395cc73492d786 upstream. Savino says: "We are writing to report that this recent patch (141d34391abbb315d68556b7c67ad97885407547) [1] can be bypassed, and a UAF can still occur when HFSC is utilized with NETEM. The patch only checks the cl->cl_nactive field to determine whether it is the first insertion or not [2], but this field is only incremented by init_vf [3]. By using HFSC_RSC (which uses init_ed) [4], it is possible to bypass the check and insert the class twice in the eltree. Under normal conditions, this would lead to an infinite loop in hfsc_dequeue for the reasons we already explained in this report [5]. However, if TBF is added as root qdisc and it is configured with a very low rate, it can be utilized to prevent packets from being dequeued. This behavior can be exploited to perform subsequent insertions in the HFSC eltree and cause a UAF." To fix both the UAF and the infinite loop, with netem as an hfsc child, check explicitly in hfsc_enqueue whether the class is already in the eltree whenever the HFSC_RSC flag is set. [1] https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=141d34391abbb315d68556b7c67ad97885407547 [2] https://elixir.bootlin.com/linux/v6.15-rc5/source/net/sched/sch_hfsc.c#L1572 [3] https://elixir.bootlin.com/linux/v6.15-rc5/source/net/sched/sch_hfsc.c#L677 [4] https://elixir.bootlin.com/linux/v6.15-rc5/source/net/sched/sch_hfsc.c#L1574 [5] https://lore.kernel.org/netdev/8DuRWwfqjoRDLDmBMlIfbrsZg9Gx50DHJc1ilxsEBNe2D6NMoigR_eIRIG0LOjMc3r10nUUZtArXx4oZBIdUfZQrwjcQhdinnMis_0G7VEk=@willsroot.io/T/#u Fixes: 37d9cf1a3ce3 ("sched: Fix detection of empty queues in child qdiscs") Reported-by: Savino Dicanosa Reported-by: William Liu Acked-by: Jamal Hadi Salim Tested-by: Victor Nogueira Signed-off-by: Pedro Tammela Link: https://patch.msgid.link/20250522181448.1439717-2-pctammela@mojatatu.com Signed-off-by: Paolo Abeni Signed-off-by: Greg Kroah-Hartman --- net/sched/sch_hfsc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index 7986145a527cb..5a7745170e84b 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c @@ -175,6 +175,11 @@ struct hfsc_sched { #define HT_INFINITY 0xffffffffffffffffULL /* infinite time value */ +static bool cl_in_el_or_vttree(struct hfsc_class *cl) +{ + return ((cl->cl_flags & HFSC_FSC) && cl->cl_nactive) || + ((cl->cl_flags & HFSC_RSC) && !RB_EMPTY_NODE(&cl->el_node)); +} /* * eligible tree holds backlogged classes being sorted by their eligible times. @@ -1040,6 +1045,8 @@ hfsc_change_class(struct Qdisc *sch, u32 classid, u32 parentid, if (cl == NULL) return -ENOBUFS; + RB_CLEAR_NODE(&cl->el_node); + err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack); if (err) { kfree(cl); @@ -1572,7 +1579,7 @@ hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free) sch->qstats.backlog += len; sch->q.qlen++; - if (first && !cl->cl_nactive) { + if (first && !cl_in_el_or_vttree(cl)) { if (cl->cl_flags & HFSC_RSC) init_ed(cl, len); if (cl->cl_flags & HFSC_FSC) -- GitLab From c6d2c0d46121f44fb9384f8aa60ad848a61240a7 Mon Sep 17 00:00:00 2001 From: Robin Murphy Date: Thu, 8 May 2025 16:16:40 +0100 Subject: [PATCH 0654/2211] perf/arm-cmn: Fix REQ2/SNP2 mixup commit 11b0f576e0cbde6a12258f2af6753b17b8df342b upstream. Somehow the encodings for REQ2/SNP2 channels in XP events got mixed up... Unmix them. CC: stable@vger.kernel.org Fixes: 23760a014417 ("perf/arm-cmn: Add CMN-700 support") Signed-off-by: Robin Murphy Link: https://lore.kernel.org/r/087023e9737ac93d7ec7a841da904758c254cb01.1746717400.git.robin.murphy@arm.com Signed-off-by: Will Deacon Signed-off-by: Greg Kroah-Hartman --- drivers/perf/arm-cmn.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/perf/arm-cmn.c b/drivers/perf/arm-cmn.c index 30506c43776f1..0ee2ddb9ef216 100644 --- a/drivers/perf/arm-cmn.c +++ b/drivers/perf/arm-cmn.c @@ -727,8 +727,8 @@ static umode_t arm_cmn_event_attr_is_visible(struct kobject *kobj, if ((chan == 5 && cmn->rsp_vc_num < 2) || (chan == 6 && cmn->dat_vc_num < 2) || - (chan == 7 && cmn->snp_vc_num < 2) || - (chan == 8 && cmn->req_vc_num < 2)) + (chan == 7 && cmn->req_vc_num < 2) || + (chan == 8 && cmn->snp_vc_num < 2)) return 0; } @@ -884,8 +884,8 @@ static umode_t arm_cmn_event_attr_is_visible(struct kobject *kobj, _CMN_EVENT_XP(pub_##_name, (_event) | (4 << 5)), \ _CMN_EVENT_XP(rsp2_##_name, (_event) | (5 << 5)), \ _CMN_EVENT_XP(dat2_##_name, (_event) | (6 << 5)), \ - _CMN_EVENT_XP(snp2_##_name, (_event) | (7 << 5)), \ - _CMN_EVENT_XP(req2_##_name, (_event) | (8 << 5)) + _CMN_EVENT_XP(req2_##_name, (_event) | (7 << 5)), \ + _CMN_EVENT_XP(snp2_##_name, (_event) | (8 << 5)) #define CMN_EVENT_XP_DAT(_name, _event) \ _CMN_EVENT_XP_PORT(dat_##_name, (_event) | (3 << 5)), \ -- GitLab From d96289fcac2630fa18666a7c5f4d4b4a5958f395 Mon Sep 17 00:00:00 2001 From: Robin Murphy Date: Mon, 12 May 2025 18:11:54 +0100 Subject: [PATCH 0655/2211] perf/arm-cmn: Initialise cmn->cpu earlier commit 597704e201068db3d104de3c7a4d447ff8209127 upstream. For all the complexity of handling affinity for CPU hotplug, what we've apparently managed to overlook is that arm_cmn_init_irqs() has in fact always been setting the *initial* affinity of all IRQs to CPU 0, not the CPU we subsequently choose for event scheduling. Oh dear. Cc: stable@vger.kernel.org Fixes: 0ba64770a2f2 ("perf: Add Arm CMN-600 PMU driver") Signed-off-by: Robin Murphy Reviewed-by: Ilkka Koskinen Link: https://lore.kernel.org/r/b12fccba6b5b4d2674944f59e4daad91cd63420b.1747069914.git.robin.murphy@arm.com Signed-off-by: Will Deacon Signed-off-by: Greg Kroah-Hartman --- drivers/perf/arm-cmn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/perf/arm-cmn.c b/drivers/perf/arm-cmn.c index 0ee2ddb9ef216..552a194e0ae67 100644 --- a/drivers/perf/arm-cmn.c +++ b/drivers/perf/arm-cmn.c @@ -2557,6 +2557,7 @@ static int arm_cmn_probe(struct platform_device *pdev) cmn->dev = &pdev->dev; cmn->part = (unsigned long)device_get_match_data(cmn->dev); + cmn->cpu = cpumask_local_spread(0, dev_to_node(cmn->dev)); platform_set_drvdata(pdev, cmn); if (cmn->part == PART_CMN600 && has_acpi_companion(cmn->dev)) { @@ -2584,7 +2585,6 @@ static int arm_cmn_probe(struct platform_device *pdev) if (err) return err; - cmn->cpu = cpumask_local_spread(0, dev_to_node(cmn->dev)); cmn->pmu = (struct pmu) { .module = THIS_MODULE, .parent = cmn->dev, -- GitLab From a6d87cce788d2110a91817fe33ee3a927f1465fe Mon Sep 17 00:00:00 2001 From: Robin Murphy Date: Mon, 19 May 2025 11:56:04 +0100 Subject: [PATCH 0656/2211] perf/arm-cmn: Add CMN S3 ACPI binding commit 8c138a189f6db295ceb32258d46ac061df0823e5 upstream. An ACPI binding for CMN S3 was not yet finalised when the driver support was originally written, but v1.2 of DEN0093 "ACPI for Arm Components" has at last been published; support ACPI systems using the proper HID. Cc: stable@vger.kernel.org Fixes: 0dc2f4963f7e ("perf/arm-cmn: Support CMN S3") Signed-off-by: Robin Murphy Link: https://lore.kernel.org/r/7dafe147f186423020af49d7037552ee59c60e97.1747652164.git.robin.murphy@arm.com Signed-off-by: Will Deacon Signed-off-by: Greg Kroah-Hartman --- drivers/perf/arm-cmn.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/perf/arm-cmn.c b/drivers/perf/arm-cmn.c index 552a194e0ae67..ff17e0f95fbb8 100644 --- a/drivers/perf/arm-cmn.c +++ b/drivers/perf/arm-cmn.c @@ -2650,6 +2650,7 @@ static const struct acpi_device_id arm_cmn_acpi_match[] = { { "ARMHC600", PART_CMN600 }, { "ARMHC650" }, { "ARMHC700" }, + { "ARMHC003" }, {} }; MODULE_DEVICE_TABLE(acpi, arm_cmn_acpi_match); -- GitLab From 8fdca436d8f2aceb8a245659ad2caa4d5b547618 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Mon, 14 Apr 2025 15:55:06 +0200 Subject: [PATCH 0657/2211] coredump: fix error handling for replace_fd() commit 95c5f43181fe9c1b5e5a4bd3281c857a5259991f upstream. The replace_fd() helper returns the file descriptor number on success and a negative error code on failure. The current error handling in umh_pipe_setup() only works because the file descriptor that is replaced is zero but that's pretty volatile. Explicitly check for a negative error code. Link: https://lore.kernel.org/20250414-work-coredump-v2-2-685bf231f828@kernel.org Tested-by: Luca Boccassi Reviewed-by: Oleg Nesterov Signed-off-by: Christian Brauner Signed-off-by: Greg Kroah-Hartman --- fs/coredump.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/coredump.c b/fs/coredump.c index 2b8c36c9660c5..d3575afe9e75c 100644 --- a/fs/coredump.c +++ b/fs/coredump.c @@ -507,7 +507,9 @@ static int umh_pipe_setup(struct subprocess_info *info, struct cred *new) { struct file *files[2]; struct coredump_params *cp = (struct coredump_params *)info->data; - int err = create_pipe_files(files, 0); + int err; + + err = create_pipe_files(files, 0); if (err) return err; @@ -515,10 +517,13 @@ static int umh_pipe_setup(struct subprocess_info *info, struct cred *new) err = replace_fd(0, files[0], 0); fput(files[0]); + if (err < 0) + return err; + /* and disallow core files too */ current->signal->rlim[RLIMIT_CORE] = (struct rlimit){1, 1}; - return err; + return 0; } void do_coredump(const kernel_siginfo_t *siginfo) -- GitLab From 510cf09f2dedfc44ec8501793e825f8d12e80809 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Mon, 14 Apr 2025 15:55:07 +0200 Subject: [PATCH 0658/2211] coredump: hand a pidfd to the usermode coredump helper commit b5325b2a270fcaf7b2a9a0f23d422ca8a5a8bdea upstream. Give userspace a way to instruct the kernel to install a pidfd into the usermode helper process. This makes coredump handling a lot more reliable for userspace. In parallel with this commit we already have systemd adding support for this in [1]. We create a pidfs file for the coredumping process when we process the corename pattern. When the usermode helper process is forked we then install the pidfs file as file descriptor three into the usermode helpers file descriptor table so it's available to the exec'd program. Since usermode helpers are either children of the system_unbound_wq workqueue or kthreadd we know that the file descriptor table is empty and can thus always use three as the file descriptor number. Note, that we'll install a pidfd for the thread-group leader even if a subthread is calling do_coredump(). We know that task linkage hasn't been removed due to delay_group_leader() and even if this @current isn't the actual thread-group leader we know that the thread-group leader cannot be reaped until @current has exited. [brauner: This is a backport for the v6.12 series. The upstream kernel has changed pidfs_alloc_file() to set O_RDWR implicitly instead of forcing callers to set it. Let's minimize the churn and just let the coredump umh handler raise O_RDWR.] Link: https://github.com/systemd/systemd/pull/37125 [1] Link: https://lore.kernel.org/20250414-work-coredump-v2-3-685bf231f828@kernel.org Tested-by: Luca Boccassi Reviewed-by: Oleg Nesterov Signed-off-by: Christian Brauner Signed-off-by: Greg Kroah-Hartman --- fs/coredump.c | 56 +++++++++++++++++++++++++++++++++++++--- include/linux/coredump.h | 1 + 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/fs/coredump.c b/fs/coredump.c index d3575afe9e75c..64894ba6efca4 100644 --- a/fs/coredump.c +++ b/fs/coredump.c @@ -43,6 +43,8 @@ #include #include #include +#include +#include #include #include @@ -60,6 +62,12 @@ static void free_vma_snapshot(struct coredump_params *cprm); #define CORE_FILE_NOTE_SIZE_DEFAULT (4*1024*1024) /* Define a reasonable max cap */ #define CORE_FILE_NOTE_SIZE_MAX (16*1024*1024) +/* + * File descriptor number for the pidfd for the thread-group leader of + * the coredumping task installed into the usermode helper's file + * descriptor table. + */ +#define COREDUMP_PIDFD_NUMBER 3 static int core_uses_pid; static unsigned int core_pipe_limit; @@ -339,6 +347,27 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm, case 'C': err = cn_printf(cn, "%d", cprm->cpu); break; + /* pidfd number */ + case 'F': { + /* + * Installing a pidfd only makes sense if + * we actually spawn a usermode helper. + */ + if (!ispipe) + break; + + /* + * Note that we'll install a pidfd for the + * thread-group leader. We know that task + * linkage hasn't been removed yet and even if + * this @current isn't the actual thread-group + * leader we know that the thread-group leader + * cannot be reaped until @current has exited. + */ + cprm->pid = task_tgid(current); + err = cn_printf(cn, "%d", COREDUMP_PIDFD_NUMBER); + break; + } default: break; } @@ -493,7 +522,7 @@ static void wait_for_dump_helpers(struct file *file) } /* - * umh_pipe_setup + * umh_coredump_setup * helper function to customize the process used * to collect the core in userspace. Specifically * it sets up a pipe and installs it as fd 0 (stdin) @@ -503,12 +532,31 @@ static void wait_for_dump_helpers(struct file *file) * is a special value that we use to trap recursive * core dumps */ -static int umh_pipe_setup(struct subprocess_info *info, struct cred *new) +static int umh_coredump_setup(struct subprocess_info *info, struct cred *new) { struct file *files[2]; struct coredump_params *cp = (struct coredump_params *)info->data; int err; + if (cp->pid) { + struct file *pidfs_file __free(fput) = NULL; + + pidfs_file = pidfs_alloc_file(cp->pid, O_RDWR); + if (IS_ERR(pidfs_file)) + return PTR_ERR(pidfs_file); + + /* + * Usermode helpers are childen of either + * system_unbound_wq or of kthreadd. So we know that + * we're starting off with a clean file descriptor + * table. So we should always be able to use + * COREDUMP_PIDFD_NUMBER as our file descriptor value. + */ + err = replace_fd(COREDUMP_PIDFD_NUMBER, pidfs_file, 0); + if (err < 0) + return err; + } + err = create_pipe_files(files, 0); if (err) return err; @@ -598,7 +646,7 @@ void do_coredump(const kernel_siginfo_t *siginfo) } if (cprm.limit == 1) { - /* See umh_pipe_setup() which sets RLIMIT_CORE = 1. + /* See umh_coredump_setup() which sets RLIMIT_CORE = 1. * * Normally core limits are irrelevant to pipes, since * we're not writing to the file system, but we use @@ -637,7 +685,7 @@ void do_coredump(const kernel_siginfo_t *siginfo) retval = -ENOMEM; sub_info = call_usermodehelper_setup(helper_argv[0], helper_argv, NULL, GFP_KERNEL, - umh_pipe_setup, NULL, &cprm); + umh_coredump_setup, NULL, &cprm); if (sub_info) retval = call_usermodehelper_exec(sub_info, UMH_WAIT_EXEC); diff --git a/include/linux/coredump.h b/include/linux/coredump.h index 77e6e195d1d68..76e41805b92de 100644 --- a/include/linux/coredump.h +++ b/include/linux/coredump.h @@ -28,6 +28,7 @@ struct coredump_params { int vma_count; size_t vma_data_size; struct core_vma_metadata *vma_meta; + struct pid *pid; }; extern unsigned int core_file_note_size_limit; -- GitLab From 141054adba2f3fea25b945083b1e334bf2e6a41a Mon Sep 17 00:00:00 2001 From: Purva Yeshi Date: Thu, 10 Apr 2025 16:32:16 +0530 Subject: [PATCH 0659/2211] dmaengine: idxd: cdev: Fix uninitialized use of sva in idxd_cdev_open [ Upstream commit 97994333de2b8062d2df4e6ce0dc65c2dc0f40dc ] Fix Smatch-detected issue: drivers/dma/idxd/cdev.c:321 idxd_cdev_open() error: uninitialized symbol 'sva'. 'sva' pointer may be used uninitialized in error handling paths. Specifically, if PASID support is enabled and iommu_sva_bind_device() returns an error, the code jumps to the cleanup label and attempts to call iommu_sva_unbind_device(sva) without ensuring that sva was successfully assigned. This triggers a Smatch warning about an uninitialized symbol. Initialize sva to NULL at declaration and add a check using IS_ERR_OR_NULL() before unbinding the device. This ensures the function does not use an invalid or uninitialized pointer during cleanup. Signed-off-by: Purva Yeshi Reviewed-by: Dave Jiang Acked-by: Vinicius Costa Gomes Link: https://lore.kernel.org/r/20250410110216.21592-1-purvayeshi550@gmail.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/dma/idxd/cdev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c index 22aa2bab3693c..19a58c4ecef3f 100644 --- a/drivers/dma/idxd/cdev.c +++ b/drivers/dma/idxd/cdev.c @@ -225,7 +225,7 @@ static int idxd_cdev_open(struct inode *inode, struct file *filp) struct idxd_wq *wq; struct device *dev, *fdev; int rc = 0; - struct iommu_sva *sva; + struct iommu_sva *sva = NULL; unsigned int pasid; struct idxd_cdev *idxd_cdev; @@ -322,7 +322,7 @@ failed_set_pasid: if (device_user_pasid_enabled(idxd)) idxd_xa_pasid_remove(ctx); failed_get_pasid: - if (device_user_pasid_enabled(idxd)) + if (device_user_pasid_enabled(idxd) && !IS_ERR_OR_NULL(sva)) iommu_sva_unbind_device(sva); failed: mutex_unlock(&wq->wq_lock); -- GitLab From f7cbb7035c858bc977d2e6950dcdc0e78e2787cd Mon Sep 17 00:00:00 2001 From: Milton Barrera Date: Wed, 9 Apr 2025 00:04:28 -0600 Subject: [PATCH 0660/2211] HID: quirks: Add ADATA XPG alpha wireless mouse support [ Upstream commit fa9fdeea1b7d6440c22efa6d59a769eae8bc89f1 ] This patch adds HID_QUIRK_ALWAYS_POLL for the ADATA XPG wireless gaming mouse (USB ID 125f:7505) and its USB dongle (USB ID 125f:7506). Without this quirk, the device does not generate input events properly. Signed-off-by: Milton Barrera Signed-off-by: Jiri Kosina Signed-off-by: Sasha Levin --- drivers/hid/hid-ids.h | 4 ++++ drivers/hid/hid-quirks.c | 2 ++ 2 files changed, 6 insertions(+) diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 92baa34f42f28..c6424f6259487 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -41,6 +41,10 @@ #define USB_VENDOR_ID_ACTIONSTAR 0x2101 #define USB_DEVICE_ID_ACTIONSTAR_1011 0x1011 +#define USB_VENDOR_ID_ADATA_XPG 0x125f +#define USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE 0x7505 +#define USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE_DONGLE 0x7506 + #define USB_VENDOR_ID_ADS_TECH 0x06e1 #define USB_DEVICE_ID_ADS_TECH_RADIO_SI470X 0xa155 diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c index 5d7a418ccdbec..73979643315bf 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c @@ -27,6 +27,8 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD), HID_QUIRK_BADPAD }, { HID_USB_DEVICE(USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR), HID_QUIRK_BADPAD }, + { HID_USB_DEVICE(USB_VENDOR_ID_ADATA_XPG, USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_ADATA_XPG, USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE_DONGLE), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_AFATECH, USB_DEVICE_ID_AFATECH_AF9016), HID_QUIRK_FULLSPEED_INTERVAL }, { HID_USB_DEVICE(USB_VENDOR_ID_AIREN, USB_DEVICE_ID_AIREN_SLIMPLUS), HID_QUIRK_NOGET }, { HID_USB_DEVICE(USB_VENDOR_ID_AKAI_09E8, USB_DEVICE_ID_AKAI_09E8_MIDIMIX), HID_QUIRK_NO_INIT_REPORTS }, -- GitLab From 16ed9db158efda7345c7bf918a140b1cceecd7f6 Mon Sep 17 00:00:00 2001 From: Jeff Layton Date: Thu, 10 Apr 2025 16:42:03 -0400 Subject: [PATCH 0661/2211] nfs: don't share pNFS DS connections between net namespaces [ Upstream commit 6b9785dc8b13d9fb75ceec8cf4ea7ec3f3b1edbc ] Currently, different NFS clients can share the same DS connections, even when they are in different net namespaces. If a containerized client creates a DS connection, another container can find and use it. When the first client exits, the connection will close which can lead to stalls in other clients. Add a net namespace pointer to struct nfs4_pnfs_ds, and compare those value to the caller's netns in _data_server_lookup_locked() when searching for a nfs4_pnfs_ds to match. Reported-by: Omar Sandoval Reported-by: Sargun Dillon Closes: https://lore.kernel.org/linux-nfs/Z_ArpQC_vREh_hEA@telecaster/ Tested-by: Sargun Dillon Signed-off-by: Jeff Layton Reviewed-by: Benjamin Coddington Link: https://lore.kernel.org/r/20250410-nfs-ds-netns-v2-1-f80b7979ba80@kernel.org Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- fs/nfs/filelayout/filelayoutdev.c | 6 +++--- fs/nfs/flexfilelayout/flexfilelayoutdev.c | 6 +++--- fs/nfs/pnfs.h | 4 +++- fs/nfs/pnfs_nfs.c | 9 +++++---- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/fs/nfs/filelayout/filelayoutdev.c b/fs/nfs/filelayout/filelayoutdev.c index 4fa304fa5bc4b..29d9234d5c085 100644 --- a/fs/nfs/filelayout/filelayoutdev.c +++ b/fs/nfs/filelayout/filelayoutdev.c @@ -76,6 +76,7 @@ nfs4_fl_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, struct page *scratch; struct list_head dsaddrs; struct nfs4_pnfs_ds_addr *da; + struct net *net = server->nfs_client->cl_net; /* set up xdr stream */ scratch = alloc_page(gfp_flags); @@ -159,8 +160,7 @@ nfs4_fl_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, mp_count = be32_to_cpup(p); /* multipath count */ for (j = 0; j < mp_count; j++) { - da = nfs4_decode_mp_ds_addr(server->nfs_client->cl_net, - &stream, gfp_flags); + da = nfs4_decode_mp_ds_addr(net, &stream, gfp_flags); if (da) list_add_tail(&da->da_node, &dsaddrs); } @@ -170,7 +170,7 @@ nfs4_fl_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, goto out_err_free_deviceid; } - dsaddr->ds_list[i] = nfs4_pnfs_ds_add(&dsaddrs, gfp_flags); + dsaddr->ds_list[i] = nfs4_pnfs_ds_add(net, &dsaddrs, gfp_flags); if (!dsaddr->ds_list[i]) goto out_err_drain_dsaddrs; trace_fl_getdevinfo(server, &pdev->dev_id, dsaddr->ds_list[i]->ds_remotestr); diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c b/fs/nfs/flexfilelayout/flexfilelayoutdev.c index e58bedfb1dcc1..4a304cf17c4b0 100644 --- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c +++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c @@ -49,6 +49,7 @@ nfs4_ff_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, struct nfs4_pnfs_ds_addr *da; struct nfs4_ff_layout_ds *new_ds = NULL; struct nfs4_ff_ds_version *ds_versions = NULL; + struct net *net = server->nfs_client->cl_net; u32 mp_count; u32 version_count; __be32 *p; @@ -80,8 +81,7 @@ nfs4_ff_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, for (i = 0; i < mp_count; i++) { /* multipath ds */ - da = nfs4_decode_mp_ds_addr(server->nfs_client->cl_net, - &stream, gfp_flags); + da = nfs4_decode_mp_ds_addr(net, &stream, gfp_flags); if (da) list_add_tail(&da->da_node, &dsaddrs); } @@ -149,7 +149,7 @@ nfs4_ff_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, new_ds->ds_versions = ds_versions; new_ds->ds_versions_cnt = version_count; - new_ds->ds = nfs4_pnfs_ds_add(&dsaddrs, gfp_flags); + new_ds->ds = nfs4_pnfs_ds_add(net, &dsaddrs, gfp_flags); if (!new_ds->ds) goto out_err_drain_dsaddrs; diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 30d2613e912b8..91ff877185c8a 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -60,6 +60,7 @@ struct nfs4_pnfs_ds { struct list_head ds_node; /* nfs4_pnfs_dev_hlist dev_dslist */ char *ds_remotestr; /* comma sep list of addrs */ struct list_head ds_addrs; + const struct net *ds_net; struct nfs_client *ds_clp; refcount_t ds_count; unsigned long ds_state; @@ -415,7 +416,8 @@ int pnfs_generic_commit_pagelist(struct inode *inode, int pnfs_generic_scan_commit_lists(struct nfs_commit_info *cinfo, int max); void pnfs_generic_write_commit_done(struct rpc_task *task, void *data); void nfs4_pnfs_ds_put(struct nfs4_pnfs_ds *ds); -struct nfs4_pnfs_ds *nfs4_pnfs_ds_add(struct list_head *dsaddrs, +struct nfs4_pnfs_ds *nfs4_pnfs_ds_add(const struct net *net, + struct list_head *dsaddrs, gfp_t gfp_flags); void nfs4_pnfs_v3_ds_connect_unload(void); int nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds, diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c index dbef837e871ad..2ee20a0f0b36d 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -604,12 +604,12 @@ _same_data_server_addrs_locked(const struct list_head *dsaddrs1, * Lookup DS by addresses. nfs4_ds_cache_lock is held */ static struct nfs4_pnfs_ds * -_data_server_lookup_locked(const struct list_head *dsaddrs) +_data_server_lookup_locked(const struct net *net, const struct list_head *dsaddrs) { struct nfs4_pnfs_ds *ds; list_for_each_entry(ds, &nfs4_data_server_cache, ds_node) - if (_same_data_server_addrs_locked(&ds->ds_addrs, dsaddrs)) + if (ds->ds_net == net && _same_data_server_addrs_locked(&ds->ds_addrs, dsaddrs)) return ds; return NULL; } @@ -716,7 +716,7 @@ out_err: * uncached and return cached struct nfs4_pnfs_ds. */ struct nfs4_pnfs_ds * -nfs4_pnfs_ds_add(struct list_head *dsaddrs, gfp_t gfp_flags) +nfs4_pnfs_ds_add(const struct net *net, struct list_head *dsaddrs, gfp_t gfp_flags) { struct nfs4_pnfs_ds *tmp_ds, *ds = NULL; char *remotestr; @@ -734,13 +734,14 @@ nfs4_pnfs_ds_add(struct list_head *dsaddrs, gfp_t gfp_flags) remotestr = nfs4_pnfs_remotestr(dsaddrs, gfp_flags); spin_lock(&nfs4_ds_cache_lock); - tmp_ds = _data_server_lookup_locked(dsaddrs); + tmp_ds = _data_server_lookup_locked(net, dsaddrs); if (tmp_ds == NULL) { INIT_LIST_HEAD(&ds->ds_addrs); list_splice_init(dsaddrs, &ds->ds_addrs); ds->ds_remotestr = remotestr; refcount_set(&ds->ds_count, 1); INIT_LIST_HEAD(&ds->ds_node); + ds->ds_net = net; ds->ds_clp = NULL; list_add(&ds->ds_node, &nfs4_data_server_cache); dprintk("%s add new data server %s\n", __func__, -- GitLab From cb5d7e7a6f790cfd2fc1a090d78fa5c60856d4a8 Mon Sep 17 00:00:00 2001 From: John Chau Date: Mon, 5 May 2025 01:55:13 +0900 Subject: [PATCH 0662/2211] platform/x86: thinkpad_acpi: Support also NEC Lavie X1475JAS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit a032f29a15412fab9f4352e0032836d51420a338 ] Change get_thinkpad_model_data() to check for additional vendor name "NEC" in order to support NEC Lavie X1475JAS notebook (and perhaps more). The reason of this works with minimal changes is because NEC Lavie X1475JAS is a Thinkpad inside. ACPI dumps reveals its OEM ID to be "LENOVO", BIOS version "R2PET30W" matches typical Lenovo BIOS version, the existence of HKEY of LEN0268, with DMI fw string is "R2PHT24W". I compiled and tested with my own machine, attached the dmesg below as proof of work: [ 6.288932] thinkpad_acpi: ThinkPad ACPI Extras v0.26 [ 6.288937] thinkpad_acpi: http://ibm-acpi.sf.net/ [ 6.288938] thinkpad_acpi: ThinkPad BIOS R2PET30W (1.11 ), EC R2PHT24W [ 6.307000] thinkpad_acpi: radio switch found; radios are enabled [ 6.307030] thinkpad_acpi: This ThinkPad has standard ACPI backlight brightness control, supported by the ACPI video driver [ 6.307033] thinkpad_acpi: Disabling thinkpad-acpi brightness events by default... [ 6.320322] thinkpad_acpi: rfkill switch tpacpi_bluetooth_sw: radio is unblocked [ 6.371963] thinkpad_acpi: secondary fan control detected & enabled [ 6.391922] thinkpad_acpi: battery 1 registered (start 0, stop 85, behaviours: 0x7) [ 6.398375] input: ThinkPad Extra Buttons as /devices/platform/thinkpad_acpi/input/input13 Signed-off-by: John Chau Link: https://lore.kernel.org/r/20250504165513.295135-1-johnchau@0atlas.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/thinkpad_acpi.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index dea40da867552..fa60a221cfb14 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -11472,6 +11472,8 @@ static int __must_check __init get_thinkpad_model_data( tp->vendor = PCI_VENDOR_ID_IBM; else if (dmi_name_in_vendors("LENOVO")) tp->vendor = PCI_VENDOR_ID_LENOVO; + else if (dmi_name_in_vendors("NEC")) + tp->vendor = PCI_VENDOR_ID_LENOVO; else return 0; -- GitLab From cef4f57980d0e034e7b50b99e9ab1cc25f70af95 Mon Sep 17 00:00:00 2001 From: Masahiro Yamada Date: Wed, 7 May 2025 16:49:33 +0900 Subject: [PATCH 0663/2211] um: let 'make clean' properly clean underlying SUBARCH as well [ Upstream commit ab09da75700e9d25c7dfbc7f7934920beb5e39b9 ] Building the kernel with O= is affected by stale in-tree build artifacts. So, if the source tree is not clean, Kbuild displays the following: $ make ARCH=um O=build defconfig make[1]: Entering directory '/.../linux/build' *** *** The source tree is not clean, please run 'make ARCH=um mrproper' *** in /.../linux *** make[2]: *** [/.../linux/Makefile:673: outputmakefile] Error 1 make[1]: *** [/.../linux/Makefile:248: __sub-make] Error 2 make[1]: Leaving directory '/.../linux/build' make: *** [Makefile:248: __sub-make] Error 2 Usually, running 'make mrproper' is sufficient for cleaning the source tree for out-of-tree builds. However, building UML generates build artifacts not only in arch/um/, but also in the SUBARCH directory (i.e., arch/x86/). If in-tree stale files remain under arch/x86/, Kbuild will reuse them instead of creating new ones under the specified build directory. This commit makes 'make ARCH=um clean' recurse into the SUBARCH directory. Reported-by: Shuah Khan Closes: https://lore.kernel.org/lkml/20250502172459.14175-1-skhan@linuxfoundation.org/ Signed-off-by: Masahiro Yamada Acked-by: Johannes Berg Reviewed-by: David Gow Reviewed-by: Shuah Khan Signed-off-by: Sasha Levin --- arch/um/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/um/Makefile b/arch/um/Makefile index 00b63bac5effb..3317d87e20920 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile @@ -151,5 +151,6 @@ MRPROPER_FILES += $(HOST_DIR)/include/generated archclean: @find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \ -o -name '*.gcov' \) -type f -print | xargs rm -f + $(Q)$(MAKE) -f $(srctree)/Makefile ARCH=$(HEADER_ARCH) clean export HEADER_ARCH SUBARCH USER_CFLAGS CFLAGS_NO_HARDENING DEV_NULL_PATH -- GitLab From afe090366f470f77e140ff3407db813f57852c04 Mon Sep 17 00:00:00 2001 From: Markus Burri Date: Fri, 9 May 2025 17:04:59 +0200 Subject: [PATCH 0664/2211] gpio: virtuser: fix potential out-of-bound write [ Upstream commit 7118be7c6072f40391923543fdd1563b8d56377c ] If the caller wrote more characters, count is truncated to the max available space in "simple_write_to_buffer". Check that the input size does not exceed the buffer size. Write a zero termination afterwards. Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202505091754.285hHbr2-lkp@intel.com/ Signed-off-by: Markus Burri Link: https://lore.kernel.org/r/20250509150459.115489-1-markus.burri@mt.com Signed-off-by: Bartosz Golaszewski Signed-off-by: Sasha Levin --- drivers/gpio/gpio-virtuser.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/gpio-virtuser.c b/drivers/gpio/gpio-virtuser.c index e89f299f21400..dcecb7a259117 100644 --- a/drivers/gpio/gpio-virtuser.c +++ b/drivers/gpio/gpio-virtuser.c @@ -400,10 +400,15 @@ static ssize_t gpio_virtuser_direction_do_write(struct file *file, char buf[32], *trimmed; int ret, dir, val = 0; - ret = simple_write_to_buffer(buf, sizeof(buf), ppos, user_buf, count); + if (count >= sizeof(buf)) + return -EINVAL; + + ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count); if (ret < 0) return ret; + buf[ret] = '\0'; + trimmed = strim(buf); if (strcmp(trimmed, "input") == 0) { @@ -622,12 +627,15 @@ static ssize_t gpio_virtuser_consumer_write(struct file *file, char buf[GPIO_VIRTUSER_NAME_BUF_LEN + 2]; int ret; + if (count >= sizeof(buf)) + return -EINVAL; + ret = simple_write_to_buffer(buf, GPIO_VIRTUSER_NAME_BUF_LEN, ppos, user_buf, count); if (ret < 0) return ret; - buf[strlen(buf) - 1] = '\0'; + buf[ret] = '\0'; ret = gpiod_set_consumer_name(data->ad.desc, buf); if (ret) -- GitLab From 02ed7c617fa36683aee213350e7311610676f345 Mon Sep 17 00:00:00 2001 From: George Shen Date: Thu, 24 Apr 2025 10:02:59 -0400 Subject: [PATCH 0665/2211] drm/amd/display: fix link_set_dpms_off multi-display MST corner case [ Upstream commit 3c1a467372e0c356b1d3c59f6d199ed5a6612dd1 ] [Why & How] When MST config is unplugged/replugged too quickly, it can potentially result in a scenario where previous DC state has not been reset before the HPD link detection sequence begins. In this case, driver will disable the streams/link prior to re-enabling the link for link training. There is a bug in the current logic that does not account for the fact that current_state can be released and cleared prior to swapping to a new state (resulting in the pipe_ctx stream pointers to be cleared) in between disabling streams. To resolve this, cache the original streams prior to committing any stream updates. Reviewed-by: Wenjing Liu Signed-off-by: George Shen Signed-off-by: Ray Wu Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher (cherry picked from commit 1561782686ccc36af844d55d31b44c938dd412dc) Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/display/dc/link/link_dpms.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c index c4e03482ba9ae..aa28001297675 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c @@ -148,6 +148,7 @@ void link_blank_dp_stream(struct dc_link *link, bool hw_init) void link_set_all_streams_dpms_off_for_link(struct dc_link *link) { struct pipe_ctx *pipes[MAX_PIPES]; + struct dc_stream_state *streams[MAX_PIPES]; struct dc_state *state = link->dc->current_state; uint8_t count; int i; @@ -160,10 +161,18 @@ void link_set_all_streams_dpms_off_for_link(struct dc_link *link) link_get_master_pipes_with_dpms_on(link, state, &count, pipes); + /* The subsequent call to dc_commit_updates_for_stream for a full update + * will release the current state and swap to a new state. Releasing the + * current state results in the stream pointers in the pipe_ctx structs + * to be zero'd. Hence, cache all streams prior to dc_commit_updates_for_stream. + */ + for (i = 0; i < count; i++) + streams[i] = pipes[i]->stream; + for (i = 0; i < count; i++) { - stream_update.stream = pipes[i]->stream; + stream_update.stream = streams[i]; dc_commit_updates_for_stream(link->ctx->dc, NULL, 0, - pipes[i]->stream, &stream_update, + streams[i], &stream_update, state); } -- GitLab From 6f47d7408133631a1b178f8a04e79aee189ef046 Mon Sep 17 00:00:00 2001 From: Aurabindo Pillai Date: Tue, 29 Apr 2025 05:03:30 +0800 Subject: [PATCH 0666/2211] drm/amd/display: check stream id dml21 wrapper to get plane_id [ Upstream commit 2ddac70fed50485aa4ae49cdb7478ce41d8d4715 ] [Why & How] Fix a false positive warning which occurs due to lack of correct checks when querying plane_id in DML21. This fixes the warning when performing a mode1 reset (cat /sys/kernel/debug/dri/1/amdgpu_gpu_recover): [ 35.751250] WARNING: CPU: 11 PID: 326 at /tmp/amd.PHpyAl7v/amd/amdgpu/../display/dc/dml2/dml2_dc_resource_mgmt.c:91 dml2_map_dc_pipes+0x243d/0x3f40 [amdgpu] [ 35.751434] Modules linked in: amdgpu(OE) amddrm_ttm_helper(OE) amdttm(OE) amddrm_buddy(OE) amdxcp(OE) amddrm_exec(OE) amd_sched(OE) amdkcl(OE) drm_suballoc_helper drm_ttm_helper ttm drm_display_helper cec rc_core i2c_algo_bit rfcomm qrtr cmac algif_hash algif_skcipher af_alg bnep amd_atl intel_rapl_msr intel_rapl_common snd_hda_codec_hdmi snd_hda_intel edac_mce_amd snd_intel_dspcfg snd_intel_sdw_acpi snd_hda_codec kvm_amd snd_hda_core snd_hwdep snd_pcm kvm snd_seq_midi snd_seq_midi_event snd_rawmidi crct10dif_pclmul polyval_clmulni polyval_generic btusb ghash_clmulni_intel sha256_ssse3 btrtl sha1_ssse3 snd_seq btintel aesni_intel btbcm btmtk snd_seq_device crypto_simd sunrpc cryptd bluetooth snd_timer ccp binfmt_misc rapl snd i2c_piix4 wmi_bmof gigabyte_wmi k10temp i2c_smbus soundcore gpio_amdpt mac_hid sch_fq_codel msr parport_pc ppdev lp parport efi_pstore nfnetlink dmi_sysfs ip_tables x_tables autofs4 hid_generic usbhid hid crc32_pclmul igc ahci xhci_pci libahci xhci_pci_renesas video wmi [ 35.751501] CPU: 11 UID: 0 PID: 326 Comm: kworker/u64:9 Tainted: G OE 6.11.0-21-generic #21~24.04.1-Ubuntu [ 35.751504] Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE [ 35.751505] Hardware name: Gigabyte Technology Co., Ltd. X670E AORUS PRO X/X670E AORUS PRO X, BIOS F30 05/22/2024 [ 35.751506] Workqueue: amdgpu-reset-dev amdgpu_debugfs_reset_work [amdgpu] [ 35.751638] RIP: 0010:dml2_map_dc_pipes+0x243d/0x3f40 [amdgpu] [ 35.751794] Code: 6d 0c 00 00 8b 84 24 88 00 00 00 41 3b 44 9c 20 0f 84 fc 07 00 00 48 83 c3 01 48 83 fb 06 75 b3 4c 8b 64 24 68 4c 8b 6c 24 40 <0f> 0b b8 06 00 00 00 49 8b 94 24 a0 49 00 00 89 c3 83 f8 07 0f 87 [ 35.751796] RSP: 0018:ffffbfa3805d7680 EFLAGS: 00010246 [ 35.751798] RAX: 0000000000010000 RBX: 0000000000000006 RCX: 0000000000000000 [ 35.751799] RDX: 0000000000000000 RSI: 0000000000000005 RDI: 0000000000000000 [ 35.751800] RBP: ffffbfa3805d78f0 R08: 0000000000000000 R09: 0000000000000000 [ 35.751801] R10: 0000000000000000 R11: 0000000000000000 R12: ffffbfa383249000 [ 35.751802] R13: ffffa0e68f280000 R14: ffffbfa383249658 R15: 0000000000000000 [ 35.751803] FS: 0000000000000000(0000) GS:ffffa0edbe580000(0000) knlGS:0000000000000000 [ 35.751804] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 35.751805] CR2: 00005d847ef96c58 CR3: 000000041de3e000 CR4: 0000000000f50ef0 [ 35.751806] PKRU: 55555554 [ 35.751807] Call Trace: [ 35.751810] [ 35.751816] ? show_regs+0x6c/0x80 [ 35.751820] ? __warn+0x88/0x140 [ 35.751822] ? dml2_map_dc_pipes+0x243d/0x3f40 [amdgpu] [ 35.751964] ? report_bug+0x182/0x1b0 [ 35.751969] ? handle_bug+0x6e/0xb0 [ 35.751972] ? exc_invalid_op+0x18/0x80 [ 35.751974] ? asm_exc_invalid_op+0x1b/0x20 [ 35.751978] ? dml2_map_dc_pipes+0x243d/0x3f40 [amdgpu] [ 35.752117] ? math_pow+0x48/0xa0 [amdgpu] [ 35.752256] ? srso_alias_return_thunk+0x5/0xfbef5 [ 35.752260] ? math_pow+0x48/0xa0 [amdgpu] [ 35.752400] ? srso_alias_return_thunk+0x5/0xfbef5 [ 35.752403] ? math_pow+0x11/0xa0 [amdgpu] [ 35.752524] ? srso_alias_return_thunk+0x5/0xfbef5 [ 35.752526] ? core_dcn4_mode_programming+0xe4d/0x20d0 [amdgpu] [ 35.752663] ? srso_alias_return_thunk+0x5/0xfbef5 [ 35.752669] dml21_validate+0x3d4/0x980 [amdgpu] Reviewed-by: Austin Zheng Signed-off-by: Aurabindo Pillai Signed-off-by: Ray Wu Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher (cherry picked from commit f8ad62c0a93e5dd94243e10f1b742232e4d6411e) Signed-off-by: Sasha Levin --- .../dc/dml2/dml21/dml21_translation_helper.c | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c b/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c index 55014c1521167..7e3d506bb79b9 100644 --- a/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c @@ -887,7 +887,7 @@ static void populate_dml21_plane_config_from_plane_state(struct dml2_context *dm } //TODO : Could be possibly moved to a common helper layer. -static bool dml21_wrapper_get_plane_id(const struct dc_state *context, const struct dc_plane_state *plane, unsigned int *plane_id) +static bool dml21_wrapper_get_plane_id(const struct dc_state *context, unsigned int stream_id, const struct dc_plane_state *plane, unsigned int *plane_id) { int i, j; @@ -895,10 +895,12 @@ static bool dml21_wrapper_get_plane_id(const struct dc_state *context, const str return false; for (i = 0; i < context->stream_count; i++) { - for (j = 0; j < context->stream_status[i].plane_count; j++) { - if (context->stream_status[i].plane_states[j] == plane) { - *plane_id = (i << 16) | j; - return true; + if (context->streams[i]->stream_id == stream_id) { + for (j = 0; j < context->stream_status[i].plane_count; j++) { + if (context->stream_status[i].plane_states[j] == plane) { + *plane_id = (i << 16) | j; + return true; + } } } } @@ -921,14 +923,14 @@ static unsigned int map_stream_to_dml21_display_cfg(const struct dml2_context *d return location; } -static unsigned int map_plane_to_dml21_display_cfg(const struct dml2_context *dml_ctx, +static unsigned int map_plane_to_dml21_display_cfg(const struct dml2_context *dml_ctx, unsigned int stream_id, const struct dc_plane_state *plane, const struct dc_state *context) { unsigned int plane_id; int i = 0; int location = -1; - if (!dml21_wrapper_get_plane_id(context, plane, &plane_id)) { + if (!dml21_wrapper_get_plane_id(context, stream_id, plane, &plane_id)) { ASSERT(false); return -1; } @@ -1013,7 +1015,7 @@ bool dml21_map_dc_state_into_dml_display_cfg(const struct dc *in_dc, struct dc_s dml_dispcfg->plane_descriptors[disp_cfg_plane_location].stream_index = disp_cfg_stream_location; } else { for (plane_index = 0; plane_index < context->stream_status[stream_index].plane_count; plane_index++) { - disp_cfg_plane_location = map_plane_to_dml21_display_cfg(dml_ctx, context->stream_status[stream_index].plane_states[plane_index], context); + disp_cfg_plane_location = map_plane_to_dml21_display_cfg(dml_ctx, context->streams[stream_index]->stream_id, context->stream_status[stream_index].plane_states[plane_index], context); if (disp_cfg_plane_location < 0) disp_cfg_plane_location = dml_dispcfg->num_planes++; @@ -1024,7 +1026,7 @@ bool dml21_map_dc_state_into_dml_display_cfg(const struct dc *in_dc, struct dc_s populate_dml21_plane_config_from_plane_state(dml_ctx, &dml_dispcfg->plane_descriptors[disp_cfg_plane_location], context->stream_status[stream_index].plane_states[plane_index], context, stream_index); dml_dispcfg->plane_descriptors[disp_cfg_plane_location].stream_index = disp_cfg_stream_location; - if (dml21_wrapper_get_plane_id(context, context->stream_status[stream_index].plane_states[plane_index], &dml_ctx->v21.dml_to_dc_pipe_mapping.disp_cfg_to_plane_id[disp_cfg_plane_location])) + if (dml21_wrapper_get_plane_id(context, context->streams[stream_index]->stream_id, context->stream_status[stream_index].plane_states[plane_index], &dml_ctx->v21.dml_to_dc_pipe_mapping.disp_cfg_to_plane_id[disp_cfg_plane_location])) dml_ctx->v21.dml_to_dc_pipe_mapping.disp_cfg_to_plane_id_valid[disp_cfg_plane_location] = true; /* apply forced pstate policy */ -- GitLab From 2c09a5cbc0100e88b8872b11f4da01a656c97fbc Mon Sep 17 00:00:00 2001 From: Hal Feng Date: Tue, 22 Apr 2025 18:12:44 +0800 Subject: [PATCH 0667/2211] phy: starfive: jh7110-usb: Fix USB 2.0 host occasional detection failure [ Upstream commit 3f097adb9b6c804636bcf8d01e0e7bc037bee0d3 ] JH7110 USB 2.0 host fails to detect USB 2.0 devices occasionally. With a long time of debugging and testing, we found that setting Rx clock gating control signal to normal power consumption mode can solve this problem. Signed-off-by: Hal Feng Link: https://lore.kernel.org/r/20250422101244.51686-1-hal.feng@starfivetech.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/phy/starfive/phy-jh7110-usb.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/phy/starfive/phy-jh7110-usb.c b/drivers/phy/starfive/phy-jh7110-usb.c index cb5454fbe2c8f..b505d89860b43 100644 --- a/drivers/phy/starfive/phy-jh7110-usb.c +++ b/drivers/phy/starfive/phy-jh7110-usb.c @@ -18,6 +18,8 @@ #include #define USB_125M_CLK_RATE 125000000 +#define USB_CLK_MODE_OFF 0x0 +#define USB_CLK_MODE_RX_NORMAL_PWR BIT(1) #define USB_LS_KEEPALIVE_OFF 0x4 #define USB_LS_KEEPALIVE_ENABLE BIT(4) @@ -78,6 +80,7 @@ static int jh7110_usb2_phy_init(struct phy *_phy) { struct jh7110_usb2_phy *phy = phy_get_drvdata(_phy); int ret; + unsigned int val; ret = clk_set_rate(phy->usb_125m_clk, USB_125M_CLK_RATE); if (ret) @@ -87,6 +90,10 @@ static int jh7110_usb2_phy_init(struct phy *_phy) if (ret) return ret; + val = readl(phy->regs + USB_CLK_MODE_OFF); + val |= USB_CLK_MODE_RX_NORMAL_PWR; + writel(val, phy->regs + USB_CLK_MODE_OFF); + return 0; } -- GitLab From 44a4a01e91ae03d59bc872aea51dad1b4644fb88 Mon Sep 17 00:00:00 2001 From: Algea Cao Date: Sun, 27 Apr 2025 17:51:24 +0800 Subject: [PATCH 0668/2211] phy: phy-rockchip-samsung-hdptx: Fix PHY PLL output 50.25MHz error [ Upstream commit f9475055b11c0c70979bd1667a76b2ebae638eb7 ] When using HDMI PLL frequency division coefficient at 50.25MHz that is calculated by rk_hdptx_phy_clk_pll_calc(), it fails to get PHY LANE lock. Although the calculated values are within the allowable range of PHY PLL configuration. In order to fix the PHY LANE lock error and provide the expected 50.25MHz output, manually compute the required PHY PLL frequency division coefficient and add it to ropll_tmds_cfg configuration table. Signed-off-by: Algea Cao Reviewed-by: Cristian Ciocaltea Acked-by: Heiko Stuebner Link: https://lore.kernel.org/r/20250427095124.3354439-1-algea.cao@rock-chips.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c index dc6e01dff5c74..9b99fdd43f5f5 100644 --- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c +++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c @@ -328,6 +328,8 @@ static const struct ropll_config ropll_tmds_cfg[] = { 1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, }, { 650000, 162, 162, 1, 1, 11, 1, 1, 1, 1, 1, 1, 1, 54, 0, 16, 4, 1, 1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, }, + { 502500, 84, 84, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 11, 1, 4, 5, + 4, 11, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, }, { 337500, 0x70, 0x70, 1, 1, 0xf, 1, 1, 1, 1, 1, 1, 1, 0x2, 0, 0x01, 5, 1, 1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, }, { 400000, 100, 100, 1, 1, 11, 1, 1, 0, 1, 0, 1, 1, 0x9, 0, 0x05, 0, -- GitLab From 8c7ecba772bfb5c25806ceec7b08481b0e4ffe0f Mon Sep 17 00:00:00 2001 From: Alessandro Grassi Date: Fri, 2 May 2025 11:55:20 +0200 Subject: [PATCH 0669/2211] spi: spi-sun4i: fix early activation [ Upstream commit fb98bd0a13de2c9d96cb5c00c81b5ca118ac9d71 ] The SPI interface is activated before the CPOL setting is applied. In that moment, the clock idles high and CS goes low. After a short delay, CPOL and other settings are applied, which may cause the clock to change state and idle low. This transition is not part of a clock cycle, and it can confuse the receiving device. To prevent this unexpected transition, activate the interface while CPOL and the other settings are being applied. Signed-off-by: Alessandro Grassi Link: https://patch.msgid.link/20250502095520.13825-1-alessandro.grassi@mailbox.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-sun4i.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/spi/spi-sun4i.c b/drivers/spi/spi-sun4i.c index 2ee6755b43f54..3019f57e65841 100644 --- a/drivers/spi/spi-sun4i.c +++ b/drivers/spi/spi-sun4i.c @@ -264,6 +264,9 @@ static int sun4i_spi_transfer_one(struct spi_controller *host, else reg |= SUN4I_CTL_DHB; + /* Now that the settings are correct, enable the interface */ + reg |= SUN4I_CTL_ENABLE; + sun4i_spi_write(sspi, SUN4I_CTL_REG, reg); /* Ensure that we have a parent clock fast enough */ @@ -404,7 +407,7 @@ static int sun4i_spi_runtime_resume(struct device *dev) } sun4i_spi_write(sspi, SUN4I_CTL_REG, - SUN4I_CTL_ENABLE | SUN4I_CTL_MASTER | SUN4I_CTL_TP); + SUN4I_CTL_MASTER | SUN4I_CTL_TP); return 0; -- GitLab From 3b3d3174d1b37487485b2827c306832a30d03a59 Mon Sep 17 00:00:00 2001 From: Ilya Guterman Date: Sat, 10 May 2025 19:21:30 +0900 Subject: [PATCH 0670/2211] nvme-pci: add NVME_QUIRK_NO_DEEPEST_PS quirk for SOLIDIGM P44 Pro [ Upstream commit e765bf89f42b5c82132a556b630affeb82b2a21f ] This commit adds the NVME_QUIRK_NO_DEEPEST_PS quirk for device [126f:2262], which belongs to device SOLIDIGM P44 Pro SSDPFKKW020X7 The device frequently have trouble exiting the deepest power state (5), resulting in the entire disk being unresponsive. Verified by setting nvme_core.default_ps_max_latency_us=10000 and observing the expected behavior. Signed-off-by: Ilya Guterman Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/host/pci.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index cd8a10f6accff..37fd1a8ace127 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -3701,6 +3701,8 @@ static const struct pci_device_id nvme_id_table[] = { .driver_data = NVME_QUIRK_NO_DEEPEST_PS, }, { PCI_DEVICE(0x1e49, 0x0041), /* ZHITAI TiPro7000 NVMe SSD */ .driver_data = NVME_QUIRK_NO_DEEPEST_PS, }, + { PCI_DEVICE(0x025e, 0xf1ac), /* SOLIDIGM P44 pro SSDPFKKW020X7 */ + .driver_data = NVME_QUIRK_NO_DEEPEST_PS, }, { PCI_DEVICE(0xc0a9, 0x540a), /* Crucial P2 */ .driver_data = NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(0x1d97, 0x2263), /* Lexar NM610 */ -- GitLab From 089e980525136b3143d1739d93368bba35ac9924 Mon Sep 17 00:00:00 2001 From: Aradhya Bhatia Date: Mon, 12 May 2025 06:50:04 +0000 Subject: [PATCH 0671/2211] drm/xe/xe2hpg: Add Wa_22021007897 [ Upstream commit b1f704107cf27906a9cea542b626b96019104663 ] Add Wa_22021007897 for the Xe2_HPG (graphics version: 20.01) IP. It is a permanent workaround, and applicable on all the steppings. Reviewed-by: Gustavo Sousa Reviewed-by: Tejas Upadhyay Signed-off-by: Aradhya Bhatia Link: https://lore.kernel.org/r/20250512065004.2576-1-aradhya.bhatia@intel.com Signed-off-by: Matt Roper (cherry picked from commit e5c13e2c505b73a8667ef9a0fd5cbd4227e483e6) Signed-off-by: Lucas De Marchi Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/regs/xe_gt_regs.h | 1 + drivers/gpu/drm/xe/xe_wa.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/drivers/gpu/drm/xe/regs/xe_gt_regs.h b/drivers/gpu/drm/xe/regs/xe_gt_regs.h index 5404de2aea545..c160b015d178a 100644 --- a/drivers/gpu/drm/xe/regs/xe_gt_regs.h +++ b/drivers/gpu/drm/xe/regs/xe_gt_regs.h @@ -157,6 +157,7 @@ #define XEHPG_SC_INSTDONE_EXTRA2 XE_REG_MCR(0x7108) #define COMMON_SLICE_CHICKEN4 XE_REG(0x7300, XE_REG_OPTION_MASKED) +#define SBE_PUSH_CONSTANT_BEHIND_FIX_ENABLE REG_BIT(12) #define DISABLE_TDC_LOAD_BALANCING_CALC REG_BIT(6) #define COMMON_SLICE_CHICKEN3 XE_REG(0x7304, XE_REG_OPTION_MASKED) diff --git a/drivers/gpu/drm/xe/xe_wa.c b/drivers/gpu/drm/xe/xe_wa.c index 0a1905f8d380a..aea6034a81079 100644 --- a/drivers/gpu/drm/xe/xe_wa.c +++ b/drivers/gpu/drm/xe/xe_wa.c @@ -783,6 +783,10 @@ static const struct xe_rtp_entry_sr lrc_was[] = { XE_RTP_RULES(GRAPHICS_VERSION(2001), ENGINE_CLASS(RENDER)), XE_RTP_ACTIONS(SET(CHICKEN_RASTER_1, DIS_CLIP_NEGATIVE_BOUNDING_BOX)) }, + { XE_RTP_NAME("22021007897"), + XE_RTP_RULES(GRAPHICS_VERSION(2001), ENGINE_CLASS(RENDER)), + XE_RTP_ACTIONS(SET(COMMON_SLICE_CHICKEN4, SBE_PUSH_CONSTANT_BEHIND_FIX_ENABLE)) + }, /* Xe3_LPG */ { XE_RTP_NAME("14021490052"), -- GitLab From fe7879e5eb3f45c336df5cccd32d9c7efe0b70a0 Mon Sep 17 00:00:00 2001 From: Umesh Nerlige Ramappa Date: Fri, 9 May 2025 09:12:02 -0700 Subject: [PATCH 0672/2211] drm/xe: Save the gt pointer in lrc and drop the tile [ Upstream commit ce15563e49fb0b5c802564433ff8468acd1339eb ] Save the gt pointer in the lrc so that it can used for gt based helpers. Signed-off-by: Umesh Nerlige Ramappa Reviewed-by: Matthew Brost Reviewed-by: Lucas De Marchi Link: https://lore.kernel.org/r/20250509161159.2173069-7-umesh.nerlige.ramappa@intel.com (cherry picked from commit 741d3ef8b8b88fab2729ca89de1180e49bc9cef0) Signed-off-by: Lucas De Marchi Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_lrc.c | 4 ++-- drivers/gpu/drm/xe/xe_lrc_types.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_lrc.c b/drivers/gpu/drm/xe/xe_lrc.c index 2d4e38b3bab19..ce6d2167b94ad 100644 --- a/drivers/gpu/drm/xe/xe_lrc.c +++ b/drivers/gpu/drm/xe/xe_lrc.c @@ -874,7 +874,7 @@ static void *empty_lrc_data(struct xe_hw_engine *hwe) static void xe_lrc_set_ppgtt(struct xe_lrc *lrc, struct xe_vm *vm) { - u64 desc = xe_vm_pdp4_descriptor(vm, lrc->tile); + u64 desc = xe_vm_pdp4_descriptor(vm, gt_to_tile(lrc->gt)); xe_lrc_write_ctx_reg(lrc, CTX_PDP0_UDW, upper_32_bits(desc)); xe_lrc_write_ctx_reg(lrc, CTX_PDP0_LDW, lower_32_bits(desc)); @@ -905,6 +905,7 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe, int err; kref_init(&lrc->refcount); + lrc->gt = gt; lrc->flags = 0; lrc_size = ring_size + xe_gt_lrc_size(gt, hwe->class); if (xe_gt_has_indirect_ring_state(gt)) @@ -923,7 +924,6 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe, return PTR_ERR(lrc->bo); lrc->size = lrc_size; - lrc->tile = gt_to_tile(hwe->gt); lrc->ring.size = ring_size; lrc->ring.tail = 0; lrc->ctx_timestamp = 0; diff --git a/drivers/gpu/drm/xe/xe_lrc_types.h b/drivers/gpu/drm/xe/xe_lrc_types.h index 71ecb453f811a..cd38586ae9893 100644 --- a/drivers/gpu/drm/xe/xe_lrc_types.h +++ b/drivers/gpu/drm/xe/xe_lrc_types.h @@ -25,8 +25,8 @@ struct xe_lrc { /** @size: size of lrc including any indirect ring state page */ u32 size; - /** @tile: tile which this LRC belongs to */ - struct xe_tile *tile; + /** @gt: gt which this LRC belongs to */ + struct xe_gt *gt; /** @flags: LRC flags */ #define XE_LRC_FLAG_INDIRECT_RING_STATE 0x1 -- GitLab From 87129b9342dbe6ccf1dd12dd491b41630281c0d3 Mon Sep 17 00:00:00 2001 From: Purva Yeshi Date: Thu, 10 Apr 2025 16:04:42 +0530 Subject: [PATCH 0673/2211] char: tpm: tpm-buf: Add sanity check fallback in read helpers [ Upstream commit 32d495b384a2db7d23c2295e03e6b6edb1c0db8d ] Fix Smatch-detected issue: drivers/char/tpm/tpm-buf.c:208 tpm_buf_read_u8() error: uninitialized symbol 'value'. drivers/char/tpm/tpm-buf.c:225 tpm_buf_read_u16() error: uninitialized symbol 'value'. drivers/char/tpm/tpm-buf.c:242 tpm_buf_read_u32() error: uninitialized symbol 'value'. Zero-initialize the return values in tpm_buf_read_u8(), tpm_buf_read_u16(), and tpm_buf_read_u32() to guard against uninitialized data in case of a boundary overflow. Add defensive initialization ensures the return values are always defined, preventing undefined behavior if the unexpected happens. Signed-off-by: Purva Yeshi Reviewed-by: Stefano Garzarella Reviewed-by: Jarkko Sakkinen Signed-off-by: Jarkko Sakkinen Signed-off-by: Sasha Levin --- drivers/char/tpm/tpm-buf.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c index e49a19fea3bdf..dc882fc9fa9ef 100644 --- a/drivers/char/tpm/tpm-buf.c +++ b/drivers/char/tpm/tpm-buf.c @@ -201,7 +201,7 @@ static void tpm_buf_read(struct tpm_buf *buf, off_t *offset, size_t count, void */ u8 tpm_buf_read_u8(struct tpm_buf *buf, off_t *offset) { - u8 value; + u8 value = 0; tpm_buf_read(buf, offset, sizeof(value), &value); @@ -218,7 +218,7 @@ EXPORT_SYMBOL_GPL(tpm_buf_read_u8); */ u16 tpm_buf_read_u16(struct tpm_buf *buf, off_t *offset) { - u16 value; + u16 value = 0; tpm_buf_read(buf, offset, sizeof(value), &value); @@ -235,7 +235,7 @@ EXPORT_SYMBOL_GPL(tpm_buf_read_u16); */ u32 tpm_buf_read_u32(struct tpm_buf *buf, off_t *offset) { - u32 value; + u32 value = 0; tpm_buf_read(buf, offset, sizeof(value), &value); -- GitLab From c7ce21b85a5a467f6338c0f0d93aa439639cb33f Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Sun, 27 Apr 2025 18:21:06 -0400 Subject: [PATCH 0674/2211] NFS: Avoid flushing data while holding directory locks in nfs_rename() [ Upstream commit dcd21b609d4abc7303f8683bce4f35d78d7d6830 ] The Linux client assumes that all filehandles are non-volatile for renames within the same directory (otherwise sillyrename cannot work). However, the existence of the Linux 'subtree_check' export option has meant that nfs_rename() has always assumed it needs to flush writes before attempting to rename. Since NFSv4 does allow the client to query whether or not the server exhibits this behaviour, and since knfsd does actually set the appropriate flag when 'subtree_check' is enabled on an export, it should be OK to optimise away the write flushing behaviour in the cases where it is clearly not needed. Signed-off-by: Trond Myklebust Reviewed-by: Jeff Layton Signed-off-by: Sasha Levin --- fs/nfs/client.c | 2 ++ fs/nfs/dir.c | 15 ++++++++++++++- include/linux/nfs_fs_sb.h | 12 +++++++++--- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 03ecc77656151..4503758e9594b 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c @@ -1096,6 +1096,8 @@ struct nfs_server *nfs_create_server(struct fs_context *fc) if (server->namelen == 0 || server->namelen > NFS2_MAXNAMLEN) server->namelen = NFS2_MAXNAMLEN; } + /* Linux 'subtree_check' borkenness mandates this setting */ + server->fh_expire_type = NFS_FH_VOL_RENAME; if (!(fattr->valid & NFS_ATTR_FATTR)) { error = ctx->nfs_mod->rpc_ops->getattr(server, ctx->mntfh, diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 492cffd9d3d84..f9f4a92f63e92 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -2690,6 +2690,18 @@ nfs_unblock_rename(struct rpc_task *task, struct nfs_renamedata *data) unblock_revalidate(new_dentry); } +static bool nfs_rename_is_unsafe_cross_dir(struct dentry *old_dentry, + struct dentry *new_dentry) +{ + struct nfs_server *server = NFS_SB(old_dentry->d_sb); + + if (old_dentry->d_parent != new_dentry->d_parent) + return false; + if (server->fh_expire_type & NFS_FH_RENAME_UNSAFE) + return !(server->fh_expire_type & NFS_FH_NOEXPIRE_WITH_OPEN); + return true; +} + /* * RENAME * FIXME: Some nfsds, like the Linux user space nfsd, may generate a @@ -2777,7 +2789,8 @@ int nfs_rename(struct mnt_idmap *idmap, struct inode *old_dir, } - if (S_ISREG(old_inode->i_mode)) + if (S_ISREG(old_inode->i_mode) && + nfs_rename_is_unsafe_cross_dir(old_dentry, new_dentry)) nfs_sync_inode(old_inode); task = nfs_async_rename(old_dir, new_dir, old_dentry, new_dentry, must_unblock ? nfs_unblock_rename : NULL); diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 81ab18658d72d..2cff5cafbaa78 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h @@ -211,6 +211,15 @@ struct nfs_server { char *fscache_uniq; /* Uniquifier (or NULL) */ #endif + /* The following #defines numerically match the NFSv4 equivalents */ +#define NFS_FH_NOEXPIRE_WITH_OPEN (0x1) +#define NFS_FH_VOLATILE_ANY (0x2) +#define NFS_FH_VOL_MIGRATION (0x4) +#define NFS_FH_VOL_RENAME (0x8) +#define NFS_FH_RENAME_UNSAFE (NFS_FH_VOLATILE_ANY | NFS_FH_VOL_RENAME) + u32 fh_expire_type; /* V4 bitmask representing file + handle volatility type for + this filesystem */ u32 pnfs_blksize; /* layout_blksize attr */ #if IS_ENABLED(CONFIG_NFS_V4) u32 attr_bitmask[3];/* V4 bitmask representing the set @@ -234,9 +243,6 @@ struct nfs_server { u32 acl_bitmask; /* V4 bitmask representing the ACEs that are supported on this filesystem */ - u32 fh_expire_type; /* V4 bitmask representing file - handle volatility type for - this filesystem */ struct pnfs_layoutdriver_type *pnfs_curr_ld; /* Active layout driver */ struct rpc_wait_queue roc_rpcwaitq; void *pnfs_ld_data; /* per mount point data */ -- GitLab From 5277bc961cf5353ac7522c08fce4198c0d0ff7f7 Mon Sep 17 00:00:00 2001 From: Valtteri Koskivuori Date: Fri, 9 May 2025 21:42:49 +0300 Subject: [PATCH 0675/2211] platform/x86: fujitsu-laptop: Support Lifebook S2110 hotkeys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit a7e255ff9fe4d9b8b902023aaf5b7a673786bb50 ] The S2110 has an additional set of media playback control keys enabled by a hardware toggle button that switches the keys between "Application" and "Player" modes. Toggling "Player" mode just shifts the scancode of each hotkey up by 4. Add defines for new scancodes, and a keymap and dmi id for the S2110. Tested on a Fujitsu Lifebook S2110. Signed-off-by: Valtteri Koskivuori Acked-by: Jonathan Woithe Link: https://lore.kernel.org/r/20250509184251.713003-1-vkoskiv@gmail.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/fujitsu-laptop.c | 33 +++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index ae992ac1ab4ac..6d5300c54a421 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c @@ -17,13 +17,13 @@ /* * fujitsu-laptop.c - Fujitsu laptop support, providing access to additional * features made available on a range of Fujitsu laptops including the - * P2xxx/P5xxx/S6xxx/S7xxx series. + * P2xxx/P5xxx/S2xxx/S6xxx/S7xxx series. * * This driver implements a vendor-specific backlight control interface for * Fujitsu laptops and provides support for hotkeys present on certain Fujitsu * laptops. * - * This driver has been tested on a Fujitsu Lifebook S6410, S7020 and + * This driver has been tested on a Fujitsu Lifebook S2110, S6410, S7020 and * P8010. It should work on most P-series and S-series Lifebooks, but * YMMV. * @@ -107,7 +107,11 @@ #define KEY2_CODE 0x411 #define KEY3_CODE 0x412 #define KEY4_CODE 0x413 -#define KEY5_CODE 0x420 +#define KEY5_CODE 0x414 +#define KEY6_CODE 0x415 +#define KEY7_CODE 0x416 +#define KEY8_CODE 0x417 +#define KEY9_CODE 0x420 /* Hotkey ringbuffer limits */ #define MAX_HOTKEY_RINGBUFFER_SIZE 100 @@ -560,7 +564,7 @@ static const struct key_entry keymap_default[] = { { KE_KEY, KEY2_CODE, { KEY_PROG2 } }, { KE_KEY, KEY3_CODE, { KEY_PROG3 } }, { KE_KEY, KEY4_CODE, { KEY_PROG4 } }, - { KE_KEY, KEY5_CODE, { KEY_RFKILL } }, + { KE_KEY, KEY9_CODE, { KEY_RFKILL } }, /* Soft keys read from status flags */ { KE_KEY, FLAG_RFKILL, { KEY_RFKILL } }, { KE_KEY, FLAG_TOUCHPAD_TOGGLE, { KEY_TOUCHPAD_TOGGLE } }, @@ -584,6 +588,18 @@ static const struct key_entry keymap_p8010[] = { { KE_END, 0 } }; +static const struct key_entry keymap_s2110[] = { + { KE_KEY, KEY1_CODE, { KEY_PROG1 } }, /* "A" */ + { KE_KEY, KEY2_CODE, { KEY_PROG2 } }, /* "B" */ + { KE_KEY, KEY3_CODE, { KEY_WWW } }, /* "Internet" */ + { KE_KEY, KEY4_CODE, { KEY_EMAIL } }, /* "E-mail" */ + { KE_KEY, KEY5_CODE, { KEY_STOPCD } }, + { KE_KEY, KEY6_CODE, { KEY_PLAYPAUSE } }, + { KE_KEY, KEY7_CODE, { KEY_PREVIOUSSONG } }, + { KE_KEY, KEY8_CODE, { KEY_NEXTSONG } }, + { KE_END, 0 } +}; + static const struct key_entry *keymap = keymap_default; static int fujitsu_laptop_dmi_keymap_override(const struct dmi_system_id *id) @@ -621,6 +637,15 @@ static const struct dmi_system_id fujitsu_laptop_dmi_table[] = { }, .driver_data = (void *)keymap_p8010 }, + { + .callback = fujitsu_laptop_dmi_keymap_override, + .ident = "Fujitsu LifeBook S2110", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK S2110"), + }, + .driver_data = (void *)keymap_s2110 + }, {} }; -- GitLab From f9adb4a16225d723969a113aa8a08f3a32972db8 Mon Sep 17 00:00:00 2001 From: Kailang Yang Date: Fri, 16 May 2025 14:53:37 +0800 Subject: [PATCH 0676/2211] ALSA: hda/realtek - restore auto-mute mode for Dell Chrome platform [ Upstream commit 5ad8a4ddc45048bc2fe23b75357b6bf185db004f ] This board need to shutdown Class-D amp to avoid EMI issue. Restore the Auto-Mute mode item will off pin control when Auto-mute mode was enable. Signed-off-by: Kailang Yang Links: https://lore.kernel.org/ee8bbe5236464c369719d96269ba8ef8@realtek.com Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/pci/hda/patch_realtek.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 13ffc9a6555f6..dce5680912006 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -6813,7 +6813,10 @@ static void alc256_fixup_chromebook(struct hda_codec *codec, switch (action) { case HDA_FIXUP_ACT_PRE_PROBE: - spec->gen.suppress_auto_mute = 1; + if (codec->core.subsystem_id == 0x10280d76) + spec->gen.suppress_auto_mute = 0; + else + spec->gen.suppress_auto_mute = 1; spec->gen.suppress_auto_mic = 1; spec->en_3kpull_low = false; break; -- GitLab From b4b163b0e7fab88cca1d24715666b24ae670d9b8 Mon Sep 17 00:00:00 2001 From: Mark Pearson Date: Fri, 16 May 2025 22:33:37 -0400 Subject: [PATCH 0677/2211] platform/x86: thinkpad_acpi: Ignore battery threshold change event notification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 29e4e6b4235fefa5930affb531fe449cac330a72 ] If user modifies the battery charge threshold an ACPI event is generated. Confirmed with Lenovo FW team this is only generated on user event. As no action is needed, ignore the event and prevent spurious kernel logs. Reported-by: Derek Barbosa Closes: https://lore.kernel.org/platform-driver-x86/7e9a1c47-5d9c-4978-af20-3949d53fb5dc@app.fastmail.com/T/#m5f5b9ae31d3fbf30d7d9a9d76c15fb3502dfd903 Signed-off-by: Mark Pearson Reviewed-by: Hans de Goede Reviewed-by: Armin Wolf Link: https://lore.kernel.org/r/20250517023348.2962591-1-mpearson-lenovo@squebb.ca Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/thinkpad_acpi.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index fa60a221cfb14..0528af4ed8d69 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -232,6 +232,7 @@ enum tpacpi_hkey_event_t { /* Thermal events */ TP_HKEY_EV_ALARM_BAT_HOT = 0x6011, /* battery too hot */ TP_HKEY_EV_ALARM_BAT_XHOT = 0x6012, /* battery critically hot */ + TP_HKEY_EV_ALARM_BAT_LIM_CHANGE = 0x6013, /* battery charge limit changed*/ TP_HKEY_EV_ALARM_SENSOR_HOT = 0x6021, /* sensor too hot */ TP_HKEY_EV_ALARM_SENSOR_XHOT = 0x6022, /* sensor critically hot */ TP_HKEY_EV_THM_TABLE_CHANGED = 0x6030, /* windows; thermal table changed */ @@ -3778,6 +3779,10 @@ static bool hotkey_notify_6xxx(const u32 hkey, bool *send_acpi_ev) pr_alert("THERMAL EMERGENCY: battery is extremely hot!\n"); /* recommended action: immediate sleep/hibernate */ break; + case TP_HKEY_EV_ALARM_BAT_LIM_CHANGE: + pr_debug("Battery Info: battery charge threshold changed\n"); + /* User changed charging threshold. No action needed */ + return true; case TP_HKEY_EV_ALARM_SENSOR_HOT: pr_crit("THERMAL ALARM: a sensor reports something is too hot!\n"); /* recommended action: warn user through gui, that */ -- GitLab From 4a72fa2f59874e6df3360c88bb5e992b7cbbfcc5 Mon Sep 17 00:00:00 2001 From: Nishanth Menon Date: Fri, 16 May 2025 07:26:55 -0500 Subject: [PATCH 0678/2211] net: ethernet: ti: am65-cpsw: Lower random mac address error print to info [ Upstream commit 50980d8da71a0c2e045e85bba93c0099ab73a209 ] Using random mac address is not an error since the driver continues to function, it should be informative that the system has not assigned a MAC address. This is inline with other drivers such as ax88796c, dm9051 etc. Drop the error level to info level. Signed-off-by: Nishanth Menon Reviewed-by: Simon Horman Reviewed-by: Roger Quadros Link: https://patch.msgid.link/20250516122655.442808-1-nm@ti.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/ti/am65-cpsw-nuss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c index a21e7c0afbfdc..61788a43cb861 100644 --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c @@ -2699,7 +2699,7 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common) port->slave.mac_addr); if (!is_valid_ether_addr(port->slave.mac_addr)) { eth_random_addr(port->slave.mac_addr); - dev_err(dev, "Use random MAC address\n"); + dev_info(dev, "Use random MAC address\n"); } } -- GitLab From 334da674b25fdb7a1a4d4b89dcd7795144fc7e11 Mon Sep 17 00:00:00 2001 From: Namjae Jeon Date: Tue, 20 May 2025 09:25:03 +0900 Subject: [PATCH 0679/2211] ksmbd: use list_first_entry_or_null for opinfo_get_list() [ Upstream commit 10379171f346e6f61d30d9949500a8de4336444a ] The list_first_entry() macro never returns NULL. If the list is empty then it returns an invalid pointer. Use list_first_entry_or_null() to check if the list is empty. Reported-by: kernel test robot Reported-by: Dan Carpenter Closes: https://lore.kernel.org/r/202505080231.7OXwq4Te-lkp@intel.com/ Signed-off-by: Namjae Jeon Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/server/oplock.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/fs/smb/server/oplock.c b/fs/smb/server/oplock.c index 03f606afad93a..d7a8a580d0136 100644 --- a/fs/smb/server/oplock.c +++ b/fs/smb/server/oplock.c @@ -146,12 +146,9 @@ static struct oplock_info *opinfo_get_list(struct ksmbd_inode *ci) { struct oplock_info *opinfo; - if (list_empty(&ci->m_op_list)) - return NULL; - down_read(&ci->m_lock); - opinfo = list_first_entry(&ci->m_op_list, struct oplock_info, - op_entry); + opinfo = list_first_entry_or_null(&ci->m_op_list, struct oplock_info, + op_entry); if (opinfo) { if (opinfo->conn == NULL || !atomic_inc_not_zero(&opinfo->refcount)) -- GitLab From ba9210b8c96355a16b78e1b890dce78f284d6f31 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 4 Jun 2025 14:43:54 +0200 Subject: [PATCH 0680/2211] Linux 6.12.32 Link: https://lore.kernel.org/r/20250602134238.271281478@linuxfoundation.org Tested-by: Florian Fainelli Tested-by: Peter Schneider Tested-by: Harshit Mogalapalli Tested-by: Ron Economos Tested-by: Mark Brown Tested-by: Linux Kernel Functional Testing Tested-by: Brett Mastbergen Tested-by: Shuah Khan Tested-by: Hardik Garg Tested-by: Salvatore Bonaccorso Tested-by: Jon Hunter Signed-off-by: Greg Kroah-Hartman --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 18c2a7cf9e913..1e6a6c66403f1 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 12 -SUBLEVEL = 31 +SUBLEVEL = 32 EXTRAVERSION = NAME = Baby Opossum Posse -- GitLab From db758487f3dd3c079834ff7b0c6ea9e4c973f73b Mon Sep 17 00:00:00 2001 From: Pan Taixi Date: Mon, 26 May 2025 09:37:31 +0800 Subject: [PATCH 0681/2211] tracing: Fix compilation warning on arm32 commit 2fbdb6d8e03b70668c0876e635506540ae92ab05 upstream. On arm32, size_t is defined to be unsigned int, while PAGE_SIZE is unsigned long. This hence triggers a compilation warning as min() asserts the type of two operands to be equal. Casting PAGE_SIZE to size_t solves this issue and works on other target architectures as well. Compilation warning details: kernel/trace/trace.c: In function 'tracing_splice_read_pipe': ./include/linux/minmax.h:20:28: warning: comparison of distinct pointer types lacks a cast (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1))) ^ ./include/linux/minmax.h:26:4: note: in expansion of macro '__typecheck' (__typecheck(x, y) && __no_side_effects(x, y)) ^~~~~~~~~~~ ... kernel/trace/trace.c:6771:8: note: in expansion of macro 'min' min((size_t)trace_seq_used(&iter->seq), ^~~ Cc: stable@vger.kernel.org Link: https://lore.kernel.org/20250526013731.1198030-1-pantaixi@huaweicloud.com Fixes: f5178c41bb43 ("tracing: Fix oob write in trace_seq_to_buffer()") Reviewed-by: Jeongjun Park Signed-off-by: Pan Taixi Signed-off-by: Steven Rostedt (Google) Signed-off-by: Greg Kroah-Hartman --- kernel/trace/trace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index e773b0adcfc0a..2dc5cfecb016b 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -6699,7 +6699,7 @@ static ssize_t tracing_splice_read_pipe(struct file *filp, ret = trace_seq_to_buffer(&iter->seq, page_address(spd.pages[i]), min((size_t)trace_seq_used(&iter->seq), - PAGE_SIZE)); + (size_t)PAGE_SIZE)); if (ret < 0) { __free_page(spd.pages[i]); break; -- GitLab From bf49527089ec1ba894c6e587affabbfb2329f52e Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Mon, 24 Feb 2025 18:29:23 +0800 Subject: [PATCH 0682/2211] f2fs: fix to avoid accessing uninitialized curseg commit 986c50f6bca109c6cf362b4e2babcb85aba958f6 upstream. syzbot reports a f2fs bug as below: F2FS-fs (loop3): Stopped filesystem due to reason: 7 kworker/u8:7: attempt to access beyond end of device BUG: unable to handle page fault for address: ffffed1604ea3dfa RIP: 0010:get_ckpt_valid_blocks fs/f2fs/segment.h:361 [inline] RIP: 0010:has_curseg_enough_space fs/f2fs/segment.h:570 [inline] RIP: 0010:__get_secs_required fs/f2fs/segment.h:620 [inline] RIP: 0010:has_not_enough_free_secs fs/f2fs/segment.h:633 [inline] RIP: 0010:has_enough_free_secs+0x575/0x1660 fs/f2fs/segment.h:649 f2fs_is_checkpoint_ready fs/f2fs/segment.h:671 [inline] f2fs_write_inode+0x425/0x540 fs/f2fs/inode.c:791 write_inode fs/fs-writeback.c:1525 [inline] __writeback_single_inode+0x708/0x10d0 fs/fs-writeback.c:1745 writeback_sb_inodes+0x820/0x1360 fs/fs-writeback.c:1976 wb_writeback+0x413/0xb80 fs/fs-writeback.c:2156 wb_do_writeback fs/fs-writeback.c:2303 [inline] wb_workfn+0x410/0x1080 fs/fs-writeback.c:2343 process_one_work kernel/workqueue.c:3236 [inline] process_scheduled_works+0xa66/0x1840 kernel/workqueue.c:3317 worker_thread+0x870/0xd30 kernel/workqueue.c:3398 kthread+0x7a9/0x920 kernel/kthread.c:464 ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:148 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244 Commit 8b10d3653735 ("f2fs: introduce FAULT_NO_SEGMENT") allows to trigger no free segment fault in allocator, then it will update curseg->segno to NULL_SEGNO, though, CP_ERROR_FLAG has been set, f2fs_write_inode() missed to check the flag, and access invalid curseg->segno directly in below call path, then resulting in panic: - f2fs_write_inode - f2fs_is_checkpoint_ready - has_enough_free_secs - has_not_enough_free_secs - __get_secs_required - has_curseg_enough_space - get_ckpt_valid_blocks : access invalid curseg->segno To avoid this issue, let's: - check CP_ERROR_FLAG flag in prior to f2fs_is_checkpoint_ready() in f2fs_write_inode(). - in has_curseg_enough_space(), save curseg->segno into a temp variable, and verify its validation before use. Fixes: 8b10d3653735 ("f2fs: introduce FAULT_NO_SEGMENT") Reported-by: syzbot+b6b347b7a4ea1b2e29b6@syzkaller.appspotmail.com Closes: https://lore.kernel.org/all/67973c2b.050a0220.11b1bb.0089.GAE@google.com Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Alva Lan Signed-off-by: Greg Kroah-Hartman --- fs/f2fs/inode.c | 7 +++++++ fs/f2fs/segment.h | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index a60db5e795a4c..1061991434b11 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -777,6 +777,13 @@ int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc) !is_inode_flag_set(inode, FI_DIRTY_INODE)) return 0; + /* + * no need to update inode page, ultimately f2fs_evict_inode() will + * clear dirty status of inode. + */ + if (f2fs_cp_error(sbi)) + return -EIO; + if (!f2fs_is_checkpoint_ready(sbi)) { f2fs_mark_inode_dirty_sync(inode, true); return -ENOSPC; diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h index 51b2b8c5c749c..0c004dd5595b9 100644 --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h @@ -562,13 +562,16 @@ static inline bool has_curseg_enough_space(struct f2fs_sb_info *sbi, unsigned int node_blocks, unsigned int data_blocks, unsigned int dent_blocks) { - unsigned int segno, left_blocks, blocks; int i; /* check current data/node sections in the worst case. */ for (i = CURSEG_HOT_DATA; i < NR_PERSISTENT_LOG; i++) { segno = CURSEG_I(sbi, i)->segno; + + if (unlikely(segno == NULL_SEGNO)) + return false; + left_blocks = CAP_BLKS_PER_SEC(sbi) - get_ckpt_valid_blocks(sbi, segno, true); @@ -579,6 +582,10 @@ static inline bool has_curseg_enough_space(struct f2fs_sb_info *sbi, /* check current data section for dentry blocks. */ segno = CURSEG_I(sbi, CURSEG_HOT_DATA)->segno; + + if (unlikely(segno == NULL_SEGNO)) + return false; + left_blocks = CAP_BLKS_PER_SEC(sbi) - get_ckpt_valid_blocks(sbi, segno, true); if (dent_blocks > left_blocks) -- GitLab From f49c751d6000ffb20e798df91e6a010c08318864 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Wed, 14 May 2025 21:18:32 +0200 Subject: [PATCH 0683/2211] pinctrl: armada-37xx: use correct OUTPUT_VAL register for GPIOs > 31 commit 947c93eb29c2a581c0b0b6d5f21af3c2b7ff6d25 upstream. The controller has two consecutive OUTPUT_VAL registers and both holds output value for 32 GPIOs. Due to a missing adjustment, the current code always uses the first register while setting the output value whereas it should use the second one for GPIOs > 31. Add the missing armada_37xx_update_reg() call to adjust the register according to the 'offset' parameter of the function to fix the issue. Cc: stable@vger.kernel.org Fixes: 6702abb3bf23 ("pinctrl: armada-37xx: Fix direction_output() callback behavior") Signed-off-by: Imre Kaloz Reviewed-by: Andrew Lunn Signed-off-by: Gabor Juhos Link: https://lore.kernel.org/20250514-pinctrl-a37xx-fixes-v2-1-07e9ac1ab737@gmail.com Signed-off-by: Linus Walleij Signed-off-by: Greg Kroah-Hartman --- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c index 4c4ada06423d7..394ec708f641f 100644 --- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c @@ -417,6 +417,7 @@ static int armada_37xx_gpio_direction_output(struct gpio_chip *chip, unsigned int offset, int value) { struct armada_37xx_pinctrl *info = gpiochip_get_data(chip); + unsigned int val_offset = offset; unsigned int reg = OUTPUT_EN; unsigned int mask, val, ret; @@ -429,6 +430,8 @@ static int armada_37xx_gpio_direction_output(struct gpio_chip *chip, return ret; reg = OUTPUT_VAL; + armada_37xx_update_reg(®, &val_offset); + val = value ? mask : 0; regmap_update_bits(info->regmap, reg, mask, val); -- GitLab From 614456f1a0febc83cd4b902e3f49990c95a39057 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Wed, 14 May 2025 21:18:33 +0200 Subject: [PATCH 0684/2211] pinctrl: armada-37xx: set GPIO output value before setting direction commit e6ebd4942981f8ad37189bbb36a3c8495e21ef4c upstream. Changing the direction before updating the output value in the OUTPUT_VAL register may result in a glitch on the output line if the previous value in the OUTPUT_VAL register is different from the one we want to set. In order to avoid that, update the output value before changing the direction. Cc: stable@vger.kernel.org Fixes: 6702abb3bf23 ("pinctrl: armada-37xx: Fix direction_output() callback behavior") Signed-off-by: Imre Kaloz Reviewed-by: Andrew Lunn Signed-off-by: Gabor Juhos Link: https://lore.kernel.org/20250514-pinctrl-a37xx-fixes-v2-2-07e9ac1ab737@gmail.com Signed-off-by: Linus Walleij Signed-off-by: Greg Kroah-Hartman --- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c index 394ec708f641f..4ce11c74fec1f 100644 --- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c @@ -417,23 +417,22 @@ static int armada_37xx_gpio_direction_output(struct gpio_chip *chip, unsigned int offset, int value) { struct armada_37xx_pinctrl *info = gpiochip_get_data(chip); - unsigned int val_offset = offset; - unsigned int reg = OUTPUT_EN; + unsigned int en_offset = offset; + unsigned int reg = OUTPUT_VAL; unsigned int mask, val, ret; armada_37xx_update_reg(®, &offset); mask = BIT(offset); + val = value ? mask : 0; - ret = regmap_update_bits(info->regmap, reg, mask, mask); - + ret = regmap_update_bits(info->regmap, reg, mask, val); if (ret) return ret; - reg = OUTPUT_VAL; - armada_37xx_update_reg(®, &val_offset); + reg = OUTPUT_EN; + armada_37xx_update_reg(®, &en_offset); - val = value ? mask : 0; - regmap_update_bits(info->regmap, reg, mask, val); + regmap_update_bits(info->regmap, reg, mask, mask); return 0; } -- GitLab From 32b7c46c4dae93fb5e9a8c2f33fefbb160d2808f Mon Sep 17 00:00:00 2001 From: "Gautham R. Shenoy" Date: Thu, 29 May 2025 14:21:43 +0530 Subject: [PATCH 0685/2211] acpi-cpufreq: Fix nominal_freq units to KHz in get_max_boost_ratio() commit cb6a85f38f456b086c366e346ebb67ffa70c7243 upstream. commit 083466754596 ("cpufreq: ACPI: Fix max-frequency computation") modified get_max_boost_ratio() to return the nominal_freq advertised in the _CPC object. This was for the purposes of computing the maximum frequency. The frequencies advertised in _CPC objects are in MHz. However, cpufreq expects the frequency to be in KHz. Since the nominal_freq returned by get_max_boost_ratio() was not in KHz but instead in MHz,the cpuinfo_max_frequency that was computed using this nominal_freq was incorrect and an invalid value which resulted in cpufreq reporting the P0 frequency as the cpuinfo_max_freq. Fix this by converting the nominal_freq to KHz before returning the same from get_max_boost_ratio(). Reported-by: Manu Bretelle Closes: https://lore.kernel.org/lkml/aDaB63tDvbdcV0cg@HQ-GR2X1W2P57/ Fixes: 083466754596 ("cpufreq: ACPI: Fix max-frequency computation") Signed-off-by: Gautham R. Shenoy Cc: 6.14+ # 6.14+ Link: https://patch.msgid.link/20250529085143.709-1-gautham.shenoy@amd.com Signed-off-by: Rafael J. Wysocki Signed-off-by: Greg Kroah-Hartman --- drivers/cpufreq/acpi-cpufreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index 47e910c22a80b..0f1679817682f 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c @@ -663,7 +663,7 @@ static u64 get_max_boost_ratio(unsigned int cpu, u64 *nominal_freq) nominal_perf = perf_caps.nominal_perf; if (nominal_freq) - *nominal_freq = perf_caps.nominal_freq; + *nominal_freq = perf_caps.nominal_freq * 1000; if (!highest_perf || !nominal_perf) { pr_debug("CPU%d: highest or nominal performance missing\n", cpu); -- GitLab From f28fae36bad35c49a49342df7faa825d709319bb Mon Sep 17 00:00:00 2001 From: Sakari Ailus Date: Wed, 9 Apr 2025 11:47:38 +0300 Subject: [PATCH 0686/2211] Documentation: ACPI: Use all-string data node references commit 6db0261f3776bde01ae916ad8e1cb2ded3ba1a2b upstream. Document that references to data nodes shall use string-only references instead of a device reference and a succession of the first package entries of hierarchical data node references. Fixes: 9880702d123f ("ACPI: property: Support using strings in reference properties") Cc: 6.8+ # 6.8+ Signed-off-by: Sakari Ailus Link: https://patch.msgid.link/20250409084738.3657079-1-sakari.ailus@linux.intel.com [ rjw: Clarifying edits ] Signed-off-by: Rafael J. Wysocki Signed-off-by: Greg Kroah-Hartman --- .../acpi/dsd/data-node-references.rst | 26 +++++++++---------- .../firmware-guide/acpi/dsd/graph.rst | 11 +++----- .../firmware-guide/acpi/dsd/leds.rst | 7 +---- 3 files changed, 17 insertions(+), 27 deletions(-) diff --git a/Documentation/firmware-guide/acpi/dsd/data-node-references.rst b/Documentation/firmware-guide/acpi/dsd/data-node-references.rst index 8d8b53e96bcfe..ccb4b153e6f2d 100644 --- a/Documentation/firmware-guide/acpi/dsd/data-node-references.rst +++ b/Documentation/firmware-guide/acpi/dsd/data-node-references.rst @@ -12,11 +12,14 @@ ACPI in general allows referring to device objects in the tree only. Hierarchical data extension nodes may not be referred to directly, hence this document defines a scheme to implement such references. -A reference consist of the device object name followed by one or more -hierarchical data extension [dsd-guide] keys. Specifically, the hierarchical -data extension node which is referred to by the key shall lie directly under -the parent object i.e. either the device object or another hierarchical data -extension node. +A reference to a _DSD hierarchical data node is a string consisting of a +device object reference followed by a dot (".") and a relative path to a data +node object. Do not use non-string references as this will produce a copy of +the hierarchical data node, not a reference! + +The hierarchical data extension node which is referred to shall be located +directly under its parent object i.e. either the device object or another +hierarchical data extension node [dsd-guide]. The keys in the hierarchical data nodes shall consist of the name of the node, "@" character and the number of the node in hexadecimal notation (without pre- @@ -33,11 +36,9 @@ extension key. Example ======= -In the ASL snippet below, the "reference" _DSD property contains a -device object reference to DEV0 and under that device object, a -hierarchical data extension key "node@1" referring to the NOD1 object -and lastly, a hierarchical data extension key "anothernode" referring to -the ANOD object which is also the final target node of the reference. +In the ASL snippet below, the "reference" _DSD property contains a string +reference to a hierarchical data extension node ANOD under DEV0 under the parent +of DEV1. ANOD is also the final target node of the reference. :: Device (DEV0) @@ -76,10 +77,7 @@ the ANOD object which is also the final target node of the reference. Name (_DSD, Package () { ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), Package () { - Package () { - "reference", Package () { - ^DEV0, "node@1", "anothernode" - } + Package () { "reference", "^DEV0.ANOD" } }, } }) diff --git a/Documentation/firmware-guide/acpi/dsd/graph.rst b/Documentation/firmware-guide/acpi/dsd/graph.rst index b9dbfc73ed25b..d6ae5ffa748ca 100644 --- a/Documentation/firmware-guide/acpi/dsd/graph.rst +++ b/Documentation/firmware-guide/acpi/dsd/graph.rst @@ -66,12 +66,9 @@ of that port shall be zero. Similarly, if a port may only have a single endpoint, the number of that endpoint shall be zero. The endpoint reference uses property extension with "remote-endpoint" property -name followed by a reference in the same package. Such references consist of -the remote device reference, the first package entry of the port data extension -reference under the device and finally the first package entry of the endpoint -data extension reference under the port. Individual references thus appear as:: +name followed by a string reference in the same package. [data-node-ref]:: - Package() { device, "port@X", "endpoint@Y" } + "device.datanode" In the above example, "X" is the number of the port and "Y" is the number of the endpoint. @@ -109,7 +106,7 @@ A simple example of this is show below:: ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), Package () { Package () { "reg", 0 }, - Package () { "remote-endpoint", Package() { \_SB.PCI0.ISP, "port@4", "endpoint@0" } }, + Package () { "remote-endpoint", "\\_SB.PCI0.ISP.EP40" }, } }) } @@ -141,7 +138,7 @@ A simple example of this is show below:: ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), Package () { Package () { "reg", 0 }, - Package () { "remote-endpoint", Package () { \_SB.PCI0.I2C2.CAM0, "port@0", "endpoint@0" } }, + Package () { "remote-endpoint", "\\_SB.PCI0.I2C2.CAM0.EP00" }, } }) } diff --git a/Documentation/firmware-guide/acpi/dsd/leds.rst b/Documentation/firmware-guide/acpi/dsd/leds.rst index 93db592c93c71..a97cd07d49be3 100644 --- a/Documentation/firmware-guide/acpi/dsd/leds.rst +++ b/Documentation/firmware-guide/acpi/dsd/leds.rst @@ -15,11 +15,6 @@ Referring to LEDs in Device tree is documented in [video-interfaces], in "flash-leds" property documentation. In short, LEDs are directly referred to by using phandles. -While Device tree allows referring to any node in the tree [devicetree], in -ACPI references are limited to device nodes only [acpi]. For this reason using -the same mechanism on ACPI is not possible. A mechanism to refer to non-device -ACPI nodes is documented in [data-node-ref]. - ACPI allows (as does DT) using integer arguments after the reference. A combination of the LED driver device reference and an integer argument, referring to the "reg" property of the relevant LED, is used to identify @@ -74,7 +69,7 @@ omitted. :: Package () { Package () { "flash-leds", - Package () { ^LED, "led@0", ^LED, "led@1" }, + Package () { "^LED.LED0", "^LED.LED1" }, } } }) -- GitLab From a6a55fe660f8c0d62a1ad663fc878593dafad0f5 Mon Sep 17 00:00:00 2001 From: Alexandre Mergnat Date: Mon, 28 Apr 2025 12:06:47 +0200 Subject: [PATCH 0687/2211] rtc: Make rtc_time64_to_tm() support dates before 1970 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 7df4cfef8b351fec3156160bedfc7d6d29de4cce upstream. Conversion of dates before 1970 is still relevant today because these dates are reused on some hardwares to store dates bigger than the maximal date that is representable in the device's native format. This prominently and very soon affects the hardware covered by the rtc-mt6397 driver that can only natively store dates in the interval 1900-01-01 up to 2027-12-31. So to store the date 2028-01-01 00:00:00 to such a device, rtc_time64_to_tm() must do the right thing for time=-2208988800. Signed-off-by: Alexandre Mergnat Reviewed-by: Uwe Kleine-König Link: https://lore.kernel.org/r/20250428-enable-rtc-v4-1-2b2f7e3f9349@baylibre.com Signed-off-by: Alexandre Belloni Signed-off-by: Uwe Kleine-König Signed-off-by: Greg Kroah-Hartman --- drivers/rtc/lib.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/rtc/lib.c b/drivers/rtc/lib.c index fe361652727a3..13b5b1f204651 100644 --- a/drivers/rtc/lib.c +++ b/drivers/rtc/lib.c @@ -46,24 +46,38 @@ EXPORT_SYMBOL(rtc_year_days); * rtc_time64_to_tm - converts time64_t to rtc_time. * * @time: The number of seconds since 01-01-1970 00:00:00. - * (Must be positive.) + * Works for values since at least 1900 * @tm: Pointer to the struct rtc_time. */ void rtc_time64_to_tm(time64_t time, struct rtc_time *tm) { - unsigned int secs; - int days; + int days, secs; u64 u64tmp; u32 u32tmp, udays, century, day_of_century, year_of_century, year, day_of_year, month, day; bool is_Jan_or_Feb, is_leap_year; - /* time must be positive */ + /* + * Get days and seconds while preserving the sign to + * handle negative time values (dates before 1970-01-01) + */ days = div_s64_rem(time, 86400, &secs); + /* + * We need 0 <= secs < 86400 which isn't given for negative + * values of time. Fixup accordingly. + */ + if (secs < 0) { + days -= 1; + secs += 86400; + } + /* day of the week, 1970-01-01 was a Thursday */ tm->tm_wday = (days + 4) % 7; + /* Ensure tm_wday is always positive */ + if (tm->tm_wday < 0) + tm->tm_wday += 7; /* * The following algorithm is, basically, Proposition 6.3 of Neri @@ -93,7 +107,7 @@ void rtc_time64_to_tm(time64_t time, struct rtc_time *tm) * thus, is slightly different from [1]. */ - udays = ((u32) days) + 719468; + udays = days + 719468; u32tmp = 4 * udays + 3; century = u32tmp / 146097; -- GitLab From 6b482b16f32e2b04aacff6933f6367b6afa04f5e Mon Sep 17 00:00:00 2001 From: Alexandre Mergnat Date: Mon, 28 Apr 2025 12:06:48 +0200 Subject: [PATCH 0688/2211] rtc: Fix offset calculation for .start_secs < 0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit fe9f5f96cfe8b82d0f24cbfa93718925560f4f8d upstream. The comparison rtc->start_secs > rtc->range_max has a signed left-hand side and an unsigned right-hand side. So the comparison might become true for negative start_secs which is interpreted as a (possibly very large) positive value. As a negative value can never be bigger than an unsigned value the correct representation of the (mathematical) comparison rtc->start_secs > rtc->range_max in C is: rtc->start_secs >= 0 && rtc->start_secs > rtc->range_max Use that to fix the offset calculation currently used in the rtc-mt6397 driver. Fixes: 989515647e783 ("rtc: Add one offset seconds to expand RTC range") Signed-off-by: Alexandre Mergnat Reviewed-by: Uwe Kleine-König Link: https://lore.kernel.org/r/20250428-enable-rtc-v4-2-2b2f7e3f9349@baylibre.com Signed-off-by: Alexandre Belloni Signed-off-by: Uwe Kleine-König Signed-off-by: Greg Kroah-Hartman --- drivers/rtc/class.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c index e31fa0ad127e9..a0afdeaac270f 100644 --- a/drivers/rtc/class.c +++ b/drivers/rtc/class.c @@ -327,7 +327,7 @@ static void rtc_device_get_offset(struct rtc_device *rtc) * * Otherwise the offset seconds should be 0. */ - if (rtc->start_secs > rtc->range_max || + if ((rtc->start_secs >= 0 && rtc->start_secs > rtc->range_max) || rtc->start_secs + range_secs - 1 < rtc->range_min) rtc->offset_secs = rtc->start_secs - rtc->range_min; else if (rtc->start_secs > rtc->range_min) -- GitLab From f4deea418499a78ca00b3e4fb8878317ab9a358d Mon Sep 17 00:00:00 2001 From: Maciej Falkowski Date: Fri, 4 Oct 2024 18:25:04 +0200 Subject: [PATCH 0689/2211] accel/ivpu: Add initial Panther Lake support commit c140244f0cfb9601dbc35e7ab90914954a76b3d1 upstream. Add support for the 5th generation of Intel NPU that is going to be present in PTL_P (Panther Lake) CPUs. NPU5 code reuses almost all of previous driver code. Signed-off-by: Maciej Falkowski Reviewed-by: Jeffrey Hugo Link: https://patchwork.freedesktop.org/patch/msgid/20241004162505.1695605-2-maciej.falkowski@linux.intel.com Signed-off-by: Jacek Lawrynowicz Signed-off-by: Greg Kroah-Hartman --- drivers/accel/ivpu/ivpu_drv.c | 1 + drivers/accel/ivpu/ivpu_drv.h | 10 +++++++--- drivers/accel/ivpu/ivpu_fw.c | 3 +++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_drv.c b/drivers/accel/ivpu/ivpu_drv.c index 168d03d5aa1d0..67d56a944d549 100644 --- a/drivers/accel/ivpu/ivpu_drv.c +++ b/drivers/accel/ivpu/ivpu_drv.c @@ -709,6 +709,7 @@ static struct pci_device_id ivpu_pci_ids[] = { { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_MTL) }, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ARL) }, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_LNL) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_PTL_P) }, { } }; MODULE_DEVICE_TABLE(pci, ivpu_pci_ids); diff --git a/drivers/accel/ivpu/ivpu_drv.h b/drivers/accel/ivpu/ivpu_drv.h index a5707a85e7255..1fe6a3bd4e36b 100644 --- a/drivers/accel/ivpu/ivpu_drv.h +++ b/drivers/accel/ivpu/ivpu_drv.h @@ -23,9 +23,10 @@ #define DRIVER_DESC "Driver for Intel NPU (Neural Processing Unit)" #define DRIVER_DATE "20230117" -#define PCI_DEVICE_ID_MTL 0x7d1d -#define PCI_DEVICE_ID_ARL 0xad1d -#define PCI_DEVICE_ID_LNL 0x643e +#define PCI_DEVICE_ID_MTL 0x7d1d +#define PCI_DEVICE_ID_ARL 0xad1d +#define PCI_DEVICE_ID_LNL 0x643e +#define PCI_DEVICE_ID_PTL_P 0xb03e #define IVPU_HW_IP_37XX 37 #define IVPU_HW_IP_40XX 40 @@ -227,6 +228,8 @@ static inline int ivpu_hw_ip_gen(struct ivpu_device *vdev) return IVPU_HW_IP_37XX; case PCI_DEVICE_ID_LNL: return IVPU_HW_IP_40XX; + case PCI_DEVICE_ID_PTL_P: + return IVPU_HW_IP_50XX; default: dump_stack(); ivpu_err(vdev, "Unknown NPU IP generation\n"); @@ -241,6 +244,7 @@ static inline int ivpu_hw_btrs_gen(struct ivpu_device *vdev) case PCI_DEVICE_ID_ARL: return IVPU_HW_BTRS_MTL; case PCI_DEVICE_ID_LNL: + case PCI_DEVICE_ID_PTL_P: return IVPU_HW_BTRS_LNL; default: dump_stack(); diff --git a/drivers/accel/ivpu/ivpu_fw.c b/drivers/accel/ivpu/ivpu_fw.c index d12188730ac7f..83e4995540a6e 100644 --- a/drivers/accel/ivpu/ivpu_fw.c +++ b/drivers/accel/ivpu/ivpu_fw.c @@ -57,11 +57,14 @@ static struct { { IVPU_HW_IP_37XX, "intel/vpu/vpu_37xx_v0.0.bin" }, { IVPU_HW_IP_40XX, "vpu_40xx.bin" }, { IVPU_HW_IP_40XX, "intel/vpu/vpu_40xx_v0.0.bin" }, + { IVPU_HW_IP_50XX, "vpu_50xx.bin" }, + { IVPU_HW_IP_50XX, "intel/vpu/vpu_50xx_v0.0.bin" }, }; /* Production fw_names from the table above */ MODULE_FIRMWARE("intel/vpu/vpu_37xx_v0.0.bin"); MODULE_FIRMWARE("intel/vpu/vpu_40xx_v0.0.bin"); +MODULE_FIRMWARE("intel/vpu/vpu_50xx_v0.0.bin"); static int ivpu_fw_request(struct ivpu_device *vdev) { -- GitLab From 4685153b121e0e79ad02ae7ed77b8c35bcce58b1 Mon Sep 17 00:00:00 2001 From: Karol Wachowski Date: Fri, 4 Oct 2024 18:25:05 +0200 Subject: [PATCH 0690/2211] accel/ivpu: Update power island delays commit 88bdd1644ca28d48591b2a1e6e8b8c2b13f4bd3f upstream. Apply Hardware Architecture Specification compatible delays for main island power delivery for 50xx and above. Signed-off-by: Karol Wachowski Signed-off-by: Maciej Falkowski Reviewed-by: Jeffrey Hugo Link: https://patchwork.freedesktop.org/patch/msgid/20241004162505.1695605-3-maciej.falkowski@linux.intel.com Signed-off-by: Jacek Lawrynowicz Signed-off-by: Greg Kroah-Hartman --- drivers/accel/ivpu/ivpu_hw_40xx_reg.h | 2 ++ drivers/accel/ivpu/ivpu_hw_ip.c | 49 +++++++++++++++++---------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_hw_40xx_reg.h b/drivers/accel/ivpu/ivpu_hw_40xx_reg.h index d0b795b344c7f..fc0ee8d637f96 100644 --- a/drivers/accel/ivpu/ivpu_hw_40xx_reg.h +++ b/drivers/accel/ivpu/ivpu_hw_40xx_reg.h @@ -115,6 +115,8 @@ #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY 0x00030068u #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY_POST_DLY_MASK GENMASK(7, 0) +#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY_POST1_DLY_MASK GENMASK(15, 8) +#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY_POST2_DLY_MASK GENMASK(23, 16) #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY 0x0003006cu #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY_STATUS_DLY_MASK GENMASK(7, 0) diff --git a/drivers/accel/ivpu/ivpu_hw_ip.c b/drivers/accel/ivpu/ivpu_hw_ip.c index 60b33fc59d96e..bd2582a8c80f3 100644 --- a/drivers/accel/ivpu/ivpu_hw_ip.c +++ b/drivers/accel/ivpu/ivpu_hw_ip.c @@ -8,15 +8,12 @@ #include "ivpu_hw.h" #include "ivpu_hw_37xx_reg.h" #include "ivpu_hw_40xx_reg.h" +#include "ivpu_hw_btrs.h" #include "ivpu_hw_ip.h" #include "ivpu_hw_reg_io.h" #include "ivpu_mmu.h" #include "ivpu_pm.h" -#define PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT 0 -#define PWR_ISLAND_EN_POST_DLY_FREQ_HIGH 18 -#define PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT 3 -#define PWR_ISLAND_STATUS_DLY_FREQ_HIGH 46 #define PWR_ISLAND_STATUS_TIMEOUT_US (5 * USEC_PER_MSEC) #define TIM_SAFE_ENABLE 0xf1d0dead @@ -268,20 +265,15 @@ void ivpu_hw_ip_idle_gen_disable(struct ivpu_device *vdev) idle_gen_drive_40xx(vdev, false); } -static void pwr_island_delay_set_50xx(struct ivpu_device *vdev) +static void +pwr_island_delay_set_50xx(struct ivpu_device *vdev, u32 post, u32 post1, u32 post2, u32 status) { - u32 val, post, status; - - if (vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_DEFAULT) { - post = PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT; - status = PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT; - } else { - post = PWR_ISLAND_EN_POST_DLY_FREQ_HIGH; - status = PWR_ISLAND_STATUS_DLY_FREQ_HIGH; - } + u32 val; val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY); val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, POST_DLY, post, val); + val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, POST1_DLY, post1, val); + val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, POST2_DLY, post2, val); REGV_WR32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, val); val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY); @@ -686,13 +678,36 @@ static void dpu_active_drive_37xx(struct ivpu_device *vdev, bool enable) REGV_WR32(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, val); } +static void pwr_island_delay_set(struct ivpu_device *vdev) +{ + bool high = vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_HIGH; + u32 post, post1, post2, status; + + if (ivpu_hw_ip_gen(vdev) < IVPU_HW_IP_50XX) + return; + + switch (ivpu_device_id(vdev)) { + case PCI_DEVICE_ID_PTL_P: + post = high ? 18 : 0; + post1 = 0; + post2 = 0; + status = high ? 46 : 3; + break; + + default: + dump_stack(); + ivpu_err(vdev, "Unknown device ID\n"); + return; + } + + pwr_island_delay_set_50xx(vdev, post, post1, post2, status); +} + int ivpu_hw_ip_pwr_domain_enable(struct ivpu_device *vdev) { int ret; - if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_50XX) - pwr_island_delay_set_50xx(vdev); - + pwr_island_delay_set(vdev); pwr_island_enable(vdev); ret = wait_for_pwr_island_status(vdev, 0x1); -- GitLab From 3c4fed940db2a4da00adbe8c7c3ff08292c84a4c Mon Sep 17 00:00:00 2001 From: Ajay Agarwal Date: Mon, 7 Oct 2024 08:59:17 +0530 Subject: [PATCH 0691/2211] PCI/ASPM: Disable L1 before disabling L1 PM Substates commit 7447990137bf06b2aeecad9c6081e01a9f47f2aa upstream. PCIe r6.2, sec 5.5.4, requires that: If setting either or both of the enable bits for ASPM L1 PM Substates, both ports must be configured as described in this section while ASPM L1 is disabled. Previously, pcie_config_aspm_l1ss() assumed that "setting enable bits" meant "setting them to 1", and it configured L1SS as follows: - Clear L1SS enable bits - Disable L1 - Configure L1SS enable bits as required - Enable L1 if required With this sequence, when disabling L1SS on an ARM A-core with a Synopsys DesignWare PCIe core, the CPU occasionally hangs when reading PCI_L1SS_CTL1, leading to a reboot when the CPU watchdog expires. Move the L1 disable to the caller (pcie_config_aspm_link(), where L1 was already enabled) so L1 is always disabled while updating the L1SS bits: - Disable L1 - Clear L1SS enable bits - Configure L1SS enable bits as required - Enable L1 if required Change pcie_aspm_cap_init() similarly. Link: https://lore.kernel.org/r/20241007032917.872262-1-ajayagarwal@google.com Signed-off-by: Ajay Agarwal [bhelgaas: comments, commit log, compute L1SS setting before config access] Signed-off-by: Bjorn Helgaas Tested-by: Johnny-CC Chang Signed-off-by: Macpaul Lin Signed-off-by: Greg Kroah-Hartman --- drivers/pci/pcie/aspm.c | 92 ++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 42 deletions(-) diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 62650a2f00ccc..a392e060ca2f4 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -805,6 +805,15 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) pcie_capability_read_word(parent, PCI_EXP_LNKCTL, &parent_lnkctl); pcie_capability_read_word(child, PCI_EXP_LNKCTL, &child_lnkctl); + /* Disable L0s/L1 before updating L1SS config */ + if (FIELD_GET(PCI_EXP_LNKCTL_ASPMC, child_lnkctl) || + FIELD_GET(PCI_EXP_LNKCTL_ASPMC, parent_lnkctl)) { + pcie_capability_write_word(child, PCI_EXP_LNKCTL, + child_lnkctl & ~PCI_EXP_LNKCTL_ASPMC); + pcie_capability_write_word(parent, PCI_EXP_LNKCTL, + parent_lnkctl & ~PCI_EXP_LNKCTL_ASPMC); + } + /* * Setup L0s state * @@ -829,6 +838,13 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) aspm_l1ss_init(link); + /* Restore L0s/L1 if they were enabled */ + if (FIELD_GET(PCI_EXP_LNKCTL_ASPMC, child_lnkctl) || + FIELD_GET(PCI_EXP_LNKCTL_ASPMC, parent_lnkctl)) { + pcie_capability_write_word(parent, PCI_EXP_LNKCTL, parent_lnkctl); + pcie_capability_write_word(child, PCI_EXP_LNKCTL, child_lnkctl); + } + /* Save default state */ link->aspm_default = link->aspm_enabled; @@ -845,25 +861,28 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) } } -/* Configure the ASPM L1 substates */ +/* Configure the ASPM L1 substates. Caller must disable L1 first. */ static void pcie_config_aspm_l1ss(struct pcie_link_state *link, u32 state) { - u32 val, enable_req; + u32 val; struct pci_dev *child = link->downstream, *parent = link->pdev; - enable_req = (link->aspm_enabled ^ state) & state; + val = 0; + if (state & PCIE_LINK_STATE_L1_1) + val |= PCI_L1SS_CTL1_ASPM_L1_1; + if (state & PCIE_LINK_STATE_L1_2) + val |= PCI_L1SS_CTL1_ASPM_L1_2; + if (state & PCIE_LINK_STATE_L1_1_PCIPM) + val |= PCI_L1SS_CTL1_PCIPM_L1_1; + if (state & PCIE_LINK_STATE_L1_2_PCIPM) + val |= PCI_L1SS_CTL1_PCIPM_L1_2; /* - * Here are the rules specified in the PCIe spec for enabling L1SS: - * - When enabling L1.x, enable bit at parent first, then at child - * - When disabling L1.x, disable bit at child first, then at parent - * - When enabling ASPM L1.x, need to disable L1 - * (at child followed by parent). - * - The ASPM/PCIPM L1.2 must be disabled while programming timing + * PCIe r6.2, sec 5.5.4, rules for enabling L1 PM Substates: + * - Clear L1.x enable bits at child first, then at parent + * - Set L1.x enable bits at parent first, then at child + * - ASPM/PCIPM L1.2 must be disabled while programming timing * parameters - * - * To keep it simple, disable all L1SS bits first, and later enable - * what is needed. */ /* Disable all L1 substates */ @@ -871,26 +890,6 @@ static void pcie_config_aspm_l1ss(struct pcie_link_state *link, u32 state) PCI_L1SS_CTL1_L1SS_MASK, 0); pci_clear_and_set_config_dword(parent, parent->l1ss + PCI_L1SS_CTL1, PCI_L1SS_CTL1_L1SS_MASK, 0); - /* - * If needed, disable L1, and it gets enabled later - * in pcie_config_aspm_link(). - */ - if (enable_req & (PCIE_LINK_STATE_L1_1 | PCIE_LINK_STATE_L1_2)) { - pcie_capability_clear_word(child, PCI_EXP_LNKCTL, - PCI_EXP_LNKCTL_ASPM_L1); - pcie_capability_clear_word(parent, PCI_EXP_LNKCTL, - PCI_EXP_LNKCTL_ASPM_L1); - } - - val = 0; - if (state & PCIE_LINK_STATE_L1_1) - val |= PCI_L1SS_CTL1_ASPM_L1_1; - if (state & PCIE_LINK_STATE_L1_2) - val |= PCI_L1SS_CTL1_ASPM_L1_2; - if (state & PCIE_LINK_STATE_L1_1_PCIPM) - val |= PCI_L1SS_CTL1_PCIPM_L1_1; - if (state & PCIE_LINK_STATE_L1_2_PCIPM) - val |= PCI_L1SS_CTL1_PCIPM_L1_2; /* Enable what we need to enable */ pci_clear_and_set_config_dword(parent, parent->l1ss + PCI_L1SS_CTL1, @@ -937,21 +936,30 @@ static void pcie_config_aspm_link(struct pcie_link_state *link, u32 state) dwstream |= PCI_EXP_LNKCTL_ASPM_L1; } + /* + * Per PCIe r6.2, sec 5.5.4, setting either or both of the enable + * bits for ASPM L1 PM Substates must be done while ASPM L1 is + * disabled. Disable L1 here and apply new configuration after L1SS + * configuration has been completed. + * + * Per sec 7.5.3.7, when disabling ASPM L1, software must disable + * it in the Downstream component prior to disabling it in the + * Upstream component, and ASPM L1 must be enabled in the Upstream + * component prior to enabling it in the Downstream component. + * + * Sec 7.5.3.7 also recommends programming the same ASPM Control + * value for all functions of a multi-function device. + */ + list_for_each_entry(child, &linkbus->devices, bus_list) + pcie_config_aspm_dev(child, 0); + pcie_config_aspm_dev(parent, 0); + if (link->aspm_capable & PCIE_LINK_STATE_L1SS) pcie_config_aspm_l1ss(link, state); - /* - * Spec 2.0 suggests all functions should be configured the - * same setting for ASPM. Enabling ASPM L1 should be done in - * upstream component first and then downstream, and vice - * versa for disabling ASPM L1. Spec doesn't mention L0S. - */ - if (state & PCIE_LINK_STATE_L1) - pcie_config_aspm_dev(parent, upstream); + pcie_config_aspm_dev(parent, upstream); list_for_each_entry(child, &linkbus->devices, bus_list) pcie_config_aspm_dev(child, dwstream); - if (!(state & PCIE_LINK_STATE_L1)) - pcie_config_aspm_dev(parent, upstream); link->aspm_enabled = state; -- GitLab From 0c60158ff14df04c92792dd9b1809372b095040f Mon Sep 17 00:00:00 2001 From: Ming Lei Date: Wed, 12 Mar 2025 22:51:36 +0800 Subject: [PATCH 0692/2211] block: fix adding folio to bio commit 26064d3e2b4d9a14df1072980e558c636fb023ea upstream. >4GB folio is possible on some ARCHs, such as aarch64, 16GB hugepage is supported, then 'offset' of folio can't be held in 'unsigned int', cause warning in bio_add_folio_nofail() and IO failure. Fix it by adjusting 'page' & trimming 'offset' so that `->bi_offset` won't be overflow, and folio can be added to bio successfully. Fixes: ed9832bc08db ("block: introduce folio awareness and add a bigger size from folio") Cc: Kundan Kumar Cc: Matthew Wilcox (Oracle) Cc: Christoph Hellwig Cc: Luis Chamberlain Cc: Gavin Shan Signed-off-by: Ming Lei Reviewed-by: Matthew Wilcox (Oracle) Link: https://lore.kernel.org/r/20250312145136.2891229-1-ming.lei@redhat.com Signed-off-by: Jens Axboe [ The follow-up fix fbecd731de05 ("xfs: fix zoned GC data corruption due to wrong bv_offset") addresses issues in the file fs/xfs/xfs_zone_gc.c. This file was first introduced in version v6.15-rc1. So don't backport the follow up fix to 6.12.y. ] Signed-off-by: Alva Lan Signed-off-by: Greg Kroah-Hartman --- block/bio.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/block/bio.c b/block/bio.c index 20c74696bf23b..094a5adf79d23 100644 --- a/block/bio.c +++ b/block/bio.c @@ -1156,9 +1156,10 @@ EXPORT_SYMBOL(bio_add_page); void bio_add_folio_nofail(struct bio *bio, struct folio *folio, size_t len, size_t off) { + unsigned long nr = off / PAGE_SIZE; + WARN_ON_ONCE(len > UINT_MAX); - WARN_ON_ONCE(off > UINT_MAX); - __bio_add_page(bio, &folio->page, len, off); + __bio_add_page(bio, folio_page(folio, nr), len, off % PAGE_SIZE); } EXPORT_SYMBOL_GPL(bio_add_folio_nofail); @@ -1179,9 +1180,11 @@ EXPORT_SYMBOL_GPL(bio_add_folio_nofail); bool bio_add_folio(struct bio *bio, struct folio *folio, size_t len, size_t off) { - if (len > UINT_MAX || off > UINT_MAX) + unsigned long nr = off / PAGE_SIZE; + + if (len > UINT_MAX) return false; - return bio_add_page(bio, &folio->page, len, off) > 0; + return bio_add_page(bio, folio_page(folio, nr), len, off % PAGE_SIZE) > 0; } EXPORT_SYMBOL(bio_add_folio); -- GitLab From a347664312be418cf6e28b7afa1fa24623a387d6 Mon Sep 17 00:00:00 2001 From: Jon Hunter Date: Thu, 5 Jun 2025 13:54:32 +0100 Subject: [PATCH 0693/2211] Revert "cpufreq: tegra186: Share policy per cluster" This reverts commit d95fdee2253e612216e72f29c65b92ec42d254eb which is upstream commit be4ae8c19492cd6d5de61ccb34ffb3f5ede5eec8. This commit is causing a suspend regression on Tegra186 Jetson TX2 with Linux v6.12.y kernels. This is not seen with Linux v6.15 that includes this change but indicates that there are there changes missing. Therefore, revert this change. Fixes: d95fdee2253e ("cpufreq: tegra186: Share policy per cluster") Link: https://lore.kernel.org/linux-tegra/bf1dabf7-0337-40e9-8b8e-4e93a0ffd4cc@nvidia.com/ Signed-off-by: Jon Hunter Signed-off-by: Greg Kroah-Hartman --- drivers/cpufreq/tegra186-cpufreq.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/drivers/cpufreq/tegra186-cpufreq.c b/drivers/cpufreq/tegra186-cpufreq.c index 4e5b6f9a56d1b..7b8fcfa55038b 100644 --- a/drivers/cpufreq/tegra186-cpufreq.c +++ b/drivers/cpufreq/tegra186-cpufreq.c @@ -73,18 +73,11 @@ static int tegra186_cpufreq_init(struct cpufreq_policy *policy) { struct tegra186_cpufreq_data *data = cpufreq_get_driver_data(); unsigned int cluster = data->cpus[policy->cpu].bpmp_cluster_id; - u32 cpu; policy->freq_table = data->clusters[cluster].table; policy->cpuinfo.transition_latency = 300 * 1000; policy->driver_data = NULL; - /* set same policy for all cpus in a cluster */ - for (cpu = 0; cpu < ARRAY_SIZE(tegra186_cpus); cpu++) { - if (data->cpus[cpu].bpmp_cluster_id == cluster) - cpumask_set_cpu(cpu, policy->cpus); - } - return 0; } -- GitLab From 23179d009cf593bb90811d9a12c22cbf52cc1dfe Mon Sep 17 00:00:00 2001 From: Jiayi Li Date: Thu, 8 May 2025 13:59:47 +0800 Subject: [PATCH 0694/2211] usb: quirks: Add NO_LPM quirk for SanDisk Extreme 55AE commit 19f795591947596b5b9efa86fd4b9058e45786e9 upstream. This device exhibits I/O errors during file transfers due to unstable link power management (LPM) behavior. The kernel logs show repeated warm resets and eventual disconnection when LPM is enabled: [ 3467.810740] hub 2-0:1.0: state 7 ports 6 chg 0000 evt 0020 [ 3467.810740] usb usb2-port5: do warm reset [ 3467.866444] usb usb2-port5: not warm reset yet, waiting 50ms [ 3467.907407] sd 0:0:0:0: [sda] tag#12 sense submit err -19 [ 3467.994423] usb usb2-port5: status 02c0, change 0001, 10.0 Gb/s [ 3467.994453] usb 2-5: USB disconnect, device number 4 The error -19 (ENODEV) occurs when the device disappears during write operations. Adding USB_QUIRK_NO_LPM disables link power management for this specific device, resolving the stability issues. Signed-off-by: Jiayi Li Cc: stable Link: https://lore.kernel.org/r/20250508055947.764538-1-lijiayi@kylinos.cn Signed-off-by: Greg Kroah-Hartman --- drivers/usb/core/quirks.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 4903c733d37ae..c979ecd0169a2 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c @@ -372,6 +372,9 @@ static const struct usb_device_id usb_quirk_list[] = { /* SanDisk Corp. SanDisk 3.2Gen1 */ { USB_DEVICE(0x0781, 0x55a3), .driver_info = USB_QUIRK_DELAY_INIT }, + /* SanDisk Extreme 55AE */ + { USB_DEVICE(0x0781, 0x55ae), .driver_info = USB_QUIRK_NO_LPM }, + /* Realforce 87U Keyboard */ { USB_DEVICE(0x0853, 0x011b), .driver_info = USB_QUIRK_NO_LPM }, -- GitLab From 393ad978388ee83911eaef389dcc4e1183bef7bf Mon Sep 17 00:00:00 2001 From: Hongyu Xie Date: Mon, 19 May 2025 10:33:28 +0800 Subject: [PATCH 0695/2211] usb: storage: Ignore UAS driver for SanDisk 3.2 Gen2 storage device commit a541acceedf4f639f928f41fbb676b75946dc295 upstream. SanDisk 3.2 Gen2 storage device(0781:55e8) doesn't work well with UAS. Log says, [ 6.507865][ 3] [ T159] usb 2-1.4: new SuperSpeed Gen 1 USB device number 4 using xhci_hcd [ 6.540314][ 3] [ T159] usb 2-1.4: New USB device found, idVendor=0781, idProduct=55e8, bcdDevice= 0.01 [ 6.576304][ 3] [ T159] usb 2-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 6.584727][ 3] [ T159] usb 2-1.4: Product: SanDisk 3.2 Gen2 [ 6.590459][ 3] [ T159] usb 2-1.4: Manufacturer: SanDisk [ 6.595845][ 3] [ T159] usb 2-1.4: SerialNumber: 03021707022525140940 [ 7.230852][ 0] [ T265] usbcore: registered new interface driver usb-storage [ 7.251247][ 0] [ T265] scsi host3: uas [ 7.255280][ 0] [ T265] usbcore: registered new interface driver uas [ 7.270498][ 1] [ T192] scsi 3:0:0:0: Direct-Access SanDisk Extreme Pro DDE1 0110 PQ: 0 ANSI: 6 [ 7.299588][ 3] [ T192] scsi 3:0:0:1: Enclosure SanDisk SES Device 0110 PQ: 0 ANSI: 6 [ 7.321681][ 3] [ T192] sd 3:0:0:0: Attached scsi generic sg1 type 0 [ 7.328185][ 3] [ T192] scsi 3:0:0:1: Attached scsi generic sg2 type 13 [ 7.328804][ 0] [ T191] sd 3:0:0:0: [sda] 976773168 512-byte logical blocks: (500 GB/466 GiB) [ 7.343486][ 0] [ T191] sd 3:0:0:0: [sda] 4096-byte physical blocks [ 7.364611][ 0] [ T191] sd 3:0:0:0: [sda] Write Protect is off [ 7.370524][ 0] [ T191] sd 3:0:0:0: [sda] Mode Sense: 3d 00 10 00 [ 7.390655][ 0] [ T191] sd 3:0:0:0: [sda] Write cache: enabled, read cache: enabled, supports DPO and FUA [ 7.401363][ 0] [ T191] sd 3:0:0:0: [sda] Optimal transfer size 1048576 bytes [ 7.436010][ 0] [ T191] sda: sda1 [ 7.450850][ 0] [ T191] sd 3:0:0:0: [sda] Attached SCSI disk [ 7.470218][ 4] [ T262] scsi 3:0:0:1: Failed to get diagnostic page 0x1 [ 7.474869][ 0] [ C0] sd 3:0:0:0: [sda] tag#0 data cmplt err -75 uas-tag 2 inflight: CMD [ 7.476911][ 4] [ T262] scsi 3:0:0:1: Failed to bind enclosure -19 [ 7.485330][ 0] [ C0] sd 3:0:0:0: [sda] tag#0 CDB: Read(10) 28 00 00 00 00 28 00 00 10 00 [ 7.491593][ 4] [ T262] ses 3:0:0:1: Attached Enclosure device [ 38.066980][ 4] [ T192] sd 3:0:0:0: [sda] tag#4 uas_eh_abort_handler 0 uas-tag 5 inflight: CMD IN [ 38.076012][ 4] [ T192] sd 3:0:0:0: [sda] tag#4 CDB: Read(10) 28 00 00 00 01 08 00 00 f8 00 [ 38.086485][ 4] [ T192] sd 3:0:0:0: [sda] tag#3 uas_eh_abort_handler 0 uas-tag 1 inflight: CMD IN [ 38.095515][ 4] [ T192] sd 3:0:0:0: [sda] tag#3 CDB: Read(10) 28 00 00 00 00 10 00 00 08 00 [ 38.104122][ 4] [ T192] sd 3:0:0:0: [sda] tag#2 uas_eh_abort_handler 0 uas-tag 4 inflight: CMD IN [ 38.113152][ 4] [ T192] sd 3:0:0:0: [sda] tag#2 CDB: Read(10) 28 00 00 00 00 88 00 00 78 00 [ 38.121761][ 4] [ T192] sd 3:0:0:0: [sda] tag#1 uas_eh_abort_handler 0 uas-tag 3 inflight: CMD IN [ 38.130791][ 4] [ T192] sd 3:0:0:0: [sda] tag#1 CDB: Read(10) 28 00 00 00 00 48 00 00 30 00 [ 38.139401][ 4] [ T192] sd 3:0:0:0: [sda] tag#0 uas_eh_abort_handler 0 uas-tag 2 inflight: CMD [ 38.148170][ 4] [ T192] sd 3:0:0:0: [sda] tag#0 CDB: Read(10) 28 00 00 00 00 28 00 00 10 00 [ 38.178980][ 2] [ T304] scsi host3: uas_eh_device_reset_handler start [ 38.901540][ 2] [ T304] usb 2-1.4: reset SuperSpeed Gen 1 USB device number 4 using xhci_hcd [ 38.936791][ 2] [ T304] scsi host3: uas_eh_device_reset_handler success Device decriptor is below, Bus 002 Device 006: ID 0781:55e8 SanDisk Corp. SanDisk 3.2 Gen2 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 3.20 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 9 idVendor 0x0781 SanDisk Corp. idProduct 0x55e8 bcdDevice 0.01 iManufacturer 1 SanDisk iProduct 2 SanDisk 3.2 Gen2 iSerial 3 03021707022525140940 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x0079 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 896mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 8 Mass Storage bInterfaceSubClass 6 SCSI bInterfaceProtocol 80 Bulk-Only iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 15 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 15 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 1 bNumEndpoints 4 bInterfaceClass 8 Mass Storage bInterfaceSubClass 6 SCSI bInterfaceProtocol 98 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 0 Command pipe (0x01) Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x84 EP 4 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 15 MaxStreams 32 Status pipe (0x02) Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 15 MaxStreams 32 Data-in pipe (0x03) Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x03 EP 3 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 15 MaxStreams 32 Data-out pipe (0x04) Binary Object Store Descriptor: bLength 5 bDescriptorType 15 wTotalLength 0x002a bNumDeviceCaps 3 USB 2.0 Extension Device Capability: bLength 7 bDescriptorType 16 bDevCapabilityType 2 bmAttributes 0x0000f41e BESL Link Power Management (LPM) Supported BESL value 1024 us Deep BESL value 61440 us SuperSpeed USB Device Capability: bLength 10 bDescriptorType 16 bDevCapabilityType 3 bmAttributes 0x00 wSpeedsSupported 0x000e Device can operate at Full Speed (12Mbps) Device can operate at High Speed (480Mbps) Device can operate at SuperSpeed (5Gbps) bFunctionalitySupport 1 Lowest fully-functional device speed is Full Speed (12Mbps) bU1DevExitLat 10 micro seconds bU2DevExitLat 2047 micro seconds SuperSpeedPlus USB Device Capability: bLength 20 bDescriptorType 16 bDevCapabilityType 10 bmAttributes 0x00000001 Sublink Speed Attribute count 1 Sublink Speed ID count 0 wFunctionalitySupport 0x1100 bmSublinkSpeedAttr[0] 0x000a4030 Speed Attribute ID: 0 10Gb/s Symmetric RX SuperSpeedPlus bmSublinkSpeedAttr[1] 0x000a40b0 Speed Attribute ID: 0 10Gb/s Symmetric TX SuperSpeedPlus Device Status: 0x0000 (Bus Powered) So ignore UAS driver for this device. Signed-off-by: Hongyu Xie Cc: stable Link: https://lore.kernel.org/r/20250519023328.1498856-1-xiehongyu1@kylinos.cn Signed-off-by: Greg Kroah-Hartman --- drivers/usb/storage/unusual_uas.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h index d460d71b42578..1477e31d77632 100644 --- a/drivers/usb/storage/unusual_uas.h +++ b/drivers/usb/storage/unusual_uas.h @@ -52,6 +52,13 @@ UNUSUAL_DEV(0x059f, 0x1061, 0x0000, 0x9999, USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NO_REPORT_OPCODES | US_FL_NO_SAME), +/* Reported-by: Zhihong Zhou */ +UNUSUAL_DEV(0x0781, 0x55e8, 0x0000, 0x9999, + "SanDisk", + "", + USB_SC_DEVICE, USB_PR_DEVICE, NULL, + US_FL_IGNORE_UAS), + /* Reported-by: Hongling Zeng */ UNUSUAL_DEV(0x090c, 0x2000, 0x0000, 0x9999, "Hiksemi", -- GitLab From 1a51004aa0463b63aa9c273ef3f4614f7ff45722 Mon Sep 17 00:00:00 2001 From: Charles Yeh Date: Wed, 21 May 2025 21:23:54 +0800 Subject: [PATCH 0696/2211] USB: serial: pl2303: add new chip PL2303GC-Q20 and PL2303GT-2AB commit d3a889482bd5abf2bbdc1ec3d2d49575aa160c9c upstream. Add new bcd (0x905) to support PL2303GT-2AB (TYPE_HXN). Add new bcd (0x1005) to support PL2303GC-Q20 (TYPE_HXN). Signed-off-by: Charles Yeh Cc: stable@vger.kernel.org Signed-off-by: Johan Hovold Signed-off-by: Greg Kroah-Hartman --- drivers/usb/serial/pl2303.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index ad41363e3cea5..9708c3d40f078 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c @@ -457,6 +457,8 @@ static int pl2303_detect_type(struct usb_serial *serial) case 0x605: case 0x700: /* GR */ case 0x705: + case 0x905: /* GT-2AB */ + case 0x1005: /* GC-Q20 */ return TYPE_HXN; } break; -- GitLab From 4490c7951898dc64505533e7979837429bc9e290 Mon Sep 17 00:00:00 2001 From: Qasim Ijaz Date: Tue, 22 Apr 2025 14:47:17 +0100 Subject: [PATCH 0697/2211] usb: typec: ucsi: fix Clang -Wsign-conversion warning commit f4239ace2dd8606f6824757f192965a95746da05 upstream. debugfs.c emits the following warnings when compiling with the -Wsign-conversion flag with clang 15: drivers/usb/typec/ucsi/debugfs.c:58:27: warning: implicit conversion changes signedness: 'int' to 'u32' (aka 'unsigned int') [-Wsign-conversion] ucsi->debugfs->status = ret; ~ ^~~ drivers/usb/typec/ucsi/debugfs.c:71:25: warning: implicit conversion changes signedness: 'u32' (aka 'unsigned int') to 'int' [-Wsign-conversion] return ucsi->debugfs->status; ~~~~~~ ~~~~~~~~~~~~~~~^~~~~~ During ucsi_cmd() we see: if (ret < 0) { ucsi->debugfs->status = ret; return ret; } But "status" is u32 meaning unsigned wrap-around occurs when assigning a value which is < 0 to it, this obscures the real status. To fix this make the "status" of type int since ret is also of type int. Fixes: df0383ffad64 ("usb: typec: ucsi: Add debugfs for ucsi commands") Cc: stable@vger.kernel.org Signed-off-by: Qasim Ijaz Reviewed-by: Heikki Krogerus Link: https://lore.kernel.org/r/20250422134717.66218-1-qasdev00@gmail.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/typec/ucsi/ucsi.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h index 5863a20b6c5dd..0568e643e8447 100644 --- a/drivers/usb/typec/ucsi/ucsi.h +++ b/drivers/usb/typec/ucsi/ucsi.h @@ -367,7 +367,7 @@ struct ucsi_debugfs_entry { u64 low; u64 high; } response; - u32 status; + int status; struct dentry *dentry; }; -- GitLab From e428b7e205ed775a1b9c1adb16e2c15d1cff158a Mon Sep 17 00:00:00 2001 From: Bartosz Golaszewski Date: Tue, 27 May 2025 09:47:37 +0200 Subject: [PATCH 0698/2211] Bluetooth: hci_qca: move the SoC type check to the right place commit 0fb410c914eb03c7e9d821e26d03bac0a239e5db upstream. Commit 3d05fc82237a ("Bluetooth: qca: set power_ctrl_enabled on NULL returned by gpiod_get_optional()") accidentally changed the prevous behavior where power control would be disabled without the BT_EN GPIO only on QCA_WCN6750 and QCA_WCN6855 while also getting the error check wrong. We should treat every IS_ERR() return value from devm_gpiod_get_optional() as a reason to bail-out while we should only set power_ctrl_enabled to false on the two models mentioned above. While at it: use dev_err_probe() to save a LOC. Cc: stable@vger.kernel.org Fixes: 3d05fc82237a ("Bluetooth: qca: set power_ctrl_enabled on NULL returned by gpiod_get_optional()") Signed-off-by: Bartosz Golaszewski Reviewed-by: Krzysztof Kozlowski Tested-by: Hsin-chen Chuang Reviewed-by: Hsin-chen Chuang Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Greg Kroah-Hartman --- drivers/bluetooth/hci_qca.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c index 1837622ea625a..025b9a07c0875 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -2385,14 +2385,14 @@ static int qca_serdev_probe(struct serdev_device *serdev) qcadev->bt_en = devm_gpiod_get_optional(&serdev->dev, "enable", GPIOD_OUT_LOW); - if (IS_ERR(qcadev->bt_en) && - (data->soc_type == QCA_WCN6750 || - data->soc_type == QCA_WCN6855)) { - dev_err(&serdev->dev, "failed to acquire BT_EN gpio\n"); - return PTR_ERR(qcadev->bt_en); - } + if (IS_ERR(qcadev->bt_en)) + return dev_err_probe(&serdev->dev, + PTR_ERR(qcadev->bt_en), + "failed to acquire BT_EN gpio\n"); - if (!qcadev->bt_en) + if (!qcadev->bt_en && + (data->soc_type == QCA_WCN6750 || + data->soc_type == QCA_WCN6855)) power_ctrl_enabled = false; qcadev->sw_ctrl = devm_gpiod_get_optional(&serdev->dev, "swctrl", -- GitLab From 985961dd2688a527a4847300d41beaad475ab7af Mon Sep 17 00:00:00 2001 From: Dustin Lundquist Date: Tue, 6 May 2025 11:18:45 -0700 Subject: [PATCH 0699/2211] serial: jsm: fix NPE during jsm_uart_port_init commit e3975aa899c0a3bbc10d035e699b142cd1373a71 upstream. No device was set which caused serial_base_ctrl_add to crash. BUG: kernel NULL pointer dereference, address: 0000000000000050 Oops: Oops: 0000 [#1] PREEMPT SMP NOPTI CPU: 16 UID: 0 PID: 368 Comm: (udev-worker) Not tainted 6.12.25-amd64 #1 Debian 6.12.25-1 RIP: 0010:serial_base_ctrl_add+0x96/0x120 Call Trace: serial_core_register_port+0x1a0/0x580 ? __setup_irq+0x39c/0x660 ? __kmalloc_cache_noprof+0x111/0x310 jsm_uart_port_init+0xe8/0x180 [jsm] jsm_probe_one+0x1f4/0x410 [jsm] local_pci_probe+0x42/0x90 pci_device_probe+0x22f/0x270 really_probe+0xdb/0x340 ? pm_runtime_barrier+0x54/0x90 ? __pfx___driver_attach+0x10/0x10 __driver_probe_device+0x78/0x110 driver_probe_device+0x1f/0xa0 __driver_attach+0xba/0x1c0 bus_for_each_dev+0x8c/0xe0 bus_add_driver+0x112/0x1f0 driver_register+0x72/0xd0 jsm_init_module+0x36/0xff0 [jsm] ? __pfx_jsm_init_module+0x10/0x10 [jsm] do_one_initcall+0x58/0x310 do_init_module+0x60/0x230 Tested with Digi Neo PCIe 8 port card. Fixes: 84a9582fd203 ("serial: core: Start managing serial controllers to enable runtime PM") Cc: stable Signed-off-by: Dustin Lundquist Link: https://lore.kernel.org/r/3f31d4f75863614655c4673027a208be78d022ec.camel@null-ptr.net Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/jsm/jsm_tty.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/tty/serial/jsm/jsm_tty.c b/drivers/tty/serial/jsm/jsm_tty.c index ce0fef7e2c665..be2f130696b3a 100644 --- a/drivers/tty/serial/jsm/jsm_tty.c +++ b/drivers/tty/serial/jsm/jsm_tty.c @@ -451,6 +451,7 @@ int jsm_uart_port_init(struct jsm_board *brd) if (!brd->channels[i]) continue; + brd->channels[i]->uart_port.dev = &brd->pci_dev->dev; brd->channels[i]->uart_port.irq = brd->irq; brd->channels[i]->uart_port.uartclk = 14745600; brd->channels[i]->uart_port.type = PORT_JSM; -- GitLab From b4fac3f172f27c8255d4d6840cec12e24e24033a Mon Sep 17 00:00:00 2001 From: Dave Penkler Date: Wed, 21 May 2025 14:16:56 +0200 Subject: [PATCH 0700/2211] usb: usbtmc: Fix timeout value in get_stb commit 342e4955a1f1ce28c70a589999b76365082dbf10 upstream. wait_event_interruptible_timeout requires a timeout argument in units of jiffies. It was being called in usbtmc_get_stb with the usb timeout value which is in units of milliseconds. Pass the timeout argument converted to jiffies. Fixes: 048c6d88a021 ("usb: usbtmc: Add ioctls to set/get usb timeout") Cc: stable@vger.kernel.org Signed-off-by: Dave Penkler Link: https://lore.kernel.org/r/20250521121656.18174-4-dpenkler@gmail.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/class/usbtmc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index 740d2d2b19fbe..66f3d9324ba2f 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c @@ -483,6 +483,7 @@ static int usbtmc_get_stb(struct usbtmc_file_data *file_data, __u8 *stb) u8 tag; int rv; long wait_rv; + unsigned long expire; dev_dbg(dev, "Enter ioctl_read_stb iin_ep_present: %d\n", data->iin_ep_present); @@ -512,10 +513,11 @@ static int usbtmc_get_stb(struct usbtmc_file_data *file_data, __u8 *stb) } if (data->iin_ep_present) { + expire = msecs_to_jiffies(file_data->timeout); wait_rv = wait_event_interruptible_timeout( data->waitq, atomic_read(&data->iin_data_valid) != 0, - file_data->timeout); + expire); if (wait_rv < 0) { dev_dbg(dev, "wait interrupted %ld\n", wait_rv); rv = wait_rv; -- GitLab From eb2d5e794fb966b3ef8bde99eb8561446a53509f Mon Sep 17 00:00:00 2001 From: Sergey Senozhatsky Date: Fri, 28 Mar 2025 00:03:50 +0900 Subject: [PATCH 0701/2211] thunderbolt: Do not double dequeue a configuration request commit 0f73628e9da1ee39daf5f188190cdbaee5e0c98c upstream. Some of our devices crash in tb_cfg_request_dequeue(): general protection fault, probably for non-canonical address 0xdead000000000122 CPU: 6 PID: 91007 Comm: kworker/6:2 Tainted: G U W 6.6.65 RIP: 0010:tb_cfg_request_dequeue+0x2d/0xa0 Call Trace: ? tb_cfg_request_dequeue+0x2d/0xa0 tb_cfg_request_work+0x33/0x80 worker_thread+0x386/0x8f0 kthread+0xed/0x110 ret_from_fork+0x38/0x50 ret_from_fork_asm+0x1b/0x30 The circumstances are unclear, however, the theory is that tb_cfg_request_work() can be scheduled twice for a request: first time via frame.callback from ring_work() and second time from tb_cfg_request(). Both times kworkers will execute tb_cfg_request_dequeue(), which results in double list_del() from the ctl->request_queue (the list poison deference hints at it: 0xdead000000000122). Do not dequeue requests that don't have TB_CFG_REQUEST_ACTIVE bit set. Signed-off-by: Sergey Senozhatsky Cc: stable@vger.kernel.org Signed-off-by: Mika Westerberg Signed-off-by: Greg Kroah-Hartman --- drivers/thunderbolt/ctl.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/thunderbolt/ctl.c b/drivers/thunderbolt/ctl.c index 4bdb2d45e0bff..58ab3d86bc25e 100644 --- a/drivers/thunderbolt/ctl.c +++ b/drivers/thunderbolt/ctl.c @@ -148,6 +148,11 @@ static void tb_cfg_request_dequeue(struct tb_cfg_request *req) struct tb_ctl *ctl = req->ctl; mutex_lock(&ctl->request_queue_lock); + if (!test_bit(TB_CFG_REQUEST_ACTIVE, &req->flags)) { + mutex_unlock(&ctl->request_queue_lock); + return; + } + list_del(&req->list); clear_bit(TB_CFG_REQUEST_ACTIVE, &req->flags); if (test_bit(TB_CFG_REQUEST_CANCELED, &req->flags)) -- GitLab From 1ed84b17fa9bf070fb2d2da1013aa3b06fa26ce2 Mon Sep 17 00:00:00 2001 From: Lukasz Czechowski Date: Fri, 25 Apr 2025 17:18:07 +0200 Subject: [PATCH 0702/2211] dt-bindings: usb: cypress,hx3: Add support for all variants commit 1ad4b5a7de16806afc1aeaf012337e62af04e001 upstream. The Cypress HX3 hubs use different default PID value depending on the variant. Update compatibles list. Becasuse all hub variants use the same driver data, allow the dt node to have two compatibles: leftmost which matches the HW exactly, and the second one as fallback. Fixes: 1eca51f58a10 ("dt-bindings: usb: Add binding for Cypress HX3 USB 3.0 family") Cc: stable@vger.kernel.org # 6.6 Cc: stable@vger.kernel.org # Backport of the patch ("dt-bindings: usb: usb-device: relax compatible pattern to a contains") from list: https://lore.kernel.org/linux-usb/20250418-dt-binding-usb-device-compatibles-v2-1-b3029f14e800@cherry.de/ Cc: stable@vger.kernel.org # Backport of the patch in this series fixing product ID in onboard_dev_id_table in drivers/usb/misc/onboard_usb_dev.c driver Signed-off-by: Lukasz Czechowski Reviewed-by: "Rob Herring (Arm)" Link: https://lore.kernel.org/r/20250425-onboard_usb_dev-v2-2-4a76a474a010@thaumatec.com [taken with Greg's blessing] Signed-off-by: Heiko Stuebner Signed-off-by: Greg Kroah-Hartman --- .../devicetree/bindings/usb/cypress,hx3.yaml | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/usb/cypress,hx3.yaml b/Documentation/devicetree/bindings/usb/cypress,hx3.yaml index e44e88d993d0b..e802e9ac975b8 100644 --- a/Documentation/devicetree/bindings/usb/cypress,hx3.yaml +++ b/Documentation/devicetree/bindings/usb/cypress,hx3.yaml @@ -14,9 +14,22 @@ allOf: properties: compatible: - enum: - - usb4b4,6504 - - usb4b4,6506 + oneOf: + - enum: + - usb4b4,6504 + - usb4b4,6506 + - items: + - enum: + - usb4b4,6500 + - usb4b4,6508 + - const: usb4b4,6504 + - items: + - enum: + - usb4b4,6502 + - usb4b4,6503 + - usb4b4,6507 + - usb4b4,650a + - const: usb4b4,6506 reg: true -- GitLab From d452b168da17cbf193dc5599c949fb5075f28ff6 Mon Sep 17 00:00:00 2001 From: Xu Yang Date: Wed, 30 Apr 2025 17:44:59 +0800 Subject: [PATCH 0703/2211] dt-bindings: phy: imx8mq-usb: fix fsl,phy-tx-vboost-level-microvolt property commit 5b3a91b207c00a8d27f75ce8aaa9860844da72c8 upstream. The ticket TKT0676370 shows the description of TX_VBOOST_LVL is wrong in register PHY_CTRL3 bit[31:29]. 011: Corresponds to a launch amplitude of 1.12 V. 010: Corresponds to a launch amplitude of 1.04 V. 000: Corresponds to a launch amplitude of 0.88 V. After updated: 011: Corresponds to a launch amplitude of 0.844 V. 100: Corresponds to a launch amplitude of 1.008 V. 101: Corresponds to a launch amplitude of 1.156 V. This will correct it accordingly. Fixes: b2e75563dc39 ("dt-bindings: phy: imx8mq-usb: add phy tuning properties") Cc: stable@vger.kernel.org Reviewed-by: Jun Li Signed-off-by: Xu Yang Reviewed-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20250430094502.2723983-1-xu.yang_2@nxp.com Signed-off-by: Vinod Koul Signed-off-by: Greg Kroah-Hartman --- Documentation/devicetree/bindings/phy/fsl,imx8mq-usb-phy.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/phy/fsl,imx8mq-usb-phy.yaml b/Documentation/devicetree/bindings/phy/fsl,imx8mq-usb-phy.yaml index dc3a3f709feaa..bac4d0b51d8a1 100644 --- a/Documentation/devicetree/bindings/phy/fsl,imx8mq-usb-phy.yaml +++ b/Documentation/devicetree/bindings/phy/fsl,imx8mq-usb-phy.yaml @@ -58,8 +58,7 @@ properties: fsl,phy-tx-vboost-level-microvolt: description: Adjust the boosted transmit launch pk-pk differential amplitude - minimum: 880 - maximum: 1120 + enum: [844, 1008, 1156] fsl,phy-comp-dis-tune-percent: description: -- GitLab From 80fe1ebc1fbcd51adc7e7293c136421da4717fa4 Mon Sep 17 00:00:00 2001 From: Aurabindo Pillai Date: Wed, 21 May 2025 16:05:39 -0400 Subject: [PATCH 0704/2211] Revert "drm/amd/display: more liberal vmin/vmax update for freesync" commit 1b824eef269db44d068bbc0de74c94a8e8f9ce02 upstream. This reverts commit cfb2d41831ee5647a4ae0ea7c24971a92d5dfa0d since it causes regressions on certain configs. Revert until the issue can be isolated and debugged. Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4238 Signed-off-by: Aurabindo Pillai Acked-by: Alex Deucher Signed-off-by: Alex Deucher Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 5f9452b22596a..084d9ed325af6 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -668,21 +668,15 @@ static void dm_crtc_high_irq(void *interrupt_params) spin_lock_irqsave(&adev_to_drm(adev)->event_lock, flags); if (acrtc->dm_irq_params.stream && - acrtc->dm_irq_params.vrr_params.supported) { - bool replay_en = acrtc->dm_irq_params.stream->link->replay_settings.replay_feature_enabled; - bool psr_en = acrtc->dm_irq_params.stream->link->psr_settings.psr_feature_enabled; - bool fs_active_var_en = acrtc->dm_irq_params.freesync_config.state == VRR_STATE_ACTIVE_VARIABLE; - + acrtc->dm_irq_params.vrr_params.supported && + acrtc->dm_irq_params.freesync_config.state == + VRR_STATE_ACTIVE_VARIABLE) { mod_freesync_handle_v_update(adev->dm.freesync_module, acrtc->dm_irq_params.stream, &acrtc->dm_irq_params.vrr_params); - /* update vmin_vmax only if freesync is enabled, or only if PSR and REPLAY are disabled */ - if (fs_active_var_en || (!fs_active_var_en && !replay_en && !psr_en)) { - dc_stream_adjust_vmin_vmax(adev->dm.dc, - acrtc->dm_irq_params.stream, - &acrtc->dm_irq_params.vrr_params.adjust); - } + dc_stream_adjust_vmin_vmax(adev->dm.dc, acrtc->dm_irq_params.stream, + &acrtc->dm_irq_params.vrr_params.adjust); } /* -- GitLab From e03ced99c437f4a7992b8fa3d97d598f55453fd0 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 10 Jun 2025 07:13:00 -0400 Subject: [PATCH 0705/2211] Linux 6.12.33 Link: https://lore.kernel.org/r/20250607100717.910797456@linuxfoundation.org Tested-by: Salvatore Bonaccorso Tested-by: Markus Reichelt Tested-by: Ron Economos Tested-by: Linux Kernel Functional Testing Tested-by: Peter Schneider Tested-by: Pavel Machek (CIP) Tested-by: Mark Brown Tested-by: Jon Hunter Signed-off-by: Greg Kroah-Hartman --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 1e6a6c66403f1..c53dd3520193a 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 12 -SUBLEVEL = 32 +SUBLEVEL = 33 EXTRAVERSION = NAME = Baby Opossum Posse -- GitLab From 578a5a23310da5dcc62e871282fcfbf5207d83ce Mon Sep 17 00:00:00 2001 From: Juan Yescas Date: Wed, 21 May 2025 14:57:45 -0700 Subject: [PATCH 0706/2211] FROMGIT: mm: add CONFIG_PAGE_BLOCK_ORDER to select page block order Problem: On large page size configurations (16KiB, 64KiB), the CMA alignment requirement (CMA_MIN_ALIGNMENT_BYTES) increases considerably, and this causes the CMA reservations to be larger than necessary. This means that system will have less available MIGRATE_UNMOVABLE and MIGRATE_RECLAIMABLE page blocks since MIGRATE_CMA can't fallback to them. The CMA_MIN_ALIGNMENT_BYTES increases because it depends on MAX_PAGE_ORDER which depends on ARCH_FORCE_MAX_ORDER. The value of ARCH_FORCE_MAX_ORDER increases on 16k and 64k kernels. For example, in ARM, the CMA alignment requirement when: - CONFIG_ARCH_FORCE_MAX_ORDER default value is used - CONFIG_TRANSPARENT_HUGEPAGE is set: PAGE_SIZE | MAX_PAGE_ORDER | pageblock_order | CMA_MIN_ALIGNMENT_BYTES ----------------------------------------------------------------------- 4KiB | 10 | 9 | 4KiB * (2 ^ 9) = 2MiB 16Kib | 11 | 11 | 16KiB * (2 ^ 11) = 32MiB 64KiB | 13 | 13 | 64KiB * (2 ^ 13) = 512MiB There are some extreme cases for the CMA alignment requirement when: - CONFIG_ARCH_FORCE_MAX_ORDER maximum value is set - CONFIG_TRANSPARENT_HUGEPAGE is NOT set: - CONFIG_HUGETLB_PAGE is NOT set PAGE_SIZE | MAX_PAGE_ORDER | pageblock_order | CMA_MIN_ALIGNMENT_BYTES ------------------------------------------------------------------------ 4KiB | 15 | 15 | 4KiB * (2 ^ 15) = 128MiB 16Kib | 13 | 13 | 16KiB * (2 ^ 13) = 128MiB 64KiB | 13 | 13 | 64KiB * (2 ^ 13) = 512MiB This affects the CMA reservations for the drivers. If a driver in a 4KiB kernel needs 4MiB of CMA memory, in a 16KiB kernel, the minimal reservation has to be 32MiB due to the alignment requirements: reserved-memory { ... cma_test_reserve: cma_test_reserve { compatible = "shared-dma-pool"; size = <0x0 0x400000>; /* 4 MiB */ ... }; }; reserved-memory { ... cma_test_reserve: cma_test_reserve { compatible = "shared-dma-pool"; size = <0x0 0x2000000>; /* 32 MiB */ ... }; }; Solution: Add a new config CONFIG_PAGE_BLOCK_ORDER that allows to set the page block order in all the architectures. The maximum page block order will be given by ARCH_FORCE_MAX_ORDER. By default, CONFIG_PAGE_BLOCK_ORDER will have the same value that ARCH_FORCE_MAX_ORDER. This will make sure that current kernel configurations won't be affected by this change. It is a opt-in change. This patch will allow to have the same CMA alignment requirements for large page sizes (16KiB, 64KiB) as that in 4kb kernels by setting a lower pageblock_order. Tests: - Verified that HugeTLB pages work when pageblock_order is 1, 7, 10 on 4k and 16k kernels. - Verified that Transparent Huge Pages work when pageblock_order is 1, 7, 10 on 4k and 16k kernels. - Verified that dma-buf heaps allocations work when pageblock_order is 1, 7, 10 on 4k and 16k kernels. Benchmarks: The benchmarks compare 16kb kernels with pageblock_order 10 and 7. The reason for the pageblock_order 7 is because this value makes the min CMA alignment requirement the same as that in 4kb kernels (2MB). - Perform 100K dma-buf heaps (/dev/dma_heap/system) allocations of SZ_8M, SZ_4M, SZ_2M, SZ_1M, SZ_64, SZ_8, SZ_4. Use simpleperf (https://developer.android.com/ndk/guides/simpleperf) to measure the # of instructions and page-faults on 16k kernels. The benchmark was executed 10 times. The averages are below: # instructions | #page-faults order 10 | order 7 | order 10 | order 7 -------------------------------------------------------- 13,891,765,770 | 11,425,777,314 | 220 | 217 14,456,293,487 | 12,660,819,302 | 224 | 219 13,924,261,018 | 13,243,970,736 | 217 | 221 13,910,886,504 | 13,845,519,630 | 217 | 221 14,388,071,190 | 13,498,583,098 | 223 | 224 13,656,442,167 | 12,915,831,681 | 216 | 218 13,300,268,343 | 12,930,484,776 | 222 | 218 13,625,470,223 | 14,234,092,777 | 219 | 218 13,508,964,965 | 13,432,689,094 | 225 | 219 13,368,950,667 | 13,683,587,37 | 219 | 225 ------------------------------------------------------------------- 13,803,137,433 | 13,131,974,268 | 220 | 220 Averages There were 4.85% #instructions when order was 7, in comparison with order 10. 13,803,137,433 - 13,131,974,268 = -671,163,166 (-4.86%) The number of page faults in order 7 and 10 were the same. These results didn't show any significant regression when the pageblock_order is set to 7 on 16kb kernels. - Run speedometer 3.1 (https://browserbench.org/Speedometer3.1/) 5 times on the 16k kernels with pageblock_order 7 and 10. order 10 | order 7 | order 7 - order 10 | (order 7 - order 10) % ------------------------------------------------------------------- 15.8 | 16.4 | 0.6 | 3.80% 16.4 | 16.2 | -0.2 | -1.22% 16.6 | 16.3 | -0.3 | -1.81% 16.8 | 16.3 | -0.5 | -2.98% 16.6 | 16.8 | 0.2 | 1.20% ------------------------------------------------------------------- 16.44 16.4 -0.04 -0.24% Averages The results didn't show any significant regression when the pageblock_order is set to 7 on 16kb kernels. Bug: 375647879 Bug: 355449177 Bug: 423864202 Test: tools/bazel run --lto=none //common:kernel_aarch64_microdroid_16k_dist (cherry picked from commit e13e7922d03439e374c263049af5f740ceae6346 https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git/ mm-stable) Link: https://lkml.kernel.org/r/20250521215807.1860663-1-jyescas@google.com Change-Id: Id7132b6848e5deb97a7531cf546060de2accffac Signed-off-by: Juan Yescas Acked-by: Zi Yan Reviewed-by: Vlastimil Babka Cc: Liam R. Howlett Cc: Lorenzo Stoakes Cc: David Hildenbrand Cc: Mike Rapoport Cc: Suren Baghdasaryan Cc: Minchan Kim Signed-off-by: Andrew Morton --- include/linux/mmzone.h | 16 ++++++++++++++++ include/linux/pageblock-flags.h | 8 ++++---- mm/Kconfig | 34 +++++++++++++++++++++++++++++++++ mm/mm_init.c | 2 +- 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index fa8a24f5d1cbc..37cd759cf2259 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -39,6 +39,22 @@ #define NR_PAGE_ORDERS (MAX_PAGE_ORDER + 1) +/* Defines the order for the number of pages that have a migrate type. */ +#ifndef CONFIG_PAGE_BLOCK_ORDER +#define PAGE_BLOCK_ORDER MAX_PAGE_ORDER +#else +#define PAGE_BLOCK_ORDER CONFIG_PAGE_BLOCK_ORDER +#endif /* CONFIG_PAGE_BLOCK_ORDER */ + +/* + * The MAX_PAGE_ORDER, which defines the max order of pages to be allocated + * by the buddy allocator, has to be larger or equal to the PAGE_BLOCK_ORDER, + * which defines the order for the number of pages that can have a migrate type + */ +#if (PAGE_BLOCK_ORDER > MAX_PAGE_ORDER) +#error MAX_PAGE_ORDER must be >= PAGE_BLOCK_ORDER +#endif + /* * PAGE_ALLOC_COSTLY_ORDER is the order at which allocations are deemed * costly to service. That is between allocation orders which should diff --git a/include/linux/pageblock-flags.h b/include/linux/pageblock-flags.h index fc6b9c87cb0a8..e73a4292ef02e 100644 --- a/include/linux/pageblock-flags.h +++ b/include/linux/pageblock-flags.h @@ -41,18 +41,18 @@ extern unsigned int pageblock_order; * Huge pages are a constant size, but don't exceed the maximum allocation * granularity. */ -#define pageblock_order MIN_T(unsigned int, HUGETLB_PAGE_ORDER, MAX_PAGE_ORDER) +#define pageblock_order MIN_T(unsigned int, HUGETLB_PAGE_ORDER, PAGE_BLOCK_ORDER) #endif /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */ #elif defined(CONFIG_TRANSPARENT_HUGEPAGE) -#define pageblock_order MIN_T(unsigned int, HPAGE_PMD_ORDER, MAX_PAGE_ORDER) +#define pageblock_order MIN_T(unsigned int, HPAGE_PMD_ORDER, PAGE_BLOCK_ORDER) #else /* CONFIG_TRANSPARENT_HUGEPAGE */ -/* If huge pages are not used, group by MAX_ORDER_NR_PAGES */ -#define pageblock_order MAX_PAGE_ORDER +/* If huge pages are not used, group by PAGE_BLOCK_ORDER */ +#define pageblock_order PAGE_BLOCK_ORDER #endif /* CONFIG_HUGETLB_PAGE */ diff --git a/mm/Kconfig b/mm/Kconfig index 5c587081636eb..11ce0b5434449 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -1005,6 +1005,40 @@ config GCMA_SYSFS This option exposes some sysfs attributes to get information from GCMA. +# +# Select this config option from the architecture Kconfig, if available, to set +# the max page order for physically contiguous allocations. +# +config ARCH_FORCE_MAX_ORDER + int + +# +# When ARCH_FORCE_MAX_ORDER is not defined, +# the default page block order is MAX_PAGE_ORDER (10) as per +# include/linux/mmzone.h. +# +config PAGE_BLOCK_ORDER + int "Page Block Order" + range 1 10 if ARCH_FORCE_MAX_ORDER = 0 + default 10 if ARCH_FORCE_MAX_ORDER = 0 + range 1 ARCH_FORCE_MAX_ORDER if ARCH_FORCE_MAX_ORDER != 0 + default ARCH_FORCE_MAX_ORDER if ARCH_FORCE_MAX_ORDER != 0 + help + The page block order refers to the power of two number of pages that + are physically contiguous and can have a migrate type associated to + them. The maximum size of the page block order is limited by + ARCH_FORCE_MAX_ORDER. + + This config allows overriding the default page block order when the + page block order is required to be smaller than ARCH_FORCE_MAX_ORDER + or MAX_PAGE_ORDER. + + Reducing pageblock order can negatively impact THP generation + success rate. If your workloads uses THP heavily, please use this + option with caution. + + Don't change if unsure. + config MEM_SOFT_DIRTY bool "Track memory changes" depends on CHECKPOINT_RESTORE && HAVE_ARCH_SOFT_DIRTY && PROC_FS diff --git a/mm/mm_init.c b/mm/mm_init.c index 29f2a3e73b21a..18c89db412245 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -1470,7 +1470,7 @@ static inline void setup_usemap(struct zone *zone) {} /* Initialise the number of pages represented by NR_PAGEBLOCK_BITS */ void __init set_pageblock_order(void) { - unsigned int order = MAX_PAGE_ORDER; + unsigned int order = PAGE_BLOCK_ORDER; /* Check that pageblock_nr_pages has not already been setup */ if (pageblock_order) -- GitLab From 25027501e66a5ec7b0f344f3c1aa8e01d7ccba19 Mon Sep 17 00:00:00 2001 From: "Ahmed S. Darwish" Date: Mon, 24 Mar 2025 15:20:22 +0100 Subject: [PATCH 0707/2211] tools/x86/kcpuid: Fix error handling [ Upstream commit 116edfe173d0c59ec2aa87fb91f2f31d477b61b3 ] Error handling in kcpuid is unreliable. On malloc() failures, the code prints an error then just goes on. The error messages are also printed to standard output instead of standard error. Use err() and errx() from to direct all error messages to standard error and automatically exit the program. Use err() to include the errno information, and errx() otherwise. Use warnx() for warnings. While at it, alphabetically reorder the header includes. [ mingo: Fix capitalization in the help text while at it. ] Fixes: c6b2f240bf8d ("tools/x86: Add a kcpuid tool to show raw CPU features") Reported-by: Remington Brasga Signed-off-by: Ahmed S. Darwish Signed-off-by: Ingo Molnar Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Josh Poimboeuf Link: https://lore.kernel.org/r/20250324142042.29010-2-darwi@linutronix.de Closes: https://lkml.kernel.org/r/20240926223557.2048-1-rbrasga@uci.edu Signed-off-by: Sasha Levin --- tools/arch/x86/kcpuid/kcpuid.c | 47 +++++++++++++++++----------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/tools/arch/x86/kcpuid/kcpuid.c b/tools/arch/x86/kcpuid/kcpuid.c index 1b25c0a95d3f9..40a9e59c2fd56 100644 --- a/tools/arch/x86/kcpuid/kcpuid.c +++ b/tools/arch/x86/kcpuid/kcpuid.c @@ -1,11 +1,12 @@ // SPDX-License-Identifier: GPL-2.0 #define _GNU_SOURCE -#include +#include +#include #include +#include #include #include -#include #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #define min(a, b) (((a) < (b)) ? (a) : (b)) @@ -145,14 +146,14 @@ static bool cpuid_store(struct cpuid_range *range, u32 f, int subleaf, if (!func->leafs) { func->leafs = malloc(sizeof(struct subleaf)); if (!func->leafs) - perror("malloc func leaf"); + err(EXIT_FAILURE, NULL); func->nr = 1; } else { s = func->nr; func->leafs = realloc(func->leafs, (s + 1) * sizeof(*leaf)); if (!func->leafs) - perror("realloc f->leafs"); + err(EXIT_FAILURE, NULL); func->nr++; } @@ -211,7 +212,7 @@ struct cpuid_range *setup_cpuid_range(u32 input_eax) range = malloc(sizeof(struct cpuid_range)); if (!range) - perror("malloc range"); + err(EXIT_FAILURE, NULL); if (input_eax & 0x80000000) range->is_ext = true; @@ -220,7 +221,7 @@ struct cpuid_range *setup_cpuid_range(u32 input_eax) range->funcs = malloc(sizeof(struct cpuid_func) * idx_func); if (!range->funcs) - perror("malloc range->funcs"); + err(EXIT_FAILURE, NULL); range->nr = idx_func; memset(range->funcs, 0, sizeof(struct cpuid_func) * idx_func); @@ -395,8 +396,8 @@ static int parse_line(char *line) return 0; err_exit: - printf("Warning: wrong line format:\n"); - printf("\tline[%d]: %s\n", flines, line); + warnx("Wrong line format:\n" + "\tline[%d]: %s", flines, line); return -1; } @@ -418,10 +419,8 @@ static void parse_text(void) file = fopen("./cpuid.csv", "r"); } - if (!file) { - printf("Fail to open '%s'\n", filename); - return; - } + if (!file) + err(EXIT_FAILURE, "%s", filename); while (1) { ret = getline(&line, &len, file); @@ -530,7 +529,7 @@ static inline struct cpuid_func *index_to_func(u32 index) func_idx = index & 0xffff; if ((func_idx + 1) > (u32)range->nr) { - printf("ERR: invalid input index (0x%x)\n", index); + warnx("Invalid input index (0x%x)", index); return NULL; } return &range->funcs[func_idx]; @@ -562,7 +561,7 @@ static void show_info(void) return; } - printf("ERR: invalid input subleaf (0x%x)\n", user_sub); + warnx("Invalid input subleaf (0x%x)", user_sub); } show_func(func); @@ -593,15 +592,15 @@ static void setup_platform_cpuid(void) static void usage(void) { - printf("kcpuid [-abdfhr] [-l leaf] [-s subleaf]\n" - "\t-a|--all Show both bit flags and complex bit fields info\n" - "\t-b|--bitflags Show boolean flags only\n" - "\t-d|--detail Show details of the flag/fields (default)\n" - "\t-f|--flags Specify the cpuid csv file\n" - "\t-h|--help Show usage info\n" - "\t-l|--leaf=index Specify the leaf you want to check\n" - "\t-r|--raw Show raw cpuid data\n" - "\t-s|--subleaf=sub Specify the subleaf you want to check\n" + warnx("kcpuid [-abdfhr] [-l leaf] [-s subleaf]\n" + "\t-a|--all Show both bit flags and complex bit fields info\n" + "\t-b|--bitflags Show boolean flags only\n" + "\t-d|--detail Show details of the flag/fields (default)\n" + "\t-f|--flags Specify the CPUID CSV file\n" + "\t-h|--help Show usage info\n" + "\t-l|--leaf=index Specify the leaf you want to check\n" + "\t-r|--raw Show raw CPUID data\n" + "\t-s|--subleaf=sub Specify the subleaf you want to check" ); } @@ -652,7 +651,7 @@ static int parse_options(int argc, char *argv[]) user_sub = strtoul(optarg, NULL, 0); break; default: - printf("%s: Invalid option '%c'\n", argv[0], optopt); + warnx("Invalid option '%c'", optopt); return -1; } -- GitLab From 41f76e98913a86c557181454122fb469273e777f Mon Sep 17 00:00:00 2001 From: Andrew Cooper Date: Wed, 2 Apr 2025 18:24:58 +0100 Subject: [PATCH 0708/2211] x86/idle: Remove MFENCEs for X86_BUG_CLFLUSH_MONITOR in mwait_idle_with_hints() and prefer_mwait_c1_over_halt() [ Upstream commit 1f13c60d84e880df6698441026e64f84c7110c49 ] The following commit, 12 years ago: 7e98b7192046 ("x86, idle: Use static_cpu_has() for CLFLUSH workaround, add barriers") added barriers around the CLFLUSH in mwait_idle_with_hints(), justified with: ... and add memory barriers around it since the documentation is explicit that CLFLUSH is only ordered with respect to MFENCE. This also triggered, 11 years ago, the same adjustment in: f8e617f45829 ("sched/idle/x86: Optimize unnecessary mwait_idle() resched IPIs") during development, although it failed to get the static_cpu_has_bug() treatment. X86_BUG_CLFLUSH_MONITOR (a.k.a the AAI65 errata) is specific to Intel CPUs, and the SDM currently states: Executions of the CLFLUSH instruction are ordered with respect to each other and with respect to writes, locked read-modify-write instructions, and fence instructions[1]. With footnote 1 reading: Earlier versions of this manual specified that executions of the CLFLUSH instruction were ordered only by the MFENCE instruction. All processors implementing the CLFLUSH instruction also order it relative to the other operations enumerated above. i.e. The SDM was incorrect at the time, and barriers should not have been inserted. Double checking the original AAI65 errata (not available from intel.com any more) shows no mention of barriers either. Note: If this were a general codepath, the MFENCEs would be needed, because AMD CPUs of the same vintage do sport otherwise-unordered CLFLUSHs. Remove the unnecessary barriers. Furthermore, use a plain alternative(), rather than static_cpu_has_bug() and/or no optimisation. The workaround is a single instruction. Use an explicit %rax pointer rather than a general memory operand, because MONITOR takes the pointer implicitly in the same way. [ mingo: Cleaned up the commit a bit. ] Fixes: 7e98b7192046 ("x86, idle: Use static_cpu_has() for CLFLUSH workaround, add barriers") Signed-off-by: Andrew Cooper Signed-off-by: Ingo Molnar Acked-by: Dave Hansen Acked-by: Borislav Petkov (AMD) Cc: "H. Peter Anvin" Cc: Peter Zijlstra Cc: Rik van Riel Cc: Linus Torvalds Cc: Andy Lutomirski Cc: Brian Gerst Cc: Juergen Gross Cc: Rafael J. Wysocki Link: https://lore.kernel.org/r/20250402172458.1378112-1-andrew.cooper3@citrix.com Signed-off-by: Sasha Levin --- arch/x86/include/asm/mwait.h | 9 +++------ arch/x86/kernel/process.c | 9 +++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h index 920426d691ce7..3e4e85f71a6ad 100644 --- a/arch/x86/include/asm/mwait.h +++ b/arch/x86/include/asm/mwait.h @@ -117,13 +117,10 @@ static __always_inline void __sti_mwait(unsigned long eax, unsigned long ecx) static __always_inline void mwait_idle_with_hints(unsigned long eax, unsigned long ecx) { if (static_cpu_has_bug(X86_BUG_MONITOR) || !current_set_polling_and_test()) { - if (static_cpu_has_bug(X86_BUG_CLFLUSH_MONITOR)) { - mb(); - clflush((void *)¤t_thread_info()->flags); - mb(); - } + const void *addr = ¤t_thread_info()->flags; - __monitor((void *)¤t_thread_info()->flags, 0, 0); + alternative_input("", "clflush (%[addr])", X86_BUG_CLFLUSH_MONITOR, [addr] "a" (addr)); + __monitor(addr, 0, 0); if (!need_resched()) { if (ecx & 1) { diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index c7ce3655b7078..8a9ddc4adf51b 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -906,13 +906,10 @@ static __init bool prefer_mwait_c1_over_halt(void) static __cpuidle void mwait_idle(void) { if (!current_set_polling_and_test()) { - if (this_cpu_has(X86_BUG_CLFLUSH_MONITOR)) { - mb(); /* quirk */ - clflush((void *)¤t_thread_info()->flags); - mb(); /* quirk */ - } + const void *addr = ¤t_thread_info()->flags; - __monitor((void *)¤t_thread_info()->flags, 0, 0); + alternative_input("", "clflush (%[addr])", X86_BUG_CLFLUSH_MONITOR, [addr] "a" (addr)); + __monitor(addr, 0, 0); if (!need_resched()) { __sti_mwait(0, 0); raw_local_irq_disable(); -- GitLab From e8d0d9ae998efca7b4c5aeab4c4dbc72cb5856be Mon Sep 17 00:00:00 2001 From: Ovidiu Panait Date: Tue, 1 Apr 2025 22:23:16 +0300 Subject: [PATCH 0709/2211] crypto: sun8i-ce-hash - fix error handling in sun8i_ce_hash_run() [ Upstream commit ea4dd134ef332bd9e3e734c1ba0a1521f436b678 ] Rework error handling in sun8i_ce_hash_run() to unmap the dma buffers in case of failure. Currently, the dma unmap functions are not called if the function errors out at various points. Fixes: 56f6d5aee88d1 ("crypto: sun8i-ce - support hash algorithms") Signed-off-by: Ovidiu Panait Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- .../crypto/allwinner/sun8i-ce/sun8i-ce-hash.c | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c index 6072dd9f390b4..3f9d79ea01aaa 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c @@ -343,9 +343,8 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) u32 common; u64 byte_count; __le32 *bf; - void *buf = NULL; + void *buf, *result; int j, i, todo; - void *result = NULL; u64 bs; int digestsize; dma_addr_t addr_res, addr_pad; @@ -365,14 +364,14 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) buf = kcalloc(2, bs, GFP_KERNEL | GFP_DMA); if (!buf) { err = -ENOMEM; - goto theend; + goto err_out; } bf = (__le32 *)buf; result = kzalloc(digestsize, GFP_KERNEL | GFP_DMA); if (!result) { err = -ENOMEM; - goto theend; + goto err_free_buf; } flow = rctx->flow; @@ -398,7 +397,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) if (nr_sgs <= 0 || nr_sgs > MAX_SG) { dev_err(ce->dev, "Invalid sg number %d\n", nr_sgs); err = -EINVAL; - goto theend; + goto err_free_result; } len = areq->nbytes; @@ -411,7 +410,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) if (len > 0) { dev_err(ce->dev, "remaining len %d\n", len); err = -EINVAL; - goto theend; + goto err_unmap_src; } addr_res = dma_map_single(ce->dev, result, digestsize, DMA_FROM_DEVICE); cet->t_dst[0].addr = desc_addr_val_le32(ce, addr_res); @@ -419,7 +418,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) if (dma_mapping_error(ce->dev, addr_res)) { dev_err(ce->dev, "DMA map dest\n"); err = -EINVAL; - goto theend; + goto err_unmap_src; } byte_count = areq->nbytes; @@ -441,7 +440,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) } if (!j) { err = -EINVAL; - goto theend; + goto err_unmap_result; } addr_pad = dma_map_single(ce->dev, buf, j * 4, DMA_TO_DEVICE); @@ -450,7 +449,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) if (dma_mapping_error(ce->dev, addr_pad)) { dev_err(ce->dev, "DMA error on padding SG\n"); err = -EINVAL; - goto theend; + goto err_unmap_result; } if (ce->variant->hash_t_dlen_in_bits) @@ -463,16 +462,25 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) err = sun8i_ce_run_task(ce, flow, crypto_ahash_alg_name(tfm)); dma_unmap_single(ce->dev, addr_pad, j * 4, DMA_TO_DEVICE); - dma_unmap_sg(ce->dev, areq->src, ns, DMA_TO_DEVICE); + +err_unmap_result: dma_unmap_single(ce->dev, addr_res, digestsize, DMA_FROM_DEVICE); + if (!err) + memcpy(areq->result, result, algt->alg.hash.base.halg.digestsize); +err_unmap_src: + dma_unmap_sg(ce->dev, areq->src, ns, DMA_TO_DEVICE); - memcpy(areq->result, result, algt->alg.hash.base.halg.digestsize); -theend: - kfree(buf); +err_free_result: kfree(result); + +err_free_buf: + kfree(buf); + +err_out: local_bh_disable(); crypto_finalize_hash_request(engine, breq, err); local_bh_enable(); + return 0; } -- GitLab From 623074162b88493df283b0b75d7756aaa5a8464c Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Wed, 19 Mar 2025 22:23:23 +0100 Subject: [PATCH 0710/2211] sched: Fix trace_sched_switch(.prev_state) [ Upstream commit 8feb053d53194382fcfb68231296fdc220497ea6 ] Gabriele noted that in case of signal_pending_state(), the tracepoint sees a stale task-state. Fixes: fa2c3254d7cf ("sched/tracing: Don't re-read p->state when emitting sched_switch event") Reported-by: Gabriele Monaco Signed-off-by: Peter Zijlstra (Intel) Cc: Valentin Schneider Signed-off-by: Sasha Levin --- kernel/sched/core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index e9bb1b4c58421..814abc7ad994a 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -6517,12 +6517,14 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) * Otherwise marks the task's __state as RUNNING */ static bool try_to_block_task(struct rq *rq, struct task_struct *p, - unsigned long task_state) + unsigned long *task_state_p) { + unsigned long task_state = *task_state_p; int flags = DEQUEUE_NOCLOCK; if (signal_pending_state(task_state, p)) { WRITE_ONCE(p->__state, TASK_RUNNING); + *task_state_p = TASK_RUNNING; return false; } @@ -6656,7 +6658,7 @@ static void __sched notrace __schedule(int sched_mode) goto picked; } } else if (!preempt && prev_state) { - try_to_block_task(rq, prev, prev_state); + try_to_block_task(rq, prev, &prev_state); switch_count = &prev->nvcsw; } -- GitLab From 18807198d5db4fbfc4da2a5101a230e43e58fa2c Mon Sep 17 00:00:00 2001 From: Sandipan Das Date: Fri, 18 Apr 2025 09:12:59 +0530 Subject: [PATCH 0711/2211] perf/x86/amd/uncore: Remove unused 'struct amd_uncore_ctx::node' member [ Upstream commit 4f81cc2d1bf91a49d33eb6578b58db2518deef01 ] Fixes: d6389d3ccc13 ("perf/x86/amd/uncore: Refactor uncore management") Signed-off-by: Sandipan Das Signed-off-by: Ingo Molnar Acked-by: Peter Zijlstra Link: https://lore.kernel.org/r/30f9254c2de6c4318dd0809ef85a1677f68eef10.1744906694.git.sandipan.das@amd.com Signed-off-by: Sasha Levin --- arch/x86/events/amd/uncore.c | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/x86/events/amd/uncore.c b/arch/x86/events/amd/uncore.c index 0bfde2ea5cb8c..675250598c324 100644 --- a/arch/x86/events/amd/uncore.c +++ b/arch/x86/events/amd/uncore.c @@ -38,7 +38,6 @@ struct amd_uncore_ctx { int refcnt; int cpu; struct perf_event **events; - struct hlist_node node; }; struct amd_uncore_pmu { -- GitLab From 88ab25d7180c5a771a3b38a56ca411a8194e125c Mon Sep 17 00:00:00 2001 From: Sandipan Das Date: Fri, 18 Apr 2025 09:13:03 +0530 Subject: [PATCH 0712/2211] perf/x86/amd/uncore: Prevent UMC counters from saturating [ Upstream commit 2492e5aba2be064d0604ae23ae0770ecc0168192 ] Unlike L3 and DF counters, UMC counters (PERF_CTRs) set the Overflow bit (bit 48) and saturate on overflow. A subsequent pmu->read() of the event reports an incorrect accumulated count as there is no difference between the previous and the current values of the counter. To avoid this, inspect the current counter value and proactively reset the corresponding PERF_CTR register on every pmu->read(). Combined with the periodic reads initiated by the hrtimer, the counters never get a chance saturate but the resolution reduces to 47 bits. Fixes: 25e56847821f ("perf/x86/amd/uncore: Add memory controller support") Signed-off-by: Sandipan Das Signed-off-by: Ingo Molnar Reviewed-by: Song Liu Acked-by: Peter Zijlstra Link: https://lore.kernel.org/r/dee9c8af2c6d66814cf4c6224529c144c620cf2c.1744906694.git.sandipan.das@amd.com Signed-off-by: Sasha Levin --- arch/x86/events/amd/uncore.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/arch/x86/events/amd/uncore.c b/arch/x86/events/amd/uncore.c index 675250598c324..cdf7bf0298362 100644 --- a/arch/x86/events/amd/uncore.c +++ b/arch/x86/events/amd/uncore.c @@ -889,6 +889,39 @@ static void amd_uncore_umc_start(struct perf_event *event, int flags) perf_event_update_userpage(event); } +static void amd_uncore_umc_read(struct perf_event *event) +{ + struct hw_perf_event *hwc = &event->hw; + u64 prev, new, shift; + s64 delta; + + shift = COUNTER_SHIFT + 1; + prev = local64_read(&hwc->prev_count); + + /* + * UMC counters do not have RDPMC assignments. Read counts directly + * from the corresponding PERF_CTR. + */ + rdmsrl(hwc->event_base, new); + + /* + * Unlike the other uncore counters, UMC counters saturate and set the + * Overflow bit (bit 48) on overflow. Since they do not roll over, + * proactively reset the corresponding PERF_CTR when bit 47 is set so + * that the counter never gets a chance to saturate. + */ + if (new & BIT_ULL(63 - COUNTER_SHIFT)) { + wrmsrl(hwc->event_base, 0); + local64_set(&hwc->prev_count, 0); + } else { + local64_set(&hwc->prev_count, new); + } + + delta = (new << shift) - (prev << shift); + delta >>= shift; + local64_add(delta, &event->count); +} + static void amd_uncore_umc_ctx_scan(struct amd_uncore *uncore, unsigned int cpu) { @@ -966,7 +999,7 @@ int amd_uncore_umc_ctx_init(struct amd_uncore *uncore, unsigned int cpu) .del = amd_uncore_del, .start = amd_uncore_umc_start, .stop = amd_uncore_stop, - .read = amd_uncore_read, + .read = amd_uncore_umc_read, .capabilities = PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT, .module = THIS_MODULE, }; -- GitLab From 271e6bf41afab5f3167bef486a8f65de8c9b2101 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Sun, 6 Apr 2025 00:31:37 +0200 Subject: [PATCH 0713/2211] gfs2: replace sd_aspace with sd_inode [ Upstream commit ae9f3bd8259a0a8f67be2420e66bb05fbb95af48 ] Currently, sdp->sd_aspace and the per-inode metadata address spaces use sb->s_bdev->bd_mapping->host as their ->host; folios in those address spaces will thus appear to be on bdev rather than on gfs2 filesystems. This is a problem because gfs2 doesn't support cgroup writeback (SB_I_CGROUPWB), but bdev does. Fix that by using a "dummy" gfs2 inode as ->host in those address spaces. When coming from a folio, folio->mapping->host->i_sb will then be a gfs2 super block and the SB_I_CGROUPWB flag will not be set in sb->s_iflags. Based on a previous version from Bob Peterson from several years ago. Thanks to Tetsuo Handa, Jan Kara, and Rafael Aquini for helping figure this out. Fixes: aaa2cacf8184 ("writeback: add lockdep annotation to inode_to_wb()") Signed-off-by: Andreas Gruenbacher Signed-off-by: Sasha Levin --- fs/gfs2/glock.c | 3 +-- fs/gfs2/glops.c | 4 ++-- fs/gfs2/incore.h | 9 ++++++++- fs/gfs2/meta_io.c | 2 +- fs/gfs2/meta_io.h | 4 +--- fs/gfs2/ops_fstype.c | 31 ++++++++++++++++++------------- fs/gfs2/super.c | 2 +- 7 files changed, 32 insertions(+), 23 deletions(-) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 4f1eca99786b6..aecce4bb5e1a9 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -1183,7 +1183,6 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, const struct gfs2_glock_operations *glops, int create, struct gfs2_glock **glp) { - struct super_block *s = sdp->sd_vfs; struct lm_lockname name = { .ln_number = number, .ln_type = glops->go_type, .ln_sbd = sdp }; @@ -1246,7 +1245,7 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, mapping = gfs2_glock2aspace(gl); if (mapping) { mapping->a_ops = &gfs2_meta_aops; - mapping->host = s->s_bdev->bd_mapping->host; + mapping->host = sdp->sd_inode; mapping->flags = 0; mapping_set_gfp_mask(mapping, GFP_NOFS); mapping->i_private_data = NULL; diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index 95d8081681dcc..72a0601ce65e2 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c @@ -168,7 +168,7 @@ void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) static int gfs2_rgrp_metasync(struct gfs2_glock *gl) { struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; - struct address_space *metamapping = &sdp->sd_aspace; + struct address_space *metamapping = gfs2_aspace(sdp); struct gfs2_rgrpd *rgd = gfs2_glock2rgrp(gl); const unsigned bsize = sdp->sd_sb.sb_bsize; loff_t start = (rgd->rd_addr * bsize) & PAGE_MASK; @@ -225,7 +225,7 @@ static int rgrp_go_sync(struct gfs2_glock *gl) static void rgrp_go_inval(struct gfs2_glock *gl, int flags) { struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; - struct address_space *mapping = &sdp->sd_aspace; + struct address_space *mapping = gfs2_aspace(sdp); struct gfs2_rgrpd *rgd = gfs2_glock2rgrp(gl); const unsigned bsize = sdp->sd_sb.sb_bsize; loff_t start, end; diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index bd1348bff90eb..e5535d7b46592 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h @@ -793,7 +793,7 @@ struct gfs2_sbd { /* Log stuff */ - struct address_space sd_aspace; + struct inode *sd_inode; spinlock_t sd_log_lock; @@ -849,6 +849,13 @@ struct gfs2_sbd { unsigned long sd_glock_dqs_held; }; +#define GFS2_BAD_INO 1 + +static inline struct address_space *gfs2_aspace(struct gfs2_sbd *sdp) +{ + return sdp->sd_inode->i_mapping; +} + static inline void gfs2_glstats_inc(struct gfs2_glock *gl, int which) { gl->gl_stats.stats[which]++; diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index fea3efcc2f930..960d6afcdfad8 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -132,7 +132,7 @@ struct buffer_head *gfs2_getbuf(struct gfs2_glock *gl, u64 blkno, int create) unsigned int bufnum; if (mapping == NULL) - mapping = &sdp->sd_aspace; + mapping = gfs2_aspace(sdp); shift = PAGE_SHIFT - sdp->sd_sb.sb_bsize_shift; index = blkno >> shift; /* convert block to page */ diff --git a/fs/gfs2/meta_io.h b/fs/gfs2/meta_io.h index 831d988c2ceb7..b7c8a6684d024 100644 --- a/fs/gfs2/meta_io.h +++ b/fs/gfs2/meta_io.h @@ -44,9 +44,7 @@ static inline struct gfs2_sbd *gfs2_mapping2sbd(struct address_space *mapping) struct gfs2_glock_aspace *gla = container_of(mapping, struct gfs2_glock_aspace, mapping); return gla->glock.gl_name.ln_sbd; - } else if (mapping->a_ops == &gfs2_rgrp_aops) - return container_of(mapping, struct gfs2_sbd, sd_aspace); - else + } else return inode->i_sb->s_fs_info; } diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index e83d293c36142..6ce475e1c6d64 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -72,7 +72,6 @@ void free_sbd(struct gfs2_sbd *sdp) static struct gfs2_sbd *init_sbd(struct super_block *sb) { struct gfs2_sbd *sdp; - struct address_space *mapping; sdp = kzalloc(sizeof(struct gfs2_sbd), GFP_KERNEL); if (!sdp) @@ -109,16 +108,6 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb) INIT_LIST_HEAD(&sdp->sd_sc_inodes_list); - mapping = &sdp->sd_aspace; - - address_space_init_once(mapping); - mapping->a_ops = &gfs2_rgrp_aops; - mapping->host = sb->s_bdev->bd_mapping->host; - mapping->flags = 0; - mapping_set_gfp_mask(mapping, GFP_NOFS); - mapping->i_private_data = NULL; - mapping->writeback_index = 0; - spin_lock_init(&sdp->sd_log_lock); atomic_set(&sdp->sd_log_pinned, 0); INIT_LIST_HEAD(&sdp->sd_log_revokes); @@ -1135,6 +1124,7 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc) int silent = fc->sb_flags & SB_SILENT; struct gfs2_sbd *sdp; struct gfs2_holder mount_gh; + struct address_space *mapping; int error; sdp = init_sbd(sb); @@ -1156,6 +1146,7 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc) sb->s_flags |= SB_NOSEC; sb->s_magic = GFS2_MAGIC; sb->s_op = &gfs2_super_ops; + sb->s_d_op = &gfs2_dops; sb->s_export_op = &gfs2_export_ops; sb->s_qcop = &gfs2_quotactl_ops; @@ -1181,9 +1172,21 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc) sdp->sd_tune.gt_statfs_quantum = 30; } + /* Set up an address space for metadata writes */ + sdp->sd_inode = new_inode(sb); + error = -ENOMEM; + if (!sdp->sd_inode) + goto fail_free; + sdp->sd_inode->i_ino = GFS2_BAD_INO; + sdp->sd_inode->i_size = OFFSET_MAX; + + mapping = gfs2_aspace(sdp); + mapping->a_ops = &gfs2_rgrp_aops; + mapping_set_gfp_mask(mapping, GFP_NOFS); + error = init_names(sdp, silent); if (error) - goto fail_free; + goto fail_iput; snprintf(sdp->sd_fsname, sizeof(sdp->sd_fsname), "%s", sdp->sd_table_name); @@ -1192,7 +1195,7 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc) WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_FREEZABLE, 0, sdp->sd_fsname); if (!sdp->sd_glock_wq) - goto fail_free; + goto fail_iput; sdp->sd_delete_wq = alloc_workqueue("gfs2-delete/%s", WQ_MEM_RECLAIM | WQ_FREEZABLE, 0, sdp->sd_fsname); @@ -1309,6 +1312,8 @@ fail_delete_wq: fail_glock_wq: if (sdp->sd_glock_wq) destroy_workqueue(sdp->sd_glock_wq); +fail_iput: + iput(sdp->sd_inode); fail_free: free_sbd(sdp); sb->s_fs_info = NULL; diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index b9cef63c78717..6d62ff5cb445a 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -648,7 +648,7 @@ restart: gfs2_jindex_free(sdp); /* Take apart glock structures and buffer lists */ gfs2_gl_hash_clear(sdp); - truncate_inode_pages_final(&sdp->sd_aspace); + iput(sdp->sd_inode); gfs2_delete_debugfs_file(sdp); gfs2_sys_fs_del(sdp); -- GitLab From 5cd98656bcbc07d1362df177ecac89cd9b027da6 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 18 Apr 2025 16:40:58 +0200 Subject: [PATCH 0714/2211] gfs2: gfs2_create_inode error handling fix [ Upstream commit af4044fd0b77e915736527dd83011e46e6415f01 ] When gfs2_create_inode() finds a directory, make sure to return -EISDIR. Fixes: 571a4b57975a ("GFS2: bugger off early if O_CREAT open finds a directory") Signed-off-by: Andreas Gruenbacher Signed-off-by: Sasha Levin --- fs/gfs2/inode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 1b95db2c3aac3..3be24285ab01d 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -659,7 +659,8 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, if (!IS_ERR(inode)) { if (S_ISDIR(inode->i_mode)) { iput(inode); - inode = ERR_PTR(-EISDIR); + inode = NULL; + error = -EISDIR; goto fail_gunlock; } d_instantiate(dentry, inode); -- GitLab From 781bbc8252f7c826b5dee6e999555e7474a9f336 Mon Sep 17 00:00:00 2001 From: Qing Wang Date: Sat, 5 Apr 2025 22:16:35 +0800 Subject: [PATCH 0715/2211] perf/core: Fix broken throttling when max_samples_per_tick=1 [ Upstream commit f51972e6f8b9a737b2b3eb588069acb538fa72de ] According to the throttling mechanism, the pmu interrupts number can not exceed the max_samples_per_tick in one tick. But this mechanism is ineffective when max_samples_per_tick=1, because the throttling check is skipped during the first interrupt and only performed when the second interrupt arrives. Perhaps this bug may cause little influence in one tick, but if in a larger time scale, the problem can not be underestimated. When max_samples_per_tick = 1: Allowed-interrupts-per-second max-samples-per-second default-HZ ARCH 200 100 100 X86 500 250 250 ARM64 ... Obviously, the pmu interrupt number far exceed the user's expect. Fixes: e050e3f0a71b ("perf: Fix broken interrupt rate throttling") Signed-off-by: Qing Wang Signed-off-by: Peter Zijlstra (Intel) Link: https://lkml.kernel.org/r/20250405141635.243786-3-wangqing7171@gmail.com Signed-off-by: Sasha Levin --- kernel/events/core.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index 285a4548450bd..8352376d82154 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -9715,14 +9715,14 @@ __perf_event_account_interrupt(struct perf_event *event, int throttle) hwc->interrupts = 1; } else { hwc->interrupts++; - if (unlikely(throttle && - hwc->interrupts > max_samples_per_tick)) { - __this_cpu_inc(perf_throttled_count); - tick_dep_set_cpu(smp_processor_id(), TICK_DEP_BIT_PERF_EVENTS); - hwc->interrupts = MAX_INTERRUPTS; - perf_log_throttle(event, 0); - ret = 1; - } + } + + if (unlikely(throttle && hwc->interrupts >= max_samples_per_tick)) { + __this_cpu_inc(perf_throttled_count); + tick_dep_set_cpu(smp_processor_id(), TICK_DEP_BIT_PERF_EVENTS); + hwc->interrupts = MAX_INTERRUPTS; + perf_log_throttle(event, 0); + ret = 1; } if (event->attr.freq) { -- GitLab From 19d267d9fad00d94ad8477899e38ed7c11f33fb6 Mon Sep 17 00:00:00 2001 From: Ovidiu Panait Date: Fri, 25 Apr 2025 15:45:14 +0300 Subject: [PATCH 0716/2211] crypto: sun8i-ce-cipher - fix error handling in sun8i_ce_cipher_prepare() [ Upstream commit f31adc3e356f7350d4a4d68c98d3f60f2f6e26b3 ] Fix two DMA cleanup issues on the error path in sun8i_ce_cipher_prepare(): 1] If dma_map_sg() fails for areq->dst, the device driver would try to free DMA memory it has not allocated in the first place. To fix this, on the "theend_sgs" error path, call dma unmap only if the corresponding dma map was successful. 2] If the dma_map_single() call for the IV fails, the device driver would try to free an invalid DMA memory address on the "theend_iv" path: ------------[ cut here ]------------ DMA-API: sun8i-ce 1904000.crypto: device driver tries to free an invalid DMA memory address WARNING: CPU: 2 PID: 69 at kernel/dma/debug.c:968 check_unmap+0x123c/0x1b90 Modules linked in: skcipher_example(O+) CPU: 2 UID: 0 PID: 69 Comm: 1904000.crypto- Tainted: G O 6.15.0-rc3+ #24 PREEMPT Tainted: [O]=OOT_MODULE Hardware name: OrangePi Zero2 (DT) pc : check_unmap+0x123c/0x1b90 lr : check_unmap+0x123c/0x1b90 ... Call trace: check_unmap+0x123c/0x1b90 (P) debug_dma_unmap_page+0xac/0xc0 dma_unmap_page_attrs+0x1f4/0x5fc sun8i_ce_cipher_do_one+0x1bd4/0x1f40 crypto_pump_work+0x334/0x6e0 kthread_worker_fn+0x21c/0x438 kthread+0x374/0x664 ret_from_fork+0x10/0x20 ---[ end trace 0000000000000000 ]--- To fix this, check for !dma_mapping_error() before calling dma_unmap_single() on the "theend_iv" path. Fixes: 06f751b61329 ("crypto: allwinner - Add sun8i-ce Crypto Engine") Signed-off-by: Ovidiu Panait Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c index 19b7fb4a93e86..05f67661553c9 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c @@ -275,13 +275,16 @@ theend_sgs: } else { if (nr_sgs > 0) dma_unmap_sg(ce->dev, areq->src, ns, DMA_TO_DEVICE); - dma_unmap_sg(ce->dev, areq->dst, nd, DMA_FROM_DEVICE); + + if (nr_sgd > 0) + dma_unmap_sg(ce->dev, areq->dst, nd, DMA_FROM_DEVICE); } theend_iv: if (areq->iv && ivsize > 0) { - if (rctx->addr_iv) + if (!dma_mapping_error(ce->dev, rctx->addr_iv)) dma_unmap_single(ce->dev, rctx->addr_iv, rctx->ivlen, DMA_TO_DEVICE); + offset = areq->cryptlen - ivsize; if (rctx->op_dir & CE_DECRYPTION) { memcpy(areq->iv, chan->backup_iv, ivsize); -- GitLab From 50de02375fac2779cbae8b22cd38d42c92a95945 Mon Sep 17 00:00:00 2001 From: Corentin Labbe Date: Sun, 27 Apr 2025 13:12:36 +0200 Subject: [PATCH 0717/2211] crypto: sun8i-ss - do not use sg_dma_len before calling DMA functions [ Upstream commit 2dfc7cd74a5e062a5405560447517e7aab1c7341 ] When testing sun8i-ss with multi_v7_defconfig, all CBC algorithm fail crypto selftests. This is strange since on sunxi_defconfig, everything was ok. The problem was in the IV setup loop which never run because sg_dma_len was 0. Fixes: 359e893e8af4 ("crypto: sun8i-ss - rework handling of IV") Signed-off-by: Corentin Labbe Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c index 9b9605ce8ee62..8831bcb230c2d 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c @@ -141,7 +141,7 @@ static int sun8i_ss_setup_ivs(struct skcipher_request *areq) /* we need to copy all IVs from source in case DMA is bi-directionnal */ while (sg && len) { - if (sg_dma_len(sg) == 0) { + if (sg->length == 0) { sg = sg_next(sg); continue; } -- GitLab From 4de0bb505fbaf941d41bd8373715758ed149f6d9 Mon Sep 17 00:00:00 2001 From: "Jiri Slaby (SUSE)" Date: Thu, 17 Apr 2025 12:53:05 +0200 Subject: [PATCH 0718/2211] powerpc: do not build ppc_save_regs.o always [ Upstream commit 497b7794aef03d525a5be05ae78dd7137c6861a5 ] The Fixes commit below tried to add CONFIG_PPC_BOOK3S to one of the conditions to enable the build of ppc_save_regs.o. But it failed to do so, in fact. The commit omitted to add a dollar sign. Therefore, ppc_save_regs.o is built always these days (as "(CONFIG_PPC_BOOK3S)" is never an empty string). Fix this by adding the missing dollar sign. Signed-off-by: Jiri Slaby (SUSE) Fixes: fc2a5a6161a2 ("powerpc/64s: ppc_save_regs is now needed for all 64s builds") Acked-by: Stephen Rothwell Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/20250417105305.397128-1-jirislaby@kernel.org Signed-off-by: Sasha Levin --- arch/powerpc/kernel/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index f43c1198768c6..b4006a4a11216 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile @@ -162,7 +162,7 @@ endif obj64-$(CONFIG_PPC_TRANSACTIONAL_MEM) += tm.o -ifneq ($(CONFIG_XMON)$(CONFIG_KEXEC_CORE)(CONFIG_PPC_BOOK3S),) +ifneq ($(CONFIG_XMON)$(CONFIG_KEXEC_CORE)$(CONFIG_PPC_BOOK3S),) obj-y += ppc_save_regs.o endif -- GitLab From f54d2b7ac42b7d791a6584a8fbc4703d09790955 Mon Sep 17 00:00:00 2001 From: Eddie James Date: Tue, 11 Feb 2025 10:20:54 -0600 Subject: [PATCH 0719/2211] powerpc/crash: Fix non-smp kexec preparation [ Upstream commit 882b25af265de8e05c66f72b9a29f6047102958f ] In non-smp configurations, crash_kexec_prepare is never called in the crash shutdown path. One result of this is that the crashing_cpu variable is never set, preventing crash_save_cpu from storing the NT_PRSTATUS elf note in the core dump. Fixes: c7255058b543 ("powerpc/crash: save cpu register data in crash_smp_send_stop()") Signed-off-by: Eddie James Reviewed-by: Hari Bathini Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/20250211162054.857762-1-eajames@linux.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/kexec/crash.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/kexec/crash.c b/arch/powerpc/kexec/crash.c index 9ac3266e49652..a325c1c02f96d 100644 --- a/arch/powerpc/kexec/crash.c +++ b/arch/powerpc/kexec/crash.c @@ -359,7 +359,10 @@ void default_machine_crash_shutdown(struct pt_regs *regs) if (TRAP(regs) == INTERRUPT_SYSTEM_RESET) is_via_system_reset = 1; - crash_smp_send_stop(); + if (IS_ENABLED(CONFIG_SMP)) + crash_smp_send_stop(); + else + crash_kexec_prepare(); crash_save_cpu(regs, crashing_cpu); -- GitLab From 451a18d71bd979768de223d10b1921da4732f1c9 Mon Sep 17 00:00:00 2001 From: John Stultz Date: Tue, 29 Apr 2025 08:07:26 -0700 Subject: [PATCH 0720/2211] sched/core: Tweak wait_task_inactive() to force dequeue sched_delayed tasks [ Upstream commit b7ca5743a2604156d6083b88cefacef983f3a3a6 ] It was reported that in 6.12, smpboot_create_threads() was taking much longer then in 6.6. I narrowed down the call path to: smpboot_create_threads() -> kthread_create_on_cpu() -> kthread_bind() -> __kthread_bind_mask() ->wait_task_inactive() Where in wait_task_inactive() we were regularly hitting the queued case, which sets a 1 tick timeout, which when called multiple times in a row, accumulates quickly into a long delay. I noticed disabling the DELAY_DEQUEUE sched feature recovered the performance, and it seems the newly create tasks are usually sched_delayed and left on the runqueue. So in wait_task_inactive() when we see the task p->se.sched_delayed, manually dequeue the sched_delayed task with DEQUEUE_DELAYED, so we don't have to constantly wait a tick. Fixes: 152e11f6df29 ("sched/fair: Implement delayed dequeue") Reported-by: peter-yc.chang@mediatek.com Signed-off-by: John Stultz Signed-off-by: Peter Zijlstra (Intel) Tested-by: K Prateek Nayak Link: https://lkml.kernel.org/r/20250429150736.3778580-1-jstultz@google.com Signed-off-by: Sasha Levin --- kernel/sched/core.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 814abc7ad994a..51f36de5990a3 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -2229,6 +2229,12 @@ unsigned long wait_task_inactive(struct task_struct *p, unsigned int match_state * just go back and repeat. */ rq = task_rq_lock(p, &rf); + /* + * If task is sched_delayed, force dequeue it, to avoid always + * hitting the tick timeout in the queued case + */ + if (p->se.sched_delayed) + dequeue_task(rq, p, DEQUEUE_SLEEP | DEQUEUE_DELAYED); trace_sched_wait_task(p); running = task_on_cpu(rq, p); queued = task_on_rq_queued(p); -- GitLab From 57a52d74498c2b67d6378bbe5fca7039d20137d3 Mon Sep 17 00:00:00 2001 From: Annie Li Date: Wed, 30 Apr 2025 05:34:24 +0000 Subject: [PATCH 0721/2211] x86/microcode/AMD: Do not return error when microcode update is not necessary [ Upstream commit b43dc4ab097859c24e2a6993119c927cffc856aa ] After 6f059e634dcd("x86/microcode: Clarify the late load logic"), if the load is up-to-date, the AMD side returns UCODE_OK which leads to load_late_locked() returning -EBADFD. Handle UCODE_OK in the switch case to avoid this error. [ bp: Massage commit message. ] Fixes: 6f059e634dcd ("x86/microcode: Clarify the late load logic") Signed-off-by: Annie Li Signed-off-by: Borislav Petkov (AMD) Link: https://lore.kernel.org/20250430053424.77438-1-jiayanli@google.com Signed-off-by: Sasha Levin --- arch/x86/kernel/cpu/microcode/core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c index 079f046ee26d1..e8021d3e58824 100644 --- a/arch/x86/kernel/cpu/microcode/core.c +++ b/arch/x86/kernel/cpu/microcode/core.c @@ -696,6 +696,8 @@ static int load_late_locked(void) return load_late_stop_cpus(true); case UCODE_NFOUND: return -ENOENT; + case UCODE_OK: + return 0; default: return -EBADFD; } -- GitLab From c93930857f0600f5ea63b4315dd9d306d2f0b377 Mon Sep 17 00:00:00 2001 From: Ovidiu Panait Date: Thu, 1 May 2025 22:06:50 +0300 Subject: [PATCH 0722/2211] crypto: sun8i-ce - undo runtime PM changes during driver removal [ Upstream commit 9334f427576e6d361a409959b52246b0aa10476f ] The pm_runtime_use_autosuspend() call must be undone with pm_runtime_dont_use_autosuspend() at driver exit, but this is not currently handled in the driver. To fix this issue and at the same time simplify error handling, switch to devm_pm_runtime_enable(). It will call both pm_runtime_disable() and pm_runtime_dont_use_autosuspend() during driver removal. Fixes: 06f751b61329 ("crypto: allwinner - Add sun8i-ce Crypto Engine") Signed-off-by: Ovidiu Panait Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- .../crypto/allwinner/sun8i-ce/sun8i-ce-core.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c index e55e58e164db3..fcc6832a065cb 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c @@ -832,13 +832,12 @@ static int sun8i_ce_pm_init(struct sun8i_ce_dev *ce) err = pm_runtime_set_suspended(ce->dev); if (err) return err; - pm_runtime_enable(ce->dev); - return err; -} -static void sun8i_ce_pm_exit(struct sun8i_ce_dev *ce) -{ - pm_runtime_disable(ce->dev); + err = devm_pm_runtime_enable(ce->dev); + if (err) + return err; + + return 0; } static int sun8i_ce_get_clks(struct sun8i_ce_dev *ce) @@ -1041,7 +1040,7 @@ static int sun8i_ce_probe(struct platform_device *pdev) "sun8i-ce-ns", ce); if (err) { dev_err(ce->dev, "Cannot request CryptoEngine Non-secure IRQ (err=%d)\n", err); - goto error_irq; + goto error_pm; } err = sun8i_ce_register_algs(ce); @@ -1082,8 +1081,6 @@ static int sun8i_ce_probe(struct platform_device *pdev) return 0; error_alg: sun8i_ce_unregister_algs(ce); -error_irq: - sun8i_ce_pm_exit(ce); error_pm: sun8i_ce_free_chanlist(ce, MAXFLOW - 1); return err; @@ -1104,8 +1101,6 @@ static void sun8i_ce_remove(struct platform_device *pdev) #endif sun8i_ce_free_chanlist(ce, MAXFLOW - 1); - - sun8i_ce_pm_exit(ce); } static const struct of_device_id sun8i_ce_crypto_of_match_table[] = { -- GitLab From a18f8b1092d94e3d61b9f982a2c9d871eda4673c Mon Sep 17 00:00:00 2001 From: "Ahmed S. Darwish" Date: Tue, 6 May 2025 07:04:13 +0200 Subject: [PATCH 0723/2211] x86/cpu: Sanitize CPUID(0x80000000) output [ Upstream commit cc663ba3fe383a628a812f893cc98aafff39ab04 ] CPUID(0x80000000).EAX returns the max extended CPUID leaf available. On x86-32 machines without an extended CPUID range, a CPUID(0x80000000) query will just repeat the output of the last valid standard CPUID leaf on the CPU; i.e., a garbage values. Current tip:x86/cpu code protects against this by doing: eax = cpuid_eax(0x80000000); c->extended_cpuid_level = eax; if ((eax & 0xffff0000) == 0x80000000) { // CPU has an extended CPUID range. Check for 0x80000001 if (eax >= 0x80000001) { cpuid(0x80000001, ...); } } This is correct so far. Afterwards though, the same possibly broken EAX value is used to check the availability of other extended CPUID leaves: if (c->extended_cpuid_level >= 0x80000007) ... if (c->extended_cpuid_level >= 0x80000008) ... if (c->extended_cpuid_level >= 0x8000000a) ... if (c->extended_cpuid_level >= 0x8000001f) ... which is invalid. Fix this by immediately setting the CPU's max extended CPUID leaf to zero if CPUID(0x80000000).EAX doesn't indicate a valid CPUID extended range. While at it, add a comment, similar to kernel/head_32.S, clarifying the CPUID(0x80000000) sanity check. References: 8a50e5135af0 ("x86-32: Use symbolic constants, safer CPUID when enabling EFER.NX") Fixes: 3da99c977637 ("x86: make (early)_identify_cpu more the same between 32bit and 64 bit") Signed-off-by: Ahmed S. Darwish Signed-off-by: Ingo Molnar Cc: Andrew Cooper Cc: H. Peter Anvin Cc: John Ogness Cc: x86-cpuid@lists.linux.dev Link: https://lore.kernel.org/r/20250506050437.10264-3-darwi@linutronix.de Signed-off-by: Sasha Levin --- arch/x86/kernel/cpu/common.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 39e9ec3dea985..b487754455236 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -1007,17 +1007,18 @@ void get_cpu_cap(struct cpuinfo_x86 *c) c->x86_capability[CPUID_D_1_EAX] = eax; } - /* AMD-defined flags: level 0x80000001 */ + /* + * Check if extended CPUID leaves are implemented: Max extended + * CPUID leaf must be in the 0x80000001-0x8000ffff range. + */ eax = cpuid_eax(0x80000000); - c->extended_cpuid_level = eax; + c->extended_cpuid_level = ((eax & 0xffff0000) == 0x80000000) ? eax : 0; - if ((eax & 0xffff0000) == 0x80000000) { - if (eax >= 0x80000001) { - cpuid(0x80000001, &eax, &ebx, &ecx, &edx); + if (c->extended_cpuid_level >= 0x80000001) { + cpuid(0x80000001, &eax, &ebx, &ecx, &edx); - c->x86_capability[CPUID_8000_0001_ECX] = ecx; - c->x86_capability[CPUID_8000_0001_EDX] = edx; - } + c->x86_capability[CPUID_8000_0001_ECX] = ecx; + c->x86_capability[CPUID_8000_0001_EDX] = edx; } if (c->extended_cpuid_level >= 0x80000007) { -- GitLab From 7778a67678693278fcc46cb00792e9b1bc5f3415 Mon Sep 17 00:00:00 2001 From: "Masami Hiramatsu (Google)" Date: Mon, 28 Apr 2025 10:48:10 +0900 Subject: [PATCH 0724/2211] x86/insn: Fix opcode map (!REX2) superscript tags [ Upstream commit ca698ec2f07873a448d53c580795c4e023c75393 ] Commit: 159039af8c07 ("x86/insn: x86/insn: Add support for REX2 prefix to the instruction decoder opcode map") added (!REX2) superscript with a space, but the correct format requires ',' for concatination with other superscript tags. Add ',' to generate correct insn attribute tables. I confirmed with following command: arch/x86/lib/x86-opcode-map.txt | grep e8 | head -n 1 [0xe8] = INAT_MAKE_IMM(INAT_IMM_VWORD32) | INAT_FORCE64 | INAT_NO_REX2, Fixes: 159039af8c07 ("x86/insn: x86/insn: Add support for REX2 prefix to the instruction decoder opcode map") Signed-off-by: Masami Hiramatsu (Google) Signed-off-by: Ingo Molnar Cc: H. Peter Anvin Cc: Adrian Hunter Cc: Peter Zijlstra Link: https://lore.kernel.org/r/174580489027.388420.15539375184727726142.stgit@devnote2 Signed-off-by: Sasha Levin --- arch/x86/lib/x86-opcode-map.txt | 50 +++++++++++++-------------- tools/arch/x86/lib/x86-opcode-map.txt | 50 +++++++++++++-------------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/arch/x86/lib/x86-opcode-map.txt b/arch/x86/lib/x86-opcode-map.txt index f5dd84eb55dcd..cd3fd5155f6ec 100644 --- a/arch/x86/lib/x86-opcode-map.txt +++ b/arch/x86/lib/x86-opcode-map.txt @@ -35,7 +35,7 @@ # - (!F3) : the last prefix is not 0xF3 (including non-last prefix case) # - (66&F2): Both 0x66 and 0xF2 prefixes are specified. # -# REX2 Prefix +# REX2 Prefix Superscripts # - (!REX2): REX2 is not allowed # - (REX2): REX2 variant e.g. JMPABS @@ -286,10 +286,10 @@ df: ESC # Note: "forced64" is Intel CPU behavior: they ignore 0x66 prefix # in 64-bit mode. AMD CPUs accept 0x66 prefix, it causes RIP truncation # to 16 bits. In 32-bit mode, 0x66 is accepted by both Intel and AMD. -e0: LOOPNE/LOOPNZ Jb (f64) (!REX2) -e1: LOOPE/LOOPZ Jb (f64) (!REX2) -e2: LOOP Jb (f64) (!REX2) -e3: JrCXZ Jb (f64) (!REX2) +e0: LOOPNE/LOOPNZ Jb (f64),(!REX2) +e1: LOOPE/LOOPZ Jb (f64),(!REX2) +e2: LOOP Jb (f64),(!REX2) +e3: JrCXZ Jb (f64),(!REX2) e4: IN AL,Ib (!REX2) e5: IN eAX,Ib (!REX2) e6: OUT Ib,AL (!REX2) @@ -298,10 +298,10 @@ e7: OUT Ib,eAX (!REX2) # in "near" jumps and calls is 16-bit. For CALL, # push of return address is 16-bit wide, RSP is decremented by 2 # but is not truncated to 16 bits, unlike RIP. -e8: CALL Jz (f64) (!REX2) -e9: JMP-near Jz (f64) (!REX2) -ea: JMP-far Ap (i64) (!REX2) -eb: JMP-short Jb (f64) (!REX2) +e8: CALL Jz (f64),(!REX2) +e9: JMP-near Jz (f64),(!REX2) +ea: JMP-far Ap (i64),(!REX2) +eb: JMP-short Jb (f64),(!REX2) ec: IN AL,DX (!REX2) ed: IN eAX,DX (!REX2) ee: OUT DX,AL (!REX2) @@ -478,22 +478,22 @@ AVXcode: 1 7f: movq Qq,Pq | vmovdqa Wx,Vx (66) | vmovdqa32/64 Wx,Vx (66),(evo) | vmovdqu Wx,Vx (F3) | vmovdqu32/64 Wx,Vx (F3),(evo) | vmovdqu8/16 Wx,Vx (F2),(ev) # 0x0f 0x80-0x8f # Note: "forced64" is Intel CPU behavior (see comment about CALL insn). -80: JO Jz (f64) (!REX2) -81: JNO Jz (f64) (!REX2) -82: JB/JC/JNAE Jz (f64) (!REX2) -83: JAE/JNB/JNC Jz (f64) (!REX2) -84: JE/JZ Jz (f64) (!REX2) -85: JNE/JNZ Jz (f64) (!REX2) -86: JBE/JNA Jz (f64) (!REX2) -87: JA/JNBE Jz (f64) (!REX2) -88: JS Jz (f64) (!REX2) -89: JNS Jz (f64) (!REX2) -8a: JP/JPE Jz (f64) (!REX2) -8b: JNP/JPO Jz (f64) (!REX2) -8c: JL/JNGE Jz (f64) (!REX2) -8d: JNL/JGE Jz (f64) (!REX2) -8e: JLE/JNG Jz (f64) (!REX2) -8f: JNLE/JG Jz (f64) (!REX2) +80: JO Jz (f64),(!REX2) +81: JNO Jz (f64),(!REX2) +82: JB/JC/JNAE Jz (f64),(!REX2) +83: JAE/JNB/JNC Jz (f64),(!REX2) +84: JE/JZ Jz (f64),(!REX2) +85: JNE/JNZ Jz (f64),(!REX2) +86: JBE/JNA Jz (f64),(!REX2) +87: JA/JNBE Jz (f64),(!REX2) +88: JS Jz (f64),(!REX2) +89: JNS Jz (f64),(!REX2) +8a: JP/JPE Jz (f64),(!REX2) +8b: JNP/JPO Jz (f64),(!REX2) +8c: JL/JNGE Jz (f64),(!REX2) +8d: JNL/JGE Jz (f64),(!REX2) +8e: JLE/JNG Jz (f64),(!REX2) +8f: JNLE/JG Jz (f64),(!REX2) # 0x0f 0x90-0x9f 90: SETO Eb | kmovw/q Vk,Wk | kmovb/d Vk,Wk (66) 91: SETNO Eb | kmovw/q Mv,Vk | kmovb/d Mv,Vk (66) diff --git a/tools/arch/x86/lib/x86-opcode-map.txt b/tools/arch/x86/lib/x86-opcode-map.txt index f5dd84eb55dcd..cd3fd5155f6ec 100644 --- a/tools/arch/x86/lib/x86-opcode-map.txt +++ b/tools/arch/x86/lib/x86-opcode-map.txt @@ -35,7 +35,7 @@ # - (!F3) : the last prefix is not 0xF3 (including non-last prefix case) # - (66&F2): Both 0x66 and 0xF2 prefixes are specified. # -# REX2 Prefix +# REX2 Prefix Superscripts # - (!REX2): REX2 is not allowed # - (REX2): REX2 variant e.g. JMPABS @@ -286,10 +286,10 @@ df: ESC # Note: "forced64" is Intel CPU behavior: they ignore 0x66 prefix # in 64-bit mode. AMD CPUs accept 0x66 prefix, it causes RIP truncation # to 16 bits. In 32-bit mode, 0x66 is accepted by both Intel and AMD. -e0: LOOPNE/LOOPNZ Jb (f64) (!REX2) -e1: LOOPE/LOOPZ Jb (f64) (!REX2) -e2: LOOP Jb (f64) (!REX2) -e3: JrCXZ Jb (f64) (!REX2) +e0: LOOPNE/LOOPNZ Jb (f64),(!REX2) +e1: LOOPE/LOOPZ Jb (f64),(!REX2) +e2: LOOP Jb (f64),(!REX2) +e3: JrCXZ Jb (f64),(!REX2) e4: IN AL,Ib (!REX2) e5: IN eAX,Ib (!REX2) e6: OUT Ib,AL (!REX2) @@ -298,10 +298,10 @@ e7: OUT Ib,eAX (!REX2) # in "near" jumps and calls is 16-bit. For CALL, # push of return address is 16-bit wide, RSP is decremented by 2 # but is not truncated to 16 bits, unlike RIP. -e8: CALL Jz (f64) (!REX2) -e9: JMP-near Jz (f64) (!REX2) -ea: JMP-far Ap (i64) (!REX2) -eb: JMP-short Jb (f64) (!REX2) +e8: CALL Jz (f64),(!REX2) +e9: JMP-near Jz (f64),(!REX2) +ea: JMP-far Ap (i64),(!REX2) +eb: JMP-short Jb (f64),(!REX2) ec: IN AL,DX (!REX2) ed: IN eAX,DX (!REX2) ee: OUT DX,AL (!REX2) @@ -478,22 +478,22 @@ AVXcode: 1 7f: movq Qq,Pq | vmovdqa Wx,Vx (66) | vmovdqa32/64 Wx,Vx (66),(evo) | vmovdqu Wx,Vx (F3) | vmovdqu32/64 Wx,Vx (F3),(evo) | vmovdqu8/16 Wx,Vx (F2),(ev) # 0x0f 0x80-0x8f # Note: "forced64" is Intel CPU behavior (see comment about CALL insn). -80: JO Jz (f64) (!REX2) -81: JNO Jz (f64) (!REX2) -82: JB/JC/JNAE Jz (f64) (!REX2) -83: JAE/JNB/JNC Jz (f64) (!REX2) -84: JE/JZ Jz (f64) (!REX2) -85: JNE/JNZ Jz (f64) (!REX2) -86: JBE/JNA Jz (f64) (!REX2) -87: JA/JNBE Jz (f64) (!REX2) -88: JS Jz (f64) (!REX2) -89: JNS Jz (f64) (!REX2) -8a: JP/JPE Jz (f64) (!REX2) -8b: JNP/JPO Jz (f64) (!REX2) -8c: JL/JNGE Jz (f64) (!REX2) -8d: JNL/JGE Jz (f64) (!REX2) -8e: JLE/JNG Jz (f64) (!REX2) -8f: JNLE/JG Jz (f64) (!REX2) +80: JO Jz (f64),(!REX2) +81: JNO Jz (f64),(!REX2) +82: JB/JC/JNAE Jz (f64),(!REX2) +83: JAE/JNB/JNC Jz (f64),(!REX2) +84: JE/JZ Jz (f64),(!REX2) +85: JNE/JNZ Jz (f64),(!REX2) +86: JBE/JNA Jz (f64),(!REX2) +87: JA/JNBE Jz (f64),(!REX2) +88: JS Jz (f64),(!REX2) +89: JNS Jz (f64),(!REX2) +8a: JP/JPE Jz (f64),(!REX2) +8b: JNP/JPO Jz (f64),(!REX2) +8c: JL/JNGE Jz (f64),(!REX2) +8d: JNL/JGE Jz (f64),(!REX2) +8e: JLE/JNG Jz (f64),(!REX2) +8f: JNLE/JG Jz (f64),(!REX2) # 0x0f 0x90-0x9f 90: SETO Eb | kmovw/q Vk,Wk | kmovb/d Vk,Wk (66) 91: SETNO Eb | kmovw/q Mv,Vk | kmovb/d Mv,Vk (66) -- GitLab From 5b814cde622b24578baf360f1674c3115c06ce8d Mon Sep 17 00:00:00 2001 From: Yu Kuai Date: Tue, 6 May 2025 14:17:55 +0800 Subject: [PATCH 0725/2211] brd: fix aligned_sector from brd_do_discard() [ Upstream commit d4099f8893b057ad7e8d61df76bdeaf807ebd679 ] The calculation is just wrong, fix it by round_up(). Fixes: 9ead7efc6f3f ("brd: implement discard support") Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Link: https://lore.kernel.org/r/20250506061756.2970934-3-yukuai1@huaweicloud.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/block/brd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 292f127cae0ab..9549cd71e083b 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -224,7 +224,7 @@ out: static void brd_do_discard(struct brd_device *brd, sector_t sector, u32 size) { - sector_t aligned_sector = (sector + PAGE_SECTORS) & ~PAGE_SECTORS; + sector_t aligned_sector = round_up(sector, PAGE_SECTORS); struct page *page; size -= (aligned_sector - sector) * SECTOR_SIZE; -- GitLab From 48e11bcee974cdf8b4ce96904c0a6e3fb4d93f04 Mon Sep 17 00:00:00 2001 From: Yu Kuai Date: Tue, 6 May 2025 14:17:56 +0800 Subject: [PATCH 0726/2211] brd: fix discard end sector [ Upstream commit a26a339a654b9403f0ee1004f1db4c2b2a355460 ] brd_do_discard() just aligned start sector to page, this can only work if the discard size if at least one page. For example: blkdiscard /dev/ram0 -o 5120 -l 1024 In this case, size = (1024 - (8192 - 5120)), which is a huge value. Fix the problem by round_down() the end sector. Fixes: 9ead7efc6f3f ("brd: implement discard support") Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Link: https://lore.kernel.org/r/20250506061756.2970934-4-yukuai1@huaweicloud.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/block/brd.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 9549cd71e083b..02fa8106ef549 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -225,18 +225,21 @@ out: static void brd_do_discard(struct brd_device *brd, sector_t sector, u32 size) { sector_t aligned_sector = round_up(sector, PAGE_SECTORS); + sector_t aligned_end = round_down( + sector + (size >> SECTOR_SHIFT), PAGE_SECTORS); struct page *page; - size -= (aligned_sector - sector) * SECTOR_SIZE; + if (aligned_end <= aligned_sector) + return; + xa_lock(&brd->brd_pages); - while (size >= PAGE_SIZE && aligned_sector < rd_size * 2) { + while (aligned_sector < aligned_end && aligned_sector < rd_size * 2) { page = __xa_erase(&brd->brd_pages, aligned_sector >> PAGE_SECTORS_SHIFT); if (page) { __free_page(page); brd->brd_nr_pages--; } aligned_sector += PAGE_SECTORS; - size -= PAGE_SIZE; } xa_unlock(&brd->brd_pages); } -- GitLab From bf3cbf2805b4a3ad704485de7c2b599aa8be6956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=ADcolas=20F=2E=20R=2E=20A=2E=20Prado?= Date: Wed, 30 Apr 2025 10:55:49 -0400 Subject: [PATCH 0727/2211] kselftest: cpufreq: Get rid of double suspend in rtcwake case MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 23b88515a318680337f21d0a2fceee8038ccffc8 ] Commit 0b631ed3ce92 ("kselftest: cpufreq: Add RTC wakeup alarm") added support for automatic wakeup in the suspend routine of the cpufreq kselftest by using rtcwake, however it left the manual power state change in the common path. The end result is that when running the cpufreq kselftest with '-t suspend_rtc' or '-t hibernate_rtc', the system will go to sleep and be woken up by the RTC, but then immediately go to sleep again with no wakeup programmed, so it will sleep forever in an automated testing setup. Fix this by moving the manual power state change so that it only happens when not using rtcwake. Link: https://lore.kernel.org/r/20250430-ksft-cpufreq-suspend-rtc-double-fix-v1-1-dc17a729c5a7@collabora.com Fixes: 0b631ed3ce92 ("kselftest: cpufreq: Add RTC wakeup alarm") Signed-off-by: Nícolas F. R. A. Prado Signed-off-by: Shuah Khan Signed-off-by: Sasha Levin --- tools/testing/selftests/cpufreq/cpufreq.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/cpufreq/cpufreq.sh b/tools/testing/selftests/cpufreq/cpufreq.sh index e350c521b4675..3aad9db921b53 100755 --- a/tools/testing/selftests/cpufreq/cpufreq.sh +++ b/tools/testing/selftests/cpufreq/cpufreq.sh @@ -244,9 +244,10 @@ do_suspend() printf "Failed to suspend using RTC wake alarm\n" return 1 fi + else + echo $filename > $SYSFS/power/state fi - echo $filename > $SYSFS/power/state printf "Came out of $1\n" printf "Do basic tests after finishing $1 to verify cpufreq state\n\n" -- GitLab From 7894694b5d5b2ecfd7fb081d6f60b9e169ab4d13 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Sat, 10 May 2025 18:41:31 +0800 Subject: [PATCH 0728/2211] crypto: marvell/cesa - Handle zero-length skcipher requests [ Upstream commit 8a4e047c6cc07676f637608a9dd675349b5de0a7 ] Do not access random memory for zero-length skcipher requests. Just return 0. Fixes: f63601fd616a ("crypto: marvell/cesa - add a new driver for Marvell's CESA") Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- drivers/crypto/marvell/cesa/cipher.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/crypto/marvell/cesa/cipher.c b/drivers/crypto/marvell/cesa/cipher.c index 0f37dfd42d850..3876e3ce822f4 100644 --- a/drivers/crypto/marvell/cesa/cipher.c +++ b/drivers/crypto/marvell/cesa/cipher.c @@ -459,6 +459,9 @@ static int mv_cesa_skcipher_queue_req(struct skcipher_request *req, struct mv_cesa_skcipher_req *creq = skcipher_request_ctx(req); struct mv_cesa_engine *engine; + if (!req->cryptlen) + return 0; + ret = mv_cesa_skcipher_req_init(req, tmpl); if (ret) return ret; -- GitLab From 47810c61475c3c8ae5ce6db3ca671184d1072fdd Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Sat, 10 May 2025 18:43:33 +0800 Subject: [PATCH 0729/2211] crypto: marvell/cesa - Avoid empty transfer descriptor [ Upstream commit 1bafd82d9a40cf09c6c40f1c09cc35b7050b1a9f ] The user may set req->src even if req->nbytes == 0. If there is no data to hash from req->src, do not generate an empty TDMA descriptor. Fixes: db509a45339f ("crypto: marvell/cesa - add TDMA support") Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- drivers/crypto/marvell/cesa/hash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/crypto/marvell/cesa/hash.c b/drivers/crypto/marvell/cesa/hash.c index f150861ceaf69..6815eddc90681 100644 --- a/drivers/crypto/marvell/cesa/hash.c +++ b/drivers/crypto/marvell/cesa/hash.c @@ -663,7 +663,7 @@ static int mv_cesa_ahash_dma_req_init(struct ahash_request *req) if (ret) goto err_free_tdma; - if (iter.src.sg) { + if (iter.base.len > iter.src.op_offset) { /* * Add all the new data, inserting an operation block and * launch command between each full SRAM block-worth of -- GitLab From 9cfca45aecc965d5cd86ced08c644aaa6588c9d0 Mon Sep 17 00:00:00 2001 From: Hongbo Li Date: Wed, 7 May 2025 09:40:15 +0000 Subject: [PATCH 0730/2211] erofs: fix file handle encoding for 64-bit NIDs [ Upstream commit 510de8363f2c3d8e67fa9dfb2366e821382036e0 ] EROFS uses NID to indicate the on-disk inode offset, which can exceed 32 bits. However, the default encode_fh uses the ino32, thus it doesn't work if the image is larger than 128GiB. Let's introduce our own helpers to encode file handles. It's easy to reproduce: 1. prepare an erofs image with nid bigger than U32_MAX 2. mount -t erofs foo.img /mnt/erofs 3. set exportfs with configuration: /mnt/erofs *(rw,sync, no_root_squash) 4. mount -t nfs $IP:/mnt/erofs /mnt/nfs 5. md5sum /mnt/nfs/foo # foo is the file which nid bigger than U32_MAX. # you will get ESTALE error. In the case of overlayfs, the underlying filesystem's file handle is encoded in ovl_fb.fid, which is similar to NFS's case. If the NID of file is larger than U32_MAX, the overlay will get -ESTALE error when calls exportfs_decode_fh. Fixes: 3e917cc305c6 ("erofs: make filesystem exportable") Signed-off-by: Hongbo Li Reviewed-by: Gao Xiang Link: https://lore.kernel.org/r/20250507094015.14007-1-lihongbo22@huawei.com Signed-off-by: Gao Xiang Signed-off-by: Sasha Levin --- fs/erofs/super.c | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/fs/erofs/super.c b/fs/erofs/super.c index 3421448fef0e3..1143e1913f25b 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -537,24 +537,52 @@ static int erofs_fc_parse_param(struct fs_context *fc, return 0; } -static struct inode *erofs_nfs_get_inode(struct super_block *sb, - u64 ino, u32 generation) +static int erofs_encode_fh(struct inode *inode, u32 *fh, int *max_len, + struct inode *parent) { - return erofs_iget(sb, ino); + erofs_nid_t nid = EROFS_I(inode)->nid; + int len = parent ? 6 : 3; + + if (*max_len < len) { + *max_len = len; + return FILEID_INVALID; + } + + fh[0] = (u32)(nid >> 32); + fh[1] = (u32)(nid & 0xffffffff); + fh[2] = inode->i_generation; + + if (parent) { + nid = EROFS_I(parent)->nid; + + fh[3] = (u32)(nid >> 32); + fh[4] = (u32)(nid & 0xffffffff); + fh[5] = parent->i_generation; + } + + *max_len = len; + return parent ? FILEID_INO64_GEN_PARENT : FILEID_INO64_GEN; } static struct dentry *erofs_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, int fh_type) { - return generic_fh_to_dentry(sb, fid, fh_len, fh_type, - erofs_nfs_get_inode); + if ((fh_type != FILEID_INO64_GEN && + fh_type != FILEID_INO64_GEN_PARENT) || fh_len < 3) + return NULL; + + return d_obtain_alias(erofs_iget(sb, + ((u64)fid->raw[0] << 32) | fid->raw[1])); } static struct dentry *erofs_fh_to_parent(struct super_block *sb, struct fid *fid, int fh_len, int fh_type) { - return generic_fh_to_parent(sb, fid, fh_len, fh_type, - erofs_nfs_get_inode); + if (fh_type != FILEID_INO64_GEN_PARENT || fh_len < 6) + return NULL; + + return d_obtain_alias(erofs_iget(sb, + ((u64)fid->raw[3] << 32) | fid->raw[4])); } static struct dentry *erofs_get_parent(struct dentry *child) @@ -570,7 +598,7 @@ static struct dentry *erofs_get_parent(struct dentry *child) } static const struct export_operations erofs_export_ops = { - .encode_fh = generic_encode_ino32_fh, + .encode_fh = erofs_encode_fh, .fh_to_dentry = erofs_fh_to_dentry, .fh_to_parent = erofs_fh_to_parent, .get_parent = erofs_get_parent, -- GitLab From 65115472f741ca000d7ea4a5922214f93cd1516e Mon Sep 17 00:00:00 2001 From: Sheng Yong Date: Thu, 15 May 2025 09:48:37 +0800 Subject: [PATCH 0731/2211] erofs: avoid using multiple devices with different type [ Upstream commit 9748f2f54f66743ac77275c34886a9f890e18409 ] For multiple devices, both primary and extra devices should be the same type. `erofs_init_device` has already guaranteed that if the primary is a file-backed device, extra devices should also be regular files. However, if the primary is a block device while the extra device is a file-backed device, `erofs_init_device` will get an ENOTBLK, which is not treated as an error in `erofs_fc_get_tree`, and that leads to an UAF: erofs_fc_get_tree get_tree_bdev_flags(erofs_fc_fill_super) erofs_read_superblock erofs_init_device // sbi->dif0 is not inited yet, // return -ENOTBLK deactivate_locked_super free(sbi) if (err is -ENOTBLK) sbi->dif0.file = filp_open() // sbi UAF So if -ENOTBLK is hitted in `erofs_init_device`, it means the primary device must be a block device, and the extra device is not a block device. The error can be converted to -EINVAL. Fixes: fb176750266a ("erofs: add file-backed mount support") Signed-off-by: Sheng Yong Reviewed-by: Gao Xiang Reviewed-by: Hongbo Li Link: https://lore.kernel.org/r/20250515014837.3315886-1-shengyong1@xiaomi.com Signed-off-by: Gao Xiang Signed-off-by: Sasha Levin --- fs/erofs/super.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/erofs/super.c b/fs/erofs/super.c index 1143e1913f25b..5fcdab6145176 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -188,8 +188,11 @@ static int erofs_init_device(struct erofs_buf *buf, struct super_block *sb, filp_open(dif->path, O_RDONLY | O_LARGEFILE, 0) : bdev_file_open_by_path(dif->path, BLK_OPEN_READ, sb->s_type, NULL); - if (IS_ERR(file)) + if (IS_ERR(file)) { + if (file == ERR_PTR(-ENOTBLK)) + return -EINVAL; return PTR_ERR(file); + } if (!erofs_is_fileio_mode(sbi)) { dif->dax_dev = fs_dax_get_by_bdev(file_bdev(file), -- GitLab From 5539216f734b231abcb6f9339eb6ab81b101253f Mon Sep 17 00:00:00 2001 From: Gaurav Batra Date: Mon, 12 May 2025 17:46:53 -0500 Subject: [PATCH 0732/2211] powerpc/pseries/iommu: Fix kmemleak in TCE table userspace view [ Upstream commit d36e3f11fe8b55b801bdbe84ad51f612b1bd84da ] When a device is opened by a userspace driver, via VFIO interface, DMA window is created. This DMA window has TCE Table and a corresponding data for userview of TCE table. When the userspace driver closes the device, all the above infrastructure is free'ed and the device control given back to kernel. Both DMA window and TCE table is getting free'ed. But due to a code bug, userview of the TCE table is not getting free'ed. This is resulting in a memory leak. Befow is the information from KMEMLEAK unreferenced object 0xc008000022af0000 (size 16777216): comm "senlib_unit_tes", pid 9346, jiffies 4294983174 hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace (crc 0): kmemleak_vmalloc+0xc8/0x1a0 __vmalloc_node_range+0x284/0x340 vzalloc+0x58/0x70 spapr_tce_create_table+0x4b0/0x8d0 tce_iommu_create_table+0xcc/0x170 [vfio_iommu_spapr_tce] tce_iommu_create_window+0x144/0x2f0 [vfio_iommu_spapr_tce] tce_iommu_ioctl.part.0+0x59c/0xc90 [vfio_iommu_spapr_tce] vfio_fops_unl_ioctl+0x88/0x280 [vfio] sys_ioctl+0xf4/0x160 system_call_exception+0x164/0x310 system_call_vectored_common+0xe8/0x278 unreferenced object 0xc008000023b00000 (size 4194304): comm "senlib_unit_tes", pid 9351, jiffies 4294984116 hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace (crc 0): kmemleak_vmalloc+0xc8/0x1a0 __vmalloc_node_range+0x284/0x340 vzalloc+0x58/0x70 spapr_tce_create_table+0x4b0/0x8d0 tce_iommu_create_table+0xcc/0x170 [vfio_iommu_spapr_tce] tce_iommu_create_window+0x144/0x2f0 [vfio_iommu_spapr_tce] tce_iommu_create_default_window+0x88/0x120 [vfio_iommu_spapr_tce] tce_iommu_ioctl.part.0+0x57c/0xc90 [vfio_iommu_spapr_tce] vfio_fops_unl_ioctl+0x88/0x280 [vfio] sys_ioctl+0xf4/0x160 system_call_exception+0x164/0x310 system_call_vectored_common+0xe8/0x278 Fixes: f431a8cde7f1 ("powerpc/iommu: Reimplement the iommu_table_group_ops for pSeries") Signed-off-by: Gaurav Batra Reviewed-by: Nilay Shroff Reviewed-by: Ritesh Harjani (IBM) Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/20250512224653.35697-1-gbatra@linux.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/platforms/pseries/iommu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index d6ebc19fb99c5..eec333dd2e598 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c @@ -197,7 +197,7 @@ static void tce_iommu_userspace_view_free(struct iommu_table *tbl) static void tce_free_pSeries(struct iommu_table *tbl) { - if (!tbl->it_userspace) + if (tbl->it_userspace) tce_iommu_userspace_view_free(tbl); } -- GitLab From 5bd799d2ac6e5343243f21c54945dad69e49e6ea Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Thu, 1 May 2025 08:37:54 +0930 Subject: [PATCH 0733/2211] btrfs: scrub: update device stats when an error is detected [ Upstream commit ec1f3a207cdf314eae4d4ae145f1ffdb829f0652 ] [BUG] Since the migration to the new scrub_stripe interface, scrub no longer updates the device stats when hitting an error, no matter if it's a read or checksum mismatch error. E.g: BTRFS info (device dm-2): scrub: started on devid 1 BTRFS error (device dm-2): unable to fixup (regular) error at logical 13631488 on dev /dev/mapper/test-scratch1 physical 13631488 BTRFS warning (device dm-2): checksum error at logical 13631488 on dev /dev/mapper/test-scratch1, physical 13631488, root 5, inode 257, offset 0, length 4096, links 1 (path: file) BTRFS error (device dm-2): unable to fixup (regular) error at logical 13631488 on dev /dev/mapper/test-scratch1 physical 13631488 BTRFS warning (device dm-2): checksum error at logical 13631488 on dev /dev/mapper/test-scratch1, physical 13631488, root 5, inode 257, offset 0, length 4096, links 1 (path: file) BTRFS info (device dm-2): scrub: finished on devid 1 with status: 0 Note there is no line showing the device stats error update. [CAUSE] In the migration to the new scrub_stripe interface, we no longer call btrfs_dev_stat_inc_and_print(). [FIX] - Introduce a new bitmap for metadata generation errors * A new bitmap @meta_gen_error_bitmap is introduced to record which blocks have metadata generation mismatch errors. * A new counter for that bitmap @init_nr_meta_gen_errors, is also introduced to store the number of generation mismatch errors that are found during the initial read. This is for the error reporting at scrub_stripe_report_errors(). * New dedicated error message for unrepaired generation mismatches * Update @meta_gen_error_bitmap if a transid mismatch is hit - Add btrfs_dev_stat_inc_and_print() calls to the following call sites * scrub_stripe_report_errors() * scrub_write_endio() This is only for the write errors. This means there is a minor behavior change: - The timing of device stats error message Since we concentrate the error messages at scrub_stripe_report_errors(), the device stats error messages will all show up in one go, after the detailed scrub error messages: BTRFS error (device dm-2): unable to fixup (regular) error at logical 13631488 on dev /dev/mapper/test-scratch1 physical 13631488 BTRFS warning (device dm-2): checksum error at logical 13631488 on dev /dev/mapper/test-scratch1, physical 13631488, root 5, inode 257, offset 0, length 4096, links 1 (path: file) BTRFS error (device dm-2): unable to fixup (regular) error at logical 13631488 on dev /dev/mapper/test-scratch1 physical 13631488 BTRFS warning (device dm-2): checksum error at logical 13631488 on dev /dev/mapper/test-scratch1, physical 13631488, root 5, inode 257, offset 0, length 4096, links 1 (path: file) BTRFS error (device dm-2): bdev /dev/mapper/test-scratch1 errs: wr 0, rd 0, flush 0, corrupt 1, gen 0 BTRFS error (device dm-2): bdev /dev/mapper/test-scratch1 errs: wr 0, rd 0, flush 0, corrupt 2, gen 0 Fixes: e02ee89baa66 ("btrfs: scrub: switch scrub_simple_mirror() to scrub_stripe infrastructure") Reviewed-by: Filipe Manana Signed-off-by: Qu Wenruo Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/scrub.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index d8fcc3eb85c88..51eb41d18c3e5 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -153,12 +153,14 @@ struct scrub_stripe { unsigned int init_nr_io_errors; unsigned int init_nr_csum_errors; unsigned int init_nr_meta_errors; + unsigned int init_nr_meta_gen_errors; /* * The following error bitmaps are all for the current status. * Every time we submit a new read, these bitmaps may be updated. * - * error_bitmap = io_error_bitmap | csum_error_bitmap | meta_error_bitmap; + * error_bitmap = io_error_bitmap | csum_error_bitmap | + * meta_error_bitmap | meta_generation_bitmap; * * IO and csum errors can happen for both metadata and data. */ @@ -166,6 +168,7 @@ struct scrub_stripe { unsigned long io_error_bitmap; unsigned long csum_error_bitmap; unsigned long meta_error_bitmap; + unsigned long meta_gen_error_bitmap; /* For writeback (repair or replace) error reporting. */ unsigned long write_error_bitmap; @@ -672,7 +675,7 @@ static void scrub_verify_one_metadata(struct scrub_stripe *stripe, int sector_nr } if (stripe->sectors[sector_nr].generation != btrfs_stack_header_generation(header)) { - bitmap_set(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); + bitmap_set(&stripe->meta_gen_error_bitmap, sector_nr, sectors_per_tree); bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); btrfs_warn_rl(fs_info, "tree block %llu mirror %u has bad generation, has %llu want %llu", @@ -684,6 +687,7 @@ static void scrub_verify_one_metadata(struct scrub_stripe *stripe, int sector_nr bitmap_clear(&stripe->error_bitmap, sector_nr, sectors_per_tree); bitmap_clear(&stripe->csum_error_bitmap, sector_nr, sectors_per_tree); bitmap_clear(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); + bitmap_clear(&stripe->meta_gen_error_bitmap, sector_nr, sectors_per_tree); } static void scrub_verify_one_sector(struct scrub_stripe *stripe, int sector_nr) @@ -972,8 +976,22 @@ skip: if (__ratelimit(&rs) && dev) scrub_print_common_warning("header error", dev, false, stripe->logical, physical); + if (test_bit(sector_nr, &stripe->meta_gen_error_bitmap)) + if (__ratelimit(&rs) && dev) + scrub_print_common_warning("generation error", dev, false, + stripe->logical, physical); } + /* Update the device stats. */ + for (int i = 0; i < stripe->init_nr_io_errors; i++) + btrfs_dev_stat_inc_and_print(stripe->dev, BTRFS_DEV_STAT_READ_ERRS); + for (int i = 0; i < stripe->init_nr_csum_errors; i++) + btrfs_dev_stat_inc_and_print(stripe->dev, BTRFS_DEV_STAT_CORRUPTION_ERRS); + /* Generation mismatch error is based on each metadata, not each block. */ + for (int i = 0; i < stripe->init_nr_meta_gen_errors; + i += (fs_info->nodesize >> fs_info->sectorsize_bits)) + btrfs_dev_stat_inc_and_print(stripe->dev, BTRFS_DEV_STAT_GENERATION_ERRS); + spin_lock(&sctx->stat_lock); sctx->stat.data_extents_scrubbed += stripe->nr_data_extents; sctx->stat.tree_extents_scrubbed += stripe->nr_meta_extents; @@ -982,7 +1000,8 @@ skip: sctx->stat.no_csum += nr_nodatacsum_sectors; sctx->stat.read_errors += stripe->init_nr_io_errors; sctx->stat.csum_errors += stripe->init_nr_csum_errors; - sctx->stat.verify_errors += stripe->init_nr_meta_errors; + sctx->stat.verify_errors += stripe->init_nr_meta_errors + + stripe->init_nr_meta_gen_errors; sctx->stat.uncorrectable_errors += bitmap_weight(&stripe->error_bitmap, stripe->nr_sectors); sctx->stat.corrected_errors += nr_repaired_sectors; @@ -1028,6 +1047,8 @@ static void scrub_stripe_read_repair_worker(struct work_struct *work) stripe->nr_sectors); stripe->init_nr_meta_errors = bitmap_weight(&stripe->meta_error_bitmap, stripe->nr_sectors); + stripe->init_nr_meta_gen_errors = bitmap_weight(&stripe->meta_gen_error_bitmap, + stripe->nr_sectors); if (bitmap_empty(&stripe->init_error_bitmap, stripe->nr_sectors)) goto out; @@ -1142,6 +1163,9 @@ static void scrub_write_endio(struct btrfs_bio *bbio) bitmap_set(&stripe->write_error_bitmap, sector_nr, bio_size >> fs_info->sectorsize_bits); spin_unlock_irqrestore(&stripe->write_error_lock, flags); + for (int i = 0; i < (bio_size >> fs_info->sectorsize_bits); i++) + btrfs_dev_stat_inc_and_print(stripe->dev, + BTRFS_DEV_STAT_WRITE_ERRS); } bio_put(&bbio->bio); @@ -1508,10 +1532,12 @@ static void scrub_stripe_reset_bitmaps(struct scrub_stripe *stripe) stripe->init_nr_io_errors = 0; stripe->init_nr_csum_errors = 0; stripe->init_nr_meta_errors = 0; + stripe->init_nr_meta_gen_errors = 0; stripe->error_bitmap = 0; stripe->io_error_bitmap = 0; stripe->csum_error_bitmap = 0; stripe->meta_error_bitmap = 0; + stripe->meta_gen_error_bitmap = 0; } /* -- GitLab From 7f45183ceab812f79e3e94b54afa8e9eee83fd71 Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Mon, 5 May 2025 18:56:18 +0930 Subject: [PATCH 0734/2211] btrfs: scrub: fix a wrong error type when metadata bytenr mismatches [ Upstream commit f2c19541e421b3235efc515dad88b581f00592ae ] When the bytenr doesn't match for a metadata tree block, we will report it as an csum error, which is incorrect and should be reported as a metadata error instead. Fixes: a3ddbaebc7c9 ("btrfs: scrub: introduce a helper to verify one metadata block") Signed-off-by: Qu Wenruo Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/scrub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 51eb41d18c3e5..3fcc7c092c5ec 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -619,7 +619,7 @@ static void scrub_verify_one_metadata(struct scrub_stripe *stripe, int sector_nr memcpy(on_disk_csum, header->csum, fs_info->csum_size); if (logical != btrfs_stack_header_bytenr(header)) { - bitmap_set(&stripe->csum_error_bitmap, sector_nr, sectors_per_tree); + bitmap_set(&stripe->meta_error_bitmap, sector_nr, sectors_per_tree); bitmap_set(&stripe->error_bitmap, sector_nr, sectors_per_tree); btrfs_warn_rl(fs_info, "tree block %llu mirror %u has bad bytenr, has %llu want %llu", -- GitLab From 60f95458154b98b6dcd92a7af49610e55f0af8e5 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Fri, 9 May 2025 17:08:50 +0100 Subject: [PATCH 0735/2211] btrfs: fix invalid data space release when truncating block in NOCOW mode [ Upstream commit d3914d6030aa6be2993dfc223d096ff93018c236 ] If when truncating a block we fail to reserve data space and then we proceed anyway because we can do a NOCOW write, if we later get an error when trying to get the folio from the inode's mapping, we end up releasing data space that we haven't reserved, screwing up the bytes_may_use counter from the data space_info, eventually resulting in an underflow when all other reservations done by other tasks are released, if any, or right away if there are no other reservations at the moment. This is because when we get an error when trying to grab the block's folio we call btrfs_delalloc_release_space(), which releases metadata (which we have reserved) and data (which we haven't reserved). Fix this by calling btrfs_delalloc_release_space() only if we did reserve data space, that is, if we aren't falling back to NOCOW, meaning the local variable @only_release_metadata has a false value, otherwise release only metadata by calling btrfs_delalloc_release_metadata(). Fixes: 6d4572a9d71d ("btrfs: allow btrfs_truncate_block() to fallback to nocow for data space reservation") Reviewed-by: Qu Wenruo Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/inode.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 9ce1270addb04..1ab5b0c1b9b76 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4857,8 +4857,11 @@ again: folio = __filemap_get_folio(mapping, index, FGP_LOCK | FGP_ACCESSED | FGP_CREAT, mask); if (IS_ERR(folio)) { - btrfs_delalloc_release_space(inode, data_reserved, block_start, - blocksize, true); + if (only_release_metadata) + btrfs_delalloc_release_metadata(inode, blocksize, true); + else + btrfs_delalloc_release_space(inode, data_reserved, + block_start, blocksize, true); btrfs_delalloc_release_extents(inode, blocksize); ret = -ENOMEM; goto out; -- GitLab From 58beaa1aee559c5cb9f1cd096207ef1a29be0bd7 Mon Sep 17 00:00:00 2001 From: Yongliang Gao Date: Sun, 16 Feb 2025 16:41:09 +0800 Subject: [PATCH 0736/2211] rcu/cpu_stall_cputime: fix the hardirq count for x86 architecture [ Upstream commit da6b85598af30e9fec34d82882d7e1e39f3da769 ] When counting the number of hardirqs in the x86 architecture, it is essential to add arch_irq_stat_cpu to ensure accuracy. For example, a CPU loop within the rcu_read_lock function. Before: [ 70.910184] rcu: INFO: rcu_preempt self-detected stall on CPU [ 70.910436] rcu: 3-....: (4999 ticks this GP) idle=*** [ 70.910711] rcu: hardirqs softirqs csw/system [ 70.910870] rcu: number: 0 657 0 [ 70.911024] rcu: cputime: 0 0 2498 ==> 2498(ms) [ 70.911278] rcu: (t=5001 jiffies g=3677 q=29 ncpus=8) After: [ 68.046132] rcu: INFO: rcu_preempt self-detected stall on CPU [ 68.046354] rcu: 2-....: (4999 ticks this GP) idle=*** [ 68.046628] rcu: hardirqs softirqs csw/system [ 68.046793] rcu: number: 2498 663 0 [ 68.046951] rcu: cputime: 0 0 2496 ==> 2496(ms) [ 68.047244] rcu: (t=5000 jiffies g=3825 q=4 ncpus=8) Fixes: be42f00b73a0 ("rcu: Add RCU stall diagnosis information") Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202501090842.SfI6QPGS-lkp@intel.com/ Signed-off-by: Yongliang Gao Reviewed-by: Neeraj Upadhyay Link: https://lore.kernel.org/r/20250216084109.3109837-1-leonylgao@gmail.com Signed-off-by: Boqun Feng Signed-off-by: Joel Fernandes Signed-off-by: Sasha Levin --- kernel/rcu/tree.c | 10 +++++++--- kernel/rcu/tree.h | 2 +- kernel/rcu/tree_stall.h | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 4ed8632195217..cefa831c8cb32 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -802,6 +802,10 @@ static int rcu_watching_snap_save(struct rcu_data *rdp) return 0; } +#ifndef arch_irq_stat_cpu +#define arch_irq_stat_cpu(cpu) 0 +#endif + /* * Returns positive if the specified CPU has passed through a quiescent state * by virtue of being in or having passed through an dynticks idle state since @@ -937,9 +941,9 @@ static int rcu_watching_snap_recheck(struct rcu_data *rdp) rsrp->cputime_irq = kcpustat_field(kcsp, CPUTIME_IRQ, cpu); rsrp->cputime_softirq = kcpustat_field(kcsp, CPUTIME_SOFTIRQ, cpu); rsrp->cputime_system = kcpustat_field(kcsp, CPUTIME_SYSTEM, cpu); - rsrp->nr_hardirqs = kstat_cpu_irqs_sum(rdp->cpu); - rsrp->nr_softirqs = kstat_cpu_softirqs_sum(rdp->cpu); - rsrp->nr_csw = nr_context_switches_cpu(rdp->cpu); + rsrp->nr_hardirqs = kstat_cpu_irqs_sum(cpu) + arch_irq_stat_cpu(cpu); + rsrp->nr_softirqs = kstat_cpu_softirqs_sum(cpu); + rsrp->nr_csw = nr_context_switches_cpu(cpu); rsrp->jiffies = jiffies; rsrp->gp_seq = rdp->gp_seq; } diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h index a9a811d9d7a37..1bba2225e7448 100644 --- a/kernel/rcu/tree.h +++ b/kernel/rcu/tree.h @@ -168,7 +168,7 @@ struct rcu_snap_record { u64 cputime_irq; /* Accumulated cputime of hard irqs */ u64 cputime_softirq;/* Accumulated cputime of soft irqs */ u64 cputime_system; /* Accumulated cputime of kernel tasks */ - unsigned long nr_hardirqs; /* Accumulated number of hard irqs */ + u64 nr_hardirqs; /* Accumulated number of hard irqs */ unsigned int nr_softirqs; /* Accumulated number of soft irqs */ unsigned long long nr_csw; /* Accumulated number of task switches */ unsigned long jiffies; /* Track jiffies value */ diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h index 4432db6d0b99b..4d524a2212a8d 100644 --- a/kernel/rcu/tree_stall.h +++ b/kernel/rcu/tree_stall.h @@ -457,8 +457,8 @@ static void print_cpu_stat_info(int cpu) rsr.cputime_system = kcpustat_field(kcsp, CPUTIME_SYSTEM, cpu); pr_err("\t hardirqs softirqs csw/system\n"); - pr_err("\t number: %8ld %10d %12lld\n", - kstat_cpu_irqs_sum(cpu) - rsrp->nr_hardirqs, + pr_err("\t number: %8lld %10d %12lld\n", + kstat_cpu_irqs_sum(cpu) + arch_irq_stat_cpu(cpu) - rsrp->nr_hardirqs, kstat_cpu_softirqs_sum(cpu) - rsrp->nr_softirqs, nr_context_switches_cpu(cpu) - rsrp->nr_csw); pr_err("\tcputime: %8lld %10lld %12lld ==> %d(ms)\n", -- GitLab From b7c09d213119e24426013fd8925a7bd9a96f8c8e Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Thu, 15 May 2025 16:28:08 +0800 Subject: [PATCH 0737/2211] crypto: lrw - Only add ecb if it is not already there [ Upstream commit 3d73909bddc2ebb3224a8bc2e5ce00e9df70c15d ] Only add ecb to the cipher name if it isn't already ecb. Also use memcmp instead of strncmp since these strings are all stored in an array of length CRYPTO_MAX_ALG_NAME. Fixes: 700cb3f5fe75 ("crypto: lrw - Convert to skcipher") Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-lkp/202505151503.d8a6cf10-lkp@intel.com Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- crypto/lrw.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/lrw.c b/crypto/lrw.c index e216fbf2b7866..4bede0031c63c 100644 --- a/crypto/lrw.c +++ b/crypto/lrw.c @@ -322,7 +322,7 @@ static int lrw_create(struct crypto_template *tmpl, struct rtattr **tb) err = crypto_grab_skcipher(spawn, skcipher_crypto_instance(inst), cipher_name, 0, mask); - if (err == -ENOENT) { + if (err == -ENOENT && memcmp(cipher_name, "ecb(", 4)) { err = -ENAMETOOLONG; if (snprintf(ecb_name, CRYPTO_MAX_ALG_NAME, "ecb(%s)", cipher_name) >= CRYPTO_MAX_ALG_NAME) @@ -356,7 +356,7 @@ static int lrw_create(struct crypto_template *tmpl, struct rtattr **tb) /* Alas we screwed up the naming so we have to mangle the * cipher name. */ - if (!strncmp(cipher_name, "ecb(", 4)) { + if (!memcmp(cipher_name, "ecb(", 4)) { int len; len = strscpy(ecb_name, cipher_name + 4, sizeof(ecb_name)); -- GitLab From 5ed92ad1b7d12bbffa6fd1cac7ea64d58d211625 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Thu, 15 May 2025 16:34:04 +0800 Subject: [PATCH 0738/2211] crypto: xts - Only add ecb if it is not already there [ Upstream commit 270b6f13454cb7f2f7058c50df64df409c5dcf55 ] Only add ecb to the cipher name if it isn't already ecb. Also use memcmp instead of strncmp since these strings are all stored in an array of length CRYPTO_MAX_ALG_NAME. Fixes: f1c131b45410 ("crypto: xts - Convert to skcipher") Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- crypto/xts.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/xts.c b/crypto/xts.c index 672e1a3f0b0c9..91e391a6ba270 100644 --- a/crypto/xts.c +++ b/crypto/xts.c @@ -363,7 +363,7 @@ static int xts_create(struct crypto_template *tmpl, struct rtattr **tb) err = crypto_grab_skcipher(&ctx->spawn, skcipher_crypto_instance(inst), cipher_name, 0, mask); - if (err == -ENOENT) { + if (err == -ENOENT && memcmp(cipher_name, "ecb(", 4)) { err = -ENAMETOOLONG; if (snprintf(name, CRYPTO_MAX_ALG_NAME, "ecb(%s)", cipher_name) >= CRYPTO_MAX_ALG_NAME) @@ -397,7 +397,7 @@ static int xts_create(struct crypto_template *tmpl, struct rtattr **tb) /* Alas we screwed up the naming so we have to mangle the * cipher name. */ - if (!strncmp(cipher_name, "ecb(", 4)) { + if (!memcmp(cipher_name, "ecb(", 4)) { int len; len = strscpy(name, cipher_name + 4, sizeof(name)); -- GitLab From 53bedcd2d2aa008b8dcb0bc04195e18796fb186e Mon Sep 17 00:00:00 2001 From: Ovidiu Panait Date: Fri, 16 May 2025 15:06:56 +0300 Subject: [PATCH 0739/2211] crypto: sun8i-ce - move fallback ahash_request to the end of the struct [ Upstream commit c822831b426307a6ca426621504d3c7f99765a39 ] 'struct ahash_request' has a flexible array at the end, so it must be the last member in a struct, to avoid overwriting other struct members. Therefore, move 'fallback_req' to the end of the 'sun8i_ce_hash_reqctx' struct. Fixes: 56f6d5aee88d ("crypto: sun8i-ce - support hash algorithms") Signed-off-by: Ovidiu Panait Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h index 3b5c2af013d0d..83df4d7190531 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h @@ -308,8 +308,8 @@ struct sun8i_ce_hash_tfm_ctx { * @flow: the flow to use for this request */ struct sun8i_ce_hash_reqctx { - struct ahash_request fallback_req; int flow; + struct ahash_request fallback_req; // keep at the end }; /* -- GitLab From e9ecaeaf41366a207e72e44f7ecb77a1958d4331 Mon Sep 17 00:00:00 2001 From: Tzung-Bi Shih Date: Tue, 20 May 2025 08:20:49 +0000 Subject: [PATCH 0740/2211] kunit: Fix wrong parameter to kunit_deactivate_static_stub() [ Upstream commit 772e50a76ee664e75581624f512df4e45582605a ] kunit_deactivate_static_stub() accepts real_fn_addr instead of replacement_addr. In the case, it always passes NULL to kunit_deactivate_static_stub(). Fix it. Link: https://lore.kernel.org/r/20250520082050.2254875-1-tzungbi@kernel.org Fixes: e047c5eaa763 ("kunit: Expose 'static stub' API to redirect functions") Signed-off-by: Tzung-Bi Shih Reviewed-by: David Gow Signed-off-by: Shuah Khan Signed-off-by: Sasha Levin --- lib/kunit/static_stub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/kunit/static_stub.c b/lib/kunit/static_stub.c index 92b2cccd5e763..484fd85251b41 100644 --- a/lib/kunit/static_stub.c +++ b/lib/kunit/static_stub.c @@ -96,7 +96,7 @@ void __kunit_activate_static_stub(struct kunit *test, /* If the replacement address is NULL, deactivate the stub. */ if (!replacement_addr) { - kunit_deactivate_static_stub(test, replacement_addr); + kunit_deactivate_static_stub(test, real_fn_addr); return; } -- GitLab From 9c094deb6b13a4d5978e4829d6d50a6ed3d2bf2f Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Mon, 19 May 2025 18:29:38 +0800 Subject: [PATCH 0741/2211] crypto: api - Redo lookup on EEXIST [ Upstream commit 0a3cf32da469ff1df6e016f5f82b439a63d14461 ] When two crypto algorithm lookups occur at the same time with different names for the same algorithm, e.g., ctr(aes-generic) and ctr(aes), they will both be instantiated. However, only one of them can be registered. The second instantiation will fail with EEXIST. Avoid failing the second lookup by making it retry, but only once because there are tricky names such as gcm_base(ctr(aes),ghash) that will always fail, despite triggering instantiation and EEXIST. Reported-by: Ingo Franzki Fixes: 2825982d9d66 ("[CRYPTO] api: Added event notification") Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- crypto/api.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/crypto/api.c b/crypto/api.c index c2c4eb14ef955..5ce54328fef11 100644 --- a/crypto/api.c +++ b/crypto/api.c @@ -220,10 +220,19 @@ again: if (crypto_is_test_larval(larval)) crypto_larval_kill(larval); alg = ERR_PTR(-ETIMEDOUT); - } else if (!alg) { + } else if (!alg || PTR_ERR(alg) == -EEXIST) { + int err = alg ? -EEXIST : -EAGAIN; + + /* + * EEXIST is expected because two probes can be scheduled + * at the same time with one using alg_name and the other + * using driver_name. Do a re-lookup but do not retry in + * case we hit a quirk like gcm_base(ctr(aes),...) which + * will never match. + */ alg = &larval->alg; alg = crypto_alg_lookup(alg->cra_name, type, mask) ?: - ERR_PTR(-EAGAIN); + ERR_PTR(err); } else if (IS_ERR(alg)) ; else if (crypto_is_test_larval(larval) && -- GitLab From 594380c4b51a3df83ab74c1b95cb433cabcee5fc Mon Sep 17 00:00:00 2001 From: Daniil Tatianin Date: Tue, 1 Apr 2025 21:43:11 +0300 Subject: [PATCH 0742/2211] ACPICA: exserial: don't forget to handle FFixedHW opregions for reading [ Upstream commit 0f8af0356a45547683a216e4921006a3c6a6d922 ] The initial commit that introduced support for FFixedHW operation regions did add a special case in the AcpiExReadSerialBus If, but forgot to actually handle it inside the switch, so add the missing case to prevent reads from failing with AE_AML_INVALID_SPACE_ID. Link: https://github.com/acpica/acpica/pull/998 Fixes: ee64b827a9a ("ACPICA: Add support for FFH Opregion special context data") Signed-off-by: Daniil Tatianin Link: https://patch.msgid.link/20250401184312.599962-1-d-tatianin@yandex-team.ru Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/acpica/exserial.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/acpi/acpica/exserial.c b/drivers/acpi/acpica/exserial.c index 5241f4c01c765..89a4ac447a2be 100644 --- a/drivers/acpi/acpica/exserial.c +++ b/drivers/acpi/acpica/exserial.c @@ -201,6 +201,12 @@ acpi_ex_read_serial_bus(union acpi_operand_object *obj_desc, function = ACPI_READ; break; + case ACPI_ADR_SPACE_FIXED_HARDWARE: + + buffer_length = ACPI_FFH_INPUT_BUFFER_SIZE; + function = ACPI_READ; + break; + default: return_ACPI_STATUS(AE_AML_INVALID_SPACE_ID); } -- GitLab From b49ff1c5e935188e4280a4e5addc17247607edab Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Sun, 6 Apr 2025 09:15:08 +1000 Subject: [PATCH 0743/2211] ASoC: tas2764: Enable main IRQs [ Upstream commit dd50f0e38563f15819059c923bf142200453e003 ] IRQ handling was added in commit dae191fb957f ("ASoC: tas2764: Add IRQ handling") however that same commit masks all interrupts coming from the chip. Unmask the "main" interrupts so that we can see and deal with a number of errors including clock, voltage, and current. Fixes: dae191fb957f ("ASoC: tas2764: Add IRQ handling") Reviewed-by: Neal Gompa Signed-off-by: Hector Martin Signed-off-by: James Calligeros Link: https://patch.msgid.link/20250406-apple-codec-changes-v5-4-50a00ec850a3@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/tas2764.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c index 39a7d39536fe6..4326555aac032 100644 --- a/sound/soc/codecs/tas2764.c +++ b/sound/soc/codecs/tas2764.c @@ -540,7 +540,7 @@ static int tas2764_codec_probe(struct snd_soc_component *component) tas2764_reset(tas2764); if (tas2764->irq) { - ret = snd_soc_component_write(tas2764->component, TAS2764_INT_MASK0, 0xff); + ret = snd_soc_component_write(tas2764->component, TAS2764_INT_MASK0, 0x00); if (ret < 0) return ret; -- GitLab From 87dbfe2b392df9621f6e522e5fa6fb8849ca92ab Mon Sep 17 00:00:00 2001 From: Julien Massot Date: Thu, 17 Apr 2025 10:44:33 +0200 Subject: [PATCH 0744/2211] ASoC: mediatek: mt8195: Set ETDM1/2 IN/OUT to COMP_DUMMY() [ Upstream commit 7af317f7faaab09d5a78f24605057d11f5955115 ] ETDM2_IN_BE and ETDM1_OUT_BE are defined as COMP_EMPTY(), in the case the codec dai_name will be null. Avoid a crash if the device tree is not assigning a codec to these links. [ 1.179936] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 [ 1.181065] Mem abort info: [ 1.181420] ESR = 0x0000000096000004 [ 1.181892] EC = 0x25: DABT (current EL), IL = 32 bits [ 1.182576] SET = 0, FnV = 0 [ 1.182964] EA = 0, S1PTW = 0 [ 1.183367] FSC = 0x04: level 0 translation fault [ 1.183983] Data abort info: [ 1.184406] ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000 [ 1.185097] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 [ 1.185766] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 [ 1.186439] [0000000000000000] user address but active_mm is swapper [ 1.187239] Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP [ 1.188029] Modules linked in: [ 1.188420] CPU: 7 UID: 0 PID: 70 Comm: kworker/u32:1 Not tainted 6.14.0-rc4-next-20250226+ #85 [ 1.189515] Hardware name: Radxa NIO 12L (DT) [ 1.190065] Workqueue: events_unbound deferred_probe_work_func [ 1.190808] pstate: 40400009 (nZcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 1.191683] pc : __pi_strcmp+0x24/0x140 [ 1.192170] lr : mt8195_mt6359_soc_card_probe+0x224/0x7b0 [ 1.192854] sp : ffff800083473970 [ 1.193271] x29: ffff800083473a10 x28: 0000000000001008 x27: 0000000000000002 [ 1.194168] x26: ffff800082408960 x25: ffff800082417db0 x24: ffff800082417d88 [ 1.195065] x23: 000000000000001e x22: ffff800082dbf480 x21: ffff800082dc07b8 [ 1.195961] x20: 0000000000000000 x19: 0000000000000013 x18: 00000000ffffffff [ 1.196858] x17: 000000040044ffff x16: 005000f2b5503510 x15: 0000000000000006 [ 1.197755] x14: ffff800082407af0 x13: 6e6f69737265766e x12: 692d6b636f6c6374 [ 1.198651] x11: 0000000000000002 x10: ffff80008240b920 x9 : 0000000000000018 [ 1.199547] x8 : 0101010101010101 x7 : 0000000000000000 x6 : 0000000000000000 [ 1.200443] x5 : 0000000000000000 x4 : 8080808080000000 x3 : 303933383978616d [ 1.201339] x2 : 0000000000000000 x1 : ffff80008240b920 x0 : 0000000000000000 [ 1.202236] Call trace: [ 1.202545] __pi_strcmp+0x24/0x140 (P) [ 1.203029] mtk_soundcard_common_probe+0x3bc/0x5b8 [ 1.203644] platform_probe+0x70/0xe8 [ 1.204106] really_probe+0xc8/0x3a0 [ 1.204556] __driver_probe_device+0x84/0x160 [ 1.205104] driver_probe_device+0x44/0x130 [ 1.205630] __device_attach_driver+0xc4/0x170 [ 1.206189] bus_for_each_drv+0x8c/0xf8 [ 1.206672] __device_attach+0xa8/0x1c8 [ 1.207155] device_initial_probe+0x1c/0x30 [ 1.207681] bus_probe_device+0xb0/0xc0 [ 1.208165] deferred_probe_work_func+0xa4/0x100 [ 1.208747] process_one_work+0x158/0x3e0 [ 1.209254] worker_thread+0x2c4/0x3e8 [ 1.209727] kthread+0x134/0x1f0 [ 1.210136] ret_from_fork+0x10/0x20 [ 1.210589] Code: 54000401 b50002c6 d503201f f86a6803 (f8408402) [ 1.211355] ---[ end trace 0000000000000000 ]--- Signed-off-by: Julien Massot Fixes: e70b8dd26711 ("ASoC: mediatek: mt8195: Remove afe-dai component and rework codec link") Reviewed-by: AngeloGioacchino Del Regno Link: https://patch.msgid.link/20250417-mt8395-audio-sof-v1-2-30587426e5dd@collabora.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/mediatek/mt8195/mt8195-mt6359.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/soc/mediatek/mt8195/mt8195-mt6359.c b/sound/soc/mediatek/mt8195/mt8195-mt6359.c index 8ebf6c7502aa3..400cec09c3a3c 100644 --- a/sound/soc/mediatek/mt8195/mt8195-mt6359.c +++ b/sound/soc/mediatek/mt8195/mt8195-mt6359.c @@ -822,12 +822,12 @@ SND_SOC_DAILINK_DEFS(ETDM1_IN_BE, SND_SOC_DAILINK_DEFS(ETDM2_IN_BE, DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")), - DAILINK_COMP_ARRAY(COMP_EMPTY()), + DAILINK_COMP_ARRAY(COMP_DUMMY()), DAILINK_COMP_ARRAY(COMP_EMPTY())); SND_SOC_DAILINK_DEFS(ETDM1_OUT_BE, DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")), - DAILINK_COMP_ARRAY(COMP_EMPTY()), + DAILINK_COMP_ARRAY(COMP_DUMMY()), DAILINK_COMP_ARRAY(COMP_EMPTY())); SND_SOC_DAILINK_DEFS(ETDM2_OUT_BE, -- GitLab From a13e8343ffcff27af1ff79597ff7ba241e6d9471 Mon Sep 17 00:00:00 2001 From: Qiuxu Zhuo Date: Thu, 17 Apr 2025 23:07:18 +0800 Subject: [PATCH 0745/2211] EDAC/skx_common: Fix general protection fault [ Upstream commit 20d2d476b3ae18041be423671a8637ed5ffd6958 ] After loading i10nm_edac (which automatically loads skx_edac_common), if unload only i10nm_edac, then reload it and perform error injection testing, a general protection fault may occur: mce: [Hardware Error]: Machine check events logged Oops: general protection fault ... ... Workqueue: events mce_gen_pool_process RIP: 0010:string+0x53/0xe0 ... Call Trace: ? die_addr+0x37/0x90 ? exc_general_protection+0x1e7/0x3f0 ? asm_exc_general_protection+0x26/0x30 ? string+0x53/0xe0 vsnprintf+0x23e/0x4c0 snprintf+0x4d/0x70 skx_adxl_decode+0x16a/0x330 [skx_edac_common] skx_mce_check_error.part.0+0xf8/0x220 [skx_edac_common] skx_mce_check_error+0x17/0x20 [skx_edac_common] ... The issue arose was because the variable 'adxl_component_count' (inside skx_edac_common), which counts the ADXL components, was not reset. During the reloading of i10nm_edac, the count was incremented by the actual number of ADXL components again, resulting in a count that was double the real number of ADXL components. This led to an out-of-bounds reference to the ADXL component array, causing the general protection fault above. Fix this issue by resetting the 'adxl_component_count' in adxl_put(), which is called during the unloading of {skx,i10nm}_edac. Fixes: 123b15863550 ("EDAC, i10nm: make skx_common.o a separate module") Reported-by: Feng Xu Signed-off-by: Qiuxu Zhuo Signed-off-by: Tony Luck Tested-by: Feng Xu Link: https://lore.kernel.org/r/20250417150724.1170168-2-qiuxu.zhuo@intel.com Signed-off-by: Sasha Levin --- drivers/edac/skx_common.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c index 85ec3196664d3..88f5ff249f2e0 100644 --- a/drivers/edac/skx_common.c +++ b/drivers/edac/skx_common.c @@ -115,6 +115,7 @@ EXPORT_SYMBOL_GPL(skx_adxl_get); void skx_adxl_put(void) { + adxl_component_count = 0; kfree(adxl_values); kfree(adxl_msg); } -- GitLab From 29ce9e71e95af29d491510bc34b150f9198c7b3d Mon Sep 17 00:00:00 2001 From: Qiuxu Zhuo Date: Thu, 17 Apr 2025 23:07:19 +0800 Subject: [PATCH 0746/2211] EDAC/{skx_common,i10nm}: Fix the loss of saved RRL for HBM pseudo channel 0 [ Upstream commit eeed3e03f4261e5e381a72ae099ff00ccafbb437 ] When enabling the retry_rd_err_log (RRL) feature during the loading of the i10nm_edac driver with the module parameter retry_rd_err_log=2 (Linux RRL control mode), the default values of the control bits of RRL are saved so that they can be restored during the unloading of the driver. In the current code, the RRL of pseudo channel 1 of HBM overwrites pseudo channel 0 during the loading of the driver, resulting in the loss of saved RRL for pseudo channel 0. This causes the RRL of pseudo channel 0 of HBM to be wrongly restored with the values from pseudo channel 1 when unloading the driver. Fix this issue by creating two separate groups of RRL control registers per channel to save default RRL settings of two {sub-,pseudo-}channels. Fixes: acd4cf68fefe ("EDAC/i10nm: Retrieve and print retry_rd_err_log registers for HBM") Signed-off-by: Qiuxu Zhuo Signed-off-by: Tony Luck Tested-by: Feng Xu Link: https://lore.kernel.org/r/20250417150724.1170168-3-qiuxu.zhuo@intel.com Signed-off-by: Sasha Levin --- drivers/edac/i10nm_base.c | 35 +++++++++++++++++++---------------- drivers/edac/skx_common.h | 11 ++++++++--- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c index fbdf005bed3a4..ac4b3d95531c5 100644 --- a/drivers/edac/i10nm_base.c +++ b/drivers/edac/i10nm_base.c @@ -95,7 +95,7 @@ static u32 offsets_demand2_spr[] = {0x22c70, 0x22d80, 0x22f18, 0x22d58, 0x22c64, static u32 offsets_demand_spr_hbm0[] = {0x2a54, 0x2a60, 0x2b10, 0x2a58, 0x2a5c, 0x0ee0}; static u32 offsets_demand_spr_hbm1[] = {0x2e54, 0x2e60, 0x2f10, 0x2e58, 0x2e5c, 0x0fb0}; -static void __enable_retry_rd_err_log(struct skx_imc *imc, int chan, bool enable, +static void __enable_retry_rd_err_log(struct skx_imc *imc, int chan, bool enable, u32 *rrl_ctl, u32 *offsets_scrub, u32 *offsets_demand, u32 *offsets_demand2) { @@ -108,10 +108,10 @@ static void __enable_retry_rd_err_log(struct skx_imc *imc, int chan, bool enable if (enable) { /* Save default configurations */ - imc->chan[chan].retry_rd_err_log_s = s; - imc->chan[chan].retry_rd_err_log_d = d; + rrl_ctl[0] = s; + rrl_ctl[1] = d; if (offsets_demand2) - imc->chan[chan].retry_rd_err_log_d2 = d2; + rrl_ctl[2] = d2; s &= ~RETRY_RD_ERR_LOG_NOOVER_UC; s |= RETRY_RD_ERR_LOG_EN; @@ -125,25 +125,25 @@ static void __enable_retry_rd_err_log(struct skx_imc *imc, int chan, bool enable } } else { /* Restore default configurations */ - if (imc->chan[chan].retry_rd_err_log_s & RETRY_RD_ERR_LOG_UC) + if (rrl_ctl[0] & RETRY_RD_ERR_LOG_UC) s |= RETRY_RD_ERR_LOG_UC; - if (imc->chan[chan].retry_rd_err_log_s & RETRY_RD_ERR_LOG_NOOVER) + if (rrl_ctl[0] & RETRY_RD_ERR_LOG_NOOVER) s |= RETRY_RD_ERR_LOG_NOOVER; - if (!(imc->chan[chan].retry_rd_err_log_s & RETRY_RD_ERR_LOG_EN)) + if (!(rrl_ctl[0] & RETRY_RD_ERR_LOG_EN)) s &= ~RETRY_RD_ERR_LOG_EN; - if (imc->chan[chan].retry_rd_err_log_d & RETRY_RD_ERR_LOG_UC) + if (rrl_ctl[1] & RETRY_RD_ERR_LOG_UC) d |= RETRY_RD_ERR_LOG_UC; - if (imc->chan[chan].retry_rd_err_log_d & RETRY_RD_ERR_LOG_NOOVER) + if (rrl_ctl[1] & RETRY_RD_ERR_LOG_NOOVER) d |= RETRY_RD_ERR_LOG_NOOVER; - if (!(imc->chan[chan].retry_rd_err_log_d & RETRY_RD_ERR_LOG_EN)) + if (!(rrl_ctl[1] & RETRY_RD_ERR_LOG_EN)) d &= ~RETRY_RD_ERR_LOG_EN; if (offsets_demand2) { - if (imc->chan[chan].retry_rd_err_log_d2 & RETRY_RD_ERR_LOG_UC) + if (rrl_ctl[2] & RETRY_RD_ERR_LOG_UC) d2 |= RETRY_RD_ERR_LOG_UC; - if (!(imc->chan[chan].retry_rd_err_log_d2 & RETRY_RD_ERR_LOG_NOOVER)) + if (!(rrl_ctl[2] & RETRY_RD_ERR_LOG_NOOVER)) d2 &= ~RETRY_RD_ERR_LOG_NOOVER; - if (!(imc->chan[chan].retry_rd_err_log_d2 & RETRY_RD_ERR_LOG_EN)) + if (!(rrl_ctl[2] & RETRY_RD_ERR_LOG_EN)) d2 &= ~RETRY_RD_ERR_LOG_EN; } } @@ -157,6 +157,7 @@ static void __enable_retry_rd_err_log(struct skx_imc *imc, int chan, bool enable static void enable_retry_rd_err_log(bool enable) { int i, j, imc_num, chan_num; + struct skx_channel *chan; struct skx_imc *imc; struct skx_dev *d; @@ -171,8 +172,9 @@ static void enable_retry_rd_err_log(bool enable) if (!imc->mbase) continue; + chan = d->imc[i].chan; for (j = 0; j < chan_num; j++) - __enable_retry_rd_err_log(imc, j, enable, + __enable_retry_rd_err_log(imc, j, enable, chan[j].rrl_ctl[0], res_cfg->offsets_scrub, res_cfg->offsets_demand, res_cfg->offsets_demand2); @@ -186,12 +188,13 @@ static void enable_retry_rd_err_log(bool enable) if (!imc->mbase || !imc->hbm_mc) continue; + chan = d->imc[i].chan; for (j = 0; j < chan_num; j++) { - __enable_retry_rd_err_log(imc, j, enable, + __enable_retry_rd_err_log(imc, j, enable, chan[j].rrl_ctl[0], res_cfg->offsets_scrub_hbm0, res_cfg->offsets_demand_hbm0, NULL); - __enable_retry_rd_err_log(imc, j, enable, + __enable_retry_rd_err_log(imc, j, enable, chan[j].rrl_ctl[1], res_cfg->offsets_scrub_hbm1, res_cfg->offsets_demand_hbm1, NULL); diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h index 849198fd14da6..f40eb6e4f6319 100644 --- a/drivers/edac/skx_common.h +++ b/drivers/edac/skx_common.h @@ -79,6 +79,9 @@ */ #define MCACOD_EXT_MEM_ERR 0x280 +/* Max RRL register sets per {,sub-,pseudo-}channel. */ +#define NUM_RRL_SET 3 + /* * Each cpu socket contains some pci devices that provide global * information, and also some that are local to each of the two @@ -117,9 +120,11 @@ struct skx_dev { struct skx_channel { struct pci_dev *cdev; struct pci_dev *edev; - u32 retry_rd_err_log_s; - u32 retry_rd_err_log_d; - u32 retry_rd_err_log_d2; + /* + * Two groups of RRL control registers per channel to save default RRL + * settings of two {sub-,pseudo-}channels in Linux RRL control mode. + */ + u32 rrl_ctl[2][NUM_RRL_SET]; struct skx_dimm { u8 close_pg; u8 bank_xor_enable; -- GitLab From 6accf99a2e21525781019278d644f375b01cec14 Mon Sep 17 00:00:00 2001 From: Vishwaroop A Date: Wed, 16 Apr 2025 11:06:01 +0000 Subject: [PATCH 0747/2211] spi: tegra210-quad: Fix X1_X2_X4 encoding and support x4 transfers [ Upstream commit dcb06c638a1174008a985849fa30fc0da7d08904 ] This patch corrects the QSPI_COMMAND_X1_X2_X4 and QSPI_ADDRESS_X1_X2_X4 macros to properly encode the bus width for x1, x2, and x4 transfers. Although these macros were previously incorrect, they were not being used in the driver, so no functionality was affected. The patch updates tegra_qspi_cmd_config() and tegra_qspi_addr_config() function calls to use the actual bus width from the transfer, instead of hardcoding it to 0 (which implied x1 mode). This change enables proper support for x1, x2, and x4 data transfers by correctly configuring the interface width for commands and addresses. These modifications improve the QSPI driver's flexibility and prepare it for future use cases that may require different bus widths for commands and addresses. Fixes: 1b8342cc4a38 ("spi: tegra210-quad: combined sequence mode") Signed-off-by: Vishwaroop A Link: https://patch.msgid.link/20250416110606.2737315-2-va@nvidia.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-tegra210-quad.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/drivers/spi/spi-tegra210-quad.c b/drivers/spi/spi-tegra210-quad.c index 2d48ad844fb80..fd6863e89cddd 100644 --- a/drivers/spi/spi-tegra210-quad.c +++ b/drivers/spi/spi-tegra210-quad.c @@ -134,7 +134,7 @@ #define QSPI_COMMAND_VALUE_SET(X) (((x) & 0xFF) << 0) #define QSPI_CMB_SEQ_CMD_CFG 0x1a0 -#define QSPI_COMMAND_X1_X2_X4(x) (((x) & 0x3) << 13) +#define QSPI_COMMAND_X1_X2_X4(x) ((((x) >> 1) & 0x3) << 13) #define QSPI_COMMAND_X1_X2_X4_MASK (0x03 << 13) #define QSPI_COMMAND_SDR_DDR BIT(12) #define QSPI_COMMAND_SIZE_SET(x) (((x) & 0xFF) << 0) @@ -147,7 +147,7 @@ #define QSPI_ADDRESS_VALUE_SET(X) (((x) & 0xFFFF) << 0) #define QSPI_CMB_SEQ_ADDR_CFG 0x1ac -#define QSPI_ADDRESS_X1_X2_X4(x) (((x) & 0x3) << 13) +#define QSPI_ADDRESS_X1_X2_X4(x) ((((x) >> 1) & 0x3) << 13) #define QSPI_ADDRESS_X1_X2_X4_MASK (0x03 << 13) #define QSPI_ADDRESS_SDR_DDR BIT(12) #define QSPI_ADDRESS_SIZE_SET(x) (((x) & 0xFF) << 0) @@ -1036,10 +1036,6 @@ static u32 tegra_qspi_addr_config(bool is_ddr, u8 bus_width, u8 len) { u32 addr_config = 0; - /* Extract Address configuration and value */ - is_ddr = 0; //Only SDR mode supported - bus_width = 0; //X1 mode - if (is_ddr) addr_config |= QSPI_ADDRESS_SDR_DDR; else @@ -1079,13 +1075,13 @@ static int tegra_qspi_combined_seq_xfer(struct tegra_qspi *tqspi, switch (transfer_phase) { case CMD_TRANSFER: /* X1 SDR mode */ - cmd_config = tegra_qspi_cmd_config(false, 0, + cmd_config = tegra_qspi_cmd_config(false, xfer->tx_nbits, xfer->len); cmd_value = *((const u8 *)(xfer->tx_buf)); break; case ADDR_TRANSFER: /* X1 SDR mode */ - addr_config = tegra_qspi_addr_config(false, 0, + addr_config = tegra_qspi_addr_config(false, xfer->tx_nbits, xfer->len); address_value = *((const u32 *)(xfer->tx_buf)); break; -- GitLab From 688d0b0d94b31fe811c3af37166c0bd8d88cff9a Mon Sep 17 00:00:00 2001 From: Vishwaroop A Date: Wed, 16 Apr 2025 11:06:02 +0000 Subject: [PATCH 0748/2211] spi: tegra210-quad: remove redundant error handling code [ Upstream commit 400d9f1a27cc2fceabdb1ed93eaf0b89b6d32ba5 ] Remove unnecessary error handling code that terminated transfers and executed delay on errors. This code was redundant as error handling is already done at a higher level in the SPI core. Fixes: 1b8342cc4a38 ("spi: tegra210-quad: combined sequence mode") Signed-off-by: Vishwaroop A Link: https://patch.msgid.link/20250416110606.2737315-3-va@nvidia.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-tegra210-quad.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/drivers/spi/spi-tegra210-quad.c b/drivers/spi/spi-tegra210-quad.c index fd6863e89cddd..30ed4120a2ef1 100644 --- a/drivers/spi/spi-tegra210-quad.c +++ b/drivers/spi/spi-tegra210-quad.c @@ -1175,10 +1175,6 @@ static int tegra_qspi_combined_seq_xfer(struct tegra_qspi *tqspi, exit: msg->status = ret; - if (ret < 0) { - tegra_qspi_transfer_end(spi); - spi_transfer_delay_exec(xfer); - } return ret; } -- GitLab From 109d6bc579311e1b9abf1cdde3b7e39fa0fca643 Mon Sep 17 00:00:00 2001 From: Vishwaroop A Date: Wed, 16 Apr 2025 11:06:03 +0000 Subject: [PATCH 0749/2211] spi: tegra210-quad: modify chip select (CS) deactivation [ Upstream commit d8966b65413390d1b5b706886987caac05fbe024 ] Modify the chip select (CS) deactivation and inter-transfer delay execution only during the DATA_TRANSFER phase when the cs_change flag is not set. This ensures proper CS handling and timing between transfers while eliminating redundant operations. Fixes: 1b8342cc4a38 ("spi: tegra210-quad: combined sequence mode") Signed-off-by: Vishwaroop A Link: https://patch.msgid.link/20250416110606.2737315-4-va@nvidia.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-tegra210-quad.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/spi/spi-tegra210-quad.c b/drivers/spi/spi-tegra210-quad.c index 30ed4120a2ef1..92348ebc60c78 100644 --- a/drivers/spi/spi-tegra210-quad.c +++ b/drivers/spi/spi-tegra210-quad.c @@ -1159,16 +1159,16 @@ static int tegra_qspi_combined_seq_xfer(struct tegra_qspi *tqspi, ret = -EIO; goto exit; } - if (!xfer->cs_change) { - tegra_qspi_transfer_end(spi); - spi_transfer_delay_exec(xfer); - } break; default: ret = -EINVAL; goto exit; } msg->actual_length += xfer->len; + if (!xfer->cs_change && transfer_phase == DATA_TRANSFER) { + tegra_qspi_transfer_end(spi); + spi_transfer_delay_exec(xfer); + } transfer_phase++; } ret = 0; -- GitLab From d05c33c14f09a76fd04279d0eb9dc7d4b86287a7 Mon Sep 17 00:00:00 2001 From: Alexander Shiyan Date: Fri, 7 Mar 2025 08:38:09 +0300 Subject: [PATCH 0750/2211] power: reset: at91-reset: Optimize at91_reset() [ Upstream commit 62d48983f215bf1dd48665913318101fa3414dcf ] This patch adds a small optimization to the low-level at91_reset() function, which includes: - Removes the extra branch, since the following store operations already have proper condition checks. - Removes the definition of the clobber register r4, since it is no longer used in the code. Fixes: fcd0532fac2a ("power: reset: at91-reset: make at91sam9g45_restart() generic") Signed-off-by: Alexander Shiyan Reviewed-by: Alexandre Belloni Link: https://lore.kernel.org/r/20250307053809.20245-1-eagle.alexander923@gmail.com Signed-off-by: Sebastian Reichel Signed-off-by: Sasha Levin --- drivers/power/reset/at91-reset.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c index 16512654295f5..f1e0a0857a90c 100644 --- a/drivers/power/reset/at91-reset.c +++ b/drivers/power/reset/at91-reset.c @@ -129,12 +129,11 @@ static int at91_reset(struct notifier_block *this, unsigned long mode, " str %4, [%0, %6]\n\t" /* Disable SDRAM1 accesses */ "1: tst %1, #0\n\t" - " beq 2f\n\t" " strne %3, [%1, #" __stringify(AT91_DDRSDRC_RTR) "]\n\t" /* Power down SDRAM1 */ " strne %4, [%1, %6]\n\t" /* Reset CPU */ - "2: str %5, [%2, #" __stringify(AT91_RSTC_CR) "]\n\t" + " str %5, [%2, #" __stringify(AT91_RSTC_CR) "]\n\t" " b .\n\t" : @@ -145,7 +144,7 @@ static int at91_reset(struct notifier_block *this, unsigned long mode, "r" cpu_to_le32(AT91_DDRSDRC_LPCB_POWER_DOWN), "r" (reset->data->reset_args), "r" (reset->ramc_lpr) - : "r4"); + ); return NOTIFY_DONE; } -- GitLab From 81d72f9241d884ec29524431f74f8009310cfa0c Mon Sep 17 00:00:00 2001 From: Yaxiong Tian Date: Fri, 18 Apr 2025 09:06:13 +0800 Subject: [PATCH 0751/2211] PM: EM: Fix potential division-by-zero error in em_compute_costs() [ Upstream commit 179c0c7044a378198adb36f2a12410ab68cc730a ] When the device is of a non-CPU type, table[i].performance won't be initialized in the previous em_init_performance(), resulting in division by zero when calculating costs in em_compute_costs(). Since the 'cost' algorithm is only used for EAS energy efficiency calculations and is currently not utilized by other device drivers, we should add the _is_cpu_device(dev) check to prevent this division-by-zero issue. Fixes: 1b600da51073 ("PM: EM: Optimize em_cpu_energy() and remove division") Signed-off-by: Yaxiong Tian Reviewed-by: Lukasz Luba Link: https://patch.msgid.link/tencent_7F99ED4767C1AF7889D0D8AD50F34859CE06@qq.com Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- kernel/power/energy_model.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c index 4e1778071d704..1c9fe741fe6d5 100644 --- a/kernel/power/energy_model.c +++ b/kernel/power/energy_model.c @@ -233,6 +233,10 @@ static int em_compute_costs(struct device *dev, struct em_perf_state *table, unsigned long prev_cost = ULONG_MAX; int i, ret; + /* This is needed only for CPUs and EAS skip other devices */ + if (!_is_cpu_device(dev)) + return 0; + /* Compute the cost of each performance state. */ for (i = nr_states - 1; i >= 0; i--) { unsigned long power_res, cost; -- GitLab From be0dc3e919528e769818c64dadef0f585c8c9949 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 25 Apr 2025 23:25:12 -0700 Subject: [PATCH 0752/2211] ASoC: SOF: ipc4-pcm: Adjust pipeline_list->pipelines allocation type [ Upstream commit 00a371adbbfb46db561db85a9d7b53b2363880a1 ] In preparation for making the kmalloc family of allocators type aware, we need to make sure that the returned type from the allocation matches the type of the variable being assigned. (Before, the allocator would always return "void *", which can be implicitly cast to any pointer type.) The assigned type is "struct snd_sof_pipeline **", but the returned type will be "struct snd_sof_widget **". These are the same size allocation (pointer size) but the types don't match. Adjust the allocation type to match the assignment. Signed-off-by: Kees Cook Fixes: 9c04363d222b ("ASoC: SOF: Introduce struct snd_sof_pipeline") Acked-by: Peter Ujfalusi Link: https://patch.msgid.link/20250426062511.work.859-kees@kernel.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/sof/ipc4-pcm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sound/soc/sof/ipc4-pcm.c b/sound/soc/sof/ipc4-pcm.c index 2fe4969cdc3b4..9db2cdb321282 100644 --- a/sound/soc/sof/ipc4-pcm.c +++ b/sound/soc/sof/ipc4-pcm.c @@ -780,7 +780,8 @@ static int sof_ipc4_pcm_setup(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm /* allocate memory for max number of pipeline IDs */ pipeline_list->pipelines = kcalloc(ipc4_data->max_num_pipelines, - sizeof(struct snd_sof_widget *), GFP_KERNEL); + sizeof(*pipeline_list->pipelines), + GFP_KERNEL); if (!pipeline_list->pipelines) { sof_ipc4_pcm_free(sdev, spcm); return -ENOMEM; -- GitLab From 06c74bd5878320923667ba67430230c121454ac1 Mon Sep 17 00:00:00 2001 From: Vijendar Mukunda Date: Fri, 2 May 2025 21:12:41 +0530 Subject: [PATCH 0753/2211] ASoC: SOF: amd: add missing acp descriptor field [ Upstream commit 7c2bad7b95db5b4b978853cd4dd042ae3ec83e63 ] Add missing acp descriptor field acp_error_stat for ACP7.0 platform. Fixes: 490be7ba2a01 ("ASoC: SOF: amd: add support for acp7.0 based platform") Signed-off-by: Vijendar Mukunda Reviewed-by: Ranjani Sridharan Reviewed-by: Bard Liao Link: https://patch.msgid.link/20250502154445.3008598-3-Vijendar.Mukunda@amd.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/sof/amd/pci-acp70.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/soc/sof/amd/pci-acp70.c b/sound/soc/sof/amd/pci-acp70.c index a5d8b6a95a222..fe2ad0395f5d3 100644 --- a/sound/soc/sof/amd/pci-acp70.c +++ b/sound/soc/sof/amd/pci-acp70.c @@ -34,6 +34,7 @@ static const struct sof_amd_acp_desc acp70_chip_info = { .ext_intr_cntl = ACP70_EXTERNAL_INTR_CNTL, .ext_intr_stat = ACP70_EXT_INTR_STAT, .ext_intr_stat1 = ACP70_EXT_INTR_STAT1, + .acp_error_stat = ACP70_ERROR_STATUS, .dsp_intr_base = ACP70_DSP_SW_INTR_BASE, .acp_sw0_i2s_err_reason = ACP7X_SW0_I2S_ERROR_REASON, .sram_pte_offset = ACP70_SRAM_PTE_OFFSET, -- GitLab From 0426e929700b0e59b2b6f1e464f82d5ff73d5bfb Mon Sep 17 00:00:00 2001 From: Zijun Hu Date: Mon, 5 May 2025 17:26:51 +0800 Subject: [PATCH 0754/2211] PM: wakeup: Delete space in the end of string shown by pm_show_wakelocks() [ Upstream commit f0050a3e214aa941b78ad4caf122a735a24d81a6 ] pm_show_wakelocks() is called to generate a string when showing attributes /sys/power/wake_(lock|unlock), but the string ends with an unwanted space that was added back by mistake by commit c9d967b2ce40 ("PM: wakeup: simplify the output logic of pm_show_wakelocks()"). Remove the unwanted space. Fixes: c9d967b2ce40 ("PM: wakeup: simplify the output logic of pm_show_wakelocks()") Signed-off-by: Zijun Hu Link: https://patch.msgid.link/20250505-fix_power-v1-1-0f7f2c2f338c@quicinc.com [ rjw: Changelog edits ] Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- kernel/power/wakelock.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/kernel/power/wakelock.c b/kernel/power/wakelock.c index 52571dcad768b..4e941999a53ba 100644 --- a/kernel/power/wakelock.c +++ b/kernel/power/wakelock.c @@ -49,6 +49,9 @@ ssize_t pm_show_wakelocks(char *buf, bool show_active) len += sysfs_emit_at(buf, len, "%s ", wl->name); } + if (len > 0) + --len; + len += sysfs_emit_at(buf, len, "\n"); mutex_unlock(&wakelocks_lock); -- GitLab From f551f0e630a766e0a73167ffc57be0ef3a090a47 Mon Sep 17 00:00:00 2001 From: Mingcong Bai Date: Thu, 17 Apr 2025 15:39:46 +0800 Subject: [PATCH 0755/2211] ACPI: resource: fix a typo for MECHREVO in irq1_edge_low_force_override[] [ Upstream commit 113e04276018bd13978051d8b05a613b4d390cc9 ] The vendor name for MECHREVO was incorrectly spelled in commit b53f09ecd602 ("ACPI: resource: Do IRQ override on MECHREV GM7XG0M"). Correct this typo in this trivial patch. Fixes: b53f09ecd602 ("ACPI: resource: Do IRQ override on MECHREV GM7XG0M") Signed-off-by: Mingcong Bai Link: https://patch.msgid.link/20250417073947.47419-1-jeffbai@aosc.io Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/resource.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c index 14c7bac4100b4..7d59c6c9185fc 100644 --- a/drivers/acpi/resource.c +++ b/drivers/acpi/resource.c @@ -534,7 +534,7 @@ static const struct dmi_system_id irq1_level_low_skip_override[] = { */ static const struct dmi_system_id irq1_edge_low_force_override[] = { { - /* MECHREV Jiaolong17KS Series GM7XG0M */ + /* MECHREVO Jiaolong17KS Series GM7XG0M */ .matches = { DMI_MATCH(DMI_BOARD_NAME, "GM7XG0M"), }, -- GitLab From d3cc08bad4b7fcb7eba82a0705a3fa74fb244823 Mon Sep 17 00:00:00 2001 From: Jiaqing Zhao Date: Fri, 9 May 2025 17:06:33 +0000 Subject: [PATCH 0756/2211] x86/mtrr: Check if fixed-range MTRRs exist in mtrr_save_fixed_ranges() [ Upstream commit 824c6384e8d9275d4ec7204f3f79a4ac6bc10379 ] When suspending, save_processor_state() calls mtrr_save_fixed_ranges() to save fixed-range MTRRs. On platforms without fixed-range MTRRs like the ACRN hypervisor which has removed fixed-range MTRR emulation, accessing these MSRs will trigger an unchecked MSR access error. Make sure fixed-range MTRRs are supported before access to prevent such error. Since mtrr_state.have_fixed is only set when MTRRs are present and enabled, checking the CPU feature flag in mtrr_save_fixed_ranges() is unnecessary. Fixes: 3ebad5905609 ("[PATCH] x86: Save and restore the fixed-range MTRRs of the BSP when suspending") Signed-off-by: Jiaqing Zhao Signed-off-by: Borislav Petkov (AMD) Link: https://lore.kernel.org/20250509170633.3411169-2-jiaqing.zhao@linux.intel.com Signed-off-by: Sasha Levin --- arch/x86/kernel/cpu/mtrr/generic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c index 7b29ebda024f4..1ececfce7a46a 100644 --- a/arch/x86/kernel/cpu/mtrr/generic.c +++ b/arch/x86/kernel/cpu/mtrr/generic.c @@ -591,7 +591,7 @@ static void get_fixed_ranges(mtrr_type *frs) void mtrr_save_fixed_ranges(void *info) { - if (boot_cpu_has(X86_FEATURE_MTRR)) + if (mtrr_state.have_fixed) get_fixed_ranges(mtrr_state.fixed_ranges); } -- GitLab From 77d45ba1bec4b4bd687dbf17baa16839c402d382 Mon Sep 17 00:00:00 2001 From: "Rafael J. Wysocki" Date: Fri, 9 May 2025 14:51:47 +0200 Subject: [PATCH 0757/2211] PM: sleep: Print PM debug messages during hibernation [ Upstream commit 1b17d4525bca3916644c41e01522df8fa0f8b90b ] Commit cdb8c100d8a4 ("include/linux/suspend.h: Only show pm_pr_dbg messages at suspend/resume") caused PM debug messages to only be printed during system-wide suspend and resume in progress, but it forgot about hibernation. Address this by adding a check for hibernation in progress to pm_debug_messages_should_print(). Fixes: cdb8c100d8a4 ("include/linux/suspend.h: Only show pm_pr_dbg messages at suspend/resume") Signed-off-by: Rafael J. Wysocki Reviewed-by: Mario Limonciello Link: https://patch.msgid.link/4998903.GXAFRqVoOG@rjwysocki.net Signed-off-by: Sasha Levin --- kernel/power/hibernate.c | 5 +++++ kernel/power/main.c | 3 ++- kernel/power/power.h | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index d8bad1eeedd3e..85008ead2ac91 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c @@ -89,6 +89,11 @@ void hibernate_release(void) atomic_inc(&hibernate_atomic); } +bool hibernation_in_progress(void) +{ + return !atomic_read(&hibernate_atomic); +} + bool hibernation_available(void) { return nohibernate == 0 && diff --git a/kernel/power/main.c b/kernel/power/main.c index 6254814d48171..0622e7dacf172 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -613,7 +613,8 @@ bool pm_debug_messages_on __read_mostly; bool pm_debug_messages_should_print(void) { - return pm_debug_messages_on && pm_suspend_target_state != PM_SUSPEND_ON; + return pm_debug_messages_on && (hibernation_in_progress() || + pm_suspend_target_state != PM_SUSPEND_ON); } EXPORT_SYMBOL_GPL(pm_debug_messages_should_print); diff --git a/kernel/power/power.h b/kernel/power/power.h index de0e6b1077f23..6d1ec7b23e844 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h @@ -71,10 +71,14 @@ extern void enable_restore_image_protection(void); static inline void enable_restore_image_protection(void) {} #endif /* CONFIG_STRICT_KERNEL_RWX */ +extern bool hibernation_in_progress(void); + #else /* !CONFIG_HIBERNATION */ static inline void hibernate_reserved_size_init(void) {} static inline void hibernate_image_size_init(void) {} + +static inline bool hibernation_in_progress(void) { return false; } #endif /* !CONFIG_HIBERNATION */ #define power_attr(_name) \ -- GitLab From 0440baa4d42ae501351acb8bb040deaf93a2e05f Mon Sep 17 00:00:00 2001 From: AngeloGioacchino Del Regno Date: Wed, 2 Apr 2025 10:38:52 +0200 Subject: [PATCH 0758/2211] thermal/drivers/mediatek/lvts: Fix debugfs unregister on failure [ Upstream commit b49825661af93d9b8d7236f914803f136896f8fd ] When running the probe function for this driver, the function lvts_debugfs_init() gets called in lvts_domain_init() which, in turn, gets called in lvts_probe() before registering threaded interrupt handlers. Even though it's unlikely, the last call may fail and, if it does, there's nothing removing the already created debugfs folder and files. In order to fix that, instead of calling the lvts debugfs cleanup function upon failure, register a devm action that will take care of calling that upon failure or driver removal. Since devm was used, also delete the call to lvts_debugfs_exit() in the lvts_remove() callback, as now that's done automatically. Fixes: f5f633b18234 ("thermal/drivers/mediatek: Add the Low Voltage Thermal Sensor driver") Signed-off-by: AngeloGioacchino Del Regno Reviewed-by: Chen-Yu Tsai Link: https://lore.kernel.org/r/20250402083852.20624-1-angelogioacchino.delregno@collabora.com Signed-off-by: Daniel Lezcano Signed-off-by: Sasha Levin --- drivers/thermal/mediatek/lvts_thermal.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/thermal/mediatek/lvts_thermal.c b/drivers/thermal/mediatek/lvts_thermal.c index 3295b27ab70d2..944c28a0c4736 100644 --- a/drivers/thermal/mediatek/lvts_thermal.c +++ b/drivers/thermal/mediatek/lvts_thermal.c @@ -209,6 +209,13 @@ static const struct debugfs_reg32 lvts_regs[] = { LVTS_DEBUG_FS_REGS(LVTS_CLKEN), }; +static void lvts_debugfs_exit(void *data) +{ + struct lvts_domain *lvts_td = data; + + debugfs_remove_recursive(lvts_td->dom_dentry); +} + static int lvts_debugfs_init(struct device *dev, struct lvts_domain *lvts_td) { struct debugfs_regset32 *regset; @@ -241,12 +248,7 @@ static int lvts_debugfs_init(struct device *dev, struct lvts_domain *lvts_td) debugfs_create_regset32("registers", 0400, dentry, regset); } - return 0; -} - -static void lvts_debugfs_exit(struct lvts_domain *lvts_td) -{ - debugfs_remove_recursive(lvts_td->dom_dentry); + return devm_add_action_or_reset(dev, lvts_debugfs_exit, lvts_td); } #else @@ -1352,8 +1354,6 @@ static void lvts_remove(struct platform_device *pdev) for (i = 0; i < lvts_td->num_lvts_ctrl; i++) lvts_ctrl_set_enable(&lvts_td->lvts_ctrl[i], false); - - lvts_debugfs_exit(lvts_td); } static const struct lvts_ctrl_data mt7988_lvts_ap_data_ctrl[] = { -- GitLab From c9c8cb0f280b170681dd6a9c7216f439be4a2040 Mon Sep 17 00:00:00 2001 From: Armin Wolf Date: Thu, 10 Apr 2025 18:54:54 +0200 Subject: [PATCH 0759/2211] ACPI: OSI: Stop advertising support for "3.0 _SCP Extensions" [ Upstream commit 8cf4fdac9bdead7bca15fc56fdecdf78d11c3ec6 ] As specified in section 5.7.2 of the ACPI specification the feature group string "3.0 _SCP Extensions" implies that the operating system evaluates the _SCP control method with additional parameters. However the ACPI thermal driver evaluates the _SCP control method without those additional parameters, conflicting with the above feature group string advertised to the firmware thru _OSI. Stop advertising support for this feature string to avoid confusing the ACPI firmware. Fixes: e5f660ebef68 ("ACPI / osi: Collect _OSI handling into one single file") Signed-off-by: Armin Wolf Link: https://patch.msgid.link/20250410165456.4173-2-W_Armin@gmx.de Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/osi.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/acpi/osi.c b/drivers/acpi/osi.c index df9328c850bd3..f2c943b934be0 100644 --- a/drivers/acpi/osi.c +++ b/drivers/acpi/osi.c @@ -42,7 +42,6 @@ static struct acpi_osi_entry osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = { {"Module Device", true}, {"Processor Device", true}, - {"3.0 _SCP Extensions", true}, {"Processor Aggregator Device", true}, }; -- GitLab From 5787ff1acef2d2bbd916dcc8e9cf3c99b9df317a Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Fri, 16 May 2025 15:32:06 +0200 Subject: [PATCH 0760/2211] spi: sh-msiof: Fix maximum DMA transfer size [ Upstream commit 0941d5166629cb766000530945e54b4e49680c68 ] The maximum amount of data to transfer in a single DMA request is calculated from the FIFO sizes (which is technically not 100% correct, but a simplification, as it is limited by the maximum word count values in the Transmit and Control Data Registers). However, in case there is both data to transmit and to receive, the transmit limit is overwritten by the receive limit. Fix this by using the minimum applicable FIFO size instead. Move the calculation outside the loop, so it is not repeated for each individual DMA transfer. As currently tx_fifo_size is always equal to rx_fifo_size, this bug had no real impact. Fixes: fe78d0b7691c0274 ("spi: sh-msiof: Fix FIFO size to 64 word from 256 word") Signed-off-by: Geert Uytterhoeven Link: https://patch.msgid.link/d9961767a97758b2614f2ee8afe1bd56dc900a60.1747401908.git.geert+renesas@glider.be Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-sh-msiof.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c index 3519656515ea1..1870f8c852131 100644 --- a/drivers/spi/spi-sh-msiof.c +++ b/drivers/spi/spi-sh-msiof.c @@ -918,6 +918,7 @@ static int sh_msiof_transfer_one(struct spi_controller *ctlr, void *rx_buf = t->rx_buf; unsigned int len = t->len; unsigned int bits = t->bits_per_word; + unsigned int max_wdlen = 256; unsigned int bytes_per_word; unsigned int words; int n; @@ -931,17 +932,17 @@ static int sh_msiof_transfer_one(struct spi_controller *ctlr, if (!spi_controller_is_target(p->ctlr)) sh_msiof_spi_set_clk_regs(p, t); + if (tx_buf) + max_wdlen = min(max_wdlen, p->tx_fifo_size); + if (rx_buf) + max_wdlen = min(max_wdlen, p->rx_fifo_size); + while (ctlr->dma_tx && len > 15) { /* * DMA supports 32-bit words only, hence pack 8-bit and 16-bit * words, with byte resp. word swapping. */ - unsigned int l = 0; - - if (tx_buf) - l = min(round_down(len, 4), p->tx_fifo_size * 4); - if (rx_buf) - l = min(round_down(len, 4), p->rx_fifo_size * 4); + unsigned int l = min(round_down(len, 4), max_wdlen * 4); if (bits <= 8) { copy32 = copy_bswap32; -- GitLab From 9bad55fc4a9c263815b49743a0a223a0838f92a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Povi=C5=A1er?= Date: Sun, 18 May 2025 20:50:46 +1000 Subject: [PATCH 0761/2211] ASoC: apple: mca: Constrain channels according to TDM mask MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit e717c661e2d1a660e96c40b0fe9933e23a1d7747 ] We don't (and can't) configure the hardware correctly if the number of channels exceeds the weight of the TDM mask. Report that constraint in startup of FE. Fixes: 3df5d0d97289 ("ASoC: apple: mca: Start new platform driver") Signed-off-by: Martin Povišer Signed-off-by: James Calligeros Link: https://patch.msgid.link/20250518-mca-fixes-v1-1-ee1015a695f6@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/apple/mca.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c index c9e7d40c47cc1..4a4ec1c09e132 100644 --- a/sound/soc/apple/mca.c +++ b/sound/soc/apple/mca.c @@ -464,6 +464,28 @@ err: return -EINVAL; } +static int mca_fe_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct mca_cluster *cl = mca_dai_to_cluster(dai); + unsigned int mask, nchannels; + + if (cl->tdm_slots) { + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + mask = cl->tdm_tx_mask; + else + mask = cl->tdm_rx_mask; + + nchannels = hweight32(mask); + } else { + nchannels = 2; + } + + return snd_pcm_hw_constraint_minmax(substream->runtime, + SNDRV_PCM_HW_PARAM_CHANNELS, + 1, nchannels); +} + static int mca_fe_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { @@ -680,6 +702,7 @@ static int mca_fe_hw_params(struct snd_pcm_substream *substream, } static const struct snd_soc_dai_ops mca_fe_ops = { + .startup = mca_fe_startup, .set_fmt = mca_fe_set_fmt, .set_bclk_ratio = mca_set_bclk_ratio, .set_tdm_slot = mca_fe_set_tdm_slot, -- GitLab From 45844a940331a009ba981e536260289816651c26 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 22 May 2025 12:08:05 +0200 Subject: [PATCH 0762/2211] ALSA: core: fix up bus match const issues. [ Upstream commit 62f134ab190c5fd5c9f68fe638ad8e13bb8a4cb4 ] In commit d69d80484598 ("driver core: have match() callback in struct bus_type take a const *"), the match bus callback was changed to have the driver be a const pointer. Unfortunately that const attribute was thrown away when container_of() is called, which is not correct and was not caught by the compiler due to how container_of() is implemented. Fix this up by correctly preserving the const attribute of the driver passed to the bus match function which requires the hdac_driver match function to also take a const pointer for the driver structure. Cc: Jaroslav Kysela Cc: Takashi Iwai Fixes: d69d80484598 ("driver core: have match() callback in struct bus_type take a const *") Signed-off-by: Greg Kroah-Hartman Link: https://patch.msgid.link/2025052204-hyphen-thermal-3e72@gregkh Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- include/sound/hdaudio.h | 4 ++-- sound/core/seq_device.c | 2 +- sound/hda/hda_bus_type.c | 6 +++--- sound/pci/hda/hda_bind.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h index b098ceadbe74b..9a70048adbc06 100644 --- a/include/sound/hdaudio.h +++ b/include/sound/hdaudio.h @@ -223,7 +223,7 @@ struct hdac_driver { struct device_driver driver; int type; const struct hda_device_id *id_table; - int (*match)(struct hdac_device *dev, struct hdac_driver *drv); + int (*match)(struct hdac_device *dev, const struct hdac_driver *drv); void (*unsol_event)(struct hdac_device *dev, unsigned int event); /* fields used by ext bus APIs */ @@ -235,7 +235,7 @@ struct hdac_driver { #define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver) const struct hda_device_id * -hdac_get_device_id(struct hdac_device *hdev, struct hdac_driver *drv); +hdac_get_device_id(struct hdac_device *hdev, const struct hdac_driver *drv); /* * Bus verb operators diff --git a/sound/core/seq_device.c b/sound/core/seq_device.c index 4492be5d2317c..bac9f86037342 100644 --- a/sound/core/seq_device.c +++ b/sound/core/seq_device.c @@ -43,7 +43,7 @@ MODULE_LICENSE("GPL"); static int snd_seq_bus_match(struct device *dev, const struct device_driver *drv) { struct snd_seq_device *sdev = to_seq_dev(dev); - struct snd_seq_driver *sdrv = to_seq_drv(drv); + const struct snd_seq_driver *sdrv = to_seq_drv(drv); return strcmp(sdrv->id, sdev->id) == 0 && sdrv->argsize == sdev->argsize; diff --git a/sound/hda/hda_bus_type.c b/sound/hda/hda_bus_type.c index 7545ace7b0ee4..eb72a7af2e56e 100644 --- a/sound/hda/hda_bus_type.c +++ b/sound/hda/hda_bus_type.c @@ -21,7 +21,7 @@ MODULE_LICENSE("GPL"); * driver id_table and returns the matching device id entry. */ const struct hda_device_id * -hdac_get_device_id(struct hdac_device *hdev, struct hdac_driver *drv) +hdac_get_device_id(struct hdac_device *hdev, const struct hdac_driver *drv) { if (drv->id_table) { const struct hda_device_id *id = drv->id_table; @@ -38,7 +38,7 @@ hdac_get_device_id(struct hdac_device *hdev, struct hdac_driver *drv) } EXPORT_SYMBOL_GPL(hdac_get_device_id); -static int hdac_codec_match(struct hdac_device *dev, struct hdac_driver *drv) +static int hdac_codec_match(struct hdac_device *dev, const struct hdac_driver *drv) { if (hdac_get_device_id(dev, drv)) return 1; @@ -49,7 +49,7 @@ static int hdac_codec_match(struct hdac_device *dev, struct hdac_driver *drv) static int hda_bus_match(struct device *dev, const struct device_driver *drv) { struct hdac_device *hdev = dev_to_hdac_dev(dev); - struct hdac_driver *hdrv = drv_to_hdac_driver(drv); + const struct hdac_driver *hdrv = drv_to_hdac_driver(drv); if (hdev->type != hdrv->type) return 0; diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c index b7ca2a83fbb08..90633970b59f7 100644 --- a/sound/pci/hda/hda_bind.c +++ b/sound/pci/hda/hda_bind.c @@ -18,10 +18,10 @@ /* * find a matching codec id */ -static int hda_codec_match(struct hdac_device *dev, struct hdac_driver *drv) +static int hda_codec_match(struct hdac_device *dev, const struct hdac_driver *drv) { struct hda_codec *codec = container_of(dev, struct hda_codec, core); - struct hda_codec_driver *driver = + const struct hda_codec_driver *driver = container_of(drv, struct hda_codec_driver, core); const struct hda_device_id *list; /* check probe_id instead of vendor_id if set */ -- GitLab From aa02817f7add493cec489780820ac42056ab7894 Mon Sep 17 00:00:00 2001 From: Ian Forbes Date: Fri, 28 Feb 2025 14:06:33 -0600 Subject: [PATCH 0763/2211] drm/vmwgfx: Add seqno waiter for sync_files [ Upstream commit 0039a3b35b10d9c15d3d26320532ab56cc566750 ] Because sync_files are passive waiters they do not participate in the processing of fences like the traditional vmw_fence_wait IOCTL. If userspace exclusively uses sync_files for synchronization then nothing in the kernel actually processes fence updates as interrupts for fences are masked and ignored if the kernel does not indicate to the SVGA device that there are active waiters. This oversight results in a bug where the entire GUI can freeze waiting on a sync_file that will never be signalled as we've masked the interrupts to signal its completion. This bug is incredibly racy as any process which interacts with the fencing code via the 3D stack can process the stuck fences on behalf of the stuck process causing it to run again. Even a simple app like eglinfo is enough to resume the stuck process. Usually this bug is seen at a login screen like GDM because there are no other 3D apps running. By adding a seqno waiter we re-enable interrupt based processing of the dma_fences associated with the sync_file which is signalled as part of a dma_fence_callback. This has likely been broken since it was initially added to the kernel in 2017 but has gone unnoticed until mutter recently started using sync_files heavily over the course of 2024 as part of their explicit sync support. Fixes: c906965dee22 ("drm/vmwgfx: Add export fence to file descriptor support") Signed-off-by: Ian Forbes Signed-off-by: Zack Rusin Link: https://patchwork.freedesktop.org/patch/msgid/20250228200633.642417-1-ian.forbes@broadcom.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c index 2e52d73eba484..ea741bc4ac3fc 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c @@ -4086,6 +4086,23 @@ static int vmw_execbuf_tie_context(struct vmw_private *dev_priv, return 0; } +/* + * DMA fence callback to remove a seqno_waiter + */ +struct seqno_waiter_rm_context { + struct dma_fence_cb base; + struct vmw_private *dev_priv; +}; + +static void seqno_waiter_rm_cb(struct dma_fence *f, struct dma_fence_cb *cb) +{ + struct seqno_waiter_rm_context *ctx = + container_of(cb, struct seqno_waiter_rm_context, base); + + vmw_seqno_waiter_remove(ctx->dev_priv); + kfree(ctx); +} + int vmw_execbuf_process(struct drm_file *file_priv, struct vmw_private *dev_priv, void __user *user_commands, void *kernel_commands, @@ -4266,6 +4283,15 @@ int vmw_execbuf_process(struct drm_file *file_priv, } else { /* Link the fence with the FD created earlier */ fd_install(out_fence_fd, sync_file->file); + struct seqno_waiter_rm_context *ctx = + kmalloc(sizeof(*ctx), GFP_KERNEL); + ctx->dev_priv = dev_priv; + vmw_seqno_waiter_add(dev_priv); + if (dma_fence_add_callback(&fence->base, &ctx->base, + seqno_waiter_rm_cb) < 0) { + vmw_seqno_waiter_remove(dev_priv); + kfree(ctx); + } } } -- GitLab From af713f6af6fd2e2f134a88708614834a620161a4 Mon Sep 17 00:00:00 2001 From: Keisuke Nishimura Date: Tue, 25 Feb 2025 15:52:23 +0100 Subject: [PATCH 0764/2211] drm/vmwgfx: Add error path for xa_store in vmw_bo_add_detached_resource [ Upstream commit 3282422bf251db541fe07c548ca304130d37d754 ] The xa_store() may fail due to memory allocation failure because there is no guarantee that the index is already used. This fix introduces new paths to handle the error. This patch also aligns the order of function calls by calling vmw_bo_add_detached_resource() before ttm_prime_object_init() in order to allow consistent error handling. Fixes: d6667f0ddf46 ("drm/vmwgfx: Fix handling of dumb buffers") Signed-off-by: Keisuke Nishimura Signed-off-by: Zack Rusin Link: https://patchwork.freedesktop.org/patch/msgid/20250225145223.34773-1-keisuke.nishimura@inria.fr Signed-off-by: Sasha Levin --- drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 4 ++-- drivers/gpu/drm/vmwgfx/vmwgfx_bo.h | 2 +- drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | 16 ++++++++++++++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c index 183cda50094cb..ad61373332cc2 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c @@ -849,9 +849,9 @@ void vmw_bo_placement_set_default_accelerated(struct vmw_bo *bo) vmw_bo_placement_set(bo, domain, domain); } -void vmw_bo_add_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res) +int vmw_bo_add_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res) { - xa_store(&vbo->detached_resources, (unsigned long)res, res, GFP_KERNEL); + return xa_err(xa_store(&vbo->detached_resources, (unsigned long)res, res, GFP_KERNEL)); } void vmw_bo_del_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res) diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h index c21ba7ff77368..940c0a0b9c451 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h @@ -142,7 +142,7 @@ void vmw_bo_move_notify(struct ttm_buffer_object *bo, struct ttm_resource *mem); void vmw_bo_swap_notify(struct ttm_buffer_object *bo); -void vmw_bo_add_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res); +int vmw_bo_add_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res); void vmw_bo_del_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res); struct vmw_surface *vmw_bo_surface(struct vmw_bo *vbo); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c index 5721c74da3e0b..1f7626f6ac0b1 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c @@ -871,7 +871,12 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data, vmw_resource_unreference(&res); goto out_unlock; } - vmw_bo_add_detached_resource(res->guest_memory_bo, res); + + ret = vmw_bo_add_detached_resource(res->guest_memory_bo, res); + if (unlikely(ret != 0)) { + vmw_resource_unreference(&res); + goto out_unlock; + } } tmp = vmw_resource_reference(&srf->res); @@ -1670,6 +1675,14 @@ vmw_gb_surface_define_internal(struct drm_device *dev, } + if (res->guest_memory_bo) { + ret = vmw_bo_add_detached_resource(res->guest_memory_bo, res); + if (unlikely(ret != 0)) { + vmw_resource_unreference(&res); + goto out_unlock; + } + } + tmp = vmw_resource_reference(res); ret = ttm_prime_object_init(tfile, res->guest_memory_size, &user_srf->prime, VMW_RES_SURFACE, @@ -1684,7 +1697,6 @@ vmw_gb_surface_define_internal(struct drm_device *dev, rep->handle = user_srf->prime.base.handle; rep->backup_size = res->guest_memory_size; if (res->guest_memory_bo) { - vmw_bo_add_detached_resource(res->guest_memory_bo, res); rep->buffer_map_handle = drm_vma_node_offset_addr(&res->guest_memory_bo->tbo.base.vma_node); rep->buffer_size = res->guest_memory_bo->tbo.base.size; -- GitLab From 67ea6af4264aa5d13f8bda142190f8f380edb61b Mon Sep 17 00:00:00 2001 From: Ian Forbes Date: Thu, 23 Jan 2025 14:44:24 -0600 Subject: [PATCH 0765/2211] drm/vmwgfx: Fix dumb buffer leak [ Upstream commit f42c09e614f1bda96f5690be8d0bb273234febbc ] Dumb buffers were not being freed because the GEM reference that was acquired in gb_surface_define was not dropped like it is in the 2D case. Dropping this ref uncovered a few additional issues with freeing the resources associated with dirty tracking in vmw_bo_free/release. Additionally the TTM object associated with the surface were also leaking which meant that when the ttm_object_file was closed at process exit the destructor unreferenced an already destroyed surface. The solution is to remove the destructor from the vmw_user_surface associated with the dumb_buffer and immediately unreferencing the TTM object which his removes it from the ttm_object_file. This also allows the early return in vmw_user_surface_base_release for the dumb buffer case to be removed as it should no longer occur. The chain of references now has the GEM handle(s) owning the dumb buffer. The GEM handles have a singular GEM reference to the vmw_bo which is dropped when all handles are closed. When the GEM reference count hits zero the vmw_bo is freed which then unreferences the surface via vmw_resource_release in vmw_bo_release. Fixes: d6667f0ddf46 ("drm/vmwgfx: Fix handling of dumb buffers") Signed-off-by: Ian Forbes Reviewed-by: Zack Rusin Signed-off-by: Zack Rusin Link: https://patchwork.freedesktop.org/patch/msgid/20250123204424.836896-1-ian.forbes@broadcom.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 6 ++++-- drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 2 +- drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | 18 ++++++++++++------ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c index ad61373332cc2..e8e49f13cfa2c 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c @@ -51,11 +51,13 @@ static void vmw_bo_release(struct vmw_bo *vbo) mutex_lock(&res->dev_priv->cmdbuf_mutex); (void)vmw_resource_reserve(res, false, true); vmw_resource_mob_detach(res); + if (res->dirty) + res->func->dirty_free(res); if (res->coherent) vmw_bo_dirty_release(res->guest_memory_bo); res->guest_memory_bo = NULL; res->guest_memory_offset = 0; - vmw_resource_unreserve(res, false, false, false, NULL, + vmw_resource_unreserve(res, true, false, false, NULL, 0); mutex_unlock(&res->dev_priv->cmdbuf_mutex); } @@ -73,9 +75,9 @@ static void vmw_bo_free(struct ttm_buffer_object *bo) { struct vmw_bo *vbo = to_vmw_bo(&bo->base); - WARN_ON(vbo->dirty); WARN_ON(!RB_EMPTY_ROOT(&vbo->res_tree)); vmw_bo_release(vbo); + WARN_ON(vbo->dirty); kfree(vbo); } diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index a73af8a355fbf..c4d5fe5f330f9 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c @@ -273,7 +273,7 @@ int vmw_user_resource_lookup_handle(struct vmw_private *dev_priv, goto out_bad_resource; res = converter->base_obj_to_res(base); - kref_get(&res->kref); + vmw_resource_reference(res); *p_res = res; ret = 0; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c index 1f7626f6ac0b1..d7a8070330ba5 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c @@ -658,7 +658,7 @@ static void vmw_user_surface_free(struct vmw_resource *res) struct vmw_user_surface *user_srf = container_of(srf, struct vmw_user_surface, srf); - WARN_ON_ONCE(res->dirty); + WARN_ON(res->dirty); if (user_srf->master) drm_master_put(&user_srf->master); kfree(srf->offsets); @@ -689,8 +689,7 @@ static void vmw_user_surface_base_release(struct ttm_base_object **p_base) * Dumb buffers own the resource and they'll unref the * resource themselves */ - if (res && res->guest_memory_bo && res->guest_memory_bo->is_dumb) - return; + WARN_ON(res && res->guest_memory_bo && res->guest_memory_bo->is_dumb); vmw_resource_unreference(&res); } @@ -2370,12 +2369,19 @@ int vmw_dumb_create(struct drm_file *file_priv, vbo = res->guest_memory_bo; vbo->is_dumb = true; vbo->dumb_surface = vmw_res_to_srf(res); - + drm_gem_object_put(&vbo->tbo.base); + /* + * Unset the user surface dtor since this in not actually exposed + * to userspace. The suface is owned via the dumb_buffer's GEM handle + */ + struct vmw_user_surface *usurf = container_of(vbo->dumb_surface, + struct vmw_user_surface, srf); + usurf->prime.base.refcount_release = NULL; err: if (res) vmw_resource_unreference(&res); - if (ret) - ttm_ref_object_base_unref(tfile, arg.rep.handle); + + ttm_ref_object_base_unref(tfile, arg.rep.handle); return ret; } -- GitLab From bf694844daa08aae2d23abcbd5f5a4e1a4c67f4e Mon Sep 17 00:00:00 2001 From: Badal Nilawar Date: Thu, 27 Mar 2025 21:49:14 +0530 Subject: [PATCH 0766/2211] drm/xe/d3cold: Set power state to D3Cold during s2idle/s3 [ Upstream commit f945dd89fa8da3f662508165453dafdb4035d9d3 ] According to pci core guidelines, pci_save_config is recommended when the driver explicitly needs to set the pci power state. As of now xe kmd is only doing pci_save_config while entering to s2idle/s3 state, which makes pci core think that device driver has already applied required pci power state. This leads to GPU remain in D0 state. To fix the issue setting the pci power state to D3Cold. Fixes:dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel GPUs") Cc: Rafael J. Wysocki Cc: Rodrigo Vivi Signed-off-by: Badal Nilawar Signed-off-by: Anshuman Gupta Reviewed-by: Rodrigo Vivi Link: https://lore.kernel.org/r/20250327161914.432552-1-badal.nilawar@intel.com Signed-off-by: Rodrigo Vivi Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_pci.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c index 025d649434673..23028afbbe1d1 100644 --- a/drivers/gpu/drm/xe/xe_pci.c +++ b/drivers/gpu/drm/xe/xe_pci.c @@ -910,6 +910,7 @@ static int xe_pci_suspend(struct device *dev) pci_save_state(pdev); pci_disable_device(pdev); + pci_set_power_state(pdev, PCI_D3cold); return 0; } -- GitLab From aba86d49e5ac3700295ab8c417436abacc19cc32 Mon Sep 17 00:00:00 2001 From: Maxime Ripard Date: Thu, 3 Apr 2025 15:33:30 +0200 Subject: [PATCH 0767/2211] drm/vc4: tests: Use return instead of assert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 9e26a3740cc08ef8bcdc5e5d824792cd677affce ] The vc4_mock_atomic_add_output() and vc4_mock_atomic_del_output() assert that the functions they are calling didn't fail. Since some of them can return EDEADLK, we can't properly deal with it. Since both functions are expected to return an int, and all caller check the return value, let's just properly propagate the errors when they occur. Fixes: f759f5b53f1c ("drm/vc4: tests: Introduce a mocking infrastructure") Fixes: 76ec18dc5afa ("drm/vc4: tests: Add unit test suite for the PV muxing") Reviewed-by: Maíra Canal Link: https://lore.kernel.org/r/20250403-drm-vc4-kunit-failures-v2-1-e09195cc8840@kernel.org Signed-off-by: Maxime Ripard Signed-off-by: Sasha Levin --- drivers/gpu/drm/vc4/tests/vc4_mock_output.c | 36 ++++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/vc4/tests/vc4_mock_output.c b/drivers/gpu/drm/vc4/tests/vc4_mock_output.c index e70d7c3076acf..f0ddc223c1f83 100644 --- a/drivers/gpu/drm/vc4/tests/vc4_mock_output.c +++ b/drivers/gpu/drm/vc4/tests/vc4_mock_output.c @@ -75,24 +75,30 @@ int vc4_mock_atomic_add_output(struct kunit *test, int ret; encoder = vc4_find_encoder_by_type(drm, type); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder); + if (!encoder) + return -ENODEV; crtc = vc4_find_crtc_for_encoder(test, drm, encoder); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc); + if (!crtc) + return -ENODEV; output = encoder_to_vc4_dummy_output(encoder); conn = &output->connector; conn_state = drm_atomic_get_connector_state(state, conn); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); + if (IS_ERR(conn_state)) + return PTR_ERR(conn_state); ret = drm_atomic_set_crtc_for_connector(conn_state, crtc); - KUNIT_EXPECT_EQ(test, ret, 0); + if (ret) + return ret; crtc_state = drm_atomic_get_crtc_state(state, crtc); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + if (IS_ERR(crtc_state)) + return PTR_ERR(crtc_state); ret = drm_atomic_set_mode_for_crtc(crtc_state, &default_mode); - KUNIT_EXPECT_EQ(test, ret, 0); + if (ret) + return ret; crtc_state->active = true; @@ -113,26 +119,32 @@ int vc4_mock_atomic_del_output(struct kunit *test, int ret; encoder = vc4_find_encoder_by_type(drm, type); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder); + if (!encoder) + return -ENODEV; crtc = vc4_find_crtc_for_encoder(test, drm, encoder); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc); + if (!crtc) + return -ENODEV; crtc_state = drm_atomic_get_crtc_state(state, crtc); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + if (IS_ERR(crtc_state)) + return PTR_ERR(crtc_state); crtc_state->active = false; ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL); - KUNIT_ASSERT_EQ(test, ret, 0); + if (ret) + return ret; output = encoder_to_vc4_dummy_output(encoder); conn = &output->connector; conn_state = drm_atomic_get_connector_state(state, conn); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); + if (IS_ERR(conn_state)) + return PTR_ERR(conn_state); ret = drm_atomic_set_crtc_for_connector(conn_state, NULL); - KUNIT_ASSERT_EQ(test, ret, 0); + if (ret) + return ret; return 0; } -- GitLab From 64f3acc8c7e6809631457b75638601b36dea3129 Mon Sep 17 00:00:00 2001 From: Charles Han Date: Thu, 27 Mar 2025 12:04:35 +0800 Subject: [PATCH 0768/2211] drm/amd/pp: Fix potential NULL pointer dereference in atomctrl_initialize_mc_reg_table [ Upstream commit 820116a39f96bdc7d426c33a804b52f53700a919 ] The function atomctrl_initialize_mc_reg_table() and atomctrl_initialize_mc_reg_table_v2_2() does not check the return value of smu_atom_get_data_table(). If smu_atom_get_data_table() fails to retrieve vram_info, it returns NULL which is later dereferenced. Fixes: b3892e2bb519 ("drm/amd/pp: Use atombios api directly in powerplay (v2)") Fixes: 5f92b48cf62c ("drm/amd/pm: add mc register table initialization") Signed-off-by: Charles Han Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.c index 5c54c9fd44619..a76fc15a55f5b 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.c +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.c @@ -144,6 +144,10 @@ int atomctrl_initialize_mc_reg_table( vram_info = (ATOM_VRAM_INFO_HEADER_V2_1 *) smu_atom_get_data_table(hwmgr->adev, GetIndexIntoMasterTable(DATA, VRAM_Info), &size, &frev, &crev); + if (!vram_info) { + pr_err("Could not retrieve the VramInfo table!"); + return -EINVAL; + } if (module_index >= vram_info->ucNumOfVRAMModule) { pr_err("Invalid VramInfo table."); @@ -181,6 +185,10 @@ int atomctrl_initialize_mc_reg_table_v2_2( vram_info = (ATOM_VRAM_INFO_HEADER_V2_2 *) smu_atom_get_data_table(hwmgr->adev, GetIndexIntoMasterTable(DATA, VRAM_Info), &size, &frev, &crev); + if (!vram_info) { + pr_err("Could not retrieve the VramInfo table!"); + return -EINVAL; + } if (module_index >= vram_info->ucNumOfVRAMModule) { pr_err("Invalid VramInfo table."); -- GitLab From 9d6e355a26fb790486249a43f2db58df66c4f95c Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Tue, 25 Feb 2025 10:40:33 +0100 Subject: [PATCH 0769/2211] media: rkvdec: Fix frame size enumeration [ Upstream commit f270005b99fa19fee9a6b4006e8dee37c10f1944 ] The VIDIOC_ENUM_FRAMESIZES ioctl should return all frame sizes (i.e. width and height in pixels) that the device supports for the given pixel format. It doesn't make a lot of sense to return the frame-sizes in a stepwise manner, which is used to enforce hardware alignments requirements for CAPTURE buffers, for coded formats. Instead, applications should receive an indication, about the maximum supported frame size for that hardware decoder, via a continuous frame-size enumeration. Fixes: cd33c830448b ("media: rkvdec: Add the rkvdec driver") Suggested-by: Alex Bee Signed-off-by: Jonas Karlman Reviewed-by: Nicolas Dufresne Signed-off-by: Nicolas Dufresne Signed-off-by: Hans Verkuil Signed-off-by: Sasha Levin --- drivers/staging/media/rkvdec/rkvdec.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c index ac398b5a97360..a1d941b0be00b 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -213,8 +213,14 @@ static int rkvdec_enum_framesizes(struct file *file, void *priv, if (!fmt) return -EINVAL; - fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; - fsize->stepwise = fmt->frmsize; + fsize->type = V4L2_FRMSIZE_TYPE_CONTINUOUS; + fsize->stepwise.min_width = 1; + fsize->stepwise.max_width = fmt->frmsize.max_width; + fsize->stepwise.step_width = 1; + fsize->stepwise.min_height = 1; + fsize->stepwise.max_height = fmt->frmsize.max_height; + fsize->stepwise.step_height = 1; + return 0; } -- GitLab From fa65c89f3fc1ca7d4112fd6ddd662b0f3d8dd760 Mon Sep 17 00:00:00 2001 From: Mark Rutland Date: Wed, 9 Apr 2025 17:39:58 +0100 Subject: [PATCH 0770/2211] arm64/fpsimd: Avoid RES0 bits in the SME trap handler [ Upstream commit 95507570fb2f75544af69760cd5d8f48fc5c7f20 ] The SME trap handler consumes RES0 bits from the ESR when determining the reason for the trap, and depends upon those bits reading as zero. This may break in future when those RES0 bits are allocated a meaning and stop reading as zero. For SME traps taken with ESR_ELx.EC == 0b011101, the specific reason for the trap is indicated by ESR_ELx.ISS.SMTC ("SME Trap Code"). This field occupies bits [2:0] of ESR_ELx.ISS, and as of ARM DDI 0487 L.a, bits [24:3] of ESR_ELx.ISS are RES0. ESR_ELx.ISS itself occupies bits [24:0] of ESR_ELx. Extract the SMTC field specifically, matching the way we handle ESR_ELx fields elsewhere, and ensuring that the handler is future-proof. Fixes: 8bd7f91c03d8 ("arm64/sme: Implement traps and syscall handling for SME") Signed-off-by: Mark Rutland Cc: Marc Zyngier Cc: Mark Brown Cc: Will Deacon Reviewed-by: Mark Brown Link: https://lore.kernel.org/r/20250409164010.3480271-2-mark.rutland@arm.com Signed-off-by: Catalin Marinas Signed-off-by: Sasha Levin --- arch/arm64/include/asm/esr.h | 14 ++++++++------ arch/arm64/kernel/fpsimd.c | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/arch/arm64/include/asm/esr.h b/arch/arm64/include/asm/esr.h index da6d2c1c0b030..5f4dc6364dbb9 100644 --- a/arch/arm64/include/asm/esr.h +++ b/arch/arm64/include/asm/esr.h @@ -370,12 +370,14 @@ /* * ISS values for SME traps */ - -#define ESR_ELx_SME_ISS_SME_DISABLED 0 -#define ESR_ELx_SME_ISS_ILL 1 -#define ESR_ELx_SME_ISS_SM_DISABLED 2 -#define ESR_ELx_SME_ISS_ZA_DISABLED 3 -#define ESR_ELx_SME_ISS_ZT_DISABLED 4 +#define ESR_ELx_SME_ISS_SMTC_MASK GENMASK(2, 0) +#define ESR_ELx_SME_ISS_SMTC(esr) ((esr) & ESR_ELx_SME_ISS_SMTC_MASK) + +#define ESR_ELx_SME_ISS_SMTC_SME_DISABLED 0 +#define ESR_ELx_SME_ISS_SMTC_ILL 1 +#define ESR_ELx_SME_ISS_SMTC_SM_DISABLED 2 +#define ESR_ELx_SME_ISS_SMTC_ZA_DISABLED 3 +#define ESR_ELx_SME_ISS_SMTC_ZT_DISABLED 4 /* ISS field definitions for MOPS exceptions */ #define ESR_ELx_MOPS_ISS_MEM_INST (UL(1) << 24) diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index f38d22dac140f..1aab12a320bbd 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -1436,7 +1436,7 @@ void do_sme_acc(unsigned long esr, struct pt_regs *regs) * If this not a trap due to SME being disabled then something * is being used in the wrong mode, report as SIGILL. */ - if (ESR_ELx_ISS(esr) != ESR_ELx_SME_ISS_SME_DISABLED) { + if (ESR_ELx_SME_ISS_SMTC(esr) != ESR_ELx_SME_ISS_SMTC_SME_DISABLED) { force_signal_inject(SIGILL, ILL_ILLOPC, regs->pc, 0); return; } -- GitLab From 6103f9ba51a59afb5a0f32299c837377c5a5a693 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Wed, 9 Apr 2025 17:40:02 +0100 Subject: [PATCH 0771/2211] arm64/fpsimd: Discard stale CPU state when handling SME traps [ Upstream commit d3eaab3c70905c5467e5c4ea403053d67505adeb ] The logic for handling SME traps manipulates saved FPSIMD/SVE/SME state incorrectly, and a race with preemption can result in a task having TIF_SME set and TIF_FOREIGN_FPSTATE clear even though the live CPU state is stale (e.g. with SME traps enabled). This can result in warnings from do_sme_acc() where SME traps are not expected while TIF_SME is set: | /* With TIF_SME userspace shouldn't generate any traps */ | if (test_and_set_thread_flag(TIF_SME)) | WARN_ON(1); This is very similar to the SVE issue we fixed in commit: 751ecf6afd6568ad ("arm64/sve: Discard stale CPU state when handling SVE traps") The race can occur when the SME trap handler is preempted before and after manipulating the saved FPSIMD/SVE/SME state, starting and ending on the same CPU, e.g. | void do_sme_acc(unsigned long esr, struct pt_regs *regs) | { | // Trap on CPU 0 with TIF_SME clear, SME traps enabled | // task->fpsimd_cpu is 0. | // per_cpu_ptr(&fpsimd_last_state, 0) is task. | | ... | | // Preempted; migrated from CPU 0 to CPU 1. | // TIF_FOREIGN_FPSTATE is set. | | get_cpu_fpsimd_context(); | | /* With TIF_SME userspace shouldn't generate any traps */ | if (test_and_set_thread_flag(TIF_SME)) | WARN_ON(1); | | if (!test_thread_flag(TIF_FOREIGN_FPSTATE)) { | unsigned long vq_minus_one = | sve_vq_from_vl(task_get_sme_vl(current)) - 1; | sme_set_vq(vq_minus_one); | | fpsimd_bind_task_to_cpu(); | } | | put_cpu_fpsimd_context(); | | // Preempted; migrated from CPU 1 to CPU 0. | // task->fpsimd_cpu is still 0 | // If per_cpu_ptr(&fpsimd_last_state, 0) is still task then: | // - Stale HW state is reused (with SME traps enabled) | // - TIF_FOREIGN_FPSTATE is cleared | // - A return to userspace skips HW state restore | } Fix the case where the state is not live and TIF_FOREIGN_FPSTATE is set by calling fpsimd_flush_task_state() to detach from the saved CPU state. This ensures that a subsequent context switch will not reuse the stale CPU state, and will instead set TIF_FOREIGN_FPSTATE, forcing the new state to be reloaded from memory prior to a return to userspace. Note: this was originallly posted as [1]. Fixes: 8bd7f91c03d8 ("arm64/sme: Implement traps and syscall handling for SME") Reported-by: Mark Rutland Signed-off-by: Mark Brown Link: https://lore.kernel.org/linux-arm-kernel/20241204-arm64-sme-reenable-v2-1-bae87728251d@kernel.org/ [ Rutland: rewrite commit message ] Signed-off-by: Mark Rutland Cc: Marc Zyngier Cc: Will Deacon Link: https://lore.kernel.org/r/20250409164010.3480271-6-mark.rutland@arm.com Signed-off-by: Catalin Marinas Signed-off-by: Sasha Levin --- arch/arm64/kernel/fpsimd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index 1aab12a320bbd..42b6740d1a64c 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -1460,6 +1460,8 @@ void do_sme_acc(unsigned long esr, struct pt_regs *regs) sme_set_vq(vq_minus_one); fpsimd_bind_task_to_cpu(); + } else { + fpsimd_flush_task_state(current); } put_cpu_fpsimd_context(); -- GitLab From 945d247d1ca25ad29db2bb33ad808185415a9b01 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Wed, 9 Apr 2025 17:40:03 +0100 Subject: [PATCH 0772/2211] arm64/fpsimd: Don't corrupt FPMR when streaming mode changes [ Upstream commit e5fa85fce08b21ed41643cb7968bf66bbd0532e3 ] When the effective value of PSTATE.SM is changed from 0 to 1 or from 1 to 0 by any method, an entry or exit to/from streaming SVE mode is performed, and hardware automatically resets a number of registers. As of ARM DDI 0487 L.a, this means: * All implemented bits of the SVE vector registers are set to zero. * All implemented bits of the SVE predicate registers are set to zero. * All implemented bits of FFR are set to zero, if FFR is implemented in the new mode. * FPSR is set to 0x0000_0000_0800_009f. * FPMR is set to 0, if FPMR is implemented. Currently task_fpsimd_load() restores FPMR before restoring SVCR (which is an accessor for PSTATE.{SM,ZA}), and so the restored value of FPMR may be clobbered if the restored value of PSTATE.SM happens to differ from the initial value of PSTATE.SM. Fix this by moving the restore of FPMR later. Note: this was originally posted as [1]. Fixes: 203f2b95a882 ("arm64/fpsimd: Support FEAT_FPMR") Signed-off-by: Mark Brown Link: https://lore.kernel.org/linux-arm-kernel/20241204-arm64-sme-reenable-v2-2-bae87728251d@kernel.org/ [ Rutland: rewrite commit message ] Signed-off-by: Mark Rutland Link: https://lore.kernel.org/r/20250409164010.3480271-7-mark.rutland@arm.com Signed-off-by: Catalin Marinas Signed-off-by: Sasha Levin --- arch/arm64/kernel/fpsimd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index 42b6740d1a64c..12982f1570fca 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -359,9 +359,6 @@ static void task_fpsimd_load(void) WARN_ON(preemptible()); WARN_ON(test_thread_flag(TIF_KERNEL_FPSTATE)); - if (system_supports_fpmr()) - write_sysreg_s(current->thread.uw.fpmr, SYS_FPMR); - if (system_supports_sve() || system_supports_sme()) { switch (current->thread.fp_type) { case FP_STATE_FPSIMD: @@ -413,6 +410,9 @@ static void task_fpsimd_load(void) restore_ffr = system_supports_fa64(); } + if (system_supports_fpmr()) + write_sysreg_s(current->thread.uw.fpmr, SYS_FPMR); + if (restore_sve_regs) { WARN_ON_ONCE(current->thread.fp_type != FP_STATE_SVE); sve_load_state(sve_pffr(¤t->thread), -- GitLab From 55d52af498daea75aa03ba9b7e444c8ae495ac20 Mon Sep 17 00:00:00 2001 From: Mark Rutland Date: Wed, 9 Apr 2025 17:40:04 +0100 Subject: [PATCH 0773/2211] arm64/fpsimd: Avoid clobbering kernel FPSIMD state with SMSTOP [ Upstream commit 01098d893fa8a6edb2b56e178b798e3e6b674f02 ] On system with SME, a thread's kernel FPSIMD state may be erroneously clobbered during a context switch immediately after that state is restored. Systems without SME are unaffected. If the CPU happens to be in streaming SVE mode before a context switch to a thread with kernel FPSIMD state, fpsimd_thread_switch() will restore the kernel FPSIMD state using fpsimd_load_kernel_state() while the CPU is still in streaming SVE mode. When fpsimd_thread_switch() subsequently calls fpsimd_flush_cpu_state(), this will execute an SMSTOP, causing an exit from streaming SVE mode. The exit from streaming SVE mode will cause the hardware to reset a number of FPSIMD/SVE/SME registers, clobbering the FPSIMD state. Fix this by calling fpsimd_flush_cpu_state() before restoring the kernel FPSIMD state. Fixes: e92bee9f861b ("arm64/fpsimd: Avoid erroneous elide of user state reload") Signed-off-by: Mark Rutland Cc: Ard Biesheuvel Cc: Mark Brown Cc: Will Deacon Reviewed-by: Mark Brown Link: https://lore.kernel.org/r/20250409164010.3480271-8-mark.rutland@arm.com Signed-off-by: Catalin Marinas Signed-off-by: Sasha Levin --- arch/arm64/kernel/fpsimd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index 12982f1570fca..9f2b83c50f7d9 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -1575,8 +1575,8 @@ void fpsimd_thread_switch(struct task_struct *next) fpsimd_save_user_state(); if (test_tsk_thread_flag(next, TIF_KERNEL_FPSTATE)) { - fpsimd_load_kernel_state(next); fpsimd_flush_cpu_state(); + fpsimd_load_kernel_state(next); } else { /* * Fix up TIF_FOREIGN_FPSTATE to correctly describe next's -- GitLab From 2756dac036113c7826f5b79b7f61ccd4c51093b3 Mon Sep 17 00:00:00 2001 From: Mark Rutland Date: Wed, 9 Apr 2025 17:40:05 +0100 Subject: [PATCH 0774/2211] arm64/fpsimd: Reset FPMR upon exec() [ Upstream commit a90878f297d3dba906a6261deccb1bd4a791ba52 ] An exec() is expected to reset all FPSIMD/SVE/SME state, and barring special handling of the vector lengths, the state is expected to reset to zero. This reset is handled in fpsimd_flush_thread(), which the core exec() code calls via flush_thread(). When support was added for FPMR, no logic was added to fpsimd_flush_thread() to reset the FPMR value, and thus it is erroneously inherited across an exec(). Add the missing reset of FPMR. Fixes: 203f2b95a882 ("arm64/fpsimd: Support FEAT_FPMR") Signed-off-by: Mark Rutland Cc: Marc Zyngier Cc: Mark Brown Cc: Will Deacon Reviewed-by: Mark Brown Link: https://lore.kernel.org/r/20250409164010.3480271-9-mark.rutland@arm.com Signed-off-by: Catalin Marinas Signed-off-by: Sasha Levin --- arch/arm64/kernel/fpsimd.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index 9f2b83c50f7d9..8b8cd9d238234 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -1663,6 +1663,9 @@ void fpsimd_flush_thread(void) current->thread.svcr = 0; } + if (system_supports_fpmr()) + current->thread.uw.fpmr = 0; + current->thread.fp_type = FP_STATE_FPSIMD; put_cpu_fpsimd_context(); -- GitLab From f5ffc750dbfb22f1e47e1e59616cbf956145cc50 Mon Sep 17 00:00:00 2001 From: Mark Rutland Date: Wed, 9 Apr 2025 17:40:06 +0100 Subject: [PATCH 0775/2211] arm64/fpsimd: Fix merging of FPSIMD state during signal return [ Upstream commit c94f2f326146a34066a0070ed90b8bc656b1842f ] For backwards compatibility reasons, when a signal return occurs which restores SVE state, the effective lower 128 bits of each of the SVE vector registers are restored from the corresponding FPSIMD vector register in the FPSIMD signal frame, overriding the values in the SVE signal frame. This is intended to be the case regardless of streaming mode. To make this happen, restore_sve_fpsimd_context() uses fpsimd_update_current_state() to merge the lower 128 bits from the FPSIMD signal frame into the SVE register state. Unfortunately, fpsimd_update_current_state() performs this merging dependent upon TIF_SVE, which is not always correct for streaming SVE register state: * When restoring non-streaming SVE register state there is no observable problem, as the signal return code configures TIF_SVE and the saved fp_type to match before calling fpsimd_update_current_state(), which observes either: - TIF_SVE set AND fp_type == FP_STATE_SVE - TIF_SVE clear AND fp_type == FP_STATE_FPSIMD * On systems which have SME but not SVE, TIF_SVE cannot be set. Thus the merging will never happen for the streaming SVE register state. * On systems which have SVE and SME, TIF_SVE can be set and cleared independently of PSTATE.SM. Thus the merging may or may not happen for streaming SVE register state. As TIF_SVE can be cleared non-deterministically during syscalls (including at the start of sigreturn()), the merging may occur non-deterministically from the perspective of userspace. This logic has been broken since its introduction in commit: 85ed24dad2904f7c ("arm64/sme: Implement streaming SVE signal handling") ... at which point both fpsimd_signal_preserve_current_state() and fpsimd_update_current_state() only checked TIF SVE. When PSTATE.SM==1 and TIF_SVE was clear, signal delivery would place stale FPSIMD state into the FPSIMD signal frame, and signal return would not merge this into the restored register state. Subsequently, signal delivery was fixed as part of commit: 61da7c8e2a602f66 ("arm64/signal: Don't assume that TIF_SVE means we saved SVE state") ... but signal restore was not given a corresponding fix, and when TIF_SVE was clear, signal restore would still fail to merge the FPSIMD state into the restored SVE register state. The 'Fixes' tag did not indicate that this had been broken since its introduction. Fix this by merging the FPSIMD state dependent upon the saved fp_type, matching what we (currently) do during signal delivery. As described above, when backporting this commit, it will also be necessary to backport commit: 61da7c8e2a602f66 ("arm64/signal: Don't assume that TIF_SVE means we saved SVE state") ... and prior to commit: baa8515281b30861 ("arm64/fpsimd: Track the saved FPSIMD state type separately to TIF_SVE") ... it will be necessary for fpsimd_signal_preserve_current_state() and fpsimd_update_current_state() to consider both TIF_SVE and thread_sm_enabled(¤t->thread), in place of the saved fp_type. Fixes: 85ed24dad290 ("arm64/sme: Implement streaming SVE signal handling") Signed-off-by: Mark Rutland Cc: Marc Zyngier Cc: Mark Brown Cc: Will Deacon Reviewed-by: Mark Brown Link: https://lore.kernel.org/r/20250409164010.3480271-10-mark.rutland@arm.com Signed-off-by: Catalin Marinas Signed-off-by: Sasha Levin --- arch/arm64/kernel/fpsimd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index 8b8cd9d238234..9f4f3d54c2207 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -1806,7 +1806,7 @@ void fpsimd_update_current_state(struct user_fpsimd_state const *state) get_cpu_fpsimd_context(); current->thread.uw.fpsimd_state = *state; - if (test_thread_flag(TIF_SVE)) + if (current->thread.fp_type == FP_STATE_SVE) fpsimd_to_sve(current); task_fpsimd_load(); -- GitLab From d94b25ac50bc1f77668caef663a231a12bae8fd6 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 4 Apr 2025 10:09:29 +0200 Subject: [PATCH 0776/2211] drm/panthor: Fix GPU_COHERENCY_ACE[_LITE] definitions [ Upstream commit d1df2907fb69df56aad8e4a0734dac0778c234a7 ] GPU_COHERENCY_ACE and GPU_COHERENCY_ACE_LITE definitions have been swapped. Changes in v2: - New patch Changes in v3: - Add Steve's R-b Reported-by: Liviu Dudau Fixes: 546b366600ef ("drm/panthor: Add GPU register definitions") Reviewed-by: Steven Price Reviewed-by: Liviu Dudau Link: https://lore.kernel.org/r/20250404080933.2912674-2-boris.brezillon@collabora.com Signed-off-by: Boris Brezillon Signed-off-by: Sasha Levin --- drivers/gpu/drm/panthor/panthor_regs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/panthor/panthor_regs.h b/drivers/gpu/drm/panthor/panthor_regs.h index b7b3b3add1662..a7a323dc5cf92 100644 --- a/drivers/gpu/drm/panthor/panthor_regs.h +++ b/drivers/gpu/drm/panthor/panthor_regs.h @@ -133,8 +133,8 @@ #define GPU_COHERENCY_PROT_BIT(name) BIT(GPU_COHERENCY_ ## name) #define GPU_COHERENCY_PROTOCOL 0x304 -#define GPU_COHERENCY_ACE 0 -#define GPU_COHERENCY_ACE_LITE 1 +#define GPU_COHERENCY_ACE_LITE 0 +#define GPU_COHERENCY_ACE 1 #define GPU_COHERENCY_NONE 31 #define MCU_CONTROL 0x700 -- GitLab From 8e6a63acc468ce182fdd44b9da247b7492ab6bc7 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 4 Apr 2025 10:09:31 +0200 Subject: [PATCH 0777/2211] drm/panthor: Update panthor_mmu::irq::mask when needed [ Upstream commit 8ba64cf2f358079d09faba7529aad2b0a46c7903 ] When we clear the faulty bits in the AS mask, we also need to update the panthor_mmu::irq::mask field otherwise our IRQ handler won't get called again until the GPU is reset. Changes in v2: - Add Liviu's R-b Changes in v3: - Add Steve's R-b Fixes: 647810ec2476 ("drm/panthor: Add the MMU/VM logical block") Reviewed-by: Liviu Dudau Reviewed-by: Steven Price Link: https://lore.kernel.org/r/20250404080933.2912674-4-boris.brezillon@collabora.com Signed-off-by: Boris Brezillon Signed-off-by: Sasha Levin --- drivers/gpu/drm/panthor/panthor_mmu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/panthor/panthor_mmu.c index 0e6f94df690dd..b57824abeb9ee 100644 --- a/drivers/gpu/drm/panthor/panthor_mmu.c +++ b/drivers/gpu/drm/panthor/panthor_mmu.c @@ -780,6 +780,7 @@ out_enable_as: if (ptdev->mmu->as.faulty_mask & panthor_mmu_as_fault_mask(ptdev, as)) { gpu_write(ptdev, MMU_INT_CLEAR, panthor_mmu_as_fault_mask(ptdev, as)); ptdev->mmu->as.faulty_mask &= ~panthor_mmu_as_fault_mask(ptdev, as); + ptdev->mmu->irq.mask |= panthor_mmu_as_fault_mask(ptdev, as); gpu_write(ptdev, MMU_INT_MASK, ~ptdev->mmu->as.faulty_mask); } -- GitLab From 7e958e116e3be05a1f869b5a885fc5d674c7725f Mon Sep 17 00:00:00 2001 From: Hongbo Yao Date: Thu, 3 Apr 2025 15:09:18 +0800 Subject: [PATCH 0778/2211] perf: arm-ni: Unregister PMUs on probe failure [ Upstream commit 7f57afde6a44d9e044885e1125034edd4fda02e8 ] When a resource allocation fails in one clock domain of an NI device, we need to properly roll back all previously registered perf PMUs in other clock domains of the same device. Otherwise, it can lead to kernel panics. Calling arm_ni_init+0x0/0xff8 [arm_ni] @ 2374 arm-ni ARMHCB70:00: Failed to request PMU region 0x1f3c13000 arm-ni ARMHCB70:00: probe with driver arm-ni failed with error -16 list_add corruption: next->prev should be prev (fffffd01e9698a18), but was 0000000000000000. (next=ffff10001a0decc8). pstate: 6340009 (nZCv daif +PAN -UAO +TCO +DIT -SSBS BTYPE=--) pc : list_add_valid_or_report+0x7c/0xb8 lr : list_add_valid_or_report+0x7c/0xb8 Call trace: __list_add_valid_or_report+0x7c/0xb8 perf_pmu_register+0x22c/0x3a0 arm_ni_probe+0x554/0x70c [arm_ni] platform_probe+0x70/0xe8 really_probe+0xc6/0x4d8 driver_probe_device+0x48/0x170 __driver_attach+0x8e/0x1c0 bus_for_each_dev+0x64/0xf0 driver_add+0x138/0x260 bus_add_driver+0x68/0x138 __platform_driver_register+0x2c/0x40 arm_ni_init+0x14/0x2a [arm_ni] do_init_module+0x36/0x298 ---[ end trace 0000000000000000 ]--- Kernel panic - not syncing: Oops - BUG: Fatal exception SMP: stopping secondary CPUs Fixes: 4d5a7680f2b4 ("perf: Add driver for Arm NI-700 interconnect PMU") Signed-off-by: Hongbo Yao Reviewed-by: Robin Murphy Link: https://lore.kernel.org/r/20250403070918.4153839-1-andy.xu@hj-micro.com Signed-off-by: Will Deacon Signed-off-by: Sasha Levin --- drivers/perf/arm-ni.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/drivers/perf/arm-ni.c b/drivers/perf/arm-ni.c index 90fcfe693439e..3f3d2e0f91fa7 100644 --- a/drivers/perf/arm-ni.c +++ b/drivers/perf/arm-ni.c @@ -576,6 +576,23 @@ static int arm_ni_init_cd(struct arm_ni *ni, struct arm_ni_node *node, u64 res_s return err; } +static void arm_ni_remove(struct platform_device *pdev) +{ + struct arm_ni *ni = platform_get_drvdata(pdev); + + for (int i = 0; i < ni->num_cds; i++) { + struct arm_ni_cd *cd = ni->cds + i; + + if (!cd->pmu_base) + continue; + + writel_relaxed(0, cd->pmu_base + NI_PMCR); + writel_relaxed(U32_MAX, cd->pmu_base + NI_PMINTENCLR); + perf_pmu_unregister(&cd->pmu); + cpuhp_state_remove_instance_nocalls(arm_ni_hp_state, &cd->cpuhp_node); + } +} + static void arm_ni_probe_domain(void __iomem *base, struct arm_ni_node *node) { u32 reg = readl_relaxed(base + NI_NODE_TYPE); @@ -657,8 +674,11 @@ static int arm_ni_probe(struct platform_device *pdev) reg = readl_relaxed(pd.base + NI_CHILD_PTR(c)); arm_ni_probe_domain(base + reg, &cd); ret = arm_ni_init_cd(ni, &cd, res->start); - if (ret) + if (ret) { + ni->cds[cd.id].pmu_base = NULL; + arm_ni_remove(pdev); return ret; + } } } } @@ -666,23 +686,6 @@ static int arm_ni_probe(struct platform_device *pdev) return 0; } -static void arm_ni_remove(struct platform_device *pdev) -{ - struct arm_ni *ni = platform_get_drvdata(pdev); - - for (int i = 0; i < ni->num_cds; i++) { - struct arm_ni_cd *cd = ni->cds + i; - - if (!cd->pmu_base) - continue; - - writel_relaxed(0, cd->pmu_base + NI_PMCR); - writel_relaxed(U32_MAX, cd->pmu_base + NI_PMINTENCLR); - perf_pmu_unregister(&cd->pmu); - cpuhp_state_remove_instance_nocalls(arm_ni_hp_state, &cd->cpuhp_node); - } -} - #ifdef CONFIG_OF static const struct of_device_id arm_ni_of_match[] = { { .compatible = "arm,ni-700" }, -- GitLab From 8e43fa9c713a6d084a5732aa6dd41c734845f25e Mon Sep 17 00:00:00 2001 From: Hongbo Yao Date: Tue, 1 Apr 2025 13:42:48 +0800 Subject: [PATCH 0779/2211] perf: arm-ni: Fix missing platform_set_drvdata() [ Upstream commit fc5106088d6db75df61308ef6de314d1f7959646 ] Add missing platform_set_drvdata in arm_ni_probe(), otherwise calling platform_get_drvdata() in remove returns NULL. Fixes: 4d5a7680f2b4 ("perf: Add driver for Arm NI-700 interconnect PMU") Signed-off-by: Hongbo Yao Reviewed-by: Robin Murphy Link: https://lore.kernel.org/r/20250401054248.3985814-1-andy.xu@hj-micro.com Signed-off-by: Will Deacon Signed-off-by: Sasha Levin --- drivers/perf/arm-ni.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/perf/arm-ni.c b/drivers/perf/arm-ni.c index 3f3d2e0f91fa7..b87d3a9ba7d54 100644 --- a/drivers/perf/arm-ni.c +++ b/drivers/perf/arm-ni.c @@ -661,6 +661,7 @@ static int arm_ni_probe(struct platform_device *pdev) ni->num_cds = num_cds; ni->part = part; ni->id = atomic_fetch_inc(&id); + platform_set_drvdata(pdev, ni); for (int v = 0; v < cfg.num_components; v++) { reg = readl_relaxed(cfg.base + NI_CHILD_PTR(v)); -- GitLab From 8a88840699df2ce1862d6f193c920eeaff938153 Mon Sep 17 00:00:00 2001 From: Casey Connolly Date: Sat, 19 Apr 2025 18:31:44 +0200 Subject: [PATCH 0780/2211] drm/panel: samsung-sofef00: Drop s6e3fc2x01 support [ Upstream commit e1eb7293ab4107e9e19fa609835e657fe30dfec7 ] We never properly supported this panel and always used the wrong init sequence. Drop support so we can move it to it's own proper driver. Fixes: 5933baa36e26 ("drm/panel/samsung-sofef00: Add panel for OnePlus 6/T devices") Signed-off-by: Casey Connolly Signed-off-by: David Heidelberg Reviewed-by: Neil Armstrong Signed-off-by: Neil Armstrong Link: https://lore.kernel.org/r/20250419-drop-s6e3fc2x01-support-v1-1-05edfe0d27aa@ixit.cz Signed-off-by: Sasha Levin --- drivers/gpu/drm/panel/panel-samsung-sofef00.c | 34 ++----------------- 1 file changed, 2 insertions(+), 32 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-samsung-sofef00.c b/drivers/gpu/drm/panel/panel-samsung-sofef00.c index 04ce925b3d9db..49cfa84b34f0c 100644 --- a/drivers/gpu/drm/panel/panel-samsung-sofef00.c +++ b/drivers/gpu/drm/panel/panel-samsung-sofef00.c @@ -22,7 +22,6 @@ struct sofef00_panel { struct mipi_dsi_device *dsi; struct regulator *supply; struct gpio_desc *reset_gpio; - const struct drm_display_mode *mode; }; static inline @@ -159,26 +158,11 @@ static const struct drm_display_mode enchilada_panel_mode = { .height_mm = 145, }; -static const struct drm_display_mode fajita_panel_mode = { - .clock = (1080 + 72 + 16 + 36) * (2340 + 32 + 4 + 18) * 60 / 1000, - .hdisplay = 1080, - .hsync_start = 1080 + 72, - .hsync_end = 1080 + 72 + 16, - .htotal = 1080 + 72 + 16 + 36, - .vdisplay = 2340, - .vsync_start = 2340 + 32, - .vsync_end = 2340 + 32 + 4, - .vtotal = 2340 + 32 + 4 + 18, - .width_mm = 68, - .height_mm = 145, -}; - static int sofef00_panel_get_modes(struct drm_panel *panel, struct drm_connector *connector) { struct drm_display_mode *mode; - struct sofef00_panel *ctx = to_sofef00_panel(panel); - mode = drm_mode_duplicate(connector->dev, ctx->mode); + mode = drm_mode_duplicate(connector->dev, &enchilada_panel_mode); if (!mode) return -ENOMEM; @@ -239,13 +223,6 @@ static int sofef00_panel_probe(struct mipi_dsi_device *dsi) if (!ctx) return -ENOMEM; - ctx->mode = of_device_get_match_data(dev); - - if (!ctx->mode) { - dev_err(dev, "Missing device mode\n"); - return -ENODEV; - } - ctx->supply = devm_regulator_get(dev, "vddio"); if (IS_ERR(ctx->supply)) return dev_err_probe(dev, PTR_ERR(ctx->supply), @@ -295,14 +272,7 @@ static void sofef00_panel_remove(struct mipi_dsi_device *dsi) } static const struct of_device_id sofef00_panel_of_match[] = { - { // OnePlus 6 / enchilada - .compatible = "samsung,sofef00", - .data = &enchilada_panel_mode, - }, - { // OnePlus 6T / fajita - .compatible = "samsung,s6e3fc2x01", - .data = &fajita_panel_mode, - }, + { .compatible = "samsung,sofef00" }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, sofef00_panel_of_match); -- GitLab From 33c9956b46bec825c9117e1e9d4442555ec40982 Mon Sep 17 00:00:00 2001 From: Christophe JAILLET Date: Fri, 18 Apr 2025 08:48:16 +0200 Subject: [PATCH 0781/2211] drm/bridge: lt9611uxc: Fix an error handling path in lt9611uxc_probe() [ Upstream commit b848cd418aebdb313364b4843f41fae82281a823 ] If lt9611uxc_audio_init() fails, some resources still need to be released before returning the error code. Use the existing error handling path. Fixes: 0cbbd5b1a012 ("drm: bridge: add support for lontium LT9611UXC bridge") Signed-off-by: Christophe JAILLET Reviewed-by: Dmitry Baryshkov Link: https://lore.kernel.org/r/f167608e392c6b4d7d7f6e45e3c21878feb60cbd.1744958833.git.christophe.jaillet@wanadoo.fr Signed-off-by: Dmitry Baryshkov Signed-off-by: Sasha Levin --- drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c index 4d1d40e1f1b4d..748bed8acd2d9 100644 --- a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c +++ b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c @@ -879,7 +879,11 @@ retry: } } - return lt9611uxc_audio_init(dev, lt9611uxc); + ret = lt9611uxc_audio_init(dev, lt9611uxc); + if (ret) + goto err_remove_bridge; + + return 0; err_remove_bridge: free_irq(client->irq, lt9611uxc); -- GitLab From 2d5879f64554181b89f44d4817b9ea86e8e913e1 Mon Sep 17 00:00:00 2001 From: Andrey Vatoropin Date: Tue, 18 Mar 2025 13:42:18 +0000 Subject: [PATCH 0782/2211] fs/ntfs3: handle hdr_first_de() return value [ Upstream commit af5cab0e5b6f8edb0be51a9f47f3f620e0b4fd70 ] The hdr_first_de() function returns a pointer to a struct NTFS_DE. This pointer may be NULL. To handle the NULL error effectively, it is important to implement an error handler. This will help manage potential errors consistently. Additionally, error handling for the return value already exists at other points where this function is called. Found by Linux Verification Center (linuxtesting.org) with SVACE. Fixes: 82cae269cfa9 ("fs/ntfs3: Add initialization of super block") Signed-off-by: Andrey Vatoropin Signed-off-by: Konstantin Komarov Signed-off-by: Sasha Levin --- fs/ntfs3/index.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fs/ntfs3/index.c b/fs/ntfs3/index.c index 78d20e4baa2c9..1bf2a6593dec6 100644 --- a/fs/ntfs3/index.c +++ b/fs/ntfs3/index.c @@ -2182,6 +2182,10 @@ static int indx_get_entry_to_replace(struct ntfs_index *indx, e = hdr_first_de(&n->index->ihdr); fnd_push(fnd, n, e); + if (!e) { + err = -EINVAL; + goto out; + } if (!de_is_last(e)) { /* @@ -2203,6 +2207,10 @@ static int indx_get_entry_to_replace(struct ntfs_index *indx, n = fnd->nodes[level]; te = hdr_first_de(&n->index->ihdr); + if (!te) { + err = -EINVAL; + goto out; + } /* Copy the candidate entry into the replacement entry buffer. */ re = kmalloc(le16_to_cpu(te->size) + sizeof(u64), GFP_NOFS); if (!re) { -- GitLab From e2bbe6336d15ef2d7eeb9503178ca05d3f23e463 Mon Sep 17 00:00:00 2001 From: Lizhi Xu Date: Tue, 15 Apr 2025 17:26:37 +0800 Subject: [PATCH 0783/2211] fs/ntfs3: Add missing direct_IO in ntfs_aops_cmpr [ Upstream commit 8b26c8c376b29cf29710fbfd093df194cefe26ad ] The ntfs3 can use the page cache directly, so its address_space_operations need direct_IO. Exit ntfs_direct_IO() if it is a compressed file. Fixes: b432163ebd15 ("fs/ntfs3: Update inode->i_mapping->a_ops on compression state") Reported-by: syzbot+e36cc3297bd3afd25e19@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=e36cc3297bd3afd25e19 Signed-off-by: Lizhi Xu Signed-off-by: Konstantin Komarov Signed-off-by: Sasha Levin --- fs/ntfs3/inode.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c index a1e11228dafd0..5c05cccd2d40b 100644 --- a/fs/ntfs3/inode.c +++ b/fs/ntfs3/inode.c @@ -805,6 +805,10 @@ static ssize_t ntfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) ret = 0; goto out; } + if (is_compressed(ni)) { + ret = 0; + goto out; + } ret = blockdev_direct_IO(iocb, inode, iter, wr ? ntfs_get_block_direct_IO_W : @@ -2108,5 +2112,6 @@ const struct address_space_operations ntfs_aops_cmpr = { .read_folio = ntfs_read_folio, .readahead = ntfs_readahead, .dirty_folio = block_dirty_folio, + .direct_IO = ntfs_direct_IO, }; // clang-format on -- GitLab From 980b0895a08cdb29d2c380b9521235c09b786b9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Wed, 16 Apr 2025 14:44:19 +0200 Subject: [PATCH 0784/2211] kunit/usercopy: Disable u64 test on 32-bit SPARC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 0d6efa20e384a41a7f4afdcd8a0aec442c19d33e ] usercopy of 64 bit values does not work on 32-bit SPARC: # usercopy_test_valid: EXPECTATION FAILED at lib/tests/usercopy_kunit.c:209 Expected val_u64 == 0x5a5b5c5d6a6b6c6d, but val_u64 == 1515936861 (0x5a5b5c5d) 0x5a5b5c5d6a6b6c6d == 6510899242581322861 (0x5a5b5c5d6a6b6c6d) Disable the test. Fixes: 4c5d7bc63775 ("usercopy: Add tests for all get_user() sizes") Signed-off-by: Thomas Weißschuh Link: https://lore.kernel.org/r/20250416-kunit-sparc-usercopy-v1-1-a772054db3af@linutronix.de Signed-off-by: Kees Cook Signed-off-by: Sasha Levin --- lib/usercopy_kunit.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/usercopy_kunit.c b/lib/usercopy_kunit.c index 77fa00a13df77..80f8abe10968c 100644 --- a/lib/usercopy_kunit.c +++ b/lib/usercopy_kunit.c @@ -27,6 +27,7 @@ !defined(CONFIG_MICROBLAZE) && \ !defined(CONFIG_NIOS2) && \ !defined(CONFIG_PPC32) && \ + !defined(CONFIG_SPARC32) && \ !defined(CONFIG_SUPERH)) # define TEST_U64 #endif -- GitLab From 214307d69b2c5f377b1c18b570fead206425257f Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Tue, 15 Apr 2025 15:52:49 -0700 Subject: [PATCH 0785/2211] watchdog: exar: Shorten identity name to fit correctly [ Upstream commit 8e28276a569addb8a2324439ae473848ee52b056 ] The static initializer for struct watchdog_info::identity is too long and gets initialized without a trailing NUL byte. Since the length of "identity" is part of UAPI and tied to ioctls, just shorten the name of the device. Avoids the warning seen with GCC 15's -Wunterminated-string-initialization option: drivers/watchdog/exar_wdt.c:224:27: warning: initializer-string for array of 'unsigned char' truncates NUL terminator but destination lacks 'nonstring' attribute (33 chars into 32 available) [-Wunterminated-string-initialization] 224 | .identity = "Exar/MaxLinear XR28V38x Watchdog", | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Fixes: 81126222bd3a ("watchdog: Exar/MaxLinear XR28V38x driver") Reviewed-by: Guenter Roeck Link: https://lore.kernel.org/r/20250415225246.work.458-kees@kernel.org Signed-off-by: Kees Cook Signed-off-by: Sasha Levin --- drivers/watchdog/exar_wdt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/watchdog/exar_wdt.c b/drivers/watchdog/exar_wdt.c index 7c61ff3432711..c2e3bb08df899 100644 --- a/drivers/watchdog/exar_wdt.c +++ b/drivers/watchdog/exar_wdt.c @@ -221,7 +221,7 @@ static const struct watchdog_info exar_wdt_info = { .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE, - .identity = "Exar/MaxLinear XR28V38x Watchdog", + .identity = "Exar XR28V38x Watchdog", }; static const struct watchdog_ops exar_wdt_ops = { -- GitLab From 7ccf0c4070c2b4d2da72daee224a7a7dd5af67d1 Mon Sep 17 00:00:00 2001 From: Finn Thain Date: Thu, 24 Apr 2025 10:07:26 +1000 Subject: [PATCH 0786/2211] m68k: mac: Fix macintosh_config for Mac II [ Upstream commit 52ae3f5da7e5adbe3d1319573b55dac470abb83c ] When booted on my Mac II, the kernel prints this: Detected Macintosh model: 6 Apple Macintosh Unknown The catch-all entry ("Unknown") is mac_data_table[0] which is only needed in the unlikely event that the bootinfo model ID can't be matched. When model ID is 6, the search should begin and end at mac_data_table[1]. Fix the off-by-one error that causes this problem. Cc: Joshua Thompson Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Finn Thain Reviewed-by: Geert Uytterhoeven Link: https://lore.kernel.org/d0f30a551064ca4810b1c48d5a90954be80634a9.1745453246.git.fthain@linux-m68k.org Signed-off-by: Geert Uytterhoeven Signed-off-by: Sasha Levin --- arch/m68k/mac/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c index e324410ef239c..d26c7f4f8c360 100644 --- a/arch/m68k/mac/config.c +++ b/arch/m68k/mac/config.c @@ -793,7 +793,7 @@ static void __init mac_identify(void) } macintosh_config = mac_data_table; - for (m = macintosh_config; m->ident != -1; m++) { + for (m = &mac_data_table[1]; m->ident != -1; m++) { if (m->ident == model) { macintosh_config = m; break; -- GitLab From 0860d48b70fd4b4a544f252e539523a9ecdfe533 Mon Sep 17 00:00:00 2001 From: Miaoqian Lin Date: Tue, 18 Mar 2025 23:17:12 +0800 Subject: [PATCH 0787/2211] firmware: psci: Fix refcount leak in psci_dt_init [ Upstream commit 7ff37d29fd5c27617b9767e1b8946d115cf93a1e ] Fix a reference counter leak in psci_dt_init() where of_node_put(np) was missing after of_find_matching_node_and_match() when np is unavailable. Fixes: d09a0011ec0d ("drivers: psci: Allow PSCI node to be disabled") Signed-off-by: Miaoqian Lin Reviewed-by: Gavin Shan Acked-by: Mark Rutland Link: https://lore.kernel.org/r/20250318151712.28763-1-linmq006@gmail.com Signed-off-by: Will Deacon Signed-off-by: Sasha Levin --- drivers/firmware/psci/psci.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c index 2328ca58bba61..d6701d81cf680 100644 --- a/drivers/firmware/psci/psci.c +++ b/drivers/firmware/psci/psci.c @@ -759,8 +759,10 @@ int __init psci_dt_init(void) np = of_find_matching_node_and_match(NULL, psci_of_match, &matched_np); - if (!np || !of_device_is_available(np)) + if (!np || !of_device_is_available(np)) { + of_node_put(np); return -ENODEV; + } init_fn = (psci_initcall_t)matched_np->data; ret = init_fn(np); -- GitLab From a4ea7408623732504802f1ed9eaf3d78931388ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kornel=20Dul=C4=99ba?= Date: Thu, 17 Apr 2025 11:47:54 +0000 Subject: [PATCH 0788/2211] arm64: Support ARM64_VA_BITS=52 when setting ARCH_MMAP_RND_BITS_MAX MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit f101c56447717c595d803894ba0e215f56c6fba4 ] When the 52-bit virtual addressing was introduced the select like ARCH_MMAP_RND_BITS_MAX logic was never updated to account for it. Because of that the rnd max bits knob is set to the default value of 18 when ARM64_VA_BITS=52. Fix this by setting ARCH_MMAP_RND_BITS_MAX to the same value that would be used if 48-bit addressing was used. Higher values can't used here because 52-bit addressing is used only if the caller provides a hint to mmap, with a fallback to 48-bit. The knob in question is an upper bound for what the user can set in /proc/sys/vm/mmap_rnd_bits, which in turn is used to determine how many random bits can be inserted into the base address used for mmap allocations. Since 48-bit allocations are legal with ARM64_VA_BITS=52, we need to make sure that the base address is small enough to facilitate this. Fixes: b6d00d47e81a ("arm64: mm: Introduce 52-bit Kernel VAs") Signed-off-by: Kornel Dulęba Reviewed-by: Anshuman Khandual Link: https://lore.kernel.org/r/20250417114754.3238273-1-korneld@google.com Signed-off-by: Will Deacon Signed-off-by: Sasha Levin --- arch/arm64/Kconfig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index a11a7a42edbfb..7887d18cce3e4 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -322,9 +322,9 @@ config ARCH_MMAP_RND_BITS_MAX default 24 if ARM64_VA_BITS=39 default 27 if ARM64_VA_BITS=42 default 30 if ARM64_VA_BITS=47 - default 29 if ARM64_VA_BITS=48 && ARM64_64K_PAGES - default 31 if ARM64_VA_BITS=48 && ARM64_16K_PAGES - default 33 if ARM64_VA_BITS=48 + default 29 if (ARM64_VA_BITS=48 || ARM64_VA_BITS=52) && ARM64_64K_PAGES + default 31 if (ARM64_VA_BITS=48 || ARM64_VA_BITS=52) && ARM64_16K_PAGES + default 33 if (ARM64_VA_BITS=48 || ARM64_VA_BITS=52) default 14 if ARM64_64K_PAGES default 16 if ARM64_16K_PAGES default 18 -- GitLab From 64a9ee6e111ea1e5ca0bc03a18fab3df5776684d Mon Sep 17 00:00:00 2001 From: Mark Rutland Date: Wed, 30 Apr 2025 18:32:40 +0100 Subject: [PATCH 0789/2211] arm64/fpsimd: Avoid warning when sve_to_fpsimd() is unused [ Upstream commit f699c66691fb7e08a5a631c5baf5f2a19b7a6468 ] Historically fpsimd_to_sve() and sve_to_fpsimd() were (conditionally) called by functions which were defined regardless of CONFIG_ARM64_SVE. Hence it was necessary that both fpsimd_to_sve() and sve_to_fpsimd() were always defined and not guarded by ifdeffery. As a result of the removal of fpsimd_signal_preserve_current_state() in commit: 929fa99b1215966f ("arm64/fpsimd: signal: Always save+flush state early") ... sve_to_fpsimd() has no callers when CONFIG_ARM64_SVE=n, resulting in a build-time warnign that it is unused: | arch/arm64/kernel/fpsimd.c:676:13: warning: unused function 'sve_to_fpsimd' [-Wunused-function] | 676 | static void sve_to_fpsimd(struct task_struct *task) | | ^~~~~~~~~~~~~ | 1 warning generated. In contrast, fpsimd_to_sve() still has callers which are defined when CONFIG_ARM64_SVE=n, and it would be awkward to hide this behind ifdeffery and/or to use stub functions. For now, suppress the warning by marking both fpsimd_to_sve() and sve_to_fpsimd() as 'static inline', as we usually do for stub functions. The compiler will no longer warn if either function is unused. Aside from suppressing the warning, there should be no functional change as a result of this patch. Link: https://lore.kernel.org/linux-arm-kernel/20250429194600.GA26883@willie-the-truck/ Reported-by: Will Deacon Fixes: 929fa99b1215 ("arm64/fpsimd: signal: Always save+flush state early") Signed-off-by: Mark Rutland Cc: Marc Zyngier Cc: Mark Brown Cc: Will Deacon Link: https://lore.kernel.org/r/20250430173240.4023627-1-mark.rutland@arm.com Signed-off-by: Catalin Marinas Signed-off-by: Sasha Levin --- arch/arm64/kernel/fpsimd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index 9f4f3d54c2207..c5285ee55bfb0 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -651,7 +651,7 @@ static void __fpsimd_to_sve(void *sst, struct user_fpsimd_state const *fst, * task->thread.uw.fpsimd_state must be up to date before calling this * function. */ -static void fpsimd_to_sve(struct task_struct *task) +static inline void fpsimd_to_sve(struct task_struct *task) { unsigned int vq; void *sst = task->thread.sve_state; @@ -675,7 +675,7 @@ static void fpsimd_to_sve(struct task_struct *task) * bytes of allocated kernel memory. * task->thread.sve_state must be up to date before calling this function. */ -static void sve_to_fpsimd(struct task_struct *task) +static inline void sve_to_fpsimd(struct task_struct *task) { unsigned int vq, vl; void const *sst = task->thread.sve_state; -- GitLab From ebf467c0ba356c2aa3365cacb6e0a2d00e117815 Mon Sep 17 00:00:00 2001 From: Neill Kapron Date: Sun, 27 Apr 2025 09:40:58 +0000 Subject: [PATCH 0790/2211] selftests/seccomp: fix syscall_restart test for arm compat [ Upstream commit 797002deed03491215a352ace891749b39741b69 ] The inconsistencies in the systcall ABI between arm and arm-compat can can cause a failure in the syscall_restart test due to the logic attempting to work around the differences. The 'machine' field for an ARM64 device running in compat mode can report 'armv8l' or 'armv8b' which matches with the string 'arm' when only examining the first three characters of the string. This change adds additional validation to the workaround logic to make sure we only take the arm path when running natively, not in arm-compat. Fixes: 256d0afb11d6 ("selftests/seccomp: build and pass on arm64") Signed-off-by: Neill Kapron Link: https://lore.kernel.org/r/20250427094103.3488304-2-nkapron@google.com Signed-off-by: Kees Cook Signed-off-by: Sasha Levin --- tools/testing/selftests/seccomp/seccomp_bpf.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c index 8c3a73461475b..abc32e4352df3 100644 --- a/tools/testing/selftests/seccomp/seccomp_bpf.c +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c @@ -3155,12 +3155,15 @@ TEST(syscall_restart) ret = get_syscall(_metadata, child_pid); #if defined(__arm__) /* - * FIXME: * - native ARM registers do NOT expose true syscall. * - compat ARM registers on ARM64 DO expose true syscall. + * - values of utsbuf.machine include 'armv8l' or 'armb8b' + * for ARM64 running in compat mode. */ ASSERT_EQ(0, uname(&utsbuf)); - if (strncmp(utsbuf.machine, "arm", 3) == 0) { + if ((strncmp(utsbuf.machine, "arm", 3) == 0) && + (strncmp(utsbuf.machine, "armv8l", 6) != 0) && + (strncmp(utsbuf.machine, "armv8b", 6) != 0)) { EXPECT_EQ(__NR_nanosleep, ret); } else #endif -- GitLab From 5301f110b965642a0503f54f15d1532210c435a9 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Fri, 25 Apr 2025 22:49:08 +0300 Subject: [PATCH 0791/2211] drm/msm/dpu: enable SmartDMA on SM8150 [ Upstream commit 6a2343de0b6f70a21bf503ac4688dc905cb068e1 ] Reworking of the catalog dropped the SmartDMA feature bit on the SM8150 platform. Renable SmartDMA support on this SoC. Fixes: 460c410f02e4 ("drm/msm/dpu: duplicate sdm845 catalog entries") Signed-off-by: Dmitry Baryshkov Patchwork: https://patchwork.freedesktop.org/patch/650418/ Link: https://lore.kernel.org/r/20250425-dpu-rework-vig-masks-v2-1-c71900687d08@oss.qualcomm.com Signed-off-by: Dmitry Baryshkov Signed-off-by: Sasha Levin --- .../drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h index 36cc9dbc00b5c..d8d5a91c00ec8 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h @@ -76,7 +76,7 @@ static const struct dpu_sspp_cfg sm8150_sspp[] = { { .name = "sspp_0", .id = SSPP_VIG0, .base = 0x4000, .len = 0x1f0, - .features = VIG_SDM845_MASK, + .features = VIG_SDM845_MASK_SDMA, .sblk = &dpu_vig_sblk_qseed3_1_4, .xin_id = 0, .type = SSPP_TYPE_VIG, @@ -84,7 +84,7 @@ static const struct dpu_sspp_cfg sm8150_sspp[] = { }, { .name = "sspp_1", .id = SSPP_VIG1, .base = 0x6000, .len = 0x1f0, - .features = VIG_SDM845_MASK, + .features = VIG_SDM845_MASK_SDMA, .sblk = &dpu_vig_sblk_qseed3_1_4, .xin_id = 4, .type = SSPP_TYPE_VIG, @@ -92,7 +92,7 @@ static const struct dpu_sspp_cfg sm8150_sspp[] = { }, { .name = "sspp_2", .id = SSPP_VIG2, .base = 0x8000, .len = 0x1f0, - .features = VIG_SDM845_MASK, + .features = VIG_SDM845_MASK_SDMA, .sblk = &dpu_vig_sblk_qseed3_1_4, .xin_id = 8, .type = SSPP_TYPE_VIG, @@ -100,7 +100,7 @@ static const struct dpu_sspp_cfg sm8150_sspp[] = { }, { .name = "sspp_3", .id = SSPP_VIG3, .base = 0xa000, .len = 0x1f0, - .features = VIG_SDM845_MASK, + .features = VIG_SDM845_MASK_SDMA, .sblk = &dpu_vig_sblk_qseed3_1_4, .xin_id = 12, .type = SSPP_TYPE_VIG, @@ -108,7 +108,7 @@ static const struct dpu_sspp_cfg sm8150_sspp[] = { }, { .name = "sspp_8", .id = SSPP_DMA0, .base = 0x24000, .len = 0x1f0, - .features = DMA_SDM845_MASK, + .features = DMA_SDM845_MASK_SDMA, .sblk = &dpu_dma_sblk, .xin_id = 1, .type = SSPP_TYPE_DMA, @@ -116,7 +116,7 @@ static const struct dpu_sspp_cfg sm8150_sspp[] = { }, { .name = "sspp_9", .id = SSPP_DMA1, .base = 0x26000, .len = 0x1f0, - .features = DMA_SDM845_MASK, + .features = DMA_SDM845_MASK_SDMA, .sblk = &dpu_dma_sblk, .xin_id = 5, .type = SSPP_TYPE_DMA, @@ -124,7 +124,7 @@ static const struct dpu_sspp_cfg sm8150_sspp[] = { }, { .name = "sspp_10", .id = SSPP_DMA2, .base = 0x28000, .len = 0x1f0, - .features = DMA_CURSOR_SDM845_MASK, + .features = DMA_CURSOR_SDM845_MASK_SDMA, .sblk = &dpu_dma_sblk, .xin_id = 9, .type = SSPP_TYPE_DMA, @@ -132,7 +132,7 @@ static const struct dpu_sspp_cfg sm8150_sspp[] = { }, { .name = "sspp_11", .id = SSPP_DMA3, .base = 0x2a000, .len = 0x1f0, - .features = DMA_CURSOR_SDM845_MASK, + .features = DMA_CURSOR_SDM845_MASK_SDMA, .sblk = &dpu_dma_sblk, .xin_id = 13, .type = SSPP_TYPE_DMA, -- GitLab From 3d0ae6b5114171193fb3f3f0788db678c9a2fe11 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Fri, 25 Apr 2025 22:49:09 +0300 Subject: [PATCH 0792/2211] drm/msm/dpu: enable SmartDMA on SC8180X [ Upstream commit 8dcccd7a156ffb3157de7f527cc7c6100e9a455a ] Reworking of the catalog dropped the SmartDMA feature bit on the SC8180X platform. Renable SmartDMA support on this SoC. Fixes: 460c410f02e4 ("drm/msm/dpu: duplicate sdm845 catalog entries") Signed-off-by: Dmitry Baryshkov Patchwork: https://patchwork.freedesktop.org/patch/650421/ Link: https://lore.kernel.org/r/20250425-dpu-rework-vig-masks-v2-2-c71900687d08@oss.qualcomm.com Signed-off-by: Dmitry Baryshkov Signed-off-by: Sasha Levin --- .../drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h index e8eacdb47967a..485c3041c8018 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h @@ -75,7 +75,7 @@ static const struct dpu_sspp_cfg sc8180x_sspp[] = { { .name = "sspp_0", .id = SSPP_VIG0, .base = 0x4000, .len = 0x1f0, - .features = VIG_SDM845_MASK, + .features = VIG_SDM845_MASK_SDMA, .sblk = &dpu_vig_sblk_qseed3_1_4, .xin_id = 0, .type = SSPP_TYPE_VIG, @@ -83,7 +83,7 @@ static const struct dpu_sspp_cfg sc8180x_sspp[] = { }, { .name = "sspp_1", .id = SSPP_VIG1, .base = 0x6000, .len = 0x1f0, - .features = VIG_SDM845_MASK, + .features = VIG_SDM845_MASK_SDMA, .sblk = &dpu_vig_sblk_qseed3_1_4, .xin_id = 4, .type = SSPP_TYPE_VIG, @@ -91,7 +91,7 @@ static const struct dpu_sspp_cfg sc8180x_sspp[] = { }, { .name = "sspp_2", .id = SSPP_VIG2, .base = 0x8000, .len = 0x1f0, - .features = VIG_SDM845_MASK, + .features = VIG_SDM845_MASK_SDMA, .sblk = &dpu_vig_sblk_qseed3_1_4, .xin_id = 8, .type = SSPP_TYPE_VIG, @@ -99,7 +99,7 @@ static const struct dpu_sspp_cfg sc8180x_sspp[] = { }, { .name = "sspp_3", .id = SSPP_VIG3, .base = 0xa000, .len = 0x1f0, - .features = VIG_SDM845_MASK, + .features = VIG_SDM845_MASK_SDMA, .sblk = &dpu_vig_sblk_qseed3_1_4, .xin_id = 12, .type = SSPP_TYPE_VIG, @@ -107,7 +107,7 @@ static const struct dpu_sspp_cfg sc8180x_sspp[] = { }, { .name = "sspp_8", .id = SSPP_DMA0, .base = 0x24000, .len = 0x1f0, - .features = DMA_SDM845_MASK, + .features = DMA_SDM845_MASK_SDMA, .sblk = &dpu_dma_sblk, .xin_id = 1, .type = SSPP_TYPE_DMA, @@ -115,7 +115,7 @@ static const struct dpu_sspp_cfg sc8180x_sspp[] = { }, { .name = "sspp_9", .id = SSPP_DMA1, .base = 0x26000, .len = 0x1f0, - .features = DMA_SDM845_MASK, + .features = DMA_SDM845_MASK_SDMA, .sblk = &dpu_dma_sblk, .xin_id = 5, .type = SSPP_TYPE_DMA, @@ -123,7 +123,7 @@ static const struct dpu_sspp_cfg sc8180x_sspp[] = { }, { .name = "sspp_10", .id = SSPP_DMA2, .base = 0x28000, .len = 0x1f0, - .features = DMA_CURSOR_SDM845_MASK, + .features = DMA_CURSOR_SDM845_MASK_SDMA, .sblk = &dpu_dma_sblk, .xin_id = 9, .type = SSPP_TYPE_DMA, @@ -131,7 +131,7 @@ static const struct dpu_sspp_cfg sc8180x_sspp[] = { }, { .name = "sspp_11", .id = SSPP_DMA3, .base = 0x2a000, .len = 0x1f0, - .features = DMA_CURSOR_SDM845_MASK, + .features = DMA_CURSOR_SDM845_MASK_SDMA, .sblk = &dpu_dma_sblk, .xin_id = 13, .type = SSPP_TYPE_DMA, -- GitLab From 7de22bbc5827f0f63f9dbfb65e12f21aa370216e Mon Sep 17 00:00:00 2001 From: Biju Das Date: Thu, 16 Nov 2023 12:24:24 +0000 Subject: [PATCH 0793/2211] drm: rcar-du: Fix memory leak in rcar_du_vsps_init() [ Upstream commit 91e3bf09a90bb4340c0c3c51396e7531555efda4 ] The rcar_du_vsps_init() doesn't free the np allocated by of_parse_phandle_with_fixed_args() for the non-error case. Fix memory leak for the non-error case. While at it, replace the label 'error'->'done' as it applies to non-error case as well and update the error check condition for rcar_du_vsp_init() to avoid breakage in future, if it returns positive value. Fixes: 3e81374e2014 ("drm: rcar-du: Support multiple sources from the same VSP") Signed-off-by: Biju Das Reviewed-by: Laurent Pinchart Link: https://lore.kernel.org/r/20231116122424.80136-1-biju.das.jz@bp.renesas.com Signed-off-by: Tomi Valkeinen Signed-off-by: Sasha Levin --- drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c index 70d8ad065bfa1..4c8fe83dd6101 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c @@ -705,7 +705,7 @@ static int rcar_du_vsps_init(struct rcar_du_device *rcdu) ret = of_parse_phandle_with_fixed_args(np, vsps_prop_name, cells, i, &args); if (ret < 0) - goto error; + goto done; /* * Add the VSP to the list or update the corresponding existing @@ -743,13 +743,11 @@ static int rcar_du_vsps_init(struct rcar_du_device *rcdu) vsp->dev = rcdu; ret = rcar_du_vsp_init(vsp, vsps[i].np, vsps[i].crtcs_mask); - if (ret < 0) - goto error; + if (ret) + goto done; } - return 0; - -error: +done: for (i = 0; i < ARRAY_SIZE(vsps); ++i) of_node_put(vsps[i].np); -- GitLab From c4487e35d35f8ac247397aec704c80d677158b6a Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 25 Apr 2025 23:14:32 -0700 Subject: [PATCH 0794/2211] drm/vkms: Adjust vkms_state->active_planes allocation type [ Upstream commit 258aebf100540d36aba910f545d4d5ddf4ecaf0b ] In preparation for making the kmalloc family of allocators type aware, we need to make sure that the returned type from the allocation matches the type of the variable being assigned. (Before, the allocator would always return "void *", which can be implicitly cast to any pointer type.) The assigned type is "struct vkms_plane_state **", but the returned type will be "struct drm_plane **". These are the same size (pointer size), but the types don't match. Adjust the allocation type to match the assignment. Signed-off-by: Kees Cook Reviewed-by: Louis Chauvet Fixes: 8b1865873651 ("drm/vkms: totally reworked crc data tracking") Link: https://lore.kernel.org/r/20250426061431.work.304-kees@kernel.org Signed-off-by: Louis Chauvet Signed-off-by: Sasha Levin --- drivers/gpu/drm/vkms/vkms_crtc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c index 40b4d084e3cee..91b589a497d02 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -198,7 +198,7 @@ static int vkms_crtc_atomic_check(struct drm_crtc *crtc, i++; } - vkms_state->active_planes = kcalloc(i, sizeof(plane), GFP_KERNEL); + vkms_state->active_planes = kcalloc(i, sizeof(*vkms_state->active_planes), GFP_KERNEL); if (!vkms_state->active_planes) return -ENOMEM; vkms_state->num_active_planes = i; -- GitLab From 451335c867a703bdb165545caebb8e4bad948549 Mon Sep 17 00:00:00 2001 From: Biju Das Date: Wed, 5 Feb 2025 11:21:35 +0000 Subject: [PATCH 0795/2211] drm/tegra: rgb: Fix the unbound reference count [ Upstream commit 3c3642335065c3bde0742b0edc505b6ea8fdc2b3 ] The of_get_child_by_name() increments the refcount in tegra_dc_rgb_probe, but the driver does not decrement the refcount during unbind. Fix the unbound reference count using devm_add_action_or_reset() helper. Fixes: d8f4a9eda006 ("drm: Add NVIDIA Tegra20 support") Signed-off-by: Biju Das Signed-off-by: Thierry Reding Link: https://lore.kernel.org/r/20250205112137.36055-1-biju.das.jz@bp.renesas.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/tegra/rgb.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/tegra/rgb.c b/drivers/gpu/drm/tegra/rgb.c index 1e8ec50b759e4..ff5a749710db3 100644 --- a/drivers/gpu/drm/tegra/rgb.c +++ b/drivers/gpu/drm/tegra/rgb.c @@ -200,6 +200,11 @@ static const struct drm_encoder_helper_funcs tegra_rgb_encoder_helper_funcs = { .atomic_check = tegra_rgb_encoder_atomic_check, }; +static void tegra_dc_of_node_put(void *data) +{ + of_node_put(data); +} + int tegra_dc_rgb_probe(struct tegra_dc *dc) { struct device_node *np; @@ -207,7 +212,14 @@ int tegra_dc_rgb_probe(struct tegra_dc *dc) int err; np = of_get_child_by_name(dc->dev->of_node, "rgb"); - if (!np || !of_device_is_available(np)) + if (!np) + return -ENODEV; + + err = devm_add_action_or_reset(dc->dev, tegra_dc_of_node_put, np); + if (err < 0) + return err; + + if (!of_device_is_available(np)) return -ENODEV; rgb = devm_kzalloc(dc->dev, sizeof(*rgb), GFP_KERNEL); -- GitLab From 7e16ba331ed22b9df65fa6793060a7149cc9b580 Mon Sep 17 00:00:00 2001 From: Huang Yiwei Date: Wed, 7 May 2025 12:57:57 +0800 Subject: [PATCH 0796/2211] firmware: SDEI: Allow sdei initialization without ACPI_APEI_GHES [ Upstream commit 59529bbe642de4eb2191a541d9b4bae7eb73862e ] SDEI usually initialize with the ACPI table, but on platforms where ACPI is not used, the SDEI feature can still be used to handle specific firmware calls or other customized purposes. Therefore, it is not necessary for ARM_SDE_INTERFACE to depend on ACPI_APEI_GHES. In commit dc4e8c07e9e2 ("ACPI: APEI: explicit init of HEST and GHES in acpi_init()"), to make APEI ready earlier, sdei_init was moved into acpi_ghes_init instead of being a standalone initcall, adding ACPI_APEI_GHES dependency to ARM_SDE_INTERFACE. This restricts the flexibility and usability of SDEI. This patch corrects the dependency in Kconfig and splits sdei_init() into two separate functions: sdei_init() and acpi_sdei_init(). sdei_init() will be called by arch_initcall and will only initialize the platform driver, while acpi_sdei_init() will initialize the device from acpi_ghes_init() when ACPI is ready. This allows the initialization of SDEI without ACPI_APEI_GHES enabled. Fixes: dc4e8c07e9e2 ("ACPI: APEI: explicit init of HEST and GHES in apci_init()") Cc: Shuai Xue Signed-off-by: Huang Yiwei Reviewed-by: Shuai Xue Reviewed-by: Gavin Shan Acked-by: Rafael J. Wysocki Link: https://lore.kernel.org/r/20250507045757.2658795-1-quic_hyiwei@quicinc.com Signed-off-by: Will Deacon Signed-off-by: Sasha Levin --- drivers/acpi/apei/Kconfig | 1 + drivers/acpi/apei/ghes.c | 2 +- drivers/firmware/Kconfig | 1 - drivers/firmware/arm_sdei.c | 11 ++++++++--- include/linux/arm_sdei.h | 4 ++-- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/acpi/apei/Kconfig b/drivers/acpi/apei/Kconfig index 3cfe7e7475f2f..070c07d68dfb2 100644 --- a/drivers/acpi/apei/Kconfig +++ b/drivers/acpi/apei/Kconfig @@ -23,6 +23,7 @@ config ACPI_APEI_GHES select ACPI_HED select IRQ_WORK select GENERIC_ALLOCATOR + select ARM_SDE_INTERFACE if ARM64 help Generic Hardware Error Source provides a way to report platform hardware errors (such as that from chipset). It diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index cff6685fa6cc6..6cf40e8ac321e 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -1612,7 +1612,7 @@ void __init acpi_ghes_init(void) { int rc; - sdei_init(); + acpi_sdei_init(); if (acpi_disabled) return; diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index 9f35f69e0f9e2..f7044bf53d1fc 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -31,7 +31,6 @@ config ARM_SCPI_PROTOCOL config ARM_SDE_INTERFACE bool "ARM Software Delegated Exception Interface (SDEI)" depends on ARM64 - depends on ACPI_APEI_GHES help The Software Delegated Exception Interface (SDEI) is an ARM standard for registering callbacks from the platform firmware diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c index 3e8051fe82965..71e2a9a89f6ad 100644 --- a/drivers/firmware/arm_sdei.c +++ b/drivers/firmware/arm_sdei.c @@ -1062,13 +1062,12 @@ static bool __init sdei_present_acpi(void) return true; } -void __init sdei_init(void) +void __init acpi_sdei_init(void) { struct platform_device *pdev; int ret; - ret = platform_driver_register(&sdei_driver); - if (ret || !sdei_present_acpi()) + if (!sdei_present_acpi()) return; pdev = platform_device_register_simple(sdei_driver.driver.name, @@ -1081,6 +1080,12 @@ void __init sdei_init(void) } } +static int __init sdei_init(void) +{ + return platform_driver_register(&sdei_driver); +} +arch_initcall(sdei_init); + int sdei_event_handler(struct pt_regs *regs, struct sdei_registered_event *arg) { diff --git a/include/linux/arm_sdei.h b/include/linux/arm_sdei.h index 255701e1251b4..f652a5028b590 100644 --- a/include/linux/arm_sdei.h +++ b/include/linux/arm_sdei.h @@ -46,12 +46,12 @@ int sdei_unregister_ghes(struct ghes *ghes); /* For use by arch code when CPU hotplug notifiers are not appropriate. */ int sdei_mask_local_cpu(void); int sdei_unmask_local_cpu(void); -void __init sdei_init(void); +void __init acpi_sdei_init(void); void sdei_handler_abort(void); #else static inline int sdei_mask_local_cpu(void) { return 0; } static inline int sdei_unmask_local_cpu(void) { return 0; } -static inline void sdei_init(void) { } +static inline void acpi_sdei_init(void) { } static inline void sdei_handler_abort(void) { } #endif /* CONFIG_ARM_SDE_INTERFACE */ -- GitLab From b3cfc1f9f58435c43bd14aefd4d51b0cdb29ece2 Mon Sep 17 00:00:00 2001 From: Mark Rutland Date: Thu, 8 May 2025 14:26:21 +0100 Subject: [PATCH 0797/2211] arm64/fpsimd: Do not discard modified SVE state [ Upstream commit 398edaa12f9cf2be7902f306fc023c20e3ebd3e4 ] Historically SVE state was discarded deterministically early in the syscall entry path, before ptrace is notified of syscall entry. This permitted ptrace to modify SVE state before and after the "real" syscall logic was executed, with the modified state being retained. This behaviour was changed by commit: 8c845e2731041f0f ("arm64/sve: Leave SVE enabled on syscall if we don't context switch") That commit was intended to speed up workloads that used SVE by opportunistically leaving SVE enabled when returning from a syscall. The syscall entry logic was modified to truncate the SVE state without disabling userspace access to SVE, and fpsimd_save_user_state() was modified to discard userspace SVE state whenever in_syscall(current_pt_regs()) is true, i.e. when current_pt_regs()->syscallno != NO_SYSCALL. Leaving SVE enabled opportunistically resulted in a couple of changes to userspace visible behaviour which weren't described at the time, but are logical consequences of opportunistically leaving SVE enabled: * Signal handlers can observe the type of saved state in the signal's sve_context record. When the kernel only tracks FPSIMD state, the 'vq' field is 0 and there is no space allocated for register contents. When the kernel tracks SVE state, the 'vq' field is non-zero and the register contents are saved into the record. As a result of the above commit, 'vq' (and the presence of SVE register state) is non-deterministically zero or non-zero for a period of time after a syscall. The effective register state is still deterministic. Hopefully no-one relies on this being deterministic. In general, handlers for asynchronous events cannot expect a deterministic state. * Similarly to signal handlers, ptrace requests can observe the type of saved state in the NT_ARM_SVE and NT_ARM_SSVE regsets, as this is exposed in the header flags. As a result of the above commit, this is now in a non-deterministic state after a syscall. The effective register state is still deterministic. Hopefully no-one relies on this being deterministic. In general, debuggers would have to handle this changing at arbitrary points during program flow. Discarding the SVE state within fpsimd_save_user_state() resulted in other changes to userspace visible behaviour which are not desirable: * A ptrace tracer can modify (or create) a tracee's SVE state at syscall entry or syscall exit. As a result of the above commit, the tracee's SVE state can be discarded non-deterministically after modification, rather than being retained as it previously was. Note that for co-operative tracer/tracee pairs, the tracer may (re)initialise the tracee's state arbitrarily after the tracee sends itself an initial SIGSTOP via a syscall, so this affects realistic design patterns. * The current_pt_regs()->syscallno field can be modified via ptrace, and can be altered even when the tracee is not really in a syscall, causing non-deterministic discarding to occur in situations where this was not previously possible. Further, using current_pt_regs()->syscallno in this way is unsound: * There are data races between readers and writers of the current_pt_regs()->syscallno field. The current_pt_regs()->syscallno field is written in interruptible task context using plain C accesses, and is read in irq/softirq context using plain C accesses. These accesses are subject to data races, with the usual concerns with tearing, etc. * Writes to current_pt_regs()->syscallno are subject to compiler reordering. As current_pt_regs()->syscallno is written with plain C accesses, the compiler is free to move those writes arbitrarily relative to anything which doesn't access the same memory location. In theory this could break signal return, where prior to restoring the SVE state, restore_sigframe() calls forget_syscall(). If the write were hoisted after restore of some SVE state, that state could be discarded unexpectedly. In practice that reordering cannot happen in the absence of LTO (as cross compilation-unit function calls happen prevent this reordering), and that reordering appears to be unlikely in the presence of LTO. Additionally, since commit: f130ac0ae4412dbe ("arm64: syscall: unmask DAIF earlier for SVCs") ... DAIF is unmasked before el0_svc_common() sets regs->syscallno to the real syscall number. Consequently state may be saved in SVE format prior to this point. Considering all of the above, current_pt_regs()->syscallno should not be used to infer whether the SVE state can be discarded. Luckily we can instead use cpu_fp_state::to_save to track when it is safe to discard the SVE state: * At syscall entry, after the live SVE register state is truncated, set cpu_fp_state::to_save to FP_STATE_FPSIMD to indicate that only the FPSIMD portion is live and needs to be saved. * At syscall exit, once the task's state is guaranteed to be live, set cpu_fp_state::to_save to FP_STATE_CURRENT to indicate that TIF_SVE must be considered to determine which state needs to be saved. * Whenever state is modified, it must be saved+flushed prior to manipulation. The state will be truncated if necessary when it is saved, and reloading the state will set fp_state::to_save to FP_STATE_CURRENT, preventing subsequent discarding. This permits SVE state to be discarded *only* when it is known to have been truncated (and the non-FPSIMD portions must be zero), and ensures that SVE state is retained after it is explicitly modified. For backporting, note that this fix depends on the following commits: * b2482807fbd4 ("arm64/sme: Optimise SME exit on syscall entry") * f130ac0ae441 ("arm64: syscall: unmask DAIF earlier for SVCs") * 929fa99b1215 ("arm64/fpsimd: signal: Always save+flush state early") Fixes: 8c845e273104 ("arm64/sve: Leave SVE enabled on syscall if we don't context switch") Fixes: f130ac0ae441 ("arm64: syscall: unmask DAIF earlier for SVCs") Signed-off-by: Mark Rutland Cc: Catalin Marinas Cc: Marc Zyngier Cc: Mark Brown Cc: Will Deacon Link: https://lore.kernel.org/r/20250508132644.1395904-2-mark.rutland@arm.com Signed-off-by: Will Deacon Signed-off-by: Sasha Levin --- arch/arm64/include/asm/fpsimd.h | 3 +++ arch/arm64/kernel/entry-common.c | 46 ++++++++++++++++++++++++-------- arch/arm64/kernel/fpsimd.c | 15 ++++++----- 3 files changed, 47 insertions(+), 17 deletions(-) diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h index f2a84efc36185..c8dcb67b81a72 100644 --- a/arch/arm64/include/asm/fpsimd.h +++ b/arch/arm64/include/asm/fpsimd.h @@ -6,6 +6,7 @@ #define __ASM_FP_H #include +#include #include #include #include @@ -94,6 +95,8 @@ struct cpu_fp_state { enum fp_type to_save; }; +DECLARE_PER_CPU(struct cpu_fp_state, fpsimd_last_state); + extern void fpsimd_bind_state_to_cpu(struct cpu_fp_state *fp_state); extern void fpsimd_flush_task_state(struct task_struct *target); diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c index 3fcd9d080bf2a..d23315ef7b679 100644 --- a/arch/arm64/kernel/entry-common.c +++ b/arch/arm64/kernel/entry-common.c @@ -393,20 +393,16 @@ static bool cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs) * As per the ABI exit SME streaming mode and clear the SVE state not * shared with FPSIMD on syscall entry. */ -static inline void fp_user_discard(void) +static inline void fpsimd_syscall_enter(void) { - /* - * If SME is active then exit streaming mode. If ZA is active - * then flush the SVE registers but leave userspace access to - * both SVE and SME enabled, otherwise disable SME for the - * task and fall through to disabling SVE too. This means - * that after a syscall we never have any streaming mode - * register state to track, if this changes the KVM code will - * need updating. - */ + /* Ensure PSTATE.SM is clear, but leave PSTATE.ZA as-is. */ if (system_supports_sme()) sme_smstop_sm(); + /* + * The CPU is not in streaming mode. If non-streaming SVE is not + * supported, there is no SVE state that needs to be discarded. + */ if (!system_supports_sve()) return; @@ -416,6 +412,33 @@ static inline void fp_user_discard(void) sve_vq_minus_one = sve_vq_from_vl(task_get_sve_vl(current)) - 1; sve_flush_live(true, sve_vq_minus_one); } + + /* + * Any live non-FPSIMD SVE state has been zeroed. Allow + * fpsimd_save_user_state() to lazily discard SVE state until either + * the live state is unbound or fpsimd_syscall_exit() is called. + */ + __this_cpu_write(fpsimd_last_state.to_save, FP_STATE_FPSIMD); +} + +static __always_inline void fpsimd_syscall_exit(void) +{ + if (!system_supports_sve()) + return; + + /* + * The current task's user FPSIMD/SVE/SME state is now bound to this + * CPU. The fpsimd_last_state.to_save value is either: + * + * - FP_STATE_FPSIMD, if the state has not been reloaded on this CPU + * since fpsimd_syscall_enter(). + * + * - FP_STATE_CURRENT, if the state has been reloaded on this CPU at + * any point. + * + * Reset this to FP_STATE_CURRENT to stop lazy discarding. + */ + __this_cpu_write(fpsimd_last_state.to_save, FP_STATE_CURRENT); } UNHANDLED(el1t, 64, sync) @@ -707,10 +730,11 @@ static void noinstr el0_svc(struct pt_regs *regs) { enter_from_user_mode(regs); cortex_a76_erratum_1463225_svc_handler(); - fp_user_discard(); + fpsimd_syscall_enter(); local_daif_restore(DAIF_PROCCTX); do_el0_svc(regs); exit_to_user_mode(regs); + fpsimd_syscall_exit(); } static void noinstr el0_fpac(struct pt_regs *regs, unsigned long esr) diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index c5285ee55bfb0..8854bce5cfe20 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -119,7 +119,7 @@ * whatever is in the FPSIMD registers is not saved to memory, but discarded. */ -static DEFINE_PER_CPU(struct cpu_fp_state, fpsimd_last_state); +DEFINE_PER_CPU(struct cpu_fp_state, fpsimd_last_state); __ro_after_init struct vl_info vl_info[ARM64_VEC_MAX] = { #ifdef CONFIG_ARM64_SVE @@ -453,12 +453,15 @@ static void fpsimd_save_user_state(void) *(last->fpmr) = read_sysreg_s(SYS_FPMR); /* - * If a task is in a syscall the ABI allows us to only - * preserve the state shared with FPSIMD so don't bother - * saving the full SVE state in that case. + * Save SVE state if it is live. + * + * The syscall ABI discards live SVE state at syscall entry. When + * entering a syscall, fpsimd_syscall_enter() sets to_save to + * FP_STATE_FPSIMD to allow the SVE state to be lazily discarded until + * either new SVE state is loaded+bound or fpsimd_syscall_exit() is + * called prior to a return to userspace. */ - if ((last->to_save == FP_STATE_CURRENT && test_thread_flag(TIF_SVE) && - !in_syscall(current_pt_regs())) || + if ((last->to_save == FP_STATE_CURRENT && test_thread_flag(TIF_SVE)) || last->to_save == FP_STATE_SVE) { save_sve_regs = true; save_ffr = true; -- GitLab From e55f46a11ba55f8614fe54b81c45719d41719ba7 Mon Sep 17 00:00:00 2001 From: "Gustavo A. R. Silva" Date: Thu, 1 May 2025 18:44:43 -0600 Subject: [PATCH 0798/2211] overflow: Fix direct struct member initialization in _DEFINE_FLEX() [ Upstream commit 47e36ed7840661a9f7fb53554a1b04a5f8daffea ] Currently, to statically initialize the struct members of the `type` object created by _DEFINE_FLEX(), the internal `obj` member must be explicitly referenced at the call site. See: struct flex { int a; int b; struct foo flex_array[]; }; _DEFINE_FLEX(struct flex, instance, flex_array, FIXED_SIZE, = { .obj = { .a = 0, .b = 1, }, }); This leaks _DEFINE_FLEX() internal implementation details and make the helper harder to use and read. Fix this and allow for a more natural and intuitive C99 init-style: _DEFINE_FLEX(struct flex, instance, flex_array, FIXED_SIZE, = { .a = 0, .b = 1, }); Note that before these changes, the `initializer` argument was optional, but now it's required. Also, update "counter" member initialization in DEFINE_FLEX(). Fixes: 26dd68d293fd ("overflow: add DEFINE_FLEX() for on-stack allocs") Signed-off-by: Gustavo A. R. Silva Link: https://lore.kernel.org/r/aBQVeyKfLOkO9Yss@kspp Signed-off-by: Kees Cook Signed-off-by: Sasha Levin --- include/linux/overflow.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/linux/overflow.h b/include/linux/overflow.h index 0c7e3dcfe8670..823a53cd9a193 100644 --- a/include/linux/overflow.h +++ b/include/linux/overflow.h @@ -396,7 +396,7 @@ static inline size_t __must_check size_sub(size_t minuend, size_t subtrahend) * @name: Name for a variable to define. * @member: Name of the array member. * @count: Number of elements in the array; must be compile-time const. - * @initializer: initializer expression (could be empty for no init). + * @initializer: Initializer expression (e.g., pass `= { }` at minimum). */ #define _DEFINE_FLEX(type, name, member, count, initializer...) \ _Static_assert(__builtin_constant_p(count), \ @@ -404,7 +404,7 @@ static inline size_t __must_check size_sub(size_t minuend, size_t subtrahend) union { \ u8 bytes[struct_size_t(type, member, count)]; \ type obj; \ - } name##_u initializer; \ + } name##_u = { .obj initializer }; \ type *name = (type *)&name##_u /** @@ -438,6 +438,6 @@ static inline size_t __must_check size_sub(size_t minuend, size_t subtrahend) * Use __struct_size(@NAME) to get compile-time size of it afterwards. */ #define DEFINE_FLEX(TYPE, NAME, MEMBER, COUNTER, COUNT) \ - _DEFINE_FLEX(TYPE, NAME, MEMBER, COUNT, = { .obj.COUNTER = COUNT, }) + _DEFINE_FLEX(TYPE, NAME, MEMBER, COUNT, = { .COUNTER = COUNT, }) #endif /* __LINUX_OVERFLOW_H */ -- GitLab From c79bee34566dce1bbad99701223d97bc22de7b33 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 2 May 2025 15:41:57 -0700 Subject: [PATCH 0799/2211] scsi: qedf: Use designated initializer for struct qed_fcoe_cb_ops [ Upstream commit d8720235d5b5cad86c1f07f65117ef2a96f8bec7 ] Recent fixes to the randstruct GCC plugin allowed it to notice that this structure is entirely function pointers and is therefore subject to randomization, but doing so requires that it always use designated initializers. Explicitly specify the "common" member as being initialized. Silences: drivers/scsi/qedf/qedf_main.c:702:9: error: positional initialization of field in 'struct' declared with 'designated_init' attribute [-Werror=designated-init] 702 | { | ^ Fixes: 035f7f87b729 ("randstruct: Enable Clang support") Link: https://lore.kernel.org/r/20250502224156.work.617-kees@kernel.org Signed-off-by: Kees Cook Signed-off-by: Sasha Levin --- drivers/scsi/qedf/qedf_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c index e979ec1478c18..e895bd25098fd 100644 --- a/drivers/scsi/qedf/qedf_main.c +++ b/drivers/scsi/qedf/qedf_main.c @@ -699,7 +699,7 @@ static u32 qedf_get_login_failures(void *cookie) } static struct qed_fcoe_cb_ops qedf_cb_ops = { - { + .common = { .link_update = qedf_link_update, .bw_update = qedf_bw_update, .schedule_recovery_handler = qedf_schedule_recovery_handler, -- GitLab From b038ffbd49e41f99228dbb0c66d6dd7b20292884 Mon Sep 17 00:00:00 2001 From: Anand Moon Date: Mon, 7 Apr 2025 12:02:03 +0530 Subject: [PATCH 0800/2211] perf/amlogic: Replace smp_processor_id() with raw_smp_processor_id() in meson_ddr_pmu_create() [ Upstream commit 097469a2b0f12b91b4f27b9e9e4f2c46484cde30 ] The Amlogic DDR PMU driver meson_ddr_pmu_create() function incorrectly uses smp_processor_id(), which assumes disabled preemption. This leads to kernel warnings during module loading because meson_ddr_pmu_create() can be called in a preemptible context. Following kernel warning and stack trace: [ 31.745138] [ T2289] BUG: using smp_processor_id() in preemptible [00000000] code: (udev-worker)/2289 [ 31.745154] [ T2289] caller is debug_smp_processor_id+0x28/0x38 [ 31.745172] [ T2289] CPU: 4 UID: 0 PID: 2289 Comm: (udev-worker) Tainted: GW 6.14.0-0-MANJARO-ARM #1 59519addcbca6ba8de735e151fd7b9e97aac7ff0 [ 31.745181] [ T2289] Tainted: [W]=WARN [ 31.745183] [ T2289] Hardware name: Hardkernel ODROID-N2Plus (DT) [ 31.745188] [ T2289] Call trace: [ 31.745191] [ T2289] show_stack+0x28/0x40 (C) [ 31.745199] [ T2289] dump_stack_lvl+0x4c/0x198 [ 31.745205] [ T2289] dump_stack+0x20/0x50 [ 31.745209] [ T2289] check_preemption_disabled+0xec/0xf0 [ 31.745213] [ T2289] debug_smp_processor_id+0x28/0x38 [ 31.745216] [ T2289] meson_ddr_pmu_create+0x200/0x560 [meson_ddr_pmu_g12 8095101c49676ad138d9961e3eddaee10acca7bd] [ 31.745237] [ T2289] g12_ddr_pmu_probe+0x20/0x38 [meson_ddr_pmu_g12 8095101c49676ad138d9961e3eddaee10acca7bd] [ 31.745246] [ T2289] platform_probe+0x98/0xe0 [ 31.745254] [ T2289] really_probe+0x144/0x3f8 [ 31.745258] [ T2289] __driver_probe_device+0xb8/0x180 [ 31.745261] [ T2289] driver_probe_device+0x54/0x268 [ 31.745264] [ T2289] __driver_attach+0x11c/0x288 [ 31.745267] [ T2289] bus_for_each_dev+0xfc/0x160 [ 31.745274] [ T2289] driver_attach+0x34/0x50 [ 31.745277] [ T2289] bus_add_driver+0x160/0x2b0 [ 31.745281] [ T2289] driver_register+0x78/0x120 [ 31.745285] [ T2289] __platform_driver_register+0x30/0x48 [ 31.745288] [ T2289] init_module+0x30/0xfe0 [meson_ddr_pmu_g12 8095101c49676ad138d9961e3eddaee10acca7bd] [ 31.745298] [ T2289] do_one_initcall+0x11c/0x438 [ 31.745303] [ T2289] do_init_module+0x68/0x228 [ 31.745311] [ T2289] load_module+0x118c/0x13a8 [ 31.745315] [ T2289] __arm64_sys_finit_module+0x274/0x390 [ 31.745320] [ T2289] invoke_syscall+0x74/0x108 [ 31.745326] [ T2289] el0_svc_common+0x90/0xf8 [ 31.745330] [ T2289] do_el0_svc+0x2c/0x48 [ 31.745333] [ T2289] el0_svc+0x60/0x150 [ 31.745337] [ T2289] el0t_64_sync_handler+0x80/0x118 [ 31.745341] [ T2289] el0t_64_sync+0x1b8/0x1c0 Changes replaces smp_processor_id() with raw_smp_processor_id() to ensure safe CPU ID retrieval in preemptible contexts. Cc: Jiucheng Xu Fixes: 2016e2113d35 ("perf/amlogic: Add support for Amlogic meson G12 SoC DDR PMU driver") Signed-off-by: Anand Moon Link: https://lore.kernel.org/r/20250407063206.5211-1-linux.amoon@gmail.com Signed-off-by: Will Deacon Signed-off-by: Sasha Levin --- drivers/perf/amlogic/meson_ddr_pmu_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/perf/amlogic/meson_ddr_pmu_core.c b/drivers/perf/amlogic/meson_ddr_pmu_core.c index 07446d784a1a6..c1e755c356a33 100644 --- a/drivers/perf/amlogic/meson_ddr_pmu_core.c +++ b/drivers/perf/amlogic/meson_ddr_pmu_core.c @@ -511,7 +511,7 @@ int meson_ddr_pmu_create(struct platform_device *pdev) fmt_attr_fill(pmu->info.hw_info->fmt_attr); - pmu->cpu = smp_processor_id(); + pmu->cpu = raw_smp_processor_id(); name = devm_kasprintf(&pdev->dev, GFP_KERNEL, DDR_PERF_DEV_NAME); if (!name) -- GitLab From 295f1b128c9fb466d6196e8e8f12987b44cee313 Mon Sep 17 00:00:00 2001 From: Terry Tritton Date: Fri, 9 May 2025 12:56:22 +0100 Subject: [PATCH 0801/2211] selftests/seccomp: fix negative_ENOSYS tracer tests on arm32 [ Upstream commit 73989c998814d82c71d523c104c398925470d59e ] TRACE_syscall.ptrace.negative_ENOSYS and TRACE_syscall.seccomp.negative_ENOSYS on arm32 are being reported as failures instead of skipping. The teardown_trace_fixture function sets the test to KSFT_FAIL in case of a non 0 return value from the tracer process. Due to _metadata now being shared between the forked processes the tracer is returning the KSFT_SKIP value set by the tracee which is non 0. Remove the setting of the _metadata.exit_code in teardown_trace_fixture. Fixes: 24cf65a62266 ("selftests/harness: Share _metadata between forked processes") Signed-off-by: Terry Tritton Link: https://lore.kernel.org/r/20250509115622.64775-1-terry.tritton@linaro.org Signed-off-by: Kees Cook Signed-off-by: Sasha Levin --- tools/testing/selftests/seccomp/seccomp_bpf.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c index abc32e4352df3..60c84d935a2b0 100644 --- a/tools/testing/selftests/seccomp/seccomp_bpf.c +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c @@ -1618,14 +1618,8 @@ void teardown_trace_fixture(struct __test_metadata *_metadata, { if (tracer) { int status; - /* - * Extract the exit code from the other process and - * adopt it for ourselves in case its asserts failed. - */ ASSERT_EQ(0, kill(tracer, SIGUSR1)); ASSERT_EQ(tracer, waitpid(tracer, &status, 0)); - if (WEXITSTATUS(status)) - _metadata->exit_code = KSFT_FAIL; } } -- GitLab From 5c2efbb3725d79e2b1bff2af2fd1e1f83efe7287 Mon Sep 17 00:00:00 2001 From: Konrad Dybcio Date: Mon, 5 May 2025 13:13:40 +0200 Subject: [PATCH 0802/2211] drm/msm/a6xx: Disable rgb565_predicator on Adreno 7c3 [ Upstream commit 5a9c1bea011fb42088ba08ceaa252fb20e695626 ] This feature is supposed to be enabled with UBWC v4 or later. Implementations of this SKU feature an effective UBWC version of 3, so disable it, in line with the BSP kernel. Reported-by: Dmitry Baryshkov Reviewed-by: Akhil P Oommen Fixes: 192f4ee3e408 ("drm/msm/a6xx: Add support for Adreno 7c Gen 3 gpu") Signed-off-by: Konrad Dybcio Patchwork: https://patchwork.freedesktop.org/patch/651759/ Signed-off-by: Rob Clark Signed-off-by: Sasha Levin --- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c index d903ad9c0b5fb..d2189441aa38a 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c @@ -554,7 +554,6 @@ static void a6xx_calc_ubwc_config(struct adreno_gpu *gpu) if (adreno_is_7c3(gpu)) { gpu->ubwc_config.highest_bank_bit = 14; gpu->ubwc_config.amsbc = 1; - gpu->ubwc_config.rgb565_predicator = 1; gpu->ubwc_config.uavflagprd_inv = 2; gpu->ubwc_config.macrotile_mode = 1; } -- GitLab From ad426a7c3ddaed0847e29edce8cd3f91b7cacc32 Mon Sep 17 00:00:00 2001 From: AngeloGioacchino Del Regno Date: Thu, 3 Apr 2025 12:47:37 +0200 Subject: [PATCH 0803/2211] drm/mediatek: mtk_drm_drv: Fix kobject put for mtk_mutex device ptr [ Upstream commit 22918591fb747a6d16801e74a170cf98e886f83b ] This driver is taking a kobject for mtk_mutex only once per mmsys device for each drm-mediatek driver instance, differently from the behavior with other components, but it is decrementing the kobj's refcount in a loop and once per mmsys: this is not right and will result in a refcount_t underflow warning when mediatek-drm returns multiple probe deferrals in one boot (or when manually bound and unbound). Besides that, the refcount for mutex_dev was not decremented for error cases in mtk_drm_bind(), causing another refcount_t warning but this time for overflow, when the failure happens not during driver bind but during component bind. In order to fix one of the reasons why this is happening, remove the put_device(xx->mutex_dev) loop from the mtk_drm_kms_init()'s put_mutex_dev label (and drop the label) and add a single call to correctly free the single incremented refcount of mutex_dev to the mtk_drm_unbind() function to fix the refcount_t underflow. Moreover, add the same call to the error cases in mtk_drm_bind() to fix the refcount_t overflow. Fixes: 1ef7ed48356c ("drm/mediatek: Modify mediatek-drm for mt8195 multi mmsys support") Reviewed-by: Chen-Yu Tsai Signed-off-by: AngeloGioacchino Del Regno Link: https://patchwork.kernel.org/project/dri-devel/patch/20250403104741.71045-2-angelogioacchino.delregno@collabora.com/ Signed-off-by: Chun-Kuang Hu Signed-off-by: Sasha Levin --- drivers/gpu/drm/mediatek/mtk_drm_drv.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c index 4e93fd075e03c..86541b0d5c496 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c @@ -463,7 +463,7 @@ static int mtk_drm_kms_init(struct drm_device *drm) ret = drmm_mode_config_init(drm); if (ret) - goto put_mutex_dev; + return ret; drm->mode_config.min_width = 64; drm->mode_config.min_height = 64; @@ -482,7 +482,7 @@ static int mtk_drm_kms_init(struct drm_device *drm) drm->dev_private = private->all_drm_private[i]; ret = component_bind_all(private->all_drm_private[i]->dev, drm); if (ret) - goto put_mutex_dev; + return ret; } /* @@ -575,9 +575,6 @@ static int mtk_drm_kms_init(struct drm_device *drm) err_component_unbind: for (i = 0; i < private->data->mmsys_dev_num; i++) component_unbind_all(private->all_drm_private[i]->dev, drm); -put_mutex_dev: - for (i = 0; i < private->data->mmsys_dev_num; i++) - put_device(private->all_drm_private[i]->mutex_dev); return ret; } @@ -648,8 +645,10 @@ static int mtk_drm_bind(struct device *dev) return 0; drm = drm_dev_alloc(&mtk_drm_driver, dev); - if (IS_ERR(drm)) - return PTR_ERR(drm); + if (IS_ERR(drm)) { + ret = PTR_ERR(drm); + goto err_put_dev; + } private->drm_master = true; drm->dev_private = private; @@ -675,6 +674,8 @@ err_free: drm_dev_put(drm); for (i = 0; i < private->data->mmsys_dev_num; i++) private->all_drm_private[i]->drm = NULL; +err_put_dev: + put_device(private->mutex_dev); return ret; } @@ -687,6 +688,8 @@ static void mtk_drm_unbind(struct device *dev) drm_dev_unregister(private->drm); mtk_drm_kms_deinit(private->drm); drm_dev_put(private->drm); + + put_device(private->mutex_dev); } private->mtk_drm_bound = false; private->drm_master = false; -- GitLab From 62df1ba66839f9607ca6f0cb2c96493d31011cf2 Mon Sep 17 00:00:00 2001 From: AngeloGioacchino Del Regno Date: Thu, 3 Apr 2025 12:47:38 +0200 Subject: [PATCH 0804/2211] drm/mediatek: Fix kobject put for component sub-drivers [ Upstream commit 80805b62ea5b95eda54c225b989f929ca0691ab0 ] In function mtk_drm_get_all_drm_priv(), this driver is incrementing the refcount for the sub-drivers of mediatek-drm with a call to device_find_child() when taking a reference to all of those child devices. When the component bind fails multiple times this results in a refcount_t overflow, as the reference count is never decremented: fix that by adding a call to put_device() for all of the mmsys devices in a loop, in error cases of mtk_drm_bind() and in the mtk_drm_unbind() callback. Fixes: 1ef7ed48356c ("drm/mediatek: Modify mediatek-drm for mt8195 multi mmsys support") Reviewed-by: Chen-Yu Tsai Signed-off-by: AngeloGioacchino Del Regno Link: https://patchwork.kernel.org/project/dri-devel/patch/20250403104741.71045-3-angelogioacchino.delregno@collabora.com/ Signed-off-by: Chun-Kuang Hu Signed-off-by: Sasha Levin --- drivers/gpu/drm/mediatek/mtk_drm_drv.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c index 86541b0d5c496..3cdda6694f7f5 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c @@ -675,6 +675,10 @@ err_free: for (i = 0; i < private->data->mmsys_dev_num; i++) private->all_drm_private[i]->drm = NULL; err_put_dev: + for (i = 0; i < private->data->mmsys_dev_num; i++) { + /* For device_find_child in mtk_drm_get_all_priv() */ + put_device(private->all_drm_private[i]->dev); + } put_device(private->mutex_dev); return ret; } @@ -682,6 +686,7 @@ err_put_dev: static void mtk_drm_unbind(struct device *dev) { struct mtk_drm_private *private = dev_get_drvdata(dev); + int i; /* for multi mmsys dev, unregister drm dev in mmsys master */ if (private->drm_master) { @@ -689,6 +694,10 @@ static void mtk_drm_unbind(struct device *dev) mtk_drm_kms_deinit(private->drm); drm_dev_put(private->drm); + for (i = 0; i < private->data->mmsys_dev_num; i++) { + /* For device_find_child in mtk_drm_get_all_priv() */ + put_device(private->all_drm_private[i]->dev); + } put_device(private->mutex_dev); } private->mtk_drm_bound = false; -- GitLab From 7b6050a9efc3d77a85079e377f3e212f48fa88b4 Mon Sep 17 00:00:00 2001 From: AngeloGioacchino Del Regno Date: Thu, 3 Apr 2025 12:47:39 +0200 Subject: [PATCH 0805/2211] drm/mediatek: mtk_drm_drv: Unbind secondary mmsys components on err [ Upstream commit 94c933716567084bfb9e79dcd81eb2b2308e84e1 ] When calling component_bind_all(), if a component that is included in the list fails, all of those that have been successfully bound will be unbound, but this driver has two components lists for two actual devices, as in, each mmsys instance has its own components list. In case mmsys0 (or actually vdosys0) is able to bind all of its components, but the secondary one fails, all of the components of the first are kept bound, while the ones of mmsys1/vdosys1 are correctly cleaned up. This is not right because, in case of a failure, the components are re-bound for all of the mmsys/vdosys instances without caring about the ones that were previously left in a bound state. Fix that by calling component_unbind_all() on all of the previous component masters that succeeded binding all subdevices when any of the other masters errors out. Fixes: 1ef7ed48356c ("drm/mediatek: Modify mediatek-drm for mt8195 multi mmsys support") Reviewed-by: Chen-Yu Tsai Signed-off-by: AngeloGioacchino Del Regno Link: https://patchwork.kernel.org/project/dri-devel/patch/20250403104741.71045-4-angelogioacchino.delregno@collabora.com/ Signed-off-by: Chun-Kuang Hu Signed-off-by: Sasha Levin --- drivers/gpu/drm/mediatek/mtk_drm_drv.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c index 3cdda6694f7f5..42e62b0409612 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c @@ -481,8 +481,11 @@ static int mtk_drm_kms_init(struct drm_device *drm) for (i = 0; i < private->data->mmsys_dev_num; i++) { drm->dev_private = private->all_drm_private[i]; ret = component_bind_all(private->all_drm_private[i]->dev, drm); - if (ret) + if (ret) { + while (--i >= 0) + component_unbind_all(private->all_drm_private[i]->dev, drm); return ret; + } } /* -- GitLab From 9e710dc96f9cbd24d48f02e4d6a7b70e923216ce Mon Sep 17 00:00:00 2001 From: Detlev Casanova Date: Fri, 25 Apr 2025 15:24:47 -0400 Subject: [PATCH 0806/2211] media: verisilicon: Free post processor buffers on error [ Upstream commit 11beb0fc346e00c412b3bfd19013206f6b655604 ] During initialization, the post processor allocates the same number of buffers as the buf queue. As the init function is called in streamon(), if an allocation fails, streamon will return an error and streamoff() will not be called, keeping all post processor buffers allocated. To avoid that, all post proc buffers are freed in case of an allocation error. Fixes: 26711491a807 ("media: verisilicon: Refactor postprocessor to store more buffers") Signed-off-by: Detlev Casanova Reviewed-by: Nicolas Dufresne Signed-off-by: Nicolas Dufresne Signed-off-by: Hans Verkuil Signed-off-by: Sasha Levin --- drivers/media/platform/verisilicon/hantro_postproc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/verisilicon/hantro_postproc.c b/drivers/media/platform/verisilicon/hantro_postproc.c index 232c93eea7eea..18cad5ac92d8d 100644 --- a/drivers/media/platform/verisilicon/hantro_postproc.c +++ b/drivers/media/platform/verisilicon/hantro_postproc.c @@ -260,8 +260,10 @@ int hantro_postproc_init(struct hantro_ctx *ctx) for (i = 0; i < num_buffers; i++) { ret = hantro_postproc_alloc(ctx, i); - if (ret) + if (ret) { + hantro_postproc_free(ctx); return ret; + } } return 0; -- GitLab From 7051a80916ce08af2beac9339b9bb688f9c85237 Mon Sep 17 00:00:00 2001 From: Chuck Lever Date: Mon, 28 Apr 2025 15:36:49 -0400 Subject: [PATCH 0807/2211] svcrdma: Reduce the number of rdma_rw contexts per-QP [ Upstream commit 59243315890578a040a2d50ae9e001a2ef2fcb62 ] There is an upper bound on the number of rdma_rw contexts that can be created per QP. This invisible upper bound is because rdma_create_qp() adds one or more additional SQEs for each ctxt that the ULP requests via qp_attr.cap.max_rdma_ctxs. The QP's actual Send Queue length is on the order of the sum of qp_attr.cap.max_send_wr and a factor times qp_attr.cap.max_rdma_ctxs. The factor can be up to three, depending on whether MR operations are required before RDMA Reads. This limit is not visible to RDMA consumers via dev->attrs. When the limit is surpassed, QP creation fails with -ENOMEM. For example: svcrdma's estimate of the number of rdma_rw contexts it needs is three times the number of pages in RPCSVC_MAXPAGES. When MAXPAGES is about 260, the internally-computed SQ length should be: 64 credits + 10 backlog + 3 * (3 * 260) = 2414 Which is well below the advertised qp_max_wr of 32768. If RPCSVC_MAXPAGES is increased to 4MB, that's 1040 pages: 64 credits + 10 backlog + 3 * (3 * 1040) = 9434 However, QP creation fails. Dynamic printk for mlx5 shows: calc_sq_size:618:(pid 1514): send queue size (9326 * 256 / 64 -> 65536) exceeds limits(32768) Although 9326 is still far below qp_max_wr, QP creation still fails. Because the total SQ length calculation is opaque to RDMA consumers, there doesn't seem to be much that can be done about this except for consumers to try to keep the requested rdma_rw ctxt count low. Fixes: 2da0f610e733 ("svcrdma: Increase the per-transport rw_ctx count") Reviewed-by: NeilBrown Reviewed-by: Christoph Hellwig Signed-off-by: Chuck Lever Signed-off-by: Sasha Levin --- net/sunrpc/xprtrdma/svc_rdma_transport.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index aca8bdf65d729..ca6172822b68a 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c @@ -406,12 +406,12 @@ static void svc_rdma_xprt_done(struct rpcrdma_notification *rn) */ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) { + unsigned int ctxts, rq_depth, maxpayload; struct svcxprt_rdma *listen_rdma; struct svcxprt_rdma *newxprt = NULL; struct rdma_conn_param conn_param; struct rpcrdma_connect_private pmsg; struct ib_qp_init_attr qp_attr; - unsigned int ctxts, rq_depth; struct ib_device *dev; int ret = 0; RPC_IFDEBUG(struct sockaddr *sap); @@ -462,12 +462,14 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) newxprt->sc_max_bc_requests = 2; } - /* Arbitrarily estimate the number of rw_ctxs needed for - * this transport. This is enough rw_ctxs to make forward - * progress even if the client is using one rkey per page - * in each Read chunk. + /* Arbitrary estimate of the needed number of rdma_rw contexts. */ - ctxts = 3 * RPCSVC_MAXPAGES; + maxpayload = min(xprt->xpt_server->sv_max_payload, + RPCSVC_MAXPAYLOAD_RDMA); + ctxts = newxprt->sc_max_requests * 3 * + rdma_rw_mr_factor(dev, newxprt->sc_port_num, + maxpayload >> PAGE_SHIFT); + newxprt->sc_sq_depth = rq_depth + ctxts; if (newxprt->sc_sq_depth > dev->attrs.max_qp_wr) newxprt->sc_sq_depth = dev->attrs.max_qp_wr; -- GitLab From 80a81375ef5a68ef537a2a097726f5354281e43a Mon Sep 17 00:00:00 2001 From: Roger Pau Monne Date: Wed, 14 May 2025 10:04:26 +0200 Subject: [PATCH 0808/2211] xen/x86: fix initial memory balloon target MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 74287971dbb3fe322bb316afd9e7fb5807e23bee ] When adding extra memory regions as ballooned pages also adjust the balloon target, otherwise when the balloon driver is started it will populate memory to match the target value and consume all the extra memory regions added. This made the usage of the Xen `dom0_mem=,max:` command line parameter for dom0 not work as expected, as the target won't be adjusted and when the balloon is started it will populate memory straight to the 'max:' value. It would equally affect domUs that have memory != maxmem. Kernels built with CONFIG_XEN_UNPOPULATED_ALLOC are not affected, because the extra memory regions are consumed by the unpopulated allocation driver, and then balloon_add_regions() becomes a no-op. Reported-by: John Fixes: 87af633689ce ('x86/xen: fix balloon target initialization for PVH dom0') Signed-off-by: Roger Pau Monné Reviewed-by: Juergen Gross Tested-by: Marek Marczykowski-Górecki Message-ID: <20250514080427.28129-1-roger.pau@citrix.com> Signed-off-by: Juergen Gross Signed-off-by: Sasha Levin --- drivers/xen/balloon.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index 4bd31242bd773..e47bb157aa090 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c @@ -700,15 +700,18 @@ static int __init balloon_add_regions(void) /* * Extra regions are accounted for in the physmap, but need - * decreasing from current_pages to balloon down the initial - * allocation, because they are already accounted for in - * total_pages. + * decreasing from current_pages and target_pages to balloon + * down the initial allocation, because they are already + * accounted for in total_pages. */ - if (extra_pfn_end - start_pfn >= balloon_stats.current_pages) { + pages = extra_pfn_end - start_pfn; + if (pages >= balloon_stats.current_pages || + pages >= balloon_stats.target_pages) { WARN(1, "Extra pages underflow current target"); return -ERANGE; } - balloon_stats.current_pages -= extra_pfn_end - start_pfn; + balloon_stats.current_pages -= pages; + balloon_stats.target_pages -= pages; } return 0; -- GitLab From f5d77d0d41ea7a204d47288d0cf0404a52b5890e Mon Sep 17 00:00:00 2001 From: Stone Zhang Date: Thu, 20 Mar 2025 13:31:45 +0800 Subject: [PATCH 0809/2211] wifi: ath11k: fix node corruption in ar->arvifs list [ Upstream commit 31e98e277ae47f56632e4d663b1d4fd12ba33ea8 ] In current WLAN recovery code flow, ath11k_core_halt() only reinitializes the "arvifs" list head. This will cause the list node immediately following the list head to become an invalid list node. Because the prev of that node still points to the list head "arvifs", but the next of the list head "arvifs" no longer points to that list node. When a WLAN recovery occurs during the execution of a vif removal, and it happens before the spin_lock_bh(&ar->data_lock) in ath11k_mac_op_remove_interface(), list_del() will detect the previously mentioned situation, thereby triggering a kernel panic. The fix is to remove and reinitialize all vif list nodes from the list head "arvifs" during WLAN halt. The reinitialization is to make the list nodes valid, ensuring that the list_del() in ath11k_mac_op_remove_interface() can execute normally. Call trace: __list_del_entry_valid_or_report+0xb8/0xd0 ath11k_mac_op_remove_interface+0xb0/0x27c [ath11k] drv_remove_interface+0x48/0x194 [mac80211] ieee80211_do_stop+0x6e0/0x844 [mac80211] ieee80211_stop+0x44/0x17c [mac80211] __dev_close_many+0xac/0x150 __dev_change_flags+0x194/0x234 dev_change_flags+0x24/0x6c devinet_ioctl+0x3a0/0x670 inet_ioctl+0x200/0x248 sock_do_ioctl+0x60/0x118 sock_ioctl+0x274/0x35c __arm64_sys_ioctl+0xac/0xf0 invoke_syscall+0x48/0x114 ... Tested-on: QCA6698AQ hw2.1 PCI WLAN.HSP.1.1-04591-QCAHSPSWPL_V1_V2_SILICONZ_IOE-1 Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices") Signed-off-by: Stone Zhang Link: https://patch.msgid.link/20250320053145.3445187-1-quic_stonez@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath11k/core.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c index 7eba6ee054ffe..674c4763333f3 100644 --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c @@ -1915,6 +1915,7 @@ err_hal_srng_deinit: void ath11k_core_halt(struct ath11k *ar) { struct ath11k_base *ab = ar->ab; + struct list_head *pos, *n; lockdep_assert_held(&ar->conf_mutex); @@ -1929,7 +1930,12 @@ void ath11k_core_halt(struct ath11k *ar) rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], NULL); synchronize_rcu(); - INIT_LIST_HEAD(&ar->arvifs); + + spin_lock_bh(&ar->data_lock); + list_for_each_safe(pos, n, &ar->arvifs) + list_del_init(pos); + spin_unlock_bh(&ar->data_lock); + idr_init(&ar->txmgmt_idr); } -- GitLab From 5a1210a69cc59c38e78d535464a4929ade2c7629 Mon Sep 17 00:00:00 2001 From: P Praneesh Date: Wed, 2 Apr 2025 23:10:32 +0530 Subject: [PATCH 0810/2211] wifi: ath12k: Fix memory leak during vdev_id mismatch [ Upstream commit 75ec94db880b1e4b4f9182885d60db0db6e2ee56 ] Currently driver enables vdev_id check as part of the bank configuration in ath12k_dp_tx_get_vdev_bank_config(). This check ensures that the vdev_id configured in the bank register aligns with the vdev_id in the packet's address search table within the firmware. If there is a mismatch, the firmware forwards the packet with the HTT status HAL_WBM_REL_HTT_TX_COMP_STATUS_VDEVID_MISMATCH. Since driver does not handle this vdev_id mismatch HTT status, the corresponding buffers are not freed properly, causing a memory leak. Fix this issue by adding handling to free the buffers when a vdev_id mismatch HTT status is encountered. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ- Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices") Signed-off-by: P Praneesh Link: https://patch.msgid.link/20250402174032.2651221-1-praneesh.p@oss.qualcomm.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/dp_tx.c | 1 + drivers/net/wireless/ath/ath12k/hal_desc.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath12k/dp_tx.c b/drivers/net/wireless/ath/ath12k/dp_tx.c index 201ffdb8c44ae..734e3da4cbf19 100644 --- a/drivers/net/wireless/ath/ath12k/dp_tx.c +++ b/drivers/net/wireless/ath/ath12k/dp_tx.c @@ -566,6 +566,7 @@ ath12k_dp_tx_process_htt_tx_complete(struct ath12k_base *ab, case HAL_WBM_REL_HTT_TX_COMP_STATUS_TTL: case HAL_WBM_REL_HTT_TX_COMP_STATUS_REINJ: case HAL_WBM_REL_HTT_TX_COMP_STATUS_INSPECT: + case HAL_WBM_REL_HTT_TX_COMP_STATUS_VDEVID_MISMATCH: ath12k_dp_tx_free_txbuf(ab, msdu, mac_id, tx_ring); break; case HAL_WBM_REL_HTT_TX_COMP_STATUS_MEC_NOTIFY: diff --git a/drivers/net/wireless/ath/ath12k/hal_desc.h b/drivers/net/wireless/ath/ath12k/hal_desc.h index 4f745cfd7d8e7..c68998e9667c9 100644 --- a/drivers/net/wireless/ath/ath12k/hal_desc.h +++ b/drivers/net/wireless/ath/ath12k/hal_desc.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause-Clear */ /* * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022, 2024-2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #include "core.h" @@ -1296,6 +1296,7 @@ enum hal_wbm_htt_tx_comp_status { HAL_WBM_REL_HTT_TX_COMP_STATUS_REINJ, HAL_WBM_REL_HTT_TX_COMP_STATUS_INSPECT, HAL_WBM_REL_HTT_TX_COMP_STATUS_MEC_NOTIFY, + HAL_WBM_REL_HTT_TX_COMP_STATUS_VDEVID_MISMATCH, HAL_WBM_REL_HTT_TX_COMP_STATUS_MAX, }; -- GitLab From a284820a1c971569f23d4c7ac2cb2b4b6f4bfd84 Mon Sep 17 00:00:00 2001 From: P Praneesh Date: Wed, 2 Apr 2025 23:35:43 +0530 Subject: [PATCH 0811/2211] wifi: ath12k: Fix invalid memory access while forming 802.11 header [ Upstream commit be908d2360341f8bbc982fff5a5e4f8030c17f74 ] While forming the 802.11 header from the rx descriptor, skb_push() is performed for the 802.11 header length and then calls ath12k_dp_rx_desc_get_dot11_hdr(). Since skb_push() moves the skb->data pointer backwards by the 802.11 header length, the rx descriptor points to a different memory area than intended, causing invalid information to be fetched from the rx descriptor. Also, when IV and ICV are not stripped from the given MSDU, mac80211 performs PN validation for these MSDUs, which requires the crypto header. Before forming the crypto header from the given rx descriptor, skb_push() is performed for the crypto header length, which overwrites the memory pointed to by the rx descriptor, causing invalid information to form the 802.11 header. Fix these issues by moving all rx descriptor accesses before the skb_push() operation which ensures the proper 802.11 headers are generated from the given rx descriptor and removing ath12k_dp_rxdesc_get_mpdu_frame_ctrl() for filling frame control, as this information is already fetched by ath12k_dp_rx_desc_get_dot11_hdr(). Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices") Co-developed-by: Karthikeyan Periyasamy Signed-off-by: Karthikeyan Periyasamy Signed-off-by: P Praneesh Link: https://patch.msgid.link/20250402180543.2670947-1-praneesh.p@oss.qualcomm.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/dp_rx.c | 27 +++++++++---------------- drivers/net/wireless/ath/ath12k/hal.c | 19 ----------------- drivers/net/wireless/ath/ath12k/hal.h | 1 - 3 files changed, 9 insertions(+), 38 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c index 4cbba96121a11..5fcf3a465eda8 100644 --- a/drivers/net/wireless/ath/ath12k/dp_rx.c +++ b/drivers/net/wireless/ath/ath12k/dp_rx.c @@ -228,12 +228,6 @@ static void ath12k_dp_rx_desc_get_crypto_header(struct ath12k_base *ab, ab->hal_rx_ops->rx_desc_get_crypto_header(desc, crypto_hdr, enctype); } -static u16 ath12k_dp_rxdesc_get_mpdu_frame_ctrl(struct ath12k_base *ab, - struct hal_rx_desc *desc) -{ - return ab->hal_rx_ops->rx_desc_get_mpdu_frame_ctl(desc); -} - static inline u8 ath12k_dp_rx_get_msdu_src_link(struct ath12k_base *ab, struct hal_rx_desc *desc) { @@ -2067,10 +2061,13 @@ static void ath12k_get_dot11_hdr_from_rx_desc(struct ath12k *ar, struct hal_rx_desc *rx_desc = rxcb->rx_desc; struct ath12k_base *ab = ar->ab; size_t hdr_len, crypto_len; - struct ieee80211_hdr *hdr; + struct ieee80211_hdr hdr; u16 qos_ctl; - __le16 fc; - u8 *crypto_hdr; + u8 *crypto_hdr, mesh_ctrl; + + ath12k_dp_rx_desc_get_dot11_hdr(ab, rx_desc, &hdr); + hdr_len = ieee80211_hdrlen(hdr.frame_control); + mesh_ctrl = ath12k_dp_rx_h_mesh_ctl_present(ab, rx_desc); if (!(status->flag & RX_FLAG_IV_STRIPPED)) { crypto_len = ath12k_dp_rx_crypto_param_len(ar, enctype); @@ -2078,22 +2075,16 @@ static void ath12k_get_dot11_hdr_from_rx_desc(struct ath12k *ar, ath12k_dp_rx_desc_get_crypto_header(ab, rx_desc, crypto_hdr, enctype); } - fc = cpu_to_le16(ath12k_dp_rxdesc_get_mpdu_frame_ctrl(ab, rx_desc)); - hdr_len = ieee80211_hdrlen(fc); skb_push(msdu, hdr_len); - hdr = (struct ieee80211_hdr *)msdu->data; - hdr->frame_control = fc; - - /* Get wifi header from rx_desc */ - ath12k_dp_rx_desc_get_dot11_hdr(ab, rx_desc, hdr); + memcpy(msdu->data, &hdr, min(hdr_len, sizeof(hdr))); if (rxcb->is_mcbc) status->flag &= ~RX_FLAG_PN_VALIDATED; /* Add QOS header */ - if (ieee80211_is_data_qos(hdr->frame_control)) { + if (ieee80211_is_data_qos(hdr.frame_control)) { qos_ctl = rxcb->tid; - if (ath12k_dp_rx_h_mesh_ctl_present(ab, rx_desc)) + if (mesh_ctrl) qos_ctl |= IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT; /* TODO: Add other QoS ctl fields when required */ diff --git a/drivers/net/wireless/ath/ath12k/hal.c b/drivers/net/wireless/ath/ath12k/hal.c index ca04bfae8bdcc..2e3fce70386f8 100644 --- a/drivers/net/wireless/ath/ath12k/hal.c +++ b/drivers/net/wireless/ath/ath12k/hal.c @@ -511,11 +511,6 @@ static void ath12k_hw_qcn9274_rx_desc_get_crypto_hdr(struct hal_rx_desc *desc, crypto_hdr[7] = HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcn9274.mpdu_start.pn[1]); } -static u16 ath12k_hw_qcn9274_rx_desc_get_mpdu_frame_ctl(struct hal_rx_desc *desc) -{ - return __le16_to_cpu(desc->u.qcn9274.mpdu_start.frame_ctrl); -} - static int ath12k_hal_srng_create_config_qcn9274(struct ath12k_base *ab) { struct ath12k_hal *hal = &ab->hal; @@ -736,7 +731,6 @@ const struct hal_rx_ops hal_rx_qcn9274_ops = { .rx_desc_is_da_mcbc = ath12k_hw_qcn9274_rx_desc_is_da_mcbc, .rx_desc_get_dot11_hdr = ath12k_hw_qcn9274_rx_desc_get_dot11_hdr, .rx_desc_get_crypto_header = ath12k_hw_qcn9274_rx_desc_get_crypto_hdr, - .rx_desc_get_mpdu_frame_ctl = ath12k_hw_qcn9274_rx_desc_get_mpdu_frame_ctl, .dp_rx_h_msdu_done = ath12k_hw_qcn9274_dp_rx_h_msdu_done, .dp_rx_h_l4_cksum_fail = ath12k_hw_qcn9274_dp_rx_h_l4_cksum_fail, .dp_rx_h_ip_cksum_fail = ath12k_hw_qcn9274_dp_rx_h_ip_cksum_fail, @@ -975,11 +969,6 @@ ath12k_hw_qcn9274_compact_rx_desc_get_crypto_hdr(struct hal_rx_desc *desc, HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcn9274_compact.mpdu_start.pn[1]); } -static u16 ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_frame_ctl(struct hal_rx_desc *desc) -{ - return __le16_to_cpu(desc->u.qcn9274_compact.mpdu_start.frame_ctrl); -} - static bool ath12k_hw_qcn9274_compact_dp_rx_h_msdu_done(struct hal_rx_desc *desc) { return !!le32_get_bits(desc->u.qcn9274_compact.msdu_end.info14, @@ -1080,8 +1069,6 @@ const struct hal_rx_ops hal_rx_qcn9274_compact_ops = { .rx_desc_is_da_mcbc = ath12k_hw_qcn9274_compact_rx_desc_is_da_mcbc, .rx_desc_get_dot11_hdr = ath12k_hw_qcn9274_compact_rx_desc_get_dot11_hdr, .rx_desc_get_crypto_header = ath12k_hw_qcn9274_compact_rx_desc_get_crypto_hdr, - .rx_desc_get_mpdu_frame_ctl = - ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_frame_ctl, .dp_rx_h_msdu_done = ath12k_hw_qcn9274_compact_dp_rx_h_msdu_done, .dp_rx_h_l4_cksum_fail = ath12k_hw_qcn9274_compact_dp_rx_h_l4_cksum_fail, .dp_rx_h_ip_cksum_fail = ath12k_hw_qcn9274_compact_dp_rx_h_ip_cksum_fail, @@ -1330,11 +1317,6 @@ static void ath12k_hw_wcn7850_rx_desc_get_crypto_hdr(struct hal_rx_desc *desc, crypto_hdr[7] = HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.wcn7850.mpdu_start.pn[1]); } -static u16 ath12k_hw_wcn7850_rx_desc_get_mpdu_frame_ctl(struct hal_rx_desc *desc) -{ - return __le16_to_cpu(desc->u.wcn7850.mpdu_start.frame_ctrl); -} - static int ath12k_hal_srng_create_config_wcn7850(struct ath12k_base *ab) { struct ath12k_hal *hal = &ab->hal; @@ -1555,7 +1537,6 @@ const struct hal_rx_ops hal_rx_wcn7850_ops = { .rx_desc_is_da_mcbc = ath12k_hw_wcn7850_rx_desc_is_da_mcbc, .rx_desc_get_dot11_hdr = ath12k_hw_wcn7850_rx_desc_get_dot11_hdr, .rx_desc_get_crypto_header = ath12k_hw_wcn7850_rx_desc_get_crypto_hdr, - .rx_desc_get_mpdu_frame_ctl = ath12k_hw_wcn7850_rx_desc_get_mpdu_frame_ctl, .dp_rx_h_msdu_done = ath12k_hw_wcn7850_dp_rx_h_msdu_done, .dp_rx_h_l4_cksum_fail = ath12k_hw_wcn7850_dp_rx_h_l4_cksum_fail, .dp_rx_h_ip_cksum_fail = ath12k_hw_wcn7850_dp_rx_h_ip_cksum_fail, diff --git a/drivers/net/wireless/ath/ath12k/hal.h b/drivers/net/wireless/ath/ath12k/hal.h index 8a78bb9a10bc1..1fdd573532b93 100644 --- a/drivers/net/wireless/ath/ath12k/hal.h +++ b/drivers/net/wireless/ath/ath12k/hal.h @@ -1068,7 +1068,6 @@ struct hal_rx_ops { bool (*rx_desc_is_da_mcbc)(struct hal_rx_desc *desc); void (*rx_desc_get_dot11_hdr)(struct hal_rx_desc *desc, struct ieee80211_hdr *hdr); - u16 (*rx_desc_get_mpdu_frame_ctl)(struct hal_rx_desc *desc); void (*rx_desc_get_crypto_header)(struct hal_rx_desc *desc, u8 *crypto_hdr, enum hal_encrypt_type enctype); -- GitLab From fa5977d89d31ec5f22d63b27eebfba9632faf9c1 Mon Sep 17 00:00:00 2001 From: Jacob Moroni Date: Thu, 20 Feb 2025 17:56:12 +0000 Subject: [PATCH 0812/2211] IB/cm: use rwlock for MAD agent lock [ Upstream commit 4dab26bed543584577b64b36aadb8b5b165bf44f ] In workloads where there are many processes establishing connections using RDMA CM in parallel (large scale MPI), there can be heavy contention for mad_agent_lock in cm_alloc_msg. This contention can occur while inside of a spin_lock_irq region, leading to interrupts being disabled for extended durations on many cores. Furthermore, it leads to the serialization of rdma_create_ah calls, which has negative performance impacts for NICs which are capable of processing multiple address handle creations in parallel. The end result is the machine becoming unresponsive, hung task warnings, netdev TX timeouts, etc. Since the lock appears to be only for protection from cm_remove_one, it can be changed to a rwlock to resolve these issues. Reproducer: Server: for i in $(seq 1 512); do ucmatose -c 32 -p $((i + 5000)) & done Client: for i in $(seq 1 512); do ucmatose -c 32 -p $((i + 5000)) -s 10.2.0.52 & done Fixes: 76039ac9095f ("IB/cm: Protect cm_dev, cm_ports and mad_agent with kref and lock") Link: https://patch.msgid.link/r/20250220175612.2763122-1-jmoroni@google.com Signed-off-by: Jacob Moroni Acked-by: Eric Dumazet Reviewed-by: Zhu Yanjun Reviewed-by: Jason Gunthorpe Signed-off-by: Jason Gunthorpe Signed-off-by: Sasha Levin --- drivers/infiniband/core/cm.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index 07fb8d3c037f0..d45e3909dafe1 100644 --- a/drivers/infiniband/core/cm.c +++ b/drivers/infiniband/core/cm.c @@ -166,7 +166,7 @@ struct cm_port { struct cm_device { struct kref kref; struct list_head list; - spinlock_t mad_agent_lock; + rwlock_t mad_agent_lock; struct ib_device *ib_device; u8 ack_delay; int going_down; @@ -284,7 +284,7 @@ static struct ib_mad_send_buf *cm_alloc_msg(struct cm_id_private *cm_id_priv) if (!cm_id_priv->av.port) return ERR_PTR(-EINVAL); - spin_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); + read_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); mad_agent = cm_id_priv->av.port->mad_agent; if (!mad_agent) { m = ERR_PTR(-EINVAL); @@ -315,7 +315,7 @@ static struct ib_mad_send_buf *cm_alloc_msg(struct cm_id_private *cm_id_priv) m->context[0] = cm_id_priv; out: - spin_unlock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); + read_unlock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); return m; } @@ -1294,10 +1294,10 @@ static __be64 cm_form_tid(struct cm_id_private *cm_id_priv) if (!cm_id_priv->av.port) return cpu_to_be64(low_tid); - spin_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); + read_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); if (cm_id_priv->av.port->mad_agent) hi_tid = ((u64)cm_id_priv->av.port->mad_agent->hi_tid) << 32; - spin_unlock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); + read_unlock(&cm_id_priv->av.port->cm_dev->mad_agent_lock); return cpu_to_be64(hi_tid | low_tid); } @@ -4374,7 +4374,7 @@ static int cm_add_one(struct ib_device *ib_device) return -ENOMEM; kref_init(&cm_dev->kref); - spin_lock_init(&cm_dev->mad_agent_lock); + rwlock_init(&cm_dev->mad_agent_lock); cm_dev->ib_device = ib_device; cm_dev->ack_delay = ib_device->attrs.local_ca_ack_delay; cm_dev->going_down = 0; @@ -4490,9 +4490,9 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data) * The above ensures no call paths from the work are running, * the remaining paths all take the mad_agent_lock. */ - spin_lock(&cm_dev->mad_agent_lock); + write_lock(&cm_dev->mad_agent_lock); port->mad_agent = NULL; - spin_unlock(&cm_dev->mad_agent_lock); + write_unlock(&cm_dev->mad_agent_lock); ib_unregister_mad_agent(mad_agent); ib_port_unregister_client_groups(ib_device, i, cm_counter_groups); -- GitLab From 671dd1fb8769f97a2ae4ce4655a7aecc66634eca Mon Sep 17 00:00:00 2001 From: Tao Chen Date: Mon, 7 Apr 2025 11:57:51 +0800 Subject: [PATCH 0813/2211] bpf: Check link_create.flags parameter for multi_kprobe [ Upstream commit 243911982aa9faf4361aa952f879331ad66933fe ] The link_create.flags are currently not used for multi-kprobes, so return -EINVAL if it is set, same as for other attach APIs. We allow target_fd, on the other hand, to have an arbitrary value for multi-kprobe, as there are existing users (libbpf) relying on this. Fixes: 0dcac2725406 ("bpf: Add multi kprobe link") Signed-off-by: Tao Chen Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250407035752.1108927-1-chen.dylane@linux.dev Signed-off-by: Sasha Levin --- kernel/trace/bpf_trace.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index e5c063fc8ef97..042263e739e29 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -2932,6 +2932,9 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr if (sizeof(u64) != sizeof(void *)) return -EOPNOTSUPP; + if (attr->link_create.flags) + return -EINVAL; + if (!is_kprobe_multi(prog)) return -EINVAL; -- GitLab From f1b0b9b71265f1f6c50d651f34e4828ba1de5f30 Mon Sep 17 00:00:00 2001 From: Saket Kumar Bhaskar Date: Wed, 9 Apr 2025 15:26:33 +0530 Subject: [PATCH 0814/2211] selftests/bpf: Fix bpf_nf selftest failure [ Upstream commit 967e8def1100cb4b08c28a54d27ce69563fdf281 ] For systems with missing iptables-legacy tool this selftest fails. Add check to find if iptables-legacy tool is available and skip the test if the tool is missing. Fixes: de9c8d848d90 ("selftests/bpf: S/iptables/iptables-legacy/ in the bpf_nf and xdp_synproxy test") Signed-off-by: Saket Kumar Bhaskar Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250409095633.33653-1-skb99@linux.ibm.com Signed-off-by: Sasha Levin --- tools/testing/selftests/bpf/prog_tests/bpf_nf.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_nf.c b/tools/testing/selftests/bpf/prog_tests/bpf_nf.c index a4a1f93878d40..fad98f01e2c06 100644 --- a/tools/testing/selftests/bpf/prog_tests/bpf_nf.c +++ b/tools/testing/selftests/bpf/prog_tests/bpf_nf.c @@ -63,6 +63,12 @@ static void test_bpf_nf_ct(int mode) .repeat = 1, ); + if (SYS_NOFAIL("iptables-legacy --version")) { + fprintf(stdout, "Missing required iptables-legacy tool\n"); + test__skip(); + return; + } + skel = test_bpf_nf__open_and_load(); if (!ASSERT_OK_PTR(skel, "test_bpf_nf__open_and_load")) return; -- GitLab From 57fbbe29e86042bbaa31c1a30d2afa16c427e3f7 Mon Sep 17 00:00:00 2001 From: Jiayuan Chen Date: Wed, 19 Feb 2025 13:20:14 +0800 Subject: [PATCH 0815/2211] bpf: fix ktls panic with sockmap [ Upstream commit 54a3ecaeeeae8176da8badbd7d72af1017032c39 ] [ 2172.936997] ------------[ cut here ]------------ [ 2172.936999] kernel BUG at lib/iov_iter.c:629! ...... [ 2172.944996] PKRU: 55555554 [ 2172.945155] Call Trace: [ 2172.945299] [ 2172.945428] ? die+0x36/0x90 [ 2172.945601] ? do_trap+0xdd/0x100 [ 2172.945795] ? iov_iter_revert+0x178/0x180 [ 2172.946031] ? iov_iter_revert+0x178/0x180 [ 2172.946267] ? do_error_trap+0x7d/0x110 [ 2172.946499] ? iov_iter_revert+0x178/0x180 [ 2172.946736] ? exc_invalid_op+0x50/0x70 [ 2172.946961] ? iov_iter_revert+0x178/0x180 [ 2172.947197] ? asm_exc_invalid_op+0x1a/0x20 [ 2172.947446] ? iov_iter_revert+0x178/0x180 [ 2172.947683] ? iov_iter_revert+0x5c/0x180 [ 2172.947913] tls_sw_sendmsg_locked.isra.0+0x794/0x840 [ 2172.948206] tls_sw_sendmsg+0x52/0x80 [ 2172.948420] ? inet_sendmsg+0x1f/0x70 [ 2172.948634] __sys_sendto+0x1cd/0x200 [ 2172.948848] ? find_held_lock+0x2b/0x80 [ 2172.949072] ? syscall_trace_enter+0x140/0x270 [ 2172.949330] ? __lock_release.isra.0+0x5e/0x170 [ 2172.949595] ? find_held_lock+0x2b/0x80 [ 2172.949817] ? syscall_trace_enter+0x140/0x270 [ 2172.950211] ? lockdep_hardirqs_on_prepare+0xda/0x190 [ 2172.950632] ? ktime_get_coarse_real_ts64+0xc2/0xd0 [ 2172.951036] __x64_sys_sendto+0x24/0x30 [ 2172.951382] do_syscall_64+0x90/0x170 ...... After calling bpf_exec_tx_verdict(), the size of msg_pl->sg may increase, e.g., when the BPF program executes bpf_msg_push_data(). If the BPF program sets cork_bytes and sg.size is smaller than cork_bytes, it will return -ENOSPC and attempt to roll back to the non-zero copy logic. However, during rollback, msg->msg_iter is reset, but since msg_pl->sg.size has been increased, subsequent executions will exceed the actual size of msg_iter. ''' iov_iter_revert(&msg->msg_iter, msg_pl->sg.size - orig_size); ''' The changes in this commit are based on the following considerations: 1. When cork_bytes is set, rolling back to non-zero copy logic is pointless and can directly go to zero-copy logic. 2. We can not calculate the correct number of bytes to revert msg_iter. Assume the original data is "abcdefgh" (8 bytes), and after 3 pushes by the BPF program, it becomes 11-byte data: "abc?de?fgh?". Then, we set cork_bytes to 6, which means the first 6 bytes have been processed, and the remaining 5 bytes "?fgh?" will be cached until the length meets the cork_bytes requirement. However, some data in "?fgh?" is not within 'sg->msg_iter' (but in msg_pl instead), especially the data "?" we pushed. So it doesn't seem as simple as just reverting through an offset of msg_iter. 3. For non-TLS sockets in tcp_bpf_sendmsg, when a "cork" situation occurs, the user-space send() doesn't return an error, and the returned length is the same as the input length parameter, even if some data is cached. Additionally, I saw that the current non-zero-copy logic for handling corking is written as: ''' line 1177 else if (ret != -EAGAIN) { if (ret == -ENOSPC) ret = 0; goto send_end; ''' So it's ok to just return 'copied' without error when a "cork" situation occurs. Fixes: fcb14cb1bdac ("new iov_iter flavour - ITER_UBUF") Fixes: d3b18ad31f93 ("tls: add bpf support to sk_msg handling") Signed-off-by: Jiayuan Chen Acked-by: John Fastabend Link: https://lore.kernel.org/r/20250219052015.274405-2-jiayuan.chen@linux.dev Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- net/tls/tls_sw.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 7bcc9b4408a2c..b3cae4dd4f499 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -1120,9 +1120,13 @@ alloc_encrypted: num_async++; else if (ret == -ENOMEM) goto wait_for_memory; - else if (ctx->open_rec && ret == -ENOSPC) + else if (ctx->open_rec && ret == -ENOSPC) { + if (msg_pl->cork_bytes) { + ret = 0; + goto send_end; + } goto rollback_iter; - else if (ret != -EAGAIN) + } else if (ret != -EAGAIN) goto send_end; } continue; -- GitLab From 3a8e680f7d7cfa02fc505eb465a87ab7e87a6fe8 Mon Sep 17 00:00:00 2001 From: Jiayuan Chen Date: Mon, 7 Apr 2025 22:21:21 +0800 Subject: [PATCH 0816/2211] bpf, sockmap: fix duplicated data transmission [ Upstream commit 3b4f14b794287be137ea2c6158765d1ea1e018a4 ] In the !ingress path under sk_psock_handle_skb(), when sending data to the remote under snd_buf limitations, partial skb data might be transmitted. Although we preserved the partial transmission state (offset/length), the state wasn't properly consumed during retries. This caused the retry path to resend the entire skb data instead of continuing from the previous offset, resulting in data overlap at the receiver side. Fixes: 405df89dd52c ("bpf, sockmap: Improved check for empty queue") Signed-off-by: Jiayuan Chen Link: https://lore.kernel.org/r/20250407142234.47591-3-jiayuan.chen@linux.dev Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- net/core/skmsg.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/net/core/skmsg.c b/net/core/skmsg.c index f76cbf49c68c8..74eac311faf25 100644 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c @@ -655,11 +655,6 @@ static void sk_psock_backlog(struct work_struct *work) int ret; mutex_lock(&psock->work_mutex); - if (unlikely(state->len)) { - len = state->len; - off = state->off; - } - while ((skb = skb_peek(&psock->ingress_skb))) { len = skb->len; off = 0; @@ -669,6 +664,13 @@ static void sk_psock_backlog(struct work_struct *work) off = stm->offset; len = stm->full_len; } + + /* Resume processing from previous partial state */ + if (unlikely(state->len)) { + len = state->len; + off = state->off; + } + ingress = skb_bpf_ingress(skb); skb_bpf_redirect_clear(skb); do { @@ -696,6 +698,8 @@ static void sk_psock_backlog(struct work_struct *work) len -= ret; } while (len); + /* The entire skb sent, clear state */ + sk_psock_skb_state(psock, state, 0, 0); skb = skb_dequeue(&psock->ingress_skb); kfree_skb(skb); } -- GitLab From 3d25fa2d7f127348c818e1dab9e58534f7ac56cc Mon Sep 17 00:00:00 2001 From: Jiayuan Chen Date: Mon, 7 Apr 2025 22:21:22 +0800 Subject: [PATCH 0817/2211] bpf, sockmap: Fix panic when calling skb_linearize MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 5ca2e29f6834c64c0e5a9ccf1278c21fb49b827e ] The panic can be reproduced by executing the command: ./bench sockmap -c 2 -p 1 -a --rx-verdict-ingress --rx-strp 100000 Then a kernel panic was captured: ''' [ 657.460555] kernel BUG at net/core/skbuff.c:2178! [ 657.462680] Tainted: [W]=WARN [ 657.463287] Workqueue: events sk_psock_backlog ... [ 657.469610] [ 657.469738] ? die+0x36/0x90 [ 657.469916] ? do_trap+0x1d0/0x270 [ 657.470118] ? pskb_expand_head+0x612/0xf40 [ 657.470376] ? pskb_expand_head+0x612/0xf40 [ 657.470620] ? do_error_trap+0xa3/0x170 [ 657.470846] ? pskb_expand_head+0x612/0xf40 [ 657.471092] ? handle_invalid_op+0x2c/0x40 [ 657.471335] ? pskb_expand_head+0x612/0xf40 [ 657.471579] ? exc_invalid_op+0x2d/0x40 [ 657.471805] ? asm_exc_invalid_op+0x1a/0x20 [ 657.472052] ? pskb_expand_head+0xd1/0xf40 [ 657.472292] ? pskb_expand_head+0x612/0xf40 [ 657.472540] ? lock_acquire+0x18f/0x4e0 [ 657.472766] ? find_held_lock+0x2d/0x110 [ 657.472999] ? __pfx_pskb_expand_head+0x10/0x10 [ 657.473263] ? __kmalloc_cache_noprof+0x5b/0x470 [ 657.473537] ? __pfx___lock_release.isra.0+0x10/0x10 [ 657.473826] __pskb_pull_tail+0xfd/0x1d20 [ 657.474062] ? __kasan_slab_alloc+0x4e/0x90 [ 657.474707] sk_psock_skb_ingress_enqueue+0x3bf/0x510 [ 657.475392] ? __kasan_kmalloc+0xaa/0xb0 [ 657.476010] sk_psock_backlog+0x5cf/0xd70 [ 657.476637] process_one_work+0x858/0x1a20 ''' The panic originates from the assertion BUG_ON(skb_shared(skb)) in skb_linearize(). A previous commit(see Fixes tag) introduced skb_get() to avoid race conditions between skb operations in the backlog and skb release in the recvmsg path. However, this caused the panic to always occur when skb_linearize is executed. The "--rx-strp 100000" parameter forces the RX path to use the strparser module which aggregates data until it reaches 100KB before calling sockmap logic. The 100KB payload exceeds MAX_MSG_FRAGS, triggering skb_linearize. To fix this issue, just move skb_get into sk_psock_skb_ingress_enqueue. ''' sk_psock_backlog: sk_psock_handle_skb skb_get(skb) <== we move it into 'sk_psock_skb_ingress_enqueue' sk_psock_skb_ingress____________ ↓ | | → sk_psock_skb_ingress_self | sk_psock_skb_ingress_enqueue sk_psock_verdict_apply_________________↑ skb_linearize ''' Note that for verdict_apply path, the skb_get operation is unnecessary so we add 'take_ref' param to control it's behavior. Fixes: a454d84ee20b ("bpf, sockmap: Fix skb refcnt race after locking changes") Signed-off-by: Jiayuan Chen Link: https://lore.kernel.org/r/20250407142234.47591-4-jiayuan.chen@linux.dev Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- net/core/skmsg.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/net/core/skmsg.c b/net/core/skmsg.c index 74eac311faf25..1219e0404def0 100644 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c @@ -529,16 +529,22 @@ static int sk_psock_skb_ingress_enqueue(struct sk_buff *skb, u32 off, u32 len, struct sk_psock *psock, struct sock *sk, - struct sk_msg *msg) + struct sk_msg *msg, + bool take_ref) { int num_sge, copied; + /* skb_to_sgvec will fail when the total number of fragments in + * frag_list and frags exceeds MAX_MSG_FRAGS. For example, the + * caller may aggregate multiple skbs. + */ num_sge = skb_to_sgvec(skb, msg->sg.data, off, len); if (num_sge < 0) { /* skb linearize may fail with ENOMEM, but lets simply try again * later if this happens. Under memory pressure we don't want to * drop the skb. We need to linearize the skb so that the mapping * in skb_to_sgvec can not error. + * Note that skb_linearize requires the skb not to be shared. */ if (skb_linearize(skb)) return -EAGAIN; @@ -555,7 +561,7 @@ static int sk_psock_skb_ingress_enqueue(struct sk_buff *skb, msg->sg.start = 0; msg->sg.size = copied; msg->sg.end = num_sge; - msg->skb = skb; + msg->skb = take_ref ? skb_get(skb) : skb; sk_psock_queue_msg(psock, msg); sk_psock_data_ready(sk, psock); @@ -563,7 +569,7 @@ static int sk_psock_skb_ingress_enqueue(struct sk_buff *skb, } static int sk_psock_skb_ingress_self(struct sk_psock *psock, struct sk_buff *skb, - u32 off, u32 len); + u32 off, u32 len, bool take_ref); static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb, u32 off, u32 len) @@ -577,7 +583,7 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb, * correctly. */ if (unlikely(skb->sk == sk)) - return sk_psock_skb_ingress_self(psock, skb, off, len); + return sk_psock_skb_ingress_self(psock, skb, off, len, true); msg = sk_psock_create_ingress_msg(sk, skb); if (!msg) return -EAGAIN; @@ -589,7 +595,7 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb, * into user buffers. */ skb_set_owner_r(skb, sk); - err = sk_psock_skb_ingress_enqueue(skb, off, len, psock, sk, msg); + err = sk_psock_skb_ingress_enqueue(skb, off, len, psock, sk, msg, true); if (err < 0) kfree(msg); return err; @@ -600,7 +606,7 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb, * because the skb is already accounted for here. */ static int sk_psock_skb_ingress_self(struct sk_psock *psock, struct sk_buff *skb, - u32 off, u32 len) + u32 off, u32 len, bool take_ref) { struct sk_msg *msg = alloc_sk_msg(GFP_ATOMIC); struct sock *sk = psock->sk; @@ -609,7 +615,7 @@ static int sk_psock_skb_ingress_self(struct sk_psock *psock, struct sk_buff *skb if (unlikely(!msg)) return -EAGAIN; skb_set_owner_r(skb, sk); - err = sk_psock_skb_ingress_enqueue(skb, off, len, psock, sk, msg); + err = sk_psock_skb_ingress_enqueue(skb, off, len, psock, sk, msg, take_ref); if (err < 0) kfree(msg); return err; @@ -618,18 +624,13 @@ static int sk_psock_skb_ingress_self(struct sk_psock *psock, struct sk_buff *skb static int sk_psock_handle_skb(struct sk_psock *psock, struct sk_buff *skb, u32 off, u32 len, bool ingress) { - int err = 0; - if (!ingress) { if (!sock_writeable(psock->sk)) return -EAGAIN; return skb_send_sock(psock->sk, skb, off, len); } - skb_get(skb); - err = sk_psock_skb_ingress(psock, skb, off, len); - if (err < 0) - kfree_skb(skb); - return err; + + return sk_psock_skb_ingress(psock, skb, off, len); } static void sk_psock_skb_state(struct sk_psock *psock, @@ -1017,7 +1018,7 @@ static int sk_psock_verdict_apply(struct sk_psock *psock, struct sk_buff *skb, off = stm->offset; len = stm->full_len; } - err = sk_psock_skb_ingress_self(psock, skb, off, len); + err = sk_psock_skb_ingress_self(psock, skb, off, len, false); } if (err < 0) { spin_lock_bh(&psock->ingress_lock); -- GitLab From 44a51592ac657d8e422585414d7ec17a5b50fb0e Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Tue, 25 Mar 2025 16:06:46 +0800 Subject: [PATCH 0818/2211] f2fs: zone: fix to avoid inconsistence in between SIT and SSA [ Upstream commit 773704c1ef96a8b70d0d186ab725f50548de82c4 ] w/ below testcase, it will cause inconsistence in between SIT and SSA. create_null_blk 512 2 1024 1024 mkfs.f2fs -m /dev/nullb0 mount /dev/nullb0 /mnt/f2fs/ touch /mnt/f2fs/file f2fs_io pinfile set /mnt/f2fs/file fallocate -l 4GiB /mnt/f2fs/file F2FS-fs (nullb0): Inconsistent segment (0) type [1, 0] in SSA and SIT CPU: 5 UID: 0 PID: 2398 Comm: fallocate Tainted: G O 6.13.0-rc1 #84 Tainted: [O]=OOT_MODULE Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 Call Trace: dump_stack_lvl+0xb3/0xd0 dump_stack+0x14/0x20 f2fs_handle_critical_error+0x18c/0x220 [f2fs] f2fs_stop_checkpoint+0x38/0x50 [f2fs] do_garbage_collect+0x674/0x6e0 [f2fs] f2fs_gc_range+0x12b/0x230 [f2fs] f2fs_allocate_pinning_section+0x5c/0x150 [f2fs] f2fs_expand_inode_data+0x1cc/0x3c0 [f2fs] f2fs_fallocate+0x3c3/0x410 [f2fs] vfs_fallocate+0x15f/0x4b0 __x64_sys_fallocate+0x4a/0x80 x64_sys_call+0x15e8/0x1b80 do_syscall_64+0x68/0x130 entry_SYSCALL_64_after_hwframe+0x67/0x6f RIP: 0033:0x7f9dba5197ca F2FS-fs (nullb0): Stopped filesystem due to reason: 4 The reason is f2fs_gc_range() may try to migrate block in curseg, however, its SSA block is not uptodate due to the last summary block data is still in cache of curseg. In this patch, we add a condition in f2fs_gc_range() to check whether section is opened or not, and skip block migration for opened section. Fixes: 9703d69d9d15 ("f2fs: support file pinning for zoned devices") Reviewed-by: Daeho Jeong Cc: Daeho Jeong Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/gc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index e0469316c7cd4..cd56c0e66657b 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -2072,6 +2072,9 @@ int f2fs_gc_range(struct f2fs_sb_info *sbi, .iroot = RADIX_TREE_INIT(gc_list.iroot, GFP_NOFS), }; + if (IS_CURSEC(sbi, GET_SEC_FROM_SEG(sbi, segno))) + continue; + do_garbage_collect(sbi, segno, &gc_list, FG_GC, true, false); put_gc_inode(&gc_list); -- GitLab From 553c265cd6596a9830fc532f2a1f7f7d1075801a Mon Sep 17 00:00:00 2001 From: Raj Kumar Bhagat Date: Thu, 3 Apr 2025 15:34:29 +0530 Subject: [PATCH 0819/2211] wifi: ath12k: fix cleanup path after mhi init [ Upstream commit 6177c97fb6f05bf0473a2806e3bece7e77693209 ] Currently, the 'err_pci_msi_free' label is misplaced, causing the cleanup sequence to be incorrect. Fix this by moving the 'err_pci_msi_free' label to the correct position after 'err_irq_affinity_cleanup'. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00209-QCAHKSWPL_SILICONZ-1 Fixes: a3012f206d07 ("wifi: ath12k: set IRQ affinity to CPU0 in case of one MSI vector") Signed-off-by: Raj Kumar Bhagat Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250403-ath12k-cleanup-v1-1-ad8f67b0e9cf@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/pci.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/pci.c b/drivers/net/wireless/ath/ath12k/pci.c index 45d537066345a..1068cc07bc9f6 100644 --- a/drivers/net/wireless/ath/ath12k/pci.c +++ b/drivers/net/wireless/ath/ath12k/pci.c @@ -1514,12 +1514,12 @@ err_hal_srng_deinit: err_mhi_unregister: ath12k_mhi_unregister(ab_pci); -err_pci_msi_free: - ath12k_pci_msi_free(ab_pci); - err_irq_affinity_cleanup: ath12k_pci_set_irq_affinity_hint(ab_pci, NULL); +err_pci_msi_free: + ath12k_pci_msi_free(ab_pci); + err_pci_free_region: ath12k_pci_free_region(ab_pci); -- GitLab From 827ff610afbb5d9d8d8743bc82d3c10a778f22e4 Mon Sep 17 00:00:00 2001 From: Ramya Gnanasekar Date: Wed, 9 Apr 2025 20:53:41 +0530 Subject: [PATCH 0820/2211] wifi: ath12k: Fix WMI tag for EHT rate in peer assoc [ Upstream commit 1a0e65750b55d2cf5de4a9bf7d6d55718784bdb7 ] Incorrect WMI tag is used for EHT rate update from host to firmware while encoding peer assoc WMI. Correct the WMI tag used for EHT rate update from WMI_TAG_HE_RATE_SET to the proper tag. This ensures firmware does not mistakenly update HE rate during parsing. Found during code review. Compile tested only. Fixes: 5b70ec6036c1 ("wifi: ath12k: add WMI support for EHT peer") Signed-off-by: Ramya Gnanasekar Link: https://patch.msgid.link/20250409152341.944628-1-ramya.gnanasekar@oss.qualcomm.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/wmi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c index 30836a09d5506..b2e586811858e 100644 --- a/drivers/net/wireless/ath/ath12k/wmi.c +++ b/drivers/net/wireless/ath/ath12k/wmi.c @@ -2157,7 +2157,7 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar, for (i = 0; i < arg->peer_eht_mcs_count; i++) { eht_mcs = ptr; - eht_mcs->tlv_header = ath12k_wmi_tlv_cmd_hdr(WMI_TAG_HE_RATE_SET, + eht_mcs->tlv_header = ath12k_wmi_tlv_cmd_hdr(WMI_TAG_EHT_RATE_SET, sizeof(*eht_mcs)); eht_mcs->rx_mcs_set = cpu_to_le32(arg->peer_eht_rx_mcs_set[i]); -- GitLab From 0c57aa8ef94cffc5c2d68230e19329a03e71a94f Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Wed, 9 Apr 2025 14:01:25 +0300 Subject: [PATCH 0821/2211] wifi: ath12k: Fix buffer overflow in debugfs [ Upstream commit 8c7a5031a6b0d42e640fbd2d5d05f61f74e32dce ] If the user tries to write more than 32 bytes then it results in memory corruption. Fortunately, this is debugfs so it's limited to root users. Fixes: 3f73c24f28b3 ("wifi: ath12k: Add support to enable debugfs_htt_stats") Signed-off-by: Dan Carpenter Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/35daefbd-d493-41d9-b192-96177d521b40@stanley.mountain Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c index f1b7e74aefe42..6f2e7ecc66af7 100644 --- a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c +++ b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c @@ -1646,6 +1646,9 @@ static ssize_t ath12k_write_htt_stats_type(struct file *file, const int size = 32; int num_args; + if (count > size) + return -EINVAL; + char *buf __free(kfree) = kzalloc(size, GFP_KERNEL); if (!buf) return -ENOMEM; -- GitLab From 2fa8d128eced6ad7e73bf9d4ca46e2f71e53358c Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Fri, 4 Apr 2025 19:03:03 +0000 Subject: [PATCH 0822/2211] f2fs: clean up unnecessary indentation [ Upstream commit 05d3273ad03fa5ea1177b4f3dfeeb6de4899b504 ] No functional change. Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/segment.h | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h index 0c004dd5595b9..25d3cda9bd5a3 100644 --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h @@ -431,7 +431,6 @@ static inline void __set_free(struct f2fs_sb_info *sbi, unsigned int segno) unsigned int secno = GET_SEC_FROM_SEG(sbi, segno); unsigned int start_segno = GET_SEG_FROM_SEC(sbi, secno); unsigned int next; - unsigned int usable_segs = f2fs_usable_segs_in_sec(sbi); spin_lock(&free_i->segmap_lock); clear_bit(segno, free_i->free_segmap); @@ -439,7 +438,7 @@ static inline void __set_free(struct f2fs_sb_info *sbi, unsigned int segno) next = find_next_bit(free_i->free_segmap, start_segno + SEGS_PER_SEC(sbi), start_segno); - if (next >= start_segno + usable_segs) { + if (next >= start_segno + f2fs_usable_segs_in_sec(sbi)) { clear_bit(secno, free_i->free_secmap); free_i->free_sections++; } @@ -465,22 +464,31 @@ static inline void __set_test_and_free(struct f2fs_sb_info *sbi, unsigned int secno = GET_SEC_FROM_SEG(sbi, segno); unsigned int start_segno = GET_SEG_FROM_SEC(sbi, secno); unsigned int next; - unsigned int usable_segs = f2fs_usable_segs_in_sec(sbi); + bool ret; spin_lock(&free_i->segmap_lock); - if (test_and_clear_bit(segno, free_i->free_segmap)) { - free_i->free_segments++; - - if (!inmem && IS_CURSEC(sbi, secno)) - goto skip_free; - next = find_next_bit(free_i->free_segmap, - start_segno + SEGS_PER_SEC(sbi), start_segno); - if (next >= start_segno + usable_segs) { - if (test_and_clear_bit(secno, free_i->free_secmap)) - free_i->free_sections++; - } - } -skip_free: + ret = test_and_clear_bit(segno, free_i->free_segmap); + if (!ret) + goto unlock_out; + + free_i->free_segments++; + + if (!inmem && IS_CURSEC(sbi, secno)) + goto unlock_out; + + /* check large section */ + next = find_next_bit(free_i->free_segmap, + start_segno + SEGS_PER_SEC(sbi), start_segno); + if (next < start_segno + f2fs_usable_segs_in_sec(sbi)) + goto unlock_out; + + ret = test_and_clear_bit(secno, free_i->free_secmap); + if (!ret) + goto unlock_out; + + free_i->free_sections++; + +unlock_out: spin_unlock(&free_i->segmap_lock); } -- GitLab From a4d80521352e4fdb9b87152e17cd24460797491a Mon Sep 17 00:00:00 2001 From: "yohan.joung" Date: Fri, 4 Apr 2025 08:21:06 +0900 Subject: [PATCH 0823/2211] f2fs: prevent the current section from being selected as a victim during GC [ Upstream commit d26fecb03e1f1069480d41fa2a6cea87ebbb89b8 ] When selecting a victim using next_victim_seg in a large section, the selected section might already have been cleared and designated as the new current section, making it actively in use. This behavior causes inconsistency between the SIT and SSA. F2FS-fs (dm-54): Inconsistent segment (70961) type [0, 1] in SSA and SIT Call trace: dump_backtrace+0xe8/0x10c show_stack+0x18/0x28 dump_stack_lvl+0x50/0x6c dump_stack+0x18/0x28 f2fs_stop_checkpoint+0x1c/0x3c do_garbage_collect+0x41c/0x271c f2fs_gc+0x27c/0x828 gc_thread_func+0x290/0x88c kthread+0x11c/0x164 ret_from_fork+0x10/0x20 issue scenario segs_per_sec=2 - seg#0 and seg#1 are all dirty - all valid blocks are removed in seg#1 - gc select this sec and next_victim_seg=seg#0 - migrate seg#0, next_victim_seg=seg#1 - checkpoint -> sec(seg#0, seg#1) becomes free - allocator assigns sec(seg#0, seg#1) to curseg - gc tries to migrate seg#1 Fixes: e3080b0120a1 ("f2fs: support subsectional garbage collection") Signed-off-by: yohan.joung Signed-off-by: Chao Yu Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/segment.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h index 25d3cda9bd5a3..05a342933f98f 100644 --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h @@ -488,6 +488,11 @@ static inline void __set_test_and_free(struct f2fs_sb_info *sbi, free_i->free_sections++; + if (GET_SEC_FROM_SEG(sbi, sbi->next_victim_seg[BG_GC]) == secno) + sbi->next_victim_seg[BG_GC] = NULL_SEGNO; + if (GET_SEC_FROM_SEG(sbi, sbi->next_victim_seg[FG_GC]) == secno) + sbi->next_victim_seg[FG_GC] = NULL_SEGNO; + unlock_out: spin_unlock(&free_i->segmap_lock); } -- GitLab From 65b3f76592aed5a43c4d79375ac097acf975972b Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Tue, 8 Apr 2025 20:22:08 +0800 Subject: [PATCH 0824/2211] f2fs: fix to do sanity check on sbi->total_valid_block_count [ Upstream commit 05872a167c2cab80ef186ef23cc34a6776a1a30c ] syzbot reported a f2fs bug as below: ------------[ cut here ]------------ kernel BUG at fs/f2fs/f2fs.h:2521! RIP: 0010:dec_valid_block_count+0x3b2/0x3c0 fs/f2fs/f2fs.h:2521 Call Trace: f2fs_truncate_data_blocks_range+0xc8c/0x11a0 fs/f2fs/file.c:695 truncate_dnode+0x417/0x740 fs/f2fs/node.c:973 truncate_nodes+0x3ec/0xf50 fs/f2fs/node.c:1014 f2fs_truncate_inode_blocks+0x8e3/0x1370 fs/f2fs/node.c:1197 f2fs_do_truncate_blocks+0x840/0x12b0 fs/f2fs/file.c:810 f2fs_truncate_blocks+0x10d/0x300 fs/f2fs/file.c:838 f2fs_truncate+0x417/0x720 fs/f2fs/file.c:888 f2fs_setattr+0xc4f/0x12f0 fs/f2fs/file.c:1112 notify_change+0xbca/0xe90 fs/attr.c:552 do_truncate+0x222/0x310 fs/open.c:65 handle_truncate fs/namei.c:3466 [inline] do_open fs/namei.c:3849 [inline] path_openat+0x2e4f/0x35d0 fs/namei.c:4004 do_filp_open+0x284/0x4e0 fs/namei.c:4031 do_sys_openat2+0x12b/0x1d0 fs/open.c:1429 do_sys_open fs/open.c:1444 [inline] __do_sys_creat fs/open.c:1522 [inline] __se_sys_creat fs/open.c:1516 [inline] __x64_sys_creat+0x124/0x170 fs/open.c:1516 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/syscall_64.c:94 The reason is: in fuzzed image, sbi->total_valid_block_count is inconsistent w/ mapped blocks indexed by inode, so, we should not trigger panic for such case, instead, let's print log and set fsck flag. Fixes: 39a53e0ce0df ("f2fs: add superblock and major in-memory structure") Reported-by: syzbot+8b376a77b2f364097fbe@syzkaller.appspotmail.com Closes: https://lore.kernel.org/linux-f2fs-devel/67f3c0b2.050a0220.396535.0547.GAE@google.com Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/f2fs.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 1c783c2e4902a..1219e37fa7ad3 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -2508,8 +2508,14 @@ static inline void dec_valid_block_count(struct f2fs_sb_info *sbi, blkcnt_t sectors = count << F2FS_LOG_SECTORS_PER_BLOCK; spin_lock(&sbi->stat_lock); - f2fs_bug_on(sbi, sbi->total_valid_block_count < (block_t) count); - sbi->total_valid_block_count -= (block_t)count; + if (unlikely(sbi->total_valid_block_count < count)) { + f2fs_warn(sbi, "Inconsistent total_valid_block_count:%u, ino:%lu, count:%u", + sbi->total_valid_block_count, inode->i_ino, count); + sbi->total_valid_block_count = 0; + set_sbi_flag(sbi, SBI_NEED_FSCK); + } else { + sbi->total_valid_block_count -= count; + } if (sbi->reserved_blocks && sbi->current_reserved_blocks < sbi->reserved_blocks) sbi->current_reserved_blocks = min(sbi->reserved_blocks, -- GitLab From 25a912b3e0c54bc68c45153e2256b2106e86bac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= Date: Wed, 9 Apr 2025 12:41:36 +0200 Subject: [PATCH 0825/2211] page_pool: Move pp_magic check into helper functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit cd3c93167da0e760b5819246eae7a4ea30fd014b ] Since we are about to stash some more information into the pp_magic field, let's move the magic signature checks into a pair of helper functions so it can be changed in one place. Reviewed-by: Mina Almasry Tested-by: Yonglong Liu Acked-by: Jesper Dangaard Brouer Reviewed-by: Ilias Apalodimas Signed-off-by: Toke Høiland-Jørgensen Link: https://patch.msgid.link/20250409-page-pool-track-dma-v9-1-6a9ef2e0cba8@redhat.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- .../net/ethernet/mellanox/mlx5/core/en/xdp.c | 4 ++-- include/linux/mm.h | 20 +++++++++++++++++++ mm/page_alloc.c | 8 ++------ net/core/netmem_priv.h | 5 +++++ net/core/skbuff.c | 16 ++------------- net/core/xdp.c | 4 ++-- 6 files changed, 33 insertions(+), 24 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c index 08ab0999f7b31..14192da4b8ed0 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c @@ -706,8 +706,8 @@ static void mlx5e_free_xdpsq_desc(struct mlx5e_xdpsq *sq, xdpi = mlx5e_xdpi_fifo_pop(xdpi_fifo); page = xdpi.page.page; - /* No need to check ((page->pp_magic & ~0x3UL) == PP_SIGNATURE) - * as we know this is a page_pool page. + /* No need to check page_pool_page_is_pp() as we + * know this is a page_pool page. */ page_pool_recycle_direct(page->pp, page); } while (++n < num); diff --git a/include/linux/mm.h b/include/linux/mm.h index 8617adc6becd1..412f5efe3ae79 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4243,4 +4243,24 @@ static inline void pgalloc_tag_copy(struct folio *new, struct folio *old) } #endif /* CONFIG_MEM_ALLOC_PROFILING */ +/* Mask used for checking in page_pool_page_is_pp() below. page->pp_magic is + * OR'ed with PP_SIGNATURE after the allocation in order to preserve bit 0 for + * the head page of compound page and bit 1 for pfmemalloc page. + * page_is_pfmemalloc() is checked in __page_pool_put_page() to avoid recycling + * the pfmemalloc page. + */ +#define PP_MAGIC_MASK ~0x3UL + +#ifdef CONFIG_PAGE_POOL +static inline bool page_pool_page_is_pp(struct page *page) +{ + return (page->pp_magic & PP_MAGIC_MASK) == PP_SIGNATURE; +} +#else +static inline bool page_pool_page_is_pp(struct page *page) +{ + return false; +} +#endif + #endif /* _LINUX_MM_H */ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 882903f42300b..752576749db9d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -872,9 +872,7 @@ static inline bool page_expected_state(struct page *page, #ifdef CONFIG_MEMCG page->memcg_data | #endif -#ifdef CONFIG_PAGE_POOL - ((page->pp_magic & ~0x3UL) == PP_SIGNATURE) | -#endif + page_pool_page_is_pp(page) | (page->flags & check_flags))) return false; @@ -901,10 +899,8 @@ static const char *page_bad_reason(struct page *page, unsigned long flags) if (unlikely(page->memcg_data)) bad_reason = "page still charged to cgroup"; #endif -#ifdef CONFIG_PAGE_POOL - if (unlikely((page->pp_magic & ~0x3UL) == PP_SIGNATURE)) + if (unlikely(page_pool_page_is_pp(page))) bad_reason = "page_pool leak"; -#endif return bad_reason; } diff --git a/net/core/netmem_priv.h b/net/core/netmem_priv.h index 7eadb8393e002..f33162fd281c2 100644 --- a/net/core/netmem_priv.h +++ b/net/core/netmem_priv.h @@ -18,6 +18,11 @@ static inline void netmem_clear_pp_magic(netmem_ref netmem) __netmem_clear_lsb(netmem)->pp_magic = 0; } +static inline bool netmem_is_pp(netmem_ref netmem) +{ + return (netmem_get_pp_magic(netmem) & PP_MAGIC_MASK) == PP_SIGNATURE; +} + static inline void netmem_set_pp(netmem_ref netmem, struct page_pool *pool) { __netmem_clear_lsb(netmem)->pp = pool; diff --git a/net/core/skbuff.c b/net/core/skbuff.c index f220306731dac..fdb36165c58f5 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -925,11 +925,6 @@ static void skb_clone_fraglist(struct sk_buff *skb) skb_get(list); } -static bool is_pp_netmem(netmem_ref netmem) -{ - return (netmem_get_pp_magic(netmem) & ~0x3UL) == PP_SIGNATURE; -} - int skb_pp_cow_data(struct page_pool *pool, struct sk_buff **pskb, unsigned int headroom) { @@ -1027,14 +1022,7 @@ bool napi_pp_put_page(netmem_ref netmem) { netmem = netmem_compound_head(netmem); - /* page->pp_magic is OR'ed with PP_SIGNATURE after the allocation - * in order to preserve any existing bits, such as bit 0 for the - * head page of compound page and bit 1 for pfmemalloc page, so - * mask those bits for freeing side when doing below checking, - * and page_is_pfmemalloc() is checked in __page_pool_put_page() - * to avoid recycling the pfmemalloc page. - */ - if (unlikely(!is_pp_netmem(netmem))) + if (unlikely(!netmem_is_pp(netmem))) return false; page_pool_put_full_netmem(netmem_get_pp(netmem), netmem, false); @@ -1074,7 +1062,7 @@ static int skb_pp_frag_ref(struct sk_buff *skb) for (i = 0; i < shinfo->nr_frags; i++) { head_netmem = netmem_compound_head(shinfo->frags[i].netmem); - if (likely(is_pp_netmem(head_netmem))) + if (likely(netmem_is_pp(head_netmem))) page_pool_ref_netmem(head_netmem); else page_ref_inc(netmem_to_page(head_netmem)); diff --git a/net/core/xdp.c b/net/core/xdp.c index bcc5551c6424b..23e7d736718b0 100644 --- a/net/core/xdp.c +++ b/net/core/xdp.c @@ -381,8 +381,8 @@ void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct, page = virt_to_head_page(data); if (napi_direct && xdp_return_frame_no_direct()) napi_direct = false; - /* No need to check ((page->pp_magic & ~0x3UL) == PP_SIGNATURE) - * as mem->type knows this a page_pool page + /* No need to check netmem_is_pp() as mem->type knows this a + * page_pool page */ page_pool_put_full_page(page->pp, page, napi_direct); break; -- GitLab From 4f51fb0d257ff4d406ec27966902de075e3b118e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= Date: Wed, 9 Apr 2025 12:41:37 +0200 Subject: [PATCH 0826/2211] page_pool: Track DMA-mapped pages and unmap them when destroying the pool MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit ee62ce7a1d909ccba0399680a03c2dee83bcae95 ] When enabling DMA mapping in page_pool, pages are kept DMA mapped until they are released from the pool, to avoid the overhead of re-mapping the pages every time they are used. This causes resource leaks and/or crashes when there are pages still outstanding while the device is torn down, because page_pool will attempt an unmap through a non-existent DMA device on the subsequent page return. To fix this, implement a simple tracking of outstanding DMA-mapped pages in page pool using an xarray. This was first suggested by Mina[0], and turns out to be fairly straight forward: We simply store pointers to pages directly in the xarray with xa_alloc() when they are first DMA mapped, and remove them from the array on unmap. Then, when a page pool is torn down, it can simply walk the xarray and unmap all pages still present there before returning, which also allows us to get rid of the get/put_device() calls in page_pool. Using xa_cmpxchg(), no additional synchronisation is needed, as a page will only ever be unmapped once. To avoid having to walk the entire xarray on unmap to find the page reference, we stash the ID assigned by xa_alloc() into the page structure itself, using the upper bits of the pp_magic field. This requires a couple of defines to avoid conflicting with the POINTER_POISON_DELTA define, but this is all evaluated at compile-time, so does not affect run-time performance. The bitmap calculations in this patch gives the following number of bits for different architectures: - 23 bits on 32-bit architectures - 21 bits on PPC64 (because of the definition of ILLEGAL_POINTER_VALUE) - 32 bits on other 64-bit architectures Stashing a value into the unused bits of pp_magic does have the effect that it can make the value stored there lie outside the unmappable range (as governed by the mmap_min_addr sysctl), for architectures that don't define ILLEGAL_POINTER_VALUE. This means that if one of the pointers that is aliased to the pp_magic field (such as page->lru.next) is dereferenced while the page is owned by page_pool, that could lead to a dereference into userspace, which is a security concern. The risk of this is mitigated by the fact that (a) we always clear pp_magic before releasing a page from page_pool, and (b) this would need a use-after-free bug for struct page, which can have many other risks since page->lru.next is used as a generic list pointer in multiple places in the kernel. As such, with this patch we take the position that this risk is negligible in practice. For more discussion, see[1]. Since all the tracking added in this patch is performed on DMA map/unmap, no additional code is needed in the fast path, meaning the performance overhead of this tracking is negligible there. A micro-benchmark shows that the total overhead of the tracking itself is about 400 ns (39 cycles(tsc) 395.218 ns; sum for both map and unmap[2]). Since this cost is only paid on DMA map and unmap, it seems like an acceptable cost to fix the late unmap issue. Further optimisation can narrow the cases where this cost is paid (for instance by eliding the tracking when DMA map/unmap is a no-op). The extra memory needed to track the pages is neatly encapsulated inside xarray, which uses the 'struct xa_node' structure to track items. This structure is 576 bytes long, with slots for 64 items, meaning that a full node occurs only 9 bytes of overhead per slot it tracks (in practice, it probably won't be this efficient, but in any case it should be an acceptable overhead). [0] https://lore.kernel.org/all/CAHS8izPg7B5DwKfSuzz-iOop_YRbk3Sd6Y4rX7KBG9DcVJcyWg@mail.gmail.com/ [1] https://lore.kernel.org/r/20250320023202.GA25514@openwall.com [2] https://lore.kernel.org/r/ae07144c-9295-4c9d-a400-153bb689fe9e@huawei.com Reported-by: Yonglong Liu Closes: https://lore.kernel.org/r/8743264a-9700-4227-a556-5f931c720211@huawei.com Fixes: ff7d6b27f894 ("page_pool: refurbish version of page_pool code") Suggested-by: Mina Almasry Reviewed-by: Mina Almasry Reviewed-by: Jesper Dangaard Brouer Tested-by: Jesper Dangaard Brouer Tested-by: Qiuling Ren Tested-by: Yuying Ma Tested-by: Yonglong Liu Acked-by: Jesper Dangaard Brouer Signed-off-by: Toke Høiland-Jørgensen Link: https://patch.msgid.link/20250409-page-pool-track-dma-v9-2-6a9ef2e0cba8@redhat.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- include/linux/mm.h | 46 ++++++++++++++++++-- include/linux/poison.h | 4 ++ include/net/page_pool/types.h | 6 +++ net/core/netmem_priv.h | 28 +++++++++++- net/core/page_pool.c | 81 +++++++++++++++++++++++++++++------ 5 files changed, 147 insertions(+), 18 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 412f5efe3ae79..059ca4767e148 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4243,13 +4243,51 @@ static inline void pgalloc_tag_copy(struct folio *new, struct folio *old) } #endif /* CONFIG_MEM_ALLOC_PROFILING */ +/* + * DMA mapping IDs for page_pool + * + * When DMA-mapping a page, page_pool allocates an ID (from an xarray) and + * stashes it in the upper bits of page->pp_magic. We always want to be able to + * unambiguously identify page pool pages (using page_pool_page_is_pp()). Non-PP + * pages can have arbitrary kernel pointers stored in the same field as pp_magic + * (since it overlaps with page->lru.next), so we must ensure that we cannot + * mistake a valid kernel pointer with any of the values we write into this + * field. + * + * On architectures that set POISON_POINTER_DELTA, this is already ensured, + * since this value becomes part of PP_SIGNATURE; meaning we can just use the + * space between the PP_SIGNATURE value (without POISON_POINTER_DELTA), and the + * lowest bits of POISON_POINTER_DELTA. On arches where POISON_POINTER_DELTA is + * 0, we make sure that we leave the two topmost bits empty, as that guarantees + * we won't mistake a valid kernel pointer for a value we set, regardless of the + * VMSPLIT setting. + * + * Altogether, this means that the number of bits available is constrained by + * the size of an unsigned long (at the upper end, subtracting two bits per the + * above), and the definition of PP_SIGNATURE (with or without + * POISON_POINTER_DELTA). + */ +#define PP_DMA_INDEX_SHIFT (1 + __fls(PP_SIGNATURE - POISON_POINTER_DELTA)) +#if POISON_POINTER_DELTA > 0 +/* PP_SIGNATURE includes POISON_POINTER_DELTA, so limit the size of the DMA + * index to not overlap with that if set + */ +#define PP_DMA_INDEX_BITS MIN(32, __ffs(POISON_POINTER_DELTA) - PP_DMA_INDEX_SHIFT) +#else +/* Always leave out the topmost two; see above. */ +#define PP_DMA_INDEX_BITS MIN(32, BITS_PER_LONG - PP_DMA_INDEX_SHIFT - 2) +#endif + +#define PP_DMA_INDEX_MASK GENMASK(PP_DMA_INDEX_BITS + PP_DMA_INDEX_SHIFT - 1, \ + PP_DMA_INDEX_SHIFT) + /* Mask used for checking in page_pool_page_is_pp() below. page->pp_magic is * OR'ed with PP_SIGNATURE after the allocation in order to preserve bit 0 for - * the head page of compound page and bit 1 for pfmemalloc page. - * page_is_pfmemalloc() is checked in __page_pool_put_page() to avoid recycling - * the pfmemalloc page. + * the head page of compound page and bit 1 for pfmemalloc page, as well as the + * bits used for the DMA index. page_is_pfmemalloc() is checked in + * __page_pool_put_page() to avoid recycling the pfmemalloc page. */ -#define PP_MAGIC_MASK ~0x3UL +#define PP_MAGIC_MASK ~(PP_DMA_INDEX_MASK | 0x3UL) #ifdef CONFIG_PAGE_POOL static inline bool page_pool_page_is_pp(struct page *page) diff --git a/include/linux/poison.h b/include/linux/poison.h index 331a9a996fa87..8ca2235f78d5d 100644 --- a/include/linux/poison.h +++ b/include/linux/poison.h @@ -70,6 +70,10 @@ #define KEY_DESTROY 0xbd /********** net/core/page_pool.c **********/ +/* + * page_pool uses additional free bits within this value to store data, see the + * definition of PP_DMA_INDEX_MASK in mm.h + */ #define PP_SIGNATURE (0x40 + POISON_POINTER_DELTA) /********** net/core/skbuff.c **********/ diff --git a/include/net/page_pool/types.h b/include/net/page_pool/types.h index c022c410abe39..f53e2c90b6866 100644 --- a/include/net/page_pool/types.h +++ b/include/net/page_pool/types.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #define PP_FLAG_DMA_MAP BIT(0) /* Should page_pool do the DMA @@ -33,6 +34,9 @@ #define PP_FLAG_ALL (PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV | \ PP_FLAG_SYSTEM_POOL | PP_FLAG_ALLOW_UNREADABLE_NETMEM) +/* Index limit to stay within PP_DMA_INDEX_BITS for DMA indices */ +#define PP_DMA_INDEX_LIMIT XA_LIMIT(1, BIT(PP_DMA_INDEX_BITS) - 1) + /* * Fast allocation side cache array/stack * @@ -216,6 +220,8 @@ struct page_pool { void *mp_priv; + struct xarray dma_mapped; + #ifdef CONFIG_PAGE_POOL_STATS /* recycle stats are per-cpu to avoid locking */ struct page_pool_recycle_stats __percpu *recycle_stats; diff --git a/net/core/netmem_priv.h b/net/core/netmem_priv.h index f33162fd281c2..cd95394399b40 100644 --- a/net/core/netmem_priv.h +++ b/net/core/netmem_priv.h @@ -5,7 +5,7 @@ static inline unsigned long netmem_get_pp_magic(netmem_ref netmem) { - return __netmem_clear_lsb(netmem)->pp_magic; + return __netmem_clear_lsb(netmem)->pp_magic & ~PP_DMA_INDEX_MASK; } static inline void netmem_or_pp_magic(netmem_ref netmem, unsigned long pp_magic) @@ -15,6 +15,8 @@ static inline void netmem_or_pp_magic(netmem_ref netmem, unsigned long pp_magic) static inline void netmem_clear_pp_magic(netmem_ref netmem) { + WARN_ON_ONCE(__netmem_clear_lsb(netmem)->pp_magic & PP_DMA_INDEX_MASK); + __netmem_clear_lsb(netmem)->pp_magic = 0; } @@ -33,4 +35,28 @@ static inline void netmem_set_dma_addr(netmem_ref netmem, { __netmem_clear_lsb(netmem)->dma_addr = dma_addr; } + +static inline unsigned long netmem_get_dma_index(netmem_ref netmem) +{ + unsigned long magic; + + if (WARN_ON_ONCE(netmem_is_net_iov(netmem))) + return 0; + + magic = __netmem_clear_lsb(netmem)->pp_magic; + + return (magic & PP_DMA_INDEX_MASK) >> PP_DMA_INDEX_SHIFT; +} + +static inline void netmem_set_dma_index(netmem_ref netmem, + unsigned long id) +{ + unsigned long magic; + + if (WARN_ON_ONCE(netmem_is_net_iov(netmem))) + return; + + magic = netmem_get_pp_magic(netmem) | (id << PP_DMA_INDEX_SHIFT); + __netmem_clear_lsb(netmem)->pp_magic = magic; +} #endif diff --git a/net/core/page_pool.c b/net/core/page_pool.c index c8ce069605c42..a49b7f3e25dd6 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -273,8 +273,7 @@ static int page_pool_init(struct page_pool *pool, /* Driver calling page_pool_create() also call page_pool_destroy() */ refcount_set(&pool->user_cnt, 1); - if (pool->dma_map) - get_device(pool->p.dev); + xa_init_flags(&pool->dma_mapped, XA_FLAGS_ALLOC1); if (pool->slow.flags & PP_FLAG_ALLOW_UNREADABLE_NETMEM) { /* We rely on rtnl_lock()ing to make sure netdev_rx_queue @@ -312,9 +311,7 @@ free_ptr_ring: static void page_pool_uninit(struct page_pool *pool) { ptr_ring_cleanup(&pool->ring, NULL); - - if (pool->dma_map) - put_device(pool->p.dev); + xa_destroy(&pool->dma_mapped); #ifdef CONFIG_PAGE_POOL_STATS if (!pool->system) @@ -455,13 +452,21 @@ page_pool_dma_sync_for_device(const struct page_pool *pool, netmem_ref netmem, u32 dma_sync_size) { - if (pool->dma_sync && dma_dev_need_sync(pool->p.dev)) - __page_pool_dma_sync_for_device(pool, netmem, dma_sync_size); + if (pool->dma_sync && dma_dev_need_sync(pool->p.dev)) { + rcu_read_lock(); + /* re-check under rcu_read_lock() to sync with page_pool_scrub() */ + if (pool->dma_sync) + __page_pool_dma_sync_for_device(pool, netmem, + dma_sync_size); + rcu_read_unlock(); + } } -static bool page_pool_dma_map(struct page_pool *pool, netmem_ref netmem) +static bool page_pool_dma_map(struct page_pool *pool, netmem_ref netmem, gfp_t gfp) { dma_addr_t dma; + int err; + u32 id; /* Setup DMA mapping: use 'struct page' area for storing DMA-addr * since dma_addr_t can be either 32 or 64 bits and does not always fit @@ -475,15 +480,30 @@ static bool page_pool_dma_map(struct page_pool *pool, netmem_ref netmem) if (dma_mapping_error(pool->p.dev, dma)) return false; - if (page_pool_set_dma_addr_netmem(netmem, dma)) + if (page_pool_set_dma_addr_netmem(netmem, dma)) { + WARN_ONCE(1, "unexpected DMA address, please report to netdev@"); goto unmap_failed; + } + + if (in_softirq()) + err = xa_alloc(&pool->dma_mapped, &id, netmem_to_page(netmem), + PP_DMA_INDEX_LIMIT, gfp); + else + err = xa_alloc_bh(&pool->dma_mapped, &id, netmem_to_page(netmem), + PP_DMA_INDEX_LIMIT, gfp); + if (err) { + WARN_ONCE(err != -ENOMEM, "couldn't track DMA mapping, please report to netdev@"); + goto unset_failed; + } + netmem_set_dma_index(netmem, id); page_pool_dma_sync_for_device(pool, netmem, pool->p.max_len); return true; +unset_failed: + page_pool_set_dma_addr_netmem(netmem, 0); unmap_failed: - WARN_ONCE(1, "unexpected DMA address, please report to netdev@"); dma_unmap_page_attrs(pool->p.dev, dma, PAGE_SIZE << pool->p.order, pool->p.dma_dir, DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_WEAK_ORDERING); @@ -500,7 +520,7 @@ static struct page *__page_pool_alloc_page_order(struct page_pool *pool, if (unlikely(!page)) return NULL; - if (pool->dma_map && unlikely(!page_pool_dma_map(pool, page_to_netmem(page)))) { + if (pool->dma_map && unlikely(!page_pool_dma_map(pool, page_to_netmem(page), gfp))) { put_page(page); return NULL; } @@ -547,7 +567,7 @@ static noinline netmem_ref __page_pool_alloc_pages_slow(struct page_pool *pool, */ for (i = 0; i < nr_pages; i++) { netmem = pool->alloc.cache[i]; - if (dma_map && unlikely(!page_pool_dma_map(pool, netmem))) { + if (dma_map && unlikely(!page_pool_dma_map(pool, netmem, gfp))) { put_page(netmem_to_page(netmem)); continue; } @@ -649,6 +669,8 @@ void page_pool_clear_pp_info(netmem_ref netmem) static __always_inline void __page_pool_release_page_dma(struct page_pool *pool, netmem_ref netmem) { + struct page *old, *page = netmem_to_page(netmem); + unsigned long id; dma_addr_t dma; if (!pool->dma_map) @@ -657,6 +679,17 @@ static __always_inline void __page_pool_release_page_dma(struct page_pool *pool, */ return; + id = netmem_get_dma_index(netmem); + if (!id) + return; + + if (in_softirq()) + old = xa_cmpxchg(&pool->dma_mapped, id, page, NULL, 0); + else + old = xa_cmpxchg_bh(&pool->dma_mapped, id, page, NULL, 0); + if (old != page) + return; + dma = page_pool_get_dma_addr_netmem(netmem); /* When page is unmapped, it cannot be returned to our pool */ @@ -664,6 +697,7 @@ static __always_inline void __page_pool_release_page_dma(struct page_pool *pool, PAGE_SIZE << pool->p.order, pool->p.dma_dir, DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_WEAK_ORDERING); page_pool_set_dma_addr_netmem(netmem, 0); + netmem_set_dma_index(netmem, 0); } /* Disconnects a page (from a page_pool). API users can have a need @@ -1038,8 +1072,29 @@ static void page_pool_empty_alloc_cache_once(struct page_pool *pool) static void page_pool_scrub(struct page_pool *pool) { + unsigned long id; + void *ptr; + page_pool_empty_alloc_cache_once(pool); - pool->destroy_cnt++; + if (!pool->destroy_cnt++ && pool->dma_map) { + if (pool->dma_sync) { + /* Disable page_pool_dma_sync_for_device() */ + pool->dma_sync = false; + + /* Make sure all concurrent returns that may see the old + * value of dma_sync (and thus perform a sync) have + * finished before doing the unmapping below. Skip the + * wait if the device doesn't actually need syncing, or + * if there are no outstanding mapped pages. + */ + if (dma_dev_need_sync(pool->p.dev) && + !xa_empty(&pool->dma_mapped)) + synchronize_net(); + } + + xa_for_each(&pool->dma_mapped, id, ptr) + __page_pool_release_page_dma(pool, page_to_netmem(ptr)); + } /* No more consumers should exist, but producers could still * be in-flight. -- GitLab From cf11bd435ff1370c6196ff6dbf56cc9aaf674416 Mon Sep 17 00:00:00 2001 From: Hari Kalavakunta Date: Wed, 9 Apr 2025 18:23:08 -0700 Subject: [PATCH 0827/2211] net: ncsi: Fix GCPS 64-bit member variables [ Upstream commit e8a1bd8344054ce27bebf59f48e3f6bc10bc419b ] Correct Get Controller Packet Statistics (GCPS) 64-bit wide member variables, as per DSP0222 v1.0.0 and forward specs. The Driver currently collects these stats, but they are yet to be exposed to the user. Therefore, no user impact. Statistics fixes: Total Bytes Received (byte range 28..35) Total Bytes Transmitted (byte range 36..43) Total Unicast Packets Received (byte range 44..51) Total Multicast Packets Received (byte range 52..59) Total Broadcast Packets Received (byte range 60..67) Total Unicast Packets Transmitted (byte range 68..75) Total Multicast Packets Transmitted (byte range 76..83) Total Broadcast Packets Transmitted (byte range 84..91) Valid Bytes Received (byte range 204..11) Signed-off-by: Hari Kalavakunta Reviewed-by: Paul Fertser Link: https://patch.msgid.link/20250410012309.1343-1-kalavakunta.hari.prasad@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/ncsi/internal.h | 21 ++++++++++----------- net/ncsi/ncsi-pkt.h | 23 +++++++++++------------ net/ncsi/ncsi-rsp.c | 21 ++++++++++----------- 3 files changed, 31 insertions(+), 34 deletions(-) diff --git a/net/ncsi/internal.h b/net/ncsi/internal.h index 4e0842df5234e..2c260f33b55cc 100644 --- a/net/ncsi/internal.h +++ b/net/ncsi/internal.h @@ -143,16 +143,15 @@ struct ncsi_channel_vlan_filter { }; struct ncsi_channel_stats { - u32 hnc_cnt_hi; /* Counter cleared */ - u32 hnc_cnt_lo; /* Counter cleared */ - u32 hnc_rx_bytes; /* Rx bytes */ - u32 hnc_tx_bytes; /* Tx bytes */ - u32 hnc_rx_uc_pkts; /* Rx UC packets */ - u32 hnc_rx_mc_pkts; /* Rx MC packets */ - u32 hnc_rx_bc_pkts; /* Rx BC packets */ - u32 hnc_tx_uc_pkts; /* Tx UC packets */ - u32 hnc_tx_mc_pkts; /* Tx MC packets */ - u32 hnc_tx_bc_pkts; /* Tx BC packets */ + u64 hnc_cnt; /* Counter cleared */ + u64 hnc_rx_bytes; /* Rx bytes */ + u64 hnc_tx_bytes; /* Tx bytes */ + u64 hnc_rx_uc_pkts; /* Rx UC packets */ + u64 hnc_rx_mc_pkts; /* Rx MC packets */ + u64 hnc_rx_bc_pkts; /* Rx BC packets */ + u64 hnc_tx_uc_pkts; /* Tx UC packets */ + u64 hnc_tx_mc_pkts; /* Tx MC packets */ + u64 hnc_tx_bc_pkts; /* Tx BC packets */ u32 hnc_fcs_err; /* FCS errors */ u32 hnc_align_err; /* Alignment errors */ u32 hnc_false_carrier; /* False carrier detection */ @@ -181,7 +180,7 @@ struct ncsi_channel_stats { u32 hnc_tx_1023_frames; /* Tx 512-1023 bytes frames */ u32 hnc_tx_1522_frames; /* Tx 1024-1522 bytes frames */ u32 hnc_tx_9022_frames; /* Tx 1523-9022 bytes frames */ - u32 hnc_rx_valid_bytes; /* Rx valid bytes */ + u64 hnc_rx_valid_bytes; /* Rx valid bytes */ u32 hnc_rx_runt_pkts; /* Rx error runt packets */ u32 hnc_rx_jabber_pkts; /* Rx error jabber packets */ u32 ncsi_rx_cmds; /* Rx NCSI commands */ diff --git a/net/ncsi/ncsi-pkt.h b/net/ncsi/ncsi-pkt.h index f2f3b5c1b9412..24edb27379724 100644 --- a/net/ncsi/ncsi-pkt.h +++ b/net/ncsi/ncsi-pkt.h @@ -252,16 +252,15 @@ struct ncsi_rsp_gp_pkt { /* Get Controller Packet Statistics */ struct ncsi_rsp_gcps_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ - __be32 cnt_hi; /* Counter cleared */ - __be32 cnt_lo; /* Counter cleared */ - __be32 rx_bytes; /* Rx bytes */ - __be32 tx_bytes; /* Tx bytes */ - __be32 rx_uc_pkts; /* Rx UC packets */ - __be32 rx_mc_pkts; /* Rx MC packets */ - __be32 rx_bc_pkts; /* Rx BC packets */ - __be32 tx_uc_pkts; /* Tx UC packets */ - __be32 tx_mc_pkts; /* Tx MC packets */ - __be32 tx_bc_pkts; /* Tx BC packets */ + __be64 cnt; /* Counter cleared */ + __be64 rx_bytes; /* Rx bytes */ + __be64 tx_bytes; /* Tx bytes */ + __be64 rx_uc_pkts; /* Rx UC packets */ + __be64 rx_mc_pkts; /* Rx MC packets */ + __be64 rx_bc_pkts; /* Rx BC packets */ + __be64 tx_uc_pkts; /* Tx UC packets */ + __be64 tx_mc_pkts; /* Tx MC packets */ + __be64 tx_bc_pkts; /* Tx BC packets */ __be32 fcs_err; /* FCS errors */ __be32 align_err; /* Alignment errors */ __be32 false_carrier; /* False carrier detection */ @@ -290,11 +289,11 @@ struct ncsi_rsp_gcps_pkt { __be32 tx_1023_frames; /* Tx 512-1023 bytes frames */ __be32 tx_1522_frames; /* Tx 1024-1522 bytes frames */ __be32 tx_9022_frames; /* Tx 1523-9022 bytes frames */ - __be32 rx_valid_bytes; /* Rx valid bytes */ + __be64 rx_valid_bytes; /* Rx valid bytes */ __be32 rx_runt_pkts; /* Rx error runt packets */ __be32 rx_jabber_pkts; /* Rx error jabber packets */ __be32 checksum; /* Checksum */ -}; +} __packed __aligned(4); /* Get NCSI Statistics */ struct ncsi_rsp_gns_pkt { diff --git a/net/ncsi/ncsi-rsp.c b/net/ncsi/ncsi-rsp.c index 4a8ce2949faea..8668888c5a2f9 100644 --- a/net/ncsi/ncsi-rsp.c +++ b/net/ncsi/ncsi-rsp.c @@ -926,16 +926,15 @@ static int ncsi_rsp_handler_gcps(struct ncsi_request *nr) /* Update HNC's statistics */ ncs = &nc->stats; - ncs->hnc_cnt_hi = ntohl(rsp->cnt_hi); - ncs->hnc_cnt_lo = ntohl(rsp->cnt_lo); - ncs->hnc_rx_bytes = ntohl(rsp->rx_bytes); - ncs->hnc_tx_bytes = ntohl(rsp->tx_bytes); - ncs->hnc_rx_uc_pkts = ntohl(rsp->rx_uc_pkts); - ncs->hnc_rx_mc_pkts = ntohl(rsp->rx_mc_pkts); - ncs->hnc_rx_bc_pkts = ntohl(rsp->rx_bc_pkts); - ncs->hnc_tx_uc_pkts = ntohl(rsp->tx_uc_pkts); - ncs->hnc_tx_mc_pkts = ntohl(rsp->tx_mc_pkts); - ncs->hnc_tx_bc_pkts = ntohl(rsp->tx_bc_pkts); + ncs->hnc_cnt = be64_to_cpu(rsp->cnt); + ncs->hnc_rx_bytes = be64_to_cpu(rsp->rx_bytes); + ncs->hnc_tx_bytes = be64_to_cpu(rsp->tx_bytes); + ncs->hnc_rx_uc_pkts = be64_to_cpu(rsp->rx_uc_pkts); + ncs->hnc_rx_mc_pkts = be64_to_cpu(rsp->rx_mc_pkts); + ncs->hnc_rx_bc_pkts = be64_to_cpu(rsp->rx_bc_pkts); + ncs->hnc_tx_uc_pkts = be64_to_cpu(rsp->tx_uc_pkts); + ncs->hnc_tx_mc_pkts = be64_to_cpu(rsp->tx_mc_pkts); + ncs->hnc_tx_bc_pkts = be64_to_cpu(rsp->tx_bc_pkts); ncs->hnc_fcs_err = ntohl(rsp->fcs_err); ncs->hnc_align_err = ntohl(rsp->align_err); ncs->hnc_false_carrier = ntohl(rsp->false_carrier); @@ -964,7 +963,7 @@ static int ncsi_rsp_handler_gcps(struct ncsi_request *nr) ncs->hnc_tx_1023_frames = ntohl(rsp->tx_1023_frames); ncs->hnc_tx_1522_frames = ntohl(rsp->tx_1522_frames); ncs->hnc_tx_9022_frames = ntohl(rsp->tx_9022_frames); - ncs->hnc_rx_valid_bytes = ntohl(rsp->rx_valid_bytes); + ncs->hnc_rx_valid_bytes = be64_to_cpu(rsp->rx_valid_bytes); ncs->hnc_rx_runt_pkts = ntohl(rsp->rx_runt_pkts); ncs->hnc_rx_jabber_pkts = ntohl(rsp->rx_jabber_pkts); -- GitLab From 9d57de88d940b23ddb93b7f6ae670fb3369455ae Mon Sep 17 00:00:00 2001 From: Viktor Malik Date: Tue, 15 Apr 2025 17:50:14 +0200 Subject: [PATCH 0828/2211] libbpf: Fix buffer overflow in bpf_object__init_prog [ Upstream commit ee684de5c1b0ac01821320826baec7da93f3615b ] As shown in [1], it is possible to corrupt a BPF ELF file such that arbitrary BPF instructions are loaded by libbpf. This can be done by setting a symbol (BPF program) section offset to a large (unsigned) number such that
overflows and points before the section data in the memory. Consider the situation below where: - prog_start = sec_start + symbol_offset <-- size_t overflow here - prog_end = prog_start + prog_size prog_start sec_start prog_end sec_end | | | | v v v v .....................|################################|............ The report in [1] also provides a corrupted BPF ELF which can be used as a reproducer: $ readelf -S crash Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align ... [ 2] uretprobe.mu[...] PROGBITS 0000000000000000 00000040 0000000000000068 0000000000000000 AX 0 0 8 $ readelf -s crash Symbol table '.symtab' contains 8 entries: Num: Value Size Type Bind Vis Ndx Name ... 6: ffffffffffffffb8 104 FUNC GLOBAL DEFAULT 2 handle_tp Here, the handle_tp prog has section offset ffffffffffffffb8, i.e. will point before the actual memory where section 2 is allocated. This is also reported by AddressSanitizer: ================================================================= ==1232==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x7c7302fe0000 at pc 0x7fc3046e4b77 bp 0x7ffe64677cd0 sp 0x7ffe64677490 READ of size 104 at 0x7c7302fe0000 thread T0 #0 0x7fc3046e4b76 in memcpy (/lib64/libasan.so.8+0xe4b76) #1 0x00000040df3e in bpf_object__init_prog /src/libbpf/src/libbpf.c:856 #2 0x00000040df3e in bpf_object__add_programs /src/libbpf/src/libbpf.c:928 #3 0x00000040df3e in bpf_object__elf_collect /src/libbpf/src/libbpf.c:3930 #4 0x00000040df3e in bpf_object_open /src/libbpf/src/libbpf.c:8067 #5 0x00000040f176 in bpf_object__open_file /src/libbpf/src/libbpf.c:8090 #6 0x000000400c16 in main /poc/poc.c:8 #7 0x7fc3043d25b4 in __libc_start_call_main (/lib64/libc.so.6+0x35b4) #8 0x7fc3043d2667 in __libc_start_main@@GLIBC_2.34 (/lib64/libc.so.6+0x3667) #9 0x000000400b34 in _start (/poc/poc+0x400b34) 0x7c7302fe0000 is located 64 bytes before 104-byte region [0x7c7302fe0040,0x7c7302fe00a8) allocated by thread T0 here: #0 0x7fc3046e716b in malloc (/lib64/libasan.so.8+0xe716b) #1 0x7fc3045ee600 in __libelf_set_rawdata_wrlock (/lib64/libelf.so.1+0xb600) #2 0x7fc3045ef018 in __elf_getdata_rdlock (/lib64/libelf.so.1+0xc018) #3 0x00000040642f in elf_sec_data /src/libbpf/src/libbpf.c:3740 The problem here is that currently, libbpf only checks that the program end is within the section bounds. There used to be a check `while (sec_off < sec_sz)` in bpf_object__add_programs, however, it was removed by commit 6245947c1b3c ("libbpf: Allow gaps in BPF program sections to support overriden weak functions"). Add a check for detecting the overflow of `sec_off + prog_sz` to bpf_object__init_prog to fix this issue. [1] https://github.com/lmarch2/poc/blob/main/libbpf/libbpf.md Fixes: 6245947c1b3c ("libbpf: Allow gaps in BPF program sections to support overriden weak functions") Reported-by: lmarch2 <2524158037@qq.com> Signed-off-by: Viktor Malik Signed-off-by: Andrii Nakryiko Reviewed-by: Shung-Hsi Yu Link: https://github.com/lmarch2/poc/blob/main/libbpf/libbpf.md Link: https://lore.kernel.org/bpf/20250415155014.397603-1-vmalik@redhat.com Signed-off-by: Sasha Levin --- tools/lib/bpf/libbpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 6e4d417604fa0..069ffe5da96e5 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -887,7 +887,7 @@ bpf_object__add_programs(struct bpf_object *obj, Elf_Data *sec_data, return -LIBBPF_ERRNO__FORMAT; } - if (sec_off + prog_sz > sec_sz) { + if (sec_off + prog_sz > sec_sz || sec_off + prog_sz < sec_off) { pr_warn("sec '%s': program at offset %zu crosses section boundary\n", sec_name, sec_off); return -LIBBPF_ERRNO__FORMAT; -- GitLab From 08784c73454c136b4ee59d4b22ba0952bae7e957 Mon Sep 17 00:00:00 2001 From: Cosmin Ratiu Date: Fri, 11 Apr 2025 10:49:53 +0300 Subject: [PATCH 0829/2211] net/mlx5: Avoid using xso.real_dev unnecessarily [ Upstream commit d79444e8c3d40b11f5e155e5591d53bd1e512e1f ] xso.real_dev is the active device of an offloaded xfrm state and is managed by bonding. As such, it's subject to change when states are migrated to a new device. Using it in places other than offloading/unoffloading the states is risky. This commit saves the device into the driver-specific struct mlx5e_ipsec_sa_entry and switches mlx5e_ipsec_init_macs() and mlx5e_ipsec_netevent_event() to make use of it. Additionally, mlx5e_xfrm_update_stats() used xso.real_dev to validate that correct net locks are held. But in a bonding config, the net of the master device is the same as the underlying devices, and the net is already a local var, so use that instead. The only remaining references to xso.real_dev are now in the .xdo_dev_state_add() / .xdo_dev_state_delete() path. Signed-off-by: Cosmin Ratiu Reviewed-by: Leon Romanovsky Reviewed-by: Nikolay Aleksandrov Signed-off-by: Steffen Klassert Signed-off-by: Sasha Levin --- .../ethernet/mellanox/mlx5/core/en_accel/ipsec.c | 16 +++++----------- .../ethernet/mellanox/mlx5/core/en_accel/ipsec.h | 1 + 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c index 1baf8933a07cb..94edfd7713b5d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c @@ -266,8 +266,7 @@ static void mlx5e_ipsec_init_macs(struct mlx5e_ipsec_sa_entry *sa_entry, struct mlx5_accel_esp_xfrm_attrs *attrs) { struct mlx5_core_dev *mdev = mlx5e_ipsec_sa2dev(sa_entry); - struct xfrm_state *x = sa_entry->x; - struct net_device *netdev; + struct net_device *netdev = sa_entry->dev; struct neighbour *n; u8 addr[ETH_ALEN]; const void *pkey; @@ -277,8 +276,6 @@ static void mlx5e_ipsec_init_macs(struct mlx5e_ipsec_sa_entry *sa_entry, attrs->type != XFRM_DEV_OFFLOAD_PACKET) return; - netdev = x->xso.real_dev; - mlx5_query_mac_address(mdev, addr); switch (attrs->dir) { case XFRM_DEV_OFFLOAD_IN: @@ -707,6 +704,7 @@ static int mlx5e_xfrm_add_state(struct xfrm_state *x, return -ENOMEM; sa_entry->x = x; + sa_entry->dev = netdev; sa_entry->ipsec = ipsec; /* Check if this SA is originated from acquire flow temporary SA */ if (x->xso.flags & XFRM_DEV_OFFLOAD_FLAG_ACQ) @@ -849,8 +847,6 @@ static int mlx5e_ipsec_netevent_event(struct notifier_block *nb, struct mlx5e_ipsec_sa_entry *sa_entry; struct mlx5e_ipsec *ipsec; struct neighbour *n = ptr; - struct net_device *netdev; - struct xfrm_state *x; unsigned long idx; if (event != NETEVENT_NEIGH_UPDATE || !(n->nud_state & NUD_VALID)) @@ -870,11 +866,9 @@ static int mlx5e_ipsec_netevent_event(struct notifier_block *nb, continue; } - x = sa_entry->x; - netdev = x->xso.real_dev; data = sa_entry->work->data; - neigh_ha_snapshot(data->addr, n, netdev); + neigh_ha_snapshot(data->addr, n, sa_entry->dev); queue_work(ipsec->wq, &sa_entry->work->work); } @@ -1005,8 +999,8 @@ static void mlx5e_xfrm_update_stats(struct xfrm_state *x) size_t headers; lockdep_assert(lockdep_is_held(&x->lock) || - lockdep_is_held(&dev_net(x->xso.real_dev)->xfrm.xfrm_cfg_mutex) || - lockdep_is_held(&dev_net(x->xso.real_dev)->xfrm.xfrm_state_lock)); + lockdep_is_held(&net->xfrm.xfrm_cfg_mutex) || + lockdep_is_held(&net->xfrm.xfrm_state_lock)); if (x->xso.flags & XFRM_DEV_OFFLOAD_FLAG_ACQ) return; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h index 7d943e93cf6dc..9aff779c77c89 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h @@ -260,6 +260,7 @@ struct mlx5e_ipsec_limits { struct mlx5e_ipsec_sa_entry { struct mlx5e_ipsec_esn_state esn_state; struct xfrm_state *x; + struct net_device *dev; struct mlx5e_ipsec *ipsec; struct mlx5_accel_esp_xfrm_attrs attrs; void (*set_iv_op)(struct sk_buff *skb, struct xfrm_state *x, -- GitLab From 5063fe878974cf3845037fcfa45675b36d1d5eb0 Mon Sep 17 00:00:00 2001 From: Cosmin Ratiu Date: Fri, 11 Apr 2025 10:49:54 +0300 Subject: [PATCH 0830/2211] xfrm: Use xdo.dev instead of xdo.real_dev [ Upstream commit 25ac138f58e7d5c8bffa31e8891418d2819180c4 ] The policy offload struct was reused from the state offload and real_dev was copied from dev, but it was never set to anything else. Simplify the code by always using xdo.dev for policies. Signed-off-by: Cosmin Ratiu Reviewed-by: Leon Romanovsky Reviewed-by: Nikolay Aleksandrov Signed-off-by: Steffen Klassert Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c | 2 +- net/xfrm/xfrm_device.c | 2 -- net/xfrm/xfrm_state.c | 2 -- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c index 94edfd7713b5d..39dcbf863421a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c @@ -1135,7 +1135,7 @@ mlx5e_ipsec_build_accel_pol_attrs(struct mlx5e_ipsec_pol_entry *pol_entry, static int mlx5e_xfrm_add_policy(struct xfrm_policy *x, struct netlink_ext_ack *extack) { - struct net_device *netdev = x->xdo.real_dev; + struct net_device *netdev = x->xdo.dev; struct mlx5e_ipsec_pol_entry *pol_entry; struct mlx5e_priv *priv; int err; diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c index b33c4591e09a4..32ad8f3fc81e8 100644 --- a/net/xfrm/xfrm_device.c +++ b/net/xfrm/xfrm_device.c @@ -373,7 +373,6 @@ int xfrm_dev_policy_add(struct net *net, struct xfrm_policy *xp, xdo->dev = dev; netdev_tracker_alloc(dev, &xdo->dev_tracker, GFP_ATOMIC); - xdo->real_dev = dev; xdo->type = XFRM_DEV_OFFLOAD_PACKET; switch (dir) { case XFRM_POLICY_IN: @@ -395,7 +394,6 @@ int xfrm_dev_policy_add(struct net *net, struct xfrm_policy *xp, err = dev->xfrmdev_ops->xdo_dev_policy_add(xp, extack); if (err) { xdo->dev = NULL; - xdo->real_dev = NULL; xdo->type = XFRM_DEV_OFFLOAD_UNSPECIFIED; xdo->dir = 0; netdev_put(dev, &xdo->dev_tracker); diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index abd725386cb60..7a298058fc16c 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -1487,7 +1487,6 @@ found: xso->type = XFRM_DEV_OFFLOAD_PACKET; xso->dir = xdo->dir; xso->dev = xdo->dev; - xso->real_dev = xdo->real_dev; xso->flags = XFRM_DEV_OFFLOAD_FLAG_ACQ; netdev_hold(xso->dev, &xso->dev_tracker, GFP_ATOMIC); error = xso->dev->xfrmdev_ops->xdo_dev_state_add(x, NULL); @@ -1495,7 +1494,6 @@ found: xso->dir = 0; netdev_put(xso->dev, &xso->dev_tracker); xso->dev = NULL; - xso->real_dev = NULL; xso->type = XFRM_DEV_OFFLOAD_UNSPECIFIED; x->km.state = XFRM_STATE_DEAD; to_put = x; -- GitLab From 308ba450ea57687aa74a196700eb006c3519c7f0 Mon Sep 17 00:00:00 2001 From: Zhen XIN Date: Thu, 10 Apr 2025 15:42:17 +0000 Subject: [PATCH 0831/2211] wifi: rtw88: sdio: map mgmt frames to queue TX_DESC_QSEL_MGMT [ Upstream commit b2effcdc237979dcc533d446a792fc54fd0e1213 ] The rtw88-sdio do not work in AP mode due to the lack of TX status report for management frames. Map the management frames to queue TX_DESC_QSEL_MGMT, which enables the chip to generate TX reports for these frames Tested-on: rtl8723ds Fixes: 65371a3f14e7 ("wifi: rtw88: sdio: Add HCI implementation for SDIO based chipsets") Signed-off-by: Zhen XIN Reviewed-by: Martin Blumenstingl Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250410154217.1849977-3-zhen.xin@nokia-sbell.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw88/sdio.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c index 1d62b38526c48..0316a0bec96e2 100644 --- a/drivers/net/wireless/realtek/rtw88/sdio.c +++ b/drivers/net/wireless/realtek/rtw88/sdio.c @@ -718,10 +718,7 @@ static u8 rtw_sdio_get_tx_qsel(struct rtw_dev *rtwdev, struct sk_buff *skb, case RTW_TX_QUEUE_H2C: return TX_DESC_QSEL_H2C; case RTW_TX_QUEUE_MGMT: - if (rtw_chip_wcpu_11n(rtwdev)) - return TX_DESC_QSEL_HIGH; - else - return TX_DESC_QSEL_MGMT; + return TX_DESC_QSEL_MGMT; case RTW_TX_QUEUE_HI0: return TX_DESC_QSEL_HIGH; default: -- GitLab From c5b738a1d9939add120fddcd3200372e7c7a8ead Mon Sep 17 00:00:00 2001 From: Zhen XIN Date: Thu, 10 Apr 2025 15:42:16 +0000 Subject: [PATCH 0832/2211] wifi: rtw88: sdio: call rtw_sdio_indicate_tx_status unconditionally [ Upstream commit fc5f5a0ec463ae6a07850428bd3082947e01d276 ] The rtw88-sdio do not work in AP mode due to the lack of TX status report for management frames. Make the invocation of rtw_sdio_indicate_tx_status unconditional and cover all packet queues Tested-on: rtl8723ds Fixes: 65371a3f14e7 ("wifi: rtw88: sdio: Add HCI implementation for SDIO based chipsets") Signed-off-by: Zhen XIN Reviewed-by: Martin Blumenstingl Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250410154217.1849977-2-zhen.xin@nokia-sbell.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw88/sdio.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c index 0316a0bec96e2..5b8e88c9759d1 100644 --- a/drivers/net/wireless/realtek/rtw88/sdio.c +++ b/drivers/net/wireless/realtek/rtw88/sdio.c @@ -1225,10 +1225,7 @@ static void rtw_sdio_process_tx_queue(struct rtw_dev *rtwdev, return; } - if (queue <= RTW_TX_QUEUE_VO) - rtw_sdio_indicate_tx_status(rtwdev, skb); - else - dev_kfree_skb_any(skb); + rtw_sdio_indicate_tx_status(rtwdev, skb); } static void rtw_sdio_tx_handler(struct work_struct *work) -- GitLab From bba24336b9df844b9e9acf9c292f69d2ce2aca15 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Tue, 15 Apr 2025 12:07:20 +0300 Subject: [PATCH 0833/2211] wifi: rtw88: do not ignore hardware read error during DPK [ Upstream commit 20d3c19bd8f9b498173c198eadf54580c8caa336 ] In 'rtw8822c_dpk_cal_coef1()', do not ignore error returned by 'check_hw_ready()' but issue a warning to denote possible DPK issue. Compile tested only. Found by Linux Verification Center (linuxtesting.org) with SVACE. Fixes: 5227c2ee453d ("rtw88: 8822c: add SW DPK support") Suggested-by: Ping-Ke Shih Signed-off-by: Dmitry Antipov Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250415090720.194048-1-dmantipov@yandex.ru Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw88/rtw8822c.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c index 1dbe1cdbc3fd4..3157cd834233d 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c @@ -3993,7 +3993,8 @@ static void rtw8822c_dpk_cal_coef1(struct rtw_dev *rtwdev) rtw_write32(rtwdev, REG_NCTL0, 0x00001148); rtw_write32(rtwdev, REG_NCTL0, 0x00001149); - check_hw_ready(rtwdev, 0x2d9c, MASKBYTE0, 0x55); + if (!check_hw_ready(rtwdev, 0x2d9c, MASKBYTE0, 0x55)) + rtw_warn(rtwdev, "DPK stuck, performance may be suboptimal"); rtw_write8(rtwdev, 0x1b10, 0x0); rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x0000000c); -- GitLab From 371b340affa52f280f6eadfd25fbd43f09f0d5c0 Mon Sep 17 00:00:00 2001 From: Sarika Sharma Date: Tue, 8 Apr 2025 10:23:27 +0530 Subject: [PATCH 0834/2211] wifi: ath12k: fix invalid access to memory [ Upstream commit 9f17747fbda6fca934854463873c4abf8061491d ] In ath12k_dp_rx_msdu_coalesce(), rxcb is fetched from skb and boolean is_continuation is part of rxcb. Currently, after freeing the skb, the rxcb->is_continuation accessed again which is wrong since the memory is already freed. This might lead use-after-free error. Hence, fix by locally defining bool is_continuation from rxcb, so that after freeing skb, is_continuation can be used. Compile tested only. Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices") Signed-off-by: Sarika Sharma Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250408045327.1632222-1-quic_sarishar@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/dp_rx.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c index 5fcf3a465eda8..9c730b7009fe5 100644 --- a/drivers/net/wireless/ath/ath12k/dp_rx.c +++ b/drivers/net/wireless/ath/ath12k/dp_rx.c @@ -1762,6 +1762,7 @@ static int ath12k_dp_rx_msdu_coalesce(struct ath12k *ar, struct hal_rx_desc *ldesc; int space_extra, rem_len, buf_len; u32 hal_rx_desc_sz = ar->ab->hal.hal_desc_sz; + bool is_continuation; /* As the msdu is spread across multiple rx buffers, * find the offset to the start of msdu for computing @@ -1810,7 +1811,8 @@ static int ath12k_dp_rx_msdu_coalesce(struct ath12k *ar, rem_len = msdu_len - buf_first_len; while ((skb = __skb_dequeue(msdu_list)) != NULL && rem_len > 0) { rxcb = ATH12K_SKB_RXCB(skb); - if (rxcb->is_continuation) + is_continuation = rxcb->is_continuation; + if (is_continuation) buf_len = DP_RX_BUFFER_SIZE - hal_rx_desc_sz; else buf_len = rem_len; @@ -1828,7 +1830,7 @@ static int ath12k_dp_rx_msdu_coalesce(struct ath12k *ar, dev_kfree_skb_any(skb); rem_len -= buf_len; - if (!rxcb->is_continuation) + if (!is_continuation) break; } -- GitLab From 0c2de959f168ddb70f58f9319f91e26694f14e0a Mon Sep 17 00:00:00 2001 From: P Praneesh Date: Wed, 16 Apr 2025 07:49:03 +0530 Subject: [PATCH 0835/2211] wifi: ath12k: Add MSDU length validation for TKIP MIC error [ Upstream commit 763216fe6c5df95d122c71ef34c342427c987820 ] In the WBM error path, while processing TKIP MIC errors, MSDU length is fetched from the hal_rx_desc's msdu_end. This MSDU length is directly passed to skb_put() without validation. In stress test scenarios, the WBM error ring may receive invalid descriptors, which could lead to an invalid MSDU length. To fix this, add a check to drop the skb when the calculated MSDU length is greater than the skb size. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices") Signed-off-by: P Praneesh Signed-off-by: Nithyanantham Paramasivam Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250416021903.3178962-1-nithyanantham.paramasivam@oss.qualcomm.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/dp_rx.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c index 9c730b7009fe5..c2652bc8a02fd 100644 --- a/drivers/net/wireless/ath/ath12k/dp_rx.c +++ b/drivers/net/wireless/ath/ath12k/dp_rx.c @@ -3686,6 +3686,15 @@ static bool ath12k_dp_rx_h_tkip_mic_err(struct ath12k *ar, struct sk_buff *msdu, l3pad_bytes = ath12k_dp_rx_h_l3pad(ab, desc); msdu_len = ath12k_dp_rx_h_msdu_len(ab, desc); + + if ((hal_rx_desc_sz + l3pad_bytes + msdu_len) > DP_RX_BUFFER_SIZE) { + ath12k_dbg(ab, ATH12K_DBG_DATA, + "invalid msdu len in tkip mic err %u\n", msdu_len); + ath12k_dbg_dump(ab, ATH12K_DBG_DATA, NULL, "", desc, + sizeof(*desc)); + return true; + } + skb_put(msdu, hal_rx_desc_sz + l3pad_bytes + msdu_len); skb_pull(msdu, hal_rx_desc_sz + l3pad_bytes); -- GitLab From 6a6307f8661dbea77a3deff378c64de73de0f96e Mon Sep 17 00:00:00 2001 From: Ramasamy Kaliappan Date: Wed, 16 Apr 2025 00:11:02 +0530 Subject: [PATCH 0836/2211] wifi: ath12k: Fix the QoS control field offset to build QoS header [ Upstream commit 8599d4cc4191c8c1af34207a8b9414acca4afb59 ] Currently, in the mac80211 layer, received EAPOL packets are dropped when the HT control field is present in the QoS header. This issue arises due to an incorrect QoS control field offset used to build the QoS header in the MSDU data, leading to a corrupted header in the mac80211 layer. This issue also applies to other frames that contain the QoS control field, such as QoS data or Null frames. To resolve this, use ieee80211_get_qos_ctl() to obtain the correct QoS control offset from the MSDU data. Additionally, ensure the QoS control header is copied in little-endian format within the MSDU data. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices") Signed-off-by: Ramasamy Kaliappan Signed-off-by: Nithyanantham Paramasivam Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250415184102.2707300-1-nithyanantham.paramasivam@oss.qualcomm.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/dp_rx.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c index c2652bc8a02fd..1623298ba2c47 100644 --- a/drivers/net/wireless/ath/ath12k/dp_rx.c +++ b/drivers/net/wireless/ath/ath12k/dp_rx.c @@ -2064,7 +2064,7 @@ static void ath12k_get_dot11_hdr_from_rx_desc(struct ath12k *ar, struct ath12k_base *ab = ar->ab; size_t hdr_len, crypto_len; struct ieee80211_hdr hdr; - u16 qos_ctl; + __le16 qos_ctl; u8 *crypto_hdr, mesh_ctrl; ath12k_dp_rx_desc_get_dot11_hdr(ab, rx_desc, &hdr); @@ -2085,13 +2085,13 @@ static void ath12k_get_dot11_hdr_from_rx_desc(struct ath12k *ar, /* Add QOS header */ if (ieee80211_is_data_qos(hdr.frame_control)) { - qos_ctl = rxcb->tid; + struct ieee80211_hdr *qos_ptr = (struct ieee80211_hdr *)msdu->data; + + qos_ctl = cpu_to_le16(rxcb->tid & IEEE80211_QOS_CTL_TID_MASK); if (mesh_ctrl) - qos_ctl |= IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT; + qos_ctl |= cpu_to_le16(IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT); - /* TODO: Add other QoS ctl fields when required */ - memcpy(msdu->data + (hdr_len - IEEE80211_QOS_CTL_LEN), - &qos_ctl, IEEE80211_QOS_CTL_LEN); + memcpy(ieee80211_get_qos_ctl(qos_ptr), &qos_ctl, IEEE80211_QOS_CTL_LEN); } } -- GitLab From 6285516170f9e2f04b9dbf1e5100e0d7cbac22b4 Mon Sep 17 00:00:00 2001 From: Maharaja Kennadyrajan Date: Wed, 16 Apr 2025 07:47:24 +0530 Subject: [PATCH 0837/2211] wifi: ath12k: fix node corruption in ar->arvifs list [ Upstream commit 823435bd23108d6f8be89ea2d025c0e2e3769c51 ] In current WLAN recovery code flow, ath12k_core_halt() only reinitializes the "arvifs" list head. This will cause the list node immediately following the list head to become an invalid list node. Because the prev of that node still points to the list head "arvifs", but the next of the list head "arvifs" no longer points to that list node. When a WLAN recovery occurs during the execution of a vif removal, and it happens before the spin_lock_bh(&ar->data_lock) in ath12k_mac_vdev_delete(), list_del() will detect the previously mentioned situation, thereby triggering a kernel panic. The fix is to remove and reinitialize all vif list nodes from the list head "arvifs" during WLAN halt. The reinitialization is to make the list nodes valid, ensuring that the list_del() in ath12k_mac_vdev_delete() can execute normally. Call trace: __list_del_entry_valid_or_report+0xd4/0x100 (P) ath12k_mac_remove_link_interface.isra.0+0xf8/0x2e4 [ath12k] ath12k_scan_vdev_clean_work+0x40/0x164 [ath12k] cfg80211_wiphy_work+0xfc/0x100 process_one_work+0x164/0x2d0 worker_thread+0x254/0x380 kthread+0xfc/0x100 ret_from_fork+0x10/0x20 The change is mostly copied from the ath11k patch: https://lore.kernel.org/all/20250320053145.3445187-1-quic_stonez@quicinc.com/ Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices") Signed-off-by: Maharaja Kennadyrajan Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250416021724.2162519-1-maharaja.kennadyrajan@oss.qualcomm.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/core.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath12k/core.c b/drivers/net/wireless/ath/ath12k/core.c index 8bb8ee98188bf..c3c76e2680629 100644 --- a/drivers/net/wireless/ath/ath12k/core.c +++ b/drivers/net/wireless/ath/ath12k/core.c @@ -1004,6 +1004,7 @@ static void ath12k_rfkill_work(struct work_struct *work) void ath12k_core_halt(struct ath12k *ar) { + struct list_head *pos, *n; struct ath12k_base *ab = ar->ab; lockdep_assert_held(&ar->conf_mutex); @@ -1019,7 +1020,12 @@ void ath12k_core_halt(struct ath12k *ar) rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], NULL); synchronize_rcu(); - INIT_LIST_HEAD(&ar->arvifs); + + spin_lock_bh(&ar->data_lock); + list_for_each_safe(pos, n, &ar->arvifs) + list_del_init(pos); + spin_unlock_bh(&ar->data_lock); + idr_init(&ar->txmgmt_idr); } -- GitLab From 0e7792a3001d0091b2e0147788db6132abc6309b Mon Sep 17 00:00:00 2001 From: Junxian Huang Date: Mon, 21 Apr 2025 21:27:49 +0800 Subject: [PATCH 0838/2211] RDMA/hns: Include hnae3.h in hns_roce_hw_v2.h [ Upstream commit 2b11d33de23262cb20d1dcb24b586dbb8f54d463 ] hns_roce_hw_v2.h has a direct dependency on hnae3.h due to the inline function hns_roce_write64(), but it doesn't include this header currently. This leads to that files including hns_roce_hw_v2.h must also include hnae3.h to avoid compilation errors, even if they themselves don't really rely on hnae3.h. This doesn't make sense, hns_roce_hw_v2.h should include hnae3.h directly. Fixes: d3743fa94ccd ("RDMA/hns: Fix the chip hanging caused by sending doorbell during reset") Signed-off-by: Junxian Huang Link: https://patch.msgid.link/20250421132750.1363348-6-huangjunxian6@hisilicon.com Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/infiniband/hw/hns/hns_roce_ah.c | 1 - drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 1 - drivers/infiniband/hw/hns/hns_roce_hw_v2.h | 1 + drivers/infiniband/hw/hns/hns_roce_main.c | 1 - drivers/infiniband/hw/hns/hns_roce_restrack.c | 1 - 5 files changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/infiniband/hw/hns/hns_roce_ah.c b/drivers/infiniband/hw/hns/hns_roce_ah.c index 4fc5b9d5fea87..307c35888b300 100644 --- a/drivers/infiniband/hw/hns/hns_roce_ah.c +++ b/drivers/infiniband/hw/hns/hns_roce_ah.c @@ -33,7 +33,6 @@ #include #include #include -#include "hnae3.h" #include "hns_roce_device.h" #include "hns_roce_hw_v2.h" diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c index f5c3e560df58d..985b9d7d69f20 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c @@ -43,7 +43,6 @@ #include #include -#include "hnae3.h" #include "hns_roce_common.h" #include "hns_roce_device.h" #include "hns_roce_cmd.h" diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h index 91a5665465ffb..bc7466830eaf9 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h @@ -34,6 +34,7 @@ #define _HNS_ROCE_HW_V2_H #include +#include "hnae3.h" #define HNS_ROCE_V2_MAX_RC_INL_INN_SZ 32 #define HNS_ROCE_V2_MTT_ENTRY_SZ 64 diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband/hw/hns/hns_roce_main.c index 8d0b63d4b50a6..e7a497cc125cc 100644 --- a/drivers/infiniband/hw/hns/hns_roce_main.c +++ b/drivers/infiniband/hw/hns/hns_roce_main.c @@ -37,7 +37,6 @@ #include #include #include -#include "hnae3.h" #include "hns_roce_common.h" #include "hns_roce_device.h" #include "hns_roce_hem.h" diff --git a/drivers/infiniband/hw/hns/hns_roce_restrack.c b/drivers/infiniband/hw/hns/hns_roce_restrack.c index 356d988169497..f637b73b946e4 100644 --- a/drivers/infiniband/hw/hns/hns_roce_restrack.c +++ b/drivers/infiniband/hw/hns/hns_roce_restrack.c @@ -4,7 +4,6 @@ #include #include #include -#include "hnae3.h" #include "hns_roce_common.h" #include "hns_roce_device.h" #include "hns_roce_hw_v2.h" -- GitLab From 034c1796f176b813aa180b313284669d98defc39 Mon Sep 17 00:00:00 2001 From: Yihang Li Date: Mon, 14 Apr 2025 16:08:44 +0800 Subject: [PATCH 0839/2211] scsi: hisi_sas: Call I_T_nexus after soft reset for SATA disk [ Upstream commit e4d953ca557e02edd3aed7390043e1b8ad1c9723 ] In commit 21c7e972475e ("scsi: hisi_sas: Disable SATA disk phy for severe I_T nexus reset failure"), if the softreset fails upon certain conditions, the PHY connected to the disk is disabled directly. Manual recovery is required, which is inconvenient for users in actual use. In addition, SATA disks do not support simultaneous connection of multiple hosts. Therefore, when multiple controllers are connected to a SATA disk at the same time, the controller which is connected later failed to issue an ATA softreset to the SATA disk. As a result, the PHY associated with the disk is disabled and cannot be automatically recovered. Now that, we will not focus on the execution result of softreset. No matter whether the execution is successful or not, we will directly carry out I_T_nexus_reset. Fixes: 21c7e972475e ("scsi: hisi_sas: Disable SATA disk phy for severe I_T nexus reset failure") Signed-off-by: Yihang Li Link: https://lore.kernel.org/r/20250414080845.1220997-4-liyihang9@huawei.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/hisi_sas/hisi_sas_main.c | 29 +++++---------------------- 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c index e98e6b2b9f570..d9500b7306905 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -1850,33 +1850,14 @@ static int hisi_sas_I_T_nexus_reset(struct domain_device *device) } hisi_sas_dereg_device(hisi_hba, device); - rc = hisi_sas_debug_I_T_nexus_reset(device); - if (rc == TMF_RESP_FUNC_COMPLETE && dev_is_sata(device)) { - struct sas_phy *local_phy; - + if (dev_is_sata(device)) { rc = hisi_sas_softreset_ata_disk(device); - switch (rc) { - case -ECOMM: - rc = -ENODEV; - break; - case TMF_RESP_FUNC_FAILED: - case -EMSGSIZE: - case -EIO: - local_phy = sas_get_local_phy(device); - rc = sas_phy_enable(local_phy, 0); - if (!rc) { - local_phy->enabled = 0; - dev_err(dev, "Disabled local phy of ATA disk %016llx due to softreset fail (%d)\n", - SAS_ADDR(device->sas_addr), rc); - rc = -ENODEV; - } - sas_put_local_phy(local_phy); - break; - default: - break; - } + if (rc == TMF_RESP_FUNC_FAILED) + dev_err(dev, "ata disk %016llx reset (%d)\n", + SAS_ADDR(device->sas_addr), rc); } + rc = hisi_sas_debug_I_T_nexus_reset(device); if ((rc == TMF_RESP_FUNC_COMPLETE) || (rc == -ENODEV)) hisi_sas_release_task(hisi_hba, device); -- GitLab From 3587bee963f7a92fc2dbce52f7fd4395d8b8934f Mon Sep 17 00:00:00 2001 From: Feng Yang Date: Thu, 17 Apr 2025 09:48:46 +0800 Subject: [PATCH 0840/2211] libbpf: Fix event name too long error [ Upstream commit 4dde20b1aa85d69c4281eaac9a7cfa7d2b62ecf0 ] When the binary path is excessively long, the generated probe_name in libbpf exceeds the kernel's MAX_EVENT_NAME_LEN limit (64 bytes). This causes legacy uprobe event attachment to fail with error code -22. The fix reorders the fields to place the unique ID before the name. This ensures that even if truncation occurs via snprintf, the unique ID remains intact, preserving event name uniqueness. Additionally, explicit checks with MAX_EVENT_NAME_LEN are added to enforce length constraints. Before Fix: ./test_progs -t attach_probe/kprobe-long_name ...... libbpf: failed to add legacy kprobe event for 'bpf_testmod_looooooooooooooooooooooooooooooong_name+0x0': -EINVAL libbpf: prog 'handle_kprobe': failed to create kprobe 'bpf_testmod_looooooooooooooooooooooooooooooong_name+0x0' perf event: -EINVAL test_attach_kprobe_long_event_name:FAIL:attach_kprobe_long_event_name unexpected error: -22 test_attach_probe:PASS:uprobe_ref_ctr_cleanup 0 nsec #13/11 attach_probe/kprobe-long_name:FAIL #13 attach_probe:FAIL ./test_progs -t attach_probe/uprobe-long_name ...... libbpf: failed to add legacy uprobe event for /root/linux-bpf/bpf-next/tools/testing/selftests/bpf/test_progs:0x13efd9: -EINVAL libbpf: prog 'handle_uprobe': failed to create uprobe '/root/linux-bpf/bpf-next/tools/testing/selftests/bpf/test_progs:0x13efd9' perf event: -EINVAL test_attach_uprobe_long_event_name:FAIL:attach_uprobe_long_event_name unexpected error: -22 #13/10 attach_probe/uprobe-long_name:FAIL #13 attach_probe:FAIL After Fix: ./test_progs -t attach_probe/uprobe-long_name #13/10 attach_probe/uprobe-long_name:OK #13 attach_probe:OK Summary: 1/1 PASSED, 0 SKIPPED, 0 FAILED ./test_progs -t attach_probe/kprobe-long_name #13/11 attach_probe/kprobe-long_name:OK #13 attach_probe:OK Summary: 1/1 PASSED, 0 SKIPPED, 0 FAILED Fixes: 46ed5fc33db9 ("libbpf: Refactor and simplify legacy kprobe code") Fixes: cc10623c6810 ("libbpf: Add legacy uprobe attaching support") Signed-off-by: Hengqi Chen Signed-off-by: Feng Yang Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250417014848.59321-2-yangfeng59949@163.com Signed-off-by: Sasha Levin --- tools/lib/bpf/libbpf.c | 43 ++++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 069ffe5da96e5..976fabd5d4dbc 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -60,6 +60,8 @@ #define BPF_FS_MAGIC 0xcafe4a11 #endif +#define MAX_EVENT_NAME_LEN 64 + #define BPF_FS_DEFAULT_PATH "/sys/fs/bpf" #define BPF_INSN_SZ (sizeof(struct bpf_insn)) @@ -11039,16 +11041,16 @@ static const char *tracefs_available_filter_functions_addrs(void) : TRACEFS"/available_filter_functions_addrs"; } -static void gen_kprobe_legacy_event_name(char *buf, size_t buf_sz, - const char *kfunc_name, size_t offset) +static void gen_probe_legacy_event_name(char *buf, size_t buf_sz, + const char *name, size_t offset) { static int index = 0; int i; - snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx_%d", getpid(), kfunc_name, offset, - __sync_fetch_and_add(&index, 1)); + snprintf(buf, buf_sz, "libbpf_%u_%d_%s_0x%zx", getpid(), + __sync_fetch_and_add(&index, 1), name, offset); - /* sanitize binary_path in the probe name */ + /* sanitize name in the probe name */ for (i = 0; buf[i]; i++) { if (!isalnum(buf[i])) buf[i] = '_'; @@ -11174,9 +11176,9 @@ int probe_kern_syscall_wrapper(int token_fd) return pfd >= 0 ? 1 : 0; } else { /* legacy mode */ - char probe_name[128]; + char probe_name[MAX_EVENT_NAME_LEN]; - gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name), syscall_name, 0); + gen_probe_legacy_event_name(probe_name, sizeof(probe_name), syscall_name, 0); if (add_kprobe_event_legacy(probe_name, false, syscall_name, 0) < 0) return 0; @@ -11233,10 +11235,10 @@ bpf_program__attach_kprobe_opts(const struct bpf_program *prog, func_name, offset, -1 /* pid */, 0 /* ref_ctr_off */); } else { - char probe_name[256]; + char probe_name[MAX_EVENT_NAME_LEN]; - gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name), - func_name, offset); + gen_probe_legacy_event_name(probe_name, sizeof(probe_name), + func_name, offset); legacy_probe = strdup(probe_name); if (!legacy_probe) @@ -11744,20 +11746,6 @@ static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, stru return ret; } -static void gen_uprobe_legacy_event_name(char *buf, size_t buf_sz, - const char *binary_path, uint64_t offset) -{ - int i; - - snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx", getpid(), binary_path, (size_t)offset); - - /* sanitize binary_path in the probe name */ - for (i = 0; buf[i]; i++) { - if (!isalnum(buf[i])) - buf[i] = '_'; - } -} - static inline int add_uprobe_event_legacy(const char *probe_name, bool retprobe, const char *binary_path, size_t offset) { @@ -12173,13 +12161,14 @@ bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid, pfd = perf_event_open_probe(true /* uprobe */, retprobe, binary_path, func_offset, pid, ref_ctr_off); } else { - char probe_name[PATH_MAX + 64]; + char probe_name[MAX_EVENT_NAME_LEN]; if (ref_ctr_off) return libbpf_err_ptr(-EINVAL); - gen_uprobe_legacy_event_name(probe_name, sizeof(probe_name), - binary_path, func_offset); + gen_probe_legacy_event_name(probe_name, sizeof(probe_name), + strrchr(binary_path, '/') ? : binary_path, + func_offset); legacy_probe = strdup(probe_name); if (!legacy_probe) -- GitLab From 30d80c636ec07cb595e190e51a7a9de113ae2b2d Mon Sep 17 00:00:00 2001 From: Tao Chen Date: Thu, 24 Apr 2025 00:39:01 +0800 Subject: [PATCH 0841/2211] libbpf: Remove sample_period init in perf_buffer [ Upstream commit 64821d25f05ac468d435e61669ae745ce5a633ea ] It seems that sample_period is not used in perf buffer. Actually, only wakeup_events are meaningful to enable events aggregation for wakeup notification. Remove sample_period setting code to avoid confusion. Fixes: fb84b8224655 ("libbpf: add perf buffer API") Signed-off-by: Tao Chen Signed-off-by: Andrii Nakryiko Acked-by: Jiri Olsa Acked-by: Namhyung Kim Link: https://lore.kernel.org/bpf/20250423163901.2983689-1-chen.dylane@linux.dev Signed-off-by: Sasha Levin --- tools/lib/bpf/libbpf.c | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 976fabd5d4dbc..c6eceae4d6ff6 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -13245,7 +13245,6 @@ struct perf_buffer *perf_buffer__new(int map_fd, size_t page_cnt, attr.config = PERF_COUNT_SW_BPF_OUTPUT; attr.type = PERF_TYPE_SOFTWARE; attr.sample_type = PERF_SAMPLE_RAW; - attr.sample_period = sample_period; attr.wakeup_events = sample_period; p.attr = &attr; -- GitLab From cc26bc26bebb133d951882ea7260a2d03d157572 Mon Sep 17 00:00:00 2001 From: Jonathan Wiepert Date: Thu, 24 Apr 2025 18:14:57 -0400 Subject: [PATCH 0842/2211] Use thread-safe function pointer in libbpf_print [ Upstream commit 91dbac4076537b464639953c055c460d2bdfc7ea ] This patch fixes a thread safety bug where libbpf_print uses the global variable storing the print function pointer rather than the local variable that had the print function set via __atomic_load_n. Fixes: f1cb927cdb62 ("libbpf: Ensure print callback usage is thread-safe") Signed-off-by: Jonathan Wiepert Signed-off-by: Andrii Nakryiko Acked-by: Mykyta Yatsenko Link: https://lore.kernel.org/bpf/20250424221457.793068-1-jonathan.wiepert@gmail.com Signed-off-by: Sasha Levin --- tools/lib/bpf/libbpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index c6eceae4d6ff6..bb24f6bac2073 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -285,7 +285,7 @@ void libbpf_print(enum libbpf_print_level level, const char *format, ...) old_errno = errno; va_start(args, format); - __libbpf_pr(level, format, args); + print_fn(level, format, args); va_end(args); errno = old_errno; -- GitLab From 88f65bb66d752e833a4e6035f7ad0e5e75079de7 Mon Sep 17 00:00:00 2001 From: Jason Gunthorpe Date: Fri, 25 Apr 2025 10:08:37 -0300 Subject: [PATCH 0843/2211] iommu: Protect against overflow in iommu_pgsize() [ Upstream commit e586e22974d2b7acbef3c6c3e01b2d5ce69efe33 ] On a 32 bit system calling: iommu_map(0, 0x40000000) When using the AMD V1 page table type with a domain->pgsize of 0xfffff000 causes iommu_pgsize() to miscalculate a result of: size=0x40000000 count=2 count should be 1. This completely corrupts the mapping process. This is because the final test to adjust the pagesize malfunctions when the addition overflows. Use check_add_overflow() to prevent this. Fixes: b1d99dc5f983 ("iommu: Hook up '->unmap_pages' driver callback") Signed-off-by: Jason Gunthorpe Reviewed-by: Lu Baolu Link: https://lore.kernel.org/r/0-v1-3ad28fc2e3a3+163327-iommu_overflow_pgsize_jgg@nvidia.com Signed-off-by: Joerg Roedel Signed-off-by: Sasha Levin --- drivers/iommu/iommu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 879009adef407..0ad55649e2d00 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -2394,6 +2394,7 @@ static size_t iommu_pgsize(struct iommu_domain *domain, unsigned long iova, unsigned int pgsize_idx, pgsize_idx_next; unsigned long pgsizes; size_t offset, pgsize, pgsize_next; + size_t offset_end; unsigned long addr_merge = paddr | iova; /* Page sizes supported by the hardware and small enough for @size */ @@ -2434,7 +2435,8 @@ static size_t iommu_pgsize(struct iommu_domain *domain, unsigned long iova, * If size is big enough to accommodate the larger page, reduce * the number of smaller pages. */ - if (offset + pgsize_next <= size) + if (!check_add_overflow(offset, pgsize_next, &offset_end) && + offset_end <= size) size = offset; out_set_count: -- GitLab From 83563a166ca4eb10cbe89060309eb2561ed3c91a Mon Sep 17 00:00:00 2001 From: Hangbin Liu Date: Thu, 24 Apr 2025 04:22:38 +0000 Subject: [PATCH 0844/2211] bonding: assign random address if device address is same as bond [ Upstream commit 5c3bf6cba7911f470afd748606be5c03a9512fcc ] This change addresses a MAC address conflict issue in failover scenarios, similar to the problem described in commit a951bc1e6ba5 ("bonding: correct the MAC address for 'follow' fail_over_mac policy"). In fail_over_mac=follow mode, the bonding driver expects the formerly active slave to swap MAC addresses with the newly active slave during failover. However, under certain conditions, two slaves may end up with the same MAC address, which breaks this policy: 1) ip link set eth0 master bond0 -> bond0 adopts eth0's MAC address (MAC0). 2) ip link set eth1 master bond0 -> eth1 is added as a backup with its own MAC (MAC1). 3) ip link set eth0 nomaster -> eth0 is released and restores its MAC (MAC0). -> eth1 becomes the active slave, and bond0 assigns MAC0 to eth1. 4) ip link set eth0 master bond0 -> eth0 is re-added to bond0, now both eth0 and eth1 have MAC0. This results in a MAC address conflict and violates the expected behavior of the failover policy. To fix this, we assign a random MAC address to any newly added slave if its current MAC address matches that of the bond. The original (permanent) MAC address is saved and will be restored when the device is released from the bond. This ensures that each slave has a unique MAC address during failover transitions, preserving the integrity of the fail_over_mac=follow policy. Fixes: 3915c1e8634a ("bonding: Add "follow" option to fail_over_mac") Signed-off-by: Hangbin Liu Acked-by: Jay Vosburgh Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/bonding/bond_main.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 4d2e30f4ee250..2a513dbbd9756 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -2113,15 +2113,26 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev, * set the master's mac address to that of the first slave */ memcpy(ss.__data, bond_dev->dev_addr, bond_dev->addr_len); - ss.ss_family = slave_dev->type; - res = dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, - extack); - if (res) { - slave_err(bond_dev, slave_dev, "Error %d calling set_mac_address\n", res); - goto err_restore_mtu; - } + } else if (bond->params.fail_over_mac == BOND_FOM_FOLLOW && + BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP && + memcmp(slave_dev->dev_addr, bond_dev->dev_addr, bond_dev->addr_len) == 0) { + /* Set slave to random address to avoid duplicate mac + * address in later fail over. + */ + eth_random_addr(ss.__data); + } else { + goto skip_mac_set; } + ss.ss_family = slave_dev->type; + res = dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, extack); + if (res) { + slave_err(bond_dev, slave_dev, "Error %d calling set_mac_address\n", res); + goto err_restore_mtu; + } + +skip_mac_set: + /* set no_addrconf flag before open to prevent IPv6 addrconf */ slave_dev->priv_flags |= IFF_NO_ADDRCONF; -- GitLab From 04daca601252bd9bfe7bc2e1b9d031dbe7661503 Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Mon, 14 Apr 2025 18:52:36 +0800 Subject: [PATCH 0845/2211] f2fs: clean up w/ fscrypt_is_bounce_page() [ Upstream commit 0c708e35cf26449ca317fcbfc274704660b6d269 ] Just cleanup, no logic changes. Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 1b0050b8421d8..8564441cef9bc 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -53,7 +53,7 @@ bool f2fs_is_cp_guaranteed(struct page *page) struct inode *inode; struct f2fs_sb_info *sbi; - if (!mapping) + if (fscrypt_is_bounce_page(page)) return false; inode = mapping->host; -- GitLab From 4248ba53e4712539ecb75e5961c71e85c4bd99ab Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Mon, 14 Apr 2025 18:52:37 +0800 Subject: [PATCH 0846/2211] f2fs: fix to detect gcing page in f2fs_is_cp_guaranteed() [ Upstream commit aa1be8dd64163eca4dde7fd2557eb19927a06a47 ] Jan Prusakowski reported a f2fs bug as below: f2fs/007 will hang kernel during testing w/ below configs: kernel 6.12.18 (from pixel-kernel/android16-6.12) export MKFS_OPTIONS="-O encrypt -O extra_attr -O project_quota -O quota" export F2FS_MOUNT_OPTIONS="test_dummy_encryption,discard,fsync_mode=nobarrier,reserve_root=32768,checkpoint_merge,atgc" cat /proc//stack f2fs_wait_on_all_pages+0xa3/0x130 do_checkpoint+0x40c/0x5d0 f2fs_write_checkpoint+0x258/0x550 kill_f2fs_super+0x14f/0x190 deactivate_locked_super+0x30/0xb0 cleanup_mnt+0xba/0x150 task_work_run+0x59/0xa0 syscall_exit_to_user_mode+0x12d/0x130 do_syscall_64+0x57/0x110 entry_SYSCALL_64_after_hwframe+0x76/0x7e cat /sys/kernel/debug/f2fs/status - IO_W (CP: -256, Data: 256, Flush: ( 0 0 1), Discard: ( 0 0)) cmd: 0 undiscard: 0 CP IOs reference count becomes negative. The root cause is: After 4961acdd65c9 ("f2fs: fix to tag gcing flag on page during block migration"), we will tag page w/ gcing flag for raw page of cluster during its migration. However, if the inode is both encrypted and compressed, during ioc_decompress(), it will tag page w/ gcing flag, and it increase F2FS_WB_DATA reference count: - f2fs_write_multi_page - f2fs_write_raw_page - f2fs_write_single_page - do_write_page - f2fs_submit_page_write - WB_DATA_TYPE(bio_page, fio->compressed_page) : bio_page is encrypted, so mapping is NULL, and fio->compressed_page is NULL, it returns F2FS_WB_DATA - inc_page_count(.., F2FS_WB_DATA) Then, during end_io(), it decrease F2FS_WB_CP_DATA reference count: - f2fs_write_end_io - f2fs_compress_write_end_io - fscrypt_pagecache_folio : get raw page from encrypted page - WB_DATA_TYPE(&folio->page, false) : raw page has gcing flag, it returns F2FS_WB_CP_DATA - dec_page_count(.., F2FS_WB_CP_DATA) In order to fix this issue, we need to detect gcing flag in raw page in f2fs_is_cp_guaranteed(). Fixes: 4961acdd65c9 ("f2fs: fix to tag gcing flag on page during block migration") Reported-by: Jan Prusakowski Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 8564441cef9bc..62c7fd1168a15 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -54,7 +54,7 @@ bool f2fs_is_cp_guaranteed(struct page *page) struct f2fs_sb_info *sbi; if (fscrypt_is_bounce_page(page)) - return false; + return page_private_gcing(fscrypt_pagecache_page(page)); inode = mapping->host; sbi = F2FS_I_SB(inode); -- GitLab From 6589bc3699bcb45b35b3095c44a5af7a4d75ef7e Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Wed, 23 Apr 2025 13:32:28 -0500 Subject: [PATCH 0847/2211] scsi: smartpqi: Fix smp_processor_id() call trace for preemptible kernels [ Upstream commit 42d033cf4b517e91c187ad2fbd7b30fdc6d2d62c ] Correct kernel call trace when calling smp_processor_id() when called in preemptible kernels by using raw_smp_processor_id(). smp_processor_id() checks to see if preemption is disabled and if not, issue an error message followed by a call to dump_stack(). Brief example of call trace: kernel: check_preemption_disabled: 436 callbacks suppressed kernel: BUG: using smp_processor_id() in preemptible [00000000] code: kworker/u1025:0/2354 kernel: caller is pqi_scsi_queue_command+0x183/0x310 [smartpqi] kernel: CPU: 129 PID: 2354 Comm: kworker/u1025:0 kernel: ... kernel: Workqueue: writeback wb_workfn (flush-253:0) kernel: Call Trace: kernel: kernel: dump_stack_lvl+0x34/0x48 kernel: check_preemption_disabled+0xdd/0xe0 kernel: pqi_scsi_queue_command+0x183/0x310 [smartpqi] kernel: ... Fixes: 283dcc1b142e ("scsi: smartpqi: add counter for parity write stream requests") Reviewed-by: Scott Benesh Reviewed-by: Mike McGowen Tested-by: Don Brace Signed-off-by: Yi Zhang Signed-off-by: Don Brace Link: https://lore.kernel.org/r/20250423183229.538572-5-don.brace@microchip.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/smartpqi/smartpqi_init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c index d919a74746a05..8cc9f924a8ae6 100644 --- a/drivers/scsi/smartpqi/smartpqi_init.c +++ b/drivers/scsi/smartpqi/smartpqi_init.c @@ -5990,7 +5990,7 @@ static bool pqi_is_parity_write_stream(struct pqi_ctrl_info *ctrl_info, pqi_stream_data->next_lba = rmd.first_block + rmd.block_cnt; pqi_stream_data->last_accessed = jiffies; - per_cpu_ptr(device->raid_io_stats, smp_processor_id())->write_stream_cnt++; + per_cpu_ptr(device->raid_io_stats, raw_smp_processor_id())->write_stream_cnt++; return true; } @@ -6069,7 +6069,7 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost, struct scsi_cmnd *scm rc = pqi_raid_bypass_submit_scsi_cmd(ctrl_info, device, scmd, queue_group); if (rc == 0 || rc == SCSI_MLQUEUE_HOST_BUSY) { raid_bypassed = true; - per_cpu_ptr(device->raid_io_stats, smp_processor_id())->raid_bypass_cnt++; + per_cpu_ptr(device->raid_io_stats, raw_smp_processor_id())->raid_bypass_cnt++; } } if (!raid_bypassed) -- GitLab From 277f9ffe873a76be46ddda3c59addfe16dab5bec Mon Sep 17 00:00:00 2001 From: Anton Protopopov Date: Wed, 30 Apr 2025 12:08:20 +0000 Subject: [PATCH 0848/2211] libbpf: Use proper errno value in linker [ Upstream commit 358b1c0f56ebb6996fcec7dcdcf6bae5dcbc8b6c ] Return values of the linker_append_sec_data() and the linker_append_elf_relos() functions are propagated all the way up to users of libbpf API. In some error cases these functions return -1 which will be seen as -EPERM from user's point of view. Instead, return a more reasonable -EINVAL. Fixes: faf6ed321cf6 ("libbpf: Add BPF static linker APIs") Signed-off-by: Anton Protopopov Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250430120820.2262053-1-a.s.protopopov@gmail.com Signed-off-by: Sasha Levin --- tools/lib/bpf/linker.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/lib/bpf/linker.c b/tools/lib/bpf/linker.c index 179f6b31cbd6f..d4ab9315afe71 100644 --- a/tools/lib/bpf/linker.c +++ b/tools/lib/bpf/linker.c @@ -1220,7 +1220,7 @@ static int linker_append_sec_data(struct bpf_linker *linker, struct src_obj *obj } else { if (!secs_match(dst_sec, src_sec)) { pr_warn("ELF sections %s are incompatible\n", src_sec->sec_name); - return -1; + return -EINVAL; } /* "license" and "version" sections are deduped */ @@ -2067,7 +2067,7 @@ static int linker_append_elf_relos(struct bpf_linker *linker, struct src_obj *ob } } else if (!secs_match(dst_sec, src_sec)) { pr_warn("sections %s are not compatible\n", src_sec->sec_name); - return -1; + return -EINVAL; } /* shdr->sh_link points to SYMTAB */ -- GitLab From c1f418cc278ac7ccd05cc4a38497fb10aadcc3cd Mon Sep 17 00:00:00 2001 From: Lorenzo Bianconi Date: Mon, 28 Apr 2025 17:44:02 +0200 Subject: [PATCH 0849/2211] bpf: Allow XDP dev-bound programs to perform XDP_REDIRECT into maps [ Upstream commit 714070c4cb7a10ff57450a618a936775f3036245 ] In the current implementation if the program is dev-bound to a specific device, it will not be possible to perform XDP_REDIRECT into a DEVMAP or CPUMAP even if the program is running in the driver NAPI context and it is not attached to any map entry. This seems in contrast with the explanation available in bpf_prog_map_compatible routine. Fix the issue introducing __bpf_prog_map_compatible utility routine in order to avoid bpf_prog_is_dev_bound() check running bpf_check_tail_call() at program load time (bpf_prog_select_runtime()). Continue forbidding to attach a dev-bound program to XDP maps (BPF_MAP_TYPE_PROG_ARRAY, BPF_MAP_TYPE_DEVMAP and BPF_MAP_TYPE_CPUMAP). Fixes: 3d76a4d3d4e59 ("bpf: XDP metadata RX kfuncs") Signed-off-by: Lorenzo Bianconi Signed-off-by: Martin KaFai Lau Acked-by: Stanislav Fomichev Signed-off-by: Sasha Levin --- kernel/bpf/core.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index a60a6a2ce0d7f..a713cc7b00849 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -2303,8 +2303,8 @@ static unsigned int __bpf_prog_ret0_warn(const void *ctx, return 0; } -bool bpf_prog_map_compatible(struct bpf_map *map, - const struct bpf_prog *fp) +static bool __bpf_prog_map_compatible(struct bpf_map *map, + const struct bpf_prog *fp) { enum bpf_prog_type prog_type = resolve_prog_type(fp); bool ret; @@ -2313,14 +2313,6 @@ bool bpf_prog_map_compatible(struct bpf_map *map, if (fp->kprobe_override) return false; - /* XDP programs inserted into maps are not guaranteed to run on - * a particular netdev (and can run outside driver context entirely - * in the case of devmap and cpumap). Until device checks - * are implemented, prohibit adding dev-bound programs to program maps. - */ - if (bpf_prog_is_dev_bound(aux)) - return false; - spin_lock(&map->owner.lock); if (!map->owner.type) { /* There's no owner yet where we could check for @@ -2354,6 +2346,19 @@ bool bpf_prog_map_compatible(struct bpf_map *map, return ret; } +bool bpf_prog_map_compatible(struct bpf_map *map, const struct bpf_prog *fp) +{ + /* XDP programs inserted into maps are not guaranteed to run on + * a particular netdev (and can run outside driver context entirely + * in the case of devmap and cpumap). Until device checks + * are implemented, prohibit adding dev-bound programs to program maps. + */ + if (bpf_prog_is_dev_bound(fp->aux)) + return false; + + return __bpf_prog_map_compatible(map, fp); +} + static int bpf_check_tail_call(const struct bpf_prog *fp) { struct bpf_prog_aux *aux = fp->aux; @@ -2366,7 +2371,7 @@ static int bpf_check_tail_call(const struct bpf_prog *fp) if (!map_type_contains_progs(map)) continue; - if (!bpf_prog_map_compatible(map, fp)) { + if (!__bpf_prog_map_compatible(map, fp)) { ret = -EINVAL; goto out; } -- GitLab From de6edd32370fd72e3bcef1aa53dda55dfcc2e850 Mon Sep 17 00:00:00 2001 From: Huajian Yang Date: Thu, 17 Apr 2025 17:29:53 +0800 Subject: [PATCH 0850/2211] netfilter: bridge: Move specific fragmented packet to slow_path instead of dropping it [ Upstream commit aa04c6f45b9224b949aa35d4fa5f8d0ba07b23d4 ] The config NF_CONNTRACK_BRIDGE will change the bridge forwarding for fragmented packets. The original bridge does not know that it is a fragmented packet and forwards it directly, after NF_CONNTRACK_BRIDGE is enabled, function nf_br_ip_fragment and br_ip6_fragment will check the headroom. In original br_forward, insufficient headroom of skb may indeed exist, but there's still a way to save the skb in the device driver after dev_queue_xmit.So droping the skb will change the original bridge forwarding in some cases. Fixes: 3c171f496ef5 ("netfilter: bridge: add connection tracking system") Signed-off-by: Huajian Yang Reviewed-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- net/bridge/netfilter/nf_conntrack_bridge.c | 12 ++++++------ net/ipv6/netfilter.c | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/net/bridge/netfilter/nf_conntrack_bridge.c b/net/bridge/netfilter/nf_conntrack_bridge.c index 816bb0fde718e..6482de4d87509 100644 --- a/net/bridge/netfilter/nf_conntrack_bridge.c +++ b/net/bridge/netfilter/nf_conntrack_bridge.c @@ -60,19 +60,19 @@ static int nf_br_ip_fragment(struct net *net, struct sock *sk, struct ip_fraglist_iter iter; struct sk_buff *frag; - if (first_len - hlen > mtu || - skb_headroom(skb) < ll_rs) + if (first_len - hlen > mtu) goto blackhole; - if (skb_cloned(skb)) + if (skb_cloned(skb) || + skb_headroom(skb) < ll_rs) goto slow_path; skb_walk_frags(skb, frag) { - if (frag->len > mtu || - skb_headroom(frag) < hlen + ll_rs) + if (frag->len > mtu) goto blackhole; - if (skb_shared(frag)) + if (skb_shared(frag) || + skb_headroom(frag) < hlen + ll_rs) goto slow_path; } diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c index 581ce055bf520..4541836ee3da2 100644 --- a/net/ipv6/netfilter.c +++ b/net/ipv6/netfilter.c @@ -164,20 +164,20 @@ int br_ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, struct ip6_fraglist_iter iter; struct sk_buff *frag2; - if (first_len - hlen > mtu || - skb_headroom(skb) < (hroom + sizeof(struct frag_hdr))) + if (first_len - hlen > mtu) goto blackhole; - if (skb_cloned(skb)) + if (skb_cloned(skb) || + skb_headroom(skb) < (hroom + sizeof(struct frag_hdr))) goto slow_path; skb_walk_frags(skb, frag2) { - if (frag2->len > mtu || - skb_headroom(frag2) < (hlen + hroom + sizeof(struct frag_hdr))) + if (frag2->len > mtu) goto blackhole; /* Partially cloned skb? */ - if (skb_shared(frag2)) + if (skb_shared(frag2) || + skb_headroom(frag2) < (hlen + hroom + sizeof(struct frag_hdr))) goto slow_path; } -- GitLab From c7b7d63a33227c8d66e4be0f105f8e56f1896c95 Mon Sep 17 00:00:00 2001 From: Zhongqiu Duan Date: Thu, 17 Apr 2025 15:49:30 +0000 Subject: [PATCH 0851/2211] netfilter: nft_quota: match correctly when the quota just depleted [ Upstream commit bfe7cfb65c753952735c3eed703eba9a8b96a18d ] The xt_quota compares skb length with remaining quota, but the nft_quota compares it with consumed bytes. The xt_quota can match consumed bytes up to quota at maximum. But the nft_quota break match when consumed bytes equal to quota. i.e., nft_quota match consumed bytes in [0, quota - 1], not [0, quota]. Fixes: 795595f68d6c ("netfilter: nft_quota: dump consumed quota") Signed-off-by: Zhongqiu Duan Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- net/netfilter/nft_quota.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/net/netfilter/nft_quota.c b/net/netfilter/nft_quota.c index 9b2d7463d3d32..df0798da2329b 100644 --- a/net/netfilter/nft_quota.c +++ b/net/netfilter/nft_quota.c @@ -19,10 +19,16 @@ struct nft_quota { }; static inline bool nft_overquota(struct nft_quota *priv, - const struct sk_buff *skb) + const struct sk_buff *skb, + bool *report) { - return atomic64_add_return(skb->len, priv->consumed) >= - atomic64_read(&priv->quota); + u64 consumed = atomic64_add_return(skb->len, priv->consumed); + u64 quota = atomic64_read(&priv->quota); + + if (report) + *report = consumed >= quota; + + return consumed > quota; } static inline bool nft_quota_invert(struct nft_quota *priv) @@ -34,7 +40,7 @@ static inline void nft_quota_do_eval(struct nft_quota *priv, struct nft_regs *regs, const struct nft_pktinfo *pkt) { - if (nft_overquota(priv, pkt->skb) ^ nft_quota_invert(priv)) + if (nft_overquota(priv, pkt->skb, NULL) ^ nft_quota_invert(priv)) regs->verdict.code = NFT_BREAK; } @@ -51,13 +57,13 @@ static void nft_quota_obj_eval(struct nft_object *obj, const struct nft_pktinfo *pkt) { struct nft_quota *priv = nft_obj_data(obj); - bool overquota; + bool overquota, report; - overquota = nft_overquota(priv, pkt->skb); + overquota = nft_overquota(priv, pkt->skb, &report); if (overquota ^ nft_quota_invert(priv)) regs->verdict.code = NFT_BREAK; - if (overquota && + if (report && !test_and_set_bit(NFT_QUOTA_DEPLETED_BIT, &priv->flags)) nft_obj_notify(nft_net(pkt), obj->key.table, obj, 0, 0, NFT_MSG_NEWOBJ, 0, nft_pf(pkt), 0, GFP_ATOMIC); -- GitLab From c1360ac8156c0a3f2385baef91d8d26fd9d39701 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Tue, 22 Apr 2025 21:52:43 +0200 Subject: [PATCH 0852/2211] netfilter: nft_set_pipapo: prevent overflow in lookup table allocation [ Upstream commit 4c5c6aa9967dbe55bd017bb509885928d0f31206 ] When calculating the lookup table size, ensure the following multiplication does not overflow: - desc->field_len[] maximum value is U8_MAX multiplied by NFT_PIPAPO_GROUPS_PER_BYTE(f) that can be 2, worst case. - NFT_PIPAPO_BUCKETS(f->bb) is 2^8, worst case. - sizeof(unsigned long), from sizeof(*f->lt), lt in struct nft_pipapo_field. Then, use check_mul_overflow() to multiply by bucket size and then use check_add_overflow() to the alignment for avx2 (if needed). Finally, add lt_size_check_overflow() helper and use it to consolidate this. While at it, replace leftover allocation using the GFP_KERNEL to GFP_KERNEL_ACCOUNT for consistency, in pipapo_resize(). Fixes: 3c4287f62044 ("nf_tables: Add set type for arbitrary concatenation of ranges") Signed-off-by: Pablo Neira Ayuso Reviewed-by: Stefano Brivio Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- net/netfilter/nft_set_pipapo.c | 58 ++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/net/netfilter/nft_set_pipapo.c b/net/netfilter/nft_set_pipapo.c index 7be342b495f5f..0529e4ef75207 100644 --- a/net/netfilter/nft_set_pipapo.c +++ b/net/netfilter/nft_set_pipapo.c @@ -683,6 +683,30 @@ out_free: return 0; } + +/** + * lt_calculate_size() - Get storage size for lookup table with overflow check + * @groups: Amount of bit groups + * @bb: Number of bits grouped together in lookup table buckets + * @bsize: Size of each bucket in lookup table, in longs + * + * Return: allocation size including alignment overhead, negative on overflow + */ +static ssize_t lt_calculate_size(unsigned int groups, unsigned int bb, + unsigned int bsize) +{ + ssize_t ret = groups * NFT_PIPAPO_BUCKETS(bb) * sizeof(long); + + if (check_mul_overflow(ret, bsize, &ret)) + return -1; + if (check_add_overflow(ret, NFT_PIPAPO_ALIGN_HEADROOM, &ret)) + return -1; + if (ret > INT_MAX) + return -1; + + return ret; +} + /** * pipapo_resize() - Resize lookup or mapping table, or both * @f: Field containing lookup and mapping tables @@ -701,6 +725,7 @@ static int pipapo_resize(struct nft_pipapo_field *f, long *new_lt = NULL, *new_p, *old_lt = f->lt, *old_p; unsigned int new_bucket_size, copy; int group, bucket, err; + ssize_t lt_size; if (rules >= NFT_PIPAPO_RULE0_MAX) return -ENOSPC; @@ -719,10 +744,11 @@ static int pipapo_resize(struct nft_pipapo_field *f, else copy = new_bucket_size; - new_lt = kvzalloc(f->groups * NFT_PIPAPO_BUCKETS(f->bb) * - new_bucket_size * sizeof(*new_lt) + - NFT_PIPAPO_ALIGN_HEADROOM, - GFP_KERNEL); + lt_size = lt_calculate_size(f->groups, f->bb, new_bucket_size); + if (lt_size < 0) + return -ENOMEM; + + new_lt = kvzalloc(lt_size, GFP_KERNEL_ACCOUNT); if (!new_lt) return -ENOMEM; @@ -907,7 +933,7 @@ static void pipapo_lt_bits_adjust(struct nft_pipapo_field *f) { unsigned int groups, bb; unsigned long *new_lt; - size_t lt_size; + ssize_t lt_size; lt_size = f->groups * NFT_PIPAPO_BUCKETS(f->bb) * f->bsize * sizeof(*f->lt); @@ -917,15 +943,17 @@ static void pipapo_lt_bits_adjust(struct nft_pipapo_field *f) groups = f->groups * 2; bb = NFT_PIPAPO_GROUP_BITS_LARGE_SET; - lt_size = groups * NFT_PIPAPO_BUCKETS(bb) * f->bsize * - sizeof(*f->lt); + lt_size = lt_calculate_size(groups, bb, f->bsize); + if (lt_size < 0) + return; } else if (f->bb == NFT_PIPAPO_GROUP_BITS_LARGE_SET && lt_size < NFT_PIPAPO_LT_SIZE_LOW) { groups = f->groups / 2; bb = NFT_PIPAPO_GROUP_BITS_SMALL_SET; - lt_size = groups * NFT_PIPAPO_BUCKETS(bb) * f->bsize * - sizeof(*f->lt); + lt_size = lt_calculate_size(groups, bb, f->bsize); + if (lt_size < 0) + return; /* Don't increase group width if the resulting lookup table size * would exceed the upper size threshold for a "small" set. @@ -936,7 +964,7 @@ static void pipapo_lt_bits_adjust(struct nft_pipapo_field *f) return; } - new_lt = kvzalloc(lt_size + NFT_PIPAPO_ALIGN_HEADROOM, GFP_KERNEL_ACCOUNT); + new_lt = kvzalloc(lt_size, GFP_KERNEL_ACCOUNT); if (!new_lt) return; @@ -1451,13 +1479,15 @@ static struct nft_pipapo_match *pipapo_clone(struct nft_pipapo_match *old) for (i = 0; i < old->field_count; i++) { unsigned long *new_lt; + ssize_t lt_size; memcpy(dst, src, offsetof(struct nft_pipapo_field, lt)); - new_lt = kvzalloc(src->groups * NFT_PIPAPO_BUCKETS(src->bb) * - src->bsize * sizeof(*dst->lt) + - NFT_PIPAPO_ALIGN_HEADROOM, - GFP_KERNEL_ACCOUNT); + lt_size = lt_calculate_size(src->groups, src->bb, src->bsize); + if (lt_size < 0) + goto out_lt; + + new_lt = kvzalloc(lt_size, GFP_KERNEL_ACCOUNT); if (!new_lt) goto out_lt; -- GitLab From 50ac361ff8914133e3cf6ef184bac90c22cb8d79 Mon Sep 17 00:00:00 2001 From: Patrisious Haddad Date: Mon, 28 Apr 2025 14:34:07 +0300 Subject: [PATCH 0853/2211] RDMA/mlx5: Fix error flow upon firmware failure for RQ destruction [ Upstream commit 5d2ea5aebbb2f3ebde4403f9c55b2b057e5dd2d6 ] Upon RQ destruction if the firmware command fails which is the last resource to be destroyed some SW resources were already cleaned regardless of the failure. Now properly rollback the object to its original state upon such failure. In order to avoid a use-after free in case someone tries to destroy the object again, which results in the following kernel trace: refcount_t: underflow; use-after-free. WARNING: CPU: 0 PID: 37589 at lib/refcount.c:28 refcount_warn_saturate+0xf4/0x148 Modules linked in: rdma_ucm(OE) rdma_cm(OE) iw_cm(OE) ib_ipoib(OE) ib_cm(OE) ib_umad(OE) mlx5_ib(OE) rfkill mlx5_core(OE) mlxdevm(OE) ib_uverbs(OE) ib_core(OE) psample mlxfw(OE) mlx_compat(OE) macsec tls pci_hyperv_intf sunrpc vfat fat virtio_net net_failover failover fuse loop nfnetlink vsock_loopback vmw_vsock_virtio_transport_common vmw_vsock_vmci_transport vmw_vmci vsock xfs crct10dif_ce ghash_ce sha2_ce sha256_arm64 sha1_ce virtio_console virtio_gpu virtio_blk virtio_dma_buf virtio_mmio dm_mirror dm_region_hash dm_log dm_mod xpmem(OE) CPU: 0 UID: 0 PID: 37589 Comm: python3 Kdump: loaded Tainted: G OE ------- --- 6.12.0-54.el10.aarch64 #1 Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE Hardware name: QEMU KVM Virtual Machine, BIOS 0.0.0 02/06/2015 pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : refcount_warn_saturate+0xf4/0x148 lr : refcount_warn_saturate+0xf4/0x148 sp : ffff80008b81b7e0 x29: ffff80008b81b7e0 x28: ffff000133d51600 x27: 0000000000000001 x26: 0000000000000000 x25: 00000000ffffffea x24: ffff00010ae80f00 x23: ffff00010ae80f80 x22: ffff0000c66e5d08 x21: 0000000000000000 x20: ffff0000c66e0000 x19: ffff00010ae80340 x18: 0000000000000006 x17: 0000000000000000 x16: 0000000000000020 x15: ffff80008b81b37f x14: 0000000000000000 x13: 2e656572662d7265 x12: ffff80008283ef78 x11: ffff80008257efd0 x10: ffff80008283efd0 x9 : ffff80008021ed90 x8 : 0000000000000001 x7 : 00000000000bffe8 x6 : c0000000ffff7fff x5 : ffff0001fb8e3408 x4 : 0000000000000000 x3 : ffff800179993000 x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000133d51600 Call trace: refcount_warn_saturate+0xf4/0x148 mlx5_core_put_rsc+0x88/0xa0 [mlx5_ib] mlx5_core_destroy_rq_tracked+0x64/0x98 [mlx5_ib] mlx5_ib_destroy_wq+0x34/0x80 [mlx5_ib] ib_destroy_wq_user+0x30/0xc0 [ib_core] uverbs_free_wq+0x28/0x58 [ib_uverbs] destroy_hw_idr_uobject+0x34/0x78 [ib_uverbs] uverbs_destroy_uobject+0x48/0x240 [ib_uverbs] __uverbs_cleanup_ufile+0xd4/0x1a8 [ib_uverbs] uverbs_destroy_ufile_hw+0x48/0x120 [ib_uverbs] ib_uverbs_close+0x2c/0x100 [ib_uverbs] __fput+0xd8/0x2f0 __fput_sync+0x50/0x70 __arm64_sys_close+0x40/0x90 invoke_syscall.constprop.0+0x74/0xd0 do_el0_svc+0x48/0xe8 el0_svc+0x44/0x1d0 el0t_64_sync_handler+0x120/0x130 el0t_64_sync+0x1a4/0x1a8 Fixes: e2013b212f9f ("net/mlx5_core: Add RQ and SQ event handling") Signed-off-by: Patrisious Haddad Link: https://patch.msgid.link/3181433ccdd695c63560eeeb3f0c990961732101.1745839855.git.leon@kernel.org Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/infiniband/hw/mlx5/qpc.c | 30 ++++++++++++++++++++++++++++-- include/linux/mlx5/driver.h | 1 + 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/qpc.c b/drivers/infiniband/hw/mlx5/qpc.c index d3dcc272200af..146d03ae40bd9 100644 --- a/drivers/infiniband/hw/mlx5/qpc.c +++ b/drivers/infiniband/hw/mlx5/qpc.c @@ -21,8 +21,10 @@ mlx5_get_rsc(struct mlx5_qp_table *table, u32 rsn) spin_lock_irqsave(&table->lock, flags); common = radix_tree_lookup(&table->tree, rsn); - if (common) + if (common && !common->invalid) refcount_inc(&common->refcount); + else + common = NULL; spin_unlock_irqrestore(&table->lock, flags); @@ -178,6 +180,18 @@ static int create_resource_common(struct mlx5_ib_dev *dev, return 0; } +static void modify_resource_common_state(struct mlx5_ib_dev *dev, + struct mlx5_core_qp *qp, + bool invalid) +{ + struct mlx5_qp_table *table = &dev->qp_table; + unsigned long flags; + + spin_lock_irqsave(&table->lock, flags); + qp->common.invalid = invalid; + spin_unlock_irqrestore(&table->lock, flags); +} + static void destroy_resource_common(struct mlx5_ib_dev *dev, struct mlx5_core_qp *qp) { @@ -609,8 +623,20 @@ err_destroy_rq: int mlx5_core_destroy_rq_tracked(struct mlx5_ib_dev *dev, struct mlx5_core_qp *rq) { + int ret; + + /* The rq destruction can be called again in case it fails, hence we + * mark the common resource as invalid and only once FW destruction + * is completed successfully we actually destroy the resources. + */ + modify_resource_common_state(dev, rq, true); + ret = destroy_rq_tracked(dev, rq->qpn, rq->uid); + if (ret) { + modify_resource_common_state(dev, rq, false); + return ret; + } destroy_resource_common(dev, rq); - return destroy_rq_tracked(dev, rq->qpn, rq->uid); + return 0; } static void destroy_sq_tracked(struct mlx5_ib_dev *dev, u32 sqn, u16 uid) diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h index d4b2c09cd5fec..da9749739abde 100644 --- a/include/linux/mlx5/driver.h +++ b/include/linux/mlx5/driver.h @@ -395,6 +395,7 @@ struct mlx5_core_rsc_common { enum mlx5_res_type res; refcount_t refcount; struct completion free; + bool invalid; }; struct mlx5_uars_page { -- GitLab From 94068a664aa5217671cc71666cb3739c1322ef2f Mon Sep 17 00:00:00 2001 From: Anton Protopopov Date: Fri, 2 May 2025 19:30:31 +0000 Subject: [PATCH 0854/2211] bpf: Fix uninitialized values in BPF_{CORE,PROBE}_READ [ Upstream commit 41d4ce6df3f4945341ec509a840cc002a413b6cc ] With the latest LLVM bpf selftests build will fail with the following error message: progs/profiler.inc.h:710:31: error: default initialization of an object of type 'typeof ((parent_task)->real_cred->uid.val)' (aka 'const unsigned int') leaves the object uninitialized and is incompatible with C++ [-Werror,-Wdefault-const-init-unsafe] 710 | proc_exec_data->parent_uid = BPF_CORE_READ(parent_task, real_cred, uid.val); | ^ tools/testing/selftests/bpf/tools/include/bpf/bpf_core_read.h:520:35: note: expanded from macro 'BPF_CORE_READ' 520 | ___type((src), a, ##__VA_ARGS__) __r; \ | ^ This happens because BPF_CORE_READ (and other macro) declare the variable __r using the ___type macro which can inherit const modifier from intermediate types. Fix this by using __typeof_unqual__, when supported. (And when it is not supported, the problem shouldn't appear, as older compilers haven't complained.) Fixes: 792001f4f7aa ("libbpf: Add user-space variants of BPF_CORE_READ() family of macros") Fixes: a4b09a9ef945 ("libbpf: Add non-CO-RE variants of BPF_CORE_READ() macro family") Signed-off-by: Anton Protopopov Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250502193031.3522715-1-a.s.protopopov@gmail.com Signed-off-by: Sasha Levin --- tools/lib/bpf/bpf_core_read.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/lib/bpf/bpf_core_read.h b/tools/lib/bpf/bpf_core_read.h index c0e13cdf96607..b997c68bd9453 100644 --- a/tools/lib/bpf/bpf_core_read.h +++ b/tools/lib/bpf/bpf_core_read.h @@ -388,7 +388,13 @@ extern void *bpf_rdonly_cast(const void *obj, __u32 btf_id) __ksym __weak; #define ___arrow10(a, b, c, d, e, f, g, h, i, j) a->b->c->d->e->f->g->h->i->j #define ___arrow(...) ___apply(___arrow, ___narg(__VA_ARGS__))(__VA_ARGS__) +#if defined(__clang__) && (__clang_major__ >= 19) +#define ___type(...) __typeof_unqual__(___arrow(__VA_ARGS__)) +#elif defined(__GNUC__) && (__GNUC__ >= 14) +#define ___type(...) __typeof_unqual__(___arrow(__VA_ARGS__)) +#else #define ___type(...) typeof(___arrow(__VA_ARGS__)) +#endif #define ___read(read_fn, dst, src_type, src, accessor) \ read_fn((void *)(dst), sizeof(*(dst)), &((src_type)(src))->accessor) -- GitLab From e53a8dcd36b9ebc9229450eb594ae20e0b2ae0fd Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Mon, 7 Apr 2025 12:38:51 -0400 Subject: [PATCH 0855/2211] tracing: Move histogram trigger variables from stack to per CPU structure [ Upstream commit 7ab0fc61ce73040f89b12d76a8279995ec283541 ] The histogram trigger has three somewhat large arrays on the kernel stack: unsigned long entries[HIST_STACKTRACE_DEPTH]; u64 var_ref_vals[TRACING_MAP_VARS_MAX]; char compound_key[HIST_KEY_SIZE_MAX]; Checking the function event_hist_trigger() stack frame size, it currently uses 816 bytes for its stack frame due to these variables! Instead, allocate a per CPU structure that holds these arrays for each context level (normal, softirq, irq and NMI). That is, each CPU will have 4 of these structures. This will be allocated when the first histogram trigger is enabled and freed when the last is disabled. When the histogram callback triggers, it will request this structure. The request will disable preemption, get the per CPU structure at the index of the per CPU variable, and increment that variable. The callback will use the arrays in this structure to perform its work and then release the structure. That in turn will simply decrement the per CPU index and enable preemption. Moving the variables from the kernel stack to the per CPU structure brings the stack frame of event_hist_trigger() down to just 112 bytes. Cc: Mathieu Desnoyers Cc: Tom Zanussi Link: https://lore.kernel.org/20250407123851.74ea8d58@gandalf.local.home Fixes: 067fe038e70f6 ("tracing: Add variable reference handling to hist triggers") Reviewed-by: Masami Hiramatsu (Google) Signed-off-by: Steven Rostedt (Google) Signed-off-by: Sasha Levin --- kernel/trace/trace_events_hist.c | 120 +++++++++++++++++++++++++++---- 1 file changed, 105 insertions(+), 15 deletions(-) diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index 4ebafc655223a..c56375848e088 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -5249,17 +5249,94 @@ hist_trigger_actions(struct hist_trigger_data *hist_data, } } +/* + * The hist_pad structure is used to save information to create + * a histogram from the histogram trigger. It's too big to store + * on the stack, so when the histogram trigger is initialized + * a percpu array of 4 hist_pad structures is allocated. + * This will cover every context from normal, softirq, irq and NMI + * in the very unlikely event that a tigger happens at each of + * these contexts and interrupts a currently active trigger. + */ +struct hist_pad { + unsigned long entries[HIST_STACKTRACE_DEPTH]; + u64 var_ref_vals[TRACING_MAP_VARS_MAX]; + char compound_key[HIST_KEY_SIZE_MAX]; +}; + +static struct hist_pad __percpu *hist_pads; +static DEFINE_PER_CPU(int, hist_pad_cnt); +static refcount_t hist_pad_ref; + +/* One hist_pad for every context (normal, softirq, irq, NMI) */ +#define MAX_HIST_CNT 4 + +static int alloc_hist_pad(void) +{ + lockdep_assert_held(&event_mutex); + + if (refcount_read(&hist_pad_ref)) { + refcount_inc(&hist_pad_ref); + return 0; + } + + hist_pads = __alloc_percpu(sizeof(struct hist_pad) * MAX_HIST_CNT, + __alignof__(struct hist_pad)); + if (!hist_pads) + return -ENOMEM; + + refcount_set(&hist_pad_ref, 1); + return 0; +} + +static void free_hist_pad(void) +{ + lockdep_assert_held(&event_mutex); + + if (!refcount_dec_and_test(&hist_pad_ref)) + return; + + free_percpu(hist_pads); + hist_pads = NULL; +} + +static struct hist_pad *get_hist_pad(void) +{ + struct hist_pad *hist_pad; + int cnt; + + if (WARN_ON_ONCE(!hist_pads)) + return NULL; + + preempt_disable(); + + hist_pad = per_cpu_ptr(hist_pads, smp_processor_id()); + + if (this_cpu_read(hist_pad_cnt) == MAX_HIST_CNT) { + preempt_enable(); + return NULL; + } + + cnt = this_cpu_inc_return(hist_pad_cnt) - 1; + + return &hist_pad[cnt]; +} + +static void put_hist_pad(void) +{ + this_cpu_dec(hist_pad_cnt); + preempt_enable(); +} + static void event_hist_trigger(struct event_trigger_data *data, struct trace_buffer *buffer, void *rec, struct ring_buffer_event *rbe) { struct hist_trigger_data *hist_data = data->private_data; bool use_compound_key = (hist_data->n_keys > 1); - unsigned long entries[HIST_STACKTRACE_DEPTH]; - u64 var_ref_vals[TRACING_MAP_VARS_MAX]; - char compound_key[HIST_KEY_SIZE_MAX]; struct tracing_map_elt *elt = NULL; struct hist_field *key_field; + struct hist_pad *hist_pad; u64 field_contents; void *key = NULL; unsigned int i; @@ -5267,12 +5344,18 @@ static void event_hist_trigger(struct event_trigger_data *data, if (unlikely(!rbe)) return; - memset(compound_key, 0, hist_data->key_size); + hist_pad = get_hist_pad(); + if (!hist_pad) + return; + + memset(hist_pad->compound_key, 0, hist_data->key_size); for_each_hist_key_field(i, hist_data) { key_field = hist_data->fields[i]; if (key_field->flags & HIST_FIELD_FL_STACKTRACE) { + unsigned long *entries = hist_pad->entries; + memset(entries, 0, HIST_STACKTRACE_SIZE); if (key_field->field) { unsigned long *stack, n_entries; @@ -5296,26 +5379,31 @@ static void event_hist_trigger(struct event_trigger_data *data, } if (use_compound_key) - add_to_key(compound_key, key, key_field, rec); + add_to_key(hist_pad->compound_key, key, key_field, rec); } if (use_compound_key) - key = compound_key; + key = hist_pad->compound_key; if (hist_data->n_var_refs && - !resolve_var_refs(hist_data, key, var_ref_vals, false)) - return; + !resolve_var_refs(hist_data, key, hist_pad->var_ref_vals, false)) + goto out; elt = tracing_map_insert(hist_data->map, key); if (!elt) - return; + goto out; - hist_trigger_elt_update(hist_data, elt, buffer, rec, rbe, var_ref_vals); + hist_trigger_elt_update(hist_data, elt, buffer, rec, rbe, hist_pad->var_ref_vals); - if (resolve_var_refs(hist_data, key, var_ref_vals, true)) - hist_trigger_actions(hist_data, elt, buffer, rec, rbe, key, var_ref_vals); + if (resolve_var_refs(hist_data, key, hist_pad->var_ref_vals, true)) { + hist_trigger_actions(hist_data, elt, buffer, rec, rbe, + key, hist_pad->var_ref_vals); + } hist_poll_wakeup(); + + out: + put_hist_pad(); } static void hist_trigger_stacktrace_print(struct seq_file *m, @@ -6160,6 +6248,9 @@ static int event_hist_trigger_init(struct event_trigger_data *data) { struct hist_trigger_data *hist_data = data->private_data; + if (alloc_hist_pad() < 0) + return -ENOMEM; + if (!data->ref && hist_data->attrs->name) save_named_trigger(hist_data->attrs->name, data); @@ -6204,6 +6295,7 @@ static void event_hist_trigger_free(struct event_trigger_data *data) destroy_hist_data(hist_data); } + free_hist_pad(); } static struct event_trigger_ops event_hist_trigger_ops = { @@ -6219,9 +6311,7 @@ static int event_hist_trigger_named_init(struct event_trigger_data *data) save_named_trigger(data->named_data->name, data); - event_hist_trigger_init(data->named_data); - - return 0; + return event_hist_trigger_init(data->named_data); } static void event_hist_trigger_named_free(struct event_trigger_data *data) -- GitLab From dcdce64095b47eb0207edffa75e0a27085b7073f Mon Sep 17 00:00:00 2001 From: Luca Weiss Date: Fri, 25 Apr 2025 14:12:55 +0200 Subject: [PATCH 0856/2211] clk: qcom: camcc-sm6350: Add *_wait_val values for GDSCs [ Upstream commit e7b1c13280ad866f3b935f6c658713c41db61635 ] Compared to the msm-4.19 driver the mainline GDSC driver always sets the bits for en_rest, en_few & clk_dis, and if those values are not set per-GDSC in the respective driver then the default value from the GDSC driver is used. The downstream driver only conditionally sets clk_dis_wait_val if qcom,clk-dis-wait-val is given in devicetree. Correct this situation by explicitly setting those values. For all GDSCs the reset value of those bits are used. Fixes: 80f5451d9a7c ("clk: qcom: Add camera clock controller driver for SM6350") Signed-off-by: Luca Weiss Reviewed-by: Taniya Das Link: https://lore.kernel.org/r/20250425-sm6350-gdsc-val-v1-1-1f252d9c5e4e@fairphone.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/clk/qcom/camcc-sm6350.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/clk/qcom/camcc-sm6350.c b/drivers/clk/qcom/camcc-sm6350.c index f6634cc8663ef..418668184ec35 100644 --- a/drivers/clk/qcom/camcc-sm6350.c +++ b/drivers/clk/qcom/camcc-sm6350.c @@ -1694,6 +1694,9 @@ static struct clk_branch camcc_sys_tmr_clk = { static struct gdsc bps_gdsc = { .gdscr = 0x6004, + .en_rest_wait_val = 0x2, + .en_few_wait_val = 0x2, + .clk_dis_wait_val = 0xf, .pd = { .name = "bps_gdsc", }, @@ -1703,6 +1706,9 @@ static struct gdsc bps_gdsc = { static struct gdsc ipe_0_gdsc = { .gdscr = 0x7004, + .en_rest_wait_val = 0x2, + .en_few_wait_val = 0x2, + .clk_dis_wait_val = 0xf, .pd = { .name = "ipe_0_gdsc", }, @@ -1712,6 +1718,9 @@ static struct gdsc ipe_0_gdsc = { static struct gdsc ife_0_gdsc = { .gdscr = 0x9004, + .en_rest_wait_val = 0x2, + .en_few_wait_val = 0x2, + .clk_dis_wait_val = 0xf, .pd = { .name = "ife_0_gdsc", }, @@ -1720,6 +1729,9 @@ static struct gdsc ife_0_gdsc = { static struct gdsc ife_1_gdsc = { .gdscr = 0xa004, + .en_rest_wait_val = 0x2, + .en_few_wait_val = 0x2, + .clk_dis_wait_val = 0xf, .pd = { .name = "ife_1_gdsc", }, @@ -1728,6 +1740,9 @@ static struct gdsc ife_1_gdsc = { static struct gdsc ife_2_gdsc = { .gdscr = 0xb004, + .en_rest_wait_val = 0x2, + .en_few_wait_val = 0x2, + .clk_dis_wait_val = 0xf, .pd = { .name = "ife_2_gdsc", }, @@ -1736,6 +1751,9 @@ static struct gdsc ife_2_gdsc = { static struct gdsc titan_top_gdsc = { .gdscr = 0x14004, + .en_rest_wait_val = 0x2, + .en_few_wait_val = 0x2, + .clk_dis_wait_val = 0xf, .pd = { .name = "titan_top_gdsc", }, -- GitLab From a2874b73fdaadab94a9b24140b6e80c6fbeb10c9 Mon Sep 17 00:00:00 2001 From: Luca Weiss Date: Fri, 25 Apr 2025 14:12:56 +0200 Subject: [PATCH 0857/2211] clk: qcom: dispcc-sm6350: Add *_wait_val values for GDSCs [ Upstream commit 673989d27123618afab56df1143a75454178b4ae ] Compared to the msm-4.19 driver the mainline GDSC driver always sets the bits for en_rest, en_few & clk_dis, and if those values are not set per-GDSC in the respective driver then the default value from the GDSC driver is used. The downstream driver only conditionally sets clk_dis_wait_val if qcom,clk-dis-wait-val is given in devicetree. Correct this situation by explicitly setting those values. For all GDSCs the reset value of those bits are used. Fixes: 837519775f1d ("clk: qcom: Add display clock controller driver for SM6350") Signed-off-by: Luca Weiss Reviewed-by: Taniya Das Link: https://lore.kernel.org/r/20250425-sm6350-gdsc-val-v1-2-1f252d9c5e4e@fairphone.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/clk/qcom/dispcc-sm6350.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/clk/qcom/dispcc-sm6350.c b/drivers/clk/qcom/dispcc-sm6350.c index 2bc6b5f99f572..d52fd4b49a02f 100644 --- a/drivers/clk/qcom/dispcc-sm6350.c +++ b/drivers/clk/qcom/dispcc-sm6350.c @@ -680,6 +680,9 @@ static struct clk_branch disp_cc_xo_clk = { static struct gdsc mdss_gdsc = { .gdscr = 0x1004, + .en_rest_wait_val = 0x2, + .en_few_wait_val = 0x2, + .clk_dis_wait_val = 0xf, .pd = { .name = "mdss_gdsc", }, -- GitLab From 45e1ff1284ac2f84453e9f34d52ac8eb10177fd7 Mon Sep 17 00:00:00 2001 From: Luca Weiss Date: Fri, 25 Apr 2025 14:12:57 +0200 Subject: [PATCH 0858/2211] clk: qcom: gcc-sm6350: Add *_wait_val values for GDSCs [ Upstream commit afdfd829a99e467869e3ca1955fb6c6e337c340a ] Compared to the msm-4.19 driver the mainline GDSC driver always sets the bits for en_rest, en_few & clk_dis, and if those values are not set per-GDSC in the respective driver then the default value from the GDSC driver is used. The downstream driver only conditionally sets clk_dis_wait_val if qcom,clk-dis-wait-val is given in devicetree. Correct this situation by explicitly setting those values. For all GDSCs the reset value of those bits are used. Fixes: 131abae905df ("clk: qcom: Add SM6350 GCC driver") Signed-off-by: Luca Weiss Reviewed-by: Taniya Das Link: https://lore.kernel.org/r/20250425-sm6350-gdsc-val-v1-3-1f252d9c5e4e@fairphone.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/clk/qcom/gcc-sm6350.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/clk/qcom/gcc-sm6350.c b/drivers/clk/qcom/gcc-sm6350.c index 74346dc026068..a4d6dff9d0f7f 100644 --- a/drivers/clk/qcom/gcc-sm6350.c +++ b/drivers/clk/qcom/gcc-sm6350.c @@ -2320,6 +2320,9 @@ static struct clk_branch gcc_video_xo_clk = { static struct gdsc usb30_prim_gdsc = { .gdscr = 0x1a004, + .en_rest_wait_val = 0x2, + .en_few_wait_val = 0x2, + .clk_dis_wait_val = 0xf, .pd = { .name = "usb30_prim_gdsc", }, @@ -2328,6 +2331,9 @@ static struct gdsc usb30_prim_gdsc = { static struct gdsc ufs_phy_gdsc = { .gdscr = 0x3a004, + .en_rest_wait_val = 0x2, + .en_few_wait_val = 0x2, + .clk_dis_wait_val = 0xf, .pd = { .name = "ufs_phy_gdsc", }, -- GitLab From 41c5158d36a519fda2236c4c979ae8588b7d58b7 Mon Sep 17 00:00:00 2001 From: Luca Weiss Date: Fri, 25 Apr 2025 14:12:58 +0200 Subject: [PATCH 0859/2211] clk: qcom: gpucc-sm6350: Add *_wait_val values for GDSCs [ Upstream commit d988b0b866c2aeb23aa74022b5bbd463165a7a33 ] Compared to the msm-4.19 driver the mainline GDSC driver always sets the bits for en_rest, en_few & clk_dis, and if those values are not set per-GDSC in the respective driver then the default value from the GDSC driver is used. The downstream driver only conditionally sets clk_dis_wait_val if qcom,clk-dis-wait-val is given in devicetree. Correct this situation by explicitly setting those values. For all GDSCs the reset value of those bits are used, with the exception of gpu_cx_gdsc which has an explicit value (qcom,clk-dis-wait-val = <8>). Fixes: 013804a727a0 ("clk: qcom: Add GPU clock controller driver for SM6350") Signed-off-by: Luca Weiss Reviewed-by: Taniya Das Link: https://lore.kernel.org/r/20250425-sm6350-gdsc-val-v1-4-1f252d9c5e4e@fairphone.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/clk/qcom/gpucc-sm6350.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/clk/qcom/gpucc-sm6350.c b/drivers/clk/qcom/gpucc-sm6350.c index 1e12ad8948dbd..644bdc41892c6 100644 --- a/drivers/clk/qcom/gpucc-sm6350.c +++ b/drivers/clk/qcom/gpucc-sm6350.c @@ -412,6 +412,9 @@ static struct clk_branch gpu_cc_gx_vsense_clk = { static struct gdsc gpu_cx_gdsc = { .gdscr = 0x106c, .gds_hw_ctrl = 0x1540, + .en_rest_wait_val = 0x2, + .en_few_wait_val = 0x2, + .clk_dis_wait_val = 0x8, .pd = { .name = "gpu_cx_gdsc", }, @@ -422,6 +425,9 @@ static struct gdsc gpu_cx_gdsc = { static struct gdsc gpu_gx_gdsc = { .gdscr = 0x100c, .clamp_io_ctrl = 0x1508, + .en_rest_wait_val = 0x2, + .en_few_wait_val = 0x2, + .clk_dis_wait_val = 0x2, .pd = { .name = "gpu_gx_gdsc", .power_on = gdsc_gx_do_nothing_enable, -- GitLab From d969194bdae6b814b66a544c62c3aac683deb94c Mon Sep 17 00:00:00 2001 From: YiFei Zhu Date: Mon, 28 Apr 2025 21:15:36 +0000 Subject: [PATCH 0860/2211] bpftool: Fix regression of "bpftool cgroup tree" EINVAL on older kernels [ Upstream commit 43745d11bfd9683abdf08ad7a5cc403d6a9ffd15 ] If cgroup_has_attached_progs queries an attach type not supported by the running kernel, due to the kernel being older than the bpftool build, it would encounter an -EINVAL from BPF_PROG_QUERY syscall. Prior to commit 98b303c9bf05 ("bpftool: Query only cgroup-related attach types"), this EINVAL would be ignored by the function, allowing the function to only consider supported attach types. The commit changed so that, instead of querying all attach types, only attach types from the array `cgroup_attach_types` is queried. The assumption is that because these are only cgroup attach types, they should all be supported. Unfortunately this assumption may be false when the kernel is older than the bpftool build, where the attach types queried by bpftool is not yet implemented in the kernel. This would result in errors such as: $ bpftool cgroup tree CgroupPath ID AttachType AttachFlags Name Error: can't query bpf programs attached to /sys/fs/cgroup: Invalid argument This patch restores the logic of ignoring EINVAL from prior to that patch. Fixes: 98b303c9bf05 ("bpftool: Query only cgroup-related attach types") Reported-by: Sagarika Sharma Reported-by: Minh-Anh Nguyen Signed-off-by: YiFei Zhu Signed-off-by: Andrii Nakryiko Acked-by: Quentin Monnet Link: https://lore.kernel.org/bpf/20250428211536.1651456-1-zhuyifei@google.com Signed-off-by: Sasha Levin --- tools/bpf/bpftool/cgroup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bpf/bpftool/cgroup.c b/tools/bpf/bpftool/cgroup.c index 9af426d432993..afab728468bf6 100644 --- a/tools/bpf/bpftool/cgroup.c +++ b/tools/bpf/bpftool/cgroup.c @@ -221,7 +221,7 @@ static int cgroup_has_attached_progs(int cgroup_fd) for (i = 0; i < ARRAY_SIZE(cgroup_attach_types); i++) { int count = count_attached_bpf_progs(cgroup_fd, cgroup_attach_types[i]); - if (count < 0) + if (count < 0 && errno != EINVAL) return -1; if (count > 0) { -- GitLab From 0a2712cd24ecfeb520af60f6f859b442c7ab01ff Mon Sep 17 00:00:00 2001 From: Henry Martin Date: Wed, 2 Apr 2025 10:05:13 +0800 Subject: [PATCH 0861/2211] clk: bcm: rpi: Add NULL check in raspberrypi_clk_register() [ Upstream commit 73c46d9a93d071ca69858dea3f569111b03e549e ] devm_kasprintf() returns NULL when memory allocation fails. Currently, raspberrypi_clk_register() does not check for this case, which results in a NULL pointer dereference. Add NULL check after devm_kasprintf() to prevent this issue. Fixes: 93d2725affd6 ("clk: bcm: rpi: Discover the firmware clocks") Signed-off-by: Henry Martin Reviewed-by: Dave Stevenson Link: https://lore.kernel.org/r/20250402020513.42628-1-bsdhenrymartin@gmail.com Reviewed-by: Stefan Wahren Signed-off-by: Stephen Boyd Signed-off-by: Sasha Levin --- drivers/clk/bcm/clk-raspberrypi.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/clk/bcm/clk-raspberrypi.c b/drivers/clk/bcm/clk-raspberrypi.c index a18a8768feb40..6cb26b6e7347d 100644 --- a/drivers/clk/bcm/clk-raspberrypi.c +++ b/drivers/clk/bcm/clk-raspberrypi.c @@ -271,6 +271,8 @@ static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi, init.name = devm_kasprintf(rpi->dev, GFP_KERNEL, "fw-clk-%s", rpi_firmware_clk_names[id]); + if (!init.name) + return ERR_PTR(-ENOMEM); init.ops = &raspberrypi_firmware_clk_ops; init.flags = CLK_GET_RATE_NOCACHE; -- GitLab From a82f49df6bd6de1981ab80a75de7199d07a3c937 Mon Sep 17 00:00:00 2001 From: Ilan Peer Date: Sat, 3 May 2025 22:44:32 +0300 Subject: [PATCH 0862/2211] wifi: iwlfiwi: mvm: Fix the rate reporting [ Upstream commit 8f7561209eda7d6998708f06376e8dd2dc52f3b8 ] The rate validation in mac80211 considers a rate to be valid iff both the rate index and the count are positive. When the rate scaling is managed in the driver and not enough traffic passed to set the actual rate, the driver set the rate to be the optimal rate. However, the rate count is not set and thus the rate is considered not valid. Fix it by setting the count to 1. Fixes: 3e99b4d28219 ("wifi: mac80211: Sanity check tx bitrate if not provided by driver") Signed-off-by: Ilan Peer Reviewed-by: Johannes Berg Signed-off-by: Miri Korenblit Link: https://patch.msgid.link/20250503224232.0d1d1e022d63.I76833c14ba1d66f9bea5c32b25a54d8b36f229ba@changeid Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c index a8c4e354e2ce7..5f8f245804443 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c @@ -2,6 +2,7 @@ /****************************************************************************** * * Copyright(c) 2005 - 2014, 2018 - 2023 Intel Corporation. All rights reserved. + * Copyright(c) 2025 Intel Corporation * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH * Copyright(c) 2016 - 2017 Intel Deutschland GmbH *****************************************************************************/ @@ -2709,6 +2710,7 @@ static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta, optimal_rate); iwl_mvm_hwrate_to_tx_rate_v1(last_ucode_rate, info->band, &txrc->reported_rate); + txrc->reported_rate.count = 1; } spin_unlock_bh(&lq_sta->pers.lock); } -- GitLab From 69a995644a42a3f8e69b4e03a3360c142b7b92f1 Mon Sep 17 00:00:00 2001 From: Hans Zhang <18255117159@163.com> Date: Wed, 7 May 2025 00:31:11 +0800 Subject: [PATCH 0863/2211] efi/libstub: Describe missing 'out' parameter in efi_load_initrd [ Upstream commit c8e1927e7f7d63721e32ec41d27ccb0eb1a1b0fc ] The function efi_load_initrd() had a documentation warning due to the missing description for the 'out' parameter. Add the parameter description to the kernel-doc comment to resolve the warning and improve API documentation. Fixes the following compiler warning: drivers/firmware/efi/libstub/efi-stub-helper.c:611: warning: Function parameter or struct member 'out' not described in 'efi_load_initrd' Fixes: f4dc7fffa987 ("efi: libstub: unify initrd loading between architectures") Signed-off-by: Hans Zhang <18255117159@163.com> Signed-off-by: Ard Biesheuvel Signed-off-by: Sasha Levin --- drivers/firmware/efi/libstub/efi-stub-helper.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c index de659f6a815fd..1ad414da9920a 100644 --- a/drivers/firmware/efi/libstub/efi-stub-helper.c +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c @@ -603,6 +603,7 @@ efi_status_t efi_load_initrd_cmdline(efi_loaded_image_t *image, * @image: EFI loaded image protocol * @soft_limit: preferred address for loading the initrd * @hard_limit: upper limit address for loading the initrd + * @out: pointer to store the address of the initrd table * * Return: status code */ -- GitLab From ec913bc18b45f39b029aec51bb6e2da525e3bd2f Mon Sep 17 00:00:00 2001 From: Luis Gerhorst Date: Thu, 1 May 2025 09:35:52 +0200 Subject: [PATCH 0864/2211] selftests/bpf: Fix caps for __xlated/jited_unpriv [ Upstream commit cf15cdc0f0f39a5c6315200808ec3e3995b0c2d2 ] Currently, __xlated_unpriv and __jited_unpriv do not work because the BPF syscall will overwrite info.jited_prog_len and info.xlated_prog_len with 0 if the process is not bpf_capable(). This bug was not noticed before, because there is no test that actually uses __xlated_unpriv/__jited_unpriv. To resolve this, simply restore the capabilities earlier (but still after loading the program). Adding this here unconditionally is fine because the function first checks that the capabilities were initialized before attempting to restore them. This will be important later when we add tests that check whether a speculation barrier was inserted in the correct location. Signed-off-by: Luis Gerhorst Fixes: 9c9f73391310 ("selftests/bpf: allow checking xlated programs in verifier_* tests") Fixes: 7d743e4c759c ("selftests/bpf: __jited test tag to check disassembly after jit") Acked-by: Kumar Kartikeya Dwivedi Tested-by: Eduard Zingerman Link: https://lore.kernel.org/r/20250501073603.1402960-2-luis.gerhorst@fau.de Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- tools/testing/selftests/bpf/test_loader.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/bpf/test_loader.c b/tools/testing/selftests/bpf/test_loader.c index 3e9b009580d4e..7f69d7b5bd4d4 100644 --- a/tools/testing/selftests/bpf/test_loader.c +++ b/tools/testing/selftests/bpf/test_loader.c @@ -970,6 +970,14 @@ void run_subtest(struct test_loader *tester, emit_verifier_log(tester->log_buf, false /*force*/); validate_msgs(tester->log_buf, &subspec->expect_msgs, emit_verifier_log); + /* Restore capabilities because the kernel will silently ignore requests + * for program info (such as xlated program text) if we are not + * bpf-capable. Also, for some reason test_verifier executes programs + * with all capabilities restored. Do the same here. + */ + if (restore_capabilities(&caps)) + goto tobj_cleanup; + if (subspec->expect_xlated.cnt) { err = get_xlated_program_text(bpf_program__fd(tprog), tester->log_buf, tester->log_buf_sz); @@ -995,12 +1003,6 @@ void run_subtest(struct test_loader *tester, } if (should_do_test_run(spec, subspec)) { - /* For some reason test_verifier executes programs - * with all capabilities restored. Do the same here. - */ - if (restore_capabilities(&caps)) - goto tobj_cleanup; - /* Do bpf_map__attach_struct_ops() for each struct_ops map. * This should trigger bpf_struct_ops->reg callback on kernel side. */ -- GitLab From 4839a4a6ab9a7049ee885a917b135da38cfff9ad Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Wed, 7 May 2025 10:53:06 -0400 Subject: [PATCH 0865/2211] tracing: Rename event_trigger_alloc() to trigger_data_alloc() [ Upstream commit f2947c4b7d0f235621c5daf78aecfbd6e22c05e5 ] The function event_trigger_alloc() creates an event_trigger_data descriptor and states that it needs to be freed via event_trigger_free(). This is incorrect, it needs to be freed by trigger_data_free() as event_trigger_free() adds ref counting. Rename event_trigger_alloc() to trigger_data_alloc() and state that it needs to be freed via trigger_data_free(). This naming convention was introducing bugs. Cc: Masami Hiramatsu Cc: Mark Rutland Cc: Mathieu Desnoyers Cc: Andrew Morton Cc: Tom Zanussi Link: https://lore.kernel.org/20250507145455.776436410@goodmis.org Fixes: 86599dbe2c527 ("tracing: Add helper functions to simplify event_command.parse() callback handling") Signed-off-by: Steven Rostedt (Google) Signed-off-by: Sasha Levin --- kernel/trace/trace.h | 8 +++----- kernel/trace/trace_events_hist.c | 2 +- kernel/trace/trace_events_trigger.c | 16 ++++++++-------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 82da3ac140242..57e1af1d3e6d4 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -1731,6 +1731,9 @@ extern int event_enable_register_trigger(char *glob, extern void event_enable_unregister_trigger(char *glob, struct event_trigger_data *test, struct trace_event_file *file); +extern struct event_trigger_data * +trigger_data_alloc(struct event_command *cmd_ops, char *cmd, char *param, + void *private_data); extern void trigger_data_free(struct event_trigger_data *data); extern int event_trigger_init(struct event_trigger_data *data); extern int trace_event_trigger_enable_disable(struct trace_event_file *file, @@ -1757,11 +1760,6 @@ extern bool event_trigger_check_remove(const char *glob); extern bool event_trigger_empty_param(const char *param); extern int event_trigger_separate_filter(char *param_and_filter, char **param, char **filter, bool param_required); -extern struct event_trigger_data * -event_trigger_alloc(struct event_command *cmd_ops, - char *cmd, - char *param, - void *private_data); extern int event_trigger_parse_num(char *trigger, struct event_trigger_data *trigger_data); extern int event_trigger_set_filter(struct event_command *cmd_ops, diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index c56375848e088..3379e14d38e9b 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -6798,7 +6798,7 @@ static int event_hist_trigger_parse(struct event_command *cmd_ops, return PTR_ERR(hist_data); } - trigger_data = event_trigger_alloc(cmd_ops, cmd, param, hist_data); + trigger_data = trigger_data_alloc(cmd_ops, cmd, param, hist_data); if (!trigger_data) { ret = -ENOMEM; goto out_free; diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c index 27e21488d5741..e85d434f176a0 100644 --- a/kernel/trace/trace_events_trigger.c +++ b/kernel/trace/trace_events_trigger.c @@ -825,7 +825,7 @@ out: } /** - * event_trigger_alloc - allocate and init event_trigger_data for a trigger + * trigger_data_alloc - allocate and init event_trigger_data for a trigger * @cmd_ops: The event_command operations for the trigger * @cmd: The cmd string * @param: The param string @@ -836,14 +836,14 @@ out: * trigger_ops to assign to the event_trigger_data. @private_data can * also be passed in and associated with the event_trigger_data. * - * Use event_trigger_free() to free an event_trigger_data object. + * Use trigger_data_free() to free an event_trigger_data object. * * Return: The trigger_data object success, NULL otherwise */ -struct event_trigger_data *event_trigger_alloc(struct event_command *cmd_ops, - char *cmd, - char *param, - void *private_data) +struct event_trigger_data *trigger_data_alloc(struct event_command *cmd_ops, + char *cmd, + char *param, + void *private_data) { struct event_trigger_data *trigger_data; struct event_trigger_ops *trigger_ops; @@ -1010,7 +1010,7 @@ event_trigger_parse(struct event_command *cmd_ops, return ret; ret = -ENOMEM; - trigger_data = event_trigger_alloc(cmd_ops, cmd, param, file); + trigger_data = trigger_data_alloc(cmd_ops, cmd, param, file); if (!trigger_data) goto out; @@ -1814,7 +1814,7 @@ int event_enable_trigger_parse(struct event_command *cmd_ops, enable_data->enable = enable; enable_data->file = event_enable_file; - trigger_data = event_trigger_alloc(cmd_ops, cmd, param, enable_data); + trigger_data = trigger_data_alloc(cmd_ops, cmd, param, enable_data); if (!trigger_data) { kfree(enable_data); goto out; -- GitLab From 709412b92a7a71bade963306f938a35631b2f53e Mon Sep 17 00:00:00 2001 From: Miaoqian Lin Date: Wed, 7 May 2025 10:53:07 -0400 Subject: [PATCH 0866/2211] tracing: Fix error handling in event_trigger_parse() [ Upstream commit c5dd28e7fb4f63475b50df4f58311df92939d011 ] According to trigger_data_alloc() doc, trigger_data_free() should be used to free an event_trigger_data object. This fixes a mismatch introduced when kzalloc was replaced with trigger_data_alloc without updating the corresponding deallocation calls. Cc: Masami Hiramatsu Cc: Mark Rutland Cc: Andrew Morton Cc: Mathieu Desnoyers Cc: Tom Zanussi Link: https://lore.kernel.org/20250507145455.944453325@goodmis.org Link: https://lore.kernel.org/20250318112737.4174-1-linmq006@gmail.com Fixes: e1f187d09e11 ("tracing: Have existing event_command.parse() implementations use helpers") Signed-off-by: Miaoqian Lin [ SDR: Changed event_trigger_alloc/free() to trigger_data_alloc/free() ] Signed-off-by: Steven Rostedt (Google) Signed-off-by: Sasha Levin --- kernel/trace/trace_events_trigger.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c index e85d434f176a0..d5dbda9b0e4b0 100644 --- a/kernel/trace/trace_events_trigger.c +++ b/kernel/trace/trace_events_trigger.c @@ -1016,7 +1016,7 @@ event_trigger_parse(struct event_command *cmd_ops, if (remove) { event_trigger_unregister(cmd_ops, file, glob+1, trigger_data); - kfree(trigger_data); + trigger_data_free(trigger_data); ret = 0; goto out; } @@ -1043,7 +1043,7 @@ event_trigger_parse(struct event_command *cmd_ops, out_free: event_trigger_reset_filter(cmd_ops, trigger_data); - kfree(trigger_data); + trigger_data_free(trigger_data); goto out; } -- GitLab From 64f8f2a93358145d8dde73d67d8144ab1d4c95eb Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Wed, 30 Apr 2025 11:05:40 +0300 Subject: [PATCH 0867/2211] of: unittest: Unlock on error in unittest_data_add() [ Upstream commit 493e6cb63a21e9f009dc4c209fd311f2bb777656 ] The of_overlay_mutex_unlock() was accidentally deleted if "of_root" is NULL. Change this to a goto unlock. Fixes: d1eabd218ede ("of: unittest: treat missing of_root as error instead of fixing up") Signed-off-by: Dan Carpenter Reviewed-by: Stephen Boyd Link: https://lore.kernel.org/r/aBHZ1DvXiBcZkWmk@stanley.mountain Signed-off-by: Rob Herring (Arm) Signed-off-by: Sasha Levin --- drivers/of/unittest.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c index 576e9beefc7c8..9a72f75e5c2d8 100644 --- a/drivers/of/unittest.c +++ b/drivers/of/unittest.c @@ -1916,15 +1916,16 @@ static int __init unittest_data_add(void) rc = of_resolve_phandles(unittest_data_node); if (rc) { pr_err("%s: Failed to resolve phandles (rc=%i)\n", __func__, rc); - of_overlay_mutex_unlock(); - return -EINVAL; + rc = -EINVAL; + goto unlock; } /* attach the sub-tree to live tree */ if (!of_root) { pr_warn("%s: no live tree to attach sub-tree\n", __func__); kfree(unittest_data); - return -ENODEV; + rc = -ENODEV; + goto unlock; } EXPECT_BEGIN(KERN_INFO, @@ -1943,9 +1944,10 @@ static int __init unittest_data_add(void) EXPECT_END(KERN_INFO, "Duplicate name in testcase-data, renamed to \"duplicate-name#1\""); +unlock: of_overlay_mutex_unlock(); - return 0; + return rc; } #ifdef CONFIG_OF_OVERLAY -- GitLab From c13e3174991cb1aa9d48dfd4f28591e0254b9fe1 Mon Sep 17 00:00:00 2001 From: Jiayuan Chen Date: Fri, 25 Apr 2025 13:59:57 +0800 Subject: [PATCH 0868/2211] ktls, sockmap: Fix missing uncharge operation [ Upstream commit 79f0c39ae7d3dc628c01b02f23ca5d01f9875040 ] When we specify apply_bytes, we divide the msg into multiple segments, each with a length of 'send', and every time we send this part of the data using tcp_bpf_sendmsg_redir(), we use sk_msg_return_zero() to uncharge the memory of the specified 'send' size. However, if the first segment of data fails to send, for example, the peer's buffer is full, we need to release all of the msg. When releasing the msg, we haven't uncharged the memory of the subsequent segments. This modification does not make significant logical changes, but only fills in the missing uncharge places. This issue has existed all along, until it was exposed after we added the apply test in test_sockmap: commit 3448ad23b34e ("selftests/bpf: Add apply_bytes test to test_txmsg_redir_wait_sndmem in test_sockmap") Fixes: d3b18ad31f93 ("tls: add bpf support to sk_msg handling") Reported-by: Cong Wang Closes: https://lore.kernel.org/bpf/aAmIi0vlycHtbXeb@pop-os.localdomain/T/#t Signed-off-by: Jiayuan Chen Signed-off-by: Martin KaFai Lau Acked-by: John Fastabend Reviewed-by: Cong Wang Link: https://lore.kernel.org/r/20250425060015.6968-2-jiayuan.chen@linux.dev Signed-off-by: Sasha Levin --- net/tls/tls_sw.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index b3cae4dd4f499..8fb5925f2389e 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -908,6 +908,13 @@ more_data: &msg_redir, send, flags); lock_sock(sk); if (err < 0) { + /* Regardless of whether the data represented by + * msg_redir is sent successfully, we have already + * uncharged it via sk_msg_return_zero(). The + * msg->sg.size represents the remaining unprocessed + * data, which needs to be uncharged here. + */ + sk_mem_uncharge(sk, msg->sg.size); *copied -= sk_msg_free_nocharge(sk, &msg_redir); msg->sg.size = 0; } -- GitLab From b7384eab87850bade34faf479611dde5d390d5be Mon Sep 17 00:00:00 2001 From: Anton Protopopov Date: Sat, 10 May 2025 18:20:11 +0000 Subject: [PATCH 0869/2211] libbpf: Use proper errno value in nlattr [ Upstream commit fd5fd538a1f4b34cee6823ba0ddda2f7a55aca96 ] Return value of the validate_nla() function can be propagated all the way up to users of libbpf API. In case of error this libbpf version of validate_nla returns -1 which will be seen as -EPERM from user's point of view. Instead, return a more reasonable -EINVAL. Fixes: bbf48c18ee0c ("libbpf: add error reporting in XDP") Suggested-by: Andrii Nakryiko Signed-off-by: Anton Protopopov Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250510182011.2246631-1-a.s.protopopov@gmail.com Signed-off-by: Sasha Levin --- tools/lib/bpf/nlattr.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/tools/lib/bpf/nlattr.c b/tools/lib/bpf/nlattr.c index 975e265eab3bf..06663f9ea581f 100644 --- a/tools/lib/bpf/nlattr.c +++ b/tools/lib/bpf/nlattr.c @@ -63,16 +63,16 @@ static int validate_nla(struct nlattr *nla, int maxtype, minlen = nla_attr_minlen[pt->type]; if (libbpf_nla_len(nla) < minlen) - return -1; + return -EINVAL; if (pt->maxlen && libbpf_nla_len(nla) > pt->maxlen) - return -1; + return -EINVAL; if (pt->type == LIBBPF_NLA_STRING) { char *data = libbpf_nla_data(nla); if (data[libbpf_nla_len(nla) - 1] != '\0') - return -1; + return -EINVAL; } return 0; @@ -118,19 +118,18 @@ int libbpf_nla_parse(struct nlattr *tb[], int maxtype, struct nlattr *head, if (policy) { err = validate_nla(nla, maxtype, policy); if (err < 0) - goto errout; + return err; } - if (tb[type]) + if (tb[type]) { pr_warn("Attribute of type %#x found multiple times in message, " "previous attribute is being ignored.\n", type); + } tb[type] = nla; } - err = 0; -errout: - return err; + return 0; } /** -- GitLab From e02e12d6a7ab76c83849a4122785650dc7edef65 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Thu, 8 May 2025 23:08:07 +0300 Subject: [PATCH 0870/2211] pinctrl: at91: Fix possible out-of-boundary access [ Upstream commit 762ef7d1e6eefad9896560bfcb9bcf7f1b6df9c1 ] at91_gpio_probe() doesn't check that given OF alias is not available or something went wrong when trying to get it. This might have consequences when accessing gpio_chips array with that value as an index. Note, that BUG() can be compiled out and hence won't actually perform the required checks. Fixes: 6732ae5cb47c ("ARM: at91: add pinctrl support") Signed-off-by: Andy Shevchenko Closes: https://lore.kernel.org/r/202505052343.UHF1Zo93-lkp@intel.com/ Link: https://lore.kernel.org/20250508200807.1384558-1-andriy.shevchenko@linux.intel.com Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/pinctrl-at91.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index 93ab277d9943c..fbe74e4ef320c 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c @@ -1819,12 +1819,16 @@ static int at91_gpio_probe(struct platform_device *pdev) struct at91_gpio_chip *at91_chip = NULL; struct gpio_chip *chip; struct pinctrl_gpio_range *range; + int alias_idx; int ret = 0; int irq, i; - int alias_idx = of_alias_get_id(np, "gpio"); uint32_t ngpio; char **names; + alias_idx = of_alias_get_id(np, "gpio"); + if (alias_idx < 0) + return alias_idx; + BUG_ON(alias_idx >= ARRAY_SIZE(gpio_chips)); if (gpio_chips[alias_idx]) return dev_err_probe(dev, -EBUSY, "%d slot is occupied.\n", alias_idx); -- GitLab From c98cdf6795a36bca163ebb40411fef1687b9eb13 Mon Sep 17 00:00:00 2001 From: Tao Chen Date: Tue, 13 May 2025 12:27:47 +0800 Subject: [PATCH 0871/2211] bpf: Fix WARN() in get_bpf_raw_tp_regs [ Upstream commit 3880cdbed1c4607e378f58fa924c5d6df900d1d3 ] syzkaller reported an issue: WARNING: CPU: 3 PID: 5971 at kernel/trace/bpf_trace.c:1861 get_bpf_raw_tp_regs+0xa4/0x100 kernel/trace/bpf_trace.c:1861 Modules linked in: CPU: 3 UID: 0 PID: 5971 Comm: syz-executor205 Not tainted 6.15.0-rc5-syzkaller-00038-g707df3375124 #0 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 RIP: 0010:get_bpf_raw_tp_regs+0xa4/0x100 kernel/trace/bpf_trace.c:1861 RSP: 0018:ffffc90003636fa8 EFLAGS: 00010293 RAX: 0000000000000000 RBX: 0000000000000003 RCX: ffffffff81c6bc4c RDX: ffff888032efc880 RSI: ffffffff81c6bc83 RDI: 0000000000000005 RBP: ffff88806a730860 R08: 0000000000000005 R09: 0000000000000003 R10: 0000000000000004 R11: 0000000000000000 R12: 0000000000000004 R13: 0000000000000001 R14: ffffc90003637008 R15: 0000000000000900 FS: 0000000000000000(0000) GS:ffff8880d6cdf000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f7baee09130 CR3: 0000000029f5a000 CR4: 0000000000352ef0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: ____bpf_get_stack_raw_tp kernel/trace/bpf_trace.c:1934 [inline] bpf_get_stack_raw_tp+0x24/0x160 kernel/trace/bpf_trace.c:1931 bpf_prog_ec3b2eefa702d8d3+0x43/0x47 bpf_dispatcher_nop_func include/linux/bpf.h:1316 [inline] __bpf_prog_run include/linux/filter.h:718 [inline] bpf_prog_run include/linux/filter.h:725 [inline] __bpf_trace_run kernel/trace/bpf_trace.c:2363 [inline] bpf_trace_run3+0x23f/0x5a0 kernel/trace/bpf_trace.c:2405 __bpf_trace_mmap_lock_acquire_returned+0xfc/0x140 include/trace/events/mmap_lock.h:47 __traceiter_mmap_lock_acquire_returned+0x79/0xc0 include/trace/events/mmap_lock.h:47 __do_trace_mmap_lock_acquire_returned include/trace/events/mmap_lock.h:47 [inline] trace_mmap_lock_acquire_returned include/trace/events/mmap_lock.h:47 [inline] __mmap_lock_do_trace_acquire_returned+0x138/0x1f0 mm/mmap_lock.c:35 __mmap_lock_trace_acquire_returned include/linux/mmap_lock.h:36 [inline] mmap_read_trylock include/linux/mmap_lock.h:204 [inline] stack_map_get_build_id_offset+0x535/0x6f0 kernel/bpf/stackmap.c:157 __bpf_get_stack+0x307/0xa10 kernel/bpf/stackmap.c:483 ____bpf_get_stack kernel/bpf/stackmap.c:499 [inline] bpf_get_stack+0x32/0x40 kernel/bpf/stackmap.c:496 ____bpf_get_stack_raw_tp kernel/trace/bpf_trace.c:1941 [inline] bpf_get_stack_raw_tp+0x124/0x160 kernel/trace/bpf_trace.c:1931 bpf_prog_ec3b2eefa702d8d3+0x43/0x47 Tracepoint like trace_mmap_lock_acquire_returned may cause nested call as the corner case show above, which will be resolved with more general method in the future. As a result, WARN_ON_ONCE will be triggered. As Alexei suggested, remove the WARN_ON_ONCE first. Fixes: 9594dc3c7e71 ("bpf: fix nested bpf tracepoints with per-cpu data") Reported-by: syzbot+45b0c89a0fc7ae8dbadc@syzkaller.appspotmail.com Suggested-by: Alexei Starovoitov Signed-off-by: Tao Chen Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250513042747.757042-1-chen.dylane@linux.dev Closes: https://lore.kernel.org/bpf/8bc2554d-1052-4922-8832-e0078a033e1d@gmail.com Signed-off-by: Sasha Levin --- kernel/trace/bpf_trace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 042263e739e29..66075e86b691c 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -1828,7 +1828,7 @@ static struct pt_regs *get_bpf_raw_tp_regs(void) struct bpf_raw_tp_regs *tp_regs = this_cpu_ptr(&bpf_raw_tp_regs); int nest_level = this_cpu_inc_return(bpf_raw_tp_nest_level); - if (WARN_ON_ONCE(nest_level > ARRAY_SIZE(tp_regs->regs))) { + if (nest_level > ARRAY_SIZE(tp_regs->regs)) { this_cpu_dec(bpf_raw_tp_nest_level); return ERR_PTR(-EBUSY); } -- GitLab From e660e75f845fe565828169c3b75b13d60630e848 Mon Sep 17 00:00:00 2001 From: "Rob Herring (Arm)" Date: Wed, 7 May 2025 10:42:31 -0500 Subject: [PATCH 0872/2211] dt-bindings: soc: fsl,qman-fqd: Fix reserved-memory.yaml reference [ Upstream commit 1090c38bbfd9ab7f22830c0e8a5c605e7d4ef084 ] The reserved-memory.yaml reference needs the full path. No warnings were generated because the example has the wrong compatible string, so fix that too. Fixes: 304a90c4f75d ("dt-bindings: soc: fsl: Convert q(b)man-* to yaml format") Acked-by: Conor Dooley Link: https://lore.kernel.org/r/20250507154231.1590634-1-robh@kernel.org Signed-off-by: Rob Herring (Arm) Signed-off-by: Sasha Levin --- Documentation/devicetree/bindings/soc/fsl/fsl,qman-fqd.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/soc/fsl/fsl,qman-fqd.yaml b/Documentation/devicetree/bindings/soc/fsl/fsl,qman-fqd.yaml index de0b4ae740ff2..a975bce599750 100644 --- a/Documentation/devicetree/bindings/soc/fsl/fsl,qman-fqd.yaml +++ b/Documentation/devicetree/bindings/soc/fsl/fsl,qman-fqd.yaml @@ -50,7 +50,7 @@ required: - compatible allOf: - - $ref: reserved-memory.yaml + - $ref: /schemas/reserved-memory/reserved-memory.yaml unevaluatedProperties: false @@ -61,7 +61,7 @@ examples: #size-cells = <2>; qman-fqd { - compatible = "shared-dma-pool"; + compatible = "fsl,qman-fqd"; size = <0 0x400000>; alignment = <0 0x400000>; no-map; -- GitLab From d32f9927f40019d2bdfe6dd762d15fd79c023352 Mon Sep 17 00:00:00 2001 From: Vincent Knecht Date: Mon, 14 Apr 2025 18:45:12 +0200 Subject: [PATCH 0873/2211] clk: qcom: gcc-msm8939: Fix mclk0 & mclk1 for 24 MHz [ Upstream commit 9e7acf70cf6aa7b22f67d911f50a8cd510e8fb00 ] Fix mclk0 & mclk1 parent map to use correct GPLL6 configuration and freq_tbl to use GPLL6 instead of GPLL0 so that they tick at 24 MHz. Fixes: 1664014e4679 ("clk: qcom: gcc-msm8939: Add MSM8939 Generic Clock Controller") Suggested-by: Stephan Gerhold Reviewed-by: Konrad Dybcio Reviewed-by: Bryan O'Donoghue Signed-off-by: Vincent Knecht Link: https://lore.kernel.org/r/20250414-gcc-msm8939-fixes-mclk-v2-resend2-v2-1-5ddcf572a6de@mailoo.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/clk/qcom/gcc-msm8939.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/clk/qcom/gcc-msm8939.c b/drivers/clk/qcom/gcc-msm8939.c index 7431c9a65044f..45193b3d714ba 100644 --- a/drivers/clk/qcom/gcc-msm8939.c +++ b/drivers/clk/qcom/gcc-msm8939.c @@ -432,7 +432,7 @@ static const struct parent_map gcc_xo_gpll0_gpll1a_gpll6_sleep_map[] = { { P_XO, 0 }, { P_GPLL0, 1 }, { P_GPLL1_AUX, 2 }, - { P_GPLL6, 2 }, + { P_GPLL6, 3 }, { P_SLEEP_CLK, 6 }, }; @@ -1113,7 +1113,7 @@ static struct clk_rcg2 jpeg0_clk_src = { }; static const struct freq_tbl ftbl_gcc_camss_mclk0_1_clk[] = { - F(24000000, P_GPLL0, 1, 1, 45), + F(24000000, P_GPLL6, 1, 1, 45), F(66670000, P_GPLL0, 12, 0, 0), { } }; -- GitLab From 78a327ef0a7898d3d3dc099c6d18edbf3258e876 Mon Sep 17 00:00:00 2001 From: Ilya Leoshkevich Date: Mon, 12 May 2025 14:26:15 +0200 Subject: [PATCH 0874/2211] s390/bpf: Store backchain even for leaf progs [ Upstream commit 5f55f2168432298f5a55294831ab6a76a10cb3c3 ] Currently a crash in a leaf prog (caused by a bug) produces the following call trace: [<000003ff600ebf00>] bpf_prog_6df0139e1fbf2789_fentry+0x20/0x78 [<0000000000000000>] 0x0 This is because leaf progs do not store backchain. Fix by making all progs do it. This is what GCC and Clang-generated code does as well. Now the call trace looks like this: [<000003ff600eb0f2>] bpf_prog_6df0139e1fbf2789_fentry+0x2a/0x80 [<000003ff600ed096>] bpf_trampoline_201863462940+0x96/0xf4 [<000003ff600e3a40>] bpf_prog_05f379658fdd72f2_classifier_0+0x58/0xc0 [<000003ffe0aef070>] bpf_test_run+0x210/0x390 [<000003ffe0af0dc2>] bpf_prog_test_run_skb+0x25a/0x668 [<000003ffe038a90e>] __sys_bpf+0xa46/0xdb0 [<000003ffe038ad0c>] __s390x_sys_bpf+0x44/0x50 [<000003ffe0defea8>] __do_syscall+0x150/0x280 [<000003ffe0e01d5c>] system_call+0x74/0x98 Fixes: 054623105728 ("s390/bpf: Add s390x eBPF JIT compiler backend") Signed-off-by: Ilya Leoshkevich Link: https://lore.kernel.org/r/20250512122717.54878-1-iii@linux.ibm.com Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- arch/s390/net/bpf_jit_comp.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c index 9d440a0b729eb..64bb8b71013ae 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c @@ -605,17 +605,15 @@ static void bpf_jit_prologue(struct bpf_jit *jit, struct bpf_prog *fp, } /* Setup stack and backchain */ if (is_first_pass(jit) || (jit->seen & SEEN_STACK)) { - if (is_first_pass(jit) || (jit->seen & SEEN_FUNC)) - /* lgr %w1,%r15 (backchain) */ - EMIT4(0xb9040000, REG_W1, REG_15); + /* lgr %w1,%r15 (backchain) */ + EMIT4(0xb9040000, REG_W1, REG_15); /* la %bfp,STK_160_UNUSED(%r15) (BPF frame pointer) */ EMIT4_DISP(0x41000000, BPF_REG_FP, REG_15, STK_160_UNUSED); /* aghi %r15,-STK_OFF */ EMIT4_IMM(0xa70b0000, REG_15, -(STK_OFF + stack_depth)); - if (is_first_pass(jit) || (jit->seen & SEEN_FUNC)) - /* stg %w1,152(%r15) (backchain) */ - EMIT6_DISP_LH(0xe3000000, 0x0024, REG_W1, REG_0, - REG_15, 152); + /* stg %w1,152(%r15) (backchain) */ + EMIT6_DISP_LH(0xe3000000, 0x0024, REG_W1, REG_0, + REG_15, 152); } } -- GitLab From 8ffad7be09c5bae61013f364701ec3f13dbd8612 Mon Sep 17 00:00:00 2001 From: Ping-Ke Shih Date: Fri, 9 May 2025 09:34:33 +0800 Subject: [PATCH 0875/2211] wifi: rtw89: pci: enlarge retry times of RX tag to 1000 [ Upstream commit dda27a47c036d981ec664ac57e044a21035ffe12 ] RX tag is sequence number to ensure RX DMA is complete. On platform Gigabyte X870 AORUS ELITE WIFI7, sometimes it needs longer retry times to complete RX DMA, or driver throws warnings and connection drops: rtw89_8922ae 0000:07:00.0: failed to update 162 RXBD info: -11 rtw89_8922ae 0000:07:00.0: failed to update 163 RXBD info: -11 rtw89_8922ae 0000:07:00.0: failed to update 32 RXBD info: -11 rtw89_8922ae 0000:07:00.0: failed to release TX skbs Fixes: 0bc7d1d4e63c ("wifi: rtw89: pci: validate RX tag for RXQ and RPQ") Reported-by: Samuel Reyes Closes: https://lore.kernel.org/linux-wireless/f4355539f3ac46bbaf9c586d059a8cbb@realtek.com/T/#t Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250509013433.7573-1-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw89/pci.c b/drivers/net/wireless/realtek/rtw89/pci.c index 0ac84f968994b..e203d3b2a8274 100644 --- a/drivers/net/wireless/realtek/rtw89/pci.c +++ b/drivers/net/wireless/realtek/rtw89/pci.c @@ -228,7 +228,7 @@ int rtw89_pci_sync_skb_for_device_and_validate_rx_info(struct rtw89_dev *rtwdev, struct sk_buff *skb) { struct rtw89_pci_rx_info *rx_info = RTW89_PCI_RX_SKB_CB(skb); - int rx_tag_retry = 100; + int rx_tag_retry = 1000; int ret; do { -- GitLab From c13255389499275bc5489a0b5b7940ccea3aef04 Mon Sep 17 00:00:00 2001 From: Alexey Kodanev Date: Tue, 13 May 2025 12:13:04 +0000 Subject: [PATCH 0876/2211] wifi: rtw88: fix the 'para' buffer size to avoid reading out of bounds [ Upstream commit 4c2c372de2e108319236203cce6de44d70ae15cd ] Set the size to 6 instead of 2, since 'para' array is passed to 'rtw_fw_bt_wifi_control(rtwdev, para[0], ¶[1])', which reads 5 bytes: void rtw_fw_bt_wifi_control(struct rtw_dev *rtwdev, u8 op_code, u8 *data) { ... SET_BT_WIFI_CONTROL_DATA1(h2c_pkt, *data); SET_BT_WIFI_CONTROL_DATA2(h2c_pkt, *(data + 1)); ... SET_BT_WIFI_CONTROL_DATA5(h2c_pkt, *(data + 4)); Detected using the static analysis tool - Svace. Fixes: 4136214f7c46 ("rtw88: add BT co-existence support") Signed-off-by: Alexey Kodanev Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250513121304.124141-1-aleksei.kodanev@bell-sw.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw88/coex.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c index a99776af56c27..c476e65c4d71e 100644 --- a/drivers/net/wireless/realtek/rtw88/coex.c +++ b/drivers/net/wireless/realtek/rtw88/coex.c @@ -309,7 +309,7 @@ static void rtw_coex_tdma_timer_base(struct rtw_dev *rtwdev, u8 type) { struct rtw_coex *coex = &rtwdev->coex; struct rtw_coex_stat *coex_stat = &coex->stat; - u8 para[2] = {0}; + u8 para[6] = {}; u8 times; u16 tbtt_interval = coex_stat->wl_beacon_interval; -- GitLab From e966a3c01ca16dfa64329fec81222e9119fcf307 Mon Sep 17 00:00:00 2001 From: Chin-Yen Lee Date: Tue, 13 May 2025 20:52:03 +0800 Subject: [PATCH 0877/2211] wifi: rtw89: fix firmware scan delay unit for WiFi 6 chips [ Upstream commit 3cc35394fac15d533639c9c9e42f28d28936a4a0 ] The scan delay unit of firmware command for WiFi 6 chips is microsecond, but is wrong set now and lead to abnormal work for net-detect. Correct the unit to avoid the error. Fixes: e99dd80c8a18 ("wifi: rtw89: wow: add delay option for net-detect") Signed-off-by: Chin-Yen Lee Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250513125203.6858-1-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/fw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c index e5c90050e7115..7dbce3b10a7de 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.c +++ b/drivers/net/wireless/realtek/rtw89/fw.c @@ -5016,7 +5016,7 @@ int rtw89_fw_h2c_scan_list_offload_be(struct rtw89_dev *rtwdev, int ch_num, return 0; } -#define RTW89_SCAN_DELAY_TSF_UNIT 104800 +#define RTW89_SCAN_DELAY_TSF_UNIT 1000000 int rtw89_fw_h2c_scan_offload_ax(struct rtw89_dev *rtwdev, struct rtw89_scan_option *option, struct rtw89_vif_link *rtwvif_link, -- GitLab From b4f6605dc276990e971162e353e99fe75d3d0c48 Mon Sep 17 00:00:00 2001 From: Rolf Eike Beer Date: Mon, 12 May 2025 15:10:44 +0200 Subject: [PATCH 0878/2211] iommu: remove duplicate selection of DMAR_TABLE [ Upstream commit 9548feff840a05d61783e6316d08ed37e115f3b1 ] This is already done in intel/Kconfig. Fixes: 70bad345e622 ("iommu: Fix compilation without CONFIG_IOMMU_INTEL") Signed-off-by: Rolf Eike Beer Reviewed-by: Lu Baolu Link: https://lore.kernel.org/r/2232605.Mh6RI2rZIc@devpool92.emlix.com Signed-off-by: Joerg Roedel Signed-off-by: Sasha Levin --- drivers/iommu/Kconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig index b3aa1f5d53218..1469ad0794f28 100644 --- a/drivers/iommu/Kconfig +++ b/drivers/iommu/Kconfig @@ -199,7 +199,6 @@ source "drivers/iommu/iommufd/Kconfig" config IRQ_REMAP bool "Support for Interrupt Remapping" depends on X86_64 && X86_IO_APIC && PCI_MSI && ACPI - select DMAR_TABLE if INTEL_IOMMU help Supports Interrupt remapping for IO-APIC and MSI devices. To use x2apic mode in the CPU's which support x2APIC enhancements or -- GitLab From 3a392f874ac83a77ad0e53eb8aafdbeb787c9298 Mon Sep 17 00:00:00 2001 From: Rajat Soni Date: Wed, 30 Apr 2025 10:25:38 +0530 Subject: [PATCH 0879/2211] wifi: ath12k: fix memory leak in ath12k_service_ready_ext_event [ Upstream commit 89142d34d5602c7447827beb181fa06eb08b9d5c ] Currently, in ath12k_service_ready_ext_event(), svc_rdy_ext.mac_phy_caps is not freed in the failure case, causing a memory leak. The following trace is observed in kmemleak: unreferenced object 0xffff8b3eb5789c00 (size 1024): comm "softirq", pid 0, jiffies 4294942577 hex dump (first 32 bytes): 00 00 00 00 01 00 00 00 00 00 00 00 7b 00 00 10 ............{... 01 00 00 00 00 00 00 00 01 00 00 00 1f 38 00 00 .............8.. backtrace (crc 44e1c357): __kmalloc_noprof+0x30b/0x410 ath12k_wmi_mac_phy_caps_parse+0x84/0x100 [ath12k] ath12k_wmi_tlv_iter+0x5e/0x140 [ath12k] ath12k_wmi_svc_rdy_ext_parse+0x308/0x4c0 [ath12k] ath12k_wmi_tlv_iter+0x5e/0x140 [ath12k] ath12k_service_ready_ext_event.isra.0+0x44/0xd0 [ath12k] ath12k_wmi_op_rx+0x2eb/0xd70 [ath12k] ath12k_htc_rx_completion_handler+0x1f4/0x330 [ath12k] ath12k_ce_recv_process_cb+0x218/0x300 [ath12k] ath12k_pci_ce_workqueue+0x1b/0x30 [ath12k] process_one_work+0x219/0x680 bh_worker+0x198/0x1f0 tasklet_action+0x13/0x30 handle_softirqs+0xca/0x460 __irq_exit_rcu+0xbe/0x110 irq_exit_rcu+0x9/0x30 Free svc_rdy_ext.mac_phy_caps in the error case to fix this memory leak. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices") Signed-off-by: Rajat Soni Signed-off-by: Raj Kumar Bhagat Link: https://patch.msgid.link/20250430-wmi-mem-leak-v1-1-fcc9b49c2ddc@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/wmi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c index b2e586811858e..17ac54047f9a7 100644 --- a/drivers/net/wireless/ath/ath12k/wmi.c +++ b/drivers/net/wireless/ath/ath12k/wmi.c @@ -4372,6 +4372,7 @@ static int ath12k_service_ready_ext_event(struct ath12k_base *ab, return 0; err: + kfree(svc_rdy_ext.mac_phy_caps); ath12k_wmi_free_dbring_caps(ab); return ret; } -- GitLab From 884a76e813178778d271fea59783763d32bb7e72 Mon Sep 17 00:00:00 2001 From: Longfang Liu Date: Sat, 10 May 2025 16:11:50 +0800 Subject: [PATCH 0880/2211] hisi_acc_vfio_pci: fix XQE dma address error [ Upstream commit 8bb7170c5a055ea17c6857c256ee73c10ff872eb ] The dma addresses of EQE and AEQE are wrong after migration and results in guest kernel-mode encryption services failure. Comparing the definition of hardware registers, we found that there was an error when the data read from the register was combined into an address. Therefore, the address combination sequence needs to be corrected. Even after fixing the above problem, we still have an issue where the Guest from an old kernel can get migrated to new kernel and may result in wrong data. In order to ensure that the address is correct after migration, if an old magic number is detected, the dma address needs to be updated. Fixes: b0eed085903e ("hisi_acc_vfio_pci: Add support for VFIO live migration") Signed-off-by: Longfang Liu Reviewed-by: Shameer Kolothum Link: https://lore.kernel.org/r/20250510081155.55840-2-liulongfang@huawei.com Signed-off-by: Alex Williamson Signed-off-by: Sasha Levin --- .../vfio/pci/hisilicon/hisi_acc_vfio_pci.c | 41 ++++++++++++++++--- .../vfio/pci/hisilicon/hisi_acc_vfio_pci.h | 14 ++++++- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c index 0d632ba5d2a3c..ec38977336778 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c @@ -350,6 +350,32 @@ static int vf_qm_func_stop(struct hisi_qm *qm) return hisi_qm_mb(qm, QM_MB_CMD_PAUSE_QM, 0, 0, 0); } +static int vf_qm_version_check(struct acc_vf_data *vf_data, struct device *dev) +{ + switch (vf_data->acc_magic) { + case ACC_DEV_MAGIC_V2: + if (vf_data->major_ver != ACC_DRV_MAJOR_VER) { + dev_info(dev, "migration driver version<%u.%u> not match!\n", + vf_data->major_ver, vf_data->minor_ver); + return -EINVAL; + } + break; + case ACC_DEV_MAGIC_V1: + /* Correct dma address */ + vf_data->eqe_dma = vf_data->qm_eqc_dw[QM_XQC_ADDR_HIGH]; + vf_data->eqe_dma <<= QM_XQC_ADDR_OFFSET; + vf_data->eqe_dma |= vf_data->qm_eqc_dw[QM_XQC_ADDR_LOW]; + vf_data->aeqe_dma = vf_data->qm_aeqc_dw[QM_XQC_ADDR_HIGH]; + vf_data->aeqe_dma <<= QM_XQC_ADDR_OFFSET; + vf_data->aeqe_dma |= vf_data->qm_aeqc_dw[QM_XQC_ADDR_LOW]; + break; + default: + return -EINVAL; + } + + return 0; +} + static int vf_qm_check_match(struct hisi_acc_vf_core_device *hisi_acc_vdev, struct hisi_acc_vf_migration_file *migf) { @@ -363,7 +389,8 @@ static int vf_qm_check_match(struct hisi_acc_vf_core_device *hisi_acc_vdev, if (migf->total_length < QM_MATCH_SIZE || hisi_acc_vdev->match_done) return 0; - if (vf_data->acc_magic != ACC_DEV_MAGIC) { + ret = vf_qm_version_check(vf_data, dev); + if (ret) { dev_err(dev, "failed to match ACC_DEV_MAGIC\n"); return -EINVAL; } @@ -418,7 +445,9 @@ static int vf_qm_get_match_data(struct hisi_acc_vf_core_device *hisi_acc_vdev, int vf_id = hisi_acc_vdev->vf_id; int ret; - vf_data->acc_magic = ACC_DEV_MAGIC; + vf_data->acc_magic = ACC_DEV_MAGIC_V2; + vf_data->major_ver = ACC_DRV_MAJOR_VER; + vf_data->minor_ver = ACC_DRV_MINOR_VER; /* Save device id */ vf_data->dev_id = hisi_acc_vdev->vf_dev->device; @@ -516,12 +545,12 @@ static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev, return -EINVAL; /* Every reg is 32 bit, the dma address is 64 bit. */ - vf_data->eqe_dma = vf_data->qm_eqc_dw[1]; + vf_data->eqe_dma = vf_data->qm_eqc_dw[QM_XQC_ADDR_HIGH]; vf_data->eqe_dma <<= QM_XQC_ADDR_OFFSET; - vf_data->eqe_dma |= vf_data->qm_eqc_dw[0]; - vf_data->aeqe_dma = vf_data->qm_aeqc_dw[1]; + vf_data->eqe_dma |= vf_data->qm_eqc_dw[QM_XQC_ADDR_LOW]; + vf_data->aeqe_dma = vf_data->qm_aeqc_dw[QM_XQC_ADDR_HIGH]; vf_data->aeqe_dma <<= QM_XQC_ADDR_OFFSET; - vf_data->aeqe_dma |= vf_data->qm_aeqc_dw[0]; + vf_data->aeqe_dma |= vf_data->qm_aeqc_dw[QM_XQC_ADDR_LOW]; /* Through SQC_BT/CQC_BT to get sqc and cqc address */ ret = qm_get_sqc(vf_qm, &vf_data->sqc_dma); diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h index 5bab46602fad2..465284168906b 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h @@ -38,6 +38,9 @@ #define QM_REG_ADDR_OFFSET 0x0004 #define QM_XQC_ADDR_OFFSET 32U +#define QM_XQC_ADDR_LOW 0x1 +#define QM_XQC_ADDR_HIGH 0x2 + #define QM_VF_AEQ_INT_MASK 0x0004 #define QM_VF_EQ_INT_MASK 0x000c #define QM_IFC_INT_SOURCE_V 0x0020 @@ -49,10 +52,15 @@ #define QM_EQC_DW0 0X8000 #define QM_AEQC_DW0 0X8020 +#define ACC_DRV_MAJOR_VER 1 +#define ACC_DRV_MINOR_VER 0 + +#define ACC_DEV_MAGIC_V1 0XCDCDCDCDFEEDAACC +#define ACC_DEV_MAGIC_V2 0xAACCFEEDDECADEDE + struct acc_vf_data { #define QM_MATCH_SIZE offsetofend(struct acc_vf_data, qm_rsv_state) /* QM match information */ -#define ACC_DEV_MAGIC 0XCDCDCDCDFEEDAACC u64 acc_magic; u32 qp_num; u32 dev_id; @@ -60,7 +68,9 @@ struct acc_vf_data { u32 qp_base; u32 vf_qm_state; /* QM reserved match information */ - u32 qm_rsv_state[3]; + u16 major_ver; + u16 minor_ver; + u32 qm_rsv_state[2]; /* QM RW regs */ u32 aeq_int_mask; -- GitLab From 89729b815292f14fc6281d499e629fd49d056700 Mon Sep 17 00:00:00 2001 From: Longfang Liu Date: Sat, 10 May 2025 16:11:51 +0800 Subject: [PATCH 0881/2211] hisi_acc_vfio_pci: add eq and aeq interruption restore [ Upstream commit 3495cec0787721ba7a9d5c19d0bbb66d182de584 ] In order to ensure that the task packets of the accelerator device are not lost during the migration process, it is necessary to send an EQ and AEQ command to the device after the live migration is completed and to update the completion position of the task queue. Let the device recheck the completed tasks data and if there are uncollected packets, device resend a task completion interrupt to the software. Fixes: b0eed085903e ("hisi_acc_vfio_pci: Add support for VFIO live migration") Signed-off-by: Longfang Liu Reviewed-by: Shameer Kolothum Link: https://lore.kernel.org/r/20250510081155.55840-3-liulongfang@huawei.com Signed-off-by: Alex Williamson Signed-off-by: Sasha Levin --- drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c index ec38977336778..81e9a4d362fbc 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c @@ -470,6 +470,19 @@ static int vf_qm_get_match_data(struct hisi_acc_vf_core_device *hisi_acc_vdev, return 0; } +static void vf_qm_xeqc_save(struct hisi_qm *qm, + struct hisi_acc_vf_migration_file *migf) +{ + struct acc_vf_data *vf_data = &migf->vf_data; + u16 eq_head, aeq_head; + + eq_head = vf_data->qm_eqc_dw[0] & 0xFFFF; + qm_db(qm, 0, QM_DOORBELL_CMD_EQ, eq_head, 0); + + aeq_head = vf_data->qm_aeqc_dw[0] & 0xFFFF; + qm_db(qm, 0, QM_DOORBELL_CMD_AEQ, aeq_head, 0); +} + static int vf_qm_load_data(struct hisi_acc_vf_core_device *hisi_acc_vdev, struct hisi_acc_vf_migration_file *migf) { @@ -566,6 +579,9 @@ static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev, } migf->total_length = sizeof(struct acc_vf_data); + /* Save eqc and aeqc interrupt information */ + vf_qm_xeqc_save(vf_qm, migf); + return 0; } -- GitLab From 59a834592dd200969fdf3c61be1cb0615c647e45 Mon Sep 17 00:00:00 2001 From: Longfang Liu Date: Sat, 10 May 2025 16:11:54 +0800 Subject: [PATCH 0882/2211] hisi_acc_vfio_pci: bugfix live migration function without VF device driver [ Upstream commit 2777a40998deb36f96b6afc48bd397cf58a4edf0 ] If the VF device driver is not loaded in the Guest OS and we attempt to perform device data migration, the address of the migrated data will be NULL. The live migration recovery operation on the destination side will access a null address value, which will cause access errors. Therefore, live migration of VMs without added VF device drivers does not require device data migration. In addition, when the queue address data obtained by the destination is empty, device queue recovery processing will not be performed. Fixes: b0eed085903e ("hisi_acc_vfio_pci: Add support for VFIO live migration") Signed-off-by: Longfang Liu Reviewed-by: Shameer Kolothum Link: https://lore.kernel.org/r/20250510081155.55840-6-liulongfang@huawei.com Signed-off-by: Alex Williamson Signed-off-by: Sasha Levin --- .../vfio/pci/hisilicon/hisi_acc_vfio_pci.c | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c index 81e9a4d362fbc..68300fcd3c41b 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c @@ -426,13 +426,6 @@ static int vf_qm_check_match(struct hisi_acc_vf_core_device *hisi_acc_vdev, return -EINVAL; } - ret = qm_write_regs(vf_qm, QM_VF_STATE, &vf_data->vf_qm_state, 1); - if (ret) { - dev_err(dev, "failed to write QM_VF_STATE\n"); - return ret; - } - - hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state; hisi_acc_vdev->match_done = true; return 0; } @@ -498,6 +491,20 @@ static int vf_qm_load_data(struct hisi_acc_vf_core_device *hisi_acc_vdev, if (migf->total_length < sizeof(struct acc_vf_data)) return -EINVAL; + if (!vf_data->eqe_dma || !vf_data->aeqe_dma || + !vf_data->sqc_dma || !vf_data->cqc_dma) { + dev_info(dev, "resume dma addr is NULL!\n"); + hisi_acc_vdev->vf_qm_state = QM_NOT_READY; + return 0; + } + + ret = qm_write_regs(qm, QM_VF_STATE, &vf_data->vf_qm_state, 1); + if (ret) { + dev_err(dev, "failed to write QM_VF_STATE\n"); + return -EINVAL; + } + hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state; + qm->eqe_dma = vf_data->eqe_dma; qm->aeqe_dma = vf_data->aeqe_dma; qm->sqc_dma = vf_data->sqc_dma; @@ -1371,6 +1378,7 @@ static int hisi_acc_vfio_pci_migrn_init_dev(struct vfio_device *core_vdev) hisi_acc_vdev->vf_id = pci_iov_vf_id(pdev) + 1; hisi_acc_vdev->pf_qm = pf_qm; hisi_acc_vdev->vf_dev = pdev; + hisi_acc_vdev->vf_qm_state = QM_NOT_READY; mutex_init(&hisi_acc_vdev->state_mutex); core_vdev->migration_flags = VFIO_MIGRATION_STOP_COPY | VFIO_MIGRATION_PRE_COPY; -- GitLab From ee5ee646385f5846dcbc881389f3c44a197c402a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= Date: Wed, 2 Apr 2025 13:22:16 +0200 Subject: [PATCH 0883/2211] wifi: ath9k_htc: Abort software beacon handling if disabled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit ac4e317a95a1092b5da5b9918b7118759342641c ] A malicious USB device can send a WMI_SWBA_EVENTID event from an ath9k_htc-managed device before beaconing has been enabled. This causes a device-by-zero error in the driver, leading to either a crash or an out of bounds read. Prevent this by aborting the handling in ath9k_htc_swba() if beacons are not enabled. Reported-by: Robert Morris Closes: https://lore.kernel.org/r/88967.1743099372@localhost Fixes: 832f6a18fc2a ("ath9k_htc: Add beacon slots") Signed-off-by: Toke Høiland-Jørgensen Link: https://patch.msgid.link/20250402112217.58533-1-toke@toke.dk Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath9k/htc_drv_beacon.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c index 547634f82183d..81fa7cbad8921 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c @@ -290,6 +290,9 @@ void ath9k_htc_swba(struct ath9k_htc_priv *priv, struct ath_common *common = ath9k_hw_common(priv->ah); int slot; + if (!priv->cur_beacon_conf.enable_beacon) + return; + if (swba->beacon_pending != 0) { priv->beacon.bmisscnt++; if (priv->beacon.bmisscnt > BSTUCK_THRESHOLD) { -- GitLab From e0657136ae94772903785fe50fbae0a55ba20751 Mon Sep 17 00:00:00 2001 From: "ping.gao" Date: Fri, 16 May 2025 16:38:12 +0800 Subject: [PATCH 0884/2211] scsi: ufs: mcq: Delete ufshcd_release_scsi_cmd() in ufshcd_mcq_abort() [ Upstream commit 53755903b9357e69b2dd6a02fafbb1e30c741895 ] After UFS_ABORT_TASK has been processed successfully, the host will generate MCQ IRQ for ABORT TAG with response OCS_ABORTED. This results in ufshcd_compl_one_cqe() calling ufshcd_release_scsi_cmd(). But ufshcd_mcq_abort() already calls ufshcd_release_scsi_cmd(), resulting in __ufshcd_release() being called twice. This means hba->clk_gating.active_reqs will be decreased twice, making it go negative. Delete ufshcd_release_scsi_cmd() in ufshcd_mcq_abort(). Fixes: f1304d442077 ("scsi: ufs: mcq: Added ufshcd_mcq_abort()") Signed-off-by: ping.gao Link: https://lore.kernel.org/r/20250516083812.3894396-1-ping.gao@samsung.com Reviewed-by: Peter Wang Reviewed-by: Bart Van Assche Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/ufs/core/ufs-mcq.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c index 45b04f3c37764..420e943bb73a7 100644 --- a/drivers/ufs/core/ufs-mcq.c +++ b/drivers/ufs/core/ufs-mcq.c @@ -670,7 +670,6 @@ int ufshcd_mcq_abort(struct scsi_cmnd *cmd) int tag = scsi_cmd_to_rq(cmd)->tag; struct ufshcd_lrb *lrbp = &hba->lrb[tag]; struct ufs_hw_queue *hwq; - unsigned long flags; int err; /* Skip task abort in case previous aborts failed and report failure */ @@ -709,10 +708,5 @@ int ufshcd_mcq_abort(struct scsi_cmnd *cmd) return FAILED; } - spin_lock_irqsave(&hwq->cq_lock, flags); - if (ufshcd_cmd_inflight(lrbp->cmd)) - ufshcd_release_scsi_cmd(hba, lrbp); - spin_unlock_irqrestore(&hwq->cq_lock, flags); - return SUCCESS; } -- GitLab From 6bfb154f95d5f0ab7ed056f23aba8c1a94cb3927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Koutn=C3=BD?= Date: Mon, 5 May 2025 14:12:00 +0200 Subject: [PATCH 0885/2211] kernfs: Relax constraint in draining guard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 071d8e4c2a3b0999a9b822e2eb8854784a350f8a ] The active reference lifecycle provides the break/unbreak mechanism but the active reference is not truly active after unbreak -- callers don't use it afterwards but it's important for proper pairing of kn->active counting. Assuming this mechanism is in place, the WARN check in kernfs_should_drain_open_files() is too sensitive -- it may transiently catch those (rightful) callers between kernfs_unbreak_active_protection() and kernfs_put_active() as found out by Chen Ridong: kernfs_remove_by_name_ns kernfs_get_active // active=1 __kernfs_remove // active=0x80000002 kernfs_drain ... wait_event //waiting (active == 0x80000001) kernfs_break_active_protection // active = 0x80000001 // continue kernfs_unbreak_active_protection // active = 0x80000002 ... kernfs_should_drain_open_files // warning occurs kernfs_put_active To avoid the false positives (mind panic_on_warn) remove the check altogether. (This is meant as quick fix, I think active reference break/unbreak may be simplified with larger rework.) Fixes: bdb2fd7fc56e1 ("kernfs: Skip kernfs_drain_open_files() more aggressively") Link: https://lore.kernel.org/r/kmmrseckjctb4gxcx2rdminrjnq2b4ipf7562nvfd432ld5v5m@2byj5eedkb2o/ Cc: Chen Ridong Signed-off-by: Michal Koutný Acked-by: Tejun Heo Link: https://lore.kernel.org/r/20250505121201.879823-1-mkoutny@suse.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- fs/kernfs/dir.c | 5 +++-- fs/kernfs/file.c | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index 458519e416fe7..5dc90a498e75d 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c @@ -1560,8 +1560,9 @@ void kernfs_break_active_protection(struct kernfs_node *kn) * invoked before finishing the kernfs operation. Note that while this * function restores the active reference, it doesn't and can't actually * restore the active protection - @kn may already or be in the process of - * being removed. Once kernfs_break_active_protection() is invoked, that - * protection is irreversibly gone for the kernfs operation instance. + * being drained and removed. Once kernfs_break_active_protection() is + * invoked, that protection is irreversibly gone for the kernfs operation + * instance. * * While this function may be called at any point after * kernfs_break_active_protection() is invoked, its most useful location diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c index 8502ef68459b9..1943c8bd479bf 100644 --- a/fs/kernfs/file.c +++ b/fs/kernfs/file.c @@ -778,8 +778,9 @@ bool kernfs_should_drain_open_files(struct kernfs_node *kn) /* * @kn being deactivated guarantees that @kn->attr.open can't change * beneath us making the lockless test below safe. + * Callers post kernfs_unbreak_active_protection may be counted in + * kn->active by now, do not WARN_ON because of them. */ - WARN_ON_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS); rcu_read_lock(); on = rcu_dereference(kn->attr.open); -- GitLab From df00f9147e6c72605941275389de2b3659c073a3 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 11 Apr 2025 12:37:50 -0400 Subject: [PATCH 0886/2211] Bluetooth: ISO: Fix not using SID from adv report [ Upstream commit e2d471b7806b09744d65a64bcf41337468f2443b ] Up until now it has been assumed that the application would be able to enter the advertising SID in sockaddr_iso_bc.bc_sid, but userspace has no access to SID since the likes of MGMT_EV_DEVICE_FOUND cannot carry it, so it was left unset (0x00) which means it would be unable to synchronize if the broadcast source is using a different SID e.g. 0x04: > HCI Event: LE Meta Event (0x3e) plen 57 LE Extended Advertising Report (0x0d) Num reports: 1 Entry 0 Event type: 0x0000 Props: 0x0000 Data status: Complete Address type: Random (0x01) Address: 0B:82:E8:50:6D:C8 (Non-Resolvable) Primary PHY: LE 1M Secondary PHY: LE 2M SID: 0x04 TX power: 127 dBm RSSI: -55 dBm (0xc9) Periodic advertising interval: 180.00 msec (0x0090) Direct address type: Public (0x00) Direct address: 00:00:00:00:00:00 (OUI 00-00-00) Data length: 0x1f 06 16 52 18 5b 0b e1 05 16 56 18 04 00 11 30 4c ..R.[....V....0L 75 69 7a 27 73 20 53 32 33 20 55 6c 74 72 61 uiz's S23 Ultra Service Data: Broadcast Audio Announcement (0x1852) Broadcast ID: 14748507 (0xe10b5b) Service Data: Public Broadcast Announcement (0x1856) Data[2]: 0400 Unknown EIR field 0x30[16]: 4c75697a27732053323320556c747261 < HCI Command: LE Periodic Advertising Create Sync (0x08|0x0044) plen 14 Options: 0x0000 Use advertising SID, Advertiser Address Type and address Reporting initially enabled SID: 0x00 (<- Invalid) Adv address type: Random (0x01) Adv address: 0B:82:E8:50:6D:C8 (Non-Resolvable) Skip: 0x0000 Sync timeout: 20000 msec (0x07d0) Sync CTE type: 0x0000 So instead this changes now allow application to set HCI_SID_INVALID which will make hci_le_pa_create_sync to wait for a report, update the conn->sid using the report SID and only then issue PA create sync command: < HCI Command: LE Periodic Advertising Create Sync Options: 0x0000 Use advertising SID, Advertiser Address Type and address Reporting initially enabled SID: 0x04 Adv address type: Random (0x01) Adv address: 0B:82:E8:50:6D:C8 (Non-Resolvable) Skip: 0x0000 Sync timeout: 20000 msec (0x07d0) Sync CTE type: 0x0000 > HCI Event: LE Meta Event (0x3e) plen 16 LE Periodic Advertising Sync Established (0x0e) Status: Success (0x00) Sync handle: 64 Advertising SID: 0x04 Advertiser address type: Random (0x01) Advertiser address: 0B:82:E8:50:6D:C8 (Non-Resolvable) Advertiser PHY: LE 2M (0x02) Periodic advertising interval: 180.00 msec (0x0090) Advertiser clock accuracy: 0x05 Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- net/bluetooth/hci_conn.c | 2 ++ net/bluetooth/hci_core.c | 13 ++++++----- net/bluetooth/hci_event.c | 16 ++++++++++++- net/bluetooth/hci_sync.c | 49 +++++++++++++++++++++++++++++++++++---- net/bluetooth/iso.c | 9 +++++-- 5 files changed, 75 insertions(+), 14 deletions(-) diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index ae66fa0a5fb58..c6c1232db4e28 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c @@ -2067,6 +2067,8 @@ struct hci_conn *hci_pa_create_sync(struct hci_dev *hdev, bdaddr_t *dst, { struct hci_conn *conn; + bt_dev_dbg(hdev, "dst %pMR type %d sid %d", dst, dst_type, sid); + conn = hci_conn_add_unset(hdev, ISO_LINK, dst, HCI_ROLE_SLAVE); if (IS_ERR(conn)) return conn; diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 72439764186ed..743b63287a18f 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -4071,10 +4071,13 @@ static void hci_send_cmd_sync(struct hci_dev *hdev, struct sk_buff *skb) return; } - err = hci_send_frame(hdev, skb); - if (err < 0) { - hci_cmd_sync_cancel_sync(hdev, -err); - return; + if (hci_skb_opcode(skb) != HCI_OP_NOP) { + err = hci_send_frame(hdev, skb); + if (err < 0) { + hci_cmd_sync_cancel_sync(hdev, -err); + return; + } + atomic_dec(&hdev->cmd_cnt); } if (hdev->req_status == HCI_REQ_PEND && @@ -4082,8 +4085,6 @@ static void hci_send_cmd_sync(struct hci_dev *hdev, struct sk_buff *skb) kfree_skb(hdev->req_skb); hdev->req_skb = skb_clone(hdev->sent_cmd, GFP_KERNEL); } - - atomic_dec(&hdev->cmd_cnt); } static void hci_cmd_work(struct work_struct *work) diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 8894633403519..5c4c3d04d8b93 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -6333,6 +6333,17 @@ static void hci_le_ext_adv_report_evt(struct hci_dev *hdev, void *data, info->secondary_phy &= 0x1f; } + /* Check if PA Sync is pending and if the hci_conn SID has not + * been set update it. + */ + if (hci_dev_test_flag(hdev, HCI_PA_SYNC)) { + struct hci_conn *conn; + + conn = hci_conn_hash_lookup_create_pa_sync(hdev); + if (conn && conn->sid == HCI_SID_INVALID) + conn->sid = info->sid; + } + if (legacy_evt_type != LE_ADV_INVALID) { process_adv_report(hdev, legacy_evt_type, &info->bdaddr, info->bdaddr_type, NULL, 0, @@ -7136,7 +7147,8 @@ static void hci_le_meta_evt(struct hci_dev *hdev, void *data, /* Only match event if command OGF is for LE */ if (hdev->req_skb && - hci_opcode_ogf(hci_skb_opcode(hdev->req_skb)) == 0x08 && + (hci_opcode_ogf(hci_skb_opcode(hdev->req_skb)) == 0x08 || + hci_skb_opcode(hdev->req_skb) == HCI_OP_NOP) && hci_skb_event(hdev->req_skb) == ev->subevent) { *opcode = hci_skb_opcode(hdev->req_skb); hci_req_cmd_complete(hdev, *opcode, 0x00, req_complete, @@ -7492,8 +7504,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) goto done; } + hci_dev_lock(hdev); kfree_skb(hdev->recv_event); hdev->recv_event = skb_clone(skb, GFP_KERNEL); + hci_dev_unlock(hdev); event = hdr->evt; if (!event) { diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c index 6597936fbd51b..59011f45906a1 100644 --- a/net/bluetooth/hci_sync.c +++ b/net/bluetooth/hci_sync.c @@ -6890,20 +6890,37 @@ int hci_le_conn_update_sync(struct hci_dev *hdev, struct hci_conn *conn, static void create_pa_complete(struct hci_dev *hdev, void *data, int err) { + struct hci_conn *conn = data; + struct hci_conn *pa_sync; + bt_dev_dbg(hdev, "err %d", err); - if (!err) + if (err == -ECANCELED) return; + hci_dev_lock(hdev); + hci_dev_clear_flag(hdev, HCI_PA_SYNC); - if (err == -ECANCELED) - return; + if (!hci_conn_valid(hdev, conn)) + clear_bit(HCI_CONN_CREATE_PA_SYNC, &conn->flags); - hci_dev_lock(hdev); + if (!err) + goto unlock; - hci_update_passive_scan_sync(hdev); + /* Add connection to indicate PA sync error */ + pa_sync = hci_conn_add_unset(hdev, ISO_LINK, BDADDR_ANY, + HCI_ROLE_SLAVE); + if (IS_ERR(pa_sync)) + goto unlock; + + set_bit(HCI_CONN_PA_SYNC_FAILED, &pa_sync->flags); + + /* Notify iso layer */ + hci_connect_cfm(pa_sync, bt_status(err)); + +unlock: hci_dev_unlock(hdev); } @@ -6917,9 +6934,23 @@ static int hci_le_pa_create_sync(struct hci_dev *hdev, void *data) if (!hci_conn_valid(hdev, conn)) return -ECANCELED; + if (conn->sync_handle != HCI_SYNC_HANDLE_INVALID) + return -EINVAL; + if (hci_dev_test_and_set_flag(hdev, HCI_PA_SYNC)) return -EBUSY; + /* Stop scanning if SID has not been set and active scanning is enabled + * so we use passive scanning which will be scanning using the allow + * list programmed to contain only the connection address. + */ + if (conn->sid == HCI_SID_INVALID && + hci_dev_test_flag(hdev, HCI_LE_SCAN)) { + hci_scan_disable_sync(hdev); + hci_dev_set_flag(hdev, HCI_LE_SCAN_INTERRUPTED); + hci_discovery_set_state(hdev, DISCOVERY_STOPPED); + } + /* Mark HCI_CONN_CREATE_PA_SYNC so hci_update_passive_scan_sync can * program the address in the allow list so PA advertisements can be * received. @@ -6928,6 +6959,14 @@ static int hci_le_pa_create_sync(struct hci_dev *hdev, void *data) hci_update_passive_scan_sync(hdev); + /* SID has not been set listen for HCI_EV_LE_EXT_ADV_REPORT to update + * it. + */ + if (conn->sid == HCI_SID_INVALID) + __hci_cmd_sync_status_sk(hdev, HCI_OP_NOP, 0, NULL, + HCI_EV_LE_EXT_ADV_REPORT, + conn->conn_timeout, NULL); + memset(&cp, 0, sizeof(cp)); cp.options = qos->bcast.options; cp.sid = conn->sid; diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c index 72bf9b1db2247..a08a0f3d5003c 100644 --- a/net/bluetooth/iso.c +++ b/net/bluetooth/iso.c @@ -938,7 +938,7 @@ static int iso_sock_bind_bc(struct socket *sock, struct sockaddr *addr, iso_pi(sk)->dst_type = sa->iso_bc->bc_bdaddr_type; - if (sa->iso_bc->bc_sid > 0x0f) + if (sa->iso_bc->bc_sid > 0x0f && sa->iso_bc->bc_sid != HCI_SID_INVALID) return -EINVAL; iso_pi(sk)->bc_sid = sa->iso_bc->bc_sid; @@ -1963,6 +1963,9 @@ static bool iso_match_sid(struct sock *sk, void *data) { struct hci_ev_le_pa_sync_established *ev = data; + if (iso_pi(sk)->bc_sid == HCI_SID_INVALID) + return true; + return ev->sid == iso_pi(sk)->bc_sid; } @@ -2009,8 +2012,10 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags) if (ev1) { sk = iso_get_sock(&hdev->bdaddr, bdaddr, BT_LISTEN, iso_match_sid, ev1); - if (sk && !ev1->status) + if (sk && !ev1->status) { iso_pi(sk)->sync_handle = le16_to_cpu(ev1->handle); + iso_pi(sk)->bc_sid = ev1->sid; + } goto done; } -- GitLab From 1072fc0ca1f8d0d5397d24853386876f937b8e63 Mon Sep 17 00:00:00 2001 From: Henry Martin Date: Mon, 7 Apr 2025 11:23:49 +0800 Subject: [PATCH 0887/2211] wifi: mt76: mt7996: Fix null-ptr-deref in mt7996_mmio_wed_init() [ Upstream commit 8f30e2b059757d8711a823e4c9c023db62a1d171 ] devm_ioremap() returns NULL on error. Currently, mt7996_mmio_wed_init() does not check for this case, which results in a NULL pointer dereference. Prevent null pointer dereference in mt7996_mmio_wed_init() Fixes: 83eafc9251d6 ("wifi: mt76: mt7996: add wed tx support") Signed-off-by: Henry Martin Link: https://patch.msgid.link/20250407032349.83360-1-bsdhenrymartin@gmail.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt7996/mmio.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mmio.c b/drivers/net/wireless/mediatek/mt76/mt7996/mmio.c index b6209ed1cfe01..bffee73b780cb 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mmio.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mmio.c @@ -323,6 +323,9 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr, wed->wlan.base = devm_ioremap(dev->mt76.dev, pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); + if (!wed->wlan.base) + return -ENOMEM; + wed->wlan.phy_base = pci_resource_start(pci_dev, 0); if (hif2) { -- GitLab From 790d05cde359356feea8915094a51166af1629f5 Mon Sep 17 00:00:00 2001 From: Henry Martin Date: Mon, 7 Apr 2025 14:19:00 +0800 Subject: [PATCH 0888/2211] wifi: mt76: mt7915: Fix null-ptr-deref in mt7915_mmio_wed_init() [ Upstream commit efb95439c1477bbc955cacd0179c35e7861b437c ] devm_ioremap() returns NULL on error. Currently, mt7915_mmio_wed_init() does not check for this case, which results in a NULL pointer dereference. Prevent null pointer dereference in mt7915_mmio_wed_init(). Fixes: 4f831d18d12d ("wifi: mt76: mt7915: enable WED RX support") Signed-off-by: Henry Martin Link: https://patch.msgid.link/20250407061900.85317-1-bsdhenrymartin@gmail.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt7915/mmio.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c b/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c index 2e7604eed27b0..a6245c3ccef48 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c @@ -649,6 +649,9 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr, wed->wlan.base = devm_ioremap(dev->mt76.dev, pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); + if (!wed->wlan.base) + return -ENOMEM; + wed->wlan.phy_base = pci_resource_start(pci_dev, 0); wed->wlan.wpdma_int = pci_resource_start(pci_dev, 0) + MT_INT_WED_SOURCE_CSR; @@ -676,6 +679,9 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr, wed->wlan.bus_type = MTK_WED_BUS_AXI; wed->wlan.base = devm_ioremap(dev->mt76.dev, res->start, resource_size(res)); + if (!wed->wlan.base) + return -ENOMEM; + wed->wlan.phy_base = res->start; wed->wlan.wpdma_int = res->start + MT_INT_SOURCE_CSR; wed->wlan.wpdma_mask = res->start + MT_INT_MASK_CSR; -- GitLab From 17e939897e332898b6f8e35d7b6c1af07f4df79d Mon Sep 17 00:00:00 2001 From: Ming Yen Hsieh Date: Mon, 14 Apr 2025 09:39:52 +0800 Subject: [PATCH 0889/2211] wifi: mt76: mt7925: prevent multiple scan commands [ Upstream commit 122f270aca2c86d7de264ab67161c845e0691d73 ] Add a check to ensure only one scan command is active at a time by testing the MT76_HW_SCANNING state. Fixes: c948b5da6bbe ("wifi: mt76: mt7925: add Mediatek Wi-Fi7 driver for mt7925 chips") Signed-off-by: Ming Yen Hsieh Link: https://patch.msgid.link/20250414013954.1151774-1-mingyen.hsieh@mediatek.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c index 2396e1795fe17..7ad9e1eaaa8f3 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c @@ -2771,6 +2771,9 @@ int mt7925_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif, struct tlv *tlv; int max_len; + if (test_bit(MT76_HW_SCANNING, &phy->state)) + return -EBUSY; + max_len = sizeof(*hdr) + sizeof(*req) + sizeof(*ssid) + sizeof(*bssid) + sizeof(*chan_info) + sizeof(*misc) + sizeof(*ie); -- GitLab From 52ffee9fea8d779dc1b5be5ccd3c66ae56c6aa2a Mon Sep 17 00:00:00 2001 From: Ming Yen Hsieh Date: Mon, 14 Apr 2025 09:39:53 +0800 Subject: [PATCH 0890/2211] wifi: mt76: mt7925: refine the sniffer commnad [ Upstream commit bd02eebfc0b3502fe8322cf229b4c801416d1007 ] Remove a duplicate call to `mt76_mcu_send_msg` to fix redundant operations in the sniffer command handling. Fixes: c948b5da6bbe ("wifi: mt76: mt7925: add Mediatek Wi-Fi7 driver for mt7925 chips") Signed-off-by: Ming Yen Hsieh Link: https://patch.msgid.link/20250414013954.1151774-2-mingyen.hsieh@mediatek.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c index 7ad9e1eaaa8f3..9a9900eba5020 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c @@ -2087,8 +2087,6 @@ int mt7925_mcu_set_sniffer(struct mt792x_dev *dev, struct ieee80211_vif *vif, }, }; - mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(SNIFFER), &req, sizeof(req), true); - return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(SNIFFER), &req, sizeof(req), true); } -- GitLab From ba9bf458fa11207bc448206616b72f31bf9e42cc Mon Sep 17 00:00:00 2001 From: Michael Lo Date: Mon, 14 Apr 2025 09:39:54 +0800 Subject: [PATCH 0891/2211] wifi: mt76: mt7925: ensure all MCU commands wait for response [ Upstream commit aa97ff5782cf01cf2163593e1f57bbde63a06047 ] Modify MCU command sending functions to wait for a response, ensuring consistent behavior across all commands and improves reliability by confirming that each command is processed successfully. Fixes: c948b5da6bbe ("wifi: mt76: mt7925: add Mediatek Wi-Fi7 driver for mt7925 chips") Signed-off-by: Michael Lo Signed-off-by: Ming Yen Hsieh Link: https://patch.msgid.link/20250414013954.1151774-3-mingyen.hsieh@mediatek.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c index 9a9900eba5020..a19c108ad4b5c 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c @@ -769,7 +769,7 @@ int mt7925_mcu_fw_log_2_host(struct mt792x_dev *dev, u8 ctrl) int ret; ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_UNI_CMD(WSYS_CONFIG), - &req, sizeof(req), false, NULL); + &req, sizeof(req), true, NULL); return ret; } @@ -1411,7 +1411,7 @@ int mt7925_mcu_set_eeprom(struct mt792x_dev *dev) }; return mt76_mcu_send_and_get_msg(&dev->mt76, MCU_UNI_CMD(EFUSE_CTRL), - &req, sizeof(req), false, NULL); + &req, sizeof(req), true, NULL); } EXPORT_SYMBOL_GPL(mt7925_mcu_set_eeprom); @@ -2741,7 +2741,7 @@ int mt7925_mcu_set_dbdc(struct mt76_phy *phy, bool enable) conf->band = 0; /* unused */ err = mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SET_DBDC_PARMS), - false); + true); return err; } @@ -2859,7 +2859,7 @@ int mt7925_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif, } err = mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SCAN_REQ), - false); + true); if (err < 0) clear_bit(MT76_HW_SCANNING, &phy->state); @@ -2965,7 +2965,7 @@ int mt7925_mcu_sched_scan_req(struct mt76_phy *phy, } return mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SCAN_REQ), - false); + true); } EXPORT_SYMBOL_GPL(mt7925_mcu_sched_scan_req); @@ -3001,7 +3001,7 @@ mt7925_mcu_sched_scan_enable(struct mt76_phy *phy, clear_bit(MT76_HW_SCHED_SCANNING, &phy->state); return mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SCAN_REQ), - false); + true); } int mt7925_mcu_cancel_hw_scan(struct mt76_phy *phy, @@ -3040,7 +3040,7 @@ int mt7925_mcu_cancel_hw_scan(struct mt76_phy *phy, } return mt76_mcu_send_msg(phy->dev, MCU_UNI_CMD(SCAN_REQ), - &req, sizeof(req), false); + &req, sizeof(req), true); } EXPORT_SYMBOL_GPL(mt7925_mcu_cancel_hw_scan); @@ -3145,7 +3145,7 @@ int mt7925_mcu_set_channel_domain(struct mt76_phy *phy) memcpy(__skb_push(skb, sizeof(req)), &req, sizeof(req)); return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(SET_DOMAIN_INFO), - false); + true); } EXPORT_SYMBOL_GPL(mt7925_mcu_set_channel_domain); -- GitLab From 3fc202198479306ccedea16a4a2e37b66aa16529 Mon Sep 17 00:00:00 2001 From: Peter Chiu Date: Thu, 15 May 2025 11:29:46 +0800 Subject: [PATCH 0892/2211] wifi: mt76: mt7996: set EHT max ampdu length capability [ Upstream commit 8b2f574845e33d02e7fbad2d3192a8b717567afa ] Set the max AMPDU length in the EHT MAC CAP. Without this patch, the peer station cannot obtain the correct capability, which prevents achieving peak throughput on the 2 GHz band. Fixes: 1816ad9381e0 ("wifi: mt76: mt7996: add max mpdu len capability") Signed-off-by: Peter Chiu Signed-off-by: Shayne Chen Link: https://patch.msgid.link/20250515032952.1653494-3-shayne.chen@mediatek.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt7996/init.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/init.c b/drivers/net/wireless/mediatek/mt76/mt7996/init.c index d8a013812d1e3..c550385541143 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/init.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/init.c @@ -1193,6 +1193,9 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band, u8_encode_bits(IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_11454, IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_MASK); + eht_cap_elem->mac_cap_info[1] |= + IEEE80211_EHT_MAC_CAP1_MAX_AMPDU_LEN_MASK; + eht_cap_elem->phy_cap_info[0] = IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI | IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER | -- GitLab From 7e483586395067a50a3bb9f4b7928c2051580777 Mon Sep 17 00:00:00 2001 From: Shayne Chen Date: Thu, 15 May 2025 11:29:50 +0800 Subject: [PATCH 0893/2211] wifi: mt76: mt7996: fix RX buffer size of MCU event [ Upstream commit 42cb27af34de4acf680606fad2c1f2932110591f ] Some management frames are first processed by the firmware and then passed to the driver through the MCU event rings. In CONNAC3, event rings do not support scatter-gather and have a size limitation of 2048 bytes. If a packet sized between 1728 and 2048 bytes arrives from an event ring, the ring will hang because the driver attempts to use scatter-gather to process it. To fix this, include the size of struct skb_shared_info in the MCU RX buffer size to prevent scatter-gather from being used for event skb in mt76_dma_rx_fill_buf(). Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices") Co-developed-by: Peter Chiu Signed-off-by: Peter Chiu Signed-off-by: Shayne Chen Link: https://patch.msgid.link/20250515032952.1653494-7-shayne.chen@mediatek.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt7996/dma.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/dma.c b/drivers/net/wireless/mediatek/mt76/mt7996/dma.c index 69a7d9b2e38bd..4b68d2fc5e094 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/dma.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/dma.c @@ -493,7 +493,7 @@ int mt7996_dma_init(struct mt7996_dev *dev) ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU], MT_RXQ_ID(MT_RXQ_MCU), MT7996_RX_MCU_RING_SIZE, - MT_RX_BUF_SIZE, + MT7996_RX_MCU_BUF_SIZE, MT_RXQ_RING_BASE(MT_RXQ_MCU)); if (ret) return ret; @@ -502,7 +502,7 @@ int mt7996_dma_init(struct mt7996_dev *dev) ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA], MT_RXQ_ID(MT_RXQ_MCU_WA), MT7996_RX_MCU_RING_SIZE_WA, - MT_RX_BUF_SIZE, + MT7996_RX_MCU_BUF_SIZE, MT_RXQ_RING_BASE(MT_RXQ_MCU_WA)); if (ret) return ret; diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h index ab8c9070630b0..425fd030bee00 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h @@ -28,6 +28,9 @@ #define MT7996_RX_RING_SIZE 1536 #define MT7996_RX_MCU_RING_SIZE 512 #define MT7996_RX_MCU_RING_SIZE_WA 1024 +/* scatter-gather of mcu event is not supported in connac3 */ +#define MT7996_RX_MCU_BUF_SIZE (2048 + \ + SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) #define MT7996_FIRMWARE_WA "mediatek/mt7996/mt7996_wa.bin" #define MT7996_FIRMWARE_WM "mediatek/mt7996/mt7996_wm.bin" -- GitLab From 1d249cc92d08ad789a16138e0de6af7a601dfbd1 Mon Sep 17 00:00:00 2001 From: Di Shen Date: Tue, 20 May 2025 13:49:43 +0800 Subject: [PATCH 0894/2211] bpf: Revert "bpf: remove unnecessary rcu_read_{lock,unlock}() in multi-uprobe attach logic" [ Upstream commit 4e2e6841ff761cc15a54e8bebcf35d7325ec78a2 ] This reverts commit 4a8f635a6054. Althought get_pid_task() internally already calls rcu_read_lock() and rcu_read_unlock(), the find_vpid() was not. The documentation for find_vpid() clearly states: "Must be called with the tasklist_lock or rcu_read_lock() held." Add proper rcu_read_lock/unlock() to protect the find_vpid(). Fixes: 4a8f635a6054 ("bpf: remove unnecessary rcu_read_{lock,unlock}() in multi-uprobe attach logic") Reported-by: Xuewen Yan Signed-off-by: Di Shen Acked-by: Andrii Nakryiko Link: https://lore.kernel.org/r/20250520054943.5002-1-xuewen.yan@unisoc.com Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- kernel/trace/bpf_trace.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 66075e86b691c..3ec7df7dbeec4 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -3349,7 +3349,9 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr } if (pid) { + rcu_read_lock(); task = get_pid_task(find_vpid(pid), PIDTYPE_TGID); + rcu_read_unlock(); if (!task) { err = -ESRCH; goto error_path_put; -- GitLab From c4c18cf5891060e4ab24a1b99b444e5954ede698 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Fri, 16 May 2025 16:12:13 +0200 Subject: [PATCH 0895/2211] netfilter: xtables: support arpt_mark and ipv6 optstrip for iptables-nft only builds [ Upstream commit c38eb2973c18d34a8081d173a6ad298461f4a37c ] Its now possible to build a kernel that has no support for the classic xtables get/setsockopt interfaces and builtin tables. In this case, we have CONFIG_IP6_NF_MANGLE=n and CONFIG_IP_NF_ARPTABLES=n. For optstript, the ipv6 code is so small that we can enable it if netfilter ipv6 support exists. For mark, check if either classic arptables or NFT_ARP_COMPAT is set. Fixes: a9525c7f6219 ("netfilter: xtables: allow xtables-nft only builds") Signed-off-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- net/netfilter/xt_TCPOPTSTRIP.c | 4 ++-- net/netfilter/xt_mark.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/net/netfilter/xt_TCPOPTSTRIP.c b/net/netfilter/xt_TCPOPTSTRIP.c index 30e99464171b7..93f064306901c 100644 --- a/net/netfilter/xt_TCPOPTSTRIP.c +++ b/net/netfilter/xt_TCPOPTSTRIP.c @@ -91,7 +91,7 @@ tcpoptstrip_tg4(struct sk_buff *skb, const struct xt_action_param *par) return tcpoptstrip_mangle_packet(skb, par, ip_hdrlen(skb)); } -#if IS_ENABLED(CONFIG_IP6_NF_MANGLE) +#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES) static unsigned int tcpoptstrip_tg6(struct sk_buff *skb, const struct xt_action_param *par) { @@ -119,7 +119,7 @@ static struct xt_target tcpoptstrip_tg_reg[] __read_mostly = { .targetsize = sizeof(struct xt_tcpoptstrip_target_info), .me = THIS_MODULE, }, -#if IS_ENABLED(CONFIG_IP6_NF_MANGLE) +#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES) { .name = "TCPOPTSTRIP", .family = NFPROTO_IPV6, diff --git a/net/netfilter/xt_mark.c b/net/netfilter/xt_mark.c index 65b965ca40ea7..59b9d04400cac 100644 --- a/net/netfilter/xt_mark.c +++ b/net/netfilter/xt_mark.c @@ -48,7 +48,7 @@ static struct xt_target mark_tg_reg[] __read_mostly = { .targetsize = sizeof(struct xt_mark_tginfo2), .me = THIS_MODULE, }, -#if IS_ENABLED(CONFIG_IP_NF_ARPTABLES) +#if IS_ENABLED(CONFIG_IP_NF_ARPTABLES) || IS_ENABLED(CONFIG_NFT_COMPAT_ARP) { .name = "MARK", .revision = 2, -- GitLab From fd125f1eefbc5a995b948a8507b2978ad048a710 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Wed, 21 May 2025 11:38:47 +0200 Subject: [PATCH 0896/2211] netfilter: nf_tables: nft_fib_ipv6: fix VRF ipv4/ipv6 result discrepancy [ Upstream commit 8b53f46eb430fe5b42d485873b85331d2de2c469 ] With a VRF, ipv4 and ipv6 FIB expression behave differently. fib daddr . iif oif Will return the input interface name for ipv4, but the real device for ipv6. Example: If VRF device name is tvrf and real (incoming) device is veth0. First round is ok, both ipv4 and ipv6 will yield 'veth0'. But in the second round (incoming device will be set to "tvrf"), ipv4 will yield "tvrf" whereas ipv6 returns "veth0" for the second round too. This makes ipv6 behave like ipv4. A followup patch will add a test case for this, without this change it will fail with: get element inet t fibif6iif { tvrf . dead:1::99 . tvrf } ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FAIL: did not find tvrf . dead:1::99 . tvrf in fibif6iif Alternatively we could either not do anything at all or change ipv4 to also return the lower/real device, however, nft (userspace) doc says "iif: if fib lookup provides a route then check its output interface is identical to the packets input interface." which is what the nft fib ipv4 behaviour is. Fixes: f6d0cbcf09c5 ("netfilter: nf_tables: add fib expression") Signed-off-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- net/ipv6/netfilter/nft_fib_ipv6.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/net/ipv6/netfilter/nft_fib_ipv6.c b/net/ipv6/netfilter/nft_fib_ipv6.c index 7fd9d7b21cd42..f1f5640da6728 100644 --- a/net/ipv6/netfilter/nft_fib_ipv6.c +++ b/net/ipv6/netfilter/nft_fib_ipv6.c @@ -158,6 +158,7 @@ void nft_fib6_eval(const struct nft_expr *expr, struct nft_regs *regs, { const struct nft_fib *priv = nft_expr_priv(expr); int noff = skb_network_offset(pkt->skb); + const struct net_device *found = NULL; const struct net_device *oif = NULL; u32 *dest = ®s->data[priv->dreg]; struct ipv6hdr *iph, _iph; @@ -203,11 +204,15 @@ void nft_fib6_eval(const struct nft_expr *expr, struct nft_regs *regs, if (rt->rt6i_flags & (RTF_REJECT | RTF_ANYCAST | RTF_LOCAL)) goto put_rt_err; - if (oif && oif != rt->rt6i_idev->dev && - l3mdev_master_ifindex_rcu(rt->rt6i_idev->dev) != oif->ifindex) - goto put_rt_err; + if (!oif) { + found = rt->rt6i_idev->dev; + } else { + if (oif == rt->rt6i_idev->dev || + l3mdev_master_ifindex_rcu(rt->rt6i_idev->dev) == oif->ifindex) + found = oif; + } - nft_fib_store_result(dest, priv, rt->rt6i_idev->dev); + nft_fib_store_result(dest, priv, found); put_rt_err: ip6_rt_put(rt); } -- GitLab From 46e68224893b2bc89c5bd5971a0b2ea2d7d786a9 Mon Sep 17 00:00:00 2001 From: Li RongQing Date: Wed, 21 May 2025 11:46:47 +0800 Subject: [PATCH 0897/2211] vfio/type1: Fix error unwind in migration dirty bitmap allocation [ Upstream commit 4518e5a60c7fbf0cdff393c2681db39d77b4f87e ] When setting up dirty page tracking at the vfio IOMMU backend for device migration, if an error is encountered allocating a tracking bitmap, the unwind loop fails to free previously allocated tracking bitmaps. This occurs because the wrong loop index is used to generate the tracking object. This results in unintended memory usage for the life of the current DMA mappings where bitmaps were successfully allocated. Use the correct loop index to derive the tracking object for freeing during unwind. Fixes: d6a4c185660c ("vfio iommu: Implementation of ioctl for dirty pages tracking") Signed-off-by: Li RongQing Link: https://lore.kernel.org/r/20250521034647.2877-1-lirongqing@baidu.com Signed-off-by: Alex Williamson Signed-off-by: Sasha Levin --- drivers/vfio/vfio_iommu_type1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index bf391b40e576f..8338cfd61fe14 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c @@ -294,7 +294,7 @@ static int vfio_dma_bitmap_alloc_all(struct vfio_iommu *iommu, size_t pgsize) struct rb_node *p; for (p = rb_prev(n); p; p = rb_prev(p)) { - struct vfio_dma *dma = rb_entry(n, + struct vfio_dma *dma = rb_entry(p, struct vfio_dma, node); vfio_dma_bitmap_free(dma); -- GitLab From 1750c3f1d9451fd6ea4c9b94fffecdbb3f7e43ec Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Tue, 20 May 2025 11:42:30 +0300 Subject: [PATCH 0898/2211] Bluetooth: MGMT: iterate over mesh commands in mgmt_mesh_foreach() [ Upstream commit 3bb88524b7d030160bb3c9b35f928b2778092111 ] In 'mgmt_mesh_foreach()', iterate over mesh commands rather than generic mgmt ones. Compile tested only. Fixes: b338d91703fa ("Bluetooth: Implement support for Mesh") Signed-off-by: Dmitry Antipov Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- net/bluetooth/mgmt_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/bluetooth/mgmt_util.c b/net/bluetooth/mgmt_util.c index 17ab909a7c07f..67db32a60c6a9 100644 --- a/net/bluetooth/mgmt_util.c +++ b/net/bluetooth/mgmt_util.c @@ -321,7 +321,7 @@ void mgmt_mesh_foreach(struct hci_dev *hdev, { struct mgmt_mesh_tx *mesh_tx, *tmp; - list_for_each_entry_safe(mesh_tx, tmp, &hdev->mgmt_pending, list) { + list_for_each_entry_safe(mesh_tx, tmp, &hdev->mesh_pending, list) { if (!sk || mesh_tx->sk == sk) cb(mesh_tx, data); } -- GitLab From 9427f6081f37c795a8bd29d0ee72a4da3bd64af8 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Tue, 20 May 2025 09:31:35 -0700 Subject: [PATCH 0899/2211] Bluetooth: btintel: Check dsbr size from EFI variable [ Upstream commit 3aa1dc3c9060e335e82e9c182bf3d1db29220b1b ] Since the size of struct btintel_dsbr is already known, we can just start there instead of querying the EFI variable size. If the final result doesn't match what we expect also fail. This fixes a stack buffer overflow when the EFI variable is larger than struct btintel_dsbr. Reported-by: zepta Closes: https://lore.kernel.org/all/CAPBS6KoaWV9=dtjTESZiU6KK__OZX0KpDk-=JEH8jCHFLUYv3Q@mail.gmail.com Fixes: eb9e749c0182 ("Bluetooth: btintel: Allow configuring drive strength of BRI") Signed-off-by: Kees Cook Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- drivers/bluetooth/btintel.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c index 645047fb92fd2..51d6d91ed4041 100644 --- a/drivers/bluetooth/btintel.c +++ b/drivers/bluetooth/btintel.c @@ -2705,7 +2705,7 @@ static int btintel_uefi_get_dsbr(u32 *dsbr_var) } __packed data; efi_status_t status; - unsigned long data_size = 0; + unsigned long data_size = sizeof(data); efi_guid_t guid = EFI_GUID(0xe65d8884, 0xd4af, 0x4b20, 0x8d, 0x03, 0x77, 0x2e, 0xcc, 0x3d, 0xa5, 0x31); @@ -2715,16 +2715,10 @@ static int btintel_uefi_get_dsbr(u32 *dsbr_var) if (!efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE)) return -EOPNOTSUPP; - status = efi.get_variable(BTINTEL_EFI_DSBR, &guid, NULL, &data_size, - NULL); - - if (status != EFI_BUFFER_TOO_SMALL || !data_size) - return -EIO; - status = efi.get_variable(BTINTEL_EFI_DSBR, &guid, NULL, &data_size, &data); - if (status != EFI_SUCCESS) + if (status != EFI_SUCCESS || data_size != sizeof(data)) return -ENXIO; *dsbr_var = data.dsbr; -- GitLab From 15c0250dae3b48a398447d2b364603821ed4ed90 Mon Sep 17 00:00:00 2001 From: Jiayuan Chen Date: Fri, 16 May 2025 22:17:12 +0800 Subject: [PATCH 0900/2211] bpf, sockmap: Avoid using sk_socket after free when sending [ Upstream commit 8259eb0e06d8f64c700f5fbdb28a5c18e10de291 ] The sk->sk_socket is not locked or referenced in backlog thread, and during the call to skb_send_sock(), there is a race condition with the release of sk_socket. All types of sockets(tcp/udp/unix/vsock) will be affected. Race conditions: ''' CPU0 CPU1 backlog::skb_send_sock sendmsg_unlocked sock_sendmsg sock_sendmsg_nosec close(fd): ... ops->release() -> sock_map_close() sk_socket->ops = NULL free(socket) sock->ops->sendmsg ^ panic here ''' The ref of psock become 0 after sock_map_close() executed. ''' void sock_map_close() { ... if (likely(psock)) { ... // !! here we remove psock and the ref of psock become 0 sock_map_remove_links(sk, psock) psock = sk_psock_get(sk); if (unlikely(!psock)) goto no_psock; <=== Control jumps here via goto ... cancel_delayed_work_sync(&psock->work); <=== not executed sk_psock_put(sk, psock); ... } ''' Based on the fact that we already wait for the workqueue to finish in sock_map_close() if psock is held, we simply increase the psock reference count to avoid race conditions. With this patch, if the backlog thread is running, sock_map_close() will wait for the backlog thread to complete and cancel all pending work. If no backlog running, any pending work that hasn't started by then will fail when invoked by sk_psock_get(), as the psock reference count have been zeroed, and sk_psock_drop() will cancel all jobs via cancel_delayed_work_sync(). In summary, we require synchronization to coordinate the backlog thread and close() thread. The panic I catched: ''' Workqueue: events sk_psock_backlog RIP: 0010:sock_sendmsg+0x21d/0x440 RAX: 0000000000000000 RBX: ffffc9000521fad8 RCX: 0000000000000001 ... Call Trace: ? die_addr+0x40/0xa0 ? exc_general_protection+0x14c/0x230 ? asm_exc_general_protection+0x26/0x30 ? sock_sendmsg+0x21d/0x440 ? sock_sendmsg+0x3e0/0x440 ? __pfx_sock_sendmsg+0x10/0x10 __skb_send_sock+0x543/0xb70 sk_psock_backlog+0x247/0xb80 ... ''' Fixes: 4b4647add7d3 ("sock_map: avoid race between sock_map_close and sk_psock_put") Reported-by: Michal Luczaj Signed-off-by: Jiayuan Chen Signed-off-by: Martin KaFai Lau Reviewed-by: John Fastabend Link: https://lore.kernel.org/r/20250516141713.291150-1-jiayuan.chen@linux.dev Signed-off-by: Sasha Levin --- net/core/skmsg.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/net/core/skmsg.c b/net/core/skmsg.c index 1219e0404def0..a8d238dd982af 100644 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c @@ -655,6 +655,13 @@ static void sk_psock_backlog(struct work_struct *work) bool ingress; int ret; + /* Increment the psock refcnt to synchronize with close(fd) path in + * sock_map_close(), ensuring we wait for backlog thread completion + * before sk_socket freed. If refcnt increment fails, it indicates + * sock_map_close() completed with sk_socket potentially already freed. + */ + if (!sk_psock_get(psock->sk)) + return; mutex_lock(&psock->work_mutex); while ((skb = skb_peek(&psock->ingress_skb))) { len = skb->len; @@ -706,6 +713,7 @@ static void sk_psock_backlog(struct work_struct *work) } end: mutex_unlock(&psock->work_mutex); + sk_psock_put(psock->sk, psock); } struct sk_psock *sk_psock_init(struct sock *sk, int node) -- GitLab From 09ecfdff49d3560184b76d24e5c1d6b74faf3844 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Wed, 21 May 2025 11:38:48 +0200 Subject: [PATCH 0901/2211] netfilter: nf_tables: nft_fib: consistent l3mdev handling [ Upstream commit 9a119669fb1924cd9658c16da39a5a585e129e50 ] fib has two modes: 1. Obtain output device according to source or destination address 2. Obtain the type of the address, e.g. local, unicast, multicast. 'fib daddr type' should return 'local' if the address is configured in this netns or unicast otherwise. 'fib daddr . iif type' should return 'local' if the address is configured on the input interface or unicast otherwise, i.e. more restrictive. However, if the interface is part of a VRF, then 'fib daddr type' returns unicast even if the address is configured on the incoming interface. This is broken for both ipv4 and ipv6. In the ipv4 case, inet_dev_addr_type must only be used if the 'iif' or 'oif' (strict mode) was requested. Else inet_addr_type_dev_table() needs to be used and the correct dev argument must be passed as well so the correct fib (vrf) table is used. In the ipv6 case, the bug is similar, without strict mode, dev is NULL so .flowi6_l3mdev will be set to 0. Add a new 'nft_fib_l3mdev_master_ifindex_rcu()' helper and use that to init the .l3mdev structure member. For ipv6, use it from nft_fib6_flowi_init() which gets called from both the 'type' and the 'route' mode eval functions. This provides consistent behaviour for all modes for both ipv4 and ipv6: If strict matching is requested, the input respectively output device of the netfilter hooks is used. Otherwise, use skb->dev to obtain the l3mdev ifindex. Without this, most type checks in updated nft_fib.sh selftest fail: FAIL: did not find veth0 . 10.9.9.1 . local in fibtype4 FAIL: did not find veth0 . dead:1::1 . local in fibtype6 FAIL: did not find veth0 . dead:9::1 . local in fibtype6 FAIL: did not find tvrf . 10.0.1.1 . local in fibtype4 FAIL: did not find tvrf . 10.9.9.1 . local in fibtype4 FAIL: did not find tvrf . dead:1::1 . local in fibtype6 FAIL: did not find tvrf . dead:9::1 . local in fibtype6 FAIL: fib expression address types match (iif in vrf) (fib errounously returns 'unicast' for all of them, even though all of these addresses are local to the vrf). Fixes: f6d0cbcf09c5 ("netfilter: nf_tables: add fib expression") Signed-off-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- include/net/netfilter/nft_fib.h | 9 +++++++++ net/ipv4/netfilter/nft_fib_ipv4.c | 11 +++++++++-- net/ipv6/netfilter/nft_fib_ipv6.c | 4 +--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/include/net/netfilter/nft_fib.h b/include/net/netfilter/nft_fib.h index 6e202ed5e63f3..7370fba844efc 100644 --- a/include/net/netfilter/nft_fib.h +++ b/include/net/netfilter/nft_fib.h @@ -2,6 +2,7 @@ #ifndef _NFT_FIB_H_ #define _NFT_FIB_H_ +#include #include struct nft_fib { @@ -39,6 +40,14 @@ static inline bool nft_fib_can_skip(const struct nft_pktinfo *pkt) return nft_fib_is_loopback(pkt->skb, indev); } +static inline int nft_fib_l3mdev_master_ifindex_rcu(const struct nft_pktinfo *pkt, + const struct net_device *iif) +{ + const struct net_device *dev = iif ? iif : pkt->skb->dev; + + return l3mdev_master_ifindex_rcu(dev); +} + int nft_fib_dump(struct sk_buff *skb, const struct nft_expr *expr, bool reset); int nft_fib_init(const struct nft_ctx *ctx, const struct nft_expr *expr, const struct nlattr * const tb[]); diff --git a/net/ipv4/netfilter/nft_fib_ipv4.c b/net/ipv4/netfilter/nft_fib_ipv4.c index d25d717c121f0..f514eb52b8d4b 100644 --- a/net/ipv4/netfilter/nft_fib_ipv4.c +++ b/net/ipv4/netfilter/nft_fib_ipv4.c @@ -49,7 +49,12 @@ void nft_fib4_eval_type(const struct nft_expr *expr, struct nft_regs *regs, else addr = iph->saddr; - *dst = inet_dev_addr_type(nft_net(pkt), dev, addr); + if (priv->flags & (NFTA_FIB_F_IIF | NFTA_FIB_F_OIF)) { + *dst = inet_dev_addr_type(nft_net(pkt), dev, addr); + return; + } + + *dst = inet_addr_type_dev_table(nft_net(pkt), pkt->skb->dev, addr); } EXPORT_SYMBOL_GPL(nft_fib4_eval_type); @@ -64,8 +69,8 @@ void nft_fib4_eval(const struct nft_expr *expr, struct nft_regs *regs, struct flowi4 fl4 = { .flowi4_scope = RT_SCOPE_UNIVERSE, .flowi4_iif = LOOPBACK_IFINDEX, + .flowi4_proto = pkt->tprot, .flowi4_uid = sock_net_uid(nft_net(pkt), NULL), - .flowi4_l3mdev = l3mdev_master_ifindex_rcu(nft_in(pkt)), }; const struct net_device *oif; const struct net_device *found; @@ -89,6 +94,8 @@ void nft_fib4_eval(const struct nft_expr *expr, struct nft_regs *regs, else oif = NULL; + fl4.flowi4_l3mdev = nft_fib_l3mdev_master_ifindex_rcu(pkt, oif); + iph = skb_header_pointer(pkt->skb, noff, sizeof(_iph), &_iph); if (!iph) { regs->verdict.code = NFT_BREAK; diff --git a/net/ipv6/netfilter/nft_fib_ipv6.c b/net/ipv6/netfilter/nft_fib_ipv6.c index f1f5640da6728..421036a3605b4 100644 --- a/net/ipv6/netfilter/nft_fib_ipv6.c +++ b/net/ipv6/netfilter/nft_fib_ipv6.c @@ -50,6 +50,7 @@ static int nft_fib6_flowi_init(struct flowi6 *fl6, const struct nft_fib *priv, fl6->flowi6_mark = pkt->skb->mark; fl6->flowlabel = (*(__be32 *)iph) & IPV6_FLOWINFO_MASK; + fl6->flowi6_l3mdev = nft_fib_l3mdev_master_ifindex_rcu(pkt, dev); return lookup_flags; } @@ -73,8 +74,6 @@ static u32 __nft_fib6_eval_type(const struct nft_fib *priv, else if (priv->flags & NFTA_FIB_F_OIF) dev = nft_out(pkt); - fl6.flowi6_l3mdev = l3mdev_master_ifindex_rcu(dev); - nft_fib6_flowi_init(&fl6, priv, pkt, dev, iph); if (dev && nf_ipv6_chk_addr(nft_net(pkt), &fl6.daddr, dev, true)) @@ -166,7 +165,6 @@ void nft_fib6_eval(const struct nft_expr *expr, struct nft_regs *regs, .flowi6_iif = LOOPBACK_IFINDEX, .flowi6_proto = pkt->tprot, .flowi6_uid = sock_net_uid(nft_net(pkt), NULL), - .flowi6_l3mdev = l3mdev_master_ifindex_rcu(nft_in(pkt)), }; struct rt6_info *rt; int lookup_flags; -- GitLab From 9d04742f3e2d09e3453c9981dc5889600941e151 Mon Sep 17 00:00:00 2001 From: Fernando Fernandez Mancera Date: Wed, 21 May 2025 11:41:08 +0200 Subject: [PATCH 0902/2211] netfilter: nft_tunnel: fix geneve_opt dump [ Upstream commit 22a9613de4c29d7d0770bfb8a5a9d73eb8df7dad ] When dumping a nft_tunnel with more than one geneve_opt configured the netlink attribute hierarchy should be as follow: NFTA_TUNNEL_KEY_OPTS | |--NFTA_TUNNEL_KEY_OPTS_GENEVE | | | |--NFTA_TUNNEL_KEY_GENEVE_CLASS | |--NFTA_TUNNEL_KEY_GENEVE_TYPE | |--NFTA_TUNNEL_KEY_GENEVE_DATA | |--NFTA_TUNNEL_KEY_OPTS_GENEVE | | | |--NFTA_TUNNEL_KEY_GENEVE_CLASS | |--NFTA_TUNNEL_KEY_GENEVE_TYPE | |--NFTA_TUNNEL_KEY_GENEVE_DATA | |--NFTA_TUNNEL_KEY_OPTS_GENEVE ... Otherwise, userspace tools won't be able to fetch the geneve options configured correctly. Fixes: 925d844696d9 ("netfilter: nft_tunnel: add support for geneve opts") Signed-off-by: Fernando Fernandez Mancera Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- net/netfilter/nft_tunnel.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/net/netfilter/nft_tunnel.c b/net/netfilter/nft_tunnel.c index 0d99786c322e8..e18d322290fb0 100644 --- a/net/netfilter/nft_tunnel.c +++ b/net/netfilter/nft_tunnel.c @@ -624,10 +624,10 @@ static int nft_tunnel_opts_dump(struct sk_buff *skb, struct geneve_opt *opt; int offset = 0; - inner = nla_nest_start_noflag(skb, NFTA_TUNNEL_KEY_OPTS_GENEVE); - if (!inner) - goto failure; while (opts->len > offset) { + inner = nla_nest_start_noflag(skb, NFTA_TUNNEL_KEY_OPTS_GENEVE); + if (!inner) + goto failure; opt = (struct geneve_opt *)(opts->u.data + offset); if (nla_put_be16(skb, NFTA_TUNNEL_KEY_GENEVE_CLASS, opt->opt_class) || @@ -637,8 +637,8 @@ static int nft_tunnel_opts_dump(struct sk_buff *skb, opt->length * 4, opt->opt_data)) goto inner_failure; offset += sizeof(*opt) + opt->length * 4; + nla_nest_end(skb, inner); } - nla_nest_end(skb, inner); } nla_nest_end(skb, nest); return 0; -- GitLab From 82fe7fbc21f4e39f70d767351a5bd949cb2164b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= Date: Fri, 23 May 2025 12:47:28 +0200 Subject: [PATCH 0903/2211] RISC-V: KVM: lock the correct mp_state during reset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 7917be170928189fefad490d1a1237fdfa6b856f ] Currently, the kvm_riscv_vcpu_sbi_system_reset() function locks vcpu->arch.mp_state_lock when updating tmp->arch.mp_state.mp_state which is incorrect hence fix it. Fixes: 2121cadec45a ("RISCV: KVM: Introduce mp_state_lock to avoid lock inversion") Signed-off-by: Radim Krčmář Reviewed-by: Anup Patel Link: https://lore.kernel.org/r/20250523104725.2894546-4-rkrcmar@ventanamicro.com Signed-off-by: Anup Patel Signed-off-by: Sasha Levin --- arch/riscv/kvm/vcpu_sbi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/riscv/kvm/vcpu_sbi.c b/arch/riscv/kvm/vcpu_sbi.c index 6e704ed86a83a..635c67ed36653 100644 --- a/arch/riscv/kvm/vcpu_sbi.c +++ b/arch/riscv/kvm/vcpu_sbi.c @@ -139,9 +139,9 @@ void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu, struct kvm_vcpu *tmp; kvm_for_each_vcpu(i, tmp, vcpu->kvm) { - spin_lock(&vcpu->arch.mp_state_lock); + spin_lock(&tmp->arch.mp_state_lock); WRITE_ONCE(tmp->arch.mp_state.mp_state, KVM_MP_STATE_STOPPED); - spin_unlock(&vcpu->arch.mp_state_lock); + spin_unlock(&tmp->arch.mp_state_lock); } kvm_make_all_cpus_request(vcpu->kvm, KVM_REQ_SLEEP); -- GitLab From 30a9e834c74e260533b8d0885e3c89f6f32f7993 Mon Sep 17 00:00:00 2001 From: Nikita Zhandarovich Date: Tue, 20 May 2025 14:32:39 +0300 Subject: [PATCH 0904/2211] net: usb: aqc111: fix error handling of usbnet read calls [ Upstream commit 405b0d610745fb5e84fc2961d9b960abb9f3d107 ] Syzkaller, courtesy of syzbot, identified an error (see report [1]) in aqc111 driver, caused by incomplete sanitation of usb read calls' results. This problem is quite similar to the one fixed in commit 920a9fa27e78 ("net: asix: add proper error handling of usb read errors"). For instance, usbnet_read_cmd() may read fewer than 'size' bytes, even if the caller expected the full amount, and aqc111_read_cmd() will not check its result properly. As [1] shows, this may lead to MAC address in aqc111_bind() being only partly initialized, triggering KMSAN warnings. Fix the issue by verifying that the number of bytes read is as expected and not less. [1] Partial syzbot report: BUG: KMSAN: uninit-value in is_valid_ether_addr include/linux/etherdevice.h:208 [inline] BUG: KMSAN: uninit-value in usbnet_probe+0x2e57/0x4390 drivers/net/usb/usbnet.c:1830 is_valid_ether_addr include/linux/etherdevice.h:208 [inline] usbnet_probe+0x2e57/0x4390 drivers/net/usb/usbnet.c:1830 usb_probe_interface+0xd01/0x1310 drivers/usb/core/driver.c:396 call_driver_probe drivers/base/dd.c:-1 [inline] really_probe+0x4d1/0xd90 drivers/base/dd.c:658 __driver_probe_device+0x268/0x380 drivers/base/dd.c:800 ... Uninit was stored to memory at: dev_addr_mod+0xb0/0x550 net/core/dev_addr_lists.c:582 __dev_addr_set include/linux/netdevice.h:4874 [inline] eth_hw_addr_set include/linux/etherdevice.h:325 [inline] aqc111_bind+0x35f/0x1150 drivers/net/usb/aqc111.c:717 usbnet_probe+0xbe6/0x4390 drivers/net/usb/usbnet.c:1772 usb_probe_interface+0xd01/0x1310 drivers/usb/core/driver.c:396 ... Uninit was stored to memory at: ether_addr_copy include/linux/etherdevice.h:305 [inline] aqc111_read_perm_mac drivers/net/usb/aqc111.c:663 [inline] aqc111_bind+0x794/0x1150 drivers/net/usb/aqc111.c:713 usbnet_probe+0xbe6/0x4390 drivers/net/usb/usbnet.c:1772 usb_probe_interface+0xd01/0x1310 drivers/usb/core/driver.c:396 call_driver_probe drivers/base/dd.c:-1 [inline] ... Local variable buf.i created at: aqc111_read_perm_mac drivers/net/usb/aqc111.c:656 [inline] aqc111_bind+0x221/0x1150 drivers/net/usb/aqc111.c:713 usbnet_probe+0xbe6/0x4390 drivers/net/usb/usbnet.c:1772 Reported-by: syzbot+3b6b9ff7b80430020c7b@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=3b6b9ff7b80430020c7b Tested-by: syzbot+3b6b9ff7b80430020c7b@syzkaller.appspotmail.com Fixes: df2d59a2ab6c ("net: usb: aqc111: Add support for getting and setting of MAC address") Signed-off-by: Nikita Zhandarovich Link: https://patch.msgid.link/20250520113240.2369438-1-n.zhandarovich@fintech.ru Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/usb/aqc111.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/net/usb/aqc111.c b/drivers/net/usb/aqc111.c index ff5be2cbf17b9..453a2cf82753f 100644 --- a/drivers/net/usb/aqc111.c +++ b/drivers/net/usb/aqc111.c @@ -30,10 +30,13 @@ static int aqc111_read_cmd_nopm(struct usbnet *dev, u8 cmd, u16 value, ret = usbnet_read_cmd_nopm(dev, cmd, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, value, index, data, size); - if (unlikely(ret < 0)) + if (unlikely(ret < size)) { + ret = ret < 0 ? ret : -ENODATA; + netdev_warn(dev->net, "Failed to read(0x%x) reg index 0x%04x: %d\n", cmd, index, ret); + } return ret; } @@ -46,10 +49,13 @@ static int aqc111_read_cmd(struct usbnet *dev, u8 cmd, u16 value, ret = usbnet_read_cmd(dev, cmd, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, value, index, data, size); - if (unlikely(ret < 0)) + if (unlikely(ret < size)) { + ret = ret < 0 ? ret : -ENODATA; + netdev_warn(dev->net, "Failed to read(0x%x) reg index 0x%04x: %d\n", cmd, index, ret); + } return ret; } -- GitLab From 7893a41deaf28b53036d4ea7cd9f7d54e8874dfc Mon Sep 17 00:00:00 2001 From: Stefano Garzarella Date: Wed, 21 May 2025 14:17:05 +0200 Subject: [PATCH 0905/2211] vsock/virtio: fix `rx_bytes` accounting for stream sockets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 45ca7e9f0730ae36fc610e675b990e9cc9ca0714 ] In `struct virtio_vsock_sock`, we maintain two counters: - `rx_bytes`: used internally to track how many bytes have been read. This supports mechanisms like .stream_has_data() and sock_rcvlowat(). - `fwd_cnt`: used for the credit mechanism to inform available receive buffer space to the remote peer. These counters are updated via virtio_transport_inc_rx_pkt() and virtio_transport_dec_rx_pkt(). Since the beginning with commit 06a8fc78367d ("VSOCK: Introduce virtio_vsock_common.ko"), we call virtio_transport_dec_rx_pkt() in virtio_transport_stream_do_dequeue() only when we consume the entire packet, so partial reads, do not update `rx_bytes` and `fwd_cnt`. This is fine for `fwd_cnt`, because we still have space used for the entire packet, and we don't want to update the credit for the other peer until we free the space of the entire packet. However, this causes `rx_bytes` to be stale on partial reads. Previously, this didn’t cause issues because `rx_bytes` was used only by .stream_has_data(), and any unread portion of a packet implied data was still available. However, since commit 93b808876682 ("virtio/vsock: fix logic which reduces credit update messages"), we now rely on `rx_bytes` to determine if a credit update should be sent when the data in the RX queue drops below SO_RCVLOWAT value. This patch fixes the accounting by updating `rx_bytes` with the number of bytes actually read, even on partial reads, while leaving `fwd_cnt` untouched until the packet is fully consumed. Also introduce a new `buf_used` counter to check that the remote peer is honoring the given credit; this was previously done via `rx_bytes`. Fixes: 93b808876682 ("virtio/vsock: fix logic which reduces credit update messages") Signed-off-by: Stefano Garzarella Link: https://patch.msgid.link/20250521121705.196379-1-sgarzare@redhat.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- include/linux/virtio_vsock.h | 1 + net/vmw_vsock/virtio_transport_common.c | 26 +++++++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h index 0387d64e2c66c..36fb3edfa403d 100644 --- a/include/linux/virtio_vsock.h +++ b/include/linux/virtio_vsock.h @@ -140,6 +140,7 @@ struct virtio_vsock_sock { u32 last_fwd_cnt; u32 rx_bytes; u32 buf_alloc; + u32 buf_used; struct sk_buff_head rx_queue; u32 msg_count; }; diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index 7f7de6d880965..2c9b1011cdcc8 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -441,18 +441,20 @@ static int virtio_transport_send_pkt_info(struct vsock_sock *vsk, static bool virtio_transport_inc_rx_pkt(struct virtio_vsock_sock *vvs, u32 len) { - if (vvs->rx_bytes + len > vvs->buf_alloc) + if (vvs->buf_used + len > vvs->buf_alloc) return false; vvs->rx_bytes += len; + vvs->buf_used += len; return true; } static void virtio_transport_dec_rx_pkt(struct virtio_vsock_sock *vvs, - u32 len) + u32 bytes_read, u32 bytes_dequeued) { - vvs->rx_bytes -= len; - vvs->fwd_cnt += len; + vvs->rx_bytes -= bytes_read; + vvs->buf_used -= bytes_dequeued; + vvs->fwd_cnt += bytes_dequeued; } void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct sk_buff *skb) @@ -581,11 +583,11 @@ virtio_transport_stream_do_dequeue(struct vsock_sock *vsk, size_t len) { struct virtio_vsock_sock *vvs = vsk->trans; - size_t bytes, total = 0; struct sk_buff *skb; u32 fwd_cnt_delta; bool low_rx_bytes; int err = -EFAULT; + size_t total = 0; u32 free_space; spin_lock_bh(&vvs->rx_lock); @@ -597,6 +599,8 @@ virtio_transport_stream_do_dequeue(struct vsock_sock *vsk, } while (total < len && !skb_queue_empty(&vvs->rx_queue)) { + size_t bytes, dequeued = 0; + skb = skb_peek(&vvs->rx_queue); bytes = min_t(size_t, len - total, @@ -620,12 +624,12 @@ virtio_transport_stream_do_dequeue(struct vsock_sock *vsk, VIRTIO_VSOCK_SKB_CB(skb)->offset += bytes; if (skb->len == VIRTIO_VSOCK_SKB_CB(skb)->offset) { - u32 pkt_len = le32_to_cpu(virtio_vsock_hdr(skb)->len); - - virtio_transport_dec_rx_pkt(vvs, pkt_len); + dequeued = le32_to_cpu(virtio_vsock_hdr(skb)->len); __skb_unlink(skb, &vvs->rx_queue); consume_skb(skb); } + + virtio_transport_dec_rx_pkt(vvs, bytes, dequeued); } fwd_cnt_delta = vvs->fwd_cnt - vvs->last_fwd_cnt; @@ -781,7 +785,7 @@ static int virtio_transport_seqpacket_do_dequeue(struct vsock_sock *vsk, msg->msg_flags |= MSG_EOR; } - virtio_transport_dec_rx_pkt(vvs, pkt_len); + virtio_transport_dec_rx_pkt(vvs, pkt_len, pkt_len); kfree_skb(skb); } @@ -1735,6 +1739,7 @@ int virtio_transport_read_skb(struct vsock_sock *vsk, skb_read_actor_t recv_acto struct sock *sk = sk_vsock(vsk); struct virtio_vsock_hdr *hdr; struct sk_buff *skb; + u32 pkt_len; int off = 0; int err; @@ -1752,7 +1757,8 @@ int virtio_transport_read_skb(struct vsock_sock *vsk, skb_read_actor_t recv_acto if (le32_to_cpu(hdr->flags) & VIRTIO_VSOCK_SEQ_EOM) vvs->msg_count--; - virtio_transport_dec_rx_pkt(vvs, le32_to_cpu(hdr->len)); + pkt_len = le32_to_cpu(hdr->len); + virtio_transport_dec_rx_pkt(vvs, pkt_len, pkt_len); spin_unlock_bh(&vvs->rx_lock); virtio_transport_send_credit_update(vsk); -- GitLab From 02e45168e0fd6fdc6f8f7c42c4b500857aa5efb0 Mon Sep 17 00:00:00 2001 From: Jack Morgenstein Date: Wed, 21 May 2025 14:36:02 +0300 Subject: [PATCH 0906/2211] RDMA/cma: Fix hang when cma_netevent_callback fails to queue_work [ Upstream commit 92a251c3df8ea1991cd9fe00f1ab0cfce18d7711 ] The cited commit fixed a crash when cma_netevent_callback was called for a cma_id while work on that id from a previous call had not yet started. The work item was re-initialized in the second call, which corrupted the work item currently in the work queue. However, it left a problem when queue_work fails (because the item is still pending in the work queue from a previous call). In this case, cma_id_put (which is called in the work handler) is therefore not called. This results in a userspace process hang (zombie process). Fix this by calling cma_id_put() if queue_work fails. Fixes: 45f5dcdd0497 ("RDMA/cma: Fix workqueue crash in cma_netevent_work_handler") Link: https://patch.msgid.link/r/4f3640b501e48d0166f312a64fdadf72b059bd04.1747827103.git.leon@kernel.org Signed-off-by: Jack Morgenstein Signed-off-by: Feng Liu Reviewed-by: Vlad Dumitrescu Signed-off-by: Leon Romanovsky Reviewed-by: Sharath Srinivasan Reviewed-by: Kalesh AP Signed-off-by: Jason Gunthorpe Signed-off-by: Sasha Levin --- drivers/infiniband/core/cma.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 176d0b3e44887..81bc24a346d37 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -5231,7 +5231,8 @@ static int cma_netevent_callback(struct notifier_block *self, neigh->ha, ETH_ALEN)) continue; cma_id_get(current_id); - queue_work(cma_wq, ¤t_id->id.net_work); + if (!queue_work(cma_wq, ¤t_id->id.net_work)) + cma_id_put(current_id); } out: spin_unlock_irqrestore(&id_table_lock, flags); -- GitLab From f066d85170bd2e7f9c52f19f546d5bc4664a1438 Mon Sep 17 00:00:00 2001 From: Horatiu Vultur Date: Wed, 21 May 2025 14:41:59 +0200 Subject: [PATCH 0907/2211] net: lan966x: Fix 1-step timestamping over ipv4 or ipv6 [ Upstream commit 57ee9584fd8606deef66d7b65fa4dcf94f6843aa ] When enabling 1-step timestamping for ptp frames that are over udpv4 or udpv6 then the inserted timestamp is added at the wrong offset in the frame, meaning that will modify the frame at the wrong place, so the frame will be malformed. To fix this, the HW needs to know which kind of frame it is to know where to insert the timestamp. For that there is a field in the IFH that says the PDU_TYPE, which can be NONE which is the default value, IPV4 or IPV6. Therefore make sure to set the PDU_TYPE so the HW knows where to insert the timestamp. Like I mention before the issue is not seen with L2 frames because by default the PDU_TYPE has a value of 0, which represents the L2 frames. Fixes: 77eecf25bd9d2f ("net: lan966x: Update extraction/injection for timestamping") Signed-off-by: Horatiu Vultur Link: https://patch.msgid.link/20250521124159.2713525-1-horatiu.vultur@microchip.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- .../ethernet/microchip/lan966x/lan966x_main.c | 6 +++ .../ethernet/microchip/lan966x/lan966x_main.h | 5 ++ .../ethernet/microchip/lan966x/lan966x_ptp.c | 49 ++++++++++++++----- 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_main.c b/drivers/net/ethernet/microchip/lan966x/lan966x_main.c index 534d4716d5f7d..73832bba93270 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_main.c +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_main.c @@ -353,6 +353,11 @@ static void lan966x_ifh_set_rew_op(void *ifh, u64 rew_op) lan966x_ifh_set(ifh, rew_op, IFH_POS_REW_CMD, IFH_WID_REW_CMD); } +static void lan966x_ifh_set_oam_type(void *ifh, u64 oam_type) +{ + lan966x_ifh_set(ifh, oam_type, IFH_POS_PDU_TYPE, IFH_WID_PDU_TYPE); +} + static void lan966x_ifh_set_timestamp(void *ifh, u64 timestamp) { lan966x_ifh_set(ifh, timestamp, IFH_POS_TIMESTAMP, IFH_WID_TIMESTAMP); @@ -380,6 +385,7 @@ static netdev_tx_t lan966x_port_xmit(struct sk_buff *skb, return err; lan966x_ifh_set_rew_op(ifh, LAN966X_SKB_CB(skb)->rew_op); + lan966x_ifh_set_oam_type(ifh, LAN966X_SKB_CB(skb)->pdu_type); lan966x_ifh_set_timestamp(ifh, LAN966X_SKB_CB(skb)->ts_id); } diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_main.h b/drivers/net/ethernet/microchip/lan966x/lan966x_main.h index 25cb2f61986f6..bd3d19cea0034 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_main.h +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_main.h @@ -75,6 +75,10 @@ #define IFH_REW_OP_ONE_STEP_PTP 0x3 #define IFH_REW_OP_TWO_STEP_PTP 0x4 +#define IFH_PDU_TYPE_NONE 0 +#define IFH_PDU_TYPE_IPV4 7 +#define IFH_PDU_TYPE_IPV6 8 + #define FDMA_RX_DCB_MAX_DBS 1 #define FDMA_TX_DCB_MAX_DBS 1 @@ -254,6 +258,7 @@ struct lan966x_phc { struct lan966x_skb_cb { u8 rew_op; + u8 pdu_type; u16 ts_id; unsigned long jiffies; }; diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c b/drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c index 63905bb5a63a8..87e5e81d40dc6 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c @@ -322,34 +322,55 @@ void lan966x_ptp_hwtstamp_get(struct lan966x_port *port, *cfg = phc->hwtstamp_config; } -static int lan966x_ptp_classify(struct lan966x_port *port, struct sk_buff *skb) +static void lan966x_ptp_classify(struct lan966x_port *port, struct sk_buff *skb, + u8 *rew_op, u8 *pdu_type) { struct ptp_header *header; u8 msgtype; int type; - if (port->ptp_tx_cmd == IFH_REW_OP_NOOP) - return IFH_REW_OP_NOOP; + if (port->ptp_tx_cmd == IFH_REW_OP_NOOP) { + *rew_op = IFH_REW_OP_NOOP; + *pdu_type = IFH_PDU_TYPE_NONE; + return; + } type = ptp_classify_raw(skb); - if (type == PTP_CLASS_NONE) - return IFH_REW_OP_NOOP; + if (type == PTP_CLASS_NONE) { + *rew_op = IFH_REW_OP_NOOP; + *pdu_type = IFH_PDU_TYPE_NONE; + return; + } header = ptp_parse_header(skb, type); - if (!header) - return IFH_REW_OP_NOOP; + if (!header) { + *rew_op = IFH_REW_OP_NOOP; + *pdu_type = IFH_PDU_TYPE_NONE; + return; + } - if (port->ptp_tx_cmd == IFH_REW_OP_TWO_STEP_PTP) - return IFH_REW_OP_TWO_STEP_PTP; + if (type & PTP_CLASS_L2) + *pdu_type = IFH_PDU_TYPE_NONE; + if (type & PTP_CLASS_IPV4) + *pdu_type = IFH_PDU_TYPE_IPV4; + if (type & PTP_CLASS_IPV6) + *pdu_type = IFH_PDU_TYPE_IPV6; + + if (port->ptp_tx_cmd == IFH_REW_OP_TWO_STEP_PTP) { + *rew_op = IFH_REW_OP_TWO_STEP_PTP; + return; + } /* If it is sync and run 1 step then set the correct operation, * otherwise run as 2 step */ msgtype = ptp_get_msgtype(header, type); - if ((msgtype & 0xf) == 0) - return IFH_REW_OP_ONE_STEP_PTP; + if ((msgtype & 0xf) == 0) { + *rew_op = IFH_REW_OP_ONE_STEP_PTP; + return; + } - return IFH_REW_OP_TWO_STEP_PTP; + *rew_op = IFH_REW_OP_TWO_STEP_PTP; } static void lan966x_ptp_txtstamp_old_release(struct lan966x_port *port) @@ -374,10 +395,12 @@ int lan966x_ptp_txtstamp_request(struct lan966x_port *port, { struct lan966x *lan966x = port->lan966x; unsigned long flags; + u8 pdu_type; u8 rew_op; - rew_op = lan966x_ptp_classify(port, skb); + lan966x_ptp_classify(port, skb, &rew_op, &pdu_type); LAN966X_SKB_CB(skb)->rew_op = rew_op; + LAN966X_SKB_CB(skb)->pdu_type = pdu_type; if (rew_op != IFH_REW_OP_TWO_STEP_PTP) return 0; -- GitLab From 3a92988a769582dcc0918380d5b54eb355e433d2 Mon Sep 17 00:00:00 2001 From: Suraj Gupta Date: Wed, 21 May 2025 23:46:08 +0530 Subject: [PATCH 0908/2211] net: xilinx: axienet: Fix Tx skb circular buffer occupancy check in dmaengine xmit [ Upstream commit 32374234ab0101881e7d0c6a8ef7ebce566c46c9 ] In Dmaengine flow, driver maintains struct skbuf_dma_descriptor rings each element of which corresponds to a skb. In Tx datapath, compare available space in skb ring with number of skbs instead of skb fragments. Replace x * (MAX_SKB_FRAGS) in netif_txq_completed_wake() and netif_txq_maybe_stop() with x * (1 skb) to fix the comparison. Fixes: 6a91b846af85 ("net: axienet: Introduce dmaengine support") Signed-off-by: Suraj Gupta Reviewed-by: Sean Anderson Link: https://patch.msgid.link/20250521181608.669554-1-suraj.gupta2@amd.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c index fe3438abcd253..2d47b35443af0 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c @@ -843,7 +843,7 @@ static void axienet_dma_tx_cb(void *data, const struct dmaengine_result *result) dev_consume_skb_any(skbuf_dma->skb); netif_txq_completed_wake(txq, 1, len, CIRC_SPACE(lp->tx_ring_head, lp->tx_ring_tail, TX_BD_NUM_MAX), - 2 * MAX_SKB_FRAGS); + 2); } /** @@ -877,7 +877,7 @@ axienet_start_xmit_dmaengine(struct sk_buff *skb, struct net_device *ndev) dma_dev = lp->tx_chan->device; sg_len = skb_shinfo(skb)->nr_frags + 1; - if (CIRC_SPACE(lp->tx_ring_head, lp->tx_ring_tail, TX_BD_NUM_MAX) <= sg_len) { + if (CIRC_SPACE(lp->tx_ring_head, lp->tx_ring_tail, TX_BD_NUM_MAX) <= 1) { netif_stop_queue(ndev); if (net_ratelimit()) netdev_warn(ndev, "TX ring unexpectedly full\n"); @@ -927,7 +927,7 @@ axienet_start_xmit_dmaengine(struct sk_buff *skb, struct net_device *ndev) txq = skb_get_tx_queue(lp->ndev, skb); netdev_tx_sent_queue(txq, skb->len); netif_txq_maybe_stop(txq, CIRC_SPACE(lp->tx_ring_head, lp->tx_ring_tail, TX_BD_NUM_MAX), - MAX_SKB_FRAGS + 1, 2 * MAX_SKB_FRAGS); + 1, 2); dmaengine_submit(dma_tx_desc); dma_async_issue_pending(lp->tx_chan); -- GitLab From 2bc6dffb4b72d53d6a6ada510269bf548c3f7ae0 Mon Sep 17 00:00:00 2001 From: KaFai Wan Date: Mon, 26 May 2025 21:33:58 +0800 Subject: [PATCH 0909/2211] bpf: Avoid __bpf_prog_ret0_warn when jit fails [ Upstream commit 86bc9c742426a16b52a10ef61f5b721aecca2344 ] syzkaller reported an issue: WARNING: CPU: 3 PID: 217 at kernel/bpf/core.c:2357 __bpf_prog_ret0_warn+0xa/0x20 kernel/bpf/core.c:2357 Modules linked in: CPU: 3 UID: 0 PID: 217 Comm: kworker/u32:6 Not tainted 6.15.0-rc4-syzkaller-00040-g8bac8898fe39 RIP: 0010:__bpf_prog_ret0_warn+0xa/0x20 kernel/bpf/core.c:2357 Call Trace: bpf_dispatcher_nop_func include/linux/bpf.h:1316 [inline] __bpf_prog_run include/linux/filter.h:718 [inline] bpf_prog_run include/linux/filter.h:725 [inline] cls_bpf_classify+0x74a/0x1110 net/sched/cls_bpf.c:105 ... When creating bpf program, 'fp->jit_requested' depends on bpf_jit_enable. This issue is triggered because of CONFIG_BPF_JIT_ALWAYS_ON is not set and bpf_jit_enable is set to 1, causing the arch to attempt JIT the prog, but jit failed due to FAULT_INJECTION. As a result, incorrectly treats the program as valid, when the program runs it calls `__bpf_prog_ret0_warn` and triggers the WARN_ON_ONCE(1). Reported-by: syzbot+0903f6d7f285e41cdf10@syzkaller.appspotmail.com Closes: https://lore.kernel.org/bpf/6816e34e.a70a0220.254cdc.002c.GAE@google.com Fixes: fa9dd599b4da ("bpf: get rid of pure_initcall dependency to enable jits") Signed-off-by: KaFai Wan Link: https://lore.kernel.org/r/20250526133358.2594176-1-mannkafai@gmail.com Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- kernel/bpf/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index a713cc7b00849..68a327158989b 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -2419,7 +2419,7 @@ struct bpf_prog *bpf_prog_select_runtime(struct bpf_prog *fp, int *err) /* In case of BPF to BPF calls, verifier did all the prep * work with regards to JITing, etc. */ - bool jit_needed = false; + bool jit_needed = fp->jit_requested; if (fp->bpf_func) goto finalize; -- GitLab From ddc654e89ace723b78c34911c65243accbc9b75c Mon Sep 17 00:00:00 2001 From: Wei Fang Date: Fri, 23 May 2025 16:37:59 +0800 Subject: [PATCH 0910/2211] net: phy: clear phydev->devlink when the link is deleted [ Upstream commit 0795b05a59b1371b18ffbf09d385296b12e9f5d5 ] There is a potential crash issue when disabling and re-enabling the network port. When disabling the network port, phy_detach() calls device_link_del() to remove the device link, but it does not clear phydev->devlink, so phydev->devlink is not a NULL pointer. Then the network port is re-enabled, but if phy_attach_direct() fails before calling device_link_add(), the code jumps to the "error" label and calls phy_detach(). Since phydev->devlink retains the old value from the previous attach/detach cycle, device_link_del() uses the old value, which accesses a NULL pointer and causes a crash. The simplified crash log is as follows. [ 24.702421] Call trace: [ 24.704856] device_link_put_kref+0x20/0x120 [ 24.709124] device_link_del+0x30/0x48 [ 24.712864] phy_detach+0x24/0x168 [ 24.716261] phy_attach_direct+0x168/0x3a4 [ 24.720352] phylink_fwnode_phy_connect+0xc8/0x14c [ 24.725140] phylink_of_phy_connect+0x1c/0x34 Therefore, phydev->devlink needs to be cleared when the device link is deleted. Fixes: bc66fa87d4fd ("net: phy: Add link between phy dev and mac dev") Signed-off-by: Wei Fang Reviewed-by: Andrew Lunn Reviewed-by: Florian Fainelli Link: https://patch.msgid.link/20250523083759.3741168-1-wei.fang@nxp.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/phy/phy_device.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 8af44224480f1..13dea33d86ffa 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -2010,8 +2010,10 @@ void phy_detach(struct phy_device *phydev) struct module *ndev_owner = NULL; struct mii_bus *bus; - if (phydev->devlink) + if (phydev->devlink) { device_link_del(phydev->devlink); + phydev->devlink = NULL; + } if (phydev->sysfs_links) { if (dev) -- GitLab From f15ed37dd3af84964666793a6098fa866e5f4a4a Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 22 May 2025 13:21:47 +0200 Subject: [PATCH 0911/2211] net: phy: fix up const issues in to_mdio_device() and to_phy_device() [ Upstream commit e9cb929670a1e98b592b30f03f06e9e20110f318 ] Both to_mdio_device() and to_phy_device() "throw away" the const pointer attribute passed to them and return a non-const pointer, which generally is not a good thing overall. Fix this up by using container_of_const() which was designed for this very problem. Cc: Alexander Lobakin Cc: Andrew Lunn Cc: Heiner Kallweit Cc: Russell King Fixes: 7eab14de73a8 ("mdio, phy: fix -Wshadow warnings triggered by nested container_of()") Signed-off-by: Greg Kroah-Hartman Link: https://patch.msgid.link/2025052246-conduit-glory-8fc9@gregkh Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- include/linux/mdio.h | 5 +---- include/linux/phy.h | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/include/linux/mdio.h b/include/linux/mdio.h index efeca5bd7600b..84b0805918372 100644 --- a/include/linux/mdio.h +++ b/include/linux/mdio.h @@ -45,10 +45,7 @@ struct mdio_device { unsigned int reset_deassert_delay; }; -static inline struct mdio_device *to_mdio_device(const struct device *dev) -{ - return container_of(dev, struct mdio_device, dev); -} +#define to_mdio_device(__dev) container_of_const(__dev, struct mdio_device, dev) /* struct mdio_driver_common: Common to all MDIO drivers */ struct mdio_driver_common { diff --git a/include/linux/phy.h b/include/linux/phy.h index 945264f457d8a..dfc7b97f9648d 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -792,10 +792,7 @@ struct phy_device { #define PHY_F_NO_IRQ 0x80000000 #define PHY_F_RXC_ALWAYS_ON 0x40000000 -static inline struct phy_device *to_phy_device(const struct device *dev) -{ - return container_of(to_mdio_device(dev), struct phy_device, mdio); -} +#define to_phy_device(__dev) container_of_const(to_mdio_device(__dev), struct phy_device, mdio) /** * struct phy_tdr_config - Configuration of a TDR raw test -- GitLab From 0e5c90c2ae50a15d183ee407fc50460d07ba94e1 Mon Sep 17 00:00:00 2001 From: Thangaraj Samynathan Date: Mon, 26 May 2025 11:00:47 +0530 Subject: [PATCH 0912/2211] net: lan743x: rename lan743x_reset_phy to lan743x_hw_reset_phy [ Upstream commit 68927eb52d0af04863584930db06075d2610e194 ] rename the function to lan743x_hw_reset_phy to better describe it operation. Fixes: 23f0703c125be ("lan743x: Add main source files for new lan743x driver") Signed-off-by: Thangaraj Samynathan Reviewed-by: Andrew Lunn Link: https://patch.msgid.link/20250526053048.287095-2-thangaraj.s@microchip.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/microchip/lan743x_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c index 812ad9d61676a..8d53a35a2b561 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -1330,7 +1330,7 @@ static int lan743x_mac_set_mtu(struct lan743x_adapter *adapter, int new_mtu) } /* PHY */ -static int lan743x_phy_reset(struct lan743x_adapter *adapter) +static int lan743x_hw_reset_phy(struct lan743x_adapter *adapter) { u32 data; @@ -1348,7 +1348,7 @@ static int lan743x_phy_reset(struct lan743x_adapter *adapter) static int lan743x_phy_init(struct lan743x_adapter *adapter) { - return lan743x_phy_reset(adapter); + return lan743x_hw_reset_phy(adapter); } static void lan743x_phy_interface_select(struct lan743x_adapter *adapter) -- GitLab From 4b073a575b7f892ed90d345c2cedbb5e712dd522 Mon Sep 17 00:00:00 2001 From: Thangaraj Samynathan Date: Mon, 26 May 2025 11:00:48 +0530 Subject: [PATCH 0913/2211] net: lan743x: Fix PHY reset handling during initialization and WOL [ Upstream commit 82d1096ca8b5dbb3158d707e6fb3ad21c3403a49 ] Remove lan743x_phy_init from lan743x_hardware_init as it resets the PHY registers, causing WOL to fail on subsequent attempts. Add a call to lan743x_hw_reset_phy in the probe function to ensure the PHY is reset during device initialization. Fixes: 23f0703c125be ("lan743x: Add main source files for new lan743x driver") Signed-off-by: Thangaraj Samynathan Reviewed-by: Andrew Lunn Link: https://patch.msgid.link/20250526053048.287095-3-thangaraj.s@microchip.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/microchip/lan743x_main.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c index 8d53a35a2b561..9836fbbea0cc2 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -1346,11 +1346,6 @@ static int lan743x_hw_reset_phy(struct lan743x_adapter *adapter) 50000, 1000000); } -static int lan743x_phy_init(struct lan743x_adapter *adapter) -{ - return lan743x_hw_reset_phy(adapter); -} - static void lan743x_phy_interface_select(struct lan743x_adapter *adapter) { u32 id_rev; @@ -3505,10 +3500,6 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter, if (ret) return ret; - ret = lan743x_phy_init(adapter); - if (ret) - return ret; - ret = lan743x_ptp_init(adapter); if (ret) return ret; @@ -3642,6 +3633,10 @@ static int lan743x_pcidev_probe(struct pci_dev *pdev, if (ret) goto cleanup_pci; + ret = lan743x_hw_reset_phy(adapter); + if (ret) + goto cleanup_pci; + ret = lan743x_hardware_init(adapter, pdev); if (ret) goto cleanup_pci; -- GitLab From 66abe22017522dd56b820e41ca3a5b131a637001 Mon Sep 17 00:00:00 2001 From: Horatiu Vultur Date: Thu, 22 May 2025 13:57:22 +0200 Subject: [PATCH 0914/2211] net: phy: mscc: Fix memory leak when using one step timestamping [ Upstream commit 846992645b25ec4253167e3f931e4597eb84af56 ] Fix memory leak when running one-step timestamping. When running one-step sync timestamping, the HW is configured to insert the TX time into the frame, so there is no reason to keep the skb anymore. As in this case the HW will never generate an interrupt to say that the frame was timestamped, then the frame will never released. Fix this by freeing the frame in case of one-step timestamping. Fixes: 7d272e63e0979d ("net: phy: mscc: timestamping and PHC support") Signed-off-by: Horatiu Vultur Link: https://patch.msgid.link/20250522115722.2827199-1-horatiu.vultur@microchip.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/phy/mscc/mscc_ptp.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/drivers/net/phy/mscc/mscc_ptp.c b/drivers/net/phy/mscc/mscc_ptp.c index 738a8822fcf01..0173aa3b4ead1 100644 --- a/drivers/net/phy/mscc/mscc_ptp.c +++ b/drivers/net/phy/mscc/mscc_ptp.c @@ -1163,18 +1163,24 @@ static void vsc85xx_txtstamp(struct mii_timestamper *mii_ts, container_of(mii_ts, struct vsc8531_private, mii_ts); if (!vsc8531->ptp->configured) - return; + goto out; - if (vsc8531->ptp->tx_type == HWTSTAMP_TX_OFF) { - kfree_skb(skb); - return; - } + if (vsc8531->ptp->tx_type == HWTSTAMP_TX_OFF) + goto out; + + if (vsc8531->ptp->tx_type == HWTSTAMP_TX_ONESTEP_SYNC) + if (ptp_msg_is_sync(skb, type)) + goto out; skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; mutex_lock(&vsc8531->ts_lock); __skb_queue_tail(&vsc8531->ptp->tx_queue, skb); mutex_unlock(&vsc8531->ts_lock); + return; + +out: + kfree_skb(skb); } static bool vsc85xx_rxtstamp(struct mii_timestamper *mii_ts, -- GitLab From 91bed4ccae01b239969488595ff056a8dc45304f Mon Sep 17 00:00:00 2001 From: Hariprasad Kelam Date: Thu, 22 May 2025 15:17:41 +0530 Subject: [PATCH 0915/2211] octeontx2-pf: QOS: Perform cache sync on send queue teardown [ Upstream commit 479c58016099d19686e36f6c50f912360839a7fa ] QOS is designed to create a new send queue whenever a class is created, ensuring proper shaping and scheduling. However, when multiple send queues are created and deleted in a loop, SMMU errors are observed. This patch addresses the issue by performing an data cache sync during the teardown of QOS send queues. Fixes: ab6dddd2a669 ("octeontx2-pf: qos send queues management") Signed-off-by: Hariprasad Kelam Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250522094742.1498295-1-hkelam@marvell.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- .../ethernet/marvell/octeontx2/nic/qos_sq.c | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/qos_sq.c b/drivers/net/ethernet/marvell/octeontx2/nic/qos_sq.c index 9d887bfc31089..ac9345644068e 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/qos_sq.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/qos_sq.c @@ -256,6 +256,26 @@ out: return err; } +static int otx2_qos_nix_npa_ndc_sync(struct otx2_nic *pfvf) +{ + struct ndc_sync_op *req; + int rc; + + mutex_lock(&pfvf->mbox.lock); + + req = otx2_mbox_alloc_msg_ndc_sync_op(&pfvf->mbox); + if (!req) { + mutex_unlock(&pfvf->mbox.lock); + return -ENOMEM; + } + + req->nix_lf_tx_sync = true; + req->npa_lf_sync = true; + rc = otx2_sync_mbox_msg(&pfvf->mbox); + mutex_unlock(&pfvf->mbox.lock); + return rc; +} + void otx2_qos_disable_sq(struct otx2_nic *pfvf, int qidx) { struct otx2_qset *qset = &pfvf->qset; @@ -285,6 +305,8 @@ void otx2_qos_disable_sq(struct otx2_nic *pfvf, int qidx) otx2_qos_sqb_flush(pfvf, sq_idx); otx2_smq_flush(pfvf, otx2_get_smq_idx(pfvf, sq_idx)); + /* NIX/NPA NDC sync */ + otx2_qos_nix_npa_ndc_sync(pfvf); otx2_cleanup_tx_cqes(pfvf, cq); mutex_lock(&pfvf->mbox.lock); -- GitLab From ec62c99914a79d84c8de5ba1b94d62f2ed721f2a Mon Sep 17 00:00:00 2001 From: Hariprasad Kelam Date: Thu, 22 May 2025 17:28:42 +0530 Subject: [PATCH 0916/2211] octeontx2-pf: QOS: Refactor TC_HTB_LEAF_DEL_LAST callback [ Upstream commit 67af4ec948e8ce3ea53a9cf614d01fddf172e56d ] This patch addresses below issues, 1. Active traffic on the leaf node must be stopped before its send queue is reassigned to the parent. This patch resolves the issue by marking the node as 'Inner'. 2. During a system reboot, the interface receives TC_HTB_LEAF_DEL and TC_HTB_LEAF_DEL_LAST callbacks to delete its HTB queues. In the case of TC_HTB_LEAF_DEL_LAST, although the same send queue is reassigned to the parent, the current logic still attempts to update the real number of queues, leadning to below warnings New queues can't be registered after device unregistration. WARNING: CPU: 0 PID: 6475 at net/core/net-sysfs.c:1714 netdev_queue_update_kobjects+0x1e4/0x200 Fixes: 5e6808b4c68d ("octeontx2-pf: Add support for HTB offload") Signed-off-by: Hariprasad Kelam Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250522115842.1499666-1-hkelam@marvell.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/marvell/octeontx2/nic/qos.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/qos.c b/drivers/net/ethernet/marvell/octeontx2/nic/qos.c index 35acc07bd9648..5765bac119f0e 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/qos.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/qos.c @@ -1638,6 +1638,7 @@ static int otx2_qos_leaf_del_last(struct otx2_nic *pfvf, u16 classid, bool force if (!node->is_static) dwrr_del_node = true; + WRITE_ONCE(node->qid, OTX2_QOS_QID_INNER); /* destroy the leaf node */ otx2_qos_disable_sq(pfvf, qid); otx2_qos_destroy_node(pfvf, node); @@ -1682,9 +1683,6 @@ static int otx2_qos_leaf_del_last(struct otx2_nic *pfvf, u16 classid, bool force } kfree(new_cfg); - /* update tx_real_queues */ - otx2_qos_update_tx_netdev_queues(pfvf); - return 0; } -- GitLab From dd8928897594931d6912ef2f7a43e110b4958d3d Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Thu, 22 May 2025 15:18:56 -0700 Subject: [PATCH 0917/2211] calipso: Don't call calipso functions for AF_INET sk. [ Upstream commit 6e9f2df1c550ead7cecb3e450af1105735020c92 ] syzkaller reported a null-ptr-deref in txopt_get(). [0] The offset 0x70 was of struct ipv6_txoptions in struct ipv6_pinfo, so struct ipv6_pinfo was NULL there. However, this never happens for IPv6 sockets as inet_sk(sk)->pinet6 is always set in inet6_create(), meaning the socket was not IPv6 one. The root cause is missing validation in netlbl_conn_setattr(). netlbl_conn_setattr() switches branches based on struct sockaddr.sa_family, which is passed from userspace. However, netlbl_conn_setattr() does not check if the address family matches the socket. The syzkaller must have called connect() for an IPv6 address on an IPv4 socket. We have a proper validation in tcp_v[46]_connect(), but security_socket_connect() is called in the earlier stage. Let's copy the validation to netlbl_conn_setattr(). [0]: Oops: general protection fault, probably for non-canonical address 0xdffffc000000000e: 0000 [#1] PREEMPT SMP KASAN NOPTI KASAN: null-ptr-deref in range [0x0000000000000070-0x0000000000000077] CPU: 2 UID: 0 PID: 12928 Comm: syz.9.1677 Not tainted 6.12.0 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014 RIP: 0010:txopt_get include/net/ipv6.h:390 [inline] RIP: 0010: Code: 02 00 00 49 8b ac 24 f8 02 00 00 e8 84 69 2a fd e8 ff 00 16 fd 48 8d 7d 70 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 <80> 3c 02 00 0f 85 53 02 00 00 48 8b 6d 70 48 85 ed 0f 84 ab 01 00 RSP: 0018:ffff88811b8afc48 EFLAGS: 00010212 RAX: dffffc0000000000 RBX: 1ffff11023715f8a RCX: ffffffff841ab00c RDX: 000000000000000e RSI: ffffc90007d9e000 RDI: 0000000000000070 RBP: 0000000000000000 R08: ffffed1023715f9d R09: ffffed1023715f9e R10: ffffed1023715f9d R11: 0000000000000003 R12: ffff888123075f00 R13: ffff88810245bd80 R14: ffff888113646780 R15: ffff888100578a80 FS: 00007f9019bd7640(0000) GS:ffff8882d2d00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f901b927bac CR3: 0000000104788003 CR4: 0000000000770ef0 PKRU: 80000000 Call Trace: calipso_sock_setattr+0x56/0x80 net/netlabel/netlabel_calipso.c:557 netlbl_conn_setattr+0x10c/0x280 net/netlabel/netlabel_kapi.c:1177 selinux_netlbl_socket_connect_helper+0xd3/0x1b0 security/selinux/netlabel.c:569 selinux_netlbl_socket_connect_locked security/selinux/netlabel.c:597 [inline] selinux_netlbl_socket_connect+0xb6/0x100 security/selinux/netlabel.c:615 selinux_socket_connect+0x5f/0x80 security/selinux/hooks.c:4931 security_socket_connect+0x50/0xa0 security/security.c:4598 __sys_connect_file+0xa4/0x190 net/socket.c:2067 __sys_connect+0x12c/0x170 net/socket.c:2088 __do_sys_connect net/socket.c:2098 [inline] __se_sys_connect net/socket.c:2095 [inline] __x64_sys_connect+0x73/0xb0 net/socket.c:2095 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xaa/0x1b0 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f901b61a12d Code: 02 b8 ff ff ff ff c3 66 0f 1f 44 00 00 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 a8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f9019bd6fa8 EFLAGS: 00000246 ORIG_RAX: 000000000000002a RAX: ffffffffffffffda RBX: 00007f901b925fa0 RCX: 00007f901b61a12d RDX: 000000000000001c RSI: 0000200000000140 RDI: 0000000000000003 RBP: 00007f901b701505 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 R13: 0000000000000000 R14: 00007f901b5b62a0 R15: 00007f9019bb7000 Modules linked in: Fixes: ceba1832b1b2 ("calipso: Set the calipso socket label to match the secattr.") Reported-by: syzkaller Reported-by: John Cheung Closes: https://lore.kernel.org/netdev/CAP=Rh=M1LzunrcQB1fSGauMrJrhL6GGps5cPAKzHJXj6GQV+-g@mail.gmail.com/ Signed-off-by: Kuniyuki Iwashima Acked-by: Paul Moore Link: https://patch.msgid.link/20250522221858.91240-1-kuniyu@amazon.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/netlabel/netlabel_kapi.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c index cd9160bbc9197..6ea16138582c0 100644 --- a/net/netlabel/netlabel_kapi.c +++ b/net/netlabel/netlabel_kapi.c @@ -1165,6 +1165,9 @@ int netlbl_conn_setattr(struct sock *sk, break; #if IS_ENABLED(CONFIG_IPV6) case AF_INET6: + if (sk->sk_family != AF_INET6) + return -EAFNOSUPPORT; + addr6 = (struct sockaddr_in6 *)addr; entry = netlbl_domhsh_getentry_af6(secattr->domain, &addr6->sin6_addr); -- GitLab From 69541e58323ec3e3904e1fa87a6213961b1f52f4 Mon Sep 17 00:00:00 2001 From: Faicker Mo Date: Fri, 23 May 2025 03:41:43 +0000 Subject: [PATCH 0918/2211] net: openvswitch: Fix the dead loop of MPLS parse [ Upstream commit 0bdc924bfb319fb10d1113cbf091fc26fb7b1f99 ] The unexpected MPLS packet may not end with the bottom label stack. When there are many stacks, The label count value has wrapped around. A dead loop occurs, soft lockup/CPU stuck finally. stack backtrace: UBSAN: array-index-out-of-bounds in /build/linux-0Pa0xK/linux-5.15.0/net/openvswitch/flow.c:662:26 index -1 is out of range for type '__be32 [3]' CPU: 34 PID: 0 Comm: swapper/34 Kdump: loaded Tainted: G OE 5.15.0-121-generic #131-Ubuntu Hardware name: Dell Inc. PowerEdge C6420/0JP9TF, BIOS 2.12.2 07/14/2021 Call Trace: show_stack+0x52/0x5c dump_stack_lvl+0x4a/0x63 dump_stack+0x10/0x16 ubsan_epilogue+0x9/0x36 __ubsan_handle_out_of_bounds.cold+0x44/0x49 key_extract_l3l4+0x82a/0x840 [openvswitch] ? kfree_skbmem+0x52/0xa0 key_extract+0x9c/0x2b0 [openvswitch] ovs_flow_key_extract+0x124/0x350 [openvswitch] ovs_vport_receive+0x61/0xd0 [openvswitch] ? kernel_init_free_pages.part.0+0x4a/0x70 ? get_page_from_freelist+0x353/0x540 netdev_port_receive+0xc4/0x180 [openvswitch] ? netdev_port_receive+0x180/0x180 [openvswitch] netdev_frame_hook+0x1f/0x40 [openvswitch] __netif_receive_skb_core.constprop.0+0x23a/0xf00 __netif_receive_skb_list_core+0xfa/0x240 netif_receive_skb_list_internal+0x18e/0x2a0 napi_complete_done+0x7a/0x1c0 bnxt_poll+0x155/0x1c0 [bnxt_en] __napi_poll+0x30/0x180 net_rx_action+0x126/0x280 ? bnxt_msix+0x67/0x80 [bnxt_en] handle_softirqs+0xda/0x2d0 irq_exit_rcu+0x96/0xc0 common_interrupt+0x8e/0xa0 Fixes: fbdcdd78da7c ("Change in Openvswitch to support MPLS label depth of 3 in ingress direction") Signed-off-by: Faicker Mo Acked-by: Ilya Maximets Reviewed-by: Aaron Conole Link: https://patch.msgid.link/259D3404-575D-4A6D-B263-1DF59A67CF89@zenlayer.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/openvswitch/flow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 8a848ce72e291..b80bd3a907739 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c @@ -788,7 +788,7 @@ static int key_extract_l3l4(struct sk_buff *skb, struct sw_flow_key *key) memset(&key->ipv4, 0, sizeof(key->ipv4)); } } else if (eth_p_mpls(key->eth.type)) { - u8 label_count = 1; + size_t label_count = 1; memset(&key->mpls, 0, sizeof(key->mpls)); skb_set_inner_network_header(skb, skb->mac_len); -- GitLab From a3eeaea04e57b345bd67b6f45848c7c03ee7b1bc Mon Sep 17 00:00:00 2001 From: Horatiu Vultur Date: Fri, 23 May 2025 10:27:16 +0200 Subject: [PATCH 0919/2211] net: phy: mscc: Stop clearing the the UDPv4 checksum for L2 frames [ Upstream commit 57a92d14659df3e7e7e0052358c8cc68bbbc3b5e ] We have noticed that when PHY timestamping is enabled, L2 frames seems to be modified by changing two 2 bytes with a value of 0. The place were these 2 bytes seems to be random(or I couldn't find a pattern). In most of the cases the userspace can ignore these frames but if for example those 2 bytes are in the correction field there is nothing to do. This seems to happen when configuring the HW for IPv4 even that the flow is not enabled. These 2 bytes correspond to the UDPv4 checksum and once we don't enable clearing the checksum when using L2 frames then the frame doesn't seem to be changed anymore. Fixes: 7d272e63e0979d ("net: phy: mscc: timestamping and PHC support") Signed-off-by: Horatiu Vultur Link: https://patch.msgid.link/20250523082716.2935895-1-horatiu.vultur@microchip.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/phy/mscc/mscc_ptp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/phy/mscc/mscc_ptp.c b/drivers/net/phy/mscc/mscc_ptp.c index 0173aa3b4ead1..ce49f3ac6939b 100644 --- a/drivers/net/phy/mscc/mscc_ptp.c +++ b/drivers/net/phy/mscc/mscc_ptp.c @@ -943,7 +943,9 @@ static int vsc85xx_ip1_conf(struct phy_device *phydev, enum ts_blk blk, /* UDP checksum offset in IPv4 packet * according to: https://tools.ietf.org/html/rfc768 */ - val |= IP1_NXT_PROT_UDP_CHKSUM_OFF(26) | IP1_NXT_PROT_UDP_CHKSUM_CLEAR; + val |= IP1_NXT_PROT_UDP_CHKSUM_OFF(26); + if (enable) + val |= IP1_NXT_PROT_UDP_CHKSUM_CLEAR; vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_UDP_CHKSUM, val); -- GitLab From 532601e783b5aac343ea5d6ecba3a10f636f54a0 Mon Sep 17 00:00:00 2001 From: Zhiguo Niu Date: Wed, 14 May 2025 16:45:48 +0800 Subject: [PATCH 0920/2211] f2fs: use d_inode(dentry) cleanup dentry->d_inode [ Upstream commit a6c397a31f58a1d577c2c8d04b624e9baa31951c ] no logic changes. Signed-off-by: Zhiguo Niu Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/namei.c | 8 ++++---- fs/f2fs/super.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 57d46e1439ded..f8407a645303b 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -413,7 +413,7 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir, if (is_inode_flag_set(dir, FI_PROJ_INHERIT) && (!projid_eq(F2FS_I(dir)->i_projid, - F2FS_I(old_dentry->d_inode)->i_projid))) + F2FS_I(inode)->i_projid))) return -EXDEV; err = f2fs_dquot_initialize(dir); @@ -905,7 +905,7 @@ static int f2fs_rename(struct mnt_idmap *idmap, struct inode *old_dir, if (is_inode_flag_set(new_dir, FI_PROJ_INHERIT) && (!projid_eq(F2FS_I(new_dir)->i_projid, - F2FS_I(old_dentry->d_inode)->i_projid))) + F2FS_I(old_inode)->i_projid))) return -EXDEV; /* @@ -1098,10 +1098,10 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, if ((is_inode_flag_set(new_dir, FI_PROJ_INHERIT) && !projid_eq(F2FS_I(new_dir)->i_projid, - F2FS_I(old_dentry->d_inode)->i_projid)) || + F2FS_I(old_inode)->i_projid)) || (is_inode_flag_set(new_dir, FI_PROJ_INHERIT) && !projid_eq(F2FS_I(old_dir)->i_projid, - F2FS_I(new_dentry->d_inode)->i_projid))) + F2FS_I(new_inode)->i_projid))) return -EXDEV; err = f2fs_dquot_initialize(old_dir); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 573cc4725e2e8..faa76531246eb 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1862,9 +1862,9 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_fsid = u64_to_fsid(id); #ifdef CONFIG_QUOTA - if (is_inode_flag_set(dentry->d_inode, FI_PROJ_INHERIT) && + if (is_inode_flag_set(d_inode(dentry), FI_PROJ_INHERIT) && sb_has_quota_limits_enabled(sb, PRJQUOTA)) { - f2fs_statfs_project(sb, F2FS_I(dentry->d_inode)->i_projid, buf); + f2fs_statfs_project(sb, F2FS_I(d_inode(dentry))->i_projid, buf); } #endif return 0; -- GitLab From 0befc3005db92b90f6cf27c62cdd6777f2a6158a Mon Sep 17 00:00:00 2001 From: Zhiguo Niu Date: Wed, 14 May 2025 16:45:49 +0800 Subject: [PATCH 0921/2211] f2fs: fix to correct check conditions in f2fs_cross_rename [ Upstream commit 9883494c45a13dc88d27dde4f988c04823b42a2f ] Should be "old_dir" here. Fixes: 5c57132eaf52 ("f2fs: support project quota") Signed-off-by: Zhiguo Niu Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/namei.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index f8407a645303b..6f70f377f1211 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -1099,7 +1099,7 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, if ((is_inode_flag_set(new_dir, FI_PROJ_INHERIT) && !projid_eq(F2FS_I(new_dir)->i_projid, F2FS_I(old_inode)->i_projid)) || - (is_inode_flag_set(new_dir, FI_PROJ_INHERIT) && + (is_inode_flag_set(old_dir, FI_PROJ_INHERIT) && !projid_eq(F2FS_I(old_dir)->i_projid, F2FS_I(new_inode)->i_projid))) return -EXDEV; -- GitLab From 4e95465ab940729cadfc1c4a48981650333d60e7 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Thu, 9 Jan 2025 21:52:31 +0100 Subject: [PATCH 0922/2211] arm64: dts: qcom: x1e80100: Mark usb_2 as dma-coherent [ Upstream commit 45bd6ff900cfe5038e2718a900f153ded3fa5392 ] Make this USB controller consistent with the others on this platform. Fixes: 4af46b7bd66f ("arm64: dts: qcom: x1e80100: Add USB nodes") Signed-off-by: Mark Kettenis Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250109205232.92336-1-kettenis@openbsd.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/x1e80100.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/x1e80100.dtsi b/arch/arm64/boot/dts/qcom/x1e80100.dtsi index 5a5abd5fa6585..948ce7dd8b058 100644 --- a/arch/arm64/boot/dts/qcom/x1e80100.dtsi +++ b/arch/arm64/boot/dts/qcom/x1e80100.dtsi @@ -4284,6 +4284,8 @@ phy-names = "usb2-phy"; maximum-speed = "high-speed"; + dma-coherent; + ports { #address-cells = <1>; #size-cells = <0>; -- GitLab From a999df6f45a34497b43d68986d52b6cfa78d36da Mon Sep 17 00:00:00 2001 From: Neil Armstrong Date: Mon, 3 Feb 2025 14:23:18 +0100 Subject: [PATCH 0923/2211] arm64: dts: qcom: sm8650: setup gpu thermal with higher temperatures [ Upstream commit 2250f65b32565eb8b757e89248c75977f370f498 ] On the SM8650, the dynamic clock and voltage scaling (DCVS) for the GPU is done from the HLOS, but the GPU can achieve a much higher temperature before failing according the reference downstream implementation. Set higher temperatures in the GPU trip points corresponding to the temperatures provided by Qualcomm in the dowstream source, much closer to the junction temperature and with a higher critical temperature trip in the case the HLOS DCVS cannot handle the temperature surge. The tsens MAX_THRESHOLD is set to 120C on those platforms, so set the hot to 110C to leave a chance to HLOS to react and critical to 115C to avoid the monitor thermal shutdown. Fixes: 497624ed5506 ("arm64: dts: qcom: sm8650: Throttle the GPU when overheating") Signed-off-by: Neil Armstrong Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250203-topic-sm8650-thermal-cpu-idle-v4-2-65e35f307301@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sm8650.dtsi | 64 ++++++++++++++-------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/sm8650.dtsi b/arch/arm64/boot/dts/qcom/sm8650.dtsi index fddf979de38d1..0c54a89bb3322 100644 --- a/arch/arm64/boot/dts/qcom/sm8650.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8650.dtsi @@ -6354,20 +6354,20 @@ trips { gpu0_alert0: trip-point0 { - temperature = <85000>; + temperature = <95000>; hysteresis = <1000>; type = "passive"; }; trip-point1 { - temperature = <90000>; + temperature = <110000>; hysteresis = <1000>; type = "hot"; }; trip-point2 { - temperature = <110000>; - hysteresis = <1000>; + temperature = <115000>; + hysteresis = <0>; type = "critical"; }; }; @@ -6387,20 +6387,20 @@ trips { gpu1_alert0: trip-point0 { - temperature = <85000>; + temperature = <95000>; hysteresis = <1000>; type = "passive"; }; trip-point1 { - temperature = <90000>; + temperature = <110000>; hysteresis = <1000>; type = "hot"; }; trip-point2 { - temperature = <110000>; - hysteresis = <1000>; + temperature = <115000>; + hysteresis = <0>; type = "critical"; }; }; @@ -6420,20 +6420,20 @@ trips { gpu2_alert0: trip-point0 { - temperature = <85000>; + temperature = <95000>; hysteresis = <1000>; type = "passive"; }; trip-point1 { - temperature = <90000>; + temperature = <110000>; hysteresis = <1000>; type = "hot"; }; trip-point2 { - temperature = <110000>; - hysteresis = <1000>; + temperature = <115000>; + hysteresis = <0>; type = "critical"; }; }; @@ -6453,20 +6453,20 @@ trips { gpu3_alert0: trip-point0 { - temperature = <85000>; + temperature = <95000>; hysteresis = <1000>; type = "passive"; }; trip-point1 { - temperature = <90000>; + temperature = <110000>; hysteresis = <1000>; type = "hot"; }; trip-point2 { - temperature = <110000>; - hysteresis = <1000>; + temperature = <115000>; + hysteresis = <0>; type = "critical"; }; }; @@ -6486,20 +6486,20 @@ trips { gpu4_alert0: trip-point0 { - temperature = <85000>; + temperature = <95000>; hysteresis = <1000>; type = "passive"; }; trip-point1 { - temperature = <90000>; + temperature = <110000>; hysteresis = <1000>; type = "hot"; }; trip-point2 { - temperature = <110000>; - hysteresis = <1000>; + temperature = <115000>; + hysteresis = <0>; type = "critical"; }; }; @@ -6519,20 +6519,20 @@ trips { gpu5_alert0: trip-point0 { - temperature = <85000>; + temperature = <95000>; hysteresis = <1000>; type = "passive"; }; trip-point1 { - temperature = <90000>; + temperature = <110000>; hysteresis = <1000>; type = "hot"; }; trip-point2 { - temperature = <110000>; - hysteresis = <1000>; + temperature = <115000>; + hysteresis = <0>; type = "critical"; }; }; @@ -6552,20 +6552,20 @@ trips { gpu6_alert0: trip-point0 { - temperature = <85000>; + temperature = <95000>; hysteresis = <1000>; type = "passive"; }; trip-point1 { - temperature = <90000>; + temperature = <110000>; hysteresis = <1000>; type = "hot"; }; trip-point2 { - temperature = <110000>; - hysteresis = <1000>; + temperature = <115000>; + hysteresis = <0>; type = "critical"; }; }; @@ -6585,20 +6585,20 @@ trips { gpu7_alert0: trip-point0 { - temperature = <85000>; + temperature = <95000>; hysteresis = <1000>; type = "passive"; }; trip-point1 { - temperature = <90000>; + temperature = <110000>; hysteresis = <1000>; type = "hot"; }; trip-point2 { - temperature = <110000>; - hysteresis = <1000>; + temperature = <115000>; + hysteresis = <0>; type = "critical"; }; }; -- GitLab From 5c721b58d3016dc350a0ffa13f1772a972cbb336 Mon Sep 17 00:00:00 2001 From: Neil Armstrong Date: Thu, 27 Feb 2025 10:00:33 +0100 Subject: [PATCH 0924/2211] arm64: dts: qcom: sm8650: add missing cpu-cfg interconnect path in the mdss node [ Upstream commit f22be5c1dd3e12519e3f3b80c14d10b90be2c2fc ] The bindings requires the mdp0-mem and the cpu-cfg interconnect path, add the missing cpu-cfg path to fix the dtbs check error and also to ensure that MDSS has enough bandwidth to let HLOS write config registers. Fixes: 9fa33cbca3d2 ("arm64: dts: qcom: sm8650: correct MDSS interconnects") Reviewed-by: Konrad Dybcio Reviewed-by: Dmitry Baryshkov Signed-off-by: Neil Armstrong Link: https://lore.kernel.org/r/20250227-topic-sm8x50-mdss-interconnect-bindings-fix-v5-2-bf6233c6ebe5@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sm8650.dtsi | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/sm8650.dtsi b/arch/arm64/boot/dts/qcom/sm8650.dtsi index 0c54a89bb3322..edde21972f5ac 100644 --- a/arch/arm64/boot/dts/qcom/sm8650.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8650.dtsi @@ -3605,8 +3605,11 @@ resets = <&dispcc DISP_CC_MDSS_CORE_BCR>; interconnects = <&mmss_noc MASTER_MDP QCOM_ICC_TAG_ALWAYS - &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>; - interconnect-names = "mdp0-mem"; + &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>, + <&gem_noc MASTER_APPSS_PROC QCOM_ICC_TAG_ACTIVE_ONLY + &config_noc SLAVE_DISPLAY_CFG QCOM_ICC_TAG_ACTIVE_ONLY>; + interconnect-names = "mdp0-mem", + "cpu-cfg"; power-domains = <&dispcc MDSS_GDSC>; -- GitLab From bdf8915dad6b24488d1227e5f12f1e1538dd089d Mon Sep 17 00:00:00 2001 From: Konrad Dybcio Date: Tue, 4 Mar 2025 18:10:46 +0100 Subject: [PATCH 0925/2211] arm64: dts: qcom: x1e80100-romulus: Keep L12B and L15B always on [ Upstream commit 0783c8b3c06b9cf16b5108d558e2faffb8c533b7 ] These regulators power some electronic components onboard. They're most likely kept online by other pieces of firmware, but you can never be sure enough. Fixes: 09d77be56093 ("arm64: dts: qcom: Add support for X1-based Surface Laptop 7 devices") Reported-by: Johan Hovold Signed-off-by: Konrad Dybcio Reviewed-by: Johan Hovold Link: https://lore.kernel.org/r/20250304-topic-sl7_vregs_aon-v1-1-b2dc706e4157@oss.qualcomm.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/x1e80100-microsoft-romulus.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/x1e80100-microsoft-romulus.dtsi b/arch/arm64/boot/dts/qcom/x1e80100-microsoft-romulus.dtsi index 19da90704b7cb..001a9dc0a4baa 100644 --- a/arch/arm64/boot/dts/qcom/x1e80100-microsoft-romulus.dtsi +++ b/arch/arm64/boot/dts/qcom/x1e80100-microsoft-romulus.dtsi @@ -267,6 +267,7 @@ regulator-min-microvolt = <1200000>; regulator-max-microvolt = <1200000>; regulator-initial-mode = ; + regulator-always-on; }; vreg_l13b: ldo13 { @@ -288,6 +289,7 @@ regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-initial-mode = ; + regulator-always-on; }; vreg_l16b: ldo16 { -- GitLab From caecebc6b943a6a38841d715104ca7e03cf69d57 Mon Sep 17 00:00:00 2001 From: Dzmitry Sankouski Date: Tue, 25 Feb 2025 19:38:53 +0300 Subject: [PATCH 0926/2211] arm64: dts: qcom: sdm845-starqltechn: remove wifi [ Upstream commit 2d3dd4b237638853b8a99353401ab8d88a6afb6c ] Starqltechn has broadcom chip for wifi, so sdm845 wifi part can be disabled. Fixes: d711b22eee55 ("arm64: dts: qcom: starqltechn: add initial device tree for starqltechn") Reviewed-by: Konrad Dybcio Signed-off-by: Dzmitry Sankouski Fixes: d711b22eee55 ("arm64: dts: qcom: starqltechn: add initial device tree for starqltechn") Reviewed-by: Bryan O'Donoghue Link: https://lore.kernel.org/r/20250225-starqltechn_integration_upstream-v9-2-a5d80375cb66@gmail.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts b/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts index d37a433130b98..6fc30fd1262b8 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts +++ b/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts @@ -418,14 +418,6 @@ status = "okay"; }; -&wifi { - vdd-0.8-cx-mx-supply = <&vreg_l5a_0p8>; - vdd-1.8-xo-supply = <&vreg_l7a_1p8>; - vdd-1.3-rfa-supply = <&vreg_l17a_1p3>; - vdd-3.3-ch0-supply = <&vreg_l25a_3p3>; - status = "okay"; -}; - &tlmm { gpio-reserved-ranges = <0 4>, <27 4>, <81 4>, <85 4>; -- GitLab From 83f1b473bb31747dad057e05077f24cccacfa9cc Mon Sep 17 00:00:00 2001 From: Dzmitry Sankouski Date: Tue, 25 Feb 2025 19:38:54 +0300 Subject: [PATCH 0927/2211] arm64: dts: qcom: sdm845-starqltechn: fix usb regulator mistake [ Upstream commit 242e4126ee007b95765c21a9d74651fdcf221f2b ] Usb regulator was wrongly pointed to vreg_l1a_0p875. However, on starqltechn it's powered from vreg_l5a_0p8. Fixes: d711b22eee55 ("arm64: dts: qcom: starqltechn: add initial device tree for starqltechn") Reviewed-by: Konrad Dybcio Signed-off-by: Dzmitry Sankouski Link: https://lore.kernel.org/r/20250225-starqltechn_integration_upstream-v9-3-a5d80375cb66@gmail.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts b/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts index 6fc30fd1262b8..f3f2b25883d81 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts +++ b/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts @@ -135,8 +135,6 @@ vdda_sp_sensor: vdda_ufs1_core: vdda_ufs2_core: - vdda_usb1_ss_core: - vdda_usb2_ss_core: vreg_l1a_0p875: ldo1 { regulator-min-microvolt = <880000>; regulator-max-microvolt = <880000>; @@ -157,6 +155,7 @@ regulator-initial-mode = ; }; + vdda_usb1_ss_core: vdd_wcss_cx: vdd_wcss_mx: vdda_wcss_pll: -- GitLab From d997703f9d75700e3acbaf4e2ac8e5bab86a9b70 Mon Sep 17 00:00:00 2001 From: Dzmitry Sankouski Date: Tue, 25 Feb 2025 19:38:55 +0300 Subject: [PATCH 0928/2211] arm64: dts: qcom: sdm845-starqltechn: refactor node order [ Upstream commit cba1dd3d851ebc1b6c5ae4000208a9753320694b ] Fixes: d711b22eee55 ("arm64: dts: qcom: starqltechn: add initial device tree for starqltechn") Signed-off-by: Dzmitry Sankouski Link: https://lore.kernel.org/r/20250225-starqltechn_integration_upstream-v9-4-a5d80375cb66@gmail.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts b/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts index f3f2b25883d81..8a0d63bd594b3 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts +++ b/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts @@ -382,8 +382,8 @@ }; &sdhc_2 { - pinctrl-names = "default"; pinctrl-0 = <&sdc2_clk_state &sdc2_cmd_state &sdc2_data_state &sd_card_det_n_state>; + pinctrl-names = "default"; cd-gpios = <&tlmm 126 GPIO_ACTIVE_LOW>; vmmc-supply = <&vreg_l21a_2p95>; vqmmc-supply = <&vddpx_2>; -- GitLab From 9164f9ae3f49a91d3c6de0b2dbdb5e150979c42a Mon Sep 17 00:00:00 2001 From: Dzmitry Sankouski Date: Tue, 25 Feb 2025 19:38:56 +0300 Subject: [PATCH 0929/2211] arm64: dts: qcom: sdm845-starqltechn: remove excess reserved gpios [ Upstream commit fb5fce873b952f8b1c5f7edcabcc8611ef45ea7a ] Starqltechn has 2 reserved gpio ranges <27 4>, <85 4>. <27 4> is spi for eSE(embedded Secure Element). <85 4> is spi for fingerprint. Remove excess reserved gpio regions. Fixes: d711b22eee55 ("arm64: dts: qcom: starqltechn: add initial device tree for starqltechn") Reviewed-by: Konrad Dybcio Signed-off-by: Dzmitry Sankouski Link: https://lore.kernel.org/r/20250225-starqltechn_integration_upstream-v9-5-a5d80375cb66@gmail.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts b/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts index 8a0d63bd594b3..5948b401165ce 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts +++ b/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts @@ -418,7 +418,8 @@ }; &tlmm { - gpio-reserved-ranges = <0 4>, <27 4>, <81 4>, <85 4>; + gpio-reserved-ranges = <27 4>, /* SPI (eSE - embedded Secure Element) */ + <85 4>; /* SPI (fingerprint reader) */ sdc2_clk_state: sdc2-clk-state { pins = "sdc2_clk"; -- GitLab From 3c4aaf3e7665a93963b8355e595ae7d645d51877 Mon Sep 17 00:00:00 2001 From: Luca Weiss Date: Wed, 12 Feb 2025 18:03:47 +0100 Subject: [PATCH 0930/2211] arm64: dts: qcom: sm8350: Reenable crypto & cryptobam [ Upstream commit 75eefd474469abf95aa9ef6da8161d69f86b98b4 ] When num-channels and qcom,num-ees is not provided in devicetree, the driver will try to read these values from the registers during probe but this fails if the interconnect is not on and then crashes the system. So we can provide these properties in devicetree (queried after patching BAM driver to enable the necessary interconnect) so we can probe cryptobam without reading registers and then also use the QCE as expected. Fixes: 4d29db204361 ("arm64: dts: qcom: sm8350: fix BAM DMA crash and reboot") Fixes: f1040a7fe8f0 ("arm64: dts: qcom: sm8350: Add Crypto Engine support") Signed-off-by: Luca Weiss Signed-off-by: Stephan Gerhold Link: https://lore.kernel.org/r/20250212-bam-dma-fixes-v1-1-f560889e65d8@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sm8350.dtsi | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/sm8350.dtsi b/arch/arm64/boot/dts/qcom/sm8350.dtsi index 404473fa491ae..0be8f2befec7c 100644 --- a/arch/arm64/boot/dts/qcom/sm8350.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8350.dtsi @@ -1806,11 +1806,11 @@ interrupts = ; #dma-cells = <1>; qcom,ee = <0>; + qcom,num-ees = <4>; + num-channels = <16>; qcom,controlled-remotely; iommus = <&apps_smmu 0x594 0x0011>, <&apps_smmu 0x596 0x0011>; - /* FIXME: Probing BAM DMA causes some abort and system hang */ - status = "fail"; }; crypto: crypto@1dfa000 { @@ -1822,8 +1822,6 @@ <&apps_smmu 0x596 0x0011>; interconnects = <&aggre2_noc MASTER_CRYPTO 0 &mc_virt SLAVE_EBI1 0>; interconnect-names = "memory"; - /* FIXME: dependency BAM DMA is disabled */ - status = "disabled"; }; ipa: ipa@1e40000 { -- GitLab From 6e65650cee28beb80d99ae9261e663b546584726 Mon Sep 17 00:00:00 2001 From: Xilin Wu Date: Sat, 8 Mar 2025 18:27:51 +0800 Subject: [PATCH 0931/2211] arm64: dts: qcom: sm8250: Fix CPU7 opp table [ Upstream commit 28f997b89967afdc0855d8aa7538b251fb44f654 ] There is a typo in cpu7_opp9. Fix it to get rid of the following errors. [ 0.198043] cpu cpu7: Voltage update failed freq=1747200 [ 0.198052] cpu cpu7: failed to update OPP for freq=1747200 Fixes: 8e0e8016cb79 ("arm64: dts: qcom: sm8250: Add CPU opp tables") Signed-off-by: Xilin Wu Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250308-fix-sm8250-cpufreq-v1-1-8a0226721399@gmail.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sm8250.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/qcom/sm8250.dtsi b/arch/arm64/boot/dts/qcom/sm8250.dtsi index faa36d17b9f2c..e17937f76806c 100644 --- a/arch/arm64/boot/dts/qcom/sm8250.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8250.dtsi @@ -606,7 +606,7 @@ }; cpu7_opp9: opp-1747200000 { - opp-hz = /bits/ 64 <1708800000>; + opp-hz = /bits/ 64 <1747200000>; opp-peak-kBps = <5412000 42393600>; }; -- GitLab From 79c8378070582c4445c4c25c7cd6efbdb965def0 Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Tue, 3 Dec 2024 18:44:02 +0100 Subject: [PATCH 0932/2211] arm64: dts: qcom: sc8280xp-x13s: Drop duplicate DMIC supplies [ Upstream commit a2e617f4e6981aa514a569e927f90b0d39bb31b2 ] The WCD938x codec provides two controls for each of the MIC_BIASn outputs: - "MIC BIASn" enables an internal regulator to generate the output with a configurable voltage (qcom,micbiasN-microvolt). - "VA MIC BIASn" enables "pull-up mode" that bypasses the internal regulator and directly outputs fixed 1.8V from the VDD_PX pin. This is intended for low-power VA (voice activation) use cases. The audio-routing setup for the ThinkPad X13s currently specifies both as power supplies for the DMICs, but only one of them can be active at the same time. In practice, only the internal regulator is used with the current setup because the driver prefers it over pull-up mode. Make this more clear by dropping the redundant routes to the pull-up "VA MIC BIASn" supply. There is no functional difference except that we skip briefly switching to pull-up mode when shutting down the microphone. Fixes: 2e498f35c385 ("arm64: dts: qcom: sc8280xp-x13s: fix va dmic dai links and routing") Signed-off-by: Stephan Gerhold Link: https://lore.kernel.org/r/20241203-x1e80100-va-mic-bias-v1-1-0dfd4d9b492c@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts | 3 --- 1 file changed, 3 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts index 6a28cab971891..8e5951da5920d 100644 --- a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts +++ b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts @@ -1131,9 +1131,6 @@ "VA DMIC0", "MIC BIAS1", "VA DMIC1", "MIC BIAS1", "VA DMIC2", "MIC BIAS3", - "VA DMIC0", "VA MIC BIAS1", - "VA DMIC1", "VA MIC BIAS1", - "VA DMIC2", "VA MIC BIAS3", "TX SWR_ADC1", "ADC2_OUTPUT"; wcd-playback-dai-link { -- GitLab From 3d36b1baf038acfcf8218f4327e1a171689a8b6f Mon Sep 17 00:00:00 2001 From: Varadarajan Narayanan Date: Fri, 7 Feb 2025 13:05:45 +0530 Subject: [PATCH 0933/2211] arm64: dts: qcom: ipq9574: Fix USB vdd info [ Upstream commit 4f4c905e6a2a4e884f4e9b7326c94fac3500e0f9 ] USB phys in ipq9574 use the 'L5' regulator. The commit ec4f047679d5 ("arm64: dts: qcom: ipq9574: Enable USB") incorrectly specified it as 'L2'. Because of this when the phy module turns off/on its regulators, the wrong regulator is turned off/on resulting in 2 issues, namely the correct regulator related to the USB phy is not turned off/on and the module powered by the incorrect regulator is affected. Fixes: ec4f047679d5 ("arm64: dts: qcom: ipq9574: Enable USB") Signed-off-by: Varadarajan Narayanan Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250207073545.1768990-2-quic_varada@quicinc.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi index 91e104b0f8653..a5294a42c287a 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi @@ -111,6 +111,13 @@ regulator-always-on; regulator-boot-on; }; + + mp5496_l5: l5 { + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-always-on; + regulator-boot-on; + }; }; }; @@ -146,7 +153,7 @@ }; &usb_0_qmpphy { - vdda-pll-supply = <&mp5496_l2>; + vdda-pll-supply = <&mp5496_l5>; vdda-phy-supply = <®ulator_fixed_0p925>; status = "okay"; @@ -154,7 +161,7 @@ &usb_0_qusbphy { vdd-supply = <®ulator_fixed_0p925>; - vdda-pll-supply = <&mp5496_l2>; + vdda-pll-supply = <&mp5496_l5>; vdda-phy-dpdm-supply = <®ulator_fixed_3p3>; status = "okay"; -- GitLab From 3682d4dd0e8d968fb13b8f667fde6d45a333e988 Mon Sep 17 00:00:00 2001 From: Chukun Pan Date: Tue, 1 Apr 2025 17:00:09 +0800 Subject: [PATCH 0934/2211] arm64: dts: rockchip: Move SHMEM memory to reserved memory on rk3588 [ Upstream commit 8ecd096d018be8a6bd3bd930f3a41a85db66a67d ] 0x0 to 0xf0000000 are SDRAM memory areas where 0x10f000 is located. So move the SHMEM memory of arm_scmi to the reserved memory node. Fixes: c9211fa2602b ("arm64: dts: rockchip: Add base DT for rk3588 SoC") Signed-off-by: Chukun Pan Link: https://lore.kernel.org/r/20250401090009.733771-2-amadeus@jmu.edu.cn Signed-off-by: Heiko Stuebner Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi index 83e7e0fbe7839..ad4331bc07806 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi @@ -428,16 +428,15 @@ #clock-cells = <0>; }; - pmu_sram: sram@10f000 { - compatible = "mmio-sram"; - reg = <0x0 0x0010f000 0x0 0x100>; - ranges = <0 0x0 0x0010f000 0x100>; - #address-cells = <1>; - #size-cells = <1>; + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; - scmi_shmem: sram@0 { + scmi_shmem: shmem@10f000 { compatible = "arm,scmi-shmem"; - reg = <0x0 0x100>; + reg = <0x0 0x0010f000 0x0 0x100>; + no-map; }; }; -- GitLab From 037a3a2567917d67569e95e36f9376f941ef73c2 Mon Sep 17 00:00:00 2001 From: Wolfram Sang Date: Fri, 4 Apr 2025 13:27:43 +0200 Subject: [PATCH 0935/2211] ARM: dts: at91: usb_a9263: fix GPIO for Dataflash chip select [ Upstream commit 67ba341e57ab158423818ed33bfa1c40eb0e5e7e ] Dataflash did not work on my board. After checking schematics and using the proper GPIO, it works now. Also, make it active low to avoid: flash@0 enforce active low on GPIO handle Fixes: 2432d201468d ("ARM: at91: dt: usb-a9263: add dataflash support") Signed-off-by: Wolfram Sang Link: https://lore.kernel.org/r/20250404112742.67416-2-wsa+renesas@sang-engineering.com Signed-off-by: Claudiu Beznea Signed-off-by: Sasha Levin --- arch/arm/boot/dts/microchip/usb_a9263.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/microchip/usb_a9263.dts b/arch/arm/boot/dts/microchip/usb_a9263.dts index 45745915b2e16..25c643067b2ec 100644 --- a/arch/arm/boot/dts/microchip/usb_a9263.dts +++ b/arch/arm/boot/dts/microchip/usb_a9263.dts @@ -58,7 +58,7 @@ }; spi0: spi@fffa4000 { - cs-gpios = <&pioB 15 GPIO_ACTIVE_HIGH>; + cs-gpios = <&pioA 5 GPIO_ACTIVE_LOW>; status = "okay"; flash@0 { compatible = "atmel,at45", "atmel,dataflash"; -- GitLab From 5b5a538aad91d0cce604af2c8aff0f6e86a355f7 Mon Sep 17 00:00:00 2001 From: Wolfram Sang Date: Wed, 2 Apr 2025 23:04:46 +0200 Subject: [PATCH 0936/2211] ARM: dts: at91: at91sam9263: fix NAND chip selects [ Upstream commit c72ede1c24be689733bcd2233a3a56f2478429c8 ] NAND did not work on my USB-A9263. I discovered that the offending commit converted the PIO bank for chip selects wrongly, so all A9263 boards need to be fixed. Fixes: 1004a2977bdc ("ARM: dts: at91: Switch to the new NAND bindings") Signed-off-by: Wolfram Sang Reviewed-by: Alexandre Belloni Link: https://lore.kernel.org/r/20250402210446.5972-2-wsa+renesas@sang-engineering.com Signed-off-by: Claudiu Beznea Signed-off-by: Sasha Levin --- arch/arm/boot/dts/microchip/at91sam9263ek.dts | 2 +- arch/arm/boot/dts/microchip/tny_a9263.dts | 2 +- arch/arm/boot/dts/microchip/usb_a9263.dts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/arm/boot/dts/microchip/at91sam9263ek.dts b/arch/arm/boot/dts/microchip/at91sam9263ek.dts index ce8baff6a9f4e..e42e1a75a715d 100644 --- a/arch/arm/boot/dts/microchip/at91sam9263ek.dts +++ b/arch/arm/boot/dts/microchip/at91sam9263ek.dts @@ -152,7 +152,7 @@ nand@3 { reg = <0x3 0x0 0x800000>; rb-gpios = <&pioA 22 GPIO_ACTIVE_HIGH>; - cs-gpios = <&pioA 15 GPIO_ACTIVE_HIGH>; + cs-gpios = <&pioD 15 GPIO_ACTIVE_HIGH>; nand-bus-width = <8>; nand-ecc-mode = "soft"; nand-on-flash-bbt; diff --git a/arch/arm/boot/dts/microchip/tny_a9263.dts b/arch/arm/boot/dts/microchip/tny_a9263.dts index 62b7d9f9a926c..c8b6318aaa838 100644 --- a/arch/arm/boot/dts/microchip/tny_a9263.dts +++ b/arch/arm/boot/dts/microchip/tny_a9263.dts @@ -64,7 +64,7 @@ nand@3 { reg = <0x3 0x0 0x800000>; rb-gpios = <&pioA 22 GPIO_ACTIVE_HIGH>; - cs-gpios = <&pioA 15 GPIO_ACTIVE_HIGH>; + cs-gpios = <&pioD 15 GPIO_ACTIVE_HIGH>; nand-bus-width = <8>; nand-ecc-mode = "soft"; nand-on-flash-bbt; diff --git a/arch/arm/boot/dts/microchip/usb_a9263.dts b/arch/arm/boot/dts/microchip/usb_a9263.dts index 25c643067b2ec..454176ce6d3ff 100644 --- a/arch/arm/boot/dts/microchip/usb_a9263.dts +++ b/arch/arm/boot/dts/microchip/usb_a9263.dts @@ -84,7 +84,7 @@ nand@3 { reg = <0x3 0x0 0x800000>; rb-gpios = <&pioA 22 GPIO_ACTIVE_HIGH>; - cs-gpios = <&pioA 15 GPIO_ACTIVE_HIGH>; + cs-gpios = <&pioD 15 GPIO_ACTIVE_HIGH>; nand-bus-width = <8>; nand-ecc-mode = "soft"; nand-on-flash-bbt; -- GitLab From 269df4263e5ed41a3ece4055d4df0f0b2436db67 Mon Sep 17 00:00:00 2001 From: AngeloGioacchino Del Regno Date: Wed, 2 Apr 2025 11:06:15 +0200 Subject: [PATCH 0937/2211] arm64: dts: mediatek: mt8195: Reparent vdec1/2 and venc1 power domains [ Upstream commit 394f29033324e2317bfd6a7ed99b9a60832b36a2 ] By hardware, the first and second core of the video decoder IP need the VDEC_SOC to be powered up in order to be able to be accessed (both internally, by firmware, and externally, by the kernel). Similarly, for the video encoder IP, the second core needs the first core to be powered up in order to be accessible. Fix that by reparenting the VDEC1/2 power domains to be children of VDEC0 (VDEC_SOC), and the VENC1 to be a child of VENC0. Fixes: 2b515194bf0c ("arm64: dts: mt8195: Add power domains controller") Reviewed-by: Chen-Yu Tsai Link: https://lore.kernel.org/r/20250402090615.25871-3-angelogioacchino.delregno@collabora.com Signed-off-by: AngeloGioacchino Del Regno Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/mediatek/mt8195.dtsi | 50 +++++++++++++----------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi index f013dbad9dc4e..2e138b54f5563 100644 --- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi @@ -617,22 +617,6 @@ #size-cells = <0>; #power-domain-cells = <1>; - power-domain@MT8195_POWER_DOMAIN_VDEC1 { - reg = ; - clocks = <&vdecsys CLK_VDEC_LARB1>; - clock-names = "vdec1-0"; - mediatek,infracfg = <&infracfg_ao>; - #power-domain-cells = <0>; - }; - - power-domain@MT8195_POWER_DOMAIN_VENC_CORE1 { - reg = ; - clocks = <&vencsys_core1 CLK_VENC_CORE1_LARB>; - clock-names = "venc1-larb"; - mediatek,infracfg = <&infracfg_ao>; - #power-domain-cells = <0>; - }; - power-domain@MT8195_POWER_DOMAIN_VDOSYS0 { reg = ; clocks = <&topckgen CLK_TOP_CFG_VDO0>, @@ -678,15 +662,25 @@ clocks = <&vdecsys_soc CLK_VDEC_SOC_LARB1>; clock-names = "vdec0-0"; mediatek,infracfg = <&infracfg_ao>; + #address-cells = <1>; + #size-cells = <0>; #power-domain-cells = <0>; - }; - power-domain@MT8195_POWER_DOMAIN_VDEC2 { - reg = ; - clocks = <&vdecsys_core1 CLK_VDEC_CORE1_LARB1>; - clock-names = "vdec2-0"; - mediatek,infracfg = <&infracfg_ao>; - #power-domain-cells = <0>; + power-domain@MT8195_POWER_DOMAIN_VDEC1 { + reg = ; + clocks = <&vdecsys CLK_VDEC_LARB1>; + clock-names = "vdec1-0"; + mediatek,infracfg = <&infracfg_ao>; + #power-domain-cells = <0>; + }; + + power-domain@MT8195_POWER_DOMAIN_VDEC2 { + reg = ; + clocks = <&vdecsys_core1 CLK_VDEC_CORE1_LARB1>; + clock-names = "vdec2-0"; + mediatek,infracfg = <&infracfg_ao>; + #power-domain-cells = <0>; + }; }; power-domain@MT8195_POWER_DOMAIN_VENC { @@ -694,7 +688,17 @@ clocks = <&vencsys CLK_VENC_LARB>; clock-names = "venc0-larb"; mediatek,infracfg = <&infracfg_ao>; + #address-cells = <1>; + #size-cells = <0>; #power-domain-cells = <0>; + + power-domain@MT8195_POWER_DOMAIN_VENC_CORE1 { + reg = ; + clocks = <&vencsys_core1 CLK_VENC_CORE1_LARB>; + clock-names = "venc1-larb"; + mediatek,infracfg = <&infracfg_ao>; + #power-domain-cells = <0>; + }; }; power-domain@MT8195_POWER_DOMAIN_VDOSYS1 { -- GitLab From a39ba524fb9ecc3cd3db857857eb1f436d2d1059 Mon Sep 17 00:00:00 2001 From: Alexey Minnekhanov Date: Tue, 15 Apr 2025 16:01:01 +0300 Subject: [PATCH 0938/2211] arm64: dts: qcom: sdm660-xiaomi-lavender: Add missing SD card detect GPIO [ Upstream commit 2eca6af66709de0d1ba14cdf8b6d200a1337a3a2 ] During initial porting these cd-gpios were missed. Having card detect is beneficial because driver does not need to do polling every second and it can just use IRQ. SD card detection in U-Boot is also fixed by this. Fixes: cf85e9aee210 ("arm64: dts: qcom: sdm660-xiaomi-lavender: Add eMMC and SD") Signed-off-by: Alexey Minnekhanov Reviewed-by: Dmitry Baryshkov Link: https://lore.kernel.org/r/20250415130101.1429281-1-alexeymin@postmarketos.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts b/arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts index 7167f75bced3f..0b4d71c14a772 100644 --- a/arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts +++ b/arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts @@ -404,6 +404,8 @@ &sdhc_2 { status = "okay"; + cd-gpios = <&tlmm 54 GPIO_ACTIVE_HIGH>; + vmmc-supply = <&vreg_l5b_2p95>; vqmmc-supply = <&vreg_l2b_2p95>; }; -- GitLab From e1c84dd136bfc06113fabe435fbe47be889ada7b Mon Sep 17 00:00:00 2001 From: Pin-yen Lin Date: Wed, 23 Apr 2025 12:03:39 +0800 Subject: [PATCH 0939/2211] arm64: dts: mt8183: Add port node to mt8183.dtsi [ Upstream commit d15059f7be59f887c1a370037cc2337c2ff2ad56 ] Add the port node to fix the binding schema check. Also update mt8183-kukui to reference the new port node. Fixes: 88ec840270e6 ("arm64: dts: mt8183: Add dsi node") Fixes: 27eaf34df364 ("arm64: dts: mt8183: config dsi node") Signed-off-by: Pin-yen Lin Link: https://lore.kernel.org/r/20250423040354.2847447-1-treapking@chromium.org Signed-off-by: AngeloGioacchino Del Regno Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 10 +++------- arch/arm64/boot/dts/mediatek/mt8183.dtsi | 4 ++++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi index 22924f61ec9ed..c4fafd51b1225 100644 --- a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi @@ -280,14 +280,10 @@ }; }; }; +}; - ports { - port { - dsi_out: endpoint { - remote-endpoint = <&panel_in>; - }; - }; - }; +&dsi_out { + remote-endpoint = <&panel_in>; }; &gic { diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi index 92c41463d10e3..65be2c2c26d40 100644 --- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi @@ -1836,6 +1836,10 @@ phys = <&mipi_tx0>; phy-names = "dphy"; status = "disabled"; + + port { + dsi_out: endpoint { }; + }; }; dpi0: dpi@14015000 { -- GitLab From 33ff1f13291bde4e871839387ffe7d09d2087566 Mon Sep 17 00:00:00 2001 From: Adam Ford Date: Tue, 15 Apr 2025 20:01:27 -0500 Subject: [PATCH 0940/2211] arm64: dts: imx8mm-beacon: Fix RTC capacitive load [ Upstream commit 2e98d456666d63f897ba153210bcef9d78ba0f3a ] Although not noticeable when used every day, the RTC appears to drift when left to sit over time. This is due to the capacitive load not being properly set. Fix RTC drift by correcting the capacitive load setting from 7000 to 12500, which matches the actual hardware configuration. Fixes: 593816fa2f35 ("arm64: dts: imx: Add Beacon i.MX8m-Mini development kit") Signed-off-by: Adam Ford Signed-off-by: Shawn Guo Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi index 62ed64663f495..9ba0cb89fa24e 100644 --- a/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi @@ -233,6 +233,7 @@ rtc: rtc@51 { compatible = "nxp,pcf85263"; reg = <0x51>; + quartz-load-femtofarads = <12500>; }; }; -- GitLab From 69120f3767b7cac1af5884a8bb40afb83b65696a Mon Sep 17 00:00:00 2001 From: Adam Ford Date: Tue, 15 Apr 2025 20:01:28 -0500 Subject: [PATCH 0941/2211] arm64: dts: imx8mn-beacon: Fix RTC capacitive load [ Upstream commit c3f03bec30efd5082b55876846d57b5d17dae7b9 ] Although not noticeable when used every day, the RTC appears to drift when left to sit over time. This is due to the capacitive load not being properly set. Fix RTC drift by correcting the capacitive load setting from 7000 to 12500, which matches the actual hardware configuration. Fixes: 36ca3c8ccb53 ("arm64: dts: imx: Add Beacon i.MX8M Nano development kit") Signed-off-by: Adam Ford Reviewed-by: Frank Li Signed-off-by: Shawn Guo Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi index 2a64115eebf1c..bb11590473a4c 100644 --- a/arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi @@ -242,6 +242,7 @@ rtc: rtc@51 { compatible = "nxp,pcf85263"; reg = <0x51>; + quartz-load-femtofarads = <12500>; }; }; -- GitLab From c48fe69e1748acf2fae6ec562ec269a11464e43f Mon Sep 17 00:00:00 2001 From: Adam Ford Date: Tue, 15 Apr 2025 20:01:29 -0500 Subject: [PATCH 0942/2211] arm64: dts: imx8mp-beacon: Fix RTC capacitive load [ Upstream commit 6821ee17537938e919e8b86a541aae451f73165b ] Although not noticeable when used every day, the RTC appears to drift when left to sit over time. This is due to the capacitive load not being properly set. Fix RTC drift by correcting the capacitive load setting from 7000 to 12500, which matches the actual hardware configuration. Fixes: 25a5ccdce767 ("arm64: dts: freescale: Introduce imx8mp-beacon-kit") Signed-off-by: Adam Ford Reviewed-by: Frank Li Signed-off-by: Shawn Guo Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/freescale/imx8mp-beacon-som.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/boot/dts/freescale/imx8mp-beacon-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-beacon-som.dtsi index 15f7ab58db36c..88561df70d03a 100644 --- a/arch/arm64/boot/dts/freescale/imx8mp-beacon-som.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mp-beacon-som.dtsi @@ -257,6 +257,7 @@ rtc: rtc@51 { compatible = "nxp,pcf85263"; reg = <0x51>; + quartz-load-femtofarads = <12500>; }; }; -- GitLab From b9c7c4e6c8bbc6ae4baaf82d1a86ab99fbcc36c1 Mon Sep 17 00:00:00 2001 From: Adam Ford Date: Tue, 15 Apr 2025 20:01:30 -0500 Subject: [PATCH 0943/2211] arm64: dts: imx8mm-beacon: Set SAI5 MCLK direction to output for HDMI audio [ Upstream commit 8c716f80dfe8cd6ed9a2696847cea1affeeff6ff ] The HDMI bridge chip fails to generate an audio source due to the SAI5 master clock (MCLK) direction not being set to output. This prevents proper clocking of the HDMI audio interface. Add the `fsl,sai-mclk-direction-output` property to the SAI5 node to ensure the MCLK is driven by the SoC, resolving the HDMI sound issue. Fixes: 8ad7d14d99f3 ("arm64: dts: imx8mm-beacon: Add HDMI video with sound") Signed-off-by: Adam Ford Reviewed-by: Frank Li Signed-off-by: Shawn Guo Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/freescale/imx8mm-beacon-kit.dts | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/boot/dts/freescale/imx8mm-beacon-kit.dts b/arch/arm64/boot/dts/freescale/imx8mm-beacon-kit.dts index 97ff1ddd63188..734a75198f06e 100644 --- a/arch/arm64/boot/dts/freescale/imx8mm-beacon-kit.dts +++ b/arch/arm64/boot/dts/freescale/imx8mm-beacon-kit.dts @@ -124,6 +124,7 @@ assigned-clock-parents = <&clk IMX8MM_AUDIO_PLL1_OUT>; assigned-clock-rates = <24576000>; #sound-dai-cells = <0>; + fsl,sai-mclk-direction-output; status = "okay"; }; -- GitLab From 66a6daa0ef7286c906a923fc0c3105dfeaf0e0d1 Mon Sep 17 00:00:00 2001 From: Adam Ford Date: Tue, 15 Apr 2025 20:01:31 -0500 Subject: [PATCH 0944/2211] arm64: dts: imx8mn-beacon: Set SAI5 MCLK direction to output for HDMI audio [ Upstream commit a747c4dd2a60c4d0179b372032a4b98548135096 ] The HDMI bridge chip fails to generate an audio source due to the SAI5 master clock (MCLK) direction not being set to output. This prevents proper clocking of the HDMI audio interface. Add the `fsl,sai-mclk-direction-output` property to the SAI5 node to ensure the MCLK is driven by the SoC, resolving the HDMI sound issue. Fixes: 1d6880ceef43 ("arm64: dts: imx8mn-beacon: Add HDMI video with sound") Signed-off-by: Adam Ford Reviewed-by: Frank Li Signed-off-by: Shawn Guo Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/freescale/imx8mn-beacon-kit.dts | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/boot/dts/freescale/imx8mn-beacon-kit.dts b/arch/arm64/boot/dts/freescale/imx8mn-beacon-kit.dts index 1df5ceb113879..37fc5ed98d7f6 100644 --- a/arch/arm64/boot/dts/freescale/imx8mn-beacon-kit.dts +++ b/arch/arm64/boot/dts/freescale/imx8mn-beacon-kit.dts @@ -124,6 +124,7 @@ assigned-clock-parents = <&clk IMX8MN_AUDIO_PLL1_OUT>; assigned-clock-rates = <24576000>; #sound-dai-cells = <0>; + fsl,sai-mclk-direction-output; status = "okay"; }; -- GitLab From e2df43c9422ebc24ee51182825e00f97b777e189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=ADcolas=20F=2E=20R=2E=20A=2E=20Prado?= Date: Fri, 2 May 2025 11:32:10 -0400 Subject: [PATCH 0945/2211] arm64: dts: mediatek: mt6357: Drop regulator-fixed compatibles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit d77e89b7b03fb945b4353f2dcc4a70b34baa7bcb ] Some of the regulators in the MT6357 PMIC dtsi have compatible set to regulator-fixed, even though they don't serve any purpose: all those regulators are handled as a whole by the mt6357-regulator driver. In fact this is the only dtsi in this family of chips where this is the case: mt6359 and mt6358 don't have any such compatibles. A side-effect caused by this is that the DT kselftest, which is supposed to identify nodes with compatibles that can be probed, but haven't, shows these nodes as failures. Remove the useless compatibles to move the dtsi in line with the others in its family and fix the DT kselftest failures. Fixes: 55749bb478f8 ("arm64: dts: mediatek: add mt6357 device-tree") Signed-off-by: Nícolas F. R. A. Prado Link: https://lore.kernel.org/r/20250502-mt6357-regulator-fixed-compatibles-removal-v1-1-a582c16743fe@collabora.com Signed-off-by: AngeloGioacchino Del Regno Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/mediatek/mt6357.dtsi | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/arch/arm64/boot/dts/mediatek/mt6357.dtsi b/arch/arm64/boot/dts/mediatek/mt6357.dtsi index 5fafa842d312f..dca4e5c3d8e21 100644 --- a/arch/arm64/boot/dts/mediatek/mt6357.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt6357.dtsi @@ -60,7 +60,6 @@ }; mt6357_vfe28_reg: ldo-vfe28 { - compatible = "regulator-fixed"; regulator-name = "vfe28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; @@ -75,7 +74,6 @@ }; mt6357_vrf18_reg: ldo-vrf18 { - compatible = "regulator-fixed"; regulator-name = "vrf18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; @@ -83,7 +81,6 @@ }; mt6357_vrf12_reg: ldo-vrf12 { - compatible = "regulator-fixed"; regulator-name = "vrf12"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <1200000>; @@ -112,7 +109,6 @@ }; mt6357_vcn28_reg: ldo-vcn28 { - compatible = "regulator-fixed"; regulator-name = "vcn28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; @@ -120,7 +116,6 @@ }; mt6357_vcn18_reg: ldo-vcn18 { - compatible = "regulator-fixed"; regulator-name = "vcn18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; @@ -142,7 +137,6 @@ }; mt6357_vcamio_reg: ldo-vcamio18 { - compatible = "regulator-fixed"; regulator-name = "vcamio"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; @@ -175,7 +169,6 @@ }; mt6357_vaux18_reg: ldo-vaux18 { - compatible = "regulator-fixed"; regulator-name = "vaux18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; @@ -183,7 +176,6 @@ }; mt6357_vaud28_reg: ldo-vaud28 { - compatible = "regulator-fixed"; regulator-name = "vaud28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; @@ -191,7 +183,6 @@ }; mt6357_vio28_reg: ldo-vio28 { - compatible = "regulator-fixed"; regulator-name = "vio28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; @@ -199,7 +190,6 @@ }; mt6357_vio18_reg: ldo-vio18 { - compatible = "regulator-fixed"; regulator-name = "vio18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; -- GitLab From 3c8f511a658dc067543286f1e4a56eaa3cffa956 Mon Sep 17 00:00:00 2001 From: Julien Massot Date: Mon, 5 May 2025 15:23:39 +0200 Subject: [PATCH 0946/2211] arm64: dts: mt6359: Add missing 'compatible' property to regulators node [ Upstream commit 1fe38d2a19950fa6dbc384ee8967c057aef9faf4 ] The 'compatible' property is required by the 'mfd/mediatek,mt6397.yaml' binding. Add it to fix the following dtb-check error: mediatek/mt8395-radxa-nio-12l.dtb: pmic: regulators: 'compatible' is a required property Fixes: 3b7d143be4b7 ("arm64: dts: mt6359: add PMIC MT6359 related nodes") Signed-off-by: Julien Massot Link: https://lore.kernel.org/r/20250505-mt8395-dtb-errors-v1-3-9c4714dcdcdb@collabora.com Signed-off-by: AngeloGioacchino Del Regno Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/mediatek/mt6359.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/mediatek/mt6359.dtsi b/arch/arm64/boot/dts/mediatek/mt6359.dtsi index 8e1b8c85c6ede..57af3e7899841 100644 --- a/arch/arm64/boot/dts/mediatek/mt6359.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt6359.dtsi @@ -18,6 +18,8 @@ }; regulators { + compatible = "mediatek,mt6359-regulator"; + mt6359_vs1_buck_reg: buck_vs1 { regulator-name = "vs1"; regulator-min-microvolt = <800000>; -- GitLab From 2533efb0d6dd9f3fb5a1c6286db39530745334c7 Mon Sep 17 00:00:00 2001 From: Alexey Minnekhanov Date: Sun, 4 May 2025 14:51:19 +0300 Subject: [PATCH 0947/2211] arm64: dts: qcom: sdm660-lavender: Add missing USB phy supply [ Upstream commit dbf62a117a1b7f605a98dd1fd1fd6c85ec324ea0 ] Fixes the following dtbs check error: phy@c012000: 'vdda-pll-supply' is a required property Fixes: e5d3e752b050e ("arm64: dts: qcom: sdm660-xiaomi-lavender: Add USB") Signed-off-by: Alexey Minnekhanov Reviewed-by: Dmitry Baryshkov Link: https://lore.kernel.org/r/20250504115120.1432282-3-alexeymin@postmarketos.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts b/arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts index 0b4d71c14a772..a9926ad6c6f9f 100644 --- a/arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts +++ b/arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts @@ -107,6 +107,7 @@ status = "okay"; vdd-supply = <&vreg_l1b_0p925>; + vdda-pll-supply = <&vreg_l10a_1p8>; vdda-phy-dpdm-supply = <&vreg_l7b_3p125>; }; -- GitLab From f924280cf4cba4c192ea47a0f63ed73f1a3a544d Mon Sep 17 00:00:00 2001 From: Alexey Minnekhanov Date: Sun, 4 May 2025 14:51:20 +0300 Subject: [PATCH 0948/2211] arm64: dts: qcom: sda660-ifc6560: Fix dt-validate warning [ Upstream commit f5110806b41eaa0eb0ab1bf2787876a580c6246c ] If you remove clocks property, you should remove clock-names, too. Fixes warning with dtbs check: 'clocks' is a dependency of 'clock-names' Fixes: 34279d6e3f32c ("arm64: dts: qcom: sdm660: Add initial Inforce IFC6560 board support") Signed-off-by: Alexey Minnekhanov Reviewed-by: Dmitry Baryshkov Link: https://lore.kernel.org/r/20250504115120.1432282-4-alexeymin@postmarketos.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sda660-inforce-ifc6560.dts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/sda660-inforce-ifc6560.dts b/arch/arm64/boot/dts/qcom/sda660-inforce-ifc6560.dts index 962c8aa400440..dc604be4afc63 100644 --- a/arch/arm64/boot/dts/qcom/sda660-inforce-ifc6560.dts +++ b/arch/arm64/boot/dts/qcom/sda660-inforce-ifc6560.dts @@ -167,6 +167,7 @@ * BAM DMA interconnects support is in place. */ /delete-property/ clocks; + /delete-property/ clock-names; }; &blsp1_uart2 { @@ -179,6 +180,7 @@ * BAM DMA interconnects support is in place. */ /delete-property/ clocks; + /delete-property/ clock-names; }; &blsp2_uart1 { -- GitLab From 4fd50f6980e2a491ab9b21b42db5f474e85badfa Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Tue, 6 May 2025 20:56:55 +0100 Subject: [PATCH 0949/2211] arm64: dts: rockchip: Add vcc-supply to SPI flash on rk3566-rock3c [ Upstream commit a706a593cb19796f31d3a888423ef1a71885ae72 ] As described in the radxa_rock_3c_v1400_schematic.pdf, the SPI Flash's VCC connector is connected to VCCIO_FLASH and according to the that same schematic, that belongs to the VCC_1V8 power source. This fixes the following warning: spi-nor spi4.0: supply vcc not found, using dummy regulator Fixes: ee219017ddb5 ("arm64: dts: rockchip: Add Radxa ROCK 3C") Signed-off-by: Peter Robinson Link: https://lore.kernel.org/r/20250506195702.593044-1-pbrobinson@gmail.com Signed-off-by: Heiko Stuebner Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/rockchip/rk3566-rock-3c.dts | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rock-3c.dts b/arch/arm64/boot/dts/rockchip/rk3566-rock-3c.dts index f2cc086e5001a..887c9be1b4100 100644 --- a/arch/arm64/boot/dts/rockchip/rk3566-rock-3c.dts +++ b/arch/arm64/boot/dts/rockchip/rk3566-rock-3c.dts @@ -636,6 +636,7 @@ spi-max-frequency = <104000000>; spi-rx-bus-width = <4>; spi-tx-bus-width = <1>; + vcc-supply = <&vcc_1v8>; }; }; -- GitLab From 827746ce8b817d22611770a879a1f1687f880f9a Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Tue, 6 May 2025 23:25:28 +0100 Subject: [PATCH 0950/2211] arm64: dts: rockchip: Update eMMC for NanoPi R5 series [ Upstream commit 8eca9e979a1efbcc3d090f6eb3f4da621e7c87e0 ] Add the 3.3v and 1.8v regulators that are connected to the eMMC on the R5 series devices, as well as adding the eMMC data strobe, and enable eMMC HS200 mode as the Foresee FEMDNN0xxG-A3A55 modules support it. Fixes: c8ec73b05a95d ("arm64: dts: rockchip: create common dtsi for NanoPi R5 series") Signed-off-by: Peter Robinson Reviewed-by: Diederik de Haas Link: https://lore.kernel.org/r/20250506222531.625157-1-pbrobinson@gmail.com Signed-off-by: Heiko Stuebner Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dtsi | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dtsi index 93189f8306400..c30354268c8f5 100644 --- a/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dtsi @@ -486,9 +486,12 @@ &sdhci { bus-width = <8>; max-frequency = <200000000>; + mmc-hs200-1_8v; non-removable; pinctrl-names = "default"; - pinctrl-0 = <&emmc_bus8 &emmc_clk &emmc_cmd>; + pinctrl-0 = <&emmc_bus8 &emmc_clk &emmc_cmd &emmc_datastrobe>; + vmmc-supply = <&vcc_3v3>; + vqmmc-supply = <&vcc_1v8>; status = "okay"; }; -- GitLab From 39ecf2ad203c6fad9dc853494b36194433e9d85e Mon Sep 17 00:00:00 2001 From: Aaron Kling Date: Mon, 28 Apr 2025 20:51:47 -0500 Subject: [PATCH 0951/2211] arm64: tegra: Drop remaining serial clock-names and reset-names [ Upstream commit 4cd763297c2203c6ba587d7d4a9105f96597b998 ] The referenced commit only removed some of the names, missing all that weren't in use at the time. The commit removes the rest. Fixes: 71de0a054d0e ("arm64: tegra: Drop serial clock-names and reset-names") Signed-off-by: Aaron Kling Link: https://lore.kernel.org/r/20250428-tegra-serial-fixes-v1-1-4f47c5d85bf6@gmail.com Signed-off-by: Thierry Reding Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/nvidia/tegra186.dtsi | 12 ------------ arch/arm64/boot/dts/nvidia/tegra194.dtsi | 12 ------------ 2 files changed, 24 deletions(-) diff --git a/arch/arm64/boot/dts/nvidia/tegra186.dtsi b/arch/arm64/boot/dts/nvidia/tegra186.dtsi index 2b3bb5d0af17b..f0b7949df92c0 100644 --- a/arch/arm64/boot/dts/nvidia/tegra186.dtsi +++ b/arch/arm64/boot/dts/nvidia/tegra186.dtsi @@ -621,9 +621,7 @@ reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA186_CLK_UARTB>; - clock-names = "serial"; resets = <&bpmp TEGRA186_RESET_UARTB>; - reset-names = "serial"; status = "disabled"; }; @@ -633,9 +631,7 @@ reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA186_CLK_UARTD>; - clock-names = "serial"; resets = <&bpmp TEGRA186_RESET_UARTD>; - reset-names = "serial"; status = "disabled"; }; @@ -645,9 +641,7 @@ reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA186_CLK_UARTE>; - clock-names = "serial"; resets = <&bpmp TEGRA186_RESET_UARTE>; - reset-names = "serial"; status = "disabled"; }; @@ -657,9 +651,7 @@ reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA186_CLK_UARTF>; - clock-names = "serial"; resets = <&bpmp TEGRA186_RESET_UARTF>; - reset-names = "serial"; status = "disabled"; }; @@ -1236,9 +1228,7 @@ reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA186_CLK_UARTC>; - clock-names = "serial"; resets = <&bpmp TEGRA186_RESET_UARTC>; - reset-names = "serial"; status = "disabled"; }; @@ -1248,9 +1238,7 @@ reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA186_CLK_UARTG>; - clock-names = "serial"; resets = <&bpmp TEGRA186_RESET_UARTG>; - reset-names = "serial"; status = "disabled"; }; diff --git a/arch/arm64/boot/dts/nvidia/tegra194.dtsi b/arch/arm64/boot/dts/nvidia/tegra194.dtsi index 33f92b77cd9d9..c369507747851 100644 --- a/arch/arm64/boot/dts/nvidia/tegra194.dtsi +++ b/arch/arm64/boot/dts/nvidia/tegra194.dtsi @@ -766,9 +766,7 @@ reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA194_CLK_UARTD>; - clock-names = "serial"; resets = <&bpmp TEGRA194_RESET_UARTD>; - reset-names = "serial"; status = "disabled"; }; @@ -778,9 +776,7 @@ reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA194_CLK_UARTE>; - clock-names = "serial"; resets = <&bpmp TEGRA194_RESET_UARTE>; - reset-names = "serial"; status = "disabled"; }; @@ -790,9 +786,7 @@ reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA194_CLK_UARTF>; - clock-names = "serial"; resets = <&bpmp TEGRA194_RESET_UARTF>; - reset-names = "serial"; status = "disabled"; }; @@ -817,9 +811,7 @@ reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA194_CLK_UARTH>; - clock-names = "serial"; resets = <&bpmp TEGRA194_RESET_UARTH>; - reset-names = "serial"; status = "disabled"; }; @@ -1616,9 +1608,7 @@ reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA194_CLK_UARTC>; - clock-names = "serial"; resets = <&bpmp TEGRA194_RESET_UARTC>; - reset-names = "serial"; status = "disabled"; }; @@ -1628,9 +1618,7 @@ reg-shift = <2>; interrupts = ; clocks = <&bpmp TEGRA194_CLK_UARTG>; - clock-names = "serial"; resets = <&bpmp TEGRA194_RESET_UARTG>; - reset-names = "serial"; status = "disabled"; }; -- GitLab From 2e39a12c45d4b4e09309ae2d2263c7d729ca8788 Mon Sep 17 00:00:00 2001 From: Aaron Kling Date: Sun, 20 Apr 2025 09:35:37 -0500 Subject: [PATCH 0952/2211] arm64: tegra: Add uartd serial alias for Jetson TX1 module [ Upstream commit dfb25484bd73c8590954ead6fd58a1587ba3bbc5 ] If a serial-tegra interface does not have an alias, the driver fails to probe with an error: serial-tegra 70006300.serial: failed to get alias id, errno -19 This prevents the bluetooth device from being accessible. Fixes: 6eba6471bbb7 ("arm64: tegra: Wire up Bluetooth on Jetson TX1 module") Signed-off-by: Aaron Kling Reviewed-by: Tomasz Maciej Nowak Link: https://lore.kernel.org/r/20250420-tx1-bt-v1-1-153cba105a4e@gmail.com Signed-off-by: Thierry Reding Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi b/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi index 1c53ccc5e3cbf..9c1b2e7d3997f 100644 --- a/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi +++ b/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi @@ -11,6 +11,7 @@ rtc0 = "/i2c@7000d000/pmic@3c"; rtc1 = "/rtc@7000e000"; serial0 = &uarta; + serial3 = &uartd; }; chosen { -- GitLab From 14f2820a5db6830bac438d2541d2352d715bdb28 Mon Sep 17 00:00:00 2001 From: Prasanth Babu Mantena Date: Wed, 7 May 2025 10:37:01 +0530 Subject: [PATCH 0953/2211] arm64: dts: ti: k3-j721e-common-proc-board: Enable OSPI1 on J721E [ Upstream commit 6b8deb2ff0d31848c43a73f6044e69ba9276b3ec ] J721E SoM has MT25QU512AB Serial NOR flash connected to OSPI1 controller. Enable ospi1 node in device tree. Fixes: 73676c480b72 ("arm64: dts: ti: k3-j721e: Enable OSPI nodes at the board level") Signed-off-by: Prasanth Babu Mantena Link: https://lore.kernel.org/r/20250507050701.3007209-1-p-mantena@ti.com Signed-off-by: Nishanth Menon Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts index 8230d53cd6960..f7a557e6af547 100644 --- a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts +++ b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts @@ -557,6 +557,7 @@ &ospi1 { pinctrl-names = "default"; pinctrl-0 = <&mcu_fss0_ospi1_pins_default>; + status = "okay"; flash@0 { compatible = "jedec,spi-nor"; -- GitLab From e318a7bd2db594bc8644c8c8675e33a8ce84b953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barnab=C3=A1s=20Cz=C3=A9m=C3=A1n?= Date: Mon, 21 Apr 2025 04:04:17 +0200 Subject: [PATCH 0954/2211] soc: qcom: smp2p: Fix fallback to qcom,ipc parse MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 421777a02bbd9cdabe0ae05a69ee06253150589d ] mbox_request_channel() returning value was changed in case of error. It uses returning value of of_parse_phandle_with_args(). It is returning with -ENOENT instead of -ENODEV when no mboxes property exists. Fixes: 24fdd5074b20 ("mailbox: use error ret code of of_parse_phandle_with_args()") Signed-off-by: Barnabás Czémán Reviewed-by: Stephan Gerhold Tested-by: Stephan Gerhold # msm8939 Link: https://lore.kernel.org/r/20250421-fix-qcom-smd-v1-2-574d071d3f27@mainlining.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/soc/qcom/smp2p.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/soc/qcom/smp2p.c b/drivers/soc/qcom/smp2p.c index cefcbd61c6281..95d8a8f728db5 100644 --- a/drivers/soc/qcom/smp2p.c +++ b/drivers/soc/qcom/smp2p.c @@ -578,7 +578,7 @@ static int qcom_smp2p_probe(struct platform_device *pdev) smp2p->mbox_client.knows_txdone = true; smp2p->mbox_chan = mbox_request_channel(&smp2p->mbox_client, 0); if (IS_ERR(smp2p->mbox_chan)) { - if (PTR_ERR(smp2p->mbox_chan) != -ENODEV) + if (PTR_ERR(smp2p->mbox_chan) != -ENOENT) return PTR_ERR(smp2p->mbox_chan); smp2p->mbox_chan = NULL; -- GitLab From 0aff95d9bc7fb5400ca8af507429c4b067bdb425 Mon Sep 17 00:00:00 2001 From: Phillip Lougher Date: Wed, 9 Apr 2025 03:47:47 +0100 Subject: [PATCH 0955/2211] Squashfs: check return result of sb_min_blocksize [ Upstream commit 734aa85390ea693bb7eaf2240623d41b03705c84 ] Syzkaller reports an "UBSAN: shift-out-of-bounds in squashfs_bio_read" bug. Syzkaller forks multiple processes which after mounting the Squashfs filesystem, issues an ioctl("/dev/loop0", LOOP_SET_BLOCK_SIZE, 0x8000). Now if this ioctl occurs at the same time another process is in the process of mounting a Squashfs filesystem on /dev/loop0, the failure occurs. When this happens the following code in squashfs_fill_super() fails. ---- msblk->devblksize = sb_min_blocksize(sb, SQUASHFS_DEVBLK_SIZE); msblk->devblksize_log2 = ffz(~msblk->devblksize); ---- sb_min_blocksize() returns 0, which means msblk->devblksize is set to 0. As a result, ffz(~msblk->devblksize) returns 64, and msblk->devblksize_log2 is set to 64. This subsequently causes the UBSAN: shift-out-of-bounds in fs/squashfs/block.c:195:36 shift exponent 64 is too large for 64-bit type 'u64' (aka 'unsigned long long') This commit adds a check for a 0 return by sb_min_blocksize(). Link: https://lkml.kernel.org/r/20250409024747.876480-1-phillip@squashfs.org.uk Fixes: 0aa666190509 ("Squashfs: super block operations") Reported-by: syzbot+65761fc25a137b9c8c6e@syzkaller.appspotmail.com Closes: https://lore.kernel.org/all/67f0dd7a.050a0220.0a13.0230.GAE@google.com/ Signed-off-by: Phillip Lougher Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin --- fs/squashfs/super.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c index 22e812808e5cf..3a27d4268b3c4 100644 --- a/fs/squashfs/super.c +++ b/fs/squashfs/super.c @@ -202,6 +202,11 @@ static int squashfs_fill_super(struct super_block *sb, struct fs_context *fc) msblk->panic_on_errors = (opts->errors == Opt_errors_panic); msblk->devblksize = sb_min_blocksize(sb, SQUASHFS_DEVBLK_SIZE); + if (!msblk->devblksize) { + errorf(fc, "squashfs: unable to set blocksize\n"); + return -EINVAL; + } + msblk->devblksize_log2 = ffz(~msblk->devblksize); mutex_init(&msblk->meta_index_mutex); -- GitLab From f6fae70f830dfa0b152359c0affc275b353d042f Mon Sep 17 00:00:00 2001 From: Murad Masimov Date: Wed, 2 Apr 2025 09:56:27 +0300 Subject: [PATCH 0956/2211] ocfs2: fix possible memory leak in ocfs2_finish_quota_recovery [ Upstream commit cdc3ed3035d0fe934aa1d9b78ce256752fd3bb7d ] If ocfs2_finish_quota_recovery() exits due to an error before passing all rc_list elements to ocfs2_recover_local_quota_file() then it can lead to a memory leak as rc_list may still contain elements that have to be freed. Release all memory allocated by ocfs2_add_recovery_chunk() using ocfs2_free_quota_recovery() instead of kfree(). Found by Linux Verification Center (linuxtesting.org) with Syzkaller. Link: https://lkml.kernel.org/r/20250402065628.706359-2-m.masimov@mt-integration.ru Fixes: 2205363dce74 ("ocfs2: Implement quota recovery") Signed-off-by: Murad Masimov Reviewed-by: Jan Kara Reviewed-by: Joseph Qi Cc: Mark Fasheh Cc: Joel Becker Cc: Junxiao Bi Cc: Changwei Ge Cc: Jun Piao Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin --- fs/ocfs2/quota_local.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c index e272429da3db3..de7f12858729a 100644 --- a/fs/ocfs2/quota_local.c +++ b/fs/ocfs2/quota_local.c @@ -674,7 +674,7 @@ out_put: break; } out: - kfree(rec); + ocfs2_free_quota_recovery(rec); return status; } -- GitLab From ecfc9dfae9f8a5ee4831435dde3674b79e0ac05e Mon Sep 17 00:00:00 2001 From: Wentao Liang Date: Tue, 29 Apr 2025 02:37:07 +0900 Subject: [PATCH 0957/2211] nilfs2: add pointer check for nilfs_direct_propagate() [ Upstream commit f43f02429295486059605997bc43803527d69791 ] Patch series "nilfs2: improve sanity checks in dirty state propagation". This fixes one missed check for block mapping anomalies and one improper return of an error code during a preparation step for log writing, thereby improving checking for filesystem corruption on writeback. This patch (of 2): In nilfs_direct_propagate(), the printer get from nilfs_direct_get_ptr() need to be checked to ensure it is not an invalid pointer. If the pointer value obtained by nilfs_direct_get_ptr() is NILFS_BMAP_INVALID_PTR, means that the metadata (in this case, i_bmap in the nilfs_inode_info struct) that should point to the data block at the buffer head of the argument is corrupted and the data block is orphaned, meaning that the file system has lost consistency. Add a value check and return -EINVAL when it is an invalid pointer. Link: https://lkml.kernel.org/r/20250428173808.6452-1-konishi.ryusuke@gmail.com Link: https://lkml.kernel.org/r/20250428173808.6452-2-konishi.ryusuke@gmail.com Fixes: 36a580eb489f ("nilfs2: direct block mapping") Signed-off-by: Wentao Liang Signed-off-by: Ryusuke Konishi Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin --- fs/nilfs2/direct.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/nilfs2/direct.c b/fs/nilfs2/direct.c index 893ab36824cc2..2d8dc6b35b547 100644 --- a/fs/nilfs2/direct.c +++ b/fs/nilfs2/direct.c @@ -273,6 +273,9 @@ static int nilfs_direct_propagate(struct nilfs_bmap *bmap, dat = nilfs_bmap_get_dat(bmap); key = nilfs_bmap_data_get_key(bmap, bh); ptr = nilfs_direct_get_ptr(bmap, key); + if (ptr == NILFS_BMAP_INVALID_PTR) + return -EINVAL; + if (!buffer_nilfs_volatile(bh)) { oldreq.pr_entry_nr = ptr; newreq.pr_entry_nr = ptr; -- GitLab From 9abbace400307f47c9e240f9b954913031f5b0ee Mon Sep 17 00:00:00 2001 From: Ryusuke Konishi Date: Tue, 29 Apr 2025 02:37:08 +0900 Subject: [PATCH 0958/2211] nilfs2: do not propagate ENOENT error from nilfs_btree_propagate() [ Upstream commit 8e39fbb1edbb4ec9d7c1124f403877fc167fcecd ] In preparation for writing logs, in nilfs_btree_propagate(), which makes parent and ancestor node blocks dirty starting from a modified data block or b-tree node block, if the starting block does not belong to the b-tree, i.e. is isolated, nilfs_btree_do_lookup() called within the function fails with -ENOENT. In this case, even though -ENOENT is an internal code, it is propagated to the log writer via nilfs_bmap_propagate() and may be erroneously returned to system calls such as fsync(). Fix this issue by changing the error code to -EINVAL in this case, and having the bmap layer detect metadata corruption and convert the error code appropriately. Link: https://lkml.kernel.org/r/20250428173808.6452-3-konishi.ryusuke@gmail.com Fixes: 1f5abe7e7dbc ("nilfs2: replace BUG_ON and BUG calls triggerable from ioctl") Signed-off-by: Ryusuke Konishi Cc: Wentao Liang Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin --- fs/nilfs2/btree.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c index ef5061bb56da1..9c51a4ac2627f 100644 --- a/fs/nilfs2/btree.c +++ b/fs/nilfs2/btree.c @@ -2103,11 +2103,13 @@ static int nilfs_btree_propagate(struct nilfs_bmap *btree, ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1, 0); if (ret < 0) { - if (unlikely(ret == -ENOENT)) + if (unlikely(ret == -ENOENT)) { nilfs_crit(btree->b_inode->i_sb, "writing node/leaf block does not appear in b-tree (ino=%lu) at key=%llu, level=%d", btree->b_inode->i_ino, (unsigned long long)key, level); + ret = -EINVAL; + } goto out; } -- GitLab From 1d5baab39e5b09a76870b345cdee7933871b881f Mon Sep 17 00:00:00 2001 From: Ioana Ciornei Date: Tue, 8 Apr 2025 13:58:09 +0300 Subject: [PATCH 0959/2211] bus: fsl-mc: fix double-free on mc_dev [ Upstream commit d694bf8a9acdbd061596f3e7549bc8cb70750a60 ] The blamed commit tried to simplify how the deallocations are done but, in the process, introduced a double-free on the mc_dev variable. In case the MC device is a DPRC, a new mc_bus is allocated and the mc_dev variable is just a reference to one of its fields. In this circumstance, on the error path only the mc_bus should be freed. This commit introduces back the following checkpatch warning which is a false-positive. WARNING: kfree(NULL) is safe and this check is probably not required + if (mc_bus) + kfree(mc_bus); Fixes: a042fbed0290 ("staging: fsl-mc: simplify couple of deallocations") Signed-off-by: Ioana Ciornei Link: https://lore.kernel.org/r/20250408105814.2837951-2-ioana.ciornei@nxp.com Signed-off-by: Christophe Leroy Signed-off-by: Sasha Levin --- drivers/bus/fsl-mc/fsl-mc-bus.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/bus/fsl-mc/fsl-mc-bus.c b/drivers/bus/fsl-mc/fsl-mc-bus.c index 930d8a3ba722b..58d16ff166c2d 100644 --- a/drivers/bus/fsl-mc/fsl-mc-bus.c +++ b/drivers/bus/fsl-mc/fsl-mc-bus.c @@ -905,8 +905,10 @@ int fsl_mc_device_add(struct fsl_mc_obj_desc *obj_desc, error_cleanup_dev: kfree(mc_dev->regions); - kfree(mc_bus); - kfree(mc_dev); + if (mc_bus) + kfree(mc_bus); + else + kfree(mc_dev); return error; } -- GitLab From 2a8d4567aaa0384b5b25ff74b8191e21970aab84 Mon Sep 17 00:00:00 2001 From: Andre Przywara Date: Mon, 5 May 2025 17:47:27 +0100 Subject: [PATCH 0960/2211] dt-bindings: vendor-prefixes: Add Liontron name [ Upstream commit 9baa27a2e9fc746143ab686b6dbe2d515284a4c5 ] Liontron is a company based in Shenzen, China, making industrial development boards and embedded computers, mostly using Rockchip and Allwinner SoCs. Add their name to the list of vendors. Signed-off-by: Andre Przywara Acked-by: Rob Herring (Arm) Link: https://patch.msgid.link/20250505164729.18175-2-andre.przywara@arm.com Signed-off-by: Chen-Yu Tsai Signed-off-by: Sasha Levin --- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml index 71a1a399e1e1f..af9a8d43b2479 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -846,6 +846,8 @@ patternProperties: description: Linux-specific binding "^linx,.*": description: Linx Technologies + "^liontron,.*": + description: Shenzhen Liontron Technology Co., Ltd "^liteon,.*": description: LITE-ON Technology Corp. "^litex,.*": -- GitLab From 36a1fdd5d55ca0eac2f2ebf5f26953678810198e Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Tue, 18 Mar 2025 15:21:59 +0200 Subject: [PATCH 0961/2211] ARM: dts: qcom: apq8064: add missing clocks to the timer node [ Upstream commit 4b0eb149df58b6750cd8113e5ee5b3ac7cc51743 ] In order to fix DT schema warning and describe hardware properly, add missing sleep clock to the timer node. Fixes: f335b8af4fd5 ("ARM: dts: qcom: Add initial APQ8064 SoC and IFC6410 board device trees") Signed-off-by: Dmitry Baryshkov Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250318-fix-nexus-4-v2-6-bcedd1406790@oss.qualcomm.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm/boot/dts/qcom/qcom-apq8064.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi b/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi index ac7494ed633e1..1d802d931028d 100644 --- a/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi +++ b/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi @@ -326,6 +326,8 @@ ; reg = <0x0200a000 0x100>; clock-frequency = <27000000>; + clocks = <&sleep_clk>; + clock-names = "sleep"; cpu-offset = <0x80000>; }; -- GitLab From 99f2ee48e9452458a2a04ccafd4ef2ae921467a4 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Tue, 18 Mar 2025 15:22:00 +0200 Subject: [PATCH 0962/2211] ARM: dts: qcom: apq8064 merge hw splinlock into corresponding syscon device [ Upstream commit 325c6a441ae1f8fcb1db9bb945b8bdbd3142141e ] Follow up the expected way of describing the SFPB hwspinlock and merge hwspinlock node into corresponding syscon node, fixing several dt-schema warnings. Fixes: 24a9baf933dc ("ARM: dts: qcom: apq8064: Add hwmutex and SMEM nodes") Signed-off-by: Dmitry Baryshkov Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250318-fix-nexus-4-v2-7-bcedd1406790@oss.qualcomm.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm/boot/dts/qcom/qcom-apq8064.dtsi | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi b/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi index 1d802d931028d..38ce6f5fe6b48 100644 --- a/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi +++ b/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi @@ -213,12 +213,6 @@ }; }; - sfpb_mutex: hwmutex { - compatible = "qcom,sfpb-mutex"; - syscon = <&sfpb_wrapper_mutex 0x604 0x4>; - #hwlock-cells = <1>; - }; - smem { compatible = "qcom,smem"; memory-region = <&smem_region>; @@ -305,9 +299,10 @@ pinctrl-0 = <&ps_hold_default_state>; }; - sfpb_wrapper_mutex: syscon@1200000 { - compatible = "syscon"; - reg = <0x01200000 0x8000>; + sfpb_mutex: hwmutex@1200600 { + compatible = "qcom,sfpb-mutex"; + reg = <0x01200600 0x100>; + #hwlock-cells = <1>; }; intc: interrupt-controller@2000000 { -- GitLab From 833388013346e45bf553016ee1046fd5d499a46f Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Tue, 18 Mar 2025 15:22:03 +0200 Subject: [PATCH 0963/2211] ARM: dts: qcom: apq8064: move replicator out of soc node [ Upstream commit f2420037d90a8354594b3da541e19dcbb60c75e1 ] The CoreSight static replicator device isn't a part of the system MMIO bus, as such it should not be a part of the soc node. Follow the example of other platforms and move it out of the soc bus to the top-level (and reoder ports to follow alphabetic order). Fixes: 7a5c275fd821 ("ARM: dts: qcom: Add apq8064 CoreSight components") Signed-off-by: Dmitry Baryshkov Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250318-fix-nexus-4-v2-10-bcedd1406790@oss.qualcomm.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm/boot/dts/qcom/qcom-apq8064.dtsi | 67 ++++++++++++------------ 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi b/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi index 38ce6f5fe6b48..be87c396f05f1 100644 --- a/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi +++ b/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi @@ -278,6 +278,40 @@ }; }; + replicator { + compatible = "arm,coresight-static-replicator"; + + clocks = <&rpmcc RPM_QDSS_CLK>; + clock-names = "apb_pclk"; + + in-ports { + port { + replicator_in: endpoint { + remote-endpoint = <&funnel_out>; + }; + }; + }; + + out-ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + replicator_out0: endpoint { + remote-endpoint = <&etb_in>; + }; + }; + + port@1 { + reg = <1>; + replicator_out1: endpoint { + remote-endpoint = <&tpiu_in>; + }; + }; + }; + }; + soc: soc { #address-cells = <1>; #size-cells = <1>; @@ -1529,39 +1563,6 @@ }; }; - replicator { - compatible = "arm,coresight-static-replicator"; - - clocks = <&rpmcc RPM_QDSS_CLK>; - clock-names = "apb_pclk"; - - out-ports { - #address-cells = <1>; - #size-cells = <0>; - - port@0 { - reg = <0>; - replicator_out0: endpoint { - remote-endpoint = <&etb_in>; - }; - }; - port@1 { - reg = <1>; - replicator_out1: endpoint { - remote-endpoint = <&tpiu_in>; - }; - }; - }; - - in-ports { - port { - replicator_in: endpoint { - remote-endpoint = <&funnel_out>; - }; - }; - }; - }; - funnel@1a04000 { compatible = "arm,coresight-dynamic-funnel", "arm,primecell"; reg = <0x1a04000 0x1000>; -- GitLab From 318d0f2adc67a84af59fa0ae8923e4f284ee6c22 Mon Sep 17 00:00:00 2001 From: Vignesh Raman Date: Mon, 12 May 2025 18:49:24 +0530 Subject: [PATCH 0964/2211] arm64: defconfig: mediatek: enable PHY drivers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit f52cd248d844f9451858992f924988ac413fdc7e ] The mediatek display driver fails to probe on mt8173-elm-hana and mt8183-kukui-jacuzzi-juniper-sku16 in v6.14-rc4 due to missing PHY configurations. Commit 924d66011f24 ("drm/mediatek: stop selecting foreign drivers") stopped selecting the MediaTek PHY drivers, requiring them to be explicitly enabled in defconfig. Enable the following PHY drivers for MediaTek platforms: CONFIG_PHY_MTK_HDMI=m for HDMI display CONFIG_PHY_MTK_MIPI_DSI=m for DSI display CONFIG_PHY_MTK_DP=m for DP display Fixes: 924d66011f24 ("drm/mediatek: stop selecting foreign drivers") Reviewed-by: Nícolas F. R. A. Prado Signed-off-by: Vignesh Raman Link: https://lore.kernel.org/r/20250512131933.1247830-1-vignesh.raman@collabora.com Signed-off-by: AngeloGioacchino Del Regno Signed-off-by: Sasha Levin --- arch/arm64/configs/defconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig index 8fe7dbae33bf9..f988dd79add89 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig @@ -1536,6 +1536,9 @@ CONFIG_PHY_HISTB_COMBPHY=y CONFIG_PHY_HISI_INNO_USB2=y CONFIG_PHY_MVEBU_CP110_COMPHY=y CONFIG_PHY_MTK_TPHY=y +CONFIG_PHY_MTK_HDMI=m +CONFIG_PHY_MTK_MIPI_DSI=m +CONFIG_PHY_MTK_DP=m CONFIG_PHY_QCOM_EDP=m CONFIG_PHY_QCOM_PCIE2=m CONFIG_PHY_QCOM_QMP=m -- GitLab From 16f35dcfe37e1b476a66c0f50ea5d784f132c673 Mon Sep 17 00:00:00 2001 From: Quentin Schulz Date: Fri, 25 Apr 2025 17:18:10 +0200 Subject: [PATCH 0965/2211] arm64: dts: rockchip: disable unrouted USB controllers and PHY on RK3399 Puma with Haikou [ Upstream commit febd8c6ab52c683b447fe22fc740918c86feae43 ] The u2phy0_host port is the part of the USB PHY0 (namely the HOST0_DP/DM lanes) which routes directly to the USB2.0 HOST controller[1]. The other lanes of the PHY are routed to the USB3.0 OTG controller (dwc3), which we do use. The HOST0_DP/DM lanes aren't routed on RK3399 Puma so let's simply disable the USB2.0 controllers. USB3 OTG has been known to be unstable on RK3399 Puma Haikou for a while, one of the recurring issues being that only USB2 is detected and not USB3 in host mode. Reading the justification above and seeing that we are keeping u2phy0_host in the Haikou carrierboard DTS probably may have bothered you since it should be changed to u2phy0_otg. The issue is that if it's switched to that, USB OTG on Haikou is entirely broken. I have checked the routing in the Gerber file, the lanes are going to the expected ball pins (that is, NOT HOST0_DP/DM). u2phy0_host is for sure the wrong part of the PHY to use, but it's the only one that works at the moment for that board so keep it until we figure out what exactly is broken. No intended functional change. [1] https://rockchip.fr/Rockchip%20RK3399%20TRM%20V1.3%20Part2.pdf Chapter 2 USB2.0 PHY Fixes: 2c66fc34e945 ("arm64: dts: rockchip: add RK3399-Q7 (Puma) SoM") Signed-off-by: Quentin Schulz Signed-off-by: Lukasz Czechowski Link: https://lore.kernel.org/r/20250425-onboard_usb_dev-v2-5-4a76a474a010@thaumatec.com Signed-off-by: Heiko Stuebner Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts b/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts index f6f15946579eb..57466fbfd3f9a 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts +++ b/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts @@ -284,14 +284,6 @@ status = "okay"; }; -&usb_host0_ehci { - status = "okay"; -}; - -&usb_host0_ohci { - status = "okay"; -}; - &vopb { status = "okay"; }; -- GitLab From 81f52f39edcec1222d594bb1aad241f0a99001d4 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Fri, 7 Feb 2025 22:41:18 +0200 Subject: [PATCH 0966/2211] arm64: dts: qcom: qcm2290: fix (some) of QUP interconnects [ Upstream commit e07d2d57a1c7254d25597dcdd34f318a91ec9398 ] While adding interconnect support for the QCM2290 platform some of them got the c&p error, rogue MASTER_APPSS_PROC for the config_noc interconnect. Turn that into SLAVE_QUP_0 as expected. Fixes: 5b970ff0193d ("arm64: dts: qcom: qcm2290: Hook up interconnects") Reported-by: Konrad Dybcio Reviewed-by: Konrad Dybcio Signed-off-by: Dmitry Baryshkov Link: https://lore.kernel.org/r/20250207-rb1-bt-v4-4-d810fc8c94a9@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/qcm2290.dtsi | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/qcm2290.dtsi b/arch/arm64/boot/dts/qcom/qcm2290.dtsi index 79bc42ffb6a1f..2cfdf5bd5fd9b 100644 --- a/arch/arm64/boot/dts/qcom/qcm2290.dtsi +++ b/arch/arm64/boot/dts/qcom/qcm2290.dtsi @@ -1073,7 +1073,7 @@ interconnects = <&qup_virt MASTER_QUP_CORE_0 RPM_ALWAYS_TAG &qup_virt SLAVE_QUP_CORE_0 RPM_ALWAYS_TAG>, <&bimc MASTER_APPSS_PROC RPM_ALWAYS_TAG - &config_noc MASTER_APPSS_PROC RPM_ALWAYS_TAG>; + &config_noc SLAVE_QUP_0 RPM_ALWAYS_TAG>; interconnect-names = "qup-core", "qup-config"; #address-cells = <1>; @@ -1092,7 +1092,7 @@ interconnects = <&qup_virt MASTER_QUP_CORE_0 RPM_ALWAYS_TAG &qup_virt SLAVE_QUP_CORE_0 RPM_ALWAYS_TAG>, <&bimc MASTER_APPSS_PROC RPM_ALWAYS_TAG - &config_noc MASTER_APPSS_PROC RPM_ALWAYS_TAG>; + &config_noc SLAVE_QUP_0 RPM_ALWAYS_TAG>; interconnect-names = "qup-core", "qup-config"; status = "disabled"; @@ -1137,7 +1137,7 @@ interconnects = <&qup_virt MASTER_QUP_CORE_0 RPM_ALWAYS_TAG &qup_virt SLAVE_QUP_CORE_0 RPM_ALWAYS_TAG>, <&bimc MASTER_APPSS_PROC RPM_ALWAYS_TAG - &config_noc MASTER_APPSS_PROC RPM_ALWAYS_TAG>; + &config_noc SLAVE_QUP_0 RPM_ALWAYS_TAG>; interconnect-names = "qup-core", "qup-config"; #address-cells = <1>; @@ -1184,7 +1184,7 @@ interconnects = <&qup_virt MASTER_QUP_CORE_0 RPM_ALWAYS_TAG &qup_virt SLAVE_QUP_CORE_0 RPM_ALWAYS_TAG>, <&bimc MASTER_APPSS_PROC RPM_ALWAYS_TAG - &config_noc MASTER_APPSS_PROC RPM_ALWAYS_TAG>; + &config_noc SLAVE_QUP_0 RPM_ALWAYS_TAG>; interconnect-names = "qup-core", "qup-config"; #address-cells = <1>; @@ -1231,7 +1231,7 @@ interconnects = <&qup_virt MASTER_QUP_CORE_0 RPM_ALWAYS_TAG &qup_virt SLAVE_QUP_CORE_0 RPM_ALWAYS_TAG>, <&bimc MASTER_APPSS_PROC RPM_ALWAYS_TAG - &config_noc MASTER_APPSS_PROC RPM_ALWAYS_TAG>; + &config_noc SLAVE_QUP_0 RPM_ALWAYS_TAG>; interconnect-names = "qup-core", "qup-config"; #address-cells = <1>; @@ -1278,7 +1278,7 @@ interconnects = <&qup_virt MASTER_QUP_CORE_0 RPM_ALWAYS_TAG &qup_virt SLAVE_QUP_CORE_0 RPM_ALWAYS_TAG>, <&bimc MASTER_APPSS_PROC RPM_ALWAYS_TAG - &config_noc MASTER_APPSS_PROC RPM_ALWAYS_TAG>; + &config_noc SLAVE_QUP_0 RPM_ALWAYS_TAG>; interconnect-names = "qup-core", "qup-config"; #address-cells = <1>; @@ -1297,7 +1297,7 @@ interconnects = <&qup_virt MASTER_QUP_CORE_0 RPM_ALWAYS_TAG &qup_virt SLAVE_QUP_CORE_0 RPM_ALWAYS_TAG>, <&bimc MASTER_APPSS_PROC RPM_ALWAYS_TAG - &config_noc MASTER_APPSS_PROC RPM_ALWAYS_TAG>; + &config_noc SLAVE_QUP_0 RPM_ALWAYS_TAG>; interconnect-names = "qup-core", "qup-config"; status = "disabled"; @@ -1342,7 +1342,7 @@ interconnects = <&qup_virt MASTER_QUP_CORE_0 RPM_ALWAYS_TAG &qup_virt SLAVE_QUP_CORE_0 RPM_ALWAYS_TAG>, <&bimc MASTER_APPSS_PROC RPM_ALWAYS_TAG - &config_noc MASTER_APPSS_PROC RPM_ALWAYS_TAG>; + &config_noc SLAVE_QUP_0 RPM_ALWAYS_TAG>; interconnect-names = "qup-core", "qup-config"; #address-cells = <1>; -- GitLab From 0e00819914691f877c8bd503b5d475e577ac634a Mon Sep 17 00:00:00 2001 From: Thuan Nguyen Date: Mon, 19 May 2025 06:43:24 +0000 Subject: [PATCH 0967/2211] arm64: dts: renesas: white-hawk-ard-audio: Fix TPU0 groups [ Upstream commit 652eea251dd852f02cef6223f367220acb3d1867 ] White Hawk ARD audio uses a clock generated by the TPU, but commit 3d144ef10a44 ("pinctrl: renesas: r8a779g0: Fix TPU suffixes") renamed pin group "tpu_to0_a" to "tpu_to0_b". Update DTS accordingly otherwise the sound driver does not receive a clock signal. Fixes: 3d144ef10a448f89 ("pinctrl: renesas: r8a779g0: Fix TPU suffixes") Signed-off-by: Thuan Nguyen Signed-off-by: Duy Nguyen Reviewed-by: Geert Uytterhoeven Acked-by: Kuninori Morimoto Link: https://lore.kernel.org/TYCPR01MB8740608B675365215ADB0374B49CA@TYCPR01MB8740.jpnprd01.prod.outlook.com Signed-off-by: Geert Uytterhoeven Signed-off-by: Sasha Levin --- .../boot/dts/renesas/r8a779g0-white-hawk-ard-audio-da7212.dtso | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-ard-audio-da7212.dtso b/arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-ard-audio-da7212.dtso index e6cf304c77ee9..5d820bd32ff67 100644 --- a/arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-ard-audio-da7212.dtso +++ b/arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-ard-audio-da7212.dtso @@ -108,7 +108,7 @@ }; tpu0_pins: tpu0 { - groups = "tpu_to0_a"; + groups = "tpu_to0_b"; function = "tpu"; }; }; -- GitLab From 0007761ff51fede6ddbba14e8df26679c7b90b7f Mon Sep 17 00:00:00 2001 From: Julien Massot Date: Wed, 14 May 2025 10:19:58 +0200 Subject: [PATCH 0968/2211] arm64: dts: mt6359: Rename RTC node to match binding expectations [ Upstream commit cfe035d8662cfbd6edff9bd89c4b516bbb34c350 ] Rename the node 'mt6359rtc' to 'rtc', as required by the binding. Fix the following dtb-check error: mediatek/mt8395-radxa-nio-12l.dtb: pmic: 'mt6359rtc' do not match any of the regexes: 'pinctrl-[0-9]+' Fixes: 3b7d143be4b7 ("arm64: dts: mt6359: add PMIC MT6359 related nodes") Signed-off-by: Julien Massot Reviewed-by: AngeloGioacchino Del Regno Link: https://lore.kernel.org/r/20250514-mt8395-dtb-errors-v2-3-d67b9077c59a@collabora.com Signed-off-by: AngeloGioacchino Del Regno Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/mediatek/mt6359.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/mediatek/mt6359.dtsi b/arch/arm64/boot/dts/mediatek/mt6359.dtsi index 57af3e7899841..779d6dfb55c00 100644 --- a/arch/arm64/boot/dts/mediatek/mt6359.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt6359.dtsi @@ -298,7 +298,7 @@ }; }; - mt6359rtc: mt6359rtc { + mt6359rtc: rtc { compatible = "mediatek,mt6358-rtc"; }; }; -- GitLab From ffbfe7b0ce9b5a773ceafb1051f255a87210c817 Mon Sep 17 00:00:00 2001 From: Joel Stanley Date: Thu, 15 May 2025 16:00:42 +0930 Subject: [PATCH 0969/2211] ARM: aspeed: Don't select SRAM [ Upstream commit e4f59f873c3ffe2a0150e11115a83e2dfb671dbf ] The ASPEED devices have SRAM, but don't require it for basic function (or any function; there's no known users of the driver). Fixes: 8c2ed9bcfbeb ("arm: Add Aspeed machine") Signed-off-by: Joel Stanley Link: https://patch.msgid.link/20250115103942.421429-1-joel@jms.id.au Signed-off-by: Andrew Jeffery Signed-off-by: Arnd Bergmann Signed-off-by: Sasha Levin --- arch/arm/mach-aspeed/Kconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/arm/mach-aspeed/Kconfig b/arch/arm/mach-aspeed/Kconfig index 080019aa6fcd8..fcf287edd0e5e 100644 --- a/arch/arm/mach-aspeed/Kconfig +++ b/arch/arm/mach-aspeed/Kconfig @@ -2,7 +2,6 @@ menuconfig ARCH_ASPEED bool "Aspeed BMC architectures" depends on (CPU_LITTLE_ENDIAN && ARCH_MULTI_V5) || ARCH_MULTI_V6 || ARCH_MULTI_V7 - select SRAM select WATCHDOG select ASPEED_WATCHDOG select MFD_SYSCON -- GitLab From 7ce3063fd85a43396baf9c629eb6a97cd9c5258d Mon Sep 17 00:00:00 2001 From: Su Hui Date: Thu, 15 May 2025 16:00:43 +0930 Subject: [PATCH 0970/2211] soc: aspeed: lpc: Fix impossible judgment condition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit d9f0a97e859bdcef51f9c187b1eb712eb13fd3ff ] smatch error: drivers/soc/aspeed/aspeed-lpc-snoop.c:169 aspeed_lpc_snoop_config_irq() warn: platform_get_irq() does not return zero platform_get_irq() return non-zero IRQ number or negative error code, change '!lpc_snoop->irq' to 'lpc_snoop->irq < 0' to fix this. Fixes: 9f4f9ae81d0a ("drivers/misc: add Aspeed LPC snoop driver") Signed-off-by: Su Hui Reviewed-by: Dan Carpenter Link: https://lore.kernel.org/r/20231027020703.1231875-1-suhui@nfschina.com Signed-off-by: Andrew Jeffery Signed-off-by: Arnd Bergmann Signed-off-by: Sasha Levin --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/aspeed-lpc-snoop.c index 888b5840c0150..f06edc4cc5ea4 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -166,7 +166,7 @@ static int aspeed_lpc_snoop_config_irq(struct aspeed_lpc_snoop *lpc_snoop, int rc; lpc_snoop->irq = platform_get_irq(pdev, 0); - if (!lpc_snoop->irq) + if (lpc_snoop->irq < 0) return -ENODEV; rc = devm_request_irq(dev, lpc_snoop->irq, -- GitLab From f697ef117ecbf3a367dfc559a6a3589905956530 Mon Sep 17 00:00:00 2001 From: Henry Martin Date: Thu, 15 May 2025 16:00:44 +0930 Subject: [PATCH 0971/2211] soc: aspeed: Add NULL check in aspeed_lpc_enable_snoop() [ Upstream commit f1706e0e1a74b095cbc60375b9b1e6205f5f4c98 ] devm_kasprintf() returns NULL when memory allocation fails. Currently, aspeed_lpc_enable_snoop() does not check for this case, which results in a NULL pointer dereference. Add NULL check after devm_kasprintf() to prevent this issue. Fixes: 3772e5da4454 ("drivers/misc: Aspeed LPC snoop output using misc chardev") Signed-off-by: Henry Martin Link: https://patch.msgid.link/20250401074647.21300-1-bsdhenrymartin@gmail.com [arj: Fix Fixes: tag to use subject from 3772e5da4454] Signed-off-by: Andrew Jeffery Signed-off-by: Arnd Bergmann Signed-off-by: Sasha Levin --- drivers/soc/aspeed/aspeed-lpc-snoop.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/aspeed-lpc-snoop.c index f06edc4cc5ea4..d2e63277f0aa9 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -200,11 +200,15 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, lpc_snoop->chan[channel].miscdev.minor = MISC_DYNAMIC_MINOR; lpc_snoop->chan[channel].miscdev.name = devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, channel); + if (!lpc_snoop->chan[channel].miscdev.name) { + rc = -ENOMEM; + goto err_free_fifo; + } lpc_snoop->chan[channel].miscdev.fops = &snoop_fops; lpc_snoop->chan[channel].miscdev.parent = dev; rc = misc_register(&lpc_snoop->chan[channel].miscdev); if (rc) - return rc; + goto err_free_fifo; /* Enable LPC snoop channel at requested port */ switch (channel) { @@ -221,7 +225,8 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, hicrb_en = HICRB_ENSNP1D; break; default: - return -EINVAL; + rc = -EINVAL; + goto err_misc_deregister; } regmap_update_bits(lpc_snoop->regmap, HICR5, hicr5_en, hicr5_en); @@ -231,6 +236,12 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); + return 0; + +err_misc_deregister: + misc_deregister(&lpc_snoop->chan[channel].miscdev); +err_free_fifo: + kfifo_free(&lpc_snoop->chan[channel].fifo); return rc; } -- GitLab From b235393b9f43ff86a38ca2bde6372312ea215dc5 Mon Sep 17 00:00:00 2001 From: Sergey Shtylyov Date: Wed, 14 May 2025 23:35:58 +0300 Subject: [PATCH 0972/2211] fbdev: core: fbcvt: avoid division by 0 in fb_cvt_hperiod() [ Upstream commit 3f6dae09fc8c306eb70fdfef70726e1f154e173a ] In fb_find_mode_cvt(), iff mode->refresh somehow happens to be 0x80000000, cvt.f_refresh will become 0 when multiplying it by 2 due to overflow. It's then passed to fb_cvt_hperiod(), where it's used as a divider -- division by 0 will result in kernel oops. Add a sanity check for cvt.f_refresh to avoid such overflow... Found by Linux Verification Center (linuxtesting.org) with the Svace static analysis tool. Fixes: 96fe6a2109db ("[PATCH] fbdev: Add VESA Coordinated Video Timings (CVT) support") Signed-off-by: Sergey Shtylyov Signed-off-by: Helge Deller Signed-off-by: Sasha Levin --- drivers/video/fbdev/core/fbcvt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/video/fbdev/core/fbcvt.c b/drivers/video/fbdev/core/fbcvt.c index 64843464c6613..cd3821bd82e56 100644 --- a/drivers/video/fbdev/core/fbcvt.c +++ b/drivers/video/fbdev/core/fbcvt.c @@ -312,7 +312,7 @@ int fb_find_mode_cvt(struct fb_videomode *mode, int margins, int rb) cvt.f_refresh = cvt.refresh; cvt.interlace = 1; - if (!cvt.xres || !cvt.yres || !cvt.refresh) { + if (!cvt.xres || !cvt.yres || !cvt.refresh || cvt.f_refresh > INT_MAX) { printk(KERN_INFO "fbcvt: Invalid input parameters\n"); return 1; } -- GitLab From ab6db95940bdadb4b7f26c94e1d9706b1033631f Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Sat, 26 Apr 2025 00:37:52 -0700 Subject: [PATCH 0973/2211] randstruct: gcc-plugin: Remove bogus void member MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit e136a4062174a9a8d1c1447ca040ea81accfa6a8 ] When building the randomized replacement tree of struct members, the randstruct GCC plugin would insert, as the first member, a 0-sized void member. This appears as though it was done to catch non-designated ("unnamed") static initializers, which wouldn't be stable since they depend on the original struct layout order. This was accomplished by having the side-effect of the "void member" tripping an assert in GCC internals (count_type_elements) if the member list ever needed to be counted (e.g. for figuring out the order of members during a non-designated initialization), which would catch impossible type (void) in the struct: security/landlock/fs.c: In function ‘hook_file_ioctl_common’: security/landlock/fs.c:1745:61: internal compiler error: in count_type_elements, at expr.cc:7075 1745 | .u.op = &(struct lsm_ioctlop_audit) { | ^ static HOST_WIDE_INT count_type_elements (const_tree type, bool for_ctor_p) { switch (TREE_CODE (type)) ... case VOID_TYPE: default: gcc_unreachable (); } } However this is a redundant safety measure since randstruct uses the __designated_initializer attribute both internally and within the __randomized_layout attribute macro so that this would be enforced by the compiler directly even when randstruct was not enabled (via -Wdesignated-init). A recent change in Landlock ended up tripping the same member counting routine when using a full-struct copy initializer as part of an anonymous initializer. This, however, is a false positive as the initializer is copying between identical structs (and hence identical layouts). The "path" member is "struct path", a randomized struct, and is being copied to from another "struct path", the "f_path" member: landlock_log_denial(landlock_cred(file->f_cred), &(struct landlock_request) { .type = LANDLOCK_REQUEST_FS_ACCESS, .audit = { .type = LSM_AUDIT_DATA_IOCTL_OP, .u.op = &(struct lsm_ioctlop_audit) { .path = file->f_path, .cmd = cmd, }, }, ... As can be seen with the coming randstruct KUnit test, there appears to be no behavioral problems with this kind of initialization when the void member is removed from the randstruct GCC plugin, so remove it. Reported-by: "Dr. David Alan Gilbert" Closes: https://lore.kernel.org/lkml/Z_PRaKx7q70MKgCA@gallifrey/ Reported-by: Mark Brown Closes: https://lore.kernel.org/lkml/20250407-kbuild-disable-gcc-plugins-v1-1-5d46ae583f5e@kernel.org/ Reported-by: WangYuli Closes: https://lore.kernel.org/lkml/337D5D4887277B27+3c677db3-a8b9-47f0-93a4-7809355f1381@uniontech.com/ Fixes: 313dd1b62921 ("gcc-plugins: Add the randstruct plugin") Signed-off-by: Kees Cook Signed-off-by: Sasha Levin --- scripts/gcc-plugins/randomize_layout_plugin.c | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/scripts/gcc-plugins/randomize_layout_plugin.c b/scripts/gcc-plugins/randomize_layout_plugin.c index 5694df3da2e95..971a1908a8cc4 100644 --- a/scripts/gcc-plugins/randomize_layout_plugin.c +++ b/scripts/gcc-plugins/randomize_layout_plugin.c @@ -344,29 +344,13 @@ static int relayout_struct(tree type) shuffle(type, (tree *)newtree, shuffle_length); - /* - * set up a bogus anonymous struct field designed to error out on unnamed struct initializers - * as gcc provides no other way to detect such code - */ - list = make_node(FIELD_DECL); - TREE_CHAIN(list) = newtree[0]; - TREE_TYPE(list) = void_type_node; - DECL_SIZE(list) = bitsize_zero_node; - DECL_NONADDRESSABLE_P(list) = 1; - DECL_FIELD_BIT_OFFSET(list) = bitsize_zero_node; - DECL_SIZE_UNIT(list) = size_zero_node; - DECL_FIELD_OFFSET(list) = size_zero_node; - DECL_CONTEXT(list) = type; - // to satisfy the constify plugin - TREE_READONLY(list) = 1; - for (i = 0; i < num_fields - 1; i++) TREE_CHAIN(newtree[i]) = newtree[i+1]; TREE_CHAIN(newtree[num_fields - 1]) = NULL_TREE; main_variant = TYPE_MAIN_VARIANT(type); for (variant = main_variant; variant; variant = TYPE_NEXT_VARIANT(variant)) { - TYPE_FIELDS(variant) = list; + TYPE_FIELDS(variant) = newtree[0]; TYPE_ATTRIBUTES(variant) = copy_list(TYPE_ATTRIBUTES(variant)); TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("randomize_performed"), NULL_TREE, TYPE_ATTRIBUTES(variant)); TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("designated_init"), NULL_TREE, TYPE_ATTRIBUTES(variant)); -- GitLab From 5934a8fab358e30307a98fd8fbaeec70768b38d9 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 30 May 2025 15:18:28 -0700 Subject: [PATCH 0974/2211] randstruct: gcc-plugin: Fix attribute addition [ Upstream commit f39f18f3c3531aa802b58a20d39d96e82eb96c14 ] Based on changes in the 2021 public version of the randstruct out-of-tree GCC plugin[1], more carefully update the attributes on resulting decls, to avoid tripping checks in GCC 15's comptypes_check_enum_int() when it has been configured with "--enable-checking=misc": arch/arm64/kernel/kexec_image.c:132:14: internal compiler error: in comptypes_check_enum_int, at c/c-typeck.cc:1519 132 | const struct kexec_file_ops kexec_image_ops = { | ^~~~~~~~~~~~~~ internal_error(char const*, ...), at gcc/gcc/diagnostic-global-context.cc:517 fancy_abort(char const*, int, char const*), at gcc/gcc/diagnostic.cc:1803 comptypes_check_enum_int(tree_node*, tree_node*, bool*), at gcc/gcc/c/c-typeck.cc:1519 ... Link: https://archive.org/download/grsecurity/grsecurity-3.1-5.10.41-202105280954.patch.gz [1] Reported-by: Thiago Jung Bauermann Closes: https://github.com/KSPP/linux/issues/367 Closes: https://lore.kernel.org/lkml/20250530000646.104457-1-thiago.bauermann@linaro.org/ Reported-by: Ingo Saitz Closes: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1104745 Fixes: 313dd1b62921 ("gcc-plugins: Add the randstruct plugin") Tested-by: Thiago Jung Bauermann Link: https://lore.kernel.org/r/20250530221824.work.623-kees@kernel.org Signed-off-by: Kees Cook Signed-off-by: Sasha Levin --- scripts/gcc-plugins/gcc-common.h | 32 +++++++++++++++++++ scripts/gcc-plugins/randomize_layout_plugin.c | 22 ++++++------- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/scripts/gcc-plugins/gcc-common.h b/scripts/gcc-plugins/gcc-common.h index 3222c1070444f..ef12c8f929eda 100644 --- a/scripts/gcc-plugins/gcc-common.h +++ b/scripts/gcc-plugins/gcc-common.h @@ -123,6 +123,38 @@ static inline tree build_const_char_string(int len, const char *str) return cstr; } +static inline void __add_type_attr(tree type, const char *attr, tree args) +{ + tree oldattr; + + if (type == NULL_TREE) + return; + oldattr = lookup_attribute(attr, TYPE_ATTRIBUTES(type)); + if (oldattr != NULL_TREE) { + gcc_assert(TREE_VALUE(oldattr) == args || TREE_VALUE(TREE_VALUE(oldattr)) == TREE_VALUE(args)); + return; + } + + TYPE_ATTRIBUTES(type) = copy_list(TYPE_ATTRIBUTES(type)); + TYPE_ATTRIBUTES(type) = tree_cons(get_identifier(attr), args, TYPE_ATTRIBUTES(type)); +} + +static inline void add_type_attr(tree type, const char *attr, tree args) +{ + tree main_variant = TYPE_MAIN_VARIANT(type); + + __add_type_attr(TYPE_CANONICAL(type), attr, args); + __add_type_attr(TYPE_CANONICAL(main_variant), attr, args); + __add_type_attr(main_variant, attr, args); + + for (type = TYPE_NEXT_VARIANT(main_variant); type; type = TYPE_NEXT_VARIANT(type)) { + if (!lookup_attribute(attr, TYPE_ATTRIBUTES(type))) + TYPE_ATTRIBUTES(type) = TYPE_ATTRIBUTES(main_variant); + + __add_type_attr(TYPE_CANONICAL(type), attr, args); + } +} + #define PASS_INFO(NAME, REF, ID, POS) \ struct register_pass_info NAME##_pass_info = { \ .pass = make_##NAME##_pass(), \ diff --git a/scripts/gcc-plugins/randomize_layout_plugin.c b/scripts/gcc-plugins/randomize_layout_plugin.c index 971a1908a8cc4..ff65a4f87f240 100644 --- a/scripts/gcc-plugins/randomize_layout_plugin.c +++ b/scripts/gcc-plugins/randomize_layout_plugin.c @@ -73,6 +73,9 @@ static tree handle_randomize_layout_attr(tree *node, tree name, tree args, int f if (TYPE_P(*node)) { type = *node; + } else if (TREE_CODE(*node) == FIELD_DECL) { + *no_add_attrs = false; + return NULL_TREE; } else { gcc_assert(TREE_CODE(*node) == TYPE_DECL); type = TREE_TYPE(*node); @@ -348,15 +351,14 @@ static int relayout_struct(tree type) TREE_CHAIN(newtree[i]) = newtree[i+1]; TREE_CHAIN(newtree[num_fields - 1]) = NULL_TREE; + add_type_attr(type, "randomize_performed", NULL_TREE); + add_type_attr(type, "designated_init", NULL_TREE); + if (has_flexarray) + add_type_attr(type, "has_flexarray", NULL_TREE); + main_variant = TYPE_MAIN_VARIANT(type); - for (variant = main_variant; variant; variant = TYPE_NEXT_VARIANT(variant)) { + for (variant = main_variant; variant; variant = TYPE_NEXT_VARIANT(variant)) TYPE_FIELDS(variant) = newtree[0]; - TYPE_ATTRIBUTES(variant) = copy_list(TYPE_ATTRIBUTES(variant)); - TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("randomize_performed"), NULL_TREE, TYPE_ATTRIBUTES(variant)); - TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("designated_init"), NULL_TREE, TYPE_ATTRIBUTES(variant)); - if (has_flexarray) - TYPE_ATTRIBUTES(type) = tree_cons(get_identifier("has_flexarray"), NULL_TREE, TYPE_ATTRIBUTES(type)); - } /* * force a re-layout of the main variant @@ -424,10 +426,8 @@ static void randomize_type(tree type) if (lookup_attribute("randomize_layout", TYPE_ATTRIBUTES(TYPE_MAIN_VARIANT(type))) || is_pure_ops_struct(type)) relayout_struct(type); - for (variant = TYPE_MAIN_VARIANT(type); variant; variant = TYPE_NEXT_VARIANT(variant)) { - TYPE_ATTRIBUTES(type) = copy_list(TYPE_ATTRIBUTES(type)); - TYPE_ATTRIBUTES(type) = tree_cons(get_identifier("randomize_considered"), NULL_TREE, TYPE_ATTRIBUTES(type)); - } + add_type_attr(type, "randomize_considered", NULL_TREE); + #ifdef __DEBUG_PLUGIN fprintf(stderr, "Marking randomize_considered on struct %s\n", ORIG_TYPE_NAME(type)); #ifdef __DEBUG_VERBOSE -- GitLab From a951f9a3d912744f1ac3779e809dc68d2be0908e Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Tue, 8 Apr 2025 11:37:20 -0300 Subject: [PATCH 0975/2211] perf build: Warn when libdebuginfod devel files are not available [ Upstream commit 4fce4b91fd1aabb326c46e237eb4b19ab72598f8 ] While working on 'perf version --build-options' I noticed that: $ perf version --build-options perf version 6.15.rc1.g312a07a00d31 aio: [ on ] # HAVE_AIO_SUPPORT bpf: [ on ] # HAVE_LIBBPF_SUPPORT bpf_skeletons: [ on ] # HAVE_BPF_SKEL debuginfod: [ OFF ] # HAVE_DEBUGINFOD_SUPPORT And looking at tools/perf/Makefile.config I also noticed that it is not opt-in, meaning we will attempt to build with it in all normal cases. So add the usual warning at build time to let the user know that something recommended is missing, now we see: Makefile.config:563: No elfutils/debuginfod.h found, no debuginfo server support, please install elfutils-debuginfod-client-devel or equivalent And after following the recommendation: $ perf check feature debuginfod debuginfod: [ on ] # HAVE_DEBUGINFOD_SUPPORT $ ldd ~/bin/perf | grep debuginfo libdebuginfod.so.1 => /lib64/libdebuginfod.so.1 (0x00007fee5cf5f000) $ With this feature on several perf tools will fetch what is needed and not require all the contents of the debuginfo packages, for instance: # rpm -qa | grep kernel-debuginfo # pahole --running_kernel_vmlinux pahole: couldn't find a vmlinux that matches the running kernel HINT: Maybe you're inside a container or missing a debuginfo package? # # perf trace -e open* perf probe --vars icmp_rcv 0.000 ( 0.005 ms): perf/97391 openat(dfd: CWD, filename: "/etc/ld.so.cache", flags: RDONLY|CLOEXEC) = 3 0.014 ( 0.004 ms): perf/97391 openat(dfd: CWD, filename: "/lib64/libm.so.6", flags: RDONLY|CLOEXEC) = 3 32130.100 ( 0.008 ms): perf/97391 openat(dfd: CWD, filename: "/root/.cache/debuginfod_client/aa3c82b4a13f9c0e0301bebb20fe958c4db6f362/debuginfo") = 3 Available variables at icmp_rcv @ struct sk_buff* skb # # pahole --running_kernel_vmlinux /root/.cache/debuginfod_client/aa3c82b4a13f9c0e0301bebb20fe958c4db6f362/debuginfo # file /root/.cache/debuginfod_client/aa3c82b4a13f9c0e0301bebb20fe958c4db6f362/debuginfo /root/.cache/debuginfod_client/aa3c82b4a13f9c0e0301bebb20fe958c4db6f362/debuginfo: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=aa3c82b4a13f9c0e0301bebb20fe958c4db6f362, with debug_info, not stripped # ls -la /root/.cache/debuginfod_client/aa3c82b4a13f9c0e0301bebb20fe958c4db6f362/debuginfo -r--------. 1 root root 475401512 Mar 27 21:00 /root/.cache/debuginfod_client/aa3c82b4a13f9c0e0301bebb20fe958c4db6f362/debuginfo # Then, cached: # perf stat --null perf probe --vars icmp_rcv Available variables at icmp_rcv @ struct sk_buff* skb Performance counter stats for 'perf probe --vars icmp_rcv': 0.671389041 seconds time elapsed 0.519176000 seconds user 0.150860000 seconds sys Fixes: c7a14fdcb3fa7736 ("perf build-ids: Fall back to debuginfod query if debuginfo not found") Tested-by: Ingo Molnar Cc: Adrian Hunter Cc: Dmitriy Vyukov Cc: Howard Chu Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Frank Ch. Eigler Link: https://lore.kernel.org/r/Z_dkNDj9EPFwPqq1@gmail.com [ Folded patch from Ingo to have the debian/ubuntu devel package added build warning message ] Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/Makefile.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config index b102a4c525e4b..a2034fa183254 100644 --- a/tools/perf/Makefile.config +++ b/tools/perf/Makefile.config @@ -569,6 +569,8 @@ ifndef NO_LIBELF ifeq ($(feature-libdebuginfod), 1) CFLAGS += -DHAVE_DEBUGINFOD_SUPPORT EXTLIBS += -ldebuginfod + else + $(warning No elfutils/debuginfod.h found, no debuginfo server support, please install libdebuginfod-dev/elfutils-debuginfod-client-devel or equivalent) endif endif -- GitLab From baf8a7fed0ea26803398d4b1fd576b2b9a424d13 Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Wed, 9 Apr 2025 21:58:19 -0300 Subject: [PATCH 0976/2211] perf ui browser hists: Set actions->thread before calling do_zoom_thread() [ Upstream commit 1741189d843a1d5ef38538bc52a3760e2e46cb2e ] In 7cecb7fe8388d5c3 ("perf hists: Move sort__has_comm into struct perf_hpp_list") it assumes that act->thread is set prior to calling do_zoom_thread(). This doesn't happen when we use ESC or the Left arrow key to Zoom out of a specific thread, making this operation not to work and we get stuck into the thread zoom. In 6422184b087ff435 ("perf hists browser: Simplify zooming code using pstack_peek()") it says no need to set actions->thread, and at that point that was true, but in 7cecb7fe8388d5c3 a actions->thread == NULL check was added before the zoom out of thread could kick in. We can zoom out using the alternative 't' thread zoom toggle hotkey to finally set actions->thread before calling do_zoom_thread() and zoom out, but lets also fix the ESC/Zoom out of thread case. Fixes: 7cecb7fe8388d5c3 ("perf hists: Move sort__has_comm into struct perf_hpp_list") Reported-by: Ingo Molnar Tested-by: Ingo Molnar Cc: Adrian Hunter Cc: Ian Rogers Cc: James Clark Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/r/Z_TYux5fUg2pW-pF@gmail.com Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/ui/browsers/hists.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index 49ba82bf33918..3283b6313bab8 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c @@ -3267,10 +3267,10 @@ do_hotkey: // key came straight from options ui__popup_menu() /* * No need to set actions->dso here since * it's just to remove the current filter. - * Ditto for thread below. */ do_zoom_dso(browser, actions); } else if (top == &browser->hists->thread_filter) { + actions->thread = thread; do_zoom_thread(browser, actions); } else if (top == &browser->hists->socket_filter) { do_zoom_socket(browser, actions); -- GitLab From 2eeb181e76d4ef43ab884e6a67454003cec81dbb Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 10 Apr 2025 15:49:38 -0400 Subject: [PATCH 0977/2211] dm: don't change md if dm_table_set_restrictions() fails [ Upstream commit 9eb7109a5bfc5b8226e9517e9f3cc6d414391884 ] __bind was changing the disk capacity, geometry and mempools of the mapped device before calling dm_table_set_restrictions() which could fail, forcing dm to drop the new table. Failing here would leave the device using the old table but with the wrong capacity and mempools. Move dm_table_set_restrictions() earlier in __bind(). Since it needs the capacity to be set, save the old version and restore it on failure. Fixes: bb37d77239af2 ("dm: introduce zone append emulation") Reviewed-by: Damien Le Moal Tested-by: Damien Le Moal Signed-off-by: Benjamin Marzinski Signed-off-by: Mikulas Patocka Signed-off-by: Sasha Levin --- drivers/md/dm.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/drivers/md/dm.c b/drivers/md/dm.c index d29125ee9e72a..12d5f414a6788 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -2410,21 +2410,29 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t, struct queue_limits *limits) { struct dm_table *old_map; - sector_t size; + sector_t size, old_size; int ret; lockdep_assert_held(&md->suspend_lock); size = dm_table_get_size(t); + old_size = dm_get_size(md); + set_capacity(md->disk, size); + + ret = dm_table_set_restrictions(t, md->queue, limits); + if (ret) { + set_capacity(md->disk, old_size); + old_map = ERR_PTR(ret); + goto out; + } + /* * Wipe any geometry if the size of the table changed. */ - if (size != dm_get_size(md)) + if (size != old_size) memset(&md->geometry, 0, sizeof(md->geometry)); - set_capacity(md->disk, size); - dm_table_event_callback(t, event_callback, md); if (dm_table_request_based(t)) { @@ -2457,12 +2465,6 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t, t->mempools = NULL; } - ret = dm_table_set_restrictions(t, md->queue, limits); - if (ret) { - old_map = ERR_PTR(ret); - goto out; - } - old_map = rcu_dereference_protected(md->map, lockdep_is_held(&md->suspend_lock)); rcu_assign_pointer(md->map, (void *)t); md->immutable_target_type = dm_table_get_immutable_target_type(t); -- GitLab From 48e0b54be49d25198ca3886ccfa5909eac0ef184 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 10 Apr 2025 15:49:39 -0400 Subject: [PATCH 0978/2211] dm: free table mempools if not used in __bind [ Upstream commit e8819e7f03470c5b468720630d9e4e1d5b99159e ] With request-based dm, the mempools don't need reloading when switching tables, but the unused table mempools are not freed until the active table is finally freed. Free them immediately if they are not needed. Fixes: 29dec90a0f1d9 ("dm: fix bio_set allocation") Reviewed-by: Damien Le Moal Tested-by: Damien Le Moal Signed-off-by: Benjamin Marzinski Signed-off-by: Mikulas Patocka Signed-off-by: Sasha Levin --- drivers/md/dm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 12d5f414a6788..92e5a233f5160 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -2450,10 +2450,10 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t, * requests in the queue may refer to bio from the old bioset, * so you must walk through the queue to unprep. */ - if (!md->mempools) { + if (!md->mempools) md->mempools = t->mempools; - t->mempools = NULL; - } + else + dm_free_md_mempools(t->mempools); } else { /* * The md may already have mempools that need changing. @@ -2462,8 +2462,8 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t, */ dm_free_md_mempools(md->mempools); md->mempools = t->mempools; - t->mempools = NULL; } + t->mempools = NULL; old_map = rcu_dereference_protected(md->map, lockdep_is_held(&md->suspend_lock)); rcu_assign_pointer(md->map, (void *)t); -- GitLab From 1be2000b703b02e149f8f2061054489f6c18c972 Mon Sep 17 00:00:00 2001 From: Henry Martin Date: Tue, 1 Apr 2025 17:16:47 +0800 Subject: [PATCH 0979/2211] backlight: pm8941: Add NULL check in wled_configure() [ Upstream commit e12d3e1624a02706cdd3628bbf5668827214fa33 ] devm_kasprintf() returns NULL when memory allocation fails. Currently, wled_configure() does not check for this case, which results in a NULL pointer dereference. Add NULL check after devm_kasprintf() to prevent this issue. Fixes: f86b77583d88 ("backlight: pm8941: Convert to using %pOFn instead of device_node.name") Signed-off-by: Henry Martin Reviewed-by: Dmitry Baryshkov Reviewed-by: "Daniel Thompson (RISCstar)" Link: https://lore.kernel.org/r/20250401091647.22784-1-bsdhenrymartin@gmail.com Signed-off-by: Lee Jones Signed-off-by: Sasha Levin --- drivers/video/backlight/qcom-wled.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/video/backlight/qcom-wled.c b/drivers/video/backlight/qcom-wled.c index 10129095a4c17..b19e5f73de8bb 100644 --- a/drivers/video/backlight/qcom-wled.c +++ b/drivers/video/backlight/qcom-wled.c @@ -1406,9 +1406,11 @@ static int wled_configure(struct wled *wled) wled->ctrl_addr = be32_to_cpu(*prop_addr); rc = of_property_read_string(dev->of_node, "label", &wled->name); - if (rc) + if (rc) { wled->name = devm_kasprintf(dev, GFP_KERNEL, "%pOFn", dev->of_node); - + if (!wled->name) + return -ENOMEM; + } switch (wled->version) { case 3: u32_opts = wled3_opts; -- GitLab From 2967178d30ee1109979239ff4f2f99f04d77a911 Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Tue, 1 Apr 2025 09:34:40 -0700 Subject: [PATCH 0980/2211] x86/irq: Ensure initial PIR loads are performed exactly once [ Upstream commit 600e9606046ac3b9b7a3f0500d08a179df84c45e ] Ensure the PIR is read exactly once at the start of handle_pending_pir(), to guarantee that checking for an outstanding posted interrupt in a given chuck doesn't reload the chunk from the "real" PIR. Functionally, a reload is benign, but it would defeat the purpose of pre-loading into a copy. Fixes: 1b03d82ba15e ("x86/irq: Install posted MSI notification handler") Reviewed-by: Thomas Gleixner Link: https://lore.kernel.org/r/20250401163447.846608-2-seanjc@google.com Signed-off-by: Sean Christopherson Signed-off-by: Sasha Levin --- arch/x86/kernel/irq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index feca4f20b06aa..85fa2db38dc42 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c @@ -414,7 +414,7 @@ static __always_inline bool handle_pending_pir(u64 *pir, struct pt_regs *regs) bool handled = false; for (i = 0; i < 4; i++) - pir_copy[i] = pir[i]; + pir_copy[i] = READ_ONCE(pir[i]); for (i = 0; i < 4; i++) { if (!pir_copy[i]) -- GitLab From 7a23cc510ecaabab4f6df7e9d910d16e279b72ad Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Wed, 9 Apr 2025 00:39:06 +0300 Subject: [PATCH 0981/2211] mtd: nand: ecc-mxic: Fix use of uninitialized variable ret [ Upstream commit d95846350aac72303036a70c4cdc69ae314aa26d ] If ctx->steps is zero, the loop processing ECC steps is skipped, and the variable ret remains uninitialized. It is later checked and returned, which leads to undefined behavior and may cause unpredictable results in user space or kernel crashes. This scenario can be triggered in edge cases such as misconfigured geometry, ECC engine misuse, or if ctx->steps is not validated after initialization. Initialize ret to zero before the loop to ensure correct and safe behavior regardless of the ctx->steps value. Found by Linux Verification Center (linuxtesting.org) with SVACE. Fixes: 48e6633a9fa2 ("mtd: nand: mxic-ecc: Add Macronix external ECC engine support") Signed-off-by: Mikhail Arkhipov Signed-off-by: Miquel Raynal Signed-off-by: Sasha Levin --- drivers/mtd/nand/ecc-mxic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mtd/nand/ecc-mxic.c b/drivers/mtd/nand/ecc-mxic.c index 47e10945b8d27..63cb206269dd9 100644 --- a/drivers/mtd/nand/ecc-mxic.c +++ b/drivers/mtd/nand/ecc-mxic.c @@ -614,7 +614,7 @@ static int mxic_ecc_finish_io_req_external(struct nand_device *nand, { struct mxic_ecc_engine *mxic = nand_to_mxic(nand); struct mxic_ecc_ctx *ctx = nand_to_ecc_ctx(nand); - int nents, step, ret; + int nents, step, ret = 0; if (req->mode == MTD_OPS_RAW) return 0; -- GitLab From 19bd9cde38dd4ca1771aed7afba623e7f4247c8e Mon Sep 17 00:00:00 2001 From: Alexei Safin Date: Thu, 24 Apr 2025 23:26:54 +0300 Subject: [PATCH 0982/2211] hwmon: (asus-ec-sensors) check sensor index in read_string() [ Upstream commit 25be318324563c63cbd9cb53186203a08d2f83a1 ] Prevent a potential invalid memory access when the requested sensor is not found. find_ec_sensor_index() may return a negative value (e.g. -ENOENT), but its result was used without checking, which could lead to undefined behavior when passed to get_sensor_info(). Add a proper check to return -EINVAL if sensor_index is negative. Found by Linux Verification Center (linuxtesting.org) with SVACE. Fixes: d0ddfd241e57 ("hwmon: (asus-ec-sensors) add driver for ASUS EC") Signed-off-by: Alexei Safin Link: https://lore.kernel.org/r/20250424202654.5902-1-a.safin@rosa.ru [groeck: Return error code returned from find_ec_sensor_index] Signed-off-by: Guenter Roeck Signed-off-by: Sasha Levin --- drivers/hwmon/asus-ec-sensors.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/hwmon/asus-ec-sensors.c b/drivers/hwmon/asus-ec-sensors.c index 9555366aeaf0d..fdc157c7394d9 100644 --- a/drivers/hwmon/asus-ec-sensors.c +++ b/drivers/hwmon/asus-ec-sensors.c @@ -910,6 +910,10 @@ static int asus_ec_hwmon_read_string(struct device *dev, { struct ec_sensors_data *state = dev_get_drvdata(dev); int sensor_index = find_ec_sensor_index(state, type, channel); + + if (sensor_index < 0) + return sensor_index; + *str = get_sensor_info(state, sensor_index)->label; return 0; -- GitLab From dc16583d21c4d7c9811327781fa935654547f117 Mon Sep 17 00:00:00 2001 From: Ian Rogers Date: Thu, 1 May 2025 00:00:03 -0700 Subject: [PATCH 0983/2211] perf symbol-minimal: Fix double free in filename__read_build_id [ Upstream commit fa9c4977fbfbca182f9e410d57b3f98356a9d917 ] Running the "perf script task-analyzer tests" with address sanitizer showed a double free: ``` FAIL: "test_csv_extended_times" Error message: "Failed to find required string:'Out-Out;'." ================================================================= ==19190==ERROR: AddressSanitizer: attempting double-free on 0x50b000017b10 in thread T0: #0 0x55da9601c78a in free (perf+0x26078a) (BuildId: e7ef50e08970f017a96fde6101c5e2491acc674a) #1 0x55da96640c63 in filename__read_build_id tools/perf/util/symbol-minimal.c:221:2 0x50b000017b10 is located 0 bytes inside of 112-byte region [0x50b000017b10,0x50b000017b80) freed by thread T0 here: #0 0x55da9601ce40 in realloc (perf+0x260e40) (BuildId: e7ef50e08970f017a96fde6101c5e2491acc674a) #1 0x55da96640ad6 in filename__read_build_id tools/perf/util/symbol-minimal.c:204:10 previously allocated by thread T0 here: #0 0x55da9601ca23 in malloc (perf+0x260a23) (BuildId: e7ef50e08970f017a96fde6101c5e2491acc674a) #1 0x55da966407e7 in filename__read_build_id tools/perf/util/symbol-minimal.c:181:9 SUMMARY: AddressSanitizer: double-free (perf+0x26078a) (BuildId: e7ef50e08970f017a96fde6101c5e2491acc674a) in free ==19190==ABORTING FAIL: "invocation of perf script report task-analyzer --csv-summary csvsummary --summary-extended command failed" Error message: "" FAIL: "test_csvsummary_extended" Error message: "Failed to find required string:'Out-Out;'." ---- end(-1) ---- 132: perf script task-analyzer tests : FAILED! ``` The buf_size if always set to phdr->p_filesz, but that may be 0 causing a free and realloc to return NULL. This is treated in filename__read_build_id like a failure and the buffer is freed again. To avoid this problem only grow buf, meaning the buf_size will never be 0. This also reduces the number of memory (re)allocations. Fixes: b691f64360ecec49 ("perf symbols: Implement poor man's ELF parser") Signed-off-by: Ian Rogers Acked-by: Namhyung Kim Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Ingo Molnar Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/r/20250501070003.22251-1-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/util/symbol-minimal.c | 34 +++++++++++++++++--------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/tools/perf/util/symbol-minimal.c b/tools/perf/util/symbol-minimal.c index c6f369b5d893f..d8da3da01fe6b 100644 --- a/tools/perf/util/symbol-minimal.c +++ b/tools/perf/util/symbol-minimal.c @@ -147,18 +147,19 @@ int filename__read_build_id(const char *filename, struct build_id *bid) if (phdr->p_type != PT_NOTE) continue; - buf_size = phdr->p_filesz; offset = phdr->p_offset; - tmp = realloc(buf, buf_size); - if (tmp == NULL) - goto out_free; - - buf = tmp; + if (phdr->p_filesz > buf_size) { + buf_size = phdr->p_filesz; + tmp = realloc(buf, buf_size); + if (tmp == NULL) + goto out_free; + buf = tmp; + } fseek(fp, offset, SEEK_SET); - if (fread(buf, buf_size, 1, fp) != 1) + if (fread(buf, phdr->p_filesz, 1, fp) != 1) goto out_free; - ret = read_build_id(buf, buf_size, bid, need_swap); + ret = read_build_id(buf, phdr->p_filesz, bid, need_swap); if (ret == 0) { ret = bid->size; break; @@ -199,18 +200,19 @@ int filename__read_build_id(const char *filename, struct build_id *bid) if (phdr->p_type != PT_NOTE) continue; - buf_size = phdr->p_filesz; offset = phdr->p_offset; - tmp = realloc(buf, buf_size); - if (tmp == NULL) - goto out_free; - - buf = tmp; + if (phdr->p_filesz > buf_size) { + buf_size = phdr->p_filesz; + tmp = realloc(buf, buf_size); + if (tmp == NULL) + goto out_free; + buf = tmp; + } fseek(fp, offset, SEEK_SET); - if (fread(buf, buf_size, 1, fp) != 1) + if (fread(buf, phdr->p_filesz, 1, fp) != 1) goto out_free; - ret = read_build_id(buf, buf_size, bid, need_swap); + ret = read_build_id(buf, phdr->p_filesz, bid, need_swap); if (ret == 0) { ret = bid->size; break; -- GitLab From f9c1bdf24615303d48a2d0fd629c88f3189563aa Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 10 Apr 2025 15:49:41 -0400 Subject: [PATCH 0984/2211] dm: fix dm_blk_report_zones [ Upstream commit 37f53a2c60d03743e0eacf7a0c01c279776fef4e ] If dm_get_live_table() returned NULL, dm_put_live_table() was never called. Also, it is possible that md->zone_revalidate_map will change while calling this function. Only read it once, so that we are always using the same value. Otherwise we might miss a call to dm_put_live_table(). Finally, while md->zone_revalidate_map is set and a process is calling blk_revalidate_disk_zones() to set up the zone append emulation resources, it is possible that another process, perhaps triggered by blkdev_report_zones_ioctl(), will call dm_blk_report_zones(). If blk_revalidate_disk_zones() fails, these resources can be freed while the other process is still using them, causing a use-after-free error. blk_revalidate_disk_zones() will only ever be called when initially setting up the zone append emulation resources, such as when setting up a zoned dm-crypt table for the first time. Further table swaps will not set md->zone_revalidate_map or call blk_revalidate_disk_zones(). However it must be called using the new table (referenced by md->zone_revalidate_map) and the new queue limits while the DM device is suspended. dm_blk_report_zones() needs some way to distinguish between a call from blk_revalidate_disk_zones(), which must be allowed to use md->zone_revalidate_map to access this not yet activated table, and all other calls to dm_blk_report_zones(), which should not be allowed while the device is suspended and cannot use md->zone_revalidate_map, since the zone resources might be freed by the process currently calling blk_revalidate_disk_zones(). Solve this by tracking the process that sets md->zone_revalidate_map in dm_revalidate_zones() and only allowing that process to make use of it in dm_blk_report_zones(). Fixes: f211268ed1f9b ("dm: Use the block layer zone append emulation") Reviewed-by: Damien Le Moal Tested-by: Damien Le Moal Signed-off-by: Benjamin Marzinski Signed-off-by: Mikulas Patocka Signed-off-by: Sasha Levin --- drivers/md/dm-core.h | 1 + drivers/md/dm-zone.c | 25 +++++++++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/md/dm-core.h b/drivers/md/dm-core.h index 3637761f35853..f3a3f2ef63226 100644 --- a/drivers/md/dm-core.h +++ b/drivers/md/dm-core.h @@ -141,6 +141,7 @@ struct mapped_device { #ifdef CONFIG_BLK_DEV_ZONED unsigned int nr_zones; void *zone_revalidate_map; + struct task_struct *revalidate_map_task; #endif #ifdef CONFIG_IMA diff --git a/drivers/md/dm-zone.c b/drivers/md/dm-zone.c index c0d41c36e06eb..04cc36a9d5ca4 100644 --- a/drivers/md/dm-zone.c +++ b/drivers/md/dm-zone.c @@ -56,24 +56,31 @@ int dm_blk_report_zones(struct gendisk *disk, sector_t sector, { struct mapped_device *md = disk->private_data; struct dm_table *map; - int srcu_idx, ret; + struct dm_table *zone_revalidate_map = md->zone_revalidate_map; + int srcu_idx, ret = -EIO; + bool put_table = false; - if (!md->zone_revalidate_map) { - /* Regular user context */ + if (!zone_revalidate_map || md->revalidate_map_task != current) { + /* + * Regular user context or + * Zone revalidation during __bind() is in progress, but this + * call is from a different process + */ if (dm_suspended_md(md)) return -EAGAIN; map = dm_get_live_table(md, &srcu_idx); - if (!map) - return -EIO; + put_table = true; } else { /* Zone revalidation during __bind() */ - map = md->zone_revalidate_map; + map = zone_revalidate_map; } - ret = dm_blk_do_report_zones(md, map, sector, nr_zones, cb, data); + if (map) + ret = dm_blk_do_report_zones(md, map, sector, nr_zones, cb, + data); - if (!md->zone_revalidate_map) + if (put_table) dm_put_live_table(md, srcu_idx); return ret; @@ -175,7 +182,9 @@ int dm_revalidate_zones(struct dm_table *t, struct request_queue *q) * our table for dm_blk_report_zones() to use directly. */ md->zone_revalidate_map = t; + md->revalidate_map_task = current; ret = blk_revalidate_disk_zones(disk); + md->revalidate_map_task = NULL; md->zone_revalidate_map = NULL; if (ret) { -- GitLab From 9091c9e039e822fbb1067493caba04496c7b4197 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Tue, 22 Apr 2025 19:47:36 -0400 Subject: [PATCH 0985/2211] dm-flakey: error all IOs when num_features is absent [ Upstream commit 40ed054f39bc99eac09871c33198e501f4acdf24 ] dm-flakey would error all IOs if num_features was 0, but if it was absent, dm-flakey would never error any IO. Fix this so that no num_features works the same as num_features set to 0. Fixes: aa7d7bc99fed7 ("dm flakey: add an "error_reads" option") Reported-by: Kent Overstreet Signed-off-by: Benjamin Marzinski Signed-off-by: Mikulas Patocka Signed-off-by: Sasha Levin --- drivers/md/dm-flakey.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c index b690905ab89ff..806a80dd3bd9b 100644 --- a/drivers/md/dm-flakey.c +++ b/drivers/md/dm-flakey.c @@ -53,8 +53,8 @@ struct per_bio_data { static int parse_features(struct dm_arg_set *as, struct flakey_c *fc, struct dm_target *ti) { - int r; - unsigned int argc; + int r = 0; + unsigned int argc = 0; const char *arg_name; static const struct dm_arg _args[] = { @@ -65,14 +65,13 @@ static int parse_features(struct dm_arg_set *as, struct flakey_c *fc, {0, PROBABILITY_BASE, "Invalid random corrupt argument"}, }; - /* No feature arguments supplied. */ - if (!as->argc) - return 0; - - r = dm_read_arg_group(_args, as, &argc, &ti->error); - if (r) + if (as->argc && (r = dm_read_arg_group(_args, as, &argc, &ti->error))) return r; + /* No feature arguments supplied. */ + if (!argc) + goto error_all_io; + while (argc) { arg_name = dm_shift_arg(as); argc--; @@ -217,6 +216,7 @@ static int parse_features(struct dm_arg_set *as, struct flakey_c *fc, if (!fc->corrupt_bio_byte && !test_bit(ERROR_READS, &fc->flags) && !test_bit(DROP_WRITES, &fc->flags) && !test_bit(ERROR_WRITES, &fc->flags) && !fc->random_read_corrupt && !fc->random_write_corrupt) { +error_all_io: set_bit(ERROR_WRITES, &fc->flags); set_bit(ERROR_READS, &fc->flags); } -- GitLab From f481bf3e024ea63ef58fb9b39d0360ec150f231a Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Tue, 22 Apr 2025 19:47:38 -0400 Subject: [PATCH 0986/2211] dm-flakey: make corrupting read bios work [ Upstream commit 13e79076c89f6e96a6cca8f6df38b40d025907b4 ] dm-flakey corrupts the read bios in the endio function. However, the corrupt_bio_* functions checked bio_has_data() to see if there was data to corrupt. Since this was the endio function, there was no data left to complete, so bio_has_data() was always false. Fix this by saving a copy of the bio's bi_iter in flakey_map(), and using this to initialize the iter for corrupting the read bios. This patch also skips cloning the bio for write bios with no data. Reported-by: Kent Overstreet Fixes: a3998799fb4df ("dm flakey: add corrupt_bio_byte feature") Signed-off-by: Benjamin Marzinski Signed-off-by: Mikulas Patocka Signed-off-by: Sasha Levin --- drivers/md/dm-flakey.c | 54 ++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c index 806a80dd3bd9b..347881f323d5b 100644 --- a/drivers/md/dm-flakey.c +++ b/drivers/md/dm-flakey.c @@ -47,7 +47,8 @@ enum feature_flag_bits { }; struct per_bio_data { - bool bio_submitted; + bool bio_can_corrupt; + struct bvec_iter saved_iter; }; static int parse_features(struct dm_arg_set *as, struct flakey_c *fc, @@ -339,7 +340,8 @@ static void flakey_map_bio(struct dm_target *ti, struct bio *bio) } static void corrupt_bio_common(struct bio *bio, unsigned int corrupt_bio_byte, - unsigned char corrupt_bio_value) + unsigned char corrupt_bio_value, + struct bvec_iter start) { struct bvec_iter iter; struct bio_vec bvec; @@ -348,7 +350,7 @@ static void corrupt_bio_common(struct bio *bio, unsigned int corrupt_bio_byte, * Overwrite the Nth byte of the bio's data, on whichever page * it falls. */ - bio_for_each_segment(bvec, bio, iter) { + __bio_for_each_segment(bvec, bio, iter, start) { if (bio_iter_len(bio, iter) > corrupt_bio_byte) { unsigned char *segment = bvec_kmap_local(&bvec); segment[corrupt_bio_byte] = corrupt_bio_value; @@ -357,36 +359,31 @@ static void corrupt_bio_common(struct bio *bio, unsigned int corrupt_bio_byte, "(rw=%c bi_opf=%u bi_sector=%llu size=%u)\n", bio, corrupt_bio_value, corrupt_bio_byte, (bio_data_dir(bio) == WRITE) ? 'w' : 'r', bio->bi_opf, - (unsigned long long)bio->bi_iter.bi_sector, - bio->bi_iter.bi_size); + (unsigned long long)start.bi_sector, + start.bi_size); break; } corrupt_bio_byte -= bio_iter_len(bio, iter); } } -static void corrupt_bio_data(struct bio *bio, struct flakey_c *fc) +static void corrupt_bio_data(struct bio *bio, struct flakey_c *fc, + struct bvec_iter start) { unsigned int corrupt_bio_byte = fc->corrupt_bio_byte - 1; - if (!bio_has_data(bio)) - return; - - corrupt_bio_common(bio, corrupt_bio_byte, fc->corrupt_bio_value); + corrupt_bio_common(bio, corrupt_bio_byte, fc->corrupt_bio_value, start); } -static void corrupt_bio_random(struct bio *bio) +static void corrupt_bio_random(struct bio *bio, struct bvec_iter start) { unsigned int corrupt_byte; unsigned char corrupt_value; - if (!bio_has_data(bio)) - return; - - corrupt_byte = get_random_u32() % bio->bi_iter.bi_size; + corrupt_byte = get_random_u32() % start.bi_size; corrupt_value = get_random_u8(); - corrupt_bio_common(bio, corrupt_byte, corrupt_value); + corrupt_bio_common(bio, corrupt_byte, corrupt_value, start); } static void clone_free(struct bio *clone) @@ -481,7 +478,7 @@ static int flakey_map(struct dm_target *ti, struct bio *bio) unsigned int elapsed; struct per_bio_data *pb = dm_per_bio_data(bio, sizeof(struct per_bio_data)); - pb->bio_submitted = false; + pb->bio_can_corrupt = false; if (op_is_zone_mgmt(bio_op(bio))) goto map_bio; @@ -490,10 +487,11 @@ static int flakey_map(struct dm_target *ti, struct bio *bio) elapsed = (jiffies - fc->start_time) / HZ; if (elapsed % (fc->up_interval + fc->down_interval) >= fc->up_interval) { bool corrupt_fixed, corrupt_random; - /* - * Flag this bio as submitted while down. - */ - pb->bio_submitted = true; + + if (bio_has_data(bio)) { + pb->bio_can_corrupt = true; + pb->saved_iter = bio->bi_iter; + } /* * Error reads if neither corrupt_bio_byte or drop_writes or error_writes are set. @@ -516,6 +514,8 @@ static int flakey_map(struct dm_target *ti, struct bio *bio) return DM_MAPIO_SUBMITTED; } + if (!pb->bio_can_corrupt) + goto map_bio; /* * Corrupt matching writes. */ @@ -535,9 +535,11 @@ static int flakey_map(struct dm_target *ti, struct bio *bio) struct bio *clone = clone_bio(ti, fc, bio); if (clone) { if (corrupt_fixed) - corrupt_bio_data(clone, fc); + corrupt_bio_data(clone, fc, + clone->bi_iter); if (corrupt_random) - corrupt_bio_random(clone); + corrupt_bio_random(clone, + clone->bi_iter); submit_bio(clone); return DM_MAPIO_SUBMITTED; } @@ -559,21 +561,21 @@ static int flakey_end_io(struct dm_target *ti, struct bio *bio, if (op_is_zone_mgmt(bio_op(bio))) return DM_ENDIO_DONE; - if (!*error && pb->bio_submitted && (bio_data_dir(bio) == READ)) { + if (!*error && pb->bio_can_corrupt && (bio_data_dir(bio) == READ)) { if (fc->corrupt_bio_byte) { if ((fc->corrupt_bio_rw == READ) && all_corrupt_bio_flags_match(bio, fc)) { /* * Corrupt successful matching READs while in down state. */ - corrupt_bio_data(bio, fc); + corrupt_bio_data(bio, fc, pb->saved_iter); } } if (fc->random_read_corrupt) { u64 rnd = get_random_u64(); u32 rem = do_div(rnd, PROBABILITY_BASE); if (rem < fc->random_read_corrupt) - corrupt_bio_random(bio); + corrupt_bio_random(bio, pb->saved_iter); } if (test_bit(ERROR_READS, &fc->flags)) { /* -- GitLab From 47eee86e45b0e7fc942788700dd6b68183e650d8 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Wed, 2 Apr 2025 22:42:13 -0700 Subject: [PATCH 0987/2211] perf trace: Fix leaks of 'struct thread' in set_filter_loop_pids() [ Upstream commit 30d20fb1f84ad5c92706fe2c6cbb2d4cc293e671 ] I've found some leaks from 'perf trace -a'. It seems there are more leaks but this is what I can find for now. Fixes: 082ab9a18e532864 ("perf trace: Filter out 'sshd' in the tracer ancestry in syswide tracing") Reviewed-by: Howard Chu Signed-off-by: Namhyung Kim Cc: Adrian Hunter Cc: Ian Rogers Cc: Ingo Molnar Cc: Jiri Olsa Cc: Kan Liang Cc: Peter Zijlstra Link: https://lore.kernel.org/r/20250403054213.7021-1-namhyung@kernel.org [ split from a larget patch ] Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/builtin-trace.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index ecd26e058baf6..ee82e858ab200 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -3986,10 +3986,13 @@ static int trace__set_filter_loop_pids(struct trace *trace) if (!strcmp(thread__comm_str(parent), "sshd") || strstarts(thread__comm_str(parent), "gnome-terminal")) { pids[nr++] = thread__tid(parent); + thread__put(parent); break; } + thread__put(thread); thread = parent; } + thread__put(thread); err = evlist__append_tp_filter_pids(trace->evlist, nr, pids); if (!err && trace->filter_pids.map) -- GitLab From 5c37bd26509e510ec21444d839a44313f8253655 Mon Sep 17 00:00:00 2001 From: Michael Petlan Date: Mon, 13 Jan 2025 19:26:00 +0100 Subject: [PATCH 0988/2211] perf tests: Fix 'perf report' tests installation [ Upstream commit 4bfe27140edf8dd1322326c79f5ae8d29ff7e43d ] There was a copy-paste mistake in the installation commands. Also, we need to install stderr-whitelist.txt file, which contains allowed messages that are printed on stderr and should not cause test fail. Fixes: 097fe67df1aa9cc7 ("perf testsuite: Install perf-report tests in the 'make install-tests -C tools/perf' target") Signed-off-by: Michael Petlan Cc: Ian Rogers Cc: Namhyung Kim Link: https://lore.kernel.org/r/20250113182605.130719-6-vmolnaro@redhat.com Signed-off-by: Veronika Molnarova Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/Makefile.perf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index 8ee59ecb14110..b61c355fbdeed 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf @@ -1143,7 +1143,8 @@ install-tests: all install-gtk $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/base_probe'; \ $(INSTALL) tests/shell/base_probe/*.sh '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/base_probe'; \ $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/base_report'; \ - $(INSTALL) tests/shell/base_probe/*.sh '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/base_report'; \ + $(INSTALL) tests/shell/base_report/*.sh '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/base_report'; \ + $(INSTALL) tests/shell/base_report/*.txt '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/base_report'; \ $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/coresight' ; \ $(INSTALL) tests/shell/coresight/*.sh '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/coresight' $(Q)$(MAKE) -C tests/shell/coresight install-tests -- GitLab From 3b7d37c49f150b999489237359d32d0f04c1946d Mon Sep 17 00:00:00 2001 From: Adrian Hunter Date: Mon, 12 May 2025 12:39:30 +0300 Subject: [PATCH 0989/2211] perf intel-pt: Fix PEBS-via-PT data_src [ Upstream commit e00eac6b5b6d956f38d8880c44bf7fd9954063c3 ] The Fixes commit did not add support for decoding PEBS-via-PT data_src. Fix by adding support. PEBS-via-PT is a feature of some E-core processors, starting with processors based on Tremont microarchitecture. Because the kernel only supports Intel PT features that are on all processors, there is no support for PEBS-via-PT on hybrids. Currently that leaves processors based on Tremont, Gracemont and Crestmont, however there are no events on Tremont that produce data_src information, and for Gracemont and Crestmont there are only: mem-loads event=0xd0,umask=0x5,ldlat=3 mem-stores event=0xd0,umask=0x6 Affected processors include Alder Lake N (Gracemont), Sierra Forest (Crestmont) and Grand Ridge (Crestmont). Example: # perf record -d -e intel_pt/branch=0/ -e mem-loads/aux-output/pp uname Before: # perf.before script --itrace=o -Fdata_src 0 |OP No|LVL N/A|SNP N/A|TLB N/A|LCK No|BLK N/A 0 |OP No|LVL N/A|SNP N/A|TLB N/A|LCK No|BLK N/A After: # perf script --itrace=o -Fdata_src 10268100142 |OP LOAD|LVL L1 hit|SNP None|TLB L1 or L2 hit|LCK No|BLK N/A 10450100442 |OP LOAD|LVL L2 hit|SNP None|TLB L2 miss|LCK No|BLK N/A Fixes: 975846eddf907297 ("perf intel-pt: Add memory information to synthesized PEBS sample") Reviewed-by: Kan Liang Signed-off-by: Adrian Hunter Cc: Alexander Shishkin Cc: Ian Rogers Cc: Jiri Olsa Cc: Namhyung Kim Link: https://lore.kernel.org/r/20250512093932.79854-2-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/util/intel-pt.c | 205 ++++++++++++++++++++++++++++++++++++- 1 file changed, 202 insertions(+), 3 deletions(-) diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c index fd2597613f3dc..61f10578e1212 100644 --- a/tools/perf/util/intel-pt.c +++ b/tools/perf/util/intel-pt.c @@ -127,6 +127,7 @@ struct intel_pt { bool single_pebs; bool sample_pebs; + int pebs_data_src_fmt; struct evsel *pebs_evsel; u64 evt_sample_type; @@ -175,6 +176,7 @@ enum switch_state { struct intel_pt_pebs_event { struct evsel *evsel; u64 id; + int data_src_fmt; }; struct intel_pt_queue { @@ -2232,7 +2234,146 @@ static void intel_pt_add_lbrs(struct branch_stack *br_stack, } } -static int intel_pt_do_synth_pebs_sample(struct intel_pt_queue *ptq, struct evsel *evsel, u64 id) +#define P(a, b) PERF_MEM_S(a, b) +#define OP_LH (P(OP, LOAD) | P(LVL, HIT)) +#define LEVEL(x) P(LVLNUM, x) +#define REM P(REMOTE, REMOTE) +#define SNOOP_NONE_MISS (P(SNOOP, NONE) | P(SNOOP, MISS)) + +#define PERF_PEBS_DATA_SOURCE_GRT_MAX 0x10 +#define PERF_PEBS_DATA_SOURCE_GRT_MASK (PERF_PEBS_DATA_SOURCE_GRT_MAX - 1) + +/* Based on kernel __intel_pmu_pebs_data_source_grt() and pebs_data_source */ +static const u64 pebs_data_source_grt[PERF_PEBS_DATA_SOURCE_GRT_MAX] = { + P(OP, LOAD) | P(LVL, MISS) | LEVEL(L3) | P(SNOOP, NA), /* L3 miss|SNP N/A */ + OP_LH | P(LVL, L1) | LEVEL(L1) | P(SNOOP, NONE), /* L1 hit|SNP None */ + OP_LH | P(LVL, LFB) | LEVEL(LFB) | P(SNOOP, NONE), /* LFB/MAB hit|SNP None */ + OP_LH | P(LVL, L2) | LEVEL(L2) | P(SNOOP, NONE), /* L2 hit|SNP None */ + OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, NONE), /* L3 hit|SNP None */ + OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, HIT), /* L3 hit|SNP Hit */ + OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, HITM), /* L3 hit|SNP HitM */ + OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, HITM), /* L3 hit|SNP HitM */ + OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOPX, FWD), /* L3 hit|SNP Fwd */ + OP_LH | P(LVL, REM_CCE1) | REM | LEVEL(L3) | P(SNOOP, HITM), /* Remote L3 hit|SNP HitM */ + OP_LH | P(LVL, LOC_RAM) | LEVEL(RAM) | P(SNOOP, HIT), /* RAM hit|SNP Hit */ + OP_LH | P(LVL, REM_RAM1) | REM | LEVEL(L3) | P(SNOOP, HIT), /* Remote L3 hit|SNP Hit */ + OP_LH | P(LVL, LOC_RAM) | LEVEL(RAM) | SNOOP_NONE_MISS, /* RAM hit|SNP None or Miss */ + OP_LH | P(LVL, REM_RAM1) | LEVEL(RAM) | REM | SNOOP_NONE_MISS, /* Remote RAM hit|SNP None or Miss */ + OP_LH | P(LVL, IO) | LEVEL(NA) | P(SNOOP, NONE), /* I/O hit|SNP None */ + OP_LH | P(LVL, UNC) | LEVEL(NA) | P(SNOOP, NONE), /* Uncached hit|SNP None */ +}; + +/* Based on kernel __intel_pmu_pebs_data_source_cmt() and pebs_data_source */ +static const u64 pebs_data_source_cmt[PERF_PEBS_DATA_SOURCE_GRT_MAX] = { + P(OP, LOAD) | P(LVL, MISS) | LEVEL(L3) | P(SNOOP, NA), /* L3 miss|SNP N/A */ + OP_LH | P(LVL, L1) | LEVEL(L1) | P(SNOOP, NONE), /* L1 hit|SNP None */ + OP_LH | P(LVL, LFB) | LEVEL(LFB) | P(SNOOP, NONE), /* LFB/MAB hit|SNP None */ + OP_LH | P(LVL, L2) | LEVEL(L2) | P(SNOOP, NONE), /* L2 hit|SNP None */ + OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, NONE), /* L3 hit|SNP None */ + OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, MISS), /* L3 hit|SNP Hit */ + OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, HIT), /* L3 hit|SNP HitM */ + OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOPX, FWD), /* L3 hit|SNP HitM */ + OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, HITM), /* L3 hit|SNP Fwd */ + OP_LH | P(LVL, REM_CCE1) | REM | LEVEL(L3) | P(SNOOP, HITM), /* Remote L3 hit|SNP HitM */ + OP_LH | P(LVL, LOC_RAM) | LEVEL(RAM) | P(SNOOP, NONE), /* RAM hit|SNP Hit */ + OP_LH | LEVEL(RAM) | REM | P(SNOOP, NONE), /* Remote L3 hit|SNP Hit */ + OP_LH | LEVEL(RAM) | REM | P(SNOOPX, FWD), /* RAM hit|SNP None or Miss */ + OP_LH | LEVEL(RAM) | REM | P(SNOOP, HITM), /* Remote RAM hit|SNP None or Miss */ + OP_LH | P(LVL, IO) | LEVEL(NA) | P(SNOOP, NONE), /* I/O hit|SNP None */ + OP_LH | P(LVL, UNC) | LEVEL(NA) | P(SNOOP, NONE), /* Uncached hit|SNP None */ +}; + +/* Based on kernel pebs_set_tlb_lock() */ +static inline void pebs_set_tlb_lock(u64 *val, bool tlb, bool lock) +{ + /* + * TLB access + * 0 = did not miss 2nd level TLB + * 1 = missed 2nd level TLB + */ + if (tlb) + *val |= P(TLB, MISS) | P(TLB, L2); + else + *val |= P(TLB, HIT) | P(TLB, L1) | P(TLB, L2); + + /* locked prefix */ + if (lock) + *val |= P(LOCK, LOCKED); +} + +/* Based on kernel __grt_latency_data() */ +static u64 intel_pt_grt_latency_data(u8 dse, bool tlb, bool lock, bool blk, + const u64 *pebs_data_source) +{ + u64 val; + + dse &= PERF_PEBS_DATA_SOURCE_GRT_MASK; + val = pebs_data_source[dse]; + + pebs_set_tlb_lock(&val, tlb, lock); + + if (blk) + val |= P(BLK, DATA); + else + val |= P(BLK, NA); + + return val; +} + +/* Default value for data source */ +#define PERF_MEM_NA (PERF_MEM_S(OP, NA) |\ + PERF_MEM_S(LVL, NA) |\ + PERF_MEM_S(SNOOP, NA) |\ + PERF_MEM_S(LOCK, NA) |\ + PERF_MEM_S(TLB, NA) |\ + PERF_MEM_S(LVLNUM, NA)) + +enum DATA_SRC_FORMAT { + DATA_SRC_FORMAT_ERR = -1, + DATA_SRC_FORMAT_NA = 0, + DATA_SRC_FORMAT_GRT = 1, + DATA_SRC_FORMAT_CMT = 2, +}; + +/* Based on kernel grt_latency_data() and cmt_latency_data */ +static u64 intel_pt_get_data_src(u64 mem_aux_info, int data_src_fmt) +{ + switch (data_src_fmt) { + case DATA_SRC_FORMAT_GRT: { + union { + u64 val; + struct { + unsigned int dse:4; + unsigned int locked:1; + unsigned int stlb_miss:1; + unsigned int fwd_blk:1; + unsigned int reserved:25; + }; + } x = {.val = mem_aux_info}; + return intel_pt_grt_latency_data(x.dse, x.stlb_miss, x.locked, x.fwd_blk, + pebs_data_source_grt); + } + case DATA_SRC_FORMAT_CMT: { + union { + u64 val; + struct { + unsigned int dse:5; + unsigned int locked:1; + unsigned int stlb_miss:1; + unsigned int fwd_blk:1; + unsigned int reserved:24; + }; + } x = {.val = mem_aux_info}; + return intel_pt_grt_latency_data(x.dse, x.stlb_miss, x.locked, x.fwd_blk, + pebs_data_source_cmt); + } + default: + return PERF_MEM_NA; + } +} + +static int intel_pt_do_synth_pebs_sample(struct intel_pt_queue *ptq, struct evsel *evsel, + u64 id, int data_src_fmt) { const struct intel_pt_blk_items *items = &ptq->state->items; struct perf_sample sample = { .ip = 0, }; @@ -2350,6 +2491,18 @@ static int intel_pt_do_synth_pebs_sample(struct intel_pt_queue *ptq, struct evse } } + if (sample_type & PERF_SAMPLE_DATA_SRC) { + if (items->has_mem_aux_info && data_src_fmt) { + if (data_src_fmt < 0) { + pr_err("Intel PT missing data_src info\n"); + return -1; + } + sample.data_src = intel_pt_get_data_src(items->mem_aux_info, data_src_fmt); + } else { + sample.data_src = PERF_MEM_NA; + } + } + if (sample_type & PERF_SAMPLE_TRANSACTION && items->has_tsx_aux_info) { u64 ax = items->has_rax ? items->rax : 0; /* Refer kernel's intel_hsw_transaction() */ @@ -2368,9 +2521,10 @@ static int intel_pt_synth_single_pebs_sample(struct intel_pt_queue *ptq) { struct intel_pt *pt = ptq->pt; struct evsel *evsel = pt->pebs_evsel; + int data_src_fmt = pt->pebs_data_src_fmt; u64 id = evsel->core.id[0]; - return intel_pt_do_synth_pebs_sample(ptq, evsel, id); + return intel_pt_do_synth_pebs_sample(ptq, evsel, id, data_src_fmt); } static int intel_pt_synth_pebs_sample(struct intel_pt_queue *ptq) @@ -2395,7 +2549,7 @@ static int intel_pt_synth_pebs_sample(struct intel_pt_queue *ptq) hw_id); return intel_pt_synth_single_pebs_sample(ptq); } - err = intel_pt_do_synth_pebs_sample(ptq, pe->evsel, pe->id); + err = intel_pt_do_synth_pebs_sample(ptq, pe->evsel, pe->id, pe->data_src_fmt); if (err) return err; } @@ -3355,6 +3509,49 @@ static int intel_pt_process_itrace_start(struct intel_pt *pt, event->itrace_start.tid); } +/* + * Events with data_src are identified by L1_Hit_Indication + * refer https://github.com/intel/perfmon + */ +static int intel_pt_data_src_fmt(struct intel_pt *pt, struct evsel *evsel) +{ + struct perf_env *env = pt->machine->env; + int fmt = DATA_SRC_FORMAT_NA; + + if (!env->cpuid) + return DATA_SRC_FORMAT_ERR; + + /* + * PEBS-via-PT is only supported on E-core non-hybrid. Of those only + * Gracemont and Crestmont have data_src. Check for: + * Alderlake N (Gracemont) + * Sierra Forest (Crestmont) + * Grand Ridge (Crestmont) + */ + + if (!strncmp(env->cpuid, "GenuineIntel,6,190,", 19)) + fmt = DATA_SRC_FORMAT_GRT; + + if (!strncmp(env->cpuid, "GenuineIntel,6,175,", 19) || + !strncmp(env->cpuid, "GenuineIntel,6,182,", 19)) + fmt = DATA_SRC_FORMAT_CMT; + + if (fmt == DATA_SRC_FORMAT_NA) + return fmt; + + /* + * Only data_src events are: + * mem-loads event=0xd0,umask=0x5 + * mem-stores event=0xd0,umask=0x6 + */ + if (evsel->core.attr.type == PERF_TYPE_RAW && + ((evsel->core.attr.config & 0xffff) == 0x5d0 || + (evsel->core.attr.config & 0xffff) == 0x6d0)) + return fmt; + + return DATA_SRC_FORMAT_NA; +} + static int intel_pt_process_aux_output_hw_id(struct intel_pt *pt, union perf_event *event, struct perf_sample *sample) @@ -3375,6 +3572,7 @@ static int intel_pt_process_aux_output_hw_id(struct intel_pt *pt, ptq->pebs[hw_id].evsel = evsel; ptq->pebs[hw_id].id = sample->id; + ptq->pebs[hw_id].data_src_fmt = intel_pt_data_src_fmt(pt, evsel); return 0; } @@ -3924,6 +4122,7 @@ static void intel_pt_setup_pebs_events(struct intel_pt *pt) } pt->single_pebs = true; pt->sample_pebs = true; + pt->pebs_data_src_fmt = intel_pt_data_src_fmt(pt, evsel); pt->pebs_evsel = evsel; } } -- GitLab From 6a6070d943234888d49f3865c4b5190f727365ff Mon Sep 17 00:00:00 2001 From: Adrian Hunter Date: Mon, 12 May 2025 12:39:32 +0300 Subject: [PATCH 0990/2211] perf scripts python: exported-sql-viewer.py: Fix pattern matching with Python 3 [ Upstream commit 17e548405a81665fd14cee960db7d093d1396400 ] The script allows the user to enter patterns to find symbols. The pattern matching characters are converted for use in SQL. For PostgreSQL the conversion involves using the Python maketrans() method which is slightly different in Python 3 compared with Python 2. Fix to work in Python 3. Fixes: beda0e725e5f06ac ("perf script python: Add Python3 support to exported-sql-viewer.py") Signed-off-by: Adrian Hunter Cc: Alexander Shishkin Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Cc: Tony Jones Link: https://lore.kernel.org/r/20250512093932.79854-4-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/scripts/python/exported-sql-viewer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/perf/scripts/python/exported-sql-viewer.py b/tools/perf/scripts/python/exported-sql-viewer.py index 121cf61ba1b34..e0b2e7268ef68 100755 --- a/tools/perf/scripts/python/exported-sql-viewer.py +++ b/tools/perf/scripts/python/exported-sql-viewer.py @@ -680,7 +680,10 @@ class CallGraphModelBase(TreeModel): s = value.replace("%", "\\%") s = s.replace("_", "\\_") # Translate * and ? into SQL LIKE pattern characters % and _ - trans = string.maketrans("*?", "%_") + if sys.version_info[0] == 3: + trans = str.maketrans("*?", "%_") + else: + trans = string.maketrans("*?", "%_") match = " LIKE '" + str(s).translate(trans) + "'" else: match = " GLOB '" + str(value) + "'" -- GitLab From 9b15fcdba919d70a86d51e10e3558198238aa0bd Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Wed, 2 Apr 2025 13:59:51 +0300 Subject: [PATCH 0991/2211] remoteproc: qcom_wcnss_iris: Add missing put_device() on error in probe [ Upstream commit 0cb4b1b97041d8a1f773425208ded253c1cb5869 ] The device_del() call matches with the device_add() but we also need to call put_device() to trigger the qcom_iris_release(). Fixes: 1fcef985c8bd ("remoteproc: qcom: wcnss: Fix race with iris probe") Signed-off-by: Dan Carpenter Reviewed-by: Dmitry Baryshkov Link: https://lore.kernel.org/r/4604f7e0-3217-4095-b28a-3ff8b5afad3a@stanley.mountain Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/remoteproc/qcom_wcnss_iris.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/remoteproc/qcom_wcnss_iris.c b/drivers/remoteproc/qcom_wcnss_iris.c index dd36fd077911a..1e197f7734742 100644 --- a/drivers/remoteproc/qcom_wcnss_iris.c +++ b/drivers/remoteproc/qcom_wcnss_iris.c @@ -197,6 +197,7 @@ struct qcom_iris *qcom_iris_probe(struct device *parent, bool *use_48mhz_xo) err_device_del: device_del(&iris->dev); + put_device(&iris->dev); return ERR_PTR(ret); } @@ -204,4 +205,5 @@ err_device_del: void qcom_iris_remove(struct qcom_iris *iris) { device_del(&iris->dev); + put_device(&iris->dev); } -- GitLab From 3a4afda6fd3f9d426d3bfeb3b304aa3deeb0ff3a Mon Sep 17 00:00:00 2001 From: Siddharth Vadapalli Date: Tue, 13 May 2025 11:14:35 +0530 Subject: [PATCH 0992/2211] remoteproc: k3-r5: Drop check performed in k3_r5_rproc_{mbox_callback/kick} [ Upstream commit 9995dbfc2235efabdb3759606d522e1a7ec3bdcb ] Commit f3f11cfe8907 ("remoteproc: k3-r5: Acquire mailbox handle during probe routine") introduced a check in the "k3_r5_rproc_mbox_callback()" and "k3_r5_rproc_kick()" callbacks, causing them to exit if the remote core's state is "RPROC_DETACHED". However, the "__rproc_attach()" function that is responsible for attaching to a remote core, updates the state of the remote core to "RPROC_ATTACHED" only after invoking "rproc_start_subdevices()". The "rproc_start_subdevices()" function triggers the probe of the Virtio RPMsg devices associated with the remote core, which require that the "k3_r5_rproc_kick()" and "k3_r5_rproc_mbox_callback()" callbacks are functional. Hence, drop the check in the callbacks. Fixes: f3f11cfe8907 ("remoteproc: k3-r5: Acquire mailbox handle during probe routine") Signed-off-by: Siddharth Vadapalli Signed-off-by: Beleswar Padhi Tested-by: Judith Mendez Reviewed-by: Andrew Davis Link: https://lore.kernel.org/r/20250513054510.3439842-2-b-padhi@ti.com Signed-off-by: Mathieu Poirier Signed-off-by: Sasha Levin --- drivers/remoteproc/ti_k3_r5_remoteproc.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/ti_k3_r5_remoteproc.c index 747ee467da88c..4894461aa65f3 100644 --- a/drivers/remoteproc/ti_k3_r5_remoteproc.c +++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c @@ -194,10 +194,6 @@ static void k3_r5_rproc_mbox_callback(struct mbox_client *client, void *data) const char *name = kproc->rproc->name; u32 msg = omap_mbox_message(data); - /* Do not forward message from a detached core */ - if (kproc->rproc->state == RPROC_DETACHED) - return; - dev_dbg(dev, "mbox msg: 0x%x\n", msg); switch (msg) { @@ -233,10 +229,6 @@ static void k3_r5_rproc_kick(struct rproc *rproc, int vqid) mbox_msg_t msg = (mbox_msg_t)vqid; int ret; - /* Do not forward message to a detached core */ - if (kproc->rproc->state == RPROC_DETACHED) - return; - /* send the index of the triggered virtqueue in the mailbox payload */ ret = mbox_send_message(kproc->mbox, (void *)msg); if (ret < 0) -- GitLab From 4ce341e6393638e5004a68f620f4fd6c859b0839 Mon Sep 17 00:00:00 2001 From: Siddharth Vadapalli Date: Tue, 13 May 2025 11:14:36 +0530 Subject: [PATCH 0993/2211] remoteproc: k3-dsp: Drop check performed in k3_dsp_rproc_{mbox_callback/kick} [ Upstream commit 349d62ab207f55f039c3ddb40b36e95c2f0b3ed0 ] Commit ea1d6fb5b571 ("remoteproc: k3-dsp: Acquire mailbox handle during probe routine") introduced a check in the "k3_dsp_rproc_mbox_callback()" and "k3_dsp_rproc_kick()" callbacks, causing them to exit if the remote core's state is "RPROC_DETACHED". However, the "__rproc_attach()" function that is responsible for attaching to a remote core, updates the state of the remote core to "RPROC_ATTACHED" only after invoking "rproc_start_subdevices()". The "rproc_start_subdevices()" function triggers the probe of the Virtio RPMsg devices associated with the remote core, which require that the "k3_dsp_rproc_kick()" and "k3_dsp_rproc_mbox_callback()" callbacks are functional. Hence, drop the check in the callbacks. Fixes: ea1d6fb5b571 ("remoteproc: k3-dsp: Acquire mailbox handle during probe routine") Signed-off-by: Siddharth Vadapalli Signed-off-by: Beleswar Padhi Tested-by: Judith Mendez Reviewed-by: Andrew Davis Link: https://lore.kernel.org/r/20250513054510.3439842-3-b-padhi@ti.com Signed-off-by: Mathieu Poirier Signed-off-by: Sasha Levin --- drivers/remoteproc/ti_k3_dsp_remoteproc.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/drivers/remoteproc/ti_k3_dsp_remoteproc.c b/drivers/remoteproc/ti_k3_dsp_remoteproc.c index 8be3f631c1920..2ae0655ddf1d2 100644 --- a/drivers/remoteproc/ti_k3_dsp_remoteproc.c +++ b/drivers/remoteproc/ti_k3_dsp_remoteproc.c @@ -115,10 +115,6 @@ static void k3_dsp_rproc_mbox_callback(struct mbox_client *client, void *data) const char *name = kproc->rproc->name; u32 msg = omap_mbox_message(data); - /* Do not forward messages from a detached core */ - if (kproc->rproc->state == RPROC_DETACHED) - return; - dev_dbg(dev, "mbox msg: 0x%x\n", msg); switch (msg) { @@ -159,10 +155,6 @@ static void k3_dsp_rproc_kick(struct rproc *rproc, int vqid) mbox_msg_t msg = (mbox_msg_t)vqid; int ret; - /* Do not forward messages to a detached core */ - if (kproc->rproc->state == RPROC_DETACHED) - return; - /* send the index of the triggered virtqueue in the mailbox payload */ ret = mbox_send_message(kproc->mbox, (void *)msg); if (ret < 0) -- GitLab From 1fbee9f1856f150228ee43829998e6f51ba17279 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Wed, 23 Apr 2025 20:22:05 +0300 Subject: [PATCH 0994/2211] rpmsg: qcom_smd: Fix uninitialized return variable in __qcom_smd_send() [ Upstream commit 5de775df3362090a6e90046d1f2d83fe62489aa0 ] The "ret" variable isn't initialized if we don't enter the loop. For example, if "channel->state" is not SMD_CHANNEL_OPENED. Fixes: 33e3820dda88 ("rpmsg: smd: Use spinlock in tx path") Signed-off-by: Dan Carpenter Link: https://lore.kernel.org/r/aAkhvV0nSbrsef1P@stanley.mountain Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/rpmsg/qcom_smd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c index 43f601c84b4fc..79d35ab43729e 100644 --- a/drivers/rpmsg/qcom_smd.c +++ b/drivers/rpmsg/qcom_smd.c @@ -746,7 +746,7 @@ static int __qcom_smd_send(struct qcom_smd_channel *channel, const void *data, __le32 hdr[5] = { cpu_to_le32(len), }; int tlen = sizeof(hdr) + len; unsigned long flags; - int ret; + int ret = 0; /* Word aligned channels only accept word size aligned data */ if (channel->info_word && len % 4) -- GitLab From d374cd56df23d8d483a31f4fd950ee7b4ffadddd Mon Sep 17 00:00:00 2001 From: Christophe JAILLET Date: Mon, 21 Apr 2025 17:00:33 +0200 Subject: [PATCH 0995/2211] mfd: exynos-lpass: Fix an error handling path in exynos_lpass_probe() [ Upstream commit 484f0f59f09edd1f6fa63703c12eb30d72a519ac ] If an error occurs after a successful regmap_init_mmio(), regmap_exit() should be called as already done in the .remove() function. Switch to devm_regmap_init_mmio() to avoid the leak and simplify the .remove() function. Fixes: c414df12bdf7 ("mfd: exynos-lpass: Add missing remove() function") Signed-off-by: Christophe JAILLET Reviewed-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/38414eecb1096840946756ae86887aea2a489c1b.1745247209.git.christophe.jaillet@wanadoo.fr Signed-off-by: Lee Jones Signed-off-by: Sasha Levin --- drivers/mfd/exynos-lpass.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/mfd/exynos-lpass.c b/drivers/mfd/exynos-lpass.c index e58990c85ed87..eedcfc22c3325 100644 --- a/drivers/mfd/exynos-lpass.c +++ b/drivers/mfd/exynos-lpass.c @@ -122,8 +122,8 @@ static int exynos_lpass_probe(struct platform_device *pdev) if (IS_ERR(lpass->sfr0_clk)) return PTR_ERR(lpass->sfr0_clk); - lpass->top = regmap_init_mmio(dev, base_top, - &exynos_lpass_reg_conf); + lpass->top = devm_regmap_init_mmio(dev, base_top, + &exynos_lpass_reg_conf); if (IS_ERR(lpass->top)) { dev_err(dev, "LPASS top regmap initialization failed\n"); return PTR_ERR(lpass->top); @@ -145,7 +145,6 @@ static void exynos_lpass_remove(struct platform_device *pdev) pm_runtime_disable(&pdev->dev); if (!pm_runtime_status_suspended(&pdev->dev)) exynos_lpass_disable(lpass); - regmap_exit(lpass->top); } static int __maybe_unused exynos_lpass_suspend(struct device *dev) -- GitLab From fc66342db7306ff4c77de971983624405041c59e Mon Sep 17 00:00:00 2001 From: Christophe JAILLET Date: Mon, 21 Apr 2025 17:00:34 +0200 Subject: [PATCH 0996/2211] mfd: exynos-lpass: Avoid calling exynos_lpass_disable() twice in exynos_lpass_remove() [ Upstream commit b70b84556eeca5262d290e8619fe0af5b7664a52 ] exynos_lpass_disable() is called twice in the remove function. Remove one of these calls. Fixes: 90f447170c6f ("mfd: exynos-lpass: Add runtime PM support") Signed-off-by: Christophe JAILLET Reviewed-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/74d69e8de10308c9855db6d54155a3de4b11abfd.1745247209.git.christophe.jaillet@wanadoo.fr Signed-off-by: Lee Jones Signed-off-by: Sasha Levin --- drivers/mfd/exynos-lpass.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/mfd/exynos-lpass.c b/drivers/mfd/exynos-lpass.c index eedcfc22c3325..e36805f07282e 100644 --- a/drivers/mfd/exynos-lpass.c +++ b/drivers/mfd/exynos-lpass.c @@ -141,7 +141,6 @@ static void exynos_lpass_remove(struct platform_device *pdev) { struct exynos_lpass *lpass = platform_get_drvdata(pdev); - exynos_lpass_disable(lpass); pm_runtime_disable(&pdev->dev); if (!pm_runtime_status_suspended(&pdev->dev)) exynos_lpass_disable(lpass); -- GitLab From 9970210eb1a4eaa0cc39cf79daa0cb9512fcf966 Mon Sep 17 00:00:00 2001 From: Alexey Gladkov Date: Sat, 26 Apr 2025 18:16:32 +0200 Subject: [PATCH 0997/2211] mfd: stmpe-spi: Correct the name used in MODULE_DEVICE_TABLE [ Upstream commit 59d60c16ed41475f3b5f7b605e75fbf8e3628720 ] The name used in the macro does not exist. drivers/mfd/stmpe-spi.c:132:26: error: use of undeclared identifier 'stmpe_id' 132 | MODULE_DEVICE_TABLE(spi, stmpe_id); Fixes: e789995d5c61 ("mfd: Add support for STMPE SPI interface") Signed-off-by: Alexey Gladkov Reviewed-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/79d5a847303e45a46098f2d827d3d8a249a32be3.1745591072.git.legion@kernel.org Signed-off-by: Lee Jones Signed-off-by: Sasha Levin --- drivers/mfd/stmpe-spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/stmpe-spi.c b/drivers/mfd/stmpe-spi.c index 792236f56399a..b9cc85ea2c401 100644 --- a/drivers/mfd/stmpe-spi.c +++ b/drivers/mfd/stmpe-spi.c @@ -129,7 +129,7 @@ static const struct spi_device_id stmpe_spi_id[] = { { "stmpe2403", STMPE2403 }, { } }; -MODULE_DEVICE_TABLE(spi, stmpe_id); +MODULE_DEVICE_TABLE(spi, stmpe_spi_id); static struct spi_driver stmpe_spi_driver = { .driver = { -- GitLab From 28f3b29e74de23c5a17f6daf3249372f5557fe1a Mon Sep 17 00:00:00 2001 From: Leo Yan Date: Mon, 31 Mar 2025 18:27:59 +0100 Subject: [PATCH 0998/2211] perf tests switch-tracking: Fix timestamp comparison [ Upstream commit 628e124404b3db5e10e17228e680a2999018ab33 ] The test might fail on the Arm64 platform with the error: # perf test -vvv "Track with sched_switch" Missing sched_switch events # The issue is caused by incorrect handling of timestamp comparisons. The comparison result, a signed 64-bit value, was being directly cast to an int, leading to incorrect sorting for sched events. The case does not fail everytime, usually I can trigger the failure after run 20 ~ 30 times: # while true; do perf test "Track with sched_switch"; done 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : FAILED! 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok 106: Track with sched_switch : FAILED! 106: Track with sched_switch : Ok 106: Track with sched_switch : Ok I used cross compiler to build Perf tool on my host machine and tested on Debian / Juno board. Generally, I think this issue is not very specific to GCC versions. As both internal CI and my local env can reproduce the issue. My Host Build compiler: # aarch64-linux-gnu-gcc --version aarch64-linux-gnu-gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0 Juno Board: # lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 12 (bookworm) Release: 12 Codename: bookworm Fix this by explicitly returning 0, 1, or -1 based on whether the result is zero, positive, or negative. Fixes: d44bc558297222d9 ("perf tests: Add a test for tracking with sched_switch") Reviewed-by: Ian Rogers Signed-off-by: Leo Yan Cc: Adrian Hunter Cc: James Clark Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/r/20250331172759.115604-1-leo.yan@arm.com Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/tests/switch-tracking.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/tests/switch-tracking.c b/tools/perf/tests/switch-tracking.c index 5cab17a1942e6..ee43d8fa2ed67 100644 --- a/tools/perf/tests/switch-tracking.c +++ b/tools/perf/tests/switch-tracking.c @@ -258,7 +258,7 @@ static int compar(const void *a, const void *b) const struct event_node *nodeb = b; s64 cmp = nodea->event_time - nodeb->event_time; - return cmp; + return cmp < 0 ? -1 : (cmp > 0 ? 1 : 0); } static int process_events(struct evlist *evlist, -- GitLab From 0acd44a8d7ee00eeb0b8466c03eae7d5a2e8bd77 Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Sun, 25 May 2025 16:47:24 +0800 Subject: [PATCH 0999/2211] mailbox: imx: Fix TXDB_V2 sending [ Upstream commit f5cb07ec6aabd1bb56adbdeb5f0d70cb524db2cd ] i.MX95 features several processing domains, Cortex-M7, Cortex-A55 secure, Cortex-A55 non-secure. Each domain could communicate with SCMI firmware with a dedicated MU. But the current NXP SCMI firmware is not a RTOS, all processing logic codes are in interrupt context. So if high priority Cortex-M7 is communicating with SCMI firmware and requires a bit more time to handle the SCMI call, Linux MU TXDB_V2 will be timeout with high possiblity in 1000us(the current value in imx-mailbox.c). Per NXP SCMI firmware design, if timeout, there is no recover logic, so SCMI agents should never timeout and always wait until the check condition met. Based on the upper reason, enlarge the timeout value to 10ms which is less chance to timeout, and retry if timeout really happends. Fixes: 5bfe4067d350 ("mailbox: imx: support channel type tx doorbell v2") Signed-off-by: Peng Fan Signed-off-by: Jassi Brar Signed-off-by: Sasha Levin --- drivers/mailbox/imx-mailbox.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/mailbox/imx-mailbox.c b/drivers/mailbox/imx-mailbox.c index f815dab3be50c..0657bd3d8f97b 100644 --- a/drivers/mailbox/imx-mailbox.c +++ b/drivers/mailbox/imx-mailbox.c @@ -226,7 +226,7 @@ static int imx_mu_generic_tx(struct imx_mu_priv *priv, { u32 *arg = data; u32 val; - int ret; + int ret, count; switch (cp->type) { case IMX_MU_TYPE_TX: @@ -240,11 +240,20 @@ static int imx_mu_generic_tx(struct imx_mu_priv *priv, case IMX_MU_TYPE_TXDB_V2: imx_mu_write(priv, IMX_MU_xCR_GIRn(priv->dcfg->type, cp->idx), priv->dcfg->xCR[IMX_MU_GCR]); - ret = readl_poll_timeout(priv->base + priv->dcfg->xCR[IMX_MU_GCR], val, - !(val & IMX_MU_xCR_GIRn(priv->dcfg->type, cp->idx)), - 0, 1000); - if (ret) - dev_warn_ratelimited(priv->dev, "channel type: %d failure\n", cp->type); + ret = -ETIMEDOUT; + count = 0; + while (ret && (count < 10)) { + ret = + readl_poll_timeout(priv->base + priv->dcfg->xCR[IMX_MU_GCR], val, + !(val & IMX_MU_xCR_GIRn(priv->dcfg->type, cp->idx)), + 0, 10000); + + if (ret) { + dev_warn_ratelimited(priv->dev, + "channel type: %d timeout, %d times, retry\n", + cp->type, ++count); + } + } break; default: dev_warn_ratelimited(priv->dev, "Send data on wrong channel type: %d\n", cp->type); -- GitLab From 3196b6c70853744d708958587cbc95ab9c057d96 Mon Sep 17 00:00:00 2001 From: Jason-JH Lin Date: Mon, 21 Apr 2025 11:55:47 +0800 Subject: [PATCH 1000/2211] mailbox: mtk-cmdq: Refine GCE_GCTL_VALUE setting [ Upstream commit 9fcebcb37c3e0a4b6eb40768cc5a5faebf166fbe ] Add cmdq_gctl_value_toggle() to configure GCE_CTRL_BY_SW and GCE_DDR_EN together in the same GCE_GCTL_VALUE register. For the SoCs whose GCE is located in MMINFRA and uses MMINFRA_AO power, this allows it to be written without enabling the clocks. Otherwise, all GCE registers should be written after the GCE clocks are enabled. Move this function into cmdq_runtime_resume() and cmdq_runtime_suspend() to ensure it is called when the GCE clock is enabled. Fixes: 7abd037aa581 ("mailbox: mtk-cmdq: add gce ddr enable support flow") Signed-off-by: Jason-JH Lin Reviewed-by: AngeloGioacchino Del Regno Signed-off-by: Jassi Brar Signed-off-by: Sasha Levin --- drivers/mailbox/mtk-cmdq-mailbox.c | 51 +++++++++++++----------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c index 9c43ed9bdd37b..d24f71819c3d6 100644 --- a/drivers/mailbox/mtk-cmdq-mailbox.c +++ b/drivers/mailbox/mtk-cmdq-mailbox.c @@ -92,18 +92,6 @@ struct gce_plat { u32 gce_num; }; -static void cmdq_sw_ddr_enable(struct cmdq *cmdq, bool enable) -{ - WARN_ON(clk_bulk_enable(cmdq->pdata->gce_num, cmdq->clocks)); - - if (enable) - writel(GCE_DDR_EN | GCE_CTRL_BY_SW, cmdq->base + GCE_GCTL_VALUE); - else - writel(GCE_CTRL_BY_SW, cmdq->base + GCE_GCTL_VALUE); - - clk_bulk_disable(cmdq->pdata->gce_num, cmdq->clocks); -} - u8 cmdq_get_shift_pa(struct mbox_chan *chan) { struct cmdq *cmdq = container_of(chan->mbox, struct cmdq, mbox); @@ -112,6 +100,19 @@ u8 cmdq_get_shift_pa(struct mbox_chan *chan) } EXPORT_SYMBOL(cmdq_get_shift_pa); +static void cmdq_gctl_value_toggle(struct cmdq *cmdq, bool ddr_enable) +{ + u32 val = cmdq->pdata->control_by_sw ? GCE_CTRL_BY_SW : 0; + + if (!cmdq->pdata->control_by_sw && !cmdq->pdata->sw_ddr_en) + return; + + if (cmdq->pdata->sw_ddr_en && ddr_enable) + val |= GCE_DDR_EN; + + writel(val, cmdq->base + GCE_GCTL_VALUE); +} + static int cmdq_thread_suspend(struct cmdq *cmdq, struct cmdq_thread *thread) { u32 status; @@ -140,16 +141,10 @@ static void cmdq_thread_resume(struct cmdq_thread *thread) static void cmdq_init(struct cmdq *cmdq) { int i; - u32 gctl_regval = 0; WARN_ON(clk_bulk_enable(cmdq->pdata->gce_num, cmdq->clocks)); - if (cmdq->pdata->control_by_sw) - gctl_regval = GCE_CTRL_BY_SW; - if (cmdq->pdata->sw_ddr_en) - gctl_regval |= GCE_DDR_EN; - if (gctl_regval) - writel(gctl_regval, cmdq->base + GCE_GCTL_VALUE); + cmdq_gctl_value_toggle(cmdq, true); writel(CMDQ_THR_ACTIVE_SLOT_CYCLES, cmdq->base + CMDQ_THR_SLOT_CYCLES); for (i = 0; i <= CMDQ_MAX_EVENT; i++) @@ -315,14 +310,21 @@ static irqreturn_t cmdq_irq_handler(int irq, void *dev) static int cmdq_runtime_resume(struct device *dev) { struct cmdq *cmdq = dev_get_drvdata(dev); + int ret; - return clk_bulk_enable(cmdq->pdata->gce_num, cmdq->clocks); + ret = clk_bulk_enable(cmdq->pdata->gce_num, cmdq->clocks); + if (ret) + return ret; + + cmdq_gctl_value_toggle(cmdq, true); + return 0; } static int cmdq_runtime_suspend(struct device *dev) { struct cmdq *cmdq = dev_get_drvdata(dev); + cmdq_gctl_value_toggle(cmdq, false); clk_bulk_disable(cmdq->pdata->gce_num, cmdq->clocks); return 0; } @@ -347,9 +349,6 @@ static int cmdq_suspend(struct device *dev) if (task_running) dev_warn(dev, "exist running task(s) in suspend\n"); - if (cmdq->pdata->sw_ddr_en) - cmdq_sw_ddr_enable(cmdq, false); - return pm_runtime_force_suspend(dev); } @@ -360,9 +359,6 @@ static int cmdq_resume(struct device *dev) WARN_ON(pm_runtime_force_resume(dev)); cmdq->suspended = false; - if (cmdq->pdata->sw_ddr_en) - cmdq_sw_ddr_enable(cmdq, true); - return 0; } @@ -370,9 +366,6 @@ static void cmdq_remove(struct platform_device *pdev) { struct cmdq *cmdq = platform_get_drvdata(pdev); - if (cmdq->pdata->sw_ddr_en) - cmdq_sw_ddr_enable(cmdq, false); - if (!IS_ENABLED(CONFIG_PM)) cmdq_runtime_suspend(&pdev->dev); -- GitLab From 20eafb4e59b35fccc4fa60437abdab7ffcd7ec34 Mon Sep 17 00:00:00 2001 From: Ian Rogers Date: Tue, 27 May 2025 20:26:31 -0700 Subject: [PATCH 1001/2211] perf symbol: Fix use-after-free in filename__read_build_id MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit fef8f648bb47726d96a5701fe31ed606268da73d ] The same buf is used for the program headers and reading notes. As the notes memory may be reallocated then this corrupts the memory pointed to by the phdr. Using the same buffer is in any case a logic error. Rather than deal with the duplicated code, introduce an elf32 boolean and a union for either the elf32 or elf64 headers that are in use. Let the program headers have their own memory and grow the buffer for notes as necessary. Before `perf list -j` compiled with asan would crash with: ``` ==4176189==ERROR: AddressSanitizer: heap-use-after-free on address 0x5160000070b8 at pc 0x555d3b15075b bp 0x7ffebb5a8090 sp 0x7ffebb5a8088 READ of size 8 at 0x5160000070b8 thread T0 #0 0x555d3b15075a in filename__read_build_id tools/perf/util/symbol-minimal.c:212:25 #1 0x555d3ae43aff in filename__sprintf_build_id tools/perf/util/build-id.c:110:8 ... 0x5160000070b8 is located 312 bytes inside of 560-byte region [0x516000006f80,0x5160000071b0) freed by thread T0 here: #0 0x555d3ab21840 in realloc (perf+0x264840) (BuildId: 12dff2f6629f738e5012abdf0e90055518e70b5e) #1 0x555d3b1506e7 in filename__read_build_id tools/perf/util/symbol-minimal.c:206:11 ... previously allocated by thread T0 here: #0 0x555d3ab21423 in malloc (perf+0x264423) (BuildId: 12dff2f6629f738e5012abdf0e90055518e70b5e) #1 0x555d3b1503a2 in filename__read_build_id tools/perf/util/symbol-minimal.c:182:9 ... ``` Note: this bug is long standing and not introduced by the other asan fix in commit fa9c4977fbfb ("perf symbol-minimal: Fix double free in filename__read_build_id"). Fixes: b691f64360ecec49 ("perf symbols: Implement poor man's ELF parser") Signed-off-by: Ian Rogers Link: https://lore.kernel.org/r/20250528032637.198960-2-irogers@google.com Cc: Mark Rutland Cc: Gary Guo Cc: Alex Gaynor Cc: Boqun Feng Cc: Howard Chu Cc: Alice Ryhl Cc: Dmitry Vyukov Cc: Peter Zijlstra Cc: Adrian Hunter Cc: Weilin Wang Cc: Andreas Hindborg Cc: Arnaldo Carvalho de Melo Cc: Danilo Krummrich Cc: Jiri Olsa Cc: Namhyung Kim Cc: Miguel Ojeda Cc: James Clark Cc: Jiapeng Chong Cc: Andi Kleen Cc: Alexander Shishkin Cc: Kan Liang Cc: Stephen Brennan Cc: Benno Lossin Cc: Björn Roy Baron Cc: Ingo Molnar Cc: Trevor Gross Cc: linux-kernel@vger.kernel.org Cc: linux-perf-users@vger.kernel.org Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/util/symbol-minimal.c | 168 +++++++++++++------------------ 1 file changed, 70 insertions(+), 98 deletions(-) diff --git a/tools/perf/util/symbol-minimal.c b/tools/perf/util/symbol-minimal.c index d8da3da01fe6b..36c1d3090689f 100644 --- a/tools/perf/util/symbol-minimal.c +++ b/tools/perf/util/symbol-minimal.c @@ -90,11 +90,23 @@ int filename__read_build_id(const char *filename, struct build_id *bid) { FILE *fp; int ret = -1; - bool need_swap = false; + bool need_swap = false, elf32; u8 e_ident[EI_NIDENT]; - size_t buf_size; - void *buf; int i; + union { + struct { + Elf32_Ehdr ehdr32; + Elf32_Phdr *phdr32; + }; + struct { + Elf64_Ehdr ehdr64; + Elf64_Phdr *phdr64; + }; + } hdrs; + void *phdr; + size_t phdr_size; + void *buf = NULL; + size_t buf_size = 0; fp = fopen(filename, "r"); if (fp == NULL) @@ -108,119 +120,79 @@ int filename__read_build_id(const char *filename, struct build_id *bid) goto out; need_swap = check_need_swap(e_ident[EI_DATA]); + elf32 = e_ident[EI_CLASS] == ELFCLASS32; - /* for simplicity */ - fseek(fp, 0, SEEK_SET); - - if (e_ident[EI_CLASS] == ELFCLASS32) { - Elf32_Ehdr ehdr; - Elf32_Phdr *phdr; - - if (fread(&ehdr, sizeof(ehdr), 1, fp) != 1) - goto out; + if (fread(elf32 ? (void *)&hdrs.ehdr32 : (void *)&hdrs.ehdr64, + elf32 ? sizeof(hdrs.ehdr32) : sizeof(hdrs.ehdr64), + 1, fp) != 1) + goto out; - if (need_swap) { - ehdr.e_phoff = bswap_32(ehdr.e_phoff); - ehdr.e_phentsize = bswap_16(ehdr.e_phentsize); - ehdr.e_phnum = bswap_16(ehdr.e_phnum); + if (need_swap) { + if (elf32) { + hdrs.ehdr32.e_phoff = bswap_32(hdrs.ehdr32.e_phoff); + hdrs.ehdr32.e_phentsize = bswap_16(hdrs.ehdr32.e_phentsize); + hdrs.ehdr32.e_phnum = bswap_16(hdrs.ehdr32.e_phnum); + } else { + hdrs.ehdr64.e_phoff = bswap_64(hdrs.ehdr64.e_phoff); + hdrs.ehdr64.e_phentsize = bswap_16(hdrs.ehdr64.e_phentsize); + hdrs.ehdr64.e_phnum = bswap_16(hdrs.ehdr64.e_phnum); } + } + phdr_size = elf32 ? hdrs.ehdr32.e_phentsize * hdrs.ehdr32.e_phnum + : hdrs.ehdr64.e_phentsize * hdrs.ehdr64.e_phnum; + phdr = malloc(phdr_size); + if (phdr == NULL) + goto out; - buf_size = ehdr.e_phentsize * ehdr.e_phnum; - buf = malloc(buf_size); - if (buf == NULL) - goto out; - - fseek(fp, ehdr.e_phoff, SEEK_SET); - if (fread(buf, buf_size, 1, fp) != 1) - goto out_free; - - for (i = 0, phdr = buf; i < ehdr.e_phnum; i++, phdr++) { - void *tmp; - long offset; - - if (need_swap) { - phdr->p_type = bswap_32(phdr->p_type); - phdr->p_offset = bswap_32(phdr->p_offset); - phdr->p_filesz = bswap_32(phdr->p_filesz); - } - - if (phdr->p_type != PT_NOTE) - continue; - - offset = phdr->p_offset; - if (phdr->p_filesz > buf_size) { - buf_size = phdr->p_filesz; - tmp = realloc(buf, buf_size); - if (tmp == NULL) - goto out_free; - buf = tmp; - } - fseek(fp, offset, SEEK_SET); - if (fread(buf, phdr->p_filesz, 1, fp) != 1) - goto out_free; + fseek(fp, elf32 ? hdrs.ehdr32.e_phoff : hdrs.ehdr64.e_phoff, SEEK_SET); + if (fread(phdr, phdr_size, 1, fp) != 1) + goto out_free; - ret = read_build_id(buf, phdr->p_filesz, bid, need_swap); - if (ret == 0) { - ret = bid->size; - break; - } - } - } else { - Elf64_Ehdr ehdr; - Elf64_Phdr *phdr; + if (elf32) + hdrs.phdr32 = phdr; + else + hdrs.phdr64 = phdr; - if (fread(&ehdr, sizeof(ehdr), 1, fp) != 1) - goto out; + for (i = 0; i < elf32 ? hdrs.ehdr32.e_phnum : hdrs.ehdr64.e_phnum; i++) { + size_t p_filesz; if (need_swap) { - ehdr.e_phoff = bswap_64(ehdr.e_phoff); - ehdr.e_phentsize = bswap_16(ehdr.e_phentsize); - ehdr.e_phnum = bswap_16(ehdr.e_phnum); + if (elf32) { + hdrs.phdr32[i].p_type = bswap_32(hdrs.phdr32[i].p_type); + hdrs.phdr32[i].p_offset = bswap_32(hdrs.phdr32[i].p_offset); + hdrs.phdr32[i].p_filesz = bswap_32(hdrs.phdr32[i].p_offset); + } else { + hdrs.phdr64[i].p_type = bswap_32(hdrs.phdr64[i].p_type); + hdrs.phdr64[i].p_offset = bswap_64(hdrs.phdr64[i].p_offset); + hdrs.phdr64[i].p_filesz = bswap_64(hdrs.phdr64[i].p_filesz); + } } + if ((elf32 ? hdrs.phdr32[i].p_type : hdrs.phdr64[i].p_type) != PT_NOTE) + continue; - buf_size = ehdr.e_phentsize * ehdr.e_phnum; - buf = malloc(buf_size); - if (buf == NULL) - goto out; - - fseek(fp, ehdr.e_phoff, SEEK_SET); - if (fread(buf, buf_size, 1, fp) != 1) - goto out_free; - - for (i = 0, phdr = buf; i < ehdr.e_phnum; i++, phdr++) { + p_filesz = elf32 ? hdrs.phdr32[i].p_filesz : hdrs.phdr64[i].p_filesz; + if (p_filesz > buf_size) { void *tmp; - long offset; - - if (need_swap) { - phdr->p_type = bswap_32(phdr->p_type); - phdr->p_offset = bswap_64(phdr->p_offset); - phdr->p_filesz = bswap_64(phdr->p_filesz); - } - - if (phdr->p_type != PT_NOTE) - continue; - offset = phdr->p_offset; - if (phdr->p_filesz > buf_size) { - buf_size = phdr->p_filesz; - tmp = realloc(buf, buf_size); - if (tmp == NULL) - goto out_free; - buf = tmp; - } - fseek(fp, offset, SEEK_SET); - if (fread(buf, phdr->p_filesz, 1, fp) != 1) + buf_size = p_filesz; + tmp = realloc(buf, buf_size); + if (tmp == NULL) goto out_free; + buf = tmp; + } + fseek(fp, elf32 ? hdrs.phdr32[i].p_offset : hdrs.phdr64[i].p_offset, SEEK_SET); + if (fread(buf, p_filesz, 1, fp) != 1) + goto out_free; - ret = read_build_id(buf, phdr->p_filesz, bid, need_swap); - if (ret == 0) { - ret = bid->size; - break; - } + ret = read_build_id(buf, p_filesz, bid, need_swap); + if (ret == 0) { + ret = bid->size; + break; } } out_free: free(buf); + free(phdr); out: fclose(fp); return ret; -- GitLab From 8d313634e67e5f4a13dc57a25bc3039f56f9e198 Mon Sep 17 00:00:00 2001 From: Dapeng Mi Date: Thu, 3 Apr 2025 06:08:10 +0000 Subject: [PATCH 1002/2211] perf record: Fix incorrect --user-regs comments [ Upstream commit a4a859eb6704a8aa46aa1cec5396c8d41383a26b ] The comment of "--user-regs" option is not correct, fix it. "on interrupt," -> "in user space," Fixes: 84c417422798c897 ("perf record: Support direct --user-regs arguments") Reviewed-by: Ian Rogers Signed-off-by: Dapeng Mi Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Andi Kleen Cc: Ingo Molnar Cc: Kan Liang Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/r/20250403060810.196028-1-dapeng1.mi@linux.intel.com Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/builtin-record.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index adbaf80b398c1..ab9035573a15e 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -3471,7 +3471,7 @@ static struct option __record_options[] = { "sample selected machine registers on interrupt," " use '-I?' to list register names", parse_intr_regs), OPT_CALLBACK_OPTARG(0, "user-regs", &record.opts.sample_user_regs, NULL, "any register", - "sample selected machine registers on interrupt," + "sample selected machine registers in user space," " use '--user-regs=?' to list register names", parse_user_regs), OPT_BOOLEAN(0, "running-time", &record.opts.running_time, "Record running/enabled time of read (:S) events"), -- GitLab From aaea7a783d6ef3be62f848f11866cf50e0a78761 Mon Sep 17 00:00:00 2001 From: Anubhav Shelat Date: Thu, 3 Apr 2025 12:04:12 -0400 Subject: [PATCH 1003/2211] perf trace: Always print return value for syscalls returning a pid [ Upstream commit c7a48ea9b919e2fa0e4a1d9938fdb03e9afe276c ] The syscalls that were consistently observed were set_robust_list and rseq. This is because perf cannot find their child process. This change ensures that the return value is always printed. Before: 0.256 ( 0.001 ms): set_robust_list(head: 0x7f09c77dba20, len: 24) = 0.259 ( 0.001 ms): rseq(rseq: 0x7f09c77dc0e0, rseq_len: 32, sig: 1392848979) = After: 0.270 ( 0.002 ms): set_robust_list(head: 0x7f0bb14a6a20, len: 24) = 0 0.273 ( 0.002 ms): rseq(rseq: 0x7f0bb14a70e0, rseq_len: 32, sig: 1392848979) = 0 Committer notes: As discussed in the thread in the Link: tag below, these two don't return a pid, but for syscalls returning one, we need to print the result and if we manage to find the children in 'perf trace' data structures, then print its name as well. Fixes: 11c8e39f5133aed9 ("perf trace: Infrastructure to show COMM strings for syscalls returning PIDs") Reviewed-by: Howard Chu Signed-off-by: Anubhav Shelat Acked-by: Namhyung Kim Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Dapeng Mi Cc: Ian Rogers Cc: Ingo Molnar Cc: James Clark Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Michael Petlan Cc: Peter Zijlstra Link: https://lore.kernel.org/r/20250403160411.159238-2-ashelat@redhat.com Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/builtin-trace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index ee82e858ab200..ebe4fad0d4751 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -2873,8 +2873,8 @@ errno_print: { else if (sc->fmt->errpid) { struct thread *child = machine__find_thread(trace->host, ret, ret); + fprintf(trace->output, "%ld", ret); if (child != NULL) { - fprintf(trace->output, "%ld", ret); if (thread__comm_set(child)) fprintf(trace->output, " (%s)", thread__comm_str(child)); thread__put(child); -- GitLab From 877a3f1be3f0cfb5dba97dbb533928fd13d36078 Mon Sep 17 00:00:00 2001 From: Li Lingfeng Date: Tue, 4 Mar 2025 21:05:32 +0800 Subject: [PATCH 1004/2211] nfs: clear SB_RDONLY before getting superblock [ Upstream commit 8cd9b785943c57a136536250da80ba1eb6f8eb18 ] As described in the link, commit 52cb7f8f1778 ("nfs: ignore SB_RDONLY when mounting nfs") removed the check for the ro flag when determining whether to share the superblock, which caused issues when mounting different subdirectories under the same export directory via NFSv3. However, this change did not affect NFSv4. For NFSv3: 1) A single superblock is created for the initial mount. 2) When mounted read-only, this superblock carries the SB_RDONLY flag. 3) Before commit 52cb7f8f1778 ("nfs: ignore SB_RDONLY when mounting nfs"): Subsequent rw mounts would not share the existing ro superblock due to flag mismatch, creating a new superblock without SB_RDONLY. After the commit: The SB_RDONLY flag is ignored during superblock comparison, and this leads to sharing the existing superblock even for rw mounts. Ultimately results in write operations being rejected at the VFS layer. For NFSv4: 1) Multiple superblocks are created and the last one will be kept. 2) The actually used superblock for ro mounts doesn't carry SB_RDONLY flag. Therefore, commit 52cb7f8f1778 doesn't affect NFSv4 mounts. Clear SB_RDONLY before getting superblock when NFS_MOUNT_UNSHARED is not set to fix it. Fixes: 52cb7f8f1778 ("nfs: ignore SB_RDONLY when mounting nfs") Closes: https://lore.kernel.org/all/12d7ea53-1202-4e21-a7ef-431c94758ce5@app.fastmail.com/T/ Signed-off-by: Li Lingfeng Signed-off-by: Anna Schumaker Signed-off-by: Sasha Levin --- fs/nfs/super.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fs/nfs/super.c b/fs/nfs/super.c index ae5c5e39afa03..44e5cb00e2ccf 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -1303,8 +1303,17 @@ int nfs_get_tree_common(struct fs_context *fc) if (IS_ERR(server)) return PTR_ERR(server); + /* + * When NFS_MOUNT_UNSHARED is not set, NFS forces the sharing of a + * superblock among each filesystem that mounts sub-directories + * belonging to a single exported root path. + * To prevent interference between different filesystems, the + * SB_RDONLY flag should be removed from the superblock. + */ if (server->flags & NFS_MOUNT_UNSHARED) compare_super = NULL; + else + fc->sb_flags &= ~SB_RDONLY; /* -o noac implies -o sync */ if (server->flags & NFS_MOUNT_NOAC) -- GitLab From afa06f26057ee929018f7c14274cdf9238382f50 Mon Sep 17 00:00:00 2001 From: Li Lingfeng Date: Tue, 4 Mar 2025 21:05:33 +0800 Subject: [PATCH 1005/2211] nfs: ignore SB_RDONLY when remounting nfs [ Upstream commit 80c4de6ab44c14e910117a02f2f8241ffc6ec54a ] In some scenarios, when mounting NFS, more than one superblock may be created. The final superblock used is the last one created, but only the first superblock carries the ro flag passed from user space. If a ro flag is added to the superblock via remount, it will trigger the issue described in Link[1]. Link[2] attempted to address this by marking the superblock as ro during the initial mount. However, this introduced a new problem in scenarios where multiple mount points share the same superblock: [root@a ~]# mount /dev/sdb /mnt/sdb [root@a ~]# echo "/mnt/sdb *(rw,no_root_squash)" > /etc/exports [root@a ~]# echo "/mnt/sdb/test_dir2 *(ro,no_root_squash)" >> /etc/exports [root@a ~]# systemctl restart nfs-server [root@a ~]# mount -t nfs -o rw 127.0.0.1:/mnt/sdb/test_dir1 /mnt/test_mp1 [root@a ~]# mount | grep nfs4 127.0.0.1:/mnt/sdb/test_dir1 on /mnt/test_mp1 type nfs4 (rw,relatime,... [root@a ~]# mount -t nfs -o ro 127.0.0.1:/mnt/sdb/test_dir2 /mnt/test_mp2 [root@a ~]# mount | grep nfs4 127.0.0.1:/mnt/sdb/test_dir1 on /mnt/test_mp1 type nfs4 (ro,relatime,... 127.0.0.1:/mnt/sdb/test_dir2 on /mnt/test_mp2 type nfs4 (ro,relatime,... [root@a ~]# When mounting the second NFS, the shared superblock is marked as ro, causing the previous NFS mount to become read-only. To resolve both issues, the ro flag is no longer applied to the superblock during remount. Instead, the ro flag on the mount is used to control whether the mount point is read-only. Fixes: 281cad46b34d ("NFS: Create a submount rpc_op") Link[1]: https://lore.kernel.org/all/20240604112636.236517-3-lilingfeng@huaweicloud.com/ Link[2]: https://lore.kernel.org/all/20241130035818.1459775-1-lilingfeng3@huawei.com/ Signed-off-by: Li Lingfeng Signed-off-by: Anna Schumaker Signed-off-by: Sasha Levin --- fs/nfs/super.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 44e5cb00e2ccf..da5286514d8c7 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -1046,6 +1046,16 @@ int nfs_reconfigure(struct fs_context *fc) sync_filesystem(sb); + /* + * The SB_RDONLY flag has been removed from the superblock during + * mounts to prevent interference between different filesystems. + * Similarly, it is also necessary to ignore the SB_RDONLY flag + * during reconfiguration; otherwise, it may also result in the + * creation of redundant superblocks when mounting a directory with + * different rw and ro flags multiple times. + */ + fc->sb_flags_mask &= ~SB_RDONLY; + /* * Userspace mount programs that send binary options generally send * them populated with default values. We have no way to know which -- GitLab From da9addeabdda83475f767fcd612f4e5d0b560f40 Mon Sep 17 00:00:00 2001 From: Anubhav Shelat Date: Thu, 29 May 2025 10:33:35 -0400 Subject: [PATCH 1006/2211] perf trace: Set errpid to false for rseq and set_robust_list [ Upstream commit 8c56bfe53bd881c7b598c54a3a06216743c57bbc ] The 'rseq' and 'set_robust_list' syscalls don't return a pid, so set errpid for both to false. Fixes: 0c1019e3463b263a ("perf trace: Mark the 'rseq' arg in the rseq syscall as coming from user space") Fixes: 1de5b5dcb8353f36 ("perf trace: Mark the 'head' arg in the set_robust_list syscall as coming from user space") Signed-off-by: Anubhav Shelat Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Dapeng Mi Cc: Ian Rogers Cc: Ingo Molnar Cc: James Clark Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Michael Petlan Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/r/20250529143334.1469669-2-ashelat@redhat.com [ Remove explicit .errpid = false, omitting its initialization zeroes it, as noted by Namhyung ] Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/builtin-trace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index ebe4fad0d4751..f77e4f4b6f03e 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -1327,7 +1327,7 @@ static const struct syscall_fmt syscall_fmts[] = { .arg = { [0] = { .scnprintf = SCA_FDAT, /* olddirfd */ }, [2] = { .scnprintf = SCA_FDAT, /* newdirfd */ }, [4] = { .scnprintf = SCA_RENAMEAT2_FLAGS, /* flags */ }, }, }, - { .name = "rseq", .errpid = true, + { .name = "rseq", .arg = { [0] = { .from_user = true /* rseq */, }, }, }, { .name = "rt_sigaction", .arg = { [0] = { .scnprintf = SCA_SIGNUM, /* sig */ }, }, }, @@ -1351,7 +1351,7 @@ static const struct syscall_fmt syscall_fmts[] = { { .name = "sendto", .arg = { [3] = { .scnprintf = SCA_MSG_FLAGS, /* flags */ }, [4] = SCA_SOCKADDR_FROM_USER(addr), }, }, - { .name = "set_robust_list", .errpid = true, + { .name = "set_robust_list", .arg = { [0] = { .from_user = true /* head */, }, }, }, { .name = "set_tid_address", .errpid = true, }, { .name = "setitimer", -- GitLab From f7d9f4fa5385f7da06e05f7d267518033accccde Mon Sep 17 00:00:00 2001 From: Ian Rogers Date: Wed, 28 May 2025 21:39:37 -0700 Subject: [PATCH 1007/2211] perf callchain: Always populate the addr_location map when adding IP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit a913ef6fd883c05bd6538ed21ee1e773f0d750b7 ] Dropping symbols also meant the callchain maps wasn't populated, but the callchain map is needed to find the DSO. Plumb the symbols option better, falling back to thread__find_map() rather than thread__find_symbol() when symbols are disabled. Fixes: 02b2705017d2e5ad ("perf callchain: Allow symbols to be optional when resolving a callchain") Signed-off-by: Ian Rogers Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Andi Kleen Cc: Athira Rajeev Cc: Ben Gainey Cc: Chaitanya S Prakash Cc: Charlie Jenkins Cc: Chun-Tse Shao Cc: Colin Ian King Cc: Dmitriy Vyukov Cc: Dr. David Alan Gilbert Cc: Graham Woodward Cc: Howard Chu Cc: Ilkka Koskinen Cc: Ingo Molnar Cc: James Clark Cc: Jiri Olsa Cc: John Garry Cc: Kajol Jain Cc: Kan Liang Cc: Krzysztof Łopatowski Cc: Leo Yan Cc: Levi Yun Cc: Li Huafei Cc: linux-arm-kernel@lists.infradead.org Cc: Mark Rutland Cc: Martin Liška Cc: Masami Hiramatsu Cc: Matt Fleming Cc: Mike Leach Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Ravi Bangoria Cc: Song Liu Cc: Steinar H. Gunderson Cc: Stephen Brennan Cc: Steve Clevenger Cc: Thomas Falcon Cc: Veronika Molnarova Cc: Weilin Wang Cc: Will Deacon Cc: Yicong Yang Cc: Yujie Liu Cc: Zhongqiu Han Cc: Zixian Cai Link: https://lore.kernel.org/r/20250529044000.759937-2-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/util/machine.c | 6 ++++-- tools/perf/util/thread.c | 8 ++++++-- tools/perf/util/thread.h | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 9be2f4479f525..20fd742984e3c 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -1974,7 +1974,7 @@ static void ip__resolve_ams(struct thread *thread, * Thus, we have to try consecutively until we find a match * or else, the symbol is unknown */ - thread__find_cpumode_addr_location(thread, ip, &al); + thread__find_cpumode_addr_location(thread, ip, /*symbols=*/true, &al); ams->addr = ip; ams->al_addr = al.addr; @@ -2076,7 +2076,7 @@ static int add_callchain_ip(struct thread *thread, al.sym = NULL; al.srcline = NULL; if (!cpumode) { - thread__find_cpumode_addr_location(thread, ip, &al); + thread__find_cpumode_addr_location(thread, ip, symbols, &al); } else { if (ip >= PERF_CONTEXT_MAX) { switch (ip) { @@ -2104,6 +2104,8 @@ static int add_callchain_ip(struct thread *thread, } if (symbols) thread__find_symbol(thread, *cpumode, ip, &al); + else + thread__find_map(thread, *cpumode, ip, &al); } if (al.sym != NULL) { diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index 0ffdd52d86d70..309d573eac9a9 100644 --- a/tools/perf/util/thread.c +++ b/tools/perf/util/thread.c @@ -406,7 +406,7 @@ int thread__fork(struct thread *thread, struct thread *parent, u64 timestamp, bo } void thread__find_cpumode_addr_location(struct thread *thread, u64 addr, - struct addr_location *al) + bool symbols, struct addr_location *al) { size_t i; const u8 cpumodes[] = { @@ -417,7 +417,11 @@ void thread__find_cpumode_addr_location(struct thread *thread, u64 addr, }; for (i = 0; i < ARRAY_SIZE(cpumodes); i++) { - thread__find_symbol(thread, cpumodes[i], addr, al); + if (symbols) + thread__find_symbol(thread, cpumodes[i], addr, al); + else + thread__find_map(thread, cpumodes[i], addr, al); + if (al->map) break; } diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h index 6cbf6eb2812e0..1fb32e7d62a4d 100644 --- a/tools/perf/util/thread.h +++ b/tools/perf/util/thread.h @@ -122,7 +122,7 @@ struct symbol *thread__find_symbol_fb(struct thread *thread, u8 cpumode, u64 addr, struct addr_location *al); void thread__find_cpumode_addr_location(struct thread *thread, u64 addr, - struct addr_location *al); + bool symbols, struct addr_location *al); int thread__memcpy(struct thread *thread, struct machine *machine, void *buf, u64 ip, int len, bool *is64bit); -- GitLab From 48ca7139ab7f0bbed95ff7a901ea497017769657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Thu, 26 Dec 2024 19:55:13 +0100 Subject: [PATCH 1008/2211] cifs: Fix validation of SMB1 query reparse point response MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 56e84c64fc257a95728ee73165456b025c48d408 ] Validate the SMB1 query reparse point response per [MS-CIFS] section 2.2.7.2 NT_TRANSACT_IOCTL. NT_TRANSACT_IOCTL response contains one word long setup data after which is ByteCount member. So check that SetupCount is 1 before trying to read and use ByteCount member. Output setup data contains ReturnedDataLen member which is the output length of executed IOCTL command by remote system. So check that output was not truncated before transferring over network. Change MaxSetupCount of NT_TRANSACT_IOCTL request from 4 to 1 as io_rsp structure already expects one word long output setup data. This should prevent server sending incompatible structure (in case it would be extended in future, which is unlikely). Change MaxParameterCount of NT_TRANSACT_IOCTL request from 2 to 0 as NT IOCTL does not have any documented output parameters and this function does not parse any output parameters at all. Fixes: ed3e0a149b58 ("smb: client: implement ->query_reparse_point() for SMB1") Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/cifssmb.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index 8667f403a0ab6..cf8d9de2298fc 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -2780,10 +2780,10 @@ int cifs_query_reparse_point(const unsigned int xid, io_req->TotalParameterCount = 0; io_req->TotalDataCount = 0; - io_req->MaxParameterCount = cpu_to_le32(2); + io_req->MaxParameterCount = cpu_to_le32(0); /* BB find exact data count max from sess structure BB */ io_req->MaxDataCount = cpu_to_le32(CIFSMaxBufSize & 0xFFFFFF00); - io_req->MaxSetupCount = 4; + io_req->MaxSetupCount = 1; io_req->Reserved = 0; io_req->ParameterOffset = 0; io_req->DataCount = 0; @@ -2810,6 +2810,22 @@ int cifs_query_reparse_point(const unsigned int xid, goto error; } + /* SetupCount must be 1, otherwise offset to ByteCount is incorrect. */ + if (io_rsp->SetupCount != 1) { + rc = -EIO; + goto error; + } + + /* + * ReturnedDataLen is output length of executed IOCTL. + * DataCount is output length transferred over network. + * Check that we have full FSCTL_GET_REPARSE_POINT buffer. + */ + if (data_count != le16_to_cpu(io_rsp->ReturnedDataLen)) { + rc = -EIO; + goto error; + } + end = 2 + get_bcc(&io_rsp->hdr) + (__u8 *)&io_rsp->ByteCount; start = (__u8 *)&io_rsp->hdr.Protocol + data_offset; if (start >= end) { -- GitLab From 6635bb78eb7d7e6b61f11802b2b18858e8561c9a Mon Sep 17 00:00:00 2001 From: Danilo Krummrich Date: Sat, 15 Mar 2025 16:43:02 +0100 Subject: [PATCH 1009/2211] rust: alloc: add missing invariant in Vec::set_len() [ Upstream commit fb1bf1067de979c89ae33589e0466d6ce0dde204 ] When setting a new length, we have to justify that the set length represents the exact number of elements stored in the vector. Reviewed-by: Benno Lossin Reported-by: Alice Ryhl Closes: https://lore.kernel.org/rust-for-linux/20250311-iov-iter-v1-4-f6c9134ea824@google.com Fixes: 2aac4cd7dae3 ("rust: alloc: implement kernel `Vec` type") Link: https://lore.kernel.org/r/20250315154436.65065-2-dakr@kernel.org Signed-off-by: Danilo Krummrich Signed-off-by: Sasha Levin --- rust/kernel/alloc/kvec.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rust/kernel/alloc/kvec.rs b/rust/kernel/alloc/kvec.rs index 87a71fd40c3ca..f62204fe563f5 100644 --- a/rust/kernel/alloc/kvec.rs +++ b/rust/kernel/alloc/kvec.rs @@ -196,6 +196,9 @@ where #[inline] pub unsafe fn set_len(&mut self, new_len: usize) { debug_assert!(new_len <= self.capacity()); + + // INVARIANT: By the safety requirements of this method `new_len` represents the exact + // number of elements stored within `self`. self.len = new_len; } -- GitLab From 1dfeafe5850f5ba12191b34c46e3bbfbbed00ff6 Mon Sep 17 00:00:00 2001 From: Wolfram Sang Date: Thu, 27 Feb 2025 14:42:56 +0100 Subject: [PATCH 1010/2211] rtc: sh: assign correct interrupts with DT [ Upstream commit 8f2efdbc303fe7baa83843d3290dd6ea5ba3276c ] The DT bindings for this driver define the interrupts in the order as they are numbered in the interrupt controller. The old platform_data, however, listed them in a different order. So, for DT based platforms, they are mixed up. Assign them specifically for DT, so we can keep the bindings stable. After the fix, 'rtctest' passes again on the Renesas Genmai board (RZ-A1 / R7S72100). Fixes: dab5aec64bf5 ("rtc: sh: add support for rza series") Signed-off-by: Wolfram Sang Link: https://lore.kernel.org/r/20250227134256.9167-11-wsa+renesas@sang-engineering.com Signed-off-by: Alexandre Belloni Signed-off-by: Sasha Levin --- drivers/rtc/rtc-sh.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c index 27a191fa3704c..e66c9c6fd3724 100644 --- a/drivers/rtc/rtc-sh.c +++ b/drivers/rtc/rtc-sh.c @@ -485,9 +485,15 @@ static int __init sh_rtc_probe(struct platform_device *pdev) return -ENOENT; } - rtc->periodic_irq = ret; - rtc->carry_irq = platform_get_irq(pdev, 1); - rtc->alarm_irq = platform_get_irq(pdev, 2); + if (!pdev->dev.of_node) { + rtc->periodic_irq = ret; + rtc->carry_irq = platform_get_irq(pdev, 1); + rtc->alarm_irq = platform_get_irq(pdev, 2); + } else { + rtc->alarm_irq = ret; + rtc->periodic_irq = platform_get_irq(pdev, 1); + rtc->carry_irq = platform_get_irq(pdev, 2); + } res = platform_get_resource(pdev, IORESOURCE_IO, 0); if (!res) -- GitLab From e3f71127c6d9b33bd714a957fd62c72abd87c182 Mon Sep 17 00:00:00 2001 From: Cristian Ciocaltea Date: Tue, 18 Mar 2025 14:35:37 +0200 Subject: [PATCH 1011/2211] phy: rockchip: samsung-hdptx: Fix clock ratio setup [ Upstream commit 0422253ac1919fea8292381c85f11a9decff1bb1 ] The switch from 1/10 to 1/40 clock ratio must happen when exceeding the 340 MHz rate limit of HDMI 1.4, i.e. when entering the HDMI 2.0 domain, and not before. Therefore, use the correct comparison operator '>' instead of '>=' when checking the max rate. While at it, introduce a define for this rate limit constant. Fixes: 553be2830c5f ("phy: rockchip: Add Samsung HDMI/eDP Combo PHY driver") Reviewed-by: Dmitry Baryshkov Signed-off-by: Cristian Ciocaltea Link: https://lore.kernel.org/r/20250318-phy-sam-hdptx-bpc-v6-3-8cb1678e7663@collabora.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c index 9b99fdd43f5f5..70526c67ca0f1 100644 --- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c +++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c @@ -192,6 +192,7 @@ #define LN3_TX_SER_RATE_SEL_HBR2 BIT(3) #define LN3_TX_SER_RATE_SEL_HBR3 BIT(2) +#define HDMI14_MAX_RATE 340000000 #define HDMI20_MAX_RATE 600000000 struct lcpll_config { @@ -851,7 +852,7 @@ static int rk_hdptx_ropll_tmds_mode_config(struct rk_hdptx_phy *hdptx, regmap_write(hdptx->regmap, LNTOP_REG(0200), 0x06); - if (rate >= 3400000) { + if (rate > HDMI14_MAX_RATE / 100) { /* For 1/40 bitrate clk */ rk_hdptx_multi_reg_write(hdptx, rk_hdtpx_tmds_lntop_highbr_seq); } else { -- GitLab From 5aac41632fffe7eb4708d9e88e203a2cb13283c9 Mon Sep 17 00:00:00 2001 From: Cristian Ciocaltea Date: Tue, 18 Mar 2025 14:35:38 +0200 Subject: [PATCH 1012/2211] phy: rockchip: samsung-hdptx: Do no set rk_hdptx_phy->rate in case of errors [ Upstream commit 1f4d382769e3b38dfc498c806811dae856e40f31 ] Ensure rk_hdptx_ropll_tmds_cmn_config() updates hdptx->rate only after all the other operations have been successful. Fixes: c4b09c562086 ("phy: phy-rockchip-samsung-hdptx: Add clock provider support") Signed-off-by: Cristian Ciocaltea Link: https://lore.kernel.org/r/20250318-phy-sam-hdptx-bpc-v6-4-8cb1678e7663@collabora.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c index 70526c67ca0f1..5547f8df8e717 100644 --- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c +++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c @@ -781,9 +781,7 @@ static int rk_hdptx_ropll_tmds_cmn_config(struct rk_hdptx_phy *hdptx, { const struct ropll_config *cfg = NULL; struct ropll_config rc = {0}; - int i; - - hdptx->rate = rate * 100; + int ret, i; for (i = 0; i < ARRAY_SIZE(ropll_tmds_cfg); i++) if (rate == ropll_tmds_cfg[i].bit_rate) { @@ -842,7 +840,11 @@ static int rk_hdptx_ropll_tmds_cmn_config(struct rk_hdptx_phy *hdptx, regmap_update_bits(hdptx->regmap, CMN_REG(0086), PLL_PCG_CLK_EN, PLL_PCG_CLK_EN); - return rk_hdptx_post_enable_pll(hdptx); + ret = rk_hdptx_post_enable_pll(hdptx); + if (!ret) + hdptx->rate = rate * 100; + + return ret; } static int rk_hdptx_ropll_tmds_mode_config(struct rk_hdptx_phy *hdptx, -- GitLab From 17e4b0fcd234bd06e9c1b862d855ebecac6432a6 Mon Sep 17 00:00:00 2001 From: Wilfred Mallawa Date: Mon, 14 Apr 2025 10:15:06 +1000 Subject: [PATCH 1013/2211] PCI: Print the actual delay time in pci_bridge_wait_for_secondary_bus() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit d24eba726aadf8778f2907dd42281c6380b0ccaa ] Print the delay amount that pcie_wait_for_link_delay() is invoked with instead of the hardcoded 1000ms value in the debug info print. Fixes: 7b3ba09febf4 ("PCI/PM: Shorten pci_bridge_wait_for_secondary_bus() wait time for slow links") Signed-off-by: Wilfred Mallawa Signed-off-by: Bjorn Helgaas Reviewed-by: Damien Le Moal Reviewed-by: Kuppuswamy Sathyanarayanan Reviewed-by: Mika Westerberg Reviewed-by: Ilpo Järvinen Link: https://patch.msgid.link/20250414001505.21243-2-wilfred.opensource@gmail.com Signed-off-by: Sasha Levin --- drivers/pci/pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 25c07af1686b9..7ca5422feb2d4 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -4945,7 +4945,7 @@ int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, char *reset_type) delay); if (!pcie_wait_for_link_delay(dev, true, delay)) { /* Did not train, no need to wait any further */ - pci_info(dev, "Data Link Layer Link Active not set in 1000 msec\n"); + pci_info(dev, "Data Link Layer Link Active not set in %d msec\n", delay); return -ENOTTY; } -- GitLab From d9342fced7da012d8795620ccd5b043c602fdebb Mon Sep 17 00:00:00 2001 From: Jerome Brunet Date: Fri, 28 Mar 2025 15:30:44 +0100 Subject: [PATCH 1014/2211] PCI: rcar-gen4: set ep BAR4 fixed size [ Upstream commit b584ab12d59f646b9254b2b16ff197d612fd4935 ] On rcar-gen4, the ep BAR4 has a fixed size of 256B. Document this constraint in the epc features of the platform. Fixes: e311b3834dfa ("PCI: rcar-gen4: Add endpoint mode support") Signed-off-by: Jerome Brunet Signed-off-by: Manivannan Sadhasivam Reviewed-by: Manivannan Sadhasivam Link: https://patch.msgid.link/20250328-rcar-gen4-bar4-v1-1-10bb6ce9ee7f@baylibre.com Signed-off-by: Sasha Levin --- drivers/pci/controller/dwc/pcie-rcar-gen4.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/pci/controller/dwc/pcie-rcar-gen4.c b/drivers/pci/controller/dwc/pcie-rcar-gen4.c index 3a5511c3f7d97..5d77a01648606 100644 --- a/drivers/pci/controller/dwc/pcie-rcar-gen4.c +++ b/drivers/pci/controller/dwc/pcie-rcar-gen4.c @@ -403,6 +403,7 @@ static const struct pci_epc_features rcar_gen4_pcie_epc_features = { .msix_capable = false, .bar[BAR_1] = { .type = BAR_RESERVED, }, .bar[BAR_3] = { .type = BAR_RESERVED, }, + .bar[BAR_4] = { .type = BAR_FIXED, .fixed_size = 256 }, .bar[BAR_5] = { .type = BAR_RESERVED, }, .align = SZ_1M, }; -- GitLab From 8c839e71c4137e331eafcb02f84f43bb1d419e06 Mon Sep 17 00:00:00 2001 From: Hans Zhang <18255117159@163.com> Date: Sat, 19 Apr 2025 21:30:58 +0800 Subject: [PATCH 1015/2211] PCI: cadence: Fix runtime atomic count underflow [ Upstream commit 8805f32a96d3b97cef07999fa6f52112678f7e65 ] If the call to pci_host_probe() in cdns_pcie_host_setup() fails, PM runtime count is decremented in the error path using pm_runtime_put_sync(). But the runtime count is not incremented by this driver, but only by the callers (cdns_plat_pcie_probe/j721e_pcie_probe). And the callers also decrement the runtime PM count in their error path. So this leads to the below warning from the PM core: "runtime PM usage count underflow!" So fix it by getting rid of pm_runtime_put_sync() in the error path and directly return the errno. Fixes: 49e427e6bdd1 ("Merge branch 'pci/host-probe-refactor'") Signed-off-by: Hans Zhang <18255117159@163.com> Signed-off-by: Manivannan Sadhasivam Link: https://patch.msgid.link/20250419133058.162048-1-18255117159@163.com Signed-off-by: Sasha Levin --- drivers/pci/controller/cadence/pcie-cadence-host.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/drivers/pci/controller/cadence/pcie-cadence-host.c b/drivers/pci/controller/cadence/pcie-cadence-host.c index 8af95e9da7cec..741e10a575ec7 100644 --- a/drivers/pci/controller/cadence/pcie-cadence-host.c +++ b/drivers/pci/controller/cadence/pcie-cadence-host.c @@ -570,14 +570,5 @@ int cdns_pcie_host_setup(struct cdns_pcie_rc *rc) if (!bridge->ops) bridge->ops = &cdns_pcie_host_ops; - ret = pci_host_probe(bridge); - if (ret < 0) - goto err_init; - - return 0; - - err_init: - pm_runtime_put_sync(dev); - - return ret; + return pci_host_probe(bridge); } -- GitLab From 8da884ec36df5f3271252039ddabdfeee1e09265 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 1 Apr 2025 10:17:11 +0100 Subject: [PATCH 1016/2211] PCI: apple: Use gpiod_set_value_cansleep in probe flow [ Upstream commit 7334364f9de79a9a236dd0243ba574b8d2876e89 ] We're allowed to sleep here, so tell the GPIO core by using gpiod_set_value_cansleep instead of gpiod_set_value. Fixes: 1e33888fbe44 ("PCI: apple: Add initial hardware bring-up") Signed-off-by: Hector Martin Signed-off-by: Alyssa Rosenzweig Signed-off-by: Marc Zyngier Signed-off-by: Manivannan Sadhasivam Tested-by: Janne Grunau Reviewed-by: Rob Herring (Arm) Reviewed-by: Manivannan Sadhasivam Acked-by: Alyssa Rosenzweig Link: https://patch.msgid.link/20250401091713.2765724-12-maz@kernel.org Signed-off-by: Sasha Levin --- drivers/pci/controller/pcie-apple.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c index fefab2758a064..ddc65368e77d1 100644 --- a/drivers/pci/controller/pcie-apple.c +++ b/drivers/pci/controller/pcie-apple.c @@ -541,7 +541,7 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie, rmw_set(PORT_APPCLK_EN, port->base + PORT_APPCLK); /* Assert PERST# before setting up the clock */ - gpiod_set_value(reset, 1); + gpiod_set_value_cansleep(reset, 1); ret = apple_pcie_setup_refclk(pcie, port); if (ret < 0) @@ -552,7 +552,7 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie, /* Deassert PERST# */ rmw_set(PORT_PERST_OFF, port->base + PORT_PERST); - gpiod_set_value(reset, 0); + gpiod_set_value_cansleep(reset, 0); /* Wait for 100ms after PERST# deassertion (PCIe r5.0, 6.6.1) */ msleep(100); -- GitLab From 5072c1749197fc28b27d7efc0d80320d7cac9572 Mon Sep 17 00:00:00 2001 From: Chenyuan Yang Date: Mon, 14 Apr 2025 07:50:50 -0500 Subject: [PATCH 1017/2211] phy: qcom-qmp-usb: Fix an NULL vs IS_ERR() bug [ Upstream commit d14402a38c2d868cacb1facaf9be908ca6558e59 ] The qmp_usb_iomap() helper function currently returns the raw result of devm_ioremap() for non-exclusive mappings. Since devm_ioremap() may return a NULL pointer and the caller only checks error pointers with IS_ERR(), NULL could bypass the check and lead to an invalid dereference. Fix the issue by checking if devm_ioremap() returns NULL. When it does, qmp_usb_iomap() now returns an error pointer via IOMEM_ERR_PTR(-ENOMEM), ensuring safe and consistent error handling. Signed-off-by: Chenyuan Yang Fixes: a5d6b1ac56cb ("phy: qcom-qmp-usb: fix memleak on probe deferral") CC: Johan Hovold CC: Krzysztof Kozlowski Reviewed-by: Johan Hovold Reviewed-by: Dmitry Baryshkov Link: https://lore.kernel.org/r/20250414125050.2118619-1-chenyuan0y@gmail.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/phy/qualcomm/phy-qcom-qmp-usb.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-usb.c b/drivers/phy/qualcomm/phy-qcom-qmp-usb.c index 8e2cd2c178d6b..c12efd127a612 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-usb.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-usb.c @@ -2044,12 +2044,16 @@ static void __iomem *qmp_usb_iomap(struct device *dev, struct device_node *np, int index, bool exclusive) { struct resource res; + void __iomem *mem; if (!exclusive) { if (of_address_to_resource(np, index, &res)) return IOMEM_ERR_PTR(-EINVAL); - return devm_ioremap(dev, res.start, resource_size(&res)); + mem = devm_ioremap(dev, res.start, resource_size(&res)); + if (!mem) + return IOMEM_ERR_PTR(-ENOMEM); + return mem; } return devm_of_iomap(dev, np, index, NULL); -- GitLab From bc6ddff79835f71310a21645d8fcf08ec473e969 Mon Sep 17 00:00:00 2001 From: Henry Martin Date: Wed, 2 Apr 2025 10:39:00 +0800 Subject: [PATCH 1018/2211] dmaengine: ti: Add NULL check in udma_probe() [ Upstream commit fd447415e74bccd7362f760d4ea727f8e1ebfe91 ] devm_kasprintf() returns NULL when memory allocation fails. Currently, udma_probe() does not check for this case, which results in a NULL pointer dereference. Add NULL check after devm_kasprintf() to prevent this issue. Fixes: 25dcb5dd7b7c ("dmaengine: ti: New driver for K3 UDMA") Signed-off-by: Henry Martin Reviewed-by: Nathan Lynch Acked-by: Peter Ujfalusi Link: https://lore.kernel.org/r/20250402023900.43440-1-bsdhenrymartin@gmail.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/dma/ti/k3-udma.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/dma/ti/k3-udma.c b/drivers/dma/ti/k3-udma.c index 7d89385c3c450..38b54719587cf 100644 --- a/drivers/dma/ti/k3-udma.c +++ b/drivers/dma/ti/k3-udma.c @@ -5572,7 +5572,8 @@ static int udma_probe(struct platform_device *pdev) uc->config.dir = DMA_MEM_TO_MEM; uc->name = devm_kasprintf(dev, GFP_KERNEL, "%s chan%d", dev_name(dev), i); - + if (!uc->name) + return -ENOMEM; vchan_init(&uc->vc, &ud->ddev); /* Use custom vchan completion handling */ tasklet_setup(&uc->vc.task, udma_vchan_complete); -- GitLab From 3d159ffc160f06727668c0e7596e62a518517c26 Mon Sep 17 00:00:00 2001 From: Zhe Qiao Date: Wed, 30 Apr 2025 14:06:03 +0800 Subject: [PATCH 1019/2211] PCI/ACPI: Fix allocated memory release on error in pci_acpi_scan_root() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 631b2af2f35737750af284be22e63da56bf20139 ] In the pci_acpi_scan_root() function, when creating a PCI bus fails, we need to free up the previously allocated memory, which can avoid invalid memory usage and save resources. Fixes: 789befdfa389 ("arm64: PCI: Migrate ACPI related functions to pci-acpi.c") Signed-off-by: Zhe Qiao [kwilczynski: commit log] Signed-off-by: Krzysztof Wilczyński Acked-by: Rafael J. Wysocki Link: https://lore.kernel.org/r/20250430060603.381504-1-qiaozhe@iscas.ac.cn Signed-off-by: Sasha Levin --- drivers/pci/pci-acpi.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index af370628e5839..b78e0e4173244 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c @@ -1676,24 +1676,19 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) return NULL; root_ops = kzalloc(sizeof(*root_ops), GFP_KERNEL); - if (!root_ops) { - kfree(ri); - return NULL; - } + if (!root_ops) + goto free_ri; ri->cfg = pci_acpi_setup_ecam_mapping(root); - if (!ri->cfg) { - kfree(ri); - kfree(root_ops); - return NULL; - } + if (!ri->cfg) + goto free_root_ops; root_ops->release_info = pci_acpi_generic_release_info; root_ops->prepare_resources = pci_acpi_root_prepare_resources; root_ops->pci_ops = (struct pci_ops *)&ri->cfg->ops->pci_ops; bus = acpi_pci_root_create(root, root_ops, &ri->common, ri->cfg); if (!bus) - return NULL; + goto free_cfg; /* If we must preserve the resource configuration, claim now */ host = pci_find_host_bridge(bus); @@ -1710,6 +1705,14 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) pcie_bus_configure_settings(child); return bus; + +free_cfg: + pci_ecam_free(ri->cfg); +free_root_ops: + kfree(root_ops); +free_ri: + kfree(ri); + return NULL; } void pcibios_add_bus(struct pci_bus *bus) -- GitLab From 642962fe3f737816b96818f6630fcb2d53d236cf Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Thu, 22 May 2025 18:21:07 -0500 Subject: [PATCH 1020/2211] PCI/DPC: Initialize aer_err_info before using it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit a424b598e6a6c1e69a2bb801d6fd16e805ab2c38 ] Previously the struct aer_err_info "info" was allocated on the stack without being initialized, so it contained junk except for the fields we explicitly set later. Initialize "info" at declaration so it starts as all zeros. Fixes: 8aefa9b0d910 ("PCI/DPC: Print AER status in DPC event handling") Signed-off-by: Bjorn Helgaas Tested-by: Krzysztof Wilczyński Reviewed-by: Kuppuswamy Sathyanarayanan Reviewed-by: Ilpo Järvinen Reviewed-by: Jonathan Cameron Link: https://patch.msgid.link/20250522232339.1525671-2-helgaas@kernel.org Signed-off-by: Sasha Levin --- drivers/pci/pcie/dpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c index 2b6ef7efa3c11..8096e4858553e 100644 --- a/drivers/pci/pcie/dpc.c +++ b/drivers/pci/pcie/dpc.c @@ -260,7 +260,7 @@ static int dpc_get_aer_uncorrect_severity(struct pci_dev *dev, void dpc_process_error(struct pci_dev *pdev) { u16 cap = pdev->dpc_cap, status, source, reason, ext_reason; - struct aer_err_info info; + struct aer_err_info info = {}; pci_read_config_word(pdev, cap + PCI_EXP_DPC_STATUS, &status); pci_read_config_word(pdev, cap + PCI_EXP_DPC_SOURCE_ID, &source); -- GitLab From 7b264700708e51a28d5017f7a1ef62d9e1efef75 Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Thu, 22 May 2025 18:21:08 -0500 Subject: [PATCH 1021/2211] PCI/DPC: Log Error Source ID only when valid MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit a0b62cc310239c7f1323fb20bd3789f21bdd8615 ] DPC Error Source ID is only valid when the DPC Trigger Reason indicates that DPC was triggered due to reception of an ERR_NONFATAL or ERR_FATAL Message (PCIe r6.0, sec 7.9.14.5). When DPC was triggered by ERR_NONFATAL (PCI_EXP_DPC_STATUS_TRIGGER_RSN_NFE) or ERR_FATAL (PCI_EXP_DPC_STATUS_TRIGGER_RSN_FE) from a downstream device, log the Error Source ID (decoded into domain/bus/device/function). Don't print the source otherwise, since it's not valid. For DPC trigger due to reception of ERR_NONFATAL or ERR_FATAL, the dmesg logging changes: - pci 0000:00:01.0: DPC: containment event, status:0x000d source:0x0200 - pci 0000:00:01.0: DPC: ERR_FATAL detected + pci 0000:00:01.0: DPC: containment event, status:0x000d, ERR_FATAL received from 0000:02:00.0 and when DPC triggered for other reasons, where DPC Error Source ID is undefined, e.g., unmasked uncorrectable error: - pci 0000:00:01.0: DPC: containment event, status:0x0009 source:0x0200 - pci 0000:00:01.0: DPC: unmasked uncorrectable error detected + pci 0000:00:01.0: DPC: containment event, status:0x0009: unmasked uncorrectable error detected Previously the "containment event" message was at KERN_INFO and the "%s detected" message was at KERN_WARNING. Now the single message is at KERN_WARNING. Fixes: 26e515713342 ("PCI: Add Downstream Port Containment driver") Signed-off-by: Bjorn Helgaas Tested-by: Krzysztof Wilczyński Reviewed-by: Kuppuswamy Sathyanarayanan Reviewed-by: Jonathan Cameron Reviewed-by: Ilpo Järvinen Link: https://patch.msgid.link/20250522232339.1525671-3-helgaas@kernel.org Signed-off-by: Sasha Levin --- drivers/pci/pcie/dpc.c | 66 +++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c index 8096e4858553e..cdc54315d879f 100644 --- a/drivers/pci/pcie/dpc.c +++ b/drivers/pci/pcie/dpc.c @@ -263,37 +263,45 @@ void dpc_process_error(struct pci_dev *pdev) struct aer_err_info info = {}; pci_read_config_word(pdev, cap + PCI_EXP_DPC_STATUS, &status); - pci_read_config_word(pdev, cap + PCI_EXP_DPC_SOURCE_ID, &source); - - pci_info(pdev, "containment event, status:%#06x source:%#06x\n", - status, source); reason = status & PCI_EXP_DPC_STATUS_TRIGGER_RSN; - ext_reason = status & PCI_EXP_DPC_STATUS_TRIGGER_RSN_EXT; - pci_warn(pdev, "%s detected\n", - (reason == PCI_EXP_DPC_STATUS_TRIGGER_RSN_UNCOR) ? - "unmasked uncorrectable error" : - (reason == PCI_EXP_DPC_STATUS_TRIGGER_RSN_NFE) ? - "ERR_NONFATAL" : - (reason == PCI_EXP_DPC_STATUS_TRIGGER_RSN_FE) ? - "ERR_FATAL" : - (ext_reason == PCI_EXP_DPC_STATUS_TRIGGER_RSN_RP_PIO) ? - "RP PIO error" : - (ext_reason == PCI_EXP_DPC_STATUS_TRIGGER_RSN_SW_TRIGGER) ? - "software trigger" : - "reserved error"); - - /* show RP PIO error detail information */ - if (pdev->dpc_rp_extensions && - reason == PCI_EXP_DPC_STATUS_TRIGGER_RSN_IN_EXT && - ext_reason == PCI_EXP_DPC_STATUS_TRIGGER_RSN_RP_PIO) - dpc_process_rp_pio_error(pdev); - else if (reason == PCI_EXP_DPC_STATUS_TRIGGER_RSN_UNCOR && - dpc_get_aer_uncorrect_severity(pdev, &info) && - aer_get_device_error_info(pdev, &info)) { - aer_print_error(pdev, &info); - pci_aer_clear_nonfatal_status(pdev); - pci_aer_clear_fatal_status(pdev); + + switch (reason) { + case PCI_EXP_DPC_STATUS_TRIGGER_RSN_UNCOR: + pci_warn(pdev, "containment event, status:%#06x: unmasked uncorrectable error detected\n", + status); + if (dpc_get_aer_uncorrect_severity(pdev, &info) && + aer_get_device_error_info(pdev, &info)) { + aer_print_error(pdev, &info); + pci_aer_clear_nonfatal_status(pdev); + pci_aer_clear_fatal_status(pdev); + } + break; + case PCI_EXP_DPC_STATUS_TRIGGER_RSN_NFE: + case PCI_EXP_DPC_STATUS_TRIGGER_RSN_FE: + pci_read_config_word(pdev, cap + PCI_EXP_DPC_SOURCE_ID, + &source); + pci_warn(pdev, "containment event, status:%#06x, %s received from %04x:%02x:%02x.%d\n", + status, + (reason == PCI_EXP_DPC_STATUS_TRIGGER_RSN_FE) ? + "ERR_FATAL" : "ERR_NONFATAL", + pci_domain_nr(pdev->bus), PCI_BUS_NUM(source), + PCI_SLOT(source), PCI_FUNC(source)); + break; + case PCI_EXP_DPC_STATUS_TRIGGER_RSN_IN_EXT: + ext_reason = status & PCI_EXP_DPC_STATUS_TRIGGER_RSN_EXT; + pci_warn(pdev, "containment event, status:%#06x: %s detected\n", + status, + (ext_reason == PCI_EXP_DPC_STATUS_TRIGGER_RSN_RP_PIO) ? + "RP PIO error" : + (ext_reason == PCI_EXP_DPC_STATUS_TRIGGER_RSN_SW_TRIGGER) ? + "software trigger" : + "reserved error"); + /* show RP PIO error detail information */ + if (ext_reason == PCI_EXP_DPC_STATUS_TRIGGER_RSN_RP_PIO && + pdev->dpc_rp_extensions) + dpc_process_rp_pio_error(pdev); + break; } } -- GitLab From 9137bd312b288c98dcd2385f4b4eb16b69cbc504 Mon Sep 17 00:00:00 2001 From: Liu Dalin Date: Fri, 9 May 2025 16:44:16 +0800 Subject: [PATCH 1022/2211] rtc: loongson: Add missing alarm notifications for ACPI RTC events [ Upstream commit 5af9f1fa576874b24627d4c05e3a84672204c200 ] When an application sets and enables an alarm on Loongson RTC devices, the alarm notification fails to propagate to userspace because the ACPI event handler omits calling rtc_update_irq(). As a result, processes waiting via select() or poll() on RTC device files fail to receive alarm notifications. The ACPI interrupt is also triggered multiple times. In loongson_rtc_handler, we need to clear TOY_MATCH0_REG to resolve this issue. Fixes: 09471d8f5b39 ("rtc: loongson: clear TOY_MATCH0_REG in loongson_rtc_isr()") Fixes: 1b733a9ebc3d ("rtc: Add rtc driver for the Loongson family chips") Signed-off-by: Liu Dalin Reviewed-by: Binbin Zhou Link: https://lore.kernel.org/r/20250509084416.7979-1-liudalin@kylinsec.com.cn Signed-off-by: Alexandre Belloni Signed-off-by: Sasha Levin --- drivers/rtc/rtc-loongson.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/rtc/rtc-loongson.c b/drivers/rtc/rtc-loongson.c index 90e9d97a86b48..c9d5b91a6544d 100644 --- a/drivers/rtc/rtc-loongson.c +++ b/drivers/rtc/rtc-loongson.c @@ -129,6 +129,14 @@ static u32 loongson_rtc_handler(void *id) { struct loongson_rtc_priv *priv = (struct loongson_rtc_priv *)id; + rtc_update_irq(priv->rtcdev, 1, RTC_AF | RTC_IRQF); + + /* + * The TOY_MATCH0_REG should be cleared 0 here, + * otherwise the interrupt cannot be cleared. + */ + regmap_write(priv->regmap, TOY_MATCH0_REG, 0); + spin_lock(&priv->lock); /* Disable RTC alarm wakeup and interrupt */ writel(readl(priv->pm_base + PM1_EN_REG) & ~RTC_EN, -- GitLab From 0a3e2ec5085a31ab0e2d5b86bd8b1f1ef061a994 Mon Sep 17 00:00:00 2001 From: Jerome Brunet Date: Thu, 24 Apr 2025 10:34:04 +0200 Subject: [PATCH 1023/2211] PCI: endpoint: Retain fixed-size BAR size as well as aligned size [ Upstream commit 793908d60b8745c386b9f4e29eb702f74ceb0886 ] When allocating space for an endpoint function on a BAR with a fixed size, the size saved in 'struct pci_epf_bar.size' should be the fixed size as expected by pci_epc_set_bar(). However, if pci_epf_alloc_space() increased the allocation size to accommodate iATU alignment requirements, it previously saved the larger aligned size in .size, which broke pci_epc_set_bar(). To solve this, keep the fixed BAR size in .size and save the aligned size in a new .aligned_size for use when deallocating it. Fixes: 2a9a801620ef ("PCI: endpoint: Add support to specify alignment for buffers allocated to BARs") Signed-off-by: Jerome Brunet [mani: commit message fixup] Signed-off-by: Manivannan Sadhasivam [bhelgaas: more specific subject, commit log, wrap comment to match file] Signed-off-by: Bjorn Helgaas Reviewed-by: Niklas Cassel Link: https://patch.msgid.link/20250424-pci-ep-size-alignment-v5-1-2d4ec2af23f5@baylibre.com Signed-off-by: Sasha Levin --- drivers/pci/endpoint/pci-epf-core.c | 22 +++++++++++++++------- include/linux/pci-epf.h | 3 +++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/drivers/pci/endpoint/pci-epf-core.c b/drivers/pci/endpoint/pci-epf-core.c index 50bc2892a36c5..963d2f3aa5d47 100644 --- a/drivers/pci/endpoint/pci-epf-core.c +++ b/drivers/pci/endpoint/pci-epf-core.c @@ -236,12 +236,13 @@ void pci_epf_free_space(struct pci_epf *epf, void *addr, enum pci_barno bar, } dev = epc->dev.parent; - dma_free_coherent(dev, epf_bar[bar].size, addr, + dma_free_coherent(dev, epf_bar[bar].aligned_size, addr, epf_bar[bar].phys_addr); epf_bar[bar].phys_addr = 0; epf_bar[bar].addr = NULL; epf_bar[bar].size = 0; + epf_bar[bar].aligned_size = 0; epf_bar[bar].barno = 0; epf_bar[bar].flags = 0; } @@ -264,7 +265,7 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar, enum pci_epc_interface_type type) { u64 bar_fixed_size = epc_features->bar[bar].fixed_size; - size_t align = epc_features->align; + size_t aligned_size, align = epc_features->align; struct pci_epf_bar *epf_bar; dma_addr_t phys_addr; struct pci_epc *epc; @@ -281,12 +282,18 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar, return NULL; } size = bar_fixed_size; + } else { + /* BAR size must be power of two */ + size = roundup_pow_of_two(size); } - if (align) - size = ALIGN(size, align); - else - size = roundup_pow_of_two(size); + /* + * Allocate enough memory to accommodate the iATU alignment + * requirement. In most cases, this will be the same as .size but + * it might be different if, for example, the fixed size of a BAR + * is smaller than align. + */ + aligned_size = align ? ALIGN(size, align) : size; if (type == PRIMARY_INTERFACE) { epc = epf->epc; @@ -297,7 +304,7 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar, } dev = epc->dev.parent; - space = dma_alloc_coherent(dev, size, &phys_addr, GFP_KERNEL); + space = dma_alloc_coherent(dev, aligned_size, &phys_addr, GFP_KERNEL); if (!space) { dev_err(dev, "failed to allocate mem space\n"); return NULL; @@ -306,6 +313,7 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar, epf_bar[bar].phys_addr = phys_addr; epf_bar[bar].addr = space; epf_bar[bar].size = size; + epf_bar[bar].aligned_size = aligned_size; epf_bar[bar].barno = bar; if (upper_32_bits(size) || epc_features->bar[bar].only_64bit) epf_bar[bar].flags |= PCI_BASE_ADDRESS_MEM_TYPE_64; diff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h index 18a3aeb62ae4e..cd6f8f4bc4540 100644 --- a/include/linux/pci-epf.h +++ b/include/linux/pci-epf.h @@ -114,6 +114,8 @@ struct pci_epf_driver { * @phys_addr: physical address that should be mapped to the BAR * @addr: virtual address corresponding to the @phys_addr * @size: the size of the address space present in BAR + * @aligned_size: the size actually allocated to accommodate the iATU alignment + * requirement * @barno: BAR number * @flags: flags that are set for the BAR */ @@ -121,6 +123,7 @@ struct pci_epf_bar { dma_addr_t phys_addr; void *addr; size_t size; + size_t aligned_size; enum pci_barno barno; int flags; }; -- GitLab From d4c368e4a638ddf4a9d6d687b0ff691aa46cce53 Mon Sep 17 00:00:00 2001 From: Lad Prabhakar Date: Mon, 7 Apr 2025 11:50:02 +0100 Subject: [PATCH 1024/2211] usb: renesas_usbhs: Reorder clock handling and power management in probe [ Upstream commit ffb34a60ce86656ba12d46e91f1ccc71dd221251 ] Reorder the initialization sequence in `usbhs_probe()` to enable runtime PM before accessing registers, preventing potential crashes due to uninitialized clocks. Currently, in the probe path, registers are accessed before enabling the clocks, leading to a synchronous external abort on the RZ/V2H SoC. The problematic call flow is as follows: usbhs_probe() usbhs_sys_clock_ctrl() usbhs_bset() usbhs_write() iowrite16() <-- Register access before enabling clocks Since `iowrite16()` is performed without ensuring the required clocks are enabled, this can lead to access errors. To fix this, enable PM runtime early in the probe function and ensure clocks are acquired before register access, preventing crashes like the following on RZ/V2H: [13.272640] Internal error: synchronous external abort: 0000000096000010 [#1] PREEMPT SMP [13.280814] Modules linked in: cec renesas_usbhs(+) drm_kms_helper fuse drm backlight ipv6 [13.289088] CPU: 1 UID: 0 PID: 195 Comm: (udev-worker) Not tainted 6.14.0-rc7+ #98 [13.296640] Hardware name: Renesas RZ/V2H EVK Board based on r9a09g057h44 (DT) [13.303834] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) [13.310770] pc : usbhs_bset+0x14/0x4c [renesas_usbhs] [13.315831] lr : usbhs_probe+0x2e4/0x5ac [renesas_usbhs] [13.321138] sp : ffff8000827e3850 [13.324438] x29: ffff8000827e3860 x28: 0000000000000000 x27: ffff8000827e3ca0 [13.331554] x26: ffff8000827e3ba0 x25: ffff800081729668 x24: 0000000000000025 [13.338670] x23: ffff0000c0f08000 x22: 0000000000000000 x21: ffff0000c0f08010 [13.345783] x20: 0000000000000000 x19: ffff0000c3b52080 x18: 00000000ffffffff [13.352895] x17: 0000000000000000 x16: 0000000000000000 x15: ffff8000827e36ce [13.360009] x14: 00000000000003d7 x13: 00000000000003d7 x12: 0000000000000000 [13.367122] x11: 0000000000000000 x10: 0000000000000aa0 x9 : ffff8000827e3750 [13.374235] x8 : ffff0000c1850b00 x7 : 0000000003826060 x6 : 000000000000001c [13.381347] x5 : 000000030d5fcc00 x4 : ffff8000825c0000 x3 : 0000000000000000 [13.388459] x2 : 0000000000000400 x1 : 0000000000000000 x0 : ffff0000c3b52080 [13.395574] Call trace: [13.398013] usbhs_bset+0x14/0x4c [renesas_usbhs] (P) [13.403076] platform_probe+0x68/0xdc [13.406738] really_probe+0xbc/0x2c0 [13.410306] __driver_probe_device+0x78/0x120 [13.414653] driver_probe_device+0x3c/0x154 [13.418825] __driver_attach+0x90/0x1a0 [13.422647] bus_for_each_dev+0x7c/0xe0 [13.426470] driver_attach+0x24/0x30 [13.430032] bus_add_driver+0xe4/0x208 [13.433766] driver_register+0x68/0x130 [13.437587] __platform_driver_register+0x24/0x30 [13.442273] renesas_usbhs_driver_init+0x20/0x1000 [renesas_usbhs] [13.448450] do_one_initcall+0x60/0x1d4 [13.452276] do_init_module+0x54/0x1f8 [13.456014] load_module+0x1754/0x1c98 [13.459750] init_module_from_file+0x88/0xcc [13.464004] __arm64_sys_finit_module+0x1c4/0x328 [13.468689] invoke_syscall+0x48/0x104 [13.472426] el0_svc_common.constprop.0+0xc0/0xe0 [13.477113] do_el0_svc+0x1c/0x28 [13.480415] el0_svc+0x30/0xcc [13.483460] el0t_64_sync_handler+0x10c/0x138 [13.487800] el0t_64_sync+0x198/0x19c [13.491453] Code: 2a0103e1 12003c42 12003c63 8b010084 (79400084) [13.497522] ---[ end trace 0000000000000000 ]--- Fixes: f1407d5c66240 ("usb: renesas_usbhs: Add Renesas USBHS common code") Signed-off-by: Lad Prabhakar Reviewed-by: Yoshihiro Shimoda Tested-by: Yoshihiro Shimoda Link: https://lore.kernel.org/r/20250407105002.107181-4-prabhakar.mahadev-lad.rj@bp.renesas.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/renesas_usbhs/common.c | 50 +++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/drivers/usb/renesas_usbhs/common.c b/drivers/usb/renesas_usbhs/common.c index 7324de52d9505..161786e9b7e47 100644 --- a/drivers/usb/renesas_usbhs/common.c +++ b/drivers/usb/renesas_usbhs/common.c @@ -685,10 +685,29 @@ static int usbhs_probe(struct platform_device *pdev) INIT_DELAYED_WORK(&priv->notify_hotplug_work, usbhsc_notify_hotplug); spin_lock_init(usbhs_priv_to_lock(priv)); + /* + * Acquire clocks and enable power management (PM) early in the + * probe process, as the driver accesses registers during + * initialization. Ensure the device is active before proceeding. + */ + pm_runtime_enable(dev); + + ret = usbhsc_clk_get(dev, priv); + if (ret) + goto probe_pm_disable; + + ret = pm_runtime_resume_and_get(dev); + if (ret) + goto probe_clk_put; + + ret = usbhsc_clk_prepare_enable(priv); + if (ret) + goto probe_pm_put; + /* call pipe and module init */ ret = usbhs_pipe_probe(priv); if (ret < 0) - return ret; + goto probe_clk_dis_unprepare; ret = usbhs_fifo_probe(priv); if (ret < 0) @@ -705,10 +724,6 @@ static int usbhs_probe(struct platform_device *pdev) if (ret) goto probe_fail_rst; - ret = usbhsc_clk_get(dev, priv); - if (ret) - goto probe_fail_clks; - /* * deviece reset here because * USB device might be used in boot loader. @@ -721,7 +736,7 @@ static int usbhs_probe(struct platform_device *pdev) if (ret) { dev_warn(dev, "USB function not selected (GPIO)\n"); ret = -ENOTSUPP; - goto probe_end_mod_exit; + goto probe_assert_rest; } } @@ -735,14 +750,19 @@ static int usbhs_probe(struct platform_device *pdev) ret = usbhs_platform_call(priv, hardware_init, pdev); if (ret < 0) { dev_err(dev, "platform init failed.\n"); - goto probe_end_mod_exit; + goto probe_assert_rest; } /* reset phy for connection */ usbhs_platform_call(priv, phy_reset, pdev); - /* power control */ - pm_runtime_enable(dev); + /* + * Disable the clocks that were enabled earlier in the probe path, + * and let the driver handle the clocks beyond this point. + */ + usbhsc_clk_disable_unprepare(priv); + pm_runtime_put(dev); + if (!usbhs_get_dparam(priv, runtime_pwctrl)) { usbhsc_power_ctrl(priv, 1); usbhs_mod_autonomy_mode(priv); @@ -759,9 +779,7 @@ static int usbhs_probe(struct platform_device *pdev) return ret; -probe_end_mod_exit: - usbhsc_clk_put(priv); -probe_fail_clks: +probe_assert_rest: reset_control_assert(priv->rsts); probe_fail_rst: usbhs_mod_remove(priv); @@ -769,6 +787,14 @@ probe_end_fifo_exit: usbhs_fifo_remove(priv); probe_end_pipe_exit: usbhs_pipe_remove(priv); +probe_clk_dis_unprepare: + usbhsc_clk_disable_unprepare(priv); +probe_pm_put: + pm_runtime_put(dev); +probe_clk_put: + usbhsc_clk_put(priv); +probe_pm_disable: + pm_runtime_disable(dev); dev_info(dev, "probe failed (%d)\n", ret); -- GitLab From c23d87b43f7dba5eb12820f6cf21a1cd4f63eb3d Mon Sep 17 00:00:00 2001 From: Henry Martin Date: Thu, 3 Apr 2025 15:03:39 +0800 Subject: [PATCH 1025/2211] serial: Fix potential null-ptr-deref in mlb_usio_probe() [ Upstream commit 86bcae88c9209e334b2f8c252f4cc66beb261886 ] devm_ioremap() can return NULL on error. Currently, mlb_usio_probe() does not check for this case, which could result in a NULL pointer dereference. Add NULL check after devm_ioremap() to prevent this issue. Fixes: ba44dc043004 ("serial: Add Milbeaut serial control") Signed-off-by: Henry Martin Link: https://lore.kernel.org/r/20250403070339.64990-1-bsdhenrymartin@gmail.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/tty/serial/milbeaut_usio.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/milbeaut_usio.c b/drivers/tty/serial/milbeaut_usio.c index fb082ee73d5b2..9b54f017f2e8a 100644 --- a/drivers/tty/serial/milbeaut_usio.c +++ b/drivers/tty/serial/milbeaut_usio.c @@ -523,7 +523,10 @@ static int mlb_usio_probe(struct platform_device *pdev) } port->membase = devm_ioremap(&pdev->dev, res->start, resource_size(res)); - + if (!port->membase) { + ret = -ENOMEM; + goto failed; + } ret = platform_get_irq_byname(pdev, "rx"); mlb_usio_irq[index][RX] = ret; -- GitLab From 74aca5ca341de6b8ebe91f54925eea2c911de33f Mon Sep 17 00:00:00 2001 From: Mario Limonciello Date: Fri, 11 Apr 2025 10:14:44 -0500 Subject: [PATCH 1026/2211] thunderbolt: Fix a logic error in wake on connect [ Upstream commit 1a760d10ded372d113a0410c42be246315bbc2ff ] commit a5cfc9d65879c ("thunderbolt: Add wake on connect/disconnect on USB4 ports") introduced a sysfs file to control wake up policy for a given USB4 port that defaulted to disabled. However when testing commit 4bfeea6ec1c02 ("thunderbolt: Use wake on connect and disconnect over suspend") I found that it was working even without making changes to the power/wakeup file (which defaults to disabled). This is because of a logic error doing a bitwise or of the wake-on-connect flag with device_may_wakeup() which should have been a logical AND. Adjust the logic so that policy is only applied when wakeup is actually enabled. Fixes: a5cfc9d65879c ("thunderbolt: Add wake on connect/disconnect on USB4 ports") Signed-off-by: Mario Limonciello Signed-off-by: Mika Westerberg Signed-off-by: Sasha Levin --- drivers/thunderbolt/usb4.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/thunderbolt/usb4.c b/drivers/thunderbolt/usb4.c index 402fdf8b1cdec..57821b6f4e468 100644 --- a/drivers/thunderbolt/usb4.c +++ b/drivers/thunderbolt/usb4.c @@ -440,10 +440,10 @@ int usb4_switch_set_wake(struct tb_switch *sw, unsigned int flags) bool configured = val & PORT_CS_19_PC; usb4 = port->usb4; - if (((flags & TB_WAKE_ON_CONNECT) | + if (((flags & TB_WAKE_ON_CONNECT) && device_may_wakeup(&usb4->dev)) && !configured) val |= PORT_CS_19_WOC; - if (((flags & TB_WAKE_ON_DISCONNECT) | + if (((flags & TB_WAKE_ON_DISCONNECT) && device_may_wakeup(&usb4->dev)) && configured) val |= PORT_CS_19_WOD; if ((flags & TB_WAKE_ON_USB4) && configured) -- GitLab From ba9a3d356bfb8a60d72604001b1cf3d1544f7f30 Mon Sep 17 00:00:00 2001 From: Sam Winchenbach Date: Fri, 28 Mar 2025 13:48:27 -0400 Subject: [PATCH 1027/2211] iio: filter: admv8818: fix band 4, state 15 [ Upstream commit ef0ce24f590ac075d5eda11f2d6434b303333ed6 ] Corrects the upper range of LPF Band 4 from 18.5 GHz to 18.85 GHz per the ADMV8818 datasheet Fixes: f34fe888ad05 ("iio:filter:admv8818: add support for ADMV8818") Signed-off-by: Sam Winchenbach Link: https://patch.msgid.link/20250328174831.227202-3-sam.winchenbach@framepointer.org Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/filter/admv8818.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/iio/filter/admv8818.c b/drivers/iio/filter/admv8818.c index d85b7d3de8660..3d8740caa1455 100644 --- a/drivers/iio/filter/admv8818.c +++ b/drivers/iio/filter/admv8818.c @@ -103,7 +103,7 @@ static const unsigned long long freq_range_lpf[4][2] = { {2050000000ULL, 3850000000ULL}, {3350000000ULL, 7250000000ULL}, {7000000000, 13000000000}, - {12550000000, 18500000000} + {12550000000, 18850000000} }; static const struct regmap_config admv8818_regmap_config = { -- GitLab From c065694b8d5b039350e32c7eda79e14baba1743d Mon Sep 17 00:00:00 2001 From: Sam Winchenbach Date: Fri, 28 Mar 2025 13:48:28 -0400 Subject: [PATCH 1028/2211] iio: filter: admv8818: fix integer overflow [ Upstream commit fb6009a28d77edec4eb548b5875dae8c79b88467 ] HZ_PER_MHZ is only unsigned long. This math overflows, leading to incorrect results. Fixes: f34fe888ad05 ("iio:filter:admv8818: add support for ADMV8818") Signed-off-by: Sam Winchenbach Link: https://patch.msgid.link/20250328174831.227202-4-sam.winchenbach@framepointer.org Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/filter/admv8818.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/iio/filter/admv8818.c b/drivers/iio/filter/admv8818.c index 3d8740caa1455..cd3aff9a2f7bf 100644 --- a/drivers/iio/filter/admv8818.c +++ b/drivers/iio/filter/admv8818.c @@ -154,7 +154,7 @@ static int __admv8818_hpf_select(struct admv8818_state *st, u64 freq) } /* Close HPF frequency gap between 12 and 12.5 GHz */ - if (freq >= 12000 * HZ_PER_MHZ && freq <= 12500 * HZ_PER_MHZ) { + if (freq >= 12000ULL * HZ_PER_MHZ && freq < 12500ULL * HZ_PER_MHZ) { hpf_band = 3; hpf_step = 15; } -- GitLab From 5bd5808b36e2c6b15627bbdff0e316404d8837fe Mon Sep 17 00:00:00 2001 From: Sam Winchenbach Date: Fri, 28 Mar 2025 13:48:29 -0400 Subject: [PATCH 1029/2211] iio: filter: admv8818: fix range calculation [ Upstream commit d542db7095d322bfcdc8e306db6f8c48358c9619 ] Search for the minimum error while ensuring that the LPF corner frequency is greater than the target, and the HPF corner frequency is lower than the target This fixes issues where the range calculations were suboptimal. Add two new DTS properties to set the margin between the input frequency and the calculated corner frequency Below is a generated table of the differences between the old algorithm and the new. This is a sweep from 0 to 20 GHz in 10 MHz steps. === HPF === freq = 1750 MHz, 3db: bypass => 1750 MHz freq = 3400 MHz, 3db: 3310 => 3400 MHz freq = 3410 MHz, 3db: 3310 => 3400 MHz freq = 3420 MHz, 3db: 3310 => 3400 MHz freq = 3660 MHz, 3db: 3550 => 3656 MHz freq = 6600 MHz, 3db: 6479 => 6600 MHz freq = 6610 MHz, 3db: 6479 => 6600 MHz freq = 6620 MHz, 3db: 6479 => 6600 MHz freq = 6630 MHz, 3db: 6479 => 6600 MHz freq = 6640 MHz, 3db: 6479 => 6600 MHz freq = 6650 MHz, 3db: 6479 => 6600 MHz freq = 6660 MHz, 3db: 6479 => 6600 MHz freq = 6670 MHz, 3db: 6479 => 6600 MHz freq = 6680 MHz, 3db: 6479 => 6600 MHz freq = 6690 MHz, 3db: 6479 => 6600 MHz freq = 6700 MHz, 3db: 6479 => 6600 MHz freq = 6710 MHz, 3db: 6479 => 6600 MHz freq = 6720 MHz, 3db: 6479 => 6600 MHz freq = 6730 MHz, 3db: 6479 => 6600 MHz freq = 6960 MHz, 3db: 6736 => 6960 MHz freq = 6970 MHz, 3db: 6736 => 6960 MHz freq = 6980 MHz, 3db: 6736 => 6960 MHz freq = 6990 MHz, 3db: 6736 => 6960 MHz freq = 7320 MHz, 3db: 7249 => 7320 MHz freq = 7330 MHz, 3db: 7249 => 7320 MHz freq = 7340 MHz, 3db: 7249 => 7320 MHz freq = 7350 MHz, 3db: 7249 => 7320 MHz freq = 7360 MHz, 3db: 7249 => 7320 MHz freq = 7370 MHz, 3db: 7249 => 7320 MHz freq = 7380 MHz, 3db: 7249 => 7320 MHz freq = 7390 MHz, 3db: 7249 => 7320 MHz freq = 7400 MHz, 3db: 7249 => 7320 MHz freq = 7410 MHz, 3db: 7249 => 7320 MHz freq = 7420 MHz, 3db: 7249 => 7320 MHz freq = 7430 MHz, 3db: 7249 => 7320 MHz freq = 7440 MHz, 3db: 7249 => 7320 MHz freq = 7450 MHz, 3db: 7249 => 7320 MHz freq = 7460 MHz, 3db: 7249 => 7320 MHz freq = 7470 MHz, 3db: 7249 => 7320 MHz freq = 7480 MHz, 3db: 7249 => 7320 MHz freq = 7490 MHz, 3db: 7249 => 7320 MHz freq = 7500 MHz, 3db: 7249 => 7320 MHz freq = 12500 MHz, 3db: 12000 => 12500 MHz === LPF === freq = 2050 MHz, 3db: bypass => 2050 MHz freq = 2170 MHz, 3db: 2290 => 2170 MHz freq = 2290 MHz, 3db: 2410 => 2290 MHz freq = 2410 MHz, 3db: 2530 => 2410 MHz freq = 2530 MHz, 3db: 2650 => 2530 MHz freq = 2650 MHz, 3db: 2770 => 2650 MHz freq = 2770 MHz, 3db: 2890 => 2770 MHz freq = 2890 MHz, 3db: 3010 => 2890 MHz freq = 3010 MHz, 3db: 3130 => 3010 MHz freq = 3130 MHz, 3db: 3250 => 3130 MHz freq = 3250 MHz, 3db: 3370 => 3250 MHz freq = 3260 MHz, 3db: 3370 => 3350 MHz freq = 3270 MHz, 3db: 3370 => 3350 MHz freq = 3280 MHz, 3db: 3370 => 3350 MHz freq = 3290 MHz, 3db: 3370 => 3350 MHz freq = 3300 MHz, 3db: 3370 => 3350 MHz freq = 3310 MHz, 3db: 3370 => 3350 MHz freq = 3320 MHz, 3db: 3370 => 3350 MHz freq = 3330 MHz, 3db: 3370 => 3350 MHz freq = 3340 MHz, 3db: 3370 => 3350 MHz freq = 3350 MHz, 3db: 3370 => 3350 MHz freq = 3370 MHz, 3db: 3490 => 3370 MHz freq = 3490 MHz, 3db: 3610 => 3490 MHz freq = 3610 MHz, 3db: 3730 => 3610 MHz freq = 3730 MHz, 3db: 3850 => 3730 MHz freq = 3850 MHz, 3db: 3870 => 3850 MHz freq = 3870 MHz, 3db: 4130 => 3870 MHz freq = 4130 MHz, 3db: 4390 => 4130 MHz freq = 4390 MHz, 3db: 4650 => 4390 MHz freq = 4650 MHz, 3db: 4910 => 4650 MHz freq = 4910 MHz, 3db: 5170 => 4910 MHz freq = 5170 MHz, 3db: 5430 => 5170 MHz freq = 5430 MHz, 3db: 5690 => 5430 MHz freq = 5690 MHz, 3db: 5950 => 5690 MHz freq = 5950 MHz, 3db: 6210 => 5950 MHz freq = 6210 MHz, 3db: 6470 => 6210 MHz freq = 6470 MHz, 3db: 6730 => 6470 MHz freq = 6730 MHz, 3db: 6990 => 6730 MHz freq = 6990 MHz, 3db: 7250 => 6990 MHz freq = 7000 MHz, 3db: 7250 => 7000 MHz freq = 7250 MHz, 3db: 7400 => 7250 MHz freq = 7400 MHz, 3db: 7800 => 7400 MHz freq = 7800 MHz, 3db: 8200 => 7800 MHz freq = 8200 MHz, 3db: 8600 => 8200 MHz freq = 8600 MHz, 3db: 9000 => 8600 MHz freq = 9000 MHz, 3db: 9400 => 9000 MHz freq = 9400 MHz, 3db: 9800 => 9400 MHz freq = 9800 MHz, 3db: 10200 => 9800 MHz freq = 10200 MHz, 3db: 10600 => 10200 MHz freq = 10600 MHz, 3db: 11000 => 10600 MHz freq = 11000 MHz, 3db: 11400 => 11000 MHz freq = 11400 MHz, 3db: 11800 => 11400 MHz freq = 11800 MHz, 3db: 12200 => 11800 MHz freq = 12200 MHz, 3db: 12600 => 12200 MHz freq = 12210 MHz, 3db: 12600 => 12550 MHz freq = 12220 MHz, 3db: 12600 => 12550 MHz freq = 12230 MHz, 3db: 12600 => 12550 MHz freq = 12240 MHz, 3db: 12600 => 12550 MHz freq = 12250 MHz, 3db: 12600 => 12550 MHz freq = 12260 MHz, 3db: 12600 => 12550 MHz freq = 12270 MHz, 3db: 12600 => 12550 MHz freq = 12280 MHz, 3db: 12600 => 12550 MHz freq = 12290 MHz, 3db: 12600 => 12550 MHz freq = 12300 MHz, 3db: 12600 => 12550 MHz freq = 12310 MHz, 3db: 12600 => 12550 MHz freq = 12320 MHz, 3db: 12600 => 12550 MHz freq = 12330 MHz, 3db: 12600 => 12550 MHz freq = 12340 MHz, 3db: 12600 => 12550 MHz freq = 12350 MHz, 3db: 12600 => 12550 MHz freq = 12360 MHz, 3db: 12600 => 12550 MHz freq = 12370 MHz, 3db: 12600 => 12550 MHz freq = 12380 MHz, 3db: 12600 => 12550 MHz freq = 12390 MHz, 3db: 12600 => 12550 MHz freq = 12400 MHz, 3db: 12600 => 12550 MHz freq = 12410 MHz, 3db: 12600 => 12550 MHz freq = 12420 MHz, 3db: 12600 => 12550 MHz freq = 12430 MHz, 3db: 12600 => 12550 MHz freq = 12440 MHz, 3db: 12600 => 12550 MHz freq = 12450 MHz, 3db: 12600 => 12550 MHz freq = 12460 MHz, 3db: 12600 => 12550 MHz freq = 12470 MHz, 3db: 12600 => 12550 MHz freq = 12480 MHz, 3db: 12600 => 12550 MHz freq = 12490 MHz, 3db: 12600 => 12550 MHz freq = 12500 MHz, 3db: 12600 => 12550 MHz freq = 12510 MHz, 3db: 12600 => 12550 MHz freq = 12520 MHz, 3db: 12600 => 12550 MHz freq = 12530 MHz, 3db: 12600 => 12550 MHz freq = 12540 MHz, 3db: 12600 => 12550 MHz freq = 12550 MHz, 3db: 12600 => 12550 MHz freq = 12600 MHz, 3db: 13000 => 12600 MHz freq = 12610 MHz, 3db: 13000 => 12970 MHz freq = 12620 MHz, 3db: 13000 => 12970 MHz freq = 12630 MHz, 3db: 13000 => 12970 MHz freq = 12640 MHz, 3db: 13000 => 12970 MHz freq = 12650 MHz, 3db: 13000 => 12970 MHz freq = 12660 MHz, 3db: 13000 => 12970 MHz freq = 12670 MHz, 3db: 13000 => 12970 MHz freq = 12680 MHz, 3db: 13000 => 12970 MHz freq = 12690 MHz, 3db: 13000 => 12970 MHz freq = 12700 MHz, 3db: 13000 => 12970 MHz freq = 12710 MHz, 3db: 13000 => 12970 MHz freq = 12720 MHz, 3db: 13000 => 12970 MHz freq = 12730 MHz, 3db: 13000 => 12970 MHz freq = 12740 MHz, 3db: 13000 => 12970 MHz freq = 12750 MHz, 3db: 13000 => 12970 MHz freq = 12760 MHz, 3db: 13000 => 12970 MHz freq = 12770 MHz, 3db: 13000 => 12970 MHz freq = 12780 MHz, 3db: 13000 => 12970 MHz freq = 12790 MHz, 3db: 13000 => 12970 MHz freq = 12800 MHz, 3db: 13000 => 12970 MHz freq = 12810 MHz, 3db: 13000 => 12970 MHz freq = 12820 MHz, 3db: 13000 => 12970 MHz freq = 12830 MHz, 3db: 13000 => 12970 MHz freq = 12840 MHz, 3db: 13000 => 12970 MHz freq = 12850 MHz, 3db: 13000 => 12970 MHz freq = 12860 MHz, 3db: 13000 => 12970 MHz freq = 12870 MHz, 3db: 13000 => 12970 MHz freq = 12880 MHz, 3db: 13000 => 12970 MHz freq = 12890 MHz, 3db: 13000 => 12970 MHz freq = 12900 MHz, 3db: 13000 => 12970 MHz freq = 12910 MHz, 3db: 13000 => 12970 MHz freq = 12920 MHz, 3db: 13000 => 12970 MHz freq = 12930 MHz, 3db: 13000 => 12970 MHz freq = 12940 MHz, 3db: 13000 => 12970 MHz freq = 12950 MHz, 3db: 13000 => 12970 MHz freq = 12960 MHz, 3db: 13000 => 12970 MHz freq = 12970 MHz, 3db: 13000 => 12970 MHz freq = 13000 MHz, 3db: 13390 => 13000 MHz freq = 13390 MHz, 3db: 13810 => 13390 MHz freq = 13810 MHz, 3db: 14230 => 13810 MHz freq = 14230 MHz, 3db: 14650 => 14230 MHz freq = 14650 MHz, 3db: 15070 => 14650 MHz freq = 15070 MHz, 3db: 15490 => 15070 MHz freq = 15490 MHz, 3db: 15910 => 15490 MHz freq = 15910 MHz, 3db: 16330 => 15910 MHz freq = 16330 MHz, 3db: 16750 => 16330 MHz freq = 16750 MHz, 3db: 17170 => 16750 MHz freq = 17170 MHz, 3db: 17590 => 17170 MHz freq = 17590 MHz, 3db: 18010 => 17590 MHz freq = 18010 MHz, 3db: 18430 => 18010 MHz freq = 18430 MHz, 3db: 18850 => 18430 MHz freq = 18850 MHz, 3db: bypass => 18850 MHz Fixes: f34fe888ad05 ("iio:filter:admv8818: add support for ADMV8818") Signed-off-by: Sam Winchenbach Link: https://patch.msgid.link/20250328174831.227202-5-sam.winchenbach@framepointer.org Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/filter/admv8818.c | 205 +++++++++++++++++++++++++--------- 1 file changed, 152 insertions(+), 53 deletions(-) diff --git a/drivers/iio/filter/admv8818.c b/drivers/iio/filter/admv8818.c index cd3aff9a2f7bf..380e119b3cf54 100644 --- a/drivers/iio/filter/admv8818.c +++ b/drivers/iio/filter/admv8818.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -70,6 +71,16 @@ #define ADMV8818_HPF_WR0_MSK GENMASK(7, 4) #define ADMV8818_LPF_WR0_MSK GENMASK(3, 0) +#define ADMV8818_BAND_BYPASS 0 +#define ADMV8818_BAND_MIN 1 +#define ADMV8818_BAND_MAX 4 +#define ADMV8818_BAND_CORNER_LOW 0 +#define ADMV8818_BAND_CORNER_HIGH 1 + +#define ADMV8818_STATE_MIN 0 +#define ADMV8818_STATE_MAX 15 +#define ADMV8818_NUM_STATES 16 + enum { ADMV8818_BW_FREQ, ADMV8818_CENTER_FREQ @@ -90,16 +101,20 @@ struct admv8818_state { struct mutex lock; unsigned int filter_mode; u64 cf_hz; + u64 lpf_margin_hz; + u64 hpf_margin_hz; }; -static const unsigned long long freq_range_hpf[4][2] = { +static const unsigned long long freq_range_hpf[5][2] = { + {0ULL, 0ULL}, /* bypass */ {1750000000ULL, 3550000000ULL}, {3400000000ULL, 7250000000ULL}, {6600000000, 12000000000}, {12500000000, 19900000000} }; -static const unsigned long long freq_range_lpf[4][2] = { +static const unsigned long long freq_range_lpf[5][2] = { + {U64_MAX, U64_MAX}, /* bypass */ {2050000000ULL, 3850000000ULL}, {3350000000ULL, 7250000000ULL}, {7000000000, 13000000000}, @@ -121,44 +136,59 @@ static const char * const admv8818_modes[] = { static int __admv8818_hpf_select(struct admv8818_state *st, u64 freq) { - unsigned int hpf_step = 0, hpf_band = 0, i, j; - u64 freq_step; - int ret; + int band, state, ret; + unsigned int hpf_state = ADMV8818_STATE_MIN, hpf_band = ADMV8818_BAND_BYPASS; + u64 freq_error, min_freq_error, freq_corner, freq_step; - if (freq < freq_range_hpf[0][0]) + if (freq < freq_range_hpf[ADMV8818_BAND_MIN][ADMV8818_BAND_CORNER_LOW]) goto hpf_write; - if (freq > freq_range_hpf[3][1]) { - hpf_step = 15; - hpf_band = 4; - + if (freq >= freq_range_hpf[ADMV8818_BAND_MAX][ADMV8818_BAND_CORNER_HIGH]) { + hpf_state = ADMV8818_STATE_MAX; + hpf_band = ADMV8818_BAND_MAX; goto hpf_write; } - for (i = 0; i < 4; i++) { - freq_step = div_u64((freq_range_hpf[i][1] - - freq_range_hpf[i][0]), 15); + /* Close HPF frequency gap between 12 and 12.5 GHz */ + if (freq >= 12000ULL * HZ_PER_MHZ && freq < 12500ULL * HZ_PER_MHZ) { + hpf_state = ADMV8818_STATE_MAX; + hpf_band = 3; + goto hpf_write; + } - if (freq > freq_range_hpf[i][0] && - (freq < freq_range_hpf[i][1] + freq_step)) { - hpf_band = i + 1; + min_freq_error = U64_MAX; + for (band = ADMV8818_BAND_MIN; band <= ADMV8818_BAND_MAX; band++) { + /* + * This (and therefore all other ranges) have a corner + * frequency higher than the target frequency. + */ + if (freq_range_hpf[band][ADMV8818_BAND_CORNER_LOW] > freq) + break; - for (j = 1; j <= 16; j++) { - if (freq < (freq_range_hpf[i][0] + (freq_step * j))) { - hpf_step = j - 1; - break; - } + freq_step = freq_range_hpf[band][ADMV8818_BAND_CORNER_HIGH] - + freq_range_hpf[band][ADMV8818_BAND_CORNER_LOW]; + freq_step = div_u64(freq_step, ADMV8818_NUM_STATES - 1); + + for (state = ADMV8818_STATE_MIN; state <= ADMV8818_STATE_MAX; state++) { + freq_corner = freq_range_hpf[band][ADMV8818_BAND_CORNER_LOW] + + freq_step * state; + + /* + * This (and therefore all other states) have a corner + * frequency higher than the target frequency. + */ + if (freq_corner > freq) + break; + + freq_error = freq - freq_corner; + if (freq_error < min_freq_error) { + min_freq_error = freq_error; + hpf_state = state; + hpf_band = band; } - break; } } - /* Close HPF frequency gap between 12 and 12.5 GHz */ - if (freq >= 12000ULL * HZ_PER_MHZ && freq < 12500ULL * HZ_PER_MHZ) { - hpf_band = 3; - hpf_step = 15; - } - hpf_write: ret = regmap_update_bits(st->regmap, ADMV8818_REG_WR0_SW, ADMV8818_SW_IN_SET_WR0_MSK | @@ -170,7 +200,7 @@ hpf_write: return regmap_update_bits(st->regmap, ADMV8818_REG_WR0_FILTER, ADMV8818_HPF_WR0_MSK, - FIELD_PREP(ADMV8818_HPF_WR0_MSK, hpf_step)); + FIELD_PREP(ADMV8818_HPF_WR0_MSK, hpf_state)); } static int admv8818_hpf_select(struct admv8818_state *st, u64 freq) @@ -186,31 +216,52 @@ static int admv8818_hpf_select(struct admv8818_state *st, u64 freq) static int __admv8818_lpf_select(struct admv8818_state *st, u64 freq) { - unsigned int lpf_step = 0, lpf_band = 0, i, j; - u64 freq_step; - int ret; + int band, state, ret; + unsigned int lpf_state = ADMV8818_STATE_MIN, lpf_band = ADMV8818_BAND_BYPASS; + u64 freq_error, min_freq_error, freq_corner, freq_step; - if (freq > freq_range_lpf[3][1]) + if (freq > freq_range_lpf[ADMV8818_BAND_MAX][ADMV8818_BAND_CORNER_HIGH]) goto lpf_write; - if (freq < freq_range_lpf[0][0]) { - lpf_band = 1; - + if (freq < freq_range_lpf[ADMV8818_BAND_MIN][ADMV8818_BAND_CORNER_LOW]) { + lpf_state = ADMV8818_STATE_MIN; + lpf_band = ADMV8818_BAND_MIN; goto lpf_write; } - for (i = 0; i < 4; i++) { - if (freq > freq_range_lpf[i][0] && freq < freq_range_lpf[i][1]) { - lpf_band = i + 1; - freq_step = div_u64((freq_range_lpf[i][1] - freq_range_lpf[i][0]), 15); + min_freq_error = U64_MAX; + for (band = ADMV8818_BAND_MAX; band >= ADMV8818_BAND_MIN; --band) { + /* + * At this point the highest corner frequency of + * all remaining ranges is below the target. + * LPF corner should be >= the target. + */ + if (freq > freq_range_lpf[band][ADMV8818_BAND_CORNER_HIGH]) + break; + + freq_step = freq_range_lpf[band][ADMV8818_BAND_CORNER_HIGH] - + freq_range_lpf[band][ADMV8818_BAND_CORNER_LOW]; + freq_step = div_u64(freq_step, ADMV8818_NUM_STATES - 1); + + for (state = ADMV8818_STATE_MAX; state >= ADMV8818_STATE_MIN; --state) { - for (j = 0; j <= 15; j++) { - if (freq < (freq_range_lpf[i][0] + (freq_step * j))) { - lpf_step = j; - break; - } + freq_corner = freq_range_lpf[band][ADMV8818_BAND_CORNER_LOW] + + state * freq_step; + + /* + * At this point all other states in range will + * place the corner frequency below the target + * LPF corner should >= the target. + */ + if (freq > freq_corner) + break; + + freq_error = freq_corner - freq; + if (freq_error < min_freq_error) { + min_freq_error = freq_error; + lpf_state = state; + lpf_band = band; } - break; } } @@ -225,7 +276,7 @@ lpf_write: return regmap_update_bits(st->regmap, ADMV8818_REG_WR0_FILTER, ADMV8818_LPF_WR0_MSK, - FIELD_PREP(ADMV8818_LPF_WR0_MSK, lpf_step)); + FIELD_PREP(ADMV8818_LPF_WR0_MSK, lpf_state)); } static int admv8818_lpf_select(struct admv8818_state *st, u64 freq) @@ -242,16 +293,28 @@ static int admv8818_lpf_select(struct admv8818_state *st, u64 freq) static int admv8818_rfin_band_select(struct admv8818_state *st) { int ret; + u64 hpf_corner_target, lpf_corner_target; st->cf_hz = clk_get_rate(st->clkin); + /* Check for underflow */ + if (st->cf_hz > st->hpf_margin_hz) + hpf_corner_target = st->cf_hz - st->hpf_margin_hz; + else + hpf_corner_target = 0; + + /* Check for overflow */ + lpf_corner_target = st->cf_hz + st->lpf_margin_hz; + if (lpf_corner_target < st->cf_hz) + lpf_corner_target = U64_MAX; + mutex_lock(&st->lock); - ret = __admv8818_hpf_select(st, st->cf_hz); + ret = __admv8818_hpf_select(st, hpf_corner_target); if (ret) goto exit; - ret = __admv8818_lpf_select(st, st->cf_hz); + ret = __admv8818_lpf_select(st, lpf_corner_target); exit: mutex_unlock(&st->lock); return ret; @@ -278,8 +341,11 @@ static int __admv8818_read_hpf_freq(struct admv8818_state *st, u64 *hpf_freq) hpf_state = FIELD_GET(ADMV8818_HPF_WR0_MSK, data); - *hpf_freq = div_u64(freq_range_hpf[hpf_band - 1][1] - freq_range_hpf[hpf_band - 1][0], 15); - *hpf_freq = freq_range_hpf[hpf_band - 1][0] + (*hpf_freq * hpf_state); + *hpf_freq = freq_range_hpf[hpf_band][ADMV8818_BAND_CORNER_HIGH] - + freq_range_hpf[hpf_band][ADMV8818_BAND_CORNER_LOW]; + *hpf_freq = div_u64(*hpf_freq, ADMV8818_NUM_STATES - 1); + *hpf_freq = freq_range_hpf[hpf_band][ADMV8818_BAND_CORNER_LOW] + + (*hpf_freq * hpf_state); return ret; } @@ -316,8 +382,11 @@ static int __admv8818_read_lpf_freq(struct admv8818_state *st, u64 *lpf_freq) lpf_state = FIELD_GET(ADMV8818_LPF_WR0_MSK, data); - *lpf_freq = div_u64(freq_range_lpf[lpf_band - 1][1] - freq_range_lpf[lpf_band - 1][0], 15); - *lpf_freq = freq_range_lpf[lpf_band - 1][0] + (*lpf_freq * lpf_state); + *lpf_freq = freq_range_lpf[lpf_band][ADMV8818_BAND_CORNER_HIGH] - + freq_range_lpf[lpf_band][ADMV8818_BAND_CORNER_LOW]; + *lpf_freq = div_u64(*lpf_freq, ADMV8818_NUM_STATES - 1); + *lpf_freq = freq_range_lpf[lpf_band][ADMV8818_BAND_CORNER_LOW] + + (*lpf_freq * lpf_state); return ret; } @@ -641,6 +710,32 @@ static int admv8818_clk_setup(struct admv8818_state *st) return devm_add_action_or_reset(&spi->dev, admv8818_clk_notifier_unreg, st); } +static int admv8818_read_properties(struct admv8818_state *st) +{ + struct spi_device *spi = st->spi; + u32 mhz; + int ret; + + ret = device_property_read_u32(&spi->dev, "adi,lpf-margin-mhz", &mhz); + if (ret == 0) + st->lpf_margin_hz = (u64)mhz * HZ_PER_MHZ; + else if (ret == -EINVAL) + st->lpf_margin_hz = 0; + else + return ret; + + + ret = device_property_read_u32(&spi->dev, "adi,hpf-margin-mhz", &mhz); + if (ret == 0) + st->hpf_margin_hz = (u64)mhz * HZ_PER_MHZ; + else if (ret == -EINVAL) + st->hpf_margin_hz = 0; + else if (ret < 0) + return ret; + + return 0; +} + static int admv8818_probe(struct spi_device *spi) { struct iio_dev *indio_dev; @@ -672,6 +767,10 @@ static int admv8818_probe(struct spi_device *spi) mutex_init(&st->lock); + ret = admv8818_read_properties(st); + if (ret) + return ret; + ret = admv8818_init(st); if (ret) return ret; -- GitLab From 46dd5892ea171b76454e1ec4a575a911a5974cf2 Mon Sep 17 00:00:00 2001 From: Brian Pellegrino Date: Fri, 28 Mar 2025 13:48:31 -0400 Subject: [PATCH 1030/2211] iio: filter: admv8818: Support frequencies >= 2^32 [ Upstream commit 9016776f1301627de78a633bda7c898425a56572 ] This patch allows writing u64 values to the ADMV8818's high and low-pass filter frequencies. It includes the following changes: - Rejects negative frequencies in admv8818_write_raw. - Adds a write_raw_get_fmt function to admv8818's iio_info, returning IIO_VAL_INT_64 for the high and low-pass filter 3dB frequency channels. Fixes: f34fe888ad05 ("iio:filter:admv8818: add support for ADMV8818") Signed-off-by: Brian Pellegrino Signed-off-by: Sam Winchenbach Link: https://patch.msgid.link/20250328174831.227202-7-sam.winchenbach@framepointer.org Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/filter/admv8818.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/iio/filter/admv8818.c b/drivers/iio/filter/admv8818.c index 380e119b3cf54..cc8ce0fe74e7c 100644 --- a/drivers/iio/filter/admv8818.c +++ b/drivers/iio/filter/admv8818.c @@ -402,6 +402,19 @@ static int admv8818_read_lpf_freq(struct admv8818_state *st, u64 *lpf_freq) return ret; } +static int admv8818_write_raw_get_fmt(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + long mask) +{ + switch (mask) { + case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: + case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY: + return IIO_VAL_INT_64; + default: + return -EINVAL; + } +} + static int admv8818_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long info) @@ -410,6 +423,9 @@ static int admv8818_write_raw(struct iio_dev *indio_dev, u64 freq = ((u64)val2 << 32 | (u32)val); + if ((s64)freq < 0) + return -EINVAL; + switch (info) { case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: return admv8818_lpf_select(st, freq); @@ -571,6 +587,7 @@ set_mode: static const struct iio_info admv8818_info = { .write_raw = admv8818_write_raw, + .write_raw_get_fmt = admv8818_write_raw_get_fmt, .read_raw = admv8818_read_raw, .debugfs_reg_access = &admv8818_reg_access, }; -- GitLab From 122bbc57cb13bc7fe139e1a7f8bc738169bc4546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Mon, 17 Mar 2025 12:52:47 +0100 Subject: [PATCH 1031/2211] iio: adc: ad7124: Fix 3dB filter frequency reading MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 8712e4986e7ce42a14c762c4c350f290989986a5 ] The sinc4 filter has a factor 0.23 between Output Data Rate and f_{3dB} and for sinc3 the factor is 0.272 according to the data sheets for ad7124-4 (Rev. E.) and ad7124-8 (Rev. F). Fixes: cef2760954cf ("iio: adc: ad7124: add 3db filter") Signed-off-by: Uwe Kleine-König Reviewed-by: Marcelo Schmitt Link: https://patch.msgid.link/20250317115247.3735016-6-u.kleine-koenig@baylibre.com Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/adc/ad7124.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c index 30a7392c4f8b9..9c9e0c950b427 100644 --- a/drivers/iio/adc/ad7124.c +++ b/drivers/iio/adc/ad7124.c @@ -300,9 +300,9 @@ static int ad7124_get_3db_filter_freq(struct ad7124_state *st, switch (st->channels[channel].cfg.filter_type) { case AD7124_SINC3_FILTER: - return DIV_ROUND_CLOSEST(fadc * 230, 1000); + return DIV_ROUND_CLOSEST(fadc * 272, 1000); case AD7124_SINC4_FILTER: - return DIV_ROUND_CLOSEST(fadc * 262, 1000); + return DIV_ROUND_CLOSEST(fadc * 230, 1000); default: return -EINVAL; } -- GitLab From 8fa544bff8466062e42949c93f3e528f4be5624b Mon Sep 17 00:00:00 2001 From: Chenyuan Yang Date: Thu, 17 Apr 2025 14:50:32 -0500 Subject: [PATCH 1032/2211] usb: acpi: Prevent null pointer dereference in usb_acpi_add_usb4_devlink() [ Upstream commit 73fb0ec9436ae87bcae067ce35d6cdd72bade86c ] As demonstrated by the fix for update_port_device_state, commit 12783c0b9e2c ("usb: core: Prevent null pointer dereference in update_port_device_state"), usb_hub_to_struct_hub() can return NULL in certain scenarios, such as during hub driver unbind or teardown race conditions, even if the underlying usb_device structure exists. Plus, all other places that call usb_hub_to_struct_hub() in the same file do check for NULL return values. If usb_hub_to_struct_hub() returns NULL, the subsequent access to hub->ports[udev->portnum - 1] will cause a null pointer dereference. Signed-off-by: Chenyuan Yang Fixes: f1bfb4a6fed6 ("usb: acpi: add device link between tunneled USB3 device and USB4 Host Interface") Acked-by: Alan Stern Link: https://lore.kernel.org/r/20250417195032.1811338-1-chenyuan0y@gmail.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/core/usb-acpi.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/usb/core/usb-acpi.c b/drivers/usb/core/usb-acpi.c index 03c22114214b5..494e21a11cd26 100644 --- a/drivers/usb/core/usb-acpi.c +++ b/drivers/usb/core/usb-acpi.c @@ -165,6 +165,8 @@ static int usb_acpi_add_usb4_devlink(struct usb_device *udev) return 0; hub = usb_hub_to_struct_hub(udev->parent); + if (!hub) + return 0; port_dev = hub->ports[udev->portnum - 1]; struct fwnode_handle *nhi_fwnode __free(fwnode_handle) = -- GitLab From 677da45548ecfeb0fa45551993cabedd1d74ee4a Mon Sep 17 00:00:00 2001 From: WangYuli Date: Wed, 16 Apr 2025 11:45:48 +0800 Subject: [PATCH 1033/2211] MIPS: Loongson64: Add missing '#interrupt-cells' for loongson64c_ls7a MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 6d223b8ffcd1593d032b71875def2daa71c53111 ] Similar to commit 98a9e2ac3755 ("MIPS: Loongson64: DTS: Fix msi node for ls7a"). Fix follow warnings: arch/mips/boot/dts/loongson/loongson64c_4core_ls7a.dts:28.31-36.4: Warning (interrupt_provider): /bus@10000000/msi-controller@2ff00000: Missing '#interrupt-cells' in interrupt provider arch/mips/boot/dts/loongson/loongson64c_4core_ls7a.dtb: Warning (interrupt_map): Failed prerequisite 'interrupt_provider' Fixes: 24af105962c8 ("MIPS: Loongson64: DeviceTree for LS7A PCH") Tested-by: WangYuli Signed-off-by: WangYuli Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Thomas Bogendoerfer Signed-off-by: Sasha Levin --- arch/mips/boot/dts/loongson/loongson64c_4core_ls7a.dts | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/mips/boot/dts/loongson/loongson64c_4core_ls7a.dts b/arch/mips/boot/dts/loongson/loongson64c_4core_ls7a.dts index c7ea4f1c0bb21..6c277ab83d4b9 100644 --- a/arch/mips/boot/dts/loongson/loongson64c_4core_ls7a.dts +++ b/arch/mips/boot/dts/loongson/loongson64c_4core_ls7a.dts @@ -29,6 +29,7 @@ compatible = "loongson,pch-msi-1.0"; reg = <0 0x2ff00000 0 0x8>; interrupt-controller; + #interrupt-cells = <1>; msi-controller; loongson,msi-base-vec = <64>; loongson,msi-num-vecs = <64>; -- GitLab From 1183a72221d5c7af0c821bd492c7522493eec07d Mon Sep 17 00:00:00 2001 From: Junhao He Date: Wed, 18 Sep 2024 11:53:27 +0800 Subject: [PATCH 1034/2211] coresight: Fixes device's owner field for registered using coresight_init_driver() [ Upstream commit 9f52aecc952ddf307571517d5c91136c8c4e87c9 ] The coresight_init_driver() of the coresight-core module is called from the sub coresgiht device (such as tmc/stm/funnle/...) module. It calls amba_driver_register() and Platform_driver_register(), which are macro functions that use the coresight-core's module to initialize the caller's owner field. Therefore, when the sub coresight device calls coresight_init_driver(), an incorrect THIS_MODULE value is captured. The sub coesgiht modules can be removed while their callbacks are running, resulting in a general protection failure. Add module parameter to coresight_init_driver() so can be called with the module of the callback. Fixes: 075b7cd7ad7d ("coresight: Add helpers registering/removing both AMBA and platform drivers") Signed-off-by: Junhao He Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20240918035327.9710-1-hejunhao3@huawei.com Signed-off-by: Sasha Levin --- drivers/hwtracing/coresight/coresight-catu.c | 2 +- drivers/hwtracing/coresight/coresight-core.c | 6 +++--- drivers/hwtracing/coresight/coresight-cpu-debug.c | 3 ++- drivers/hwtracing/coresight/coresight-funnel.c | 3 ++- drivers/hwtracing/coresight/coresight-replicator.c | 3 ++- drivers/hwtracing/coresight/coresight-stm.c | 2 +- drivers/hwtracing/coresight/coresight-tmc-core.c | 2 +- drivers/hwtracing/coresight/coresight-tpiu.c | 2 +- include/linux/coresight.h | 2 +- 9 files changed, 14 insertions(+), 11 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-catu.c b/drivers/hwtracing/coresight/coresight-catu.c index d8ad64ea81f11..8cf85ff216bbe 100644 --- a/drivers/hwtracing/coresight/coresight-catu.c +++ b/drivers/hwtracing/coresight/coresight-catu.c @@ -702,7 +702,7 @@ static int __init catu_init(void) { int ret; - ret = coresight_init_driver("catu", &catu_driver, &catu_platform_driver); + ret = coresight_init_driver("catu", &catu_driver, &catu_platform_driver, THIS_MODULE); tmc_etr_set_catu_ops(&etr_catu_buf_ops); return ret; } diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c index c42aa9fddab9b..c7e35a431ab00 100644 --- a/drivers/hwtracing/coresight/coresight-core.c +++ b/drivers/hwtracing/coresight/coresight-core.c @@ -1422,17 +1422,17 @@ module_init(coresight_init); module_exit(coresight_exit); int coresight_init_driver(const char *drv, struct amba_driver *amba_drv, - struct platform_driver *pdev_drv) + struct platform_driver *pdev_drv, struct module *owner) { int ret; - ret = amba_driver_register(amba_drv); + ret = __amba_driver_register(amba_drv, owner); if (ret) { pr_err("%s: error registering AMBA driver\n", drv); return ret; } - ret = platform_driver_register(pdev_drv); + ret = __platform_driver_register(pdev_drv, owner); if (!ret) return 0; diff --git a/drivers/hwtracing/coresight/coresight-cpu-debug.c b/drivers/hwtracing/coresight/coresight-cpu-debug.c index 75962dae9aa18..cc599c5ef4b22 100644 --- a/drivers/hwtracing/coresight/coresight-cpu-debug.c +++ b/drivers/hwtracing/coresight/coresight-cpu-debug.c @@ -774,7 +774,8 @@ static struct platform_driver debug_platform_driver = { static int __init debug_init(void) { - return coresight_init_driver("debug", &debug_driver, &debug_platform_driver); + return coresight_init_driver("debug", &debug_driver, &debug_platform_driver, + THIS_MODULE); } static void __exit debug_exit(void) diff --git a/drivers/hwtracing/coresight/coresight-funnel.c b/drivers/hwtracing/coresight/coresight-funnel.c index 5a819c8970fbf..8f451b051ddc3 100644 --- a/drivers/hwtracing/coresight/coresight-funnel.c +++ b/drivers/hwtracing/coresight/coresight-funnel.c @@ -433,7 +433,8 @@ static struct amba_driver dynamic_funnel_driver = { static int __init funnel_init(void) { - return coresight_init_driver("funnel", &dynamic_funnel_driver, &funnel_driver); + return coresight_init_driver("funnel", &dynamic_funnel_driver, &funnel_driver, + THIS_MODULE); } static void __exit funnel_exit(void) diff --git a/drivers/hwtracing/coresight/coresight-replicator.c b/drivers/hwtracing/coresight/coresight-replicator.c index 3e55be9c84186..f7607c72857c5 100644 --- a/drivers/hwtracing/coresight/coresight-replicator.c +++ b/drivers/hwtracing/coresight/coresight-replicator.c @@ -438,7 +438,8 @@ static struct amba_driver dynamic_replicator_driver = { static int __init replicator_init(void) { - return coresight_init_driver("replicator", &dynamic_replicator_driver, &replicator_driver); + return coresight_init_driver("replicator", &dynamic_replicator_driver, &replicator_driver, + THIS_MODULE); } static void __exit replicator_exit(void) diff --git a/drivers/hwtracing/coresight/coresight-stm.c b/drivers/hwtracing/coresight/coresight-stm.c index cb3e04755c992..65bc50a6d3e9a 100644 --- a/drivers/hwtracing/coresight/coresight-stm.c +++ b/drivers/hwtracing/coresight/coresight-stm.c @@ -1047,7 +1047,7 @@ static struct platform_driver stm_platform_driver = { static int __init stm_init(void) { - return coresight_init_driver("stm", &stm_driver, &stm_platform_driver); + return coresight_init_driver("stm", &stm_driver, &stm_platform_driver, THIS_MODULE); } static void __exit stm_exit(void) diff --git a/drivers/hwtracing/coresight/coresight-tmc-core.c b/drivers/hwtracing/coresight/coresight-tmc-core.c index 3a482fd2cb225..475fa4bb6813b 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-core.c +++ b/drivers/hwtracing/coresight/coresight-tmc-core.c @@ -741,7 +741,7 @@ static struct platform_driver tmc_platform_driver = { static int __init tmc_init(void) { - return coresight_init_driver("tmc", &tmc_driver, &tmc_platform_driver); + return coresight_init_driver("tmc", &tmc_driver, &tmc_platform_driver, THIS_MODULE); } static void __exit tmc_exit(void) diff --git a/drivers/hwtracing/coresight/coresight-tpiu.c b/drivers/hwtracing/coresight/coresight-tpiu.c index b048e146fbb10..f9ecd05cbe5c5 100644 --- a/drivers/hwtracing/coresight/coresight-tpiu.c +++ b/drivers/hwtracing/coresight/coresight-tpiu.c @@ -318,7 +318,7 @@ static struct platform_driver tpiu_platform_driver = { static int __init tpiu_init(void) { - return coresight_init_driver("tpiu", &tpiu_driver, &tpiu_platform_driver); + return coresight_init_driver("tpiu", &tpiu_driver, &tpiu_platform_driver, THIS_MODULE); } static void __exit tpiu_exit(void) diff --git a/include/linux/coresight.h b/include/linux/coresight.h index f106b10251118..59f99b7da43f5 100644 --- a/include/linux/coresight.h +++ b/include/linux/coresight.h @@ -683,7 +683,7 @@ coresight_find_output_type(struct coresight_platform_data *pdata, union coresight_dev_subtype subtype); int coresight_init_driver(const char *drv, struct amba_driver *amba_drv, - struct platform_driver *pdev_drv); + struct platform_driver *pdev_drv, struct module *owner); void coresight_remove_driver(struct amba_driver *amba_drv, struct platform_driver *pdev_drv); -- GitLab From b9c6d66810c45d446f06383b22f9a2a73b5389b7 Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Tue, 29 Apr 2025 16:12:59 -0700 Subject: [PATCH 1035/2211] coresight: catu: Introduce refcount and spinlock for enabling/disabling [ Upstream commit a03a0a08c6fe5e50c1b12ea41b9e228e7f649c22 ] When tracing ETM data on multiple CPUs concurrently via the perf interface, the CATU device is shared across different CPU paths. This can lead to race conditions when multiple CPUs attempt to enable or disable the CATU device simultaneously. To address these race conditions, this patch introduces the following changes: 1. The enable and disable operations for the CATU device are not reentrant. Therefore, a spinlock is added to ensure that only one CPU can enable or disable a given CATU device at any point in time. 2. A reference counter is used to manage the enable/disable state of the CATU device. The device is enabled when the first CPU requires it and is only disabled when the last CPU finishes using it. This ensures the device remains active as long as at least one CPU needs it. Fixes: fcacb5c154ba ("coresight: Introduce support for Coresight Address Translation Unit") Signed-off-by: Yabin Cui Reviewed-by: James Clark Reviewed-by: Leo Yan Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20250429231301.1952246-2-yabinc@google.com Signed-off-by: Sasha Levin --- drivers/hwtracing/coresight/coresight-catu.c | 25 +++++++++++++------- drivers/hwtracing/coresight/coresight-catu.h | 1 + 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-catu.c b/drivers/hwtracing/coresight/coresight-catu.c index 8cf85ff216bbe..25fd02955c38d 100644 --- a/drivers/hwtracing/coresight/coresight-catu.c +++ b/drivers/hwtracing/coresight/coresight-catu.c @@ -458,12 +458,17 @@ static int catu_enable_hw(struct catu_drvdata *drvdata, enum cs_mode cs_mode, static int catu_enable(struct coresight_device *csdev, enum cs_mode mode, void *data) { - int rc; + int rc = 0; struct catu_drvdata *catu_drvdata = csdev_to_catu_drvdata(csdev); - CS_UNLOCK(catu_drvdata->base); - rc = catu_enable_hw(catu_drvdata, mode, data); - CS_LOCK(catu_drvdata->base); + guard(raw_spinlock_irqsave)(&catu_drvdata->spinlock); + if (csdev->refcnt == 0) { + CS_UNLOCK(catu_drvdata->base); + rc = catu_enable_hw(catu_drvdata, mode, data); + CS_LOCK(catu_drvdata->base); + } + if (!rc) + csdev->refcnt++; return rc; } @@ -486,12 +491,15 @@ static int catu_disable_hw(struct catu_drvdata *drvdata) static int catu_disable(struct coresight_device *csdev, void *__unused) { - int rc; + int rc = 0; struct catu_drvdata *catu_drvdata = csdev_to_catu_drvdata(csdev); - CS_UNLOCK(catu_drvdata->base); - rc = catu_disable_hw(catu_drvdata); - CS_LOCK(catu_drvdata->base); + guard(raw_spinlock_irqsave)(&catu_drvdata->spinlock); + if (--csdev->refcnt == 0) { + CS_UNLOCK(catu_drvdata->base); + rc = catu_disable_hw(catu_drvdata); + CS_LOCK(catu_drvdata->base); + } return rc; } @@ -550,6 +558,7 @@ static int __catu_probe(struct device *dev, struct resource *res) dev->platform_data = pdata; drvdata->base = base; + raw_spin_lock_init(&drvdata->spinlock); catu_desc.access = CSDEV_ACCESS_IOMEM(base); catu_desc.pdata = pdata; catu_desc.dev = dev; diff --git a/drivers/hwtracing/coresight/coresight-catu.h b/drivers/hwtracing/coresight/coresight-catu.h index 141feac1c14b0..755776cd19c5b 100644 --- a/drivers/hwtracing/coresight/coresight-catu.h +++ b/drivers/hwtracing/coresight/coresight-catu.h @@ -65,6 +65,7 @@ struct catu_drvdata { void __iomem *base; struct coresight_device *csdev; int irq; + raw_spinlock_t spinlock; }; #define CATU_REG32(name, offset) \ -- GitLab From 8d47a03544070a1ed5ddb5bf8bc93ff75445041a Mon Sep 17 00:00:00 2001 From: Alexander Sverdlin Date: Mon, 31 Mar 2025 18:36:40 +0200 Subject: [PATCH 1036/2211] counter: interrupt-cnt: Protect enable/disable OPs with mutex [ Upstream commit 7351312632e831e51383f48957d47712fae791ef ] Enable/disable seems to be racy on SMP, consider the following scenario: CPU0 CPU1 interrupt_cnt_enable_write(true) { if (priv->enabled == enable) return 0; if (enable) { priv->enabled = true; interrupt_cnt_enable_write(false) { if (priv->enabled == enable) return 0; if (enable) { priv->enabled = true; enable_irq(priv->irq); } else { disable_irq(priv->irq) priv->enabled = false; } enable_irq(priv->irq); } else { disable_irq(priv->irq); priv->enabled = false; } The above would result in priv->enabled == false, but IRQ left enabled. Protect both write (above race) and read (to propagate the value on SMP) callbacks with a mutex. Signed-off-by: Alexander Sverdlin Fixes: a55ebd47f21f ("counter: add IRQ or GPIO based counter") Acked-by: Oleksij Rempel Link: https://lore.kernel.org/r/20250331163642.2382651-1-alexander.sverdlin@siemens.com Signed-off-by: William Breathitt Gray Signed-off-by: Sasha Levin --- drivers/counter/interrupt-cnt.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/counter/interrupt-cnt.c b/drivers/counter/interrupt-cnt.c index 229473855c5b3..bc762ba87a19b 100644 --- a/drivers/counter/interrupt-cnt.c +++ b/drivers/counter/interrupt-cnt.c @@ -3,12 +3,14 @@ * Copyright (c) 2021 Pengutronix, Oleksij Rempel */ +#include #include #include #include #include #include #include +#include #include #include @@ -19,6 +21,7 @@ struct interrupt_cnt_priv { struct gpio_desc *gpio; int irq; bool enabled; + struct mutex lock; struct counter_signal signals; struct counter_synapse synapses; struct counter_count cnts; @@ -41,6 +44,8 @@ static int interrupt_cnt_enable_read(struct counter_device *counter, { struct interrupt_cnt_priv *priv = counter_priv(counter); + guard(mutex)(&priv->lock); + *enable = priv->enabled; return 0; @@ -51,6 +56,8 @@ static int interrupt_cnt_enable_write(struct counter_device *counter, { struct interrupt_cnt_priv *priv = counter_priv(counter); + guard(mutex)(&priv->lock); + if (priv->enabled == enable) return 0; @@ -227,6 +234,8 @@ static int interrupt_cnt_probe(struct platform_device *pdev) if (ret) return ret; + mutex_init(&priv->lock); + ret = devm_counter_add(dev, counter); if (ret < 0) return dev_err_probe(dev, ret, "Failed to add counter\n"); -- GitLab From 8b2230ac7ff0aeb2441132df638a82ab124f8624 Mon Sep 17 00:00:00 2001 From: Qasim Ijaz Date: Tue, 22 Apr 2025 16:37:37 +0100 Subject: [PATCH 1037/2211] fpga: fix potential null pointer deref in fpga_mgr_test_img_load_sgt() [ Upstream commit 6ebf1982038af12f3588417e4fd0417d2551da28 ] fpga_mgr_test_img_load_sgt() allocates memory for sgt using kunit_kzalloc() however it does not check if the allocation failed. It then passes sgt to sg_alloc_table(), which passes it to __sg_alloc_table(). This function calls memset() on sgt in an attempt to zero it out. If the allocation fails then sgt will be NULL and the memset will trigger a NULL pointer dereference. Fix this by checking the allocation with KUNIT_ASSERT_NOT_ERR_OR_NULL(). Reviewed-by: Marco Pagani Fixes: ccbc1c302115 ("fpga: add an initial KUnit suite for the FPGA Manager") Signed-off-by: Qasim Ijaz Acked-by: Xu Yilun Link: https://lore.kernel.org/r/20250422153737.5264-1-qasdev00@gmail.com Signed-off-by: Xu Yilun Signed-off-by: Sasha Levin --- drivers/fpga/tests/fpga-mgr-test.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/fpga/tests/fpga-mgr-test.c b/drivers/fpga/tests/fpga-mgr-test.c index 9cb37aefbac4b..1902ebf5a298f 100644 --- a/drivers/fpga/tests/fpga-mgr-test.c +++ b/drivers/fpga/tests/fpga-mgr-test.c @@ -263,6 +263,7 @@ static void fpga_mgr_test_img_load_sgt(struct kunit *test) img_buf = init_test_buffer(test, IMAGE_SIZE); sgt = kunit_kzalloc(test, sizeof(*sgt), GFP_KERNEL); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, sgt); ret = sg_alloc_table(sgt, 1, GFP_KERNEL); KUNIT_ASSERT_EQ(test, ret, 0); sg_init_one(sgt->sgl, img_buf, IMAGE_SIZE); -- GitLab From 31028812724cef7bd57a51525ce58a32a6d73b22 Mon Sep 17 00:00:00 2001 From: Yeoreum Yun Date: Wed, 14 May 2025 17:19:51 +0100 Subject: [PATCH 1038/2211] coresight: prevent deactivate active config while enabling the config [ Upstream commit 408c97c4a5e0b634dcd15bf8b8808b382e888164 ] While enable active config via cscfg_csdev_enable_active_config(), active config could be deactivated via configfs' sysfs interface. This could make UAF issue in below scenario: CPU0 CPU1 (sysfs enable) load module cscfg_load_config_sets() activate config. // sysfs (sys_active_cnt == 1) ... cscfg_csdev_enable_active_config() lock(csdev->cscfg_csdev_lock) // here load config activate by CPU1 unlock(csdev->cscfg_csdev_lock) deactivate config // sysfs (sys_activec_cnt == 0) cscfg_unload_config_sets() unload module // access to config_desc which freed // while unloading module. cscfg_csdev_enable_config To address this, use cscfg_config_desc's active_cnt as a reference count which will be holded when - activate the config. - enable the activated config. and put the module reference when config_active_cnt == 0. Fixes: f8cce2ff3c04 ("coresight: syscfg: Add API to activate and enable configurations") Suggested-by: Suzuki K Poulose Signed-off-by: Yeoreum Yun Reviewed-by: Leo Yan Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20250514161951.3427590-4-yeoreum.yun@arm.com Signed-off-by: Sasha Levin --- .../hwtracing/coresight/coresight-config.h | 2 +- .../hwtracing/coresight/coresight-syscfg.c | 49 +++++++++++++------ 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-config.h b/drivers/hwtracing/coresight/coresight-config.h index 6ba0139757418..84cdde6f0e4db 100644 --- a/drivers/hwtracing/coresight/coresight-config.h +++ b/drivers/hwtracing/coresight/coresight-config.h @@ -228,7 +228,7 @@ struct cscfg_feature_csdev { * @feats_csdev:references to the device features to enable. */ struct cscfg_config_csdev { - const struct cscfg_config_desc *config_desc; + struct cscfg_config_desc *config_desc; struct coresight_device *csdev; bool enabled; struct list_head node; diff --git a/drivers/hwtracing/coresight/coresight-syscfg.c b/drivers/hwtracing/coresight/coresight-syscfg.c index 11138a9762b01..30a561d874819 100644 --- a/drivers/hwtracing/coresight/coresight-syscfg.c +++ b/drivers/hwtracing/coresight/coresight-syscfg.c @@ -867,6 +867,25 @@ unlock_exit: } EXPORT_SYMBOL_GPL(cscfg_csdev_reset_feats); +static bool cscfg_config_desc_get(struct cscfg_config_desc *config_desc) +{ + if (!atomic_fetch_inc(&config_desc->active_cnt)) { + /* must ensure that config cannot be unloaded in use */ + if (unlikely(cscfg_owner_get(config_desc->load_owner))) { + atomic_dec(&config_desc->active_cnt); + return false; + } + } + + return true; +} + +static void cscfg_config_desc_put(struct cscfg_config_desc *config_desc) +{ + if (!atomic_dec_return(&config_desc->active_cnt)) + cscfg_owner_put(config_desc->load_owner); +} + /* * This activate configuration for either perf or sysfs. Perf can have multiple * active configs, selected per event, sysfs is limited to one. @@ -890,22 +909,17 @@ static int _cscfg_activate_config(unsigned long cfg_hash) if (config_desc->available == false) return -EBUSY; - /* must ensure that config cannot be unloaded in use */ - err = cscfg_owner_get(config_desc->load_owner); - if (err) + if (!cscfg_config_desc_get(config_desc)) { + err = -EINVAL; break; + } + /* * increment the global active count - control changes to * active configurations */ atomic_inc(&cscfg_mgr->sys_active_cnt); - /* - * mark the descriptor as active so enable config on a - * device instance will use it - */ - atomic_inc(&config_desc->active_cnt); - err = 0; dev_dbg(cscfg_device(), "Activate config %s.\n", config_desc->name); break; @@ -920,9 +934,8 @@ static void _cscfg_deactivate_config(unsigned long cfg_hash) list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) { if ((unsigned long)config_desc->event_ea->var == cfg_hash) { - atomic_dec(&config_desc->active_cnt); atomic_dec(&cscfg_mgr->sys_active_cnt); - cscfg_owner_put(config_desc->load_owner); + cscfg_config_desc_put(config_desc); dev_dbg(cscfg_device(), "Deactivate config %s.\n", config_desc->name); break; } @@ -1047,7 +1060,7 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev, unsigned long cfg_hash, int preset) { struct cscfg_config_csdev *config_csdev_active = NULL, *config_csdev_item; - const struct cscfg_config_desc *config_desc; + struct cscfg_config_desc *config_desc; unsigned long flags; int err = 0; @@ -1062,8 +1075,8 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev, spin_lock_irqsave(&csdev->cscfg_csdev_lock, flags); list_for_each_entry(config_csdev_item, &csdev->config_csdev_list, node) { config_desc = config_csdev_item->config_desc; - if ((atomic_read(&config_desc->active_cnt)) && - ((unsigned long)config_desc->event_ea->var == cfg_hash)) { + if (((unsigned long)config_desc->event_ea->var == cfg_hash) && + cscfg_config_desc_get(config_desc)) { config_csdev_active = config_csdev_item; csdev->active_cscfg_ctxt = (void *)config_csdev_active; break; @@ -1097,7 +1110,11 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev, err = -EBUSY; spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags); } + + if (err) + cscfg_config_desc_put(config_desc); } + return err; } EXPORT_SYMBOL_GPL(cscfg_csdev_enable_active_config); @@ -1136,8 +1153,10 @@ void cscfg_csdev_disable_active_config(struct coresight_device *csdev) spin_unlock_irqrestore(&csdev->cscfg_csdev_lock, flags); /* true if there was an enabled active config */ - if (config_csdev) + if (config_csdev) { cscfg_csdev_disable_config(config_csdev); + cscfg_config_desc_put(config_csdev->config_desc); + } } EXPORT_SYMBOL_GPL(cscfg_csdev_disable_active_config); -- GitLab From 130e134f6ecaa61e3b7db13b0f41e5a98e8aca93 Mon Sep 17 00:00:00 2001 From: Nicolas Pitre Date: Thu, 15 May 2025 11:30:52 -0400 Subject: [PATCH 1039/2211] vt: remove VT_RESIZE and VT_RESIZEX from vt_compat_ioctl() [ Upstream commit c4c7ead7b86c1e7f11c64915b7e5bb6d2e242691 ] They are listed amon those cmd values that "treat 'arg' as an integer" which is wrong. They should instead fall into the default case. Probably nobody ever relied on that code since 2009 but still. Fixes: e92166517e3c ("tty: handle VT specific compat ioctls in vt driver") Signed-off-by: Nicolas Pitre Reviewed-by: Jiri Slaby Link: https://lore.kernel.org/r/pr214s15-36r8-6732-2pop-159nq85o48r7@syhkavp.arg Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/tty/vt/vt_ioctl.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c index 4b91072f3a4e9..1f2bdd2e1cc59 100644 --- a/drivers/tty/vt/vt_ioctl.c +++ b/drivers/tty/vt/vt_ioctl.c @@ -1103,8 +1103,6 @@ long vt_compat_ioctl(struct tty_struct *tty, case VT_WAITACTIVE: case VT_RELDISP: case VT_DISALLOCATE: - case VT_RESIZE: - case VT_RESIZEX: return vt_ioctl(tty, cmd, arg); /* -- GitLab From 03eb28352302960fbbd57a0d31df6e33f8ee0443 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Wed, 7 May 2025 11:07:28 +0200 Subject: [PATCH 1040/2211] mei: vsc: Cast tx_buf to (__be32 *) when passed to cpu_to_be32_array() [ Upstream commit 97ce0fe2b7240d47d9124daa92217e478c21a3ba ] Commit f88c0c72ffb0 ("mei: vsc: Use struct vsc_tp_packet as vsc-tp tx_buf and rx_buf type") changed the type of tx_buf from "void *" to "struct vsc_tp_packet *" and added a cast to (u32 *) when passing it to cpu_to_be32_array() and the same change was made for rx_buf. This triggers the type-check warning in sparse: vsc-tp.c:327:28: sparse: expected restricted __be32 [usertype] *dst vsc-tp.c:327:28: sparse: got unsigned int [usertype] * vsc-tp.c:343:42: sparse: expected restricted __be32 const [usertype] *src vsc-tp.c:343:42: sparse: got unsigned int [usertype] * Fix this by casting to (__be32 *) instead. Note actually changing the type of the buffers to "be32 *" is not an option this buffer does actually contain a "struct vsc_tp_packet" and is used as such most of the time. vsc_tp_rom_xfer() re-uses the buffers as just dumb arrays of 32 bit words to talk to the device before the firmware has booted, to avoid needing to allocate a separate buffer. Fixes: f88c0c72ffb0 ("mei: vsc: Use struct vsc_tp_packet as vsc-tp tx_buf and rx_buf type") Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202505071634.kZ0I7Va6-lkp@intel.com/ Signed-off-by: Hans de Goede Reviewed-by: Sakari Ailus Link: https://lore.kernel.org/r/20250507090728.115910-1-hdegoede@redhat.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/misc/mei/vsc-tp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/misc/mei/vsc-tp.c b/drivers/misc/mei/vsc-tp.c index ad7c7f1573191..5e44b518f36c7 100644 --- a/drivers/misc/mei/vsc-tp.c +++ b/drivers/misc/mei/vsc-tp.c @@ -324,7 +324,7 @@ int vsc_tp_rom_xfer(struct vsc_tp *tp, const void *obuf, void *ibuf, size_t len) guard(mutex)(&tp->mutex); /* rom xfer is big endian */ - cpu_to_be32_array((u32 *)tp->tx_buf, obuf, words); + cpu_to_be32_array((__be32 *)tp->tx_buf, obuf, words); ret = read_poll_timeout(gpiod_get_value_cansleep, ret, !ret, VSC_TP_ROM_XFER_POLL_DELAY_US, @@ -340,7 +340,7 @@ int vsc_tp_rom_xfer(struct vsc_tp *tp, const void *obuf, void *ibuf, size_t len) return ret; if (ibuf) - be32_to_cpu_array(ibuf, (u32 *)tp->rx_buf, words); + be32_to_cpu_array(ibuf, (__be32 *)tp->rx_buf, words); return ret; } -- GitLab From 9d6c8f5612191ec9c7837c2ce19e995f9d45a105 Mon Sep 17 00:00:00 2001 From: Marius Cristea Date: Thu, 24 Apr 2025 11:06:33 +0300 Subject: [PATCH 1041/2211] iio: adc: PAC1934: fix typo in documentation link [ Upstream commit 52c43d80fa8370eb877fc63b1fc1eec67e1b1410 ] Fix a typo,(PAC1934 -> PAC193X), into the link from an application note related to the ACPI device definition. Fixes: 0fb528c8255b ("iio: adc: adding support for PAC193x") Reported-by: Matteo Martelli Closes: https://patch.msgid.link/172794015844.2520.11909797050797595912@njaxe.localdomain Signed-off-by: Marius Cristea Reviewed-by: David Lechner Link: https://patch.msgid.link/20250424-pac1934-doc_link-v1-1-9832445cb270@microchip.com Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/adc/pac1934.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/iio/adc/pac1934.c b/drivers/iio/adc/pac1934.c index 7ef249d832866..c3f9fa307b84c 100644 --- a/drivers/iio/adc/pac1934.c +++ b/drivers/iio/adc/pac1934.c @@ -1081,7 +1081,7 @@ static int pac1934_chip_identify(struct pac1934_chip_info *info) /* * documentation related to the ACPI device definition - * https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ApplicationNotes/ApplicationNotes/PAC1934-Integration-Notes-for-Microsoft-Windows-10-and-Windows-11-Driver-Support-DS00002534.pdf + * https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ApplicationNotes/ApplicationNotes/PAC193X-Integration-Notes-for-Microsoft-Windows-10-and-Windows-11-Driver-Support-DS00002534.pdf */ static int pac1934_acpi_parse_channel_config(struct i2c_client *client, struct pac1934_chip_info *info) -- GitLab From ad2fc59a67036a298d948de3ad1ffb786c950102 Mon Sep 17 00:00:00 2001 From: Marcus Folkesson Date: Mon, 28 Apr 2025 08:54:11 +0200 Subject: [PATCH 1042/2211] iio: adc: mcp3911: fix device dependent mappings for conversion result registers [ Upstream commit f62c49d8f32d6ce8871b01795498352775aa61db ] The conversion result registers differs between devices. Make sure the mapping is correct by using a device dependent .get_raw() callback function. Fixes: 732ad34260d3 ("iio: adc: mcp3911: add support for the whole MCP39xx family") Co-developed-by: Lukas Rauber Signed-off-by: Lukas Rauber Signed-off-by: Marcus Folkesson Reviewed-by: Andy Shevchenko Link: https://patch.msgid.link/20250428-mcp3911-fixes-v2-1-406e39330c3d@gmail.com Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/adc/mcp3911.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/drivers/iio/adc/mcp3911.c b/drivers/iio/adc/mcp3911.c index b097f04172c80..4bd6b5aac4fe8 100644 --- a/drivers/iio/adc/mcp3911.c +++ b/drivers/iio/adc/mcp3911.c @@ -6,7 +6,7 @@ * Copyright (C) 2018 Kent Gustavsson */ #include -#include +#include #include #include #include @@ -79,6 +79,8 @@ #define MCP3910_CONFIG1_CLKEXT BIT(6) #define MCP3910_CONFIG1_VREFEXT BIT(7) +#define MCP3910_CHANNEL(ch) (MCP3911_REG_CHANNEL0 + (ch)) + #define MCP3910_REG_OFFCAL_CH0 0x0f #define MCP3910_OFFCAL(ch) (MCP3910_REG_OFFCAL_CH0 + (ch) * 6) @@ -110,6 +112,7 @@ struct mcp3911_chip_info { int (*get_offset)(struct mcp3911 *adc, int channel, int *val); int (*set_offset)(struct mcp3911 *adc, int channel, int val); int (*set_scale)(struct mcp3911 *adc, int channel, u32 val); + int (*get_raw)(struct mcp3911 *adc, int channel, int *val); }; struct mcp3911 { @@ -170,6 +173,18 @@ static int mcp3911_update(struct mcp3911 *adc, u8 reg, u32 mask, u32 val, u8 len return mcp3911_write(adc, reg, val, len); } +static int mcp3911_read_s24(struct mcp3911 *const adc, u8 const reg, s32 *const val) +{ + u32 uval; + int const ret = mcp3911_read(adc, reg, &uval, 3); + + if (ret) + return ret; + + *val = sign_extend32(uval, 23); + return ret; +} + static int mcp3910_enable_offset(struct mcp3911 *adc, bool enable) { unsigned int mask = MCP3910_CONFIG0_EN_OFFCAL; @@ -194,6 +209,11 @@ static int mcp3910_set_offset(struct mcp3911 *adc, int channel, int val) return adc->chip->enable_offset(adc, 1); } +static int mcp3910_get_raw(struct mcp3911 *adc, int channel, s32 *val) +{ + return mcp3911_read_s24(adc, MCP3910_CHANNEL(channel), val); +} + static int mcp3911_enable_offset(struct mcp3911 *adc, bool enable) { unsigned int mask = MCP3911_STATUSCOM_EN_OFFCAL; @@ -218,6 +238,11 @@ static int mcp3911_set_offset(struct mcp3911 *adc, int channel, int val) return adc->chip->enable_offset(adc, 1); } +static int mcp3911_get_raw(struct mcp3911 *adc, int channel, s32 *val) +{ + return mcp3911_read_s24(adc, MCP3911_CHANNEL(channel), val); +} + static int mcp3910_get_osr(struct mcp3911 *adc, u32 *val) { int ret; @@ -321,12 +346,9 @@ static int mcp3911_read_raw(struct iio_dev *indio_dev, guard(mutex)(&adc->lock); switch (mask) { case IIO_CHAN_INFO_RAW: - ret = mcp3911_read(adc, - MCP3911_CHANNEL(channel->channel), val, 3); + ret = adc->chip->get_raw(adc, channel->channel, val); if (ret) return ret; - - *val = sign_extend32(*val, 23); return IIO_VAL_INT; case IIO_CHAN_INFO_OFFSET: ret = adc->chip->get_offset(adc, channel->channel, val); @@ -799,6 +821,7 @@ static const struct mcp3911_chip_info mcp3911_chip_info[] = { .get_offset = mcp3910_get_offset, .set_offset = mcp3910_set_offset, .set_scale = mcp3910_set_scale, + .get_raw = mcp3910_get_raw, }, [MCP3911] = { .channels = mcp3911_channels, @@ -810,6 +833,7 @@ static const struct mcp3911_chip_info mcp3911_chip_info[] = { .get_offset = mcp3911_get_offset, .set_offset = mcp3911_set_offset, .set_scale = mcp3911_set_scale, + .get_raw = mcp3911_get_raw, }, [MCP3912] = { .channels = mcp3912_channels, @@ -821,6 +845,7 @@ static const struct mcp3911_chip_info mcp3911_chip_info[] = { .get_offset = mcp3910_get_offset, .set_offset = mcp3910_set_offset, .set_scale = mcp3910_set_scale, + .get_raw = mcp3910_get_raw, }, [MCP3913] = { .channels = mcp3913_channels, @@ -832,6 +857,7 @@ static const struct mcp3911_chip_info mcp3911_chip_info[] = { .get_offset = mcp3910_get_offset, .set_offset = mcp3910_set_offset, .set_scale = mcp3910_set_scale, + .get_raw = mcp3910_get_raw, }, [MCP3914] = { .channels = mcp3914_channels, @@ -843,6 +869,7 @@ static const struct mcp3911_chip_info mcp3911_chip_info[] = { .get_offset = mcp3910_get_offset, .set_offset = mcp3910_set_offset, .set_scale = mcp3910_set_scale, + .get_raw = mcp3910_get_raw, }, [MCP3918] = { .channels = mcp3918_channels, @@ -854,6 +881,7 @@ static const struct mcp3911_chip_info mcp3911_chip_info[] = { .get_offset = mcp3910_get_offset, .set_offset = mcp3910_set_offset, .set_scale = mcp3910_set_scale, + .get_raw = mcp3910_get_raw, }, [MCP3919] = { .channels = mcp3919_channels, @@ -865,6 +893,7 @@ static const struct mcp3911_chip_info mcp3911_chip_info[] = { .get_offset = mcp3910_get_offset, .set_offset = mcp3910_set_offset, .set_scale = mcp3910_set_scale, + .get_raw = mcp3910_get_raw, }, }; static const struct of_device_id mcp3911_dt_ids[] = { -- GitLab From 9f40ae8310a76dea0e814c1365d0c08eae465181 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 21 May 2025 15:41:40 +0200 Subject: [PATCH 1043/2211] USB: gadget: udc: fix const issue in gadget_match_driver() [ Upstream commit 5f5cc794fac605afd3bef8065e33096aeacf6257 ] gadget_match_driver() takes a const pointer, and then decides to cast it away into a non-const one, which is not a good thing to do overall. Fix this up by properly setting the pointers to be const to preserve that attribute. Fixes: d69d80484598 ("driver core: have match() callback in struct bus_type take a const *") Link: https://lore.kernel.org/r/2025052139-rash-unsaddle-7c5e@gregkh Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/gadget/udc/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c index 4b3d5075621aa..d709e24c1fd42 100644 --- a/drivers/usb/gadget/udc/core.c +++ b/drivers/usb/gadget/udc/core.c @@ -1570,7 +1570,7 @@ static int gadget_match_driver(struct device *dev, const struct device_driver *d { struct usb_gadget *gadget = dev_to_usb_gadget(dev); struct usb_udc *udc = gadget->udc; - struct usb_gadget_driver *driver = container_of(drv, + const struct usb_gadget_driver *driver = container_of(drv, struct usb_gadget_driver, driver); /* If the driver specifies a udc_name, it must match the UDC's name */ -- GitLab From 4bd30962f308ed6ffef480e66d300b2fc5b8f592 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 21 May 2025 15:35:24 +0200 Subject: [PATCH 1044/2211] USB: typec: fix const issue in typec_match() [ Upstream commit ae4432e01dd967a64f6670a152d91d5328032726 ] typec_match() takes a const pointer, and then decides to cast it away into a non-const one, which is not a good thing to do overall. Fix this up by properly setting the pointers to be const to preserve that attribute. Reviewed-by: Heikki Krogerus Link: https://lore.kernel.org/r/2025052126-scholar-stainless-ad55@gregkh Fixes: d69d80484598 ("driver core: have match() callback in struct bus_type take a const *") Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/typec/bus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/typec/bus.c b/drivers/usb/typec/bus.c index aa879253d3b81..13044ee5be10d 100644 --- a/drivers/usb/typec/bus.c +++ b/drivers/usb/typec/bus.c @@ -449,7 +449,7 @@ ATTRIBUTE_GROUPS(typec); static int typec_match(struct device *dev, const struct device_driver *driver) { - struct typec_altmode_driver *drv = to_altmode_driver(driver); + const struct typec_altmode_driver *drv = to_altmode_driver(driver); struct typec_altmode *altmode = to_typec_altmode(dev); const struct typec_device_id *id; -- GitLab From 3091d4c0d069051979d6f668de99acf2d58b0a2f Mon Sep 17 00:00:00 2001 From: Ming Lei Date: Tue, 27 May 2025 23:34:05 +0800 Subject: [PATCH 1045/2211] loop: add file_start_write() and file_end_write() [ Upstream commit 39d86db34e41b96bd86f1955cd0ce6cd9c5fca4c ] file_start_write() and file_end_write() should be added around ->write_iter(). Recently we switch to ->write_iter() from vfs_iter_write(), and the implied file_start_write() and file_end_write() are lost. Also we never add them for dio code path, so add them back for covering both. Cc: Jeff Moyer Fixes: f2fed441c69b ("loop: stop using vfs_iter_{read,write} for buffered I/O") Fixes: bc07c10a3603 ("block: loop: support DIO & AIO") Signed-off-by: Ming Lei Link: https://lore.kernel.org/r/20250527153405.837216-1-ming.lei@redhat.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/block/loop.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 0843d229b0f76..e9a197474b9d8 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -323,11 +323,14 @@ end_io: static void lo_rw_aio_do_completion(struct loop_cmd *cmd) { struct request *rq = blk_mq_rq_from_pdu(cmd); + struct loop_device *lo = rq->q->queuedata; if (!atomic_dec_and_test(&cmd->ref)) return; kfree(cmd->bvec); cmd->bvec = NULL; + if (req_op(rq) == REQ_OP_WRITE) + file_end_write(lo->lo_backing_file); if (likely(!blk_should_fake_timeout(rq->q))) blk_mq_complete_request(rq); } @@ -402,9 +405,10 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd, cmd->iocb.ki_flags = 0; } - if (rw == ITER_SOURCE) + if (rw == ITER_SOURCE) { + file_start_write(lo->lo_backing_file); ret = file->f_op->write_iter(&cmd->iocb, &iter); - else + } else ret = file->f_op->read_iter(&cmd->iocb, &iter); lo_rw_aio_do_completion(cmd); -- GitLab From 35f116a4658f787bea7e82fdd23e2e9789254f5e Mon Sep 17 00:00:00 2001 From: Rodrigo Vivi Date: Wed, 21 May 2025 12:51:47 -0400 Subject: [PATCH 1046/2211] drm/xe: Make xe_gt_freq part of the Documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 55f8aa083604ce098c9d6a0911c6bcde15d03a80 ] The documentation was created with the creation of the component, however it has never been actually shown in the actual Documentation. While doing this, fixes the identation style, to avoid new warnings while building htmldocs. Fixes: bef52b5c7a19 ("drm/xe: Create a xe_gt_freq component for raw management and sysfs") Reviewed-by: Lucas De Marchi Link: https://lore.kernel.org/r/20250521165146.39616-3-rodrigo.vivi@intel.com Signed-off-by: Rodrigo Vivi (cherry picked from commit af53f0fd99c3bbb3afd29f1612c9e88c5a92cc01) Signed-off-by: Thomas Hellström Signed-off-by: Sasha Levin --- Documentation/gpu/xe/index.rst | 1 + Documentation/gpu/xe/xe_gt_freq.rst | 14 ++++++++++++++ drivers/gpu/drm/xe/xe_gt_freq.c | 2 ++ 3 files changed, 17 insertions(+) create mode 100644 Documentation/gpu/xe/xe_gt_freq.rst diff --git a/Documentation/gpu/xe/index.rst b/Documentation/gpu/xe/index.rst index 3f07aa3b54325..89bbdcccf8eb7 100644 --- a/Documentation/gpu/xe/index.rst +++ b/Documentation/gpu/xe/index.rst @@ -16,6 +16,7 @@ DG2, etc is provided to prototype the driver. xe_migrate xe_cs xe_pm + xe_gt_freq xe_pcode xe_gt_mcr xe_wa diff --git a/Documentation/gpu/xe/xe_gt_freq.rst b/Documentation/gpu/xe/xe_gt_freq.rst new file mode 100644 index 0000000000000..c0811200e3275 --- /dev/null +++ b/Documentation/gpu/xe/xe_gt_freq.rst @@ -0,0 +1,14 @@ +.. SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +========================== +Xe GT Frequency Management +========================== + +.. kernel-doc:: drivers/gpu/drm/xe/xe_gt_freq.c + :doc: Xe GT Frequency Management + +Internal API +============ + +.. kernel-doc:: drivers/gpu/drm/xe/xe_gt_freq.c + :internal: diff --git a/drivers/gpu/drm/xe/xe_gt_freq.c b/drivers/gpu/drm/xe/xe_gt_freq.c index ab76973f3e1e6..a05fde2c7b122 100644 --- a/drivers/gpu/drm/xe/xe_gt_freq.c +++ b/drivers/gpu/drm/xe/xe_gt_freq.c @@ -32,6 +32,7 @@ * Xe's Freq provides a sysfs API for frequency management: * * device/tile#/gt#/freq0/_freq *read-only* files: + * * - act_freq: The actual resolved frequency decided by PCODE. * - cur_freq: The current one requested by GuC PC to the PCODE. * - rpn_freq: The Render Performance (RP) N level, which is the minimal one. @@ -39,6 +40,7 @@ * - rp0_freq: The Render Performance (RP) 0 level, which is the maximum one. * * device/tile#/gt#/freq0/_freq *read-write* files: + * * - min_freq: Min frequency request. * - max_freq: Max frequency request. * If max <= min, then freq_min becomes a fixed frequency request. -- GitLab From 90891eadb8255e1c6797a52a9006559b922dbf81 Mon Sep 17 00:00:00 2001 From: Tengteng Yang Date: Tue, 27 May 2025 11:04:19 +0800 Subject: [PATCH 1047/2211] Fix sock_exceed_buf_limit not being triggered in __sk_mem_raise_allocated [ Upstream commit 8542d6fac25c03b4bf36b2d762cfe60fda8491bb ] When a process under memory pressure is not part of any cgroup and the charged flag is false, trace_sock_exceed_buf_limit was not called as expected. This regression was introduced by commit 2def8ff3fdb6 ("sock: Code cleanup on __sk_mem_raise_allocated()"). The fix changes the default value of charged to true while preserving existing logic. Fixes: 2def8ff3fdb6 ("sock: Code cleanup on __sk_mem_raise_allocated()") Signed-off-by: Abel Wu Signed-off-by: Tengteng Yang Link: https://patch.msgid.link/20250527030419.67693-1-yangtengteng@bytedance.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/core/sock.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/net/core/sock.c b/net/core/sock.c index 0842dc9189bf8..3c5386c76d6fe 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -3157,16 +3157,16 @@ int __sk_mem_raise_allocated(struct sock *sk, int size, int amt, int kind) { struct mem_cgroup *memcg = mem_cgroup_sockets_enabled ? sk->sk_memcg : NULL; struct proto *prot = sk->sk_prot; - bool charged = false; + bool charged = true; long allocated; sk_memory_allocated_add(sk, amt); allocated = sk_memory_allocated(sk); if (memcg) { - if (!mem_cgroup_charge_skmem(memcg, amt, gfp_memcg_charge())) + charged = mem_cgroup_charge_skmem(memcg, amt, gfp_memcg_charge()); + if (!charged) goto suppress_allocation; - charged = true; } /* Under limit. */ @@ -3251,7 +3251,7 @@ suppress_allocation: sk_memory_allocated_sub(sk, amt); - if (charged) + if (memcg && charged) mem_cgroup_uncharge_skmem(memcg, amt); return 0; -- GitLab From e869a85acc2e60dc554579b910826a4919d8cd98 Mon Sep 17 00:00:00 2001 From: Dong Chenchen Date: Tue, 27 May 2025 19:41:52 +0800 Subject: [PATCH 1048/2211] page_pool: Fix use-after-free in page_pool_recycle_in_ring MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 271683bb2cf32e5126c592b5d5e6a756fa374fd9 ] syzbot reported a uaf in page_pool_recycle_in_ring: BUG: KASAN: slab-use-after-free in lock_release+0x151/0xa30 kernel/locking/lockdep.c:5862 Read of size 8 at addr ffff8880286045a0 by task syz.0.284/6943 CPU: 0 UID: 0 PID: 6943 Comm: syz.0.284 Not tainted 6.13.0-rc3-syzkaller-gdfa94ce54f41 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024 Call Trace: __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x241/0x360 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:378 [inline] print_report+0x169/0x550 mm/kasan/report.c:489 kasan_report+0x143/0x180 mm/kasan/report.c:602 lock_release+0x151/0xa30 kernel/locking/lockdep.c:5862 __raw_spin_unlock_bh include/linux/spinlock_api_smp.h:165 [inline] _raw_spin_unlock_bh+0x1b/0x40 kernel/locking/spinlock.c:210 spin_unlock_bh include/linux/spinlock.h:396 [inline] ptr_ring_produce_bh include/linux/ptr_ring.h:164 [inline] page_pool_recycle_in_ring net/core/page_pool.c:707 [inline] page_pool_put_unrefed_netmem+0x748/0xb00 net/core/page_pool.c:826 page_pool_put_netmem include/net/page_pool/helpers.h:323 [inline] page_pool_put_full_netmem include/net/page_pool/helpers.h:353 [inline] napi_pp_put_page+0x149/0x2b0 net/core/skbuff.c:1036 skb_pp_recycle net/core/skbuff.c:1047 [inline] skb_free_head net/core/skbuff.c:1094 [inline] skb_release_data+0x6c4/0x8a0 net/core/skbuff.c:1125 skb_release_all net/core/skbuff.c:1190 [inline] __kfree_skb net/core/skbuff.c:1204 [inline] sk_skb_reason_drop+0x1c9/0x380 net/core/skbuff.c:1242 kfree_skb_reason include/linux/skbuff.h:1263 [inline] __skb_queue_purge_reason include/linux/skbuff.h:3343 [inline] root cause is: page_pool_recycle_in_ring ptr_ring_produce spin_lock(&r->producer_lock); WRITE_ONCE(r->queue[r->producer++], ptr) //recycle last page to pool page_pool_release page_pool_scrub page_pool_empty_ring ptr_ring_consume page_pool_return_page //release all page __page_pool_destroy free_percpu(pool->recycle_stats); free(pool) //free spin_unlock(&r->producer_lock); //pool->ring uaf read recycle_stat_inc(pool, ring); page_pool can be free while page pool recycle the last page in ring. Add producer-lock barrier to page_pool_release to prevent the page pool from being free before all pages have been recycled. recycle_stat_inc() is empty when CONFIG_PAGE_POOL_STATS is not enabled, which will trigger Wempty-body build warning. Add definition for pool stat macro to fix warning. Suggested-by: Jakub Kicinski Link: https://lore.kernel.org/netdev/20250513083123.3514193-1-dongchenchen2@huawei.com Fixes: ff7d6b27f894 ("page_pool: refurbish version of page_pool code") Reported-by: syzbot+204a4382fcb3311f3858@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=204a4382fcb3311f3858 Signed-off-by: Dong Chenchen Reviewed-by: Toke Høiland-Jørgensen Reviewed-by: Mina Almasry Link: https://patch.msgid.link/20250527114152.3119109-1-dongchenchen2@huawei.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/core/page_pool.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/net/core/page_pool.c b/net/core/page_pool.c index a49b7f3e25dd6..0f23b3126bdaf 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -151,9 +151,9 @@ u64 *page_pool_ethtool_stats_get(u64 *data, const void *stats) EXPORT_SYMBOL(page_pool_ethtool_stats_get); #else -#define alloc_stat_inc(pool, __stat) -#define recycle_stat_inc(pool, __stat) -#define recycle_stat_add(pool, __stat, val) +#define alloc_stat_inc(...) do { } while (0) +#define recycle_stat_inc(...) do { } while (0) +#define recycle_stat_add(...) do { } while (0) #endif static bool page_pool_producer_lock(struct page_pool *pool) @@ -734,19 +734,16 @@ void page_pool_return_page(struct page_pool *pool, netmem_ref netmem) static bool page_pool_recycle_in_ring(struct page_pool *pool, netmem_ref netmem) { - int ret; - /* BH protection not needed if current is softirq */ - if (in_softirq()) - ret = ptr_ring_produce(&pool->ring, (__force void *)netmem); - else - ret = ptr_ring_produce_bh(&pool->ring, (__force void *)netmem); + bool in_softirq, ret; - if (!ret) { + /* BH protection not needed if current is softirq */ + in_softirq = page_pool_producer_lock(pool); + ret = !__ptr_ring_produce(&pool->ring, (__force void *)netmem); + if (ret) recycle_stat_inc(pool, ring); - return true; - } + page_pool_producer_unlock(pool, in_softirq); - return false; + return ret; } /* Only allow direct recycling in special circumstances, into the @@ -1104,10 +1101,14 @@ static void page_pool_scrub(struct page_pool *pool) static int page_pool_release(struct page_pool *pool) { + bool in_softirq; int inflight; page_pool_scrub(pool); inflight = page_pool_inflight(pool, true); + /* Acquire producer lock to make sure producers have exited. */ + in_softirq = page_pool_producer_lock(pool); + page_pool_producer_unlock(pool, in_softirq); if (!inflight) __page_pool_destroy(pool); -- GitLab From 74882beda3a783ce6c7d5c5335070dc40ec04d95 Mon Sep 17 00:00:00 2001 From: Quentin Schulz Date: Tue, 27 May 2025 13:56:23 +0200 Subject: [PATCH 1049/2211] net: stmmac: platform: guarantee uniqueness of bus_id [ Upstream commit eb7fd7aa35bfcc1e1fda4ecc42ccfcb526cdc780 ] bus_id is currently derived from the ethernetX alias. If one is missing for the device, 0 is used. If ethernet0 points to another stmmac device or if there are 2+ stmmac devices without an ethernet alias, then bus_id will be 0 for all of those. This is an issue because the bus_id is used to generate the mdio bus id (new_bus->id in drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c stmmac_mdio_register) and this needs to be unique. This allows to avoid needing to define ethernet aliases for devices with multiple stmmac controllers (such as the Rockchip RK3588) for multiple stmmac devices to probe properly. Obviously, the bus_id isn't guaranteed to be stable across reboots if no alias is set for the device but that is easily fixed by simply adding an alias if this is desired. Fixes: 25c83b5c2e82 ("dt:net:stmmac: Add support to dwmac version 3.610 and 3.710") Signed-off-by: Quentin Schulz Reviewed-by: Maxime Chevallier Link: https://patch.msgid.link/20250527-stmmac-mdio-bus_id-v2-1-a5ca78454e3c@cherry.de Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index aaf008bdbbcd4..8fd868b671a26 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c @@ -419,6 +419,7 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac) struct device_node *np = pdev->dev.of_node; struct plat_stmmacenet_data *plat; struct stmmac_dma_cfg *dma_cfg; + static int bus_id = -ENODEV; int phy_mode; void *ret; int rc; @@ -454,8 +455,14 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac) of_property_read_u32(np, "max-speed", &plat->max_speed); plat->bus_id = of_alias_get_id(np, "ethernet"); - if (plat->bus_id < 0) - plat->bus_id = 0; + if (plat->bus_id < 0) { + if (bus_id < 0) + bus_id = of_alias_get_highest_id("ethernet"); + /* No ethernet alias found, init at -1 so first bus_id is 0 */ + if (bus_id < 0) + bus_id = -1; + plat->bus_id = ++bus_id; + } /* Default to phy auto-detection */ plat->phy_addr = -1; -- GitLab From 5910cbbfad5a5d94e92610fb04c8af56c48a4dfd Mon Sep 17 00:00:00 2001 From: Alok Tiwari Date: Tue, 27 May 2025 06:08:16 -0700 Subject: [PATCH 1050/2211] gve: Fix RX_BUFFERS_POSTED stat to report per-queue fill_cnt [ Upstream commit f41a94aade120dc60322865f363cee7865f2df01 ] Previously, the RX_BUFFERS_POSTED stat incorrectly reported the fill_cnt from RX queue 0 for all queues, resulting in inaccurate per-queue statistics. Fix this by correctly indexing priv->rx[idx].fill_cnt for each RX queue. Fixes: 24aeb56f2d38 ("gve: Add Gvnic stats AQ command and ethtool show/set-priv-flags.") Signed-off-by: Alok Tiwari Link: https://patch.msgid.link/20250527130830.1812903-1-alok.a.tiwari@oracle.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/google/gve/gve_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c index 862c4575701fe..14f39d1f59d36 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -2207,7 +2207,7 @@ void gve_handle_report_stats(struct gve_priv *priv) }; stats[stats_idx++] = (struct stats) { .stat_name = cpu_to_be32(RX_BUFFERS_POSTED), - .value = cpu_to_be64(priv->rx[0].fill_cnt), + .value = cpu_to_be64(priv->rx[idx].fill_cnt), .queue_id = cpu_to_be32(idx), }; } -- GitLab From c762fc79d710d676b793f9d98b1414efe6eb51e6 Mon Sep 17 00:00:00 2001 From: Charalampos Mitrodimas Date: Tue, 27 May 2025 16:35:44 +0000 Subject: [PATCH 1051/2211] net: tipc: fix refcount warning in tipc_aead_encrypt [ Upstream commit f29ccaa07cf3d35990f4d25028cc55470d29372b ] syzbot reported a refcount warning [1] caused by calling get_net() on a network namespace that is being destroyed (refcount=0). This happens when a TIPC discovery timer fires during network namespace cleanup. The recently added get_net() call in commit e279024617134 ("net/tipc: fix slab-use-after-free Read in tipc_aead_encrypt_done") attempts to hold a reference to the network namespace. However, if the namespace is already being destroyed, its refcount might be zero, leading to the use-after-free warning. Replace get_net() with maybe_get_net(), which safely checks if the refcount is non-zero before incrementing it. If the namespace is being destroyed, return -ENODEV early, after releasing the bearer reference. [1]: https://lore.kernel.org/all/68342b55.a70a0220.253bc2.0091.GAE@google.com/T/#m12019cf9ae77e1954f666914640efa36d52704a2 Reported-by: syzbot+f0c4a4aba757549ae26c@syzkaller.appspotmail.com Closes: https://lore.kernel.org/all/68342b55.a70a0220.253bc2.0091.GAE@google.com/T/#m12019cf9ae77e1954f666914640efa36d52704a2 Fixes: e27902461713 ("net/tipc: fix slab-use-after-free Read in tipc_aead_encrypt_done") Signed-off-by: Charalampos Mitrodimas Reviewed-by: Tung Nguyen Link: https://patch.msgid.link/20250527-net-tipc-warning-v2-1-df3dc398a047@posteo.net Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/tipc/crypto.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c index 8584893b47851..79f91b6ca8c84 100644 --- a/net/tipc/crypto.c +++ b/net/tipc/crypto.c @@ -818,7 +818,11 @@ static int tipc_aead_encrypt(struct tipc_aead *aead, struct sk_buff *skb, } /* Get net to avoid freed tipc_crypto when delete namespace */ - get_net(aead->crypto->net); + if (!maybe_get_net(aead->crypto->net)) { + tipc_bearer_put(b); + rc = -ENODEV; + goto exit; + } /* Now, do encrypt */ rc = crypto_aead_encrypt(req); -- GitLab From 4c597fb29034157a3e825a618b6edc2c9b65e280 Mon Sep 17 00:00:00 2001 From: Yanqing Wang Date: Wed, 28 May 2025 15:53:51 +0800 Subject: [PATCH 1052/2211] driver: net: ethernet: mtk_star_emac: fix suspend/resume issue [ Upstream commit ba99c627aac85bc746fb4a6e2d79edb3ad100326 ] Identify the cause of the suspend/resume hang: netif_carrier_off() is called during link state changes and becomes stuck while executing linkwatch_work(). To resolve this issue, call netif_device_detach() during the Ethernet suspend process to temporarily detach the network device from the kernel and prevent the suspend/resume hang. Fixes: 8c7bd5a454ff ("net: ethernet: mtk-star-emac: new driver") Signed-off-by: Yanqing Wang Signed-off-by: Macpaul Lin Signed-off-by: Biao Huang Link: https://patch.msgid.link/20250528075351.593068-1-macpaul.lin@mediatek.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/mediatek/mtk_star_emac.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/ethernet/mediatek/mtk_star_emac.c b/drivers/net/ethernet/mediatek/mtk_star_emac.c index c2ab87828d858..5eb7a97e7eb17 100644 --- a/drivers/net/ethernet/mediatek/mtk_star_emac.c +++ b/drivers/net/ethernet/mediatek/mtk_star_emac.c @@ -1468,6 +1468,8 @@ static __maybe_unused int mtk_star_suspend(struct device *dev) if (netif_running(ndev)) mtk_star_disable(ndev); + netif_device_detach(ndev); + clk_bulk_disable_unprepare(MTK_STAR_NCLKS, priv->clks); return 0; @@ -1492,6 +1494,8 @@ static __maybe_unused int mtk_star_resume(struct device *dev) clk_bulk_disable_unprepare(MTK_STAR_NCLKS, priv->clks); } + netif_device_attach(ndev); + return ret; } -- GitLab From 095fe646f8e39abe345948a50a4605cf5f0e2300 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Wed, 28 May 2025 11:11:09 +0300 Subject: [PATCH 1053/2211] net/mlx4_en: Prevent potential integer overflow calculating Hz [ Upstream commit 54d34165b4f786d7fea8412a18fb4a54c1eab623 ] The "freq" variable is in terms of MHz and "max_val_cycles" is in terms of Hz. The fact that "max_val_cycles" is a u64 suggests that support for high frequency is intended but the "freq_khz * 1000" would overflow the u32 type if we went above 4GHz. Use unsigned long long type for the mutliplication to prevent that. Fixes: 31c128b66e5b ("net/mlx4_en: Choose time-stamping shift value according to HW frequency") Signed-off-by: Dan Carpenter Reviewed-by: Simon Horman Link: https://patch.msgid.link/aDbFHe19juIJKjsb@stanley.mountain Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx4/en_clock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx4/en_clock.c b/drivers/net/ethernet/mellanox/mlx4/en_clock.c index cd754cd76bde1..d73a2044dc266 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_clock.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_clock.c @@ -249,7 +249,7 @@ static const struct ptp_clock_info mlx4_en_ptp_clock_info = { static u32 freq_to_shift(u16 freq) { u32 freq_khz = freq * 1000; - u64 max_val_cycles = freq_khz * 1000 * MLX4_EN_WRAP_AROUND_SEC; + u64 max_val_cycles = freq_khz * 1000ULL * MLX4_EN_WRAP_AROUND_SEC; u64 max_val_cycles_rounded = 1ULL << fls64(max_val_cycles - 1); /* calculate max possible multiplier in order to fit in 64bit */ u64 max_mul = div64_u64(ULLONG_MAX, max_val_cycles_rounded); -- GitLab From df376638df5fd51daca460c4396a982080856e35 Mon Sep 17 00:00:00 2001 From: Horatiu Vultur Date: Wed, 28 May 2025 11:36:19 +0200 Subject: [PATCH 1054/2211] net: lan966x: Make sure to insert the vlan tags also in host mode [ Upstream commit 27eab4c644236a9324084a70fe79e511cbd07393 ] When running these commands on DUT (and similar at the other end) ip link set dev eth0 up ip link add link eth0 name eth0.10 type vlan id 10 ip addr add 10.0.0.1/24 dev eth0.10 ip link set dev eth0.10 up ping 10.0.0.2 The ping will fail. The reason why is failing is because, the network interfaces for lan966x have a flag saying that the HW can insert the vlan tags into the frames(NETIF_F_HW_VLAN_CTAG_TX). Meaning that the frames that are transmitted don't have the vlan tag inside the skb data, but they have it inside the skb. We already get that vlan tag and put it in the IFH but the problem is that we don't configure the HW to rewrite the frame when the interface is in host mode. The fix consists in actually configuring the HW to insert the vlan tag if it is different than 0. Reviewed-by: Maxime Chevallier Fixes: 6d2c186afa5d ("net: lan966x: Add vlan support.") Signed-off-by: Horatiu Vultur Link: https://patch.msgid.link/20250528093619.3738998-1-horatiu.vultur@microchip.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- .../ethernet/microchip/lan966x/lan966x_main.c | 1 + .../ethernet/microchip/lan966x/lan966x_main.h | 1 + .../microchip/lan966x/lan966x_switchdev.c | 1 + .../ethernet/microchip/lan966x/lan966x_vlan.c | 21 +++++++++++++++++++ 4 files changed, 24 insertions(+) diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_main.c b/drivers/net/ethernet/microchip/lan966x/lan966x_main.c index 73832bba93270..b34e015eedf9b 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_main.c +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_main.c @@ -880,6 +880,7 @@ static int lan966x_probe_port(struct lan966x *lan966x, u32 p, lan966x_vlan_port_set_vlan_aware(port, 0); lan966x_vlan_port_set_vid(port, HOST_PVID, false, false); lan966x_vlan_port_apply(port); + lan966x_vlan_port_rew_host(port); return 0; } diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_main.h b/drivers/net/ethernet/microchip/lan966x/lan966x_main.h index bd3d19cea0034..8aa39497818fe 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_main.h +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_main.h @@ -497,6 +497,7 @@ void lan966x_vlan_port_apply(struct lan966x_port *port); bool lan966x_vlan_cpu_member_cpu_vlan_mask(struct lan966x *lan966x, u16 vid); void lan966x_vlan_port_set_vlan_aware(struct lan966x_port *port, bool vlan_aware); +void lan966x_vlan_port_rew_host(struct lan966x_port *port); int lan966x_vlan_port_set_vid(struct lan966x_port *port, u16 vid, bool pvid, diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c b/drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c index 1c88120eb291a..bcb4db76b75cd 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c @@ -297,6 +297,7 @@ static void lan966x_port_bridge_leave(struct lan966x_port *port, lan966x_vlan_port_set_vlan_aware(port, false); lan966x_vlan_port_set_vid(port, HOST_PVID, false, false); lan966x_vlan_port_apply(port); + lan966x_vlan_port_rew_host(port); } int lan966x_port_changeupper(struct net_device *dev, diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_vlan.c b/drivers/net/ethernet/microchip/lan966x/lan966x_vlan.c index fa34a739c748e..7da22520724ce 100644 --- a/drivers/net/ethernet/microchip/lan966x/lan966x_vlan.c +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_vlan.c @@ -149,6 +149,27 @@ void lan966x_vlan_port_set_vlan_aware(struct lan966x_port *port, port->vlan_aware = vlan_aware; } +/* When the interface is in host mode, the interface should not be vlan aware + * but it should insert all the tags that it gets from the network stack. + * The tags are not in the data of the frame but actually in the skb and the ifh + * is configured already to get this tag. So what we need to do is to update the + * rewriter to insert the vlan tag for all frames which have a vlan tag + * different than 0. + */ +void lan966x_vlan_port_rew_host(struct lan966x_port *port) +{ + struct lan966x *lan966x = port->lan966x; + u32 val; + + /* Tag all frames except when VID=0*/ + val = REW_TAG_CFG_TAG_CFG_SET(2); + + /* Update only some bits in the register */ + lan_rmw(val, + REW_TAG_CFG_TAG_CFG, + lan966x, REW_TAG_CFG(port->chip_port)); +} + void lan966x_vlan_port_apply(struct lan966x_port *port) { struct lan966x *lan966x = port->lan966x; -- GitLab From 408ca1d1803b223d615f9021055f9ccb4f4863ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Thu, 29 May 2025 15:09:14 +0200 Subject: [PATCH 1055/2211] spi: bcm63xx-spi: fix shared reset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 5ad20e3d8cfe3b2e42bbddc7e0ebaa74479bb589 ] Some bmips SoCs (bcm6362, bcm63268) share the same SPI reset for both SPI and HSSPI controllers, so reset shouldn't be exclusive. Fixes: 38807adeaf1e ("spi: bcm63xx-spi: add reset support") Reported-by: Jonas Gorski Signed-off-by: Álvaro Fernández Rojas Reviewed-by: Florian Fainelli Link: https://patch.msgid.link/20250529130915.2519590-2-noltari@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-bcm63xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/spi/spi-bcm63xx.c b/drivers/spi/spi-bcm63xx.c index ef3a7226db125..a95badb7b7114 100644 --- a/drivers/spi/spi-bcm63xx.c +++ b/drivers/spi/spi-bcm63xx.c @@ -523,7 +523,7 @@ static int bcm63xx_spi_probe(struct platform_device *pdev) return PTR_ERR(clk); } - reset = devm_reset_control_get_optional_exclusive(dev, NULL); + reset = devm_reset_control_get_optional_shared(dev, NULL); if (IS_ERR(reset)) return PTR_ERR(reset); -- GitLab From 2a98786e258718ff93ef6d6bd26a9a39076e0cb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Thu, 29 May 2025 15:09:15 +0200 Subject: [PATCH 1056/2211] spi: bcm63xx-hsspi: fix shared reset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 3d6d84c8f2f66d3fd6a43a1e2ce8e6b54c573960 ] Some bmips SoCs (bcm6362, bcm63268) share the same SPI reset for both SPI and HSSPI controllers, so reset shouldn't be exclusive. Fixes: 0eeadddbf09a ("spi: bcm63xx-hsspi: add reset support") Reported-by: Jonas Gorski Signed-off-by: Álvaro Fernández Rojas Reviewed-by: Florian Fainelli Link: https://patch.msgid.link/20250529130915.2519590-3-noltari@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-bcm63xx-hsspi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/spi/spi-bcm63xx-hsspi.c b/drivers/spi/spi-bcm63xx-hsspi.c index 1ca857c2a4aa3..8df12efeea21c 100644 --- a/drivers/spi/spi-bcm63xx-hsspi.c +++ b/drivers/spi/spi-bcm63xx-hsspi.c @@ -745,7 +745,7 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) if (IS_ERR(clk)) return PTR_ERR(clk); - reset = devm_reset_control_get_optional_exclusive(dev, NULL); + reset = devm_reset_control_get_optional_shared(dev, NULL); if (IS_ERR(reset)) return PTR_ERR(reset); -- GitLab From b788cebf72f378216d9822164f2d796fd3390d31 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 28 May 2025 14:53:11 -0400 Subject: [PATCH 1057/2211] Bluetooth: L2CAP: Fix not responding with L2CAP_CR_LE_ENCRYPTION [ Upstream commit 03dba9cea72f977e873e4e60e220fa596959dd8f ] Depending on the security set the response to L2CAP_LE_CONN_REQ shall be just L2CAP_CR_LE_ENCRYPTION if only encryption when BT_SECURITY_MEDIUM is selected since that means security mode 2 which doesn't require authentication which is something that is covered in the qualification test L2CAP/LE/CFC/BV-25-C. Link: https://github.com/bluez/bluez/issues/1270 Fixes: 27e2d4c8d28b ("Bluetooth: Add basic LE L2CAP connect request receiving support") Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- net/bluetooth/l2cap_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 66fa5d6fea6ca..a40534bf9084d 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -4835,7 +4835,8 @@ static int l2cap_le_connect_req(struct l2cap_conn *conn, if (!smp_sufficient_security(conn->hcon, pchan->sec_level, SMP_ALLOW_STK)) { - result = L2CAP_CR_LE_AUTHENTICATION; + result = pchan->sec_level == BT_SECURITY_MEDIUM ? + L2CAP_CR_LE_ENCRYPTION : L2CAP_CR_LE_AUTHENTICATION; chan = NULL; goto response_unlock; } -- GitLab From 276849954d7cbe6eec827b21fe2df43f9bf07011 Mon Sep 17 00:00:00 2001 From: Michal Kubiak Date: Tue, 13 May 2025 12:55:27 +0200 Subject: [PATCH 1058/2211] ice: fix Tx scheduler error handling in XDP callback [ Upstream commit 0153f36041b8e52019ebfa8629c13bf8f9b0a951 ] When the XDP program is loaded, the XDP callback adds new Tx queues. This means that the callback must update the Tx scheduler with the new queue number. In the event of a Tx scheduler failure, the XDP callback should also fail and roll back any changes previously made for XDP preparation. The previous implementation had a bug that not all changes made by the XDP callback were rolled back. This caused the crash with the following call trace: [ +9.549584] ice 0000:ca:00.0: Failed VSI LAN queue config for XDP, error: -5 [ +0.382335] Oops: general protection fault, probably for non-canonical address 0x50a2250a90495525: 0000 [#1] SMP NOPTI [ +0.010710] CPU: 103 UID: 0 PID: 0 Comm: swapper/103 Not tainted 6.14.0-net-next-mar-31+ #14 PREEMPT(voluntary) [ +0.010175] Hardware name: Intel Corporation M50CYP2SBSTD/M50CYP2SBSTD, BIOS SE5C620.86B.01.01.0005.2202160810 02/16/2022 [ +0.010946] RIP: 0010:__ice_update_sample+0x39/0xe0 [ice] [...] [ +0.002715] Call Trace: [ +0.002452] [ +0.002021] ? __die_body.cold+0x19/0x29 [ +0.003922] ? die_addr+0x3c/0x60 [ +0.003319] ? exc_general_protection+0x17c/0x400 [ +0.004707] ? asm_exc_general_protection+0x26/0x30 [ +0.004879] ? __ice_update_sample+0x39/0xe0 [ice] [ +0.004835] ice_napi_poll+0x665/0x680 [ice] [ +0.004320] __napi_poll+0x28/0x190 [ +0.003500] net_rx_action+0x198/0x360 [ +0.003752] ? update_rq_clock+0x39/0x220 [ +0.004013] handle_softirqs+0xf1/0x340 [ +0.003840] ? sched_clock_cpu+0xf/0x1f0 [ +0.003925] __irq_exit_rcu+0xc2/0xe0 [ +0.003665] common_interrupt+0x85/0xa0 [ +0.003839] [ +0.002098] [ +0.002106] asm_common_interrupt+0x26/0x40 [ +0.004184] RIP: 0010:cpuidle_enter_state+0xd3/0x690 Fix this by performing the missing unmapping of XDP queues from q_vectors and setting the XDP rings pointer back to NULL after all those queues are released. Also, add an immediate exit from the XDP callback in case of ring preparation failure. Fixes: efc2214b6047 ("ice: Add support for XDP") Reviewed-by: Dawid Osuchowski Reviewed-by: Przemek Kitszel Reviewed-by: Jacob Keller Signed-off-by: Michal Kubiak Reviewed-by: Aleksandr Loktionov Reviewed-by: Simon Horman Tested-by: Jesse Brandeburg Tested-by: Saritha Sanigani (A Contingent Worker at Intel) Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ice/ice_main.c | 47 ++++++++++++++++------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index 63d2105fce933..d1abd21cfc647 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -2761,6 +2761,27 @@ void ice_map_xdp_rings(struct ice_vsi *vsi) } } +/** + * ice_unmap_xdp_rings - Unmap XDP rings from interrupt vectors + * @vsi: the VSI with XDP rings being unmapped + */ +static void ice_unmap_xdp_rings(struct ice_vsi *vsi) +{ + int v_idx; + + ice_for_each_q_vector(vsi, v_idx) { + struct ice_q_vector *q_vector = vsi->q_vectors[v_idx]; + struct ice_tx_ring *ring; + + ice_for_each_tx_ring(ring, q_vector->tx) + if (!ring->tx_buf || !ice_ring_is_xdp(ring)) + break; + + /* restore the value of last node prior to XDP setup */ + q_vector->tx.tx_ring = ring; + } +} + /** * ice_prepare_xdp_rings - Allocate, configure and setup Tx rings for XDP * @vsi: VSI to bring up Tx rings used by XDP @@ -2824,7 +2845,7 @@ int ice_prepare_xdp_rings(struct ice_vsi *vsi, struct bpf_prog *prog, if (status) { dev_err(dev, "Failed VSI LAN queue config for XDP, error: %d\n", status); - goto clear_xdp_rings; + goto unmap_xdp_rings; } /* assign the prog only when it's not already present on VSI; @@ -2840,6 +2861,8 @@ int ice_prepare_xdp_rings(struct ice_vsi *vsi, struct bpf_prog *prog, ice_vsi_assign_bpf_prog(vsi, prog); return 0; +unmap_xdp_rings: + ice_unmap_xdp_rings(vsi); clear_xdp_rings: ice_for_each_xdp_txq(vsi, i) if (vsi->xdp_rings[i]) { @@ -2856,6 +2879,8 @@ err_map_xdp: mutex_unlock(&pf->avail_q_mutex); devm_kfree(dev, vsi->xdp_rings); + vsi->xdp_rings = NULL; + return -ENOMEM; } @@ -2871,7 +2896,7 @@ int ice_destroy_xdp_rings(struct ice_vsi *vsi, enum ice_xdp_cfg cfg_type) { u16 max_txqs[ICE_MAX_TRAFFIC_CLASS] = { 0 }; struct ice_pf *pf = vsi->back; - int i, v_idx; + int i; /* q_vectors are freed in reset path so there's no point in detaching * rings @@ -2879,17 +2904,7 @@ int ice_destroy_xdp_rings(struct ice_vsi *vsi, enum ice_xdp_cfg cfg_type) if (cfg_type == ICE_XDP_CFG_PART) goto free_qmap; - ice_for_each_q_vector(vsi, v_idx) { - struct ice_q_vector *q_vector = vsi->q_vectors[v_idx]; - struct ice_tx_ring *ring; - - ice_for_each_tx_ring(ring, q_vector->tx) - if (!ring->tx_buf || !ice_ring_is_xdp(ring)) - break; - - /* restore the value of last node prior to XDP setup */ - q_vector->tx.tx_ring = ring; - } + ice_unmap_xdp_rings(vsi); free_qmap: mutex_lock(&pf->avail_q_mutex); @@ -3034,11 +3049,14 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog, xdp_ring_err = ice_vsi_determine_xdp_res(vsi); if (xdp_ring_err) { NL_SET_ERR_MSG_MOD(extack, "Not enough Tx resources for XDP"); + goto resume_if; } else { xdp_ring_err = ice_prepare_xdp_rings(vsi, prog, ICE_XDP_CFG_FULL); - if (xdp_ring_err) + if (xdp_ring_err) { NL_SET_ERR_MSG_MOD(extack, "Setting up XDP Tx resources failed"); + goto resume_if; + } } xdp_features_set_redirect_target(vsi->netdev, true); /* reallocate Rx queues that are used for zero-copy */ @@ -3056,6 +3074,7 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog, NL_SET_ERR_MSG_MOD(extack, "Freeing XDP Rx resources failed"); } +resume_if: if (if_running) ret = ice_up(vsi); -- GitLab From f9c3e8573b652dd1249580229f1b6c30bff30e2e Mon Sep 17 00:00:00 2001 From: Michal Kubiak Date: Tue, 13 May 2025 12:55:28 +0200 Subject: [PATCH 1059/2211] ice: create new Tx scheduler nodes for new queues only [ Upstream commit 6fa2942578472c9cab13a8fc1dae0d830193e0a1 ] The current implementation of the Tx scheduler tree attempts to create nodes for all Tx queues, ignoring the fact that some queues may already exist in the tree. For example, if the VSI already has 128 Tx queues and the user requests for 16 new queues, the Tx scheduler will compute the tree for 272 queues (128 existing queues + 144 new queues), instead of 144 queues (128 existing queues and 16 new queues). Fix that by modifying the node count calculation algorithm to skip the queues that already exist in the tree. Fixes: 5513b920a4f7 ("ice: Update Tx scheduler tree for VSI multi-Tx queue support") Reviewed-by: Dawid Osuchowski Reviewed-by: Przemek Kitszel Reviewed-by: Jacob Keller Signed-off-by: Michal Kubiak Reviewed-by: Simon Horman Tested-by: Jesse Brandeburg Tested-by: Saritha Sanigani (A Contingent Worker at Intel) Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ice/ice_sched.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/intel/ice/ice_sched.c b/drivers/net/ethernet/intel/ice/ice_sched.c index 6ca13c5dcb14e..6524875b34d39 100644 --- a/drivers/net/ethernet/intel/ice/ice_sched.c +++ b/drivers/net/ethernet/intel/ice/ice_sched.c @@ -1604,16 +1604,16 @@ ice_sched_get_agg_node(struct ice_port_info *pi, struct ice_sched_node *tc_node, /** * ice_sched_calc_vsi_child_nodes - calculate number of VSI child nodes * @hw: pointer to the HW struct - * @num_qs: number of queues + * @num_new_qs: number of new queues that will be added to the tree * @num_nodes: num nodes array * * This function calculates the number of VSI child nodes based on the * number of queues. */ static void -ice_sched_calc_vsi_child_nodes(struct ice_hw *hw, u16 num_qs, u16 *num_nodes) +ice_sched_calc_vsi_child_nodes(struct ice_hw *hw, u16 num_new_qs, u16 *num_nodes) { - u16 num = num_qs; + u16 num = num_new_qs; u8 i, qgl, vsil; qgl = ice_sched_get_qgrp_layer(hw); @@ -1863,8 +1863,9 @@ ice_sched_update_vsi_child_nodes(struct ice_port_info *pi, u16 vsi_handle, return status; } - if (new_numqs) - ice_sched_calc_vsi_child_nodes(hw, new_numqs, new_num_nodes); + ice_sched_calc_vsi_child_nodes(hw, new_numqs - prev_numqs, + new_num_nodes); + /* Keep the max number of queue configuration all the time. Update the * tree only if number of queues > previous number of queues. This may * leave some extra nodes in the tree if number of queues < previous -- GitLab From 635fd9cead3d4f218ebfdccc5e174b62a2182901 Mon Sep 17 00:00:00 2001 From: Michal Kubiak Date: Tue, 13 May 2025 12:55:29 +0200 Subject: [PATCH 1060/2211] ice: fix rebuilding the Tx scheduler tree for large queue counts [ Upstream commit 73145e6d81070d34a21431c9e0d7aaf2f29ca048 ] The current implementation of the Tx scheduler allows the tree to be rebuilt as the user adds more Tx queues to the VSI. In such a case, additional child nodes are added to the tree to support the new number of queues. Unfortunately, this algorithm does not take into account that the limit of the VSI support node may be exceeded, so an additional node in the VSI layer may be required to handle all the requested queues. Such a scenario occurs when adding XDP Tx queues on machines with many CPUs. Although the driver still respects the queue limit returned by the FW, the Tx scheduler was unable to add those queues to its tree and returned one of the errors below. Such a scenario occurs when adding XDP Tx queues on machines with many CPUs (e.g. at least 321 CPUs, if there is already 128 Tx/Rx queue pairs). Although the driver still respects the queue limit returned by the FW, the Tx scheduler was unable to add those queues to its tree and returned the following errors: Failed VSI LAN queue config for XDP, error: -5 or: Failed to set LAN Tx queue context, error: -22 Fix this problem by extending the tree rebuild algorithm to check if the current VSI node can support the requested number of queues. If it cannot, create as many additional VSI support nodes as necessary to handle all the required Tx queues. Symmetrically, adjust the VSI node removal algorithm to remove all nodes associated with the given VSI. Also, make the search for the next free VSI node more restrictive. That is, add queue group nodes only to the VSI support nodes that have a matching VSI handle. Finally, fix the comment describing the tree update algorithm to better reflect the current scenario. Fixes: b0153fdd7e8a ("ice: update VSI config dynamically") Reviewed-by: Dawid Osuchowski Reviewed-by: Przemek Kitszel Signed-off-by: Michal Kubiak Reviewed-by: Simon Horman Tested-by: Jesse Brandeburg Tested-by: Saritha Sanigani (A Contingent Worker at Intel) Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ice/ice_sched.c | 170 +++++++++++++++++---- 1 file changed, 142 insertions(+), 28 deletions(-) diff --git a/drivers/net/ethernet/intel/ice/ice_sched.c b/drivers/net/ethernet/intel/ice/ice_sched.c index 6524875b34d39..d9d09296d1d48 100644 --- a/drivers/net/ethernet/intel/ice/ice_sched.c +++ b/drivers/net/ethernet/intel/ice/ice_sched.c @@ -84,6 +84,27 @@ ice_sched_find_node_by_teid(struct ice_sched_node *start_node, u32 teid) return NULL; } +/** + * ice_sched_find_next_vsi_node - find the next node for a given VSI + * @vsi_node: VSI support node to start search with + * + * Return: Next VSI support node, or NULL. + * + * The function returns a pointer to the next node from the VSI layer + * assigned to the given VSI, or NULL if there is no such a node. + */ +static struct ice_sched_node * +ice_sched_find_next_vsi_node(struct ice_sched_node *vsi_node) +{ + unsigned int vsi_handle = vsi_node->vsi_handle; + + while ((vsi_node = vsi_node->sibling) != NULL) + if (vsi_node->vsi_handle == vsi_handle) + break; + + return vsi_node; +} + /** * ice_aqc_send_sched_elem_cmd - send scheduling elements cmd * @hw: pointer to the HW struct @@ -1084,8 +1105,10 @@ ice_sched_add_nodes_to_layer(struct ice_port_info *pi, if (parent->num_children < max_child_nodes) { new_num_nodes = max_child_nodes - parent->num_children; } else { - /* This parent is full, try the next sibling */ - parent = parent->sibling; + /* This parent is full, + * try the next available sibling. + */ + parent = ice_sched_find_next_vsi_node(parent); /* Don't modify the first node TEID memory if the * first node was added already in the above call. * Instead send some temp memory for all other @@ -1528,12 +1551,23 @@ ice_sched_get_free_qparent(struct ice_port_info *pi, u16 vsi_handle, u8 tc, /* get the first queue group node from VSI sub-tree */ qgrp_node = ice_sched_get_first_node(pi, vsi_node, qgrp_layer); while (qgrp_node) { + struct ice_sched_node *next_vsi_node; + /* make sure the qgroup node is part of the VSI subtree */ if (ice_sched_find_node_in_subtree(pi->hw, vsi_node, qgrp_node)) if (qgrp_node->num_children < max_children && qgrp_node->owner == owner) break; qgrp_node = qgrp_node->sibling; + if (qgrp_node) + continue; + + next_vsi_node = ice_sched_find_next_vsi_node(vsi_node); + if (!next_vsi_node) + break; + + vsi_node = next_vsi_node; + qgrp_node = ice_sched_get_first_node(pi, vsi_node, qgrp_layer); } /* Select the best queue group */ @@ -1779,7 +1813,11 @@ ice_sched_add_vsi_support_nodes(struct ice_port_info *pi, u16 vsi_handle, if (!parent) return -EIO; - if (i == vsil) + /* Do not modify the VSI handle for already existing VSI nodes, + * (if no new VSI node was added to the tree). + * Assign the VSI handle only to newly added VSI nodes. + */ + if (i == vsil && num_added) parent->vsi_handle = vsi_handle; } @@ -1812,6 +1850,41 @@ ice_sched_add_vsi_to_topo(struct ice_port_info *pi, u16 vsi_handle, u8 tc) num_nodes); } +/** + * ice_sched_recalc_vsi_support_nodes - recalculate VSI support nodes count + * @hw: pointer to the HW struct + * @vsi_node: pointer to the leftmost VSI node that needs to be extended + * @new_numqs: new number of queues that has to be handled by the VSI + * @new_num_nodes: pointer to nodes count table to modify the VSI layer entry + * + * This function recalculates the number of supported nodes that need to + * be added after adding more Tx queues for a given VSI. + * The number of new VSI support nodes that shall be added will be saved + * to the @new_num_nodes table for the VSI layer. + */ +static void +ice_sched_recalc_vsi_support_nodes(struct ice_hw *hw, + struct ice_sched_node *vsi_node, + unsigned int new_numqs, u16 *new_num_nodes) +{ + u32 vsi_nodes_cnt = 1; + u32 max_queue_cnt = 1; + u32 qgl, vsil; + + qgl = ice_sched_get_qgrp_layer(hw); + vsil = ice_sched_get_vsi_layer(hw); + + for (u32 i = vsil; i <= qgl; i++) + max_queue_cnt *= hw->max_children[i]; + + while ((vsi_node = ice_sched_find_next_vsi_node(vsi_node)) != NULL) + vsi_nodes_cnt++; + + if (new_numqs > (max_queue_cnt * vsi_nodes_cnt)) + new_num_nodes[vsil] = DIV_ROUND_UP(new_numqs, max_queue_cnt) - + vsi_nodes_cnt; +} + /** * ice_sched_update_vsi_child_nodes - update VSI child nodes * @pi: port information structure @@ -1863,16 +1936,25 @@ ice_sched_update_vsi_child_nodes(struct ice_port_info *pi, u16 vsi_handle, return status; } + ice_sched_recalc_vsi_support_nodes(hw, vsi_node, + new_numqs, new_num_nodes); ice_sched_calc_vsi_child_nodes(hw, new_numqs - prev_numqs, new_num_nodes); - /* Keep the max number of queue configuration all the time. Update the - * tree only if number of queues > previous number of queues. This may + /* Never decrease the number of queues in the tree. Update the tree + * only if number of queues > previous number of queues. This may * leave some extra nodes in the tree if number of queues < previous * number but that wouldn't harm anything. Removing those extra nodes * may complicate the code if those nodes are part of SRL or * individually rate limited. + * Also, add the required VSI support nodes if the existing ones cannot + * handle the requested new number of queues. */ + status = ice_sched_add_vsi_support_nodes(pi, vsi_handle, tc_node, + new_num_nodes); + if (status) + return status; + status = ice_sched_add_vsi_child_nodes(pi, vsi_handle, tc_node, new_num_nodes, owner); if (status) @@ -2013,6 +2095,58 @@ static bool ice_sched_is_leaf_node_present(struct ice_sched_node *node) return (node->info.data.elem_type == ICE_AQC_ELEM_TYPE_LEAF); } +/** + * ice_sched_rm_vsi_subtree - remove all nodes assigned to a given VSI + * @pi: port information structure + * @vsi_node: pointer to the leftmost node of the VSI to be removed + * @owner: LAN or RDMA + * @tc: TC number + * + * Return: Zero in case of success, or -EBUSY if the VSI has leaf nodes in TC. + * + * This function removes all the VSI support nodes associated with a given VSI + * and its LAN or RDMA children nodes from the scheduler tree. + */ +static int +ice_sched_rm_vsi_subtree(struct ice_port_info *pi, + struct ice_sched_node *vsi_node, u8 owner, u8 tc) +{ + u16 vsi_handle = vsi_node->vsi_handle; + bool all_vsi_nodes_removed = true; + int j = 0; + + while (vsi_node) { + struct ice_sched_node *next_vsi_node; + + if (ice_sched_is_leaf_node_present(vsi_node)) { + ice_debug(pi->hw, ICE_DBG_SCHED, "VSI has leaf nodes in TC %d\n", tc); + return -EBUSY; + } + while (j < vsi_node->num_children) { + if (vsi_node->children[j]->owner == owner) + ice_free_sched_node(pi, vsi_node->children[j]); + else + j++; + } + + next_vsi_node = ice_sched_find_next_vsi_node(vsi_node); + + /* remove the VSI if it has no children */ + if (!vsi_node->num_children) + ice_free_sched_node(pi, vsi_node); + else + all_vsi_nodes_removed = false; + + vsi_node = next_vsi_node; + } + + /* clean up aggregator related VSI info if any */ + if (all_vsi_nodes_removed) + ice_sched_rm_agg_vsi_info(pi, vsi_handle); + + return 0; +} + /** * ice_sched_rm_vsi_cfg - remove the VSI and its children nodes * @pi: port information structure @@ -2039,7 +2173,6 @@ ice_sched_rm_vsi_cfg(struct ice_port_info *pi, u16 vsi_handle, u8 owner) ice_for_each_traffic_class(i) { struct ice_sched_node *vsi_node, *tc_node; - u8 j = 0; tc_node = ice_sched_get_tc_node(pi, i); if (!tc_node) @@ -2049,31 +2182,12 @@ ice_sched_rm_vsi_cfg(struct ice_port_info *pi, u16 vsi_handle, u8 owner) if (!vsi_node) continue; - if (ice_sched_is_leaf_node_present(vsi_node)) { - ice_debug(pi->hw, ICE_DBG_SCHED, "VSI has leaf nodes in TC %d\n", i); - status = -EBUSY; + status = ice_sched_rm_vsi_subtree(pi, vsi_node, owner, i); + if (status) goto exit_sched_rm_vsi_cfg; - } - while (j < vsi_node->num_children) { - if (vsi_node->children[j]->owner == owner) { - ice_free_sched_node(pi, vsi_node->children[j]); - /* reset the counter again since the num - * children will be updated after node removal - */ - j = 0; - } else { - j++; - } - } - /* remove the VSI if it has no children */ - if (!vsi_node->num_children) { - ice_free_sched_node(pi, vsi_node); - vsi_ctx->sched.vsi_node[i] = NULL; + vsi_ctx->sched.vsi_node[i] = NULL; - /* clean up aggregator related VSI info if any */ - ice_sched_rm_agg_vsi_info(pi, vsi_handle); - } if (owner == ICE_SCHED_NODE_OWNER_LAN) vsi_ctx->sched.max_lanq[i] = 0; else -- GitLab From 12e40d01d6d1aa9224200d6b9d9570d6aa68ef74 Mon Sep 17 00:00:00 2001 From: Brian Vazquez Date: Thu, 1 May 2025 17:06:17 +0000 Subject: [PATCH 1061/2211] idpf: fix a race in txq wakeup [ Upstream commit 7292af042bcf22e2c18b96ed250f78498a5b28ab ] Add a helper function to correctly handle the lockless synchronization when the sender needs to block. The paradigm is if (no_resources()) { stop_queue(); barrier(); if (!no_resources()) restart_queue(); } netif_subqueue_maybe_stop already handles the paradigm correctly, but the code split the check for resources in three parts, the first one (descriptors) followed the protocol, but the other two (completions and tx_buf) were only doing the first part and so race prone. Luckily netif_subqueue_maybe_stop macro already allows you to use a function to evaluate the start/stop conditions so the fix only requires the right helper function to evaluate all the conditions at once. The patch removes idpf_tx_maybe_stop_common since it's no longer needed and instead adjusts separately the conditions for singleq and splitq. Note that idpf_tx_buf_hw_update doesn't need to check for resources since that will be covered in idpf_tx_splitq_frame. To reproduce: Reduce the threshold for pending completions to increase the chances of hitting this pause by changing your kernel: drivers/net/ethernet/intel/idpf/idpf_txrx.h -#define IDPF_TX_COMPLQ_OVERFLOW_THRESH(txcq) ((txcq)->desc_count >> 1) +#define IDPF_TX_COMPLQ_OVERFLOW_THRESH(txcq) ((txcq)->desc_count >> 4) Use pktgen to force the host to push small pkts very aggressively: ./pktgen_sample02_multiqueue.sh -i eth1 -s 100 -6 -d $IP -m $MAC \ -p 10000-10000 -t 16 -n 0 -v -x -c 64 Fixes: 6818c4d5b3c2 ("idpf: add splitq start_xmit") Reviewed-by: Jacob Keller Reviewed-by: Madhu Chittim Signed-off-by: Josh Hay Signed-off-by: Brian Vazquez Signed-off-by: Luigi Rizzo Reviewed-by: Simon Horman Tested-by: Samuel Salin Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- .../ethernet/intel/idpf/idpf_singleq_txrx.c | 9 ++-- drivers/net/ethernet/intel/idpf/idpf_txrx.c | 45 +++++++------------ drivers/net/ethernet/intel/idpf/idpf_txrx.h | 8 ---- 3 files changed, 22 insertions(+), 40 deletions(-) diff --git a/drivers/net/ethernet/intel/idpf/idpf_singleq_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_singleq_txrx.c index dfd7cf1d9aa0a..a986dd5725559 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_singleq_txrx.c +++ b/drivers/net/ethernet/intel/idpf/idpf_singleq_txrx.c @@ -362,17 +362,18 @@ netdev_tx_t idpf_tx_singleq_frame(struct sk_buff *skb, { struct idpf_tx_offload_params offload = { }; struct idpf_tx_buf *first; + int csum, tso, needed; unsigned int count; __be16 protocol; - int csum, tso; count = idpf_tx_desc_count_required(tx_q, skb); if (unlikely(!count)) return idpf_tx_drop_skb(tx_q, skb); - if (idpf_tx_maybe_stop_common(tx_q, - count + IDPF_TX_DESCS_PER_CACHE_LINE + - IDPF_TX_DESCS_FOR_CTX)) { + needed = count + IDPF_TX_DESCS_PER_CACHE_LINE + IDPF_TX_DESCS_FOR_CTX; + if (!netif_subqueue_maybe_stop(tx_q->netdev, tx_q->idx, + IDPF_DESC_UNUSED(tx_q), + needed, needed)) { idpf_tx_buf_hw_update(tx_q, tx_q->next_to_use, false); u64_stats_update_begin(&tx_q->stats_sync); diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c index 623bf17f87f9c..c6c36de58b9d1 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c +++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c @@ -2132,6 +2132,19 @@ void idpf_tx_splitq_build_flow_desc(union idpf_tx_flex_desc *desc, desc->flow.qw1.compl_tag = cpu_to_le16(params->compl_tag); } +/* Global conditions to tell whether the txq (and related resources) + * has room to allow the use of "size" descriptors. + */ +static int idpf_txq_has_room(struct idpf_tx_queue *tx_q, u32 size) +{ + if (IDPF_DESC_UNUSED(tx_q) < size || + IDPF_TX_COMPLQ_PENDING(tx_q->txq_grp) > + IDPF_TX_COMPLQ_OVERFLOW_THRESH(tx_q->txq_grp->complq) || + IDPF_TX_BUF_RSV_LOW(tx_q)) + return 0; + return 1; +} + /** * idpf_tx_maybe_stop_splitq - 1st level check for Tx splitq stop conditions * @tx_q: the queue to be checked @@ -2142,29 +2155,11 @@ void idpf_tx_splitq_build_flow_desc(union idpf_tx_flex_desc *desc, static int idpf_tx_maybe_stop_splitq(struct idpf_tx_queue *tx_q, unsigned int descs_needed) { - if (idpf_tx_maybe_stop_common(tx_q, descs_needed)) - goto out; - - /* If there are too many outstanding completions expected on the - * completion queue, stop the TX queue to give the device some time to - * catch up - */ - if (unlikely(IDPF_TX_COMPLQ_PENDING(tx_q->txq_grp) > - IDPF_TX_COMPLQ_OVERFLOW_THRESH(tx_q->txq_grp->complq))) - goto splitq_stop; - - /* Also check for available book keeping buffers; if we are low, stop - * the queue to wait for more completions - */ - if (unlikely(IDPF_TX_BUF_RSV_LOW(tx_q))) - goto splitq_stop; - - return 0; - -splitq_stop: - netif_stop_subqueue(tx_q->netdev, tx_q->idx); + if (netif_subqueue_maybe_stop(tx_q->netdev, tx_q->idx, + idpf_txq_has_room(tx_q, descs_needed), + 1, 1)) + return 0; -out: u64_stats_update_begin(&tx_q->stats_sync); u64_stats_inc(&tx_q->q_stats.q_busy); u64_stats_update_end(&tx_q->stats_sync); @@ -2190,12 +2185,6 @@ void idpf_tx_buf_hw_update(struct idpf_tx_queue *tx_q, u32 val, nq = netdev_get_tx_queue(tx_q->netdev, tx_q->idx); tx_q->next_to_use = val; - if (idpf_tx_maybe_stop_common(tx_q, IDPF_TX_DESC_NEEDED)) { - u64_stats_update_begin(&tx_q->stats_sync); - u64_stats_inc(&tx_q->q_stats.q_busy); - u64_stats_update_end(&tx_q->stats_sync); - } - /* Force memory writes to complete before letting h/w * know there are new descriptors to fetch. (Only * applicable for weak-ordered memory model archs, diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.h b/drivers/net/ethernet/intel/idpf/idpf_txrx.h index 9c1fe84108ed2..ffeeaede6cf8f 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_txrx.h +++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.h @@ -1052,12 +1052,4 @@ bool idpf_rx_singleq_buf_hw_alloc_all(struct idpf_rx_queue *rxq, u16 cleaned_count); int idpf_tso(struct sk_buff *skb, struct idpf_tx_offload_params *off); -static inline bool idpf_tx_maybe_stop_common(struct idpf_tx_queue *tx_q, - u32 needed) -{ - return !netif_subqueue_maybe_stop(tx_q->netdev, tx_q->idx, - IDPF_DESC_UNUSED(tx_q), - needed, needed); -} - #endif /* !_IDPF_TXRX_H_ */ -- GitLab From e653c298c5fd346b29e15dfde4d7d3da8f863f79 Mon Sep 17 00:00:00 2001 From: Emil Tantilov Date: Thu, 8 May 2025 11:47:15 -0700 Subject: [PATCH 1062/2211] idpf: avoid mailbox timeout delays during reset [ Upstream commit 9dc63d8ff182150d7d7b318ab9389702a2c0a292 ] Mailbox operations are not possible while the driver is in reset. Operations that require MBX exchange with the control plane will result in long delays if executed while a reset is in progress: ethtool -L combined 8& echo 1 > /sys/class/net//device/reset idpf 0000:83:00.0: HW reset detected idpf 0000:83:00.0: Device HW Reset initiated idpf 0000:83:00.0: Transaction timed-out (op:504 cookie:be00 vc_op:504 salt:be timeout:2000ms) idpf 0000:83:00.0: Transaction timed-out (op:508 cookie:bf00 vc_op:508 salt:bf timeout:2000ms) idpf 0000:83:00.0: Transaction timed-out (op:512 cookie:c000 vc_op:512 salt:c0 timeout:2000ms) idpf 0000:83:00.0: Transaction timed-out (op:510 cookie:c100 vc_op:510 salt:c1 timeout:2000ms) idpf 0000:83:00.0: Transaction timed-out (op:509 cookie:c200 vc_op:509 salt:c2 timeout:60000ms) idpf 0000:83:00.0: Transaction timed-out (op:509 cookie:c300 vc_op:509 salt:c3 timeout:60000ms) idpf 0000:83:00.0: Transaction timed-out (op:505 cookie:c400 vc_op:505 salt:c4 timeout:60000ms) idpf 0000:83:00.0: Failed to configure queues for vport 0, -62 Disable mailbox communication in case of a reset, unless it's done during a driver load, where the virtchnl operations are needed to configure the device. Fixes: 8077c727561aa ("idpf: add controlq init and reset checks") Co-developed-by: Joshua Hay Signed-off-by: Joshua Hay Signed-off-by: Emil Tantilov Reviewed-by: Ahmed Zaki Reviewed-by: Aleksandr Loktionov Reviewed-by: Simon Horman Tested-by: Samuel Salin Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/idpf/idpf_lib.c | 18 +++++++++++++----- .../net/ethernet/intel/idpf/idpf_virtchnl.c | 2 +- .../net/ethernet/intel/idpf/idpf_virtchnl.h | 1 + 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/intel/idpf/idpf_lib.c b/drivers/net/ethernet/intel/idpf/idpf_lib.c index 615e74d038457..ba645ab22d394 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_lib.c +++ b/drivers/net/ethernet/intel/idpf/idpf_lib.c @@ -1802,11 +1802,19 @@ void idpf_vc_event_task(struct work_struct *work) if (test_bit(IDPF_REMOVE_IN_PROG, adapter->flags)) return; - if (test_bit(IDPF_HR_FUNC_RESET, adapter->flags) || - test_bit(IDPF_HR_DRV_LOAD, adapter->flags)) { - set_bit(IDPF_HR_RESET_IN_PROG, adapter->flags); - idpf_init_hard_reset(adapter); - } + if (test_bit(IDPF_HR_FUNC_RESET, adapter->flags)) + goto func_reset; + + if (test_bit(IDPF_HR_DRV_LOAD, adapter->flags)) + goto drv_load; + + return; + +func_reset: + idpf_vc_xn_shutdown(adapter->vcxn_mngr); +drv_load: + set_bit(IDPF_HR_RESET_IN_PROG, adapter->flags); + idpf_init_hard_reset(adapter); } /** diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c index 99bdb95bf2266..151beea20d343 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c +++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c @@ -376,7 +376,7 @@ static void idpf_vc_xn_init(struct idpf_vc_xn_manager *vcxn_mngr) * All waiting threads will be woken-up and their transaction aborted. Further * operations on that object will fail. */ -static void idpf_vc_xn_shutdown(struct idpf_vc_xn_manager *vcxn_mngr) +void idpf_vc_xn_shutdown(struct idpf_vc_xn_manager *vcxn_mngr) { int i; diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.h b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.h index 83da5d8da56bf..23271cf0a2160 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.h +++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.h @@ -66,5 +66,6 @@ int idpf_send_get_stats_msg(struct idpf_vport *vport); int idpf_send_set_sriov_vfs_msg(struct idpf_adapter *adapter, u16 num_vfs); int idpf_send_get_set_rss_key_msg(struct idpf_vport *vport, bool get); int idpf_send_get_set_rss_lut_msg(struct idpf_vport *vport, bool get); +void idpf_vc_xn_shutdown(struct idpf_vc_xn_manager *vcxn_mngr); #endif /* _IDPF_VIRTCHNL_H_ */ -- GitLab From 2c32fc56c05aa69439fdfd5e0b25f57e2a158627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Thu, 29 May 2025 14:44:06 +0200 Subject: [PATCH 1063/2211] net: dsa: tag_brcm: legacy: fix pskb_may_pull length MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit efdddc4484859082da6c7877ed144c8121c8ea55 ] BRCM_LEG_PORT_ID was incorrectly used for pskb_may_pull length. The correct check is BRCM_LEG_TAG_LEN + VLAN_HLEN, or 10 bytes. Fixes: 964dbf186eaa ("net: dsa: tag_brcm: add support for legacy tags") Signed-off-by: Álvaro Fernández Rojas Reviewed-by: Florian Fainelli Link: https://patch.msgid.link/20250529124406.2513779-1-noltari@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/dsa/tag_brcm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/dsa/tag_brcm.c b/net/dsa/tag_brcm.c index 8c3c068728e51..fe75821623a4f 100644 --- a/net/dsa/tag_brcm.c +++ b/net/dsa/tag_brcm.c @@ -257,7 +257,7 @@ static struct sk_buff *brcm_leg_tag_rcv(struct sk_buff *skb, int source_port; u8 *brcm_tag; - if (unlikely(!pskb_may_pull(skb, BRCM_LEG_PORT_ID))) + if (unlikely(!pskb_may_pull(skb, BRCM_LEG_TAG_LEN + VLAN_HLEN))) return NULL; brcm_tag = dsa_etype_header_pos_rx(skb); -- GitLab From bb033c6781ce1b0264c3993b767b4aa9021959c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Lothor=C3=A9?= Date: Thu, 29 May 2025 11:07:23 +0200 Subject: [PATCH 1064/2211] net: stmmac: make sure that ptp_rate is not 0 before configuring timestamping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 030ce919e114a111e83b7976ecb3597cefd33f26 ] The stmmac platform drivers that do not open-code the clk_ptp_rate value after having retrieved the default one from the device-tree can end up with 0 in clk_ptp_rate (as clk_get_rate can return 0). It will eventually propagate up to PTP initialization when bringing up the interface, leading to a divide by 0: Division by zero in kernel. CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.12.30-00001-g48313bd5768a #22 Hardware name: STM32 (Device Tree Support) Call trace: unwind_backtrace from show_stack+0x18/0x1c show_stack from dump_stack_lvl+0x6c/0x8c dump_stack_lvl from Ldiv0_64+0x8/0x18 Ldiv0_64 from stmmac_init_tstamp_counter+0x190/0x1a4 stmmac_init_tstamp_counter from stmmac_hw_setup+0xc1c/0x111c stmmac_hw_setup from __stmmac_open+0x18c/0x434 __stmmac_open from stmmac_open+0x3c/0xbc stmmac_open from __dev_open+0xf4/0x1ac __dev_open from __dev_change_flags+0x1cc/0x224 __dev_change_flags from dev_change_flags+0x24/0x60 dev_change_flags from ip_auto_config+0x2e8/0x11a0 ip_auto_config from do_one_initcall+0x84/0x33c do_one_initcall from kernel_init_freeable+0x1b8/0x214 kernel_init_freeable from kernel_init+0x24/0x140 kernel_init from ret_from_fork+0x14/0x28 Exception stack(0xe0815fb0 to 0xe0815ff8) Prevent this division by 0 by adding an explicit check and error log about the actual issue. While at it, remove the same check from stmmac_ptp_register, which then becomes duplicate Fixes: 19d857c9038e ("stmmac: Fix calculations for ptp counters when clock input = 50Mhz.") Signed-off-by: Alexis Lothoré Reviewed-by: Yanteng Si Reviewed-by: Maxime Chevallier Link: https://patch.msgid.link/20250529-stmmac_tstamp_div-v4-1-d73340a794d5@bootlin.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 5 +++++ drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 918d7f2e8ba99..f68e3ece919cc 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -835,6 +835,11 @@ int stmmac_init_tstamp_counter(struct stmmac_priv *priv, u32 systime_flags) if (!(priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp)) return -EOPNOTSUPP; + if (!priv->plat->clk_ptp_rate) { + netdev_err(priv->dev, "Invalid PTP clock rate"); + return -EINVAL; + } + stmmac_config_hw_tstamping(priv, priv->ptpaddr, systime_flags); priv->systime_flags = systime_flags; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c index a6b1de9a251dd..5c85040a1b937 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c @@ -303,7 +303,7 @@ void stmmac_ptp_register(struct stmmac_priv *priv) /* Calculate the clock domain crossing (CDC) error if necessary */ priv->plat->cdc_error_adj = 0; - if (priv->plat->has_gmac4 && priv->plat->clk_ptp_rate) + if (priv->plat->has_gmac4) priv->plat->cdc_error_adj = (2 * NSEC_PER_SEC) / priv->plat->clk_ptp_rate; stmmac_ptp_clock_ops.n_per_out = priv->dma_cap.pps_out_num; -- GitLab From 451ee661d0f6272017fa012f99617101aa8ddf2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Lothor=C3=A9?= Date: Thu, 29 May 2025 11:07:24 +0200 Subject: [PATCH 1065/2211] net: stmmac: make sure that ptp_rate is not 0 before configuring EST MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit cbefe2ffa7784525ec5d008ba87c7add19ec631a ] If the ptp_rate recorded earlier in the driver happens to be 0, this bogus value will propagate up to EST configuration, where it will trigger a division by 0. Prevent this division by 0 by adding the corresponding check and error code. Suggested-by: Maxime Chevallier Signed-off-by: Alexis Lothoré Fixes: 8572aec3d0dc ("net: stmmac: Add basic EST support for XGMAC") Link: https://patch.msgid.link/20250529-stmmac_tstamp_div-v4-2-d73340a794d5@bootlin.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/stmicro/stmmac/stmmac_est.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_est.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_est.c index c9693f77e1f61..ac6f2e3a3fcd2 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_est.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_est.c @@ -32,6 +32,11 @@ static int est_configure(struct stmmac_priv *priv, struct stmmac_est *cfg, int i, ret = 0; u32 ctrl; + if (!ptp_rate) { + netdev_warn(priv->dev, "Invalid PTP rate"); + return -EINVAL; + } + ret |= est_write(est_addr, EST_BTR_LOW, cfg->btr[0], false); ret |= est_write(est_addr, EST_BTR_HIGH, cfg->btr[1], false); ret |= est_write(est_addr, EST_TER, cfg->ter, false); -- GitLab From 2679bb2f692e3d9b6c20863ba0fd8a793ea24f16 Mon Sep 17 00:00:00 2001 From: Jesus Narvaez Date: Wed, 14 May 2025 15:52:24 -0700 Subject: [PATCH 1066/2211] drm/i915/guc: Check if expecting reply before decrementing outstanding_submission_g2h [ Upstream commit c557fd1050f6691dde36818dfc1a4c415c42901b ] When sending a H2G message where a reply is expected in guc_submission_send_busy_loop(), outstanding_submission_g2h is incremented before the send. However, if there is an error sending the message, outstanding_submission_g2h is decremented without checking if a reply is expected. Therefore, check if reply is expected when there is a failure before decrementing outstanding_submission_g2h. Fixes: 2f2cc53b5fe7 ("drm/i915/guc: Close deregister-context race against CT-loss") Signed-off-by: Jesus Narvaez Cc: Daniele Ceraolo Spurio Cc: Alan Previn Cc: Anshuman Gupta Cc: Mousumi Jana Cc: Rodrigo Vivi Cc: Matt Roper Reviewed-by: Daniele Ceraolo Spurio Signed-off-by: John Harrison Link: https://lore.kernel.org/r/20250514225224.4142684-1-jesus.narvaez@intel.com (cherry picked from commit a6a26786f22a4ab0227bcf610510c4c9c2df0808) Signed-off-by: Joonas Lahtinen Signed-off-by: Sasha Levin --- drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c index 8aaadbb702df6..00e2cf92d99c7 100644 --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c @@ -633,7 +633,7 @@ static int guc_submission_send_busy_loop(struct intel_guc *guc, atomic_inc(&guc->outstanding_submission_g2h); ret = intel_guc_send_busy_loop(guc, action, len, g2h_len_dw, loop); - if (ret) + if (ret && g2h_len_dw) atomic_dec(&guc->outstanding_submission_g2h); return ret; -- GitLab From ba282cfba33c8cee46382a6045190af3bd687e29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20H=C3=B6gander?= Date: Mon, 26 May 2025 15:05:11 +0300 Subject: [PATCH 1067/2211] drm/i915/psr: Fix using wrong mask in REG_FIELD_PREP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 57d63c6cd0851d3af612a556ec61b0f2a9bd522f ] Wrong mask is used in PORT_ALPM_LFPS_CTL_FIRST_LFPS_HALF_CYCLE_DURATION and PORT_ALPM_LFPS_CTL_LAST_LFPS_HALF_CYCLE_DURATION. Fixes: 295099580f04 ("drm/i915/psr: Add missing ALPM AUX-Less register definitions") Signed-off-by: Jouni Högander Reviewed-by: Ankit Nautiyal Link: https://lore.kernel.org/r/20250526120512.1702815-12-jouni.hogander@intel.com (cherry picked from commit 8097128a40ff378761034ec72cdbf6f46e466dc0) Signed-off-by: Joonas Lahtinen Signed-off-by: Sasha Levin --- drivers/gpu/drm/i915/display/intel_psr_regs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_psr_regs.h b/drivers/gpu/drm/i915/display/intel_psr_regs.h index 642bb15fb5475..25c0424e34db2 100644 --- a/drivers/gpu/drm/i915/display/intel_psr_regs.h +++ b/drivers/gpu/drm/i915/display/intel_psr_regs.h @@ -314,8 +314,8 @@ #define PORT_ALPM_LFPS_CTL_LFPS_HALF_CYCLE_DURATION_MASK REG_GENMASK(20, 16) #define PORT_ALPM_LFPS_CTL_LFPS_HALF_CYCLE_DURATION(val) REG_FIELD_PREP(PORT_ALPM_LFPS_CTL_LFPS_HALF_CYCLE_DURATION_MASK, val) #define PORT_ALPM_LFPS_CTL_FIRST_LFPS_HALF_CYCLE_DURATION_MASK REG_GENMASK(12, 8) -#define PORT_ALPM_LFPS_CTL_FIRST_LFPS_HALF_CYCLE_DURATION(val) REG_FIELD_PREP(PORT_ALPM_LFPS_CTL_LFPS_HALF_CYCLE_DURATION_MASK, val) +#define PORT_ALPM_LFPS_CTL_FIRST_LFPS_HALF_CYCLE_DURATION(val) REG_FIELD_PREP(PORT_ALPM_LFPS_CTL_FIRST_LFPS_HALF_CYCLE_DURATION_MASK, val) #define PORT_ALPM_LFPS_CTL_LAST_LFPS_HALF_CYCLE_DURATION_MASK REG_GENMASK(4, 0) -#define PORT_ALPM_LFPS_CTL_LAST_LFPS_HALF_CYCLE_DURATION(val) REG_FIELD_PREP(PORT_ALPM_LFPS_CTL_LFPS_HALF_CYCLE_DURATION_MASK, val) +#define PORT_ALPM_LFPS_CTL_LAST_LFPS_HALF_CYCLE_DURATION(val) REG_FIELD_PREP(PORT_ALPM_LFPS_CTL_LAST_LFPS_HALF_CYCLE_DURATION_MASK, val) #endif /* __INTEL_PSR_REGS_H__ */ -- GitLab From 798fd944fbcffdfffeef0b7a5cfdfab1c9dbc56b Mon Sep 17 00:00:00 2001 From: Jesus Narvaez Date: Wed, 28 May 2025 16:05:51 -0700 Subject: [PATCH 1068/2211] drm/i915/guc: Handle race condition where wakeref count drops below 0 [ Upstream commit 0323a5127e7c534cfc88efe0f850a0cb777e938b ] There is a rare race condition when preparing for a reset where guc_lrc_desc_unpin() could be in the process of deregistering a context while a different thread is scrubbing outstanding contexts and it alters the context state and does a wakeref put. Then, if there is a failure with deregister_context(), a second wakeref put could occur. As a result the wakeref count could drop below 0 and fail an INTEL_WAKEREF_BUG_ON() check. Therefore if there is a failure with deregister_context(), undo the context state changes and do a wakeref put only if the context was set to be destroyed earlier. v2: Expand comment to better explain change. (Daniele) v3: Removed addition to the original comment. (Daniele) Fixes: 2f2cc53b5fe7 ("drm/i915/guc: Close deregister-context race against CT-loss") Signed-off-by: Jesus Narvaez Cc: Daniele Ceraolo Spurio Cc: Alan Previn Cc: Anshuman Gupta Cc: Mousumi Jana Cc: Rodrigo Vivi Cc: Matt Roper Reviewed-by: Daniele Ceraolo Spurio Signed-off-by: John Harrison Link: https://lore.kernel.org/r/20250528230551.1855177-1-jesus.narvaez@intel.com (cherry picked from commit f36a75aba1c3176d177964bca76f86a075d2943a) Signed-off-by: Joonas Lahtinen Signed-off-by: Sasha Levin --- .../gpu/drm/i915/gt/uc/intel_guc_submission.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c index 00e2cf92d99c7..b48373b166779 100644 --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c @@ -3422,18 +3422,29 @@ static inline int guc_lrc_desc_unpin(struct intel_context *ce) * GuC is active, lets destroy this context, but at this point we can still be racing * with suspend, so we undo everything if the H2G fails in deregister_context so * that GuC reset will find this context during clean up. + * + * There is a race condition where the reset code could have altered + * this context's state and done a wakeref put before we try to + * deregister it here. So check if the context is still set to be + * destroyed before undoing earlier changes, to avoid two wakeref puts + * on the same context. */ ret = deregister_context(ce, ce->guc_id.id); if (ret) { + bool pending_destroyed; spin_lock_irqsave(&ce->guc_state.lock, flags); - set_context_registered(ce); - clr_context_destroyed(ce); + pending_destroyed = context_destroyed(ce); + if (pending_destroyed) { + set_context_registered(ce); + clr_context_destroyed(ce); + } spin_unlock_irqrestore(&ce->guc_state.lock, flags); /* * As gt-pm is awake at function entry, intel_wakeref_put_async merely decrements * the wakeref immediately but per function spec usage call this after unlock. */ - intel_wakeref_put_async(>->wakeref); + if (pending_destroyed) + intel_wakeref_put_async(>->wakeref); } return ret; -- GitLab From 4399f59a9467a324ed46657555f0e1f209a14acb Mon Sep 17 00:00:00 2001 From: Shiming Cheng Date: Fri, 30 May 2025 09:26:08 +0800 Subject: [PATCH 1069/2211] net: fix udp gso skb_segment after pull from frag_list [ Upstream commit 3382a1ed7f778db841063f5d7e317ac55f9e7f72 ] Commit a1e40ac5b5e9 ("net: gso: fix udp gso fraglist segmentation after pull from frag_list") detected invalid geometry in frag_list skbs and redirects them from skb_segment_list to more robust skb_segment. But some packets with modified geometry can also hit bugs in that code. We don't know how many such cases exist. Addressing each one by one also requires touching the complex skb_segment code, which risks introducing bugs for other types of skbs. Instead, linearize all these packets that fail the basic invariants on gso fraglist skbs. That is more robust. If only part of the fraglist payload is pulled into head_skb, it will always cause exception when splitting skbs by skb_segment. For detailed call stack information, see below. Valid SKB_GSO_FRAGLIST skbs - consist of two or more segments - the head_skb holds the protocol headers plus first gso_size - one or more frag_list skbs hold exactly one segment - all but the last must be gso_size Optional datapath hooks such as NAT and BPF (bpf_skb_pull_data) can modify fraglist skbs, breaking these invariants. In extreme cases they pull one part of data into skb linear. For UDP, this causes three payloads with lengths of (11,11,10) bytes were pulled tail to become (12,10,10) bytes. The skbs no longer meets the above SKB_GSO_FRAGLIST conditions because payload was pulled into head_skb, it needs to be linearized before pass to regular skb_segment. skb_segment+0xcd0/0xd14 __udp_gso_segment+0x334/0x5f4 udp4_ufo_fragment+0x118/0x15c inet_gso_segment+0x164/0x338 skb_mac_gso_segment+0xc4/0x13c __skb_gso_segment+0xc4/0x124 validate_xmit_skb+0x9c/0x2c0 validate_xmit_skb_list+0x4c/0x80 sch_direct_xmit+0x70/0x404 __dev_queue_xmit+0x64c/0xe5c neigh_resolve_output+0x178/0x1c4 ip_finish_output2+0x37c/0x47c __ip_finish_output+0x194/0x240 ip_finish_output+0x20/0xf4 ip_output+0x100/0x1a0 NF_HOOK+0xc4/0x16c ip_forward+0x314/0x32c ip_rcv+0x90/0x118 __netif_receive_skb+0x74/0x124 process_backlog+0xe8/0x1a4 __napi_poll+0x5c/0x1f8 net_rx_action+0x154/0x314 handle_softirqs+0x154/0x4b8 [118.376811] [C201134] rxq0_pus: [name:bug&]kernel BUG at net/core/skbuff.c:4278! [118.376829] [C201134] rxq0_pus: [name:traps&]Internal error: Oops - BUG: 00000000f2000800 [#1] PREEMPT SMP [118.470774] [C201134] rxq0_pus: [name:mrdump&]Kernel Offset: 0x178cc00000 from 0xffffffc008000000 [118.470810] [C201134] rxq0_pus: [name:mrdump&]PHYS_OFFSET: 0x40000000 [118.470827] [C201134] rxq0_pus: [name:mrdump&]pstate: 60400005 (nZCv daif +PAN -UAO) [118.470848] [C201134] rxq0_pus: [name:mrdump&]pc : [0xffffffd79598aefc] skb_segment+0xcd0/0xd14 [118.470900] [C201134] rxq0_pus: [name:mrdump&]lr : [0xffffffd79598a5e8] skb_segment+0x3bc/0xd14 [118.470928] [C201134] rxq0_pus: [name:mrdump&]sp : ffffffc008013770 Fixes: a1e40ac5b5e9 ("gso: fix udp gso fraglist segmentation after pull from frag_list") Signed-off-by: Shiming Cheng Reviewed-by: Willem de Bruijn Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/ipv4/udp_offload.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c index da5d4aea1b591..845730184c5d3 100644 --- a/net/ipv4/udp_offload.c +++ b/net/ipv4/udp_offload.c @@ -332,6 +332,7 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb, bool copy_dtor; __sum16 check; __be16 newlen; + int ret = 0; mss = skb_shinfo(gso_skb)->gso_size; if (gso_skb->len <= sizeof(*uh) + mss) @@ -360,6 +361,10 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb, if (skb_pagelen(gso_skb) - sizeof(*uh) == skb_shinfo(gso_skb)->gso_size) return __udp_gso_segment_list(gso_skb, features, is_ipv6); + ret = __skb_linearize(gso_skb); + if (ret) + return ERR_PTR(ret); + /* Setup csum, as fraglist skips this in udp4_gro_receive. */ gso_skb->csum_start = skb_transport_header(gso_skb) - gso_skb->head; gso_skb->csum_offset = offsetof(struct udphdr, check); -- GitLab From e2df04e69c3f10b412f54be036dd0ed3b14756cf Mon Sep 17 00:00:00 2001 From: Jinjian Song Date: Fri, 30 May 2025 11:16:48 +0800 Subject: [PATCH 1070/2211] net: wwan: t7xx: Fix napi rx poll issue [ Upstream commit 905fe0845bb27e4eed2ca27ea06e6c4847f1b2b1 ] When driver handles the napi rx polling requests, the netdev might have been released by the dellink logic triggered by the disconnect operation on user plane. However, in the logic of processing skb in polling, an invalid netdev is still being used, which causes a panic. BUG: kernel NULL pointer dereference, address: 00000000000000f1 Oops: 0000 [#1] PREEMPT SMP NOPTI RIP: 0010:dev_gro_receive+0x3a/0x620 [...] Call Trace: ? __die_body+0x68/0xb0 ? page_fault_oops+0x379/0x3e0 ? exc_page_fault+0x4f/0xa0 ? asm_exc_page_fault+0x22/0x30 ? __pfx_t7xx_ccmni_recv_skb+0x10/0x10 [mtk_t7xx (HASH:1400 7)] ? dev_gro_receive+0x3a/0x620 napi_gro_receive+0xad/0x170 t7xx_ccmni_recv_skb+0x48/0x70 [mtk_t7xx (HASH:1400 7)] t7xx_dpmaif_napi_rx_poll+0x590/0x800 [mtk_t7xx (HASH:1400 7)] net_rx_action+0x103/0x470 irq_exit_rcu+0x13a/0x310 sysvec_apic_timer_interrupt+0x56/0x90 Fixes: 5545b7b9f294 ("net: wwan: t7xx: Add NAPI support") Signed-off-by: Jinjian Song Link: https://patch.msgid.link/20250530031648.5592-1-jinjian.song@fibocom.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/wwan/t7xx/t7xx_netdev.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/net/wwan/t7xx/t7xx_netdev.c b/drivers/net/wwan/t7xx/t7xx_netdev.c index 91fa082e9cab8..fc0a7cb181df2 100644 --- a/drivers/net/wwan/t7xx/t7xx_netdev.c +++ b/drivers/net/wwan/t7xx/t7xx_netdev.c @@ -302,7 +302,7 @@ static int t7xx_ccmni_wwan_newlink(void *ctxt, struct net_device *dev, u32 if_id ccmni->ctlb = ctlb; ccmni->dev = dev; atomic_set(&ccmni->usage, 0); - ctlb->ccmni_inst[if_id] = ccmni; + WRITE_ONCE(ctlb->ccmni_inst[if_id], ccmni); ret = register_netdevice(dev); if (ret) @@ -324,6 +324,7 @@ static void t7xx_ccmni_wwan_dellink(void *ctxt, struct net_device *dev, struct l if (WARN_ON(ctlb->ccmni_inst[if_id] != ccmni)) return; + WRITE_ONCE(ctlb->ccmni_inst[if_id], NULL); unregister_netdevice(dev); } @@ -419,7 +420,7 @@ static void t7xx_ccmni_recv_skb(struct t7xx_ccmni_ctrl *ccmni_ctlb, struct sk_bu skb_cb = T7XX_SKB_CB(skb); netif_id = skb_cb->netif_idx; - ccmni = ccmni_ctlb->ccmni_inst[netif_id]; + ccmni = READ_ONCE(ccmni_ctlb->ccmni_inst[netif_id]); if (!ccmni) { dev_kfree_skb(skb); return; @@ -441,7 +442,7 @@ static void t7xx_ccmni_recv_skb(struct t7xx_ccmni_ctrl *ccmni_ctlb, struct sk_bu static void t7xx_ccmni_queue_tx_irq_notify(struct t7xx_ccmni_ctrl *ctlb, int qno) { - struct t7xx_ccmni *ccmni = ctlb->ccmni_inst[0]; + struct t7xx_ccmni *ccmni = READ_ONCE(ctlb->ccmni_inst[0]); struct netdev_queue *net_queue; if (netif_running(ccmni->dev) && atomic_read(&ccmni->usage) > 0) { @@ -453,7 +454,7 @@ static void t7xx_ccmni_queue_tx_irq_notify(struct t7xx_ccmni_ctrl *ctlb, int qno static void t7xx_ccmni_queue_tx_full_notify(struct t7xx_ccmni_ctrl *ctlb, int qno) { - struct t7xx_ccmni *ccmni = ctlb->ccmni_inst[0]; + struct t7xx_ccmni *ccmni = READ_ONCE(ctlb->ccmni_inst[0]); struct netdev_queue *net_queue; if (atomic_read(&ccmni->usage) > 0) { @@ -471,7 +472,7 @@ static void t7xx_ccmni_queue_state_notify(struct t7xx_pci_dev *t7xx_dev, if (ctlb->md_sta != MD_STATE_READY) return; - if (!ctlb->ccmni_inst[0]) { + if (!READ_ONCE(ctlb->ccmni_inst[0])) { dev_warn(&t7xx_dev->pdev->dev, "No netdev registered yet\n"); return; } -- GitLab From 6d300675dc38928275f44390ef5b76851ccad299 Mon Sep 17 00:00:00 2001 From: Ronak Doshi Date: Fri, 30 May 2025 15:27:00 +0000 Subject: [PATCH 1071/2211] vmxnet3: correctly report gso type for UDP tunnels [ Upstream commit 982d30c30eaa2ec723df42e3bf526c014c1dbb88 ] Commit 3d010c8031e3 ("udp: do not accept non-tunnel GSO skbs landing in a tunnel") added checks in linux stack to not accept non-tunnel GRO packets landing in a tunnel. This exposed an issue in vmxnet3 which was not correctly reporting GRO packets for tunnel packets. This patch fixes this issue by setting correct GSO type for the tunnel packets. Currently, vmxnet3 does not support reporting inner fields for LRO tunnel packets. The issue is not seen for egress drivers that do not use skb inner fields. The workaround is to enable tnl-segmentation offload on the egress interfaces if the driver supports it. This problem pre-exists this patch fix and can be addressed as a separate future patch. Fixes: dacce2be3312 ("vmxnet3: add geneve and vxlan tunnel offload support") Signed-off-by: Ronak Doshi Acked-by: Guolin Yang Link: https://patch.msgid.link/20250530152701.70354-1-ronak.doshi@broadcom.com [pabeni@redhat.com: dropped the changelog] Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/vmxnet3/vmxnet3_drv.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 151d7cdfc4802..c48c2de6f961f 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c @@ -1560,6 +1560,30 @@ vmxnet3_get_hdr_len(struct vmxnet3_adapter *adapter, struct sk_buff *skb, return (hlen + (hdr.tcp->doff << 2)); } +static void +vmxnet3_lro_tunnel(struct sk_buff *skb, __be16 ip_proto) +{ + struct udphdr *uh = NULL; + + if (ip_proto == htons(ETH_P_IP)) { + struct iphdr *iph = (struct iphdr *)skb->data; + + if (iph->protocol == IPPROTO_UDP) + uh = (struct udphdr *)(iph + 1); + } else { + struct ipv6hdr *iph = (struct ipv6hdr *)skb->data; + + if (iph->nexthdr == IPPROTO_UDP) + uh = (struct udphdr *)(iph + 1); + } + if (uh) { + if (uh->check) + skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL_CSUM; + else + skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL; + } +} + static int vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, struct vmxnet3_adapter *adapter, int quota) @@ -1873,6 +1897,8 @@ sop_done: if (segCnt != 0 && mss != 0) { skb_shinfo(skb)->gso_type = rcd->v4 ? SKB_GSO_TCPV4 : SKB_GSO_TCPV6; + if (encap_lro) + vmxnet3_lro_tunnel(skb, skb->protocol); skb_shinfo(skb)->gso_size = mss; skb_shinfo(skb)->gso_segs = segCnt; } else if ((segCnt != 0 || skb->len > mtu) && !encap_lro) { -- GitLab From 1184f7df1d08c682631d9fe68df407615601db14 Mon Sep 17 00:00:00 2001 From: Bui Quang Minh Date: Sun, 1 Jun 2025 21:29:13 +0700 Subject: [PATCH 1072/2211] selftests: net: build net/lib dependency in all target [ Upstream commit d3f2a9587ebe68f5067f9ff624f9a83dfb911f60 ] We have the logic to include net/lib automatically for net related selftests. However, currently, this logic is only in install target which means only `make install` will have net/lib included. This commit adds the logic to all target so that all `make`, `make run_tests` and `make install` will have net/lib included in net related selftests. Signed-off-by: Bui Quang Minh Link: https://patch.msgid.link/20250601142914.13379-1-minhquangbui99@gmail.com Fixes: b86761ff6374 ("selftests: net: add scaffolding for Netlink tests in Python") Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- tools/testing/selftests/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index 9cf769d415687..85c5f39131d34 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -196,7 +196,7 @@ export KHDR_INCLUDES all: @ret=1; \ - for TARGET in $(TARGETS); do \ + for TARGET in $(TARGETS) $(INSTALL_DEP_TARGETS); do \ BUILD_TARGET=$$BUILD/$$TARGET; \ mkdir $$BUILD_TARGET -p; \ $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET \ -- GitLab From 0cffc6e40d5d33524b459c17fdf9ff03f0296a71 Mon Sep 17 00:00:00 2001 From: "Rafael J. Wysocki" Date: Tue, 3 Jun 2025 18:19:27 +0200 Subject: [PATCH 1073/2211] PM: sleep: Fix power.is_suspended cleanup for direct-complete devices [ Upstream commit d46c4c839c20a599a0eb8d73708ce401f9c7d06d ] Commit 03f1444016b7 ("PM: sleep: Fix handling devices with direct_complete set on errors") caused power.is_suspended to be set for devices with power.direct_complete set, but it forgot to ensure the clearing of that flag for them in device_resume(), so power.is_suspended is still set for them during the next system suspend-resume cycle. If that cycle is aborted in dpm_suspend(), the subsequent invocation of dpm_resume() will trigger a device_resume() call for every device and because power.is_suspended is set for the devices in question, they will not be skipped by device_resume() as expected which causes scary error messages to be logged (as appropriate). To address this issue, move the clearing of power.is_suspended in device_resume() immediately after the power.is_suspended check so it will be always cleared for all devices processed by that function. Fixes: 03f1444016b7 ("PM: sleep: Fix handling devices with direct_complete set on errors") Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4280 Reported-and-tested-by: Chris Bainbridge Signed-off-by: Rafael J. Wysocki Reviewed-by: Mario Limonciello Link: https://patch.msgid.link/4990586.GXAFRqVoOG@rjwysocki.net Signed-off-by: Sasha Levin --- drivers/base/power/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 1abe61f11525d..faf4cdec23f04 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c @@ -916,6 +916,8 @@ static void device_resume(struct device *dev, pm_message_t state, bool async) if (!dev->power.is_suspended) goto Complete; + dev->power.is_suspended = false; + if (dev->power.direct_complete) { /* Match the pm_runtime_disable() in __device_suspend(). */ pm_runtime_enable(dev); @@ -971,7 +973,6 @@ static void device_resume(struct device *dev, pm_message_t state, bool async) End: error = dpm_run_callback(callback, dev, state, info); - dev->power.is_suspended = false; device_unlock(dev); dpm_watchdog_clear(&wd); -- GitLab From 8cb645117aabaf484e3fc5562437b991a52b8df4 Mon Sep 17 00:00:00 2001 From: Keith Busch Date: Tue, 20 May 2025 13:20:37 -0700 Subject: [PATCH 1074/2211] nvme: fix command limits status code [ Upstream commit 10f4a7cd724e34b7a6ff96e57ac49dc0cadececc ] The command specific status code, 0x183, was introduced in the NVMe 2.0 specification defined to "Command Size Limits Exceeded" and only ever applied to DSM and Copy commands. Fix the name and, remove the incorrect translation to error codes and special treatment in the target code for it. Fixes: 3b7c33b28a44d4 ("nvme.h: add Write Zeroes definitions") Cc: Chaitanya Kulkarni Reviewed-by: Chaitanya Kulkarni Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/host/constants.c | 2 +- drivers/nvme/host/core.c | 1 - drivers/nvme/host/pr.c | 2 -- drivers/nvme/target/core.c | 9 +-------- drivers/nvme/target/io-cmd-bdev.c | 9 +-------- include/linux/nvme.h | 2 +- 6 files changed, 4 insertions(+), 21 deletions(-) diff --git a/drivers/nvme/host/constants.c b/drivers/nvme/host/constants.c index 2b9e6cfaf2a80..1a0058be58210 100644 --- a/drivers/nvme/host/constants.c +++ b/drivers/nvme/host/constants.c @@ -145,7 +145,7 @@ static const char * const nvme_statuses[] = { [NVME_SC_BAD_ATTRIBUTES] = "Conflicting Attributes", [NVME_SC_INVALID_PI] = "Invalid Protection Information", [NVME_SC_READ_ONLY] = "Attempted Write to Read Only Range", - [NVME_SC_ONCS_NOT_SUPPORTED] = "ONCS Not Supported", + [NVME_SC_CMD_SIZE_LIM_EXCEEDED ] = "Command Size Limits Exceeded", [NVME_SC_ZONE_BOUNDARY_ERROR] = "Zoned Boundary Error", [NVME_SC_ZONE_FULL] = "Zone Is Full", [NVME_SC_ZONE_READ_ONLY] = "Zone Is Read Only", diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 98dad1bdff440..eca764fede48f 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -284,7 +284,6 @@ static blk_status_t nvme_error_status(u16 status) case NVME_SC_NS_NOT_READY: return BLK_STS_TARGET; case NVME_SC_BAD_ATTRIBUTES: - case NVME_SC_ONCS_NOT_SUPPORTED: case NVME_SC_INVALID_OPCODE: case NVME_SC_INVALID_FIELD: case NVME_SC_INVALID_NS: diff --git a/drivers/nvme/host/pr.c b/drivers/nvme/host/pr.c index dc7922f226004..80dd09aa01a3b 100644 --- a/drivers/nvme/host/pr.c +++ b/drivers/nvme/host/pr.c @@ -82,8 +82,6 @@ static int nvme_status_to_pr_err(int status) return PR_STS_SUCCESS; case NVME_SC_RESERVATION_CONFLICT: return PR_STS_RESERVATION_CONFLICT; - case NVME_SC_ONCS_NOT_SUPPORTED: - return -EOPNOTSUPP; case NVME_SC_BAD_ATTRIBUTES: case NVME_SC_INVALID_OPCODE: case NVME_SC_INVALID_FIELD: diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index ed2424f8a396e..4606c88136669 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -62,14 +62,7 @@ inline u16 errno_to_nvme_status(struct nvmet_req *req, int errno) return NVME_SC_LBA_RANGE | NVME_STATUS_DNR; case -EOPNOTSUPP: req->error_loc = offsetof(struct nvme_common_command, opcode); - switch (req->cmd->common.opcode) { - case nvme_cmd_dsm: - case nvme_cmd_write_zeroes: - return NVME_SC_ONCS_NOT_SUPPORTED | NVME_STATUS_DNR; - default: - return NVME_SC_INVALID_OPCODE | NVME_STATUS_DNR; - } - break; + return NVME_SC_INVALID_OPCODE | NVME_STATUS_DNR; case -ENODATA: req->error_loc = offsetof(struct nvme_rw_command, nsid); return NVME_SC_ACCESS_DENIED; diff --git a/drivers/nvme/target/io-cmd-bdev.c b/drivers/nvme/target/io-cmd-bdev.c index eaf31c823cbe8..73ecbc13c5b23 100644 --- a/drivers/nvme/target/io-cmd-bdev.c +++ b/drivers/nvme/target/io-cmd-bdev.c @@ -145,15 +145,8 @@ u16 blk_to_nvme_status(struct nvmet_req *req, blk_status_t blk_sts) req->error_loc = offsetof(struct nvme_rw_command, slba); break; case BLK_STS_NOTSUPP: + status = NVME_SC_INVALID_OPCODE | NVME_STATUS_DNR; req->error_loc = offsetof(struct nvme_common_command, opcode); - switch (req->cmd->common.opcode) { - case nvme_cmd_dsm: - case nvme_cmd_write_zeroes: - status = NVME_SC_ONCS_NOT_SUPPORTED | NVME_STATUS_DNR; - break; - default: - status = NVME_SC_INVALID_OPCODE | NVME_STATUS_DNR; - } break; case BLK_STS_MEDIUM: status = NVME_SC_ACCESS_DENIED; diff --git a/include/linux/nvme.h b/include/linux/nvme.h index 1c101f6fad2f3..84d4f0657b7a8 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h @@ -1954,7 +1954,7 @@ enum { NVME_SC_BAD_ATTRIBUTES = 0x180, NVME_SC_INVALID_PI = 0x181, NVME_SC_READ_ONLY = 0x182, - NVME_SC_ONCS_NOT_SUPPORTED = 0x183, + NVME_SC_CMD_SIZE_LIM_EXCEEDED = 0x183, /* * I/O Command Set Specific - Fabrics commands: -- GitLab From a0319c9b1648a67511e947a596ca86888451c0a7 Mon Sep 17 00:00:00 2001 From: Alok Tiwari Date: Mon, 2 Jun 2025 03:34:29 -0700 Subject: [PATCH 1075/2211] gve: add missing NULL check for gve_alloc_pending_packet() in TX DQO [ Upstream commit 12c331b29c7397ac3b03584e12902990693bc248 ] gve_alloc_pending_packet() can return NULL, but gve_tx_add_skb_dqo() did not check for this case before dereferencing the returned pointer. Add a missing NULL check to prevent a potential NULL pointer dereference when allocation fails. This improves robustness in low-memory scenarios. Fixes: a57e5de476be ("gve: DQO: Add TX path") Signed-off-by: Alok Tiwari Reviewed-by: Mina Almasry Reviewed-by: Simon Horman Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/google/gve/gve_tx_dqo.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/ethernet/google/gve/gve_tx_dqo.c b/drivers/net/ethernet/google/gve/gve_tx_dqo.c index f879426cb5523..26053cc85d1c5 100644 --- a/drivers/net/ethernet/google/gve/gve_tx_dqo.c +++ b/drivers/net/ethernet/google/gve/gve_tx_dqo.c @@ -770,6 +770,9 @@ static int gve_tx_add_skb_dqo(struct gve_tx_ring *tx, s16 completion_tag; pkt = gve_alloc_pending_packet(tx); + if (!pkt) + return -ENOMEM; + pkt->skb = skb; completion_tag = pkt - tx->dqo.pending_packets; -- GitLab From f33277cda6e8c9e5b19939ba0a568766331ff44e Mon Sep 17 00:00:00 2001 From: Michael Walle Date: Tue, 20 May 2025 09:41:10 +0200 Subject: [PATCH 1076/2211] drm/panel-simple: fix the warnings for the Evervision VGG644804 [ Upstream commit 5dc1ea903588a73fb03b3a3e5a041a7c63a4bccd ] The panel lacked the connector type which causes a warning. Adding the connector type reveals wrong bus_flags and bits per pixel. Fix all of it. Fixes: 1319f2178bdf ("drm/panel-simple: add Evervision VGG644804 panel entry") Signed-off-by: Michael Walle Reviewed-by: Neil Armstrong Signed-off-by: Neil Armstrong Link: https://lore.kernel.org/r/20250520074110.655114-1-mwalle@kernel.org Signed-off-by: Sasha Levin --- drivers/gpu/drm/panel/panel-simple.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c index d041ff542a4ee..82db3daf4f81a 100644 --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c @@ -2141,13 +2141,14 @@ static const struct display_timing evervision_vgg644804_timing = { static const struct panel_desc evervision_vgg644804 = { .timings = &evervision_vgg644804_timing, .num_timings = 1, - .bpc = 8, + .bpc = 6, .size = { .width = 115, .height = 86, }, .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG, - .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE, + .bus_flags = DRM_BUS_FLAG_DE_HIGH, + .connector_type = DRM_MODE_CONNECTOR_LVDS, }; static const struct display_timing evervision_vgg804821_timing = { -- GitLab From 251496ce1728c9fd47bd2b20a7b21b20b9a020ca Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Fri, 23 May 2025 14:20:44 +0200 Subject: [PATCH 1077/2211] netfilter: nf_set_pipapo_avx2: fix initial map fill [ Upstream commit ea77c397bff8b6d59f6d83dae1425b08f465e8b5 ] If the first field doesn't cover the entire start map, then we must zero out the remainder, else we leak those bits into the next match round map. The early fix was incomplete and did only fix up the generic C implementation. A followup patch adds a test case to nft_concat_range.sh. Fixes: 791a615b7ad2 ("netfilter: nf_set_pipapo: fix initial map fill") Signed-off-by: Florian Westphal Reviewed-by: Stefano Brivio Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- net/netfilter/nft_set_pipapo_avx2.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/net/netfilter/nft_set_pipapo_avx2.c b/net/netfilter/nft_set_pipapo_avx2.c index c15db28c5ebc4..be7c16c79f711 100644 --- a/net/netfilter/nft_set_pipapo_avx2.c +++ b/net/netfilter/nft_set_pipapo_avx2.c @@ -1113,6 +1113,25 @@ bool nft_pipapo_avx2_estimate(const struct nft_set_desc *desc, u32 features, return true; } +/** + * pipapo_resmap_init_avx2() - Initialise result map before first use + * @m: Matching data, including mapping table + * @res_map: Result map + * + * Like pipapo_resmap_init() but do not set start map bits covered by the first field. + */ +static inline void pipapo_resmap_init_avx2(const struct nft_pipapo_match *m, unsigned long *res_map) +{ + const struct nft_pipapo_field *f = m->f; + int i; + + /* Starting map doesn't need to be set to all-ones for this implementation, + * but we do need to zero the remaining bits, if any. + */ + for (i = f->bsize; i < m->bsize_max; i++) + res_map[i] = 0ul; +} + /** * nft_pipapo_avx2_lookup() - Lookup function for AVX2 implementation * @net: Network namespace @@ -1171,7 +1190,7 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set, res = scratch->map + (map_index ? m->bsize_max : 0); fill = scratch->map + (map_index ? 0 : m->bsize_max); - /* Starting map doesn't need to be set for this implementation */ + pipapo_resmap_init_avx2(m, res); nft_pipapo_avx2_prepare(); -- GitLab From f34dc858e69b262ab3d4db5020fcbecfe8717a11 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Fri, 30 May 2025 12:34:02 +0200 Subject: [PATCH 1078/2211] netfilter: nf_nat: also check reverse tuple to obtain clashing entry [ Upstream commit 50d9ce9679dd50df2dc51ada717fa875bc248fad ] The logic added in the blamed commit was supposed to only omit nat source port allocation if neither the existing nor the new entry are subject to NAT. However, its not enough to lookup the conntrack based on the proposed tuple, we must also check the reverse direction. Otherwise there are esoteric cases where the collision is in the reverse direction because that colliding connection has a port rewrite, but the new entry doesn't. In this case, we only check the new entry and then erronously conclude that no clash exists anymore. The existing (udp) tuple is: a:p -> b:P, with nat translation to s:P, i.e. pure daddr rewrite, reverse tuple in conntrack table is s:P -> a:p. When another UDP packet is sent directly to s, i.e. a:p->s:P, this is correctly detected as a colliding entry: tuple is taken by existing reply tuple in reverse direction. But the colliding conntrack is only searched for with unreversed direction, and we can't find such entry matching a:p->s:P. The incorrect conclusion is that the clashing entry has timed out and that no port address translation is required. Such conntrack will then be discarded at nf_confirm time because the proposed reverse direction clashes with an existing mapping in the conntrack table. Search for the reverse tuple too, this will then check the NAT bits of the colliding entry and triggers port reallocation. Followp patch extends nft_nat.sh selftest to cover this scenario. The IPS_SEQ_ADJUST change is also a bug fix: Instead of checking for SEQ_ADJ this tested for SEEN_REPLY and ASSURED by accident -- _BIT is only for use with the test_bit() API. This bug has little consequence in practice, because the sequence number adjustments are only useful for TCP which doesn't support clash resolution. The existing test case (conntrack_reverse_clash.sh) exercise a race condition path (parallel conntrack creation on different CPUs), so the colliding entries have neither SEEN_REPLY nor ASSURED set. Thanks to Yafang Shao and Shaun Brady for an initial investigation of this bug. Fixes: d8f84a9bc7c4 ("netfilter: nf_nat: don't try nat source port reallocation for reverse dir clash") Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1795 Reported-by: Yafang Shao Reported-by: Shaun Brady Signed-off-by: Florian Westphal Tested-by: Yafang Shao Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- net/netfilter/nf_nat_core.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c index 4085c436e3062..02f10a46fab7c 100644 --- a/net/netfilter/nf_nat_core.c +++ b/net/netfilter/nf_nat_core.c @@ -248,7 +248,7 @@ static noinline bool nf_nat_used_tuple_new(const struct nf_conntrack_tuple *tuple, const struct nf_conn *ignored_ct) { - static const unsigned long uses_nat = IPS_NAT_MASK | IPS_SEQ_ADJUST_BIT; + static const unsigned long uses_nat = IPS_NAT_MASK | IPS_SEQ_ADJUST; const struct nf_conntrack_tuple_hash *thash; const struct nf_conntrack_zone *zone; struct nf_conn *ct; @@ -287,8 +287,14 @@ nf_nat_used_tuple_new(const struct nf_conntrack_tuple *tuple, zone = nf_ct_zone(ignored_ct); thash = nf_conntrack_find_get(net, zone, tuple); - if (unlikely(!thash)) /* clashing entry went away */ - return false; + if (unlikely(!thash)) { + struct nf_conntrack_tuple reply; + + nf_ct_invert_tuple(&reply, tuple); + thash = nf_conntrack_find_get(net, zone, &reply); + if (!thash) /* clashing entry went away */ + return false; + } ct = nf_ct_tuplehash_to_ctrack(thash); -- GitLab From 6c2e06200216cee4b19e8a1692c9e3a4d986b016 Mon Sep 17 00:00:00 2001 From: Meghana Malladi Date: Tue, 3 Jun 2025 10:59:04 +0530 Subject: [PATCH 1079/2211] net: ti: icssg-prueth: Fix swapped TX stats for MII interfaces. [ Upstream commit 919d763d609428c2680ec8159257d9655f002f89 ] In MII mode, Tx lines are swapped for port0 and port1, which means Tx port0 receives data from PRU1 and the Tx port1 receives data from PRU0. This is an expected hardware behavior and reading the Tx stats needs to be handled accordingly in the driver. Update the driver to read Tx stats from the PRU1 for port0 and PRU0 for port1. Fixes: c1e10d5dc7a1 ("net: ti: icssg-prueth: Add ICSSG Stats") Signed-off-by: Meghana Malladi Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250603052904.431203-1-m-malladi@ti.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/ti/icssg/icssg_stats.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/ethernet/ti/icssg/icssg_stats.c b/drivers/net/ethernet/ti/icssg/icssg_stats.c index 6f0edae38ea24..172ae38381b45 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_stats.c +++ b/drivers/net/ethernet/ti/icssg/icssg_stats.c @@ -29,6 +29,14 @@ void emac_update_hardware_stats(struct prueth_emac *emac) spin_lock(&prueth->stats_lock); for (i = 0; i < ARRAY_SIZE(icssg_all_miig_stats); i++) { + /* In MII mode TX lines are swapped inside ICSSG, so read Tx stats + * from slice1 for port0 and slice0 for port1 to get accurate Tx + * stats for a given port + */ + if (emac->phy_if == PHY_INTERFACE_MODE_MII && + icssg_all_miig_stats[i].offset >= ICSSG_TX_PACKET_OFFSET && + icssg_all_miig_stats[i].offset <= ICSSG_TX_BYTE_OFFSET) + base = stats_base[slice ^ 1]; regmap_read(prueth->miig_rt, base + icssg_all_miig_stats[i].offset, &val); -- GitLab From 6d1c93a5c6b0ae87bb7001d8d6fdef3b3be9c6c6 Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Mon, 2 Jun 2025 21:39:50 +0200 Subject: [PATCH 1080/2211] net: dsa: b53: do not enable RGMII delay on bcm63xx [ Upstream commit 4af523551d876ab8b8057d1e5303a860fd736fcb ] bcm63xx's RGMII ports are always in MAC mode, never in PHY mode, so we shouldn't enable any delays and let the PHY handle any delays as necessary. This fixes using RGMII ports with normal PHYs like BCM54612E, which will handle the delay in the PHY. Fixes: ce3bf94871f7 ("net: dsa: b53: add support for BCM63xx RGMIIs") Signed-off-by: Jonas Gorski Reviewed-by: Florian Fainelli Link: https://patch.msgid.link/20250602193953.1010487-3-jonas.gorski@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/dsa/b53/b53_common.c | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 0168ad495e6c9..2747a507e3ce9 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -1326,24 +1326,7 @@ static void b53_adjust_63xx_rgmii(struct dsa_switch *ds, int port, off = B53_RGMII_CTRL_P(port); b53_read8(dev, B53_CTRL_PAGE, off, &rgmii_ctrl); - - switch (interface) { - case PHY_INTERFACE_MODE_RGMII_ID: - rgmii_ctrl |= (RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC); - break; - case PHY_INTERFACE_MODE_RGMII_RXID: - rgmii_ctrl &= ~(RGMII_CTRL_DLL_TXC); - rgmii_ctrl |= RGMII_CTRL_DLL_RXC; - break; - case PHY_INTERFACE_MODE_RGMII_TXID: - rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC); - rgmii_ctrl |= RGMII_CTRL_DLL_TXC; - break; - case PHY_INTERFACE_MODE_RGMII: - default: - rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC); - break; - } + rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC); if (port != dev->imp_port) { if (is63268(dev)) -- GitLab From 1aa31695bf0dc1ee3e6c559c14db7fd05b6bb102 Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Mon, 2 Jun 2025 21:39:52 +0200 Subject: [PATCH 1081/2211] net: dsa: b53: allow RGMII for bcm63xx RGMII ports [ Upstream commit 5ea0d42c1980e6d10e5cb56a78021db5bfcebaaf ] Add RGMII to supported interfaces for BCM63xx RGMII ports so they can be actually used in RGMII mode. Without this, phylink will fail to configure them: [ 3.580000] b53-switch 10700000.switch GbE3 (uninitialized): validation of rgmii with support 0000000,00000000,00000000,000062ff and advertisement 0000000,00000000,00000000,000062ff failed: -EINVAL [ 3.600000] b53-switch 10700000.switch GbE3 (uninitialized): failed to connect to PHY: -EINVAL [ 3.610000] b53-switch 10700000.switch GbE3 (uninitialized): error -22 setting up PHY for tree 0, switch 0, port 4 Fixes: ce3bf94871f7 ("net: dsa: b53: add support for BCM63xx RGMIIs") Reviewed-by: Florian Fainelli Signed-off-by: Jonas Gorski Link: https://patch.msgid.link/20250602193953.1010487-5-jonas.gorski@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/dsa/b53/b53_common.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 2747a507e3ce9..a17a3083180b0 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -1441,6 +1441,10 @@ static void b53_phylink_get_caps(struct dsa_switch *ds, int port, __set_bit(PHY_INTERFACE_MODE_MII, config->supported_interfaces); __set_bit(PHY_INTERFACE_MODE_REVMII, config->supported_interfaces); + /* BCM63xx RGMII ports support RGMII */ + if (is63xx(dev) && in_range(port, B53_63XX_RGMII0, 4)) + phy_interface_set_rgmii(config->supported_interfaces); + config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | MAC_10 | MAC_100; -- GitLab From b2fc08d276797e529cacad6fa9d704a7367090b5 Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Mon, 2 Jun 2025 21:39:53 +0200 Subject: [PATCH 1082/2211] net: dsa: b53: do not touch DLL_IQQD on bcm53115 [ Upstream commit bc1a65eb81a21e2aa3c3dca058ee8adf687b6ef5 ] According to OpenMDK, bit 2 of the RGMII register has a different meaning for BCM53115 [1]: "DLL_IQQD 1: In the IDDQ mode, power is down0: Normal function mode" Configuring RGMII delay works without setting this bit, so let's keep it at the default. For other chips, we always set it, so not clearing it is not an issue. One would assume BCM53118 works the same, but OpenMDK is not quite sure what this bit actually means [2]: "BYPASS_IMP_2NS_DEL #1: In the IDDQ mode, power is down#0: Normal function mode1: Bypass dll65_2ns_del IP0: Use dll65_2ns_del IP" So lets keep setting it for now. [1] https://github.com/Broadcom-Network-Switching-Software/OpenMDK/blob/master/cdk/PKG/chip/bcm53115/bcm53115_a0_defs.h#L19871 [2] https://github.com/Broadcom-Network-Switching-Software/OpenMDK/blob/master/cdk/PKG/chip/bcm53118/bcm53118_a0_defs.h#L14392 Fixes: 967dd82ffc52 ("net: dsa: b53: Add support for Broadcom RoboSwitch") Signed-off-by: Jonas Gorski Link: https://patch.msgid.link/20250602193953.1010487-6-jonas.gorski@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/dsa/b53/b53_common.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index a17a3083180b0..79039c0941c20 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -1356,8 +1356,7 @@ static void b53_adjust_531x5_rgmii(struct dsa_switch *ds, int port, * tx_clk aligned timing (restoring to reset defaults) */ b53_read8(dev, B53_CTRL_PAGE, off, &rgmii_ctrl); - rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC | - RGMII_CTRL_TIMING_SEL); + rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC); /* PHY_INTERFACE_MODE_RGMII_TXID means TX internal delay, make * sure that we enable the port TX clock internal delay to @@ -1377,7 +1376,10 @@ static void b53_adjust_531x5_rgmii(struct dsa_switch *ds, int port, rgmii_ctrl |= RGMII_CTRL_DLL_TXC; if (interface == PHY_INTERFACE_MODE_RGMII) rgmii_ctrl |= RGMII_CTRL_DLL_TXC | RGMII_CTRL_DLL_RXC; - rgmii_ctrl |= RGMII_CTRL_TIMING_SEL; + + if (dev->chip_id != BCM53115_DEVICE_ID) + rgmii_ctrl |= RGMII_CTRL_TIMING_SEL; + b53_write8(dev, B53_CTRL_PAGE, off, rgmii_ctrl); dev_info(ds->dev, "Configured port %d for %s\n", port, -- GitLab From 4f0fcdb8357d02d6b8af862866fcd57081ef8b92 Mon Sep 17 00:00:00 2001 From: Lachlan Hodges Date: Tue, 3 Jun 2025 15:35:38 +1000 Subject: [PATCH 1083/2211] wifi: cfg80211/mac80211: correctly parse S1G beacon optional elements [ Upstream commit 1e1f706fc2ce90eaaf3480b3d5f27885960d751c ] S1G beacons are not traditional beacons but a type of extension frame. Extension frames contain the frame control and duration fields, followed by zero or more optional fields before the frame body. These optional fields are distinct from the variable length elements. The presence of optional fields is indicated in the frame control field. To correctly locate the elements offset, the frame control must be parsed to identify which optional fields are present. Currently, mac80211 parses S1G beacons based on fixed assumptions about the frame layout, without inspecting the frame control field. This can result in incorrect offsets to the "variable" portion of the frame. Properly parse S1G beacon frames by using the field lengths defined in IEEE 802.11-2024, section 9.3.4.3, ensuring that the elements offset is calculated accurately. Fixes: 9eaffe5078ca ("cfg80211: convert S1G beacon to scan results") Fixes: cd418ba63f0c ("mac80211: convert S1G beacon to scan results") Signed-off-by: Lachlan Hodges Link: https://patch.msgid.link/20250603053538.468562-1-lachlan.hodges@morsemicro.com Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- include/linux/ieee80211.h | 79 ++++++++++++++++++++++++++++++++++----- net/mac80211/mlme.c | 7 +--- net/mac80211/scan.c | 11 +++--- net/wireless/scan.c | 18 ++++----- 4 files changed, 83 insertions(+), 32 deletions(-) diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 777f6aa8efa7b..d07c1f0ad3de3 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h @@ -111,6 +111,8 @@ /* bits unique to S1G beacon */ #define IEEE80211_S1G_BCN_NEXT_TBTT 0x100 +#define IEEE80211_S1G_BCN_CSSID 0x200 +#define IEEE80211_S1G_BCN_ANO 0x400 /* see 802.11ah-2016 9.9 NDP CMAC frames */ #define IEEE80211_S1G_1MHZ_NDP_BITS 25 @@ -153,9 +155,6 @@ #define IEEE80211_ANO_NETTYPE_WILD 15 -/* bits unique to S1G beacon */ -#define IEEE80211_S1G_BCN_NEXT_TBTT 0x100 - /* control extension - for IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTL_EXT */ #define IEEE80211_CTL_EXT_POLL 0x2000 #define IEEE80211_CTL_EXT_SPR 0x3000 @@ -627,6 +626,42 @@ static inline bool ieee80211_is_s1g_beacon(__le16 fc) cpu_to_le16(IEEE80211_FTYPE_EXT | IEEE80211_STYPE_S1G_BEACON); } +/** + * ieee80211_s1g_has_next_tbtt - check if IEEE80211_S1G_BCN_NEXT_TBTT + * @fc: frame control bytes in little-endian byteorder + * Return: whether or not the frame contains the variable-length + * next TBTT field + */ +static inline bool ieee80211_s1g_has_next_tbtt(__le16 fc) +{ + return ieee80211_is_s1g_beacon(fc) && + (fc & cpu_to_le16(IEEE80211_S1G_BCN_NEXT_TBTT)); +} + +/** + * ieee80211_s1g_has_ano - check if IEEE80211_S1G_BCN_ANO + * @fc: frame control bytes in little-endian byteorder + * Return: whether or not the frame contains the variable-length + * ANO field + */ +static inline bool ieee80211_s1g_has_ano(__le16 fc) +{ + return ieee80211_is_s1g_beacon(fc) && + (fc & cpu_to_le16(IEEE80211_S1G_BCN_ANO)); +} + +/** + * ieee80211_s1g_has_cssid - check if IEEE80211_S1G_BCN_CSSID + * @fc: frame control bytes in little-endian byteorder + * Return: whether or not the frame contains the variable-length + * compressed SSID field + */ +static inline bool ieee80211_s1g_has_cssid(__le16 fc) +{ + return ieee80211_is_s1g_beacon(fc) && + (fc & cpu_to_le16(IEEE80211_S1G_BCN_CSSID)); +} + /** * ieee80211_is_s1g_short_beacon - check if frame is an S1G short beacon * @fc: frame control bytes in little-endian byteorder @@ -1245,16 +1280,40 @@ struct ieee80211_ext { u8 change_seq; u8 variable[0]; } __packed s1g_beacon; - struct { - u8 sa[ETH_ALEN]; - __le32 timestamp; - u8 change_seq; - u8 next_tbtt[3]; - u8 variable[0]; - } __packed s1g_short_beacon; } u; } __packed __aligned(2); +/** + * ieee80211_s1g_optional_len - determine length of optional S1G beacon fields + * @fc: frame control bytes in little-endian byteorder + * Return: total length in bytes of the optional fixed-length fields + * + * S1G beacons may contain up to three optional fixed-length fields that + * precede the variable-length elements. Whether these fields are present + * is indicated by flags in the frame control field. + * + * From IEEE 802.11-2024 section 9.3.4.3: + * - Next TBTT field may be 0 or 3 bytes + * - Short SSID field may be 0 or 4 bytes + * - Access Network Options (ANO) field may be 0 or 1 byte + */ +static inline size_t +ieee80211_s1g_optional_len(__le16 fc) +{ + size_t len = 0; + + if (ieee80211_s1g_has_next_tbtt(fc)) + len += 3; + + if (ieee80211_s1g_has_cssid(fc)) + len += 4; + + if (ieee80211_s1g_has_ano(fc)) + len += 1; + + return len; +} + #define IEEE80211_TWT_CONTROL_NDP BIT(0) #define IEEE80211_TWT_CONTROL_RESP_MODE BIT(1) #define IEEE80211_TWT_CONTROL_NEG_TYPE_BROADCAST BIT(3) diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 8fa9b9dd46118..16bb3db67eaac 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -6728,11 +6728,8 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link, bssid = ieee80211_get_bssid(hdr, len, sdata->vif.type); if (ieee80211_is_s1g_beacon(mgmt->frame_control)) { struct ieee80211_ext *ext = (void *) mgmt; - - if (ieee80211_is_s1g_short_beacon(ext->frame_control)) - variable = ext->u.s1g_short_beacon.variable; - else - variable = ext->u.s1g_beacon.variable; + variable = ext->u.s1g_beacon.variable + + ieee80211_s1g_optional_len(ext->frame_control); } baselen = (u8 *) variable - (u8 *) mgmt; diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index adb88c06b5982..ce6d5857214eb 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c @@ -260,6 +260,7 @@ void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb) struct ieee80211_mgmt *mgmt = (void *)skb->data; struct ieee80211_bss *bss; struct ieee80211_channel *channel; + struct ieee80211_ext *ext; size_t min_hdr_len = offsetof(struct ieee80211_mgmt, u.probe_resp.variable); @@ -269,12 +270,10 @@ void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb) return; if (ieee80211_is_s1g_beacon(mgmt->frame_control)) { - if (ieee80211_is_s1g_short_beacon(mgmt->frame_control)) - min_hdr_len = offsetof(struct ieee80211_ext, - u.s1g_short_beacon.variable); - else - min_hdr_len = offsetof(struct ieee80211_ext, - u.s1g_beacon); + ext = (struct ieee80211_ext *)mgmt; + min_hdr_len = + offsetof(struct ieee80211_ext, u.s1g_beacon.variable) + + ieee80211_s1g_optional_len(ext->frame_control); } if (skb->len < min_hdr_len) diff --git a/net/wireless/scan.c b/net/wireless/scan.c index f0dd1f448d4d4..d80ab1725f28d 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c @@ -3213,6 +3213,7 @@ cfg80211_inform_bss_frame_data(struct wiphy *wiphy, const u8 *ie; size_t ielen; u64 tsf; + size_t s1g_optional_len; if (WARN_ON(!mgmt)) return NULL; @@ -3227,12 +3228,11 @@ cfg80211_inform_bss_frame_data(struct wiphy *wiphy, if (ieee80211_is_s1g_beacon(mgmt->frame_control)) { ext = (void *) mgmt; - if (ieee80211_is_s1g_short_beacon(mgmt->frame_control)) - min_hdr_len = offsetof(struct ieee80211_ext, - u.s1g_short_beacon.variable); - else - min_hdr_len = offsetof(struct ieee80211_ext, - u.s1g_beacon.variable); + s1g_optional_len = + ieee80211_s1g_optional_len(ext->frame_control); + min_hdr_len = + offsetof(struct ieee80211_ext, u.s1g_beacon.variable) + + s1g_optional_len; } else { /* same for beacons */ min_hdr_len = offsetof(struct ieee80211_mgmt, @@ -3248,11 +3248,7 @@ cfg80211_inform_bss_frame_data(struct wiphy *wiphy, const struct ieee80211_s1g_bcn_compat_ie *compat; const struct element *elem; - if (ieee80211_is_s1g_short_beacon(mgmt->frame_control)) - ie = ext->u.s1g_short_beacon.variable; - else - ie = ext->u.s1g_beacon.variable; - + ie = ext->u.s1g_beacon.variable + s1g_optional_len; elem = cfg80211_find_elem(WLAN_EID_S1G_BCN_COMPAT, ie, ielen); if (!elem) return NULL; -- GitLab From 031f5c5ca09752accde0957a468fcd9aa760310c Mon Sep 17 00:00:00 2001 From: Daniele Palmas Date: Tue, 3 Jun 2025 11:12:04 +0200 Subject: [PATCH 1084/2211] net: wwan: mhi_wwan_mbim: use correct mux_id for multiplexing [ Upstream commit 501fe52aa908c96f2c9b8d54767938a1a5960354 ] Recent Qualcomm chipsets like SDX72/75 require MBIM sessionId mapping to muxId in the range (0x70-0x8F) for the PCIe tethered use. This has been partially addressed by the referenced commit, mapping the default data call to muxId = 112, but the multiplexed data calls scenario was not properly considered, mapping sessionId = 1 to muxId 1, while it should have been 113. Fix this by moving the session_id assignment logic to mhi_mbim_newlink, in order to map sessionId = n to muxId = n + WDS_BIND_MUX_DATA_PORT_MUX_ID. Fixes: 65bc58c3dcad ("net: wwan: mhi: make default data link id configurable") Signed-off-by: Daniele Palmas Reviewed-by: Loic Poulain Link: https://patch.msgid.link/20250603091204.2802840-1-dnlplm@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/wwan/mhi_wwan_mbim.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/drivers/net/wwan/mhi_wwan_mbim.c b/drivers/net/wwan/mhi_wwan_mbim.c index 8755c5e6a65b3..c814fbd756a1e 100644 --- a/drivers/net/wwan/mhi_wwan_mbim.c +++ b/drivers/net/wwan/mhi_wwan_mbim.c @@ -550,8 +550,8 @@ static int mhi_mbim_newlink(void *ctxt, struct net_device *ndev, u32 if_id, struct mhi_mbim_link *link = wwan_netdev_drvpriv(ndev); struct mhi_mbim_context *mbim = ctxt; - link->session = if_id; link->mbim = mbim; + link->session = mhi_mbim_get_link_mux_id(link->mbim->mdev->mhi_cntrl) + if_id; link->ndev = ndev; u64_stats_init(&link->rx_syncp); u64_stats_init(&link->tx_syncp); @@ -607,7 +607,7 @@ static int mhi_mbim_probe(struct mhi_device *mhi_dev, const struct mhi_device_id { struct mhi_controller *cntrl = mhi_dev->mhi_cntrl; struct mhi_mbim_context *mbim; - int err, link_id; + int err; mbim = devm_kzalloc(&mhi_dev->dev, sizeof(*mbim), GFP_KERNEL); if (!mbim) @@ -628,11 +628,8 @@ static int mhi_mbim_probe(struct mhi_device *mhi_dev, const struct mhi_device_id /* Number of transfer descriptors determines size of the queue */ mbim->rx_queue_sz = mhi_get_free_desc_count(mhi_dev, DMA_FROM_DEVICE); - /* Get the corresponding mux_id from mhi */ - link_id = mhi_mbim_get_link_mux_id(cntrl); - /* Register wwan link ops with MHI controller representing WWAN instance */ - return wwan_register_ops(&cntrl->mhi_dev->dev, &mhi_mbim_wwan_ops, mbim, link_id); + return wwan_register_ops(&cntrl->mhi_dev->dev, &mhi_mbim_wwan_ops, mbim, 0); } static void mhi_mbim_remove(struct mhi_device *mhi_dev) -- GitLab From 933466fc50a8e4eb167acbd0d8ec96a078462e9c Mon Sep 17 00:00:00 2001 From: Mirco Barone Date: Thu, 5 Jun 2025 14:06:16 +0200 Subject: [PATCH 1085/2211] wireguard: device: enable threaded NAPI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit db9ae3b6b43c79b1ba87eea849fd65efa05b4b2e ] Enable threaded NAPI by default for WireGuard devices in response to low performance behavior that we observed when multiple tunnels (and thus multiple wg devices) are deployed on a single host. This affects any kind of multi-tunnel deployment, regardless of whether the tunnels share the same endpoints or not (i.e., a VPN concentrator type of gateway would also be affected). The problem is caused by the fact that, in case of a traffic surge that involves multiple tunnels at the same time, the polling of the NAPI instance of all these wg devices tends to converge onto the same core, causing underutilization of the CPU and bottlenecking performance. This happens because NAPI polling is hosted by default in softirq context, but the WireGuard driver only raises this softirq after the rx peer queue has been drained, which doesn't happen during high traffic. In this case, the softirq already active on a core is reused instead of raising a new one. As a result, once two or more tunnel softirqs have been scheduled on the same core, they remain pinned there until the surge ends. In our experiments, this almost always leads to all tunnel NAPIs being handled on a single core shortly after a surge begins, limiting scalability to less than 3× the performance of a single tunnel, despite plenty of unused CPU cores being available. The proposed mitigation is to enable threaded NAPI for all WireGuard devices. This moves the NAPI polling context to a dedicated per-device kernel thread, allowing the scheduler to balance the load across all available cores. On our 32-core gateways, enabling threaded NAPI yields a ~4× performance improvement with 16 tunnels, increasing throughput from ~13 Gbps to ~48 Gbps. Meanwhile, CPU usage on the receiver (which is the bottleneck) jumps from 20% to 100%. We have found no performance regressions in any scenario we tested. Single-tunnel throughput remains unchanged. More details are available in our Netdev paper. Link: https://netdevconf.info/0x18/docs/netdev-0x18-paper23-talk-paper.pdf Signed-off-by: Mirco Barone Fixes: e7096c131e51 ("net: WireGuard secure network tunnel") Signed-off-by: Jason A. Donenfeld Link: https://patch.msgid.link/20250605120616.2808744-1-Jason@zx2c4.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/wireguard/device.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/wireguard/device.c b/drivers/net/wireguard/device.c index 45e9b908dbfb0..acb9ce7a626af 100644 --- a/drivers/net/wireguard/device.c +++ b/drivers/net/wireguard/device.c @@ -364,6 +364,7 @@ static int wg_newlink(struct net *src_net, struct net_device *dev, if (ret < 0) goto err_free_handshake_queue; + dev_set_threaded(dev, true); ret = register_netdevice(dev); if (ret < 0) goto err_uninit_ratelimiter; -- GitLab From d5d9fd13bc19a3f9f2a951c5b6e934d84205789e Mon Sep 17 00:00:00 2001 From: Ido Schimmel Date: Wed, 4 Jun 2025 14:32:52 +0300 Subject: [PATCH 1086/2211] seg6: Fix validation of nexthop addresses [ Upstream commit 7632fedb266d93ed0ed9f487133e6c6314a9b2d1 ] The kernel currently validates that the length of the provided nexthop address does not exceed the specified length. This can lead to the kernel reading uninitialized memory if user space provided a shorter length than the specified one. Fix by validating that the provided length exactly matches the specified one. Fixes: d1df6fd8a1d2 ("ipv6: sr: define core operations for seg6local lightweight tunnel") Reviewed-by: Petr Machata Signed-off-by: Ido Schimmel Reviewed-by: David Ahern Link: https://patch.msgid.link/20250604113252.371528-1-idosch@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/ipv6/seg6_local.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/net/ipv6/seg6_local.c b/net/ipv6/seg6_local.c index c74705ead9849..e445a0a45568d 100644 --- a/net/ipv6/seg6_local.c +++ b/net/ipv6/seg6_local.c @@ -1644,10 +1644,8 @@ static const struct nla_policy seg6_local_policy[SEG6_LOCAL_MAX + 1] = { [SEG6_LOCAL_SRH] = { .type = NLA_BINARY }, [SEG6_LOCAL_TABLE] = { .type = NLA_U32 }, [SEG6_LOCAL_VRFTABLE] = { .type = NLA_U32 }, - [SEG6_LOCAL_NH4] = { .type = NLA_BINARY, - .len = sizeof(struct in_addr) }, - [SEG6_LOCAL_NH6] = { .type = NLA_BINARY, - .len = sizeof(struct in6_addr) }, + [SEG6_LOCAL_NH4] = NLA_POLICY_EXACT_LEN(sizeof(struct in_addr)), + [SEG6_LOCAL_NH6] = NLA_POLICY_EXACT_LEN(sizeof(struct in6_addr)), [SEG6_LOCAL_IIF] = { .type = NLA_U32 }, [SEG6_LOCAL_OIF] = { .type = NLA_U32 }, [SEG6_LOCAL_BPF] = { .type = NLA_NESTED }, -- GitLab From e0198735409873d3d8ce11a5c528c615921f4356 Mon Sep 17 00:00:00 2001 From: Nylon Chen Date: Fri, 11 Apr 2025 15:38:50 +0800 Subject: [PATCH 1087/2211] riscv: misaligned: fix sleeping function called during misaligned access handling [ Upstream commit 61a74ad254628ccd9e88838c3c622885dfb6c588 ] Use copy_from_user_nofault() and copy_to_user_nofault() instead of copy_from/to_user functions in the misaligned access trap handlers. The following bug report was found when executing misaligned memory accesses: BUG: sleeping function called from invalid context at ./include/linux/uaccess.h:162 in_atomic(): 0, irqs_disabled(): 1, non_block: 0, pid: 115, name: two preempt_count: 0, expected: 0 CPU: 0 UID: 0 PID: 115 Comm: two Not tainted 6.14.0-rc5 #24 Hardware name: riscv-virtio,qemu (DT) Call Trace: [] dump_backtrace+0x1c/0x24 [] show_stack+0x28/0x34 [] dump_stack_lvl+0x4a/0x68 [] dump_stack+0x14/0x1c [] __might_resched+0xfa/0x104 [] __might_sleep+0x3e/0x62 [] __might_fault+0x1c/0x24 [] _copy_from_user+0x28/0xaa [] handle_misaligned_store+0x204/0x254 [] do_trap_store_misaligned+0x24/0xee [] handle_exception+0x146/0x152 Fixes: b686ecdeacf6 ("riscv: misaligned: Restrict user access to kernel memory") Fixes: 441381506ba7 ("riscv: misaligned: remove CONFIG_RISCV_M_MODE specific code") Signed-off-by: Zong Li Signed-off-by: Nylon Chen Link: https://lore.kernel.org/r/20250411073850.3699180-3-nylon.chen@sifive.com Signed-off-by: Palmer Dabbelt Signed-off-by: Sasha Levin --- arch/riscv/kernel/traps_misaligned.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/riscv/kernel/traps_misaligned.c b/arch/riscv/kernel/traps_misaligned.c index d14bfc23e315b..36ac96eac9c9e 100644 --- a/arch/riscv/kernel/traps_misaligned.c +++ b/arch/riscv/kernel/traps_misaligned.c @@ -429,7 +429,7 @@ int handle_misaligned_load(struct pt_regs *regs) val.data_u64 = 0; if (user_mode(regs)) { - if (copy_from_user(&val, (u8 __user *)addr, len)) + if (copy_from_user_nofault(&val, (u8 __user *)addr, len)) return -1; } else { memcpy(&val, (u8 *)addr, len); @@ -530,7 +530,7 @@ int handle_misaligned_store(struct pt_regs *regs) return -EOPNOTSUPP; if (user_mode(regs)) { - if (copy_to_user((u8 __user *)addr, &val, len)) + if (copy_to_user_nofault((u8 __user *)addr, &val, len)) return -1; } else { memcpy((u8 *)addr, &val, len); -- GitLab From 1cda72119b311ba9791d8a96eabd54158dfbb5aa Mon Sep 17 00:00:00 2001 From: Nitin Rawat Date: Mon, 26 May 2025 21:08:12 +0530 Subject: [PATCH 1088/2211] scsi: ufs: qcom: Prevent calling phy_exit() before phy_init() [ Upstream commit 7831003165d37ecb7b33843fcee05cada0359a82 ] Prevent calling phy_exit() before phy_init() to avoid abnormal power count and the following warning during boot up. [5.146763] phy phy-1d80000.phy.0: phy_power_on was called before phy_init Fixes: 7bac65687510 ("scsi: ufs: qcom: Power off the PHY if it was already powered on in ufs_qcom_power_up_sequence()") Signed-off-by: Nitin Rawat Link: https://lore.kernel.org/r/20250526153821.7918-2-quic_nitirawa@quicinc.com Reviewed-by: Konrad Dybcio Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/ufs/host/ufs-qcom.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c index 4557b1bcd6356..a715f377d0a80 100644 --- a/drivers/ufs/host/ufs-qcom.c +++ b/drivers/ufs/host/ufs-qcom.c @@ -366,10 +366,9 @@ static int ufs_qcom_power_up_sequence(struct ufs_hba *hba) if (ret) return ret; - if (phy->power_count) { + if (phy->power_count) phy_power_off(phy); - phy_exit(phy); - } + /* phy initialization - calibrate the phy */ ret = phy_init(phy); -- GitLab From 3668296690e40e84a77ba2b837eb50fa67aa1323 Mon Sep 17 00:00:00 2001 From: Cezary Rojewski Date: Fri, 30 May 2025 16:10:17 +0200 Subject: [PATCH 1089/2211] ASoC: codecs: hda: Fix RPM usage count underflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit ff0045de4ee0288dec683690f66f2f369b7d3466 ] RPM manipulation in hda_codec_probe_complete()'s error path is superfluous and leads to RPM usage count underflow if the build-controls operation fails. hda_codec_probe_complete() is called in: 1) hda_codec_probe() for all non-HDMI codecs 2) in card->late_probe() for HDMI codecs Error path for hda_codec_probe() takes care of bus' RPM already. For 2) if late_probe() fails, ASoC performs card cleanup what triggers hda_codec_remote() - same treatment is in 1). Fixes: b5df2a7dca1c ("ASoC: codecs: Add HD-Audio codec driver") Reviewed-by: Amadeusz Sławiński Signed-off-by: Cezary Rojewski Link: https://patch.msgid.link/20250530141025.2942936-2-cezary.rojewski@intel.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/hda.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/soc/codecs/hda.c b/sound/soc/codecs/hda.c index ddc00927313cf..dc7794c9ac44c 100644 --- a/sound/soc/codecs/hda.c +++ b/sound/soc/codecs/hda.c @@ -152,7 +152,7 @@ int hda_codec_probe_complete(struct hda_codec *codec) ret = snd_hda_codec_build_controls(codec); if (ret < 0) { dev_err(&hdev->dev, "unable to create controls %d\n", ret); - goto out; + return ret; } /* Bus suspended codecs as it does not manage their pm */ @@ -160,7 +160,7 @@ int hda_codec_probe_complete(struct hda_codec *codec) /* rpm was forbidden in snd_hda_codec_device_new() */ snd_hda_codec_set_power_save(codec, 2000); snd_hda_codec_register(codec); -out: + /* Complement pm_runtime_get_sync(bus) in probe */ pm_runtime_mark_last_busy(bus->dev); pm_runtime_put_autosuspend(bus->dev); -- GitLab From cabc3dc410e8c5a338052dab80d4824b53819d8b Mon Sep 17 00:00:00 2001 From: Cezary Rojewski Date: Fri, 30 May 2025 16:10:18 +0200 Subject: [PATCH 1090/2211] ASoC: Intel: avs: Fix deadlock when the failing IPC is SET_D0IX MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 9ad1f3cd0d60444c69948854c7e50d2a61b63755 ] The procedure handling IPC timeouts and EXCEPTION_CAUGHT notification shall cancel any D0IX work before proceeding with DSP recovery. If SET_D0IX called from delayed_work is the failing IPC the procedure will deadlock. Conditionally skip cancelling the work to fix that. Fixes: 335c4cbd201d ("ASoC: Intel: avs: D0ix power state support") Reviewed-by: Amadeusz Sławiński Signed-off-by: Cezary Rojewski Link: https://patch.msgid.link/20250530141025.2942936-3-cezary.rojewski@intel.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/intel/avs/ipc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sound/soc/intel/avs/ipc.c b/sound/soc/intel/avs/ipc.c index 4fba46e77c470..eff1d46040da6 100644 --- a/sound/soc/intel/avs/ipc.c +++ b/sound/soc/intel/avs/ipc.c @@ -169,7 +169,9 @@ static void avs_dsp_exception_caught(struct avs_dev *adev, union avs_notify_msg dev_crit(adev->dev, "communication severed, rebooting dsp..\n"); - cancel_delayed_work_sync(&ipc->d0ix_work); + /* Avoid deadlock as the exception may be the response to SET_D0IX. */ + if (current_work() != &ipc->d0ix_work.work) + cancel_delayed_work_sync(&ipc->d0ix_work); ipc->in_d0ix = false; /* Re-enabled on recovery completion. */ pm_runtime_disable(adev->dev); -- GitLab From 18ff538aac63de1866e5a49d57e22788b5c21d12 Mon Sep 17 00:00:00 2001 From: Cezary Rojewski Date: Fri, 30 May 2025 16:10:23 +0200 Subject: [PATCH 1091/2211] ASoC: Intel: avs: Verify content returned by parse_int_array() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 93e246b6769bdacb09cfff4ea0f00fe5ab4f0d7a ] The first element of the returned array stores its length. If it is 0, any manipulation beyond the element at index 0 ends with null-ptr-deref. Fixes: 5a565ba23abe ("ASoC: Intel: avs: Probing and firmware tracing over debugfs") Reviewed-by: Amadeusz Sławiński Signed-off-by: Cezary Rojewski Link: https://patch.msgid.link/20250530141025.2942936-8-cezary.rojewski@intel.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/intel/avs/debugfs.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sound/soc/intel/avs/debugfs.c b/sound/soc/intel/avs/debugfs.c index 1767ded4d9830..c9978fb9c74e2 100644 --- a/sound/soc/intel/avs/debugfs.c +++ b/sound/soc/intel/avs/debugfs.c @@ -372,7 +372,10 @@ static ssize_t trace_control_write(struct file *file, const char __user *from, s return ret; num_elems = *array; - resource_mask = array[1]; + if (!num_elems) { + ret = -EINVAL; + goto free_array; + } /* * Disable if just resource mask is provided - no log priority flags. @@ -380,6 +383,7 @@ static ssize_t trace_control_write(struct file *file, const char __user *from, s * Enable input format: mask, prio1, .., prioN * Where 'N' equals number of bits set in the 'mask'. */ + resource_mask = array[1]; if (num_elems == 1) { ret = disable_logs(adev, resource_mask); } else { -- GitLab From 569fb8c122374a83f9794802d11f9074abb40413 Mon Sep 17 00:00:00 2001 From: Yuuki NAGAO Date: Sat, 31 May 2025 23:13:41 +0900 Subject: [PATCH 1092/2211] ASoC: ti: omap-hdmi: Re-add dai_link->platform to fix card init [ Upstream commit bae071aa7bcd034054cec91666c80f812adeccd9 ] The removed dai_link->platform component cause a fail which is exposed at runtime. (ex: when a sound tool is used) This patch re-adds the dai_link->platform component to have a full card registered. Before this patch: $ aplay -l **** List of PLAYBACK Hardware Devices **** card 1: HDMI [HDMI], device 0: HDMI snd-soc-dummy-dai-0 [] Subdevices: 1/1 Subdevice #0: subdevice #0 $ speaker-test -D plughw:1,0 -t sine speaker-test 1.2.8 Playback device is plughw:1,0 Stream parameters are 48000Hz, S16_LE, 1 channels Sine wave rate is 440.0000Hz Playback open error: -22,Invalid argument After this patch which restores the platform component: $ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: HDMI [HDMI], device 0: HDMI snd-soc-dummy-dai-0 [HDMI snd-soc-dummy-dai-0] Subdevices: 0/1 Subdevice #0: subdevice #0 -> Resolve the playback error. Fixes: 3b0db249cf8f ("ASoC: ti: remove unnecessary dai_link->platform") Signed-off-by: Yuuki NAGAO Link: https://patch.msgid.link/20250531141341.81164-1-wf.yn386@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/ti/omap-hdmi.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sound/soc/ti/omap-hdmi.c b/sound/soc/ti/omap-hdmi.c index cf43ac19c4a6d..55e7cb96858fc 100644 --- a/sound/soc/ti/omap-hdmi.c +++ b/sound/soc/ti/omap-hdmi.c @@ -361,17 +361,20 @@ static int omap_hdmi_audio_probe(struct platform_device *pdev) if (!card->dai_link) return -ENOMEM; - compnent = devm_kzalloc(dev, sizeof(*compnent), GFP_KERNEL); + compnent = devm_kzalloc(dev, 2 * sizeof(*compnent), GFP_KERNEL); if (!compnent) return -ENOMEM; - card->dai_link->cpus = compnent; + card->dai_link->cpus = &compnent[0]; card->dai_link->num_cpus = 1; card->dai_link->codecs = &snd_soc_dummy_dlc; card->dai_link->num_codecs = 1; + card->dai_link->platforms = &compnent[1]; + card->dai_link->num_platforms = 1; card->dai_link->name = card->name; card->dai_link->stream_name = card->name; card->dai_link->cpus->dai_name = dev_name(ad->dssdev); + card->dai_link->platforms->name = dev_name(ad->dssdev); card->num_links = 1; card->dev = dev; -- GitLab From 1be1f3b8487caf1271d9c3bcc03332cd183b35c0 Mon Sep 17 00:00:00 2001 From: Nitesh Shetty Date: Mon, 28 Apr 2025 15:28:48 +0530 Subject: [PATCH 1093/2211] iov_iter: use iov_offset for length calculation in iov_iter_aligned_bvec [ Upstream commit 334d7c4fb60cf21e0abac134d92fe49e9b04377e ] If iov_offset is non-zero, then we need to consider iov_offset in length calculation, otherwise we might pass smaller IOs such as 512 bytes, in below scenario [1]. This issue is reproducible using lib-uring test/fixed-seg.c application with fixed buffer on a 512 LBA formatted device. [1] At present we pass the alignment check, for 512 LBA formatted devices, len_mask = 511 when IO is smaller, i->count = 512 has an offset, i->io_offset = 3584 with bvec values, bvec->bv_offset = 256, bvec->bv_len = 3840. In short, the first 256 bytes are in the current page, next 256 bytes are in the another page. Ideally we expect to fail the IO. I can think of 2 userspace scenarios where we experience this. a: From userspace, we observe a different behaviour when device LBA size is 512 vs 4096 bytes. For 4096 LBA formatted device, I see the same liburing test [2] failing, whereas 512 the test passes without this. This is reproducible everytime. [2] https://github.com/axboe/liburing/ b: Although I was not able to reproduce the below condition, but I suspect below case should be possible from user space for devices with 512 LBA formatted device. Lets say from userspace while allocating a virtually single chunk of memory, if we get 2 physical chunk of memory, and IO happens to be at the boundary of first physical chunk with length crossing first chunk, then we allow IOs to proceed and hence we might map wrong physical address length and proceed with IO rather than failing. : --- a/test/fixed-seg.c : +++ b/test/fixed-seg.c : @@ -64,7 +64,7 @@ static int test(struct io_uring *ring, int fd, int : vec_off) : return T_EXIT_FAIL; : } : : - ret = read_it(ring, fd, 4096, vec_off); : + ret = read_it(ring, fd, 4096, 7*512 + 256); : if (ret) { : fprintf(stderr, "4096 0 failed\n"); : return T_EXIT_FAIL; Effectively this is a write crossing the page boundary. Link: https://lkml.kernel.org/r/20250428095849.11709-1-nj.shetty@samsung.com Fixes: 2263639f96f2 ("iov_iter: streamline iovec/bvec alignment iteration") Reviewed-by: Jens Axboe Reviewed-by: Anuj Gupta Signed-off-by: Nitesh Shetty Cc: Al Viro Cc: Christian Brauner Cc: Keith Busch Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin --- lib/iov_iter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/iov_iter.c b/lib/iov_iter.c index bdb37d572e97c..8ede6be556a96 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -820,7 +820,7 @@ static bool iov_iter_aligned_bvec(const struct iov_iter *i, unsigned addr_mask, size_t size = i->count; do { - size_t len = bvec->bv_len; + size_t len = bvec->bv_len - skip; if (len > size) len = size; -- GitLab From 1d792307191cdfdb6130debbd3ee6981941a6a17 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Sun, 1 Jun 2025 14:02:26 -0400 Subject: [PATCH 1094/2211] path_overmount(): avoid false negatives [ Upstream commit 5f31c549382bcddbbd754c72c5433b19420d485d ] Holding namespace_sem is enough to make sure that result remains valid. It is *not* enough to avoid false negatives from __lookup_mnt(). Mounts can be unhashed outside of namespace_sem (stuck children getting detached on final mntput() of lazy-umounted mount) and having an unrelated mount removed from the hash chain while we traverse it may end up with false negative from __lookup_mnt(). We need to sample and recheck the seqlock component of mount_lock... Bug predates the introduction of path_overmount() - it had come from the code in finish_automount() that got abstracted into that helper. Reviewed-by: Christian Brauner Fixes: 26df6034fdb2 ("fix automount/automount race properly") Fixes: 6ac392815628 ("fs: allow to mount beneath top mount") Signed-off-by: Al Viro Signed-off-by: Sasha Levin --- fs/namespace.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/fs/namespace.c b/fs/namespace.c index c1ac585e41e36..1cb236af29bec 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -3176,18 +3176,25 @@ out: * Check if path is overmounted, i.e., if there's a mount on top of * @path->mnt with @path->dentry as mountpoint. * - * Context: This function expects namespace_lock() to be held. + * Context: namespace_sem must be held at least shared. + * MUST NOT be called under lock_mount_hash() (there one should just + * call __lookup_mnt() and check if it returns NULL). * Return: If path is overmounted true is returned, false if not. */ static inline bool path_overmounted(const struct path *path) { + unsigned seq = read_seqbegin(&mount_lock); + bool no_child; + rcu_read_lock(); - if (unlikely(__lookup_mnt(path->mnt, path->dentry))) { - rcu_read_unlock(); - return true; - } + no_child = !__lookup_mnt(path->mnt, path->dentry); rcu_read_unlock(); - return false; + if (need_seqretry(&mount_lock, seq)) { + read_seqlock_excl(&mount_lock); + no_child = !__lookup_mnt(path->mnt, path->dentry); + read_sequnlock_excl(&mount_lock); + } + return unlikely(!no_child); } /** -- GitLab From e1d02fe5040dbfed99faf4bd01ef9fe87c27d3c5 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Tue, 3 Jun 2025 17:57:27 -0400 Subject: [PATCH 1095/2211] fix propagation graph breakage by MOVE_MOUNT_SET_GROUP move_mount(2) [ Upstream commit d8cc0362f918d020ca1340d7694f07062dc30f36 ] 9ffb14ef61ba "move_mount: allow to add a mount into an existing group" breaks assertions on ->mnt_share/->mnt_slave. For once, the data structures in question are actually documented. Documentation/filesystem/sharedsubtree.rst: All vfsmounts in a peer group have the same ->mnt_master. If it is non-NULL, they form a contiguous (ordered) segment of slave list. do_set_group() puts a mount into the same place in propagation graph as the old one. As the result, if old mount gets events from somewhere and is not a pure event sink, new one needs to be placed next to the old one in the slave list the old one's on. If it is a pure event sink, we only need to make sure the new one doesn't end up in the middle of some peer group. "move_mount: allow to add a mount into an existing group" ends up putting the new one in the beginning of list; that's definitely not going to be in the middle of anything, so that's fine for case when old is not marked shared. In case when old one _is_ marked shared (i.e. is not a pure event sink), that breaks the assumptions of propagation graph iterators. Put the new mount next to the old one on the list - that does the right thing in "old is marked shared" case and is just as correct as the current behaviour if old is not marked shared (kudos to Pavel for pointing that out - my original suggested fix changed behaviour in the "nor marked" case, which complicated things for no good reason). Reviewed-by: Christian Brauner Fixes: 9ffb14ef61ba ("move_mount: allow to add a mount into an existing group") Signed-off-by: Al Viro Signed-off-by: Sasha Levin --- fs/namespace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/namespace.c b/fs/namespace.c index 1cb236af29bec..1022a5af691d6 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -3151,7 +3151,7 @@ static int do_set_group(struct path *from_path, struct path *to_path) if (IS_MNT_SLAVE(from)) { struct mount *m = from->mnt_master; - list_add(&to->mnt_slave, &m->mnt_slave_list); + list_add(&to->mnt_slave, &from->mnt_slave); to->mnt_master = m; } -- GitLab From 9c1ddfeb662b668fff69c5f1cfdd9f5d23d55d23 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Wed, 4 Jun 2025 12:27:08 -0400 Subject: [PATCH 1096/2211] do_change_type(): refuse to operate on unmounted/not ours mounts [ Upstream commit 12f147ddd6de7382dad54812e65f3f08d05809fc ] Ensure that propagation settings can only be changed for mounts located in the caller's mount namespace. This change aligns permission checking with the rest of mount(2). Reviewed-by: Christian Brauner Fixes: 07b20889e305 ("beginning of the shared-subtree proper") Reported-by: "Orlando, Noah" Signed-off-by: Al Viro Signed-off-by: Sasha Levin --- fs/namespace.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/namespace.c b/fs/namespace.c index 1022a5af691d6..843bc6191f30b 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -2714,6 +2714,10 @@ static int do_change_type(struct path *path, int ms_flags) return -EINVAL; namespace_lock(); + if (!check_mnt(mnt)) { + err = -EINVAL; + goto out_unlock; + } if (type == MS_SHARED) { err = invent_group_ids(mnt, recurse); if (err) -- GitLab From 0ce600d7179d45fbbcf8c2ccd8e3ec53be000f7b Mon Sep 17 00:00:00 2001 From: "Gautham R. Shenoy" Date: Thu, 29 May 2025 17:18:25 +0530 Subject: [PATCH 1097/2211] tools/power turbostat: Fix AMD package-energy reporting [ Upstream commit adb49732c8c63665dd3476e8e6b7c67a0f851245 ] commit 05a2f07db888 ("tools/power turbostat: read RAPL counters via perf") that adds support to read RAPL counters via perf defines the notion of a RAPL domain_id which is set to physical_core_id on platforms which support per_core_rapl counters (Eg: AMD processors Family 17h onwards) and is set to the physical_package_id on all the other platforms. However, the physical_core_id is only unique within a package and on platforms with multiple packages more than one core can have the same physical_core_id and thus the same domain_id. (For eg, the first cores of each package have the physical_core_id = 0). This results in all these cores with the same physical_core_id using the same entry in the rapl_counter_info_perdomain[]. Since rapl_perf_init() skips the perf-initialization for cores whose domain_ids have already been visited, cores that have the same physical_core_id always read the perf file corresponding to the physical_core_id of the first package and thus the package-energy is incorrectly reported to be the same value for different packages. Note: This issue only arises when RAPL counters are read via perf and not when they are read via MSRs since in the latter case the MSRs are read separately on each core. Fix this issue by associating each CPU with rapl_core_id which is unique across all the packages in the system. Fixes: 05a2f07db888 ("tools/power turbostat: read RAPL counters via perf") Signed-off-by: Gautham R. Shenoy Signed-off-by: Len Brown Signed-off-by: Sasha Levin --- tools/power/x86/turbostat/turbostat.c | 41 +++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 12424bf08551d..4c322586730d4 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c @@ -4491,6 +4491,38 @@ unsigned long pmt_read_counter(struct pmt_counter *ppmt, unsigned int domain_id) return (value & value_mask) >> value_shift; } + +/* Rapl domain enumeration helpers */ +static inline int get_rapl_num_domains(void) +{ + int num_packages = topo.max_package_id + 1; + int num_cores_per_package; + int num_cores; + + if (!platform->has_per_core_rapl) + return num_packages; + + num_cores_per_package = topo.max_core_id + 1; + num_cores = num_cores_per_package * num_packages; + + return num_cores; +} + +static inline int get_rapl_domain_id(int cpu) +{ + int nr_cores_per_package = topo.max_core_id + 1; + int rapl_core_id; + + if (!platform->has_per_core_rapl) + return cpus[cpu].physical_package_id; + + /* Compute the system-wide unique core-id for @cpu */ + rapl_core_id = cpus[cpu].physical_core_id; + rapl_core_id += cpus[cpu].physical_package_id * nr_cores_per_package; + + return rapl_core_id; +} + /* * get_counters(...) * migrate to cpu @@ -4544,7 +4576,7 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) goto done; if (platform->has_per_core_rapl) { - status = get_rapl_counters(cpu, c->core_id, c, p); + status = get_rapl_counters(cpu, get_rapl_domain_id(cpu), c, p); if (status != 0) return status; } @@ -4610,7 +4642,7 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) p->sys_lpi = cpuidle_cur_sys_lpi_us; if (!platform->has_per_core_rapl) { - status = get_rapl_counters(cpu, p->package_id, c, p); + status = get_rapl_counters(cpu, get_rapl_domain_id(cpu), c, p); if (status != 0) return status; } @@ -7570,7 +7602,7 @@ void linux_perf_init(void) void rapl_perf_init(void) { - const unsigned int num_domains = (platform->has_per_core_rapl ? topo.max_core_id : topo.max_package_id) + 1; + const unsigned int num_domains = get_rapl_num_domains(); bool *domain_visited = calloc(num_domains, sizeof(bool)); rapl_counter_info_perdomain = calloc(num_domains, sizeof(*rapl_counter_info_perdomain)); @@ -7611,8 +7643,7 @@ void rapl_perf_init(void) continue; /* Skip already seen and handled RAPL domains */ - next_domain = - platform->has_per_core_rapl ? cpus[cpu].physical_core_id : cpus[cpu].physical_package_id; + next_domain = get_rapl_domain_id(cpu); assert(next_domain < num_domains); -- GitLab From 8b8b33ae372dc25c38eda48c8fc508fcb69be91d Mon Sep 17 00:00:00 2001 From: Chris Chiu Date: Fri, 21 Mar 2025 18:49:13 +0800 Subject: [PATCH 1098/2211] ALSA: hda/realtek: fix micmute LEDs on HP Laptops with ALC3315 [ Upstream commit 0b1b5161648f35fb96967fb9d80965614657a84e ] More HP laptops with Realtek HDA codec ALC3315 with combined CS35L56 Amplifiers need quirk ALC285_FIXUP_HP_GPIO_LED to fix the micmute LED. Signed-off-by: Chris Chiu Reviewed-by: Simon Trimmer Signed-off-by: Takashi Iwai Link: https://patch.msgid.link/20250321104914.544233-1-chris.chiu@canonical.com Stable-dep-of: f709b78aecab ("ALSA: hda/realtek - Add new HP ZBook laptop with micmute led fixup") Signed-off-by: Sasha Levin --- sound/pci/hda/patch_realtek.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index dce5680912006..3d45c08b32002 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -10770,11 +10770,25 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8d01, "HP ZBook Power 14 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8d84, "HP EliteBook X G1i", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8d85, "HP EliteBook 14 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8d86, "HP Elite X360 14 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8d8c, "HP EliteBook 13 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8d8d, "HP Elite X360 13 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8d8e, "HP EliteBook 14 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8d8f, "HP EliteBook 14 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8d90, "HP EliteBook 16 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8d91, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8d92, "HP ZBook Firefly 16 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8e14, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8e15, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8e16, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8e17, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e18, "HP ZBook Firefly 14 G12A", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e19, "HP ZBook Firefly 14 G12A", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e1a, "HP ZBook Firefly 14 G12A", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8e1b, "HP EliteBook G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8e1c, "HP EliteBook G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8e2c, "HP EliteBook 16 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC), SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), SND_PCI_QUIRK(0x1043, 0x1054, "ASUS G614FH/FM/FP", ALC287_FIXUP_CS35L41_I2C_2), -- GitLab From 95e01b950c09f60a01f1e70ad5fcc9ed23a1a892 Mon Sep 17 00:00:00 2001 From: Chris Chiu Date: Fri, 21 Mar 2025 18:49:14 +0800 Subject: [PATCH 1099/2211] ALSA: hda/realtek: fix micmute LEDs on HP Laptops with ALC3247 [ Upstream commit 78f4ca3c6f6fd305b9af8c51470643617df85e11 ] More HP EliteBook with Realtek HDA codec ALC3247 with combined CS35L56 Amplifiers need quirk ALC236_FIXUP_HP_GPIO_LED to fix the micmute LED. Signed-off-by: Chris Chiu Reviewed-by: Simon Trimmer Signed-off-by: Takashi Iwai Link: https://patch.msgid.link/20250321104914.544233-2-chris.chiu@canonical.com Stable-dep-of: f709b78aecab ("ALSA: hda/realtek - Add new HP ZBook laptop with micmute led fixup") Signed-off-by: Sasha Levin --- sound/pci/hda/patch_realtek.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 3d45c08b32002..b79966086d4b4 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -10779,6 +10779,11 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8d90, "HP EliteBook 16 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8d91, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8d92, "HP ZBook Firefly 16 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8dec, "HP EliteBook 640 G12", ALC236_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8dee, "HP EliteBook 660 G12", ALC236_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8df0, "HP EliteBook 630 G12", ALC236_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8dfc, "HP EliteBook 645 G12", ALC236_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8dfe, "HP EliteBook 665 G12", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e14, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e15, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e16, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), -- GitLab From 410156098b0d597cf3bde160a9a125d28e6f2284 Mon Sep 17 00:00:00 2001 From: Stefan Binding Date: Fri, 21 Mar 2025 23:16:36 +0000 Subject: [PATCH 1100/2211] ALSA: hda/realtek: Add support for various HP Laptops using CS35L41 HDA [ Upstream commit 29951021367f3a6f10e5b7a11c666fc914746f0c ] Add support for HP Cadet, Clipper OmniBook, Turbine OmniBook, Trekker, Enstrom Onmibook, Piston Omnibook Laptops use 2 CS35L41 Amps with HDA, using Internal boost, with I2C Signed-off-by: Stefan Binding Link: https://patch.msgid.link/20250321231717.1232792-1-sbinding@opensource.cirrus.com Signed-off-by: Takashi Iwai Stable-dep-of: f709b78aecab ("ALSA: hda/realtek - Add new HP ZBook laptop with micmute led fixup") Signed-off-by: Sasha Levin --- sound/pci/hda/patch_realtek.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index b79966086d4b4..1a115f7ee89fe 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -10779,11 +10779,23 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8d90, "HP EliteBook 16 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8d91, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8d92, "HP ZBook Firefly 16 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8d9b, "HP 17 Turbine OmniBook 7 UMA", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8d9c, "HP 17 Turbine OmniBook 7 DIS", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8d9d, "HP 17 Turbine OmniBook X UMA", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8d9e, "HP 17 Turbine OmniBook X DIS", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8d9f, "HP 14 Cadet (x360)", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8da0, "HP 16 Clipper OmniBook 7(X360)", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8da1, "HP 16 Clipper OmniBook X", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8da7, "HP 14 Enstrom OmniBook X", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8da8, "HP 16 Piston OmniBook X", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8dec, "HP EliteBook 640 G12", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8dee, "HP EliteBook 660 G12", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8df0, "HP EliteBook 630 G12", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8dfc, "HP EliteBook 645 G12", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8dfe, "HP EliteBook 665 G12", ALC236_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8e11, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8e12, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8e13, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8e14, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e15, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e16, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), @@ -10794,6 +10806,11 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8e1b, "HP EliteBook G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e1c, "HP EliteBook G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e2c, "HP EliteBook 16 G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8e36, "HP 14 Enstrom OmniBook X", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8e37, "HP 16 Piston OmniBook X", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8e60, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8e61, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8e62, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC), SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), SND_PCI_QUIRK(0x1043, 0x1054, "ASUS G614FH/FM/FP", ALC287_FIXUP_CS35L41_I2C_2), -- GitLab From c4cc8f6c31263396872d09f9d47e58963d9a984c Mon Sep 17 00:00:00 2001 From: Kailang Yang Date: Tue, 1 Apr 2025 16:50:08 +0800 Subject: [PATCH 1101/2211] ALSA: hda/realtek - Support mute led function for HP platform [ Upstream commit 22c7f77247a84d27b785ec5b706f673421ab269d ] This patch was integrated CS Amp and support mute led function for HP platform. Signed-off-by: Kailang Yang Link: https://lore.kernel.org/2c960ab58b4d4090ad4ee075f8cfdffd@realtek.com Signed-off-by: Takashi Iwai Stable-dep-of: f709b78aecab ("ALSA: hda/realtek - Add new HP ZBook laptop with micmute led fixup") Signed-off-by: Sasha Levin --- sound/pci/hda/patch_realtek.c | 41 +++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 1a115f7ee89fe..1825295fd38f5 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -7616,6 +7616,24 @@ static void alc245_fixup_hp_spectre_x360_16_aa0xxx(struct hda_codec *codec, alc245_fixup_hp_gpio_led(codec, fix, action); } +static void alc245_fixup_hp_zbook_firefly_g12a(struct hda_codec *codec, + const struct hda_fixup *fix, int action) +{ + struct alc_spec *spec = codec->spec; + static const hda_nid_t conn[] = { 0x02 }; + + switch (action) { + case HDA_FIXUP_ACT_PRE_PROBE: + spec->gen.auto_mute_via_amp = 1; + snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); + break; + } + + cs35l41_fixup_i2c_two(codec, fix, action); + alc245_fixup_hp_mute_led_coefbit(codec, fix, action); + alc285_fixup_hp_coef_micmute_led(codec, fix, action); +} + /* * ALC287 PCM hooks */ @@ -7963,6 +7981,7 @@ enum { ALC256_FIXUP_HEADPHONE_AMP_VOL, ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX, ALC245_FIXUP_HP_SPECTRE_X360_16_AA0XXX, + ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A, ALC285_FIXUP_ASUS_GA403U, ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC, ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1, @@ -10251,6 +10270,10 @@ static const struct hda_fixup alc269_fixups[] = { .type = HDA_FIXUP_FUNC, .v.func = alc245_fixup_hp_spectre_x360_16_aa0xxx, }, + [ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc245_fixup_hp_zbook_firefly_g12a, + }, [ALC285_FIXUP_ASUS_GA403U] = { .type = HDA_FIXUP_FUNC, .v.func = alc285_fixup_asus_ga403u, @@ -10796,15 +10819,15 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8e11, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8e12, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8e13, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2), - SND_PCI_QUIRK(0x103c, 0x8e14, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x8e15, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x8e16, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x8e17, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x8e18, "HP ZBook Firefly 14 G12A", ALC285_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x8e19, "HP ZBook Firefly 14 G12A", ALC285_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x8e1a, "HP ZBook Firefly 14 G12A", ALC285_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x8e1b, "HP EliteBook G12", ALC285_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x8e1c, "HP EliteBook G12", ALC285_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8e14, "HP ZBook Firefly 14 G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A), + SND_PCI_QUIRK(0x103c, 0x8e15, "HP ZBook Firefly 14 G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A), + SND_PCI_QUIRK(0x103c, 0x8e16, "HP ZBook Firefly 14 G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A), + SND_PCI_QUIRK(0x103c, 0x8e17, "HP ZBook Firefly 14 G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A), + SND_PCI_QUIRK(0x103c, 0x8e18, "HP ZBook Firefly 14 G12A", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A), + SND_PCI_QUIRK(0x103c, 0x8e19, "HP ZBook Firefly 14 G12A", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A), + SND_PCI_QUIRK(0x103c, 0x8e1a, "HP ZBook Firefly 14 G12A", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A), + SND_PCI_QUIRK(0x103c, 0x8e1b, "HP EliteBook G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A), + SND_PCI_QUIRK(0x103c, 0x8e1c, "HP EliteBook G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A), SND_PCI_QUIRK(0x103c, 0x8e2c, "HP EliteBook 16 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e36, "HP 14 Enstrom OmniBook X", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8e37, "HP 16 Piston OmniBook X", ALC287_FIXUP_CS35L41_I2C_2), -- GitLab From 0da3314630b994b6470ecd24e0ae908e7a97e5f7 Mon Sep 17 00:00:00 2001 From: Chris Chiu Date: Tue, 20 May 2025 21:21:01 +0800 Subject: [PATCH 1102/2211] ALSA: hda/realtek - Add new HP ZBook laptop with micmute led fixup [ Upstream commit f709b78aecab519dbcefa9a6603b94ad18c553e3 ] New HP ZBook with Realtek HDA codec ALC3247 needs the quirk ALC236_FIXUP_HP_GPIO_LED to fix the micmute LED. Signed-off-by: Chris Chiu Cc: Link: https://patch.msgid.link/20250520132101.120685-1-chris.chiu@canonical.com Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 1825295fd38f5..815160c575618 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -10828,6 +10828,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8e1a, "HP ZBook Firefly 14 G12A", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A), SND_PCI_QUIRK(0x103c, 0x8e1b, "HP EliteBook G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A), SND_PCI_QUIRK(0x103c, 0x8e1c, "HP EliteBook G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A), + SND_PCI_QUIRK(0x103c, 0x8e1d, "HP ZBook X Gli 16 G12", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e2c, "HP EliteBook 16 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e36, "HP 14 Enstrom OmniBook X", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8e37, "HP 16 Piston OmniBook X", ALC287_FIXUP_CS35L41_I2C_2), -- GitLab From 59cb05c80448f77834f36c3a0c36f019d375c02b Mon Sep 17 00:00:00 2001 From: Stefan Binding Date: Tue, 20 May 2025 13:47:43 +0100 Subject: [PATCH 1103/2211] ALSA: hda/realtek: Add support for HP Agusta using CS35L41 HDA [ Upstream commit 7150d57c370f9e61b7d0e82c58002f1c5a205ac4 ] Add support for HP Agusta. Laptops use 2 CS35L41 Amps with HDA, using Internal boost, with I2C Signed-off-by: Stefan Binding Cc: Link: https://patch.msgid.link/20250520124757.12597-1-sbinding@opensource.cirrus.com Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/pci/hda/patch_realtek.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 815160c575618..e714e91c27121 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -10832,6 +10832,8 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8e2c, "HP EliteBook 16 G12", ALC285_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8e36, "HP 14 Enstrom OmniBook X", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8e37, "HP 16 Piston OmniBook X", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8e3a, "HP Agusta", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8e3b, "HP Agusta", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8e60, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8e61, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8e62, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), -- GitLab From eccd1fc1b0e123a9e8455db8fc98b1c69603da8f Mon Sep 17 00:00:00 2001 From: Dmitry Torokhov Date: Mon, 5 May 2025 15:49:59 -0700 Subject: [PATCH 1104/2211] Input: synaptics-rmi - fix crash with unsupported versions of F34 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit ca39500f6af9cfe6823dc5aa8fbaed788d6e35b2 ] Sysfs interface for updating firmware for RMI devices is available even when F34 probe fails. The code checks for presence of F34 "container" pointer and then tries to use the function data attached to the sub-device. F34 assigns the function data early, before it knows if probe will succeed, leaving behind a stale pointer. Fix this by expanding checks to not only test for presence of F34 "container" but also check if there is driver data assigned to the sub-device, and call dev_set_drvdata() only after we are certain that probe is successful. This is not a complete fix, since F34 will be freed during firmware update, so there is still a race when fetching and accessing this pointer. This race will be addressed in follow-up changes. Reported-by: Hanno Böck Fixes: 29fd0ec2bdbe ("Input: synaptics-rmi4 - add support for F34 device reflash") Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/aBlAl6sGulam-Qcx@google.com Signed-off-by: Dmitry Torokhov Signed-off-by: Sasha Levin --- drivers/input/rmi4/rmi_f34.c | 135 ++++++++++++++++++++--------------- 1 file changed, 76 insertions(+), 59 deletions(-) diff --git a/drivers/input/rmi4/rmi_f34.c b/drivers/input/rmi4/rmi_f34.c index e2468bc04a5cb..c2516c7549582 100644 --- a/drivers/input/rmi4/rmi_f34.c +++ b/drivers/input/rmi4/rmi_f34.c @@ -4,6 +4,7 @@ * Copyright (C) 2016 Zodiac Inflight Innovations */ +#include "linux/device.h" #include #include #include @@ -298,39 +299,30 @@ out: return ret; } -static int rmi_f34_status(struct rmi_function *fn) -{ - struct f34_data *f34 = dev_get_drvdata(&fn->dev); - - /* - * The status is the percentage complete, or once complete, - * zero for success or a negative return code. - */ - return f34->update_status; -} - static ssize_t rmi_driver_bootloader_id_show(struct device *dev, struct device_attribute *dattr, char *buf) { struct rmi_driver_data *data = dev_get_drvdata(dev); - struct rmi_function *fn = data->f34_container; + struct rmi_function *fn; struct f34_data *f34; - if (fn) { - f34 = dev_get_drvdata(&fn->dev); - - if (f34->bl_version == 5) - return sysfs_emit(buf, "%c%c\n", - f34->bootloader_id[0], - f34->bootloader_id[1]); - else - return sysfs_emit(buf, "V%d.%d\n", - f34->bootloader_id[1], - f34->bootloader_id[0]); - } + fn = data->f34_container; + if (!fn) + return -ENODEV; - return 0; + f34 = dev_get_drvdata(&fn->dev); + if (!f34) + return -ENODEV; + + if (f34->bl_version == 5) + return sysfs_emit(buf, "%c%c\n", + f34->bootloader_id[0], + f34->bootloader_id[1]); + else + return sysfs_emit(buf, "V%d.%d\n", + f34->bootloader_id[1], + f34->bootloader_id[0]); } static DEVICE_ATTR(bootloader_id, 0444, rmi_driver_bootloader_id_show, NULL); @@ -343,13 +335,16 @@ static ssize_t rmi_driver_configuration_id_show(struct device *dev, struct rmi_function *fn = data->f34_container; struct f34_data *f34; - if (fn) { - f34 = dev_get_drvdata(&fn->dev); + fn = data->f34_container; + if (!fn) + return -ENODEV; - return sysfs_emit(buf, "%s\n", f34->configuration_id); - } + f34 = dev_get_drvdata(&fn->dev); + if (!f34) + return -ENODEV; - return 0; + + return sysfs_emit(buf, "%s\n", f34->configuration_id); } static DEVICE_ATTR(configuration_id, 0444, @@ -365,10 +360,14 @@ static int rmi_firmware_update(struct rmi_driver_data *data, if (!data->f34_container) { dev_warn(dev, "%s: No F34 present!\n", __func__); - return -EINVAL; + return -ENODEV; } f34 = dev_get_drvdata(&data->f34_container->dev); + if (!f34) { + dev_warn(dev, "%s: No valid F34 present!\n", __func__); + return -ENODEV; + } if (f34->bl_version >= 7) { if (data->pdt_props & HAS_BSR) { @@ -494,10 +493,18 @@ static ssize_t rmi_driver_update_fw_status_show(struct device *dev, char *buf) { struct rmi_driver_data *data = dev_get_drvdata(dev); - int update_status = 0; + struct f34_data *f34; + int update_status = -ENODEV; - if (data->f34_container) - update_status = rmi_f34_status(data->f34_container); + /* + * The status is the percentage complete, or once complete, + * zero for success or a negative return code. + */ + if (data->f34_container) { + f34 = dev_get_drvdata(&data->f34_container->dev); + if (f34) + update_status = f34->update_status; + } return sysfs_emit(buf, "%d\n", update_status); } @@ -517,33 +524,21 @@ static const struct attribute_group rmi_firmware_attr_group = { .attrs = rmi_firmware_attrs, }; -static int rmi_f34_probe(struct rmi_function *fn) +static int rmi_f34v5_probe(struct f34_data *f34) { - struct f34_data *f34; - unsigned char f34_queries[9]; + struct rmi_function *fn = f34->fn; + u8 f34_queries[9]; bool has_config_id; - u8 version = fn->fd.function_version; - int ret; - - f34 = devm_kzalloc(&fn->dev, sizeof(struct f34_data), GFP_KERNEL); - if (!f34) - return -ENOMEM; - - f34->fn = fn; - dev_set_drvdata(&fn->dev, f34); - - /* v5 code only supported version 0, try V7 probe */ - if (version > 0) - return rmi_f34v7_probe(f34); + int error; f34->bl_version = 5; - ret = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, - f34_queries, sizeof(f34_queries)); - if (ret) { + error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, + f34_queries, sizeof(f34_queries)); + if (error) { dev_err(&fn->dev, "%s: Failed to query properties\n", __func__); - return ret; + return error; } snprintf(f34->bootloader_id, sizeof(f34->bootloader_id), @@ -569,11 +564,11 @@ static int rmi_f34_probe(struct rmi_function *fn) f34->v5.config_blocks); if (has_config_id) { - ret = rmi_read_block(fn->rmi_dev, fn->fd.control_base_addr, - f34_queries, sizeof(f34_queries)); - if (ret) { + error = rmi_read_block(fn->rmi_dev, fn->fd.control_base_addr, + f34_queries, sizeof(f34_queries)); + if (error) { dev_err(&fn->dev, "Failed to read F34 config ID\n"); - return ret; + return error; } snprintf(f34->configuration_id, sizeof(f34->configuration_id), @@ -582,12 +577,34 @@ static int rmi_f34_probe(struct rmi_function *fn) f34_queries[2], f34_queries[3]); rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Configuration ID: %s\n", - f34->configuration_id); + f34->configuration_id); } return 0; } +static int rmi_f34_probe(struct rmi_function *fn) +{ + struct f34_data *f34; + u8 version = fn->fd.function_version; + int error; + + f34 = devm_kzalloc(&fn->dev, sizeof(struct f34_data), GFP_KERNEL); + if (!f34) + return -ENOMEM; + + f34->fn = fn; + + /* v5 code only supported version 0 */ + error = version == 0 ? rmi_f34v5_probe(f34) : rmi_f34v7_probe(f34); + if (error) + return error; + + dev_set_drvdata(&fn->dev, f34); + + return 0; +} + int rmi_f34_create_sysfs(struct rmi_device *rmi_dev) { return sysfs_create_group(&rmi_dev->dev.kobj, &rmi_firmware_attr_group); -- GitLab From 80f7c5be4fe5031d89b0e324758c52eb1d5553fa Mon Sep 17 00:00:00 2001 From: Ulf Hansson Date: Wed, 5 Feb 2025 14:15:52 +0800 Subject: [PATCH 1105/2211] pmdomain: core: Introduce dev_pm_genpd_rpm_always_on() [ Upstream commit cd3fa304ba5c93ce57b9b55b3cd893af2be96527 ] For some usecases a consumer driver requires its device to remain power-on from the PM domain perspective during runtime. Using dev PM qos along with the genpd governors, doesn't work for this case as would potentially prevent the device from being runtime suspended too. To support these usecases, let's introduce dev_pm_genpd_rpm_always_on() to allow consumers drivers to dynamically control the behaviour in genpd for a device that is attached to it. Signed-off-by: Ulf Hansson Signed-off-by: Shawn Lin Acked-by: Manivannan Sadhasivam Link: https://lore.kernel.org/r/1738736156-119203-4-git-send-email-shawn.lin@rock-chips.com Signed-off-by: Ulf Hansson Stable-dep-of: 08f959759e1e ("mmc: sdhci-of-dwcmshc: add PD workaround on RK3576") Signed-off-by: Sasha Levin --- drivers/pmdomain/core.c | 35 +++++++++++++++++++++++++++++++++++ include/linux/pm_domain.h | 7 +++++++ 2 files changed, 42 insertions(+) diff --git a/drivers/pmdomain/core.c b/drivers/pmdomain/core.c index 05913e9fe0821..8b1f894f5e790 100644 --- a/drivers/pmdomain/core.c +++ b/drivers/pmdomain/core.c @@ -697,6 +697,37 @@ bool dev_pm_genpd_get_hwmode(struct device *dev) } EXPORT_SYMBOL_GPL(dev_pm_genpd_get_hwmode); +/** + * dev_pm_genpd_rpm_always_on() - Control if the PM domain can be powered off. + * + * @dev: Device for which the PM domain may need to stay on for. + * @on: Value to set or unset for the condition. + * + * For some usecases a consumer driver requires its device to remain power-on + * from the PM domain perspective during runtime. This function allows the + * behaviour to be dynamically controlled for a device attached to a genpd. + * + * It is assumed that the users guarantee that the genpd wouldn't be detached + * while this routine is getting called. + * + * Return: Returns 0 on success and negative error values on failures. + */ +int dev_pm_genpd_rpm_always_on(struct device *dev, bool on) +{ + struct generic_pm_domain *genpd; + + genpd = dev_to_genpd_safe(dev); + if (!genpd) + return -ENODEV; + + genpd_lock(genpd); + dev_gpd_data(dev)->rpm_always_on = on; + genpd_unlock(genpd); + + return 0; +} +EXPORT_SYMBOL_GPL(dev_pm_genpd_rpm_always_on); + static int _genpd_power_on(struct generic_pm_domain *genpd, bool timed) { unsigned int state_idx = genpd->state_idx; @@ -868,6 +899,10 @@ static int genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on, if (!pm_runtime_suspended(pdd->dev) || irq_safe_dev_in_sleep_domain(pdd->dev, genpd)) not_suspended++; + + /* The device may need its PM domain to stay powered on. */ + if (to_gpd_data(pdd)->rpm_always_on) + return -EBUSY; } if (not_suspended > 1 || (not_suspended == 1 && !one_dev_on)) diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h index cf4b11be37097..c6716f474ba45 100644 --- a/include/linux/pm_domain.h +++ b/include/linux/pm_domain.h @@ -251,6 +251,7 @@ struct generic_pm_domain_data { unsigned int default_pstate; unsigned int rpm_pstate; bool hw_mode; + bool rpm_always_on; void *data; }; @@ -283,6 +284,7 @@ ktime_t dev_pm_genpd_get_next_hrtimer(struct device *dev); void dev_pm_genpd_synced_poweroff(struct device *dev); int dev_pm_genpd_set_hwmode(struct device *dev, bool enable); bool dev_pm_genpd_get_hwmode(struct device *dev); +int dev_pm_genpd_rpm_always_on(struct device *dev, bool on); extern struct dev_power_governor simple_qos_governor; extern struct dev_power_governor pm_domain_always_on_gov; @@ -366,6 +368,11 @@ static inline bool dev_pm_genpd_get_hwmode(struct device *dev) return false; } +static inline int dev_pm_genpd_rpm_always_on(struct device *dev, bool on) +{ + return -EOPNOTSUPP; +} + #define simple_qos_governor (*(struct dev_power_governor *)(NULL)) #define pm_domain_always_on_gov (*(struct dev_power_governor *)(NULL)) #endif -- GitLab From b8de1a502971aeef1c5be905544d2ce2d76acaf1 Mon Sep 17 00:00:00 2001 From: Nicolas Frattaroli Date: Wed, 23 Apr 2025 09:53:32 +0200 Subject: [PATCH 1106/2211] mmc: sdhci-of-dwcmshc: add PD workaround on RK3576 [ Upstream commit 08f959759e1e6e9c4b898c51a7d387ac3480630b ] RK3576's power domains have a peculiar design where the PD_NVM power domain, of which the sdhci controller is a part, seemingly does not have idempotent runtime disable/enable. The end effect is that if PD_NVM gets turned off by the generic power domain logic because all the devices depending on it are suspended, then the next time the sdhci device is unsuspended, it'll hang the SoC as soon as it tries accessing the CQHCI registers. RK3576's UFS support needed a new dev_pm_genpd_rpm_always_on function added to the generic power domains API to handle what appears to be a similar hardware design. Use this new function to ask for the same treatment in the sdhci controller by giving rk3576 its own platform data with its own postinit function. The benefit of doing this instead of marking the power domains always on in the power domain core is that we only do this if we know the platform we're running on actually uses the sdhci controller. For others, keeping PD_NVM always on would be a waste, as they won't run into this specific issue. The only other IP in PD_NVM that could be affected is FSPI0. If it gets a mainline driver, it will probably want to do the same thing. Acked-by: Adrian Hunter Signed-off-by: Nicolas Frattaroli Reviewed-by: Shawn Lin Fixes: cfee1b507758 ("pmdomain: rockchip: Add support for RK3576 SoC") Cc: # v6.15+ Link: https://lore.kernel.org/r/20250423-rk3576-emmc-fix-v3-1-0bf80e29967f@collabora.com Signed-off-by: Ulf Hansson Signed-off-by: Sasha Levin --- drivers/mmc/host/sdhci-of-dwcmshc.c | 40 +++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c index 8fd80dac11bfd..bf29aad082a19 100644 --- a/drivers/mmc/host/sdhci-of-dwcmshc.c +++ b/drivers/mmc/host/sdhci-of-dwcmshc.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -787,6 +788,29 @@ static void dwcmshc_rk35xx_postinit(struct sdhci_host *host, struct dwcmshc_priv } } +static void dwcmshc_rk3576_postinit(struct sdhci_host *host, struct dwcmshc_priv *dwc_priv) +{ + struct device *dev = mmc_dev(host->mmc); + int ret; + + /* + * This works around the design of the RK3576's power domains, which + * makes the PD_NVM power domain, which the sdhci controller on the + * RK3576 is in, never come back the same way once it's run-time + * suspended once. This can happen during early kernel boot if no driver + * is using either PD_NVM or its child power domain PD_SDGMAC for a + * short moment, leading to it being turned off to save power. By + * keeping it on, sdhci suspending won't lead to PD_NVM becoming a + * candidate for getting turned off. + */ + ret = dev_pm_genpd_rpm_always_on(dev, true); + if (ret && ret != -EOPNOTSUPP) + dev_warn(dev, "failed to set PD rpm always on, SoC may hang later: %pe\n", + ERR_PTR(ret)); + + dwcmshc_rk35xx_postinit(host, dwc_priv); +} + static int th1520_execute_tuning(struct sdhci_host *host, u32 opcode) { struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); @@ -1218,6 +1242,18 @@ static const struct dwcmshc_pltfm_data sdhci_dwcmshc_rk35xx_pdata = { .postinit = dwcmshc_rk35xx_postinit, }; +static const struct dwcmshc_pltfm_data sdhci_dwcmshc_rk3576_pdata = { + .pdata = { + .ops = &sdhci_dwcmshc_rk35xx_ops, + .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN | + SDHCI_QUIRK_BROKEN_TIMEOUT_VAL, + .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN | + SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN, + }, + .init = dwcmshc_rk35xx_init, + .postinit = dwcmshc_rk3576_postinit, +}; + static const struct dwcmshc_pltfm_data sdhci_dwcmshc_th1520_pdata = { .pdata = { .ops = &sdhci_dwcmshc_th1520_ops, @@ -1316,6 +1352,10 @@ static const struct of_device_id sdhci_dwcmshc_dt_ids[] = { .compatible = "rockchip,rk3588-dwcmshc", .data = &sdhci_dwcmshc_rk35xx_pdata, }, + { + .compatible = "rockchip,rk3576-dwcmshc", + .data = &sdhci_dwcmshc_rk3576_pdata, + }, { .compatible = "rockchip,rk3568-dwcmshc", .data = &sdhci_dwcmshc_rk35xx_pdata, -- GitLab From 9cd06b2ebeb4415f944327f821f9f571aa900a3d Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Wed, 19 Feb 2025 12:36:19 +0100 Subject: [PATCH 1107/2211] arm64: dts: qcom: x1e80100: Apply consistent critical thermal shutdown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 03f2b8eed73418269a158ccebad5d8d8f2f6daa1 ] The firmware configures the TSENS controller with a maximum temperature of 120°C. When reaching that temperature, the hardware automatically triggers a reset of the entire platform. Some of the thermal zones in x1e80100.dtsi use a critical trip point of 125°C. It's impossible to reach those. It's preferable to shut down the system cleanly before reaching the hardware trip point. Make the critical temperature trip points consistent by setting all of them to 115°C and apply a consistent hysteresis. The ACPI tables also specify 115°C as critical shutdown temperature. Cc: stable@vger.kernel.org Fixes: 4e915987ff5b ("arm64: dts: qcom: x1e80100: Enable tsens and thermal zone nodes") Signed-off-by: Stephan Gerhold Reviewed-by: Johan Hovold Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250219-x1e80100-thermal-fixes-v1-2-d110e44ac3f9@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/x1e80100.dtsi | 128 ++++++++++++------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/x1e80100.dtsi b/arch/arm64/boot/dts/qcom/x1e80100.dtsi index 948ce7dd8b058..edfea03366b46 100644 --- a/arch/arm64/boot/dts/qcom/x1e80100.dtsi +++ b/arch/arm64/boot/dts/qcom/x1e80100.dtsi @@ -6414,8 +6414,8 @@ }; aoss0-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -6440,7 +6440,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6466,7 +6466,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6492,7 +6492,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6518,7 +6518,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6544,7 +6544,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6570,7 +6570,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6596,7 +6596,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6622,7 +6622,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6640,8 +6640,8 @@ }; cpuss2-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -6658,8 +6658,8 @@ }; cpuss2-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -6676,7 +6676,7 @@ }; mem-critical { - temperature = <125000>; + temperature = <115000>; hysteresis = <0>; type = "critical"; }; @@ -6694,7 +6694,7 @@ }; video-critical { - temperature = <125000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6712,8 +6712,8 @@ }; aoss0-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -6738,7 +6738,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6764,7 +6764,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6790,7 +6790,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6816,7 +6816,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6842,7 +6842,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6868,7 +6868,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6894,7 +6894,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6920,7 +6920,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -6938,8 +6938,8 @@ }; cpuss2-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -6956,8 +6956,8 @@ }; cpuss2-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -6974,8 +6974,8 @@ }; aoss0-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -7000,7 +7000,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7026,7 +7026,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7052,7 +7052,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7078,7 +7078,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7104,7 +7104,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7130,7 +7130,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7156,7 +7156,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7182,7 +7182,7 @@ }; cpu-critical { - temperature = <110000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7200,8 +7200,8 @@ }; cpuss2-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -7218,8 +7218,8 @@ }; cpuss2-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -7236,8 +7236,8 @@ }; aoss0-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -7254,8 +7254,8 @@ }; nsp0-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -7272,8 +7272,8 @@ }; nsp1-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -7290,8 +7290,8 @@ }; nsp2-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -7308,8 +7308,8 @@ }; nsp3-critical { - temperature = <125000>; - hysteresis = <0>; + temperature = <115000>; + hysteresis = <1000>; type = "critical"; }; }; @@ -7334,7 +7334,7 @@ }; trip-point2 { - temperature = <125000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7360,7 +7360,7 @@ }; trip-point2 { - temperature = <125000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7386,7 +7386,7 @@ }; trip-point2 { - temperature = <125000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7412,7 +7412,7 @@ }; trip-point2 { - temperature = <125000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7438,7 +7438,7 @@ }; trip-point2 { - temperature = <125000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7464,7 +7464,7 @@ }; trip-point2 { - temperature = <125000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7490,7 +7490,7 @@ }; trip-point2 { - temperature = <125000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7516,7 +7516,7 @@ }; trip-point2 { - temperature = <125000>; + temperature = <115000>; hysteresis = <1000>; type = "critical"; }; @@ -7535,7 +7535,7 @@ camera0-critical { temperature = <115000>; - hysteresis = <0>; + hysteresis = <1000>; type = "critical"; }; }; @@ -7553,7 +7553,7 @@ camera0-critical { temperature = <115000>; - hysteresis = <0>; + hysteresis = <1000>; type = "critical"; }; }; -- GitLab From cd9d354bdd28b20a8f3170dab3bc0f096e66d6b4 Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Wed, 19 Feb 2025 12:36:20 +0100 Subject: [PATCH 1108/2211] arm64: dts: qcom: x1e80100: Add GPU cooling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 5ba21fa11f473c9827f378ace8c9f983de9e0287 ] Unlike the CPU, the GPU does not throttle its speed automatically when it reaches high temperatures. With certain high GPU loads it is possible to reach the critical hardware shutdown temperature of 120°C, endangering the hardware and making it impossible to run certain applications. Set up GPU cooling similar to the ACPI tables, by throttling the GPU speed when reaching 95°C and polling every 200ms. Cc: stable@vger.kernel.org Fixes: 721e38301b79 ("arm64: dts: qcom: x1e80100: Add gpu support") Signed-off-by: Stephan Gerhold Reviewed-by: Johan Hovold Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250219-x1e80100-thermal-fixes-v1-3-d110e44ac3f9@linaro.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/x1e80100.dtsi | 169 +++++++++++++------------ 1 file changed, 89 insertions(+), 80 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/x1e80100.dtsi b/arch/arm64/boot/dts/qcom/x1e80100.dtsi index edfea03366b46..5082ecb32089b 100644 --- a/arch/arm64/boot/dts/qcom/x1e80100.dtsi +++ b/arch/arm64/boot/dts/qcom/x1e80100.dtsi @@ -20,6 +20,7 @@ #include #include #include +#include / { interrupt-parent = <&intc>; @@ -7316,24 +7317,25 @@ }; gpuss-0-thermal { - polling-delay-passive = <10>; + polling-delay-passive = <200>; thermal-sensors = <&tsens3 5>; - trips { - trip-point0 { - temperature = <85000>; - hysteresis = <1000>; - type = "passive"; + cooling-maps { + map0 { + trip = <&gpuss0_alert0>; + cooling-device = <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; }; + }; - trip-point1 { - temperature = <90000>; + trips { + gpuss0_alert0: trip-point0 { + temperature = <95000>; hysteresis = <1000>; - type = "hot"; + type = "passive"; }; - trip-point2 { + gpu-critical { temperature = <115000>; hysteresis = <1000>; type = "critical"; @@ -7342,24 +7344,25 @@ }; gpuss-1-thermal { - polling-delay-passive = <10>; + polling-delay-passive = <200>; thermal-sensors = <&tsens3 6>; - trips { - trip-point0 { - temperature = <85000>; - hysteresis = <1000>; - type = "passive"; + cooling-maps { + map0 { + trip = <&gpuss1_alert0>; + cooling-device = <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; }; + }; - trip-point1 { - temperature = <90000>; + trips { + gpuss1_alert0: trip-point0 { + temperature = <95000>; hysteresis = <1000>; - type = "hot"; + type = "passive"; }; - trip-point2 { + gpu-critical { temperature = <115000>; hysteresis = <1000>; type = "critical"; @@ -7368,24 +7371,25 @@ }; gpuss-2-thermal { - polling-delay-passive = <10>; + polling-delay-passive = <200>; thermal-sensors = <&tsens3 7>; - trips { - trip-point0 { - temperature = <85000>; - hysteresis = <1000>; - type = "passive"; + cooling-maps { + map0 { + trip = <&gpuss2_alert0>; + cooling-device = <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; }; + }; - trip-point1 { - temperature = <90000>; + trips { + gpuss2_alert0: trip-point0 { + temperature = <95000>; hysteresis = <1000>; - type = "hot"; + type = "passive"; }; - trip-point2 { + gpu-critical { temperature = <115000>; hysteresis = <1000>; type = "critical"; @@ -7394,24 +7398,25 @@ }; gpuss-3-thermal { - polling-delay-passive = <10>; + polling-delay-passive = <200>; thermal-sensors = <&tsens3 8>; - trips { - trip-point0 { - temperature = <85000>; - hysteresis = <1000>; - type = "passive"; + cooling-maps { + map0 { + trip = <&gpuss3_alert0>; + cooling-device = <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; }; + }; - trip-point1 { - temperature = <90000>; + trips { + gpuss3_alert0: trip-point0 { + temperature = <95000>; hysteresis = <1000>; - type = "hot"; + type = "passive"; }; - trip-point2 { + gpu-critical { temperature = <115000>; hysteresis = <1000>; type = "critical"; @@ -7420,24 +7425,25 @@ }; gpuss-4-thermal { - polling-delay-passive = <10>; + polling-delay-passive = <200>; thermal-sensors = <&tsens3 9>; - trips { - trip-point0 { - temperature = <85000>; - hysteresis = <1000>; - type = "passive"; + cooling-maps { + map0 { + trip = <&gpuss4_alert0>; + cooling-device = <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; }; + }; - trip-point1 { - temperature = <90000>; + trips { + gpuss4_alert0: trip-point0 { + temperature = <95000>; hysteresis = <1000>; - type = "hot"; + type = "passive"; }; - trip-point2 { + gpu-critical { temperature = <115000>; hysteresis = <1000>; type = "critical"; @@ -7446,24 +7452,25 @@ }; gpuss-5-thermal { - polling-delay-passive = <10>; + polling-delay-passive = <200>; thermal-sensors = <&tsens3 10>; - trips { - trip-point0 { - temperature = <85000>; - hysteresis = <1000>; - type = "passive"; + cooling-maps { + map0 { + trip = <&gpuss5_alert0>; + cooling-device = <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; }; + }; - trip-point1 { - temperature = <90000>; + trips { + gpuss5_alert0: trip-point0 { + temperature = <95000>; hysteresis = <1000>; - type = "hot"; + type = "passive"; }; - trip-point2 { + gpu-critical { temperature = <115000>; hysteresis = <1000>; type = "critical"; @@ -7472,24 +7479,25 @@ }; gpuss-6-thermal { - polling-delay-passive = <10>; + polling-delay-passive = <200>; thermal-sensors = <&tsens3 11>; - trips { - trip-point0 { - temperature = <85000>; - hysteresis = <1000>; - type = "passive"; + cooling-maps { + map0 { + trip = <&gpuss6_alert0>; + cooling-device = <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; }; + }; - trip-point1 { - temperature = <90000>; + trips { + gpuss6_alert0: trip-point0 { + temperature = <95000>; hysteresis = <1000>; - type = "hot"; + type = "passive"; }; - trip-point2 { + gpu-critical { temperature = <115000>; hysteresis = <1000>; type = "critical"; @@ -7498,24 +7506,25 @@ }; gpuss-7-thermal { - polling-delay-passive = <10>; + polling-delay-passive = <200>; thermal-sensors = <&tsens3 12>; - trips { - trip-point0 { - temperature = <85000>; - hysteresis = <1000>; - type = "passive"; + cooling-maps { + map0 { + trip = <&gpuss7_alert0>; + cooling-device = <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; }; + }; - trip-point1 { - temperature = <90000>; + trips { + gpuss7_alert0: trip-point0 { + temperature = <95000>; hysteresis = <1000>; - type = "hot"; + type = "passive"; }; - trip-point2 { + gpu-critical { temperature = <115000>; hysteresis = <1000>; type = "critical"; -- GitLab From d5d5193dde41d9ca1c427440e1988b73547c2bc8 Mon Sep 17 00:00:00 2001 From: Peter Griffin Date: Wed, 2 Apr 2025 16:17:30 +0100 Subject: [PATCH 1109/2211] pinctrl: samsung: refactor drvdata suspend & resume callbacks [ Upstream commit 3ade961e97f3b05dcdd9a4fabfe179c9e75571e0 ] This enables the clk_enable() and clk_disable() logic to be removed from each callback, but otherwise should have no functional impact. It is a prepatory patch so that the callbacks can become SoC specific. Signed-off-by: Peter Griffin Link: https://lore.kernel.org/r/20250402-pinctrl-fltcon-suspend-v6-1-78ce0d4eb30c@linaro.org Signed-off-by: Krzysztof Kozlowski Stable-dep-of: bdbe0a0f7100 ("pinctrl: samsung: add gs101 specific eint suspend/resume callbacks") Signed-off-by: Sasha Levin --- drivers/pinctrl/samsung/pinctrl-exynos.c | 89 ++++++----------------- drivers/pinctrl/samsung/pinctrl-exynos.h | 4 +- drivers/pinctrl/samsung/pinctrl-samsung.c | 21 ++++-- drivers/pinctrl/samsung/pinctrl-samsung.h | 8 +- 4 files changed, 42 insertions(+), 80 deletions(-) diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c index ac6dc22b37c98..62c8d8d907545 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos.c @@ -761,19 +761,11 @@ __init int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d) return 0; } -static void exynos_pinctrl_suspend_bank( - struct samsung_pinctrl_drv_data *drvdata, - struct samsung_pin_bank *bank) +static void exynos_pinctrl_suspend_bank(struct samsung_pin_bank *bank) { struct exynos_eint_gpio_save *save = bank->soc_priv; const void __iomem *regs = bank->eint_base; - if (clk_enable(bank->drvdata->pclk)) { - dev_err(bank->gpio_chip.parent, - "unable to enable clock for saving state\n"); - return; - } - save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET + bank->eint_offset); save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET @@ -783,71 +775,46 @@ static void exynos_pinctrl_suspend_bank( save->eint_mask = readl(regs + bank->irq_chip->eint_mask + bank->eint_offset); - clk_disable(bank->drvdata->pclk); - pr_debug("%s: save con %#010x\n", bank->name, save->eint_con); pr_debug("%s: save fltcon0 %#010x\n", bank->name, save->eint_fltcon0); pr_debug("%s: save fltcon1 %#010x\n", bank->name, save->eint_fltcon1); pr_debug("%s: save mask %#010x\n", bank->name, save->eint_mask); } -static void exynosauto_pinctrl_suspend_bank(struct samsung_pinctrl_drv_data *drvdata, - struct samsung_pin_bank *bank) +static void exynosauto_pinctrl_suspend_bank(struct samsung_pin_bank *bank) { struct exynos_eint_gpio_save *save = bank->soc_priv; const void __iomem *regs = bank->eint_base; - if (clk_enable(bank->drvdata->pclk)) { - dev_err(bank->gpio_chip.parent, - "unable to enable clock for saving state\n"); - return; - } - save->eint_con = readl(regs + bank->pctl_offset + bank->eint_con_offset); save->eint_mask = readl(regs + bank->pctl_offset + bank->eint_mask_offset); - clk_disable(bank->drvdata->pclk); - pr_debug("%s: save con %#010x\n", bank->name, save->eint_con); pr_debug("%s: save mask %#010x\n", bank->name, save->eint_mask); } -void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata) +void exynos_pinctrl_suspend(struct samsung_pin_bank *bank) { - struct samsung_pin_bank *bank = drvdata->pin_banks; struct exynos_irq_chip *irq_chip = NULL; - int i; - for (i = 0; i < drvdata->nr_banks; ++i, ++bank) { - if (bank->eint_type == EINT_TYPE_GPIO) { - if (bank->eint_con_offset) - exynosauto_pinctrl_suspend_bank(drvdata, bank); - else - exynos_pinctrl_suspend_bank(drvdata, bank); - } - else if (bank->eint_type == EINT_TYPE_WKUP) { - if (!irq_chip) { - irq_chip = bank->irq_chip; - irq_chip->set_eint_wakeup_mask(drvdata, - irq_chip); - } + if (bank->eint_type == EINT_TYPE_GPIO) { + if (bank->eint_con_offset) + exynosauto_pinctrl_suspend_bank(bank); + else + exynos_pinctrl_suspend_bank(bank); + } else if (bank->eint_type == EINT_TYPE_WKUP) { + if (!irq_chip) { + irq_chip = bank->irq_chip; + irq_chip->set_eint_wakeup_mask(bank->drvdata, irq_chip); } } } -static void exynos_pinctrl_resume_bank( - struct samsung_pinctrl_drv_data *drvdata, - struct samsung_pin_bank *bank) +static void exynos_pinctrl_resume_bank(struct samsung_pin_bank *bank) { struct exynos_eint_gpio_save *save = bank->soc_priv; void __iomem *regs = bank->eint_base; - if (clk_enable(bank->drvdata->pclk)) { - dev_err(bank->gpio_chip.parent, - "unable to enable clock for restoring state\n"); - return; - } - pr_debug("%s: con %#010x => %#010x\n", bank->name, readl(regs + EXYNOS_GPIO_ECON_OFFSET + bank->eint_offset), save->eint_con); @@ -869,22 +836,13 @@ static void exynos_pinctrl_resume_bank( + 2 * bank->eint_offset + 4); writel(save->eint_mask, regs + bank->irq_chip->eint_mask + bank->eint_offset); - - clk_disable(bank->drvdata->pclk); } -static void exynosauto_pinctrl_resume_bank(struct samsung_pinctrl_drv_data *drvdata, - struct samsung_pin_bank *bank) +static void exynosauto_pinctrl_resume_bank(struct samsung_pin_bank *bank) { struct exynos_eint_gpio_save *save = bank->soc_priv; void __iomem *regs = bank->eint_base; - if (clk_enable(bank->drvdata->pclk)) { - dev_err(bank->gpio_chip.parent, - "unable to enable clock for restoring state\n"); - return; - } - pr_debug("%s: con %#010x => %#010x\n", bank->name, readl(regs + bank->pctl_offset + bank->eint_con_offset), save->eint_con); pr_debug("%s: mask %#010x => %#010x\n", bank->name, @@ -893,21 +851,16 @@ static void exynosauto_pinctrl_resume_bank(struct samsung_pinctrl_drv_data *drvd writel(save->eint_con, regs + bank->pctl_offset + bank->eint_con_offset); writel(save->eint_mask, regs + bank->pctl_offset + bank->eint_mask_offset); - clk_disable(bank->drvdata->pclk); } -void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata) +void exynos_pinctrl_resume(struct samsung_pin_bank *bank) { - struct samsung_pin_bank *bank = drvdata->pin_banks; - int i; - - for (i = 0; i < drvdata->nr_banks; ++i, ++bank) - if (bank->eint_type == EINT_TYPE_GPIO) { - if (bank->eint_con_offset) - exynosauto_pinctrl_resume_bank(drvdata, bank); - else - exynos_pinctrl_resume_bank(drvdata, bank); - } + if (bank->eint_type == EINT_TYPE_GPIO) { + if (bank->eint_con_offset) + exynosauto_pinctrl_resume_bank(bank); + else + exynos_pinctrl_resume_bank(bank); + } } static void exynos_retention_enable(struct samsung_pinctrl_drv_data *drvdata) diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.h b/drivers/pinctrl/samsung/pinctrl-exynos.h index 97a43fa4dfc56..ce39ab52102e7 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos.h +++ b/drivers/pinctrl/samsung/pinctrl-exynos.h @@ -211,8 +211,8 @@ struct exynos_muxed_weint_data { int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d); int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d); -void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata); -void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata); +void exynos_pinctrl_suspend(struct samsung_pin_bank *bank); +void exynos_pinctrl_resume(struct samsung_pin_bank *bank); struct samsung_retention_ctrl * exynos_retention_init(struct samsung_pinctrl_drv_data *drvdata, const struct samsung_retention_data *data); diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c index 63ac89a802d30..210534586c0c0 100644 --- a/drivers/pinctrl/samsung/pinctrl-samsung.c +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c @@ -1333,6 +1333,7 @@ err_put_banks: static int __maybe_unused samsung_pinctrl_suspend(struct device *dev) { struct samsung_pinctrl_drv_data *drvdata = dev_get_drvdata(dev); + struct samsung_pin_bank *bank; int i; i = clk_enable(drvdata->pclk); @@ -1343,7 +1344,7 @@ static int __maybe_unused samsung_pinctrl_suspend(struct device *dev) } for (i = 0; i < drvdata->nr_banks; i++) { - struct samsung_pin_bank *bank = &drvdata->pin_banks[i]; + bank = &drvdata->pin_banks[i]; const void __iomem *reg = bank->pctl_base + bank->pctl_offset; const u8 *offs = bank->type->reg_offset; const u8 *widths = bank->type->fld_width; @@ -1371,10 +1372,14 @@ static int __maybe_unused samsung_pinctrl_suspend(struct device *dev) } } + for (i = 0; i < drvdata->nr_banks; i++) { + bank = &drvdata->pin_banks[i]; + if (drvdata->suspend) + drvdata->suspend(bank); + } + clk_disable(drvdata->pclk); - if (drvdata->suspend) - drvdata->suspend(drvdata); if (drvdata->retention_ctrl && drvdata->retention_ctrl->enable) drvdata->retention_ctrl->enable(drvdata); @@ -1392,6 +1397,7 @@ static int __maybe_unused samsung_pinctrl_suspend(struct device *dev) static int __maybe_unused samsung_pinctrl_resume(struct device *dev) { struct samsung_pinctrl_drv_data *drvdata = dev_get_drvdata(dev); + struct samsung_pin_bank *bank; int ret; int i; @@ -1406,11 +1412,14 @@ static int __maybe_unused samsung_pinctrl_resume(struct device *dev) return ret; } - if (drvdata->resume) - drvdata->resume(drvdata); + for (i = 0; i < drvdata->nr_banks; i++) { + bank = &drvdata->pin_banks[i]; + if (drvdata->resume) + drvdata->resume(bank); + } for (i = 0; i < drvdata->nr_banks; i++) { - struct samsung_pin_bank *bank = &drvdata->pin_banks[i]; + bank = &drvdata->pin_banks[i]; void __iomem *reg = bank->pctl_base + bank->pctl_offset; const u8 *offs = bank->type->reg_offset; const u8 *widths = bank->type->fld_width; diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.h b/drivers/pinctrl/samsung/pinctrl-samsung.h index 14c3b6b965851..7ffd2e193e425 100644 --- a/drivers/pinctrl/samsung/pinctrl-samsung.h +++ b/drivers/pinctrl/samsung/pinctrl-samsung.h @@ -285,8 +285,8 @@ struct samsung_pin_ctrl { int (*eint_gpio_init)(struct samsung_pinctrl_drv_data *); int (*eint_wkup_init)(struct samsung_pinctrl_drv_data *); void (*pud_value_init)(struct samsung_pinctrl_drv_data *drvdata); - void (*suspend)(struct samsung_pinctrl_drv_data *); - void (*resume)(struct samsung_pinctrl_drv_data *); + void (*suspend)(struct samsung_pin_bank *bank); + void (*resume)(struct samsung_pin_bank *bank); }; /** @@ -335,8 +335,8 @@ struct samsung_pinctrl_drv_data { struct samsung_retention_ctrl *retention_ctrl; - void (*suspend)(struct samsung_pinctrl_drv_data *); - void (*resume)(struct samsung_pinctrl_drv_data *); + void (*suspend)(struct samsung_pin_bank *bank); + void (*resume)(struct samsung_pin_bank *bank); }; /** -- GitLab From f33266ec350057ed7a0c30e9c2376f245796ad07 Mon Sep 17 00:00:00 2001 From: Peter Griffin Date: Wed, 2 Apr 2025 16:17:31 +0100 Subject: [PATCH 1110/2211] pinctrl: samsung: add dedicated SoC eint suspend/resume callbacks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 77ac6b742eba063a5b6600cda67834a7a212281a ] Refactor the existing platform specific suspend/resume callback so that each SoC variant has it's own callback containing the SoC specific logic. This allows exynosautov920 to have a dedicated function for using eint_con_offset and eint_mask_offset. Also it is easily extendable for gs101 which will need dedicated logic for handling the varying register offset of fltcon0 via eint_fltcon_offset. Reviewed-by: André Draszik Signed-off-by: Peter Griffin Link: https://lore.kernel.org/r/20250402-pinctrl-fltcon-suspend-v6-2-78ce0d4eb30c@linaro.org Signed-off-by: Krzysztof Kozlowski Stable-dep-of: bdbe0a0f7100 ("pinctrl: samsung: add gs101 specific eint suspend/resume callbacks") Signed-off-by: Sasha Levin --- .../pinctrl/samsung/pinctrl-exynos-arm64.c | 28 ++-- drivers/pinctrl/samsung/pinctrl-exynos.c | 152 ++++++++++-------- drivers/pinctrl/samsung/pinctrl-exynos.h | 2 + 3 files changed, 97 insertions(+), 85 deletions(-) diff --git a/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c b/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c index 23b4bc1e5da81..ce61a85c7784a 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c @@ -809,8 +809,8 @@ static const struct samsung_pin_ctrl exynosautov920_pin_ctrl[] = { .pin_banks = exynosautov920_pin_banks0, .nr_banks = ARRAY_SIZE(exynosautov920_pin_banks0), .eint_wkup_init = exynos_eint_wkup_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = exynosautov920_pinctrl_suspend, + .resume = exynosautov920_pinctrl_resume, .retention_data = &exynosautov920_retention_data, }, { /* pin-controller instance 1 AUD data */ @@ -821,43 +821,43 @@ static const struct samsung_pin_ctrl exynosautov920_pin_ctrl[] = { .pin_banks = exynosautov920_pin_banks2, .nr_banks = ARRAY_SIZE(exynosautov920_pin_banks2), .eint_gpio_init = exynos_eint_gpio_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = exynosautov920_pinctrl_suspend, + .resume = exynosautov920_pinctrl_resume, }, { /* pin-controller instance 3 HSI1 data */ .pin_banks = exynosautov920_pin_banks3, .nr_banks = ARRAY_SIZE(exynosautov920_pin_banks3), .eint_gpio_init = exynos_eint_gpio_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = exynosautov920_pinctrl_suspend, + .resume = exynosautov920_pinctrl_resume, }, { /* pin-controller instance 4 HSI2 data */ .pin_banks = exynosautov920_pin_banks4, .nr_banks = ARRAY_SIZE(exynosautov920_pin_banks4), .eint_gpio_init = exynos_eint_gpio_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = exynosautov920_pinctrl_suspend, + .resume = exynosautov920_pinctrl_resume, }, { /* pin-controller instance 5 HSI2UFS data */ .pin_banks = exynosautov920_pin_banks5, .nr_banks = ARRAY_SIZE(exynosautov920_pin_banks5), .eint_gpio_init = exynos_eint_gpio_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = exynosautov920_pinctrl_suspend, + .resume = exynosautov920_pinctrl_resume, }, { /* pin-controller instance 6 PERIC0 data */ .pin_banks = exynosautov920_pin_banks6, .nr_banks = ARRAY_SIZE(exynosautov920_pin_banks6), .eint_gpio_init = exynos_eint_gpio_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = exynosautov920_pinctrl_suspend, + .resume = exynosautov920_pinctrl_resume, }, { /* pin-controller instance 7 PERIC1 data */ .pin_banks = exynosautov920_pin_banks7, .nr_banks = ARRAY_SIZE(exynosautov920_pin_banks7), .eint_gpio_init = exynos_eint_gpio_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = exynosautov920_pinctrl_suspend, + .resume = exynosautov920_pinctrl_resume, }, }; diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c index 62c8d8d907545..af4fb1cde8de9 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos.c @@ -761,105 +761,115 @@ __init int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d) return 0; } -static void exynos_pinctrl_suspend_bank(struct samsung_pin_bank *bank) +static void exynos_set_wakeup(struct samsung_pin_bank *bank) { - struct exynos_eint_gpio_save *save = bank->soc_priv; - const void __iomem *regs = bank->eint_base; + struct exynos_irq_chip *irq_chip; - save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET - + bank->eint_offset); - save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET - + 2 * bank->eint_offset); - save->eint_fltcon1 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET - + 2 * bank->eint_offset + 4); - save->eint_mask = readl(regs + bank->irq_chip->eint_mask - + bank->eint_offset); - - pr_debug("%s: save con %#010x\n", bank->name, save->eint_con); - pr_debug("%s: save fltcon0 %#010x\n", bank->name, save->eint_fltcon0); - pr_debug("%s: save fltcon1 %#010x\n", bank->name, save->eint_fltcon1); - pr_debug("%s: save mask %#010x\n", bank->name, save->eint_mask); + if (bank->irq_chip) { + irq_chip = bank->irq_chip; + irq_chip->set_eint_wakeup_mask(bank->drvdata, irq_chip); + } } -static void exynosauto_pinctrl_suspend_bank(struct samsung_pin_bank *bank) +void exynos_pinctrl_suspend(struct samsung_pin_bank *bank) { struct exynos_eint_gpio_save *save = bank->soc_priv; const void __iomem *regs = bank->eint_base; - save->eint_con = readl(regs + bank->pctl_offset + bank->eint_con_offset); - save->eint_mask = readl(regs + bank->pctl_offset + bank->eint_mask_offset); - - pr_debug("%s: save con %#010x\n", bank->name, save->eint_con); - pr_debug("%s: save mask %#010x\n", bank->name, save->eint_mask); + if (bank->eint_type == EINT_TYPE_GPIO) { + save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET + + bank->eint_offset); + save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET + + 2 * bank->eint_offset); + save->eint_fltcon1 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET + + 2 * bank->eint_offset + 4); + save->eint_mask = readl(regs + bank->irq_chip->eint_mask + + bank->eint_offset); + + pr_debug("%s: save con %#010x\n", + bank->name, save->eint_con); + pr_debug("%s: save fltcon0 %#010x\n", + bank->name, save->eint_fltcon0); + pr_debug("%s: save fltcon1 %#010x\n", + bank->name, save->eint_fltcon1); + pr_debug("%s: save mask %#010x\n", + bank->name, save->eint_mask); + } else if (bank->eint_type == EINT_TYPE_WKUP) { + exynos_set_wakeup(bank); + } } -void exynos_pinctrl_suspend(struct samsung_pin_bank *bank) +void exynosautov920_pinctrl_suspend(struct samsung_pin_bank *bank) { - struct exynos_irq_chip *irq_chip = NULL; + struct exynos_eint_gpio_save *save = bank->soc_priv; + const void __iomem *regs = bank->eint_base; if (bank->eint_type == EINT_TYPE_GPIO) { - if (bank->eint_con_offset) - exynosauto_pinctrl_suspend_bank(bank); - else - exynos_pinctrl_suspend_bank(bank); + save->eint_con = readl(regs + bank->pctl_offset + + bank->eint_con_offset); + save->eint_mask = readl(regs + bank->pctl_offset + + bank->eint_mask_offset); + pr_debug("%s: save con %#010x\n", + bank->name, save->eint_con); + pr_debug("%s: save mask %#010x\n", + bank->name, save->eint_mask); } else if (bank->eint_type == EINT_TYPE_WKUP) { - if (!irq_chip) { - irq_chip = bank->irq_chip; - irq_chip->set_eint_wakeup_mask(bank->drvdata, irq_chip); - } + exynos_set_wakeup(bank); } } -static void exynos_pinctrl_resume_bank(struct samsung_pin_bank *bank) +void exynos_pinctrl_resume(struct samsung_pin_bank *bank) { struct exynos_eint_gpio_save *save = bank->soc_priv; void __iomem *regs = bank->eint_base; - pr_debug("%s: con %#010x => %#010x\n", bank->name, - readl(regs + EXYNOS_GPIO_ECON_OFFSET - + bank->eint_offset), save->eint_con); - pr_debug("%s: fltcon0 %#010x => %#010x\n", bank->name, - readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET - + 2 * bank->eint_offset), save->eint_fltcon0); - pr_debug("%s: fltcon1 %#010x => %#010x\n", bank->name, - readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET - + 2 * bank->eint_offset + 4), save->eint_fltcon1); - pr_debug("%s: mask %#010x => %#010x\n", bank->name, - readl(regs + bank->irq_chip->eint_mask - + bank->eint_offset), save->eint_mask); - - writel(save->eint_con, regs + EXYNOS_GPIO_ECON_OFFSET - + bank->eint_offset); - writel(save->eint_fltcon0, regs + EXYNOS_GPIO_EFLTCON_OFFSET - + 2 * bank->eint_offset); - writel(save->eint_fltcon1, regs + EXYNOS_GPIO_EFLTCON_OFFSET - + 2 * bank->eint_offset + 4); - writel(save->eint_mask, regs + bank->irq_chip->eint_mask - + bank->eint_offset); + if (bank->eint_type == EINT_TYPE_GPIO) { + pr_debug("%s: con %#010x => %#010x\n", bank->name, + readl(regs + EXYNOS_GPIO_ECON_OFFSET + + bank->eint_offset), save->eint_con); + pr_debug("%s: fltcon0 %#010x => %#010x\n", bank->name, + readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET + + 2 * bank->eint_offset), save->eint_fltcon0); + pr_debug("%s: fltcon1 %#010x => %#010x\n", bank->name, + readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET + + 2 * bank->eint_offset + 4), + save->eint_fltcon1); + pr_debug("%s: mask %#010x => %#010x\n", bank->name, + readl(regs + bank->irq_chip->eint_mask + + bank->eint_offset), save->eint_mask); + + writel(save->eint_con, regs + EXYNOS_GPIO_ECON_OFFSET + + bank->eint_offset); + writel(save->eint_fltcon0, regs + EXYNOS_GPIO_EFLTCON_OFFSET + + 2 * bank->eint_offset); + writel(save->eint_fltcon1, regs + EXYNOS_GPIO_EFLTCON_OFFSET + + 2 * bank->eint_offset + 4); + writel(save->eint_mask, regs + bank->irq_chip->eint_mask + + bank->eint_offset); + } } -static void exynosauto_pinctrl_resume_bank(struct samsung_pin_bank *bank) +void exynosautov920_pinctrl_resume(struct samsung_pin_bank *bank) { struct exynos_eint_gpio_save *save = bank->soc_priv; void __iomem *regs = bank->eint_base; - pr_debug("%s: con %#010x => %#010x\n", bank->name, - readl(regs + bank->pctl_offset + bank->eint_con_offset), save->eint_con); - pr_debug("%s: mask %#010x => %#010x\n", bank->name, - readl(regs + bank->pctl_offset + bank->eint_mask_offset), save->eint_mask); - - writel(save->eint_con, regs + bank->pctl_offset + bank->eint_con_offset); - writel(save->eint_mask, regs + bank->pctl_offset + bank->eint_mask_offset); - -} - -void exynos_pinctrl_resume(struct samsung_pin_bank *bank) -{ if (bank->eint_type == EINT_TYPE_GPIO) { - if (bank->eint_con_offset) - exynosauto_pinctrl_resume_bank(bank); - else - exynos_pinctrl_resume_bank(bank); + /* exynosautov920 has eint_con_offset for all but one bank */ + if (!bank->eint_con_offset) + exynos_pinctrl_resume(bank); + + pr_debug("%s: con %#010x => %#010x\n", bank->name, + readl(regs + bank->pctl_offset + bank->eint_con_offset), + save->eint_con); + pr_debug("%s: mask %#010x => %#010x\n", bank->name, + readl(regs + bank->pctl_offset + + bank->eint_mask_offset), save->eint_mask); + + writel(save->eint_con, + regs + bank->pctl_offset + bank->eint_con_offset); + writel(save->eint_mask, + regs + bank->pctl_offset + bank->eint_mask_offset); } } diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.h b/drivers/pinctrl/samsung/pinctrl-exynos.h index ce39ab52102e7..837b737c6f0a7 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos.h +++ b/drivers/pinctrl/samsung/pinctrl-exynos.h @@ -211,6 +211,8 @@ struct exynos_muxed_weint_data { int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d); int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d); +void exynosautov920_pinctrl_resume(struct samsung_pin_bank *bank); +void exynosautov920_pinctrl_suspend(struct samsung_pin_bank *bank); void exynos_pinctrl_suspend(struct samsung_pin_bank *bank); void exynos_pinctrl_resume(struct samsung_pin_bank *bank); struct samsung_retention_ctrl * -- GitLab From 595f83730b6df558e747419bd32d52b2ce7d9aaf Mon Sep 17 00:00:00 2001 From: Peter Griffin Date: Wed, 2 Apr 2025 16:17:32 +0100 Subject: [PATCH 1111/2211] pinctrl: samsung: add gs101 specific eint suspend/resume callbacks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit bdbe0a0f71003b997d6a2dbe4bc7b5b0438207c7 ] gs101 differs to other SoCs in that fltcon1 register doesn't always exist. Additionally the offset of fltcon0 is not fixed and needs to use the newly added eint_fltcon_offset variable. Fixes: 4a8be01a1a7a ("pinctrl: samsung: Add gs101 SoC pinctrl configuration") Cc: stable@vger.kernel.org # depends on the previous three patches Reviewed-by: André Draszik Signed-off-by: Peter Griffin Link: https://lore.kernel.org/r/20250402-pinctrl-fltcon-suspend-v6-3-78ce0d4eb30c@linaro.org Signed-off-by: Krzysztof Kozlowski Signed-off-by: Sasha Levin --- .../pinctrl/samsung/pinctrl-exynos-arm64.c | 24 +++---- drivers/pinctrl/samsung/pinctrl-exynos.c | 71 +++++++++++++++++++ drivers/pinctrl/samsung/pinctrl-exynos.h | 2 + 3 files changed, 85 insertions(+), 12 deletions(-) diff --git a/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c b/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c index ce61a85c7784a..a2ac1702d0dfa 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c @@ -1024,15 +1024,15 @@ static const struct samsung_pin_ctrl gs101_pin_ctrl[] __initconst = { .pin_banks = gs101_pin_alive, .nr_banks = ARRAY_SIZE(gs101_pin_alive), .eint_wkup_init = exynos_eint_wkup_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = gs101_pinctrl_suspend, + .resume = gs101_pinctrl_resume, }, { /* pin banks of gs101 pin-controller (FAR_ALIVE) */ .pin_banks = gs101_pin_far_alive, .nr_banks = ARRAY_SIZE(gs101_pin_far_alive), .eint_wkup_init = exynos_eint_wkup_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = gs101_pinctrl_suspend, + .resume = gs101_pinctrl_resume, }, { /* pin banks of gs101 pin-controller (GSACORE) */ .pin_banks = gs101_pin_gsacore, @@ -1046,29 +1046,29 @@ static const struct samsung_pin_ctrl gs101_pin_ctrl[] __initconst = { .pin_banks = gs101_pin_peric0, .nr_banks = ARRAY_SIZE(gs101_pin_peric0), .eint_gpio_init = exynos_eint_gpio_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = gs101_pinctrl_suspend, + .resume = gs101_pinctrl_resume, }, { /* pin banks of gs101 pin-controller (PERIC1) */ .pin_banks = gs101_pin_peric1, .nr_banks = ARRAY_SIZE(gs101_pin_peric1), .eint_gpio_init = exynos_eint_gpio_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = gs101_pinctrl_suspend, + .resume = gs101_pinctrl_resume, }, { /* pin banks of gs101 pin-controller (HSI1) */ .pin_banks = gs101_pin_hsi1, .nr_banks = ARRAY_SIZE(gs101_pin_hsi1), .eint_gpio_init = exynos_eint_gpio_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = gs101_pinctrl_suspend, + .resume = gs101_pinctrl_resume, }, { /* pin banks of gs101 pin-controller (HSI2) */ .pin_banks = gs101_pin_hsi2, .nr_banks = ARRAY_SIZE(gs101_pin_hsi2), .eint_gpio_init = exynos_eint_gpio_init, - .suspend = exynos_pinctrl_suspend, - .resume = exynos_pinctrl_resume, + .suspend = gs101_pinctrl_suspend, + .resume = gs101_pinctrl_resume, }, }; diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c index af4fb1cde8de9..7887fd4166511 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos.c @@ -799,6 +799,41 @@ void exynos_pinctrl_suspend(struct samsung_pin_bank *bank) } } +void gs101_pinctrl_suspend(struct samsung_pin_bank *bank) +{ + struct exynos_eint_gpio_save *save = bank->soc_priv; + const void __iomem *regs = bank->eint_base; + + if (bank->eint_type == EINT_TYPE_GPIO) { + save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET + + bank->eint_offset); + + save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET + + bank->eint_fltcon_offset); + + /* fltcon1 register only exists for pins 4-7 */ + if (bank->nr_pins > 4) + save->eint_fltcon1 = readl(regs + + EXYNOS_GPIO_EFLTCON_OFFSET + + bank->eint_fltcon_offset + 4); + + save->eint_mask = readl(regs + bank->irq_chip->eint_mask + + bank->eint_offset); + + pr_debug("%s: save con %#010x\n", + bank->name, save->eint_con); + pr_debug("%s: save fltcon0 %#010x\n", + bank->name, save->eint_fltcon0); + if (bank->nr_pins > 4) + pr_debug("%s: save fltcon1 %#010x\n", + bank->name, save->eint_fltcon1); + pr_debug("%s: save mask %#010x\n", + bank->name, save->eint_mask); + } else if (bank->eint_type == EINT_TYPE_WKUP) { + exynos_set_wakeup(bank); + } +} + void exynosautov920_pinctrl_suspend(struct samsung_pin_bank *bank) { struct exynos_eint_gpio_save *save = bank->soc_priv; @@ -818,6 +853,42 @@ void exynosautov920_pinctrl_suspend(struct samsung_pin_bank *bank) } } +void gs101_pinctrl_resume(struct samsung_pin_bank *bank) +{ + struct exynos_eint_gpio_save *save = bank->soc_priv; + + void __iomem *regs = bank->eint_base; + void __iomem *eint_fltcfg0 = regs + EXYNOS_GPIO_EFLTCON_OFFSET + + bank->eint_fltcon_offset; + + if (bank->eint_type == EINT_TYPE_GPIO) { + pr_debug("%s: con %#010x => %#010x\n", bank->name, + readl(regs + EXYNOS_GPIO_ECON_OFFSET + + bank->eint_offset), save->eint_con); + + pr_debug("%s: fltcon0 %#010x => %#010x\n", bank->name, + readl(eint_fltcfg0), save->eint_fltcon0); + + /* fltcon1 register only exists for pins 4-7 */ + if (bank->nr_pins > 4) + pr_debug("%s: fltcon1 %#010x => %#010x\n", bank->name, + readl(eint_fltcfg0 + 4), save->eint_fltcon1); + + pr_debug("%s: mask %#010x => %#010x\n", bank->name, + readl(regs + bank->irq_chip->eint_mask + + bank->eint_offset), save->eint_mask); + + writel(save->eint_con, regs + EXYNOS_GPIO_ECON_OFFSET + + bank->eint_offset); + writel(save->eint_fltcon0, eint_fltcfg0); + + if (bank->nr_pins > 4) + writel(save->eint_fltcon1, eint_fltcfg0 + 4); + writel(save->eint_mask, regs + bank->irq_chip->eint_mask + + bank->eint_offset); + } +} + void exynos_pinctrl_resume(struct samsung_pin_bank *bank) { struct exynos_eint_gpio_save *save = bank->soc_priv; diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.h b/drivers/pinctrl/samsung/pinctrl-exynos.h index 837b737c6f0a7..c70b8ead56b4b 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos.h +++ b/drivers/pinctrl/samsung/pinctrl-exynos.h @@ -215,6 +215,8 @@ void exynosautov920_pinctrl_resume(struct samsung_pin_bank *bank); void exynosautov920_pinctrl_suspend(struct samsung_pin_bank *bank); void exynos_pinctrl_suspend(struct samsung_pin_bank *bank); void exynos_pinctrl_resume(struct samsung_pin_bank *bank); +void gs101_pinctrl_suspend(struct samsung_pin_bank *bank); +void gs101_pinctrl_resume(struct samsung_pin_bank *bank); struct samsung_retention_ctrl * exynos_retention_init(struct samsung_pinctrl_drv_data *drvdata, const struct samsung_retention_data *data); -- GitLab From 3e81a8c73207fc5b4d3cf5c2eb933d4056828978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Thu, 24 Oct 2024 12:25:54 +0200 Subject: [PATCH 1112/2211] dt-bindings: pwm: adi,axi-pwmgen: Increase #pwm-cells to 3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 664b5e466f915ad7fce87215ccfb038c47ace4fb ] Using 3 cells allows to pass additional flags and is the normal abstraction for new PWM descriptions. There are no device trees yet to adapt to this change. Signed-off-by: Uwe Kleine-König Reviewed-by: Nuno Sa Acked-by: Conor Dooley Reviewed-by: Trevor Gamblin Link: https://lore.kernel.org/r/20241024102554.711689-2-u.kleine-koenig@baylibre.com Signed-off-by: Uwe Kleine-König Stable-dep-of: e683131e64f7 ("dt-bindings: pwm: adi,axi-pwmgen: Fix clocks") Signed-off-by: Sasha Levin --- Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml b/Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml index ec6115d3796ba..aa35209f74cfa 100644 --- a/Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml +++ b/Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml @@ -27,7 +27,7 @@ properties: maxItems: 1 "#pwm-cells": - const: 2 + const: 3 clocks: maxItems: 1 @@ -44,5 +44,5 @@ examples: compatible = "adi,axi-pwmgen-2.00.a"; reg = <0x44b00000 0x1000>; clocks = <&spi_clk>; - #pwm-cells = <2>; + #pwm-cells = <3>; }; -- GitLab From df4f4cdb064c69cb40fe5ad06a1f64f945e978a2 Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Tue, 7 Jan 2025 13:58:30 +0100 Subject: [PATCH 1113/2211] dt-bindings: pwm: Correct indentation and style in DTS example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 78dcad6daa405b8a939cd08f6ccd6c4e2cb50a9c ] DTS example in the bindings should be indented with 2- or 4-spaces and aligned with opening '- |', so correct any differences like 3-spaces or mixtures 2- and 4-spaces in one binding. No functional changes here, but saves some comments during reviews of new patches built on existing code. Signed-off-by: Krzysztof Kozlowski Acked-by: Nuno Sa Link: https://lore.kernel.org/r/20250107125831.225068-1-krzysztof.kozlowski@linaro.org Signed-off-by: Uwe Kleine-König Stable-dep-of: e683131e64f7 ("dt-bindings: pwm: adi,axi-pwmgen: Fix clocks") Signed-off-by: Sasha Levin --- Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml | 8 ++++---- .../devicetree/bindings/pwm/brcm,bcm7038-pwm.yaml | 8 ++++---- Documentation/devicetree/bindings/pwm/brcm,kona-pwm.yaml | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml b/Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml index aa35209f74cfa..45e112d0efb46 100644 --- a/Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml +++ b/Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml @@ -41,8 +41,8 @@ unevaluatedProperties: false examples: - | pwm@44b00000 { - compatible = "adi,axi-pwmgen-2.00.a"; - reg = <0x44b00000 0x1000>; - clocks = <&spi_clk>; - #pwm-cells = <3>; + compatible = "adi,axi-pwmgen-2.00.a"; + reg = <0x44b00000 0x1000>; + clocks = <&spi_clk>; + #pwm-cells = <3>; }; diff --git a/Documentation/devicetree/bindings/pwm/brcm,bcm7038-pwm.yaml b/Documentation/devicetree/bindings/pwm/brcm,bcm7038-pwm.yaml index 119de3d7f9dd7..44548a9da1580 100644 --- a/Documentation/devicetree/bindings/pwm/brcm,bcm7038-pwm.yaml +++ b/Documentation/devicetree/bindings/pwm/brcm,bcm7038-pwm.yaml @@ -35,8 +35,8 @@ additionalProperties: false examples: - | pwm: pwm@f0408000 { - compatible = "brcm,bcm7038-pwm"; - reg = <0xf0408000 0x28>; - #pwm-cells = <2>; - clocks = <&upg_fixed>; + compatible = "brcm,bcm7038-pwm"; + reg = <0xf0408000 0x28>; + #pwm-cells = <2>; + clocks = <&upg_fixed>; }; diff --git a/Documentation/devicetree/bindings/pwm/brcm,kona-pwm.yaml b/Documentation/devicetree/bindings/pwm/brcm,kona-pwm.yaml index e86c8053b366a..fd785da5d3d73 100644 --- a/Documentation/devicetree/bindings/pwm/brcm,kona-pwm.yaml +++ b/Documentation/devicetree/bindings/pwm/brcm,kona-pwm.yaml @@ -43,9 +43,9 @@ examples: #include pwm@3e01a000 { - compatible = "brcm,bcm11351-pwm", "brcm,kona-pwm"; - reg = <0x3e01a000 0xcc>; - clocks = <&slave_ccu BCM281XX_SLAVE_CCU_PWM>; - #pwm-cells = <3>; + compatible = "brcm,bcm11351-pwm", "brcm,kona-pwm"; + reg = <0x3e01a000 0xcc>; + clocks = <&slave_ccu BCM281XX_SLAVE_CCU_PWM>; + #pwm-cells = <3>; }; ... -- GitLab From e5250b86193983807ebfe41b95c9519cbffcf846 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Thu, 29 May 2025 11:53:19 -0500 Subject: [PATCH 1114/2211] dt-bindings: pwm: adi,axi-pwmgen: Fix clocks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit e683131e64f71e957ca77743cb3d313646157329 ] Fix a shortcoming in the bindings that doesn't allow for a separate external clock. The AXI PWMGEN IP block has a compile option ASYNC_CLK_EN that allows the use of an external clock for the PWM output separate from the AXI clock that runs the peripheral. This was missed in the original bindings and so users were writing dts files where the one and only clock specified would be the external clock, if there was one, incorrectly missing the separate AXI clock. The correct bindings are that the AXI clock is always required and the external clock is optional (must be given only when HDL compile option ASYNC_CLK_EN=1). Fixes: 1edf2c2a2841 ("dt-bindings: pwm: Add AXI PWM generator") Cc: stable@vger.kernel.org Signed-off-by: David Lechner Reviewed-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20250529-pwm-axi-pwmgen-add-external-clock-v3-2-5d8809a7da91@baylibre.com Signed-off-by: Uwe Kleine-König Signed-off-by: Sasha Levin --- .../devicetree/bindings/pwm/adi,axi-pwmgen.yaml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml b/Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml index 45e112d0efb46..5575c58357d6e 100644 --- a/Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml +++ b/Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml @@ -30,11 +30,19 @@ properties: const: 3 clocks: - maxItems: 1 + minItems: 1 + maxItems: 2 + + clock-names: + minItems: 1 + items: + - const: axi + - const: ext required: - reg - clocks + - clock-names unevaluatedProperties: false @@ -43,6 +51,7 @@ examples: pwm@44b00000 { compatible = "adi,axi-pwmgen-2.00.a"; reg = <0x44b00000 0x1000>; - clocks = <&spi_clk>; + clocks = <&fpga_clk>, <&spi_clk>; + clock-names = "axi", "ext"; #pwm-cells = <3>; }; -- GitLab From 21b2bca88e17a5a62c6399f3501d6c51e7259571 Mon Sep 17 00:00:00 2001 From: Claudiu Beznea Date: Thu, 16 Jan 2025 20:22:46 +0200 Subject: [PATCH 1115/2211] serial: sh-sci: Move runtime PM enable to sci_probe_single() [ Upstream commit 239f11209e5f282e16f5241b99256e25dd0614b6 ] Relocate the runtime PM enable operation to sci_probe_single(). This change prepares the codebase for upcoming fixes. While at it, replace the existing logic with a direct call to devm_pm_runtime_enable() and remove sci_cleanup_single(). The devm_pm_runtime_enable() function automatically handles disabling runtime PM during driver removal. Reviewed-by: Geert Uytterhoeven Signed-off-by: Claudiu Beznea Link: https://lore.kernel.org/r/20250116182249.3828577-3-claudiu.beznea.uj@bp.renesas.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/tty/serial/sh-sci.c | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 76cf177b040eb..aacbed76c7c54 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -3074,10 +3074,6 @@ static int sci_init_single(struct platform_device *dev, ret = sci_init_clocks(sci_port, &dev->dev); if (ret < 0) return ret; - - port->dev = &dev->dev; - - pm_runtime_enable(&dev->dev); } port->type = p->type; @@ -3104,11 +3100,6 @@ static int sci_init_single(struct platform_device *dev, return 0; } -static void sci_cleanup_single(struct sci_port *port) -{ - pm_runtime_disable(port->port.dev); -} - #if defined(CONFIG_SERIAL_SH_SCI_CONSOLE) || \ defined(CONFIG_SERIAL_SH_SCI_EARLYCON) static void serial_console_putchar(struct uart_port *port, unsigned char ch) @@ -3278,8 +3269,6 @@ static void sci_remove(struct platform_device *dev) sci_ports_in_use &= ~BIT(port->port.line); uart_remove_one_port(&sci_uart_driver, &port->port); - sci_cleanup_single(port); - if (port->port.fifosize > 1) device_remove_file(&dev->dev, &dev_attr_rx_fifo_trigger); if (type == PORT_SCIFA || type == PORT_SCIFB || type == PORT_HSCIF) @@ -3444,6 +3433,11 @@ static int sci_probe_single(struct platform_device *dev, if (ret) return ret; + sciport->port.dev = &dev->dev; + ret = devm_pm_runtime_enable(&dev->dev); + if (ret) + return ret; + sciport->gpios = mctrl_gpio_init(&sciport->port, 0); if (IS_ERR(sciport->gpios)) return PTR_ERR(sciport->gpios); @@ -3457,13 +3451,7 @@ static int sci_probe_single(struct platform_device *dev, sciport->port.flags |= UPF_HARD_FLOW; } - ret = uart_add_one_port(&sci_uart_driver, &sciport->port); - if (ret) { - sci_cleanup_single(sciport); - return ret; - } - - return 0; + return uart_add_one_port(&sci_uart_driver, &sciport->port); } static int sci_probe(struct platform_device *dev) -- GitLab From 3464a707d137efc8aea1d4ae234d26a28d82b78c Mon Sep 17 00:00:00 2001 From: Sanjeev Yadav Date: Fri, 23 May 2025 13:14:01 -0700 Subject: [PATCH 1116/2211] scsi: core: ufs: Fix a hang in the error handler [ Upstream commit 8a3514d348de87a9d5e2ac00fbac4faae0b97996 ] ufshcd_err_handling_prepare() calls ufshcd_rpm_get_sync(). The latter function can only succeed if UFSHCD_EH_IN_PROGRESS is not set because resuming involves submitting a SCSI command and ufshcd_queuecommand() returns SCSI_MLQUEUE_HOST_BUSY if UFSHCD_EH_IN_PROGRESS is set. Fix this hang by setting UFSHCD_EH_IN_PROGRESS after ufshcd_rpm_get_sync() has been called instead of before. Backtrace: __switch_to+0x174/0x338 __schedule+0x600/0x9e4 schedule+0x7c/0xe8 schedule_timeout+0xa4/0x1c8 io_schedule_timeout+0x48/0x70 wait_for_common_io+0xa8/0x160 //waiting on START_STOP wait_for_completion_io_timeout+0x10/0x20 blk_execute_rq+0xe4/0x1e4 scsi_execute_cmd+0x108/0x244 ufshcd_set_dev_pwr_mode+0xe8/0x250 __ufshcd_wl_resume+0x94/0x354 ufshcd_wl_runtime_resume+0x3c/0x174 scsi_runtime_resume+0x64/0xa4 rpm_resume+0x15c/0xa1c __pm_runtime_resume+0x4c/0x90 // Runtime resume ongoing ufshcd_err_handler+0x1a0/0xd08 process_one_work+0x174/0x808 worker_thread+0x15c/0x490 kthread+0xf4/0x1ec ret_from_fork+0x10/0x20 Signed-off-by: Sanjeev Yadav [ bvanassche: rewrote patch description ] Fixes: 62694735ca95 ("[SCSI] ufs: Add runtime PM support for UFS host controller driver") Signed-off-by: Bart Van Assche Link: https://lore.kernel.org/r/20250523201409.1676055-1-bvanassche@acm.org Reviewed-by: Peter Wang Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/ufs/core/ufshcd.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index 247e425428c88..374f505fec3d1 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -6577,9 +6577,14 @@ static void ufshcd_err_handler(struct work_struct *work) up(&hba->host_sem); return; } - ufshcd_set_eh_in_progress(hba); spin_unlock_irqrestore(hba->host->host_lock, flags); + ufshcd_err_handling_prepare(hba); + + spin_lock_irqsave(hba->host->host_lock, flags); + ufshcd_set_eh_in_progress(hba); + spin_unlock_irqrestore(hba->host->host_lock, flags); + /* Complete requests that have door-bell cleared by h/w */ ufshcd_complete_requests(hba, false); spin_lock_irqsave(hba->host->host_lock, flags); -- GitLab From 99e3d698533964be7acb2e85cc5b29027f26efe4 Mon Sep 17 00:00:00 2001 From: Pauli Virtanen Date: Sat, 31 May 2025 18:24:58 +0300 Subject: [PATCH 1117/2211] Bluetooth: hci_core: fix list_for_each_entry_rcu usage [ Upstream commit 308a3a8ce8ea41b26c46169f3263e50f5997c28e ] Releasing + re-acquiring RCU lock inside list_for_each_entry_rcu() loop body is not correct. Fix by taking the update-side hdev->lock instead. Fixes: c7eaf80bfb0c ("Bluetooth: Fix hci_link_tx_to RCU lock usage") Signed-off-by: Pauli Virtanen Reviewed-by: Paul Menzel Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- net/bluetooth/hci_core.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 743b63287a18f..831f41f6bc6de 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -3416,23 +3416,18 @@ static void hci_link_tx_to(struct hci_dev *hdev, __u8 type) bt_dev_err(hdev, "link tx timeout"); - rcu_read_lock(); + hci_dev_lock(hdev); /* Kill stalled connections */ - list_for_each_entry_rcu(c, &h->list, list) { + list_for_each_entry(c, &h->list, list) { if (c->type == type && c->sent) { bt_dev_err(hdev, "killing stalled connection %pMR", &c->dst); - /* hci_disconnect might sleep, so, we have to release - * the RCU read lock before calling it. - */ - rcu_read_unlock(); hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM); - rcu_read_lock(); } } - rcu_read_unlock(); + hci_dev_unlock(hdev); } static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type, -- GitLab From a075e10cfb6f5b49bd0c47ea0fd6f21b52c93785 Mon Sep 17 00:00:00 2001 From: Kiran K Date: Tue, 3 Jun 2025 15:34:38 +0530 Subject: [PATCH 1118/2211] Bluetooth: btintel_pcie: Fix driver not posting maximum rx buffers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit daabd276985055250528da97e9ce6d277d7009c2 ] The driver was posting only 6 rx buffers, despite the maximum rx buffers being defined as 16. Having fewer RX buffers caused firmware exceptions in HID use cases when events arrived in bursts. Exception seen on android 6.12 kernel. E Bluetooth: hci0: Received hw exception interrupt E Bluetooth: hci0: Received gp1 mailbox interrupt D Bluetooth: hci0: 00000000: ff 3e 87 80 03 01 01 01 03 01 0c 0d 02 1c 10 0e D Bluetooth: hci0: 00000010: 01 00 05 14 66 b0 28 b0 c0 b0 28 b0 ac af 28 b0 D Bluetooth: hci0: 00000020: 14 f1 28 b0 00 00 00 00 fa 04 00 00 00 00 40 10 D Bluetooth: hci0: 00000030: 08 00 00 00 7a 7a 7a 7a 47 00 fb a0 10 00 00 00 D Bluetooth: hci0: 00000000: 10 01 0a E Bluetooth: hci0: ---- Dump of debug registers — E Bluetooth: hci0: boot stage: 0xe0fb0047 E Bluetooth: hci0: ipc status: 0x00000004 E Bluetooth: hci0: ipc control: 0x00000000 E Bluetooth: hci0: ipc sleep control: 0x00000000 E Bluetooth: hci0: mbox_1: 0x00badbad E Bluetooth: hci0: mbox_2: 0x0000101c E Bluetooth: hci0: mbox_3: 0x00000008 E Bluetooth: hci0: mbox_4: 0x7a7a7a7a Signed-off-by: Chandrashekar Devegowda Signed-off-by: Kiran K Fixes: c2b636b3f788 ("Bluetooth: btintel_pcie: Add support for PCIe transport") Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- drivers/bluetooth/btintel_pcie.c | 3 ++- drivers/bluetooth/btintel_pcie.h | 3 --- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/bluetooth/btintel_pcie.c b/drivers/bluetooth/btintel_pcie.c index d225f0a37f985..b8065b7ec70b6 100644 --- a/drivers/bluetooth/btintel_pcie.c +++ b/drivers/bluetooth/btintel_pcie.c @@ -231,8 +231,9 @@ static int btintel_pcie_submit_rx(struct btintel_pcie_data *data) static int btintel_pcie_start_rx(struct btintel_pcie_data *data) { int i, ret; + struct rxq *rxq = &data->rxq; - for (i = 0; i < BTINTEL_PCIE_RX_MAX_QUEUE; i++) { + for (i = 0; i < rxq->count; i++) { ret = btintel_pcie_submit_rx(data); if (ret) return ret; diff --git a/drivers/bluetooth/btintel_pcie.h b/drivers/bluetooth/btintel_pcie.h index 8b7824ad005a2..5f7747f334ab8 100644 --- a/drivers/bluetooth/btintel_pcie.h +++ b/drivers/bluetooth/btintel_pcie.h @@ -104,9 +104,6 @@ enum { /* Doorbell vector for TFD */ #define BTINTEL_PCIE_TX_DB_VEC 0 -/* Number of pending RX requests for downlink */ -#define BTINTEL_PCIE_RX_MAX_QUEUE 6 - /* Doorbell vector for FRBD */ #define BTINTEL_PCIE_RX_DB_VEC 513 -- GitLab From b104a6f5d572fb4b3422075d4982de82eb30fe1c Mon Sep 17 00:00:00 2001 From: Chandrashekar Devegowda Date: Tue, 3 Jun 2025 15:34:39 +0530 Subject: [PATCH 1119/2211] Bluetooth: btintel_pcie: Increase the tx and rx descriptor count [ Upstream commit 2dd711102ce69ae41f65d09c012441227d4aa983 ] This change addresses latency issues observed in HID use cases where events arrive in bursts. By increasing the Rx descriptor count to 64, the firmware can handle bursty data more effectively, reducing latency and preventing buffer overflows. Signed-off-by: Chandrashekar Devegowda Signed-off-by: Kiran K Fixes: c2b636b3f788 ("Bluetooth: btintel_pcie: Add support for PCIe transport") Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- drivers/bluetooth/btintel_pcie.c | 24 ++++++++++++------------ drivers/bluetooth/btintel_pcie.h | 7 +++++-- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/drivers/bluetooth/btintel_pcie.c b/drivers/bluetooth/btintel_pcie.c index b8065b7ec70b6..c02d671396e24 100644 --- a/drivers/bluetooth/btintel_pcie.c +++ b/drivers/bluetooth/btintel_pcie.c @@ -1148,8 +1148,8 @@ static int btintel_pcie_alloc(struct btintel_pcie_data *data) * + size of index * Number of queues(2) * type of index array(4) * + size of context information */ - total = (sizeof(struct tfd) + sizeof(struct urbd0) + sizeof(struct frbd) - + sizeof(struct urbd1)) * BTINTEL_DESCS_COUNT; + total = (sizeof(struct tfd) + sizeof(struct urbd0)) * BTINTEL_PCIE_TX_DESCS_COUNT; + total += (sizeof(struct frbd) + sizeof(struct urbd1)) * BTINTEL_PCIE_RX_DESCS_COUNT; /* Add the sum of size of index array and size of ci struct */ total += (sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES * 4) + sizeof(struct ctx_info); @@ -1174,36 +1174,36 @@ static int btintel_pcie_alloc(struct btintel_pcie_data *data) data->dma_v_addr = v_addr; /* Setup descriptor count */ - data->txq.count = BTINTEL_DESCS_COUNT; - data->rxq.count = BTINTEL_DESCS_COUNT; + data->txq.count = BTINTEL_PCIE_TX_DESCS_COUNT; + data->rxq.count = BTINTEL_PCIE_RX_DESCS_COUNT; /* Setup tfds */ data->txq.tfds_p_addr = p_addr; data->txq.tfds = v_addr; - p_addr += (sizeof(struct tfd) * BTINTEL_DESCS_COUNT); - v_addr += (sizeof(struct tfd) * BTINTEL_DESCS_COUNT); + p_addr += (sizeof(struct tfd) * BTINTEL_PCIE_TX_DESCS_COUNT); + v_addr += (sizeof(struct tfd) * BTINTEL_PCIE_TX_DESCS_COUNT); /* Setup urbd0 */ data->txq.urbd0s_p_addr = p_addr; data->txq.urbd0s = v_addr; - p_addr += (sizeof(struct urbd0) * BTINTEL_DESCS_COUNT); - v_addr += (sizeof(struct urbd0) * BTINTEL_DESCS_COUNT); + p_addr += (sizeof(struct urbd0) * BTINTEL_PCIE_TX_DESCS_COUNT); + v_addr += (sizeof(struct urbd0) * BTINTEL_PCIE_TX_DESCS_COUNT); /* Setup FRBD*/ data->rxq.frbds_p_addr = p_addr; data->rxq.frbds = v_addr; - p_addr += (sizeof(struct frbd) * BTINTEL_DESCS_COUNT); - v_addr += (sizeof(struct frbd) * BTINTEL_DESCS_COUNT); + p_addr += (sizeof(struct frbd) * BTINTEL_PCIE_RX_DESCS_COUNT); + v_addr += (sizeof(struct frbd) * BTINTEL_PCIE_RX_DESCS_COUNT); /* Setup urbd1 */ data->rxq.urbd1s_p_addr = p_addr; data->rxq.urbd1s = v_addr; - p_addr += (sizeof(struct urbd1) * BTINTEL_DESCS_COUNT); - v_addr += (sizeof(struct urbd1) * BTINTEL_DESCS_COUNT); + p_addr += (sizeof(struct urbd1) * BTINTEL_PCIE_RX_DESCS_COUNT); + v_addr += (sizeof(struct urbd1) * BTINTEL_PCIE_RX_DESCS_COUNT); /* Setup data buffers for txq */ err = btintel_pcie_setup_txq_bufs(data, &data->txq); diff --git a/drivers/bluetooth/btintel_pcie.h b/drivers/bluetooth/btintel_pcie.h index 5f7747f334ab8..ee0eec0237afd 100644 --- a/drivers/bluetooth/btintel_pcie.h +++ b/drivers/bluetooth/btintel_pcie.h @@ -81,8 +81,11 @@ enum { /* Default interrupt timeout in msec */ #define BTINTEL_DEFAULT_INTR_TIMEOUT_MS 3000 -/* The number of descriptors in TX/RX queues */ -#define BTINTEL_DESCS_COUNT 16 +/* The number of descriptors in TX queues */ +#define BTINTEL_PCIE_TX_DESCS_COUNT 32 + +/* The number of descriptors in RX queues */ +#define BTINTEL_PCIE_RX_DESCS_COUNT 64 /* Number of Queue for TX and RX * It indicates the index of the IA(Index Array) -- GitLab From fbf95f446bd624914f223d1224699c4eb17c8638 Mon Sep 17 00:00:00 2001 From: Chandrashekar Devegowda Date: Tue, 3 Jun 2025 15:34:40 +0530 Subject: [PATCH 1120/2211] Bluetooth: btintel_pcie: Reduce driver buffer posting to prevent race condition [ Upstream commit bf2ffc4d14db29cab781549912d2dc69127f4d3e ] Modify the driver to post 3 fewer buffers than the maximum rx buffers (64) allowed for the firmware. This change mitigates a hardware issue causing a race condition in the firmware, improving stability and data handling. Signed-off-by: Chandrashekar Devegowda Signed-off-by: Kiran K Fixes: c2b636b3f788 ("Bluetooth: btintel_pcie: Add support for PCIe transport") Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- drivers/bluetooth/btintel_pcie.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/bluetooth/btintel_pcie.c b/drivers/bluetooth/btintel_pcie.c index c02d671396e24..34812bf7587d6 100644 --- a/drivers/bluetooth/btintel_pcie.c +++ b/drivers/bluetooth/btintel_pcie.c @@ -233,7 +233,11 @@ static int btintel_pcie_start_rx(struct btintel_pcie_data *data) int i, ret; struct rxq *rxq = &data->rxq; - for (i = 0; i < rxq->count; i++) { + /* Post (BTINTEL_PCIE_RX_DESCS_COUNT - 3) buffers to overcome the + * hardware issues leading to race condition at the firmware. + */ + + for (i = 0; i < rxq->count - 3; i++) { ret = btintel_pcie_submit_rx(data); if (ret) return ret; -- GitLab From 9df3e5e7f7e4653fd9802878cedc36defc5ef42d Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 3 Jun 2025 16:12:39 -0400 Subject: [PATCH 1121/2211] Bluetooth: MGMT: Fix UAF on mgmt_remove_adv_monitor_complete [ Upstream commit e6ed54e86aae9e4f7286ce8d5c73780f91b48d1c ] This reworks MGMT_OP_REMOVE_ADV_MONITOR to not use mgmt_pending_add to avoid crashes like bellow: ================================================================== BUG: KASAN: slab-use-after-free in mgmt_remove_adv_monitor_complete+0xe5/0x540 net/bluetooth/mgmt.c:5406 Read of size 8 at addr ffff88801c53f318 by task kworker/u5:5/5341 CPU: 0 UID: 0 PID: 5341 Comm: kworker/u5:5 Not tainted 6.15.0-syzkaller-10402-g4cb6c8af8591 #0 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 Workqueue: hci0 hci_cmd_sync_work Call Trace: dump_stack_lvl+0x189/0x250 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:408 [inline] print_report+0xd2/0x2b0 mm/kasan/report.c:521 kasan_report+0x118/0x150 mm/kasan/report.c:634 mgmt_remove_adv_monitor_complete+0xe5/0x540 net/bluetooth/mgmt.c:5406 hci_cmd_sync_work+0x261/0x3a0 net/bluetooth/hci_sync.c:334 process_one_work kernel/workqueue.c:3238 [inline] process_scheduled_works+0xade/0x17b0 kernel/workqueue.c:3321 worker_thread+0x8a0/0xda0 kernel/workqueue.c:3402 kthread+0x711/0x8a0 kernel/kthread.c:464 ret_from_fork+0x3fc/0x770 arch/x86/kernel/process.c:148 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245 Allocated by task 5987: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x3e/0x80 mm/kasan/common.c:68 poison_kmalloc_redzone mm/kasan/common.c:377 [inline] __kasan_kmalloc+0x93/0xb0 mm/kasan/common.c:394 kasan_kmalloc include/linux/kasan.h:260 [inline] __kmalloc_cache_noprof+0x230/0x3d0 mm/slub.c:4358 kmalloc_noprof include/linux/slab.h:905 [inline] kzalloc_noprof include/linux/slab.h:1039 [inline] mgmt_pending_new+0x65/0x240 net/bluetooth/mgmt_util.c:252 mgmt_pending_add+0x34/0x120 net/bluetooth/mgmt_util.c:279 remove_adv_monitor+0x103/0x1b0 net/bluetooth/mgmt.c:5454 hci_mgmt_cmd+0x9c9/0xef0 net/bluetooth/hci_sock.c:1719 hci_sock_sendmsg+0x6ca/0xef0 net/bluetooth/hci_sock.c:1839 sock_sendmsg_nosec net/socket.c:712 [inline] __sock_sendmsg+0x219/0x270 net/socket.c:727 sock_write_iter+0x258/0x330 net/socket.c:1131 new_sync_write fs/read_write.c:593 [inline] vfs_write+0x548/0xa90 fs/read_write.c:686 ksys_write+0x145/0x250 fs/read_write.c:738 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xfa/0x3b0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f Freed by task 5989: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x3e/0x80 mm/kasan/common.c:68 kasan_save_free_info+0x46/0x50 mm/kasan/generic.c:576 poison_slab_object mm/kasan/common.c:247 [inline] __kasan_slab_free+0x62/0x70 mm/kasan/common.c:264 kasan_slab_free include/linux/kasan.h:233 [inline] slab_free_hook mm/slub.c:2380 [inline] slab_free mm/slub.c:4642 [inline] kfree+0x18e/0x440 mm/slub.c:4841 mgmt_pending_foreach+0xc9/0x120 net/bluetooth/mgmt_util.c:242 mgmt_index_removed+0x10d/0x2f0 net/bluetooth/mgmt.c:9366 hci_sock_bind+0xbe9/0x1000 net/bluetooth/hci_sock.c:1314 __sys_bind_socket net/socket.c:1810 [inline] __sys_bind+0x2c3/0x3e0 net/socket.c:1841 __do_sys_bind net/socket.c:1846 [inline] __se_sys_bind net/socket.c:1844 [inline] __x64_sys_bind+0x7a/0x90 net/socket.c:1844 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xfa/0x3b0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f Fixes: 66bd095ab5d4 ("Bluetooth: advmon offload MSFT remove monitor") Closes: https://syzkaller.appspot.com/bug?extid=feb0dc579bbe30a13190 Reported-by: syzbot+feb0dc579bbe30a13190@syzkaller.appspotmail.com Tested-by: syzbot+feb0dc579bbe30a13190@syzkaller.appspotmail.com Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- include/net/bluetooth/hci_core.h | 1 - net/bluetooth/hci_core.c | 4 +--- net/bluetooth/mgmt.c | 37 ++++++++++---------------------- 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 4f3b537476e10..d81c3f7dd328e 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -2379,7 +2379,6 @@ void mgmt_advertising_added(struct sock *sk, struct hci_dev *hdev, u8 instance); void mgmt_advertising_removed(struct sock *sk, struct hci_dev *hdev, u8 instance); -void mgmt_adv_monitor_removed(struct hci_dev *hdev, u16 handle); int mgmt_phy_configuration_changed(struct hci_dev *hdev, struct sock *skip); void mgmt_adv_monitor_device_lost(struct hci_dev *hdev, u16 handle, bdaddr_t *bdaddr, u8 addr_type); diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 831f41f6bc6de..77fceec9039ed 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -1877,10 +1877,8 @@ void hci_free_adv_monitor(struct hci_dev *hdev, struct adv_monitor *monitor) if (monitor->handle) idr_remove(&hdev->adv_monitors_idr, monitor->handle); - if (monitor->state != ADV_MONITOR_STATE_NOT_REGISTERED) { + if (monitor->state != ADV_MONITOR_STATE_NOT_REGISTERED) hdev->adv_monitors_cnt--; - mgmt_adv_monitor_removed(hdev, monitor->handle); - } kfree(monitor); } diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index d4700f940e8a1..7a086a9ad41fa 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c @@ -5172,24 +5172,14 @@ static void mgmt_adv_monitor_added(struct sock *sk, struct hci_dev *hdev, mgmt_event(MGMT_EV_ADV_MONITOR_ADDED, hdev, &ev, sizeof(ev), sk); } -void mgmt_adv_monitor_removed(struct hci_dev *hdev, u16 handle) +static void mgmt_adv_monitor_removed(struct sock *sk, struct hci_dev *hdev, + u16 handle) { struct mgmt_ev_adv_monitor_removed ev; - struct mgmt_pending_cmd *cmd; - struct sock *sk_skip = NULL; - struct mgmt_cp_remove_adv_monitor *cp; - - cmd = pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev); - if (cmd) { - cp = cmd->param; - - if (cp->monitor_handle) - sk_skip = cmd->sk; - } ev.monitor_handle = cpu_to_le16(handle); - mgmt_event(MGMT_EV_ADV_MONITOR_REMOVED, hdev, &ev, sizeof(ev), sk_skip); + mgmt_event(MGMT_EV_ADV_MONITOR_REMOVED, hdev, &ev, sizeof(ev), sk); } static int read_adv_mon_features(struct sock *sk, struct hci_dev *hdev, @@ -5291,8 +5281,7 @@ static int __add_adv_patterns_monitor(struct sock *sk, struct hci_dev *hdev, if (pending_find(MGMT_OP_SET_LE, hdev) || pending_find(MGMT_OP_ADD_ADV_PATTERNS_MONITOR, hdev) || - pending_find(MGMT_OP_ADD_ADV_PATTERNS_MONITOR_RSSI, hdev) || - pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev)) { + pending_find(MGMT_OP_ADD_ADV_PATTERNS_MONITOR_RSSI, hdev)) { status = MGMT_STATUS_BUSY; goto unlock; } @@ -5462,8 +5451,7 @@ static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev, struct mgmt_pending_cmd *cmd = data; struct mgmt_cp_remove_adv_monitor *cp; - if (status == -ECANCELED || - cmd != pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev)) + if (status == -ECANCELED) return; hci_dev_lock(hdev); @@ -5472,12 +5460,14 @@ static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev, rp.monitor_handle = cp->monitor_handle; - if (!status) + if (!status) { + mgmt_adv_monitor_removed(cmd->sk, hdev, cp->monitor_handle); hci_update_passive_scan(hdev); + } mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(status), &rp, sizeof(rp)); - mgmt_pending_remove(cmd); + mgmt_pending_free(cmd); hci_dev_unlock(hdev); bt_dev_dbg(hdev, "remove monitor %d complete, status %d", @@ -5487,10 +5477,6 @@ static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev, static int mgmt_remove_adv_monitor_sync(struct hci_dev *hdev, void *data) { struct mgmt_pending_cmd *cmd = data; - - if (cmd != pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev)) - return -ECANCELED; - struct mgmt_cp_remove_adv_monitor *cp = cmd->param; u16 handle = __le16_to_cpu(cp->monitor_handle); @@ -5509,14 +5495,13 @@ static int remove_adv_monitor(struct sock *sk, struct hci_dev *hdev, hci_dev_lock(hdev); if (pending_find(MGMT_OP_SET_LE, hdev) || - pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev) || pending_find(MGMT_OP_ADD_ADV_PATTERNS_MONITOR, hdev) || pending_find(MGMT_OP_ADD_ADV_PATTERNS_MONITOR_RSSI, hdev)) { status = MGMT_STATUS_BUSY; goto unlock; } - cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_ADV_MONITOR, hdev, data, len); + cmd = mgmt_pending_new(sk, MGMT_OP_REMOVE_ADV_MONITOR, hdev, data, len); if (!cmd) { status = MGMT_STATUS_NO_RESOURCES; goto unlock; @@ -5526,7 +5511,7 @@ static int remove_adv_monitor(struct sock *sk, struct hci_dev *hdev, mgmt_remove_adv_monitor_complete); if (err) { - mgmt_pending_remove(cmd); + mgmt_pending_free(cmd); if (err == -ENOMEM) status = MGMT_STATUS_NO_RESOURCES; -- GitLab From 84ab1283eb5fcb10d78c8322dd423c0f29b16244 Mon Sep 17 00:00:00 2001 From: "Dr. David Alan Gilbert" Date: Mon, 27 Jan 2025 21:37:15 +0000 Subject: [PATCH 1122/2211] Bluetooth: MGMT: Remove unused mgmt_pending_find_data [ Upstream commit 276af34d82f13bda0b2a4d9786c90b8bbf1cd064 ] mgmt_pending_find_data() last use was removed in 2021 by commit 5a7501374664 ("Bluetooth: hci_sync: Convert MGMT_OP_GET_CLOCK_INFO") Remove it. Signed-off-by: Dr. David Alan Gilbert Reviewed-by: Simon Horman Signed-off-by: Luiz Augusto von Dentz Stable-dep-of: 6fe26f694c82 ("Bluetooth: MGMT: Protect mgmt_pending list with its own lock") Signed-off-by: Sasha Levin --- net/bluetooth/mgmt_util.c | 17 ----------------- net/bluetooth/mgmt_util.h | 4 ---- 2 files changed, 21 deletions(-) diff --git a/net/bluetooth/mgmt_util.c b/net/bluetooth/mgmt_util.c index 67db32a60c6a9..3713ff490c65d 100644 --- a/net/bluetooth/mgmt_util.c +++ b/net/bluetooth/mgmt_util.c @@ -229,23 +229,6 @@ struct mgmt_pending_cmd *mgmt_pending_find(unsigned short channel, u16 opcode, return NULL; } -struct mgmt_pending_cmd *mgmt_pending_find_data(unsigned short channel, - u16 opcode, - struct hci_dev *hdev, - const void *data) -{ - struct mgmt_pending_cmd *cmd; - - list_for_each_entry(cmd, &hdev->mgmt_pending, list) { - if (cmd->user_data != data) - continue; - if (cmd->opcode == opcode) - return cmd; - } - - return NULL; -} - void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, void (*cb)(struct mgmt_pending_cmd *cmd, void *data), void *data) diff --git a/net/bluetooth/mgmt_util.h b/net/bluetooth/mgmt_util.h index bdf978605d5a8..f2ba994ab1d84 100644 --- a/net/bluetooth/mgmt_util.h +++ b/net/bluetooth/mgmt_util.h @@ -54,10 +54,6 @@ int mgmt_cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status, struct mgmt_pending_cmd *mgmt_pending_find(unsigned short channel, u16 opcode, struct hci_dev *hdev); -struct mgmt_pending_cmd *mgmt_pending_find_data(unsigned short channel, - u16 opcode, - struct hci_dev *hdev, - const void *data); void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, void (*cb)(struct mgmt_pending_cmd *cmd, void *data), void *data); -- GitLab From 4e83f2dbb2bf677e614109df24426c4dded472d4 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 20 May 2025 15:42:21 -0400 Subject: [PATCH 1123/2211] Bluetooth: MGMT: Protect mgmt_pending list with its own lock [ Upstream commit 6fe26f694c824b8a4dbf50c635bee1302e3f099c ] This uses a mutex to protect from concurrent access of mgmt_pending list which can cause crashes like: ================================================================== BUG: KASAN: slab-use-after-free in hci_sock_get_channel+0x60/0x68 net/bluetooth/hci_sock.c:91 Read of size 2 at addr ffff0000c48885b2 by task syz.4.334/7318 CPU: 0 UID: 0 PID: 7318 Comm: syz.4.334 Not tainted 6.15.0-rc7-syzkaller-g187899f4124a #0 PREEMPT Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 02/12/2025 Call trace: show_stack+0x2c/0x3c arch/arm64/kernel/stacktrace.c:466 (C) __dump_stack+0x30/0x40 lib/dump_stack.c:94 dump_stack_lvl+0xd8/0x12c lib/dump_stack.c:120 print_address_description+0xa8/0x254 mm/kasan/report.c:408 print_report+0x68/0x84 mm/kasan/report.c:521 kasan_report+0xb0/0x110 mm/kasan/report.c:634 __asan_report_load2_noabort+0x20/0x2c mm/kasan/report_generic.c:379 hci_sock_get_channel+0x60/0x68 net/bluetooth/hci_sock.c:91 mgmt_pending_find+0x7c/0x140 net/bluetooth/mgmt_util.c:223 pending_find net/bluetooth/mgmt.c:947 [inline] remove_adv_monitor+0x44/0x1a4 net/bluetooth/mgmt.c:5445 hci_mgmt_cmd+0x780/0xc00 net/bluetooth/hci_sock.c:1712 hci_sock_sendmsg+0x544/0xbb0 net/bluetooth/hci_sock.c:1832 sock_sendmsg_nosec net/socket.c:712 [inline] __sock_sendmsg net/socket.c:727 [inline] sock_write_iter+0x25c/0x378 net/socket.c:1131 new_sync_write fs/read_write.c:591 [inline] vfs_write+0x62c/0x97c fs/read_write.c:684 ksys_write+0x120/0x210 fs/read_write.c:736 __do_sys_write fs/read_write.c:747 [inline] __se_sys_write fs/read_write.c:744 [inline] __arm64_sys_write+0x7c/0x90 fs/read_write.c:744 __invoke_syscall arch/arm64/kernel/syscall.c:35 [inline] invoke_syscall+0x98/0x2b8 arch/arm64/kernel/syscall.c:49 el0_svc_common+0x130/0x23c arch/arm64/kernel/syscall.c:132 do_el0_svc+0x48/0x58 arch/arm64/kernel/syscall.c:151 el0_svc+0x58/0x17c arch/arm64/kernel/entry-common.c:767 el0t_64_sync_handler+0x78/0x108 arch/arm64/kernel/entry-common.c:786 el0t_64_sync+0x198/0x19c arch/arm64/kernel/entry.S:600 Allocated by task 7037: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x40/0x78 mm/kasan/common.c:68 kasan_save_alloc_info+0x44/0x54 mm/kasan/generic.c:562 poison_kmalloc_redzone mm/kasan/common.c:377 [inline] __kasan_kmalloc+0x9c/0xb4 mm/kasan/common.c:394 kasan_kmalloc include/linux/kasan.h:260 [inline] __do_kmalloc_node mm/slub.c:4327 [inline] __kmalloc_noprof+0x2fc/0x4c8 mm/slub.c:4339 kmalloc_noprof include/linux/slab.h:909 [inline] sk_prot_alloc+0xc4/0x1f0 net/core/sock.c:2198 sk_alloc+0x44/0x3ac net/core/sock.c:2254 bt_sock_alloc+0x4c/0x300 net/bluetooth/af_bluetooth.c:148 hci_sock_create+0xa8/0x194 net/bluetooth/hci_sock.c:2202 bt_sock_create+0x14c/0x24c net/bluetooth/af_bluetooth.c:132 __sock_create+0x43c/0x91c net/socket.c:1541 sock_create net/socket.c:1599 [inline] __sys_socket_create net/socket.c:1636 [inline] __sys_socket+0xd4/0x1c0 net/socket.c:1683 __do_sys_socket net/socket.c:1697 [inline] __se_sys_socket net/socket.c:1695 [inline] __arm64_sys_socket+0x7c/0x94 net/socket.c:1695 __invoke_syscall arch/arm64/kernel/syscall.c:35 [inline] invoke_syscall+0x98/0x2b8 arch/arm64/kernel/syscall.c:49 el0_svc_common+0x130/0x23c arch/arm64/kernel/syscall.c:132 do_el0_svc+0x48/0x58 arch/arm64/kernel/syscall.c:151 el0_svc+0x58/0x17c arch/arm64/kernel/entry-common.c:767 el0t_64_sync_handler+0x78/0x108 arch/arm64/kernel/entry-common.c:786 el0t_64_sync+0x198/0x19c arch/arm64/kernel/entry.S:600 Freed by task 6607: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x40/0x78 mm/kasan/common.c:68 kasan_save_free_info+0x58/0x70 mm/kasan/generic.c:576 poison_slab_object mm/kasan/common.c:247 [inline] __kasan_slab_free+0x68/0x88 mm/kasan/common.c:264 kasan_slab_free include/linux/kasan.h:233 [inline] slab_free_hook mm/slub.c:2380 [inline] slab_free mm/slub.c:4642 [inline] kfree+0x17c/0x474 mm/slub.c:4841 sk_prot_free net/core/sock.c:2237 [inline] __sk_destruct+0x4f4/0x760 net/core/sock.c:2332 sk_destruct net/core/sock.c:2360 [inline] __sk_free+0x320/0x430 net/core/sock.c:2371 sk_free+0x60/0xc8 net/core/sock.c:2382 sock_put include/net/sock.h:1944 [inline] mgmt_pending_free+0x88/0x118 net/bluetooth/mgmt_util.c:290 mgmt_pending_remove+0xec/0x104 net/bluetooth/mgmt_util.c:298 mgmt_set_powered_complete+0x418/0x5cc net/bluetooth/mgmt.c:1355 hci_cmd_sync_work+0x204/0x33c net/bluetooth/hci_sync.c:334 process_one_work+0x7e8/0x156c kernel/workqueue.c:3238 process_scheduled_works kernel/workqueue.c:3319 [inline] worker_thread+0x958/0xed8 kernel/workqueue.c:3400 kthread+0x5fc/0x75c kernel/kthread.c:464 ret_from_fork+0x10/0x20 arch/arm64/kernel/entry.S:847 Fixes: a380b6cff1a2 ("Bluetooth: Add generic mgmt helper API") Closes: https://syzkaller.appspot.com/bug?extid=0a7039d5d9986ff4ecec Closes: https://syzkaller.appspot.com/bug?extid=cc0cc52e7f43dc9e6df1 Reported-by: syzbot+0a7039d5d9986ff4ecec@syzkaller.appspotmail.com Tested-by: syzbot+0a7039d5d9986ff4ecec@syzkaller.appspotmail.com Tested-by: syzbot+cc0cc52e7f43dc9e6df1@syzkaller.appspotmail.com Signed-off-by: Dmitry Antipov Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- include/net/bluetooth/hci_core.h | 1 + net/bluetooth/hci_core.c | 1 + net/bluetooth/mgmt.c | 101 +++++++++++++++---------------- net/bluetooth/mgmt_util.c | 32 ++++++++-- net/bluetooth/mgmt_util.h | 4 +- 5 files changed, 80 insertions(+), 59 deletions(-) diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index d81c3f7dd328e..e9e3366d059ef 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -538,6 +538,7 @@ struct hci_dev { struct hci_conn_hash conn_hash; struct list_head mesh_pending; + struct mutex mgmt_pending_lock; struct list_head mgmt_pending; struct list_head reject_list; struct list_head accept_list; diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 77fceec9039ed..0d3816c807588 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -2505,6 +2505,7 @@ struct hci_dev *hci_alloc_dev_priv(int sizeof_priv) mutex_init(&hdev->lock); mutex_init(&hdev->req_lock); + mutex_init(&hdev->mgmt_pending_lock); ida_init(&hdev->unset_handle_ida); diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 7a086a9ad41fa..70a26c895512f 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c @@ -1440,22 +1440,17 @@ static void settings_rsp(struct mgmt_pending_cmd *cmd, void *data) send_settings_rsp(cmd->sk, cmd->opcode, match->hdev); - list_del(&cmd->list); - if (match->sk == NULL) { match->sk = cmd->sk; sock_hold(match->sk); } - - mgmt_pending_free(cmd); } static void cmd_status_rsp(struct mgmt_pending_cmd *cmd, void *data) { u8 *status = data; - mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, *status); - mgmt_pending_remove(cmd); + mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, *status); } static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data) @@ -1469,8 +1464,6 @@ static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data) if (cmd->cmd_complete) { cmd->cmd_complete(cmd, match->mgmt_status); - mgmt_pending_remove(cmd); - return; } @@ -1479,13 +1472,13 @@ static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data) static int generic_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status) { - return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, + return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, cmd->param, cmd->param_len); } static int addr_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status) { - return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, + return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, cmd->param, sizeof(struct mgmt_addr_info)); } @@ -1525,7 +1518,7 @@ static void mgmt_set_discoverable_complete(struct hci_dev *hdev, void *data, if (err) { u8 mgmt_err = mgmt_status(err); - mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); + mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); goto done; } @@ -1700,7 +1693,7 @@ static void mgmt_set_connectable_complete(struct hci_dev *hdev, void *data, if (err) { u8 mgmt_err = mgmt_status(err); - mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); + mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); goto done; } @@ -1936,8 +1929,8 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err) new_settings(hdev, NULL); } - mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp, - &mgmt_err); + mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, true, + cmd_status_rsp, &mgmt_err); return; } @@ -1947,7 +1940,7 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err) changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED); } - mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match); + mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, true, settings_rsp, &match); if (changed) new_settings(hdev, match.sk); @@ -2067,12 +2060,12 @@ static void set_le_complete(struct hci_dev *hdev, void *data, int err) bt_dev_dbg(hdev, "err %d", err); if (status) { - mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp, - &status); + mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, true, cmd_status_rsp, + &status); return; } - mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match); + mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, true, settings_rsp, &match); new_settings(hdev, match.sk); @@ -2131,7 +2124,7 @@ static void set_mesh_complete(struct hci_dev *hdev, void *data, int err) struct sock *sk = cmd->sk; if (status) { - mgmt_pending_foreach(MGMT_OP_SET_MESH_RECEIVER, hdev, + mgmt_pending_foreach(MGMT_OP_SET_MESH_RECEIVER, hdev, true, cmd_status_rsp, &status); return; } @@ -2572,7 +2565,7 @@ static void mgmt_class_complete(struct hci_dev *hdev, void *data, int err) bt_dev_dbg(hdev, "err %d", err); - mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err), hdev->dev_class, 3); mgmt_pending_free(cmd); @@ -3360,7 +3353,7 @@ static int pairing_complete(struct mgmt_pending_cmd *cmd, u8 status) bacpy(&rp.addr.bdaddr, &conn->dst); rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type); - err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, + err = mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_PAIR_DEVICE, status, &rp, sizeof(rp)); /* So we don't get further callbacks for this connection */ @@ -5250,7 +5243,7 @@ static void mgmt_add_adv_patterns_monitor_complete(struct hci_dev *hdev, hci_update_passive_scan(hdev); } - mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(status), &rp, sizeof(rp)); mgmt_pending_remove(cmd); @@ -5465,7 +5458,7 @@ static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev, hci_update_passive_scan(hdev); } - mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(status), &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -5864,7 +5857,7 @@ static void start_discovery_complete(struct hci_dev *hdev, void *data, int err) cmd != pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev)) return; - mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), + mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err), cmd->param, 1); mgmt_pending_remove(cmd); @@ -6102,7 +6095,7 @@ static void stop_discovery_complete(struct hci_dev *hdev, void *data, int err) bt_dev_dbg(hdev, "err %d", err); - mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), + mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err), cmd->param, 1); mgmt_pending_remove(cmd); @@ -6327,7 +6320,7 @@ static void set_advertising_complete(struct hci_dev *hdev, void *data, int err) u8 status = mgmt_status(err); if (status) { - mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, + mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, true, cmd_status_rsp, &status); return; } @@ -6337,7 +6330,7 @@ static void set_advertising_complete(struct hci_dev *hdev, void *data, int err) else hci_dev_clear_flag(hdev, HCI_ADVERTISING); - mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp, + mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, true, settings_rsp, &match); new_settings(hdev, match.sk); @@ -6681,7 +6674,7 @@ static void set_bredr_complete(struct hci_dev *hdev, void *data, int err) */ hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED); - mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); + mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); } else { send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev); new_settings(hdev, cmd->sk); @@ -6818,7 +6811,7 @@ static void set_secure_conn_complete(struct hci_dev *hdev, void *data, int err) if (err) { u8 mgmt_err = mgmt_status(err); - mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); + mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); goto done; } @@ -7265,7 +7258,7 @@ static void get_conn_info_complete(struct hci_dev *hdev, void *data, int err) rp.max_tx_power = HCI_TX_POWER_INVALID; } - mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_GET_CONN_INFO, status, + mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_GET_CONN_INFO, status, &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -7425,7 +7418,7 @@ static void get_clock_info_complete(struct hci_dev *hdev, void *data, int err) } complete: - mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, &rp, + mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -8675,10 +8668,10 @@ static void add_advertising_complete(struct hci_dev *hdev, void *data, int err) rp.instance = cp->instance; if (err) - mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, + mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err)); else - mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err), &rp, sizeof(rp)); add_adv_complete(hdev, cmd->sk, cp->instance, err); @@ -8866,10 +8859,10 @@ static void add_ext_adv_params_complete(struct hci_dev *hdev, void *data, hci_remove_adv_instance(hdev, cp->instance); - mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, + mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err)); } else { - mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err), &rp, sizeof(rp)); } @@ -9016,10 +9009,10 @@ static void add_ext_adv_data_complete(struct hci_dev *hdev, void *data, int err) rp.instance = cp->instance; if (err) - mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, + mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err)); else - mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err), &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -9178,10 +9171,10 @@ static void remove_advertising_complete(struct hci_dev *hdev, void *data, rp.instance = cp->instance; if (err) - mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, + mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err)); else - mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, MGMT_STATUS_SUCCESS, &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -9452,7 +9445,7 @@ void mgmt_index_removed(struct hci_dev *hdev) if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) return; - mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &match); + mgmt_pending_foreach(0, hdev, true, cmd_complete_rsp, &match); if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev, NULL, 0, @@ -9490,7 +9483,8 @@ void mgmt_power_on(struct hci_dev *hdev, int err) hci_update_passive_scan(hdev); } - mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match); + mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, true, settings_rsp, + &match); new_settings(hdev, match.sk); @@ -9505,7 +9499,8 @@ void __mgmt_power_off(struct hci_dev *hdev) struct cmd_lookup match = { NULL, hdev }; u8 zero_cod[] = { 0, 0, 0 }; - mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match); + mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, true, settings_rsp, + &match); /* If the power off is because of hdev unregistration let * use the appropriate INVALID_INDEX status. Otherwise use @@ -9519,7 +9514,7 @@ void __mgmt_power_off(struct hci_dev *hdev) else match.mgmt_status = MGMT_STATUS_NOT_POWERED; - mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &match); + mgmt_pending_foreach(0, hdev, true, cmd_complete_rsp, &match); if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) { mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, @@ -9760,7 +9755,6 @@ static void unpair_device_rsp(struct mgmt_pending_cmd *cmd, void *data) device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk); cmd->cmd_complete(cmd, 0); - mgmt_pending_remove(cmd); } bool mgmt_powering_down(struct hci_dev *hdev) @@ -9816,8 +9810,8 @@ void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, struct mgmt_cp_disconnect *cp; struct mgmt_pending_cmd *cmd; - mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp, - hdev); + mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, true, + unpair_device_rsp, hdev); cmd = pending_find(MGMT_OP_DISCONNECT, hdev); if (!cmd) @@ -10010,7 +10004,7 @@ void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status) if (status) { u8 mgmt_err = mgmt_status(status); - mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, + mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, true, cmd_status_rsp, &mgmt_err); return; } @@ -10020,8 +10014,8 @@ void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status) else changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY); - mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp, - &match); + mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, true, + settings_rsp, &match); if (changed) new_settings(hdev, match.sk); @@ -10045,9 +10039,12 @@ void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, { struct cmd_lookup match = { NULL, hdev, mgmt_status(status) }; - mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match); - mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match); - mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match); + mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, false, sk_lookup, + &match); + mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, false, sk_lookup, + &match); + mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, false, sk_lookup, + &match); if (!status) { mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class, diff --git a/net/bluetooth/mgmt_util.c b/net/bluetooth/mgmt_util.c index 3713ff490c65d..a88a07da39473 100644 --- a/net/bluetooth/mgmt_util.c +++ b/net/bluetooth/mgmt_util.c @@ -217,30 +217,47 @@ int mgmt_cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status, struct mgmt_pending_cmd *mgmt_pending_find(unsigned short channel, u16 opcode, struct hci_dev *hdev) { - struct mgmt_pending_cmd *cmd; + struct mgmt_pending_cmd *cmd, *tmp; + + mutex_lock(&hdev->mgmt_pending_lock); - list_for_each_entry(cmd, &hdev->mgmt_pending, list) { + list_for_each_entry_safe(cmd, tmp, &hdev->mgmt_pending, list) { if (hci_sock_get_channel(cmd->sk) != channel) continue; - if (cmd->opcode == opcode) + + if (cmd->opcode == opcode) { + mutex_unlock(&hdev->mgmt_pending_lock); return cmd; + } } + mutex_unlock(&hdev->mgmt_pending_lock); + return NULL; } -void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, +void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, bool remove, void (*cb)(struct mgmt_pending_cmd *cmd, void *data), void *data) { struct mgmt_pending_cmd *cmd, *tmp; + mutex_lock(&hdev->mgmt_pending_lock); + list_for_each_entry_safe(cmd, tmp, &hdev->mgmt_pending, list) { if (opcode > 0 && cmd->opcode != opcode) continue; + if (remove) + list_del(&cmd->list); + cb(cmd, data); + + if (remove) + mgmt_pending_free(cmd); } + + mutex_unlock(&hdev->mgmt_pending_lock); } struct mgmt_pending_cmd *mgmt_pending_new(struct sock *sk, u16 opcode, @@ -254,7 +271,7 @@ struct mgmt_pending_cmd *mgmt_pending_new(struct sock *sk, u16 opcode, return NULL; cmd->opcode = opcode; - cmd->index = hdev->id; + cmd->hdev = hdev; cmd->param = kmemdup(data, len, GFP_KERNEL); if (!cmd->param) { @@ -280,7 +297,9 @@ struct mgmt_pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode, if (!cmd) return NULL; + mutex_lock(&hdev->mgmt_pending_lock); list_add_tail(&cmd->list, &hdev->mgmt_pending); + mutex_unlock(&hdev->mgmt_pending_lock); return cmd; } @@ -294,7 +313,10 @@ void mgmt_pending_free(struct mgmt_pending_cmd *cmd) void mgmt_pending_remove(struct mgmt_pending_cmd *cmd) { + mutex_lock(&cmd->hdev->mgmt_pending_lock); list_del(&cmd->list); + mutex_unlock(&cmd->hdev->mgmt_pending_lock); + mgmt_pending_free(cmd); } diff --git a/net/bluetooth/mgmt_util.h b/net/bluetooth/mgmt_util.h index f2ba994ab1d84..024e51dd69375 100644 --- a/net/bluetooth/mgmt_util.h +++ b/net/bluetooth/mgmt_util.h @@ -33,7 +33,7 @@ struct mgmt_mesh_tx { struct mgmt_pending_cmd { struct list_head list; u16 opcode; - int index; + struct hci_dev *hdev; void *param; size_t param_len; struct sock *sk; @@ -54,7 +54,7 @@ int mgmt_cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status, struct mgmt_pending_cmd *mgmt_pending_find(unsigned short channel, u16 opcode, struct hci_dev *hdev); -void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, +void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, bool remove, void (*cb)(struct mgmt_pending_cmd *cmd, void *data), void *data); struct mgmt_pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode, -- GitLab From 6c8d3d7c368db1909f8b93dfbb5efe0019163f8f Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Mon, 2 Jun 2025 21:49:14 +0200 Subject: [PATCH 1124/2211] net: dsa: b53: fix untagged traffic sent via cpu tagged with VID 0 [ Upstream commit 692eb9f8a5b71d852e873375d20cf5da7a046ea6 ] When Linux sends out untagged traffic from a port, it will enter the CPU port without any VLAN tag, even if the port is a member of a vlan filtering bridge with a PVID egress untagged VLAN. This makes the CPU port's PVID take effect, and the PVID's VLAN table entry controls if the packet will be tagged on egress. Since commit 45e9d59d3950 ("net: dsa: b53: do not allow to configure VLAN 0") we remove bridged ports from VLAN 0 when joining or leaving a VLAN aware bridge. But we also clear the untagged bit, causing untagged traffic from the controller to become tagged with VID 0 (and priority 0). Fix this by not touching the untagged map of VLAN 0. Additionally, always keep the CPU port as a member, as the untag map is only effective as long as there is at least one member, and we would remove it when bridging all ports and leaving no standalone ports. Since Linux (and the switch) treats VLAN 0 tagged traffic like untagged, the actual impact of this is rather low, but this also prevented earlier detection of the issue. Fixes: 45e9d59d3950 ("net: dsa: b53: do not allow to configure VLAN 0") Signed-off-by: Jonas Gorski Reviewed-by: Florian Fainelli Reviewed-by: Vladimir Oltean Link: https://patch.msgid.link/20250602194914.1011890-1-jonas.gorski@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/dsa/b53/b53_common.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 79039c0941c20..71c30a81c36db 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -2036,9 +2036,6 @@ int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge, b53_get_vlan_entry(dev, pvid, vl); vl->members &= ~BIT(port); - if (vl->members == BIT(cpu_port)) - vl->members &= ~BIT(cpu_port); - vl->untag = vl->members; b53_set_vlan_entry(dev, pvid, vl); } @@ -2117,8 +2114,7 @@ void b53_br_leave(struct dsa_switch *ds, int port, struct dsa_bridge bridge) } b53_get_vlan_entry(dev, pvid, vl); - vl->members |= BIT(port) | BIT(cpu_port); - vl->untag |= BIT(port) | BIT(cpu_port); + vl->members |= BIT(port); b53_set_vlan_entry(dev, pvid, vl); } } -- GitLab From b93e6fef4eda48e17d9c642b9abad98a066fd4a3 Mon Sep 17 00:00:00 2001 From: Jeongjun Park Date: Wed, 21 May 2025 01:07:17 +0900 Subject: [PATCH 1125/2211] ptp: remove ptp->n_vclocks check logic in ptp_vclock_in_use() [ Upstream commit 87f7ce260a3c838b49e1dc1ceedf1006795157a2 ] There is no disagreement that we should check both ptp->is_virtual_clock and ptp->n_vclocks to check if the ptp virtual clock is in use. However, when we acquire ptp->n_vclocks_mux to read ptp->n_vclocks in ptp_vclock_in_use(), we observe a recursive lock in the call trace starting from n_vclocks_store(). ============================================ WARNING: possible recursive locking detected 6.15.0-rc6 #1 Not tainted -------------------------------------------- syz.0.1540/13807 is trying to acquire lock: ffff888035a24868 (&ptp->n_vclocks_mux){+.+.}-{4:4}, at: ptp_vclock_in_use drivers/ptp/ptp_private.h:103 [inline] ffff888035a24868 (&ptp->n_vclocks_mux){+.+.}-{4:4}, at: ptp_clock_unregister+0x21/0x250 drivers/ptp/ptp_clock.c:415 but task is already holding lock: ffff888030704868 (&ptp->n_vclocks_mux){+.+.}-{4:4}, at: n_vclocks_store+0xf1/0x6d0 drivers/ptp/ptp_sysfs.c:215 other info that might help us debug this: Possible unsafe locking scenario: CPU0 ---- lock(&ptp->n_vclocks_mux); lock(&ptp->n_vclocks_mux); *** DEADLOCK *** .... ============================================ The best way to solve this is to remove the logic that checks ptp->n_vclocks in ptp_vclock_in_use(). The reason why this is appropriate is that any path that uses ptp->n_vclocks must unconditionally check if ptp->n_vclocks is greater than 0 before unregistering vclocks, and all functions are already written this way. And in the function that uses ptp->n_vclocks, we already get ptp->n_vclocks_mux before unregistering vclocks. Therefore, we need to remove the redundant check for ptp->n_vclocks in ptp_vclock_in_use() to prevent recursive locking. Fixes: 73f37068d540 ("ptp: support ptp physical/virtual clocks conversion") Signed-off-by: Jeongjun Park Acked-by: Richard Cochran Link: https://patch.msgid.link/20250520160717.7350-1-aha310510@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/ptp/ptp_private.h | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/drivers/ptp/ptp_private.h b/drivers/ptp/ptp_private.h index 18934e28469ee..528d86a33f37d 100644 --- a/drivers/ptp/ptp_private.h +++ b/drivers/ptp/ptp_private.h @@ -98,17 +98,7 @@ static inline int queue_cnt(const struct timestamp_event_queue *q) /* Check if ptp virtual clock is in use */ static inline bool ptp_vclock_in_use(struct ptp_clock *ptp) { - bool in_use = false; - - if (mutex_lock_interruptible(&ptp->n_vclocks_mux)) - return true; - - if (!ptp->is_virtual_clock && ptp->n_vclocks) - in_use = true; - - mutex_unlock(&ptp->n_vclocks_mux); - - return in_use; + return !ptp->is_virtual_clock; } /* Check if ptp clock shall be free running */ -- GitLab From ef8e4aeab3b51de4fad7bba73ee05d546d0a1812 Mon Sep 17 00:00:00 2001 From: Caleb Connolly Date: Tue, 18 Mar 2025 20:50:27 +0000 Subject: [PATCH 1126/2211] ath10k: snoc: fix unbalanced IRQ enable in crash recovery [ Upstream commit 1650d32b92b01db03a1a95d69ee74fcbc34d4b00 ] In ath10k_snoc_hif_stop() we skip disabling the IRQs in the crash recovery flow, but we still unconditionally call enable again in ath10k_snoc_hif_start(). We can't check the ATH10K_FLAG_CRASH_FLUSH bit since it is cleared before hif_start() is called, so instead check the ATH10K_SNOC_FLAG_RECOVERY flag and skip enabling the IRQs during crash recovery. This fixes unbalanced IRQ enable splats that happen after recovering from a crash. Fixes: 0e622f67e041 ("ath10k: add support for WCN3990 firmware crash recovery") Signed-off-by: Caleb Connolly Tested-by: Loic Poulain Link: https://patch.msgid.link/20250318205043.1043148-1-caleb.connolly@linaro.org Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath10k/snoc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath10k/snoc.c b/drivers/net/wireless/ath/ath10k/snoc.c index 0fe47d51013c7..59f7ccb33fde3 100644 --- a/drivers/net/wireless/ath/ath10k/snoc.c +++ b/drivers/net/wireless/ath/ath10k/snoc.c @@ -937,7 +937,9 @@ static int ath10k_snoc_hif_start(struct ath10k *ar) dev_set_threaded(ar->napi_dev, true); ath10k_core_napi_enable(ar); - ath10k_snoc_irq_enable(ar); + /* IRQs are left enabled when we restart due to a firmware crash */ + if (!test_bit(ATH10K_SNOC_FLAG_RECOVERY, &ar_snoc->flags)) + ath10k_snoc_irq_enable(ar); ath10k_snoc_rx_post(ar); clear_bit(ATH10K_SNOC_FLAG_RECOVERY, &ar_snoc->flags); -- GitLab From b208c674f5c36d86c04060321ec64560d29a9a5a Mon Sep 17 00:00:00 2001 From: Easwar Hariharan Date: Tue, 10 Dec 2024 22:02:45 +0000 Subject: [PATCH 1127/2211] wifi: ath11k: convert timeouts to secs_to_jiffies() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit b29425972c5234a59b6fb634125420ed74266377 ] Commit b35108a51cf7 ("jiffies: Define secs_to_jiffies()") introduced secs_to_jiffies(). As the value here is a multiple of 1000, use secs_to_jiffies() instead of msecs_to_jiffies to avoid the multiplication. This is converted using scripts/coccinelle/misc/secs_to_jiffies.cocci with the following Coccinelle rules: @@ constant C; @@ - msecs_to_jiffies(C * 1000) + secs_to_jiffies(C) @@ constant C; @@ - msecs_to_jiffies(C * MSEC_PER_SEC) + secs_to_jiffies(C) Link: https://lkml.kernel.org/r/20241210-converge-secs-to-jiffies-v3-14-ddfefd7e9f2a@linux.microsoft.com Acked-by: Jeff Johnson Signed-off-by: Easwar Hariharan Cc: Alexander Gordeev Cc: Andrew Lunn Cc: Anna-Maria Behnsen Cc: Catalin Marinas Cc: Christian Borntraeger Cc: Christophe Leroy Cc: Daniel Mack Cc: David Airlie Cc: David S. Miller Cc: Dick Kennedy Cc: Eric Dumazet Cc: Florian Fainelli Cc: Greg Kroah-Hartman Cc: Haojian Zhuang Cc: Heiko Carstens Cc: Ilya Dryomov Cc: Jack Wang Cc: Jakub Kicinski Cc: James Bottomley Cc: James Smart Cc: Jaroslav Kysela Cc: Jeff Johnson Cc: Jens Axboe Cc: Jeroen de Borst Cc: Jiri Kosina Cc: Joe Lawrence Cc: Johan Hedberg Cc: Josh Poimboeuf Cc: Jozsef Kadlecsik Cc: Julia Lawall Cc: Kalle Valo Cc: Louis Peens Cc: Lucas De Marchi Cc: Luiz Augusto von Dentz Cc: Maarten Lankhorst Cc: Madhavan Srinivasan Cc: Marcel Holtmann Cc: Martin K. Petersen Cc: Maxime Ripard Cc: Michael Ellerman Cc: Miroslav Benes Cc: Naveen N Rao Cc: Nicholas Piggin Cc: Nicolas Palix Cc: Oded Gabbay Cc: Ofir Bitton Cc: Pablo Neira Ayuso Cc: Paolo Abeni Cc: Petr Mladek Cc: Praveen Kaligineedi Cc: Ray Jui Cc: Robert Jarzmik Cc: Rodrigo Vivi Cc: Roger Pau Monné Cc: Russell King Cc: Scott Branden Cc: Shailend Chand Cc: Simona Vetter Cc: Simon Horman Cc: Sven Schnelle Cc: Takashi Iwai Cc: Thomas Hellström Cc: Thomas Zimmermann Cc: Vasily Gorbik Cc: Xiubo Li Signed-off-by: Andrew Morton Stable-dep-of: 9f6e82d11bb9 ("wifi: ath11k: avoid burning CPU in ath11k_debugfs_fw_stats_request()") Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath11k/debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath11k/debugfs.c b/drivers/net/wireless/ath/ath11k/debugfs.c index 57281a135dd7f..bf192529e3fe2 100644 --- a/drivers/net/wireless/ath/ath11k/debugfs.c +++ b/drivers/net/wireless/ath/ath11k/debugfs.c @@ -178,7 +178,7 @@ static int ath11k_debugfs_fw_stats_request(struct ath11k *ar, * received 'update stats' event, we keep a 3 seconds timeout in case, * fw_stats_done is not marked yet */ - timeout = jiffies + msecs_to_jiffies(3 * 1000); + timeout = jiffies + secs_to_jiffies(3); ath11k_debugfs_fw_stats_reset(ar); -- GitLab From 784cb1c1b8c5d1e5f089e1760aa206c949636e51 Mon Sep 17 00:00:00 2001 From: Baochen Qiang Date: Thu, 20 Feb 2025 16:24:42 +0800 Subject: [PATCH 1128/2211] wifi: ath11k: avoid burning CPU in ath11k_debugfs_fw_stats_request() [ Upstream commit 9f6e82d11bb9692a90d20b10f87345598945c803 ] We get report [1] that CPU is running a hot loop in ath11k_debugfs_fw_stats_request(): 94.60% 0.00% i3status [kernel.kallsyms] [k] do_syscall_64 | --94.60%--do_syscall_64 | --94.55%--__sys_sendmsg ___sys_sendmsg ____sys_sendmsg netlink_sendmsg netlink_unicast genl_rcv netlink_rcv_skb genl_rcv_msg | --94.55%--genl_family_rcv_msg_dumpit __netlink_dump_start netlink_dump genl_dumpit nl80211_dump_station | --94.55%--ieee80211_dump_station sta_set_sinfo | --94.55%--ath11k_mac_op_sta_statistics ath11k_debugfs_get_fw_stats | --94.55%--ath11k_debugfs_fw_stats_request | |--41.73%--_raw_spin_lock_bh | |--22.74%--__local_bh_enable_ip | |--9.22%--_raw_spin_unlock_bh | --6.66%--srso_alias_safe_ret This is because, if for whatever reason ar->fw_stats_done is not set by ath11k_update_stats_event(), ath11k_debugfs_fw_stats_request() won't yield CPU before an up to 3s timeout. Change to completion mechanism to avoid CPU burning. Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.37 Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices") Reported-by: Yury Vostrikov Closes: https://lore.kernel.org/all/7324ac7a-8b7a-42a5-aa19-de52138ff638@app.fastmail.com/ # [1] Signed-off-by: Baochen Qiang Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250220082448.31039-2-quic_bqiang@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath11k/core.c | 1 + drivers/net/wireless/ath/ath11k/core.h | 2 +- drivers/net/wireless/ath/ath11k/debugfs.c | 38 +++++++++-------------- drivers/net/wireless/ath/ath11k/mac.c | 2 +- drivers/net/wireless/ath/ath11k/wmi.c | 2 +- 5 files changed, 18 insertions(+), 27 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c index 674c4763333f3..d08f40f77031a 100644 --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c @@ -855,6 +855,7 @@ void ath11k_fw_stats_init(struct ath11k *ar) INIT_LIST_HEAD(&ar->fw_stats.bcn); init_completion(&ar->fw_stats_complete); + init_completion(&ar->fw_stats_done); } void ath11k_fw_stats_free(struct ath11k_fw_stats *stats) diff --git a/drivers/net/wireless/ath/ath11k/core.h b/drivers/net/wireless/ath/ath11k/core.h index 09c37e19a1680..bbf2ccfee3fc0 100644 --- a/drivers/net/wireless/ath/ath11k/core.h +++ b/drivers/net/wireless/ath/ath11k/core.h @@ -780,7 +780,7 @@ struct ath11k { u8 alpha2[REG_ALPHA2_LEN + 1]; struct ath11k_fw_stats fw_stats; struct completion fw_stats_complete; - bool fw_stats_done; + struct completion fw_stats_done; /* protected by conf_mutex */ bool ps_state_enable; diff --git a/drivers/net/wireless/ath/ath11k/debugfs.c b/drivers/net/wireless/ath/ath11k/debugfs.c index bf192529e3fe2..1d03e3aab011d 100644 --- a/drivers/net/wireless/ath/ath11k/debugfs.c +++ b/drivers/net/wireless/ath/ath11k/debugfs.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear /* * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -96,7 +96,6 @@ void ath11k_debugfs_add_dbring_entry(struct ath11k *ar, static void ath11k_debugfs_fw_stats_reset(struct ath11k *ar) { spin_lock_bh(&ar->data_lock); - ar->fw_stats_done = false; ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs); ath11k_fw_stats_vdevs_free(&ar->fw_stats.vdevs); spin_unlock_bh(&ar->data_lock); @@ -114,7 +113,7 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * /* WMI_REQUEST_PDEV_STAT request has been already processed */ if (stats->stats_id == WMI_REQUEST_RSSI_PER_CHAIN_STAT) { - ar->fw_stats_done = true; + complete(&ar->fw_stats_done); return; } @@ -138,7 +137,7 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * &ar->fw_stats.vdevs); if (is_end) { - ar->fw_stats_done = true; + complete(&ar->fw_stats_done); num_vdev = 0; } return; @@ -158,7 +157,7 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * &ar->fw_stats.bcn); if (is_end) { - ar->fw_stats_done = true; + complete(&ar->fw_stats_done); num_bcn = 0; } } @@ -168,21 +167,15 @@ static int ath11k_debugfs_fw_stats_request(struct ath11k *ar, struct stats_request_params *req_param) { struct ath11k_base *ab = ar->ab; - unsigned long timeout, time_left; + unsigned long time_left; int ret; lockdep_assert_held(&ar->conf_mutex); - /* FW stats can get split when exceeding the stats data buffer limit. - * In that case, since there is no end marking for the back-to-back - * received 'update stats' event, we keep a 3 seconds timeout in case, - * fw_stats_done is not marked yet - */ - timeout = jiffies + secs_to_jiffies(3); - ath11k_debugfs_fw_stats_reset(ar); reinit_completion(&ar->fw_stats_complete); + reinit_completion(&ar->fw_stats_done); ret = ath11k_wmi_send_stats_request_cmd(ar, req_param); @@ -193,21 +186,18 @@ static int ath11k_debugfs_fw_stats_request(struct ath11k *ar, } time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ); - if (!time_left) return -ETIMEDOUT; - for (;;) { - if (time_after(jiffies, timeout)) - break; + /* FW stats can get split when exceeding the stats data buffer limit. + * In that case, since there is no end marking for the back-to-back + * received 'update stats' event, we keep a 3 seconds timeout in case, + * fw_stats_done is not marked yet + */ + time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ); + if (!time_left) + return -ETIMEDOUT; - spin_lock_bh(&ar->data_lock); - if (ar->fw_stats_done) { - spin_unlock_bh(&ar->data_lock); - break; - } - spin_unlock_bh(&ar->data_lock); - } return 0; } diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c index f8068d2e848c3..78c825244613b 100644 --- a/drivers/net/wireless/ath/ath11k/mac.c +++ b/drivers/net/wireless/ath/ath11k/mac.c @@ -9331,11 +9331,11 @@ static int ath11k_fw_stats_request(struct ath11k *ar, lockdep_assert_held(&ar->conf_mutex); spin_lock_bh(&ar->data_lock); - ar->fw_stats_done = false; ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs); spin_unlock_bh(&ar->data_lock); reinit_completion(&ar->fw_stats_complete); + reinit_completion(&ar->fw_stats_done); ret = ath11k_wmi_send_stats_request_cmd(ar, req_param); if (ret) { diff --git a/drivers/net/wireless/ath/ath11k/wmi.c b/drivers/net/wireless/ath/ath11k/wmi.c index 87abfa5475295..e2203f668d7cf 100644 --- a/drivers/net/wireless/ath/ath11k/wmi.c +++ b/drivers/net/wireless/ath/ath11k/wmi.c @@ -8188,7 +8188,7 @@ static void ath11k_update_stats_event(struct ath11k_base *ab, struct sk_buff *sk */ if (stats.stats_id == WMI_REQUEST_PDEV_STAT) { list_splice_tail_init(&stats.pdevs, &ar->fw_stats.pdevs); - ar->fw_stats_done = true; + complete(&ar->fw_stats_done); goto complete; } -- GitLab From b18918782eb67b2b763158ce940174e000834f62 Mon Sep 17 00:00:00 2001 From: Baochen Qiang Date: Thu, 20 Feb 2025 16:24:43 +0800 Subject: [PATCH 1129/2211] wifi: ath11k: don't use static variables in ath11k_debugfs_fw_stats_process() [ Upstream commit 2bcf73b2612dda7432f2c2eaad6679bd291791f2 ] Currently ath11k_debugfs_fw_stats_process() is using static variables to count firmware stat events. Taking num_vdev as an example, if for whatever reason ( say ar->num_started_vdevs is 0 or firmware bug etc.) the following condition (++num_vdev) == total_vdevs_started is not met, is_end is not set thus num_vdev won't be cleared. Next time when firmware stats is requested again, even if everything is working fine, we will fail due to the condition above will never be satisfied. The same applies to num_bcn as well. Change to use non-static counters so that we have a chance to clear them each time firmware stats is requested. Currently only ath11k_fw_stats_request() and ath11k_debugfs_fw_stats_request() are requesting firmware stats, so clear counters there. Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.37 Fixes: da3a9d3c1576 ("ath11k: refactor debugfs code into debugfs.c") Signed-off-by: Baochen Qiang Acked-by: Kalle Valo Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250220082448.31039-3-quic_bqiang@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath11k/core.h | 2 ++ drivers/net/wireless/ath/ath11k/debugfs.c | 16 +++++++--------- drivers/net/wireless/ath/ath11k/mac.c | 2 ++ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/core.h b/drivers/net/wireless/ath/ath11k/core.h index bbf2ccfee3fc0..fcdec14eb3cfa 100644 --- a/drivers/net/wireless/ath/ath11k/core.h +++ b/drivers/net/wireless/ath/ath11k/core.h @@ -599,6 +599,8 @@ struct ath11k_fw_stats { struct list_head pdevs; struct list_head vdevs; struct list_head bcn; + u32 num_vdev_recvd; + u32 num_bcn_recvd; }; struct ath11k_dbg_htt_stats { diff --git a/drivers/net/wireless/ath/ath11k/debugfs.c b/drivers/net/wireless/ath/ath11k/debugfs.c index 1d03e3aab011d..27c93c0b4c223 100644 --- a/drivers/net/wireless/ath/ath11k/debugfs.c +++ b/drivers/net/wireless/ath/ath11k/debugfs.c @@ -98,6 +98,8 @@ static void ath11k_debugfs_fw_stats_reset(struct ath11k *ar) spin_lock_bh(&ar->data_lock); ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs); ath11k_fw_stats_vdevs_free(&ar->fw_stats.vdevs); + ar->fw_stats.num_vdev_recvd = 0; + ar->fw_stats.num_bcn_recvd = 0; spin_unlock_bh(&ar->data_lock); } @@ -106,7 +108,6 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * struct ath11k_base *ab = ar->ab; struct ath11k_pdev *pdev; bool is_end; - static unsigned int num_vdev, num_bcn; size_t total_vdevs_started = 0; int i; @@ -131,15 +132,14 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * total_vdevs_started += ar->num_started_vdevs; } - is_end = ((++num_vdev) == total_vdevs_started); + is_end = ((++ar->fw_stats.num_vdev_recvd) == total_vdevs_started); list_splice_tail_init(&stats->vdevs, &ar->fw_stats.vdevs); - if (is_end) { + if (is_end) complete(&ar->fw_stats_done); - num_vdev = 0; - } + return; } @@ -151,15 +151,13 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * /* Mark end until we reached the count of all started VDEVs * within the PDEV */ - is_end = ((++num_bcn) == ar->num_started_vdevs); + is_end = ((++ar->fw_stats.num_bcn_recvd) == ar->num_started_vdevs); list_splice_tail_init(&stats->bcn, &ar->fw_stats.bcn); - if (is_end) { + if (is_end) complete(&ar->fw_stats_done); - num_bcn = 0; - } } } diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c index 78c825244613b..9159ee20a33b8 100644 --- a/drivers/net/wireless/ath/ath11k/mac.c +++ b/drivers/net/wireless/ath/ath11k/mac.c @@ -9332,6 +9332,8 @@ static int ath11k_fw_stats_request(struct ath11k *ar, spin_lock_bh(&ar->data_lock); ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs); + ar->fw_stats.num_vdev_recvd = 0; + ar->fw_stats.num_bcn_recvd = 0; spin_unlock_bh(&ar->data_lock); reinit_completion(&ar->fw_stats_complete); -- GitLab From d849e671fffa6a6a3e629a5193c6e1de9d280662 Mon Sep 17 00:00:00 2001 From: Baochen Qiang Date: Thu, 20 Feb 2025 16:24:44 +0800 Subject: [PATCH 1130/2211] wifi: ath11k: don't wait when there is no vdev started [ Upstream commit 3b6d00fa883075dcaf49221538230e038a9c0b43 ] For WMI_REQUEST_VDEV_STAT request, firmware might split response into multiple events dut to buffer limit, hence currently in ath11k_debugfs_fw_stats_process() we wait until all events received. In case there is no vdev started, this results in that below condition would never get satisfied ((++ar->fw_stats.num_vdev_recvd) == total_vdevs_started) finally the requestor would be blocked until wait time out. The same applies to WMI_REQUEST_BCN_STAT request as well due to: ((++ar->fw_stats.num_bcn_recvd) == ar->num_started_vdevs) Change to check the number of started vdev first: if it is zero, finish wait directly; if not, follow the old way. Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.37 Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices") Signed-off-by: Baochen Qiang Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250220082448.31039-4-quic_bqiang@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath11k/debugfs.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/debugfs.c b/drivers/net/wireless/ath/ath11k/debugfs.c index 27c93c0b4c223..ccf0e62c7d7ae 100644 --- a/drivers/net/wireless/ath/ath11k/debugfs.c +++ b/drivers/net/wireless/ath/ath11k/debugfs.c @@ -107,7 +107,7 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * { struct ath11k_base *ab = ar->ab; struct ath11k_pdev *pdev; - bool is_end; + bool is_end = true; size_t total_vdevs_started = 0; int i; @@ -132,7 +132,9 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * total_vdevs_started += ar->num_started_vdevs; } - is_end = ((++ar->fw_stats.num_vdev_recvd) == total_vdevs_started); + if (total_vdevs_started) + is_end = ((++ar->fw_stats.num_vdev_recvd) == + total_vdevs_started); list_splice_tail_init(&stats->vdevs, &ar->fw_stats.vdevs); @@ -151,7 +153,9 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * /* Mark end until we reached the count of all started VDEVs * within the PDEV */ - is_end = ((++ar->fw_stats.num_bcn_recvd) == ar->num_started_vdevs); + if (ar->num_started_vdevs) + is_end = ((++ar->fw_stats.num_bcn_recvd) == + ar->num_started_vdevs); list_splice_tail_init(&stats->bcn, &ar->fw_stats.bcn); -- GitLab From 7b1a7d35eef5df9f0998174397ebf9d9594eb14c Mon Sep 17 00:00:00 2001 From: Baochen Qiang Date: Thu, 20 Feb 2025 16:24:45 +0800 Subject: [PATCH 1131/2211] wifi: ath11k: move some firmware stats related functions outside of debugfs [ Upstream commit 72610ed7d79da17ee09102534d6c696a4ea8a08e ] Commit b488c766442f ("ath11k: report rssi of each chain to mac80211 for QCA6390/WCN6855") and commit c3b39553fc77 ("ath11k: add signal report to mac80211 for QCA6390 and WCN6855") call debugfs functions in mac ops. Those functions are no-ops if CONFIG_ATH11K_DEBUGFS is not enabled, thus cause wrong status reported. Move them to mac.c. Besides, since WMI_REQUEST_RSSI_PER_CHAIN_STAT and WMI_REQUEST_VDEV_STAT stats could also be requested via mac ops, process them directly in ath11k_update_stats_event(). Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.37 Fixes: b488c766442f ("ath11k: report rssi of each chain to mac80211 for QCA6390/WCN6855") Fixes: c3b39553fc77 ("ath11k: add signal report to mac80211 for QCA6390 and WCN6855") Signed-off-by: Baochen Qiang Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250220082448.31039-5-quic_bqiang@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath11k/debugfs.c | 126 ++-------------------- drivers/net/wireless/ath/ath11k/debugfs.h | 10 +- drivers/net/wireless/ath/ath11k/mac.c | 88 ++++++++++++++- drivers/net/wireless/ath/ath11k/mac.h | 4 +- drivers/net/wireless/ath/ath11k/wmi.c | 45 +++++++- 5 files changed, 135 insertions(+), 138 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/debugfs.c b/drivers/net/wireless/ath/ath11k/debugfs.c index ccf0e62c7d7ae..5d46f8e4c231f 100644 --- a/drivers/net/wireless/ath/ath11k/debugfs.c +++ b/drivers/net/wireless/ath/ath11k/debugfs.c @@ -93,58 +93,14 @@ void ath11k_debugfs_add_dbring_entry(struct ath11k *ar, spin_unlock_bh(&dbr_data->lock); } -static void ath11k_debugfs_fw_stats_reset(struct ath11k *ar) -{ - spin_lock_bh(&ar->data_lock); - ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs); - ath11k_fw_stats_vdevs_free(&ar->fw_stats.vdevs); - ar->fw_stats.num_vdev_recvd = 0; - ar->fw_stats.num_bcn_recvd = 0; - spin_unlock_bh(&ar->data_lock); -} - void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats *stats) { struct ath11k_base *ab = ar->ab; - struct ath11k_pdev *pdev; bool is_end = true; - size_t total_vdevs_started = 0; - int i; - - /* WMI_REQUEST_PDEV_STAT request has been already processed */ - - if (stats->stats_id == WMI_REQUEST_RSSI_PER_CHAIN_STAT) { - complete(&ar->fw_stats_done); - return; - } - - if (stats->stats_id == WMI_REQUEST_VDEV_STAT) { - if (list_empty(&stats->vdevs)) { - ath11k_warn(ab, "empty vdev stats"); - return; - } - /* FW sends all the active VDEV stats irrespective of PDEV, - * hence limit until the count of all VDEVs started - */ - for (i = 0; i < ab->num_radios; i++) { - pdev = rcu_dereference(ab->pdevs_active[i]); - if (pdev && pdev->ar) - total_vdevs_started += ar->num_started_vdevs; - } - - if (total_vdevs_started) - is_end = ((++ar->fw_stats.num_vdev_recvd) == - total_vdevs_started); - - list_splice_tail_init(&stats->vdevs, - &ar->fw_stats.vdevs); - - if (is_end) - complete(&ar->fw_stats_done); - - return; - } + /* WMI_REQUEST_PDEV_STAT, WMI_REQUEST_RSSI_PER_CHAIN_STAT and + * WMI_REQUEST_VDEV_STAT requests have been already processed. + */ if (stats->stats_id == WMI_REQUEST_BCN_STAT) { if (list_empty(&stats->bcn)) { ath11k_warn(ab, "empty bcn stats"); @@ -165,76 +121,6 @@ void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats * } } -static int ath11k_debugfs_fw_stats_request(struct ath11k *ar, - struct stats_request_params *req_param) -{ - struct ath11k_base *ab = ar->ab; - unsigned long time_left; - int ret; - - lockdep_assert_held(&ar->conf_mutex); - - ath11k_debugfs_fw_stats_reset(ar); - - reinit_completion(&ar->fw_stats_complete); - reinit_completion(&ar->fw_stats_done); - - ret = ath11k_wmi_send_stats_request_cmd(ar, req_param); - - if (ret) { - ath11k_warn(ab, "could not request fw stats (%d)\n", - ret); - return ret; - } - - time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ); - if (!time_left) - return -ETIMEDOUT; - - /* FW stats can get split when exceeding the stats data buffer limit. - * In that case, since there is no end marking for the back-to-back - * received 'update stats' event, we keep a 3 seconds timeout in case, - * fw_stats_done is not marked yet - */ - time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ); - if (!time_left) - return -ETIMEDOUT; - - return 0; -} - -int ath11k_debugfs_get_fw_stats(struct ath11k *ar, u32 pdev_id, - u32 vdev_id, u32 stats_id) -{ - struct ath11k_base *ab = ar->ab; - struct stats_request_params req_param; - int ret; - - mutex_lock(&ar->conf_mutex); - - if (ar->state != ATH11K_STATE_ON) { - ret = -ENETDOWN; - goto err_unlock; - } - - req_param.pdev_id = pdev_id; - req_param.vdev_id = vdev_id; - req_param.stats_id = stats_id; - - ret = ath11k_debugfs_fw_stats_request(ar, &req_param); - if (ret) - ath11k_warn(ab, "failed to request fw stats: %d\n", ret); - - ath11k_dbg(ab, ATH11K_DBG_WMI, - "debug get fw stat pdev id %d vdev id %d stats id 0x%x\n", - pdev_id, vdev_id, stats_id); - -err_unlock: - mutex_unlock(&ar->conf_mutex); - - return ret; -} - static int ath11k_open_pdev_stats(struct inode *inode, struct file *file) { struct ath11k *ar = inode->i_private; @@ -260,7 +146,7 @@ static int ath11k_open_pdev_stats(struct inode *inode, struct file *file) req_param.vdev_id = 0; req_param.stats_id = WMI_REQUEST_PDEV_STAT; - ret = ath11k_debugfs_fw_stats_request(ar, &req_param); + ret = ath11k_mac_fw_stats_request(ar, &req_param); if (ret) { ath11k_warn(ab, "failed to request fw pdev stats: %d\n", ret); goto err_free; @@ -331,7 +217,7 @@ static int ath11k_open_vdev_stats(struct inode *inode, struct file *file) req_param.vdev_id = 0; req_param.stats_id = WMI_REQUEST_VDEV_STAT; - ret = ath11k_debugfs_fw_stats_request(ar, &req_param); + ret = ath11k_mac_fw_stats_request(ar, &req_param); if (ret) { ath11k_warn(ar->ab, "failed to request fw vdev stats: %d\n", ret); goto err_free; @@ -407,7 +293,7 @@ static int ath11k_open_bcn_stats(struct inode *inode, struct file *file) continue; req_param.vdev_id = arvif->vdev_id; - ret = ath11k_debugfs_fw_stats_request(ar, &req_param); + ret = ath11k_mac_fw_stats_request(ar, &req_param); if (ret) { ath11k_warn(ar->ab, "failed to request fw bcn stats: %d\n", ret); goto err_free; diff --git a/drivers/net/wireless/ath/ath11k/debugfs.h b/drivers/net/wireless/ath/ath11k/debugfs.h index a39e458637b01..ed7fec177588f 100644 --- a/drivers/net/wireless/ath/ath11k/debugfs.h +++ b/drivers/net/wireless/ath/ath11k/debugfs.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause-Clear */ /* * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022, 2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _ATH11K_DEBUGFS_H_ @@ -273,8 +273,6 @@ void ath11k_debugfs_unregister(struct ath11k *ar); void ath11k_debugfs_fw_stats_process(struct ath11k *ar, struct ath11k_fw_stats *stats); void ath11k_debugfs_fw_stats_init(struct ath11k *ar); -int ath11k_debugfs_get_fw_stats(struct ath11k *ar, u32 pdev_id, - u32 vdev_id, u32 stats_id); static inline bool ath11k_debugfs_is_pktlog_lite_mode_enabled(struct ath11k *ar) { @@ -381,12 +379,6 @@ static inline int ath11k_debugfs_rx_filter(struct ath11k *ar) return 0; } -static inline int ath11k_debugfs_get_fw_stats(struct ath11k *ar, - u32 pdev_id, u32 vdev_id, u32 stats_id) -{ - return 0; -} - static inline void ath11k_debugfs_add_dbring_entry(struct ath11k *ar, enum wmi_direct_buffer_module id, diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c index 9159ee20a33b8..7ead581f5bfd1 100644 --- a/drivers/net/wireless/ath/ath11k/mac.c +++ b/drivers/net/wireless/ath/ath11k/mac.c @@ -8938,6 +8938,86 @@ static void ath11k_mac_put_chain_rssi(struct station_info *sinfo, } } +static void ath11k_mac_fw_stats_reset(struct ath11k *ar) +{ + spin_lock_bh(&ar->data_lock); + ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs); + ath11k_fw_stats_vdevs_free(&ar->fw_stats.vdevs); + ar->fw_stats.num_vdev_recvd = 0; + ar->fw_stats.num_bcn_recvd = 0; + spin_unlock_bh(&ar->data_lock); +} + +int ath11k_mac_fw_stats_request(struct ath11k *ar, + struct stats_request_params *req_param) +{ + struct ath11k_base *ab = ar->ab; + unsigned long time_left; + int ret; + + lockdep_assert_held(&ar->conf_mutex); + + ath11k_mac_fw_stats_reset(ar); + + reinit_completion(&ar->fw_stats_complete); + reinit_completion(&ar->fw_stats_done); + + ret = ath11k_wmi_send_stats_request_cmd(ar, req_param); + + if (ret) { + ath11k_warn(ab, "could not request fw stats (%d)\n", + ret); + return ret; + } + + time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ); + if (!time_left) + return -ETIMEDOUT; + + /* FW stats can get split when exceeding the stats data buffer limit. + * In that case, since there is no end marking for the back-to-back + * received 'update stats' event, we keep a 3 seconds timeout in case, + * fw_stats_done is not marked yet + */ + time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ); + if (!time_left) + return -ETIMEDOUT; + + return 0; +} + +static int ath11k_mac_get_fw_stats(struct ath11k *ar, u32 pdev_id, + u32 vdev_id, u32 stats_id) +{ + struct ath11k_base *ab = ar->ab; + struct stats_request_params req_param; + int ret; + + mutex_lock(&ar->conf_mutex); + + if (ar->state != ATH11K_STATE_ON) { + ret = -ENETDOWN; + goto err_unlock; + } + + req_param.pdev_id = pdev_id; + req_param.vdev_id = vdev_id; + req_param.stats_id = stats_id; + + ret = ath11k_mac_fw_stats_request(ar, &req_param); + if (ret) + ath11k_warn(ab, "failed to request fw stats: %d\n", ret); + + ath11k_dbg(ab, ATH11K_DBG_WMI, + "debug get fw stat pdev id %d vdev id %d stats id 0x%x\n", + pdev_id, vdev_id, stats_id); + +err_unlock: + mutex_unlock(&ar->conf_mutex); + + return ret; +} + static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_sta *sta, @@ -8975,8 +9055,8 @@ static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw, if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) && arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA && ar->ab->hw_params.supports_rssi_stats && - !ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0, - WMI_REQUEST_RSSI_PER_CHAIN_STAT)) { + !ath11k_mac_get_fw_stats(ar, ar->pdev->pdev_id, 0, + WMI_REQUEST_RSSI_PER_CHAIN_STAT)) { ath11k_mac_put_chain_rssi(sinfo, arsta, "fw stats", true); } @@ -8984,8 +9064,8 @@ static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw, if (!signal && arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA && ar->ab->hw_params.supports_rssi_stats && - !(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0, - WMI_REQUEST_VDEV_STAT))) + !(ath11k_mac_get_fw_stats(ar, ar->pdev->pdev_id, 0, + WMI_REQUEST_VDEV_STAT))) signal = arsta->rssi_beacon; ath11k_dbg(ar->ab, ATH11K_DBG_MAC, diff --git a/drivers/net/wireless/ath/ath11k/mac.h b/drivers/net/wireless/ath/ath11k/mac.h index f5800fbecff89..5e61eea1bb037 100644 --- a/drivers/net/wireless/ath/ath11k/mac.h +++ b/drivers/net/wireless/ath/ath11k/mac.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause-Clear */ /* * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023, 2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef ATH11K_MAC_H @@ -179,4 +179,6 @@ int ath11k_mac_vif_set_keepalive(struct ath11k_vif *arvif, void ath11k_mac_fill_reg_tpc_info(struct ath11k *ar, struct ieee80211_vif *vif, struct ieee80211_chanctx_conf *ctx); +int ath11k_mac_fw_stats_request(struct ath11k *ar, + struct stats_request_params *req_param); #endif diff --git a/drivers/net/wireless/ath/ath11k/wmi.c b/drivers/net/wireless/ath/ath11k/wmi.c index e2203f668d7cf..5f7edf622de7a 100644 --- a/drivers/net/wireless/ath/ath11k/wmi.c +++ b/drivers/net/wireless/ath/ath11k/wmi.c @@ -8157,6 +8157,11 @@ static void ath11k_peer_assoc_conf_event(struct ath11k_base *ab, struct sk_buff static void ath11k_update_stats_event(struct ath11k_base *ab, struct sk_buff *skb) { struct ath11k_fw_stats stats = {}; + size_t total_vdevs_started = 0; + struct ath11k_pdev *pdev; + bool is_end = true; + int i; + struct ath11k *ar; int ret; @@ -8183,7 +8188,8 @@ static void ath11k_update_stats_event(struct ath11k_base *ab, struct sk_buff *sk spin_lock_bh(&ar->data_lock); - /* WMI_REQUEST_PDEV_STAT can be requested via .get_txpower mac ops or via + /* WMI_REQUEST_PDEV_STAT, WMI_REQUEST_VDEV_STAT and + * WMI_REQUEST_RSSI_PER_CHAIN_STAT can be requested via mac ops or via * debugfs fw stats. Therefore, processing it separately. */ if (stats.stats_id == WMI_REQUEST_PDEV_STAT) { @@ -8192,9 +8198,40 @@ static void ath11k_update_stats_event(struct ath11k_base *ab, struct sk_buff *sk goto complete; } - /* WMI_REQUEST_VDEV_STAT, WMI_REQUEST_BCN_STAT and WMI_REQUEST_RSSI_PER_CHAIN_STAT - * are currently requested only via debugfs fw stats. Hence, processing these - * in debugfs context + if (stats.stats_id == WMI_REQUEST_RSSI_PER_CHAIN_STAT) { + complete(&ar->fw_stats_done); + goto complete; + } + + if (stats.stats_id == WMI_REQUEST_VDEV_STAT) { + if (list_empty(&stats.vdevs)) { + ath11k_warn(ab, "empty vdev stats"); + goto complete; + } + /* FW sends all the active VDEV stats irrespective of PDEV, + * hence limit until the count of all VDEVs started + */ + for (i = 0; i < ab->num_radios; i++) { + pdev = rcu_dereference(ab->pdevs_active[i]); + if (pdev && pdev->ar) + total_vdevs_started += ar->num_started_vdevs; + } + + if (total_vdevs_started) + is_end = ((++ar->fw_stats.num_vdev_recvd) == + total_vdevs_started); + + list_splice_tail_init(&stats.vdevs, + &ar->fw_stats.vdevs); + + if (is_end) + complete(&ar->fw_stats_done); + + goto complete; + } + + /* WMI_REQUEST_BCN_STAT is currently requested only via debugfs fw stats. + * Hence, processing it in debugfs context */ ath11k_debugfs_fw_stats_process(ar, &stats); -- GitLab From 6dabf9e054976648270234651412e1bf85932705 Mon Sep 17 00:00:00 2001 From: Rodrigo Gobbi Date: Thu, 22 May 2025 17:01:12 -0300 Subject: [PATCH 1132/2211] wifi: ath11k: validate ath11k_crypto_mode on top of ath11k_core_qmi_firmware_ready [ Upstream commit b0d226a60856a1b765bb9a3848c7b2322fd08c47 ] if ath11k_crypto_mode is invalid (not ATH11K_CRYPT_MODE_SW/ATH11K_CRYPT_MODE_HW), ath11k_core_qmi_firmware_ready() will not undo some actions that was previously started/configured. Do the validation as soon as possible in order to avoid undoing actions in that case and also to fix the following smatch warning: drivers/net/wireless/ath/ath11k/core.c:2166 ath11k_core_qmi_firmware_ready() warn: missing unwind goto? Signed-off-by: Rodrigo Gobbi Reported-by: kernel test robot Reported-by: Dan Carpenter Closes: https://lore.kernel.org/r/202304151955.oqAetVFd-lkp@intel.com/ Fixes: aa2092a9bab3 ("ath11k: add raw mode and software crypto support") Reviewed-by: Baochen Qiang Link: https://patch.msgid.link/20250522200519.16858-1-rodrigo.gobbi.7@gmail.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath11k/core.c | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c index d08f40f77031a..8002fb32a2cc1 100644 --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c @@ -1812,6 +1812,20 @@ int ath11k_core_qmi_firmware_ready(struct ath11k_base *ab) { int ret; + switch (ath11k_crypto_mode) { + case ATH11K_CRYPT_MODE_SW: + set_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags); + set_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags); + break; + case ATH11K_CRYPT_MODE_HW: + clear_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags); + clear_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags); + break; + default: + ath11k_info(ab, "invalid crypto_mode: %d\n", ath11k_crypto_mode); + return -EINVAL; + } + ret = ath11k_core_start_firmware(ab, ab->fw_mode); if (ret) { ath11k_err(ab, "failed to start firmware: %d\n", ret); @@ -1830,20 +1844,6 @@ int ath11k_core_qmi_firmware_ready(struct ath11k_base *ab) goto err_firmware_stop; } - switch (ath11k_crypto_mode) { - case ATH11K_CRYPT_MODE_SW: - set_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags); - set_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags); - break; - case ATH11K_CRYPT_MODE_HW: - clear_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags); - clear_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags); - break; - default: - ath11k_info(ab, "invalid crypto_mode: %d\n", ath11k_crypto_mode); - return -EINVAL; - } - if (ath11k_frame_mode == ATH11K_HW_TXRX_RAW) set_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags); -- GitLab From 4c0153d7a19d24077fdb7297dc8b521b762481de Mon Sep 17 00:00:00 2001 From: P Praneesh Date: Fri, 21 Mar 2025 16:22:40 +0530 Subject: [PATCH 1133/2211] wifi: ath12k: refactor ath12k_hw_regs structure [ Upstream commit 5257324583e32fd5bd6bbb6c82b4f5880b842f99 ] IPQ5332 device have different register address values for the below registers: HAL_TCL1_RING_BASE_LSB HAL_TCL1_RING_BASE_MSB HAL_TCL2_RING_BASE_LSB HAL_SEQ_WCSS_UMAC_CE0_SRC_REG HAL_SEQ_WCSS_UMAC_CE0_DST_REG HAL_SEQ_WCSS_UMAC_CE1_SRC_REG HAL_SEQ_WCSS_UMAC_CE1_DST_REG Hence, refactor ath12k_hw_regs structure to accommodate these changes in IPQ5332. Tested-on: IPQ5332 hw1.0 AHB WLAN.WBE.1.3.1-00130-QCAHKSWPL_SILICONZ-1 Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.1.1-00210-QCAHKSWPL_SILICONZ-1 Signed-off-by: P Praneesh Co-developed-by: Balamurugan S Signed-off-by: Balamurugan S Reviewed-by: Vasanthakumar Thiagarajan Signed-off-by: Raj Kumar Bhagat Link: https://patch.msgid.link/20250321-ath12k-ahb-v12-3-bb389ed76ae5@quicinc.com Signed-off-by: Jeff Johnson Stable-dep-of: 7588a893cde5 ("wifi: ath12k: fix GCC_GCC_PCIE_HOT_RST definition for WCN7850") Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/hal.c | 84 +++++++++++++-------------- drivers/net/wireless/ath/ath12k/hal.h | 63 +++++++++++--------- drivers/net/wireless/ath/ath12k/hw.c | 29 ++++++++- drivers/net/wireless/ath/ath12k/hw.h | 10 +++- 4 files changed, 114 insertions(+), 72 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/hal.c b/drivers/net/wireless/ath/ath12k/hal.c index 2e3fce70386f8..bfa404997710e 100644 --- a/drivers/net/wireless/ath/ath12k/hal.c +++ b/drivers/net/wireless/ath/ath12k/hal.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear /* * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #include #include "hal_tx.h" @@ -547,9 +547,9 @@ static int ath12k_hal_srng_create_config_qcn9274(struct ath12k_base *ab) s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_STATUS_HP; s = &hal->srng_config[HAL_TCL_DATA]; - s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_BASE_LSB; + s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_BASE_LSB(ab); s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_HP; - s->reg_size[0] = HAL_TCL2_RING_BASE_LSB - HAL_TCL1_RING_BASE_LSB; + s->reg_size[0] = HAL_TCL2_RING_BASE_LSB(ab) - HAL_TCL1_RING_BASE_LSB(ab); s->reg_size[1] = HAL_TCL2_RING_HP - HAL_TCL1_RING_HP; s = &hal->srng_config[HAL_TCL_CMD]; @@ -561,29 +561,29 @@ static int ath12k_hal_srng_create_config_qcn9274(struct ath12k_base *ab) s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_HP; s = &hal->srng_config[HAL_CE_SRC]; - s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG + HAL_CE_DST_RING_BASE_LSB; - s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG + HAL_CE_DST_RING_HP; - s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG - - HAL_SEQ_WCSS_UMAC_CE0_SRC_REG; - s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG - - HAL_SEQ_WCSS_UMAC_CE0_SRC_REG; + s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_BASE_LSB; + s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_HP; + s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab); + s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab); s = &hal->srng_config[HAL_CE_DST]; - s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_RING_BASE_LSB; - s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_RING_HP; - s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG - - HAL_SEQ_WCSS_UMAC_CE0_DST_REG; - s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG - - HAL_SEQ_WCSS_UMAC_CE0_DST_REG; + s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_BASE_LSB; + s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_HP; + s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); + s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); s = &hal->srng_config[HAL_CE_DST_STATUS]; - s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + + s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_STATUS_RING_BASE_LSB; - s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_STATUS_RING_HP; - s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG - - HAL_SEQ_WCSS_UMAC_CE0_DST_REG; - s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG - - HAL_SEQ_WCSS_UMAC_CE0_DST_REG; + s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_STATUS_RING_HP; + s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); + s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); s = &hal->srng_config[HAL_WBM_IDLE_LINK]; s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_IDLE_LINK_RING_BASE_LSB(ab); @@ -1353,9 +1353,9 @@ static int ath12k_hal_srng_create_config_wcn7850(struct ath12k_base *ab) s = &hal->srng_config[HAL_TCL_DATA]; s->max_rings = 5; - s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_BASE_LSB; + s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_BASE_LSB(ab); s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_HP; - s->reg_size[0] = HAL_TCL2_RING_BASE_LSB - HAL_TCL1_RING_BASE_LSB; + s->reg_size[0] = HAL_TCL2_RING_BASE_LSB(ab) - HAL_TCL1_RING_BASE_LSB(ab); s->reg_size[1] = HAL_TCL2_RING_HP - HAL_TCL1_RING_HP; s = &hal->srng_config[HAL_TCL_CMD]; @@ -1368,31 +1368,31 @@ static int ath12k_hal_srng_create_config_wcn7850(struct ath12k_base *ab) s = &hal->srng_config[HAL_CE_SRC]; s->max_rings = 12; - s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG + HAL_CE_DST_RING_BASE_LSB; - s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG + HAL_CE_DST_RING_HP; - s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG - - HAL_SEQ_WCSS_UMAC_CE0_SRC_REG; - s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG - - HAL_SEQ_WCSS_UMAC_CE0_SRC_REG; + s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_BASE_LSB; + s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_HP; + s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab); + s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab); s = &hal->srng_config[HAL_CE_DST]; s->max_rings = 12; - s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_RING_BASE_LSB; - s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_RING_HP; - s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG - - HAL_SEQ_WCSS_UMAC_CE0_DST_REG; - s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG - - HAL_SEQ_WCSS_UMAC_CE0_DST_REG; + s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_BASE_LSB; + s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_HP; + s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); + s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); s = &hal->srng_config[HAL_CE_DST_STATUS]; s->max_rings = 12; - s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + + s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_STATUS_RING_BASE_LSB; - s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_STATUS_RING_HP; - s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG - - HAL_SEQ_WCSS_UMAC_CE0_DST_REG; - s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG - - HAL_SEQ_WCSS_UMAC_CE0_DST_REG; + s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_STATUS_RING_HP; + s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); + s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); s = &hal->srng_config[HAL_WBM_IDLE_LINK]; s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_IDLE_LINK_RING_BASE_LSB(ab); @@ -1737,7 +1737,7 @@ static void ath12k_hal_srng_src_hw_init(struct ath12k_base *ab, HAL_TCL1_RING_BASE_MSB_RING_BASE_ADDR_MSB) | u32_encode_bits((srng->entry_size * srng->num_entries), HAL_TCL1_RING_BASE_MSB_RING_SIZE); - ath12k_hif_write32(ab, reg_base + HAL_TCL1_RING_BASE_MSB_OFFSET, val); + ath12k_hif_write32(ab, reg_base + HAL_TCL1_RING_BASE_MSB_OFFSET(ab), val); val = u32_encode_bits(srng->entry_size, HAL_REO1_RING_ID_ENTRY_SIZE); ath12k_hif_write32(ab, reg_base + HAL_TCL1_RING_ID_OFFSET(ab), val); diff --git a/drivers/net/wireless/ath/ath12k/hal.h b/drivers/net/wireless/ath/ath12k/hal.h index 1fdd573532b93..fb7ec6fce07d3 100644 --- a/drivers/net/wireless/ath/ath12k/hal.h +++ b/drivers/net/wireless/ath/ath12k/hal.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause-Clear */ /* * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef ATH12K_HAL_H @@ -44,10 +44,14 @@ struct ath12k_base; #define HAL_SEQ_WCSS_UMAC_OFFSET 0x00a00000 #define HAL_SEQ_WCSS_UMAC_REO_REG 0x00a38000 #define HAL_SEQ_WCSS_UMAC_TCL_REG 0x00a44000 -#define HAL_SEQ_WCSS_UMAC_CE0_SRC_REG 0x01b80000 -#define HAL_SEQ_WCSS_UMAC_CE0_DST_REG 0x01b81000 -#define HAL_SEQ_WCSS_UMAC_CE1_SRC_REG 0x01b82000 -#define HAL_SEQ_WCSS_UMAC_CE1_DST_REG 0x01b83000 +#define HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) \ + ((ab)->hw_params->regs->hal_umac_ce0_src_reg_base) +#define HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) \ + ((ab)->hw_params->regs->hal_umac_ce0_dest_reg_base) +#define HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) \ + ((ab)->hw_params->regs->hal_umac_ce1_src_reg_base) +#define HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) \ + ((ab)->hw_params->regs->hal_umac_ce1_dest_reg_base) #define HAL_SEQ_WCSS_UMAC_WBM_REG 0x00a34000 #define HAL_CE_WFSS_CE_REG_BASE 0x01b80000 @@ -57,8 +61,10 @@ struct ath12k_base; /* SW2TCL(x) R0 ring configuration address */ #define HAL_TCL1_RING_CMN_CTRL_REG 0x00000020 #define HAL_TCL1_RING_DSCP_TID_MAP 0x00000240 -#define HAL_TCL1_RING_BASE_LSB 0x00000900 -#define HAL_TCL1_RING_BASE_MSB 0x00000904 +#define HAL_TCL1_RING_BASE_LSB(ab) \ + ((ab)->hw_params->regs->hal_tcl1_ring_base_lsb) +#define HAL_TCL1_RING_BASE_MSB(ab) \ + ((ab)->hw_params->regs->hal_tcl1_ring_base_msb) #define HAL_TCL1_RING_ID(ab) ((ab)->hw_params->regs->hal_tcl1_ring_id) #define HAL_TCL1_RING_MISC(ab) \ ((ab)->hw_params->regs->hal_tcl1_ring_misc) @@ -76,30 +82,31 @@ struct ath12k_base; ((ab)->hw_params->regs->hal_tcl1_ring_msi1_base_msb) #define HAL_TCL1_RING_MSI1_DATA(ab) \ ((ab)->hw_params->regs->hal_tcl1_ring_msi1_data) -#define HAL_TCL2_RING_BASE_LSB 0x00000978 +#define HAL_TCL2_RING_BASE_LSB(ab) \ + ((ab)->hw_params->regs->hal_tcl2_ring_base_lsb) #define HAL_TCL_RING_BASE_LSB(ab) \ ((ab)->hw_params->regs->hal_tcl_ring_base_lsb) -#define HAL_TCL1_RING_MSI1_BASE_LSB_OFFSET(ab) \ - (HAL_TCL1_RING_MSI1_BASE_LSB(ab) - HAL_TCL1_RING_BASE_LSB) -#define HAL_TCL1_RING_MSI1_BASE_MSB_OFFSET(ab) \ - (HAL_TCL1_RING_MSI1_BASE_MSB(ab) - HAL_TCL1_RING_BASE_LSB) -#define HAL_TCL1_RING_MSI1_DATA_OFFSET(ab) \ - (HAL_TCL1_RING_MSI1_DATA(ab) - HAL_TCL1_RING_BASE_LSB) -#define HAL_TCL1_RING_BASE_MSB_OFFSET \ - (HAL_TCL1_RING_BASE_MSB - HAL_TCL1_RING_BASE_LSB) -#define HAL_TCL1_RING_ID_OFFSET(ab) \ - (HAL_TCL1_RING_ID(ab) - HAL_TCL1_RING_BASE_LSB) -#define HAL_TCL1_RING_CONSR_INT_SETUP_IX0_OFFSET(ab) \ - (HAL_TCL1_RING_CONSUMER_INT_SETUP_IX0(ab) - HAL_TCL1_RING_BASE_LSB) -#define HAL_TCL1_RING_CONSR_INT_SETUP_IX1_OFFSET(ab) \ - (HAL_TCL1_RING_CONSUMER_INT_SETUP_IX1(ab) - HAL_TCL1_RING_BASE_LSB) -#define HAL_TCL1_RING_TP_ADDR_LSB_OFFSET(ab) \ - (HAL_TCL1_RING_TP_ADDR_LSB(ab) - HAL_TCL1_RING_BASE_LSB) -#define HAL_TCL1_RING_TP_ADDR_MSB_OFFSET(ab) \ - (HAL_TCL1_RING_TP_ADDR_MSB(ab) - HAL_TCL1_RING_BASE_LSB) -#define HAL_TCL1_RING_MISC_OFFSET(ab) \ - (HAL_TCL1_RING_MISC(ab) - HAL_TCL1_RING_BASE_LSB) +#define HAL_TCL1_RING_MSI1_BASE_LSB_OFFSET(ab) ({ typeof(ab) _ab = (ab); \ + (HAL_TCL1_RING_MSI1_BASE_LSB(_ab) - HAL_TCL1_RING_BASE_LSB(_ab)); }) +#define HAL_TCL1_RING_MSI1_BASE_MSB_OFFSET(ab) ({ typeof(ab) _ab = (ab); \ + (HAL_TCL1_RING_MSI1_BASE_MSB(_ab) - HAL_TCL1_RING_BASE_LSB(_ab)); }) +#define HAL_TCL1_RING_MSI1_DATA_OFFSET(ab) ({ typeof(ab) _ab = (ab); \ + (HAL_TCL1_RING_MSI1_DATA(_ab) - HAL_TCL1_RING_BASE_LSB(_ab)); }) +#define HAL_TCL1_RING_BASE_MSB_OFFSET(ab) ({ typeof(ab) _ab = (ab); \ + (HAL_TCL1_RING_BASE_MSB(_ab) - HAL_TCL1_RING_BASE_LSB(_ab)); }) +#define HAL_TCL1_RING_ID_OFFSET(ab) ({ typeof(ab) _ab = (ab); \ + (HAL_TCL1_RING_ID(_ab) - HAL_TCL1_RING_BASE_LSB(_ab)); }) +#define HAL_TCL1_RING_CONSR_INT_SETUP_IX0_OFFSET(ab) ({ typeof(ab) _ab = (ab); \ + (HAL_TCL1_RING_CONSUMER_INT_SETUP_IX0(_ab) - HAL_TCL1_RING_BASE_LSB(_ab)); }) +#define HAL_TCL1_RING_CONSR_INT_SETUP_IX1_OFFSET(ab) ({ typeof(ab) _ab = (ab); \ + (HAL_TCL1_RING_CONSUMER_INT_SETUP_IX1(_ab) - HAL_TCL1_RING_BASE_LSB(_ab)); }) +#define HAL_TCL1_RING_TP_ADDR_LSB_OFFSET(ab) ({ typeof(ab) _ab = (ab); \ + (HAL_TCL1_RING_TP_ADDR_LSB(_ab) - HAL_TCL1_RING_BASE_LSB(_ab)); }) +#define HAL_TCL1_RING_TP_ADDR_MSB_OFFSET(ab) ({ typeof(ab) _ab = (ab); \ + (HAL_TCL1_RING_TP_ADDR_MSB(_ab) - HAL_TCL1_RING_BASE_LSB(_ab)); }) +#define HAL_TCL1_RING_MISC_OFFSET(ab) ({ typeof(ab) _ab = (ab); \ + (HAL_TCL1_RING_MISC(_ab) - HAL_TCL1_RING_BASE_LSB(_ab)); }) /* SW2TCL(x) R2 ring pointers (head/tail) address */ #define HAL_TCL1_RING_HP 0x00002000 diff --git a/drivers/net/wireless/ath/ath12k/hw.c b/drivers/net/wireless/ath/ath12k/hw.c index ec1bda95e555d..5bffc428f19f5 100644 --- a/drivers/net/wireless/ath/ath12k/hw.c +++ b/drivers/net/wireless/ath/ath12k/hw.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear /* * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -615,6 +615,9 @@ static const struct ath12k_hw_regs qcn9274_v1_regs = { .hal_tcl1_ring_msi1_base_msb = 0x0000094c, .hal_tcl1_ring_msi1_data = 0x00000950, .hal_tcl_ring_base_lsb = 0x00000b58, + .hal_tcl1_ring_base_lsb = 0x00000900, + .hal_tcl1_ring_base_msb = 0x00000904, + .hal_tcl2_ring_base_lsb = 0x00000978, /* TCL STATUS ring address */ .hal_tcl_status_ring_base_lsb = 0x00000d38, @@ -677,6 +680,12 @@ static const struct ath12k_hw_regs qcn9274_v1_regs = { /* REO status ring address */ .hal_reo_status_ring_base = 0x00000a84, + + /* CE base address */ + .hal_umac_ce0_src_reg_base = 0x01b80000, + .hal_umac_ce0_dest_reg_base = 0x01b81000, + .hal_umac_ce1_src_reg_base = 0x01b82000, + .hal_umac_ce1_dest_reg_base = 0x01b83000, }; static const struct ath12k_hw_regs qcn9274_v2_regs = { @@ -691,6 +700,9 @@ static const struct ath12k_hw_regs qcn9274_v2_regs = { .hal_tcl1_ring_msi1_base_msb = 0x0000094c, .hal_tcl1_ring_msi1_data = 0x00000950, .hal_tcl_ring_base_lsb = 0x00000b58, + .hal_tcl1_ring_base_lsb = 0x00000900, + .hal_tcl1_ring_base_msb = 0x00000904, + .hal_tcl2_ring_base_lsb = 0x00000978, /* TCL STATUS ring address */ .hal_tcl_status_ring_base_lsb = 0x00000d38, @@ -757,6 +769,12 @@ static const struct ath12k_hw_regs qcn9274_v2_regs = { /* REO status ring address */ .hal_reo_status_ring_base = 0x00000aa0, + + /* CE base address */ + .hal_umac_ce0_src_reg_base = 0x01b80000, + .hal_umac_ce0_dest_reg_base = 0x01b81000, + .hal_umac_ce1_src_reg_base = 0x01b82000, + .hal_umac_ce1_dest_reg_base = 0x01b83000, }; static const struct ath12k_hw_regs wcn7850_regs = { @@ -771,6 +789,9 @@ static const struct ath12k_hw_regs wcn7850_regs = { .hal_tcl1_ring_msi1_base_msb = 0x0000094c, .hal_tcl1_ring_msi1_data = 0x00000950, .hal_tcl_ring_base_lsb = 0x00000b58, + .hal_tcl1_ring_base_lsb = 0x00000900, + .hal_tcl1_ring_base_msb = 0x00000904, + .hal_tcl2_ring_base_lsb = 0x00000978, /* TCL STATUS ring address */ .hal_tcl_status_ring_base_lsb = 0x00000d38, @@ -833,6 +854,12 @@ static const struct ath12k_hw_regs wcn7850_regs = { /* REO status ring address */ .hal_reo_status_ring_base = 0x00000a84, + + /* CE base address */ + .hal_umac_ce0_src_reg_base = 0x01b80000, + .hal_umac_ce0_dest_reg_base = 0x01b81000, + .hal_umac_ce1_src_reg_base = 0x01b82000, + .hal_umac_ce1_dest_reg_base = 0x01b83000, }; static const struct ath12k_hw_hal_params ath12k_hw_hal_params_qcn9274 = { diff --git a/drivers/net/wireless/ath/ath12k/hw.h b/drivers/net/wireless/ath/ath12k/hw.h index 8d52182e28aef..acb81b5798ac1 100644 --- a/drivers/net/wireless/ath/ath12k/hw.h +++ b/drivers/net/wireless/ath/ath12k/hw.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause-Clear */ /* * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef ATH12K_HW_H @@ -293,6 +293,9 @@ struct ath12k_hw_regs { u32 hal_tcl1_ring_msi1_base_msb; u32 hal_tcl1_ring_msi1_data; u32 hal_tcl_ring_base_lsb; + u32 hal_tcl1_ring_base_lsb; + u32 hal_tcl1_ring_base_msb; + u32 hal_tcl2_ring_base_lsb; u32 hal_tcl_status_ring_base_lsb; @@ -316,6 +319,11 @@ struct ath12k_hw_regs { u32 pcie_qserdes_sysclk_en_sel; u32 pcie_pcs_osc_dtct_config_base; + u32 hal_umac_ce0_src_reg_base; + u32 hal_umac_ce0_dest_reg_base; + u32 hal_umac_ce1_src_reg_base; + u32 hal_umac_ce1_dest_reg_base; + u32 hal_ppe_rel_ring_base; u32 hal_reo2_ring_base; -- GitLab From 569972c5bdb839b0eaf8aba6ce76ea0b78e2acf8 Mon Sep 17 00:00:00 2001 From: Baochen Qiang Date: Fri, 23 May 2025 10:23:05 +0800 Subject: [PATCH 1134/2211] wifi: ath12k: fix GCC_GCC_PCIE_HOT_RST definition for WCN7850 [ Upstream commit 7588a893cde5385ad308400ff167d29a29913b3a ] GCC_GCC_PCIE_HOT_RST is wrongly defined for WCN7850, causing kernel crash on some specific platforms. Since this register is divergent for WCN7850 and QCN9274, move it to register table to allow different definitions. Then correct the register address for WCN7850 to fix this issue. Note IPQ5332 is not affected as it is not PCIe based device. Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Signed-off-by: Baochen Qiang Reviewed-by: Vasanthakumar Thiagarajan Reported-by: Parth Pancholi Closes: https://lore.kernel.org/all/86899b2235a59c9134603beebe08f2bb0b244ea0.camel@gmail.com Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices") Tested-by: Parth Pancholi Link: https://patch.msgid.link/20250523-ath12k-wrong-global-reset-addr-v1-1-3b06eb556196@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/hw.c | 6 ++++++ drivers/net/wireless/ath/ath12k/hw.h | 2 ++ drivers/net/wireless/ath/ath12k/pci.c | 6 +++--- drivers/net/wireless/ath/ath12k/pci.h | 4 +++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/hw.c b/drivers/net/wireless/ath/ath12k/hw.c index 5bffc428f19f5..e3eb22bb9e1cb 100644 --- a/drivers/net/wireless/ath/ath12k/hw.c +++ b/drivers/net/wireless/ath/ath12k/hw.c @@ -686,6 +686,8 @@ static const struct ath12k_hw_regs qcn9274_v1_regs = { .hal_umac_ce0_dest_reg_base = 0x01b81000, .hal_umac_ce1_src_reg_base = 0x01b82000, .hal_umac_ce1_dest_reg_base = 0x01b83000, + + .gcc_gcc_pcie_hot_rst = 0x1e38338, }; static const struct ath12k_hw_regs qcn9274_v2_regs = { @@ -775,6 +777,8 @@ static const struct ath12k_hw_regs qcn9274_v2_regs = { .hal_umac_ce0_dest_reg_base = 0x01b81000, .hal_umac_ce1_src_reg_base = 0x01b82000, .hal_umac_ce1_dest_reg_base = 0x01b83000, + + .gcc_gcc_pcie_hot_rst = 0x1e38338, }; static const struct ath12k_hw_regs wcn7850_regs = { @@ -860,6 +864,8 @@ static const struct ath12k_hw_regs wcn7850_regs = { .hal_umac_ce0_dest_reg_base = 0x01b81000, .hal_umac_ce1_src_reg_base = 0x01b82000, .hal_umac_ce1_dest_reg_base = 0x01b83000, + + .gcc_gcc_pcie_hot_rst = 0x1e40304, }; static const struct ath12k_hw_hal_params ath12k_hw_hal_params_qcn9274 = { diff --git a/drivers/net/wireless/ath/ath12k/hw.h b/drivers/net/wireless/ath/ath12k/hw.h index acb81b5798ac1..862b11325a902 100644 --- a/drivers/net/wireless/ath/ath12k/hw.h +++ b/drivers/net/wireless/ath/ath12k/hw.h @@ -355,6 +355,8 @@ struct ath12k_hw_regs { u32 hal_reo_cmd_ring_base; u32 hal_reo_status_ring_base; + + u32 gcc_gcc_pcie_hot_rst; }; static inline const char *ath12k_bd_ie_type_str(enum ath12k_bd_ie_type type) diff --git a/drivers/net/wireless/ath/ath12k/pci.c b/drivers/net/wireless/ath/ath12k/pci.c index 1068cc07bc9f6..26f4b440c26d2 100644 --- a/drivers/net/wireless/ath/ath12k/pci.c +++ b/drivers/net/wireless/ath/ath12k/pci.c @@ -290,10 +290,10 @@ static void ath12k_pci_enable_ltssm(struct ath12k_base *ab) ath12k_dbg(ab, ATH12K_DBG_PCI, "pci ltssm 0x%x\n", val); - val = ath12k_pci_read32(ab, GCC_GCC_PCIE_HOT_RST); + val = ath12k_pci_read32(ab, GCC_GCC_PCIE_HOT_RST(ab)); val |= GCC_GCC_PCIE_HOT_RST_VAL; - ath12k_pci_write32(ab, GCC_GCC_PCIE_HOT_RST, val); - val = ath12k_pci_read32(ab, GCC_GCC_PCIE_HOT_RST); + ath12k_pci_write32(ab, GCC_GCC_PCIE_HOT_RST(ab), val); + val = ath12k_pci_read32(ab, GCC_GCC_PCIE_HOT_RST(ab)); ath12k_dbg(ab, ATH12K_DBG_PCI, "pci pcie_hot_rst 0x%x\n", val); diff --git a/drivers/net/wireless/ath/ath12k/pci.h b/drivers/net/wireless/ath/ath12k/pci.h index 31584a7ad80eb..9321674eef8b8 100644 --- a/drivers/net/wireless/ath/ath12k/pci.h +++ b/drivers/net/wireless/ath/ath12k/pci.h @@ -28,7 +28,9 @@ #define PCIE_PCIE_PARF_LTSSM 0x1e081b0 #define PARM_LTSSM_VALUE 0x111 -#define GCC_GCC_PCIE_HOT_RST 0x1e38338 +#define GCC_GCC_PCIE_HOT_RST(ab) \ + ((ab)->hw_params->regs->gcc_gcc_pcie_hot_rst) + #define GCC_GCC_PCIE_HOT_RST_VAL 0x10 #define PCIE_PCIE_INT_ALL_CLEAR 0x1e08228 -- GitLab From f74abf2cdd23b380d46ade4061980a4ed260eefd Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Tue, 27 May 2025 08:44:14 +0300 Subject: [PATCH 1135/2211] regulator: max20086: Fix refcount leak in max20086_parse_regulators_dt() [ Upstream commit 06118ae36855b7d3d22688298e74a766ccf0cb7a ] There is a missing call to of_node_put() if devm_kcalloc() fails. Fix this by changing the code to use cleanup.h magic to drop the refcount. Fixes: 6b0cd72757c6 ("regulator: max20086: fix invalid memory access") Signed-off-by: Dan Carpenter Link: https://patch.msgid.link/aDVRLqgJWMxYU03G@stanley.mountain Reviewed-by: Laurent Pinchart Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/regulator/max20086-regulator.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/regulator/max20086-regulator.c b/drivers/regulator/max20086-regulator.c index 198d45f8e8849..3d333b61fb18c 100644 --- a/drivers/regulator/max20086-regulator.c +++ b/drivers/regulator/max20086-regulator.c @@ -5,6 +5,7 @@ // Copyright (C) 2022 Laurent Pinchart // Copyright (C) 2018 Avnet, Inc. +#include #include #include #include @@ -133,11 +134,11 @@ static int max20086_regulators_register(struct max20086 *chip) static int max20086_parse_regulators_dt(struct max20086 *chip, bool *boot_on) { struct of_regulator_match *matches; - struct device_node *node; unsigned int i; int ret; - node = of_get_child_by_name(chip->dev->of_node, "regulators"); + struct device_node *node __free(device_node) = + of_get_child_by_name(chip->dev->of_node, "regulators"); if (!node) { dev_err(chip->dev, "regulators node not found\n"); return -ENODEV; @@ -153,7 +154,6 @@ static int max20086_parse_regulators_dt(struct max20086 *chip, bool *boot_on) ret = of_regulator_match(chip->dev, node, matches, chip->info->num_outputs); - of_node_put(node); if (ret < 0) { dev_err(chip->dev, "Failed to match regulators\n"); return -EINVAL; -- GitLab From 01a968b1c4219c6cc6a280836f0d61ba0f9ddc53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Fri, 6 Jun 2025 15:37:24 +0200 Subject: [PATCH 1136/2211] spi: omap2-mcspi: Disable multi mode when CS should be kept asserted after message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit a5bf5272295d3f058adeee025d2a0b6625f8ba7b ] When the last transfer of a SPI message has the cs_change flag, the CS is kept asserted after the message. Multi-mode can't respect this as CS is deasserted by the hardware at the end of the message. Disable multi-mode when not applicable to the current message. Fixes: d153ff4056cb ("spi: omap2-mcspi: Add support for MULTI-mode") Signed-off-by: Félix Piédallu Link: https://patch.msgid.link/20250606-cs_change_fix-v1-1-27191a98a2e5@non.se.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-omap2-mcspi.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c index 532b2e9c31d0d..05766b98de36f 100644 --- a/drivers/spi/spi-omap2-mcspi.c +++ b/drivers/spi/spi-omap2-mcspi.c @@ -1287,9 +1287,15 @@ static int omap2_mcspi_prepare_message(struct spi_controller *ctlr, mcspi->use_multi_mode = false; } - /* Check if transfer asks to change the CS status after the transfer */ - if (!tr->cs_change) - mcspi->use_multi_mode = false; + if (list_is_last(&tr->transfer_list, &msg->transfers)) { + /* Check if transfer asks to keep the CS status after the whole message */ + if (tr->cs_change) + mcspi->use_multi_mode = false; + } else { + /* Check if transfer asks to change the CS status after the transfer */ + if (!tr->cs_change) + mcspi->use_multi_mode = false; + } /* * If at least one message is not compatible, switch back to single mode -- GitLab From cce3ea5f48c6a9c0ff0e49320764ede305a8366f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Fri, 6 Jun 2025 15:37:25 +0200 Subject: [PATCH 1137/2211] spi: omap2-mcspi: Disable multi-mode when the previous message kept CS asserted MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 10c24e0d2f7cd2bc8a847cf750f01301ce67dbc8 ] When the last transfer of a SPI message has the cs_change flag, the CS is kept asserted after the message. The next message can't use multi-mode because the CS will be briefly deasserted before the first transfer. Remove the early exit of the list_for_each_entry because the last transfer actually needs to be always checked. Fixes: d153ff4056cb ("spi: omap2-mcspi: Add support for MULTI-mode") Signed-off-by: Félix Piédallu Link: https://patch.msgid.link/20250606-cs_change_fix-v1-2-27191a98a2e5@non.se.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-omap2-mcspi.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c index 05766b98de36f..4c5f12b76de6a 100644 --- a/drivers/spi/spi-omap2-mcspi.c +++ b/drivers/spi/spi-omap2-mcspi.c @@ -134,6 +134,7 @@ struct omap2_mcspi { size_t max_xfer_len; u32 ref_clk_hz; bool use_multi_mode; + bool last_msg_kept_cs; }; struct omap2_mcspi_cs { @@ -1269,6 +1270,10 @@ static int omap2_mcspi_prepare_message(struct spi_controller *ctlr, * multi-mode is applicable. */ mcspi->use_multi_mode = true; + + if (mcspi->last_msg_kept_cs) + mcspi->use_multi_mode = false; + list_for_each_entry(tr, &msg->transfers, transfer_list) { if (!tr->bits_per_word) bits_per_word = msg->spi->bits_per_word; @@ -1289,22 +1294,17 @@ static int omap2_mcspi_prepare_message(struct spi_controller *ctlr, if (list_is_last(&tr->transfer_list, &msg->transfers)) { /* Check if transfer asks to keep the CS status after the whole message */ - if (tr->cs_change) + if (tr->cs_change) { mcspi->use_multi_mode = false; + mcspi->last_msg_kept_cs = true; + } else { + mcspi->last_msg_kept_cs = false; + } } else { /* Check if transfer asks to change the CS status after the transfer */ if (!tr->cs_change) mcspi->use_multi_mode = false; } - - /* - * If at least one message is not compatible, switch back to single mode - * - * The bits_per_word of certain transfer can be different, but it will have no - * impact on the signal itself. - */ - if (!mcspi->use_multi_mode) - break; } omap2_mcspi_set_mode(ctlr); -- GitLab From 8a8380773f8538cc99d78bbfb73832ebda5da6e0 Mon Sep 17 00:00:00 2001 From: Wojciech Slenska Date: Fri, 23 May 2025 12:14:37 +0200 Subject: [PATCH 1138/2211] pinctrl: qcom: pinctrl-qcm2290: Add missing pins [ Upstream commit 315345610faee8a0568b522dba9e35067d1732ab ] Added the missing pins to the qcm2290_pins table. Signed-off-by: Wojciech Slenska Fixes: 48e049ef1238 ("pinctrl: qcom: Add QCM2290 pinctrl driver") Reviewed-by: Dmitry Baryshkov Link: https://lore.kernel.org/20250523101437.59092-1-wojciech.slenska@gmail.com Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/qcom/pinctrl-qcm2290.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/pinctrl/qcom/pinctrl-qcm2290.c b/drivers/pinctrl/qcom/pinctrl-qcm2290.c index f5c1c427b44e9..61b7c22e963c2 100644 --- a/drivers/pinctrl/qcom/pinctrl-qcm2290.c +++ b/drivers/pinctrl/qcom/pinctrl-qcm2290.c @@ -165,6 +165,10 @@ static const struct pinctrl_pin_desc qcm2290_pins[] = { PINCTRL_PIN(62, "GPIO_62"), PINCTRL_PIN(63, "GPIO_63"), PINCTRL_PIN(64, "GPIO_64"), + PINCTRL_PIN(65, "GPIO_65"), + PINCTRL_PIN(66, "GPIO_66"), + PINCTRL_PIN(67, "GPIO_67"), + PINCTRL_PIN(68, "GPIO_68"), PINCTRL_PIN(69, "GPIO_69"), PINCTRL_PIN(70, "GPIO_70"), PINCTRL_PIN(71, "GPIO_71"), @@ -179,12 +183,17 @@ static const struct pinctrl_pin_desc qcm2290_pins[] = { PINCTRL_PIN(80, "GPIO_80"), PINCTRL_PIN(81, "GPIO_81"), PINCTRL_PIN(82, "GPIO_82"), + PINCTRL_PIN(83, "GPIO_83"), + PINCTRL_PIN(84, "GPIO_84"), + PINCTRL_PIN(85, "GPIO_85"), PINCTRL_PIN(86, "GPIO_86"), PINCTRL_PIN(87, "GPIO_87"), PINCTRL_PIN(88, "GPIO_88"), PINCTRL_PIN(89, "GPIO_89"), PINCTRL_PIN(90, "GPIO_90"), PINCTRL_PIN(91, "GPIO_91"), + PINCTRL_PIN(92, "GPIO_92"), + PINCTRL_PIN(93, "GPIO_93"), PINCTRL_PIN(94, "GPIO_94"), PINCTRL_PIN(95, "GPIO_95"), PINCTRL_PIN(96, "GPIO_96"), -- GitLab From 98e46d77cd8be70eb191ffc2e6bc99fe13db766b Mon Sep 17 00:00:00 2001 From: Alok Tiwari Date: Fri, 30 May 2025 12:29:35 -0700 Subject: [PATCH 1139/2211] scsi: iscsi: Fix incorrect error path labels for flashnode operations [ Upstream commit 9b17621366d210ffee83262a8754086ebbde5e55 ] Correct the error handling goto labels used when host lookup fails in various flashnode-related event handlers: - iscsi_new_flashnode() - iscsi_del_flashnode() - iscsi_login_flashnode() - iscsi_logout_flashnode() - iscsi_logout_flashnode_sid() scsi_host_put() is not required when shost is NULL, so jumping to the correct label avoids unnecessary operations. These functions previously jumped to the wrong goto label (put_host), which did not match the intended cleanup logic. Use the correct exit labels (exit_new_fnode, exit_del_fnode, etc.) to ensure proper error handling. Also remove the unused put_host label under iscsi_new_flashnode() as it is no longer needed. No functional changes beyond accurate error path correction. Fixes: c6a4bb2ef596 ("[SCSI] scsi_transport_iscsi: Add flash node mgmt support") Signed-off-by: Alok Tiwari Link: https://lore.kernel.org/r/20250530193012.3312911-1-alok.a.tiwari@oracle.com Reviewed-by: Mike Christie Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/scsi_transport_iscsi.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 8274fe0ec7146..7a5bebf5b096c 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -3526,7 +3526,7 @@ static int iscsi_new_flashnode(struct iscsi_transport *transport, pr_err("%s could not find host no %u\n", __func__, ev->u.new_flashnode.host_no); err = -ENODEV; - goto put_host; + goto exit_new_fnode; } index = transport->new_flashnode(shost, data, len); @@ -3536,7 +3536,6 @@ static int iscsi_new_flashnode(struct iscsi_transport *transport, else err = -EIO; -put_host: scsi_host_put(shost); exit_new_fnode: @@ -3561,7 +3560,7 @@ static int iscsi_del_flashnode(struct iscsi_transport *transport, pr_err("%s could not find host no %u\n", __func__, ev->u.del_flashnode.host_no); err = -ENODEV; - goto put_host; + goto exit_del_fnode; } idx = ev->u.del_flashnode.flashnode_idx; @@ -3603,7 +3602,7 @@ static int iscsi_login_flashnode(struct iscsi_transport *transport, pr_err("%s could not find host no %u\n", __func__, ev->u.login_flashnode.host_no); err = -ENODEV; - goto put_host; + goto exit_login_fnode; } idx = ev->u.login_flashnode.flashnode_idx; @@ -3655,7 +3654,7 @@ static int iscsi_logout_flashnode(struct iscsi_transport *transport, pr_err("%s could not find host no %u\n", __func__, ev->u.logout_flashnode.host_no); err = -ENODEV; - goto put_host; + goto exit_logout_fnode; } idx = ev->u.logout_flashnode.flashnode_idx; @@ -3705,7 +3704,7 @@ static int iscsi_logout_flashnode_sid(struct iscsi_transport *transport, pr_err("%s could not find host no %u\n", __func__, ev->u.logout_flashnode.host_no); err = -ENODEV; - goto put_host; + goto exit_logout_sid; } session = iscsi_session_lookup(ev->u.logout_flashnode_sid.sid); -- GitLab From d1bc80da75c789f2f6830df89d91fb2f7a509943 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Fri, 6 Jun 2025 16:51:27 +0000 Subject: [PATCH 1140/2211] net_sched: sch_sfq: fix a potential crash on gso_skb handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 82ffbe7776d0ac084031f114167712269bf3d832 ] SFQ has an assumption of always being able to queue at least one packet. However, after the blamed commit, sch->q.len can be inflated by packets in sch->gso_skb, and an enqueue() on an empty SFQ qdisc can be followed by an immediate drop. Fix sfq_drop() to properly clear q->tail in this situation. Tested: ip netns add lb ip link add dev to-lb type veth peer name in-lb netns lb ethtool -K to-lb tso off # force qdisc to requeue gso_skb ip netns exec lb ethtool -K in-lb gro on # enable NAPI ip link set dev to-lb up ip -netns lb link set dev in-lb up ip addr add dev to-lb 192.168.20.1/24 ip -netns lb addr add dev in-lb 192.168.20.2/24 tc qdisc replace dev to-lb root sfq limit 100 ip netns exec lb netserver netperf -H 192.168.20.2 -l 100 & netperf -H 192.168.20.2 -l 100 & netperf -H 192.168.20.2 -l 100 & netperf -H 192.168.20.2 -l 100 & Fixes: a53851e2c321 ("net: sched: explicit locking in gso_cpu fallback") Reported-by: Marcus Wichelmann Closes: https://lore.kernel.org/netdev/9da42688-bfaa-4364-8797-e9271f3bdaef@hetzner-cloud.de/ Signed-off-by: Eric Dumazet Reviewed-by: Toke Høiland-Jørgensen Link: https://patch.msgid.link/20250606165127.3629486-1-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/sched/sch_sfq.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index 58b42dcf8f201..a903b3c468050 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c @@ -310,7 +310,10 @@ drop: /* It is difficult to believe, but ALL THE SLOTS HAVE LENGTH 1. */ x = q->tail->next; slot = &q->slots[x]; - q->tail->next = slot->next; + if (slot->next == x) + q->tail = NULL; /* no more active slots */ + else + q->tail->next = slot->next; q->ht[slot->hash] = SFQ_EMPTY_SLOT; goto drop; } -- GitLab From 9c340b56d60545e4a159e41523dd8b23f81d3261 Mon Sep 17 00:00:00 2001 From: "Ritesh Harjani (IBM)" Date: Tue, 10 Jun 2025 07:42:26 +0530 Subject: [PATCH 1141/2211] powerpc/powernv/memtrace: Fix out of bounds issue in memtrace mmap [ Upstream commit cd097df4596f3a1e9d75eb8520162de1eb8485b2 ] memtrace mmap issue has an out of bounds issue. This patch fixes the by checking that the requested mapping region size should stay within the allocated region size. Reported-by: Jonathan Greental Fixes: 08a022ad3dfa ("powerpc/powernv/memtrace: Allow mmaping trace buffers") Signed-off-by: Ritesh Harjani (IBM) Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/20250610021227.361980-1-maddy@linux.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/platforms/powernv/memtrace.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/platforms/powernv/memtrace.c b/arch/powerpc/platforms/powernv/memtrace.c index 877720c645151..35471b679638a 100644 --- a/arch/powerpc/platforms/powernv/memtrace.c +++ b/arch/powerpc/platforms/powernv/memtrace.c @@ -48,11 +48,15 @@ static ssize_t memtrace_read(struct file *filp, char __user *ubuf, static int memtrace_mmap(struct file *filp, struct vm_area_struct *vma) { struct memtrace_entry *ent = filp->private_data; + unsigned long ent_nrpages = ent->size >> PAGE_SHIFT; + unsigned long vma_nrpages = vma_pages(vma); - if (ent->size < vma->vm_end - vma->vm_start) + /* The requested page offset should be within object's page count */ + if (vma->vm_pgoff >= ent_nrpages) return -EINVAL; - if (vma->vm_pgoff << PAGE_SHIFT >= ent->size) + /* The requested mapping range should remain within the bounds */ + if (vma_nrpages > ent_nrpages - vma->vm_pgoff) return -EINVAL; vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); -- GitLab From c79a1ac2a0534206de0f5f0b96dc83950971d230 Mon Sep 17 00:00:00 2001 From: Haren Myneni Date: Tue, 10 Jun 2025 07:42:27 +0530 Subject: [PATCH 1142/2211] powerpc/vas: Return -EINVAL if the offset is non-zero in mmap() [ Upstream commit 0d67f0dee6c9176bc09a5482dd7346e3a0f14d0b ] The user space calls mmap() to map VAS window paste address and the kernel returns the complete mapped page for each window. So return -EINVAL if non-zero is passed for offset parameter to mmap(). See Documentation/arch/powerpc/vas-api.rst for mmap() restrictions. Co-developed-by: Jonathan Greental Signed-off-by: Jonathan Greental Reported-by: Jonathan Greental Fixes: dda44eb29c23 ("powerpc/vas: Add VAS user space API") Signed-off-by: Haren Myneni Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/20250610021227.361980-2-maddy@linux.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/platforms/book3s/vas-api.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/powerpc/platforms/book3s/vas-api.c b/arch/powerpc/platforms/book3s/vas-api.c index 0b6365d85d117..dc6f75d3ac6ef 100644 --- a/arch/powerpc/platforms/book3s/vas-api.c +++ b/arch/powerpc/platforms/book3s/vas-api.c @@ -521,6 +521,15 @@ static int coproc_mmap(struct file *fp, struct vm_area_struct *vma) return -EINVAL; } + /* + * Map complete page to the paste address. So the user + * space should pass 0ULL to the offset parameter. + */ + if (vma->vm_pgoff) { + pr_debug("Page offset unsupported to map paste address\n"); + return -EINVAL; + } + /* Ensure instance has an open send window */ if (!txwin) { pr_err("No send window open?\n"); -- GitLab From d7aa2e4b808e84bb82291034548d3674cbc90ec6 Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl Date: Mon, 21 Apr 2025 22:13:00 +0200 Subject: [PATCH 1143/2211] drm/meson: use unsigned long long / Hz for frequency types [ Upstream commit 1017560164b6bbcbc93579266926e6e96675262a ] Christian reports that 4K output using YUV420 encoding fails with the following error: Fatal Error, invalid HDMI vclk freq 593406 Modetest shows the following: 3840x2160 59.94 3840 4016 4104 4400 2160 2168 2178 2250 593407 flags: xxxx, xxxx, drm calculated value -------------------------------------^ This indicates that there's a (1kHz) mismatch between the clock calculated by the drm framework and the meson driver. Relevant function call stack: (drm framework) -> meson_encoder_hdmi_atomic_enable() -> meson_encoder_hdmi_set_vclk() -> meson_vclk_setup() The video clock requested by the drm framework is 593407kHz. This is passed by meson_encoder_hdmi_atomic_enable() to meson_encoder_hdmi_set_vclk() and the following formula is applied: - the frequency is halved (which would be 296703.5kHz) and rounded down to the next full integer, which is 296703kHz - TMDS clock is calculated (296703kHz * 10) - video encoder clock is calculated - this needs to match a table from meson_vclk.c and so it doubles the previously halved value again (resulting in 593406kHz) - meson_vclk_setup() can't find (either directly, or by deriving it from 594000kHz * 1000 / 1001 and rounding to the closest integer value - which is 593407kHz as originally requested by the drm framework) a matching clock in it's internal table and errors out with "invalid HDMI vclk freq" Fix the division precision by switching the whole meson driver to use unsigned long long (64-bit) Hz values for clock frequencies instead of unsigned int (32-bit) kHz to fix the rouding error. Fixes: e5fab2ec9ca4 ("drm/meson: vclk: add support for YUV420 setup") Reported-by: Christian Hewitt Signed-off-by: Martin Blumenstingl Reviewed-by: Neil Armstrong Link: https://lore.kernel.org/r/20250421201300.778955-3-martin.blumenstingl@googlemail.com Signed-off-by: Neil Armstrong Link: https://lore.kernel.org/r/20250421201300.778955-3-martin.blumenstingl@googlemail.com Stable-dep-of: d17e61ab63fb ("drm/meson: fix debug log statement when setting the HDMI clocks") Signed-off-by: Sasha Levin --- drivers/gpu/drm/meson/meson_drv.c | 2 +- drivers/gpu/drm/meson/meson_drv.h | 2 +- drivers/gpu/drm/meson/meson_encoder_hdmi.c | 29 +-- drivers/gpu/drm/meson/meson_vclk.c | 195 +++++++++++---------- drivers/gpu/drm/meson/meson_vclk.h | 13 +- 5 files changed, 126 insertions(+), 115 deletions(-) diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c index 4bd0baa2a4f55..f59452e8fa6fb 100644 --- a/drivers/gpu/drm/meson/meson_drv.c +++ b/drivers/gpu/drm/meson/meson_drv.c @@ -168,7 +168,7 @@ static const struct meson_drm_soc_attr meson_drm_soc_attrs[] = { /* S805X/S805Y HDMI PLL won't lock for HDMI PHY freq > 1,65GHz */ { .limits = { - .max_hdmi_phy_freq = 1650000, + .max_hdmi_phy_freq = 1650000000, }, .attrs = (const struct soc_device_attribute []) { { .soc_id = "GXL (S805*)", }, diff --git a/drivers/gpu/drm/meson/meson_drv.h b/drivers/gpu/drm/meson/meson_drv.h index 3f9345c14f31c..be4b0e4df6e13 100644 --- a/drivers/gpu/drm/meson/meson_drv.h +++ b/drivers/gpu/drm/meson/meson_drv.h @@ -37,7 +37,7 @@ struct meson_drm_match_data { }; struct meson_drm_soc_limits { - unsigned int max_hdmi_phy_freq; + unsigned long long max_hdmi_phy_freq; }; struct meson_drm { diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c index 0593a1cde906f..ce8cea5d3a56b 100644 --- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c +++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c @@ -70,12 +70,12 @@ static void meson_encoder_hdmi_set_vclk(struct meson_encoder_hdmi *encoder_hdmi, { struct meson_drm *priv = encoder_hdmi->priv; int vic = drm_match_cea_mode(mode); - unsigned int phy_freq; - unsigned int vclk_freq; - unsigned int venc_freq; - unsigned int hdmi_freq; + unsigned long long phy_freq; + unsigned long long vclk_freq; + unsigned long long venc_freq; + unsigned long long hdmi_freq; - vclk_freq = mode->clock; + vclk_freq = mode->clock * 1000; /* For 420, pixel clock is half unlike venc clock */ if (encoder_hdmi->output_bus_fmt == MEDIA_BUS_FMT_UYYVYY8_0_5X24) @@ -107,7 +107,8 @@ static void meson_encoder_hdmi_set_vclk(struct meson_encoder_hdmi *encoder_hdmi, if (mode->flags & DRM_MODE_FLAG_DBLCLK) venc_freq /= 2; - dev_dbg(priv->dev, "vclk:%d phy=%d venc=%d hdmi=%d enci=%d\n", + dev_dbg(priv->dev, + "vclk:%lluHz phy=%lluHz venc=%lluHz hdmi=%lluHz enci=%d\n", phy_freq, vclk_freq, venc_freq, hdmi_freq, priv->venc.hdmi_use_enci); @@ -122,10 +123,11 @@ static enum drm_mode_status meson_encoder_hdmi_mode_valid(struct drm_bridge *bri struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge); struct meson_drm *priv = encoder_hdmi->priv; bool is_hdmi2_sink = display_info->hdmi.scdc.supported; - unsigned int phy_freq; - unsigned int vclk_freq; - unsigned int venc_freq; - unsigned int hdmi_freq; + unsigned long long clock = mode->clock * 1000; + unsigned long long phy_freq; + unsigned long long vclk_freq; + unsigned long long venc_freq; + unsigned long long hdmi_freq; int vic = drm_match_cea_mode(mode); enum drm_mode_status status; @@ -144,12 +146,12 @@ static enum drm_mode_status meson_encoder_hdmi_mode_valid(struct drm_bridge *bri if (status != MODE_OK) return status; - return meson_vclk_dmt_supported_freq(priv, mode->clock); + return meson_vclk_dmt_supported_freq(priv, clock); /* Check against supported VIC modes */ } else if (!meson_venc_hdmi_supported_vic(vic)) return MODE_BAD; - vclk_freq = mode->clock; + vclk_freq = clock; /* For 420, pixel clock is half unlike venc clock */ if (drm_mode_is_420_only(display_info, mode) || @@ -179,7 +181,8 @@ static enum drm_mode_status meson_encoder_hdmi_mode_valid(struct drm_bridge *bri if (mode->flags & DRM_MODE_FLAG_DBLCLK) venc_freq /= 2; - dev_dbg(priv->dev, "%s: vclk:%d phy=%d venc=%d hdmi=%d\n", + dev_dbg(priv->dev, + "%s: vclk:%lluHz phy=%lluHz venc=%lluHz hdmi=%lluHz\n", __func__, phy_freq, vclk_freq, venc_freq, hdmi_freq); return meson_vclk_vic_supported_freq(priv, phy_freq, vclk_freq); diff --git a/drivers/gpu/drm/meson/meson_vclk.c b/drivers/gpu/drm/meson/meson_vclk.c index 2a82119eb58ed..3325580d885d0 100644 --- a/drivers/gpu/drm/meson/meson_vclk.c +++ b/drivers/gpu/drm/meson/meson_vclk.c @@ -110,7 +110,10 @@ #define HDMI_PLL_LOCK BIT(31) #define HDMI_PLL_LOCK_G12A (3 << 30) -#define FREQ_1000_1001(_freq) DIV_ROUND_CLOSEST(_freq * 1000, 1001) +#define PIXEL_FREQ_1000_1001(_freq) \ + DIV_ROUND_CLOSEST_ULL((_freq) * 1000ULL, 1001ULL) +#define PHY_FREQ_1000_1001(_freq) \ + (PIXEL_FREQ_1000_1001(DIV_ROUND_DOWN_ULL(_freq, 10ULL)) * 10) /* VID PLL Dividers */ enum { @@ -360,11 +363,11 @@ enum { }; struct meson_vclk_params { - unsigned int pll_freq; - unsigned int phy_freq; - unsigned int vclk_freq; - unsigned int venc_freq; - unsigned int pixel_freq; + unsigned long long pll_freq; + unsigned long long phy_freq; + unsigned long long vclk_freq; + unsigned long long venc_freq; + unsigned long long pixel_freq; unsigned int pll_od1; unsigned int pll_od2; unsigned int pll_od3; @@ -372,11 +375,11 @@ struct meson_vclk_params { unsigned int vclk_div; } params[] = { [MESON_VCLK_HDMI_ENCI_54000] = { - .pll_freq = 4320000, - .phy_freq = 270000, - .vclk_freq = 54000, - .venc_freq = 54000, - .pixel_freq = 54000, + .pll_freq = 4320000000, + .phy_freq = 270000000, + .vclk_freq = 54000000, + .venc_freq = 54000000, + .pixel_freq = 54000000, .pll_od1 = 4, .pll_od2 = 4, .pll_od3 = 1, @@ -384,11 +387,11 @@ struct meson_vclk_params { .vclk_div = 1, }, [MESON_VCLK_HDMI_DDR_54000] = { - .pll_freq = 4320000, - .phy_freq = 270000, - .vclk_freq = 54000, - .venc_freq = 54000, - .pixel_freq = 27000, + .pll_freq = 4320000000, + .phy_freq = 270000000, + .vclk_freq = 54000000, + .venc_freq = 54000000, + .pixel_freq = 27000000, .pll_od1 = 4, .pll_od2 = 4, .pll_od3 = 1, @@ -396,11 +399,11 @@ struct meson_vclk_params { .vclk_div = 1, }, [MESON_VCLK_HDMI_DDR_148500] = { - .pll_freq = 2970000, - .phy_freq = 742500, - .vclk_freq = 148500, - .venc_freq = 148500, - .pixel_freq = 74250, + .pll_freq = 2970000000, + .phy_freq = 742500000, + .vclk_freq = 148500000, + .venc_freq = 148500000, + .pixel_freq = 74250000, .pll_od1 = 4, .pll_od2 = 1, .pll_od3 = 1, @@ -408,11 +411,11 @@ struct meson_vclk_params { .vclk_div = 1, }, [MESON_VCLK_HDMI_74250] = { - .pll_freq = 2970000, - .phy_freq = 742500, - .vclk_freq = 74250, - .venc_freq = 74250, - .pixel_freq = 74250, + .pll_freq = 2970000000, + .phy_freq = 742500000, + .vclk_freq = 74250000, + .venc_freq = 74250000, + .pixel_freq = 74250000, .pll_od1 = 2, .pll_od2 = 2, .pll_od3 = 2, @@ -420,11 +423,11 @@ struct meson_vclk_params { .vclk_div = 1, }, [MESON_VCLK_HDMI_148500] = { - .pll_freq = 2970000, - .phy_freq = 1485000, - .vclk_freq = 148500, - .venc_freq = 148500, - .pixel_freq = 148500, + .pll_freq = 2970000000, + .phy_freq = 1485000000, + .vclk_freq = 148500000, + .venc_freq = 148500000, + .pixel_freq = 148500000, .pll_od1 = 1, .pll_od2 = 2, .pll_od3 = 2, @@ -432,11 +435,11 @@ struct meson_vclk_params { .vclk_div = 1, }, [MESON_VCLK_HDMI_297000] = { - .pll_freq = 5940000, - .phy_freq = 2970000, - .venc_freq = 297000, - .vclk_freq = 297000, - .pixel_freq = 297000, + .pll_freq = 5940000000, + .phy_freq = 2970000000, + .venc_freq = 297000000, + .vclk_freq = 297000000, + .pixel_freq = 297000000, .pll_od1 = 2, .pll_od2 = 1, .pll_od3 = 1, @@ -444,11 +447,11 @@ struct meson_vclk_params { .vclk_div = 2, }, [MESON_VCLK_HDMI_594000] = { - .pll_freq = 5940000, - .phy_freq = 5940000, - .venc_freq = 594000, - .vclk_freq = 594000, - .pixel_freq = 594000, + .pll_freq = 5940000000, + .phy_freq = 5940000000, + .venc_freq = 594000000, + .vclk_freq = 594000000, + .pixel_freq = 594000000, .pll_od1 = 1, .pll_od2 = 1, .pll_od3 = 2, @@ -456,11 +459,11 @@ struct meson_vclk_params { .vclk_div = 1, }, [MESON_VCLK_HDMI_594000_YUV420] = { - .pll_freq = 5940000, - .phy_freq = 2970000, - .venc_freq = 594000, - .vclk_freq = 594000, - .pixel_freq = 297000, + .pll_freq = 5940000000, + .phy_freq = 2970000000, + .venc_freq = 594000000, + .vclk_freq = 594000000, + .pixel_freq = 297000000, .pll_od1 = 2, .pll_od2 = 1, .pll_od3 = 1, @@ -617,16 +620,16 @@ static void meson_hdmi_pll_set_params(struct meson_drm *priv, unsigned int m, 3 << 20, pll_od_to_reg(od3) << 20); } -#define XTAL_FREQ 24000 +#define XTAL_FREQ (24 * 1000 * 1000) static unsigned int meson_hdmi_pll_get_m(struct meson_drm *priv, - unsigned int pll_freq) + unsigned long long pll_freq) { /* The GXBB PLL has a /2 pre-multiplier */ if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) - pll_freq /= 2; + pll_freq = DIV_ROUND_DOWN_ULL(pll_freq, 2); - return pll_freq / XTAL_FREQ; + return DIV_ROUND_DOWN_ULL(pll_freq, XTAL_FREQ); } #define HDMI_FRAC_MAX_GXBB 4096 @@ -635,12 +638,13 @@ static unsigned int meson_hdmi_pll_get_m(struct meson_drm *priv, static unsigned int meson_hdmi_pll_get_frac(struct meson_drm *priv, unsigned int m, - unsigned int pll_freq) + unsigned long long pll_freq) { - unsigned int parent_freq = XTAL_FREQ; + unsigned long long parent_freq = XTAL_FREQ; unsigned int frac_max = HDMI_FRAC_MAX_GXL; unsigned int frac_m; unsigned int frac; + u32 remainder; /* The GXBB PLL has a /2 pre-multiplier and a larger FRAC width */ if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { @@ -652,11 +656,11 @@ static unsigned int meson_hdmi_pll_get_frac(struct meson_drm *priv, frac_max = HDMI_FRAC_MAX_G12A; /* We can have a perfect match !*/ - if (pll_freq / m == parent_freq && - pll_freq % m == 0) + if (div_u64_rem(pll_freq, m, &remainder) == parent_freq && + remainder == 0) return 0; - frac = div_u64((u64)pll_freq * (u64)frac_max, parent_freq); + frac = mul_u64_u64_div_u64(pll_freq, frac_max, parent_freq); frac_m = m * frac_max; if (frac_m > frac) return frac_max; @@ -666,7 +670,7 @@ static unsigned int meson_hdmi_pll_get_frac(struct meson_drm *priv, } static bool meson_hdmi_pll_validate_params(struct meson_drm *priv, - unsigned int m, + unsigned long long m, unsigned int frac) { if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { @@ -694,7 +698,7 @@ static bool meson_hdmi_pll_validate_params(struct meson_drm *priv, } static bool meson_hdmi_pll_find_params(struct meson_drm *priv, - unsigned int freq, + unsigned long long freq, unsigned int *m, unsigned int *frac, unsigned int *od) @@ -706,7 +710,7 @@ static bool meson_hdmi_pll_find_params(struct meson_drm *priv, continue; *frac = meson_hdmi_pll_get_frac(priv, *m, freq * *od); - DRM_DEBUG_DRIVER("PLL params for %dkHz: m=%x frac=%x od=%d\n", + DRM_DEBUG_DRIVER("PLL params for %lluHz: m=%x frac=%x od=%d\n", freq, *m, *frac, *od); if (meson_hdmi_pll_validate_params(priv, *m, *frac)) @@ -718,7 +722,7 @@ static bool meson_hdmi_pll_find_params(struct meson_drm *priv, /* pll_freq is the frequency after the OD dividers */ enum drm_mode_status -meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned int freq) +meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned long long freq) { unsigned int od, m, frac; @@ -741,7 +745,7 @@ EXPORT_SYMBOL_GPL(meson_vclk_dmt_supported_freq); /* pll_freq is the frequency after the OD dividers */ static void meson_hdmi_pll_generic_set(struct meson_drm *priv, - unsigned int pll_freq) + unsigned long long pll_freq) { unsigned int od, m, frac, od1, od2, od3; @@ -756,7 +760,7 @@ static void meson_hdmi_pll_generic_set(struct meson_drm *priv, od1 = od / od2; } - DRM_DEBUG_DRIVER("PLL params for %dkHz: m=%x frac=%x od=%d/%d/%d\n", + DRM_DEBUG_DRIVER("PLL params for %lluHz: m=%x frac=%x od=%d/%d/%d\n", pll_freq, m, frac, od1, od2, od3); meson_hdmi_pll_set_params(priv, m, frac, od1, od2, od3); @@ -764,17 +768,18 @@ static void meson_hdmi_pll_generic_set(struct meson_drm *priv, return; } - DRM_ERROR("Fatal, unable to find parameters for PLL freq %d\n", + DRM_ERROR("Fatal, unable to find parameters for PLL freq %lluHz\n", pll_freq); } enum drm_mode_status -meson_vclk_vic_supported_freq(struct meson_drm *priv, unsigned int phy_freq, - unsigned int vclk_freq) +meson_vclk_vic_supported_freq(struct meson_drm *priv, + unsigned long long phy_freq, + unsigned long long vclk_freq) { int i; - DRM_DEBUG_DRIVER("phy_freq = %d vclk_freq = %d\n", + DRM_DEBUG_DRIVER("phy_freq = %lluHz vclk_freq = %lluHz\n", phy_freq, vclk_freq); /* Check against soc revision/package limits */ @@ -785,19 +790,19 @@ meson_vclk_vic_supported_freq(struct meson_drm *priv, unsigned int phy_freq, } for (i = 0 ; params[i].pixel_freq ; ++i) { - DRM_DEBUG_DRIVER("i = %d pixel_freq = %d alt = %d\n", + DRM_DEBUG_DRIVER("i = %d pixel_freq = %lluHz alt = %lluHz\n", i, params[i].pixel_freq, - FREQ_1000_1001(params[i].pixel_freq)); - DRM_DEBUG_DRIVER("i = %d phy_freq = %d alt = %d\n", + PIXEL_FREQ_1000_1001(params[i].pixel_freq)); + DRM_DEBUG_DRIVER("i = %d phy_freq = %lluHz alt = %lluHz\n", i, params[i].phy_freq, - FREQ_1000_1001(params[i].phy_freq/10)*10); + PHY_FREQ_1000_1001(params[i].phy_freq)); /* Match strict frequency */ if (phy_freq == params[i].phy_freq && vclk_freq == params[i].vclk_freq) return MODE_OK; /* Match 1000/1001 variant */ - if (phy_freq == (FREQ_1000_1001(params[i].phy_freq/10)*10) && - vclk_freq == FREQ_1000_1001(params[i].vclk_freq)) + if (phy_freq == PHY_FREQ_1000_1001(params[i].phy_freq) && + vclk_freq == PIXEL_FREQ_1000_1001(params[i].vclk_freq)) return MODE_OK; } @@ -805,8 +810,9 @@ meson_vclk_vic_supported_freq(struct meson_drm *priv, unsigned int phy_freq, } EXPORT_SYMBOL_GPL(meson_vclk_vic_supported_freq); -static void meson_vclk_set(struct meson_drm *priv, unsigned int pll_base_freq, - unsigned int od1, unsigned int od2, unsigned int od3, +static void meson_vclk_set(struct meson_drm *priv, + unsigned long long pll_base_freq, unsigned int od1, + unsigned int od2, unsigned int od3, unsigned int vid_pll_div, unsigned int vclk_div, unsigned int hdmi_tx_div, unsigned int venc_div, bool hdmi_use_enci, bool vic_alternate_clock) @@ -826,15 +832,15 @@ static void meson_vclk_set(struct meson_drm *priv, unsigned int pll_base_freq, meson_hdmi_pll_generic_set(priv, pll_base_freq); } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { switch (pll_base_freq) { - case 2970000: + case 2970000000: m = 0x3d; frac = vic_alternate_clock ? 0xd02 : 0xe00; break; - case 4320000: + case 4320000000: m = vic_alternate_clock ? 0x59 : 0x5a; frac = vic_alternate_clock ? 0xe8f : 0; break; - case 5940000: + case 5940000000: m = 0x7b; frac = vic_alternate_clock ? 0xa05 : 0xc00; break; @@ -844,15 +850,15 @@ static void meson_vclk_set(struct meson_drm *priv, unsigned int pll_base_freq, } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXM) || meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXL)) { switch (pll_base_freq) { - case 2970000: + case 2970000000: m = 0x7b; frac = vic_alternate_clock ? 0x281 : 0x300; break; - case 4320000: + case 4320000000: m = vic_alternate_clock ? 0xb3 : 0xb4; frac = vic_alternate_clock ? 0x347 : 0; break; - case 5940000: + case 5940000000: m = 0xf7; frac = vic_alternate_clock ? 0x102 : 0x200; break; @@ -861,15 +867,15 @@ static void meson_vclk_set(struct meson_drm *priv, unsigned int pll_base_freq, meson_hdmi_pll_set_params(priv, m, frac, od1, od2, od3); } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_G12A)) { switch (pll_base_freq) { - case 2970000: + case 2970000000: m = 0x7b; frac = vic_alternate_clock ? 0x140b4 : 0x18000; break; - case 4320000: + case 4320000000: m = vic_alternate_clock ? 0xb3 : 0xb4; frac = vic_alternate_clock ? 0x1a3ee : 0; break; - case 5940000: + case 5940000000: m = 0xf7; frac = vic_alternate_clock ? 0x8148 : 0x10000; break; @@ -1025,14 +1031,14 @@ static void meson_vclk_set(struct meson_drm *priv, unsigned int pll_base_freq, } void meson_vclk_setup(struct meson_drm *priv, unsigned int target, - unsigned int phy_freq, unsigned int vclk_freq, - unsigned int venc_freq, unsigned int dac_freq, + unsigned long long phy_freq, unsigned long long vclk_freq, + unsigned long long venc_freq, unsigned long long dac_freq, bool hdmi_use_enci) { bool vic_alternate_clock = false; - unsigned int freq; - unsigned int hdmi_tx_div; - unsigned int venc_div; + unsigned long long freq; + unsigned long long hdmi_tx_div; + unsigned long long venc_div; if (target == MESON_VCLK_TARGET_CVBS) { meson_venci_cvbs_clock_config(priv); @@ -1052,27 +1058,27 @@ void meson_vclk_setup(struct meson_drm *priv, unsigned int target, return; } - hdmi_tx_div = vclk_freq / dac_freq; + hdmi_tx_div = DIV_ROUND_DOWN_ULL(vclk_freq, dac_freq); if (hdmi_tx_div == 0) { - pr_err("Fatal Error, invalid HDMI-TX freq %d\n", + pr_err("Fatal Error, invalid HDMI-TX freq %lluHz\n", dac_freq); return; } - venc_div = vclk_freq / venc_freq; + venc_div = DIV_ROUND_DOWN_ULL(vclk_freq, venc_freq); if (venc_div == 0) { - pr_err("Fatal Error, invalid HDMI venc freq %d\n", + pr_err("Fatal Error, invalid HDMI venc freq %lluHz\n", venc_freq); return; } for (freq = 0 ; params[freq].pixel_freq ; ++freq) { if ((phy_freq == params[freq].phy_freq || - phy_freq == FREQ_1000_1001(params[freq].phy_freq/10)*10) && + phy_freq == PHY_FREQ_1000_1001(params[freq].phy_freq)) && (vclk_freq == params[freq].vclk_freq || - vclk_freq == FREQ_1000_1001(params[freq].vclk_freq))) { + vclk_freq == PIXEL_FREQ_1000_1001(params[freq].vclk_freq))) { if (vclk_freq != params[freq].vclk_freq) vic_alternate_clock = true; else @@ -1098,7 +1104,8 @@ void meson_vclk_setup(struct meson_drm *priv, unsigned int target, } if (!params[freq].pixel_freq) { - pr_err("Fatal Error, invalid HDMI vclk freq %d\n", vclk_freq); + pr_err("Fatal Error, invalid HDMI vclk freq %lluHz\n", + vclk_freq); return; } diff --git a/drivers/gpu/drm/meson/meson_vclk.h b/drivers/gpu/drm/meson/meson_vclk.h index 60617aaf18dd1..7ac55744e5749 100644 --- a/drivers/gpu/drm/meson/meson_vclk.h +++ b/drivers/gpu/drm/meson/meson_vclk.h @@ -20,17 +20,18 @@ enum { }; /* 27MHz is the CVBS Pixel Clock */ -#define MESON_VCLK_CVBS 27000 +#define MESON_VCLK_CVBS (27 * 1000 * 1000) enum drm_mode_status -meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned int freq); +meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned long long freq); enum drm_mode_status -meson_vclk_vic_supported_freq(struct meson_drm *priv, unsigned int phy_freq, - unsigned int vclk_freq); +meson_vclk_vic_supported_freq(struct meson_drm *priv, + unsigned long long phy_freq, + unsigned long long vclk_freq); void meson_vclk_setup(struct meson_drm *priv, unsigned int target, - unsigned int phy_freq, unsigned int vclk_freq, - unsigned int venc_freq, unsigned int dac_freq, + unsigned long long phy_freq, unsigned long long vclk_freq, + unsigned long long venc_freq, unsigned long long dac_freq, bool hdmi_use_enci); #endif /* __MESON_VCLK_H */ -- GitLab From dd8d64e910472aa9457a0ab9493b1f9e28c5aaf5 Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl Date: Fri, 6 Jun 2025 22:37:29 +0200 Subject: [PATCH 1144/2211] drm/meson: fix debug log statement when setting the HDMI clocks [ Upstream commit d17e61ab63fb7747b340d6a66bf1408cd5c6562b ] The "phy" and "vclk" frequency labels were swapped, making it more difficult to debug driver errors. Swap the label order to make them match with the actual frequencies printed to correct this. Fixes: e5fab2ec9ca4 ("drm/meson: vclk: add support for YUV420 setup") Signed-off-by: Martin Blumenstingl Reviewed-by: Neil Armstrong Signed-off-by: Neil Armstrong Link: https://lore.kernel.org/r/20250606203729.3311592-1-martin.blumenstingl@googlemail.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/meson/meson_encoder_hdmi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c index ce8cea5d3a56b..2c49137e0deed 100644 --- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c +++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c @@ -108,7 +108,7 @@ static void meson_encoder_hdmi_set_vclk(struct meson_encoder_hdmi *encoder_hdmi, venc_freq /= 2; dev_dbg(priv->dev, - "vclk:%lluHz phy=%lluHz venc=%lluHz hdmi=%lluHz enci=%d\n", + "phy:%lluHz vclk=%lluHz venc=%lluHz hdmi=%lluHz enci=%d\n", phy_freq, vclk_freq, venc_freq, hdmi_freq, priv->venc.hdmi_use_enci); -- GitLab From e44408a31774869fb4d0f689a089ca9c8f91f919 Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl Date: Sat, 7 Jun 2025 00:10:31 +0200 Subject: [PATCH 1145/2211] drm/meson: use vclk_freq instead of pixel_freq in debug print [ Upstream commit faf2f8382088e8c74bd6eeb236c8c9190e61615e ] meson_vclk_vic_supported_freq() has a debug print which includes the pixel freq. However, within the whole function the pixel freq is irrelevant, other than checking the end of the params array. Switch to printing the vclk_freq which is being compared / matched against the inputs to the function to avoid confusion when analyzing error reports from users. Fixes: e5fab2ec9ca4 ("drm/meson: vclk: add support for YUV420 setup") Signed-off-by: Martin Blumenstingl Reviewed-by: Neil Armstrong Signed-off-by: Neil Armstrong Link: https://lore.kernel.org/r/20250606221031.3419353-1-martin.blumenstingl@googlemail.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/meson/meson_vclk.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/meson/meson_vclk.c b/drivers/gpu/drm/meson/meson_vclk.c index 3325580d885d0..c4123bb958e4c 100644 --- a/drivers/gpu/drm/meson/meson_vclk.c +++ b/drivers/gpu/drm/meson/meson_vclk.c @@ -790,9 +790,9 @@ meson_vclk_vic_supported_freq(struct meson_drm *priv, } for (i = 0 ; params[i].pixel_freq ; ++i) { - DRM_DEBUG_DRIVER("i = %d pixel_freq = %lluHz alt = %lluHz\n", - i, params[i].pixel_freq, - PIXEL_FREQ_1000_1001(params[i].pixel_freq)); + DRM_DEBUG_DRIVER("i = %d vclk_freq = %lluHz alt = %lluHz\n", + i, params[i].vclk_freq, + PIXEL_FREQ_1000_1001(params[i].vclk_freq)); DRM_DEBUG_DRIVER("i = %d phy_freq = %lluHz alt = %lluHz\n", i, params[i].phy_freq, PHY_FREQ_1000_1001(params[i].phy_freq)); -- GitLab From 0440186a9c1cd47e40d9dd92eb27211b9ce60e1f Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl Date: Mon, 9 Jun 2025 22:27:51 +0200 Subject: [PATCH 1146/2211] drm/meson: fix more rounding issues with 59.94Hz modes [ Upstream commit 0cee6c4d3518b2e757aedae78771f17149f57653 ] Commit 1017560164b6 ("drm/meson: use unsigned long long / Hz for frequency types") attempts to resolve video playback using 59.94Hz. using YUV420 by changing the clock calculation to use Hz instead of kHz (thus yielding more precision). The basic calculation itself is correct, however the comparisions in meson_vclk_vic_supported_freq() and meson_vclk_setup() don't work anymore for 59.94Hz modes (using the freq * 1000 / 1001 logic). For example, drm/edid specifies a 593407kHz clock for 3840x2160@59.94Hz. With the mentioend commit we convert this to Hz. Then meson_vclk tries to find a matchig "params" entry (as the clock setup code currently only supports specific frequencies) by taking the venc_freq from the params and calculating the "alt frequency" (used for the 59.94Hz modes) from it, which is: (594000000Hz * 1000) / 1001 = 593406593Hz Similar calculation is applied to the phy_freq (TMDS clock), which is 10 times the pixel clock. Implement a new meson_vclk_freqs_are_matching_param() function whose purpose is to compare if the requested and calculated frequencies. They may not match exactly (for the reasons mentioned above). Allow the clocks to deviate slightly to make the 59.94Hz modes again. Fixes: 1017560164b6 ("drm/meson: use unsigned long long / Hz for frequency types") Reported-by: Christian Hewitt Signed-off-by: Martin Blumenstingl Reviewed-by: Neil Armstrong Signed-off-by: Neil Armstrong Link: https://lore.kernel.org/r/20250609202751.962208-1-martin.blumenstingl@googlemail.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/meson/meson_vclk.c | 55 ++++++++++++++++++------------ 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/drivers/gpu/drm/meson/meson_vclk.c b/drivers/gpu/drm/meson/meson_vclk.c index c4123bb958e4c..dfe0c28a0f054 100644 --- a/drivers/gpu/drm/meson/meson_vclk.c +++ b/drivers/gpu/drm/meson/meson_vclk.c @@ -110,10 +110,7 @@ #define HDMI_PLL_LOCK BIT(31) #define HDMI_PLL_LOCK_G12A (3 << 30) -#define PIXEL_FREQ_1000_1001(_freq) \ - DIV_ROUND_CLOSEST_ULL((_freq) * 1000ULL, 1001ULL) -#define PHY_FREQ_1000_1001(_freq) \ - (PIXEL_FREQ_1000_1001(DIV_ROUND_DOWN_ULL(_freq, 10ULL)) * 10) +#define FREQ_1000_1001(_freq) DIV_ROUND_CLOSEST_ULL((_freq) * 1000ULL, 1001ULL) /* VID PLL Dividers */ enum { @@ -772,6 +769,36 @@ static void meson_hdmi_pll_generic_set(struct meson_drm *priv, pll_freq); } +static bool meson_vclk_freqs_are_matching_param(unsigned int idx, + unsigned long long phy_freq, + unsigned long long vclk_freq) +{ + DRM_DEBUG_DRIVER("i = %d vclk_freq = %lluHz alt = %lluHz\n", + idx, params[idx].vclk_freq, + FREQ_1000_1001(params[idx].vclk_freq)); + DRM_DEBUG_DRIVER("i = %d phy_freq = %lluHz alt = %lluHz\n", + idx, params[idx].phy_freq, + FREQ_1000_1001(params[idx].phy_freq)); + + /* Match strict frequency */ + if (phy_freq == params[idx].phy_freq && + vclk_freq == params[idx].vclk_freq) + return true; + + /* Match 1000/1001 variant: vclk deviation has to be less than 1kHz + * (drm EDID is defined in 1kHz steps, so everything smaller must be + * rounding error) and the PHY freq deviation has to be less than + * 10kHz (as the TMDS clock is 10 times the pixel clock, so anything + * smaller must be rounding error as well). + */ + if (abs(vclk_freq - FREQ_1000_1001(params[idx].vclk_freq)) < 1000 && + abs(phy_freq - FREQ_1000_1001(params[idx].phy_freq)) < 10000) + return true; + + /* no match */ + return false; +} + enum drm_mode_status meson_vclk_vic_supported_freq(struct meson_drm *priv, unsigned long long phy_freq, @@ -790,19 +817,7 @@ meson_vclk_vic_supported_freq(struct meson_drm *priv, } for (i = 0 ; params[i].pixel_freq ; ++i) { - DRM_DEBUG_DRIVER("i = %d vclk_freq = %lluHz alt = %lluHz\n", - i, params[i].vclk_freq, - PIXEL_FREQ_1000_1001(params[i].vclk_freq)); - DRM_DEBUG_DRIVER("i = %d phy_freq = %lluHz alt = %lluHz\n", - i, params[i].phy_freq, - PHY_FREQ_1000_1001(params[i].phy_freq)); - /* Match strict frequency */ - if (phy_freq == params[i].phy_freq && - vclk_freq == params[i].vclk_freq) - return MODE_OK; - /* Match 1000/1001 variant */ - if (phy_freq == PHY_FREQ_1000_1001(params[i].phy_freq) && - vclk_freq == PIXEL_FREQ_1000_1001(params[i].vclk_freq)) + if (meson_vclk_freqs_are_matching_param(i, phy_freq, vclk_freq)) return MODE_OK; } @@ -1075,10 +1090,8 @@ void meson_vclk_setup(struct meson_drm *priv, unsigned int target, } for (freq = 0 ; params[freq].pixel_freq ; ++freq) { - if ((phy_freq == params[freq].phy_freq || - phy_freq == PHY_FREQ_1000_1001(params[freq].phy_freq)) && - (vclk_freq == params[freq].vclk_freq || - vclk_freq == PIXEL_FREQ_1000_1001(params[freq].vclk_freq))) { + if (meson_vclk_freqs_are_matching_param(freq, phy_freq, + vclk_freq)) { if (vclk_freq != params[freq].vclk_freq) vic_alternate_clock = true; else -- GitLab From 60592d381f12c597aa9a68b7970054fbd96e3a8a Mon Sep 17 00:00:00 2001 From: Robert Malz Date: Tue, 20 May 2025 10:31:51 +0200 Subject: [PATCH 1147/2211] i40e: return false from i40e_reset_vf if reset is in progress [ Upstream commit a2c90d63b71223d69a813333c1abf4fdacddbbe5 ] The function i40e_vc_reset_vf attempts, up to 20 times, to handle a VF reset request, using the return value of i40e_reset_vf as an indicator of whether the reset was successfully triggered. Currently, i40e_reset_vf always returns true, which causes new reset requests to be ignored if a different VF reset is already in progress. This patch updates the return value of i40e_reset_vf to reflect when another VF reset is in progress, allowing the caller to properly use the retry mechanism. Fixes: 52424f974bc5 ("i40e: Fix VF hang when reset is triggered on another VF") Signed-off-by: Robert Malz Tested-by: Rafal Romanowski Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c index dfa785e39458d..bde41d30c69ee 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c @@ -1546,8 +1546,8 @@ static void i40e_cleanup_reset_vf(struct i40e_vf *vf) * @vf: pointer to the VF structure * @flr: VFLR was issued or not * - * Returns true if the VF is in reset, resets successfully, or resets - * are disabled and false otherwise. + * Return: True if reset was performed successfully or if resets are disabled. + * False if reset is already in progress. **/ bool i40e_reset_vf(struct i40e_vf *vf, bool flr) { @@ -1566,7 +1566,7 @@ bool i40e_reset_vf(struct i40e_vf *vf, bool flr) /* If VF is being reset already we don't need to continue. */ if (test_and_set_bit(I40E_VF_STATE_RESETTING, &vf->vf_states)) - return true; + return false; i40e_trigger_vf_reset(vf, flr); -- GitLab From c3892f1ba0bcea23b52f477d5b9ce44c1d7f5cbe Mon Sep 17 00:00:00 2001 From: Robert Malz Date: Tue, 20 May 2025 10:31:52 +0200 Subject: [PATCH 1148/2211] i40e: retry VFLR handling if there is ongoing VF reset [ Upstream commit fb4e9239e029954a37a00818b21e837cebf2aa10 ] When a VFLR interrupt is received during a VF reset initiated from a different source, the VFLR may be not fully handled. This can leave the VF in an undefined state. To address this, set the I40E_VFLR_EVENT_PENDING bit again during VFLR handling if the reset is not yet complete. This ensures the driver will properly complete the VF reset in such scenarios. Fixes: 52424f974bc5 ("i40e: Fix VF hang when reset is triggered on another VF") Signed-off-by: Robert Malz Tested-by: Rafal Romanowski Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c index bde41d30c69ee..625fa93fc18bb 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c @@ -4328,7 +4328,10 @@ int i40e_vc_process_vflr_event(struct i40e_pf *pf) reg = rd32(hw, I40E_GLGEN_VFLRSTAT(reg_idx)); if (reg & BIT(bit_idx)) /* i40e_reset_vf will clear the bit in GLGEN_VFLRSTAT */ - i40e_reset_vf(vf, true); + if (!i40e_reset_vf(vf, true)) { + /* At least one VF did not finish resetting, retry next time */ + set_bit(__I40E_VFLR_EVENT_PENDING, pf->state); + } } return 0; -- GitLab From 32a48db4cf28ea087214c261da8476db218d08bd Mon Sep 17 00:00:00 2001 From: Yunhui Cui Date: Wed, 4 Jun 2025 10:30:36 +0800 Subject: [PATCH 1149/2211] ACPI: CPPC: Fix NULL pointer dereference when nosmp is used [ Upstream commit 15eece6c5b05e5f9db0711978c3e3b7f1a2cfe12 ] With nosmp in cmdline, other CPUs are not brought up, leaving their cpc_desc_ptr NULL. CPU0's iteration via for_each_possible_cpu() dereferences these NULL pointers, causing panic. Panic backtrace: [ 0.401123] Unable to handle kernel NULL pointer dereference at virtual address 00000000000000b8 ... [ 0.403255] [] cppc_allow_fast_switch+0x6a/0xd4 ... Kernel panic - not syncing: Attempted to kill init! Fixes: 3cc30dd00a58 ("cpufreq: CPPC: Enable fast_switch") Reported-by: Xu Lu Signed-off-by: Yunhui Cui Link: https://patch.msgid.link/20250604023036.99553-1-cuiyunhui@bytedance.com [ rjw: New subject ] Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/cppc_acpi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c index e78e3754d99e1..dab941dc984a9 100644 --- a/drivers/acpi/cppc_acpi.c +++ b/drivers/acpi/cppc_acpi.c @@ -463,7 +463,7 @@ bool cppc_allow_fast_switch(void) struct cpc_desc *cpc_ptr; int cpu; - for_each_possible_cpu(cpu) { + for_each_present_cpu(cpu) { cpc_ptr = per_cpu(cpc_desc_ptr, cpu); desired_reg = &cpc_ptr->cpc_regs[DESIRED_PERF]; if (!CPC_IN_SYSTEM_MEMORY(desired_reg) && -- GitLab From 1e0de7582ceccbdbb227d4e0ddf65732f92526da Mon Sep 17 00:00:00 2001 From: Michal Luczaj Date: Mon, 9 Jun 2025 19:08:03 +0200 Subject: [PATCH 1150/2211] net: Fix TOCTOU issue in sk_is_readable() [ Upstream commit 2660a544fdc0940bba15f70508a46cf9a6491230 ] sk->sk_prot->sock_is_readable is a valid function pointer when sk resides in a sockmap. After the last sk_psock_put() (which usually happens when socket is removed from sockmap), sk->sk_prot gets restored and sk->sk_prot->sock_is_readable becomes NULL. This makes sk_is_readable() racy, if the value of sk->sk_prot is reloaded after the initial check. Which in turn may lead to a null pointer dereference. Ensure the function pointer does not turn NULL after the check. Fixes: 8934ce2fd081 ("bpf: sockmap redirect ingress support") Suggested-by: Jakub Sitnicki Signed-off-by: Michal Luczaj Reviewed-by: Willem de Bruijn Link: https://patch.msgid.link/20250609-skisreadable-toctou-v1-1-d0dfb2d62c37@rbox.co Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- include/net/sock.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/include/net/sock.h b/include/net/sock.h index fa9b9dadbe170..b7270b6b9e9cc 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -2942,8 +2942,11 @@ int sock_ioctl_inout(struct sock *sk, unsigned int cmd, int sk_ioctl(struct sock *sk, unsigned int cmd, void __user *arg); static inline bool sk_is_readable(struct sock *sk) { - if (sk->sk_prot->sock_is_readable) - return sk->sk_prot->sock_is_readable(sk); + const struct proto *prot = READ_ONCE(sk->sk_prot); + + if (prot->sock_is_readable) + return prot->sock_is_readable(sk); + return false; } #endif /* _SOCK_H */ -- GitLab From 78fa7b723e4e00a2a3d205bfc8618668a6e2cbd9 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Mon, 9 Jun 2025 09:26:26 +0200 Subject: [PATCH 1151/2211] macsec: MACsec SCI assignment for ES = 0 [ Upstream commit d9816ec74e6d6aa29219d010bba3f780ba1d9d75 ] According to 802.1AE standard, when ES and SC flags in TCI are zero, used SCI should be the current active SC_RX. Current code uses the header MAC address. Without this patch, when ES flag is 0 (using a bridge or switch), header MAC will not fit the SCI and MACSec frames will be discarted. In order to test this issue, MACsec link should be stablished between two interfaces, setting SC and ES flags to zero and a port identifier different than one. For example, using ip macsec tools: ip link add link $ETH0 macsec0 type macsec port 11 send_sci off end_station off ip macsec add macsec0 tx sa 0 pn 2 on key 01 $ETH1_KEY ip macsec add macsec0 rx port 11 address $ETH1_MAC ip macsec add macsec0 rx port 11 address $ETH1_MAC sa 0 pn 2 on key 02 ip link set dev macsec0 up ip link add link $ETH1 macsec1 type macsec port 11 send_sci off end_station off ip macsec add macsec1 tx sa 0 pn 2 on key 01 $ETH0_KEY ip macsec add macsec1 rx port 11 address $ETH0_MAC ip macsec add macsec1 rx port 11 address $ETH0_MAC sa 0 pn 2 on key 02 ip link set dev macsec1 up Fixes: c09440f7dcb3 ("macsec: introduce IEEE 802.1AE driver") Co-developed-by: Andreu Montiel Signed-off-by: Andreu Montiel Signed-off-by: Carlos Fernandez Reviewed-by: Subbaraya Sundeep Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/macsec.c | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index ee21592825738..090a56a5e456a 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c @@ -246,15 +246,39 @@ static sci_t make_sci(const u8 *addr, __be16 port) return sci; } -static sci_t macsec_frame_sci(struct macsec_eth_header *hdr, bool sci_present) +static sci_t macsec_active_sci(struct macsec_secy *secy) { - sci_t sci; + struct macsec_rx_sc *rx_sc = rcu_dereference_bh(secy->rx_sc); + + /* Case single RX SC */ + if (rx_sc && !rcu_dereference_bh(rx_sc->next)) + return (rx_sc->active) ? rx_sc->sci : 0; + /* Case no RX SC or multiple */ + else + return 0; +} + +static sci_t macsec_frame_sci(struct macsec_eth_header *hdr, bool sci_present, + struct macsec_rxh_data *rxd) +{ + struct macsec_dev *macsec; + sci_t sci = 0; - if (sci_present) + /* SC = 1 */ + if (sci_present) { memcpy(&sci, hdr->secure_channel_id, sizeof(hdr->secure_channel_id)); - else + /* SC = 0; ES = 0 */ + } else if ((!(hdr->tci_an & (MACSEC_TCI_ES | MACSEC_TCI_SC))) && + (list_is_singular(&rxd->secys))) { + /* Only one SECY should exist on this scenario */ + macsec = list_first_or_null_rcu(&rxd->secys, struct macsec_dev, + secys); + if (macsec) + return macsec_active_sci(&macsec->secy); + } else { sci = make_sci(hdr->eth.h_source, MACSEC_PORT_ES); + } return sci; } @@ -1108,7 +1132,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) struct macsec_rxh_data *rxd; struct macsec_dev *macsec; unsigned int len; - sci_t sci; + sci_t sci = 0; u32 hdr_pn; bool cbit; struct pcpu_rx_sc_stats *rxsc_stats; @@ -1155,11 +1179,14 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) macsec_skb_cb(skb)->has_sci = !!(hdr->tci_an & MACSEC_TCI_SC); macsec_skb_cb(skb)->assoc_num = hdr->tci_an & MACSEC_AN_MASK; - sci = macsec_frame_sci(hdr, macsec_skb_cb(skb)->has_sci); rcu_read_lock(); rxd = macsec_data_rcu(skb->dev); + sci = macsec_frame_sci(hdr, macsec_skb_cb(skb)->has_sci, rxd); + if (!sci) + goto drop_nosc; + list_for_each_entry_rcu(macsec, &rxd->secys, secys) { struct macsec_rx_sc *sc = find_rx_sc(&macsec->secy, sci); @@ -1282,6 +1309,7 @@ drop: macsec_rxsa_put(rx_sa); drop_nosa: macsec_rxsc_put(rx_sc); +drop_nosc: rcu_read_unlock(); drop_direct: kfree_skb(skb); -- GitLab From b02d9d2732483e670bc34cb233d28e1d43b15da4 Mon Sep 17 00:00:00 2001 From: Jakub Raczynski Date: Mon, 9 Jun 2025 17:31:46 +0200 Subject: [PATCH 1152/2211] net/mdiobus: Fix potential out-of-bounds read/write access [ Upstream commit 0e629694126ca388916f059453a1c36adde219c4 ] When using publicly available tools like 'mdio-tools' to read/write data from/to network interface and its PHY via mdiobus, there is no verification of parameters passed to the ioctl and it accepts any mdio address. Currently there is support for 32 addresses in kernel via PHY_MAX_ADDR define, but it is possible to pass higher value than that via ioctl. While read/write operation should generally fail in this case, mdiobus provides stats array, where wrong address may allow out-of-bounds read/write. Fix that by adding address verification before read/write operation. While this excludes this access from any statistics, it improves security of read/write operation. Fixes: 080bb352fad00 ("net: phy: Maintain MDIO device and bus statistics") Signed-off-by: Jakub Raczynski Reported-by: Wenjing Shan Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/phy/mdio_bus.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 7e2f10182c0cf..7d2616435ce9e 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -889,6 +889,9 @@ int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) lockdep_assert_held_once(&bus->mdio_lock); + if (addr >= PHY_MAX_ADDR) + return -ENXIO; + if (bus->read) retval = bus->read(bus, addr, regnum); else @@ -918,6 +921,9 @@ int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) lockdep_assert_held_once(&bus->mdio_lock); + if (addr >= PHY_MAX_ADDR) + return -ENXIO; + if (bus->write) err = bus->write(bus, addr, regnum, val); else -- GitLab From 31bf7b2b92563a352788cf9df3698682f659bacc Mon Sep 17 00:00:00 2001 From: Jakub Raczynski Date: Mon, 9 Jun 2025 17:31:47 +0200 Subject: [PATCH 1153/2211] net/mdiobus: Fix potential out-of-bounds clause 45 read/write access [ Upstream commit 260388f79e94fb3026c419a208ece8358bb7b555 ] When using publicly available tools like 'mdio-tools' to read/write data from/to network interface and its PHY via C45 (clause 45) mdiobus, there is no verification of parameters passed to the ioctl and it accepts any mdio address. Currently there is support for 32 addresses in kernel via PHY_MAX_ADDR define, but it is possible to pass higher value than that via ioctl. While read/write operation should generally fail in this case, mdiobus provides stats array, where wrong address may allow out-of-bounds read/write. Fix that by adding address verification before C45 read/write operation. While this excludes this access from any statistics, it improves security of read/write operation. Fixes: 4e4aafcddbbf ("net: mdio: Add dedicated C45 API to MDIO bus drivers") Signed-off-by: Jakub Raczynski Reported-by: Wenjing Shan Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/phy/mdio_bus.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 7d2616435ce9e..591e8fd33d8ea 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -985,6 +985,9 @@ int __mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum) lockdep_assert_held_once(&bus->mdio_lock); + if (addr >= PHY_MAX_ADDR) + return -ENXIO; + if (bus->read_c45) retval = bus->read_c45(bus, addr, devad, regnum); else @@ -1016,6 +1019,9 @@ int __mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum, lockdep_assert_held_once(&bus->mdio_lock); + if (addr >= PHY_MAX_ADDR) + return -ENXIO; + if (bus->write_c45) err = bus->write_c45(bus, addr, devad, regnum, val); else -- GitLab From 842f7c3154d5b25ca11753c02ee8cf6ee64c0142 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 5 Jun 2025 11:14:25 -0400 Subject: [PATCH 1154/2211] Bluetooth: Fix NULL pointer deference on eir_get_service_data [ Upstream commit 20a2aa01f5aeb6daad9aeaa7c33dd512c58d81eb ] The len parameter is considered optional so it can be NULL so it cannot be used for skipping to next entry of EIR_SERVICE_DATA. Fixes: 8f9ae5b3ae80 ("Bluetooth: eir: Add helpers for managing service data") Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- net/bluetooth/eir.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/net/bluetooth/eir.c b/net/bluetooth/eir.c index 1bc51e2b05a34..3e1713673ecc9 100644 --- a/net/bluetooth/eir.c +++ b/net/bluetooth/eir.c @@ -366,17 +366,19 @@ u8 eir_create_scan_rsp(struct hci_dev *hdev, u8 instance, u8 *ptr) void *eir_get_service_data(u8 *eir, size_t eir_len, u16 uuid, size_t *len) { - while ((eir = eir_get_data(eir, eir_len, EIR_SERVICE_DATA, len))) { + size_t dlen; + + while ((eir = eir_get_data(eir, eir_len, EIR_SERVICE_DATA, &dlen))) { u16 value = get_unaligned_le16(eir); if (uuid == value) { if (len) - *len -= 2; + *len = dlen - 2; return &eir[2]; } - eir += *len; - eir_len -= *len; + eir += dlen; + eir_len -= dlen; } return NULL; -- GitLab From 907ef6e12fb558a0763e894311eb245a94c192dd Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 5 Jun 2025 11:15:16 -0400 Subject: [PATCH 1155/2211] Bluetooth: hci_sync: Fix broadcast/PA when using an existing instance [ Upstream commit 5725bc608252050ed8a4d47d59225b7dd73474c8 ] When using and existing adv_info instance for broadcast source it needs to be updated to periodic first before it can be reused, also in case the existing instance already have data hci_set_adv_instance_data cannot be used directly since it would overwrite the existing data so this reappend the original data after the Broadcast ID, if one was generated. Example: bluetoothctl># Add PBP to EA so it can be later referenced as the BIS ID bluetoothctl> advertise.service 0x1856 0x00 0x00 bluetoothctl> advertise on ... < HCI Command: LE Set Extended Advertising Data (0x08|0x0037) plen 13 Handle: 0x01 Operation: Complete extended advertising data (0x03) Fragment preference: Minimize fragmentation (0x01) Data length: 0x09 Service Data: Public Broadcast Announcement (0x1856) Data[2]: 0000 Flags: 0x06 LE General Discoverable Mode BR/EDR Not Supported ... bluetoothctl># Attempt to acquire Broadcast Source transport bluetoothctl>transport.acquire /org/bluez/hci0/pac_bcast0/fd0 ... < HCI Command: LE Set Extended Advertising Data (0x08|0x0037) plen 255 Handle: 0x01 Operation: Complete extended advertising data (0x03) Fragment preference: Minimize fragmentation (0x01) Data length: 0x0e Service Data: Broadcast Audio Announcement (0x1852) Broadcast ID: 11371620 (0xad8464) Service Data: Public Broadcast Announcement (0x1856) Data[2]: 0000 Flags: 0x06 LE General Discoverable Mode BR/EDR Not Supported Link: https://github.com/bluez/bluez/issues/1117 Fixes: eca0ae4aea66 ("Bluetooth: Add initial implementation of BIS connections") Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- net/bluetooth/hci_sync.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c index 59011f45906a1..3fb70b4ee8c8a 100644 --- a/net/bluetooth/hci_sync.c +++ b/net/bluetooth/hci_sync.c @@ -1559,7 +1559,8 @@ static int hci_enable_per_advertising_sync(struct hci_dev *hdev, u8 instance) static int hci_adv_bcast_annoucement(struct hci_dev *hdev, struct adv_info *adv) { u8 bid[3]; - u8 ad[4 + 3]; + u8 ad[HCI_MAX_EXT_AD_LENGTH]; + u8 len; /* Skip if NULL adv as instance 0x00 is used for general purpose * advertising so it cannot used for the likes of Broadcast Announcement @@ -1585,8 +1586,10 @@ static int hci_adv_bcast_annoucement(struct hci_dev *hdev, struct adv_info *adv) /* Generate Broadcast ID */ get_random_bytes(bid, sizeof(bid)); - eir_append_service_data(ad, 0, 0x1852, bid, sizeof(bid)); - hci_set_adv_instance_data(hdev, adv->instance, sizeof(ad), ad, 0, NULL); + len = eir_append_service_data(ad, 0, 0x1852, bid, sizeof(bid)); + memcpy(ad + len, adv->adv_data, adv->adv_data_len); + hci_set_adv_instance_data(hdev, adv->instance, len + adv->adv_data_len, + ad, 0, NULL); return hci_update_adv_data_sync(hdev, adv->instance); } @@ -1603,8 +1606,15 @@ int hci_start_per_adv_sync(struct hci_dev *hdev, u8 instance, u8 data_len, if (instance) { adv = hci_find_adv_instance(hdev, instance); - /* Create an instance if that could not be found */ - if (!adv) { + if (adv) { + /* Turn it into periodic advertising */ + adv->periodic = true; + adv->per_adv_data_len = data_len; + if (data) + memcpy(adv->per_adv_data, data, data_len); + adv->flags = flags; + } else if (!adv) { + /* Create an instance if that could not be found */ adv = hci_add_per_instance(hdev, instance, flags, data_len, data, sync_interval, -- GitLab From 2af40d795d3fb0ee5c074b7ac56ab22402aa6e4f Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 10 Jun 2025 10:14:35 -0400 Subject: [PATCH 1156/2211] Bluetooth: eir: Fix possible crashes on eir_create_adv_data [ Upstream commit 47c03902269aff377f959dc3fd94a9733aa31d6e ] eir_create_adv_data may attempt to add EIR_FLAGS and EIR_TX_POWER without checking if that would fit. Link: https://github.com/bluez/bluez/issues/1117#issuecomment-2958244066 Fixes: 01ce70b0a274 ("Bluetooth: eir: Move EIR/Adv Data functions to its own file") Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- net/bluetooth/eir.c | 7 ++++--- net/bluetooth/eir.h | 2 +- net/bluetooth/hci_sync.c | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/net/bluetooth/eir.c b/net/bluetooth/eir.c index 3e1713673ecc9..3f72111ba651f 100644 --- a/net/bluetooth/eir.c +++ b/net/bluetooth/eir.c @@ -242,7 +242,7 @@ u8 eir_create_per_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr) return ad_len; } -u8 eir_create_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr) +u8 eir_create_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr, u8 size) { struct adv_info *adv = NULL; u8 ad_len = 0, flags = 0; @@ -286,7 +286,7 @@ u8 eir_create_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr) /* If flags would still be empty, then there is no need to * include the "Flags" AD field". */ - if (flags) { + if (flags && (ad_len + eir_precalc_len(1) <= size)) { ptr[0] = 0x02; ptr[1] = EIR_FLAGS; ptr[2] = flags; @@ -316,7 +316,8 @@ skip_flags: } /* Provide Tx Power only if we can provide a valid value for it */ - if (adv_tx_power != HCI_TX_POWER_INVALID) { + if (adv_tx_power != HCI_TX_POWER_INVALID && + (ad_len + eir_precalc_len(1) <= size)) { ptr[0] = 0x02; ptr[1] = EIR_TX_POWER; ptr[2] = (u8)adv_tx_power; diff --git a/net/bluetooth/eir.h b/net/bluetooth/eir.h index 5c89a05e8b290..9372db83f912f 100644 --- a/net/bluetooth/eir.h +++ b/net/bluetooth/eir.h @@ -9,7 +9,7 @@ void eir_create(struct hci_dev *hdev, u8 *data); -u8 eir_create_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr); +u8 eir_create_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr, u8 size); u8 eir_create_scan_rsp(struct hci_dev *hdev, u8 instance, u8 *ptr); u8 eir_create_per_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr); diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c index 3fb70b4ee8c8a..a00316d79dbf5 100644 --- a/net/bluetooth/hci_sync.c +++ b/net/bluetooth/hci_sync.c @@ -1846,7 +1846,8 @@ static int hci_set_ext_adv_data_sync(struct hci_dev *hdev, u8 instance) return 0; } - len = eir_create_adv_data(hdev, instance, pdu->data); + len = eir_create_adv_data(hdev, instance, pdu->data, + HCI_MAX_EXT_AD_LENGTH); pdu->length = len; pdu->handle = adv ? adv->handle : instance; @@ -1877,7 +1878,7 @@ static int hci_set_adv_data_sync(struct hci_dev *hdev, u8 instance) memset(&cp, 0, sizeof(cp)); - len = eir_create_adv_data(hdev, instance, cp.data); + len = eir_create_adv_data(hdev, instance, cp.data, sizeof(cp.data)); /* There's nothing to do if the data hasn't changed */ if (hdev->adv_data_len == len && -- GitLab From 7a41744e3854e27ce0d31a1dcf4d897a2328fddb Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 11 Jun 2025 16:36:27 -0400 Subject: [PATCH 1157/2211] Bluetooth: MGMT: Fix sparse errors [ Upstream commit 7dd38ba4acbea9875b4ee061e20a26413e39d9f4 ] This fixes the following errors: net/bluetooth/mgmt.c:5400:59: sparse: sparse: incorrect type in argument 3 (different base types) @@ expected unsigned short [usertype] handle @@ got restricted __le16 [usertype] monitor_handle @@ net/bluetooth/mgmt.c:5400:59: sparse: expected unsigned short [usertype] handle net/bluetooth/mgmt.c:5400:59: sparse: got restricted __le16 [usertype] monitor_handle Fixes: e6ed54e86aae ("Bluetooth: MGMT: Fix UAF on mgmt_remove_adv_monitor_complete") Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202506060347.ux2O1p7L-lkp@intel.com/ Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- net/bluetooth/mgmt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 70a26c895512f..7664e7ba372ce 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c @@ -5166,11 +5166,11 @@ static void mgmt_adv_monitor_added(struct sock *sk, struct hci_dev *hdev, } static void mgmt_adv_monitor_removed(struct sock *sk, struct hci_dev *hdev, - u16 handle) + __le16 handle) { struct mgmt_ev_adv_monitor_removed ev; - ev.monitor_handle = cpu_to_le16(handle); + ev.monitor_handle = handle; mgmt_event(MGMT_EV_ADV_MONITOR_REMOVED, hdev, &ev, sizeof(ev), sk); } -- GitLab From adb56e5a7199046aca14b1ebe077473141151e3d Mon Sep 17 00:00:00 2001 From: Moshe Shemesh Date: Tue, 10 Jun 2025 18:15:06 +0300 Subject: [PATCH 1158/2211] net/mlx5: Ensure fw pages are always allocated on same NUMA [ Upstream commit f37258133c1e95e61db532e14067e28b4881bf24 ] When firmware asks the driver to allocate more pages, using event of give_pages, the driver should always allocate it from same NUMA, the original device NUMA. Current code uses dev_to_node() which can result in different NUMA as it is changed by other driver flows, such as mlx5_dma_zalloc_coherent_node(). Instead, use saved numa node for allocating firmware pages. Fixes: 311c7c71c9bb ("net/mlx5e: Allocate DMA coherent memory on reader NUMA node") Signed-off-by: Moshe Shemesh Reviewed-by: Tariq Toukan Signed-off-by: Mark Bloch Link: https://patch.msgid.link/20250610151514.1094735-2-mbloch@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c index 972e8e9df585b..9bc9bd83c2324 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c @@ -291,7 +291,7 @@ static void free_4k(struct mlx5_core_dev *dev, u64 addr, u32 function) static int alloc_system_page(struct mlx5_core_dev *dev, u32 function) { struct device *device = mlx5_core_dma_dev(dev); - int nid = dev_to_node(device); + int nid = dev->priv.numa_node; struct page *page; u64 zero_addr = 1; u64 addr; -- GitLab From da15ca0553325acf68039015f2f4db750c8e2b96 Mon Sep 17 00:00:00 2001 From: Amir Tzin Date: Tue, 10 Jun 2025 18:15:07 +0300 Subject: [PATCH 1159/2211] net/mlx5: Fix ECVF vports unload on shutdown flow [ Upstream commit 687560d8a9a2d654829ad0da1ec24242f1de711d ] Fix shutdown flow UAF when a virtual function is created on the embedded chip (ECVF) of a BlueField device. In such case the vport acl ingress table is not properly destroyed. ECVF functionality is independent of ecpf_vport_exists capability and thus functions mlx5_eswitch_(enable|disable)_pf_vf_vports() should not test it when enabling/disabling ECVF vports. kernel log: [] refcount_t: underflow; use-after-free. [] WARNING: CPU: 3 PID: 1 at lib/refcount.c:28 refcount_warn_saturate+0x124/0x220 ---------------- [] Call trace: [] refcount_warn_saturate+0x124/0x220 [] tree_put_node+0x164/0x1e0 [mlx5_core] [] mlx5_destroy_flow_table+0x98/0x2c0 [mlx5_core] [] esw_acl_ingress_table_destroy+0x28/0x40 [mlx5_core] [] esw_acl_ingress_lgcy_cleanup+0x80/0xf4 [mlx5_core] [] esw_legacy_vport_acl_cleanup+0x44/0x60 [mlx5_core] [] esw_vport_cleanup+0x64/0x90 [mlx5_core] [] mlx5_esw_vport_disable+0xc0/0x1d0 [mlx5_core] [] mlx5_eswitch_unload_ec_vf_vports+0xcc/0x150 [mlx5_core] [] mlx5_eswitch_disable_sriov+0x198/0x2a0 [mlx5_core] [] mlx5_device_disable_sriov+0xb8/0x1e0 [mlx5_core] [] mlx5_sriov_detach+0x40/0x50 [mlx5_core] [] mlx5_unload+0x40/0xc4 [mlx5_core] [] mlx5_unload_one_devl_locked+0x6c/0xe4 [mlx5_core] [] mlx5_unload_one+0x3c/0x60 [mlx5_core] [] shutdown+0x7c/0xa4 [mlx5_core] [] pci_device_shutdown+0x3c/0xa0 [] device_shutdown+0x170/0x340 [] __do_sys_reboot+0x1f4/0x2a0 [] __arm64_sys_reboot+0x2c/0x40 [] invoke_syscall+0x78/0x100 [] el0_svc_common.constprop.0+0x54/0x184 [] do_el0_svc+0x30/0xac [] el0_svc+0x48/0x160 [] el0t_64_sync_handler+0xa4/0x12c [] el0t_64_sync+0x1a4/0x1a8 [] --[ end trace 9c4601d68c70030e ]--- Fixes: a7719b29a821 ("net/mlx5: Add management of EC VF vports") Reviewed-by: Daniel Jurgens Reviewed-by: Moshe Shemesh Signed-off-by: Amir Tzin Signed-off-by: Mark Bloch Link: https://patch.msgid.link/20250610151514.1094735-3-mbloch@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- .../net/ethernet/mellanox/mlx5/core/eswitch.c | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c index 7aef30dbd82d6..6544546a1153f 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c @@ -1295,12 +1295,15 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw, ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_ECPF, enabled_events); if (ret) goto ecpf_err; - if (mlx5_core_ec_sriov_enabled(esw->dev)) { - ret = mlx5_eswitch_load_ec_vf_vports(esw, esw->esw_funcs.num_ec_vfs, - enabled_events); - if (ret) - goto ec_vf_err; - } + } + + /* Enable ECVF vports */ + if (mlx5_core_ec_sriov_enabled(esw->dev)) { + ret = mlx5_eswitch_load_ec_vf_vports(esw, + esw->esw_funcs.num_ec_vfs, + enabled_events); + if (ret) + goto ec_vf_err; } /* Enable VF vports */ @@ -1331,9 +1334,11 @@ void mlx5_eswitch_disable_pf_vf_vports(struct mlx5_eswitch *esw) { mlx5_eswitch_unload_vf_vports(esw, esw->esw_funcs.num_vfs); + if (mlx5_core_ec_sriov_enabled(esw->dev)) + mlx5_eswitch_unload_ec_vf_vports(esw, + esw->esw_funcs.num_ec_vfs); + if (mlx5_ecpf_vport_exists(esw->dev)) { - if (mlx5_core_ec_sriov_enabled(esw->dev)) - mlx5_eswitch_unload_ec_vf_vports(esw, esw->esw_funcs.num_vfs); mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF); } -- GitLab From 5932b1972dbe2dbac9a884b8d3de751025808fed Mon Sep 17 00:00:00 2001 From: Patrisious Haddad Date: Tue, 10 Jun 2025 18:15:08 +0300 Subject: [PATCH 1160/2211] net/mlx5: Fix return value when searching for existing flow group [ Upstream commit 8ec40e3f1f72bf8f8accf18020d487caa99f46a4 ] When attempting to add a rule to an existing flow group, if a matching flow group exists but is not active, the error code returned should be EAGAIN, so that the rule can be added to the matching flow group once it is active, rather than ENOENT, which indicates that no matching flow group was found. Fixes: bd71b08ec2ee ("net/mlx5: Support multiple updates of steering rules in parallel") Signed-off-by: Gavi Teitz Signed-off-by: Roi Dayan Signed-off-by: Patrisious Haddad Reviewed-by: Tariq Toukan Signed-off-by: Mark Bloch Link: https://patch.msgid.link/20250610151514.1094735-4-mbloch@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c index 0ce999706d412..1bc88743d2dfa 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c @@ -2200,6 +2200,7 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft, struct mlx5_flow_handle *rule; struct match_list *iter; bool take_write = false; + bool try_again = false; struct fs_fte *fte; u64 version = 0; int err; @@ -2264,6 +2265,7 @@ skip_search: nested_down_write_ref_node(&g->node, FS_LOCK_PARENT); if (!g->node.active) { + try_again = true; up_write_ref_node(&g->node, false); continue; } @@ -2285,7 +2287,8 @@ skip_search: tree_put_node(&fte->node, false); return rule; } - rule = ERR_PTR(-ENOENT); + err = try_again ? -EAGAIN : -ENOENT; + rule = ERR_PTR(err); out: kmem_cache_free(steering->ftes_cache, fte); return rule; -- GitLab From eb4b59491fea95cbf9044f4063d5408755ecc7c8 Mon Sep 17 00:00:00 2001 From: Yevgeny Kliteynik Date: Tue, 10 Jun 2025 18:15:10 +0300 Subject: [PATCH 1161/2211] net/mlx5: HWS, fix missing ip_version handling in definer [ Upstream commit b5e3c76f35ee7e814c2469c73406c5bbf110d89c ] Fix missing field handling in definer - outer IP version. Fixes: 74a778b4a63f ("net/mlx5: HWS, added definers handling") Signed-off-by: Yevgeny Kliteynik Signed-off-by: Mark Bloch Link: https://patch.msgid.link/20250610151514.1094735-6-mbloch@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- .../ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c index ab5f8f07f1f7e..72b19b05c0cf4 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c @@ -558,6 +558,9 @@ hws_definer_conv_outer(struct mlx5hws_definer_conv_data *cd, HWS_SET_HDR(fc, match_param, IP_PROTOCOL_O, outer_headers.ip_protocol, eth_l3_outer.protocol_next_header); + HWS_SET_HDR(fc, match_param, IP_VERSION_O, + outer_headers.ip_version, + eth_l3_outer.ip_version); HWS_SET_HDR(fc, match_param, IP_TTL_O, outer_headers.ttl_hoplimit, eth_l3_outer.time_to_live_hop_limit); -- GitLab From 62ef4761bb9ae4a33ed2068fd33690157ed4c48a Mon Sep 17 00:00:00 2001 From: Jianbo Liu Date: Tue, 10 Jun 2025 18:15:13 +0300 Subject: [PATCH 1162/2211] net/mlx5e: Fix leak of Geneve TLV option object [ Upstream commit aa9c44b842096c553871bc68a8cebc7861fa192b ] Previously, a unique tunnel id was added for the matching on TC non-zero chains, to support inner header rewrite with goto action. Later, it was used to support VF tunnel offload for vxlan, then for Geneve and GRE. To support VF tunnel, a temporary mlx5_flow_spec is used to parse tunnel options. For Geneve, if there is TLV option, a object is created, or refcnt is added if already exists. But the temporary mlx5_flow_spec is directly freed after parsing, which causes the leak because no information regarding the object is saved in flow's mlx5_flow_spec, which is used to free the object when deleting the flow. To fix the leak, call mlx5_geneve_tlv_option_del() before free the temporary spec if it has TLV object. Fixes: 521933cdc4aa ("net/mlx5e: Support Geneve and GRE with VF tunnel offload") Signed-off-by: Jianbo Liu Reviewed-by: Tariq Toukan Reviewed-by: Alex Lazar Signed-off-by: Mark Bloch Link: https://patch.msgid.link/20250610151514.1094735-9-mbloch@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index 218d5402cd1a6..4d766eea32a37 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c @@ -2028,9 +2028,8 @@ err_out: return err; } -static bool mlx5_flow_has_geneve_opt(struct mlx5e_tc_flow *flow) +static bool mlx5_flow_has_geneve_opt(struct mlx5_flow_spec *spec) { - struct mlx5_flow_spec *spec = &flow->attr->parse_attr->spec; void *headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters_3); @@ -2069,7 +2068,7 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv, } complete_all(&flow->del_hw_done); - if (mlx5_flow_has_geneve_opt(flow)) + if (mlx5_flow_has_geneve_opt(&attr->parse_attr->spec)) mlx5_geneve_tlv_option_del(priv->mdev->geneve); if (flow->decap_route) @@ -2574,12 +2573,13 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, err = mlx5e_tc_tun_parse(filter_dev, priv, tmp_spec, f, match_level); if (err) { - kvfree(tmp_spec); NL_SET_ERR_MSG_MOD(extack, "Failed to parse tunnel attributes"); netdev_warn(priv->netdev, "Failed to parse tunnel attributes"); - return err; + } else { + err = mlx5e_tc_set_attr_rx_tun(flow, tmp_spec); } - err = mlx5e_tc_set_attr_rx_tun(flow, tmp_spec); + if (mlx5_flow_has_geneve_opt(tmp_spec)) + mlx5_geneve_tlv_option_del(priv->mdev->geneve); kvfree(tmp_spec); if (err) return err; -- GitLab From e3f6745006dc9423d2b065b90f191cfa11b1b584 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 11 Jun 2025 11:15:11 +0000 Subject: [PATCH 1163/2211] net_sched: prio: fix a race in prio_tune() [ Upstream commit d35acc1be3480505b5931f17e4ea9b7617fea4d3 ] Gerrard Tai reported a race condition in PRIO, whenever SFQ perturb timer fires at the wrong time. The race is as follows: CPU 0 CPU 1 [1]: lock root [2]: qdisc_tree_flush_backlog() [3]: unlock root | | [5]: lock root | [6]: rehash | [7]: qdisc_tree_reduce_backlog() | [4]: qdisc_put() This can be abused to underflow a parent's qlen. Calling qdisc_purge_queue() instead of qdisc_tree_flush_backlog() should fix the race, because all packets will be purged from the qdisc before releasing the lock. Fixes: 7b8e0b6e6599 ("net: sched: prio: delay destroying child qdiscs on change") Reported-by: Gerrard Tai Suggested-by: Gerrard Tai Signed-off-by: Eric Dumazet Link: https://patch.msgid.link/20250611111515.1983366-2-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/sched/sch_prio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index cc30f7a32f1a7..9e2b9a490db23 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c @@ -211,7 +211,7 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt, memcpy(q->prio2band, qopt->priomap, TC_PRIO_MAX+1); for (i = q->bands; i < oldbands; i++) - qdisc_tree_flush_backlog(q->queues[i]); + qdisc_purge_queue(q->queues[i]); for (i = oldbands; i < q->bands; i++) { q->queues[i] = queues[i]; -- GitLab From 4b755305b2b0618e857fdadb499365b5f2e478d1 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 11 Jun 2025 11:15:12 +0000 Subject: [PATCH 1164/2211] net_sched: red: fix a race in __red_change() [ Upstream commit 85a3e0ede38450ea3053b8c45d28cf55208409b8 ] Gerrard Tai reported a race condition in RED, whenever SFQ perturb timer fires at the wrong time. The race is as follows: CPU 0 CPU 1 [1]: lock root [2]: qdisc_tree_flush_backlog() [3]: unlock root | | [5]: lock root | [6]: rehash | [7]: qdisc_tree_reduce_backlog() | [4]: qdisc_put() This can be abused to underflow a parent's qlen. Calling qdisc_purge_queue() instead of qdisc_tree_flush_backlog() should fix the race, because all packets will be purged from the qdisc before releasing the lock. Fixes: 0c8d13ac9607 ("net: sched: red: delay destroying child qdisc on replace") Reported-by: Gerrard Tai Suggested-by: Gerrard Tai Signed-off-by: Eric Dumazet Link: https://patch.msgid.link/20250611111515.1983366-3-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/sched/sch_red.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c index b5f096588fae6..0f0701ed397e9 100644 --- a/net/sched/sch_red.c +++ b/net/sched/sch_red.c @@ -283,7 +283,7 @@ static int __red_change(struct Qdisc *sch, struct nlattr **tb, q->userbits = userbits; q->limit = ctl->limit; if (child) { - qdisc_tree_flush_backlog(q->qdisc); + qdisc_purge_queue(q->qdisc); old_child = q->qdisc; q->qdisc = child; } -- GitLab From 180b12eafa8f45b251c1984879dd8933aa59b1d3 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 11 Jun 2025 11:15:13 +0000 Subject: [PATCH 1165/2211] net_sched: tbf: fix a race in tbf_change() [ Upstream commit 43eb466041216d25dedaef1c383ad7bd89929cbc ] Gerrard Tai reported a race condition in TBF, whenever SFQ perturb timer fires at the wrong time. The race is as follows: CPU 0 CPU 1 [1]: lock root [2]: qdisc_tree_flush_backlog() [3]: unlock root | | [5]: lock root | [6]: rehash | [7]: qdisc_tree_reduce_backlog() | [4]: qdisc_put() This can be abused to underflow a parent's qlen. Calling qdisc_purge_queue() instead of qdisc_tree_flush_backlog() should fix the race, because all packets will be purged from the qdisc before releasing the lock. Fixes: b05972f01e7d ("net: sched: tbf: don't call qdisc_put() while holding tree lock") Reported-by: Gerrard Tai Suggested-by: Gerrard Tai Signed-off-by: Eric Dumazet Cc: Zhengchao Shao Link: https://patch.msgid.link/20250611111515.1983366-4-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/sched/sch_tbf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index dc26b22d53c73..4c977f049670a 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c @@ -452,7 +452,7 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt, sch_tree_lock(sch); if (child) { - qdisc_tree_flush_backlog(q->qdisc); + qdisc_purge_queue(q->qdisc); old = q->qdisc; q->qdisc = child; } -- GitLab From 073f64c03516bcfaf790f8edc772e0cfb8a84ec3 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 11 Jun 2025 11:15:14 +0000 Subject: [PATCH 1166/2211] net_sched: ets: fix a race in ets_qdisc_change() [ Upstream commit d92adacdd8c2960be856e0b82acc5b7c5395fddb ] Gerrard Tai reported a race condition in ETS, whenever SFQ perturb timer fires at the wrong time. The race is as follows: CPU 0 CPU 1 [1]: lock root [2]: qdisc_tree_flush_backlog() [3]: unlock root | | [5]: lock root | [6]: rehash | [7]: qdisc_tree_reduce_backlog() | [4]: qdisc_put() This can be abused to underflow a parent's qlen. Calling qdisc_purge_queue() instead of qdisc_tree_flush_backlog() should fix the race, because all packets will be purged from the qdisc before releasing the lock. Fixes: b05972f01e7d ("net: sched: tbf: don't call qdisc_put() while holding tree lock") Reported-by: Gerrard Tai Suggested-by: Gerrard Tai Signed-off-by: Eric Dumazet Link: https://patch.msgid.link/20250611111515.1983366-5-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/sched/sch_ets.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/sched/sch_ets.c b/net/sched/sch_ets.c index 2c069f0181c62..037f764822b96 100644 --- a/net/sched/sch_ets.c +++ b/net/sched/sch_ets.c @@ -661,7 +661,7 @@ static int ets_qdisc_change(struct Qdisc *sch, struct nlattr *opt, for (i = q->nbands; i < oldbands; i++) { if (i >= q->nstrict && q->classes[i].qdisc->q.qlen) list_del_init(&q->classes[i].alist); - qdisc_tree_flush_backlog(q->classes[i].qdisc); + qdisc_purge_queue(q->classes[i].qdisc); } WRITE_ONCE(q->nstrict, nstrict); memcpy(q->prio2band, priomap, sizeof(priomap)); -- GitLab From a8ff2e362d901200a1075c3ca9c56d9c7bbef389 Mon Sep 17 00:00:00 2001 From: Jakub Kicinski Date: Wed, 11 Jun 2025 10:46:43 -0700 Subject: [PATCH 1167/2211] net: drv: netdevsim: don't napi_complete() from netpoll [ Upstream commit 1264971017b4d7141352a7fe29021bdfce5d885d ] netdevsim supports netpoll. Make sure we don't call napi_complete() from it, since it may not be scheduled. Breno reports hitting a warning in napi_complete_done(): WARNING: CPU: 14 PID: 104 at net/core/dev.c:6592 napi_complete_done+0x2cc/0x560 __napi_poll+0x2d8/0x3a0 handle_softirqs+0x1fe/0x710 This is presumably after netpoll stole the SCHED bit prematurely. Reported-by: Breno Leitao Fixes: 3762ec05a9fb ("netdevsim: add NAPI support") Tested-by: Breno Leitao Link: https://patch.msgid.link/20250611174643.2769263-1-kuba@kernel.org Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/netdevsim/netdev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c index 1b29d1d794a20..79b898311819d 100644 --- a/drivers/net/netdevsim/netdev.c +++ b/drivers/net/netdevsim/netdev.c @@ -353,7 +353,8 @@ static int nsim_poll(struct napi_struct *napi, int budget) int done; done = nsim_rcv(rq, budget); - napi_complete(napi); + if (done < budget) + napi_complete_done(napi, done); return done; } -- GitLab From 58c50f45e1821a04d61b62514f9bd34afe67c622 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Thu, 10 Apr 2025 17:11:14 +0100 Subject: [PATCH 1168/2211] btrfs: exit after state insertion failure at btrfs_convert_extent_bit() [ Upstream commit 3bf179e36da917c5d9bec71c714573ed1649b7c1 ] If insert_state() state failed it returns an error pointer and we call extent_io_tree_panic() which will trigger a BUG() call. However if CONFIG_BUG is disabled, which is an uncommon and exotic scenario, then we fallthrough and call cache_state() which will dereference the error pointer, resulting in an invalid memory access. So jump to the 'out' label after calling extent_io_tree_panic(), it also makes the code more clear besides dealing with the exotic scenario where CONFIG_BUG is disabled. Signed-off-by: Filipe Manana Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/extent-io-tree.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/btrfs/extent-io-tree.c b/fs/btrfs/extent-io-tree.c index 6d08c100b01de..bb3aaf610652a 100644 --- a/fs/btrfs/extent-io-tree.c +++ b/fs/btrfs/extent-io-tree.c @@ -1456,6 +1456,7 @@ hit_next: if (IS_ERR(inserted_state)) { ret = PTR_ERR(inserted_state); extent_io_tree_panic(tree, prealloc, "insert", ret); + goto out; } cache_state(inserted_state, cached_state); if (inserted_state == prealloc) -- GitLab From 0a2500782f4d48de0e8ce8013983bbe90bf7eba2 Mon Sep 17 00:00:00 2001 From: Zijun Hu Date: Thu, 10 Apr 2025 19:45:27 +0800 Subject: [PATCH 1169/2211] fs/filesystems: Fix potential unsigned integer underflow in fs_name() [ Upstream commit 1363c134ade81e425873b410566e957fecebb261 ] fs_name() has @index as unsigned int, so there is underflow risk for operation '@index--'. Fix by breaking the for loop when '@index == 0' which is also more proper than '@index <= 0' for unsigned integer comparison. Signed-off-by: Zijun Hu Link: https://lore.kernel.org/20250410-fix_fs-v1-1-7c14ccc8ebaa@quicinc.com Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/filesystems.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/fs/filesystems.c b/fs/filesystems.c index 58b9067b2391c..95e5256821a53 100644 --- a/fs/filesystems.c +++ b/fs/filesystems.c @@ -156,15 +156,19 @@ static int fs_index(const char __user * __name) static int fs_name(unsigned int index, char __user * buf) { struct file_system_type * tmp; - int len, res; + int len, res = -EINVAL; read_lock(&file_systems_lock); - for (tmp = file_systems; tmp; tmp = tmp->next, index--) - if (index <= 0 && try_module_get(tmp->owner)) + for (tmp = file_systems; tmp; tmp = tmp->next, index--) { + if (index == 0) { + if (try_module_get(tmp->owner)) + res = 0; break; + } + } read_unlock(&file_systems_lock); - if (!tmp) - return -EINVAL; + if (res) + return res; /* OK, we got the reference, so we can safely block */ len = strlen(tmp->name) + 1; -- GitLab From 7b4bf4d8968384b9b61a610f3494e245d68cd3c7 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Fri, 4 Apr 2025 21:02:28 +0200 Subject: [PATCH 1170/2211] gfs2: pass through holder from the VFS for freeze/thaw [ Upstream commit 62a2175ddf7e72941868f164b7c1f92e00f213bd ] The filesystem's freeze/thaw functions can be called from contexts where the holder isn't userspace but the kernel, e.g., during systemd suspend/hibernate. So pass through the freeze/thaw flags from the VFS instead of hard-coding them. Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/gfs2/super.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 6d62ff5cb445a..5ecb857cf74e3 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -674,7 +674,7 @@ static int gfs2_sync_fs(struct super_block *sb, int wait) return sdp->sd_log_error; } -static int gfs2_do_thaw(struct gfs2_sbd *sdp) +static int gfs2_do_thaw(struct gfs2_sbd *sdp, enum freeze_holder who) { struct super_block *sb = sdp->sd_vfs; int error; @@ -682,7 +682,7 @@ static int gfs2_do_thaw(struct gfs2_sbd *sdp) error = gfs2_freeze_lock_shared(sdp); if (error) goto fail; - error = thaw_super(sb, FREEZE_HOLDER_USERSPACE); + error = thaw_super(sb, who); if (!error) return 0; @@ -710,7 +710,7 @@ void gfs2_freeze_func(struct work_struct *work) gfs2_freeze_unlock(sdp); set_bit(SDF_FROZEN, &sdp->sd_flags); - error = gfs2_do_thaw(sdp); + error = gfs2_do_thaw(sdp, FREEZE_HOLDER_USERSPACE); if (error) goto out; @@ -728,6 +728,7 @@ out: /** * gfs2_freeze_super - prevent further writes to the filesystem * @sb: the VFS structure for the filesystem + * @who: freeze flags * */ @@ -744,7 +745,7 @@ static int gfs2_freeze_super(struct super_block *sb, enum freeze_holder who) } for (;;) { - error = freeze_super(sb, FREEZE_HOLDER_USERSPACE); + error = freeze_super(sb, who); if (error) { fs_info(sdp, "GFS2: couldn't freeze filesystem: %d\n", error); @@ -758,7 +759,7 @@ static int gfs2_freeze_super(struct super_block *sb, enum freeze_holder who) break; } - error = gfs2_do_thaw(sdp); + error = gfs2_do_thaw(sdp, who); if (error) goto out; @@ -796,6 +797,7 @@ static int gfs2_freeze_fs(struct super_block *sb) /** * gfs2_thaw_super - reallow writes to the filesystem * @sb: the VFS structure for the filesystem + * @who: freeze flags * */ @@ -814,7 +816,7 @@ static int gfs2_thaw_super(struct super_block *sb, enum freeze_holder who) atomic_inc(&sb->s_active); gfs2_freeze_unlock(sdp); - error = gfs2_do_thaw(sdp); + error = gfs2_do_thaw(sdp, who); if (!error) { clear_bit(SDF_FREEZE_INITIATOR, &sdp->sd_flags); -- GitLab From 3c04fafeb3ee233617c185b6bc6c3fe96e03b602 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Wed, 16 Apr 2025 16:00:28 +0100 Subject: [PATCH 1171/2211] btrfs: exit after state split error at set_extent_bit() [ Upstream commit 41d69d4d78d8b179bf3bcdfc56d28a12b3a608d2 ] If split_state() returned an error we call extent_io_tree_panic() which will trigger a BUG() call. However if CONFIG_BUG is disabled, which is an uncommon and exotic scenario, then we fallthrough and hit a use after free when calling set_state_bits() since the extent state record which the local variable 'prealloc' points to was freed by split_state(). So jump to the label 'out' after calling extent_io_tree_panic() and set the 'prealloc' pointer to NULL since split_state() has already freed it when it hit an error. Signed-off-by: Filipe Manana Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/extent-io-tree.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/extent-io-tree.c b/fs/btrfs/extent-io-tree.c index bb3aaf610652a..5f9a43734812e 100644 --- a/fs/btrfs/extent-io-tree.c +++ b/fs/btrfs/extent-io-tree.c @@ -1252,8 +1252,11 @@ hit_next: if (!prealloc) goto search_again; ret = split_state(tree, state, prealloc, end + 1); - if (ret) + if (ret) { extent_io_tree_panic(tree, state, "split", ret); + prealloc = NULL; + goto out; + } set_state_bits(tree, prealloc, bits, changeset); cache_state(prealloc, cached_state); -- GitLab From 1c09795ecee86c85cc61ddd3849f951170149f0b Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Wed, 7 May 2025 14:23:03 +0200 Subject: [PATCH 1172/2211] nvmet-fcloop: access fcpreq only when holding reqlock [ Upstream commit 47a827cd7929d0550c3496d70b417fcb5649b27b ] The abort handling logic expects that the state and the fcpreq are only accessed when holding the reqlock lock. While at it, only handle the aborts in the abort handler. Signed-off-by: Daniel Wagner Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/target/fcloop.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index da195d61a9664..f1b5ffc00ce88 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -623,12 +623,13 @@ fcloop_fcp_recv_work(struct work_struct *work) { struct fcloop_fcpreq *tfcp_req = container_of(work, struct fcloop_fcpreq, fcp_rcv_work); - struct nvmefc_fcp_req *fcpreq = tfcp_req->fcpreq; + struct nvmefc_fcp_req *fcpreq; unsigned long flags; int ret = 0; bool aborted = false; spin_lock_irqsave(&tfcp_req->reqlock, flags); + fcpreq = tfcp_req->fcpreq; switch (tfcp_req->inistate) { case INI_IO_START: tfcp_req->inistate = INI_IO_ACTIVE; @@ -643,16 +644,19 @@ fcloop_fcp_recv_work(struct work_struct *work) } spin_unlock_irqrestore(&tfcp_req->reqlock, flags); - if (unlikely(aborted)) - ret = -ECANCELED; - else { - if (likely(!check_for_drop(tfcp_req))) - ret = nvmet_fc_rcv_fcp_req(tfcp_req->tport->targetport, - &tfcp_req->tgt_fcp_req, - fcpreq->cmdaddr, fcpreq->cmdlen); - else - pr_info("%s: dropped command ********\n", __func__); + if (unlikely(aborted)) { + /* the abort handler will call fcloop_call_host_done */ + return; + } + + if (unlikely(check_for_drop(tfcp_req))) { + pr_info("%s: dropped command ********\n", __func__); + return; } + + ret = nvmet_fc_rcv_fcp_req(tfcp_req->tport->targetport, + &tfcp_req->tgt_fcp_req, + fcpreq->cmdaddr, fcpreq->cmdlen); if (ret) fcloop_call_host_done(fcpreq, tfcp_req, ret); } @@ -667,9 +671,10 @@ fcloop_fcp_abort_recv_work(struct work_struct *work) unsigned long flags; spin_lock_irqsave(&tfcp_req->reqlock, flags); - fcpreq = tfcp_req->fcpreq; switch (tfcp_req->inistate) { case INI_IO_ABORTED: + fcpreq = tfcp_req->fcpreq; + tfcp_req->fcpreq = NULL; break; case INI_IO_COMPLETED: completed = true; @@ -691,10 +696,6 @@ fcloop_fcp_abort_recv_work(struct work_struct *work) nvmet_fc_rcv_fcp_abort(tfcp_req->tport->targetport, &tfcp_req->tgt_fcp_req); - spin_lock_irqsave(&tfcp_req->reqlock, flags); - tfcp_req->fcpreq = NULL; - spin_unlock_irqrestore(&tfcp_req->reqlock, flags); - fcloop_call_host_done(fcpreq, tfcp_req, -ECANCELED); /* call_host_done releases reference for abort downcall */ } -- GitLab From f351bb3085016cd4471f11ca8965228d418e7753 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Fri, 17 Jan 2025 10:54:50 +0100 Subject: [PATCH 1173/2211] perf: Ensure bpf_perf_link path is properly serialized [ Upstream commit 7ed9138a72829d2035ecbd8dbd35b1bc3c137c40 ] Ravi reported that the bpf_perf_link_attach() usage of perf_event_set_bpf_prog() is not serialized by ctx->mutex, unlike the PERF_EVENT_IOC_SET_BPF case. Reported-by: Ravi Bangoria Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Ravi Bangoria Link: https://lkml.kernel.org/r/20250307193305.486326750@infradead.org Signed-off-by: Sasha Levin --- kernel/events/core.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index 8352376d82154..9ce82904f761d 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -6031,6 +6031,9 @@ static int perf_event_set_output(struct perf_event *event, static int perf_event_set_filter(struct perf_event *event, void __user *arg); static int perf_copy_attr(struct perf_event_attr __user *uattr, struct perf_event_attr *attr); +static int __perf_event_set_bpf_prog(struct perf_event *event, + struct bpf_prog *prog, + u64 bpf_cookie); static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned long arg) { @@ -6099,7 +6102,7 @@ static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned lon if (IS_ERR(prog)) return PTR_ERR(prog); - err = perf_event_set_bpf_prog(event, prog, 0); + err = __perf_event_set_bpf_prog(event, prog, 0); if (err) { bpf_prog_put(prog); return err; @@ -10756,8 +10759,9 @@ static inline bool perf_event_is_tracing(struct perf_event *event) return false; } -int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog, - u64 bpf_cookie) +static int __perf_event_set_bpf_prog(struct perf_event *event, + struct bpf_prog *prog, + u64 bpf_cookie) { bool is_kprobe, is_uprobe, is_tracepoint, is_syscall_tp; @@ -10795,6 +10799,20 @@ int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog, return perf_event_attach_bpf_prog(event, prog, bpf_cookie); } +int perf_event_set_bpf_prog(struct perf_event *event, + struct bpf_prog *prog, + u64 bpf_cookie) +{ + struct perf_event_context *ctx; + int ret; + + ctx = perf_event_ctx_lock(event); + ret = __perf_event_set_bpf_prog(event, prog, bpf_cookie); + perf_event_ctx_unlock(event, ctx); + + return ret; +} + void perf_event_free_bpf_prog(struct perf_event *event) { if (!perf_event_is_tracing(event)) { @@ -10814,7 +10832,15 @@ static void perf_event_free_filter(struct perf_event *event) { } -int perf_event_set_bpf_prog(struct perf_event *event, struct bpf_prog *prog, +static int __perf_event_set_bpf_prog(struct perf_event *event, + struct bpf_prog *prog, + u64 bpf_cookie) +{ + return -ENOENT; +} + +int perf_event_set_bpf_prog(struct perf_event *event, + struct bpf_prog *prog, u64 bpf_cookie) { return -ENOENT; -- GitLab From a5c7b61eed6dfc41ed1123581fdfe7c2e4f17bb7 Mon Sep 17 00:00:00 2001 From: Ming Lei Date: Mon, 5 May 2025 22:17:42 +0800 Subject: [PATCH 1174/2211] block: use q->elevator with ->elevator_lock held in elv_iosched_show() [ Upstream commit 94209d27d14104ed828ca88cd5403a99162fe51a ] Use q->elevator with ->elevator_lock held in elv_iosched_show(), since the local cached elevator reference may become stale after getting ->elevator_lock. Reviewed-by: Hannes Reinecke Reviewed-by: Nilay Shroff Reviewed-by: Christoph Hellwig Signed-off-by: Ming Lei Link: https://lore.kernel.org/r/20250505141805.2751237-5-ming.lei@redhat.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- block/elevator.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/block/elevator.c b/block/elevator.c index 43ba4ab1ada7f..1f76e9efd7717 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -752,7 +752,6 @@ ssize_t elv_iosched_store(struct gendisk *disk, const char *buf, ssize_t elv_iosched_show(struct gendisk *disk, char *name) { struct request_queue *q = disk->queue; - struct elevator_queue *eq = q->elevator; struct elevator_type *cur = NULL, *e; int len = 0; @@ -763,7 +762,7 @@ ssize_t elv_iosched_show(struct gendisk *disk, char *name) len += sprintf(name+len, "[none] "); } else { len += sprintf(name+len, "none "); - cur = eq->type; + cur = q->elevator->type; } spin_lock(&elv_list_lock); -- GitLab From af8c13f9ee040b9a287ba246cf0055f7c77b7cc8 Mon Sep 17 00:00:00 2001 From: Penglei Jiang Date: Tue, 10 Jun 2025 10:18:01 -0700 Subject: [PATCH 1175/2211] io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo() [ Upstream commit ac0b8b327a5677dc6fecdf353d808161525b1ff0 ] syzbot reports: BUG: KASAN: slab-use-after-free in getrusage+0x1109/0x1a60 Read of size 8 at addr ffff88810de2d2c8 by task a.out/304 CPU: 0 UID: 0 PID: 304 Comm: a.out Not tainted 6.16.0-rc1 #1 PREEMPT(voluntary) Hardware name: QEMU Ubuntu 24.04 PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 Call Trace: dump_stack_lvl+0x53/0x70 print_report+0xd0/0x670 ? __pfx__raw_spin_lock_irqsave+0x10/0x10 ? getrusage+0x1109/0x1a60 kasan_report+0xce/0x100 ? getrusage+0x1109/0x1a60 getrusage+0x1109/0x1a60 ? __pfx_getrusage+0x10/0x10 __io_uring_show_fdinfo+0x9fe/0x1790 ? ksys_read+0xf7/0x1c0 ? do_syscall_64+0xa4/0x260 ? vsnprintf+0x591/0x1100 ? __pfx___io_uring_show_fdinfo+0x10/0x10 ? __pfx_vsnprintf+0x10/0x10 ? mutex_trylock+0xcf/0x130 ? __pfx_mutex_trylock+0x10/0x10 ? __pfx_show_fd_locks+0x10/0x10 ? io_uring_show_fdinfo+0x57/0x80 io_uring_show_fdinfo+0x57/0x80 seq_show+0x38c/0x690 seq_read_iter+0x3f7/0x1180 ? inode_set_ctime_current+0x160/0x4b0 seq_read+0x271/0x3e0 ? __pfx_seq_read+0x10/0x10 ? __pfx__raw_spin_lock+0x10/0x10 ? __mark_inode_dirty+0x402/0x810 ? selinux_file_permission+0x368/0x500 ? file_update_time+0x10f/0x160 vfs_read+0x177/0xa40 ? __pfx___handle_mm_fault+0x10/0x10 ? __pfx_vfs_read+0x10/0x10 ? mutex_lock+0x81/0xe0 ? __pfx_mutex_lock+0x10/0x10 ? fdget_pos+0x24d/0x4b0 ksys_read+0xf7/0x1c0 ? __pfx_ksys_read+0x10/0x10 ? do_user_addr_fault+0x43b/0x9c0 do_syscall_64+0xa4/0x260 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f0f74170fc9 Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 8 RSP: 002b:00007fffece049e8 EFLAGS: 00000206 ORIG_RAX: 0000000000000000 RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f0f74170fc9 RDX: 0000000000001000 RSI: 00007fffece049f0 RDI: 0000000000000004 RBP: 00007fffece05ad0 R08: 0000000000000000 R09: 00007fffece04d90 R10: 0000000000000000 R11: 0000000000000206 R12: 00005651720a1100 R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000 Allocated by task 298: kasan_save_stack+0x33/0x60 kasan_save_track+0x14/0x30 __kasan_slab_alloc+0x6e/0x70 kmem_cache_alloc_node_noprof+0xe8/0x330 copy_process+0x376/0x5e00 create_io_thread+0xab/0xf0 io_sq_offload_create+0x9ed/0xf20 io_uring_setup+0x12b0/0x1cc0 do_syscall_64+0xa4/0x260 entry_SYSCALL_64_after_hwframe+0x77/0x7f Freed by task 22: kasan_save_stack+0x33/0x60 kasan_save_track+0x14/0x30 kasan_save_free_info+0x3b/0x60 __kasan_slab_free+0x37/0x50 kmem_cache_free+0xc4/0x360 rcu_core+0x5ff/0x19f0 handle_softirqs+0x18c/0x530 run_ksoftirqd+0x20/0x30 smpboot_thread_fn+0x287/0x6c0 kthread+0x30d/0x630 ret_from_fork+0xef/0x1a0 ret_from_fork_asm+0x1a/0x30 Last potentially related work creation: kasan_save_stack+0x33/0x60 kasan_record_aux_stack+0x8c/0xa0 __call_rcu_common.constprop.0+0x68/0x940 __schedule+0xff2/0x2930 __cond_resched+0x4c/0x80 mutex_lock+0x5c/0xe0 io_uring_del_tctx_node+0xe1/0x2b0 io_uring_clean_tctx+0xb7/0x160 io_uring_cancel_generic+0x34e/0x760 do_exit+0x240/0x2350 do_group_exit+0xab/0x220 __x64_sys_exit_group+0x39/0x40 x64_sys_call+0x1243/0x1840 do_syscall_64+0xa4/0x260 entry_SYSCALL_64_after_hwframe+0x77/0x7f The buggy address belongs to the object at ffff88810de2cb00 which belongs to the cache task_struct of size 3712 The buggy address is located 1992 bytes inside of freed 3712-byte region [ffff88810de2cb00, ffff88810de2d980) which is caused by the task_struct pointed to by sq->thread being released while it is being used in the function __io_uring_show_fdinfo(). Holding ctx->uring_lock does not prevent ehre relase or exit of sq->thread. Fix this by assigning and looking up ->thread under RCU, and grabbing a reference to the task_struct. This ensures that it cannot get released while fdinfo is using it. Reported-by: syzbot+531502bbbe51d2f769f4@syzkaller.appspotmail.com Closes: https://lore.kernel.org/all/682b06a5.a70a0220.3849cf.00b3.GAE@google.com Fixes: 3fcb9d17206e ("io_uring/sqpoll: statistics of the true utilization of sq threads") Signed-off-by: Penglei Jiang Link: https://lore.kernel.org/r/20250610171801.70960-1-superman.xpt@gmail.com [axboe: massage commit message] Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- io_uring/fdinfo.c | 12 ++++++++++-- io_uring/sqpoll.c | 9 ++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/io_uring/fdinfo.c b/io_uring/fdinfo.c index ecdbe473a49f7..c6c624eb9866d 100644 --- a/io_uring/fdinfo.c +++ b/io_uring/fdinfo.c @@ -146,18 +146,26 @@ __cold void io_uring_show_fdinfo(struct seq_file *m, struct file *file) if (has_lock && (ctx->flags & IORING_SETUP_SQPOLL)) { struct io_sq_data *sq = ctx->sq_data; + struct task_struct *tsk; + rcu_read_lock(); + tsk = rcu_dereference(sq->thread); /* * sq->thread might be NULL if we raced with the sqpoll * thread termination. */ - if (sq->thread) { + if (tsk) { + get_task_struct(tsk); + rcu_read_unlock(); + getrusage(tsk, RUSAGE_SELF, &sq_usage); + put_task_struct(tsk); sq_pid = sq->task_pid; sq_cpu = sq->sq_cpu; - getrusage(sq->thread, RUSAGE_SELF, &sq_usage); sq_total_time = (sq_usage.ru_stime.tv_sec * 1000000 + sq_usage.ru_stime.tv_usec); sq_work_time = sq->work_time; + } else { + rcu_read_unlock(); } } diff --git a/io_uring/sqpoll.c b/io_uring/sqpoll.c index 430922c541681..b0f17a1220ecd 100644 --- a/io_uring/sqpoll.c +++ b/io_uring/sqpoll.c @@ -277,7 +277,8 @@ static int io_sq_thread(void *data) /* offload context creation failed, just exit */ if (!current->io_uring) { mutex_lock(&sqd->lock); - sqd->thread = NULL; + rcu_assign_pointer(sqd->thread, NULL); + put_task_struct(current); mutex_unlock(&sqd->lock); goto err_out; } @@ -386,7 +387,8 @@ static int io_sq_thread(void *data) io_sq_tw(&retry_list, UINT_MAX); io_uring_cancel_generic(true, sqd); - sqd->thread = NULL; + rcu_assign_pointer(sqd->thread, NULL); + put_task_struct(current); list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) atomic_or(IORING_SQ_NEED_WAKEUP, &ctx->rings->sq_flags); io_run_task_work(); @@ -507,9 +509,6 @@ __cold int io_sq_offload_create(struct io_ring_ctx *ctx, ret = -EINVAL; goto err; } - - if (task_to_put) - put_task_struct(task_to_put); return 0; err_sqpoll: complete(&ctx->sq_data->exited); -- GitLab From 0fccb6773b1f4f992e435582cf8e050de421b678 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 11 Jun 2025 06:44:16 +0200 Subject: [PATCH 1176/2211] block: don't use submit_bio_noacct_nocheck in blk_zone_wplug_bio_work [ Upstream commit cf625013d8741c01407bbb4a60c111b61b9fa69d ] Bios queued up in the zone write plug have already gone through all all preparation in the submit_bio path, including the freeze protection. Submitting them through submit_bio_noacct_nocheck duplicates the work and can can cause deadlocks when freezing a queue with pending bio write plugs. Go straight to ->submit_bio or blk_mq_submit_bio to bypass the superfluous extra freeze protection and checks. Fixes: 9b1ce7f0c6f8 ("block: Implement zone append emulation") Reported-by: Bart Van Assche Signed-off-by: Christoph Hellwig Reviewed-by: Johannes Thumshirn Reviewed-by: Damien Le Moal Tested-by: Damien Le Moal Link: https://lore.kernel.org/r/20250611044416.2351850-1-hch@lst.de Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- block/blk-zoned.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/block/blk-zoned.c b/block/blk-zoned.c index 414118435240a..164ded9eb1444 100644 --- a/block/blk-zoned.c +++ b/block/blk-zoned.c @@ -1321,7 +1321,6 @@ again: spin_unlock_irqrestore(&zwplug->lock, flags); bdev = bio->bi_bdev; - submit_bio_noacct_nocheck(bio); /* * blk-mq devices will reuse the extra reference on the request queue @@ -1329,8 +1328,12 @@ again: * path for BIO-based devices will not do that. So drop this extra * reference here. */ - if (bdev_test_flag(bdev, BD_HAS_SUBMIT_BIO)) + if (bdev_test_flag(bdev, BD_HAS_SUBMIT_BIO)) { + bdev->bd_disk->fops->submit_bio(bio); blk_queue_exit(bdev->bd_disk->queue); + } else { + blk_mq_submit_bio(bio); + } put_zwplug: /* Drop the reference we took in disk_zone_wplug_schedule_bio_work(). */ -- GitLab From 48f33ec1410756957889a3642199aee065d1167f Mon Sep 17 00:00:00 2001 From: Keith Busch Date: Wed, 11 Jun 2025 13:53:43 -0700 Subject: [PATCH 1177/2211] io_uring: consistently use rcu semantics with sqpoll thread [ Upstream commit c538f400fae22725580842deb2bef546701b64bd ] The sqpoll thread is dereferenced with rcu read protection in one place, so it needs to be annotated as an __rcu type, and should consistently use rcu helpers for access and assignment to make sparse happy. Since most of the accesses occur under the sqd->lock, we can use rcu_dereference_protected() without declaring an rcu read section. Provide a simple helper to get the thread from a locked context. Fixes: ac0b8b327a5677d ("io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo()") Signed-off-by: Keith Busch Link: https://lore.kernel.org/r/20250611205343.1821117-1-kbusch@meta.com [axboe: fold in fix for register.c] Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- io_uring/io_uring.c | 4 ++-- io_uring/register.c | 7 +++++-- io_uring/sqpoll.c | 34 ++++++++++++++++++++++++---------- io_uring/sqpoll.h | 8 +++++++- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index bd3b3f7a6f6ca..64870f51b6788 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -2916,7 +2916,7 @@ static __cold void io_ring_exit_work(struct work_struct *work) struct task_struct *tsk; io_sq_thread_park(sqd); - tsk = sqd->thread; + tsk = sqpoll_task_locked(sqd); if (tsk && tsk->io_uring && tsk->io_uring->io_wq) io_wq_cancel_cb(tsk->io_uring->io_wq, io_cancel_ctx_cb, ctx, true); @@ -3153,7 +3153,7 @@ __cold void io_uring_cancel_generic(bool cancel_all, struct io_sq_data *sqd) s64 inflight; DEFINE_WAIT(wait); - WARN_ON_ONCE(sqd && sqd->thread != current); + WARN_ON_ONCE(sqd && sqpoll_task_locked(sqd) != current); if (!current->io_uring) return; diff --git a/io_uring/register.c b/io_uring/register.c index eca26d4884d9a..a325b493ae121 100644 --- a/io_uring/register.c +++ b/io_uring/register.c @@ -268,6 +268,8 @@ static __cold int io_register_iowq_max_workers(struct io_ring_ctx *ctx, if (ctx->flags & IORING_SETUP_SQPOLL) { sqd = ctx->sq_data; if (sqd) { + struct task_struct *tsk; + /* * Observe the correct sqd->lock -> ctx->uring_lock * ordering. Fine to drop uring_lock here, we hold @@ -277,8 +279,9 @@ static __cold int io_register_iowq_max_workers(struct io_ring_ctx *ctx, mutex_unlock(&ctx->uring_lock); mutex_lock(&sqd->lock); mutex_lock(&ctx->uring_lock); - if (sqd->thread) - tctx = sqd->thread->io_uring; + tsk = sqpoll_task_locked(sqd); + if (tsk) + tctx = tsk->io_uring; } } else { tctx = current->io_uring; diff --git a/io_uring/sqpoll.c b/io_uring/sqpoll.c index b0f17a1220ecd..9a63068948957 100644 --- a/io_uring/sqpoll.c +++ b/io_uring/sqpoll.c @@ -30,7 +30,7 @@ enum { void io_sq_thread_unpark(struct io_sq_data *sqd) __releases(&sqd->lock) { - WARN_ON_ONCE(sqd->thread == current); + WARN_ON_ONCE(sqpoll_task_locked(sqd) == current); /* * Do the dance but not conditional clear_bit() because it'd race with @@ -45,24 +45,32 @@ void io_sq_thread_unpark(struct io_sq_data *sqd) void io_sq_thread_park(struct io_sq_data *sqd) __acquires(&sqd->lock) { - WARN_ON_ONCE(data_race(sqd->thread) == current); + struct task_struct *tsk; atomic_inc(&sqd->park_pending); set_bit(IO_SQ_THREAD_SHOULD_PARK, &sqd->state); mutex_lock(&sqd->lock); - if (sqd->thread) - wake_up_process(sqd->thread); + + tsk = sqpoll_task_locked(sqd); + if (tsk) { + WARN_ON_ONCE(tsk == current); + wake_up_process(tsk); + } } void io_sq_thread_stop(struct io_sq_data *sqd) { - WARN_ON_ONCE(sqd->thread == current); + struct task_struct *tsk; + WARN_ON_ONCE(test_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state)); set_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state); mutex_lock(&sqd->lock); - if (sqd->thread) - wake_up_process(sqd->thread); + tsk = sqpoll_task_locked(sqd); + if (tsk) { + WARN_ON_ONCE(tsk == current); + wake_up_process(tsk); + } mutex_unlock(&sqd->lock); wait_for_completion(&sqd->exited); } @@ -498,7 +506,10 @@ __cold int io_sq_offload_create(struct io_ring_ctx *ctx, goto err_sqpoll; } - sqd->thread = tsk; + mutex_lock(&sqd->lock); + rcu_assign_pointer(sqd->thread, tsk); + mutex_unlock(&sqd->lock); + task_to_put = get_task_struct(tsk); ret = io_uring_alloc_task_context(tsk, ctx); wake_up_new_task(tsk); @@ -526,10 +537,13 @@ __cold int io_sqpoll_wq_cpu_affinity(struct io_ring_ctx *ctx, int ret = -EINVAL; if (sqd) { + struct task_struct *tsk; + io_sq_thread_park(sqd); /* Don't set affinity for a dying thread */ - if (sqd->thread) - ret = io_wq_cpu_affinity(sqd->thread->io_uring, mask); + tsk = sqpoll_task_locked(sqd); + if (tsk) + ret = io_wq_cpu_affinity(tsk->io_uring, mask); io_sq_thread_unpark(sqd); } diff --git a/io_uring/sqpoll.h b/io_uring/sqpoll.h index 4171666b1cf4c..b83dcdec9765f 100644 --- a/io_uring/sqpoll.h +++ b/io_uring/sqpoll.h @@ -8,7 +8,7 @@ struct io_sq_data { /* ctx's that are using this sqd */ struct list_head ctx_list; - struct task_struct *thread; + struct task_struct __rcu *thread; struct wait_queue_head wait; unsigned sq_thread_idle; @@ -29,3 +29,9 @@ void io_sq_thread_unpark(struct io_sq_data *sqd); void io_put_sq_data(struct io_sq_data *sqd); void io_sqpoll_wait_sq(struct io_ring_ctx *ctx); int io_sqpoll_wq_cpu_affinity(struct io_ring_ctx *ctx, cpumask_var_t mask); + +static inline struct task_struct *sqpoll_task_locked(struct io_sq_data *sqd) +{ + return rcu_dereference_protected(sqd->thread, + lockdep_is_held(&sqd->lock)); +} -- GitLab From a9022c86312c4c8e2117a84a7d82c6be086b2db8 Mon Sep 17 00:00:00 2001 From: "Matthew Wilcox (Oracle)" Date: Thu, 12 Jun 2025 15:41:25 +0100 Subject: [PATCH 1178/2211] bio: Fix bio_first_folio() for SPARSEMEM without VMEMMAP [ Upstream commit f826ec7966a63d48e16e0868af4e038bf9a1a3ae ] It is possible for physically contiguous folios to have discontiguous struct pages if SPARSEMEM is enabled and SPARSEMEM_VMEMMAP is not. This is correctly handled by folio_page_idx(), so remove this open-coded implementation. Fixes: 640d1930bef4 (block: Add bio_for_each_folio_all()) Signed-off-by: Matthew Wilcox (Oracle) Link: https://lore.kernel.org/r/20250612144126.2849931-1-willy@infradead.org Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- include/linux/bio.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/bio.h b/include/linux/bio.h index 9e98fb87e7ef7..1289b8e487801 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -294,7 +294,7 @@ static inline void bio_first_folio(struct folio_iter *fi, struct bio *bio, fi->folio = page_folio(bvec->bv_page); fi->offset = bvec->bv_offset + - PAGE_SIZE * (bvec->bv_page - &fi->folio->page); + PAGE_SIZE * folio_page_idx(fi->folio, bvec->bv_page); fi->_seg_count = bvec->bv_len; fi->length = min(folio_size(fi->folio) - fi->offset, fi->_seg_count); fi->_next = folio_next(fi->folio); -- GitLab From 4b1ef15ffd9f3b9b69ecdd324bbcf890872223e5 Mon Sep 17 00:00:00 2001 From: "Matthew Wilcox (Oracle)" Date: Thu, 12 Jun 2025 15:42:53 +0100 Subject: [PATCH 1179/2211] block: Fix bvec_set_folio() for very large folios [ Upstream commit 5e223e06ee7c6d8f630041a0645ac90e39a42cc6 ] Similarly to 26064d3e2b4d ("block: fix adding folio to bio"), if we attempt to add a folio that is larger than 4GB, we'll silently truncate the offset and len. Widen the parameters to size_t, assert that the length is less than 4GB and set the first page that contains the interesting data rather than the first page of the folio. Fixes: 26db5ee15851 (block: add a bvec_set_folio helper) Signed-off-by: Matthew Wilcox (Oracle) Link: https://lore.kernel.org/r/20250612144255.2850278-1-willy@infradead.org Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- include/linux/bvec.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/include/linux/bvec.h b/include/linux/bvec.h index f41c7f0ef91ed..a8333b82e766d 100644 --- a/include/linux/bvec.h +++ b/include/linux/bvec.h @@ -57,9 +57,12 @@ static inline void bvec_set_page(struct bio_vec *bv, struct page *page, * @offset: offset into the folio */ static inline void bvec_set_folio(struct bio_vec *bv, struct folio *folio, - unsigned int len, unsigned int offset) + size_t len, size_t offset) { - bvec_set_page(bv, &folio->page, len, offset); + unsigned long nr = offset / PAGE_SIZE; + + WARN_ON_ONCE(len > UINT_MAX); + bvec_set_page(bv, folio_page(folio, nr), len, offset % PAGE_SIZE); } /** -- GitLab From 403bbbe2fad68d0a055e1c30748aadabbd8a8383 Mon Sep 17 00:00:00 2001 From: Miguel Ojeda Date: Tue, 20 May 2025 20:55:55 +0200 Subject: [PATCH 1180/2211] objtool/rust: relax slice condition to cover more `noreturn` Rust functions commit cbeaa41dfe26b72639141e87183cb23e00d4b0dd upstream. Developers are indeed hitting other of the `noreturn` slice symbols in Nova [1], thus relax the last check in the list so that we catch all of them, i.e. *_4core5slice5index22slice_index_order_fail *_4core5slice5index24slice_end_index_len_fail *_4core5slice5index26slice_start_index_len_fail *_4core5slice5index29slice_end_index_overflow_fail *_4core5slice5index31slice_start_index_overflow_fail These all exist since at least Rust 1.78.0, thus backport it too. See commit 56d680dd23c3 ("objtool/rust: list `noreturn` Rust functions") for more details. Cc: stable@vger.kernel.org # Needed in 6.12.y and later. Cc: John Hubbard Cc: Timur Tabi Cc: Kane York Cc: Josh Poimboeuf Cc: Peter Zijlstra Reported-by: Joel Fernandes Fixes: 56d680dd23c3 ("objtool/rust: list `noreturn` Rust functions") Closes: https://lore.kernel.org/rust-for-linux/20250513180757.GA1295002@joelnvbox/ [1] Tested-by: Joel Fernandes Link: https://lore.kernel.org/r/20250520185555.825242-1-ojeda@kernel.org Signed-off-by: Miguel Ojeda Signed-off-by: Greg Kroah-Hartman --- tools/objtool/check.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 4fce0074076f3..a737286de7592 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -222,7 +222,8 @@ static bool is_rust_noreturn(const struct symbol *func) str_ends_with(func->name, "_7___rustc17rust_begin_unwind") || strstr(func->name, "_4core9panicking13assert_failed") || strstr(func->name, "_4core9panicking11panic_const24panic_const_") || - (strstr(func->name, "_4core5slice5index24slice_") && + (strstr(func->name, "_4core5slice5index") && + strstr(func->name, "slice_") && str_ends_with(func->name, "_fail")); } -- GitLab From 1ed18c90f6d97b864773f513ccbb2d626acd2e2d Mon Sep 17 00:00:00 2001 From: Suleiman Souhlal Date: Fri, 6 Jun 2025 16:45:38 +0900 Subject: [PATCH 1181/2211] tools/resolve_btfids: Fix build when cross compiling kernel with clang. commit a298bbab903e3fb4cbe16d36d6195e68fad1b776 upstream. When cross compiling the kernel with clang, we need to override CLANG_CROSS_FLAGS when preparing the step libraries. Prior to commit d1d096312176 ("tools: fix annoying "mkdir -p ..." logs when building tools in parallel"), MAKEFLAGS would have been set to a value that wouldn't set a value for CLANG_CROSS_FLAGS, hiding the fact that we weren't properly overriding it. Fixes: 56a2df7615fa ("tools/resolve_btfids: Compile resolve_btfids as host program") Signed-off-by: Suleiman Souhlal Signed-off-by: Andrii Nakryiko Acked-by: Jiri Olsa Cc: stable@vger.kernel.org Link: https://lore.kernel.org/bpf/20250606074538.1608546-1-suleiman@google.com Signed-off-by: Greg Kroah-Hartman --- tools/bpf/resolve_btfids/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bpf/resolve_btfids/Makefile b/tools/bpf/resolve_btfids/Makefile index 4b8079f294f65..b0072e64b0102 100644 --- a/tools/bpf/resolve_btfids/Makefile +++ b/tools/bpf/resolve_btfids/Makefile @@ -19,7 +19,7 @@ endif # Overrides for the prepare step libraries. HOST_OVERRIDES := AR="$(HOSTAR)" CC="$(HOSTCC)" LD="$(HOSTLD)" ARCH="$(HOSTARCH)" \ - CROSS_COMPILE="" EXTRA_CFLAGS="$(HOSTCFLAGS)" + CROSS_COMPILE="" CLANG_CROSS_FLAGS="" EXTRA_CFLAGS="$(HOSTCFLAGS)" RM ?= rm HOSTCC ?= gcc -- GitLab From 81515a4479322a35f8117cec1f3b5e052481e8f6 Mon Sep 17 00:00:00 2001 From: Francesco Dolcini Date: Thu, 5 Jun 2025 15:03:02 +0200 Subject: [PATCH 1182/2211] Revert "wifi: mwifiex: Fix HT40 bandwidth issue." commit 570896604f47d44d4ff6882d2a588428d2a6ef17 upstream. This reverts commit 4fcfcbe45734 ("wifi: mwifiex: Fix HT40 bandwidth issue.") That commit introduces a regression, when HT40 mode is enabled, received packets are lost, this was experience with W8997 with both SDIO-UART and SDIO-SDIO variants. From an initial investigation the issue solves on its own after some time, but it's not clear what is the reason. Given that this was just a performance optimization, let's revert it till we have a better understanding of the issue and a proper fix. Cc: Jeff Chen Cc: stable@vger.kernel.org Fixes: 4fcfcbe45734 ("wifi: mwifiex: Fix HT40 bandwidth issue.") Closes: https://lore.kernel.org/all/20250603203337.GA109929@francesco-nb/ Signed-off-by: Francesco Dolcini Link: https://patch.msgid.link/20250605130302.55555-1-francesco@dolcini.it [fix commit reference format] Signed-off-by: Johannes Berg Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/marvell/mwifiex/11n.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/marvell/mwifiex/11n.c b/drivers/net/wireless/marvell/mwifiex/11n.c index 738bafc3749b0..66f0f5377ac18 100644 --- a/drivers/net/wireless/marvell/mwifiex/11n.c +++ b/drivers/net/wireless/marvell/mwifiex/11n.c @@ -403,14 +403,12 @@ mwifiex_cmd_append_11n_tlv(struct mwifiex_private *priv, if (sband->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 && bss_desc->bcn_ht_oper->ht_param & - IEEE80211_HT_PARAM_CHAN_WIDTH_ANY) { - chan_list->chan_scan_param[0].radio_type |= - CHAN_BW_40MHZ << 2; + IEEE80211_HT_PARAM_CHAN_WIDTH_ANY) SET_SECONDARYCHAN(chan_list->chan_scan_param[0]. radio_type, (bss_desc->bcn_ht_oper->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET)); - } + *buffer += struct_size(chan_list, chan_scan_param, 1); ret_len += struct_size(chan_list, chan_scan_param, 1); } -- GitLab From 84e9f0a2c253d793fb24b8efdfdbfb3530f15f31 Mon Sep 17 00:00:00 2001 From: David Heimann Date: Sun, 1 Jun 2025 12:41:16 -0400 Subject: [PATCH 1183/2211] ALSA: usb-audio: Add implicit feedback quirk for RODE AI-1 commit 6a3439a417b910e662c666993798e0691bc81147 upstream. The RODE AI-1 audio interface requires implicit feedback sync between playback endpoint 0x03 and feedback endpoint 0x84 on interface 3, but doesn't advertise this in its USB descriptors. Without this quirk, the device receives audio data but produces no output. Signed-off-by: David Heimann Cc: Link: https://patch.msgid.link/084dc88c-1193-4a94-a002-5599adff936c@app.fastmail.com Signed-off-by: Takashi Iwai Signed-off-by: Greg Kroah-Hartman --- sound/usb/implicit.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/usb/implicit.c b/sound/usb/implicit.c index 4727043fd7458..77f06da93151e 100644 --- a/sound/usb/implicit.c +++ b/sound/usb/implicit.c @@ -57,6 +57,7 @@ static const struct snd_usb_implicit_fb_match playback_implicit_fb_quirks[] = { IMPLICIT_FB_FIXED_DEV(0x31e9, 0x0002, 0x81, 2), /* Solid State Logic SSL2+ */ IMPLICIT_FB_FIXED_DEV(0x0499, 0x172f, 0x81, 2), /* Steinberg UR22C */ IMPLICIT_FB_FIXED_DEV(0x0d9a, 0x00df, 0x81, 2), /* RTX6001 */ + IMPLICIT_FB_FIXED_DEV(0x19f7, 0x000a, 0x84, 3), /* RODE AI-1 */ IMPLICIT_FB_FIXED_DEV(0x22f0, 0x0006, 0x81, 3), /* Allen&Heath Qu-16 */ IMPLICIT_FB_FIXED_DEV(0x1686, 0xf029, 0x82, 2), /* Zoom UAC-2 */ IMPLICIT_FB_FIXED_DEV(0x2466, 0x8003, 0x86, 2), /* Fractal Audio Axe-Fx II */ -- GitLab From 74388368927e9c52a69524af5bbd6c55eb4690de Mon Sep 17 00:00:00 2001 From: Terry Junge Date: Wed, 12 Mar 2025 15:23:31 -0700 Subject: [PATCH 1184/2211] HID: usbhid: Eliminate recurrent out-of-bounds bug in usbhid_parse() commit fe7f7ac8e0c708446ff017453add769ffc15deed upstream. Update struct hid_descriptor to better reflect the mandatory and optional parts of the HID Descriptor as per USB HID 1.11 specification. Note: the kernel currently does not parse any optional HID class descriptors, only the mandatory report descriptor. Update all references to member element desc[0] to rpt_desc. Add test to verify bLength and bNumDescriptors values are valid. Replace the for loop with direct access to the mandatory HID class descriptor member for the report descriptor. This eliminates the possibility of getting an out-of-bounds fault. Add a warning message if the HID descriptor contains any unsupported optional HID class descriptors. Reported-by: syzbot+c52569baf0c843f35495@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=c52569baf0c843f35495 Fixes: f043bfc98c19 ("HID: usbhid: fix out-of-bounds bug") Cc: stable@vger.kernel.org Signed-off-by: Terry Junge Reviewed-by: Michael Kelley Signed-off-by: Jiri Kosina Signed-off-by: Greg Kroah-Hartman --- drivers/hid/hid-hyperv.c | 4 ++-- drivers/hid/usbhid/hid-core.c | 25 ++++++++++++++----------- drivers/usb/gadget/function/f_hid.c | 12 ++++++------ include/linux/hid.h | 3 ++- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/drivers/hid/hid-hyperv.c b/drivers/hid/hid-hyperv.c index 0fb210e40a412..9eafff0b6ea4c 100644 --- a/drivers/hid/hid-hyperv.c +++ b/drivers/hid/hid-hyperv.c @@ -192,7 +192,7 @@ static void mousevsc_on_receive_device_info(struct mousevsc_dev *input_device, goto cleanup; input_device->report_desc_size = le16_to_cpu( - desc->desc[0].wDescriptorLength); + desc->rpt_desc.wDescriptorLength); if (input_device->report_desc_size == 0) { input_device->dev_info_status = -EINVAL; goto cleanup; @@ -210,7 +210,7 @@ static void mousevsc_on_receive_device_info(struct mousevsc_dev *input_device, memcpy(input_device->report_desc, ((unsigned char *)desc) + desc->bLength, - le16_to_cpu(desc->desc[0].wDescriptorLength)); + le16_to_cpu(desc->rpt_desc.wDescriptorLength)); /* Send the ack */ memset(&ack, 0, sizeof(struct mousevsc_prt_msg)); diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index bf0f51ef0149f..01625dbb28e8d 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c @@ -984,12 +984,11 @@ static int usbhid_parse(struct hid_device *hid) struct usb_host_interface *interface = intf->cur_altsetting; struct usb_device *dev = interface_to_usbdev (intf); struct hid_descriptor *hdesc; + struct hid_class_descriptor *hcdesc; u32 quirks = 0; unsigned int rsize = 0; char *rdesc; - int ret, n; - int num_descriptors; - size_t offset = offsetof(struct hid_descriptor, desc); + int ret; quirks = hid_lookup_quirk(hid); @@ -1011,20 +1010,19 @@ static int usbhid_parse(struct hid_device *hid) return -ENODEV; } - if (hdesc->bLength < sizeof(struct hid_descriptor)) { - dbg_hid("hid descriptor is too short\n"); + if (!hdesc->bNumDescriptors || + hdesc->bLength != sizeof(*hdesc) + + (hdesc->bNumDescriptors - 1) * sizeof(*hcdesc)) { + dbg_hid("hid descriptor invalid, bLen=%hhu bNum=%hhu\n", + hdesc->bLength, hdesc->bNumDescriptors); return -EINVAL; } hid->version = le16_to_cpu(hdesc->bcdHID); hid->country = hdesc->bCountryCode; - num_descriptors = min_t(int, hdesc->bNumDescriptors, - (hdesc->bLength - offset) / sizeof(struct hid_class_descriptor)); - - for (n = 0; n < num_descriptors; n++) - if (hdesc->desc[n].bDescriptorType == HID_DT_REPORT) - rsize = le16_to_cpu(hdesc->desc[n].wDescriptorLength); + if (hdesc->rpt_desc.bDescriptorType == HID_DT_REPORT) + rsize = le16_to_cpu(hdesc->rpt_desc.wDescriptorLength); if (!rsize || rsize > HID_MAX_DESCRIPTOR_SIZE) { dbg_hid("weird size of report descriptor (%u)\n", rsize); @@ -1052,6 +1050,11 @@ static int usbhid_parse(struct hid_device *hid) goto err; } + if (hdesc->bNumDescriptors > 1) + hid_warn(intf, + "%u unsupported optional hid class descriptors\n", + (int)(hdesc->bNumDescriptors - 1)); + hid->quirks |= quirks; return 0; diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c index 740311c4fa249..c7a05f842745b 100644 --- a/drivers/usb/gadget/function/f_hid.c +++ b/drivers/usb/gadget/function/f_hid.c @@ -144,8 +144,8 @@ static struct hid_descriptor hidg_desc = { .bcdHID = cpu_to_le16(0x0101), .bCountryCode = 0x00, .bNumDescriptors = 0x1, - /*.desc[0].bDescriptorType = DYNAMIC */ - /*.desc[0].wDescriptorLenght = DYNAMIC */ + /*.rpt_desc.bDescriptorType = DYNAMIC */ + /*.rpt_desc.wDescriptorLength = DYNAMIC */ }; /* Super-Speed Support */ @@ -939,8 +939,8 @@ static int hidg_setup(struct usb_function *f, struct hid_descriptor hidg_desc_copy = hidg_desc; VDBG(cdev, "USB_REQ_GET_DESCRIPTOR: HID\n"); - hidg_desc_copy.desc[0].bDescriptorType = HID_DT_REPORT; - hidg_desc_copy.desc[0].wDescriptorLength = + hidg_desc_copy.rpt_desc.bDescriptorType = HID_DT_REPORT; + hidg_desc_copy.rpt_desc.wDescriptorLength = cpu_to_le16(hidg->report_desc_length); length = min_t(unsigned short, length, @@ -1210,8 +1210,8 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f) * We can use hidg_desc struct here but we should not relay * that its content won't change after returning from this function. */ - hidg_desc.desc[0].bDescriptorType = HID_DT_REPORT; - hidg_desc.desc[0].wDescriptorLength = + hidg_desc.rpt_desc.bDescriptorType = HID_DT_REPORT; + hidg_desc.rpt_desc.wDescriptorLength = cpu_to_le16(hidg->report_desc_length); hidg_hs_in_ep_desc.bEndpointAddress = diff --git a/include/linux/hid.h b/include/linux/hid.h index 018de72505b07..017d31f1d27b8 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -736,8 +736,9 @@ struct hid_descriptor { __le16 bcdHID; __u8 bCountryCode; __u8 bNumDescriptors; + struct hid_class_descriptor rpt_desc; - struct hid_class_descriptor desc[1]; + struct hid_class_descriptor opt_descs[]; } __attribute__ ((packed)); #define HID_DEVICE(b, g, ven, prod) \ -- GitLab From c29d5318708e67ac13c1b6fc1007d179fb65b4d7 Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Fri, 13 Jun 2025 19:26:50 +0200 Subject: [PATCH 1185/2211] posix-cpu-timers: fix race between handle_posix_cpu_timers() and posix_cpu_timer_del() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit f90fff1e152dedf52b932240ebbd670d83330eca upstream. If an exiting non-autoreaping task has already passed exit_notify() and calls handle_posix_cpu_timers() from IRQ, it can be reaped by its parent or debugger right after unlock_task_sighand(). If a concurrent posix_cpu_timer_del() runs at that moment, it won't be able to detect timer->it.cpu.firing != 0: cpu_timer_task_rcu() and/or lock_task_sighand() will fail. Add the tsk->exit_state check into run_posix_cpu_timers() to fix this. This fix is not needed if CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y, because exit_task_work() is called before exit_notify(). But the check still makes sense, task_work_add(&tsk->posix_cputimers_work.work) will fail anyway in this case. Cc: stable@vger.kernel.org Reported-by: Benoît Sevens Fixes: 0bdd2ed4138e ("sched: run_posix_cpu_timers: Don't check ->exit_state, use lock_task_sighand()") Signed-off-by: Oleg Nesterov Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- kernel/time/posix-cpu-timers.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c index 6bcee47040592..d44641108ba81 100644 --- a/kernel/time/posix-cpu-timers.c +++ b/kernel/time/posix-cpu-timers.c @@ -1400,6 +1400,15 @@ void run_posix_cpu_timers(void) lockdep_assert_irqs_disabled(); + /* + * Ensure that release_task(tsk) can't happen while + * handle_posix_cpu_timers() is running. Otherwise, a concurrent + * posix_cpu_timer_del() may fail to lock_task_sighand(tsk) and + * miss timer->it.cpu.firing != 0. + */ + if (tsk->exit_state) + return; + /* * If the actual expiry is deferred to task work context and the * work is already scheduled there is no point to do anything here. -- GitLab From c8bb1bcea877446f86922a8fd1661b8c07d90e5c Mon Sep 17 00:00:00 2001 From: Peter Korsgaard Date: Fri, 9 May 2025 13:24:07 +0100 Subject: [PATCH 1186/2211] nvmem: zynqmp_nvmem: unbreak driver after cleanup commit fe8abdd175d7b547ae1a612757e7902bcd62e9cf upstream. Commit 29be47fcd6a0 ("nvmem: zynqmp_nvmem: zynqmp_nvmem_probe cleanup") changed the driver to expect the device pointer to be passed as the "context", but in nvmem the context parameter comes from nvmem_config.priv which is never set - Leading to null pointer exceptions when the device is accessed. Fixes: 29be47fcd6a0 ("nvmem: zynqmp_nvmem: zynqmp_nvmem_probe cleanup") Cc: stable Signed-off-by: Peter Korsgaard Reviewed-by: Michal Simek Tested-by: Michal Simek Signed-off-by: Srinivas Kandagatla Link: https://lore.kernel.org/r/20250509122407.11763-3-srini@kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/nvmem/zynqmp_nvmem.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/nvmem/zynqmp_nvmem.c b/drivers/nvmem/zynqmp_nvmem.c index 8682adaacd692..7da717d6c7faf 100644 --- a/drivers/nvmem/zynqmp_nvmem.c +++ b/drivers/nvmem/zynqmp_nvmem.c @@ -213,6 +213,7 @@ static int zynqmp_nvmem_probe(struct platform_device *pdev) econfig.word_size = 1; econfig.size = ZYNQMP_NVMEM_SIZE; econfig.dev = dev; + econfig.priv = dev; econfig.add_legacy_fixed_of_cells = true; econfig.reg_read = zynqmp_nvmem_read; econfig.reg_write = zynqmp_nvmem_write; -- GitLab From 6327884fbabdec77fbacdedacbb18444338b6c67 Mon Sep 17 00:00:00 2001 From: Dave Penkler Date: Wed, 21 May 2025 14:16:55 +0200 Subject: [PATCH 1187/2211] usb: usbtmc: Fix read_stb function and get_stb ioctl commit acb3dac2805d3342ded7dbbd164add32bbfdf21c upstream. The usbtmc488_ioctl_read_stb function relied on a positive return from usbtmc_get_stb to reset the srq condition in the driver. The USBTMC_IOCTL_GET_STB case tested for a positive return to return the stb to the user. Commit: ("usb: usbtmc: Fix erroneous get_stb ioctl error returns") changed the return value of usbtmc_get_stb to 0 on success instead of returning the value of usb_control_msg which is positive in the normal case. This change caused the function usbtmc488_ioctl_read_stb and the USBTMC_IOCTL_GET_STB ioctl to no longer function correctly. Change the test in usbtmc488_ioctl_read_stb to test for failure first and return the failure code immediately. Change the test for the USBTMC_IOCTL_GET_STB ioctl to test for 0 instead of a positive value. Fixes: cac01bd178d6 ("usb: usbtmc: Fix erroneous get_stb ioctl error returns") Cc: stable@vger.kernel.org Signed-off-by: Dave Penkler Link: https://lore.kernel.org/r/20250521121656.18174-3-dpenkler@gmail.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/class/usbtmc.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index 66f3d9324ba2f..75de29725a450 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c @@ -565,14 +565,15 @@ static int usbtmc488_ioctl_read_stb(struct usbtmc_file_data *file_data, rv = usbtmc_get_stb(file_data, &stb); - if (rv > 0) { - srq_asserted = atomic_xchg(&file_data->srq_asserted, - srq_asserted); - if (srq_asserted) - stb |= 0x40; /* Set RQS bit */ + if (rv < 0) + return rv; + + srq_asserted = atomic_xchg(&file_data->srq_asserted, srq_asserted); + if (srq_asserted) + stb |= 0x40; /* Set RQS bit */ + + rv = put_user(stb, (__u8 __user *)arg); - rv = put_user(stb, (__u8 __user *)arg); - } return rv; } @@ -2201,7 +2202,7 @@ static long usbtmc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) case USBTMC_IOCTL_GET_STB: retval = usbtmc_get_stb(file_data, &tmp_byte); - if (retval > 0) + if (!retval) retval = put_user(tmp_byte, (__u8 __user *)arg); break; -- GitLab From 00ddc7dad55b7bbb78df80d6e174d0c4764dea0c Mon Sep 17 00:00:00 2001 From: Wupeng Ma Date: Sat, 10 May 2025 11:30:40 +0800 Subject: [PATCH 1188/2211] VMCI: fix race between vmci_host_setup_notify and vmci_ctx_unset_notify commit 1bd6406fb5f36c2bb1e96e27d4c3e9f4d09edde4 upstream. During our test, it is found that a warning can be trigger in try_grab_folio as follow: ------------[ cut here ]------------ WARNING: CPU: 0 PID: 1678 at mm/gup.c:147 try_grab_folio+0x106/0x130 Modules linked in: CPU: 0 UID: 0 PID: 1678 Comm: syz.3.31 Not tainted 6.15.0-rc5 #163 PREEMPT(undef) RIP: 0010:try_grab_folio+0x106/0x130 Call Trace: follow_huge_pmd+0x240/0x8e0 follow_pmd_mask.constprop.0.isra.0+0x40b/0x5c0 follow_pud_mask.constprop.0.isra.0+0x14a/0x170 follow_page_mask+0x1c2/0x1f0 __get_user_pages+0x176/0x950 __gup_longterm_locked+0x15b/0x1060 ? gup_fast+0x120/0x1f0 gup_fast_fallback+0x17e/0x230 get_user_pages_fast+0x5f/0x80 vmci_host_unlocked_ioctl+0x21c/0xf80 RIP: 0033:0x54d2cd ---[ end trace 0000000000000000 ]--- Digging into the source, context->notify_page may init by get_user_pages_fast and can be seen in vmci_ctx_unset_notify which will try to put_page. However get_user_pages_fast is not finished here and lead to following try_grab_folio warning. The race condition is shown as follow: cpu0 cpu1 vmci_host_do_set_notify vmci_host_setup_notify get_user_pages_fast(uva, 1, FOLL_WRITE, &context->notify_page); lockless_pages_from_mm gup_pgd_range gup_huge_pmd // update &context->notify_page vmci_host_do_set_notify vmci_ctx_unset_notify notify_page = context->notify_page; if (notify_page) put_page(notify_page); // page is freed __gup_longterm_locked __get_user_pages follow_trans_huge_pmd try_grab_folio // warn here To slove this, use local variable page to make notify_page can be seen after finish get_user_pages_fast. Fixes: a1d88436d53a ("VMCI: Fix two UVA mapping bugs") Cc: stable Closes: https://lore.kernel.org/all/e91da589-ad57-3969-d979-879bbd10dddd@huawei.com/ Signed-off-by: Wupeng Ma Link: https://lore.kernel.org/r/20250510033040.901582-1-mawupeng1@huawei.com Signed-off-by: Greg Kroah-Hartman --- drivers/misc/vmw_vmci/vmci_host.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/drivers/misc/vmw_vmci/vmci_host.c b/drivers/misc/vmw_vmci/vmci_host.c index abe79f6fd2a79..b64944367ac53 100644 --- a/drivers/misc/vmw_vmci/vmci_host.c +++ b/drivers/misc/vmw_vmci/vmci_host.c @@ -227,6 +227,7 @@ static int drv_cp_harray_to_user(void __user *user_buf_uva, static int vmci_host_setup_notify(struct vmci_ctx *context, unsigned long uva) { + struct page *page; int retval; if (context->notify_page) { @@ -243,13 +244,11 @@ static int vmci_host_setup_notify(struct vmci_ctx *context, /* * Lock physical page backing a given user VA. */ - retval = get_user_pages_fast(uva, 1, FOLL_WRITE, &context->notify_page); - if (retval != 1) { - context->notify_page = NULL; + retval = get_user_pages_fast(uva, 1, FOLL_WRITE, &page); + if (retval != 1) return VMCI_ERROR_GENERIC; - } - if (context->notify_page == NULL) - return VMCI_ERROR_UNAVAILABLE; + + context->notify_page = page; /* * Map the locked page and set up notify pointer. -- GitLab From 393abb68b9ecc78f5ae9bc2898c3325427cd8e1d Mon Sep 17 00:00:00 2001 From: "Jiri Slaby (SUSE)" Date: Thu, 22 May 2025 07:38:35 +0200 Subject: [PATCH 1189/2211] tty: serial: 8250_omap: fix TX with DMA for am33xx commit b495021a973e2468497689bd3e29b736747b896f upstream. Commit 1788cf6a91d9 ("tty: serial: switch from circ_buf to kfifo") introduced an error in the TX DMA handling for 8250_omap. When the OMAP_DMA_TX_KICK flag is set, the "skip_byte" is pulled from the kfifo and emitted directly in order to start the DMA. While the kfifo is updated, dma->tx_size is not decreased. This leads to uart_xmit_advance() called in omap_8250_dma_tx_complete() advancing the kfifo by one too much. In practice, transmitting N bytes has been seen to result in the last N-1 bytes being sent repeatedly. This change fixes the problem by moving all of the dma setup after the OMAP_DMA_TX_KICK handling and using kfifo_len() instead of the DMA size for the 4-byte cutoff check. This slightly changes the behaviour at buffer wraparound, but it still transmits the correct bytes somehow. Now, the "skip_byte" would no longer be accounted to the stats. As previously, dma->tx_size included also this skip byte, up->icount.tx was updated by aforementioned uart_xmit_advance() in omap_8250_dma_tx_complete(). Fix this by using the uart_fifo_out() helper instead of bare kfifo_get(). Based on patch by Mans Rullgard Signed-off-by: "Jiri Slaby (SUSE)" Fixes: 1788cf6a91d9 ("tty: serial: switch from circ_buf to kfifo") Link: https://lore.kernel.org/all/20250506150748.3162-1-mans@mansr.com/ Reported-by: Mans Rullgard Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20250522053835.3495975-1-jirislaby@kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/8250/8250_omap.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c index 0dd68bdbfbcf7..4f57991944dc4 100644 --- a/drivers/tty/serial/8250/8250_omap.c +++ b/drivers/tty/serial/8250/8250_omap.c @@ -1168,16 +1168,6 @@ static int omap_8250_tx_dma(struct uart_8250_port *p) return 0; } - sg_init_table(&sg, 1); - ret = kfifo_dma_out_prepare_mapped(&tport->xmit_fifo, &sg, 1, - UART_XMIT_SIZE, dma->tx_addr); - if (ret != 1) { - serial8250_clear_THRI(p); - return 0; - } - - dma->tx_size = sg_dma_len(&sg); - if (priv->habit & OMAP_DMA_TX_KICK) { unsigned char c; u8 tx_lvl; @@ -1202,18 +1192,22 @@ static int omap_8250_tx_dma(struct uart_8250_port *p) ret = -EBUSY; goto err; } - if (dma->tx_size < 4) { + if (kfifo_len(&tport->xmit_fifo) < 4) { ret = -EINVAL; goto err; } - if (!kfifo_get(&tport->xmit_fifo, &c)) { + if (!uart_fifo_out(&p->port, &c, 1)) { ret = -EINVAL; goto err; } skip_byte = c; - /* now we need to recompute due to kfifo_get */ - kfifo_dma_out_prepare_mapped(&tport->xmit_fifo, &sg, 1, - UART_XMIT_SIZE, dma->tx_addr); + } + + sg_init_table(&sg, 1); + ret = kfifo_dma_out_prepare_mapped(&tport->xmit_fifo, &sg, 1, UART_XMIT_SIZE, dma->tx_addr); + if (ret != 1) { + ret = -EINVAL; + goto err; } desc = dmaengine_prep_slave_sg(dma->txchan, &sg, 1, DMA_MEM_TO_DEV, @@ -1223,6 +1217,7 @@ static int omap_8250_tx_dma(struct uart_8250_port *p) goto err; } + dma->tx_size = sg_dma_len(&sg); dma->tx_running = 1; desc->callback = omap_8250_dma_tx_complete; -- GitLab From 3cce1734776d0eab435c69524c6175d20e915b03 Mon Sep 17 00:00:00 2001 From: Jonathan Stroud Date: Fri, 16 May 2025 18:02:40 +0530 Subject: [PATCH 1190/2211] usb: misc: onboard_usb_dev: Fix usb5744 initialization sequence commit 1143d41922c0f87504f095417ba1870167970143 upstream. Introduce i2c APIs to read/write for proper configuration register programming. It ensures that read-modify-write sequence is performed and reserved bit in Runtime Flags 2 register are not touched. Also legacy smbus block write inserted an extra count value into the i2c data stream which breaks the register write on the usb5744. Switching to new read/write i2c APIs fixes both issues. Fixes: 6782311d04df ("usb: misc: onboard_usb_dev: add Microchip usb5744 SMBus programming support") Cc: stable Signed-off-by: Jonathan Stroud Co-developed-by: Radhey Shyam Pandey Signed-off-by: Radhey Shyam Pandey Link: https://lore.kernel.org/r/1747398760-284021-1-git-send-email-radhey.shyam.pandey@amd.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/misc/onboard_usb_dev.c | 100 +++++++++++++++++++++++++---- 1 file changed, 87 insertions(+), 13 deletions(-) diff --git a/drivers/usb/misc/onboard_usb_dev.c b/drivers/usb/misc/onboard_usb_dev.c index b4d5408a4371b..d8b48c789410f 100644 --- a/drivers/usb/misc/onboard_usb_dev.c +++ b/drivers/usb/misc/onboard_usb_dev.c @@ -36,9 +36,10 @@ #define USB5744_CMD_CREG_ACCESS 0x99 #define USB5744_CMD_CREG_ACCESS_LSB 0x37 #define USB5744_CREG_MEM_ADDR 0x00 +#define USB5744_CREG_MEM_RD_ADDR 0x04 #define USB5744_CREG_WRITE 0x00 -#define USB5744_CREG_RUNTIMEFLAGS2 0x41 -#define USB5744_CREG_RUNTIMEFLAGS2_LSB 0x1D +#define USB5744_CREG_READ 0x01 +#define USB5744_CREG_RUNTIMEFLAGS2 0x411D #define USB5744_CREG_BYPASS_UDC_SUSPEND BIT(3) static void onboard_dev_attach_usb_driver(struct work_struct *work); @@ -309,11 +310,88 @@ static void onboard_dev_attach_usb_driver(struct work_struct *work) pr_err("Failed to attach USB driver: %pe\n", ERR_PTR(err)); } +static int onboard_dev_5744_i2c_read_byte(struct i2c_client *client, u16 addr, u8 *data) +{ + struct i2c_msg msg[2]; + u8 rd_buf[3]; + int ret; + + u8 wr_buf[7] = {0, USB5744_CREG_MEM_ADDR, 4, + USB5744_CREG_READ, 1, + addr >> 8 & 0xff, + addr & 0xff}; + msg[0].addr = client->addr; + msg[0].flags = 0; + msg[0].len = sizeof(wr_buf); + msg[0].buf = wr_buf; + + ret = i2c_transfer(client->adapter, msg, 1); + if (ret < 0) + return ret; + + wr_buf[0] = USB5744_CMD_CREG_ACCESS; + wr_buf[1] = USB5744_CMD_CREG_ACCESS_LSB; + wr_buf[2] = 0; + msg[0].len = 3; + + ret = i2c_transfer(client->adapter, msg, 1); + if (ret < 0) + return ret; + + wr_buf[0] = 0; + wr_buf[1] = USB5744_CREG_MEM_RD_ADDR; + msg[0].len = 2; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].len = 2; + msg[1].buf = rd_buf; + + ret = i2c_transfer(client->adapter, msg, 2); + if (ret < 0) + return ret; + *data = rd_buf[1]; + + return 0; +} + +static int onboard_dev_5744_i2c_write_byte(struct i2c_client *client, u16 addr, u8 data) +{ + struct i2c_msg msg[2]; + int ret; + + u8 wr_buf[8] = {0, USB5744_CREG_MEM_ADDR, 5, + USB5744_CREG_WRITE, 1, + addr >> 8 & 0xff, + addr & 0xff, + data}; + msg[0].addr = client->addr; + msg[0].flags = 0; + msg[0].len = sizeof(wr_buf); + msg[0].buf = wr_buf; + + ret = i2c_transfer(client->adapter, msg, 1); + if (ret < 0) + return ret; + + msg[0].len = 3; + wr_buf[0] = USB5744_CMD_CREG_ACCESS; + wr_buf[1] = USB5744_CMD_CREG_ACCESS_LSB; + wr_buf[2] = 0; + + ret = i2c_transfer(client->adapter, msg, 1); + if (ret < 0) + return ret; + + return 0; +} + static int onboard_dev_5744_i2c_init(struct i2c_client *client) { #if IS_ENABLED(CONFIG_USB_ONBOARD_DEV_USB5744) struct device *dev = &client->dev; int ret; + u8 reg; /* * Set BYPASS_UDC_SUSPEND bit to ensure MCU is always enabled @@ -321,20 +399,16 @@ static int onboard_dev_5744_i2c_init(struct i2c_client *client) * The command writes 5 bytes to memory and single data byte in * configuration register. */ - char wr_buf[7] = {USB5744_CREG_MEM_ADDR, 5, - USB5744_CREG_WRITE, 1, - USB5744_CREG_RUNTIMEFLAGS2, - USB5744_CREG_RUNTIMEFLAGS2_LSB, - USB5744_CREG_BYPASS_UDC_SUSPEND}; - - ret = i2c_smbus_write_block_data(client, 0, sizeof(wr_buf), wr_buf); + ret = onboard_dev_5744_i2c_read_byte(client, + USB5744_CREG_RUNTIMEFLAGS2, ®); if (ret) - return dev_err_probe(dev, ret, "BYPASS_UDC_SUSPEND bit configuration failed\n"); + return dev_err_probe(dev, ret, "CREG_RUNTIMEFLAGS2 read failed\n"); - ret = i2c_smbus_write_word_data(client, USB5744_CMD_CREG_ACCESS, - USB5744_CMD_CREG_ACCESS_LSB); + reg |= USB5744_CREG_BYPASS_UDC_SUSPEND; + ret = onboard_dev_5744_i2c_write_byte(client, + USB5744_CREG_RUNTIMEFLAGS2, reg); if (ret) - return dev_err_probe(dev, ret, "Configuration Register Access Command failed\n"); + return dev_err_probe(dev, ret, "BYPASS_UDC_SUSPEND bit configuration failed\n"); /* Send SMBus command to boot hub. */ ret = i2c_smbus_write_word_data(client, USB5744_CMD_ATTACH, -- GitLab From c7862978b4059a76f48d360a10c5774d6f41c7f1 Mon Sep 17 00:00:00 2001 From: Pawel Laszczak Date: Tue, 13 May 2025 05:30:09 +0000 Subject: [PATCH 1191/2211] usb: cdnsp: Fix issue with detecting command completion event commit f4ecdc352646f7d23f348e5c544dbe3212c94fc8 upstream. In some cases, there is a small-time gap in which CMD_RING_BUSY can be cleared by controller but adding command completion event to event ring will be delayed. As the result driver will return error code. This behavior has been detected on usbtest driver (test 9) with configuration including ep1in/ep1out bulk and ep2in/ep2out isoc endpoint. Probably this gap occurred because controller was busy with adding some other events to event ring. The CMD_RING_BUSY is cleared to '0' when the Command Descriptor has been executed and not when command completion event has been added to event ring. To fix this issue for this test the small delay is sufficient less than 10us) but to make sure the problem doesn't happen again in the future the patch introduces 10 retries to check with delay about 20us before returning error code. Fixes: 3d82904559f4 ("usb: cdnsp: cdns3 Add main part of Cadence USBSSP DRD Driver") Cc: stable Signed-off-by: Pawel Laszczak Acked-by: Peter Chen Link: https://lore.kernel.org/r/PH7PR07MB9538AA45362ACCF1B94EE9B7DD96A@PH7PR07MB9538.namprd07.prod.outlook.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Greg Kroah-Hartman --- drivers/usb/cdns3/cdnsp-gadget.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/usb/cdns3/cdnsp-gadget.c b/drivers/usb/cdns3/cdnsp-gadget.c index 79d06958d6193..54ed0ec5c7535 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.c +++ b/drivers/usb/cdns3/cdnsp-gadget.c @@ -546,6 +546,7 @@ int cdnsp_wait_for_cmd_compl(struct cdnsp_device *pdev) dma_addr_t cmd_deq_dma; union cdnsp_trb *event; u32 cycle_state; + u32 retry = 10; int ret, val; u64 cmd_dma; u32 flags; @@ -577,8 +578,23 @@ int cdnsp_wait_for_cmd_compl(struct cdnsp_device *pdev) flags = le32_to_cpu(event->event_cmd.flags); /* Check the owner of the TRB. */ - if ((flags & TRB_CYCLE) != cycle_state) + if ((flags & TRB_CYCLE) != cycle_state) { + /* + * Give some extra time to get chance controller + * to finish command before returning error code. + * Checking CMD_RING_BUSY is not sufficient because + * this bit is cleared to '0' when the Command + * Descriptor has been executed by controller + * and not when command completion event has + * be added to event ring. + */ + if (retry--) { + udelay(20); + continue; + } + return -EINVAL; + } cmd_dma = le64_to_cpu(event->event_cmd.cmd_trb); -- GitLab From 921b3c8050fe868c70271369d51f0249ecba1eea Mon Sep 17 00:00:00 2001 From: Pawel Laszczak Date: Tue, 13 May 2025 06:54:03 +0000 Subject: [PATCH 1192/2211] usb: cdnsp: Fix issue with detecting USB 3.2 speed commit 2852788cfbe9ca1ab68509d65804413871f741f9 upstream. Patch adds support for detecting SuperSpeedPlus Gen1 x2 and SuperSpeedPlus Gen2 x2 speed. Fixes: 3d82904559f4 ("usb: cdnsp: cdns3 Add main part of Cadence USBSSP DRD Driver") Cc: stable Signed-off-by: Pawel Laszczak Acked-by: Peter Chen Link: https://lore.kernel.org/r/PH7PR07MB95387AD98EDCA695FECE52BADD96A@PH7PR07MB9538.namprd07.prod.outlook.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/cdns3/cdnsp-gadget.c | 3 ++- drivers/usb/cdns3/cdnsp-gadget.h | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/usb/cdns3/cdnsp-gadget.c b/drivers/usb/cdns3/cdnsp-gadget.c index 54ed0ec5c7535..38e693cd3efc0 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.c +++ b/drivers/usb/cdns3/cdnsp-gadget.c @@ -28,7 +28,8 @@ unsigned int cdnsp_port_speed(unsigned int port_status) { /*Detect gadget speed based on PORTSC register*/ - if (DEV_SUPERSPEEDPLUS(port_status)) + if (DEV_SUPERSPEEDPLUS(port_status) || + DEV_SSP_GEN1x2(port_status) || DEV_SSP_GEN2x2(port_status)) return USB_SPEED_SUPER_PLUS; else if (DEV_SUPERSPEED(port_status)) return USB_SPEED_SUPER; diff --git a/drivers/usb/cdns3/cdnsp-gadget.h b/drivers/usb/cdns3/cdnsp-gadget.h index 12534be52f39d..2afa3e558f85c 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.h +++ b/drivers/usb/cdns3/cdnsp-gadget.h @@ -285,11 +285,15 @@ struct cdnsp_port_regs { #define XDEV_HS (0x3 << 10) #define XDEV_SS (0x4 << 10) #define XDEV_SSP (0x5 << 10) +#define XDEV_SSP1x2 (0x6 << 10) +#define XDEV_SSP2x2 (0x7 << 10) #define DEV_UNDEFSPEED(p) (((p) & DEV_SPEED_MASK) == (0x0 << 10)) #define DEV_FULLSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_FS) #define DEV_HIGHSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_HS) #define DEV_SUPERSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_SS) #define DEV_SUPERSPEEDPLUS(p) (((p) & DEV_SPEED_MASK) == XDEV_SSP) +#define DEV_SSP_GEN1x2(p) (((p) & DEV_SPEED_MASK) == XDEV_SSP1x2) +#define DEV_SSP_GEN2x2(p) (((p) & DEV_SPEED_MASK) == XDEV_SSP2x2) #define DEV_SUPERSPEED_ANY(p) (((p) & DEV_SPEED_MASK) >= XDEV_SS) #define DEV_PORT_SPEED(p) (((p) >> 10) & 0x0f) /* Port Link State Write Strobe - set this when changing link state */ -- GitLab From 657003ced7f5ade8e739f5ad622f9d9db80686ae Mon Sep 17 00:00:00 2001 From: Mathias Nyman Date: Wed, 14 May 2025 16:25:20 +0300 Subject: [PATCH 1193/2211] usb: Flush altsetting 0 endpoints before reinitializating them after reset. commit 89bb3dc13ac29a563f4e4c555e422882f64742bd upstream. usb core avoids sending a Set-Interface altsetting 0 request after device reset, and instead relies on calling usb_disable_interface() and usb_enable_interface() to flush and reset host-side of those endpoints. xHCI hosts allocate and set up endpoint ring buffers and host_ep->hcpriv during usb_hcd_alloc_bandwidth() callback, which in this case is called before flushing the endpoint in usb_disable_interface(). Call usb_disable_interface() before usb_hcd_alloc_bandwidth() to ensure URBs are flushed before new ring buffers for the endpoints are allocated. Otherwise host driver will attempt to find and remove old stale URBs from a freshly allocated new ringbuffer. Cc: stable Fixes: 4fe0387afa89 ("USB: don't send Set-Interface after reset") Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20250514132520.225345-1-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/core/hub.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 145787c424e0c..da3d0e525b64e 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -6135,6 +6135,7 @@ static int usb_reset_and_verify_device(struct usb_device *udev) struct usb_hub *parent_hub; struct usb_hcd *hcd = bus_to_hcd(udev->bus); struct usb_device_descriptor descriptor; + struct usb_interface *intf; struct usb_host_bos *bos; int i, j, ret = 0; int port1 = udev->portnum; @@ -6192,6 +6193,18 @@ static int usb_reset_and_verify_device(struct usb_device *udev) if (!udev->actconfig) goto done; + /* + * Some devices can't handle setting default altsetting 0 with a + * Set-Interface request. Disable host-side endpoints of those + * interfaces here. Enable and reset them back after host has set + * its internal endpoint structures during usb_hcd_alloc_bandwith() + */ + for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { + intf = udev->actconfig->interface[i]; + if (intf->cur_altsetting->desc.bAlternateSetting == 0) + usb_disable_interface(udev, intf, true); + } + mutex_lock(hcd->bandwidth_mutex); ret = usb_hcd_alloc_bandwidth(udev, udev->actconfig, NULL, NULL); if (ret < 0) { @@ -6223,12 +6236,11 @@ static int usb_reset_and_verify_device(struct usb_device *udev) */ for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { struct usb_host_config *config = udev->actconfig; - struct usb_interface *intf = config->interface[i]; struct usb_interface_descriptor *desc; + intf = config->interface[i]; desc = &intf->cur_altsetting->desc; if (desc->bAlternateSetting == 0) { - usb_disable_interface(udev, intf, true); usb_enable_interface(udev, intf, true); ret = 0; } else { -- GitLab From 9f907ee83fee37b6c3f9efe5fd2e54c1161259dd Mon Sep 17 00:00:00 2001 From: Amit Sunil Dhamne Date: Fri, 2 May 2025 16:57:03 -0700 Subject: [PATCH 1194/2211] usb: typec: tcpm/tcpci_maxim: Fix bounds check in process_rx() commit 0736299d090f5c6a1032678705c4bc0a9511a3db upstream. Register read of TCPC_RX_BYTE_CNT returns the total size consisting of: PD message (pending read) size + 1 Byte for Frame Type (SOP*) This is validated against the max PD message (`struct pd_message`) size without accounting for the extra byte for the frame type. Note that the struct pd_message does not contain a field for the frame_type. This results in false negatives when the "PD message (pending read)" is equal to the max PD message size. Fixes: 6f413b559f86 ("usb: typec: tcpci_maxim: Chip level TCPC driver") Signed-off-by: Amit Sunil Dhamne Signed-off-by: Badhri Jagan Sridharan Reviewed-by: Kyle Tso Cc: stable Link: https://lore.kernel.org/stable/20250502-b4-new-fix-pd-rx-count-v1-1-e5711ed09b3d%40google.com Reviewed-by: Heikki Krogerus Link: https://lore.kernel.org/r/20250502-b4-new-fix-pd-rx-count-v1-1-e5711ed09b3d@google.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/typec/tcpm/tcpci_maxim_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/usb/typec/tcpm/tcpci_maxim_core.c b/drivers/usb/typec/tcpm/tcpci_maxim_core.c index fd1b805933676..648311f5e3cf1 100644 --- a/drivers/usb/typec/tcpm/tcpci_maxim_core.c +++ b/drivers/usb/typec/tcpm/tcpci_maxim_core.c @@ -166,7 +166,8 @@ static void process_rx(struct max_tcpci_chip *chip, u16 status) return; } - if (count > sizeof(struct pd_message) || count + 1 > TCPC_RECEIVE_BUFFER_LEN) { + if (count > sizeof(struct pd_message) + 1 || + count + 1 > TCPC_RECEIVE_BUFFER_LEN) { dev_err(chip->dev, "Invalid TCPC_RX_BYTE_CNT %d\n", count); return; } -- GitLab From 7bdd712abefbec79176ab412d8c623e755c5d0ba Mon Sep 17 00:00:00 2001 From: RD Babiera Date: Tue, 6 May 2025 23:28:53 +0000 Subject: [PATCH 1195/2211] usb: typec: tcpm: move tcpm_queue_vdm_unlocked to asynchronous work commit 324d45e53f1a36c88bc649dc39e0c8300a41be0a upstream. A state check was previously added to tcpm_queue_vdm_unlocked to prevent a deadlock where the DisplayPort Alt Mode driver would be executing work and attempting to grab the tcpm_lock while the TCPM was holding the lock and attempting to unregister the altmode, blocking on the altmode driver's cancel_work_sync call. Because the state check isn't protected, there is a small window where the Alt Mode driver could determine that the TCPM is in a ready state and attempt to grab the lock while the TCPM grabs the lock and changes the TCPM state to one that causes the deadlock. The callstack is provided below: [110121.667392][ C7] Call trace: [110121.667396][ C7] __switch_to+0x174/0x338 [110121.667406][ C7] __schedule+0x608/0x9f0 [110121.667414][ C7] schedule+0x7c/0xe8 [110121.667423][ C7] kernfs_drain+0xb0/0x114 [110121.667431][ C7] __kernfs_remove+0x16c/0x20c [110121.667436][ C7] kernfs_remove_by_name_ns+0x74/0xe8 [110121.667442][ C7] sysfs_remove_group+0x84/0xe8 [110121.667450][ C7] sysfs_remove_groups+0x34/0x58 [110121.667458][ C7] device_remove_groups+0x10/0x20 [110121.667464][ C7] device_release_driver_internal+0x164/0x2e4 [110121.667475][ C7] device_release_driver+0x18/0x28 [110121.667484][ C7] bus_remove_device+0xec/0x118 [110121.667491][ C7] device_del+0x1e8/0x4ac [110121.667498][ C7] device_unregister+0x18/0x38 [110121.667504][ C7] typec_unregister_altmode+0x30/0x44 [110121.667515][ C7] tcpm_reset_port+0xac/0x370 [110121.667523][ C7] tcpm_snk_detach+0x84/0xb8 [110121.667529][ C7] run_state_machine+0x4c0/0x1b68 [110121.667536][ C7] tcpm_state_machine_work+0x94/0xe4 [110121.667544][ C7] kthread_worker_fn+0x10c/0x244 [110121.667552][ C7] kthread+0x104/0x1d4 [110121.667557][ C7] ret_from_fork+0x10/0x20 [110121.667689][ C7] Workqueue: events dp_altmode_work [110121.667697][ C7] Call trace: [110121.667701][ C7] __switch_to+0x174/0x338 [110121.667710][ C7] __schedule+0x608/0x9f0 [110121.667717][ C7] schedule+0x7c/0xe8 [110121.667725][ C7] schedule_preempt_disabled+0x24/0x40 [110121.667733][ C7] __mutex_lock+0x408/0xdac [110121.667741][ C7] __mutex_lock_slowpath+0x14/0x24 [110121.667748][ C7] mutex_lock+0x40/0xec [110121.667757][ C7] tcpm_altmode_enter+0x78/0xb4 [110121.667764][ C7] typec_altmode_enter+0xdc/0x10c [110121.667769][ C7] dp_altmode_work+0x68/0x164 [110121.667775][ C7] process_one_work+0x1e4/0x43c [110121.667783][ C7] worker_thread+0x25c/0x430 [110121.667789][ C7] kthread+0x104/0x1d4 [110121.667794][ C7] ret_from_fork+0x10/0x20 Change tcpm_queue_vdm_unlocked to queue for tcpm_queue_vdm_work, which can perform the state check while holding the TCPM lock while the Alt Mode lock is no longer held. This requires a new struct to hold the vdm data, altmode_vdm_event. Fixes: cdc9946ea637 ("usb: typec: tcpm: enforce ready state when queueing alt mode vdm") Cc: stable Signed-off-by: RD Babiera Reviewed-by: Heikki Krogerus Reviewed-by: Badhri Jagan Sridharan Link: https://lore.kernel.org/r/20250506232853.1968304-2-rdbabiera@google.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/typec/tcpm/tcpm.c | 91 +++++++++++++++++++++++++++-------- 1 file changed, 71 insertions(+), 20 deletions(-) diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index bbd7f53f7d598..1d8e760df483c 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -568,6 +568,15 @@ struct pd_rx_event { enum tcpm_transmit_type rx_sop_type; }; +struct altmode_vdm_event { + struct kthread_work work; + struct tcpm_port *port; + u32 header; + u32 *data; + int cnt; + enum tcpm_transmit_type tx_sop_type; +}; + static const char * const pd_rev[] = { [PD_REV10] = "rev1", [PD_REV20] = "rev2", @@ -1562,18 +1571,68 @@ static void tcpm_queue_vdm(struct tcpm_port *port, const u32 header, mod_vdm_delayed_work(port, 0); } -static void tcpm_queue_vdm_unlocked(struct tcpm_port *port, const u32 header, - const u32 *data, int cnt, enum tcpm_transmit_type tx_sop_type) +static void tcpm_queue_vdm_work(struct kthread_work *work) { - if (port->state != SRC_READY && port->state != SNK_READY && - port->state != SRC_VDM_IDENTITY_REQUEST) - return; + struct altmode_vdm_event *event = container_of(work, + struct altmode_vdm_event, + work); + struct tcpm_port *port = event->port; mutex_lock(&port->lock); - tcpm_queue_vdm(port, header, data, cnt, tx_sop_type); + if (port->state != SRC_READY && port->state != SNK_READY && + port->state != SRC_VDM_IDENTITY_REQUEST) { + tcpm_log_force(port, "dropping altmode_vdm_event"); + goto port_unlock; + } + + tcpm_queue_vdm(port, event->header, event->data, event->cnt, event->tx_sop_type); + +port_unlock: + kfree(event->data); + kfree(event); mutex_unlock(&port->lock); } +static int tcpm_queue_vdm_unlocked(struct tcpm_port *port, const u32 header, + const u32 *data, int cnt, enum tcpm_transmit_type tx_sop_type) +{ + struct altmode_vdm_event *event; + u32 *data_cpy; + int ret = -ENOMEM; + + event = kzalloc(sizeof(*event), GFP_KERNEL); + if (!event) + goto err_event; + + data_cpy = kcalloc(cnt, sizeof(u32), GFP_KERNEL); + if (!data_cpy) + goto err_data; + + kthread_init_work(&event->work, tcpm_queue_vdm_work); + event->port = port; + event->header = header; + memcpy(data_cpy, data, sizeof(u32) * cnt); + event->data = data_cpy; + event->cnt = cnt; + event->tx_sop_type = tx_sop_type; + + ret = kthread_queue_work(port->wq, &event->work); + if (!ret) { + ret = -EBUSY; + goto err_queue; + } + + return 0; + +err_queue: + kfree(data_cpy); +err_data: + kfree(event); +err_event: + tcpm_log_force(port, "failed to queue altmode vdm, err:%d", ret); + return ret; +} + static void svdm_consume_identity(struct tcpm_port *port, const u32 *p, int cnt) { u32 vdo = p[VDO_INDEX_IDH]; @@ -2784,8 +2843,7 @@ static int tcpm_altmode_enter(struct typec_altmode *altmode, u32 *vdo) header = VDO(altmode->svid, vdo ? 2 : 1, svdm_version, CMD_ENTER_MODE); header |= VDO_OPOS(altmode->mode); - tcpm_queue_vdm_unlocked(port, header, vdo, vdo ? 1 : 0, TCPC_TX_SOP); - return 0; + return tcpm_queue_vdm_unlocked(port, header, vdo, vdo ? 1 : 0, TCPC_TX_SOP); } static int tcpm_altmode_exit(struct typec_altmode *altmode) @@ -2801,8 +2859,7 @@ static int tcpm_altmode_exit(struct typec_altmode *altmode) header = VDO(altmode->svid, 1, svdm_version, CMD_EXIT_MODE); header |= VDO_OPOS(altmode->mode); - tcpm_queue_vdm_unlocked(port, header, NULL, 0, TCPC_TX_SOP); - return 0; + return tcpm_queue_vdm_unlocked(port, header, NULL, 0, TCPC_TX_SOP); } static int tcpm_altmode_vdm(struct typec_altmode *altmode, @@ -2810,9 +2867,7 @@ static int tcpm_altmode_vdm(struct typec_altmode *altmode, { struct tcpm_port *port = typec_altmode_get_drvdata(altmode); - tcpm_queue_vdm_unlocked(port, header, data, count - 1, TCPC_TX_SOP); - - return 0; + return tcpm_queue_vdm_unlocked(port, header, data, count - 1, TCPC_TX_SOP); } static const struct typec_altmode_ops tcpm_altmode_ops = { @@ -2836,8 +2891,7 @@ static int tcpm_cable_altmode_enter(struct typec_altmode *altmode, enum typec_pl header = VDO(altmode->svid, vdo ? 2 : 1, svdm_version, CMD_ENTER_MODE); header |= VDO_OPOS(altmode->mode); - tcpm_queue_vdm_unlocked(port, header, vdo, vdo ? 1 : 0, TCPC_TX_SOP_PRIME); - return 0; + return tcpm_queue_vdm_unlocked(port, header, vdo, vdo ? 1 : 0, TCPC_TX_SOP_PRIME); } static int tcpm_cable_altmode_exit(struct typec_altmode *altmode, enum typec_plug_index sop) @@ -2853,8 +2907,7 @@ static int tcpm_cable_altmode_exit(struct typec_altmode *altmode, enum typec_plu header = VDO(altmode->svid, 1, svdm_version, CMD_EXIT_MODE); header |= VDO_OPOS(altmode->mode); - tcpm_queue_vdm_unlocked(port, header, NULL, 0, TCPC_TX_SOP_PRIME); - return 0; + return tcpm_queue_vdm_unlocked(port, header, NULL, 0, TCPC_TX_SOP_PRIME); } static int tcpm_cable_altmode_vdm(struct typec_altmode *altmode, enum typec_plug_index sop, @@ -2862,9 +2915,7 @@ static int tcpm_cable_altmode_vdm(struct typec_altmode *altmode, enum typec_plug { struct tcpm_port *port = typec_altmode_get_drvdata(altmode); - tcpm_queue_vdm_unlocked(port, header, data, count - 1, TCPC_TX_SOP_PRIME); - - return 0; + return tcpm_queue_vdm_unlocked(port, header, data, count - 1, TCPC_TX_SOP_PRIME); } static const struct typec_cable_ops tcpm_cable_ops = { -- GitLab From 6a6ce20657a9518cc75aece6614694a447877b45 Mon Sep 17 00:00:00 2001 From: "Matthew Wilcox (Oracle)" Date: Wed, 2 Apr 2025 15:59:55 +0100 Subject: [PATCH 1196/2211] 9p: Add a migrate_folio method commit 03ddd7725ed1b39cf9251e1a420559f25dac49b3 upstream. The migration code used to be able to migrate dirty 9p folios by writing them back using writepage. When the writepage method was removed, we neglected to add a migrate_folio method, which means that dirty 9p folios have been unmovable ever since. This reduced our success at defragmenting memory on machines which use 9p heavily. Fixes: 80105ed2fd27 (9p: Use netfslib read/write_iter) Cc: stable@vger.kernel.org Cc: David Howells Cc: v9fs@lists.linux.dev Signed-off-by: "Matthew Wilcox (Oracle)" Link: https://lore.kernel.org/r/20250402150005.2309458-2-willy@infradead.org Acked-by: Dominique Martinet Reviewed-by: David Howells Signed-off-by: Christian Brauner Signed-off-by: Greg Kroah-Hartman --- fs/9p/vfs_addr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 819c752332355..db78c06ba0cc6 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -160,4 +160,5 @@ const struct address_space_operations v9fs_addr_operations = { .invalidate_folio = netfs_invalidate_folio, .direct_IO = noop_direct_IO, .writepages = netfs_writepages, + .migrate_folio = filemap_migrate_folio, }; -- GitLab From b8df8cb8f7eef52baa9ac5bf36a405ca67945a91 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Wed, 28 May 2025 12:15:55 -0400 Subject: [PATCH 1197/2211] ring-buffer: Do not trigger WARN_ON() due to a commit_overrun commit 4fc78a7c9ca994e1da5d3940704d4e8f0ea8c5e4 upstream. When reading a memory mapped buffer the reader page is just swapped out with the last page written in the write buffer. If the reader page is the same as the commit buffer (the buffer that is currently being written to) it was assumed that it should never have missed events. If it does, it triggers a WARN_ON_ONCE(). But there just happens to be one scenario where this can legitimately happen. That is on a commit_overrun. A commit overrun is when an interrupt preempts an event being written to the buffer and then the interrupt adds so many new events that it fills and wraps the buffer back to the commit. Any new events would then be dropped and be reported as "missed_events". In this case, the next page to read is the commit buffer and after the swap of the reader page, the reader page will be the commit buffer, but this time there will be missed events and this triggers the following warning: ------------[ cut here ]------------ WARNING: CPU: 2 PID: 1127 at kernel/trace/ring_buffer.c:7357 ring_buffer_map_get_reader+0x49a/0x780 Modules linked in: kvm_intel kvm irqbypass CPU: 2 UID: 0 PID: 1127 Comm: trace-cmd Not tainted 6.15.0-rc7-test-00004-g478bc2824b45-dirty #564 PREEMPT Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 RIP: 0010:ring_buffer_map_get_reader+0x49a/0x780 Code: 00 00 00 48 89 fe 48 c1 ee 03 80 3c 2e 00 0f 85 ec 01 00 00 4d 3b a6 a8 00 00 00 0f 85 8a fd ff ff 48 85 c0 0f 84 55 fe ff ff <0f> 0b e9 4e fe ff ff be 08 00 00 00 4c 89 54 24 58 48 89 54 24 50 RSP: 0018:ffff888121787dc0 EFLAGS: 00010002 RAX: 00000000000006a2 RBX: ffff888100062800 RCX: ffffffff8190cb49 RDX: ffff888126934c00 RSI: 1ffff11020200a15 RDI: ffff8881010050a8 RBP: dffffc0000000000 R08: 0000000000000000 R09: ffffed1024d26982 R10: ffff888126934c17 R11: ffff8881010050a8 R12: ffff888126934c00 R13: ffff8881010050b8 R14: ffff888101005000 R15: ffff888126930008 FS: 00007f95c8cd7540(0000) GS:ffff8882b576e000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f95c8de4dc0 CR3: 0000000128452002 CR4: 0000000000172ef0 Call Trace: ? __pfx_ring_buffer_map_get_reader+0x10/0x10 tracing_buffers_ioctl+0x283/0x370 __x64_sys_ioctl+0x134/0x190 do_syscall_64+0x79/0x1c0 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7f95c8de48db Code: 00 48 89 44 24 18 31 c0 48 8d 44 24 60 c7 04 24 10 00 00 00 48 89 44 24 08 48 8d 44 24 20 48 89 44 24 10 b8 10 00 00 00 0f 05 <89> c2 3d 00 f0 ff ff 77 1c 48 8b 44 24 18 64 48 2b 04 25 28 00 00 RSP: 002b:00007ffe037ba110 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 RAX: ffffffffffffffda RBX: 00007ffe037bb2b0 RCX: 00007f95c8de48db RDX: 0000000000000000 RSI: 0000000000005220 RDI: 0000000000000006 RBP: 00007ffe037ba180 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 R13: 00007ffe037bb6f8 R14: 00007f95c9065000 R15: 00005575c7492c90 irq event stamp: 5080 hardirqs last enabled at (5079): [] _raw_spin_unlock_irqrestore+0x50/0x70 hardirqs last disabled at (5080): [] _raw_spin_lock_irqsave+0x63/0x70 softirqs last enabled at (4182): [] handle_softirqs+0x552/0x710 softirqs last disabled at (4159): [] __irq_exit_rcu+0x107/0x210 ---[ end trace 0000000000000000 ]--- The above was triggered by running on a kernel with both lockdep and KASAN as well as kmemleak enabled and executing the following command: # perf record -o perf-test.dat -a -- trace-cmd record --nosplice -e all -p function hackbench 50 With perf interjecting a lot of interrupts and trace-cmd enabling all events as well as function tracing, with lockdep, KASAN and kmemleak enabled, it could cause an interrupt preempting an event being written to add enough events to wrap the buffer. trace-cmd was modified to have --nosplice use mmap instead of reading the buffer. The way to differentiate this case from the normal case of there only being one page written to where the swap of the reader page received that one page (which is the commit page), check if the tail page is on the reader page. The difference between the commit page and the tail page is that the tail page is where new writes go to, and the commit page holds the first write that hasn't been committed yet. In the case of an interrupt preempting the write of an event and filling the buffer, it would move the tail page but not the commit page. Have the warning only trigger if the tail page is also on the reader page, and also print out the number of events dropped by a commit overrun as that can not yet be safely added to the page so that the reader can see there were events dropped. Cc: stable@vger.kernel.org Cc: Mathieu Desnoyers Cc: Vincent Donnefort Link: https://lore.kernel.org/20250528121555.2066527e@gandalf.local.home Fixes: fe832be05a8ee ("ring-buffer: Have mmapped ring buffer keep track of missed events") Reviewed-by: Masami Hiramatsu (Google) Signed-off-by: Steven Rostedt (Google) Signed-off-by: Greg Kroah-Hartman --- kernel/trace/ring_buffer.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index baa5547e977a0..154d4d78acb50 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -7274,8 +7274,8 @@ consume: /* Check if any events were dropped */ missed_events = cpu_buffer->lost_events; - if (cpu_buffer->reader_page != cpu_buffer->commit_page) { - if (missed_events) { + if (missed_events) { + if (cpu_buffer->reader_page != cpu_buffer->commit_page) { struct buffer_data_page *bpage = reader->page; unsigned int commit; /* @@ -7296,13 +7296,23 @@ consume: local_add(RB_MISSED_STORED, &bpage->commit); } local_add(RB_MISSED_EVENTS, &bpage->commit); + } else if (!WARN_ONCE(cpu_buffer->reader_page == cpu_buffer->tail_page, + "Reader on commit with %ld missed events", + missed_events)) { + /* + * There shouldn't be any missed events if the tail_page + * is on the reader page. But if the tail page is not on the + * reader page and the commit_page is, that would mean that + * there's a commit_overrun (an interrupt preempted an + * addition of an event and then filled the buffer + * with new events). In this case it's not an + * error, but it should still be reported. + * + * TODO: Add missed events to the page for user space to know. + */ + pr_info("Ring buffer [%d] commit overrun lost %ld events at timestamp:%lld\n", + cpu, missed_events, cpu_buffer->reader_page->page->time_stamp); } - } else { - /* - * There really shouldn't be any missed events if the commit - * is on the reader page. - */ - WARN_ON_ONCE(missed_events); } cpu_buffer->lost_events = 0; -- GitLab From e09c0600beea469b3ebf974464e526a02d59ad62 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Fri, 6 Jun 2025 14:22:42 +0300 Subject: [PATCH 1198/2211] ring-buffer: Fix buffer locking in ring_buffer_subbuf_order_set() commit 40ee2afafc1d9fe3aa44a6fbe440d78a5c96a72e upstream. Enlarge the critical section in ring_buffer_subbuf_order_set() to ensure that error handling takes place with per-buffer mutex held, thus preventing list corruption and other concurrency-related issues. Cc: stable@vger.kernel.org Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Tzvetomir Stoyanov Link: https://lore.kernel.org/20250606112242.1510605-1-dmantipov@yandex.ru Reported-by: syzbot+05d673e83ec640f0ced9@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=05d673e83ec640f0ced9 Fixes: f9b94daa542a8 ("ring-buffer: Set new size of the ring buffer sub page") Signed-off-by: Dmitry Antipov Signed-off-by: Steven Rostedt (Google) Signed-off-by: Greg Kroah-Hartman --- kernel/trace/ring_buffer.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 154d4d78acb50..e95e96cd29d3b 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -6754,7 +6754,7 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order) old_size = buffer->subbuf_size; /* prevent another thread from changing buffer sizes */ - mutex_lock(&buffer->mutex); + guard(mutex)(&buffer->mutex); atomic_inc(&buffer->record_disabled); /* Make sure all commits have finished */ @@ -6859,7 +6859,6 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order) } atomic_dec(&buffer->record_disabled); - mutex_unlock(&buffer->mutex); return 0; @@ -6868,7 +6867,6 @@ error: buffer->subbuf_size = old_size; atomic_dec(&buffer->record_disabled); - mutex_unlock(&buffer->mutex); for_each_buffer_cpu(buffer, cpu) { cpu_buffer = buffer->buffers[cpu]; -- GitLab From 2d6a6cfe969f246c616b0b0f65253060838d58a8 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Tue, 27 May 2025 10:58:20 -0400 Subject: [PATCH 1199/2211] ring-buffer: Move cpus_read_lock() outside of buffer->mutex commit c98cc9797b7009308fff73d41bc1d08642dab77a upstream. Running a modified trace-cmd record --nosplice where it does a mmap of the ring buffer when '--nosplice' is set, caused the following lockdep splat: ====================================================== WARNING: possible circular locking dependency detected 6.15.0-rc7-test-00002-gfb7d03d8a82f #551 Not tainted ------------------------------------------------------ trace-cmd/1113 is trying to acquire lock: ffff888100062888 (&buffer->mutex){+.+.}-{4:4}, at: ring_buffer_map+0x11c/0xe70 but task is already holding lock: ffff888100a5f9f8 (&cpu_buffer->mapping_lock){+.+.}-{4:4}, at: ring_buffer_map+0xcf/0xe70 which lock already depends on the new lock. the existing dependency chain (in reverse order) is: -> #5 (&cpu_buffer->mapping_lock){+.+.}-{4:4}: __mutex_lock+0x192/0x18c0 ring_buffer_map+0xcf/0xe70 tracing_buffers_mmap+0x1c4/0x3b0 __mmap_region+0xd8d/0x1f70 do_mmap+0x9d7/0x1010 vm_mmap_pgoff+0x20b/0x390 ksys_mmap_pgoff+0x2e9/0x440 do_syscall_64+0x79/0x1c0 entry_SYSCALL_64_after_hwframe+0x76/0x7e -> #4 (&mm->mmap_lock){++++}-{4:4}: __might_fault+0xa5/0x110 _copy_to_user+0x22/0x80 _perf_ioctl+0x61b/0x1b70 perf_ioctl+0x62/0x90 __x64_sys_ioctl+0x134/0x190 do_syscall_64+0x79/0x1c0 entry_SYSCALL_64_after_hwframe+0x76/0x7e -> #3 (&cpuctx_mutex){+.+.}-{4:4}: __mutex_lock+0x192/0x18c0 perf_event_init_cpu+0x325/0x7c0 perf_event_init+0x52a/0x5b0 start_kernel+0x263/0x3e0 x86_64_start_reservations+0x24/0x30 x86_64_start_kernel+0x95/0xa0 common_startup_64+0x13e/0x141 -> #2 (pmus_lock){+.+.}-{4:4}: __mutex_lock+0x192/0x18c0 perf_event_init_cpu+0xb7/0x7c0 cpuhp_invoke_callback+0x2c0/0x1030 __cpuhp_invoke_callback_range+0xbf/0x1f0 _cpu_up+0x2e7/0x690 cpu_up+0x117/0x170 cpuhp_bringup_mask+0xd5/0x120 bringup_nonboot_cpus+0x13d/0x170 smp_init+0x2b/0xf0 kernel_init_freeable+0x441/0x6d0 kernel_init+0x1e/0x160 ret_from_fork+0x34/0x70 ret_from_fork_asm+0x1a/0x30 -> #1 (cpu_hotplug_lock){++++}-{0:0}: cpus_read_lock+0x2a/0xd0 ring_buffer_resize+0x610/0x14e0 __tracing_resize_ring_buffer.part.0+0x42/0x120 tracing_set_tracer+0x7bd/0xa80 tracing_set_trace_write+0x132/0x1e0 vfs_write+0x21c/0xe80 ksys_write+0xf9/0x1c0 do_syscall_64+0x79/0x1c0 entry_SYSCALL_64_after_hwframe+0x76/0x7e -> #0 (&buffer->mutex){+.+.}-{4:4}: __lock_acquire+0x1405/0x2210 lock_acquire+0x174/0x310 __mutex_lock+0x192/0x18c0 ring_buffer_map+0x11c/0xe70 tracing_buffers_mmap+0x1c4/0x3b0 __mmap_region+0xd8d/0x1f70 do_mmap+0x9d7/0x1010 vm_mmap_pgoff+0x20b/0x390 ksys_mmap_pgoff+0x2e9/0x440 do_syscall_64+0x79/0x1c0 entry_SYSCALL_64_after_hwframe+0x76/0x7e other info that might help us debug this: Chain exists of: &buffer->mutex --> &mm->mmap_lock --> &cpu_buffer->mapping_lock Possible unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&cpu_buffer->mapping_lock); lock(&mm->mmap_lock); lock(&cpu_buffer->mapping_lock); lock(&buffer->mutex); *** DEADLOCK *** 2 locks held by trace-cmd/1113: #0: ffff888106b847e0 (&mm->mmap_lock){++++}-{4:4}, at: vm_mmap_pgoff+0x192/0x390 #1: ffff888100a5f9f8 (&cpu_buffer->mapping_lock){+.+.}-{4:4}, at: ring_buffer_map+0xcf/0xe70 stack backtrace: CPU: 5 UID: 0 PID: 1113 Comm: trace-cmd Not tainted 6.15.0-rc7-test-00002-gfb7d03d8a82f #551 PREEMPT Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 Call Trace: dump_stack_lvl+0x6e/0xa0 print_circular_bug.cold+0x178/0x1be check_noncircular+0x146/0x160 __lock_acquire+0x1405/0x2210 lock_acquire+0x174/0x310 ? ring_buffer_map+0x11c/0xe70 ? ring_buffer_map+0x11c/0xe70 ? __mutex_lock+0x169/0x18c0 __mutex_lock+0x192/0x18c0 ? ring_buffer_map+0x11c/0xe70 ? ring_buffer_map+0x11c/0xe70 ? function_trace_call+0x296/0x370 ? __pfx___mutex_lock+0x10/0x10 ? __pfx_function_trace_call+0x10/0x10 ? __pfx___mutex_lock+0x10/0x10 ? _raw_spin_unlock+0x2d/0x50 ? ring_buffer_map+0x11c/0xe70 ? ring_buffer_map+0x11c/0xe70 ? __mutex_lock+0x5/0x18c0 ring_buffer_map+0x11c/0xe70 ? do_raw_spin_lock+0x12d/0x270 ? find_held_lock+0x2b/0x80 ? _raw_spin_unlock+0x2d/0x50 ? rcu_is_watching+0x15/0xb0 ? _raw_spin_unlock+0x2d/0x50 ? trace_preempt_on+0xd0/0x110 tracing_buffers_mmap+0x1c4/0x3b0 __mmap_region+0xd8d/0x1f70 ? ring_buffer_lock_reserve+0x99/0xff0 ? __pfx___mmap_region+0x10/0x10 ? ring_buffer_lock_reserve+0x99/0xff0 ? __pfx_ring_buffer_lock_reserve+0x10/0x10 ? __pfx_ring_buffer_lock_reserve+0x10/0x10 ? bpf_lsm_mmap_addr+0x4/0x10 ? security_mmap_addr+0x46/0xd0 ? lock_is_held_type+0xd9/0x130 do_mmap+0x9d7/0x1010 ? 0xffffffffc0370095 ? __pfx_do_mmap+0x10/0x10 vm_mmap_pgoff+0x20b/0x390 ? __pfx_vm_mmap_pgoff+0x10/0x10 ? 0xffffffffc0370095 ksys_mmap_pgoff+0x2e9/0x440 do_syscall_64+0x79/0x1c0 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7fb0963a7de2 Code: 00 00 00 0f 1f 44 00 00 41 f7 c1 ff 0f 00 00 75 27 55 89 cd 53 48 89 fb 48 85 ff 74 3b 41 89 ea 48 89 df b8 09 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 76 5b 5d c3 0f 1f 00 48 8b 05 e1 9f 0d 00 64 RSP: 002b:00007ffdcc8fb878 EFLAGS: 00000246 ORIG_RAX: 0000000000000009 RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007fb0963a7de2 RDX: 0000000000000001 RSI: 0000000000001000 RDI: 0000000000000000 RBP: 0000000000000001 R08: 0000000000000006 R09: 0000000000000000 R10: 0000000000000001 R11: 0000000000000246 R12: 0000000000000000 R13: 00007ffdcc8fbe68 R14: 00007fb096628000 R15: 00005633e01a5c90 The issue is that cpus_read_lock() is taken within buffer->mutex. The memory mapped pages are taken with the mmap_lock held. The buffer->mutex is taken within the cpu_buffer->mapping_lock. There's quite a chain with all these locks, where the deadlock can be fixed by moving the cpus_read_lock() outside the taking of the buffer->mutex. Cc: stable@vger.kernel.org Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Vincent Donnefort Link: https://lore.kernel.org/20250527105820.0f45d045@gandalf.local.home Fixes: 117c39200d9d7 ("ring-buffer: Introducing ring-buffer mapping functions") Signed-off-by: Steven Rostedt (Google) Signed-off-by: Greg Kroah-Hartman --- kernel/trace/ring_buffer.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index e95e96cd29d3b..6ab740d3185bc 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -2796,6 +2796,12 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size, if (nr_pages < 2) nr_pages = 2; + /* + * Keep CPUs from coming online while resizing to synchronize + * with new per CPU buffers being created. + */ + guard(cpus_read_lock)(); + /* prevent another thread from changing buffer sizes */ mutex_lock(&buffer->mutex); atomic_inc(&buffer->resizing); @@ -2840,7 +2846,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size, cond_resched(); } - cpus_read_lock(); /* * Fire off all the required work handlers * We can't schedule on offline CPUs, but it's not necessary @@ -2880,7 +2885,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size, cpu_buffer->nr_pages_to_update = 0; } - cpus_read_unlock(); } else { cpu_buffer = buffer->buffers[cpu_id]; @@ -2908,8 +2912,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size, goto out_err; } - cpus_read_lock(); - /* Can't run something on an offline CPU. */ if (!cpu_online(cpu_id)) rb_update_pages(cpu_buffer); @@ -2928,7 +2930,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size, } cpu_buffer->nr_pages_to_update = 0; - cpus_read_unlock(); } out: -- GitLab From 9332b7a8364e93647eac44b2f1397912dbbddc19 Mon Sep 17 00:00:00 2001 From: Dave Chinner Date: Thu, 1 May 2025 09:27:24 +1000 Subject: [PATCH 1200/2211] xfs: don't assume perags are initialised when trimming AGs commit 23be716b1c4f3f3a6c00ee38d51a57ef7db9ef7d upstream. When running fstrim immediately after mounting a V4 filesystem, the fstrim fails to trim all the free space in the filesystem. It only trims the first extent in the by-size free space tree in each AG and then returns. If a second fstrim is then run, it runs correctly and the entire free space in the filesystem is iterated and discarded correctly. The problem lies in the setup of the trim cursor - it assumes that pag->pagf_longest is valid without either reading the AGF first or checking if xfs_perag_initialised_agf(pag) is true or not. As a result, when a filesystem is mounted without reading the AGF (e.g. a clean mount on a v4 filesystem) and the first operation is a fstrim call, pag->pagf_longest is zero and so the free extent search starts at the wrong end of the by-size btree and exits after discarding the first record in the tree. Fix this by deferring the initialisation of tcur->count to after we have locked the AGF and guaranteed that the perag is properly initialised. We trigger this on tcur->count == 0 after locking the AGF, as this will only occur on the first call to xfs_trim_gather_extents() for each AG. If we need to iterate, tcur->count will be set to the length of the record we need to restart at, so we can use this to ensure we only sample a valid pag->pagf_longest value for the iteration. Signed-off-by: Dave Chinner Reviewed-by: Bill O'Donnell Reviewed-by: Darrick J. Wong Fixes: 89cfa899608f ("xfs: reduce AGF hold times during fstrim operations") Cc: # v6.6 Signed-off-by: Carlos Maiolino Signed-off-by: Greg Kroah-Hartman --- fs/xfs/xfs_discard.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index d8c4a5dcca7ae..0b343776da8c3 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -146,6 +146,14 @@ xfs_discard_extents( return error; } +/* + * Care must be taken setting up the trim cursor as the perags may not have been + * initialised when the cursor is initialised. e.g. a clean mount which hasn't + * read in AGFs and the first operation run on the mounted fs is a trim. This + * can result in perag fields that aren't initialised until + * xfs_trim_gather_extents() calls xfs_alloc_read_agf() to lock down the AG for + * the free space search. + */ struct xfs_trim_cur { xfs_agblock_t start; xfs_extlen_t count; @@ -183,6 +191,14 @@ xfs_trim_gather_extents( if (error) goto out_trans_cancel; + /* + * First time through tcur->count will not have been initialised as + * pag->pagf_longest is not guaranteed to be valid before we read + * the AGF buffer above. + */ + if (!tcur->count) + tcur->count = pag->pagf_longest; + if (tcur->by_bno) { /* sub-AG discard request always starts at tcur->start */ cur = xfs_bnobt_init_cursor(mp, tp, agbp, pag); @@ -329,7 +345,6 @@ xfs_trim_perag_extents( { struct xfs_trim_cur tcur = { .start = start, - .count = pag->pagf_longest, .end = end, .minlen = minlen, }; -- GitLab From dbbad9a0162cf4ba0faf727c682fe00f73449876 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Mon, 12 May 2025 14:54:52 -0700 Subject: [PATCH 1201/2211] xen/arm: call uaccess_ttbr0_enable for dm_op hypercall commit 7f9bbc1140ff8796230bc2634055763e271fd692 upstream. dm_op hypercalls might come from userspace and pass memory addresses as parameters. The memory addresses typically correspond to buffers allocated in userspace to hold extra hypercall parameters. On ARM, when CONFIG_ARM64_SW_TTBR0_PAN is enabled, they might not be accessible by Xen, as a result ioreq hypercalls might fail. See the existing comment in arch/arm64/xen/hypercall.S regarding privcmd_call for reference. For privcmd_call, Linux calls uaccess_ttbr0_enable before issuing the hypercall thanks to commit 9cf09d68b89a. We need to do the same for dm_op. This resolves the problem. Cc: stable@kernel.org Fixes: 9cf09d68b89a ("arm64: xen: Enable user access before a privcmd hvc call") Signed-off-by: Stefano Stabellini Reviewed-by: Juergen Gross Message-ID: Signed-off-by: Juergen Gross Signed-off-by: Greg Kroah-Hartman --- arch/arm64/xen/hypercall.S | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/arch/arm64/xen/hypercall.S b/arch/arm64/xen/hypercall.S index 9d01361696a14..ae551b8571374 100644 --- a/arch/arm64/xen/hypercall.S +++ b/arch/arm64/xen/hypercall.S @@ -83,7 +83,26 @@ HYPERCALL3(vcpu_op); HYPERCALL1(platform_op_raw); HYPERCALL2(multicall); HYPERCALL2(vm_assist); -HYPERCALL3(dm_op); + +SYM_FUNC_START(HYPERVISOR_dm_op) + mov x16, #__HYPERVISOR_dm_op; \ + /* + * dm_op hypercalls are issued by the userspace. The kernel needs to + * enable access to TTBR0_EL1 as the hypervisor would issue stage 1 + * translations to user memory via AT instructions. Since AT + * instructions are not affected by the PAN bit (ARMv8.1), we only + * need the explicit uaccess_enable/disable if the TTBR0 PAN emulation + * is enabled (it implies that hardware UAO and PAN disabled). + */ + uaccess_ttbr0_enable x6, x7, x8 + hvc XEN_IMM + + /* + * Disable userspace access from kernel once the hyp call completed. + */ + uaccess_ttbr0_disable x6, x7 + ret +SYM_FUNC_END(HYPERVISOR_dm_op); SYM_FUNC_START(privcmd_call) mov x16, x0 -- GitLab From b3b3b6366dc8eb5b22edba9adc4bff3cdacfd64c Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Wed, 26 Feb 2025 16:01:57 +0100 Subject: [PATCH 1202/2211] x86/iopl: Cure TIF_IO_BITMAP inconsistencies commit 8b68e978718f14fdcb080c2a7791c52a0d09bc6d upstream. io_bitmap_exit() is invoked from exit_thread() when a task exists or when a fork fails. In the latter case the exit_thread() cleans up resources which were allocated during fork(). io_bitmap_exit() invokes task_update_io_bitmap(), which in turn ends up in tss_update_io_bitmap(). tss_update_io_bitmap() operates on the current task. If current has TIF_IO_BITMAP set, but no bitmap installed, tss_update_io_bitmap() crashes with a NULL pointer dereference. There are two issues, which lead to that problem: 1) io_bitmap_exit() should not invoke task_update_io_bitmap() when the task, which is cleaned up, is not the current task. That's a clear indicator for a cleanup after a failed fork(). 2) A task should not have TIF_IO_BITMAP set and neither a bitmap installed nor IOPL emulation level 3 activated. This happens when a kernel thread is created in the context of a user space thread, which has TIF_IO_BITMAP set as the thread flags are copied and the IO bitmap pointer is cleared. Other than in the failed fork() case this has no impact because kernel threads including IO workers never return to user space and therefore never invoke tss_update_io_bitmap(). Cure this by adding the missing cleanups and checks: 1) Prevent io_bitmap_exit() to invoke task_update_io_bitmap() if the to be cleaned up task is not the current task. 2) Clear TIF_IO_BITMAP in copy_thread() unconditionally. For user space forks it is set later, when the IO bitmap is inherited in io_bitmap_share(). For paranoia sake, add a warning into tss_update_io_bitmap() to catch the case, when that code is invoked with inconsistent state. Fixes: ea5f1cd7ab49 ("x86/ioperm: Remove bitmap if all permissions dropped") Reported-by: syzbot+e2b1803445d236442e54@syzkaller.appspotmail.com Signed-off-by: Thomas Gleixner Signed-off-by: Borislav Petkov (AMD) Cc: stable@vger.kernel.org Link: https://lore.kernel.org/87wmdceom2.ffs@tglx Signed-off-by: Greg Kroah-Hartman --- arch/x86/kernel/ioport.c | 13 +++++++++---- arch/x86/kernel/process.c | 6 ++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c index e2fab3ceb09fb..9a101150376db 100644 --- a/arch/x86/kernel/ioport.c +++ b/arch/x86/kernel/ioport.c @@ -33,8 +33,9 @@ void io_bitmap_share(struct task_struct *tsk) set_tsk_thread_flag(tsk, TIF_IO_BITMAP); } -static void task_update_io_bitmap(struct task_struct *tsk) +static void task_update_io_bitmap(void) { + struct task_struct *tsk = current; struct thread_struct *t = &tsk->thread; if (t->iopl_emul == 3 || t->io_bitmap) { @@ -54,7 +55,12 @@ void io_bitmap_exit(struct task_struct *tsk) struct io_bitmap *iobm = tsk->thread.io_bitmap; tsk->thread.io_bitmap = NULL; - task_update_io_bitmap(tsk); + /* + * Don't touch the TSS when invoked on a failed fork(). TSS + * reflects the state of @current and not the state of @tsk. + */ + if (tsk == current) + task_update_io_bitmap(); if (iobm && refcount_dec_and_test(&iobm->refcnt)) kfree(iobm); } @@ -192,8 +198,7 @@ SYSCALL_DEFINE1(iopl, unsigned int, level) } t->iopl_emul = level; - task_update_io_bitmap(current); - + task_update_io_bitmap(); return 0; } diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 8a9ddc4adf51b..1dbd7a34645c2 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -180,6 +180,7 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args) frame->ret_addr = (unsigned long) ret_from_fork_asm; p->thread.sp = (unsigned long) fork_frame; p->thread.io_bitmap = NULL; + clear_tsk_thread_flag(p, TIF_IO_BITMAP); p->thread.iopl_warn = 0; memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps)); @@ -468,6 +469,11 @@ void native_tss_update_io_bitmap(void) } else { struct io_bitmap *iobm = t->io_bitmap; + if (WARN_ON_ONCE(!iobm)) { + clear_thread_flag(TIF_IO_BITMAP); + native_tss_invalidate_io_bitmap(); + } + /* * Only copy bitmap data when the sequence number differs. The * update time is accounted to the incoming task. -- GitLab From ea50a9c348dc0b78c66b17000dceeaa9385602ab Mon Sep 17 00:00:00 2001 From: "Xin Li (Intel)" Date: Mon, 9 Jun 2025 01:40:53 -0700 Subject: [PATCH 1203/2211] x86/fred/signal: Prevent immediate repeat of single step trap on return from SIGTRAP handler commit e34dbbc85d64af59176fe59fad7b4122f4330fe2 upstream. Clear the software event flag in the augmented SS to prevent immediate repeat of single step trap on return from SIGTRAP handler if the trap flag (TF) is set without an external debugger attached. Following is a typical single-stepping flow for a user process: 1) The user process is prepared for single-stepping by setting RFLAGS.TF = 1. 2) When any instruction in user space completes, a #DB is triggered. 3) The kernel handles the #DB and returns to user space, invoking the SIGTRAP handler with RFLAGS.TF = 0. 4) After the SIGTRAP handler finishes, the user process performs a sigreturn syscall, restoring the original state, including RFLAGS.TF = 1. 5) Goto step 2. According to the FRED specification: A) Bit 17 in the augmented SS is designated as the software event flag, which is set to 1 for FRED event delivery of SYSCALL, SYSENTER, or INT n. B) If bit 17 of the augmented SS is 1 and ERETU would result in RFLAGS.TF = 1, a single-step trap will be pending upon completion of ERETU. In step 4) above, the software event flag is set upon the sigreturn syscall, and its corresponding ERETU would restore RFLAGS.TF = 1. This combination causes a pending single-step trap upon completion of ERETU. Therefore, another #DB is triggered before any user space instruction is executed, which leads to an infinite loop in which the SIGTRAP handler keeps being invoked on the same user space IP. Fixes: 14619d912b65 ("x86/fred: FRED entry/exit and dispatch code") Suggested-by: H. Peter Anvin (Intel) Signed-off-by: Xin Li (Intel) Signed-off-by: Dave Hansen Tested-by: Sohil Mehta Cc:stable@vger.kernel.org Link: https://lore.kernel.org/all/20250609084054.2083189-2-xin%40zytor.com Signed-off-by: Greg Kroah-Hartman --- arch/x86/include/asm/sighandling.h | 22 ++++++++++++++++++++++ arch/x86/kernel/signal_32.c | 4 ++++ arch/x86/kernel/signal_64.c | 4 ++++ 3 files changed, 30 insertions(+) diff --git a/arch/x86/include/asm/sighandling.h b/arch/x86/include/asm/sighandling.h index e770c4fc47f4c..8727c7e21dd1e 100644 --- a/arch/x86/include/asm/sighandling.h +++ b/arch/x86/include/asm/sighandling.h @@ -24,4 +24,26 @@ int ia32_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs); int x64_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs); int x32_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs); +/* + * To prevent immediate repeat of single step trap on return from SIGTRAP + * handler if the trap flag (TF) is set without an external debugger attached, + * clear the software event flag in the augmented SS, ensuring no single-step + * trap is pending upon ERETU completion. + * + * Note, this function should be called in sigreturn() before the original + * state is restored to make sure the TF is read from the entry frame. + */ +static __always_inline void prevent_single_step_upon_eretu(struct pt_regs *regs) +{ + /* + * If the trap flag (TF) is set, i.e., the sigreturn() SYSCALL instruction + * is being single-stepped, do not clear the software event flag in the + * augmented SS, thus a debugger won't skip over the following instruction. + */ +#ifdef CONFIG_X86_FRED + if (!(regs->flags & X86_EFLAGS_TF)) + regs->fred_ss.swevent = 0; +#endif +} + #endif /* _ASM_X86_SIGHANDLING_H */ diff --git a/arch/x86/kernel/signal_32.c b/arch/x86/kernel/signal_32.c index 98123ff10506c..42bbc42bd3503 100644 --- a/arch/x86/kernel/signal_32.c +++ b/arch/x86/kernel/signal_32.c @@ -152,6 +152,8 @@ SYSCALL32_DEFINE0(sigreturn) struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8); sigset_t set; + prevent_single_step_upon_eretu(regs); + if (!access_ok(frame, sizeof(*frame))) goto badframe; if (__get_user(set.sig[0], &frame->sc.oldmask) @@ -175,6 +177,8 @@ SYSCALL32_DEFINE0(rt_sigreturn) struct rt_sigframe_ia32 __user *frame; sigset_t set; + prevent_single_step_upon_eretu(regs); + frame = (struct rt_sigframe_ia32 __user *)(regs->sp - 4); if (!access_ok(frame, sizeof(*frame))) diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c index ee9453891901b..d483b585c6c60 100644 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c @@ -250,6 +250,8 @@ SYSCALL_DEFINE0(rt_sigreturn) sigset_t set; unsigned long uc_flags; + prevent_single_step_upon_eretu(regs); + frame = (struct rt_sigframe __user *)(regs->sp - sizeof(long)); if (!access_ok(frame, sizeof(*frame))) goto badframe; @@ -366,6 +368,8 @@ COMPAT_SYSCALL_DEFINE0(x32_rt_sigreturn) sigset_t set; unsigned long uc_flags; + prevent_single_step_upon_eretu(regs); + frame = (struct rt_sigframe_x32 __user *)(regs->sp - 8); if (!access_ok(frame, sizeof(*frame))) -- GitLab From 77e1bf9dad14dae319b6c88d263f8ad0d8adeab6 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 4 Jun 2025 13:38:26 +0000 Subject: [PATCH 1204/2211] calipso: unlock rcu before returning -EAFNOSUPPORT commit 3cae906e1a6184cdc9e4d260e4dbdf9a118d94ad upstream. syzbot reported that a recent patch forgot to unlock rcu in the error path. Adopt the convention that netlbl_conn_setattr() is already using. Fixes: 6e9f2df1c550 ("calipso: Don't call calipso functions for AF_INET sk.") Reported-by: syzbot Signed-off-by: Eric Dumazet Cc: Kuniyuki Iwashima Acked-by: Paul Moore Link: https://patch.msgid.link/20250604133826.1667664-1-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- net/netlabel/netlabel_kapi.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c index 6ea16138582c0..33b77084a4e5f 100644 --- a/net/netlabel/netlabel_kapi.c +++ b/net/netlabel/netlabel_kapi.c @@ -1165,8 +1165,10 @@ int netlbl_conn_setattr(struct sock *sk, break; #if IS_ENABLED(CONFIG_IPV6) case AF_INET6: - if (sk->sk_family != AF_INET6) - return -EAFNOSUPPORT; + if (sk->sk_family != AF_INET6) { + ret_val = -EAFNOSUPPORT; + goto conn_setattr_return; + } addr6 = (struct sockaddr_in6 *)addr; entry = netlbl_domhsh_getentry_af6(secattr->domain, -- GitLab From d4724213c82bbef95fa8264671e9b99662bf1c77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=ADcolas=20F=2E=20R=2E=20A=2E=20Prado?= Date: Wed, 14 May 2025 08:36:06 -0400 Subject: [PATCH 1205/2211] regulator: dt-bindings: mt6357: Drop fixed compatible requirement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 9cfdd7752ba5f8cc9b8191e8c9aeeec246241fa4 upstream. Some of the regulators on the MT6357 PMIC currently reference the fixed-regulator dt-binding, which enforces the presence of a regulator-fixed compatible. However since all regulators on the MT6357 PMIC are handled by a single mt6357-regulator driver, probed through MFD, the compatibles don't serve any purpose. In fact they cause failures in the DT kselftest since they aren't probed by the fixed regulator driver as would be expected. Furthermore this is the only dt-binding in this family like this: mt6359-regulator and mt6358-regulator don't require those compatibles. Commit d77e89b7b03f ("arm64: dts: mediatek: mt6357: Drop regulator-fixed compatibles") removed the compatibles from Devicetree, but missed updating the binding, which still requires them, introducing dt-binding errors. Remove the compatible requirement by referencing the plain regulator dt-binding instead to fix the dt-binding errors. Fixes: d77e89b7b03f ("arm64: dts: mediatek: mt6357: Drop regulator-fixed compatibles") Signed-off-by: Nícolas F. R. A. Prado Link: https://patch.msgid.link/20250514-mt6357-regulator-fixed-compatibles-removal-bindings-v1-1-2421e9cc6cc7@collabora.com Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- .../regulator/mediatek,mt6357-regulator.yaml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/Documentation/devicetree/bindings/regulator/mediatek,mt6357-regulator.yaml b/Documentation/devicetree/bindings/regulator/mediatek,mt6357-regulator.yaml index 6327bb2f6ee08..698266c09e253 100644 --- a/Documentation/devicetree/bindings/regulator/mediatek,mt6357-regulator.yaml +++ b/Documentation/devicetree/bindings/regulator/mediatek,mt6357-regulator.yaml @@ -33,7 +33,7 @@ patternProperties: "^ldo-v(camio18|aud28|aux18|io18|io28|rf12|rf18|cn18|cn28|fe28)$": type: object - $ref: fixed-regulator.yaml# + $ref: regulator.yaml# unevaluatedProperties: false description: Properties for single fixed LDO regulator. @@ -112,7 +112,6 @@ examples: regulator-enable-ramp-delay = <220>; }; mt6357_vfe28_reg: ldo-vfe28 { - compatible = "regulator-fixed"; regulator-name = "vfe28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; @@ -125,14 +124,12 @@ examples: regulator-enable-ramp-delay = <110>; }; mt6357_vrf18_reg: ldo-vrf18 { - compatible = "regulator-fixed"; regulator-name = "vrf18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-enable-ramp-delay = <110>; }; mt6357_vrf12_reg: ldo-vrf12 { - compatible = "regulator-fixed"; regulator-name = "vrf12"; regulator-min-microvolt = <1200000>; regulator-max-microvolt = <1200000>; @@ -157,14 +154,12 @@ examples: regulator-enable-ramp-delay = <264>; }; mt6357_vcn28_reg: ldo-vcn28 { - compatible = "regulator-fixed"; regulator-name = "vcn28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; regulator-enable-ramp-delay = <264>; }; mt6357_vcn18_reg: ldo-vcn18 { - compatible = "regulator-fixed"; regulator-name = "vcn18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; @@ -183,7 +178,6 @@ examples: regulator-enable-ramp-delay = <264>; }; mt6357_vcamio_reg: ldo-vcamio18 { - compatible = "regulator-fixed"; regulator-name = "vcamio"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; @@ -212,28 +206,24 @@ examples: regulator-always-on; }; mt6357_vaux18_reg: ldo-vaux18 { - compatible = "regulator-fixed"; regulator-name = "vaux18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-enable-ramp-delay = <264>; }; mt6357_vaud28_reg: ldo-vaud28 { - compatible = "regulator-fixed"; regulator-name = "vaud28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; regulator-enable-ramp-delay = <264>; }; mt6357_vio28_reg: ldo-vio28 { - compatible = "regulator-fixed"; regulator-name = "vio28"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; regulator-enable-ramp-delay = <264>; }; mt6357_vio18_reg: ldo-vio18 { - compatible = "regulator-fixed"; regulator-name = "vio18"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; -- GitLab From b4a86d64e487444b9e7848e1bc282ca50b57d24e Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Fri, 23 May 2025 14:09:43 +0200 Subject: [PATCH 1206/2211] usb: misc: onboard_usb_dev: fix build warning for CONFIG_USB_ONBOARD_DEV_USB5744=n commit 662a9ece32add94469138ae66999ee16cb37a531 upstream. When the USB5744 option is disabled, the onboard_usb driver warns about unused functions: drivers/usb/misc/onboard_usb_dev.c:358:12: error: 'onboard_dev_5744_i2c_write_byte' defined but not used [-Werror=unused-function] 358 | static int onboard_dev_5744_i2c_write_byte(struct i2c_client *client, u16 addr, u8 data) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/usb/misc/onboard_usb_dev.c:313:12: error: 'onboard_dev_5744_i2c_read_byte' defined but not used [-Werror=unused-function] 313 | static int onboard_dev_5744_i2c_read_byte(struct i2c_client *client, u16 addr, u8 *data) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Extend the #ifdef block a little further to cover all of these functions. Ideally we'd use use if(IS_ENABLED()) instead, but that doesn't currently work because the i2c_transfer() and i2c_smbus_write_word_data() function declarations are hidden when CONFIG_I2C is disabled. Fixes: 1143d41922c0 ("usb: misc: onboard_usb_dev: Fix usb5744 initialization sequence") Signed-off-by: Arnd Bergmann Link: https://lore.kernel.org/r/20250523120947.2170302-1-arnd@kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/usb/misc/onboard_usb_dev.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/usb/misc/onboard_usb_dev.c b/drivers/usb/misc/onboard_usb_dev.c index d8b48c789410f..cf716ae870b80 100644 --- a/drivers/usb/misc/onboard_usb_dev.c +++ b/drivers/usb/misc/onboard_usb_dev.c @@ -310,6 +310,7 @@ static void onboard_dev_attach_usb_driver(struct work_struct *work) pr_err("Failed to attach USB driver: %pe\n", ERR_PTR(err)); } +#if IS_ENABLED(CONFIG_USB_ONBOARD_DEV_USB5744) static int onboard_dev_5744_i2c_read_byte(struct i2c_client *client, u16 addr, u8 *data) { struct i2c_msg msg[2]; @@ -388,7 +389,6 @@ static int onboard_dev_5744_i2c_write_byte(struct i2c_client *client, u16 addr, static int onboard_dev_5744_i2c_init(struct i2c_client *client) { -#if IS_ENABLED(CONFIG_USB_ONBOARD_DEV_USB5744) struct device *dev = &client->dev; int ret; u8 reg; @@ -417,10 +417,13 @@ static int onboard_dev_5744_i2c_init(struct i2c_client *client) return dev_err_probe(dev, ret, "USB Attach with SMBus command failed\n"); return ret; +} #else +static int onboard_dev_5744_i2c_init(struct i2c_client *client) +{ return -ENODEV; -#endif } +#endif static int onboard_dev_probe(struct platform_device *pdev) { -- GitLab From 5ed1d7a7000002464bc1939f2b476752eaa2f155 Mon Sep 17 00:00:00 2001 From: Oliver Neukum Date: Wed, 28 May 2025 13:03:54 +0200 Subject: [PATCH 1207/2211] net: usb: aqc111: debug info before sanitation commit d3faab9b5a6a0477d69c38bd11c43aa5e936f929 upstream. If we sanitize error returns, the debug statements need to come before that so that we don't lose information. Signed-off-by: Oliver Neukum Fixes: 405b0d610745 ("net: usb: aqc111: fix error handling of usbnet read calls") Reviewed-by: Andrew Lunn Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/usb/aqc111.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/net/usb/aqc111.c b/drivers/net/usb/aqc111.c index 453a2cf82753f..9201ee10a13f7 100644 --- a/drivers/net/usb/aqc111.c +++ b/drivers/net/usb/aqc111.c @@ -31,11 +31,11 @@ static int aqc111_read_cmd_nopm(struct usbnet *dev, u8 cmd, u16 value, USB_RECIP_DEVICE, value, index, data, size); if (unlikely(ret < size)) { - ret = ret < 0 ? ret : -ENODATA; - netdev_warn(dev->net, "Failed to read(0x%x) reg index 0x%04x: %d\n", cmd, index, ret); + + ret = ret < 0 ? ret : -ENODATA; } return ret; @@ -50,11 +50,11 @@ static int aqc111_read_cmd(struct usbnet *dev, u8 cmd, u16 value, USB_RECIP_DEVICE, value, index, data, size); if (unlikely(ret < size)) { - ret = ret < 0 ? ret : -ENODATA; - netdev_warn(dev->net, "Failed to read(0x%x) reg index 0x%04x: %d\n", cmd, index, ret); + + ret = ret < 0 ? ret : -ENODATA; } return ret; -- GitLab From ab20b0bdb01fc3e65ff6273893c94013f3e8a0e5 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 30 May 2025 12:06:47 -0700 Subject: [PATCH 1208/2211] overflow: Introduce __DEFINE_FLEX for having no initializer commit 5c78e793f78732b60276401f75cc1a101f9ad121 upstream. While not yet in the tree, there is a proposed patch[1] that was depending on the prior behavior of _DEFINE_FLEX, which did not have an explicit initializer. Provide this via __DEFINE_FLEX now, which can also have attributes applied (e.g. __uninitialized). Examples of the resulting initializer behaviors can be seen here: https://godbolt.org/z/P7Go8Tr33 Link: https://lore.kernel.org/netdev/20250520205920.2134829-9-anthony.l.nguyen@intel.com [1] Fixes: 47e36ed78406 ("overflow: Fix direct struct member initialization in _DEFINE_FLEX()") Signed-off-by: Kees Cook Signed-off-by: Greg Kroah-Hartman --- include/linux/overflow.h | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/include/linux/overflow.h b/include/linux/overflow.h index 823a53cd9a193..89e9d60498835 100644 --- a/include/linux/overflow.h +++ b/include/linux/overflow.h @@ -389,24 +389,37 @@ static inline size_t __must_check size_sub(size_t minuend, size_t subtrahend) struct_size((type *)NULL, member, count) /** - * _DEFINE_FLEX() - helper macro for DEFINE_FLEX() family. - * Enables caller macro to pass (different) initializer. + * __DEFINE_FLEX() - helper macro for DEFINE_FLEX() family. + * Enables caller macro to pass arbitrary trailing expressions * * @type: structure type name, including "struct" keyword. * @name: Name for a variable to define. * @member: Name of the array member. * @count: Number of elements in the array; must be compile-time const. - * @initializer: Initializer expression (e.g., pass `= { }` at minimum). + * @trailer: Trailing expressions for attributes and/or initializers. */ -#define _DEFINE_FLEX(type, name, member, count, initializer...) \ +#define __DEFINE_FLEX(type, name, member, count, trailer...) \ _Static_assert(__builtin_constant_p(count), \ "onstack flex array members require compile-time const count"); \ union { \ u8 bytes[struct_size_t(type, member, count)]; \ type obj; \ - } name##_u = { .obj initializer }; \ + } name##_u trailer; \ type *name = (type *)&name##_u +/** + * _DEFINE_FLEX() - helper macro for DEFINE_FLEX() family. + * Enables caller macro to pass (different) initializer. + * + * @type: structure type name, including "struct" keyword. + * @name: Name for a variable to define. + * @member: Name of the array member. + * @count: Number of elements in the array; must be compile-time const. + * @initializer: Initializer expression (e.g., pass `= { }` at minimum). + */ +#define _DEFINE_FLEX(type, name, member, count, initializer...) \ + __DEFINE_FLEX(type, name, member, count, = { .obj initializer }) + /** * DEFINE_RAW_FLEX() - Define an on-stack instance of structure with a trailing * flexible array member, when it does not have a __counted_by annotation. @@ -421,7 +434,7 @@ static inline size_t __must_check size_sub(size_t minuend, size_t subtrahend) * Use __struct_size(@name) to get compile-time size of it afterwards. */ #define DEFINE_RAW_FLEX(type, name, member, count) \ - _DEFINE_FLEX(type, name, member, count, = {}) + __DEFINE_FLEX(type, name, member, count, = { }) /** * DEFINE_FLEX() - Define an on-stack instance of structure with a trailing -- GitLab From da728507b071c4ea006383a9c796cea1c4dab8a1 Mon Sep 17 00:00:00 2001 From: Andrew Price Date: Wed, 28 May 2025 16:02:37 +0100 Subject: [PATCH 1209/2211] gfs2: Don't clear sb->s_fs_info in gfs2_sys_fs_add commit 9126d2754c5e5d1818765811a10af0a14cf1fa0a upstream. When gfs2_sys_fs_add() fails, it sets sb->s_fs_info to NULL on its error path (see commit 0d515210b696 ("GFS2: Add kobject release method")). The intention seems to be to prevent dereferencing sb->s_fs_info once the object pointed to has been deallocated, but that would be better achieved by setting the pointer to NULL in free_sbd(). As a consequence, when the call to gfs2_sys_fs_add() fails in gfs2_fill_super(), sdp = GFS2_SB(inode) will evaluate to NULL in iput() -> gfs2_drop_inode(), and accessing sdp->sd_flags will be a NULL pointer dereference. Fix that by only setting sb->s_fs_info to NULL when actually freeing the object pointed to in free_sbd(). Fixes: ae9f3bd8259a ("gfs2: replace sd_aspace with sd_inode") Reported-by: syzbot+b12826218502df019f9d@syzkaller.appspotmail.com Signed-off-by: Andrew Price Signed-off-by: Andreas Gruenbacher Signed-off-by: Greg Kroah-Hartman --- fs/gfs2/ops_fstype.c | 4 +++- fs/gfs2/sys.c | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 6ce475e1c6d64..4a0f7de41b2b2 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -64,8 +64,11 @@ static void gfs2_tune_init(struct gfs2_tune *gt) void free_sbd(struct gfs2_sbd *sdp) { + struct super_block *sb = sdp->sd_vfs; + if (sdp->sd_lkstats) free_percpu(sdp->sd_lkstats); + sb->s_fs_info = NULL; kfree(sdp); } @@ -1316,7 +1319,6 @@ fail_iput: iput(sdp->sd_inode); fail_free: free_sbd(sdp); - sb->s_fs_info = NULL; return error; } diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c index ecc699f8d9fca..6286183021022 100644 --- a/fs/gfs2/sys.c +++ b/fs/gfs2/sys.c @@ -764,7 +764,6 @@ fail_reg: fs_err(sdp, "error %d adding sysfs files\n", error); kobject_put(&sdp->sd_kobj); wait_for_completion(&sdp->sd_kobj_unregister); - sb->s_fs_info = NULL; return error; } -- GitLab From 6695a1fa988ed57932962ce4adbe508b18a5f67f Mon Sep 17 00:00:00 2001 From: I Hsin Cheng Date: Tue, 6 May 2025 02:43:38 +0800 Subject: [PATCH 1210/2211] drm/meson: Use 1000ULL when operating with mode->clock commit eb0851e14432f3b87c77b704c835ac376deda03a upstream. Coverity scan reported the usage of "mode->clock * 1000" may lead to integer overflow. Use "1000ULL" instead of "1000" when utilizing it to avoid potential integer overflow issue. Link: https://scan5.scan.coverity.com/#/project-view/10074/10063?selectedIssue=1646759 Signed-off-by: I Hsin Cheng Reviewed-by: Martin Blumenstingl Fixes: 1017560164b6 ("drm/meson: use unsigned long long / Hz for frequency types") Link: https://lore.kernel.org/r/20250505184338.678540-1-richard120310@gmail.com Signed-off-by: Neil Armstrong Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/meson/meson_encoder_hdmi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c index 2c49137e0deed..2ad8383fcaed5 100644 --- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c +++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c @@ -75,7 +75,7 @@ static void meson_encoder_hdmi_set_vclk(struct meson_encoder_hdmi *encoder_hdmi, unsigned long long venc_freq; unsigned long long hdmi_freq; - vclk_freq = mode->clock * 1000; + vclk_freq = mode->clock * 1000ULL; /* For 420, pixel clock is half unlike venc clock */ if (encoder_hdmi->output_bus_fmt == MEDIA_BUS_FMT_UYYVYY8_0_5X24) @@ -123,7 +123,7 @@ static enum drm_mode_status meson_encoder_hdmi_mode_valid(struct drm_bridge *bri struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge); struct meson_drm *priv = encoder_hdmi->priv; bool is_hdmi2_sink = display_info->hdmi.scdc.supported; - unsigned long long clock = mode->clock * 1000; + unsigned long long clock = mode->clock * 1000ULL; unsigned long long phy_freq; unsigned long long vclk_freq; unsigned long long venc_freq; -- GitLab From fe794d1f9bd103fa69271eb12d1dfa6fba23f891 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Mon, 5 May 2025 07:24:52 +0200 Subject: [PATCH 1211/2211] thermal/drivers/mediatek/lvts: Remove unused lvts_debugfs_exit commit 3159c96ac2cb3a104ce8ee5b8a4afe98e4b8fcad upstream. When debugfs is disabled, the function has no reference any more: drivers/thermal/mediatek/lvts_thermal.c:266:13: error: 'lvts_debugfs_exit' defined but not used [-Werror=unused-function] 266 | static void lvts_debugfs_exit(struct lvts_domain *lvts_td) { } | ^~~~~~~~~~~~~~~~~ Fixes: ef280c17a840 ("thermal/drivers/mediatek/lvts: Fix debugfs unregister on failure") Signed-off-by: Arnd Bergmann Link: https://lore.kernel.org/r/20250505052502.1812867-1-arnd@kernel.org Signed-off-by: Daniel Lezcano Signed-off-by: Greg Kroah-Hartman --- drivers/thermal/mediatek/lvts_thermal.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/thermal/mediatek/lvts_thermal.c b/drivers/thermal/mediatek/lvts_thermal.c index 944c28a0c4736..ae063d1bc95f8 100644 --- a/drivers/thermal/mediatek/lvts_thermal.c +++ b/drivers/thermal/mediatek/lvts_thermal.c @@ -259,8 +259,6 @@ static inline int lvts_debugfs_init(struct device *dev, return 0; } -static void lvts_debugfs_exit(struct lvts_domain *lvts_td) { } - #endif static int lvts_raw_to_temp(u32 raw_temp, int temp_factor) -- GitLab From 23fdf46589db718d538fa3e65ab0d57362d50b4a Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 19 Jun 2025 15:32:38 +0200 Subject: [PATCH 1212/2211] Linux 6.12.34 Link: https://lore.kernel.org/r/20250617152419.512865572@linuxfoundation.org Tested-by: Florian Fainelli Tested-by: Salvatore Bonaccorso Tested-by: Shuah Khan Tested-by: Ron Economos Tested-by: Peter Schneider Tested-by: Jon Hunter Tested-by: Linux Kernel Functional Testing Tested-by: Brett Mastbergen Tested-by: Hardik Garg Tested-by: Markus Reichelt Tested-by: Harshit Mogalapalli Tested-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c53dd3520193a..b58a061cb3595 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 12 -SUBLEVEL = 33 +SUBLEVEL = 34 EXTRAVERSION = NAME = Baby Opossum Posse -- GitLab From bdb71ee65131890a4ec4d803bc1ef38a80676d25 Mon Sep 17 00:00:00 2001 From: Zijun Hu Date: Wed, 7 May 2025 19:50:26 +0800 Subject: [PATCH 1213/2211] configfs: Do not override creating attribute file failure in populate_attrs() commit f830edbae247b89228c3e09294151b21e0dc849c upstream. populate_attrs() may override failure for creating attribute files by success for creating subsequent bin attribute files, and have wrong return value. Fix by creating bin attribute files under successfully creating attribute files. Fixes: 03607ace807b ("configfs: implement binary attributes") Cc: stable@vger.kernel.org Reviewed-by: Joel Becker Reviewed-by: Breno Leitao Signed-off-by: Zijun Hu Link: https://lore.kernel.org/r/20250507-fix_configfs-v3-2-fe2d96de8dc4@quicinc.com Signed-off-by: Andreas Hindborg Signed-off-by: Greg Kroah-Hartman --- fs/configfs/dir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index 43d6bde1adcc0..e5b6a427f31cd 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c @@ -600,7 +600,7 @@ static int populate_attrs(struct config_item *item) break; } } - if (t->ct_bin_attrs) { + if (!error && t->ct_bin_attrs) { for (i = 0; (bin_attr = t->ct_bin_attrs[i]) != NULL; i++) { if (ops && ops->is_bin_visible && !ops->is_bin_visible(item, bin_attr, i)) continue; -- GitLab From ea3c81acb041a41fe61b0c20b24d3760037b5432 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Thu, 8 May 2025 13:22:16 +0800 Subject: [PATCH 1214/2211] crypto: marvell/cesa - Do not chain submitted requests commit 0413bcf0fc460a68a2a7a8354aee833293d7d693 upstream. This driver tries to chain requests together before submitting them to hardware in order to reduce completion interrupts. However, it even extends chains that have already been submitted to hardware. This is dangerous because there is no way of knowing whether the hardware has already read the DMA memory in question or not. Fix this by splitting the chain list into two. One for submitted requests and one for requests that have not yet been submitted. Only extend the latter. Reported-by: Klaus Kudielka Fixes: 85030c5168f1 ("crypto: marvell - Add support for chaining crypto requests in TDMA mode") Cc: Signed-off-by: Herbert Xu Signed-off-by: Greg Kroah-Hartman --- drivers/crypto/marvell/cesa/cesa.c | 2 +- drivers/crypto/marvell/cesa/cesa.h | 9 +++-- drivers/crypto/marvell/cesa/tdma.c | 53 ++++++++++++++++++------------ 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/drivers/crypto/marvell/cesa/cesa.c b/drivers/crypto/marvell/cesa/cesa.c index 5fd31ba715c22..24273cb082ba5 100644 --- a/drivers/crypto/marvell/cesa/cesa.c +++ b/drivers/crypto/marvell/cesa/cesa.c @@ -94,7 +94,7 @@ static int mv_cesa_std_process(struct mv_cesa_engine *engine, u32 status) static int mv_cesa_int_process(struct mv_cesa_engine *engine, u32 status) { - if (engine->chain.first && engine->chain.last) + if (engine->chain_hw.first && engine->chain_hw.last) return mv_cesa_tdma_process(engine, status); return mv_cesa_std_process(engine, status); diff --git a/drivers/crypto/marvell/cesa/cesa.h b/drivers/crypto/marvell/cesa/cesa.h index d215a6bed6bc7..50ca1039fdaa7 100644 --- a/drivers/crypto/marvell/cesa/cesa.h +++ b/drivers/crypto/marvell/cesa/cesa.h @@ -440,8 +440,10 @@ struct mv_cesa_dev { * SRAM * @queue: fifo of the pending crypto requests * @load: engine load counter, useful for load balancing - * @chain: list of the current tdma descriptors being processed - * by this engine. + * @chain_hw: list of the current tdma descriptors being processed + * by the hardware. + * @chain_sw: list of the current tdma descriptors that will be + * submitted to the hardware. * @complete_queue: fifo of the processed requests by the engine * * Structure storing CESA engine information. @@ -463,7 +465,8 @@ struct mv_cesa_engine { struct gen_pool *pool; struct crypto_queue queue; atomic_t load; - struct mv_cesa_tdma_chain chain; + struct mv_cesa_tdma_chain chain_hw; + struct mv_cesa_tdma_chain chain_sw; struct list_head complete_queue; int irq; }; diff --git a/drivers/crypto/marvell/cesa/tdma.c b/drivers/crypto/marvell/cesa/tdma.c index 388a06e180d64..243305354420c 100644 --- a/drivers/crypto/marvell/cesa/tdma.c +++ b/drivers/crypto/marvell/cesa/tdma.c @@ -38,6 +38,15 @@ void mv_cesa_dma_step(struct mv_cesa_req *dreq) { struct mv_cesa_engine *engine = dreq->engine; + spin_lock_bh(&engine->lock); + if (engine->chain_sw.first == dreq->chain.first) { + engine->chain_sw.first = NULL; + engine->chain_sw.last = NULL; + } + engine->chain_hw.first = dreq->chain.first; + engine->chain_hw.last = dreq->chain.last; + spin_unlock_bh(&engine->lock); + writel_relaxed(0, engine->regs + CESA_SA_CFG); mv_cesa_set_int_mask(engine, CESA_SA_INT_ACC0_IDMA_DONE); @@ -96,25 +105,27 @@ void mv_cesa_dma_prepare(struct mv_cesa_req *dreq, void mv_cesa_tdma_chain(struct mv_cesa_engine *engine, struct mv_cesa_req *dreq) { - if (engine->chain.first == NULL && engine->chain.last == NULL) { - engine->chain.first = dreq->chain.first; - engine->chain.last = dreq->chain.last; - } else { - struct mv_cesa_tdma_desc *last; + struct mv_cesa_tdma_desc *last = engine->chain_sw.last; - last = engine->chain.last; + /* + * Break the DMA chain if the request being queued needs the IV + * regs to be set before lauching the request. + */ + if (!last || dreq->chain.first->flags & CESA_TDMA_SET_STATE) + engine->chain_sw.first = dreq->chain.first; + else { last->next = dreq->chain.first; - engine->chain.last = dreq->chain.last; - - /* - * Break the DMA chain if the CESA_TDMA_BREAK_CHAIN is set on - * the last element of the current chain, or if the request - * being queued needs the IV regs to be set before lauching - * the request. - */ - if (!(last->flags & CESA_TDMA_BREAK_CHAIN) && - !(dreq->chain.first->flags & CESA_TDMA_SET_STATE)) - last->next_dma = cpu_to_le32(dreq->chain.first->cur_dma); + last->next_dma = cpu_to_le32(dreq->chain.first->cur_dma); + } + last = dreq->chain.last; + engine->chain_sw.last = last; + /* + * Break the DMA chain if the CESA_TDMA_BREAK_CHAIN is set on + * the last element of the current chain. + */ + if (last->flags & CESA_TDMA_BREAK_CHAIN) { + engine->chain_sw.first = NULL; + engine->chain_sw.last = NULL; } } @@ -127,7 +138,7 @@ int mv_cesa_tdma_process(struct mv_cesa_engine *engine, u32 status) tdma_cur = readl(engine->regs + CESA_TDMA_CUR); - for (tdma = engine->chain.first; tdma; tdma = next) { + for (tdma = engine->chain_hw.first; tdma; tdma = next) { spin_lock_bh(&engine->lock); next = tdma->next; spin_unlock_bh(&engine->lock); @@ -149,12 +160,12 @@ int mv_cesa_tdma_process(struct mv_cesa_engine *engine, u32 status) &backlog); /* Re-chaining to the next request */ - engine->chain.first = tdma->next; + engine->chain_hw.first = tdma->next; tdma->next = NULL; /* If this is the last request, clear the chain */ - if (engine->chain.first == NULL) - engine->chain.last = NULL; + if (engine->chain_hw.first == NULL) + engine->chain_hw.last = NULL; spin_unlock_bh(&engine->lock); ctx = crypto_tfm_ctx(req->tfm); -- GitLab From f2cc87bf3e3a68b86f8370332adfd99d1d2f0bf2 Mon Sep 17 00:00:00 2001 From: Alexander Aring Date: Mon, 31 Mar 2025 19:03:24 -0400 Subject: [PATCH 1215/2211] gfs2: move msleep to sleepable context commit ac5ee087d31ed93b6e45d2968a66828c6f621d8c upstream. This patch moves the msleep_interruptible() out of the non-sleepable context by moving the ls->ls_recover_spin spinlock around so msleep_interruptible() will be called in a sleepable context. Cc: stable@vger.kernel.org Fixes: 4a7727725dc7 ("GFS2: Fix recovery issues for spectators") Suggested-by: Andreas Gruenbacher Signed-off-by: Alexander Aring Signed-off-by: Andreas Gruenbacher Signed-off-by: Greg Kroah-Hartman --- fs/gfs2/lock_dlm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c index fa5134df985f7..9e27dd8bef88d 100644 --- a/fs/gfs2/lock_dlm.c +++ b/fs/gfs2/lock_dlm.c @@ -975,14 +975,15 @@ locks_done: if (sdp->sd_args.ar_spectator) { fs_info(sdp, "Recovery is required. Waiting for a " "non-spectator to mount.\n"); + spin_unlock(&ls->ls_recover_spin); msleep_interruptible(1000); } else { fs_info(sdp, "control_mount wait1 block %u start %u " "mount %u lvb %u flags %lx\n", block_gen, start_gen, mount_gen, lvb_gen, ls->ls_recover_flags); + spin_unlock(&ls->ls_recover_spin); } - spin_unlock(&ls->ls_recover_spin); goto restart; } -- GitLab From 261f2a655b709e59a8d759ce9fa478778d9e84f4 Mon Sep 17 00:00:00 2001 From: Giovanni Cabiddu Date: Wed, 26 Mar 2025 15:59:53 +0000 Subject: [PATCH 1216/2211] crypto: qat - add shutdown handler to qat_c3xxx commit 71e0cc1eab584d6f95526a5e8c69ec666ca33e1b upstream. During a warm reset via kexec, the system bypasses the driver removal sequence, meaning that the remove() callback is not invoked. If a QAT device is not shutdown properly, the device driver will fail to load in a newly rebooted kernel. This might result in output like the following after the kexec reboot: QAT: AE0 is inactive!! QAT: failed to get device out of reset c3xxx 0000:3f:00.0: qat_hal_clr_reset error c3xxx 0000:3f:00.0: Failed to init the AEs c3xxx 0000:3f:00.0: Failed to initialise Acceleration Engine c3xxx 0000:3f:00.0: Resetting device qat_dev0 c3xxx 0000:3f:00.0: probe with driver c3xxx failed with error -14 Implement the shutdown() handler that hooks into the reboot notifier list. This brings down the QAT device and ensures it is shut down properly. Cc: Fixes: 890c55f4dc0e ("crypto: qat - add support for c3xxx accel type") Reviewed-by: Ahsan Atta Reviewed-by: Andy Shevchenko Signed-off-by: Giovanni Cabiddu Signed-off-by: Herbert Xu Signed-off-by: Greg Kroah-Hartman --- drivers/crypto/intel/qat/qat_c3xxx/adf_drv.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/crypto/intel/qat/qat_c3xxx/adf_drv.c b/drivers/crypto/intel/qat/qat_c3xxx/adf_drv.c index 4d18057745d44..b776f7ea0dfb5 100644 --- a/drivers/crypto/intel/qat/qat_c3xxx/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_c3xxx/adf_drv.c @@ -19,6 +19,13 @@ #include #include "adf_c3xxx_hw_data.h" +static void adf_shutdown(struct pci_dev *pdev) +{ + struct adf_accel_dev *accel_dev = adf_devmgr_pci_to_accel_dev(pdev); + + adf_dev_down(accel_dev); +} + static const struct pci_device_id adf_pci_tbl[] = { { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_QAT_C3XXX), }, { } @@ -33,6 +40,7 @@ static struct pci_driver adf_driver = { .name = ADF_C3XXX_DEVICE_NAME, .probe = adf_probe, .remove = adf_remove, + .shutdown = adf_shutdown, .sriov_configure = adf_sriov_configure, .err_handler = &adf_err_handler, }; -- GitLab From 5e4e6d0cae11f9b61119b6d8b3d3197e54713f1a Mon Sep 17 00:00:00 2001 From: Giovanni Cabiddu Date: Wed, 26 Mar 2025 15:59:47 +0000 Subject: [PATCH 1217/2211] crypto: qat - add shutdown handler to qat_420xx commit 097143f23a1164bfd1b6f70279d229be44da2e30 upstream. During a warm reset via kexec, the system bypasses the driver removal sequence, meaning that the remove() callback is not invoked. If a QAT device is not shutdown properly, the device driver will fail to load in a newly rebooted kernel. This might result in output like the following after the kexec reboot: 420xx 0000:01:00.0: Failed to power up the device 420xx 0000:01:00.0: Failed to initialize device 420xx 0000:01:00.0: Resetting device qat_dev0 420xx 0000:01:00.0: probe with driver 420xx failed with error -14 Implement the shutdown() handler that hooks into the reboot notifier list. This brings down the QAT device and ensures it is shut down properly. Cc: Fixes: fcf60f4bcf54 ("crypto: qat - add support for 420xx devices") Reviewed-by: Ahsan Atta Reviewed-by: Andy Shevchenko Signed-off-by: Giovanni Cabiddu Signed-off-by: Herbert Xu Signed-off-by: Greg Kroah-Hartman --- drivers/crypto/intel/qat/qat_420xx/adf_drv.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/crypto/intel/qat/qat_420xx/adf_drv.c b/drivers/crypto/intel/qat/qat_420xx/adf_drv.c index f49818a13013a..41420e349572a 100644 --- a/drivers/crypto/intel/qat/qat_420xx/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_420xx/adf_drv.c @@ -181,11 +181,19 @@ static void adf_remove(struct pci_dev *pdev) adf_cleanup_accel(accel_dev); } +static void adf_shutdown(struct pci_dev *pdev) +{ + struct adf_accel_dev *accel_dev = adf_devmgr_pci_to_accel_dev(pdev); + + adf_dev_down(accel_dev); +} + static struct pci_driver adf_driver = { .id_table = adf_pci_tbl, .name = ADF_420XX_DEVICE_NAME, .probe = adf_probe, .remove = adf_remove, + .shutdown = adf_shutdown, .sriov_configure = adf_sriov_configure, .err_handler = &adf_err_handler, }; -- GitLab From 59fd1b29092ce6f37eeb44d155dbe40823410b49 Mon Sep 17 00:00:00 2001 From: Giovanni Cabiddu Date: Wed, 26 Mar 2025 15:59:46 +0000 Subject: [PATCH 1218/2211] crypto: qat - add shutdown handler to qat_4xxx commit 845bc952024dbf482c7434daeac66f764642d52d upstream. During a warm reset via kexec, the system bypasses the driver removal sequence, meaning that the remove() callback is not invoked. If a QAT device is not shutdown properly, the device driver will fail to load in a newly rebooted kernel. This might result in output like the following after the kexec reboot: 4xxx 0000:01:00.0: Failed to power up the device 4xxx 0000:01:00.0: Failed to initialize device 4xxx 0000:01:00.0: Resetting device qat_dev0 4xxx 0000:01:00.0: probe with driver 4xxx failed with error -14 Implement the shutdown() handler that hooks into the reboot notifier list. This brings down the QAT device and ensures it is shut down properly. Cc: Fixes: 8c8268166e83 ("crypto: qat - add qat_4xxx driver") Link: https://lore.kernel.org/all/Z-DGQrhRj9niR9iZ@gondor.apana.org.au/ Reported-by: Randy Wright Closes: https://issues.redhat.com/browse/RHEL-84366 Reviewed-by: Ahsan Atta Reviewed-by: Andy Shevchenko Signed-off-by: Giovanni Cabiddu Signed-off-by: Herbert Xu Signed-off-by: Greg Kroah-Hartman --- drivers/crypto/intel/qat/qat_4xxx/adf_drv.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/crypto/intel/qat/qat_4xxx/adf_drv.c b/drivers/crypto/intel/qat/qat_4xxx/adf_drv.c index 659905e459503..01b34eda83e91 100644 --- a/drivers/crypto/intel/qat/qat_4xxx/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_4xxx/adf_drv.c @@ -183,11 +183,19 @@ static void adf_remove(struct pci_dev *pdev) adf_cleanup_accel(accel_dev); } +static void adf_shutdown(struct pci_dev *pdev) +{ + struct adf_accel_dev *accel_dev = adf_devmgr_pci_to_accel_dev(pdev); + + adf_dev_down(accel_dev); +} + static struct pci_driver adf_driver = { .id_table = adf_pci_tbl, .name = ADF_4XXX_DEVICE_NAME, .probe = adf_probe, .remove = adf_remove, + .shutdown = adf_shutdown, .sriov_configure = adf_sriov_configure, .err_handler = &adf_err_handler, }; -- GitLab From eb94a34c276dd97aa79642721400ef93c445df7d Mon Sep 17 00:00:00 2001 From: Giovanni Cabiddu Date: Wed, 26 Mar 2025 15:59:51 +0000 Subject: [PATCH 1219/2211] crypto: qat - add shutdown handler to qat_c62x commit a9a6e9279b2998e2610c70b0dfc80a234f97c76c upstream. During a warm reset via kexec, the system bypasses the driver removal sequence, meaning that the remove() callback is not invoked. If a QAT device is not shutdown properly, the device driver will fail to load in a newly rebooted kernel. This might result in output like the following after the kexec reboot: QAT: AE0 is inactive!! QAT: failed to get device out of reset c6xx 0000:3f:00.0: qat_hal_clr_reset error c6xx 0000:3f:00.0: Failed to init the AEs c6xx 0000:3f:00.0: Failed to initialise Acceleration Engine c6xx 0000:3f:00.0: Resetting device qat_dev0 c6xx 0000:3f:00.0: probe with driver c6xx failed with error -14 Implement the shutdown() handler that hooks into the reboot notifier list. This brings down the QAT device and ensures it is shut down properly. Cc: Fixes: a6dabee6c8ba ("crypto: qat - add support for c62x accel type") Reviewed-by: Ahsan Atta Reviewed-by: Andy Shevchenko Signed-off-by: Giovanni Cabiddu Signed-off-by: Herbert Xu Signed-off-by: Greg Kroah-Hartman --- drivers/crypto/intel/qat/qat_c62x/adf_drv.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/crypto/intel/qat/qat_c62x/adf_drv.c b/drivers/crypto/intel/qat/qat_c62x/adf_drv.c index e6b5de55434ec..5310149c311e2 100644 --- a/drivers/crypto/intel/qat/qat_c62x/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_c62x/adf_drv.c @@ -19,6 +19,13 @@ #include #include "adf_c62x_hw_data.h" +static void adf_shutdown(struct pci_dev *pdev) +{ + struct adf_accel_dev *accel_dev = adf_devmgr_pci_to_accel_dev(pdev); + + adf_dev_down(accel_dev); +} + static const struct pci_device_id adf_pci_tbl[] = { { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_QAT_C62X), }, { } @@ -33,6 +40,7 @@ static struct pci_driver adf_driver = { .name = ADF_C62X_DEVICE_NAME, .probe = adf_probe, .remove = adf_remove, + .shutdown = adf_shutdown, .sriov_configure = adf_sriov_configure, .err_handler = &adf_err_handler, }; -- GitLab From d765505bca3cf20e5edd46c06d38912515b01712 Mon Sep 17 00:00:00 2001 From: Giovanni Cabiddu Date: Wed, 26 Mar 2025 15:59:49 +0000 Subject: [PATCH 1220/2211] crypto: qat - add shutdown handler to qat_dh895xcc commit 2c4e8b228733bfbcaf49408fdf94d220f6eb78fc upstream. During a warm reset via kexec, the system bypasses the driver removal sequence, meaning that the remove() callback is not invoked. If a QAT device is not shutdown properly, the device driver will fail to load in a newly rebooted kernel. This might result in output like the following after the kexec reboot: QAT: AE0 is inactive!! QAT: failed to get device out of reset dh895xcc 0000:3f:00.0: qat_hal_clr_reset error dh895xcc 0000:3f:00.0: Failed to init the AEs dh895xcc 0000:3f:00.0: Failed to initialise Acceleration Engine dh895xcc 0000:3f:00.0: Resetting device qat_dev0 dh895xcc 0000:3f:00.0: probe with driver dh895xcc failed with error -14 Implement the shutdown() handler that hooks into the reboot notifier list. This brings down the QAT device and ensures it is shut down properly. Cc: Fixes: 7afa232e76ce ("crypto: qat - Intel(R) QAT DH895xcc accelerator") Reviewed-by: Ahsan Atta Reviewed-by: Andy Shevchenko Signed-off-by: Giovanni Cabiddu Signed-off-by: Herbert Xu Signed-off-by: Greg Kroah-Hartman --- drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c b/drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c index 2a50cce415151..5ddf567ffcad6 100644 --- a/drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c @@ -19,6 +19,13 @@ #include #include "adf_dh895xcc_hw_data.h" +static void adf_shutdown(struct pci_dev *pdev) +{ + struct adf_accel_dev *accel_dev = adf_devmgr_pci_to_accel_dev(pdev); + + adf_dev_down(accel_dev); +} + static const struct pci_device_id adf_pci_tbl[] = { { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_QAT_DH895XCC), }, { } @@ -33,6 +40,7 @@ static struct pci_driver adf_driver = { .name = ADF_DH895XCC_DEVICE_NAME, .probe = adf_probe, .remove = adf_remove, + .shutdown = adf_shutdown, .sriov_configure = adf_sriov_configure, .err_handler = &adf_err_handler, }; -- GitLab From 98640457c02c56a9bd7a7b04cb868611b488f876 Mon Sep 17 00:00:00 2001 From: Wentao Liang Date: Mon, 19 May 2025 15:57:39 +0800 Subject: [PATCH 1221/2211] ASoC: qcom: sdm845: Add error handling in sdm845_slim_snd_hw_params() commit 688abe2860fd9c644705b9e11cb9649eb891b879 upstream. The function sdm845_slim_snd_hw_params() calls the functuion snd_soc_dai_set_channel_map() but does not check its return value. A proper implementation can be found in msm_snd_hw_params(). Add error handling for snd_soc_dai_set_channel_map(). If the function fails and it is not a unsupported error, return the error code immediately. Fixes: 5caf64c633a3 ("ASoC: qcom: sdm845: add support to DB845c and Lenovo Yoga") Cc: stable@vger.kernel.org # v5.6 Signed-off-by: Wentao Liang Reviewed-by: Dmitry Baryshkov Link: https://patch.msgid.link/20250519075739.1458-1-vulab@iscas.ac.cn Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- sound/soc/qcom/sdm845.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sound/soc/qcom/sdm845.c b/sound/soc/qcom/sdm845.c index a479d7e5b7fbd..314ff68506d9f 100644 --- a/sound/soc/qcom/sdm845.c +++ b/sound/soc/qcom/sdm845.c @@ -91,6 +91,10 @@ static int sdm845_slim_snd_hw_params(struct snd_pcm_substream *substream, else ret = snd_soc_dai_set_channel_map(cpu_dai, tx_ch_cnt, tx_ch, 0, NULL); + if (ret != 0 && ret != -ENOTSUPP) { + dev_err(rtd->dev, "failed to set cpu chan map, err:%d\n", ret); + return ret; + } } return 0; -- GitLab From 2864c19ae9e621f59ca69a4e4303df223ed9f417 Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl Date: Sat, 19 Apr 2025 23:34:48 +0200 Subject: [PATCH 1222/2211] ASoC: meson: meson-card-utils: use of_property_present() for DT parsing commit 171eb6f71e9e3ba6a7410a1d93f3ac213f39dae2 upstream. Commit c141ecc3cecd ("of: Warn when of_property_read_bool() is used on non-boolean properties") added a warning when trying to parse a property with a value (boolean properties are defined as: absent = false, present without any value = true). This causes a warning from meson-card-utils. meson-card-utils needs to know about the existence of the "audio-routing" and/or "audio-widgets" properties in order to properly parse them. Switch to of_property_present() in order to silence the following warning messages during boot: OF: /sound: Read of boolean property 'audio-routing' with a value. OF: /sound: Read of boolean property 'audio-widgets' with a value. Fixes: 7864a79f37b5 ("ASoC: meson: add axg sound card support") Tested-by: Christian Hewitt Cc: stable@vger.kernel.org Signed-off-by: Martin Blumenstingl Link: https://patch.msgid.link/20250419213448.59647-1-martin.blumenstingl@googlemail.com Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- sound/soc/meson/meson-card-utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/meson/meson-card-utils.c b/sound/soc/meson/meson-card-utils.c index 1a4ef124e4e25..ad38c74166a46 100644 --- a/sound/soc/meson/meson-card-utils.c +++ b/sound/soc/meson/meson-card-utils.c @@ -231,7 +231,7 @@ static int meson_card_parse_of_optional(struct snd_soc_card *card, const char *p)) { /* If property is not provided, don't fail ... */ - if (!of_property_read_bool(card->dev->of_node, propname)) + if (!of_property_present(card->dev->of_node, propname)) return 0; /* ... but do fail if it is provided and the parsing fails */ -- GitLab From 082b0ca9a79d7d0f3669fc69e22a4af9ff10b07a Mon Sep 17 00:00:00 2001 From: Vijendar Mukunda Date: Tue, 6 May 2025 17:37:23 +0530 Subject: [PATCH 1223/2211] ASoC: amd: sof_amd_sdw: Fix unlikely uninitialized variable use in create_sdw_dailinks() commit 6b83ba4bc3ecb915476d688c9f00f3be57b49a0c upstream. Initialize current_be_id to 0 in SOF based AMD generic SoundWire machine driver to handle the unlikely case when there are no devices connected to a DAI. In this case create_sdw_dailink() would return without touching the passed pointer to current_be_id. Found by gcc -fanalyzer Cc: stable@vger.kernel.org Fixes: 6d8348ddc56ed ("ASoC: amd: acp: refactor SoundWire machine driver code") Signed-off-by: Vijendar Mukunda Link: https://patch.msgid.link/20250506120823.3621604-2-Vijendar.Mukunda@amd.com Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- sound/soc/amd/acp/acp-sdw-sof-mach.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/amd/acp/acp-sdw-sof-mach.c b/sound/soc/amd/acp/acp-sdw-sof-mach.c index 3be401c722704..99a244f495bd3 100644 --- a/sound/soc/amd/acp/acp-sdw-sof-mach.c +++ b/sound/soc/amd/acp/acp-sdw-sof-mach.c @@ -267,7 +267,7 @@ static int create_sdw_dailinks(struct snd_soc_card *card, /* generate DAI links by each sdw link */ while (sof_dais->initialised) { - int current_be_id; + int current_be_id = 0; ret = create_sdw_dailink(card, sof_dais, dai_links, ¤t_be_id, codec_conf); -- GitLab From ba789be63d9567e5ab5a168d49ccdfb6e0a5b72a Mon Sep 17 00:00:00 2001 From: Pavel Begunkov Date: Fri, 9 May 2025 12:12:47 +0100 Subject: [PATCH 1224/2211] io_uring: account drain memory to cgroup commit f979c20547e72568e3c793bc92c7522bc3166246 upstream. Account drain allocations against memcg. It's not a big problem as each such allocation is paired with a request, which is accounted, but it's nicer to follow the limits more closely. Cc: stable@vger.kernel.org # 6.1 Signed-off-by: Pavel Begunkov Link: https://lore.kernel.org/r/f8dfdbd755c41fd9c75d12b858af07dfba5bbb68.1746788718.git.asml.silence@gmail.com Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- io_uring/io_uring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index 64870f51b6788..52ada466bf98f 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -1681,7 +1681,7 @@ queue: spin_unlock(&ctx->completion_lock); io_prep_async_link(req); - de = kmalloc(sizeof(*de), GFP_KERNEL); + de = kmalloc(sizeof(*de), GFP_KERNEL_ACCOUNT); if (!de) { ret = -ENOMEM; io_req_defer_failed(req, ret); -- GitLab From c58b577cf7576e1079d0b358db61832cbeb0dfca Mon Sep 17 00:00:00 2001 From: Pavel Begunkov Date: Tue, 13 May 2025 18:26:46 +0100 Subject: [PATCH 1225/2211] io_uring/kbuf: account ring io_buffer_list memory commit 475a8d30371604a6363da8e304a608a5959afc40 upstream. Follow the non-ringed pbuf struct io_buffer_list allocations and account it against the memcg. There is low chance of that being an actual problem as ring provided buffer should either pin user memory or allocate it, which is already accounted. Cc: stable@vger.kernel.org # 6.1 Signed-off-by: Pavel Begunkov Link: https://lore.kernel.org/r/3985218b50d341273cafff7234e1a7e6d0db9808.1747150490.git.asml.silence@gmail.com Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- io_uring/kbuf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/io_uring/kbuf.c b/io_uring/kbuf.c index 7a8c3a004800e..94602d1f7e6ff 100644 --- a/io_uring/kbuf.c +++ b/io_uring/kbuf.c @@ -728,7 +728,7 @@ int io_register_pbuf_ring(struct io_ring_ctx *ctx, void __user *arg) io_destroy_bl(ctx, bl); } - free_bl = bl = kzalloc(sizeof(*bl), GFP_KERNEL); + free_bl = bl = kzalloc(sizeof(*bl), GFP_KERNEL_ACCOUNT); if (!bl) return -ENOMEM; -- GitLab From 0b42b68cec82253bf392fbe0447f7411676cb14e Mon Sep 17 00:00:00 2001 From: Gautam Menghani Date: Wed, 5 Mar 2025 14:32:36 +0530 Subject: [PATCH 1226/2211] powerpc/pseries/msi: Avoid reading PCI device registers in reduced power states commit 9cc0eafd28c7faef300822992bb08d79cab2a36c upstream. When a system is being suspended to RAM, the PCI devices are also suspended and the PPC code ends up calling pseries_msi_compose_msg() and this triggers the BUG_ON() in __pci_read_msi_msg() because the device at this point is in reduced power state. In reduced power state, the memory mapped registers of the PCI device are not accessible. To replicate the bug: 1. Make sure deep sleep is selected # cat /sys/power/mem_sleep s2idle [deep] 2. Make sure console is not suspended (so that dmesg logs are visible) echo N > /sys/module/printk/parameters/console_suspend 3. Suspend the system echo mem > /sys/power/state To fix this behaviour, read the cached msi message of the device when the device is not in PCI_D0 power state instead of touching the hardware. Fixes: a5f3d2c17b07 ("powerpc/pseries/pci: Add MSI domains") Cc: stable@vger.kernel.org # v5.15+ Signed-off-by: Gautam Menghani Tested-by: Venkat Rao Bagalkote Reviewed-by: Vaibhav Jain Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/20250305090237.294633-1-gautam@linux.ibm.com Signed-off-by: Greg Kroah-Hartman --- arch/powerpc/platforms/pseries/msi.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c index 6dfb55b52d363..ba98a680a12e6 100644 --- a/arch/powerpc/platforms/pseries/msi.c +++ b/arch/powerpc/platforms/pseries/msi.c @@ -524,7 +524,12 @@ static struct msi_domain_info pseries_msi_domain_info = { static void pseries_msi_compose_msg(struct irq_data *data, struct msi_msg *msg) { - __pci_read_msi_msg(irq_data_get_msi_desc(data), msg); + struct pci_dev *dev = msi_desc_to_pci_dev(irq_data_get_msi_desc(data)); + + if (dev->current_state == PCI_D0) + __pci_read_msi_msg(irq_data_get_msi_desc(data), msg); + else + get_cached_msi_msg(data->irq, msg); } static struct irq_chip pseries_msi_irq_chip = { -- GitLab From 94c0731dbf3e83c6146eff26ca1402b202f7bc19 Mon Sep 17 00:00:00 2001 From: Niklas Schnelle Date: Thu, 22 May 2025 14:13:12 +0200 Subject: [PATCH 1227/2211] s390/pci: Remove redundant bus removal and disable from zpci_release_device() commit d76f9633296785343d45f85199f4138cb724b6d2 upstream. Remove zpci_bus_remove_device() and zpci_disable_device() calls from zpci_release_device(). These calls were done when the device transitioned into the ZPCI_FN_STATE_STANDBY state which is guaranteed to happen before it enters the ZPCI_FN_STATE_RESERVED state. When zpci_release_device() is called the device is known to be in the ZPCI_FN_STATE_RESERVED state which is also checked by a WARN_ON(). Cc: stable@vger.kernel.org Fixes: a46044a92add ("s390/pci: fix zpci_zdev_put() on reserve") Reviewed-by: Gerd Bayer Reviewed-by: Julian Ruess Tested-by: Gerd Bayer Signed-off-by: Niklas Schnelle Signed-off-by: Heiko Carstens Signed-off-by: Greg Kroah-Hartman --- arch/s390/pci/pci.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index 88f72745fa59e..89451c19da7c8 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@ -943,12 +943,6 @@ void zpci_release_device(struct kref *kref) WARN_ON(zdev->state != ZPCI_FN_STATE_RESERVED); - if (zdev->zbus->bus) - zpci_bus_remove_device(zdev, false); - - if (zdev_enabled(zdev)) - zpci_disable_device(zdev); - if (zdev->has_hp_slot) zpci_exit_slot(zdev); -- GitLab From f86ca2b55309f8dfef082f66f777009dc72c2898 Mon Sep 17 00:00:00 2001 From: Niklas Schnelle Date: Thu, 22 May 2025 14:13:13 +0200 Subject: [PATCH 1228/2211] s390/pci: Prevent self deletion in disable_slot() commit 47c397844869ad0e6738afb5879c7492f4691122 upstream. As disable_slot() takes a struct zpci_dev from the Configured to the Standby state. In Standby there is still a hotplug slot so this is not usually a case of sysfs self deletion. This is important because self deletion gets very hairy in terms of locking (see for example recover_store() in arch/s390/pci/pci_sysfs.c). Because the pci_dev_put() is not within the critical section of the zdev->state_lock however, disable_slot() can turn into a case of self deletion if zPCI device event handling slips between the mutex_unlock() and the pci_dev_put(). If the latter is the last put and zpci_release_device() is called this then tries to remove the hotplug slot via zpci_exit_slot() which will try to remove the hotplug slot directory the disable_slot() is part of i.e. self deletion. Prevent this by widening the zdev->state_lock critical section to include the pci_dev_put() which is then guaranteed to happen with the struct zpci_dev still in Standby state ensuring it will not lead to a zpci_release_device() call as at least the zPCI event handling code still holds a reference. Cc: stable@vger.kernel.org Fixes: a46044a92add ("s390/pci: fix zpci_zdev_put() on reserve") Reviewed-by: Gerd Bayer Tested-by: Gerd Bayer Signed-off-by: Niklas Schnelle Signed-off-by: Heiko Carstens Signed-off-by: Greg Kroah-Hartman --- drivers/pci/hotplug/s390_pci_hpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pci/hotplug/s390_pci_hpc.c b/drivers/pci/hotplug/s390_pci_hpc.c index e9e9aaa91770a..d9996516f49e6 100644 --- a/drivers/pci/hotplug/s390_pci_hpc.c +++ b/drivers/pci/hotplug/s390_pci_hpc.c @@ -65,9 +65,9 @@ static int disable_slot(struct hotplug_slot *hotplug_slot) rc = zpci_deconfigure_device(zdev); out: - mutex_unlock(&zdev->state_lock); if (pdev) pci_dev_put(pdev); + mutex_unlock(&zdev->state_lock); return rc; } -- GitLab From 31a7dc5a24c06887184191e500f592e47cd1a6d9 Mon Sep 17 00:00:00 2001 From: Niklas Schnelle Date: Thu, 22 May 2025 14:13:14 +0200 Subject: [PATCH 1229/2211] s390/pci: Allow re-add of a reserved but not yet removed device commit 4b1815a52d7eb03b3e0e6742c6728bc16a4b2d1d upstream. The architecture assumes that PCI functions can be removed synchronously as PCI events are processed. This however clashes with the reference counting of struct pci_dev which allows device drivers to hold on to a struct pci_dev reference even as the underlying device is removed. To bridge this gap commit 2a671f77ee49 ("s390/pci: fix use after free of zpci_dev") keeps the struct zpci_dev in ZPCI_FN_STATE_RESERVED state until common code releases the struct pci_dev. Only when all references are dropped, the struct zpci_dev can be removed and freed. Later commit a46044a92add ("s390/pci: fix zpci_zdev_put() on reserve") moved the deletion of the struct zpci_dev from the zpci_list in zpci_release_device() to the point where the device is reserved. This was done to prevent handling events for a device that is already being removed, e.g. when the platform generates both PCI event codes 0x304 and 0x308. In retrospect, deletion from the zpci_list in the release function without holding the zpci_list_lock was also racy. A side effect of this handling is that if the underlying device re-appears while the struct zpci_dev is in the ZPCI_FN_STATE_RESERVED state, the new and old instances of the struct zpci_dev and/or struct pci_dev may clash. For example when trying to create the IOMMU sysfs files for the new instance. In this case, re-adding the new instance is aborted. The old instance is removed, and the device will remain absent until the platform issues another event. Fix this by allowing the struct zpci_dev to be brought back up right until it is finally removed. To this end also keep the struct zpci_dev in the zpci_list until it is finally released when all references have been dropped. Deletion from the zpci_list from within the release function is made safe by using kref_put_lock() with the zpci_list_lock. This ensures that the releasing code holds the last reference. Cc: stable@vger.kernel.org Fixes: a46044a92add ("s390/pci: fix zpci_zdev_put() on reserve") Reviewed-by: Gerd Bayer Tested-by: Gerd Bayer Signed-off-by: Niklas Schnelle Signed-off-by: Heiko Carstens Signed-off-by: Greg Kroah-Hartman --- arch/s390/pci/pci.c | 32 ++++++++++++++++++++++---------- arch/s390/pci/pci_bus.h | 7 ++----- arch/s390/pci/pci_event.c | 22 +++++++++++++++++++++- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index 89451c19da7c8..44a5d05189367 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@ -69,6 +69,13 @@ EXPORT_SYMBOL_GPL(zpci_aipb); struct airq_iv *zpci_aif_sbv; EXPORT_SYMBOL_GPL(zpci_aif_sbv); +void zpci_zdev_put(struct zpci_dev *zdev) +{ + if (!zdev) + return; + kref_put_lock(&zdev->kref, zpci_release_device, &zpci_list_lock); +} + struct zpci_dev *get_zdev_by_fid(u32 fid) { struct zpci_dev *tmp, *zdev = NULL; @@ -919,21 +926,20 @@ int zpci_deconfigure_device(struct zpci_dev *zdev) * @zdev: the zpci_dev that was reserved * * Handle the case that a given zPCI function was reserved by another system. - * After a call to this function the zpci_dev can not be found via - * get_zdev_by_fid() anymore but may still be accessible via existing - * references though it will not be functional anymore. */ void zpci_device_reserved(struct zpci_dev *zdev) { - /* - * Remove device from zpci_list as it is going away. This also - * makes sure we ignore subsequent zPCI events for this device. - */ - spin_lock(&zpci_list_lock); - list_del(&zdev->entry); - spin_unlock(&zpci_list_lock); + lockdep_assert_held(&zdev->state_lock); + /* We may declare the device reserved multiple times */ + if (zdev->state == ZPCI_FN_STATE_RESERVED) + return; zdev->state = ZPCI_FN_STATE_RESERVED; zpci_dbg(3, "rsv fid:%x\n", zdev->fid); + /* + * The underlying device is gone. Allow the zdev to be freed + * as soon as all other references are gone by accounting for + * the removal as a dropped reference. + */ zpci_zdev_put(zdev); } @@ -942,6 +948,12 @@ void zpci_release_device(struct kref *kref) struct zpci_dev *zdev = container_of(kref, struct zpci_dev, kref); WARN_ON(zdev->state != ZPCI_FN_STATE_RESERVED); + /* + * We already hold zpci_list_lock thanks to kref_put_lock(). + * This makes sure no new reference can be taken from the list. + */ + list_del(&zdev->entry); + spin_unlock(&zpci_list_lock); if (zdev->has_hp_slot) zpci_exit_slot(zdev); diff --git a/arch/s390/pci/pci_bus.h b/arch/s390/pci/pci_bus.h index af9f0ac79a1b1..3febb3b297c0c 100644 --- a/arch/s390/pci/pci_bus.h +++ b/arch/s390/pci/pci_bus.h @@ -17,11 +17,8 @@ int zpci_bus_scan_device(struct zpci_dev *zdev); void zpci_bus_remove_device(struct zpci_dev *zdev, bool set_error); void zpci_release_device(struct kref *kref); -static inline void zpci_zdev_put(struct zpci_dev *zdev) -{ - if (zdev) - kref_put(&zdev->kref, zpci_release_device); -} + +void zpci_zdev_put(struct zpci_dev *zdev); static inline void zpci_zdev_get(struct zpci_dev *zdev) { diff --git a/arch/s390/pci/pci_event.c b/arch/s390/pci/pci_event.c index 7f7b732b3f3ef..6f48a1073c6e8 100644 --- a/arch/s390/pci/pci_event.c +++ b/arch/s390/pci/pci_event.c @@ -322,6 +322,22 @@ static void zpci_event_hard_deconfigured(struct zpci_dev *zdev, u32 fh) zdev->state = ZPCI_FN_STATE_STANDBY; } +static void zpci_event_reappear(struct zpci_dev *zdev) +{ + lockdep_assert_held(&zdev->state_lock); + /* + * The zdev is in the reserved state. This means that it was presumed to + * go away but there are still undropped references. Now, the platform + * announced its availability again. Bring back the lingering zdev + * to standby. This is safe because we hold a temporary reference + * now so that it won't go away. Account for the re-appearance of the + * underlying device by incrementing the reference count. + */ + zdev->state = ZPCI_FN_STATE_STANDBY; + zpci_zdev_get(zdev); + zpci_dbg(1, "rea fid:%x, fh:%x\n", zdev->fid, zdev->fh); +} + static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf) { struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid); @@ -345,8 +361,10 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf) break; } } else { + if (zdev->state == ZPCI_FN_STATE_RESERVED) + zpci_event_reappear(zdev); /* the configuration request may be stale */ - if (zdev->state != ZPCI_FN_STATE_STANDBY) + else if (zdev->state != ZPCI_FN_STATE_STANDBY) break; zdev->state = ZPCI_FN_STATE_CONFIGURED; } @@ -362,6 +380,8 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf) break; } } else { + if (zdev->state == ZPCI_FN_STATE_RESERVED) + zpci_event_reappear(zdev); zpci_update_fh(zdev, ccdf->fh); } break; -- GitLab From f2e8a863fdc93abc29929df61ddf7edf5a246acf Mon Sep 17 00:00:00 2001 From: Niklas Schnelle Date: Thu, 22 May 2025 14:13:15 +0200 Subject: [PATCH 1230/2211] s390/pci: Serialize device addition and removal commit 774a1fa880bc949d88b5ddec9494a13be733dfa8 upstream. Prior changes ensured that when zpci_release_device() is called and it removed the zdev from the zpci_list this instance can not be found via the zpci_list anymore even while allowing re-add of reserved devices. This only accounts for the overall lifetime and zpci_list addition and removal, it does not yet prevent concurrent add of a new instance for the same underlying device. Such concurrent add would subsequently cause issues such as attempted re-use of the same IOMMU sysfs directory and is generally undesired. Introduce a new zpci_add_remove_lock mutex to serialize adding a new device with removal. Together this ensures that if a struct zpci_dev is not found in the zpci_list it was either already removed and torn down, or its removal and tear down is in progress with the zpci_add_remove_lock held. Cc: stable@vger.kernel.org Fixes: a46044a92add ("s390/pci: fix zpci_zdev_put() on reserve") Reviewed-by: Gerd Bayer Tested-by: Gerd Bayer Signed-off-by: Niklas Schnelle Signed-off-by: Heiko Carstens Signed-off-by: Greg Kroah-Hartman --- arch/s390/pci/pci.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index 44a5d05189367..9e19d6076d3e8 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@ -44,6 +44,7 @@ /* list of all detected zpci devices */ static LIST_HEAD(zpci_list); static DEFINE_SPINLOCK(zpci_list_lock); +static DEFINE_MUTEX(zpci_add_remove_lock); static DECLARE_BITMAP(zpci_domain, ZPCI_DOMAIN_BITMAP_SIZE); static DEFINE_SPINLOCK(zpci_domain_lock); @@ -73,7 +74,9 @@ void zpci_zdev_put(struct zpci_dev *zdev) { if (!zdev) return; + mutex_lock(&zpci_add_remove_lock); kref_put_lock(&zdev->kref, zpci_release_device, &zpci_list_lock); + mutex_unlock(&zpci_add_remove_lock); } struct zpci_dev *get_zdev_by_fid(u32 fid) @@ -838,6 +841,7 @@ int zpci_add_device(struct zpci_dev *zdev) { int rc; + mutex_lock(&zpci_add_remove_lock); zpci_dbg(1, "add fid:%x, fh:%x, c:%d\n", zdev->fid, zdev->fh, zdev->state); rc = zpci_init_iommu(zdev); if (rc) @@ -851,12 +855,14 @@ int zpci_add_device(struct zpci_dev *zdev) spin_lock(&zpci_list_lock); list_add_tail(&zdev->entry, &zpci_list); spin_unlock(&zpci_list_lock); + mutex_unlock(&zpci_add_remove_lock); return 0; error_destroy_iommu: zpci_destroy_iommu(zdev); error: zpci_dbg(0, "add fid:%x, rc:%d\n", zdev->fid, rc); + mutex_unlock(&zpci_add_remove_lock); return rc; } @@ -947,6 +953,7 @@ void zpci_release_device(struct kref *kref) { struct zpci_dev *zdev = container_of(kref, struct zpci_dev, kref); + lockdep_assert_held(&zpci_add_remove_lock); WARN_ON(zdev->state != ZPCI_FN_STATE_RESERVED); /* * We already hold zpci_list_lock thanks to kref_put_lock(). -- GitLab From 028bb7b658114f9382f0b5d07b355cb3f25c23e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Gon=C3=A7alves?= Date: Sun, 20 Apr 2025 15:28:01 -0300 Subject: [PATCH 1231/2211] regulator: max20086: Fix MAX200086 chip id MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 71406b6d1155d883c80c1b4405939a52f723aa05 upstream. >From MAX20086-MAX20089 datasheet, the id for a MAX20086 is 0x30 and not 0x40. With the current code, the driver will fail on probe when the driver tries to identify the chip id from a MAX20086 device over I2C. Cc: stable@vger.kernel.org Fixes: bfff546aae50 ("regulator: Add MAX20086-MAX20089 driver") Signed-off-by: João Paulo Gonçalves Link: https://patch.msgid.link/20250420-fix-max20086-v1-1-8cc9ee0d5a08@gmail.com Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- drivers/regulator/max20086-regulator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/regulator/max20086-regulator.c b/drivers/regulator/max20086-regulator.c index 3d333b61fb18c..1ab79453aa797 100644 --- a/drivers/regulator/max20086-regulator.c +++ b/drivers/regulator/max20086-regulator.c @@ -29,7 +29,7 @@ #define MAX20086_REG_ADC4 0x09 /* DEVICE IDs */ -#define MAX20086_DEVICE_ID_MAX20086 0x40 +#define MAX20086_DEVICE_ID_MAX20086 0x30 #define MAX20086_DEVICE_ID_MAX20087 0x20 #define MAX20086_DEVICE_ID_MAX20088 0x10 #define MAX20086_DEVICE_ID_MAX20089 0x00 -- GitLab From b96ba2d1fb6c6da37f7ae3d9636226a2b4756bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Gon=C3=A7alves?= Date: Sun, 20 Apr 2025 15:28:02 -0300 Subject: [PATCH 1232/2211] regulator: max20086: Change enable gpio to optional MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit e8ac7336dd62f0443a675ed80b17f0f0e6846e20 upstream. The enable pin can be configured as always enabled by the hardware. Make the enable gpio request optional so the driver doesn't fail to probe when `enable-gpios` property is not present in the device tree. Cc: stable@vger.kernel.org Fixes: bfff546aae50 ("regulator: Add MAX20086-MAX20089 driver") Signed-off-by: João Paulo Gonçalves Link: https://patch.msgid.link/20250420-fix-max20086-v1-2-8cc9ee0d5a08@gmail.com Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- drivers/regulator/max20086-regulator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/regulator/max20086-regulator.c b/drivers/regulator/max20086-regulator.c index 1ab79453aa797..fcdd2d0317a57 100644 --- a/drivers/regulator/max20086-regulator.c +++ b/drivers/regulator/max20086-regulator.c @@ -264,7 +264,7 @@ static int max20086_i2c_probe(struct i2c_client *i2c) * shutdown. */ flags = boot_on ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW; - chip->ena_gpiod = devm_gpiod_get(chip->dev, "enable", flags); + chip->ena_gpiod = devm_gpiod_get_optional(chip->dev, "enable", flags); if (IS_ERR(chip->ena_gpiod)) { ret = PTR_ERR(chip->ena_gpiod); dev_err(chip->dev, "Failed to get enable GPIO: %d\n", ret); -- GitLab From 5297c5cf2620e310ea60c6facf2fe550d6883fa2 Mon Sep 17 00:00:00 2001 From: Wentao Liang Date: Wed, 21 May 2025 21:36:20 +0800 Subject: [PATCH 1233/2211] net/mlx5_core: Add error handling inmlx5_query_nic_vport_qkey_viol_cntr() commit f0b50730bdd8f2734e548de541e845c0d40dceb6 upstream. The function mlx5_query_nic_vport_qkey_viol_cntr() calls the function mlx5_query_nic_vport_context() but does not check its return value. This could lead to undefined behavior if the query fails. A proper implementation can be found in mlx5_nic_vport_query_local_lb(). Add error handling for mlx5_query_nic_vport_context(). If it fails, free the out buffer via kvfree() and return error code. Fixes: 9efa75254593 ("net/mlx5_core: Introduce access functions to query vport RoCE fields") Cc: stable@vger.kernel.org # v4.5 Signed-off-by: Wentao Liang Reviewed-by: Tariq Toukan Link: https://patch.msgid.link/20250521133620.912-1-vulab@iscas.ac.cn Signed-off-by: Paolo Abeni Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/mellanox/mlx5/core/vport.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/vport.c b/drivers/net/ethernet/mellanox/mlx5/core/vport.c index 0d5f750faa455..f5c6ce90acb57 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/vport.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/vport.c @@ -519,19 +519,22 @@ int mlx5_query_nic_vport_qkey_viol_cntr(struct mlx5_core_dev *mdev, { u32 *out; int outlen = MLX5_ST_SZ_BYTES(query_nic_vport_context_out); + int err; out = kvzalloc(outlen, GFP_KERNEL); if (!out) return -ENOMEM; - mlx5_query_nic_vport_context(mdev, 0, out); + err = mlx5_query_nic_vport_context(mdev, 0, out); + if (err) + goto out; *qkey_viol_cntr = MLX5_GET(query_nic_vport_context_out, out, nic_vport_context.qkey_violation_counter); - +out: kvfree(out); - return 0; + return err; } EXPORT_SYMBOL_GPL(mlx5_query_nic_vport_qkey_viol_cntr); -- GitLab From c3afa81f2ef1c8e75044874692d56398c21abb1f Mon Sep 17 00:00:00 2001 From: Wentao Liang Date: Sun, 25 May 2025 00:34:25 +0800 Subject: [PATCH 1234/2211] net/mlx5: Add error handling in mlx5_query_nic_vport_node_guid() commit c6bb8a21cdad8c975a3a646b9e5c8df01ad29783 upstream. The function mlx5_query_nic_vport_node_guid() calls the function mlx5_query_nic_vport_context() but does not check its return value. A proper implementation can be found in mlx5_nic_vport_query_local_lb(). Add error handling for mlx5_query_nic_vport_context(). If it fails, free the out buffer via kvfree() and return error code. Fixes: 9efa75254593 ("net/mlx5_core: Introduce access functions to query vport RoCE fields") Cc: stable@vger.kernel.org # v4.5 Signed-off-by: Wentao Liang Reviewed-by: Tariq Toukan Link: https://patch.msgid.link/20250524163425.1695-1-vulab@iscas.ac.cn Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/mellanox/mlx5/core/vport.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/vport.c b/drivers/net/ethernet/mellanox/mlx5/core/vport.c index f5c6ce90acb57..b04024d0ae676 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/vport.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/vport.c @@ -465,19 +465,22 @@ int mlx5_query_nic_vport_node_guid(struct mlx5_core_dev *mdev, u64 *node_guid) { u32 *out; int outlen = MLX5_ST_SZ_BYTES(query_nic_vport_context_out); + int err; out = kvzalloc(outlen, GFP_KERNEL); if (!out) return -ENOMEM; - mlx5_query_nic_vport_context(mdev, 0, out); + err = mlx5_query_nic_vport_context(mdev, 0, out); + if (err) + goto out; *node_guid = MLX5_GET64(query_nic_vport_context_out, out, nic_vport_context.node_guid); - +out: kvfree(out); - return 0; + return err; } EXPORT_SYMBOL_GPL(mlx5_query_nic_vport_node_guid); -- GitLab From 6d05390d20f110de37d051a3e063ef0a542d01fb Mon Sep 17 00:00:00 2001 From: Christian Lamparter Date: Fri, 16 May 2025 20:41:06 +0200 Subject: [PATCH 1235/2211] wifi: p54: prevent buffer-overflow in p54_rx_eeprom_readback() commit da1b9a55ff116cb040528ef664c70a4eec03ae99 upstream. Robert Morris reported: |If a malicious USB device pretends to be an Intersil p54 wifi |interface and generates an eeprom_readback message with a large |eeprom->v1.len, p54_rx_eeprom_readback() will copy data from the |message beyond the end of priv->eeprom. | |static void p54_rx_eeprom_readback(struct p54_common *priv, | struct sk_buff *skb) |{ | struct p54_hdr *hdr = (struct p54_hdr *) skb->data; | struct p54_eeprom_lm86 *eeprom = (struct p54_eeprom_lm86 *) hdr->data; | | if (priv->fw_var >= 0x509) { | memcpy(priv->eeprom, eeprom->v2.data, | le16_to_cpu(eeprom->v2.len)); | } else { | memcpy(priv->eeprom, eeprom->v1.data, | le16_to_cpu(eeprom->v1.len)); | } | [...] The eeprom->v{1,2}.len is set by the driver in p54_download_eeprom(). The device is supposed to provide the same length back to the driver. But yes, it's possible (like shown in the report) to alter the value to something that causes a crash/panic due to overrun. This patch addresses the issue by adding the size to the common device context, so p54_rx_eeprom_readback no longer relies on possibly tampered values... That said, it also checks if the "firmware" altered the value and no longer copies them. The one, small saving grace is: Before the driver tries to read the eeprom, it needs to upload >a< firmware. the vendor firmware has a proprietary license and as a reason, it is not present on most distributions by default. Cc: Reported-by: Robert Morris Closes: https://lore.kernel.org/linux-wireless/28782.1747258414@localhost/ Fixes: 7cb770729ba8 ("p54: move eeprom code into common library") Signed-off-by: Christian Lamparter Link: https://patch.msgid.link/20250516184107.47794-1-chunkeey@gmail.com Signed-off-by: Johannes Berg Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/intersil/p54/fwio.c | 2 ++ drivers/net/wireless/intersil/p54/p54.h | 1 + drivers/net/wireless/intersil/p54/txrx.c | 13 +++++++++---- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/intersil/p54/fwio.c b/drivers/net/wireless/intersil/p54/fwio.c index 772084a9bd8d7..3baf8ab01e22b 100644 --- a/drivers/net/wireless/intersil/p54/fwio.c +++ b/drivers/net/wireless/intersil/p54/fwio.c @@ -231,6 +231,7 @@ int p54_download_eeprom(struct p54_common *priv, void *buf, mutex_lock(&priv->eeprom_mutex); priv->eeprom = buf; + priv->eeprom_slice_size = len; eeprom_hdr = skb_put(skb, eeprom_hdr_size + len); if (priv->fw_var < 0x509) { @@ -253,6 +254,7 @@ int p54_download_eeprom(struct p54_common *priv, void *buf, ret = -EBUSY; } priv->eeprom = NULL; + priv->eeprom_slice_size = 0; mutex_unlock(&priv->eeprom_mutex); return ret; } diff --git a/drivers/net/wireless/intersil/p54/p54.h b/drivers/net/wireless/intersil/p54/p54.h index 522656de41598..aeb5e40cc5ef3 100644 --- a/drivers/net/wireless/intersil/p54/p54.h +++ b/drivers/net/wireless/intersil/p54/p54.h @@ -258,6 +258,7 @@ struct p54_common { /* eeprom handling */ void *eeprom; + size_t eeprom_slice_size; struct completion eeprom_comp; struct mutex eeprom_mutex; }; diff --git a/drivers/net/wireless/intersil/p54/txrx.c b/drivers/net/wireless/intersil/p54/txrx.c index 8414aa208655f..2deb1bb54f24b 100644 --- a/drivers/net/wireless/intersil/p54/txrx.c +++ b/drivers/net/wireless/intersil/p54/txrx.c @@ -496,14 +496,19 @@ static void p54_rx_eeprom_readback(struct p54_common *priv, return ; if (priv->fw_var >= 0x509) { - memcpy(priv->eeprom, eeprom->v2.data, - le16_to_cpu(eeprom->v2.len)); + if (le16_to_cpu(eeprom->v2.len) != priv->eeprom_slice_size) + return; + + memcpy(priv->eeprom, eeprom->v2.data, priv->eeprom_slice_size); } else { - memcpy(priv->eeprom, eeprom->v1.data, - le16_to_cpu(eeprom->v1.len)); + if (le16_to_cpu(eeprom->v1.len) != priv->eeprom_slice_size) + return; + + memcpy(priv->eeprom, eeprom->v1.data, priv->eeprom_slice_size); } priv->eeprom = NULL; + priv->eeprom_slice_size = 0; tmp = p54_find_and_unlink_skb(priv, hdr->req_id); dev_kfree_skb_any(tmp); complete(&priv->eeprom_comp); -- GitLab From 7a20cdb55c295a8edbffde3ad93e74c606aba4aa Mon Sep 17 00:00:00 2001 From: Michael Lo Date: Fri, 9 May 2025 16:35:12 +0800 Subject: [PATCH 1236/2211] wifi: mt76: mt7925: fix host interrupt register initialization commit ca872e0ad97159375da8f3d05cac1f48239e01d7 upstream. ensure proper interrupt handling and aligns with the hardware spec by updating the register offset for MT_WFDMA0_HOST_INT_ENA. Cc: stable@vger.kernel.org Fixes: c948b5da6bbe ("wifi: mt76: mt7925: add Mediatek Wi-Fi7 driver for mt7925 chips") Signed-off-by: Michael Lo Signed-off-by: Ming Yen Hsieh Link: https://patch.msgid.link/20250509083512.455095-1-mingyen.hsieh@mediatek.com Signed-off-by: Felix Fietkau Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/mediatek/mt76/mt7925/pci.c | 3 --- drivers/net/wireless/mediatek/mt76/mt7925/regs.h | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/pci.c b/drivers/net/wireless/mediatek/mt76/mt7925/pci.c index 9aec675450f26..5e428f19f9722 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/pci.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/pci.c @@ -482,9 +482,6 @@ static int mt7925_pci_suspend(struct device *device) /* disable interrupt */ mt76_wr(dev, dev->irq_map->host_irq_enable, 0); - mt76_wr(dev, MT_WFDMA0_HOST_INT_DIS, - dev->irq_map->tx.all_complete_mask | - MT_INT_RX_DONE_ALL | MT_INT_MCU_CMD); mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0x0); diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/regs.h b/drivers/net/wireless/mediatek/mt76/mt7925/regs.h index 985794a40c1a8..547489092c294 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/regs.h +++ b/drivers/net/wireless/mediatek/mt76/mt7925/regs.h @@ -28,7 +28,7 @@ #define MT_MDP_TO_HIF 0 #define MT_MDP_TO_WM 1 -#define MT_WFDMA0_HOST_INT_ENA MT_WFDMA0(0x228) +#define MT_WFDMA0_HOST_INT_ENA MT_WFDMA0(0x204) #define MT_WFDMA0_HOST_INT_DIS MT_WFDMA0(0x22c) #define HOST_RX_DONE_INT_ENA4 BIT(12) #define HOST_RX_DONE_INT_ENA5 BIT(13) -- GitLab From 314053de3a917144807e95eb779c1c2c61835ffe Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Fri, 21 Mar 2025 15:53:02 +0100 Subject: [PATCH 1237/2211] wifi: ath11k: fix rx completion meta data corruption commit ab52e3e44fe9b666281752e2481d11e25b0e3fdd upstream. Add the missing memory barrier to make sure that the REO dest ring descriptor is read after the head pointer to avoid using stale data on weakly ordered architectures like aarch64. This may fix the ring-buffer corruption worked around by commit f9fff67d2d7c ("wifi: ath11k: Fix SKB corruption in REO destination ring") by silently discarding data, and may possibly also address user reported errors like: ath11k_pci 0006:01:00.0: msdu_done bit in attention is not set Tested-on: WCN6855 hw2.1 WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.41 Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices") Cc: stable@vger.kernel.org # 5.6 Link: https://bugzilla.kernel.org/show_bug.cgi?id=218005 Signed-off-by: Johan Hovold Tested-by: Clayton Craft Link: https://patch.msgid.link/20250321145302.4775-1-johan+linaro@kernel.org Signed-off-by: Jeff Johnson Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/ath/ath11k/dp_rx.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.c b/drivers/net/wireless/ath/ath11k/dp_rx.c index bfb8e7b1a300c..007d869590423 100644 --- a/drivers/net/wireless/ath/ath11k/dp_rx.c +++ b/drivers/net/wireless/ath/ath11k/dp_rx.c @@ -2637,7 +2637,7 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id, struct ath11k *ar; struct hal_reo_dest_ring *desc; enum hal_reo_dest_ring_push_reason push_reason; - u32 cookie; + u32 cookie, info0, rx_msdu_info0, rx_mpdu_info0; int i; for (i = 0; i < MAX_RADIOS; i++) @@ -2650,11 +2650,14 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id, try_again: ath11k_hal_srng_access_begin(ab, srng); + /* Make sure descriptor is read after the head pointer. */ + dma_rmb(); + while (likely(desc = (struct hal_reo_dest_ring *)ath11k_hal_srng_dst_get_next_entry(ab, srng))) { cookie = FIELD_GET(BUFFER_ADDR_INFO1_SW_COOKIE, - desc->buf_addr_info.info1); + READ_ONCE(desc->buf_addr_info.info1)); buf_id = FIELD_GET(DP_RXDMA_BUF_COOKIE_BUF_ID, cookie); mac_id = FIELD_GET(DP_RXDMA_BUF_COOKIE_PDEV_ID, cookie); @@ -2683,8 +2686,9 @@ try_again: num_buffs_reaped[mac_id]++; + info0 = READ_ONCE(desc->info0); push_reason = FIELD_GET(HAL_REO_DEST_RING_INFO0_PUSH_REASON, - desc->info0); + info0); if (unlikely(push_reason != HAL_REO_DEST_RING_PUSH_REASON_ROUTING_INSTRUCTION)) { dev_kfree_skb_any(msdu); @@ -2692,18 +2696,21 @@ try_again: continue; } - rxcb->is_first_msdu = !!(desc->rx_msdu_info.info0 & + rx_msdu_info0 = READ_ONCE(desc->rx_msdu_info.info0); + rx_mpdu_info0 = READ_ONCE(desc->rx_mpdu_info.info0); + + rxcb->is_first_msdu = !!(rx_msdu_info0 & RX_MSDU_DESC_INFO0_FIRST_MSDU_IN_MPDU); - rxcb->is_last_msdu = !!(desc->rx_msdu_info.info0 & + rxcb->is_last_msdu = !!(rx_msdu_info0 & RX_MSDU_DESC_INFO0_LAST_MSDU_IN_MPDU); - rxcb->is_continuation = !!(desc->rx_msdu_info.info0 & + rxcb->is_continuation = !!(rx_msdu_info0 & RX_MSDU_DESC_INFO0_MSDU_CONTINUATION); rxcb->peer_id = FIELD_GET(RX_MPDU_DESC_META_DATA_PEER_ID, - desc->rx_mpdu_info.meta_data); + READ_ONCE(desc->rx_mpdu_info.meta_data)); rxcb->seq_no = FIELD_GET(RX_MPDU_DESC_INFO0_SEQ_NUM, - desc->rx_mpdu_info.info0); + rx_mpdu_info0); rxcb->tid = FIELD_GET(HAL_REO_DEST_RING_INFO0_RX_QUEUE_NUM, - desc->info0); + info0); rxcb->mac_id = mac_id; __skb_queue_tail(&msdu_list[mac_id], msdu); -- GitLab From 09f7616cb5fe3a5407ce224622c5c57fa49b386b Mon Sep 17 00:00:00 2001 From: Bitterblue Smith Date: Sat, 10 May 2025 15:22:24 +0300 Subject: [PATCH 1238/2211] wifi: rtw88: usb: Upload the firmware in bigger chunks commit 80fe0bc1659c0ccc79d082e426fa376be5df9c04 upstream. RTL8811AU stops responding during the firmware download on some systems: [ 809.256440] rtw_8821au 5-2.1:1.0: Firmware version 42.4.0, H2C version 0 [ 812.759142] rtw_8821au 5-2.1:1.0 wlp48s0f4u2u1: renamed from wlan0 [ 837.315388] rtw_8821au 1-4:1.0: write register 0x1ef4 failed with -110 [ 867.524259] rtw_8821au 1-4:1.0: write register 0x1ef8 failed with -110 [ 868.930976] rtw_8821au 5-2.1:1.0 wlp48s0f4u2u1: entered promiscuous mode [ 897.730952] rtw_8821au 1-4:1.0: write register 0x1efc failed with -110 Maybe it takes too long when writing the firmware 4 bytes at a time. Write 196 bytes at a time for RTL8821AU, RTL8811AU, and RTL8812AU, and 254 bytes at a time for RTL8723DU. These are the sizes used in their official drivers. Tested with all these chips. Cc: stable@vger.kernel.org Link: https://github.com/lwfinger/rtw88/issues/344 Signed-off-by: Bitterblue Smith Acked-by: Ping-Ke Shih Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/43f1daad-3ec0-4a3b-a50c-9cd9eb2c2f52@gmail.com Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/realtek/rtw88/hci.h | 8 ++++ drivers/net/wireless/realtek/rtw88/mac.c | 11 +++-- drivers/net/wireless/realtek/rtw88/mac.h | 2 + drivers/net/wireless/realtek/rtw88/pci.c | 2 + drivers/net/wireless/realtek/rtw88/sdio.c | 2 + drivers/net/wireless/realtek/rtw88/usb.c | 55 +++++++++++++++++++++++ 6 files changed, 76 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/hci.h b/drivers/net/wireless/realtek/rtw88/hci.h index 96aeda26014e2..d4bee9c3ecfea 100644 --- a/drivers/net/wireless/realtek/rtw88/hci.h +++ b/drivers/net/wireless/realtek/rtw88/hci.h @@ -19,6 +19,8 @@ struct rtw_hci_ops { void (*link_ps)(struct rtw_dev *rtwdev, bool enter); void (*interface_cfg)(struct rtw_dev *rtwdev); void (*dynamic_rx_agg)(struct rtw_dev *rtwdev, bool enable); + void (*write_firmware_page)(struct rtw_dev *rtwdev, u32 page, + const u8 *data, u32 size); int (*write_data_rsvd_page)(struct rtw_dev *rtwdev, u8 *buf, u32 size); int (*write_data_h2c)(struct rtw_dev *rtwdev, u8 *buf, u32 size); @@ -79,6 +81,12 @@ static inline void rtw_hci_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable) rtwdev->hci.ops->dynamic_rx_agg(rtwdev, enable); } +static inline void rtw_hci_write_firmware_page(struct rtw_dev *rtwdev, u32 page, + const u8 *data, u32 size) +{ + rtwdev->hci.ops->write_firmware_page(rtwdev, page, data, size); +} + static inline int rtw_hci_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size) { diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c index d1c4f5cdcb21d..efb1da198e74c 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.c +++ b/drivers/net/wireless/realtek/rtw88/mac.c @@ -854,8 +854,8 @@ fwdl_ready: } } -static void -write_firmware_page(struct rtw_dev *rtwdev, u32 page, const u8 *data, u32 size) +void rtw_write_firmware_page(struct rtw_dev *rtwdev, u32 page, + const u8 *data, u32 size) { u32 val32; u32 block_nr; @@ -885,6 +885,7 @@ write_firmware_page(struct rtw_dev *rtwdev, u32 page, const u8 *data, u32 size) rtw_write32(rtwdev, write_addr, le32_to_cpu(remain_data)); } } +EXPORT_SYMBOL(rtw_write_firmware_page); static int download_firmware_legacy(struct rtw_dev *rtwdev, const u8 *data, u32 size) @@ -902,11 +903,13 @@ download_firmware_legacy(struct rtw_dev *rtwdev, const u8 *data, u32 size) rtw_write8_set(rtwdev, REG_MCUFW_CTRL, BIT_FWDL_CHK_RPT); for (page = 0; page < total_page; page++) { - write_firmware_page(rtwdev, page, data, DLFW_PAGE_SIZE_LEGACY); + rtw_hci_write_firmware_page(rtwdev, page, data, + DLFW_PAGE_SIZE_LEGACY); data += DLFW_PAGE_SIZE_LEGACY; } if (last_page_size) - write_firmware_page(rtwdev, page, data, last_page_size); + rtw_hci_write_firmware_page(rtwdev, page, data, + last_page_size); if (!check_hw_ready(rtwdev, REG_MCUFW_CTRL, BIT_FWDL_CHK_RPT, 1)) { rtw_err(rtwdev, "failed to check download firmware report\n"); diff --git a/drivers/net/wireless/realtek/rtw88/mac.h b/drivers/net/wireless/realtek/rtw88/mac.h index 58c3dccc14bb5..737c6d5d8da72 100644 --- a/drivers/net/wireless/realtek/rtw88/mac.h +++ b/drivers/net/wireless/realtek/rtw88/mac.h @@ -32,6 +32,8 @@ void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw, u8 primary_ch_idx); int rtw_mac_power_on(struct rtw_dev *rtwdev); void rtw_mac_power_off(struct rtw_dev *rtwdev); +void rtw_write_firmware_page(struct rtw_dev *rtwdev, u32 page, + const u8 *data, u32 size); int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw); int rtw_mac_init(struct rtw_dev *rtwdev); void rtw_mac_flush_queues(struct rtw_dev *rtwdev, u32 queues, bool drop); diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c index 0b9b8807af2cb..fab9bb9257dd9 100644 --- a/drivers/net/wireless/realtek/rtw88/pci.c +++ b/drivers/net/wireless/realtek/rtw88/pci.c @@ -12,6 +12,7 @@ #include "fw.h" #include "ps.h" #include "debug.h" +#include "mac.h" static bool rtw_disable_msi; static bool rtw_pci_disable_aspm; @@ -1602,6 +1603,7 @@ static struct rtw_hci_ops rtw_pci_ops = { .link_ps = rtw_pci_link_ps, .interface_cfg = rtw_pci_interface_cfg, .dynamic_rx_agg = NULL, + .write_firmware_page = rtw_write_firmware_page, .read8 = rtw_pci_read8, .read16 = rtw_pci_read16, diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c index 5b8e88c9759d1..787fa09fd063a 100644 --- a/drivers/net/wireless/realtek/rtw88/sdio.c +++ b/drivers/net/wireless/realtek/rtw88/sdio.c @@ -10,6 +10,7 @@ #include #include #include "main.h" +#include "mac.h" #include "debug.h" #include "fw.h" #include "ps.h" @@ -1155,6 +1156,7 @@ static struct rtw_hci_ops rtw_sdio_ops = { .link_ps = rtw_sdio_link_ps, .interface_cfg = rtw_sdio_interface_cfg, .dynamic_rx_agg = NULL, + .write_firmware_page = rtw_write_firmware_page, .read8 = rtw_sdio_read8, .read16 = rtw_sdio_read16, diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c index 07695294767ac..e0dda272abb51 100644 --- a/drivers/net/wireless/realtek/rtw88/usb.c +++ b/drivers/net/wireless/realtek/rtw88/usb.c @@ -164,6 +164,60 @@ static void rtw_usb_write32(struct rtw_dev *rtwdev, u32 addr, u32 val) rtw_usb_write(rtwdev, addr, val, 4); } +static void rtw_usb_write_firmware_page(struct rtw_dev *rtwdev, u32 page, + const u8 *data, u32 size) +{ + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); + struct usb_device *udev = rtwusb->udev; + u32 addr = FW_START_ADDR_LEGACY; + u8 *data_dup, *buf; + u32 n, block_size; + int ret; + + switch (rtwdev->chip->id) { + case RTW_CHIP_TYPE_8723D: + block_size = 254; + break; + default: + block_size = 196; + break; + } + + data_dup = kmemdup(data, size, GFP_KERNEL); + if (!data_dup) + return; + + buf = data_dup; + + rtw_write32_mask(rtwdev, REG_MCUFW_CTRL, BIT_ROM_PGE, page); + + while (size > 0) { + if (size >= block_size) + n = block_size; + else if (size >= 8) + n = 8; + else + n = 1; + + ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), + RTW_USB_CMD_REQ, RTW_USB_CMD_WRITE, + addr, 0, buf, n, 500); + if (ret != n) { + if (ret != -ENODEV) + rtw_err(rtwdev, + "write 0x%x len %d failed: %d\n", + addr, n, ret); + break; + } + + addr += n; + buf += n; + size -= n; + } + + kfree(data_dup); +} + static int dma_mapping_to_ep(enum rtw_dma_mapping dma_mapping) { switch (dma_mapping) { @@ -815,6 +869,7 @@ static struct rtw_hci_ops rtw_usb_ops = { .link_ps = rtw_usb_link_ps, .interface_cfg = rtw_usb_interface_cfg, .dynamic_rx_agg = rtw_usb_dynamic_rx_agg, + .write_firmware_page = rtw_usb_write_firmware_page, .write8 = rtw_usb_write8, .write16 = rtw_usb_write16, -- GitLab From 763d1789c03f88c9389bc6601398223dcda06cc7 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Fri, 21 Mar 2025 10:49:16 +0100 Subject: [PATCH 1239/2211] wifi: ath11k: fix ring-buffer corruption commit 6d037a372f817e9fcb56482f37917545596bd776 upstream. Users of the Lenovo ThinkPad X13s have reported that Wi-Fi sometimes breaks and the log fills up with errors like: ath11k_pci 0006:01:00.0: HTC Rx: insufficient length, got 1484, expected 1492 ath11k_pci 0006:01:00.0: HTC Rx: insufficient length, got 1460, expected 1484 which based on a quick look at the driver seemed to indicate some kind of ring-buffer corruption. Miaoqing Pan tracked it down to the host seeing the updated destination ring head pointer before the updated descriptor, and the error handling for that in turn leaves the ring buffer in an inconsistent state. Add the missing memory barrier to make sure that the descriptor is read after the head pointer to address the root cause of the corruption while fixing up the error handling in case there are ever any (ordering) bugs on the device side. Note that the READ_ONCE() are only needed to avoid compiler mischief in case the ring-buffer helpers are ever inlined. Tested-on: WCN6855 hw2.1 WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.41 Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices") Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218623 Link: https://lore.kernel.org/20250310010217.3845141-3-quic_miaoqing@quicinc.com Cc: Miaoqing Pan Cc: stable@vger.kernel.org # 5.6 Signed-off-by: Johan Hovold Reviewed-by: Miaoqing Pan Tested-by: Steev Klimaszewski Tested-by: Jens Glathe Tested-by: Clayton Craft Link: https://patch.msgid.link/20250321094916.19098-1-johan+linaro@kernel.org Signed-off-by: Jeff Johnson Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/ath/ath11k/ce.c | 11 +++++------ drivers/net/wireless/ath/ath11k/hal.c | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/ce.c b/drivers/net/wireless/ath/ath11k/ce.c index e66e86bdec20f..9d8efec46508a 100644 --- a/drivers/net/wireless/ath/ath11k/ce.c +++ b/drivers/net/wireless/ath/ath11k/ce.c @@ -393,11 +393,10 @@ static int ath11k_ce_completed_recv_next(struct ath11k_ce_pipe *pipe, goto err; } + /* Make sure descriptor is read after the head pointer. */ + dma_rmb(); + *nbytes = ath11k_hal_ce_dst_status_get_length(desc); - if (*nbytes == 0) { - ret = -EIO; - goto err; - } *skb = pipe->dest_ring->skb[sw_index]; pipe->dest_ring->skb[sw_index] = NULL; @@ -430,8 +429,8 @@ static void ath11k_ce_recv_process_cb(struct ath11k_ce_pipe *pipe) dma_unmap_single(ab->dev, ATH11K_SKB_RXCB(skb)->paddr, max_nbytes, DMA_FROM_DEVICE); - if (unlikely(max_nbytes < nbytes)) { - ath11k_warn(ab, "rxed more than expected (nbytes %d, max %d)", + if (unlikely(max_nbytes < nbytes || nbytes == 0)) { + ath11k_warn(ab, "unexpected rx length (nbytes %d, max %d)", nbytes, max_nbytes); dev_kfree_skb_any(skb); continue; diff --git a/drivers/net/wireless/ath/ath11k/hal.c b/drivers/net/wireless/ath/ath11k/hal.c index f02599bd1c36b..c445bf5cd8321 100644 --- a/drivers/net/wireless/ath/ath11k/hal.c +++ b/drivers/net/wireless/ath/ath11k/hal.c @@ -599,7 +599,7 @@ u32 ath11k_hal_ce_dst_status_get_length(void *buf) struct hal_ce_srng_dst_status_desc *desc = buf; u32 len; - len = FIELD_GET(HAL_CE_DST_STATUS_DESC_FLAGS_LEN, desc->flags); + len = FIELD_GET(HAL_CE_DST_STATUS_DESC_FLAGS_LEN, READ_ONCE(desc->flags)); desc->flags &= ~HAL_CE_DST_STATUS_DESC_FLAGS_LEN; return len; @@ -829,7 +829,7 @@ void ath11k_hal_srng_access_begin(struct ath11k_base *ab, struct hal_srng *srng) srng->u.src_ring.cached_tp = *(volatile u32 *)srng->u.src_ring.tp_addr; } else { - srng->u.dst_ring.cached_hp = *srng->u.dst_ring.hp_addr; + srng->u.dst_ring.cached_hp = READ_ONCE(*srng->u.dst_ring.hp_addr); /* Try to prefetch the next descriptor in the ring */ if (srng->flags & HAL_SRNG_FLAGS_CACHED) -- GitLab From 3f3eb3c3420d40f7e1001a9fa561b37f0afb2e1a Mon Sep 17 00:00:00 2001 From: Maninder Singh Date: Thu, 6 Mar 2025 14:50:06 +0530 Subject: [PATCH 1240/2211] NFSD: unregister filesystem in case genl_register_family() fails commit ff12eb379554eea7932ad6caea55e3091701cce4 upstream. With rpc_status netlink support, unregister of register_filesystem() was missed in case of genl_register_family() fails. Correcting it by making new label. Fixes: bd9d6a3efa97 ("NFSD: add rpc_status netlink support") Cc: stable@vger.kernel.org Signed-off-by: Maninder Singh Reviewed-by: Jeff Layton Signed-off-by: Chuck Lever Signed-off-by: Greg Kroah-Hartman --- fs/nfsd/nfsctl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 2e835e7c107ee..dcd59a4ff9867 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -2345,7 +2345,7 @@ static int __init init_nfsd(void) goto out_free_cld; retval = register_filesystem(&nfsd_fs_type); if (retval) - goto out_free_all; + goto out_free_nfsd4; retval = genl_register_family(&nfsd_nl_family); if (retval) goto out_free_all; @@ -2353,6 +2353,8 @@ static int __init init_nfsd(void) return 0; out_free_all: + unregister_filesystem(&nfsd_fs_type); +out_free_nfsd4: nfsd4_destroy_laundry_wq(); out_free_cld: unregister_cld_notifier(); -- GitLab From 2029ca75cdfa6a25716a5a76b751486cce7e3822 Mon Sep 17 00:00:00 2001 From: Maninder Singh Date: Thu, 6 Mar 2025 14:50:07 +0530 Subject: [PATCH 1241/2211] NFSD: fix race between nfsd registration and exports_proc commit f7fb730cac9aafda8b9813b55d04e28a9664d17c upstream. As of now nfsd calls create_proc_exports_entry() at start of init_nfsd and cleanup by remove_proc_entry() at last of exit_nfsd. Which causes kernel OOPs if there is race between below 2 operations: (i) exportfs -r (ii) mount -t nfsd none /proc/fs/nfsd for 5.4 kernel ARM64: CPU 1: el1_irq+0xbc/0x180 arch_counter_get_cntvct+0x14/0x18 running_clock+0xc/0x18 preempt_count_add+0x88/0x110 prep_new_page+0xb0/0x220 get_page_from_freelist+0x2d8/0x1778 __alloc_pages_nodemask+0x15c/0xef0 __vmalloc_node_range+0x28c/0x478 __vmalloc_node_flags_caller+0x8c/0xb0 kvmalloc_node+0x88/0xe0 nfsd_init_net+0x6c/0x108 [nfsd] ops_init+0x44/0x170 register_pernet_operations+0x114/0x270 register_pernet_subsys+0x34/0x50 init_nfsd+0xa8/0x718 [nfsd] do_one_initcall+0x54/0x2e0 CPU 2 : Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010 PC is at : exports_net_open+0x50/0x68 [nfsd] Call trace: exports_net_open+0x50/0x68 [nfsd] exports_proc_open+0x2c/0x38 [nfsd] proc_reg_open+0xb8/0x198 do_dentry_open+0x1c4/0x418 vfs_open+0x38/0x48 path_openat+0x28c/0xf18 do_filp_open+0x70/0xe8 do_sys_open+0x154/0x248 Sometimes it crashes at exports_net_open() and sometimes cache_seq_next_rcu(). and same is happening on latest 6.14 kernel as well: [ 0.000000] Linux version 6.14.0-rc5-next-20250304-dirty ... [ 285.455918] Unable to handle kernel paging request at virtual address 00001f4800001f48 ... [ 285.464902] pc : cache_seq_next_rcu+0x78/0xa4 ... [ 285.469695] Call trace: [ 285.470083] cache_seq_next_rcu+0x78/0xa4 (P) [ 285.470488] seq_read+0xe0/0x11c [ 285.470675] proc_reg_read+0x9c/0xf0 [ 285.470874] vfs_read+0xc4/0x2fc [ 285.471057] ksys_read+0x6c/0xf4 [ 285.471231] __arm64_sys_read+0x1c/0x28 [ 285.471428] invoke_syscall+0x44/0x100 [ 285.471633] el0_svc_common.constprop.0+0x40/0xe0 [ 285.471870] do_el0_svc_compat+0x1c/0x34 [ 285.472073] el0_svc_compat+0x2c/0x80 [ 285.472265] el0t_32_sync_handler+0x90/0x140 [ 285.472473] el0t_32_sync+0x19c/0x1a0 [ 285.472887] Code: f9400885 93407c23 937d7c27 11000421 (f86378a3) [ 285.473422] ---[ end trace 0000000000000000 ]--- It reproduced simply with below script: while [ 1 ] do /exportfs -r done & while [ 1 ] do insmod /nfsd.ko mount -t nfsd none /proc/fs/nfsd umount /proc/fs/nfsd rmmod nfsd done & So exporting interfaces to user space shall be done at last and cleanup at first place. With change there is no Kernel OOPs. Co-developed-by: Shubham Rana Signed-off-by: Shubham Rana Signed-off-by: Maninder Singh Reviewed-by: Jeff Layton Cc: stable@vger.kernel.org Signed-off-by: Chuck Lever Signed-off-by: Greg Kroah-Hartman --- fs/nfsd/nfsctl.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index dcd59a4ff9867..1ce208ca9a722 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -2331,12 +2331,9 @@ static int __init init_nfsd(void) if (retval) goto out_free_pnfs; nfsd_lockd_init(); /* lockd->nfsd callbacks */ - retval = create_proc_exports_entry(); - if (retval) - goto out_free_lockd; retval = register_pernet_subsys(&nfsd_net_ops); if (retval < 0) - goto out_free_exports; + goto out_free_lockd; retval = register_cld_notifier(); if (retval) goto out_free_subsys; @@ -2347,12 +2344,17 @@ static int __init init_nfsd(void) if (retval) goto out_free_nfsd4; retval = genl_register_family(&nfsd_nl_family); + if (retval) + goto out_free_filesystem; + retval = create_proc_exports_entry(); if (retval) goto out_free_all; nfsd_localio_ops_init(); return 0; out_free_all: + genl_unregister_family(&nfsd_nl_family); +out_free_filesystem: unregister_filesystem(&nfsd_fs_type); out_free_nfsd4: nfsd4_destroy_laundry_wq(); @@ -2360,9 +2362,6 @@ out_free_cld: unregister_cld_notifier(); out_free_subsys: unregister_pernet_subsys(&nfsd_net_ops); -out_free_exports: - remove_proc_entry("fs/nfs/exports", NULL); - remove_proc_entry("fs/nfs", NULL); out_free_lockd: nfsd_lockd_shutdown(); nfsd_drc_slab_free(); @@ -2375,14 +2374,14 @@ out_free_slabs: static void __exit exit_nfsd(void) { + remove_proc_entry("fs/nfs/exports", NULL); + remove_proc_entry("fs/nfs", NULL); genl_unregister_family(&nfsd_nl_family); unregister_filesystem(&nfsd_fs_type); nfsd4_destroy_laundry_wq(); unregister_cld_notifier(); unregister_pernet_subsys(&nfsd_net_ops); nfsd_drc_slab_free(); - remove_proc_entry("fs/nfs/exports", NULL); - remove_proc_entry("fs/nfs", NULL); nfsd_lockd_shutdown(); nfsd4_free_slabs(); nfsd4_exit_pnfs(); -- GitLab From 07862d4f7c357697f5af7d557d8a6707608f419e Mon Sep 17 00:00:00 2001 From: Chuck Lever Date: Wed, 7 May 2025 10:45:15 -0400 Subject: [PATCH 1242/2211] NFSD: Implement FATTR4_CLONE_BLKSIZE attribute commit d6ca7d2643eebe09cf46840bdc7d68b6e07aba77 upstream. RFC 7862 states that if an NFS server implements a CLONE operation, it MUST also implement FATTR4_CLONE_BLKSIZE. NFSD implements CLONE, but does not implement FATTR4_CLONE_BLKSIZE. Note that in Section 12.2, RFC 7862 claims that FATTR4_CLONE_BLKSIZE is RECOMMENDED, not REQUIRED. Likely this is because a minor version is not permitted to add a REQUIRED attribute. Confusing. We assume this attribute reports a block size as a count of bytes, as RFC 7862 does not specify a unit. Reported-by: Roland Mainz Suggested-by: Christoph Hellwig Reviewed-by: Roland Mainz Cc: stable@vger.kernel.org # v6.7+ Reviewed-by: Jeff Layton Signed-off-by: Chuck Lever Signed-off-by: Greg Kroah-Hartman --- fs/nfsd/nfs4xdr.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 2fc1919dd3c09..6edeb3bdf81b5 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -3382,6 +3382,23 @@ static __be32 nfsd4_encode_fattr4_suppattr_exclcreat(struct xdr_stream *xdr, return nfsd4_encode_bitmap4(xdr, supp[0], supp[1], supp[2]); } +/* + * Copied from generic_remap_checks/generic_remap_file_range_prep. + * + * These generic functions use the file system's s_blocksize, but + * individual file systems aren't required to use + * generic_remap_file_range_prep. Until there is a mechanism for + * determining a particular file system's (or file's) clone block + * size, this is the best NFSD can do. + */ +static __be32 nfsd4_encode_fattr4_clone_blksize(struct xdr_stream *xdr, + const struct nfsd4_fattr_args *args) +{ + struct inode *inode = d_inode(args->dentry); + + return nfsd4_encode_uint32_t(xdr, inode->i_sb->s_blocksize); +} + #ifdef CONFIG_NFSD_V4_SECURITY_LABEL static __be32 nfsd4_encode_fattr4_sec_label(struct xdr_stream *xdr, const struct nfsd4_fattr_args *args) @@ -3487,7 +3504,7 @@ static const nfsd4_enc_attr nfsd4_enc_fattr4_encode_ops[] = { [FATTR4_MODE_SET_MASKED] = nfsd4_encode_fattr4__noop, [FATTR4_SUPPATTR_EXCLCREAT] = nfsd4_encode_fattr4_suppattr_exclcreat, [FATTR4_FS_CHARSET_CAP] = nfsd4_encode_fattr4__noop, - [FATTR4_CLONE_BLKSIZE] = nfsd4_encode_fattr4__noop, + [FATTR4_CLONE_BLKSIZE] = nfsd4_encode_fattr4_clone_blksize, [FATTR4_SPACE_FREED] = nfsd4_encode_fattr4__noop, [FATTR4_CHANGE_ATTR_TYPE] = nfsd4_encode_fattr4__noop, -- GitLab From 7a75a956692aa64211a9e95781af1ec461642de4 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Fri, 28 Mar 2025 11:05:59 +1100 Subject: [PATCH 1243/2211] nfsd: nfsd4_spo_must_allow() must check this is a v4 compound request commit 1244f0b2c3cecd3f349a877006e67c9492b41807 upstream. If the request being processed is not a v4 compound request, then examining the cstate can have undefined results. This patch adds a check that the rpc procedure being executed (rq_procinfo) is the NFSPROC4_COMPOUND procedure. Reported-by: Olga Kornievskaia Cc: stable@vger.kernel.org Reviewed-by: Jeff Layton Signed-off-by: NeilBrown Signed-off-by: Chuck Lever Signed-off-by: Greg Kroah-Hartman --- fs/nfsd/nfs4proc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index 7a1fdafa42ea1..02c9f3b312a0e 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c @@ -3658,7 +3658,8 @@ bool nfsd4_spo_must_allow(struct svc_rqst *rqstp) struct nfs4_op_map *allow = &cstate->clp->cl_spo_must_allow; u32 opiter; - if (!cstate->minorversion) + if (rqstp->rq_procinfo != &nfsd_version4.vs_proc[NFSPROC4_COMPOUND] || + cstate->minorversion == 0) return false; if (cstate->spo_must_allowed) -- GitLab From d622c2ee6c08147ab8c9b9e37d93b6e95d3258e0 Mon Sep 17 00:00:00 2001 From: Li Lingfeng Date: Mon, 14 Apr 2025 22:38:52 +0800 Subject: [PATCH 1244/2211] nfsd: Initialize ssc before laundromat_work to prevent NULL dereference commit b31da62889e6d610114d81dc7a6edbcaa503fcf8 upstream. In nfs4_state_start_net(), laundromat_work may access nfsd_ssc through nfs4_laundromat -> nfsd4_ssc_expire_umount. If nfsd_ssc isn't initialized, this can cause NULL pointer dereference. Normally the delayed start of laundromat_work allows sufficient time for nfsd_ssc initialization to complete. However, when the kernel waits too long for userspace responses (e.g. in nfs4_state_start_net -> nfsd4_end_grace -> nfsd4_record_grace_done -> nfsd4_cld_grace_done -> cld_pipe_upcall -> __cld_pipe_upcall -> wait_for_completion path), the delayed work may start before nfsd_ssc initialization finishes. Fix this by moving nfsd_ssc initialization before starting laundromat_work. Fixes: f4e44b393389 ("NFSD: delay unmount source's export after inter-server copy completed.") Cc: stable@vger.kernel.org Reviewed-by: Jeff Layton Signed-off-by: Li Lingfeng Signed-off-by: Chuck Lever Signed-off-by: Greg Kroah-Hartman --- fs/nfsd/nfssvc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 49e2f32102ab5..45f1bb2c6f136 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -406,13 +406,13 @@ static int nfsd_startup_net(struct net *net, const struct cred *cred) if (ret) goto out_filecache; +#ifdef CONFIG_NFSD_V4_2_INTER_SSC + nfsd4_ssc_init_umount_work(nn); +#endif ret = nfs4_state_start_net(net); if (ret) goto out_reply_cache; -#ifdef CONFIG_NFSD_V4_2_INTER_SSC - nfsd4_ssc_init_umount_work(nn); -#endif nn->nfsd_net_up = true; return 0; -- GitLab From c08e00a416a8c4e40d81066287288e0da7a3534d Mon Sep 17 00:00:00 2001 From: Chuck Lever Date: Wed, 21 May 2025 16:34:13 -0400 Subject: [PATCH 1245/2211] SUNRPC: Prevent hang on NFS mount with xprtsec=[m]tls commit 0bd2f6b8996d4f1ca4573652454987826730a04a upstream. Engineers at Hammerspace noticed that sometimes mounting with "xprtsec=tls" hangs for a minute or so, and then times out, even when the NFS server is reachable and responsive. kTLS shuts off data_ready callbacks if strp->msg_ready is set to mitigate data_ready callbacks when a full TLS record is not yet ready to be read from the socket. Normally msg_ready is clear when the first TLS record arrives on a socket. However, I observed that sometimes tls_setsockopt() sets strp->msg_ready, and that prevents forward progress because tls_data_ready() becomes a no-op. Moreover, Jakub says: "If there's a full record queued at the time when [tlshd] passes the socket back to the kernel, it's up to the reader to read the already queued data out." So SunRPC cannot expect a data_ready call when ingress data is already waiting. Add an explicit poll after SunRPC's upper transport is set up to pick up any data that arrived after the TLS handshake but before transport set-up is complete. Reported-by: Steve Sears Suggested-by: Jakub Kacinski Fixes: 75eb6af7acdf ("SUNRPC: Add a TCP-with-TLS RPC transport class") Tested-by: Mike Snitzer Reviewed-by: Mike Snitzer Cc: stable@vger.kernel.org Signed-off-by: Chuck Lever Signed-off-by: Anna Schumaker Signed-off-by: Greg Kroah-Hartman --- net/sunrpc/xprtsock.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 171ad4e2523f1..67d099c7c6625 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -2743,6 +2743,11 @@ static void xs_tcp_tls_setup_socket(struct work_struct *work) } rpc_shutdown_client(lower_clnt); + /* Check for ingress data that arrived before the socket's + * ->data_ready callback was set up. + */ + xs_poll_check_readable(upper_transport); + out_unlock: current_restore_flags(pflags, PF_MEMALLOC); upper_transport->clnt = NULL; -- GitLab From 95c4322c2a7e9e709c734dd6bf27061af73407cf Mon Sep 17 00:00:00 2001 From: Scott Mayhew Date: Wed, 30 Apr 2025 07:12:29 -0400 Subject: [PATCH 1246/2211] NFSv4: Don't check for OPEN feature support in v4.1 commit 4d4832ed13ff505fe0371544b4773e79be2bb964 upstream. fattr4_open_arguments is a v4.2 recommended attribute, so we shouldn't be sending it to v4.1 servers. Fixes: cb78f9b7d0c0 ("nfs: fix the fetch of FATTR4_OPEN_ARGUMENTS") Signed-off-by: Scott Mayhew Reviewed-by: Jeff Layton Reviewed-by: Benjamin Coddington Cc: stable@vger.kernel.org # 6.11+ Signed-off-by: Anna Schumaker Signed-off-by: Greg Kroah-Hartman --- fs/nfs/nfs4proc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 11f2b5cb3b06b..57d49e874f51f 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -3957,8 +3957,9 @@ static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *f FATTR4_WORD0_CASE_INSENSITIVE | FATTR4_WORD0_CASE_PRESERVING; if (minorversion) - bitmask[2] = FATTR4_WORD2_SUPPATTR_EXCLCREAT | - FATTR4_WORD2_OPEN_ARGUMENTS; + bitmask[2] = FATTR4_WORD2_SUPPATTR_EXCLCREAT; + if (minorversion > 1) + bitmask[2] |= FATTR4_WORD2_OPEN_ARGUMENTS; status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0); if (status == 0) { -- GitLab From 5bf0b9eeb0174686f22c2e5b8fb9f47ad25da6f5 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 23 Apr 2025 15:22:50 +0200 Subject: [PATCH 1247/2211] fs/nfs/read: fix double-unlock bug in nfs_return_empty_folio() commit 4c10fa44bc5f700e2ea21de2fbae520ba21f19d9 upstream. Sometimes, when a file was read while it was being truncated by another NFS client, the kernel could deadlock because folio_unlock() was called twice, and the second call would XOR back the `PG_locked` flag. Most of the time (depending on the timing of the truncation), nobody notices the problem because folio_unlock() gets called three times, which flips `PG_locked` back off: 1. vfs_read, nfs_read_folio, ... nfs_read_add_folio, nfs_return_empty_folio 2. vfs_read, nfs_read_folio, ... netfs_read_collection, netfs_unlock_abandoned_read_pages 3. vfs_read, ... nfs_do_read_folio, nfs_read_add_folio, nfs_return_empty_folio The problem is that nfs_read_add_folio() is not supposed to unlock the folio if fscache is enabled, and a nfs_netfs_folio_unlock() check is missing in nfs_return_empty_folio(). Rarely this leads to a warning in netfs_read_collection(): ------------[ cut here ]------------ R=0000031c: folio 10 is not locked WARNING: CPU: 0 PID: 29 at fs/netfs/read_collect.c:133 netfs_read_collection+0x7c0/0xf00 [...] Workqueue: events_unbound netfs_read_collection_worker RIP: 0010:netfs_read_collection+0x7c0/0xf00 [...] Call Trace: netfs_read_collection_worker+0x67/0x80 process_one_work+0x12e/0x2c0 worker_thread+0x295/0x3a0 Most of the time, however, processes just get stuck forever in folio_wait_bit_common(), waiting for `PG_locked` to disappear, which never happens because nobody is really holding the folio lock. Fixes: 000dbe0bec05 ("NFS: Convert buffered read paths to use netfs when fscache is enabled") Cc: stable@vger.kernel.org Signed-off-by: Max Kellermann Reviewed-by: Dave Wysochanski Signed-off-by: Anna Schumaker Signed-off-by: Greg Kroah-Hartman --- fs/nfs/read.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 81bd1b9aba176..3c1fa320b3f1b 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c @@ -56,7 +56,8 @@ static int nfs_return_empty_folio(struct folio *folio) { folio_zero_segment(folio, 0, folio_size(folio)); folio_mark_uptodate(folio); - folio_unlock(folio); + if (nfs_netfs_folio_unlock(folio)) + folio_unlock(folio); return 0; } -- GitLab From d35e6c3616b6fc6dcc06c71eaa88ffd6ced408b4 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Fri, 21 Mar 2025 10:52:19 +0100 Subject: [PATCH 1248/2211] wifi: ath12k: fix ring-buffer corruption commit 6b67d2cf14ea997061f61e9c8afd4e1c0f22acb9 upstream. Users of the Lenovo ThinkPad X13s have reported that Wi-Fi sometimes breaks and the log fills up with errors like: ath11k_pci 0006:01:00.0: HTC Rx: insufficient length, got 1484, expected 1492 ath11k_pci 0006:01:00.0: HTC Rx: insufficient length, got 1460, expected 1484 which based on a quick look at the ath11k driver seemed to indicate some kind of ring-buffer corruption. Miaoqing Pan tracked it down to the host seeing the updated destination ring head pointer before the updated descriptor, and the error handling for that in turn leaves the ring buffer in an inconsistent state. While this has not yet been observed with ath12k, the ring-buffer implementation is very similar to the ath11k one and it suffers from the same bugs. Add the missing memory barrier to make sure that the descriptor is read after the head pointer to address the root cause of the corruption while fixing up the error handling in case there are ever any (ordering) bugs on the device side. Note that the READ_ONCE() are only needed to avoid compiler mischief in case the ring-buffer helpers are ever inlined. Tested-on: WCN7850 hw2.0 WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices") Cc: stable@vger.kernel.org # 6.3 Link: https://bugzilla.kernel.org/show_bug.cgi?id=218623 Link: https://lore.kernel.org/20250310010217.3845141-3-quic_miaoqing@quicinc.com Cc: Miaoqing Pan Signed-off-by: Johan Hovold Reviewed-by: Miaoqing Pan Link: https://patch.msgid.link/20250321095219.19369-1-johan+linaro@kernel.org Signed-off-by: Jeff Johnson Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/ath/ath12k/ce.c | 11 +++++------ drivers/net/wireless/ath/ath12k/hal.c | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/ce.c b/drivers/net/wireless/ath/ath12k/ce.c index be0d669d31fcc..740586fe49d1f 100644 --- a/drivers/net/wireless/ath/ath12k/ce.c +++ b/drivers/net/wireless/ath/ath12k/ce.c @@ -343,11 +343,10 @@ static int ath12k_ce_completed_recv_next(struct ath12k_ce_pipe *pipe, goto err; } + /* Make sure descriptor is read after the head pointer. */ + dma_rmb(); + *nbytes = ath12k_hal_ce_dst_status_get_length(desc); - if (*nbytes == 0) { - ret = -EIO; - goto err; - } *skb = pipe->dest_ring->skb[sw_index]; pipe->dest_ring->skb[sw_index] = NULL; @@ -380,8 +379,8 @@ static void ath12k_ce_recv_process_cb(struct ath12k_ce_pipe *pipe) dma_unmap_single(ab->dev, ATH12K_SKB_RXCB(skb)->paddr, max_nbytes, DMA_FROM_DEVICE); - if (unlikely(max_nbytes < nbytes)) { - ath12k_warn(ab, "rxed more than expected (nbytes %d, max %d)", + if (unlikely(max_nbytes < nbytes || nbytes == 0)) { + ath12k_warn(ab, "unexpected rx length (nbytes %d, max %d)", nbytes, max_nbytes); dev_kfree_skb_any(skb); continue; diff --git a/drivers/net/wireless/ath/ath12k/hal.c b/drivers/net/wireless/ath/ath12k/hal.c index bfa404997710e..ae386c6490594 100644 --- a/drivers/net/wireless/ath/ath12k/hal.c +++ b/drivers/net/wireless/ath/ath12k/hal.c @@ -1943,7 +1943,7 @@ u32 ath12k_hal_ce_dst_status_get_length(struct hal_ce_srng_dst_status_desc *desc { u32 len; - len = le32_get_bits(desc->flags, HAL_CE_DST_STATUS_DESC_FLAGS_LEN); + len = le32_get_bits(READ_ONCE(desc->flags), HAL_CE_DST_STATUS_DESC_FLAGS_LEN); desc->flags &= ~cpu_to_le32(HAL_CE_DST_STATUS_DESC_FLAGS_LEN); return len; @@ -2113,7 +2113,7 @@ void ath12k_hal_srng_access_begin(struct ath12k_base *ab, struct hal_srng *srng) srng->u.src_ring.cached_tp = *(volatile u32 *)srng->u.src_ring.tp_addr; else - srng->u.dst_ring.cached_hp = *srng->u.dst_ring.hp_addr; + srng->u.dst_ring.cached_hp = READ_ONCE(*srng->u.dst_ring.hp_addr); } /* Update cached ring head/tail pointers to HW. ath12k_hal_srng_access_begin() -- GitLab From f78b38af3540b4875147b7b884ee11a27b3dbf4c Mon Sep 17 00:00:00 2001 From: Jeongjun Park Date: Wed, 14 May 2025 22:08:55 +0900 Subject: [PATCH 1249/2211] jbd2: fix data-race and null-ptr-deref in jbd2_journal_dirty_metadata() commit af98b0157adf6504fade79b3e6cb260c4ff68e37 upstream. Since handle->h_transaction may be a NULL pointer, so we should change it to call is_handle_aborted(handle) first before dereferencing it. And the following data-race was reported in my fuzzer: ================================================================== BUG: KCSAN: data-race in jbd2_journal_dirty_metadata / jbd2_journal_dirty_metadata write to 0xffff888011024104 of 4 bytes by task 10881 on cpu 1: jbd2_journal_dirty_metadata+0x2a5/0x770 fs/jbd2/transaction.c:1556 __ext4_handle_dirty_metadata+0xe7/0x4b0 fs/ext4/ext4_jbd2.c:358 ext4_do_update_inode fs/ext4/inode.c:5220 [inline] ext4_mark_iloc_dirty+0x32c/0xd50 fs/ext4/inode.c:5869 __ext4_mark_inode_dirty+0xe1/0x450 fs/ext4/inode.c:6074 ext4_dirty_inode+0x98/0xc0 fs/ext4/inode.c:6103 .... read to 0xffff888011024104 of 4 bytes by task 10880 on cpu 0: jbd2_journal_dirty_metadata+0xf2/0x770 fs/jbd2/transaction.c:1512 __ext4_handle_dirty_metadata+0xe7/0x4b0 fs/ext4/ext4_jbd2.c:358 ext4_do_update_inode fs/ext4/inode.c:5220 [inline] ext4_mark_iloc_dirty+0x32c/0xd50 fs/ext4/inode.c:5869 __ext4_mark_inode_dirty+0xe1/0x450 fs/ext4/inode.c:6074 ext4_dirty_inode+0x98/0xc0 fs/ext4/inode.c:6103 .... value changed: 0x00000000 -> 0x00000001 ================================================================== This issue is caused by missing data-race annotation for jh->b_modified. Therefore, the missing annotation needs to be added. Reported-by: syzbot+de24c3fe3c4091051710@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=de24c3fe3c4091051710 Fixes: 6e06ae88edae ("jbd2: speedup jbd2_journal_dirty_metadata()") Signed-off-by: Jeongjun Park Reviewed-by: Jan Kara Link: https://patch.msgid.link/20250514130855.99010-1-aha310510@gmail.com Signed-off-by: Theodore Ts'o Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman --- fs/jbd2/transaction.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index 66513c18ca294..f440110df93a9 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c @@ -1513,7 +1513,7 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) jh->b_next_transaction == transaction); spin_unlock(&jh->b_state_lock); } - if (jh->b_modified == 1) { + if (data_race(jh->b_modified == 1)) { /* If it's in our transaction it must be in BJ_Metadata list. */ if (data_race(jh->b_transaction == transaction && jh->b_jlist != BJ_Metadata)) { @@ -1532,7 +1532,6 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) goto out; } - journal = transaction->t_journal; spin_lock(&jh->b_state_lock); if (is_handle_aborted(handle)) { @@ -1547,6 +1546,8 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) goto out_unlock_bh; } + journal = transaction->t_journal; + if (jh->b_modified == 0) { /* * This buffer's got modified and becoming part -- GitLab From cb3cba0ec372fa7c5f5f5c12990bef02e458ab86 Mon Sep 17 00:00:00 2001 From: Chuck Lever Date: Sun, 27 Apr 2025 12:39:59 -0400 Subject: [PATCH 1250/2211] svcrdma: Unregister the device if svc_rdma_accept() fails commit 8ac6fcae5dc0e801f1c82a83f5ae2c0a4db19932 upstream. To handle device removal, svc_rdma_accept() requests removal notification for the underlying device when accepting a connection. However svc_rdma_free() is not invoked if svc_rdma_accept() fails. There needs to be a matching "unregister" in that case; otherwise the device cannot be removed. Fixes: c4de97f7c454 ("svcrdma: Handle device removal outside of the CM event handler") Cc: stable@vger.kernel.org Reviewed-by: Zhu Yanjun Signed-off-by: Chuck Lever Signed-off-by: Greg Kroah-Hartman --- net/sunrpc/xprtrdma/svc_rdma_transport.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index ca6172822b68a..3d7f1413df023 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c @@ -577,6 +577,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) if (newxprt->sc_qp && !IS_ERR(newxprt->sc_qp)) ib_destroy_qp(newxprt->sc_qp); rdma_destroy_id(newxprt->sc_cm_id); + rpcrdma_rn_unregister(dev, &newxprt->sc_rn); /* This call to put will destroy the transport */ svc_xprt_put(&newxprt->sc_xprt); return NULL; -- GitLab From b88447ce11eb5db9df3561814a3c5b229d2b862a Mon Sep 17 00:00:00 2001 From: Bitterblue Smith Date: Sat, 10 May 2025 15:21:25 +0300 Subject: [PATCH 1251/2211] wifi: rtw88: usb: Reduce control message timeout to 500 ms commit 490340faddea461319652ce36dbc7c1b4482c35e upstream. RTL8811AU stops responding during the firmware download on some systems: [ 809.256440] rtw_8821au 5-2.1:1.0: Firmware version 42.4.0, H2C version 0 [ 812.759142] rtw_8821au 5-2.1:1.0 wlp48s0f4u2u1: renamed from wlan0 [ 837.315388] rtw_8821au 1-4:1.0: write register 0x1ef4 failed with -110 [ 867.524259] rtw_8821au 1-4:1.0: write register 0x1ef8 failed with -110 [ 868.930976] rtw_8821au 5-2.1:1.0 wlp48s0f4u2u1: entered promiscuous mode [ 897.730952] rtw_8821au 1-4:1.0: write register 0x1efc failed with -110 Each write takes 30 seconds to fail because that's the timeout currently used for control messages in rtw_usb_write(). In this scenario the firmware download takes at least 2000 seconds. Because this is done from the USB probe function, the long delay makes other things in the system hang. Reduce the timeout to 500 ms. This is the value used by the official USB wifi drivers from Realtek. Of course this only makes things hang for ~30 seconds instead of ~30 minutes. It doesn't fix the firmware download. Tested with RTL8822CU, RTL8812BU, RTL8811CU, RTL8814AU, RTL8811AU, RTL8812AU, RTL8821AU, RTL8723DU. Cc: stable@vger.kernel.org Fixes: a82dfd33d123 ("wifi: rtw88: Add common USB chip support") Link: https://github.com/lwfinger/rtw88/issues/344 Signed-off-by: Bitterblue Smith Acked-by: Ping-Ke Shih Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/1e35dd26-3f10-40b1-b2b4-f72184a26611@gmail.com Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/realtek/rtw88/usb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c index e0dda272abb51..a446be45f26e7 100644 --- a/drivers/net/wireless/realtek/rtw88/usb.c +++ b/drivers/net/wireless/realtek/rtw88/usb.c @@ -138,7 +138,7 @@ static void rtw_usb_write(struct rtw_dev *rtwdev, u32 addr, u32 val, int len) ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTW_USB_CMD_REQ, RTW_USB_CMD_WRITE, - addr, 0, data, len, 30000); + addr, 0, data, len, 500); if (ret < 0 && ret != -ENODEV && count++ < 4) rtw_err(rtwdev, "write register 0x%x failed with %d\n", addr, ret); -- GitLab From ac93035040672869ded128fbbadd7e35b6cb2d2d Mon Sep 17 00:00:00 2001 From: Mingcong Bai Date: Tue, 22 Apr 2025 14:17:54 +0800 Subject: [PATCH 1252/2211] wifi: rtlwifi: disable ASPM for RTL8723BE with subsystem ID 11ad:1723 commit 77a6407c6ab240527166fb19ee96e95f5be4d3cd upstream. RTL8723BE found on some ASUSTek laptops, such as F441U and X555UQ with subsystem ID 11ad:1723 are known to output large amounts of PCIe AER errors during and after boot up, causing heavy lags and at times lock-ups: pcieport 0000:00:1c.5: AER: Correctable error message received from 0000:00:1c.5 pcieport 0000:00:1c.5: PCIe Bus Error: severity=Correctable, type=Physical Layer, (Receiver ID) pcieport 0000:00:1c.5: device [8086:9d15] error status/mask=00000001/00002000 pcieport 0000:00:1c.5: [ 0] RxErr Disable ASPM on this combo as a quirk. This patch is a revision of a previous patch (linked below) which attempted to disable ASPM for RTL8723BE on all Intel Skylake and Kaby Lake PCIe bridges. I take a more conservative approach as all known reports point to ASUSTek laptops of these two generations with this particular wireless card. Please note, however, before the rtl8723be finishes probing, the AER errors remained. After the module finishes probing, all AER errors would indeed be eliminated, along with heavy lags, poor network throughput, and/or occasional lock-ups. Cc: Fixes: a619d1abe20c ("rtlwifi: rtl8723be: Add new driver") Reported-by: Liangliang Zou Link: https://bugzilla.kernel.org/show_bug.cgi?id=218127 Link: https://lore.kernel.org/lkml/05390e0b-27fd-4190-971e-e70a498c8221@lwfinger.net/T/ Tested-by: Liangliang Zou Signed-off-by: Mingcong Bai Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250422061755.356535-1-jeffbai@aosc.io Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/realtek/rtlwifi/pci.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.c b/drivers/net/wireless/realtek/rtlwifi/pci.c index 0eafc4d125f91..898f597f70a96 100644 --- a/drivers/net/wireless/realtek/rtlwifi/pci.c +++ b/drivers/net/wireless/realtek/rtlwifi/pci.c @@ -155,6 +155,16 @@ static void _rtl_pci_update_default_setting(struct ieee80211_hw *hw) ((u8)init_aspm) == (PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1 | PCI_EXP_LNKCTL_CCC)) ppsc->support_aspm = false; + + /* RTL8723BE found on some ASUSTek laptops, such as F441U and + * X555UQ with subsystem ID 11ad:1723 are known to output large + * amounts of PCIe AER errors during and after boot up, causing + * heavy lags, poor network throughput, and occasional lock-ups. + */ + if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8723BE && + (rtlpci->pdev->subsystem_vendor == 0x11ad && + rtlpci->pdev->subsystem_device == 0x1723)) + ppsc->support_aspm = false; } static bool _rtl_pci_platform_switch_device_pci_aspm( -- GitLab From ceb901f7957185e7caf2dbc2416304b3301398c6 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Fri, 25 Apr 2025 14:52:38 +0200 Subject: [PATCH 1253/2211] media: ov8856: suppress probe deferral errors commit e3d86847fba58cf71f66e81b6a2515e07039ae17 upstream. Probe deferral should not be logged as an error: ov8856 24-0010: failed to get HW configuration: -517 Use dev_err_probe() for the clock lookup and drop the (mostly) redundant dev_err() from sensor probe() to suppress it. Note that errors during regulator lookup is already correctly logged using dev_err_probe(). Fixes: 0c2c7a1e0d69 ("media: ov8856: Add devicetree support") Cc: stable@vger.kernel.org Signed-off-by: Johan Hovold Signed-off-by: Sakari Ailus Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/i2c/ov8856.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/drivers/media/i2c/ov8856.c b/drivers/media/i2c/ov8856.c index 3b94338f55ed3..23d524de7d60a 100644 --- a/drivers/media/i2c/ov8856.c +++ b/drivers/media/i2c/ov8856.c @@ -2276,8 +2276,8 @@ static int ov8856_get_hwcfg(struct ov8856 *ov8856, struct device *dev) if (!is_acpi_node(fwnode)) { ov8856->xvclk = devm_clk_get(dev, "xvclk"); if (IS_ERR(ov8856->xvclk)) { - dev_err(dev, "could not get xvclk clock (%pe)\n", - ov8856->xvclk); + dev_err_probe(dev, PTR_ERR(ov8856->xvclk), + "could not get xvclk clock\n"); return PTR_ERR(ov8856->xvclk); } @@ -2382,11 +2382,8 @@ static int ov8856_probe(struct i2c_client *client) return -ENOMEM; ret = ov8856_get_hwcfg(ov8856, &client->dev); - if (ret) { - dev_err(&client->dev, "failed to get HW configuration: %d", - ret); + if (ret) return ret; - } v4l2_i2c_subdev_init(&ov8856->sd, client, &ov8856_subdev_ops); -- GitLab From 2f4c2c6bde6e673c374e5d230857e0d793be7c2b Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Fri, 25 Apr 2025 14:52:37 +0200 Subject: [PATCH 1254/2211] media: ov5675: suppress probe deferral errors commit 8268da3c474a43a79a6540fb06c5d3b730a0d5a5 upstream. Probe deferral should not be logged as an error: ov5675 24-0010: failed to get HW configuration: -517 Drop the (mostly) redundant dev_err() from sensor probe() to suppress it. Note that errors during clock and regulator lookup are already correctly logged using dev_err_probe(). Fixes: 49d9ad719e89 ("media: ov5675: add device-tree support and support runtime PM") Cc: stable@vger.kernel.org Signed-off-by: Johan Hovold Signed-off-by: Sakari Ailus Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/i2c/ov5675.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/media/i2c/ov5675.c b/drivers/media/i2c/ov5675.c index 2833b14ee139d..c0ab3c0ed88e3 100644 --- a/drivers/media/i2c/ov5675.c +++ b/drivers/media/i2c/ov5675.c @@ -1295,11 +1295,8 @@ static int ov5675_probe(struct i2c_client *client) return -ENOMEM; ret = ov5675_get_hwcfg(ov5675, &client->dev); - if (ret) { - dev_err(&client->dev, "failed to get HW configuration: %d", - ret); + if (ret) return ret; - } v4l2_i2c_subdev_init(&ov5675->sd, client, &ov5675_subdev_ops); -- GitLab From b93864e0865f235a791e69dc9ef4f896e559ef77 Mon Sep 17 00:00:00 2001 From: Umang Jain Date: Tue, 22 Apr 2025 13:20:52 +0100 Subject: [PATCH 1255/2211] media: imx335: Use correct register width for HNUM commit b122c9cfcb39c8ef520d50eddfbe15f3e6551a50 upstream. CCI_REG_HNUM should be using CCI_REG16_LE() instead of CCI_REG8() as HNUM spans from 0x302e[0:7] to 0x302f[0:3]. Signed-off-by: Umang Jain Signed-off-by: Kieran Bingham Fixes: 8f0926dba799 ("media: imx335: Use V4L2 CCI for accessing sensor registers") Cc: stable@vger.kernel.org Signed-off-by: Sakari Ailus Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/i2c/imx335.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c index 0beb80b8c4581..d400a019f6b3f 100644 --- a/drivers/media/i2c/imx335.c +++ b/drivers/media/i2c/imx335.c @@ -31,7 +31,7 @@ #define IMX335_REG_CPWAIT_TIME CCI_REG8(0x300d) #define IMX335_REG_WINMODE CCI_REG8(0x3018) #define IMX335_REG_HTRIMMING_START CCI_REG16_LE(0x302c) -#define IMX335_REG_HNUM CCI_REG8(0x302e) +#define IMX335_REG_HNUM CCI_REG16_LE(0x302e) /* Lines per frame */ #define IMX335_REG_VMAX CCI_REG24_LE(0x3030) -- GitLab From fb50ee19aa69f3dc332928ca1d408a9a25762d8a Mon Sep 17 00:00:00 2001 From: Laurentiu Palcu Date: Wed, 23 Oct 2024 11:56:43 +0300 Subject: [PATCH 1256/2211] media: nxp: imx8-isi: better handle the m2m usage_count commit 910efa649076be9c2e1326059830327cf4228cf6 upstream. Currently, if streamon/streamoff calls are imbalanced we can either end up with a negative ISI m2m usage_count (if streamoff() is called more times than streamon()) in which case we'll not be able to restart the ISI pipe next time, or the usage_count never gets to 0 and the pipe is never switched off. To avoid that, add a 'streaming' flag to mxc_isi_m2m_ctx_queue_data and use it in the streamon/streamoff to avoid incrementing/decrementing the usage_count uselessly, if called multiple times from the same context. Fixes: cf21f328fcafac ("media: nxp: Add i.MX8 ISI driver") Cc: stable@vger.kernel.org Suggested-by: Laurent Pinchart Signed-off-by: Laurentiu Palcu Reviewed-by: Laurent Pinchart Link: https://lore.kernel.org/r/20241023085643.978729-1-laurentiu.palcu@oss.nxp.com Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Greg Kroah-Hartman --- drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c b/drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c index 9745d6219a166..cd6c52e9d158a 100644 --- a/drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c +++ b/drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c @@ -43,6 +43,7 @@ struct mxc_isi_m2m_ctx_queue_data { struct v4l2_pix_format_mplane format; const struct mxc_isi_format_info *info; u32 sequence; + bool streaming; }; struct mxc_isi_m2m_ctx { @@ -486,15 +487,18 @@ static int mxc_isi_m2m_streamon(struct file *file, void *fh, enum v4l2_buf_type type) { struct mxc_isi_m2m_ctx *ctx = to_isi_m2m_ctx(fh); + struct mxc_isi_m2m_ctx_queue_data *q = mxc_isi_m2m_ctx_qdata(ctx, type); const struct v4l2_pix_format_mplane *out_pix = &ctx->queues.out.format; const struct v4l2_pix_format_mplane *cap_pix = &ctx->queues.cap.format; const struct mxc_isi_format_info *cap_info = ctx->queues.cap.info; const struct mxc_isi_format_info *out_info = ctx->queues.out.info; struct mxc_isi_m2m *m2m = ctx->m2m; bool bypass; - int ret; + if (q->streaming) + return 0; + mutex_lock(&m2m->lock); if (m2m->usage_count == INT_MAX) { @@ -547,6 +551,8 @@ static int mxc_isi_m2m_streamon(struct file *file, void *fh, goto unchain; } + q->streaming = true; + return 0; unchain: @@ -569,10 +575,14 @@ static int mxc_isi_m2m_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) { struct mxc_isi_m2m_ctx *ctx = to_isi_m2m_ctx(fh); + struct mxc_isi_m2m_ctx_queue_data *q = mxc_isi_m2m_ctx_qdata(ctx, type); struct mxc_isi_m2m *m2m = ctx->m2m; v4l2_m2m_ioctl_streamoff(file, fh, type); + if (!q->streaming) + return 0; + mutex_lock(&m2m->lock); /* @@ -598,6 +608,8 @@ static int mxc_isi_m2m_streamoff(struct file *file, void *fh, mutex_unlock(&m2m->lock); + q->streaming = false; + return 0; } -- GitLab From eda32d44323572bce3012282acbd38dc199326e2 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Mon, 3 Mar 2025 21:32:05 +0530 Subject: [PATCH 1257/2211] media: i2c: ds90ub913: Fix returned fmt from .set_fmt() commit ef205273132bdc9bcfa1540eef8105475a453300 upstream. When setting the sink pad's stream format, set_fmt accidentally changes the returned format's code to 'outcode', while the purpose is to only use the 'outcode' for the propagated source stream format. Fixes: c158d0d4ff15 ("media: i2c: add DS90UB913 driver") Cc: stable@vger.kernel.org Signed-off-by: Tomi Valkeinen Signed-off-by: Jai Luthra Signed-off-by: Sakari Ailus Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/i2c/ds90ub913.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/i2c/ds90ub913.c b/drivers/media/i2c/ds90ub913.c index 7670d6c82d923..5d754372230e5 100644 --- a/drivers/media/i2c/ds90ub913.c +++ b/drivers/media/i2c/ds90ub913.c @@ -450,10 +450,10 @@ static int ub913_set_fmt(struct v4l2_subdev *sd, if (!fmt) return -EINVAL; - format->format.code = finfo->outcode; - *fmt = format->format; + fmt->code = finfo->outcode; + return 0; } -- GitLab From d0e6032ee06f02ae36f0101db5a73e1f8225ef05 Mon Sep 17 00:00:00 2001 From: Sakari Ailus Date: Tue, 18 Feb 2025 23:47:13 +0200 Subject: [PATCH 1258/2211] media: ccs-pll: Start VT pre-PLL multiplier search from correct value commit 06d2d478b09e6764fb6161d1621fc10d9f0f2860 upstream. The ccs_pll_calculate_vt_tree() function does a search over possible VT PLL configurations to find the "best" one. If the sensor does not support odd pre-PLL divisors and the minimum value (with constraints) isn't 1, other odd values could be errorneously searched (and selected) for the pre-PLL divisor. Fix this. Fixes: 415ddd993978 ("media: ccs-pll: Split limits and PLL configuration into front and back parts") Cc: stable@vger.kernel.org Signed-off-by: Sakari Ailus Reviewed-by: Laurent Pinchart Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/i2c/ccs-pll.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/i2c/ccs-pll.c b/drivers/media/i2c/ccs-pll.c index cf8858cb13d4c..7e5d87a7975fc 100644 --- a/drivers/media/i2c/ccs-pll.c +++ b/drivers/media/i2c/ccs-pll.c @@ -397,6 +397,8 @@ static int ccs_pll_calculate_vt_tree(struct device *dev, min_pre_pll_clk_div = max_t(u16, min_pre_pll_clk_div, pll->ext_clk_freq_hz / lim_fr->max_pll_ip_clk_freq_hz); + if (!(pll->flags & CCS_PLL_FLAG_EXT_IP_PLL_DIVIDER)) + min_pre_pll_clk_div = clk_div_even(min_pre_pll_clk_div); dev_dbg(dev, "vt min/max_pre_pll_clk_div: %u,%u\n", min_pre_pll_clk_div, max_pre_pll_clk_div); -- GitLab From 6216c67c90e24a9f51f340ab2427e6cb5e9dfe50 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 24 Mar 2025 14:01:09 +0100 Subject: [PATCH 1259/2211] media: ov2740: Move pm-runtime cleanup on probe-errors to proper place commit 81cf4f46a03a07b0b86f9d677c34ba782df7d65e upstream. When v4l2_subdev_init_finalize() fails no changes have been made to the runtime-pm device state yet, so the probe_error_media_entity_cleanup rollback path should not touch the runtime-pm device state. Instead this should be done from the probe_error_v4l2_subdev_cleanup rollback path. Note the pm_runtime_xxx() calls are put above the v4l2_subdev_cleanup() call to have the reverse call order of probe(). Signed-off-by: Hans de Goede Reviewed-by: Bingbu Cao Fixes: 289c25923ecd ("media: ov2740: Use sub-device active state") Cc: stable@vger.kernel.org Signed-off-by: Sakari Ailus Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/i2c/ov2740.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c index bd0b2f0f0d45b..3a0835fa57667 100644 --- a/drivers/media/i2c/ov2740.c +++ b/drivers/media/i2c/ov2740.c @@ -1404,12 +1404,12 @@ static int ov2740_probe(struct i2c_client *client) return 0; probe_error_v4l2_subdev_cleanup: + pm_runtime_disable(&client->dev); + pm_runtime_set_suspended(&client->dev); v4l2_subdev_cleanup(&ov2740->sd); probe_error_media_entity_cleanup: media_entity_cleanup(&ov2740->sd.entity); - pm_runtime_disable(&client->dev); - pm_runtime_set_suspended(&client->dev); probe_error_v4l2_ctrl_handler_free: v4l2_ctrl_handler_free(ov2740->sd.ctrl_handler); -- GitLab From e251f4fe658082775d05b220b2dad71f2bd3af6e Mon Sep 17 00:00:00 2001 From: Sakari Ailus Date: Tue, 18 Feb 2025 23:43:58 +0200 Subject: [PATCH 1260/2211] media: ccs-pll: Start OP pre-PLL multiplier search from correct value commit 660e613d05e449766784c549faf5927ffaf281f1 upstream. The ccs_pll_calculate() function does a search over possible PLL configurations to find the "best" one. If the sensor does not support odd pre-PLL divisors and the minimum value (with constraints) isn't 1, other odd values could be errorneously searched (and selected) for the pre-PLL divisor. Fix this. Fixes: 415ddd993978 ("media: ccs-pll: Split limits and PLL configuration into front and back parts") Cc: stable@vger.kernel.org Signed-off-by: Sakari Ailus Reviewed-by: Laurent Pinchart Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/i2c/ccs-pll.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/i2c/ccs-pll.c b/drivers/media/i2c/ccs-pll.c index 7e5d87a7975fc..98ffbdf565f30 100644 --- a/drivers/media/i2c/ccs-pll.c +++ b/drivers/media/i2c/ccs-pll.c @@ -817,6 +817,8 @@ int ccs_pll_calculate(struct device *dev, const struct ccs_pll_limits *lim, one_or_more( DIV_ROUND_UP(op_lim_fr->max_pll_op_clk_freq_hz, pll->ext_clk_freq_hz)))); + if (!(pll->flags & CCS_PLL_FLAG_EXT_IP_PLL_DIVIDER)) + min_op_pre_pll_clk_div = clk_div_even(min_op_pre_pll_clk_div); dev_dbg(dev, "pll_op check: min / max op_pre_pll_clk_div: %u / %u\n", min_op_pre_pll_clk_div, max_op_pre_pll_clk_div); -- GitLab From dc723f6c8d8d5d62c47aae121e99a5eeffae2d08 Mon Sep 17 00:00:00 2001 From: Sakari Ailus Date: Wed, 19 Feb 2025 15:06:11 +0200 Subject: [PATCH 1261/2211] media: ccs-pll: Correct the upper limit of maximum op_pre_pll_clk_div commit f639494db450770fa30d6845d9c84b9cb009758f upstream. The PLL calculator does a search of the PLL configuration space for all valid OP pre-PLL clock dividers. The maximum did not take into account the CCS PLL flag CCS_PLL_FLAG_EXT_IP_PLL_DIVIDER in which case also odd PLL dividers (other than 1) are valid. Do that now. Fixes: 4e1e8d240dff ("media: ccs-pll: Add support for extended input PLL clock divider") Cc: stable@vger.kernel.org Signed-off-by: Sakari Ailus Reviewed-by: Laurent Pinchart Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/i2c/ccs-pll.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/i2c/ccs-pll.c b/drivers/media/i2c/ccs-pll.c index 98ffbdf565f30..fce3f0f18574a 100644 --- a/drivers/media/i2c/ccs-pll.c +++ b/drivers/media/i2c/ccs-pll.c @@ -794,7 +794,7 @@ int ccs_pll_calculate(struct device *dev, const struct ccs_pll_limits *lim, op_lim_fr->min_pre_pll_clk_div, op_lim_fr->max_pre_pll_clk_div); max_op_pre_pll_clk_div = min_t(u16, op_lim_fr->max_pre_pll_clk_div, - clk_div_even(pll->ext_clk_freq_hz / + DIV_ROUND_UP(pll->ext_clk_freq_hz, op_lim_fr->min_pll_ip_clk_freq_hz)); min_op_pre_pll_clk_div = max_t(u16, op_lim_fr->min_pre_pll_clk_div, -- GitLab From c89339591b3240171443d07b3c2edbef959e7b07 Mon Sep 17 00:00:00 2001 From: Sakari Ailus Date: Thu, 20 Feb 2025 10:54:44 +0200 Subject: [PATCH 1262/2211] media: ccs-pll: Check for too high VT PLL multiplier in dual PLL case commit 6868b955acd6e5d7405a2b730c2ffb692ad50d2c upstream. The check for VT PLL upper limit in dual PLL case was missing. Add it now. Fixes: 6c7469e46b60 ("media: ccs-pll: Add trivial dual PLL support") Cc: stable@vger.kernel.org Signed-off-by: Sakari Ailus Reviewed-by: Laurent Pinchart Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/i2c/ccs-pll.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/media/i2c/ccs-pll.c b/drivers/media/i2c/ccs-pll.c index fce3f0f18574a..611c9823be857 100644 --- a/drivers/media/i2c/ccs-pll.c +++ b/drivers/media/i2c/ccs-pll.c @@ -312,6 +312,11 @@ __ccs_pll_calculate_vt_tree(struct device *dev, dev_dbg(dev, "more_mul2: %u\n", more_mul); pll_fr->pll_multiplier = mul * more_mul; + if (pll_fr->pll_multiplier > lim_fr->max_pll_multiplier) { + dev_dbg(dev, "pll multiplier %u too high\n", + pll_fr->pll_multiplier); + return -EINVAL; + } if (pll_fr->pll_multiplier * pll_fr->pll_ip_clk_freq_hz > lim_fr->max_pll_op_clk_freq_hz) -- GitLab From 9bff888c92f5c25effbb876d22a793c2388c1ccc Mon Sep 17 00:00:00 2001 From: Edward Adam Davis Date: Sat, 5 Apr 2025 19:56:41 +0800 Subject: [PATCH 1263/2211] media: cxusb: no longer judge rbuf when the write fails commit 73fb3b92da84637e3817580fa205d48065924e15 upstream. syzbot reported a uninit-value in cxusb_i2c_xfer. [1] Only when the write operation of usb_bulk_msg() in dvb_usb_generic_rw() succeeds and rlen is greater than 0, the read operation of usb_bulk_msg() will be executed to read rlen bytes of data from the dvb device into the rbuf. In this case, although rlen is 1, the write operation failed which resulted in the dvb read operation not being executed, and ultimately variable i was not initialized. [1] BUG: KMSAN: uninit-value in cxusb_gpio_tuner drivers/media/usb/dvb-usb/cxusb.c:124 [inline] BUG: KMSAN: uninit-value in cxusb_i2c_xfer+0x153a/0x1a60 drivers/media/usb/dvb-usb/cxusb.c:196 cxusb_gpio_tuner drivers/media/usb/dvb-usb/cxusb.c:124 [inline] cxusb_i2c_xfer+0x153a/0x1a60 drivers/media/usb/dvb-usb/cxusb.c:196 __i2c_transfer+0xe25/0x3150 drivers/i2c/i2c-core-base.c:-1 i2c_transfer+0x317/0x4a0 drivers/i2c/i2c-core-base.c:2315 i2c_transfer_buffer_flags+0x125/0x1e0 drivers/i2c/i2c-core-base.c:2343 i2c_master_send include/linux/i2c.h:109 [inline] i2cdev_write+0x210/0x280 drivers/i2c/i2c-dev.c:183 do_loop_readv_writev fs/read_write.c:848 [inline] vfs_writev+0x963/0x14e0 fs/read_write.c:1057 do_writev+0x247/0x5c0 fs/read_write.c:1101 __do_sys_writev fs/read_write.c:1169 [inline] __se_sys_writev fs/read_write.c:1166 [inline] __x64_sys_writev+0x98/0xe0 fs/read_write.c:1166 x64_sys_call+0x2229/0x3c80 arch/x86/include/generated/asm/syscalls_64.h:21 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xcd/0x1e0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f Reported-by: syzbot+526bd95c0ec629993bf3@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=526bd95c0ec629993bf3 Tested-by: syzbot+526bd95c0ec629993bf3@syzkaller.appspotmail.com Fixes: 22c6d93a7310 ("[PATCH] dvb: usb: support Medion hybrid USB2.0 DVB-T/analogue box") Cc: stable@vger.kernel.org Signed-off-by: Edward Adam Davis Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/usb/dvb-usb/cxusb.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c index 1d98d3465e28d..ce52c936cb931 100644 --- a/drivers/media/usb/dvb-usb/cxusb.c +++ b/drivers/media/usb/dvb-usb/cxusb.c @@ -119,9 +119,8 @@ static void cxusb_gpio_tuner(struct dvb_usb_device *d, int onoff) o[0] = GPIO_TUNER; o[1] = onoff; - cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1); - if (i != 0x01) + if (!cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1) && i != 0x01) dev_info(&d->udev->dev, "gpio_write failed.\n"); st->gpio_write_state[GPIO_TUNER] = onoff; -- GitLab From ca43a9386c0b5e737c99d3cfbc647e0ccd7d0c79 Mon Sep 17 00:00:00 2001 From: Dmitry Nikiforov Date: Wed, 16 Apr 2025 23:51:19 +0300 Subject: [PATCH 1264/2211] media: davinci: vpif: Fix memory leak in probe error path commit 024bf40edf1155e7a587f0ec46294049777d9b02 upstream. If an error occurs during the initialization of `pdev_display`, the allocated platform device `pdev_capture` is not released properly, leading to a memory leak. Adjust error path handling to fix the leak. Found by Linux Verification Center (linuxtesting.org) with SVACE. Fixes: 43acb728bbc4 ("media: davinci: vpif: fix use-after-free on driver unbind") Cc: stable@vger.kernel.org Signed-off-by: Dmitry Nikiforov Reviewed-by: Johan Hovold Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/platform/ti/davinci/vpif.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/ti/davinci/vpif.c b/drivers/media/platform/ti/davinci/vpif.c index f4e1fa76bf372..353e8ad158793 100644 --- a/drivers/media/platform/ti/davinci/vpif.c +++ b/drivers/media/platform/ti/davinci/vpif.c @@ -504,7 +504,7 @@ static int vpif_probe(struct platform_device *pdev) pdev_display = kzalloc(sizeof(*pdev_display), GFP_KERNEL); if (!pdev_display) { ret = -ENOMEM; - goto err_put_pdev_capture; + goto err_del_pdev_capture; } pdev_display->name = "vpif_display"; @@ -527,6 +527,8 @@ static int vpif_probe(struct platform_device *pdev) err_put_pdev_display: platform_device_put(pdev_display); +err_del_pdev_capture: + platform_device_del(pdev_capture); err_put_pdev_capture: platform_device_put(pdev_capture); err_put_rpm: -- GitLab From 5ae9ff1ee2be89e1b72a72124f64a81fc60c2de9 Mon Sep 17 00:00:00 2001 From: Wentao Liang Date: Tue, 22 Apr 2025 11:07:39 +0800 Subject: [PATCH 1265/2211] media: gspca: Add error handling for stv06xx_read_sensor() commit 398a1b33f1479af35ca915c5efc9b00d6204f8fa upstream. In hdcs_init(), the return value of stv06xx_read_sensor() needs to be checked. A proper implementation can be found in vv6410_dump(). Add a check in loop condition and propergate error code to fix this issue. Fixes: 4c98834addfe ("V4L/DVB (10048): gspca - stv06xx: New subdriver.") Cc: stable@vger.kernel.org # v2.6+ Signed-off-by: Wentao Liang Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/usb/gspca/stv06xx/stv06xx_hdcs.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/media/usb/gspca/stv06xx/stv06xx_hdcs.c b/drivers/media/usb/gspca/stv06xx/stv06xx_hdcs.c index 5a47dcbf1c8e5..303b055fefea9 100644 --- a/drivers/media/usb/gspca/stv06xx/stv06xx_hdcs.c +++ b/drivers/media/usb/gspca/stv06xx/stv06xx_hdcs.c @@ -520,12 +520,13 @@ static int hdcs_init(struct sd *sd) static int hdcs_dump(struct sd *sd) { u16 reg, val; + int err = 0; pr_info("Dumping sensor registers:\n"); - for (reg = HDCS_IDENT; reg <= HDCS_ROWEXPH; reg++) { - stv06xx_read_sensor(sd, reg, &val); + for (reg = HDCS_IDENT; reg <= HDCS_ROWEXPH && !err; reg++) { + err = stv06xx_read_sensor(sd, reg, &val); pr_info("reg 0x%02x = 0x%02x\n", reg, val); } - return 0; + return (err < 0) ? err : 0; } -- GitLab From 1f78790d988c9d55cf8d4b4d511d4b3e38ecb81d Mon Sep 17 00:00:00 2001 From: Kieran Bingham Date: Wed, 30 Apr 2025 08:36:49 +0100 Subject: [PATCH 1266/2211] media: i2c: imx335: Fix frame size enumeration commit b240df2913d396638033b86af0f0ff76aa1aafc8 upstream. In commit cfa49ff0558a ("media: i2c: imx335: Support 2592x1940 10-bit mode") the IMX335 driver was extended to support multiple output bitdepth modes. This incorrectly extended the frame size enumeration to check against the supported mbus_codes array instead of the supported mode/frame array. This has the unwanted side effect of reporting the currently supported frame size 2592x1944 three times. Fix the check accordingly to report a frame size for each supported size, which is presently only a single entry. Fixes: cfa49ff0558a ("media: i2c: imx335: Support 2592x1940 10-bit mode") Cc: stable@vger.kernel.org Signed-off-by: Kieran Bingham Signed-off-by: Sakari Ailus Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/i2c/imx335.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c index d400a019f6b3f..9b4db4cd4929c 100644 --- a/drivers/media/i2c/imx335.c +++ b/drivers/media/i2c/imx335.c @@ -660,7 +660,8 @@ static int imx335_enum_frame_size(struct v4l2_subdev *sd, struct imx335 *imx335 = to_imx335(sd); u32 code; - if (fsize->index > ARRAY_SIZE(imx335_mbus_codes)) + /* Only a single supported_mode available. */ + if (fsize->index > 0) return -EINVAL; code = imx335_get_format_code(imx335, fsize->code); -- GitLab From 2a2bd7df402decbdefd0acb64ba4e17a0a2a4117 Mon Sep 17 00:00:00 2001 From: Haoxiang Li Date: Wed, 26 Feb 2025 20:49:22 +0800 Subject: [PATCH 1267/2211] media: imagination: fix a potential memory leak in e5010_probe() commit 609ba05b9484856b08869f827a6edee51d51b5f3 upstream. Add video_device_release() to release the memory allocated by video_device_alloc() if something goes wrong. Fixes: a1e294045885 ("media: imagination: Add E5010 JPEG Encoder driver") Cc: stable@vger.kernel.org Signed-off-by: Haoxiang Li Reviewed-by: Nicolas Dufresne Signed-off-by: Nicolas Dufresne Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/platform/imagination/e5010-jpeg-enc.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/imagination/e5010-jpeg-enc.c b/drivers/media/platform/imagination/e5010-jpeg-enc.c index 187f2d8abfbb5..cb1f7de1b6321 100644 --- a/drivers/media/platform/imagination/e5010-jpeg-enc.c +++ b/drivers/media/platform/imagination/e5010-jpeg-enc.c @@ -1057,8 +1057,11 @@ static int e5010_probe(struct platform_device *pdev) e5010->vdev->lock = &e5010->mutex; ret = v4l2_device_register(dev, &e5010->v4l2_dev); - if (ret) - return dev_err_probe(dev, ret, "failed to register v4l2 device\n"); + if (ret) { + dev_err_probe(dev, ret, "failed to register v4l2 device\n"); + goto fail_after_video_device_alloc; + } + e5010->m2m_dev = v4l2_m2m_init(&e5010_m2m_ops); if (IS_ERR(e5010->m2m_dev)) { @@ -1118,6 +1121,8 @@ fail_after_video_register_device: v4l2_m2m_release(e5010->m2m_dev); fail_after_v4l2_register: v4l2_device_unregister(&e5010->v4l2_dev); +fail_after_video_device_alloc: + video_device_release(e5010->vdev); return ret; } -- GitLab From a2d4fdef06669949dd668435ef7c399ccd94c28e Mon Sep 17 00:00:00 2001 From: Stanislaw Gruszka Date: Thu, 10 Apr 2025 11:47:06 +0200 Subject: [PATCH 1268/2211] media: intel/ipu6: Fix dma mask for non-secure mode commit 0209916ebe2475079ce6d8dc4114afbc0ccad1c2 upstream. We use dma_get_mask() of auxdev device for calculate iova pfn limit. This is always 32 bit mask as we do not initialize the mask (and we can not do so, since dev->dev_mask is NULL anyways for auxdev). Since we need 31 bit mask for non-secure mode use mmu_info->aperture_end which is properly initialized to correct mask for both modes. Fixes: daabc5c64703 ("media: ipu6: not override the dma_ops of device in driver") Cc: stable@vger.kernel.org Signed-off-by: Stanislaw Gruszka Signed-off-by: Sakari Ailus Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/pci/intel/ipu6/ipu6-dma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/pci/intel/ipu6/ipu6-dma.c b/drivers/media/pci/intel/ipu6/ipu6-dma.c index b71f66bd8c1fd..92d513608395c 100644 --- a/drivers/media/pci/intel/ipu6/ipu6-dma.c +++ b/drivers/media/pci/intel/ipu6/ipu6-dma.c @@ -172,7 +172,7 @@ void *ipu6_dma_alloc(struct ipu6_bus_device *sys, size_t size, count = PHYS_PFN(size); iova = alloc_iova(&mmu->dmap->iovad, count, - PHYS_PFN(dma_get_mask(dev)), 0); + PHYS_PFN(mmu->dmap->mmu_info->aperture_end), 0); if (!iova) goto out_kfree; @@ -398,7 +398,7 @@ int ipu6_dma_map_sg(struct ipu6_bus_device *sys, struct scatterlist *sglist, nents, npages); iova = alloc_iova(&mmu->dmap->iovad, npages, - PHYS_PFN(dma_get_mask(dev)), 0); + PHYS_PFN(mmu->dmap->mmu_info->aperture_end), 0); if (!iova) return 0; -- GitLab From 831b460e923aad27fc7158614589946dbee2f066 Mon Sep 17 00:00:00 2001 From: Hao Yao Date: Tue, 11 Mar 2025 16:41:55 +0800 Subject: [PATCH 1269/2211] media: ipu6: Remove workaround for Meteor Lake ES2 commit d471fb06b21ae54bf76464731ae1dcb26ef1ca68 upstream. There was a hardware bug which need IPU6 driver to disable the ATS. This workaround is not needed anymore as the bug was fixed in hardware level. Additionally, Arrow Lake has the same IPU6 PCI ID and x86 stepping but does not have the bug. Removing the Meteor Lake workaround is also required for the driver to function on Arrow Lake. Signed-off-by: Hao Yao Reviewed-by: Stanislaw Gruszka Fixes: 25fedc021985 ("media: intel/ipu6: add Intel IPU6 PCI device driver") Cc: stable@vger.kernel.org [Sakari Ailus: Added tags and explanation of what is fixed.] Signed-off-by: Sakari Ailus Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/pci/intel/ipu6/ipu6.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/drivers/media/pci/intel/ipu6/ipu6.c b/drivers/media/pci/intel/ipu6/ipu6.c index 91718eabd74e5..1c5c38a30e629 100644 --- a/drivers/media/pci/intel/ipu6/ipu6.c +++ b/drivers/media/pci/intel/ipu6/ipu6.c @@ -463,11 +463,6 @@ static int ipu6_pci_config_setup(struct pci_dev *dev, u8 hw_ver) { int ret; - /* disable IPU6 PCI ATS on mtl ES2 */ - if (is_ipu6ep_mtl(hw_ver) && boot_cpu_data.x86_stepping == 0x2 && - pci_ats_supported(dev)) - pci_disable_ats(dev); - /* No PCI msi capability for IPU6EP */ if (is_ipu6ep(hw_ver) || is_ipu6ep_mtl(hw_ver)) { /* likely do nothing as msi not enabled by default */ -- GitLab From f3033169d1474f4e9cc5e11e8f1aa62cc9d25bbb Mon Sep 17 00:00:00 2001 From: Fei Shao Date: Fri, 14 Mar 2025 15:56:17 +0800 Subject: [PATCH 1270/2211] media: mediatek: vcodec: Correct vsi_core framebuffer size commit f19035b86382f635a0d13d177b601babaf263a12 upstream. The framebuffer size for decoder instances was being incorrectly set - inst->vsi_core->fb.y.size was assigned twice consecutively. Assign the second picinfo framebuffer size to the C framebuffer instead, which appears to be the intended target based on the surrounding code. Fixes: 2674486aac7d ("media: mediatek: vcodec: support stateless hevc decoder") Cc: stable@vger.kernel.org Signed-off-by: Fei Shao Reviewed-by: Nicolas Dufresne Signed-off-by: Nicolas Dufresne Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- .../mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c index aa721cc43647c..2725db882e5b3 100644 --- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c +++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c @@ -821,7 +821,7 @@ static int vdec_hevc_slice_setup_core_buffer(struct vdec_hevc_slice_inst *inst, inst->vsi_core->fb.y.dma_addr = y_fb_dma; inst->vsi_core->fb.y.size = ctx->picinfo.fb_sz[0]; inst->vsi_core->fb.c.dma_addr = c_fb_dma; - inst->vsi_core->fb.y.size = ctx->picinfo.fb_sz[1]; + inst->vsi_core->fb.c.size = ctx->picinfo.fb_sz[1]; inst->vsi_core->dec.vdec_fb_va = (unsigned long)fb; -- GitLab From 63ea94aa72e4dd108b8f2110cd37390e657f1ac5 Mon Sep 17 00:00:00 2001 From: Marek Szyprowski Date: Wed, 7 May 2025 18:09:13 +0200 Subject: [PATCH 1271/2211] media: omap3isp: use sgtable-based scatterlist wrappers commit 3de572fe2189a4a0bd80295e1f478401e739498e upstream. Use common wrappers operating directly on the struct sg_table objects to fix incorrect use of scatterlists sync calls. dma_sync_sg_for_*() functions have to be called with the number of elements originally passed to dma_map_sg_*() function, not the one returned in sgtable's nents. Fixes: d33186d0be18 ("[media] omap3isp: ccdc: Use the DMA API for LSC") Fixes: 0e24e90f2ca7 ("[media] omap3isp: stat: Use the DMA API") CC: stable@vger.kernel.org Signed-off-by: Marek Szyprowski Reviewed-by: Laurent Pinchart Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/platform/ti/omap3isp/ispccdc.c | 8 ++++---- drivers/media/platform/ti/omap3isp/ispstat.c | 6 ++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/drivers/media/platform/ti/omap3isp/ispccdc.c b/drivers/media/platform/ti/omap3isp/ispccdc.c index dd375c4e180d1..7d0c723dcd119 100644 --- a/drivers/media/platform/ti/omap3isp/ispccdc.c +++ b/drivers/media/platform/ti/omap3isp/ispccdc.c @@ -446,8 +446,8 @@ static int ccdc_lsc_config(struct isp_ccdc_device *ccdc, if (ret < 0) goto done; - dma_sync_sg_for_cpu(isp->dev, req->table.sgt.sgl, - req->table.sgt.nents, DMA_TO_DEVICE); + dma_sync_sgtable_for_cpu(isp->dev, &req->table.sgt, + DMA_TO_DEVICE); if (copy_from_user(req->table.addr, config->lsc, req->config.size)) { @@ -455,8 +455,8 @@ static int ccdc_lsc_config(struct isp_ccdc_device *ccdc, goto done; } - dma_sync_sg_for_device(isp->dev, req->table.sgt.sgl, - req->table.sgt.nents, DMA_TO_DEVICE); + dma_sync_sgtable_for_device(isp->dev, &req->table.sgt, + DMA_TO_DEVICE); } spin_lock_irqsave(&ccdc->lsc.req_lock, flags); diff --git a/drivers/media/platform/ti/omap3isp/ispstat.c b/drivers/media/platform/ti/omap3isp/ispstat.c index 359a846205b0f..d3da68408ecb1 100644 --- a/drivers/media/platform/ti/omap3isp/ispstat.c +++ b/drivers/media/platform/ti/omap3isp/ispstat.c @@ -161,8 +161,7 @@ static void isp_stat_buf_sync_for_device(struct ispstat *stat, if (ISP_STAT_USES_DMAENGINE(stat)) return; - dma_sync_sg_for_device(stat->isp->dev, buf->sgt.sgl, - buf->sgt.nents, DMA_FROM_DEVICE); + dma_sync_sgtable_for_device(stat->isp->dev, &buf->sgt, DMA_FROM_DEVICE); } static void isp_stat_buf_sync_for_cpu(struct ispstat *stat, @@ -171,8 +170,7 @@ static void isp_stat_buf_sync_for_cpu(struct ispstat *stat, if (ISP_STAT_USES_DMAENGINE(stat)) return; - dma_sync_sg_for_cpu(stat->isp->dev, buf->sgt.sgl, - buf->sgt.nents, DMA_FROM_DEVICE); + dma_sync_sgtable_for_cpu(stat->isp->dev, &buf->sgt, DMA_FROM_DEVICE); } static void isp_stat_buf_clear(struct ispstat *stat) -- GitLab From 2429bb9fad88c8fa84c4956b0a21cf5afe5e92b7 Mon Sep 17 00:00:00 2001 From: Ma Ke Date: Wed, 19 Mar 2025 16:02:48 +0800 Subject: [PATCH 1272/2211] media: v4l2-dev: fix error handling in __video_register_device() commit 2a934fdb01db6458288fc9386d3d8ceba6dd551a upstream. Once device_register() failed, we should call put_device() to decrement reference count for cleanup. Or it could cause memory leak. And move callback function v4l2_device_release() and v4l2_device_get() before put_device(). As comment of device_register() says, 'NOTE: _Never_ directly free @dev after calling this function, even if it returned an error! Always use put_device() to give up the reference initialized in this function instead.' Found by code review. Cc: stable@vger.kernel.org Fixes: dc93a70cc7f9 ("V4L/DVB (9973): v4l2-dev: use the release callback from device instead of cdev") Signed-off-by: Ma Ke Reviewed-by: Sakari Ailus Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/v4l2-core/v4l2-dev.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c index 3d7711cc42bc5..56f3ab966d606 100644 --- a/drivers/media/v4l2-core/v4l2-dev.c +++ b/drivers/media/v4l2-core/v4l2-dev.c @@ -1052,25 +1052,25 @@ int __video_register_device(struct video_device *vdev, vdev->dev.class = &video_class; vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor); vdev->dev.parent = vdev->dev_parent; + vdev->dev.release = v4l2_device_release; dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num); + + /* Increase v4l2_device refcount */ + v4l2_device_get(vdev->v4l2_dev); + mutex_lock(&videodev_lock); ret = device_register(&vdev->dev); if (ret < 0) { mutex_unlock(&videodev_lock); pr_err("%s: device_register failed\n", __func__); - goto cleanup; + put_device(&vdev->dev); + return ret; } - /* Register the release callback that will be called when the last - reference to the device goes away. */ - vdev->dev.release = v4l2_device_release; if (nr != -1 && nr != vdev->num && warn_if_nr_in_use) pr_warn("%s: requested %s%d, got %s\n", __func__, name_base, nr, video_device_node_name(vdev)); - /* Increase v4l2_device refcount */ - v4l2_device_get(vdev->v4l2_dev); - /* Part 5: Register the entity. */ ret = video_register_media_controller(vdev); -- GitLab From 742c60333bef543440a6b8b3884844438aefdf1e Mon Sep 17 00:00:00 2001 From: Loic Poulain Date: Thu, 27 Mar 2025 13:53:04 +0100 Subject: [PATCH 1273/2211] media: venus: Fix probe error handling commit 523cea3a19f0b3b020a4745344c136a636e6ffd7 upstream. Video device registering has been moved earlier in the probe function, but the new order has not been propagated to error handling. This means we can end with unreleased resources on error (e.g dangling video device on missing firmware probe aborting). Fixes: 08b1cf474b7f7 ("media: venus: core, venc, vdec: Fix probe dependency error") Cc: stable@vger.kernel.org Signed-off-by: Loic Poulain Reviewed-by: Dikshita Agarwal Reviewed-by: Bryan O'Donoghue Signed-off-by: Bryan O'Donoghue Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/platform/qcom/venus/core.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c index cabcf710c0462..4d10e94eefe9e 100644 --- a/drivers/media/platform/qcom/venus/core.c +++ b/drivers/media/platform/qcom/venus/core.c @@ -354,7 +354,7 @@ static int venus_probe(struct platform_device *pdev) ret = v4l2_device_register(dev, &core->v4l2_dev); if (ret) - goto err_core_deinit; + goto err_hfi_destroy; platform_set_drvdata(pdev, core); @@ -386,24 +386,24 @@ static int venus_probe(struct platform_device *pdev) ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_DEC); if (ret) - goto err_venus_shutdown; + goto err_core_deinit; ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_ENC); if (ret) - goto err_venus_shutdown; + goto err_core_deinit; ret = pm_runtime_put_sync(dev); if (ret) { pm_runtime_get_noresume(dev); - goto err_dev_unregister; + goto err_core_deinit; } venus_dbgfs_init(core); return 0; -err_dev_unregister: - v4l2_device_unregister(&core->v4l2_dev); +err_core_deinit: + hfi_core_deinit(core, false); err_venus_shutdown: venus_shutdown(core); err_firmware_deinit: @@ -414,9 +414,9 @@ err_runtime_disable: pm_runtime_put_noidle(dev); pm_runtime_disable(dev); pm_runtime_set_suspended(dev); + v4l2_device_unregister(&core->v4l2_dev); +err_hfi_destroy: hfi_destroy(core); -err_core_deinit: - hfi_core_deinit(core, false); err_core_put: if (core->pm_ops->core_put) core->pm_ops->core_put(core); -- GitLab From 5d8b057ed735cfc4188a3f2047df77c353c2f944 Mon Sep 17 00:00:00 2001 From: Marek Szyprowski Date: Wed, 7 May 2025 18:09:11 +0200 Subject: [PATCH 1274/2211] media: videobuf2: use sgtable-based scatterlist wrappers commit a704a3c503ae1cfd9de8a2e2d16a0c9430e98162 upstream. Use common wrappers operating directly on the struct sg_table objects to fix incorrect use of scatterlists sync calls. dma_sync_sg_for_*() functions have to be called with the number of elements originally passed to dma_map_sg_*() function, not the one returned in sgt->nents. Fixes: d4db5eb57cab ("media: videobuf2: add begin/end cpu_access callbacks to dma-sg") CC: stable@vger.kernel.org Signed-off-by: Marek Szyprowski Reviewed-by: Sergey Senozhatsky Acked-by: Tomasz Figa Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/common/videobuf2/videobuf2-dma-sg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/common/videobuf2/videobuf2-dma-sg.c b/drivers/media/common/videobuf2/videobuf2-dma-sg.c index 6975a71d740f6..a5aa6a2a028cb 100644 --- a/drivers/media/common/videobuf2/videobuf2-dma-sg.c +++ b/drivers/media/common/videobuf2/videobuf2-dma-sg.c @@ -469,7 +469,7 @@ vb2_dma_sg_dmabuf_ops_begin_cpu_access(struct dma_buf *dbuf, struct vb2_dma_sg_buf *buf = dbuf->priv; struct sg_table *sgt = buf->dma_sgt; - dma_sync_sg_for_cpu(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir); + dma_sync_sgtable_for_cpu(buf->dev, sgt, buf->dma_dir); return 0; } @@ -480,7 +480,7 @@ vb2_dma_sg_dmabuf_ops_end_cpu_access(struct dma_buf *dbuf, struct vb2_dma_sg_buf *buf = dbuf->priv; struct sg_table *sgt = buf->dma_sgt; - dma_sync_sg_for_device(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir); + dma_sync_sgtable_for_device(buf->dev, sgt, buf->dma_dir); return 0; } -- GitLab From 72541cae73d0809a6416bfcd2ee6473046a0013a Mon Sep 17 00:00:00 2001 From: Edward Adam Davis Date: Tue, 11 Mar 2025 15:20:14 +0800 Subject: [PATCH 1275/2211] media: vidtv: Terminating the subsequent process of initialization failure commit 1d5f88f053480326873115092bc116b7d14916ba upstream. syzbot reported a slab-use-after-free Read in vidtv_mux_init. [1] After PSI initialization fails, the si member is accessed again, resulting in this uaf. After si initialization fails, the subsequent process needs to be exited. [1] BUG: KASAN: slab-use-after-free in vidtv_mux_pid_ctx_init drivers/media/test-drivers/vidtv/vidtv_mux.c:78 [inline] BUG: KASAN: slab-use-after-free in vidtv_mux_init+0xac2/0xbe0 drivers/media/test-drivers/vidtv/vidtv_mux.c:524 Read of size 8 at addr ffff88802fa42acc by task syz.2.37/6059 CPU: 0 UID: 0 PID: 6059 Comm: syz.2.37 Not tainted 6.14.0-rc5-syzkaller #0 Hardware name: Google Compute Engine, BIOS Google 02/12/2025 Call Trace: __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:408 [inline] print_report+0xc3/0x670 mm/kasan/report.c:521 kasan_report+0xd9/0x110 mm/kasan/report.c:634 vidtv_mux_pid_ctx_init drivers/media/test-drivers/vidtv/vidtv_mux.c:78 vidtv_mux_init+0xac2/0xbe0 drivers/media/test-drivers/vidtv/vidtv_mux.c:524 vidtv_start_streaming drivers/media/test-drivers/vidtv/vidtv_bridge.c:194 vidtv_start_feed drivers/media/test-drivers/vidtv/vidtv_bridge.c:239 dmx_section_feed_start_filtering drivers/media/dvb-core/dvb_demux.c:973 dvb_dmxdev_feed_start drivers/media/dvb-core/dmxdev.c:508 [inline] dvb_dmxdev_feed_restart.isra.0 drivers/media/dvb-core/dmxdev.c:537 dvb_dmxdev_filter_stop+0x2b4/0x3a0 drivers/media/dvb-core/dmxdev.c:564 dvb_dmxdev_filter_free drivers/media/dvb-core/dmxdev.c:840 [inline] dvb_demux_release+0x92/0x550 drivers/media/dvb-core/dmxdev.c:1246 __fput+0x3ff/0xb70 fs/file_table.c:464 task_work_run+0x14e/0x250 kernel/task_work.c:227 exit_task_work include/linux/task_work.h:40 [inline] do_exit+0xad8/0x2d70 kernel/exit.c:938 do_group_exit+0xd3/0x2a0 kernel/exit.c:1087 __do_sys_exit_group kernel/exit.c:1098 [inline] __se_sys_exit_group kernel/exit.c:1096 [inline] __x64_sys_exit_group+0x3e/0x50 kernel/exit.c:1096 x64_sys_call+0x151f/0x1720 arch/x86/include/generated/asm/syscalls_64.h:232 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcd/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f871d58d169 Code: Unable to access opcode bytes at 0x7f871d58d13f. RSP: 002b:00007fff4b19a788 EFLAGS: 00000246 ORIG_RAX: 00000000000000e7 RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f871d58d169 RDX: 0000000000000064 RSI: 0000000000000000 RDI: 0000000000000000 RBP: 00007fff4b19a7ec R08: 0000000b4b19a87f R09: 00000000000927c0 R10: 0000000000000001 R11: 0000000000000246 R12: 0000000000000003 R13: 00000000000927c0 R14: 000000000001d553 R15: 00007fff4b19a840 Allocated by task 6059: kasan_save_stack+0x33/0x60 mm/kasan/common.c:47 kasan_save_track+0x14/0x30 mm/kasan/common.c:68 poison_kmalloc_redzone mm/kasan/common.c:377 [inline] __kasan_kmalloc+0xaa/0xb0 mm/kasan/common.c:394 kmalloc_noprof include/linux/slab.h:901 [inline] kzalloc_noprof include/linux/slab.h:1037 [inline] vidtv_psi_pat_table_init drivers/media/test-drivers/vidtv/vidtv_psi.c:970 vidtv_channel_si_init drivers/media/test-drivers/vidtv/vidtv_channel.c:423 vidtv_mux_init drivers/media/test-drivers/vidtv/vidtv_mux.c:519 vidtv_start_streaming drivers/media/test-drivers/vidtv/vidtv_bridge.c:194 vidtv_start_feed drivers/media/test-drivers/vidtv/vidtv_bridge.c:239 dmx_section_feed_start_filtering drivers/media/dvb-core/dvb_demux.c:973 dvb_dmxdev_feed_start drivers/media/dvb-core/dmxdev.c:508 [inline] dvb_dmxdev_feed_restart.isra.0 drivers/media/dvb-core/dmxdev.c:537 dvb_dmxdev_filter_stop+0x2b4/0x3a0 drivers/media/dvb-core/dmxdev.c:564 dvb_dmxdev_filter_free drivers/media/dvb-core/dmxdev.c:840 [inline] dvb_demux_release+0x92/0x550 drivers/media/dvb-core/dmxdev.c:1246 __fput+0x3ff/0xb70 fs/file_table.c:464 task_work_run+0x14e/0x250 kernel/task_work.c:227 exit_task_work include/linux/task_work.h:40 [inline] do_exit+0xad8/0x2d70 kernel/exit.c:938 do_group_exit+0xd3/0x2a0 kernel/exit.c:1087 __do_sys_exit_group kernel/exit.c:1098 [inline] __se_sys_exit_group kernel/exit.c:1096 [inline] __x64_sys_exit_group+0x3e/0x50 kernel/exit.c:1096 x64_sys_call arch/x86/include/generated/asm/syscalls_64.h:232 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcd/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f Freed by task 6059: kasan_save_stack+0x33/0x60 mm/kasan/common.c:47 kasan_save_track+0x14/0x30 mm/kasan/common.c:68 kasan_save_free_info+0x3b/0x60 mm/kasan/generic.c:576 poison_slab_object mm/kasan/common.c:247 [inline] __kasan_slab_free+0x51/0x70 mm/kasan/common.c:264 kasan_slab_free include/linux/kasan.h:233 [inline] slab_free_hook mm/slub.c:2353 [inline] slab_free mm/slub.c:4609 [inline] kfree+0x2c4/0x4d0 mm/slub.c:4757 vidtv_channel_si_init drivers/media/test-drivers/vidtv/vidtv_channel.c:499 vidtv_mux_init drivers/media/test-drivers/vidtv/vidtv_mux.c:519 vidtv_start_streaming drivers/media/test-drivers/vidtv/vidtv_bridge.c:194 vidtv_start_feed drivers/media/test-drivers/vidtv/vidtv_bridge.c:239 dmx_section_feed_start_filtering drivers/media/dvb-core/dvb_demux.c:973 dvb_dmxdev_feed_start drivers/media/dvb-core/dmxdev.c:508 [inline] dvb_dmxdev_feed_restart.isra.0 drivers/media/dvb-core/dmxdev.c:537 dvb_dmxdev_filter_stop+0x2b4/0x3a0 drivers/media/dvb-core/dmxdev.c:564 dvb_dmxdev_filter_free drivers/media/dvb-core/dmxdev.c:840 [inline] dvb_demux_release+0x92/0x550 drivers/media/dvb-core/dmxdev.c:1246 __fput+0x3ff/0xb70 fs/file_table.c:464 task_work_run+0x14e/0x250 kernel/task_work.c:227 exit_task_work include/linux/task_work.h:40 [inline] do_exit+0xad8/0x2d70 kernel/exit.c:938 do_group_exit+0xd3/0x2a0 kernel/exit.c:1087 __do_sys_exit_group kernel/exit.c:1098 [inline] __se_sys_exit_group kernel/exit.c:1096 [inline] __x64_sys_exit_group+0x3e/0x50 kernel/exit.c:1096 x64_sys_call arch/x86/include/generated/asm/syscalls_64.h:232 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcd/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f Fixes: 3be8037960bc ("media: vidtv: add error checks") Cc: stable@vger.kernel.org Reported-by: syzbot+0d33ab192bd50b6c91e6@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=0d33ab192bd50b6c91e6 Signed-off-by: Edward Adam Davis Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/test-drivers/vidtv/vidtv_channel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/test-drivers/vidtv/vidtv_channel.c b/drivers/media/test-drivers/vidtv/vidtv_channel.c index 7838e62727128..f3023e91b3ebc 100644 --- a/drivers/media/test-drivers/vidtv/vidtv_channel.c +++ b/drivers/media/test-drivers/vidtv/vidtv_channel.c @@ -497,7 +497,7 @@ free_sdt: vidtv_psi_sdt_table_destroy(m->si.sdt); free_pat: vidtv_psi_pat_table_destroy(m->si.pat); - return 0; + return -EINVAL; } void vidtv_channel_si_destroy(struct vidtv_mux *m) -- GitLab From 00da1c767a6567e56f23dda586847586868ac064 Mon Sep 17 00:00:00 2001 From: Denis Arefev Date: Tue, 15 Apr 2025 11:27:21 +0300 Subject: [PATCH 1276/2211] media: vivid: Change the siize of the composing commit f83ac8d30c43fd902af7c84c480f216157b60ef0 upstream. syzkaller found a bug: BUG: KASAN: vmalloc-out-of-bounds in tpg_fill_plane_pattern drivers/media/common/v4l2-tpg/v4l2-tpg-core.c:2608 [inline] BUG: KASAN: vmalloc-out-of-bounds in tpg_fill_plane_buffer+0x1a9c/0x5af0 drivers/media/common/v4l2-tpg/v4l2-tpg-core.c:2705 Write of size 1440 at addr ffffc9000d0ffda0 by task vivid-000-vid-c/5304 CPU: 0 UID: 0 PID: 5304 Comm: vivid-000-vid-c Not tainted 6.14.0-rc2-syzkaller-00039-g09fbf3d50205 #0 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 Call Trace: __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x241/0x360 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:378 [inline] print_report+0x169/0x550 mm/kasan/report.c:489 kasan_report+0x143/0x180 mm/kasan/report.c:602 kasan_check_range+0x282/0x290 mm/kasan/generic.c:189 __asan_memcpy+0x40/0x70 mm/kasan/shadow.c:106 tpg_fill_plane_pattern drivers/media/common/v4l2-tpg/v4l2-tpg-core.c:2608 [inline] tpg_fill_plane_buffer+0x1a9c/0x5af0 drivers/media/common/v4l2-tpg/v4l2-tpg-core.c:2705 vivid_fillbuff drivers/media/test-drivers/vivid/vivid-kthread-cap.c:470 [inline] vivid_thread_vid_cap_tick+0xf8e/0x60d0 drivers/media/test-drivers/vivid/vivid-kthread-cap.c:629 vivid_thread_vid_cap+0x8aa/0xf30 drivers/media/test-drivers/vivid/vivid-kthread-cap.c:767 kthread+0x7a9/0x920 kernel/kthread.c:464 ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:148 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244 The composition size cannot be larger than the size of fmt_cap_rect. So execute v4l2_rect_map_inside() even if has_compose_cap == 0. Fixes: 94a7ad928346 ("media: vivid: fix compose size exceed boundary") Cc: stable@vger.kernel.org Reported-by: syzbot+365005005522b70a36f2@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?id=8ed8e8cc30cbe0d86c9a25bd1d6a5775129b8ea3 Signed-off-by: Denis Arefev Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/test-drivers/vivid/vivid-vid-cap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/test-drivers/vivid/vivid-vid-cap.c b/drivers/media/test-drivers/vivid/vivid-vid-cap.c index f25e011153642..0d5919e000756 100644 --- a/drivers/media/test-drivers/vivid/vivid-vid-cap.c +++ b/drivers/media/test-drivers/vivid/vivid-vid-cap.c @@ -947,8 +947,8 @@ int vivid_vid_cap_s_selection(struct file *file, void *fh, struct v4l2_selection if (dev->has_compose_cap) { v4l2_rect_set_min_size(compose, &min_rect); v4l2_rect_set_max_size(compose, &max_rect); - v4l2_rect_map_inside(compose, &fmt); } + v4l2_rect_map_inside(compose, &fmt); dev->fmt_cap_rect = fmt; tpg_s_buf_height(&dev->tpg, fmt.height); } else if (dev->has_compose_cap) { -- GitLab From 314893d15a898289c1b0968c96cc26fbc7add32c Mon Sep 17 00:00:00 2001 From: Ming Qian Date: Mon, 21 Apr 2025 15:06:12 +0800 Subject: [PATCH 1277/2211] media: imx-jpeg: Drop the first error frames commit d52b9b7e2f10d22a49468128540533e8d76910cd upstream. When an output buffer contains error frame header, v4l2_jpeg_parse_header() will return error, then driver will mark this buffer and a capture buffer done with error flag in device_run(). But if the error occurs in the first frames, before setup the capture queue, there is no chance to schedule device_run(), and there may be no capture to mark error. So we need to drop this buffer with error flag, and make the decoding can continue. Fixes: 2db16c6ed72c ("media: imx-jpeg: Add V4L2 driver for i.MX8 JPEG Encoder/Decoder") Cc: stable@vger.kernel.org Signed-off-by: Ming Qian Reviewed-by: Nicolas Dufresne Signed-off-by: Nicolas Dufresne Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c index b8c9bb017fb5f..3a3f7cbb34c8d 100644 --- a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c +++ b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c @@ -1918,9 +1918,19 @@ static void mxc_jpeg_buf_queue(struct vb2_buffer *vb) jpeg_src_buf = vb2_to_mxc_buf(vb); jpeg_src_buf->jpeg_parse_error = false; ret = mxc_jpeg_parse(ctx, vb); - if (ret) + if (ret) { jpeg_src_buf->jpeg_parse_error = true; + /* + * if the capture queue is not setup, the device_run() won't be scheduled, + * need to drop the error buffer, so that the decoding can continue + */ + if (!vb2_is_streaming(v4l2_m2m_get_dst_vq(ctx->fh.m2m_ctx))) { + v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR); + return; + } + } + end: v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf); } -- GitLab From c8332e6a0ba523ca90b078c041381f5d59d6fb6d Mon Sep 17 00:00:00 2001 From: Ming Qian Date: Mon, 21 Apr 2025 16:12:52 +0800 Subject: [PATCH 1278/2211] media: imx-jpeg: Move mxc_jpeg_free_slot_data() ahead commit 46e9c092f850bd7b4d06de92d3d21877f49a3fcb upstream. Move function mxc_jpeg_free_slot_data() above mxc_jpeg_alloc_slot_data() allowing to call that function during allocation failures. No functional changes are made. Fixes: 2db16c6ed72c ("media: imx-jpeg: Add V4L2 driver for i.MX8 JPEG Encoder/Decoder") Cc: stable@vger.kernel.org Signed-off-by: Ming Qian Reviewed-by: Nicolas Dufresne Reviewed-by: Frank Li Signed-off-by: Nicolas Dufresne Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- .../media/platform/nxp/imx-jpeg/mxc-jpeg.c | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c index 3a3f7cbb34c8d..38033ed169e53 100644 --- a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c +++ b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c @@ -752,6 +752,26 @@ static int mxc_get_free_slot(struct mxc_jpeg_slot_data *slot_data) return -1; } +static void mxc_jpeg_free_slot_data(struct mxc_jpeg_dev *jpeg) +{ + /* free descriptor for decoding/encoding phase */ + dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), + jpeg->slot_data.desc, + jpeg->slot_data.desc_handle); + + /* free descriptor for encoder configuration phase / decoder DHT */ + dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), + jpeg->slot_data.cfg_desc, + jpeg->slot_data.cfg_desc_handle); + + /* free configuration stream */ + dma_free_coherent(jpeg->dev, MXC_JPEG_MAX_CFG_STREAM, + jpeg->slot_data.cfg_stream_vaddr, + jpeg->slot_data.cfg_stream_handle); + + jpeg->slot_data.used = false; +} + static bool mxc_jpeg_alloc_slot_data(struct mxc_jpeg_dev *jpeg) { struct mxc_jpeg_desc *desc; @@ -798,26 +818,6 @@ err: return false; } -static void mxc_jpeg_free_slot_data(struct mxc_jpeg_dev *jpeg) -{ - /* free descriptor for decoding/encoding phase */ - dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), - jpeg->slot_data.desc, - jpeg->slot_data.desc_handle); - - /* free descriptor for encoder configuration phase / decoder DHT */ - dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), - jpeg->slot_data.cfg_desc, - jpeg->slot_data.cfg_desc_handle); - - /* free configuration stream */ - dma_free_coherent(jpeg->dev, MXC_JPEG_MAX_CFG_STREAM, - jpeg->slot_data.cfg_stream_vaddr, - jpeg->slot_data.cfg_stream_handle); - - jpeg->slot_data.used = false; -} - static void mxc_jpeg_check_and_set_last_buffer(struct mxc_jpeg_ctx *ctx, struct vb2_v4l2_buffer *src_buf, struct vb2_v4l2_buffer *dst_buf) -- GitLab From 9df9d453651e7b8c6fab71f93d2abce7d59a6824 Mon Sep 17 00:00:00 2001 From: Ming Qian Date: Mon, 21 Apr 2025 16:12:53 +0800 Subject: [PATCH 1279/2211] media: imx-jpeg: Reset slot data pointers when freed commit faa8051b128f4b34277ea8a026d02d83826f8122 upstream. Ensure that the slot data pointers are reset to NULL and handles are set to 0 after freeing the coherent memory. This makes he function mxc_jpeg_alloc_slot_data() and mxc_jpeg_free_slot_data() safe to be called multiple times. Fixes: 2db16c6ed72c ("media: imx-jpeg: Add V4L2 driver for i.MX8 JPEG Encoder/Decoder") Cc: stable@vger.kernel.org Signed-off-by: Ming Qian Reviewed-by: Nicolas Dufresne Reviewed-by: Frank Li Signed-off-by: Nicolas Dufresne Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c index 38033ed169e53..09087a26014da 100644 --- a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c +++ b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c @@ -758,16 +758,22 @@ static void mxc_jpeg_free_slot_data(struct mxc_jpeg_dev *jpeg) dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), jpeg->slot_data.desc, jpeg->slot_data.desc_handle); + jpeg->slot_data.desc = NULL; + jpeg->slot_data.desc_handle = 0; /* free descriptor for encoder configuration phase / decoder DHT */ dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc), jpeg->slot_data.cfg_desc, jpeg->slot_data.cfg_desc_handle); + jpeg->slot_data.cfg_desc_handle = 0; + jpeg->slot_data.cfg_desc = NULL; /* free configuration stream */ dma_free_coherent(jpeg->dev, MXC_JPEG_MAX_CFG_STREAM, jpeg->slot_data.cfg_stream_vaddr, jpeg->slot_data.cfg_stream_handle); + jpeg->slot_data.cfg_stream_vaddr = NULL; + jpeg->slot_data.cfg_stream_handle = 0; jpeg->slot_data.used = false; } -- GitLab From 0ee9469f818a0b4de3c0e7aecd733c103820d181 Mon Sep 17 00:00:00 2001 From: Ming Qian Date: Mon, 21 Apr 2025 16:12:54 +0800 Subject: [PATCH 1280/2211] media: imx-jpeg: Cleanup after an allocation error commit 7500bb9cf164edbb2c8117d57620227b1a4a8369 upstream. When allocation failures are not cleaned up by the driver, further allocation errors will be false-positives, which will cause buffers to remain uninitialized and cause NULL pointer dereferences. Ensure proper cleanup of failed allocations to prevent these issues. Fixes: 2db16c6ed72c ("media: imx-jpeg: Add V4L2 driver for i.MX8 JPEG Encoder/Decoder") Cc: stable@vger.kernel.org Signed-off-by: Ming Qian Reviewed-by: Frank Li Signed-off-by: Nicolas Dufresne Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c index 09087a26014da..73be1013edd0c 100644 --- a/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c +++ b/drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c @@ -820,6 +820,7 @@ skip_alloc: return true; err: dev_err(jpeg->dev, "Could not allocate descriptors for slot %d", jpeg->slot_data.slot); + mxc_jpeg_free_slot_data(jpeg); return false; } -- GitLab From b52dc88361299bdb271b7e75cd193e17a477cfba Mon Sep 17 00:00:00 2001 From: Ricardo Ribalda Date: Mon, 24 Feb 2025 10:34:53 +0000 Subject: [PATCH 1281/2211] media: uvcvideo: Return the number of processed controls commit ba4fafb02ad6a4eb2e00f861893b5db42ba54369 upstream. If we let know our callers that we have not done anything, they will be able to optimize their decisions. Cc: stable@kernel.org Fixes: b4012002f3a3 ("[media] uvcvideo: Add support for control events") Reviewed-by: Laurent Pinchart Signed-off-by: Ricardo Ribalda Message-ID: <20250224-uvc-data-backup-v2-1-de993ed9823b@chromium.org> Signed-off-by: Hans de Goede Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/usb/uvc/uvc_ctrl.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index 58d1bc80253e8..3030e5a893e2d 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1830,12 +1830,17 @@ int uvc_ctrl_begin(struct uvc_video_chain *chain) return mutex_lock_interruptible(&chain->ctrl_mutex) ? -ERESTARTSYS : 0; } +/* + * Returns the number of uvc controls that have been correctly set, or a + * negative number if there has been an error. + */ static int uvc_ctrl_commit_entity(struct uvc_device *dev, struct uvc_fh *handle, struct uvc_entity *entity, int rollback, struct uvc_control **err_ctrl) { + unsigned int processed_ctrls = 0; struct uvc_control *ctrl; unsigned int i; int ret; @@ -1870,6 +1875,9 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev, else ret = 0; + if (!ret) + processed_ctrls++; + if (rollback || ret < 0) memcpy(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), uvc_ctrl_data(ctrl, UVC_CTRL_DATA_BACKUP), @@ -1888,7 +1896,7 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev, uvc_ctrl_set_handle(handle, ctrl, handle); } - return 0; + return processed_ctrls; } static int uvc_ctrl_find_ctrl_idx(struct uvc_entity *entity, @@ -1935,6 +1943,7 @@ int __uvc_ctrl_commit(struct uvc_fh *handle, int rollback, if (!rollback) uvc_ctrl_send_events(handle, ctrls->controls, ctrls->count); + ret = 0; done: mutex_unlock(&chain->ctrl_mutex); return ret; -- GitLab From 6d2b12e7c52160ddc03b9e0892fee233404e9529 Mon Sep 17 00:00:00 2001 From: Ricardo Ribalda Date: Mon, 24 Feb 2025 10:34:54 +0000 Subject: [PATCH 1282/2211] media: uvcvideo: Send control events for partial succeeds commit 5c791467aea6277430da5f089b9b6c2a9d8a4af7 upstream. Today, when we are applying a change to entities A, B. If A succeeds and B fails the events for A are not sent. This change changes the code so the events for A are send right after they happen. Cc: stable@kernel.org Fixes: b4012002f3a3 ("[media] uvcvideo: Add support for control events") Signed-off-by: Ricardo Ribalda Message-ID: <20250224-uvc-data-backup-v2-2-de993ed9823b@chromium.org> Signed-off-by: Hans de Goede Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/usb/uvc/uvc_ctrl.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index 3030e5a893e2d..c70d9c24c6fb3 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1689,7 +1689,9 @@ static bool uvc_ctrl_xctrls_has_control(const struct v4l2_ext_control *xctrls, } static void uvc_ctrl_send_events(struct uvc_fh *handle, - const struct v4l2_ext_control *xctrls, unsigned int xctrls_count) + struct uvc_entity *entity, + const struct v4l2_ext_control *xctrls, + unsigned int xctrls_count) { struct uvc_control_mapping *mapping; struct uvc_control *ctrl; @@ -1700,6 +1702,9 @@ static void uvc_ctrl_send_events(struct uvc_fh *handle, u32 changes = V4L2_EVENT_CTRL_CH_VALUE; ctrl = uvc_find_control(handle->chain, xctrls[i].id, &mapping); + if (ctrl->entity != entity) + continue; + if (ctrl->info.flags & UVC_CTRL_FLAG_ASYNCHRONOUS) /* Notification will be sent from an Interrupt event. */ continue; @@ -1938,11 +1943,12 @@ int __uvc_ctrl_commit(struct uvc_fh *handle, int rollback, uvc_ctrl_find_ctrl_idx(entity, ctrls, err_ctrl); goto done; + } else if (ret > 0 && !rollback) { + uvc_ctrl_send_events(handle, entity, + ctrls->controls, ctrls->count); } } - if (!rollback) - uvc_ctrl_send_events(handle, ctrls->controls, ctrls->count); ret = 0; done: mutex_unlock(&chain->ctrl_mutex); -- GitLab From aac91ae06c473be34dfaf2f83498275a6846ed28 Mon Sep 17 00:00:00 2001 From: Ricardo Ribalda Date: Thu, 13 Mar 2025 12:20:39 +0000 Subject: [PATCH 1283/2211] media: uvcvideo: Fix deferred probing error commit 387e8939307192d5a852a2afeeb83427fa477151 upstream. uvc_gpio_parse() can return -EPROBE_DEFER when the GPIOs it depends on have not yet been probed. This return code should be propagated to the caller of uvc_probe() to ensure that probing is retried when the required GPIOs become available. Currently, this error code is incorrectly converted to -ENODEV, causing some internal cameras to be ignored. This commit fixes this issue by propagating the -EPROBE_DEFER error. Cc: stable@vger.kernel.org Fixes: 2886477ff987 ("media: uvcvideo: Implement UVC_EXT_GPIO_UNIT") Reviewed-by: Douglas Anderson Signed-off-by: Ricardo Ribalda Message-ID: <20250313-uvc-eprobedefer-v3-1-a1d312708eef@chromium.org> Reviewed-by: Hans de Goede Signed-off-by: Hans de Goede Signed-off-by: Hans Verkuil Signed-off-by: Greg Kroah-Hartman --- drivers/media/usb/uvc/uvc_driver.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c index a0d683d266471..241b3f95f3270 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2217,13 +2217,16 @@ static int uvc_probe(struct usb_interface *intf, #endif /* Parse the Video Class control descriptor. */ - if (uvc_parse_control(dev) < 0) { + ret = uvc_parse_control(dev); + if (ret < 0) { + ret = -ENODEV; uvc_dbg(dev, PROBE, "Unable to parse UVC descriptors\n"); goto error; } /* Parse the associated GPIOs. */ - if (uvc_gpio_parse(dev) < 0) { + ret = uvc_gpio_parse(dev); + if (ret < 0) { uvc_dbg(dev, PROBE, "Unable to parse UVC GPIOs\n"); goto error; } @@ -2249,24 +2252,32 @@ static int uvc_probe(struct usb_interface *intf, } /* Register the V4L2 device. */ - if (v4l2_device_register(&intf->dev, &dev->vdev) < 0) + ret = v4l2_device_register(&intf->dev, &dev->vdev); + if (ret < 0) goto error; /* Scan the device for video chains. */ - if (uvc_scan_device(dev) < 0) + if (uvc_scan_device(dev) < 0) { + ret = -ENODEV; goto error; + } /* Initialize controls. */ - if (uvc_ctrl_init_device(dev) < 0) + if (uvc_ctrl_init_device(dev) < 0) { + ret = -ENODEV; goto error; + } /* Register video device nodes. */ - if (uvc_register_chains(dev) < 0) + if (uvc_register_chains(dev) < 0) { + ret = -ENODEV; goto error; + } #ifdef CONFIG_MEDIA_CONTROLLER /* Register the media device node */ - if (media_device_register(&dev->mdev) < 0) + ret = media_device_register(&dev->mdev); + if (ret < 0) goto error; #endif /* Save our data pointer in the interface data. */ @@ -2300,7 +2311,7 @@ static int uvc_probe(struct usb_interface *intf, error: uvc_unregister_video(dev); kref_put(&dev->ref, uvc_delete); - return -ENODEV; + return ret; } static void uvc_disconnect(struct usb_interface *intf) -- GitLab From 86d9837e46c0962b7ca8d2e6e5f925bf9a50e0b0 Mon Sep 17 00:00:00 2001 From: Ryan Roberts Date: Fri, 30 May 2025 16:23:47 +0100 Subject: [PATCH 1284/2211] arm64/mm: Close theoretical race where stale TLB entry remains valid commit 4b634918384c0f84c33aeb4dd9fd4c38e7be5ccb upstream. Commit 3ea277194daa ("mm, mprotect: flush TLB if potentially racing with a parallel reclaim leaving stale TLB entries") describes a race that, prior to the commit, could occur between reclaim and operations such as mprotect() when using reclaim's tlbbatch mechanism. See that commit for details but the summary is: """ Nadav Amit identified a theoritical race between page reclaim and mprotect due to TLB flushes being batched outside of the PTL being held. He described the race as follows: CPU0 CPU1 ---- ---- user accesses memory using RW PTE [PTE now cached in TLB] try_to_unmap_one() ==> ptep_get_and_clear() ==> set_tlb_ubc_flush_pending() mprotect(addr, PROT_READ) ==> change_pte_range() ==> [ PTE non-present - no flush ] user writes using cached RW PTE ... try_to_unmap_flush() """ The solution was to insert flush_tlb_batched_pending() in mprotect() and friends to explcitly drain any pending reclaim TLB flushes. In the modern version of this solution, arch_flush_tlb_batched_pending() is called to do that synchronisation. arm64's tlbbatch implementation simply issues TLBIs at queue-time (arch_tlbbatch_add_pending()), eliding the trailing dsb(ish). The trailing dsb(ish) is finally issued in arch_tlbbatch_flush() at the end of the batch to wait for all the issued TLBIs to complete. Now, the Arm ARM states: """ The completion of the TLB maintenance instruction is guaranteed only by the execution of a DSB by the observer that performed the TLB maintenance instruction. The execution of a DSB by a different observer does not have this effect, even if the DSB is known to be executed after the TLB maintenance instruction is observed by that different observer. """ arch_tlbbatch_add_pending() and arch_tlbbatch_flush() conform to this requirement because they are called from the same task (either kswapd or caller of madvise(MADV_PAGEOUT)), so either they are on the same CPU or if the task was migrated, __switch_to() contains an extra dsb(ish). HOWEVER, arm64's arch_flush_tlb_batched_pending() is also implemented as a dsb(ish). But this may be running on a CPU remote from the one that issued the outstanding TLBIs. So there is no architectural gurantee of synchonization. Therefore we are still vulnerable to the theoretical race described in Commit 3ea277194daa ("mm, mprotect: flush TLB if potentially racing with a parallel reclaim leaving stale TLB entries"). Fix this by flushing the entire mm in arch_flush_tlb_batched_pending(). This aligns with what the other arches that implement the tlbbatch feature do. Cc: Fixes: 43b3dfdd0455 ("arm64: support batched/deferred tlb shootdown during page reclamation/migration") Signed-off-by: Ryan Roberts Link: https://lore.kernel.org/r/20250530152445.2430295-1-ryan.roberts@arm.com Signed-off-by: Will Deacon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/include/asm/tlbflush.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/arch/arm64/include/asm/tlbflush.h b/arch/arm64/include/asm/tlbflush.h index 9edbd871c31bf..5f12cdc2b9671 100644 --- a/arch/arm64/include/asm/tlbflush.h +++ b/arch/arm64/include/asm/tlbflush.h @@ -330,13 +330,14 @@ static inline void arch_tlbbatch_add_pending(struct arch_tlbflush_unmap_batch *b } /* - * If mprotect/munmap/etc occurs during TLB batched flushing, we need to - * synchronise all the TLBI issued with a DSB to avoid the race mentioned in - * flush_tlb_batched_pending(). + * If mprotect/munmap/etc occurs during TLB batched flushing, we need to ensure + * all the previously issued TLBIs targeting mm have completed. But since we + * can be executing on a remote CPU, a DSB cannot guarantee this like it can + * for arch_tlbbatch_flush(). Our only option is to flush the entire mm. */ static inline void arch_flush_tlb_batched_pending(struct mm_struct *mm) { - dsb(ish); + flush_tlb_mm(mm); } /* -- GitLab From 1c4026344310977cedda6f1eae308e18919390c2 Mon Sep 17 00:00:00 2001 From: Ross Stutterheim Date: Wed, 16 Apr 2025 14:50:06 +0100 Subject: [PATCH 1285/2211] ARM: 9447/1: arm/memremap: fix arch_memremap_can_ram_remap() commit 96e0b355883006554a0bee3697da475971d6bba8 upstream. arm/memremap: fix arch_memremap_can_ram_remap() commit 260364d112bc ("arm[64]/memremap: don't abuse pfn_valid() to ensure presence of linear map") added the definition of arch_memremap_can_ram_remap() for arm[64] specific filtering of what pages can be used from the linear mapping. memblock_is_map_memory() was called with the pfn of the address given to arch_memremap_can_ram_remap(); however, memblock_is_map_memory() expects to be given an address for arm, not a pfn. This results in calls to memremap() returning a newly mapped area when it should return an address in the existing linear mapping. Fix this by removing the address to pfn translation and pass the address directly. Fixes: 260364d112bc ("arm[64]/memremap: don't abuse pfn_valid() to ensure presence of linear map") Signed-off-by: Ross Stutterheim Cc: Mike Rapoport Cc: stable@vger.kernel.org Reviewed-by: Catalin Marinas Reviewed-by: Linus Walleij Signed-off-by: Russell King (Oracle) Signed-off-by: Greg Kroah-Hartman --- arch/arm/mm/ioremap.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index 89f1c97f3079c..cbf5a03d2b189 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c @@ -515,7 +515,5 @@ void __init early_ioremap_init(void) bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size, unsigned long flags) { - unsigned long pfn = PHYS_PFN(offset); - - return memblock_is_map_memory(pfn); + return memblock_is_map_memory(offset); } -- GitLab From 5626fefb46aef21305858b1d88cd49e5074b60f4 Mon Sep 17 00:00:00 2001 From: Andreas Kemnade Date: Mon, 31 Mar 2025 16:44:39 +0200 Subject: [PATCH 1286/2211] ARM: omap: pmic-cpcap: do not mess around without CPCAP or OMAP4 commit 7397daf1029d5bfd3415ec8622f5179603d5702d upstream. The late init call just writes to omap4 registers as soon as CONFIG_MFD_CPCAP is enabled without checking whether the cpcap driver is actually there or the SoC is indeed an OMAP4. Rather do these things only with the right device combination. Fixes booting the BT200 with said configuration enabled and non-factory X-Loader and probably also some surprising behavior on other devices. Fixes: c145649bf262 ("ARM: OMAP2+: Configure voltage controller for cpcap to low-speed") CC: stable@vger.kernel.org Signed-off-by: Andreas Kemnade Reivewed-by: Tony Lindgren Link: https://lore.kernel.org/r/20250331144439.769697-1-andreas@kemnade.info Signed-off-by: Kevin Hilman Signed-off-by: Greg Kroah-Hartman --- arch/arm/mach-omap2/pmic-cpcap.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-omap2/pmic-cpcap.c b/arch/arm/mach-omap2/pmic-cpcap.c index 4f31e61c0c90c..9f9a20274db84 100644 --- a/arch/arm/mach-omap2/pmic-cpcap.c +++ b/arch/arm/mach-omap2/pmic-cpcap.c @@ -264,7 +264,11 @@ int __init omap4_cpcap_init(void) static int __init cpcap_late_init(void) { - omap4_vc_set_pmic_signaling(PWRDM_POWER_RET); + if (!of_find_compatible_node(NULL, NULL, "motorola,cpcap")) + return 0; + + if (soc_is_omap443x() || soc_is_omap446x() || soc_is_omap447x()) + omap4_vc_set_pmic_signaling(PWRDM_POWER_RET); return 0; } -- GitLab From c8228b5f3d74fd8ad4dfc79d5d601eb6fca5e63e Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Mon, 26 May 2025 11:47:03 +0200 Subject: [PATCH 1287/2211] ASoC: codecs: wcd9375: Fix double free of regulator supplies commit 63fe298652d4eda07d738bfcbbc59d1343a675ef upstream. Driver gets regulator supplies in probe path with devm_regulator_bulk_get(), so should not call regulator_bulk_free() in error and remove paths to avoid double free. Fixes: 216d04139a6d ("ASoC: codecs: wcd937x: Remove separate handling for vdd-buck supply") Cc: stable@vger.kernel.org Signed-off-by: Krzysztof Kozlowski Link: https://patch.msgid.link/20250526-b4-b4-asoc-wcd9395-vdd-px-fixes-v1-3-0b8a2993b7d3@linaro.org Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- sound/soc/codecs/wcd937x.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/sound/soc/codecs/wcd937x.c b/sound/soc/codecs/wcd937x.c index 9c1997a42334d..1b3ebd6fe42c9 100644 --- a/sound/soc/codecs/wcd937x.c +++ b/sound/soc/codecs/wcd937x.c @@ -2897,10 +2897,8 @@ static int wcd937x_probe(struct platform_device *pdev) return dev_err_probe(dev, ret, "Failed to get supplies\n"); ret = regulator_bulk_enable(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); - if (ret) { - regulator_bulk_free(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); + if (ret) return dev_err_probe(dev, ret, "Failed to enable supplies\n"); - } wcd937x_dt_parse_micbias_info(dev, wcd937x); @@ -2936,7 +2934,6 @@ static int wcd937x_probe(struct platform_device *pdev) err_disable_regulators: regulator_bulk_disable(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); - regulator_bulk_free(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); return ret; } @@ -2953,7 +2950,6 @@ static void wcd937x_remove(struct platform_device *pdev) pm_runtime_dont_use_autosuspend(dev); regulator_bulk_disable(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); - regulator_bulk_free(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); } #if defined(CONFIG_OF) -- GitLab From 6e1276195f176a2689fc6c67d44a2305839e0020 Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Mon, 26 May 2025 11:47:02 +0200 Subject: [PATCH 1288/2211] ASoC: codecs: wcd937x: Drop unused buck_supply commit dc59189d32fc3dbddcf418fd4b418fb61f24ade6 upstream. Last user of wcd937x_priv->buck_supply was removed in commit 216d04139a6d ("ASoC: codecs: wcd937x: Remove separate handling for vdd-buck supply"). Fixes: 216d04139a6d ("ASoC: codecs: wcd937x: Remove separate handling for vdd-buck supply") Cc: stable@vger.kernel.org Signed-off-by: Krzysztof Kozlowski Link: https://patch.msgid.link/20250526-b4-b4-asoc-wcd9395-vdd-px-fixes-v1-2-0b8a2993b7d3@linaro.org Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- sound/soc/codecs/wcd937x.c | 1 - 1 file changed, 1 deletion(-) diff --git a/sound/soc/codecs/wcd937x.c b/sound/soc/codecs/wcd937x.c index 1b3ebd6fe42c9..1df827a084cac 100644 --- a/sound/soc/codecs/wcd937x.c +++ b/sound/soc/codecs/wcd937x.c @@ -92,7 +92,6 @@ struct wcd937x_priv { struct regmap_irq_chip *wcd_regmap_irq_chip; struct regmap_irq_chip_data *irq_chip; struct regulator_bulk_data supplies[WCD937X_MAX_BULK_SUPPLY]; - struct regulator *buck_supply; struct snd_soc_jack *jack; unsigned long status_mask; s32 micb_ref[WCD937X_MAX_MICBIAS]; -- GitLab From 5538af384318bd099728f45f912b09d1932f2c3c Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 11 Jun 2025 08:48:46 -0600 Subject: [PATCH 1289/2211] block: use plug request list tail for one-shot backmerge attempt commit 961296e89dc3800e6a3abc3f5d5bb4192cf31e98 upstream. Previously, the block layer stored the requests in the plug list in LIFO order. For this reason, blk_attempt_plug_merge() would check just the head entry for a back merge attempt, and abort after that unless requests for multiple queues existed in the plug list. If more than one request is present in the plug list, this makes the one-shot back merging less useful than before, as it'll always fail to find a quick merge candidate. Use the tail entry for the one-shot merge attempt, which is the last added request in the list. If that fails, abort immediately unless there are multiple queues available. If multiple queues are available, then scan the list. Ideally the latter scan would be a backwards scan of the list, but as it currently stands, the plug list is singly linked and hence this isn't easily feasible. Cc: stable@vger.kernel.org Link: https://lore.kernel.org/linux-block/20250611121626.7252-1-abuehaze@amazon.com/ Reported-by: Hazem Mohamed Abuelfotoh Fixes: e70c301faece ("block: don't reorder requests in blk_add_rq_to_plug") Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- block/blk-merge.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/block/blk-merge.c b/block/blk-merge.c index f575cc1705b3f..7ddd7dd23dda8 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -1180,20 +1180,20 @@ bool blk_attempt_plug_merge(struct request_queue *q, struct bio *bio, if (!plug || rq_list_empty(&plug->mq_list)) return false; - rq_list_for_each(&plug->mq_list, rq) { - if (rq->q == q) { - if (blk_attempt_bio_merge(q, rq, bio, nr_segs, false) == - BIO_MERGE_OK) - return true; - break; - } + rq = plug->mq_list.tail; + if (rq->q == q) + return blk_attempt_bio_merge(q, rq, bio, nr_segs, false) == + BIO_MERGE_OK; + else if (!plug->multiple_queues) + return false; - /* - * Only keep iterating plug list for merges if we have multiple - * queues - */ - if (!plug->multiple_queues) - break; + rq_list_for_each(&plug->mq_list, rq) { + if (rq->q != q) + continue; + if (blk_attempt_bio_merge(q, rq, bio, nr_segs, false) == + BIO_MERGE_OK) + return true; + break; } return false; } -- GitLab From 943801c3800594b1ae04a2746ec50effa2f6df49 Mon Sep 17 00:00:00 2001 From: Damien Le Moal Date: Wed, 11 Jun 2025 09:59:15 +0900 Subject: [PATCH 1290/2211] block: Clear BIO_EMULATES_ZONE_APPEND flag on BIO completion commit f705d33c2f0353039d03e5d6f18f70467d86080e upstream. When blk_zone_write_plug_bio_endio() is called for a regular write BIO used to emulate a zone append operation, that is, a BIO flagged with BIO_EMULATES_ZONE_APPEND, the BIO operation code is restored to the original REQ_OP_ZONE_APPEND but the BIO_EMULATES_ZONE_APPEND flag is not cleared. Clear it to fully return the BIO to its orginal definition. Fixes: 9b1ce7f0c6f8 ("block: Implement zone append emulation") Cc: stable@vger.kernel.org Signed-off-by: Damien Le Moal Reviewed-by: Johannes Thumshirn Reviewed-by: Hannes Reinecke Reviewed-by: Christoph Hellwig Link: https://lore.kernel.org/r/20250611005915.89843-1-dlemoal@kernel.org Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- block/blk-zoned.c | 1 + 1 file changed, 1 insertion(+) diff --git a/block/blk-zoned.c b/block/blk-zoned.c index 164ded9eb1444..d84946eb2f21e 100644 --- a/block/blk-zoned.c +++ b/block/blk-zoned.c @@ -1240,6 +1240,7 @@ void blk_zone_write_plug_bio_endio(struct bio *bio) if (bio_flagged(bio, BIO_EMULATES_ZONE_APPEND)) { bio->bi_opf &= ~REQ_OP_MASK; bio->bi_opf |= REQ_OP_ZONE_APPEND; + bio_clear_flag(bio, BIO_EMULATES_ZONE_APPEND); } /* -- GitLab From f704a80d9fa268e51a6cc5242714502c3c1fa605 Mon Sep 17 00:00:00 2001 From: Sumit Kumar Date: Wed, 9 Apr 2025 16:17:43 +0530 Subject: [PATCH 1291/2211] bus: mhi: ep: Update read pointer only after buffer is written commit 6f18d174b73d0ceeaa341f46c0986436b3aefc9a upstream. Inside mhi_ep_ring_add_element, the read pointer (rd_offset) is updated before the buffer is written, potentially causing race conditions where the host sees an updated read pointer before the buffer is actually written. Updating rd_offset prematurely can lead to the host accessing an uninitialized or incomplete element, resulting in data corruption. Invoke the buffer write before updating rd_offset to ensure the element is fully written before signaling its availability. Fixes: bbdcba57a1a2 ("bus: mhi: ep: Add support for ring management") cc: stable@vger.kernel.org Co-developed-by: Youssef Samir Signed-off-by: Youssef Samir Signed-off-by: Sumit Kumar Reviewed-by: Jeff Hugo Reviewed-by: Krishna Chaitanya Chundru Reviewed-by: Manivannan Sadhasivam Link: https://patch.msgid.link/20250409-rp_fix-v1-1-8cf1fa22ed28@quicinc.com Signed-off-by: Manivannan Sadhasivam Signed-off-by: Greg Kroah-Hartman --- drivers/bus/mhi/ep/ring.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/bus/mhi/ep/ring.c b/drivers/bus/mhi/ep/ring.c index aeb53b2c34a8c..26357ee68dee9 100644 --- a/drivers/bus/mhi/ep/ring.c +++ b/drivers/bus/mhi/ep/ring.c @@ -131,19 +131,23 @@ int mhi_ep_ring_add_element(struct mhi_ep_ring *ring, struct mhi_ring_element *e } old_offset = ring->rd_offset; - mhi_ep_ring_inc_index(ring); dev_dbg(dev, "Adding an element to ring at offset (%zu)\n", ring->rd_offset); + buf_info.host_addr = ring->rbase + (old_offset * sizeof(*el)); + buf_info.dev_addr = el; + buf_info.size = sizeof(*el); + + ret = mhi_cntrl->write_sync(mhi_cntrl, &buf_info); + if (ret) + return ret; + + mhi_ep_ring_inc_index(ring); /* Update rp in ring context */ rp = cpu_to_le64(ring->rd_offset * sizeof(*el) + ring->rbase); memcpy_toio((void __iomem *) &ring->ring_ctx->generic.rp, &rp, sizeof(u64)); - buf_info.host_addr = ring->rbase + (old_offset * sizeof(*el)); - buf_info.dev_addr = el; - buf_info.size = sizeof(*el); - - return mhi_cntrl->write_sync(mhi_cntrl, &buf_info); + return ret; } void mhi_ep_ring_init(struct mhi_ep_ring *ring, enum mhi_ep_ring_type type, u32 id) -- GitLab From 896bbceebf99de7a1d34dad12c85d7489228c6f3 Mon Sep 17 00:00:00 2001 From: Jeff Hugo Date: Fri, 28 Mar 2025 10:35:26 -0600 Subject: [PATCH 1292/2211] bus: mhi: host: Fix conflict between power_up and SYSERR commit 4d92e7c5ccadc79764674ffc2c88d329aabbb7e0 upstream. When mhi_async_power_up() enables IRQs, it is possible that we could receive a SYSERR notification from the device if the firmware has crashed for some reason. Then the SYSERR notification queues a work item that cannot execute until the pm_mutex is released by mhi_async_power_up(). So the SYSERR work item will be pending. If mhi_async_power_up() detects the SYSERR, it will handle it. If the device is in PBL, then the PBL state transition event will be queued, resulting in a work item after the pending SYSERR work item. Once mhi_async_power_up() releases the pm_mutex, the SYSERR work item can run. It will blindly attempt to reset the MHI state machine, which is the recovery action for SYSERR. PBL/SBL are not interrupt driven and will ignore the MHI Reset unless SYSERR is actively advertised. This will cause the SYSERR work item to timeout waiting for reset to be cleared, and will leave the host state in SYSERR processing. The PBL transition work item will then run, and immediately fail because SYSERR processing is not a valid state for PBL transition. This leaves the device uninitialized. This issue has a fairly unique signature in the kernel log: mhi mhi3: Requested to power ON Qualcomm Cloud AI 100 0000:36:00.0: Fatal error received from device. Attempting to recover mhi mhi3: Power on setup success mhi mhi3: Device failed to exit MHI Reset state mhi mhi3: Device MHI is not in valid state We cannot remove the SYSERR handling from mhi_async_power_up() because the device may be in the SYSERR state, but we missed the notification as the irq was fired before irqs were enabled. We also can't queue the SYSERR work item from mhi_async_power_up() if SYSERR is detected because that may result in a duplicate work item, and cause the same issue since the duplicate item will blindly issue MHI reset even if SYSERR is no longer active. Instead, add a check in the SYSERR work item to make sure that MHI reset is only issued if the device is in SYSERR state for PBL or SBL EEs. Fixes: a6e2e3522f29 ("bus: mhi: core: Add support for PM state transitions") Signed-off-by: Jeffrey Hugo Signed-off-by: Jeff Hugo Signed-off-by: Manivannan Sadhasivam Reviewed-by: Troy Hanson Reviewed-by: Manivannan Sadhasivam cc: stable@vger.kernel.org Link: https://patch.msgid.link/20250328163526.3365497-1-jeff.hugo@oss.qualcomm.com Signed-off-by: Greg Kroah-Hartman --- drivers/bus/mhi/host/pm.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/bus/mhi/host/pm.c b/drivers/bus/mhi/host/pm.c index 11c0e751f2239..0ccbcb717955a 100644 --- a/drivers/bus/mhi/host/pm.c +++ b/drivers/bus/mhi/host/pm.c @@ -602,6 +602,7 @@ static void mhi_pm_sys_error_transition(struct mhi_controller *mhi_cntrl) struct mhi_cmd *mhi_cmd; struct mhi_event_ctxt *er_ctxt; struct device *dev = &mhi_cntrl->mhi_dev->dev; + bool reset_device = false; int ret, i; dev_dbg(dev, "Transitioning from PM state: %s to: %s\n", @@ -630,8 +631,23 @@ static void mhi_pm_sys_error_transition(struct mhi_controller *mhi_cntrl) /* Wake up threads waiting for state transition */ wake_up_all(&mhi_cntrl->state_event); - /* Trigger MHI RESET so that the device will not access host memory */ if (MHI_REG_ACCESS_VALID(prev_state)) { + /* + * If the device is in PBL or SBL, it will only respond to + * RESET if the device is in SYSERR state. SYSERR might + * already be cleared at this point. + */ + enum mhi_state cur_state = mhi_get_mhi_state(mhi_cntrl); + enum mhi_ee_type cur_ee = mhi_get_exec_env(mhi_cntrl); + + if (cur_state == MHI_STATE_SYS_ERR) + reset_device = true; + else if (cur_ee != MHI_EE_PBL && cur_ee != MHI_EE_SBL) + reset_device = true; + } + + /* Trigger MHI RESET so that the device will not access host memory */ + if (reset_device) { u32 in_reset = -1; unsigned long timeout = msecs_to_jiffies(mhi_cntrl->timeout_ms); -- GitLab From d8a054b6e6824a8b52c3977ebd38c9583a63efac Mon Sep 17 00:00:00 2001 From: Fedor Pchelkin Date: Wed, 28 May 2025 22:27:12 +0300 Subject: [PATCH 1293/2211] can: kvaser_pciefd: refine error prone echo_skb_max handling logic commit 54ec8b08216f3be2cc98b33633d3c8ea79749895 upstream. echo_skb_max should define the supported upper limit of echo_skb[] allocated inside the netdevice's priv. The corresponding size value provided by this driver to alloc_candev() is KVASER_PCIEFD_CAN_TX_MAX_COUNT which is 17. But later echo_skb_max is rounded up to the nearest power of two (for the max case, that would be 32) and the tx/ack indices calculated further during tx/rx may exceed the upper array boundary. Kasan reported this for the ack case inside kvaser_pciefd_handle_ack_packet(), though the xmit function has actually caught the same thing earlier. BUG: KASAN: slab-out-of-bounds in kvaser_pciefd_handle_ack_packet+0x2d7/0x92a drivers/net/can/kvaser_pciefd.c:1528 Read of size 8 at addr ffff888105e4f078 by task swapper/4/0 CPU: 4 UID: 0 PID: 0 Comm: swapper/4 Not tainted 6.15.0 #12 PREEMPT(voluntary) Call Trace: dump_stack_lvl lib/dump_stack.c:122 print_report mm/kasan/report.c:521 kasan_report mm/kasan/report.c:634 kvaser_pciefd_handle_ack_packet drivers/net/can/kvaser_pciefd.c:1528 kvaser_pciefd_read_packet drivers/net/can/kvaser_pciefd.c:1605 kvaser_pciefd_read_buffer drivers/net/can/kvaser_pciefd.c:1656 kvaser_pciefd_receive_irq drivers/net/can/kvaser_pciefd.c:1684 kvaser_pciefd_irq_handler drivers/net/can/kvaser_pciefd.c:1733 __handle_irq_event_percpu kernel/irq/handle.c:158 handle_irq_event kernel/irq/handle.c:210 handle_edge_irq kernel/irq/chip.c:833 __common_interrupt arch/x86/kernel/irq.c:296 common_interrupt arch/x86/kernel/irq.c:286 Tx max count definitely matters for kvaser_pciefd_tx_avail(), but for seq numbers' generation that's not the case - we're free to calculate them as would be more convenient, not taking tx max count into account. The only downside is that the size of echo_skb[] should correspond to the max seq number (not tx max count), so in some situations a bit more memory would be consumed than could be. Thus make the size of the underlying echo_skb[] sufficient for the rounded max tx value. Found by Linux Verification Center (linuxtesting.org) with Syzkaller. Fixes: 8256e0ca6010 ("can: kvaser_pciefd: Fix echo_skb race") Cc: stable@vger.kernel.org Signed-off-by: Fedor Pchelkin Link: https://patch.msgid.link/20250528192713.63894-1-pchelkin@ispras.ru Signed-off-by: Marc Kleine-Budde Signed-off-by: Greg Kroah-Hartman --- drivers/net/can/kvaser_pciefd.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c index 3cf1007805995..3fa83f05bfcc8 100644 --- a/drivers/net/can/kvaser_pciefd.c +++ b/drivers/net/can/kvaser_pciefd.c @@ -966,7 +966,7 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie) u32 status, tx_nr_packets_max; netdev = alloc_candev(sizeof(struct kvaser_pciefd_can), - KVASER_PCIEFD_CAN_TX_MAX_COUNT); + roundup_pow_of_two(KVASER_PCIEFD_CAN_TX_MAX_COUNT)); if (!netdev) return -ENOMEM; @@ -995,7 +995,6 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie) can->tx_max_count = min(KVASER_PCIEFD_CAN_TX_MAX_COUNT, tx_nr_packets_max - 1); can->can.clock.freq = pcie->freq; - can->can.echo_skb_max = roundup_pow_of_two(can->tx_max_count); spin_lock_init(&can->lock); can->can.bittiming_const = &kvaser_pciefd_bittiming_const; -- GitLab From 04e93f75b1e57f663b1f117a629ebaf329d32510 Mon Sep 17 00:00:00 2001 From: Brett Werling Date: Thu, 12 Jun 2025 14:18:25 -0500 Subject: [PATCH 1294/2211] can: tcan4x5x: fix power regulator retrieval during probe commit db22720545207f734aaa9d9f71637bfc8b0155e0 upstream. Fixes the power regulator retrieval in tcan4x5x_can_probe() by ensuring the regulator pointer is not set to NULL in the successful return from devm_regulator_get_optional(). Fixes: 3814ca3a10be ("can: tcan4x5x: tcan4x5x_can_probe(): turn on the power before parsing the config") Signed-off-by: Brett Werling Link: https://patch.msgid.link/20250612191825.3646364-1-brett.werling@garmin.com Cc: stable@vger.kernel.org Signed-off-by: Marc Kleine-Budde Signed-off-by: Greg Kroah-Hartman --- drivers/net/can/m_can/tcan4x5x-core.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/net/can/m_can/tcan4x5x-core.c b/drivers/net/can/m_can/tcan4x5x-core.c index 2f73bf3abad88..b6c5c8bab7390 100644 --- a/drivers/net/can/m_can/tcan4x5x-core.c +++ b/drivers/net/can/m_can/tcan4x5x-core.c @@ -385,10 +385,11 @@ static int tcan4x5x_can_probe(struct spi_device *spi) priv = cdev_to_priv(mcan_class); priv->power = devm_regulator_get_optional(&spi->dev, "vsup"); - if (PTR_ERR(priv->power) == -EPROBE_DEFER) { - ret = -EPROBE_DEFER; - goto out_m_can_class_free_dev; - } else { + if (IS_ERR(priv->power)) { + if (PTR_ERR(priv->power) == -EPROBE_DEFER) { + ret = -EPROBE_DEFER; + goto out_m_can_class_free_dev; + } priv->power = NULL; } -- GitLab From 75583606aeef357a524cf6afd07f4b653ae48964 Mon Sep 17 00:00:00 2001 From: Viacheslav Dubeyko Date: Thu, 16 Jan 2025 16:30:08 -0800 Subject: [PATCH 1295/2211] ceph: avoid kernel BUG for encrypted inode with unaligned file size commit 060909278cc0a91373a20726bd3d8ce085f480a9 upstream. The generic/397 test hits a BUG_ON for the case of encrypted inode with unaligned file size (for example, 33K or 1K): [ 877.737811] run fstests generic/397 at 2025-01-03 12:34:40 [ 877.875761] libceph: mon0 (2)127.0.0.1:40674 session established [ 877.876130] libceph: client4614 fsid 19b90bca-f1ae-47a6-93dd-0b03ee637949 [ 877.991965] libceph: mon0 (2)127.0.0.1:40674 session established [ 877.992334] libceph: client4617 fsid 19b90bca-f1ae-47a6-93dd-0b03ee637949 [ 878.017234] libceph: mon0 (2)127.0.0.1:40674 session established [ 878.017594] libceph: client4620 fsid 19b90bca-f1ae-47a6-93dd-0b03ee637949 [ 878.031394] xfs_io (pid 18988) is setting deprecated v1 encryption policy; recommend upgrading to v2. [ 878.054528] libceph: mon0 (2)127.0.0.1:40674 session established [ 878.054892] libceph: client4623 fsid 19b90bca-f1ae-47a6-93dd-0b03ee637949 [ 878.070287] libceph: mon0 (2)127.0.0.1:40674 session established [ 878.070704] libceph: client4626 fsid 19b90bca-f1ae-47a6-93dd-0b03ee637949 [ 878.264586] libceph: mon0 (2)127.0.0.1:40674 session established [ 878.265258] libceph: client4629 fsid 19b90bca-f1ae-47a6-93dd-0b03ee637949 [ 878.374578] -----------[ cut here ]------------ [ 878.374586] kernel BUG at net/ceph/messenger.c:1070! [ 878.375150] Oops: invalid opcode: 0000 [#1] PREEMPT SMP NOPTI [ 878.378145] CPU: 2 UID: 0 PID: 4759 Comm: kworker/2:9 Not tainted 6.13.0-rc5+ #1 [ 878.378969] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014 [ 878.380167] Workqueue: ceph-msgr ceph_con_workfn [ 878.381639] RIP: 0010:ceph_msg_data_cursor_init+0x42/0x50 [ 878.382152] Code: 89 17 48 8b 46 70 55 48 89 47 08 c7 47 18 00 00 00 00 48 89 e5 e8 de cc ff ff 5d 31 c0 31 d2 31 f6 31 ff c3 cc cc cc cc 0f 0b <0f> 0b 0f 0b 66 2e 0f 1f 84 00 00 00 00 00 90 90 90 90 90 90 90 90 [ 878.383928] RSP: 0018:ffffb4ffc7cbbd28 EFLAGS: 00010287 [ 878.384447] RAX: ffffffff82bb9ac0 RBX: ffff981390c2f1f8 RCX: 0000000000000000 [ 878.385129] RDX: 0000000000009000 RSI: ffff981288232b58 RDI: ffff981390c2f378 [ 878.385839] RBP: ffffb4ffc7cbbe18 R08: 0000000000000000 R09: 0000000000000000 [ 878.386539] R10: 0000000000000000 R11: 0000000000000000 R12: ffff981390c2f030 [ 878.387203] R13: ffff981288232b58 R14: 0000000000000029 R15: 0000000000000001 [ 878.387877] FS: 0000000000000000(0000) GS:ffff9814b7900000(0000) knlGS:0000000000000000 [ 878.388663] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 878.389212] CR2: 00005e106a0554e0 CR3: 0000000112bf0001 CR4: 0000000000772ef0 [ 878.389921] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 878.390620] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 878.391307] PKRU: 55555554 [ 878.391567] Call Trace: [ 878.391807] [ 878.392021] ? show_regs+0x71/0x90 [ 878.392391] ? die+0x38/0xa0 [ 878.392667] ? do_trap+0xdb/0x100 [ 878.392981] ? do_error_trap+0x75/0xb0 [ 878.393372] ? ceph_msg_data_cursor_init+0x42/0x50 [ 878.393842] ? exc_invalid_op+0x53/0x80 [ 878.394232] ? ceph_msg_data_cursor_init+0x42/0x50 [ 878.394694] ? asm_exc_invalid_op+0x1b/0x20 [ 878.395099] ? ceph_msg_data_cursor_init+0x42/0x50 [ 878.395583] ? ceph_con_v2_try_read+0xd16/0x2220 [ 878.396027] ? _raw_spin_unlock+0xe/0x40 [ 878.396428] ? raw_spin_rq_unlock+0x10/0x40 [ 878.396842] ? finish_task_switch.isra.0+0x97/0x310 [ 878.397338] ? __schedule+0x44b/0x16b0 [ 878.397738] ceph_con_workfn+0x326/0x750 [ 878.398121] process_one_work+0x188/0x3d0 [ 878.398522] ? __pfx_worker_thread+0x10/0x10 [ 878.398929] worker_thread+0x2b5/0x3c0 [ 878.399310] ? __pfx_worker_thread+0x10/0x10 [ 878.399727] kthread+0xe1/0x120 [ 878.400031] ? __pfx_kthread+0x10/0x10 [ 878.400431] ret_from_fork+0x43/0x70 [ 878.400771] ? __pfx_kthread+0x10/0x10 [ 878.401127] ret_from_fork_asm+0x1a/0x30 [ 878.401543] [ 878.401760] Modules linked in: hctr2 nhpoly1305_avx2 nhpoly1305_sse2 nhpoly1305 chacha_generic chacha_x86_64 libchacha adiantum libpoly1305 essiv authenc mptcp_diag xsk_diag tcp_diag udp_diag raw_diag inet_diag unix_diag af_packet_diag netlink_diag intel_rapl_msr intel_rapl_common intel_uncore_frequency_common skx_edac_common nfit kvm_intel kvm crct10dif_pclmul crc32_pclmul polyval_clmulni polyval_generic ghash_clmulni_intel sha256_ssse3 sha1_ssse3 aesni_intel joydev crypto_simd cryptd rapl input_leds psmouse sch_fq_codel serio_raw bochs i2c_piix4 floppy qemu_fw_cfg i2c_smbus mac_hid pata_acpi msr parport_pc ppdev lp parport efi_pstore ip_tables x_tables [ 878.407319] ---[ end trace 0000000000000000 ]--- [ 878.407775] RIP: 0010:ceph_msg_data_cursor_init+0x42/0x50 [ 878.408317] Code: 89 17 48 8b 46 70 55 48 89 47 08 c7 47 18 00 00 00 00 48 89 e5 e8 de cc ff ff 5d 31 c0 31 d2 31 f6 31 ff c3 cc cc cc cc 0f 0b <0f> 0b 0f 0b 66 2e 0f 1f 84 00 00 00 00 00 90 90 90 90 90 90 90 90 [ 878.410087] RSP: 0018:ffffb4ffc7cbbd28 EFLAGS: 00010287 [ 878.410609] RAX: ffffffff82bb9ac0 RBX: ffff981390c2f1f8 RCX: 0000000000000000 [ 878.411318] RDX: 0000000000009000 RSI: ffff981288232b58 RDI: ffff981390c2f378 [ 878.412014] RBP: ffffb4ffc7cbbe18 R08: 0000000000000000 R09: 0000000000000000 [ 878.412735] R10: 0000000000000000 R11: 0000000000000000 R12: ffff981390c2f030 [ 878.413438] R13: ffff981288232b58 R14: 0000000000000029 R15: 0000000000000001 [ 878.414121] FS: 0000000000000000(0000) GS:ffff9814b7900000(0000) knlGS:0000000000000000 [ 878.414935] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 878.415516] CR2: 00005e106a0554e0 CR3: 0000000112bf0001 CR4: 0000000000772ef0 [ 878.416211] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 878.416907] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 878.417630] PKRU: 55555554 (gdb) l *ceph_msg_data_cursor_init+0x42 0xffffffff823b45a2 is in ceph_msg_data_cursor_init (net/ceph/messenger.c:1070). 1065 1066 void ceph_msg_data_cursor_init(struct ceph_msg_data_cursor *cursor, 1067 struct ceph_msg *msg, size_t length) 1068 { 1069 BUG_ON(!length); 1070 BUG_ON(length > msg->data_length); 1071 BUG_ON(!msg->num_data_items); 1072 1073 cursor->total_resid = length; 1074 cursor->data = msg->data; The issue takes place because of this: [ 202.628853] libceph: net/ceph/messenger_v2.c:2034 prepare_sparse_read_data(): msg->data_length 33792, msg->sparse_read_total 36864 1070 BUG_ON(length > msg->data_length); The generic/397 test (xfstests) executes such steps: (1) create encrypted files and directories; (2) access the created files and folders with encryption key; (3) access the created files and folders without encryption key. The issue takes place in this portion of code: if (IS_ENCRYPTED(inode)) { struct page **pages; size_t page_off; err = iov_iter_get_pages_alloc2(&subreq->io_iter, &pages, len, &page_off); if (err < 0) { doutc(cl, "%llx.%llx failed to allocate pages, %d\n", ceph_vinop(inode), err); goto out; } /* should always give us a page-aligned read */ WARN_ON_ONCE(page_off); len = err; err = 0; osd_req_op_extent_osd_data_pages(req, 0, pages, len, 0, false, false); The reason of the issue is that subreq->io_iter.count keeps unaligned value of length: [ 347.751182] lib/iov_iter.c:1185 __iov_iter_get_pages_alloc(): maxsize 36864, maxpages 4294967295, start 18446659367320516064 [ 347.752808] lib/iov_iter.c:1196 __iov_iter_get_pages_alloc(): maxsize 33792, maxpages 4294967295, start 18446659367320516064 [ 347.754394] lib/iov_iter.c:1015 iter_folioq_get_pages(): maxsize 33792, maxpages 4294967295, extracted 0, _start_offset 18446659367320516064 This patch simply assigns the aligned value to subreq->io_iter.count before calling iov_iter_get_pages_alloc2(). [ idryomov: tag the comment with FIXME to make it clear that it's only a workaround for netfslib not coexisting with fscrypt nicely (this is also noted in another pre-existing comment) ] Cc: David Howells Cc: stable@vger.kernel.org Fixes: ee4cdf7ba857 ("netfs: Speed up buffered reading") Signed-off-by: Viacheslav Dubeyko Reviewed-by: Ilya Dryomov Signed-off-by: Ilya Dryomov Signed-off-by: Greg Kroah-Hartman --- fs/ceph/addr.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index c2a9e2cc03de9..6828a2cff02c8 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -396,6 +396,15 @@ static void ceph_netfs_issue_read(struct netfs_io_subrequest *subreq) struct page **pages; size_t page_off; + /* + * FIXME: io_iter.count needs to be corrected to aligned + * length. Otherwise, iov_iter_get_pages_alloc2() operates + * with the initial unaligned length value. As a result, + * ceph_msg_data_cursor_init() triggers BUG_ON() in the case + * if msg->sparse_read_total > msg->data_length. + */ + subreq->io_iter.count = len; + err = iov_iter_get_pages_alloc2(&subreq->io_iter, &pages, len, &page_off); if (err < 0) { doutc(cl, "%llx.%llx failed to allocate pages, %d\n", -- GitLab From 5d555f17d18bd8e09aec21f637f6fe14029930ea Mon Sep 17 00:00:00 2001 From: Dennis Marttinen Date: Thu, 29 May 2025 17:45:12 +0000 Subject: [PATCH 1296/2211] ceph: set superblock s_magic for IMA fsmagic matching commit 72386d5245b249f5a0a8fabb881df7ad947b8ea4 upstream. The CephFS kernel driver forgets to set the filesystem magic signature in its superblock. As a result, IMA policy rules based on fsmagic matching do not apply as intended. This causes a major performance regression in Talos Linux [1] when mounting CephFS volumes, such as when deploying Rook Ceph [2]. Talos Linux ships a hardened kernel with the following IMA policy (irrelevant lines omitted): [...] dont_measure fsmagic=0xc36400 # CEPH_SUPER_MAGIC [...] measure func=FILE_CHECK mask=^MAY_READ euid=0 measure func=FILE_CHECK mask=^MAY_READ uid=0 [...] Currently, IMA compares 0xc36400 == 0x0 for CephFS files, resulting in all files opened with O_RDONLY or O_RDWR getting measured with SHA512 on every open(2): 10 69990c87e8af323d47e2d6ae4... ima-ng sha512: /data/cephfs/test-file Since O_WRONLY is rare, this results in an order of magnitude lower performance than expected for practically all file operations. Properly setting CEPH_SUPER_MAGIC in the CephFS superblock resolves the regression. Tests performed on a 3x replicated Ceph v19.3.0 cluster across three i5-7200U nodes each equipped with one Micron 7400 MAX M.2 disk (BlueStore) and Gigabit ethernet, on Talos Linux v1.10.2: FS-Mark 3.3 Test: 500 Files, Empty Files/s > Higher Is Better 6.12.27-talos . 16.6 |==== +twelho patch . 208.4 |==================================================== FS-Mark 3.3 Test: 500 Files, 1KB Size Files/s > Higher Is Better 6.12.27-talos . 15.6 |======= +twelho patch . 118.6 |==================================================== FS-Mark 3.3 Test: 500 Files, 32 Sub Dirs, 1MB Size Files/s > Higher Is Better 6.12.27-talos . 12.7 |=============== +twelho patch . 44.7 |===================================================== IO500 [3] 2fcd6d6 results (benchmarks within variance omitted): | IO500 benchmark | 6.12.27-talos | +twelho patch | Speedup | |-------------------|----------------|----------------|-----------| | mdtest-easy-write | 0.018524 kIOPS | 1.135027 kIOPS | 6027.33 % | | mdtest-hard-write | 0.018498 kIOPS | 0.973312 kIOPS | 5161.71 % | | ior-easy-read | 0.064727 GiB/s | 0.155324 GiB/s | 139.97 % | | mdtest-hard-read | 0.018246 kIOPS | 0.780800 kIOPS | 4179.29 % | This applies outside of synthetic benchmarks as well, for example, the time to rsync a 55 MiB directory with ~12k of mostly small files drops from an unusable 10m5s to a reasonable 26s (23x the throughput). [1]: https://www.talos.dev/ [2]: https://www.talos.dev/v1.10/kubernetes-guides/configuration/ceph-with-rook/ [3]: https://github.com/IO500/io500 Cc: stable@vger.kernel.org Signed-off-by: Dennis Marttinen Reviewed-by: Viacheslav Dubeyko Signed-off-by: Ilya Dryomov Signed-off-by: Greg Kroah-Hartman --- fs/ceph/super.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/ceph/super.c b/fs/ceph/super.c index c235f9a60394c..b61074b377ac5 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c @@ -1227,6 +1227,7 @@ static int ceph_set_super(struct super_block *s, struct fs_context *fc) s->s_time_min = 0; s->s_time_max = U32_MAX; s->s_flags |= SB_NODIRATIME | SB_NOATIME; + s->s_magic = CEPH_SUPER_MAGIC; ceph_fscrypt_set_ops(s); -- GitLab From 1c71f3cf5f91b30358e25c50bf15c4a4396384bd Mon Sep 17 00:00:00 2001 From: Chen Ridong Date: Wed, 18 Jun 2025 07:32:17 +0000 Subject: [PATCH 1297/2211] cgroup,freezer: fix incomplete freezing when attaching tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 37fb58a7273726e59f9429c89ade5116083a213d upstream. An issue was found: # cd /sys/fs/cgroup/freezer/ # mkdir test # echo FROZEN > test/freezer.state # cat test/freezer.state FROZEN # sleep 1000 & [1] 863 # echo 863 > test/cgroup.procs # cat test/freezer.state FREEZING When tasks are migrated to a frozen cgroup, the freezer fails to immediately freeze the tasks, causing the cgroup to remain in the "FREEZING". The freeze_task() function is called before clearing the CGROUP_FROZEN flag. This causes the freezing() check to incorrectly return false, preventing __freeze_task() from being invoked for the migrated task. To fix this issue, clear the CGROUP_FROZEN state before calling freeze_task(). Fixes: f5d39b020809 ("freezer,sched: Rewrite core freezer logic") Cc: stable@vger.kernel.org # v6.1+ Reported-by: Zhong Jiawei Signed-off-by: Chen Ridong Acked-by: Michal Koutný Signed-off-by: Tejun Heo Signed-off-by: Greg Kroah-Hartman --- kernel/cgroup/legacy_freezer.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kernel/cgroup/legacy_freezer.c b/kernel/cgroup/legacy_freezer.c index 074653f964c1d..01c02d116e8e1 100644 --- a/kernel/cgroup/legacy_freezer.c +++ b/kernel/cgroup/legacy_freezer.c @@ -188,13 +188,12 @@ static void freezer_attach(struct cgroup_taskset *tset) if (!(freezer->state & CGROUP_FREEZING)) { __thaw_task(task); } else { - freeze_task(task); - /* clear FROZEN and propagate upwards */ while (freezer && (freezer->state & CGROUP_FROZEN)) { freezer->state &= ~CGROUP_FROZEN; freezer = parent_freezer(freezer); } + freeze_task(task); } } -- GitLab From a0890b7805d241d0ae37e98a0f72e9d37af1149e Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Wed, 7 May 2025 11:21:22 +0200 Subject: [PATCH 1298/2211] bus: firewall: Fix missing static inline annotations for stubs commit 66db876162155c1cec87359cd78c62aaafde9257 upstream. Stubs in the header file for !CONFIG_STM32_FIREWALL case should be both static and inline, because they do not come with earlier declaration and should be inlined in every unit including the header. Cc: Patrice Chotard Cc: stable@vger.kernel.org Fixes: 5c9668cfc6d7 ("firewall: introduce stm32_firewall framework") Link: https://lore.kernel.org/r/20250507092121.95121-2-krzysztof.kozlowski@linaro.org Signed-off-by: Krzysztof Kozlowski Signed-off-by: Greg Kroah-Hartman --- include/linux/bus/stm32_firewall_device.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/include/linux/bus/stm32_firewall_device.h b/include/linux/bus/stm32_firewall_device.h index 5178b72bc9209..eaa7a3f544507 100644 --- a/include/linux/bus/stm32_firewall_device.h +++ b/include/linux/bus/stm32_firewall_device.h @@ -114,27 +114,30 @@ void stm32_firewall_release_access_by_id(struct stm32_firewall *firewall, u32 su #else /* CONFIG_STM32_FIREWALL */ -int stm32_firewall_get_firewall(struct device_node *np, struct stm32_firewall *firewall, - unsigned int nb_firewall) +static inline int stm32_firewall_get_firewall(struct device_node *np, + struct stm32_firewall *firewall, + unsigned int nb_firewall) { return -ENODEV; } -int stm32_firewall_grant_access(struct stm32_firewall *firewall) +static inline int stm32_firewall_grant_access(struct stm32_firewall *firewall) { return -ENODEV; } -void stm32_firewall_release_access(struct stm32_firewall *firewall) +static inline void stm32_firewall_release_access(struct stm32_firewall *firewall) { } -int stm32_firewall_grant_access_by_id(struct stm32_firewall *firewall, u32 subsystem_id) +static inline int stm32_firewall_grant_access_by_id(struct stm32_firewall *firewall, + u32 subsystem_id) { return -ENODEV; } -void stm32_firewall_release_access_by_id(struct stm32_firewall *firewall, u32 subsystem_id) +static inline void stm32_firewall_release_access_by_id(struct stm32_firewall *firewall, + u32 subsystem_id) { } -- GitLab From 947f9304d3c876c6672b947b80c0ef51161c6d2f Mon Sep 17 00:00:00 2001 From: Tasos Sahanidis Date: Mon, 19 May 2025 11:49:45 +0300 Subject: [PATCH 1299/2211] ata: pata_via: Force PIO for ATAPI devices on VT6415/VT6330 commit d29fc02caad7f94b62d56ee1b01c954f9c961ba7 upstream. The controller has a hardware bug that can hard hang the system when doing ATAPI DMAs without any trace of what happened. Depending on the device attached, it can also prevent the system from booting. In this case, the system hangs when reading the ATIP from optical media with cdrecord -vvv -atip on an _NEC DVD_RW ND-4571A 1-01 and an Optiarc DVD RW AD-7200A 1.06 attached to an ASRock 990FX Extreme 4, running at UDMA/33. The issue can be reproduced by running the same command with a cygwin build of cdrecord on WinXP, although it requires more attempts to cause it. The hang in that case is also resolved by forcing PIO. It doesn't appear that VIA has produced any drivers for that OS, thus no known workaround exists. HDDs attached to the controller do not suffer from any DMA issues. Cc: stable@vger.kernel.org Link: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/916677 Signed-off-by: Tasos Sahanidis Link: https://lore.kernel.org/r/20250519085508.1398701-1-tasos@tasossah.com Signed-off-by: Niklas Cassel Signed-off-by: Greg Kroah-Hartman --- drivers/ata/pata_via.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c index 696b99720dcbd..d82728a01832b 100644 --- a/drivers/ata/pata_via.c +++ b/drivers/ata/pata_via.c @@ -368,7 +368,8 @@ static unsigned int via_mode_filter(struct ata_device *dev, unsigned int mask) } if (dev->class == ATA_DEV_ATAPI && - dmi_check_system(no_atapi_dma_dmi_table)) { + (dmi_check_system(no_atapi_dma_dmi_table) || + config->id == PCI_DEVICE_ID_VIA_6415)) { ata_dev_warn(dev, "controller locks up on ATAPI DMA, forcing PIO\n"); mask &= ATA_MASK_PIO; } -- GitLab From cf4f7511f8385cb702563f23c383f61284e0565d Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Thu, 12 Jun 2025 16:17:51 +0200 Subject: [PATCH 1300/2211] ata: ahci: Disallow LPM for ASUSPRO-D840SA motherboard commit b5acc3628898baa63658bc4125f9525f9b3dd4f3 upstream. A user has bisected a regression which causes graphical corruptions on his screen to commit 7627a0edef54 ("ata: ahci: Drop low power policy board type"). Simply reverting commit 7627a0edef54 ("ata: ahci: Drop low power policy board type") makes the graphical corruptions on his screen to go away. (Note: there are no visible messages in dmesg that indicates a problem with AHCI.) The user also reports that the problem occurs regardless if there is an HDD or an SSD connected via AHCI, so the problem is not device related. The devices also work fine on other motherboards, so it seems specific to the ASUSPRO-D840SA motherboard. While enabling low power modes for AHCI is not supposed to affect completely unrelated hardware, like a graphics card, it does however allow the system to enter deeper PC-states, which could expose ACPI issues that were previously not visible (because the system never entered these lower power states before). There are previous examples where enabling LPM exposed serious BIOS/ACPI bugs, see e.g. commit 240630e61870 ("ahci: Disable LPM on Lenovo 50 series laptops with a too old BIOS"). Since there hasn't been any BIOS update in years for the ASUSPRO-D840SA motherboard, disable LPM for this board, in order to avoid entering lower PC-states, which triggers graphical corruptions. Cc: stable@vger.kernel.org Reported-by: Andy Yang Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220111 Fixes: 7627a0edef54 ("ata: ahci: Drop low power policy board type") Reviewed-by: Damien Le Moal Reviewed-by: Hans de Goede Link: https://lore.kernel.org/r/20250612141750.2108342-2-cassel@kernel.org Signed-off-by: Niklas Cassel Signed-off-by: Greg Kroah-Hartman --- drivers/ata/ahci.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 650122deb480d..80bbead3ec3ab 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -1410,8 +1410,15 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) static bool ahci_broken_lpm(struct pci_dev *pdev) { + /* + * Platforms with LPM problems. + * If driver_data is NULL, there is no existing BIOS version with + * functioning LPM. + * If driver_data is non-NULL, then driver_data contains the DMI BIOS + * build date of the first BIOS version with functioning LPM (i.e. older + * BIOS versions have broken LPM). + */ static const struct dmi_system_id sysids[] = { - /* Various Lenovo 50 series have LPM issues with older BIOSen */ { .matches = { DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), @@ -1446,6 +1453,13 @@ static bool ahci_broken_lpm(struct pci_dev *pdev) */ .driver_data = "20180310", /* 2.35 */ }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_PRODUCT_VERSION, "ASUSPRO D840MB_M840SA"), + }, + /* 320 is broken, there is no known good version yet. */ + }, { } /* terminate list */ }; const struct dmi_system_id *dmi = dmi_first_match(sysids); @@ -1455,6 +1469,9 @@ static bool ahci_broken_lpm(struct pci_dev *pdev) if (!dmi) return false; + if (!dmi->driver_data) + return true; + dmi_get_date(DMI_BIOS_DATE, &year, &month, &date); snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date); -- GitLab From 4d0686b53cc9342be3f8ce06336fd5ab0d206355 Mon Sep 17 00:00:00 2001 From: Mikko Korhonen Date: Tue, 17 Jun 2025 09:18:41 +0300 Subject: [PATCH 1301/2211] ata: ahci: Disallow LPM for Asus B550-F motherboard commit a7b3b77fd111d49f8e25624e4ea1046322a57baf upstream. Asus ROG STRIX B550-F GAMING (WI-FI) motherboard has problems on some SATA ports with at least one hard drive model (WDC WD20EFAX-68FB5N0) when LPM is enabled. Disabling LPM solves the issue. Cc: stable@vger.kernel.org Fixes: 7627a0edef54 ("ata: ahci: Drop low power policy board type") Signed-off-by: Mikko Korhonen Link: https://lore.kernel.org/r/20250617062055.784827-1-mjkorhon@gmail.com [cassel: more detailed comment, make single line comments consistent] Signed-off-by: Niklas Cassel Signed-off-by: Greg Kroah-Hartman --- drivers/ata/ahci.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 80bbead3ec3ab..395240cb3666e 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -1458,7 +1458,23 @@ static bool ahci_broken_lpm(struct pci_dev *pdev) DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), DMI_MATCH(DMI_PRODUCT_VERSION, "ASUSPRO D840MB_M840SA"), }, - /* 320 is broken, there is no known good version yet. */ + /* 320 is broken, there is no known good version. */ + }, + { + /* + * AMD 500 Series Chipset SATA Controller [1022:43eb] + * on this motherboard timeouts on ports 5 and 6 when + * LPM is enabled, at least with WDC WD20EFAX-68FB5N0 + * hard drives. LPM with the same drive works fine on + * all other ports on the same controller. + */ + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, + "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_BOARD_NAME, + "ROG STRIX B550-F GAMING (WI-FI)"), + }, + /* 3621 is broken, there is no known good version. */ }, { } /* terminate list */ }; -- GitLab From 2de74c25e75229cd57793f51e2dddb5599d308b1 Mon Sep 17 00:00:00 2001 From: Ioana Ciornei Date: Tue, 8 Apr 2025 13:58:10 +0300 Subject: [PATCH 1302/2211] bus: fsl-mc: do not add a device-link for the UAPI used DPMCP device commit dd7d8e012b23de158ca0188239c7a1f2a83b4484 upstream. The fsl-mc bus associated to the root DPRC in a DPAA2 system exports a device file for userspace access to the MC firmware. In case the DPRC's local MC portal (DPMCP) is currently in use, a new DPMCP device is allocated through the fsl_mc_portal_allocate() function. In this case, the call to fsl_mc_portal_allocate() will fail with -EINVAL when trying to add a device link between the root DPRC (consumer) and the newly allocated DPMCP device (supplier). This is because the DPMCP is a dependent of the DPRC device (the bus). Fix this by not adding a device link in case the DPMCP is allocated for the root DPRC's usage. Fixes: afb77422819f ("bus: fsl-mc: automatically add a device_link on fsl_mc_[portal,object]_allocate") Signed-off-by: Ioana Ciornei Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20250408105814.2837951-3-ioana.ciornei@nxp.com Signed-off-by: Christophe Leroy Signed-off-by: Greg Kroah-Hartman --- drivers/bus/fsl-mc/mc-io.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/drivers/bus/fsl-mc/mc-io.c b/drivers/bus/fsl-mc/mc-io.c index 95b10a6cf3073..8b7a34f4db94b 100644 --- a/drivers/bus/fsl-mc/mc-io.c +++ b/drivers/bus/fsl-mc/mc-io.c @@ -214,12 +214,19 @@ int __must_check fsl_mc_portal_allocate(struct fsl_mc_device *mc_dev, if (error < 0) goto error_cleanup_resource; - dpmcp_dev->consumer_link = device_link_add(&mc_dev->dev, - &dpmcp_dev->dev, - DL_FLAG_AUTOREMOVE_CONSUMER); - if (!dpmcp_dev->consumer_link) { - error = -EINVAL; - goto error_cleanup_mc_io; + /* If the DPRC device itself tries to allocate a portal (usually for + * UAPI interaction), don't add a device link between them since the + * DPMCP device is an actual child device of the DPRC and a reverse + * dependency is not allowed. + */ + if (mc_dev != mc_bus_dev) { + dpmcp_dev->consumer_link = device_link_add(&mc_dev->dev, + &dpmcp_dev->dev, + DL_FLAG_AUTOREMOVE_CONSUMER); + if (!dpmcp_dev->consumer_link) { + error = -EINVAL; + goto error_cleanup_mc_io; + } } *new_mc_io = mc_io; -- GitLab From 63e50525b5ab369831b4d2b55672d65e1232eb49 Mon Sep 17 00:00:00 2001 From: Wan Junjie Date: Tue, 8 Apr 2025 13:58:11 +0300 Subject: [PATCH 1303/2211] bus: fsl-mc: fix GET/SET_TAILDROP command ids commit c78230ad34f82c6c0e0e986865073aeeef1f5d30 upstream. Command ids for taildrop get/set can not pass the check when they are using from the restool user space utility. Correct them according to the user manual. Fixes: d67cc29e6d1f ("bus: fsl-mc: list more commands as accepted through the ioctl") Signed-off-by: Wan Junjie Signed-off-by: Ioana Ciornei Cc: stable@vger.kernel.org Reviewed-by: Ioana Ciornei Link: https://lore.kernel.org/r/20250408105814.2837951-4-ioana.ciornei@nxp.com Signed-off-by: Christophe Leroy Signed-off-by: Greg Kroah-Hartman --- drivers/bus/fsl-mc/fsl-mc-uapi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/bus/fsl-mc/fsl-mc-uapi.c b/drivers/bus/fsl-mc/fsl-mc-uapi.c index 9c4c1395fcdbf..a376ec6616534 100644 --- a/drivers/bus/fsl-mc/fsl-mc-uapi.c +++ b/drivers/bus/fsl-mc/fsl-mc-uapi.c @@ -275,13 +275,13 @@ static struct fsl_mc_cmd_desc fsl_mc_accepted_cmds[] = { .size = 8, }, [DPSW_GET_TAILDROP] = { - .cmdid_value = 0x0A80, + .cmdid_value = 0x0A90, .cmdid_mask = 0xFFF0, .token = true, .size = 14, }, [DPSW_SET_TAILDROP] = { - .cmdid_value = 0x0A90, + .cmdid_value = 0x0A80, .cmdid_mask = 0xFFF0, .token = true, .size = 24, -- GitLab From 5766da2237e539f259aa0e5f3639ae37b44ca458 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Tue, 15 Apr 2025 11:53:04 -0300 Subject: [PATCH 1304/2211] ext4: inline: fix len overflow in ext4_prepare_inline_data commit 227cb4ca5a6502164f850d22aec3104d7888b270 upstream. When running the following code on an ext4 filesystem with inline_data feature enabled, it will lead to the bug below. fd = open("file1", O_RDWR | O_CREAT | O_TRUNC, 0666); ftruncate(fd, 30); pwrite(fd, "a", 1, (1UL << 40) + 5UL); That happens because write_begin will succeed as when ext4_generic_write_inline_data calls ext4_prepare_inline_data, pos + len will be truncated, leading to ext4_prepare_inline_data parameter to be 6 instead of 0x10000000006. Then, later when write_end is called, we hit: BUG_ON(pos + len > EXT4_I(inode)->i_inline_size); at ext4_write_inline_data. Fix it by using a loff_t type for the len parameter in ext4_prepare_inline_data instead of an unsigned int. [ 44.545164] ------------[ cut here ]------------ [ 44.545530] kernel BUG at fs/ext4/inline.c:240! [ 44.545834] Oops: invalid opcode: 0000 [#1] SMP NOPTI [ 44.546172] CPU: 3 UID: 0 PID: 343 Comm: test Not tainted 6.15.0-rc2-00003-g9080916f4863 #45 PREEMPT(full) 112853fcebfdb93254270a7959841d2c6aa2c8bb [ 44.546523] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 [ 44.546523] RIP: 0010:ext4_write_inline_data+0xfe/0x100 [ 44.546523] Code: 3c 0e 48 83 c7 48 48 89 de 5b 41 5c 41 5d 41 5e 41 5f 5d e9 e4 fa 43 01 5b 41 5c 41 5d 41 5e 41 5f 5d c3 cc cc cc cc cc 0f 0b <0f> 0b 0f 1f 44 00 00 55 41 57 41 56 41 55 41 54 53 48 83 ec 20 49 [ 44.546523] RSP: 0018:ffffb342008b79a8 EFLAGS: 00010216 [ 44.546523] RAX: 0000000000000001 RBX: ffff9329c579c000 RCX: 0000010000000006 [ 44.546523] RDX: 000000000000003c RSI: ffffb342008b79f0 RDI: ffff9329c158e738 [ 44.546523] RBP: 0000000000000001 R08: 0000000000000001 R09: 0000000000000000 [ 44.546523] R10: 00007ffffffff000 R11: ffffffff9bd0d910 R12: 0000006210000000 [ 44.546523] R13: fffffc7e4015e700 R14: 0000010000000005 R15: ffff9329c158e738 [ 44.546523] FS: 00007f4299934740(0000) GS:ffff932a60179000(0000) knlGS:0000000000000000 [ 44.546523] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 44.546523] CR2: 00007f4299a1ec90 CR3: 0000000002886002 CR4: 0000000000770eb0 [ 44.546523] PKRU: 55555554 [ 44.546523] Call Trace: [ 44.546523] [ 44.546523] ext4_write_inline_data_end+0x126/0x2d0 [ 44.546523] generic_perform_write+0x17e/0x270 [ 44.546523] ext4_buffered_write_iter+0xc8/0x170 [ 44.546523] vfs_write+0x2be/0x3e0 [ 44.546523] __x64_sys_pwrite64+0x6d/0xc0 [ 44.546523] do_syscall_64+0x6a/0xf0 [ 44.546523] ? __wake_up+0x89/0xb0 [ 44.546523] ? xas_find+0x72/0x1c0 [ 44.546523] ? next_uptodate_folio+0x317/0x330 [ 44.546523] ? set_pte_range+0x1a6/0x270 [ 44.546523] ? filemap_map_pages+0x6ee/0x840 [ 44.546523] ? ext4_setattr+0x2fa/0x750 [ 44.546523] ? do_pte_missing+0x128/0xf70 [ 44.546523] ? security_inode_post_setattr+0x3e/0xd0 [ 44.546523] ? ___pte_offset_map+0x19/0x100 [ 44.546523] ? handle_mm_fault+0x721/0xa10 [ 44.546523] ? do_user_addr_fault+0x197/0x730 [ 44.546523] ? do_syscall_64+0x76/0xf0 [ 44.546523] ? arch_exit_to_user_mode_prepare+0x1e/0x60 [ 44.546523] ? irqentry_exit_to_user_mode+0x79/0x90 [ 44.546523] entry_SYSCALL_64_after_hwframe+0x55/0x5d [ 44.546523] RIP: 0033:0x7f42999c6687 [ 44.546523] Code: 48 89 fa 4c 89 df e8 58 b3 00 00 8b 93 08 03 00 00 59 5e 48 83 f8 fc 74 1a 5b c3 0f 1f 84 00 00 00 00 00 48 8b 44 24 10 0f 05 <5b> c3 0f 1f 80 00 00 00 00 83 e2 39 83 fa 08 75 de e8 23 ff ff ff [ 44.546523] RSP: 002b:00007ffeae4a7930 EFLAGS: 00000202 ORIG_RAX: 0000000000000012 [ 44.546523] RAX: ffffffffffffffda RBX: 00007f4299934740 RCX: 00007f42999c6687 [ 44.546523] RDX: 0000000000000001 RSI: 000055ea6149200f RDI: 0000000000000003 [ 44.546523] RBP: 00007ffeae4a79a0 R08: 0000000000000000 R09: 0000000000000000 [ 44.546523] R10: 0000010000000005 R11: 0000000000000202 R12: 0000000000000000 [ 44.546523] R13: 00007ffeae4a7ac8 R14: 00007f4299b86000 R15: 000055ea61493dd8 [ 44.546523] [ 44.546523] Modules linked in: [ 44.568501] ---[ end trace 0000000000000000 ]--- [ 44.568889] RIP: 0010:ext4_write_inline_data+0xfe/0x100 [ 44.569328] Code: 3c 0e 48 83 c7 48 48 89 de 5b 41 5c 41 5d 41 5e 41 5f 5d e9 e4 fa 43 01 5b 41 5c 41 5d 41 5e 41 5f 5d c3 cc cc cc cc cc 0f 0b <0f> 0b 0f 1f 44 00 00 55 41 57 41 56 41 55 41 54 53 48 83 ec 20 49 [ 44.570931] RSP: 0018:ffffb342008b79a8 EFLAGS: 00010216 [ 44.571356] RAX: 0000000000000001 RBX: ffff9329c579c000 RCX: 0000010000000006 [ 44.571959] RDX: 000000000000003c RSI: ffffb342008b79f0 RDI: ffff9329c158e738 [ 44.572571] RBP: 0000000000000001 R08: 0000000000000001 R09: 0000000000000000 [ 44.573148] R10: 00007ffffffff000 R11: ffffffff9bd0d910 R12: 0000006210000000 [ 44.573748] R13: fffffc7e4015e700 R14: 0000010000000005 R15: ffff9329c158e738 [ 44.574335] FS: 00007f4299934740(0000) GS:ffff932a60179000(0000) knlGS:0000000000000000 [ 44.575027] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 44.575520] CR2: 00007f4299a1ec90 CR3: 0000000002886002 CR4: 0000000000770eb0 [ 44.576112] PKRU: 55555554 [ 44.576338] Kernel panic - not syncing: Fatal exception [ 44.576517] Kernel Offset: 0x1a600000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff) Reported-by: syzbot+fe2a25dae02a207717a0@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=fe2a25dae02a207717a0 Fixes: f19d5870cbf7 ("ext4: add normal write support for inline data") Signed-off-by: Thadeu Lima de Souza Cascardo Cc: stable@vger.kernel.org Reviewed-by: Jan Kara Reviewed-by: Andreas Dilger Link: https://patch.msgid.link/20250415-ext4-prepare-inline-overflow-v1-1-f4c13d900967@igalia.com Signed-off-by: Theodore Ts'o Signed-off-by: Greg Kroah-Hartman --- fs/ext4/inline.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index 3536ca7e4fcca..05b148d6fc711 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c @@ -392,7 +392,7 @@ out: } static int ext4_prepare_inline_data(handle_t *handle, struct inode *inode, - unsigned int len) + loff_t len) { int ret, size, no_expand; struct ext4_inode_info *ei = EXT4_I(inode); -- GitLab From 796632e6f8298cad413f0b77f12a3f16333c2eda Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Tue, 29 Apr 2025 19:55:36 +0200 Subject: [PATCH 1305/2211] ext4: fix calculation of credits for extent tree modification commit 32a93f5bc9b9812fc710f43a4d8a6830f91e4988 upstream. Luis and David are reporting that after running generic/750 test for 90+ hours on 2k ext4 filesystem, they are able to trigger a warning in jbd2_journal_dirty_metadata() complaining that there are not enough credits in the running transaction started in ext4_do_writepages(). Indeed the code in ext4_do_writepages() is racy and the extent tree can change between the time we compute credits necessary for extent tree computation and the time we actually modify the extent tree. Thus it may happen that the number of credits actually needed is higher. Modify ext4_ext_index_trans_blocks() to count with the worst case of maximum tree depth. This can reduce the possible number of writers that can operate in the system in parallel (because the credit estimates now won't fit in one transaction) but for reasonably sized journals this shouldn't really be an issue. So just go with a safe and simple fix. Link: https://lore.kernel.org/all/20250415013641.f2ppw6wov4kn4wq2@offworld Reported-by: Davidlohr Bueso Reported-by: Luis Chamberlain Tested-by: kdevops@lists.linux.dev Signed-off-by: Jan Kara Reviewed-by: Zhang Yi Link: https://patch.msgid.link/20250429175535.23125-2-jack@suse.cz Signed-off-by: Theodore Ts'o Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman --- fs/ext4/extents.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index ba3419958a832..b5dda95e7f92f 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -2396,18 +2396,19 @@ int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int nrblocks, int ext4_ext_index_trans_blocks(struct inode *inode, int extents) { int index; - int depth; /* If we are converting the inline data, only one is needed here. */ if (ext4_has_inline_data(inode)) return 1; - depth = ext_depth(inode); - + /* + * Extent tree can change between the time we estimate credits and + * the time we actually modify the tree. Assume the worst case. + */ if (extents <= 1) - index = depth * 2; + index = EXT4_MAX_EXTENT_DEPTH * 2; else - index = depth * 3; + index = EXT4_MAX_EXTENT_DEPTH * 3; return index; } -- GitLab From b841ca8c8fa93a16880e0c28068adb69704f2aba Mon Sep 17 00:00:00 2001 From: Zhang Yi Date: Tue, 6 May 2025 09:20:08 +0800 Subject: [PATCH 1306/2211] ext4: factor out ext4_get_maxbytes() commit dbe27f06fa38b9bfc598f8864ae1c5d5831d9992 upstream. There are several locations that get the correct maxbytes value based on the inode's block type. It would be beneficial to extract a common helper function to make the code more clear. Signed-off-by: Zhang Yi Reviewed-by: Jan Kara Reviewed-by: Baokun Li Link: https://patch.msgid.link/20250506012009.3896990-3-yi.zhang@huaweicloud.com Signed-off-by: Theodore Ts'o Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman --- fs/ext4/ext4.h | 7 +++++++ fs/ext4/extents.c | 7 +------ fs/ext4/file.c | 7 +------ 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index c2e6989a568c2..e94df69ee2e0d 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -3369,6 +3369,13 @@ static inline unsigned int ext4_flex_bg_size(struct ext4_sb_info *sbi) return 1 << sbi->s_log_groups_per_flex; } +static inline loff_t ext4_get_maxbytes(struct inode *inode) +{ + if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) + return inode->i_sb->s_maxbytes; + return EXT4_SB(inode->i_sb)->s_bitmap_maxbytes; +} + #define ext4_std_error(sb, errno) \ do { \ if ((errno)) \ diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index b5dda95e7f92f..b16d72275e105 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4977,12 +4977,7 @@ static const struct iomap_ops ext4_iomap_xattr_ops = { static int ext4_fiemap_check_ranges(struct inode *inode, u64 start, u64 *len) { - u64 maxbytes; - - if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) - maxbytes = inode->i_sb->s_maxbytes; - else - maxbytes = EXT4_SB(inode->i_sb)->s_bitmap_maxbytes; + u64 maxbytes = ext4_get_maxbytes(inode); if (*len == 0) return -EINVAL; diff --git a/fs/ext4/file.c b/fs/ext4/file.c index f14aed14b9cf3..6c692151b0d6c 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -896,12 +896,7 @@ static int ext4_file_open(struct inode *inode, struct file *filp) loff_t ext4_llseek(struct file *file, loff_t offset, int whence) { struct inode *inode = file->f_mapping->host; - loff_t maxbytes; - - if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) - maxbytes = EXT4_SB(inode->i_sb)->s_bitmap_maxbytes; - else - maxbytes = inode->i_sb->s_maxbytes; + loff_t maxbytes = ext4_get_maxbytes(inode); switch (whence) { default: -- GitLab From 4b36399711c439c106e39c51898aa003d89a691e Mon Sep 17 00:00:00 2001 From: Zhang Yi Date: Tue, 6 May 2025 09:20:09 +0800 Subject: [PATCH 1307/2211] ext4: ensure i_size is smaller than maxbytes commit 1a77a028a392fab66dd637cdfac3f888450d00af upstream. The inode i_size cannot be larger than maxbytes, check it while loading inode from the disk. Signed-off-by: Zhang Yi Reviewed-by: Jan Kara Reviewed-by: Baokun Li Link: https://patch.msgid.link/20250506012009.3896990-4-yi.zhang@huaweicloud.com Signed-off-by: Theodore Ts'o Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman --- fs/ext4/inode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 38fe9a213d09b..89082b22313ab 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4928,7 +4928,8 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, ei->i_file_acl |= ((__u64)le16_to_cpu(raw_inode->i_file_acl_high)) << 32; inode->i_size = ext4_isize(sb, raw_inode); - if ((size = i_size_read(inode)) < 0) { + size = i_size_read(inode); + if (size < 0 || size > ext4_get_maxbytes(inode)) { ext4_error_inode(inode, function, line, 0, "iget: bad i_size value: %lld", size); ret = -EFSCORRUPTED; -- GitLab From be5f3061a6f904e3674257879e71881ceee5b673 Mon Sep 17 00:00:00 2001 From: Brian Foster Date: Fri, 16 May 2025 13:38:00 -0400 Subject: [PATCH 1308/2211] ext4: only dirty folios when data journaling regular files commit e26268ff1dcae5662c1b96c35f18cfa6ab73d9de upstream. fstest generic/388 occasionally reproduces a crash that looks as follows: BUG: kernel NULL pointer dereference, address: 0000000000000000 ... Call Trace: ext4_block_zero_page_range+0x30c/0x380 [ext4] ext4_truncate+0x436/0x440 [ext4] ext4_process_orphan+0x5d/0x110 [ext4] ext4_orphan_cleanup+0x124/0x4f0 [ext4] ext4_fill_super+0x262d/0x3110 [ext4] get_tree_bdev_flags+0x132/0x1d0 vfs_get_tree+0x26/0xd0 vfs_cmd_create+0x59/0xe0 __do_sys_fsconfig+0x4ed/0x6b0 do_syscall_64+0x82/0x170 ... This occurs when processing a symlink inode from the orphan list. The partial block zeroing code in the truncate path calls ext4_dirty_journalled_data() -> folio_mark_dirty(). The latter calls mapping->a_ops->dirty_folio(), but symlink inodes are not assigned an a_ops vector in ext4, hence the crash. To avoid this problem, update the ext4_dirty_journalled_data() helper to only mark the folio dirty on regular files (for which a_ops is assigned). This also matches the journaling logic in the ext4_symlink() creation path, where ext4_handle_dirty_metadata() is called directly. Fixes: d84c9ebdac1e ("ext4: Mark pages with journalled data dirty") Signed-off-by: Brian Foster Link: https://patch.msgid.link/20250516173800.175577-1-bfoster@redhat.com Signed-off-by: Theodore Ts'o Reviewed-by: Jan Kara Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman --- fs/ext4/inode.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 89082b22313ab..f769f5cb6deb7 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -1000,7 +1000,12 @@ int ext4_walk_page_buffers(handle_t *handle, struct inode *inode, */ static int ext4_dirty_journalled_data(handle_t *handle, struct buffer_head *bh) { - folio_mark_dirty(bh->b_folio); + struct folio *folio = bh->b_folio; + struct inode *inode = folio->mapping->host; + + /* only regular files have a_ops */ + if (S_ISREG(inode->i_mode)) + folio_mark_dirty(folio); return ext4_handle_dirty_metadata(handle, NULL, bh); } -- GitLab From 5a8cd6ae8393e2eaebf51d420d5374821ef2af87 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Fri, 30 May 2025 16:13:32 -0700 Subject: [PATCH 1309/2211] Input: ims-pcu - check record size in ims_pcu_flash_firmware() commit a95ef0199e80f3384eb992889322957d26c00102 upstream. The "len" variable comes from the firmware and we generally do trust firmware, but it's always better to double check. If the "len" is too large it could result in memory corruption when we do "memcpy(fragment->data, rec->data, len);" Fixes: 628329d52474 ("Input: add IMS Passenger Control Unit driver") Signed-off-by: Dan Carpenter Link: https://lore.kernel.org/r/131fd1ae92c828ee9f4fa2de03d8c210ae1f3524.1748463049.git.dan.carpenter@linaro.org Cc: stable@vger.kernel.org Signed-off-by: Dmitry Torokhov Signed-off-by: Greg Kroah-Hartman --- drivers/input/misc/ims-pcu.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/input/misc/ims-pcu.c b/drivers/input/misc/ims-pcu.c index 4215f9b9c2b07..fc22cbb854a38 100644 --- a/drivers/input/misc/ims-pcu.c +++ b/drivers/input/misc/ims-pcu.c @@ -844,6 +844,12 @@ static int ims_pcu_flash_firmware(struct ims_pcu *pcu, addr = be32_to_cpu(rec->addr) / 2; len = be16_to_cpu(rec->len); + if (len > sizeof(pcu->cmd_buf) - 1 - sizeof(*fragment)) { + dev_err(pcu->dev, + "Invalid record length in firmware: %d\n", len); + return -EINVAL; + } + fragment = (void *)&pcu->cmd_buf[1]; put_unaligned_le32(addr, &fragment->addr); fragment->len = len; -- GitLab From a0b1c91ada45b1f7c6020dfd9eeef4fd7673a908 Mon Sep 17 00:00:00 2001 From: Gatien Chevallier Date: Fri, 30 May 2025 16:09:23 -0700 Subject: [PATCH 1310/2211] Input: gpio-keys - fix possible concurrent access in gpio_keys_irq_timer() commit 8f38219fa139623c29db2cb0f17d0a197a86e344 upstream. gpio_keys_irq_isr() and gpio_keys_irq_timer() access the same resources. There could be a concurrent access if a GPIO interrupt occurs in parallel of a HR timer interrupt. Guard back those resources with a spinlock. Fixes: 019002f20cb5 ("Input: gpio-keys - use hrtimer for release timer") Signed-off-by: Gatien Chevallier Link: https://lore.kernel.org/r/20250528-gpio_keys_preempt_rt-v2-2-3fc55a9c3619@foss.st.com Cc: stable@vger.kernel.org Signed-off-by: Dmitry Torokhov Signed-off-by: Greg Kroah-Hartman --- drivers/input/keyboard/gpio_keys.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index 380fe8dab3b06..9514f577995fa 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -449,6 +449,8 @@ static enum hrtimer_restart gpio_keys_irq_timer(struct hrtimer *t) release_timer); struct input_dev *input = bdata->input; + guard(spinlock_irqsave)(&bdata->lock); + if (bdata->key_pressed) { input_report_key(input, *bdata->code, 0); input_sync(input); -- GitLab From fed611bd8c7b76b070aa407d0c7558e20d9e1f68 Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Mon, 24 Mar 2025 13:33:39 +0800 Subject: [PATCH 1311/2211] f2fs: fix to do sanity check on ino and xnid commit 061cf3a84bde038708eb0f1d065b31b7c2456533 upstream. syzbot reported a f2fs bug as below: INFO: task syz-executor140:5308 blocked for more than 143 seconds. Not tainted 6.14.0-rc7-syzkaller-00069-g81e4f8d68c66 #0 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. task:syz-executor140 state:D stack:24016 pid:5308 tgid:5308 ppid:5306 task_flags:0x400140 flags:0x00000006 Call Trace: context_switch kernel/sched/core.c:5378 [inline] __schedule+0x190e/0x4c90 kernel/sched/core.c:6765 __schedule_loop kernel/sched/core.c:6842 [inline] schedule+0x14b/0x320 kernel/sched/core.c:6857 io_schedule+0x8d/0x110 kernel/sched/core.c:7690 folio_wait_bit_common+0x839/0xee0 mm/filemap.c:1317 __folio_lock mm/filemap.c:1664 [inline] folio_lock include/linux/pagemap.h:1163 [inline] __filemap_get_folio+0x147/0xb40 mm/filemap.c:1917 pagecache_get_page+0x2c/0x130 mm/folio-compat.c:87 find_get_page_flags include/linux/pagemap.h:842 [inline] f2fs_grab_cache_page+0x2b/0x320 fs/f2fs/f2fs.h:2776 __get_node_page+0x131/0x11b0 fs/f2fs/node.c:1463 read_xattr_block+0xfb/0x190 fs/f2fs/xattr.c:306 lookup_all_xattrs fs/f2fs/xattr.c:355 [inline] f2fs_getxattr+0x676/0xf70 fs/f2fs/xattr.c:533 __f2fs_get_acl+0x52/0x870 fs/f2fs/acl.c:179 f2fs_acl_create fs/f2fs/acl.c:375 [inline] f2fs_init_acl+0xd7/0x9b0 fs/f2fs/acl.c:418 f2fs_init_inode_metadata+0xa0f/0x1050 fs/f2fs/dir.c:539 f2fs_add_inline_entry+0x448/0x860 fs/f2fs/inline.c:666 f2fs_add_dentry+0xba/0x1e0 fs/f2fs/dir.c:765 f2fs_do_add_link+0x28c/0x3a0 fs/f2fs/dir.c:808 f2fs_add_link fs/f2fs/f2fs.h:3616 [inline] f2fs_mknod+0x2e8/0x5b0 fs/f2fs/namei.c:766 vfs_mknod+0x36d/0x3b0 fs/namei.c:4191 unix_bind_bsd net/unix/af_unix.c:1286 [inline] unix_bind+0x563/0xe30 net/unix/af_unix.c:1379 __sys_bind_socket net/socket.c:1817 [inline] __sys_bind+0x1e4/0x290 net/socket.c:1848 __do_sys_bind net/socket.c:1853 [inline] __se_sys_bind net/socket.c:1851 [inline] __x64_sys_bind+0x7a/0x90 net/socket.c:1851 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f Let's dump and check metadata of corrupted inode, it shows its xattr_nid is the same to its i_ino. dump.f2fs -i 3 chaseyu.img.raw i_xattr_nid [0x 3 : 3] So that, during mknod in the corrupted directory, it tries to get and lock inode page twice, result in deadlock. - f2fs_mknod - f2fs_add_inline_entry - f2fs_get_inode_page --- lock dir's inode page - f2fs_init_acl - f2fs_acl_create(dir,..) - __f2fs_get_acl - f2fs_getxattr - lookup_all_xattrs - __get_node_page --- try to lock dir's inode page In order to fix this, let's add sanity check on ino and xnid. Cc: stable@vger.kernel.org Reported-by: syzbot+cc448dcdc7ae0b4e4ffa@syzkaller.appspotmail.com Closes: https://lore.kernel.org/linux-f2fs-devel/67e06150.050a0220.21942d.0005.GAE@google.com Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Greg Kroah-Hartman --- fs/f2fs/inode.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 1061991434b11..50e64b7b016dc 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -286,6 +286,12 @@ static bool sanity_check_inode(struct inode *inode, struct page *node_page) return false; } + if (ino_of_node(node_page) == fi->i_xattr_nid) { + f2fs_warn(sbi, "%s: corrupted inode i_ino=%lx, xnid=%x, run fsck to fix.", + __func__, inode->i_ino, fi->i_xattr_nid); + return false; + } + if (f2fs_has_extra_attr(inode)) { if (!f2fs_sb_has_extra_attr(sbi)) { f2fs_warn(sbi, "%s: inode (ino=%lx) is with extra_attr, but extra_attr feature is off", -- GitLab From aaa644e7ffff02e12c89cbce4753bc0b6f23ff87 Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Sat, 12 Apr 2025 21:09:46 +0000 Subject: [PATCH 1312/2211] f2fs: prevent kernel warning due to negative i_nlink from corrupted image commit 42cb74a92adaf88061039601ddf7c874f58b554e upstream. WARNING: CPU: 1 PID: 9426 at fs/inode.c:417 drop_nlink+0xac/0xd0 home/cc/linux/fs/inode.c:417 Modules linked in: CPU: 1 UID: 0 PID: 9426 Comm: syz-executor568 Not tainted 6.14.0-12627-g94d471a4f428 #2 PREEMPT(full) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014 RIP: 0010:drop_nlink+0xac/0xd0 home/cc/linux/fs/inode.c:417 Code: 48 8b 5d 28 be 08 00 00 00 48 8d bb 70 07 00 00 e8 f9 67 e6 ff f0 48 ff 83 70 07 00 00 5b 5d e9 9a 12 82 ff e8 95 12 82 ff 90 <0f> 0b 90 c7 45 48 ff ff ff ff 5b 5d e9 83 12 82 ff e8 fe 5f e6 ff RSP: 0018:ffffc900026b7c28 EFLAGS: 00010293 RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffffffff8239710f RDX: ffff888041345a00 RSI: ffffffff8239717b RDI: 0000000000000005 RBP: ffff888054509ad0 R08: 0000000000000005 R09: 0000000000000000 R10: 0000000000000000 R11: ffffffff9ab36f08 R12: ffff88804bb40000 R13: ffff8880545091e0 R14: 0000000000008000 R15: ffff8880545091e0 FS: 000055555d0c5880(0000) GS:ffff8880eb3e3000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f915c55b178 CR3: 0000000050d20000 CR4: 0000000000352ef0 Call Trace: f2fs_i_links_write home/cc/linux/fs/f2fs/f2fs.h:3194 [inline] f2fs_drop_nlink+0xd1/0x3c0 home/cc/linux/fs/f2fs/dir.c:845 f2fs_delete_entry+0x542/0x1450 home/cc/linux/fs/f2fs/dir.c:909 f2fs_unlink+0x45c/0x890 home/cc/linux/fs/f2fs/namei.c:581 vfs_unlink+0x2fb/0x9b0 home/cc/linux/fs/namei.c:4544 do_unlinkat+0x4c5/0x6a0 home/cc/linux/fs/namei.c:4608 __do_sys_unlink home/cc/linux/fs/namei.c:4654 [inline] __se_sys_unlink home/cc/linux/fs/namei.c:4652 [inline] __x64_sys_unlink+0xc5/0x110 home/cc/linux/fs/namei.c:4652 do_syscall_x64 home/cc/linux/arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xc7/0x250 home/cc/linux/arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7fb3d092324b Code: 73 01 c3 48 c7 c1 c0 ff ff ff f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa b8 57 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 c0 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007ffdc232d938 EFLAGS: 00000206 ORIG_RAX: 0000000000000057 RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007fb3d092324b RDX: 00007ffdc232d960 RSI: 00007ffdc232d960 RDI: 00007ffdc232d9f0 RBP: 00007ffdc232d9f0 R08: 0000000000000001 R09: 00007ffdc232d7c0 R10: 00000000fffffffd R11: 0000000000000206 R12: 00007ffdc232eaf0 R13: 000055555d0cebb0 R14: 00007ffdc232d958 R15: 0000000000000001 Cc: stable@vger.kernel.org Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Greg Kroah-Hartman --- fs/f2fs/namei.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 6f70f377f1211..781b872fac8c2 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -560,6 +560,15 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry) goto fail; } + if (unlikely(inode->i_nlink == 0)) { + f2fs_warn(F2FS_I_SB(inode), "%s: inode (ino=%lx) has zero i_nlink", + __func__, inode->i_ino); + err = -EFSCORRUPTED; + set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK); + f2fs_put_page(page, 0); + goto fail; + } + f2fs_balance_fs(sbi, true); f2fs_lock_op(sbi); -- GitLab From ee1b421c469876544e297ec1090574bd76100247 Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Mon, 14 Apr 2025 18:55:20 +0800 Subject: [PATCH 1313/2211] f2fs: fix to do sanity check on sit_bitmap_size commit 5db0d252c64e91ba1929c70112352e85dc5751e7 upstream. w/ below testcase, resize will generate a corrupted image which contains inconsistent metadata, so when mounting such image, it will trigger kernel panic: touch img truncate -s $((512*1024*1024*1024)) img mkfs.f2fs -f img $((256*1024*1024)) resize.f2fs -s -i img -t $((1024*1024*1024)) mount img /mnt/f2fs ------------[ cut here ]------------ kernel BUG at fs/f2fs/segment.h:863! Oops: invalid opcode: 0000 [#1] SMP PTI CPU: 11 UID: 0 PID: 3922 Comm: mount Not tainted 6.15.0-rc1+ #191 PREEMPT(voluntary) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 RIP: 0010:f2fs_ra_meta_pages+0x47c/0x490 Call Trace: f2fs_build_segment_manager+0x11c3/0x2600 f2fs_fill_super+0xe97/0x2840 mount_bdev+0xf4/0x140 legacy_get_tree+0x2b/0x50 vfs_get_tree+0x29/0xd0 path_mount+0x487/0xaf0 __x64_sys_mount+0x116/0x150 do_syscall_64+0x82/0x190 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7fdbfde1bcfe The reaseon is: sit_i->bitmap_size is 192, so size of sit bitmap is 192*8=1536, at maximum there are 1536 sit blocks, however MAIN_SEGS is 261893, so that sit_blk_cnt is 4762, build_sit_entries() -> current_sit_addr() tries to access out-of-boundary in sit_bitmap at offset from [1536, 4762), once sit_bitmap and sit_bitmap_mirror is not the same, it will trigger f2fs_bug_on(). Let's add sanity check in f2fs_sanity_check_ckpt() to avoid panic. Cc: stable@vger.kernel.org Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Greg Kroah-Hartman --- fs/f2fs/super.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index faa76531246eb..b1ab7ee2adf9c 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -3659,6 +3659,7 @@ int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi) block_t user_block_count, valid_user_blocks; block_t avail_node_count, valid_node_count; unsigned int nat_blocks, nat_bits_bytes, nat_bits_blocks; + unsigned int sit_blk_cnt; int i, j; total = le32_to_cpu(raw_super->segment_count); @@ -3770,6 +3771,13 @@ skip_cross: return 1; } + sit_blk_cnt = DIV_ROUND_UP(main_segs, SIT_ENTRY_PER_BLOCK); + if (sit_bitmap_size * 8 < sit_blk_cnt) { + f2fs_err(sbi, "Wrong bitmap size: sit: %u, sit_blk_cnt:%u", + sit_bitmap_size, sit_blk_cnt); + return 1; + } + cp_pack_start_sum = __start_sum_addr(sbi); cp_payload = __cp_payload(sbi); if (cp_pack_start_sum < cp_payload + 1 || -- GitLab From 83e2ba8971ccd8fc08319fc7593288f070d80a76 Mon Sep 17 00:00:00 2001 From: Gui-Dong Han Date: Fri, 6 Jun 2025 07:16:40 +0000 Subject: [PATCH 1314/2211] hwmon: (ftsteutates) Fix TOCTOU race in fts_read() commit 14c9ede9ca4cd078ad76a6ab9617b81074eb58bf upstream. In the fts_read() function, when handling hwmon_pwm_auto_channels_temp, the code accesses the shared variable data->fan_source[channel] twice without holding any locks. It is first checked against FTS_FAN_SOURCE_INVALID, and if the check passes, it is read again when used as an argument to the BIT() macro. This creates a Time-of-Check to Time-of-Use (TOCTOU) race condition. Another thread executing fts_update_device() can modify the value of data->fan_source[channel] between the check and its use. If the value is changed to FTS_FAN_SOURCE_INVALID (0xff) during this window, the BIT() macro will be called with a large shift value (BIT(255)). A bit shift by a value greater than or equal to the type width is undefined behavior and can lead to a crash or incorrect values being returned to userspace. Fix this by reading data->fan_source[channel] into a local variable once, eliminating the race condition. Additionally, add a bounds check to ensure the value is less than BITS_PER_LONG before passing it to the BIT() macro, making the code more robust against undefined behavior. This possible bug was found by an experimental static analysis tool developed by our team. Fixes: 1c5759d8ce05 ("hwmon: (ftsteutates) Replace fanX_source with pwmX_auto_channels_temp") Cc: stable@vger.kernel.org Signed-off-by: Gui-Dong Han Link: https://lore.kernel.org/r/20250606071640.501262-1-hanguidong02@gmail.com Signed-off-by: Guenter Roeck Signed-off-by: Greg Kroah-Hartman --- drivers/hwmon/ftsteutates.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/hwmon/ftsteutates.c b/drivers/hwmon/ftsteutates.c index a3a07662e4917..8aeec16a7a905 100644 --- a/drivers/hwmon/ftsteutates.c +++ b/drivers/hwmon/ftsteutates.c @@ -423,13 +423,16 @@ static int fts_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, break; case hwmon_pwm: switch (attr) { - case hwmon_pwm_auto_channels_temp: - if (data->fan_source[channel] == FTS_FAN_SOURCE_INVALID) + case hwmon_pwm_auto_channels_temp: { + u8 fan_source = data->fan_source[channel]; + + if (fan_source == FTS_FAN_SOURCE_INVALID || fan_source >= BITS_PER_LONG) *val = 0; else - *val = BIT(data->fan_source[channel]); + *val = BIT(fan_source); return 0; + } default: break; } -- GitLab From 55c3dbd8389636161090a2b2b6d2d709b9602e9c Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Wed, 18 Jun 2025 09:36:50 +0200 Subject: [PATCH 1315/2211] NFC: nci: uart: Set tty->disc_data only in success path commit fc27ab48904ceb7e4792f0c400f1ef175edf16fe upstream. Setting tty->disc_data before opening the NCI device means we need to clean it up on error paths. This also opens some short window if device starts sending data, even before NCIUARTSETDRIVER IOCTL succeeded (broken hardware?). Close the window by exposing tty->disc_data only on the success path, when opening of the NCI device and try_module_get() succeeds. The code differs in error path in one aspect: tty->disc_data won't be ever assigned thus NULL-ified. This however should not be relevant difference, because of "tty->disc_data=NULL" in nci_uart_tty_open(). Cc: Linus Torvalds Fixes: 9961127d4bce ("NFC: nci: add generic uart support") Cc: Signed-off-by: Krzysztof Kozlowski Reviewed-by: Greg Kroah-Hartman Link: https://patch.msgid.link/20250618073649.25049-2-krzysztof.kozlowski@linaro.org Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- net/nfc/nci/uart.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/net/nfc/nci/uart.c b/net/nfc/nci/uart.c index ed1508a9e093e..aab107727f186 100644 --- a/net/nfc/nci/uart.c +++ b/net/nfc/nci/uart.c @@ -119,22 +119,22 @@ static int nci_uart_set_driver(struct tty_struct *tty, unsigned int driver) memcpy(nu, nci_uart_drivers[driver], sizeof(struct nci_uart)); nu->tty = tty; - tty->disc_data = nu; skb_queue_head_init(&nu->tx_q); INIT_WORK(&nu->write_work, nci_uart_write_work); spin_lock_init(&nu->rx_lock); ret = nu->ops.open(nu); if (ret) { - tty->disc_data = NULL; kfree(nu); + return ret; } else if (!try_module_get(nu->owner)) { nu->ops.close(nu); - tty->disc_data = NULL; kfree(nu); return -ENOENT; } - return ret; + tty->disc_data = nu; + + return 0; } /* ------ LDISC part ------ */ -- GitLab From 8a008c89e5e5c5332e4c0a33d707db9ddd529f8a Mon Sep 17 00:00:00 2001 From: Hyunwoo Kim Date: Fri, 13 Jun 2025 20:54:57 -0400 Subject: [PATCH 1316/2211] net/sched: fix use-after-free in taprio_dev_notifier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit b160766e26d4e2e2d6fe2294e0b02f92baefcec5 upstream. Since taprio’s taprio_dev_notifier() isn’t protected by an RCU read-side critical section, a race with advance_sched() can lead to a use-after-free. Adding rcu_read_lock() inside taprio_dev_notifier() prevents this. Fixes: fed87cc6718a ("net/sched: taprio: automatically calculate queueMaxSDU based on TC gate durations") Cc: stable@vger.kernel.org Signed-off-by: Hyunwoo Kim Reviewed-by: Simon Horman Reviewed-by: Eric Dumazet Link: https://patch.msgid.link/aEzIYYxt0is9upYG@v4bel-B760M-AORUS-ELITE-AX Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- net/sched/sch_taprio.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c index 8623dc0bafc09..3142715d7e41e 100644 --- a/net/sched/sch_taprio.c +++ b/net/sched/sch_taprio.c @@ -1328,13 +1328,15 @@ static int taprio_dev_notifier(struct notifier_block *nb, unsigned long event, stab = rtnl_dereference(q->root->stab); - oper = rtnl_dereference(q->oper_sched); + rcu_read_lock(); + oper = rcu_dereference(q->oper_sched); if (oper) taprio_update_queue_max_sdu(q, oper, stab); - admin = rtnl_dereference(q->admin_sched); + admin = rcu_dereference(q->admin_sched); if (admin) taprio_update_queue_max_sdu(q, admin, stab); + rcu_read_unlock(); break; } -- GitLab From 81c64c2f84ab581d1c45dbbbca941c13128faee6 Mon Sep 17 00:00:00 2001 From: Heiner Kallweit Date: Tue, 17 Jun 2025 20:20:17 +0200 Subject: [PATCH 1317/2211] net: ftgmac100: select FIXED_PHY commit ae409629e022fbebbc6d31a1bfeccdbbeee20fd6 upstream. Depending on e.g. DT configuration this driver uses a fixed link. So we shouldn't rely on the user to enable FIXED_PHY, select it in Kconfig instead. We may end up with a non-functional driver otherwise. Fixes: 38561ded50d0 ("net: ftgmac100: support fixed link") Cc: stable@vger.kernel.org Signed-off-by: Heiner Kallweit Link: https://patch.msgid.link/476bb33b-5584-40f0-826a-7294980f2895@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/faraday/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/ethernet/faraday/Kconfig b/drivers/net/ethernet/faraday/Kconfig index c699bd6bcbb93..474073c7f94d7 100644 --- a/drivers/net/ethernet/faraday/Kconfig +++ b/drivers/net/ethernet/faraday/Kconfig @@ -31,6 +31,7 @@ config FTGMAC100 depends on ARM || COMPILE_TEST depends on !64BIT || BROKEN select PHYLIB + select FIXED_PHY select MDIO_ASPEED if MACH_ASPEED_G6 select CRC32 help -- GitLab From fb5873b779dd5858123c19bbd6959566771e2e83 Mon Sep 17 00:00:00 2001 From: Lu Baolu Date: Tue, 20 May 2025 15:58:49 +0800 Subject: [PATCH 1318/2211] iommu/vt-d: Restore context entry setup order for aliased devices commit 320302baed05c6456164652541f23d2a96522c06 upstream. Commit 2031c469f816 ("iommu/vt-d: Add support for static identity domain") changed the context entry setup during domain attachment from a set-and-check policy to a clear-and-reset approach. This inadvertently introduced a regression affecting PCI aliased devices behind PCIe-to-PCI bridges. Specifically, keyboard and touchpad stopped working on several Apple Macbooks with below messages: kernel: platform pxa2xx-spi.3: Adding to iommu group 20 kernel: input: Apple SPI Keyboard as /devices/pci0000:00/0000:00:1e.3/pxa2xx-spi.3/spi_master/spi2/spi-APP000D:00/input/input0 kernel: DMAR: DRHD: handling fault status reg 3 kernel: DMAR: [DMA Read NO_PASID] Request device [00:1e.3] fault addr 0xffffa000 [fault reason 0x06] PTE Read access is not set kernel: DMAR: DRHD: handling fault status reg 3 kernel: DMAR: [DMA Read NO_PASID] Request device [00:1e.3] fault addr 0xffffa000 [fault reason 0x06] PTE Read access is not set kernel: applespi spi-APP000D:00: Error writing to device: 01 0e 00 00 kernel: DMAR: DRHD: handling fault status reg 3 kernel: DMAR: [DMA Read NO_PASID] Request device [00:1e.3] fault addr 0xffffa000 [fault reason 0x06] PTE Read access is not set kernel: DMAR: DRHD: handling fault status reg 3 kernel: applespi spi-APP000D:00: Error writing to device: 01 0e 00 00 Fix this by restoring the previous context setup order. Fixes: 2031c469f816 ("iommu/vt-d: Add support for static identity domain") Closes: https://lore.kernel.org/all/4dada48a-c5dd-4c30-9c85-5b03b0aa01f0@bfh.ch/ Cc: stable@vger.kernel.org Signed-off-by: Lu Baolu Reviewed-by: Kevin Tian Reviewed-by: Yi Liu Link: https://lore.kernel.org/r/20250514060523.2862195-1-baolu.lu@linux.intel.com Link: https://lore.kernel.org/r/20250520075849.755012-2-baolu.lu@linux.intel.com Signed-off-by: Joerg Roedel Signed-off-by: Greg Kroah-Hartman --- drivers/iommu/intel/iommu.c | 11 +++++++++++ drivers/iommu/intel/iommu.h | 1 + drivers/iommu/intel/nested.c | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index 157542c07aaaf..56e9f125cda9a 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -1970,6 +1970,7 @@ static int dmar_domain_attach_device(struct dmar_domain *domain, return ret; info->domain = domain; + info->domain_attached = true; spin_lock_irqsave(&domain->lock, flags); list_add(&info->link, &domain->devices); spin_unlock_irqrestore(&domain->lock, flags); @@ -3381,6 +3382,10 @@ void device_block_translation(struct device *dev) struct intel_iommu *iommu = info->iommu; unsigned long flags; + /* Device in DMA blocking state. Noting to do. */ + if (!info->domain_attached) + return; + if (info->domain) cache_tag_unassign_domain(info->domain, dev, IOMMU_NO_PASID); @@ -3393,6 +3398,9 @@ void device_block_translation(struct device *dev) domain_context_clear(info); } + /* Device now in DMA blocking state. */ + info->domain_attached = false; + if (!info->domain) return; @@ -4406,6 +4414,9 @@ static int device_set_dirty_tracking(struct list_head *devices, bool enable) break; } + if (!ret) + info->domain_attached = true; + return ret; } diff --git a/drivers/iommu/intel/iommu.h b/drivers/iommu/intel/iommu.h index 1497f3112b12c..6f16eeb2ac655 100644 --- a/drivers/iommu/intel/iommu.h +++ b/drivers/iommu/intel/iommu.h @@ -776,6 +776,7 @@ struct device_domain_info { u8 ats_supported:1; u8 ats_enabled:1; u8 dtlb_extra_inval:1; /* Quirk for devices need extra flush */ + u8 domain_attached:1; /* Device has domain attached */ u8 ats_qdep; struct device *dev; /* it's NULL for PCIe-to-PCI bridge */ struct intel_iommu *iommu; /* IOMMU used by this device */ diff --git a/drivers/iommu/intel/nested.c b/drivers/iommu/intel/nested.c index 433c58944401f..3b5251034a871 100644 --- a/drivers/iommu/intel/nested.c +++ b/drivers/iommu/intel/nested.c @@ -27,8 +27,7 @@ static int intel_nested_attach_dev(struct iommu_domain *domain, unsigned long flags; int ret = 0; - if (info->domain) - device_block_translation(dev); + device_block_translation(dev); if (iommu->agaw < dmar_domain->s2_domain->agaw) { dev_err_ratelimited(dev, "Adjusted guest address width not compatible\n"); @@ -62,6 +61,7 @@ static int intel_nested_attach_dev(struct iommu_domain *domain, goto unassign_tag; info->domain = dmar_domain; + info->domain_attached = true; spin_lock_irqsave(&dmar_domain->lock, flags); list_add(&info->link, &dmar_domain->devices); spin_unlock_irqrestore(&dmar_domain->lock, flags); -- GitLab From 3f2098f4fba7718eb2501207ca6e99d22427f25a Mon Sep 17 00:00:00 2001 From: Murad Masimov Date: Mon, 28 Apr 2025 18:34:06 +0300 Subject: [PATCH 1319/2211] fbdev: Fix do_register_framebuffer to prevent null-ptr-deref in fb_videomode_to_var commit 17186f1f90d34fa701e4f14e6818305151637b9e upstream. If fb_add_videomode() in do_register_framebuffer() fails to allocate memory for fb_videomode, it will later lead to a null-ptr dereference in fb_videomode_to_var(), as the fb_info is registered while not having the mode in modelist that is expected to be there, i.e. the one that is described in fb_info->var. ================================================================ general protection fault, probably for non-canonical address 0xdffffc0000000001: 0000 [#1] PREEMPT SMP KASAN NOPTI KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f] CPU: 1 PID: 30371 Comm: syz-executor.1 Not tainted 5.10.226-syzkaller #0 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014 RIP: 0010:fb_videomode_to_var+0x24/0x610 drivers/video/fbdev/core/modedb.c:901 Call Trace: display_to_var+0x3a/0x7c0 drivers/video/fbdev/core/fbcon.c:929 fbcon_resize+0x3e2/0x8f0 drivers/video/fbdev/core/fbcon.c:2071 resize_screen drivers/tty/vt/vt.c:1176 [inline] vc_do_resize+0x53a/0x1170 drivers/tty/vt/vt.c:1263 fbcon_modechanged+0x3ac/0x6e0 drivers/video/fbdev/core/fbcon.c:2720 fbcon_update_vcs+0x43/0x60 drivers/video/fbdev/core/fbcon.c:2776 do_fb_ioctl+0x6d2/0x740 drivers/video/fbdev/core/fbmem.c:1128 fb_ioctl+0xe7/0x150 drivers/video/fbdev/core/fbmem.c:1203 vfs_ioctl fs/ioctl.c:48 [inline] __do_sys_ioctl fs/ioctl.c:753 [inline] __se_sys_ioctl fs/ioctl.c:739 [inline] __x64_sys_ioctl+0x19a/0x210 fs/ioctl.c:739 do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46 entry_SYSCALL_64_after_hwframe+0x67/0xd1 ================================================================ Even though fbcon_init() checks beforehand if fb_match_mode() in var_to_display() fails, it can not prevent the panic because fbcon_init() does not return error code. Considering this and the comment in the code about fb_match_mode() returning NULL - "This should not happen" - it is better to prevent registering the fb_info if its mode was not set successfully. Also move fb_add_videomode() closer to the beginning of do_register_framebuffer() to avoid having to do the cleanup on fail. Found by Linux Verification Center (linuxtesting.org) with Syzkaller. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Cc: stable@vger.kernel.org Signed-off-by: Murad Masimov Signed-off-by: Helge Deller Signed-off-by: Greg Kroah-Hartman --- drivers/video/fbdev/core/fbmem.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 3c568cff2913e..e1557d80768ff 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -388,7 +388,7 @@ static int fb_check_foreignness(struct fb_info *fi) static int do_register_framebuffer(struct fb_info *fb_info) { - int i; + int i, err = 0; struct fb_videomode mode; if (fb_check_foreignness(fb_info)) @@ -397,10 +397,18 @@ static int do_register_framebuffer(struct fb_info *fb_info) if (num_registered_fb == FB_MAX) return -ENXIO; - num_registered_fb++; for (i = 0 ; i < FB_MAX; i++) if (!registered_fb[i]) break; + + if (!fb_info->modelist.prev || !fb_info->modelist.next) + INIT_LIST_HEAD(&fb_info->modelist); + + fb_var_to_videomode(&mode, &fb_info->var); + err = fb_add_videomode(&mode, &fb_info->modelist); + if (err < 0) + return err; + fb_info->node = i; refcount_set(&fb_info->count, 1); mutex_init(&fb_info->lock); @@ -426,16 +434,12 @@ static int do_register_framebuffer(struct fb_info *fb_info) if (bitmap_empty(fb_info->pixmap.blit_y, FB_MAX_BLIT_HEIGHT)) bitmap_fill(fb_info->pixmap.blit_y, FB_MAX_BLIT_HEIGHT); - if (!fb_info->modelist.prev || !fb_info->modelist.next) - INIT_LIST_HEAD(&fb_info->modelist); - if (fb_info->skip_vt_switch) pm_vt_switch_required(fb_info->device, false); else pm_vt_switch_required(fb_info->device, true); - fb_var_to_videomode(&mode, &fb_info->var); - fb_add_videomode(&mode, &fb_info->modelist); + num_registered_fb++; registered_fb[i] = fb_info; #ifdef CONFIG_GUMSTIX_AM200EPD -- GitLab From 4904bd82673b5ac70c4062d6f4318d04fa451587 Mon Sep 17 00:00:00 2001 From: Niravkumar L Rabara Date: Tue, 27 May 2025 07:57:07 -0700 Subject: [PATCH 1320/2211] EDAC/altera: Use correct write width with the INTTEST register commit e5ef4cd2a47f27c0c9d8ff6c0f63a18937c071a3 upstream. On the SoCFPGA platform, the INTTEST register supports only 16-bit writes. A 32-bit write triggers an SError to the CPU so do 16-bit accesses only. [ bp: AI-massage the commit message. ] Fixes: c7b4be8db8bc ("EDAC, altera: Add Arria10 OCRAM ECC support") Signed-off-by: Niravkumar L Rabara Signed-off-by: Matthew Gerlach Signed-off-by: Borislav Petkov (AMD) Acked-by: Dinh Nguyen Cc: stable@kernel.org Link: https://lore.kernel.org/20250527145707.25458-1-matthew.gerlach@altera.com Signed-off-by: Greg Kroah-Hartman --- drivers/edac/altera_edac.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c index 8420862c90a4d..a059964b97f8c 100644 --- a/drivers/edac/altera_edac.c +++ b/drivers/edac/altera_edac.c @@ -1746,9 +1746,9 @@ altr_edac_a10_device_trig(struct file *file, const char __user *user_buf, local_irq_save(flags); if (trig_type == ALTR_UE_TRIGGER_CHAR) - writel(priv->ue_set_mask, set_addr); + writew(priv->ue_set_mask, set_addr); else - writel(priv->ce_set_mask, set_addr); + writew(priv->ce_set_mask, set_addr); /* Ensure the interrupt test bits are set */ wmb(); @@ -1778,7 +1778,7 @@ altr_edac_a10_device_trig2(struct file *file, const char __user *user_buf, local_irq_save(flags); if (trig_type == ALTR_UE_TRIGGER_CHAR) { - writel(priv->ue_set_mask, set_addr); + writew(priv->ue_set_mask, set_addr); } else { /* Setup read/write of 4 bytes */ writel(ECC_WORD_WRITE, drvdata->base + ECC_BLK_DBYTECTRL_OFST); -- GitLab From b3071bb463ea1e6c686d0dc9638fc940f2f5cf17 Mon Sep 17 00:00:00 2001 From: Murad Masimov Date: Mon, 28 Apr 2025 18:34:07 +0300 Subject: [PATCH 1321/2211] fbdev: Fix fb_set_var to prevent null-ptr-deref in fb_videomode_to_var commit 05f6e183879d9785a3cdf2f08a498bc31b7a20aa upstream. If fb_add_videomode() in fb_set_var() fails to allocate memory for fb_videomode, later it may lead to a null-ptr dereference in fb_videomode_to_var(), as the fb_info is registered while not having the mode in modelist that is expected to be there, i.e. the one that is described in fb_info->var. ================================================================ general protection fault, probably for non-canonical address 0xdffffc0000000001: 0000 [#1] PREEMPT SMP KASAN NOPTI KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f] CPU: 1 PID: 30371 Comm: syz-executor.1 Not tainted 5.10.226-syzkaller #0 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014 RIP: 0010:fb_videomode_to_var+0x24/0x610 drivers/video/fbdev/core/modedb.c:901 Call Trace: display_to_var+0x3a/0x7c0 drivers/video/fbdev/core/fbcon.c:929 fbcon_resize+0x3e2/0x8f0 drivers/video/fbdev/core/fbcon.c:2071 resize_screen drivers/tty/vt/vt.c:1176 [inline] vc_do_resize+0x53a/0x1170 drivers/tty/vt/vt.c:1263 fbcon_modechanged+0x3ac/0x6e0 drivers/video/fbdev/core/fbcon.c:2720 fbcon_update_vcs+0x43/0x60 drivers/video/fbdev/core/fbcon.c:2776 do_fb_ioctl+0x6d2/0x740 drivers/video/fbdev/core/fbmem.c:1128 fb_ioctl+0xe7/0x150 drivers/video/fbdev/core/fbmem.c:1203 vfs_ioctl fs/ioctl.c:48 [inline] __do_sys_ioctl fs/ioctl.c:753 [inline] __se_sys_ioctl fs/ioctl.c:739 [inline] __x64_sys_ioctl+0x19a/0x210 fs/ioctl.c:739 do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46 entry_SYSCALL_64_after_hwframe+0x67/0xd1 ================================================================ The reason is that fb_info->var is being modified in fb_set_var(), and then fb_videomode_to_var() is called. If it fails to add the mode to fb_info->modelist, fb_set_var() returns error, but does not restore the old value of fb_info->var. Restore fb_info->var on failure the same way it is done earlier in the function. Found by Linux Verification Center (linuxtesting.org) with Syzkaller. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Cc: stable@vger.kernel.org Signed-off-by: Murad Masimov Signed-off-by: Helge Deller Signed-off-by: Greg Kroah-Hartman --- drivers/video/fbdev/core/fbmem.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index e1557d80768ff..eca2498f24368 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -328,8 +328,10 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) !list_empty(&info->modelist)) ret = fb_add_videomode(&mode, &info->modelist); - if (ret) + if (ret) { + info->var = old_var; return ret; + } event.info = info; event.data = &mode; -- GitLab From 8d0645b59b19d97a3b7c5a3fb8dae0c89e98cde9 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Sat, 31 May 2025 15:26:27 +0200 Subject: [PATCH 1322/2211] parisc/unaligned: Fix hex output to show 8 hex chars commit 213205889d5ffc19cb8df06aa6778b2d4724c887 upstream. Change back printk format to 0x%08lx instead of %#08lx, since the latter does not seem to reliably format the value to 8 hex chars. Signed-off-by: Helge Deller Cc: stable@vger.kernel.org # v5.18+ Fixes: e5e9e7f222e5b ("parisc/unaligned: Enhance user-space visible output") Signed-off-by: Greg Kroah-Hartman --- arch/parisc/kernel/unaligned.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c index f4626943633ad..00e97204783ed 100644 --- a/arch/parisc/kernel/unaligned.c +++ b/arch/parisc/kernel/unaligned.c @@ -25,7 +25,7 @@ #define DPRINTF(fmt, args...) #endif -#define RFMT "%#08lx" +#define RFMT "0x%08lx" /* 1111 1100 0000 0000 0001 0011 1100 0000 */ #define OPCODE1(a,b,c) ((a)<<26|(b)<<12|(c)<<6) -- GitLab From f20fd54af4e1077fdbca4dd98375a4d1d941e50d Mon Sep 17 00:00:00 2001 From: GONG Ruiqi Date: Sun, 27 Apr 2025 10:53:03 +0800 Subject: [PATCH 1323/2211] vgacon: Add check for vc_origin address range in vgacon_scroll() commit 864f9963ec6b4b76d104d595ba28110b87158003 upstream. Our in-house Syzkaller reported the following BUG (twice), which we believed was the same issue with [1]: ================================================================== BUG: KASAN: slab-out-of-bounds in vcs_scr_readw+0xc2/0xd0 drivers/tty/vt/vt.c:4740 Read of size 2 at addr ffff88800f5bef60 by task syz.7.2620/12393 ... Call Trace: __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x72/0xa0 lib/dump_stack.c:106 print_address_description.constprop.0+0x6b/0x3d0 mm/kasan/report.c:364 print_report+0xba/0x280 mm/kasan/report.c:475 kasan_report+0xa9/0xe0 mm/kasan/report.c:588 vcs_scr_readw+0xc2/0xd0 drivers/tty/vt/vt.c:4740 vcs_write_buf_noattr drivers/tty/vt/vc_screen.c:493 [inline] vcs_write+0x586/0x840 drivers/tty/vt/vc_screen.c:690 vfs_write+0x219/0x960 fs/read_write.c:584 ksys_write+0x12e/0x260 fs/read_write.c:639 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x59/0x110 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x78/0xe2 ... Allocated by task 5614: kasan_save_stack+0x20/0x40 mm/kasan/common.c:45 kasan_set_track+0x25/0x30 mm/kasan/common.c:52 ____kasan_kmalloc mm/kasan/common.c:374 [inline] __kasan_kmalloc+0x8f/0xa0 mm/kasan/common.c:383 kasan_kmalloc include/linux/kasan.h:201 [inline] __do_kmalloc_node mm/slab_common.c:1007 [inline] __kmalloc+0x62/0x140 mm/slab_common.c:1020 kmalloc include/linux/slab.h:604 [inline] kzalloc include/linux/slab.h:721 [inline] vc_do_resize+0x235/0xf40 drivers/tty/vt/vt.c:1193 vgacon_adjust_height+0x2d4/0x350 drivers/video/console/vgacon.c:1007 vgacon_font_set+0x1f7/0x240 drivers/video/console/vgacon.c:1031 con_font_set drivers/tty/vt/vt.c:4628 [inline] con_font_op+0x4da/0xa20 drivers/tty/vt/vt.c:4675 vt_k_ioctl+0xa10/0xb30 drivers/tty/vt/vt_ioctl.c:474 vt_ioctl+0x14c/0x1870 drivers/tty/vt/vt_ioctl.c:752 tty_ioctl+0x655/0x1510 drivers/tty/tty_io.c:2779 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:871 [inline] __se_sys_ioctl+0x12d/0x190 fs/ioctl.c:857 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x59/0x110 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x78/0xe2 Last potentially related work creation: kasan_save_stack+0x20/0x40 mm/kasan/common.c:45 __kasan_record_aux_stack+0x94/0xa0 mm/kasan/generic.c:492 __call_rcu_common.constprop.0+0xc3/0xa10 kernel/rcu/tree.c:2713 netlink_release+0x620/0xc20 net/netlink/af_netlink.c:802 __sock_release+0xb5/0x270 net/socket.c:663 sock_close+0x1e/0x30 net/socket.c:1425 __fput+0x408/0xab0 fs/file_table.c:384 __fput_sync+0x4c/0x60 fs/file_table.c:465 __do_sys_close fs/open.c:1580 [inline] __se_sys_close+0x68/0xd0 fs/open.c:1565 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x59/0x110 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x78/0xe2 Second to last potentially related work creation: kasan_save_stack+0x20/0x40 mm/kasan/common.c:45 __kasan_record_aux_stack+0x94/0xa0 mm/kasan/generic.c:492 __call_rcu_common.constprop.0+0xc3/0xa10 kernel/rcu/tree.c:2713 netlink_release+0x620/0xc20 net/netlink/af_netlink.c:802 __sock_release+0xb5/0x270 net/socket.c:663 sock_close+0x1e/0x30 net/socket.c:1425 __fput+0x408/0xab0 fs/file_table.c:384 task_work_run+0x154/0x240 kernel/task_work.c:239 exit_task_work include/linux/task_work.h:45 [inline] do_exit+0x8e5/0x1320 kernel/exit.c:874 do_group_exit+0xcd/0x280 kernel/exit.c:1023 get_signal+0x1675/0x1850 kernel/signal.c:2905 arch_do_signal_or_restart+0x80/0x3b0 arch/x86/kernel/signal.c:310 exit_to_user_mode_loop kernel/entry/common.c:111 [inline] exit_to_user_mode_prepare include/linux/entry-common.h:328 [inline] __syscall_exit_to_user_mode_work kernel/entry/common.c:207 [inline] syscall_exit_to_user_mode+0x1b3/0x1e0 kernel/entry/common.c:218 do_syscall_64+0x66/0x110 arch/x86/entry/common.c:87 entry_SYSCALL_64_after_hwframe+0x78/0xe2 The buggy address belongs to the object at ffff88800f5be000 which belongs to the cache kmalloc-2k of size 2048 The buggy address is located 2656 bytes to the right of allocated 1280-byte region [ffff88800f5be000, ffff88800f5be500) ... Memory state around the buggy address: ffff88800f5bee00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc ffff88800f5bee80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc >ffff88800f5bef00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc ^ ffff88800f5bef80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc ffff88800f5bf000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ================================================================== By analyzing the vmcore, we found that vc->vc_origin was somehow placed one line prior to vc->vc_screenbuf when vc was in KD_TEXT mode, and further writings to /dev/vcs caused out-of-bounds reads (and writes right after) in vcs_write_buf_noattr(). Our further experiments show that in most cases, vc->vc_origin equals to vga_vram_base when the console is in KD_TEXT mode, and it's around vc->vc_screenbuf for the KD_GRAPHICS mode. But via triggerring a TIOCL_SETVESABLANK ioctl beforehand, we can make vc->vc_origin be around vc->vc_screenbuf while the console is in KD_TEXT mode, and then by writing the special 'ESC M' control sequence to the tty certain times (depends on the value of `vc->state.y - vc->vc_top`), we can eventually move vc->vc_origin prior to vc->vc_screenbuf. Here's the PoC, tested on QEMU: ``` int main() { const int RI_NUM = 10; // should be greater than `vc->state.y - vc->vc_top` int tty_fd, vcs_fd; const char *tty_path = "/dev/tty0"; const char *vcs_path = "/dev/vcs"; const char escape_seq[] = "\x1bM"; // ESC + M const char trigger_seq[] = "Let's trigger an OOB write."; struct vt_sizes vt_size = { 70, 2 }; int blank = TIOCL_BLANKSCREEN; tty_fd = open(tty_path, O_RDWR); char vesa_mode[] = { TIOCL_SETVESABLANK, 1 }; ioctl(tty_fd, TIOCLINUX, vesa_mode); ioctl(tty_fd, TIOCLINUX, &blank); ioctl(tty_fd, VT_RESIZE, &vt_size); for (int i = 0; i < RI_NUM; ++i) write(tty_fd, escape_seq, sizeof(escape_seq) - 1); vcs_fd = open(vcs_path, O_RDWR); write(vcs_fd, trigger_seq, sizeof(trigger_seq)); close(vcs_fd); close(tty_fd); return 0; } ``` To solve this problem, add an address range validation check in vgacon_scroll(), ensuring vc->vc_origin never precedes vc_screenbuf. Reported-by: syzbot+9c09fda97a1a65ea859b@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=9c09fda97a1a65ea859b [1] Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Cc: stable@vger.kernel.org Co-developed-by: Yi Yang Signed-off-by: Yi Yang Signed-off-by: GONG Ruiqi Signed-off-by: Helge Deller Signed-off-by: Greg Kroah-Hartman --- drivers/video/console/vgacon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 37bd18730fe0d..f9cdbf8c53e34 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -1168,7 +1168,7 @@ static bool vgacon_scroll(struct vc_data *c, unsigned int t, unsigned int b, c->vc_screenbuf_size - delta); c->vc_origin = vga_vram_end - c->vc_screenbuf_size; vga_rolled_over = 0; - } else + } else if (oldo - delta >= (unsigned long)c->vc_screenbuf) c->vc_origin -= delta; c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size; scr_memsetw((u16 *) (c->vc_origin), c->vc_video_erase_char, -- GitLab From 1aa41444c51051757bf9dfec3f0a268550efa0a9 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Tue, 20 May 2025 11:00:46 +0200 Subject: [PATCH 1324/2211] parisc: fix building with gcc-15 commit 7cbb015e2d3d6f180256cde0c908eab21268e7b9 upstream. The decompressor is built with the default C dialect, which is now gnu23 on gcc-15, and this clashes with the kernel's bool type definition: In file included from include/uapi/linux/posix_types.h:5, from arch/parisc/boot/compressed/misc.c:7: include/linux/stddef.h:11:9: error: cannot use keyword 'false' as enumeration constant 11 | false = 0, Add the -std=gnu11 argument here, as we do for all other architectures. Cc: stable@vger.kernel.org Signed-off-by: Arnd Bergmann Signed-off-by: Helge Deller Signed-off-by: Greg Kroah-Hartman --- arch/parisc/boot/compressed/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/parisc/boot/compressed/Makefile b/arch/parisc/boot/compressed/Makefile index 92227fa813dc3..17c42d718eb33 100644 --- a/arch/parisc/boot/compressed/Makefile +++ b/arch/parisc/boot/compressed/Makefile @@ -18,6 +18,7 @@ KBUILD_CFLAGS += -fno-PIE -mno-space-regs -mdisable-fpregs -Os ifndef CONFIG_64BIT KBUILD_CFLAGS += -mfast-indirect-calls endif +KBUILD_CFLAGS += -std=gnu11 LDFLAGS_vmlinux := -X -e startup --as-needed -T $(obj)/vmlinux: $(obj)/vmlinux.lds $(addprefix $(obj)/, $(OBJECTS)) $(LIBGCC) FORCE -- GitLab From 9f019fcb73661f0144764717433ed4c9b4f3b7d8 Mon Sep 17 00:00:00 2001 From: Da Xue Date: Mon, 12 May 2025 10:26:16 -0400 Subject: [PATCH 1325/2211] clk: meson-g12a: add missing fclk_div2 to spicc commit daf004f87c3520c414992893e2eadd5db5f86a5a upstream. SPICC is missing fclk_div2, which means fclk_div5 and fclk_div7 indexes are wrong on this clock. This causes the spicc module to output sclk at 2.5x the expected rate when clock index 3 is picked. Adding the missing fclk_div2 resolves this. [jbrunet: amended commit description] Fixes: a18c8e0b7697 ("clk: meson: g12a: add support for the SPICC SCLK Source clocks") Cc: stable@vger.kernel.org # 6.1 Signed-off-by: Da Xue Reviewed-by: Martin Blumenstingl Link: https://lore.kernel.org/r/20250512142617.2175291-1-da@libre.computer Signed-off-by: Jerome Brunet Signed-off-by: Greg Kroah-Hartman --- drivers/clk/meson/g12a.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c index 4f92b83965d5a..b72eebd0fa474 100644 --- a/drivers/clk/meson/g12a.c +++ b/drivers/clk/meson/g12a.c @@ -4099,6 +4099,7 @@ static const struct clk_parent_data spicc_sclk_parent_data[] = { { .hw = &g12a_clk81.hw }, { .hw = &g12a_fclk_div4.hw }, { .hw = &g12a_fclk_div3.hw }, + { .hw = &g12a_fclk_div2.hw }, { .hw = &g12a_fclk_div5.hw }, { .hw = &g12a_fclk_div7.hw }, }; -- GitLab From 68c173ea138b66d7dd1fd980c9bc578a18e11884 Mon Sep 17 00:00:00 2001 From: Jeongjun Park Date: Thu, 24 Apr 2025 23:33:22 +0900 Subject: [PATCH 1326/2211] ipc: fix to protect IPCS lookups using RCU commit d66adabe91803ef34a8b90613c81267b5ded1472 upstream. syzbot reported that it discovered a use-after-free vulnerability, [0] [0]: https://lore.kernel.org/all/67af13f8.050a0220.21dd3.0038.GAE@google.com/ idr_for_each() is protected by rwsem, but this is not enough. If it is not protected by RCU read-critical region, when idr_for_each() calls radix_tree_node_free() through call_rcu() to free the radix_tree_node structure, the node will be freed immediately, and when reading the next node in radix_tree_for_each_slot(), the already freed memory may be read. Therefore, we need to add code to make sure that idr_for_each() is protected within the RCU read-critical region when we call it in shm_destroy_orphaned(). Link: https://lkml.kernel.org/r/20250424143322.18830-1-aha310510@gmail.com Fixes: b34a6b1da371 ("ipc: introduce shm_rmid_forced sysctl") Signed-off-by: Jeongjun Park Reported-by: syzbot+a2b84e569d06ca3a949c@syzkaller.appspotmail.com Cc: Jeongjun Park Cc: Liam Howlett Cc: Lorenzo Stoakes Cc: Matthew Wilcox (Oracle) Cc: Vasiliy Kulikov Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- ipc/shm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ipc/shm.c b/ipc/shm.c index 99564c8700840..492fcc6999857 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -431,8 +431,11 @@ static int shm_try_destroy_orphaned(int id, void *p, void *data) void shm_destroy_orphaned(struct ipc_namespace *ns) { down_write(&shm_ids(ns).rwsem); - if (shm_ids(ns).in_use) + if (shm_ids(ns).in_use) { + rcu_read_lock(); idr_for_each(&shm_ids(ns).ipcs_idr, &shm_try_destroy_orphaned, ns); + rcu_read_unlock(); + } up_write(&shm_ids(ns).rwsem); } -- GitLab From f16a797dce66ec591093de173cd6dbf5b3ae668c Mon Sep 17 00:00:00 2001 From: Luo Gengkun Date: Mon, 21 Apr 2025 03:50:21 +0000 Subject: [PATCH 1327/2211] watchdog: fix watchdog may detect false positive of softlockup commit 7123dbbef88cfd9f09e8a7899b0911834600cfa3 upstream. When updating `watchdog_thresh`, there is a race condition between writing the new `watchdog_thresh` value and stopping the old watchdog timer. If the old timer triggers during this window, it may falsely detect a softlockup due to the old interval and the new `watchdog_thresh` value being used. The problem can be described as follow: # We asuume previous watchdog_thresh is 60, so the watchdog timer is # coming every 24s. echo 10 > /proc/sys/kernel/watchdog_thresh (User space) | +------>+ update watchdog_thresh (We are in kernel now) | | # using old interval and new `watchdog_thresh` +------>+ watchdog hrtimer (irq context: detect softlockup) | | +-------+ | | + softlockup_stop_all To fix this problem, introduce a shadow variable for `watchdog_thresh`. The update to the actual `watchdog_thresh` is delayed until after the old timer is stopped, preventing false positives. The following testcase may help to understand this problem. --------------------------------------------- echo RT_RUNTIME_SHARE > /sys/kernel/debug/sched/features echo -1 > /proc/sys/kernel/sched_rt_runtime_us echo 0 > /sys/kernel/debug/sched/fair_server/cpu3/runtime echo 60 > /proc/sys/kernel/watchdog_thresh taskset -c 3 chrt -r 99 /bin/bash -c "while true;do true; done" & echo 10 > /proc/sys/kernel/watchdog_thresh & --------------------------------------------- The test case above first removes the throttling restrictions for real-time tasks. It then sets watchdog_thresh to 60 and executes a real-time task ,a simple while(1) loop, on cpu3. Consequently, the final command gets blocked because the presence of this real-time thread prevents kworker:3 from being selected by the scheduler. This eventually triggers a softlockup detection on cpu3 due to watchdog_timer_fn operating with inconsistent variable - using both the old interval and the updated watchdog_thresh simultaneously. [nysal@linux.ibm.com: fix the SOFTLOCKUP_DETECTOR=n case] Link: https://lkml.kernel.org/r/20250502111120.282690-1-nysal@linux.ibm.com Link: https://lkml.kernel.org/r/20250421035021.3507649-1-luogengkun@huaweicloud.com Signed-off-by: Luo Gengkun Signed-off-by: Nysal Jan K.A. Cc: Doug Anderson Cc: Joel Granados Cc: Song Liu Cc: Thomas Gleinxer Cc: "Nysal Jan K.A." Cc: Venkat Rao Bagalkote Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- kernel/watchdog.c | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/kernel/watchdog.c b/kernel/watchdog.c index 4dc72540c3b0f..8fbb4385e8149 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -47,6 +47,7 @@ int __read_mostly watchdog_user_enabled = 1; static int __read_mostly watchdog_hardlockup_user_enabled = WATCHDOG_HARDLOCKUP_DEFAULT; static int __read_mostly watchdog_softlockup_user_enabled = 1; int __read_mostly watchdog_thresh = 10; +static int __read_mostly watchdog_thresh_next; static int __read_mostly watchdog_hardlockup_available; struct cpumask watchdog_cpumask __read_mostly; @@ -863,12 +864,20 @@ int lockup_detector_offline_cpu(unsigned int cpu) return 0; } -static void __lockup_detector_reconfigure(void) +static void __lockup_detector_reconfigure(bool thresh_changed) { cpus_read_lock(); watchdog_hardlockup_stop(); softlockup_stop_all(); + /* + * To prevent watchdog_timer_fn from using the old interval and + * the new watchdog_thresh at the same time, which could lead to + * false softlockup reports, it is necessary to update the + * watchdog_thresh after the softlockup is completed. + */ + if (thresh_changed) + watchdog_thresh = READ_ONCE(watchdog_thresh_next); set_sample_period(); lockup_detector_update_enable(); if (watchdog_enabled && watchdog_thresh) @@ -881,7 +890,7 @@ static void __lockup_detector_reconfigure(void) void lockup_detector_reconfigure(void) { mutex_lock(&watchdog_mutex); - __lockup_detector_reconfigure(); + __lockup_detector_reconfigure(false); mutex_unlock(&watchdog_mutex); } @@ -901,27 +910,29 @@ static __init void lockup_detector_setup(void) return; mutex_lock(&watchdog_mutex); - __lockup_detector_reconfigure(); + __lockup_detector_reconfigure(false); softlockup_initialized = true; mutex_unlock(&watchdog_mutex); } #else /* CONFIG_SOFTLOCKUP_DETECTOR */ -static void __lockup_detector_reconfigure(void) +static void __lockup_detector_reconfigure(bool thresh_changed) { cpus_read_lock(); watchdog_hardlockup_stop(); + if (thresh_changed) + watchdog_thresh = READ_ONCE(watchdog_thresh_next); lockup_detector_update_enable(); watchdog_hardlockup_start(); cpus_read_unlock(); } void lockup_detector_reconfigure(void) { - __lockup_detector_reconfigure(); + __lockup_detector_reconfigure(false); } static inline void lockup_detector_setup(void) { - __lockup_detector_reconfigure(); + __lockup_detector_reconfigure(false); } #endif /* !CONFIG_SOFTLOCKUP_DETECTOR */ @@ -939,11 +950,11 @@ void lockup_detector_soft_poweroff(void) #ifdef CONFIG_SYSCTL /* Propagate any changes to the watchdog infrastructure */ -static void proc_watchdog_update(void) +static void proc_watchdog_update(bool thresh_changed) { /* Remove impossible cpus to keep sysctl output clean. */ cpumask_and(&watchdog_cpumask, &watchdog_cpumask, cpu_possible_mask); - __lockup_detector_reconfigure(); + __lockup_detector_reconfigure(thresh_changed); } /* @@ -976,7 +987,7 @@ static int proc_watchdog_common(int which, const struct ctl_table *table, int wr old = READ_ONCE(*param); err = proc_dointvec_minmax(table, write, buffer, lenp, ppos); if (!err && old != READ_ONCE(*param)) - proc_watchdog_update(); + proc_watchdog_update(false); } mutex_unlock(&watchdog_mutex); return err; @@ -1027,11 +1038,13 @@ static int proc_watchdog_thresh(const struct ctl_table *table, int write, mutex_lock(&watchdog_mutex); - old = READ_ONCE(watchdog_thresh); + watchdog_thresh_next = READ_ONCE(watchdog_thresh); + + old = watchdog_thresh_next; err = proc_dointvec_minmax(table, write, buffer, lenp, ppos); - if (!err && write && old != READ_ONCE(watchdog_thresh)) - proc_watchdog_update(); + if (!err && write && old != READ_ONCE(watchdog_thresh_next)) + proc_watchdog_update(true); mutex_unlock(&watchdog_mutex); return err; @@ -1052,7 +1065,7 @@ static int proc_watchdog_cpumask(const struct ctl_table *table, int write, err = proc_do_large_bitmap(table, write, buffer, lenp, ppos); if (!err && write) - proc_watchdog_update(); + proc_watchdog_update(false); mutex_unlock(&watchdog_mutex); return err; @@ -1072,7 +1085,7 @@ static struct ctl_table watchdog_sysctls[] = { }, { .procname = "watchdog_thresh", - .data = &watchdog_thresh, + .data = &watchdog_thresh_next, .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_watchdog_thresh, -- GitLab From 764c9f69beabef8bdc651a7746c59f7a340d104f Mon Sep 17 00:00:00 2001 From: Shin'ichiro Kawasaki Date: Sat, 10 May 2025 19:10:36 +0900 Subject: [PATCH 1328/2211] RDMA/iwcm: Fix use-after-free of work objects after cm_id destruction commit 6883b680e703c6b2efddb4e7a8d891ce1803d06b upstream. The commit 59c68ac31e15 ("iw_cm: free cm_id resources on the last deref") simplified cm_id resource management by freeing cm_id once all references to the cm_id were removed. The references are removed either upon completion of iw_cm event handlers or when the application destroys the cm_id. This commit introduced the use-after-free condition where cm_id_private object could still be in use by event handler works during the destruction of cm_id. The commit aee2424246f9 ("RDMA/iwcm: Fix a use-after-free related to destroying CM IDs") addressed this use-after- free by flushing all pending works at the cm_id destruction. However, still another use-after-free possibility remained. It happens with the work objects allocated for each cm_id_priv within alloc_work_entries() during cm_id creation, and subsequently freed in dealloc_work_entries() once all references to the cm_id are removed. If the cm_id's last reference is decremented in the event handler work, the work object for the work itself gets removed, and causes the use- after-free BUG below: BUG: KASAN: slab-use-after-free in __pwq_activate_work+0x1ff/0x250 Read of size 8 at addr ffff88811f9cf800 by task kworker/u16:1/147091 CPU: 2 UID: 0 PID: 147091 Comm: kworker/u16:1 Not tainted 6.15.0-rc2+ #27 PREEMPT(voluntary) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-3.fc41 04/01/2014 Workqueue: 0x0 (iw_cm_wq) Call Trace: dump_stack_lvl+0x6a/0x90 print_report+0x174/0x554 ? __virt_addr_valid+0x208/0x430 ? __pwq_activate_work+0x1ff/0x250 kasan_report+0xae/0x170 ? __pwq_activate_work+0x1ff/0x250 __pwq_activate_work+0x1ff/0x250 pwq_dec_nr_in_flight+0x8c5/0xfb0 process_one_work+0xc11/0x1460 ? __pfx_process_one_work+0x10/0x10 ? assign_work+0x16c/0x240 worker_thread+0x5ef/0xfd0 ? __pfx_worker_thread+0x10/0x10 kthread+0x3b0/0x770 ? __pfx_kthread+0x10/0x10 ? rcu_is_watching+0x11/0xb0 ? _raw_spin_unlock_irq+0x24/0x50 ? rcu_is_watching+0x11/0xb0 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x30/0x70 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 Allocated by task 147416: kasan_save_stack+0x2c/0x50 kasan_save_track+0x10/0x30 __kasan_kmalloc+0xa6/0xb0 alloc_work_entries+0xa9/0x260 [iw_cm] iw_cm_connect+0x23/0x4a0 [iw_cm] rdma_connect_locked+0xbfd/0x1920 [rdma_cm] nvme_rdma_cm_handler+0x8e5/0x1b60 [nvme_rdma] cma_cm_event_handler+0xae/0x320 [rdma_cm] cma_work_handler+0x106/0x1b0 [rdma_cm] process_one_work+0x84f/0x1460 worker_thread+0x5ef/0xfd0 kthread+0x3b0/0x770 ret_from_fork+0x30/0x70 ret_from_fork_asm+0x1a/0x30 Freed by task 147091: kasan_save_stack+0x2c/0x50 kasan_save_track+0x10/0x30 kasan_save_free_info+0x37/0x60 __kasan_slab_free+0x4b/0x70 kfree+0x13a/0x4b0 dealloc_work_entries+0x125/0x1f0 [iw_cm] iwcm_deref_id+0x6f/0xa0 [iw_cm] cm_work_handler+0x136/0x1ba0 [iw_cm] process_one_work+0x84f/0x1460 worker_thread+0x5ef/0xfd0 kthread+0x3b0/0x770 ret_from_fork+0x30/0x70 ret_from_fork_asm+0x1a/0x30 Last potentially related work creation: kasan_save_stack+0x2c/0x50 kasan_record_aux_stack+0xa3/0xb0 __queue_work+0x2ff/0x1390 queue_work_on+0x67/0xc0 cm_event_handler+0x46a/0x820 [iw_cm] siw_cm_upcall+0x330/0x650 [siw] siw_cm_work_handler+0x6b9/0x2b20 [siw] process_one_work+0x84f/0x1460 worker_thread+0x5ef/0xfd0 kthread+0x3b0/0x770 ret_from_fork+0x30/0x70 ret_from_fork_asm+0x1a/0x30 This BUG is reproducible by repeating the blktests test case nvme/061 for the rdma transport and the siw driver. To avoid the use-after-free of cm_id_private work objects, ensure that the last reference to the cm_id is decremented not in the event handler works, but in the cm_id destruction context. For that purpose, move iwcm_deref_id() call from destroy_cm_id() to the callers of destroy_cm_id(). In iw_destroy_cm_id(), call iwcm_deref_id() after flushing the pending works. During the fix work, I noticed that iw_destroy_cm_id() is called from cm_work_handler() and process_event() context. However, the comment of iw_destroy_cm_id() notes that the function "cannot be called by the event thread". Drop the false comment. Closes: https://lore.kernel.org/linux-rdma/r5676e754sv35aq7cdsqrlnvyhiq5zktteaurl7vmfih35efko@z6lay7uypy3c/ Fixes: 59c68ac31e15 ("iw_cm: free cm_id resources on the last deref") Cc: stable@vger.kernel.org Signed-off-by: Shin'ichiro Kawasaki Link: https://patch.msgid.link/20250510101036.1756439-1-shinichiro.kawasaki@wdc.com Reviewed-by: Zhu Yanjun Signed-off-by: Leon Romanovsky Signed-off-by: Greg Kroah-Hartman --- drivers/infiniband/core/iwcm.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c index 7e3a55349e107..96a678250e553 100644 --- a/drivers/infiniband/core/iwcm.c +++ b/drivers/infiniband/core/iwcm.c @@ -366,12 +366,9 @@ EXPORT_SYMBOL(iw_cm_disconnect); /* * CM_ID <-- DESTROYING * - * Clean up all resources associated with the connection and release - * the initial reference taken by iw_create_cm_id. - * - * Returns true if and only if the last cm_id_priv reference has been dropped. + * Clean up all resources associated with the connection. */ -static bool destroy_cm_id(struct iw_cm_id *cm_id) +static void destroy_cm_id(struct iw_cm_id *cm_id) { struct iwcm_id_private *cm_id_priv; struct ib_qp *qp; @@ -440,20 +437,22 @@ static bool destroy_cm_id(struct iw_cm_id *cm_id) iwpm_remove_mapinfo(&cm_id->local_addr, &cm_id->m_local_addr); iwpm_remove_mapping(&cm_id->local_addr, RDMA_NL_IWCM); } - - return iwcm_deref_id(cm_id_priv); } /* - * This function is only called by the application thread and cannot - * be called by the event thread. The function will wait for all - * references to be released on the cm_id and then kfree the cm_id - * object. + * Destroy cm_id. If the cm_id still has other references, wait for all + * references to be released on the cm_id and then release the initial + * reference taken by iw_create_cm_id. */ void iw_destroy_cm_id(struct iw_cm_id *cm_id) { - if (!destroy_cm_id(cm_id)) + struct iwcm_id_private *cm_id_priv; + + cm_id_priv = container_of(cm_id, struct iwcm_id_private, id); + destroy_cm_id(cm_id); + if (refcount_read(&cm_id_priv->refcount) > 1) flush_workqueue(iwcm_wq); + iwcm_deref_id(cm_id_priv); } EXPORT_SYMBOL(iw_destroy_cm_id); @@ -1033,8 +1032,10 @@ static void cm_work_handler(struct work_struct *_work) if (!test_bit(IWCM_F_DROP_EVENTS, &cm_id_priv->flags)) { ret = process_event(cm_id_priv, &levent); - if (ret) - WARN_ON_ONCE(destroy_cm_id(&cm_id_priv->id)); + if (ret) { + destroy_cm_id(&cm_id_priv->id); + WARN_ON_ONCE(iwcm_deref_id(cm_id_priv)); + } } else pr_debug("dropping event %d\n", levent.event); if (iwcm_deref_id(cm_id_priv)) -- GitLab From 02137179ffc924fed484be3760d576ab527de074 Mon Sep 17 00:00:00 2001 From: Jinliang Zheng Date: Tue, 15 Apr 2025 17:02:32 +0800 Subject: [PATCH 1329/2211] mm: fix ratelimit_pages update error in dirty_ratio_handler() commit f83f362d40ccceb647f7d80eb92206733d76a36b upstream. In dirty_ratio_handler(), vm_dirty_bytes must be set to zero before calling writeback_set_ratelimit(), as global_dirty_limits() always prioritizes the value of vm_dirty_bytes. It's domain_dirty_limits() that's relevant here, not node_dirty_ok: dirty_ratio_handler writeback_set_ratelimit global_dirty_limits(&dirty_thresh) <- ratelimit_pages based on dirty_thresh domain_dirty_limits if (bytes) <- bytes = vm_dirty_bytes <--------+ thresh = f1(bytes) <- prioritizes vm_dirty_bytes | else | thresh = f2(ratio) | ratelimit_pages = f3(dirty_thresh) | vm_dirty_bytes = 0 <- it's late! ---------------------+ This causes ratelimit_pages to still use the value calculated based on vm_dirty_bytes, which is wrong now. The impact visible to userspace is difficult to capture directly because there is no procfs/sysfs interface exported to user space. However, it will have a real impact on the balance of dirty pages. For example: 1. On default, we have vm_dirty_ratio=40, vm_dirty_bytes=0 2. echo 8192 > dirty_bytes, then vm_dirty_bytes=8192, vm_dirty_ratio=0, and ratelimit_pages is calculated based on vm_dirty_bytes now. 3. echo 20 > dirty_ratio, then since vm_dirty_bytes is not reset to zero when writeback_set_ratelimit() -> global_dirty_limits() -> domain_dirty_limits() is called, reallimit_pages is still calculated based on vm_dirty_bytes instead of vm_dirty_ratio. This does not conform to the actual intent of the user. Link: https://lkml.kernel.org/r/20250415090232.7544-1-alexjlzheng@tencent.com Fixes: 9d823e8f6b1b ("writeback: per task dirty rate limit") Signed-off-by: Jinliang Zheng Reviewed-by: MengEn Sun Cc: Andrea Righi Cc: Fenggaung Wu Cc: Jinliang Zheng Cc: Matthew Wilcox (Oracle) Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- mm/page-writeback.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/page-writeback.c b/mm/page-writeback.c index fcd4c1439cb9c..bfb3f903bb6d5 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -543,8 +543,8 @@ static int dirty_ratio_handler(const struct ctl_table *table, int write, void *b ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); if (ret == 0 && write && vm_dirty_ratio != old_ratio) { - writeback_set_ratelimit(); vm_dirty_bytes = 0; + writeback_set_ratelimit(); } return ret; } -- GitLab From a8ec526969cf28458f7ce4d4b5a58389da496c91 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Mon, 24 Mar 2025 14:24:48 +0100 Subject: [PATCH 1330/2211] soc: qcom: pmic_glink_altmode: fix spurious DP hotplug events commit 5090ac9191a19c61beeade60d3d839e509fab640 upstream. The PMIC GLINK driver is currently generating DisplayPort hotplug notifications whenever something is connected to (or disconnected from) a port regardless of the type of notification sent by the firmware. These notifications are forwarded to user space by the DRM subsystem as connector "change" uevents: KERNEL[1556.223776] change /devices/platform/soc@0/ae00000.display-subsystem/ae01000.display-controller/drm/card0 (drm) ACTION=change DEVPATH=/devices/platform/soc@0/ae00000.display-subsystem/ae01000.display-controller/drm/card0 SUBSYSTEM=drm HOTPLUG=1 CONNECTOR=36 DEVNAME=/dev/dri/card0 DEVTYPE=drm_minor SEQNUM=4176 MAJOR=226 MINOR=0 On the Lenovo ThinkPad X13s and T14s, the PMIC GLINK firmware sends two identical notifications with orientation information when connecting a charger, each generating a bogus DRM hotplug event. On the X13s, two such notification are also sent every 90 seconds while a charger remains connected, which again are forwarded to user space: port = 1, svid = ff00, mode = 255, hpd_state = 0 payload = 01 00 00 00 00 00 00 ff 00 00 00 00 00 00 00 00 Note that the firmware only sends on of these when connecting an ethernet adapter. Fix the spurious hotplug events by only forwarding hotplug notifications for the Type-C DisplayPort service id. This also reduces the number of uevents from four to two when an actual DisplayPort altmode device is connected: port = 0, svid = ff01, mode = 2, hpd_state = 0 payload = 00 01 02 00 f2 0c 01 ff 03 00 00 00 00 00 00 00 port = 0, svid = ff01, mode = 2, hpd_state = 1 payload = 00 01 02 00 f2 0c 01 ff 43 00 00 00 00 00 00 00 Fixes: 080b4e24852b ("soc: qcom: pmic_glink: Introduce altmode support") Cc: stable@vger.kernel.org # 6.3 Cc: Bjorn Andersson Reported-by: Clayton Craft Signed-off-by: Johan Hovold Acked-by: Konrad Dybcio Tested-by: Clayton Craft Link: https://lore.kernel.org/r/20250324132448.6134-1-johan+linaro@kernel.org Signed-off-by: Bjorn Andersson Signed-off-by: Greg Kroah-Hartman --- drivers/soc/qcom/pmic_glink_altmode.c | 30 +++++++++++++++++---------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/drivers/soc/qcom/pmic_glink_altmode.c b/drivers/soc/qcom/pmic_glink_altmode.c index 463b1c5288318..db25f406878b0 100644 --- a/drivers/soc/qcom/pmic_glink_altmode.c +++ b/drivers/soc/qcom/pmic_glink_altmode.c @@ -219,21 +219,29 @@ static void pmic_glink_altmode_worker(struct work_struct *work) { struct pmic_glink_altmode_port *alt_port = work_to_altmode_port(work); struct pmic_glink_altmode *altmode = alt_port->altmode; + enum drm_connector_status conn_status; typec_switch_set(alt_port->typec_switch, alt_port->orientation); - if (alt_port->svid == USB_TYPEC_DP_SID && alt_port->mode == 0xff) - pmic_glink_altmode_safe(altmode, alt_port); - else if (alt_port->svid == USB_TYPEC_DP_SID) - pmic_glink_altmode_enable_dp(altmode, alt_port, alt_port->mode, - alt_port->hpd_state, alt_port->hpd_irq); - else - pmic_glink_altmode_enable_usb(altmode, alt_port); + if (alt_port->svid == USB_TYPEC_DP_SID) { + if (alt_port->mode == 0xff) { + pmic_glink_altmode_safe(altmode, alt_port); + } else { + pmic_glink_altmode_enable_dp(altmode, alt_port, + alt_port->mode, + alt_port->hpd_state, + alt_port->hpd_irq); + } - drm_aux_hpd_bridge_notify(&alt_port->bridge->dev, - alt_port->hpd_state ? - connector_status_connected : - connector_status_disconnected); + if (alt_port->hpd_state) + conn_status = connector_status_connected; + else + conn_status = connector_status_disconnected; + + drm_aux_hpd_bridge_notify(&alt_port->bridge->dev, conn_status); + } else { + pmic_glink_altmode_enable_usb(altmode, alt_port); + } pmic_glink_altmode_request(altmode, ALTMODE_PAN_ACK, alt_port->index); } -- GitLab From 015f04ac884a454d4d8aaa7b67758f047742b1cf Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 30 Apr 2025 13:33:31 -0700 Subject: [PATCH 1331/2211] configfs-tsm-report: Fix NULL dereference of tsm_ops commit fba4ceaa242d2bdf4c04b77bda41d32d02d3925d upstream. Unlike sysfs, the lifetime of configfs objects is controlled by userspace. There is no mechanism for the kernel to find and delete all created config-items. Instead, the configfs-tsm-report mechanism has an expectation that tsm_unregister() can happen at any time and cause established config-item access to start failing. That expectation is not fully satisfied. While tsm_report_read(), tsm_report_{is,is_bin}_visible(), and tsm_report_make_item() safely fail if tsm_ops have been unregistered, tsm_report_privlevel_store() tsm_report_provider_show() fail to check for ops registration. Add the missing checks for tsm_ops having been removed. Now, in supporting the ability for tsm_unregister() to always succeed, it leaves the problem of what to do with lingering config-items. The expectation is that the admin that arranges for the ->remove() (unbind) of the ${tsm_arch}-guest driver is also responsible for deletion of all open config-items. Until that deletion happens, ->probe() (reload / bind) of the ${tsm_arch}-guest driver fails. This allows for emergency shutdown / revocation of attestation interfaces, and requires coordinated restart. Fixes: 70e6f7e2b985 ("configfs-tsm: Introduce a shared ABI for attestation reports") Cc: stable@vger.kernel.org Cc: Suzuki K Poulose Cc: Steven Price Cc: Sami Mujawar Cc: Borislav Petkov (AMD) Cc: Tom Lendacky Reviewed-by: Kuppuswamy Sathyanarayanan Reported-by: Cedric Xing Reviewed-by: Kai Huang Link: https://patch.msgid.link/20250430203331.1177062-1-dan.j.williams@intel.com Signed-off-by: Dan Williams Signed-off-by: Greg Kroah-Hartman --- drivers/virt/coco/tsm.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/drivers/virt/coco/tsm.c b/drivers/virt/coco/tsm.c index 9432d4e303f16..8a638bc34d4a9 100644 --- a/drivers/virt/coco/tsm.c +++ b/drivers/virt/coco/tsm.c @@ -15,6 +15,7 @@ static struct tsm_provider { const struct tsm_ops *ops; void *data; + atomic_t count; } provider; static DECLARE_RWSEM(tsm_rwsem); @@ -92,6 +93,10 @@ static ssize_t tsm_report_privlevel_store(struct config_item *cfg, if (rc) return rc; + guard(rwsem_write)(&tsm_rwsem); + if (!provider.ops) + return -ENXIO; + /* * The valid privilege levels that a TSM might accept, if it accepts a * privilege level setting at all, are a max of TSM_PRIVLEVEL_MAX (see @@ -101,7 +106,6 @@ static ssize_t tsm_report_privlevel_store(struct config_item *cfg, if (provider.ops->privlevel_floor > val || val > TSM_PRIVLEVEL_MAX) return -EINVAL; - guard(rwsem_write)(&tsm_rwsem); rc = try_advance_write_generation(report); if (rc) return rc; @@ -115,6 +119,10 @@ static ssize_t tsm_report_privlevel_floor_show(struct config_item *cfg, char *buf) { guard(rwsem_read)(&tsm_rwsem); + + if (!provider.ops) + return -ENXIO; + return sysfs_emit(buf, "%u\n", provider.ops->privlevel_floor); } CONFIGFS_ATTR_RO(tsm_report_, privlevel_floor); @@ -217,6 +225,9 @@ CONFIGFS_ATTR_RO(tsm_report_, generation); static ssize_t tsm_report_provider_show(struct config_item *cfg, char *buf) { guard(rwsem_read)(&tsm_rwsem); + if (!provider.ops) + return -ENXIO; + return sysfs_emit(buf, "%s\n", provider.ops->name); } CONFIGFS_ATTR_RO(tsm_report_, provider); @@ -284,7 +295,7 @@ static ssize_t tsm_report_read(struct tsm_report *report, void *buf, guard(rwsem_write)(&tsm_rwsem); ops = provider.ops; if (!ops) - return -ENOTTY; + return -ENXIO; if (!report->desc.inblob_len) return -EINVAL; @@ -421,12 +432,20 @@ static struct config_item *tsm_report_make_item(struct config_group *group, if (!state) return ERR_PTR(-ENOMEM); + atomic_inc(&provider.count); config_item_init_type_name(&state->cfg, name, &tsm_report_type); return &state->cfg; } +static void tsm_report_drop_item(struct config_group *group, struct config_item *item) +{ + config_item_put(item); + atomic_dec(&provider.count); +} + static struct configfs_group_operations tsm_report_group_ops = { .make_item = tsm_report_make_item, + .drop_item = tsm_report_drop_item, }; static const struct config_item_type tsm_reports_type = { @@ -459,6 +478,11 @@ int tsm_register(const struct tsm_ops *ops, void *priv) return -EBUSY; } + if (atomic_read(&provider.count)) { + pr_err("configfs/tsm/report not empty\n"); + return -EBUSY; + } + provider.ops = ops; provider.data = priv; return 0; @@ -470,6 +494,9 @@ int tsm_unregister(const struct tsm_ops *ops) guard(rwsem_write)(&tsm_rwsem); if (ops != provider.ops) return -EBUSY; + if (atomic_read(&provider.count)) + pr_warn("\"%s\" unregistered with items present in configfs/tsm/report\n", + provider.ops->name); provider.ops = NULL; provider.data = NULL; return 0; -- GitLab From 462eee6d42485f7e7daadcc3b4a0dd7d5e6f0d38 Mon Sep 17 00:00:00 2001 From: Sibi Sankar Date: Tue, 29 Apr 2025 15:11:06 +0100 Subject: [PATCH 1332/2211] firmware: arm_scmi: Ensure that the message-id supports fastchannel commit 94a263f981a3fa3d93f65c31e0fed0756736be43 upstream. Currently the perf and powercap protocol relies on the protocol domain attributes, which just ensures that one fastchannel per domain, before instantiating fastchannels for all possible message-ids. Fix this by ensuring that each message-id supports fastchannel before initialization. Logs: | scmi: Failed to get FC for protocol 13 [MSG_ID:6 / RES_ID:0] - ret:-95. Using regular messaging | scmi: Failed to get FC for protocol 13 [MSG_ID:6 / RES_ID:1] - ret:-95. Using regular messaging | scmi: Failed to get FC for protocol 13 [MSG_ID:6 / RES_ID:2] - ret:-95. Using regular messaging CC: stable@vger.kernel.org Reported-by: Johan Hovold Closes: https://lore.kernel.org/lkml/ZoQjAWse2YxwyRJv@hovoldconsulting.com/ Fixes: 6f9ea4dabd2d ("firmware: arm_scmi: Generalize the fast channel support") Reviewed-by: Johan Hovold Tested-by: Johan Hovold Signed-off-by: Sibi Sankar [Cristian: Modified the condition checked to establish support or not] Signed-off-by: Cristian Marussi Message-Id: <20250429141108.406045-2-cristian.marussi@arm.com> Signed-off-by: Sudeep Holla Signed-off-by: Greg Kroah-Hartman --- drivers/firmware/arm_scmi/driver.c | 76 +++++++++++++++------------ drivers/firmware/arm_scmi/protocols.h | 2 + 2 files changed, 45 insertions(+), 33 deletions(-) diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c index 993615fa490eb..f1abe605865ad 100644 --- a/drivers/firmware/arm_scmi/driver.c +++ b/drivers/firmware/arm_scmi/driver.c @@ -1708,6 +1708,39 @@ static int scmi_common_get_max_msg_size(const struct scmi_protocol_handle *ph) return info->desc->max_msg_size; } +/** + * scmi_protocol_msg_check - Check protocol message attributes + * + * @ph: A reference to the protocol handle. + * @message_id: The ID of the message to check. + * @attributes: A parameter to optionally return the retrieved message + * attributes, in case of Success. + * + * An helper to check protocol message attributes for a specific protocol + * and message pair. + * + * Return: 0 on SUCCESS + */ +static int scmi_protocol_msg_check(const struct scmi_protocol_handle *ph, + u32 message_id, u32 *attributes) +{ + int ret; + struct scmi_xfer *t; + + ret = xfer_get_init(ph, PROTOCOL_MESSAGE_ATTRIBUTES, + sizeof(__le32), 0, &t); + if (ret) + return ret; + + put_unaligned_le32(message_id, t->tx.buf); + ret = do_xfer(ph, t); + if (!ret && attributes) + *attributes = get_unaligned_le32(t->rx.buf); + xfer_put(ph, t); + + return ret; +} + /** * struct scmi_iterator - Iterator descriptor * @msg: A reference to the message TX buffer; filled by @prepare_message with @@ -1849,6 +1882,7 @@ scmi_common_fastchannel_init(const struct scmi_protocol_handle *ph, int ret; u32 flags; u64 phys_addr; + u32 attributes; u8 size; void __iomem *addr; struct scmi_xfer *t; @@ -1857,6 +1891,15 @@ scmi_common_fastchannel_init(const struct scmi_protocol_handle *ph, struct scmi_msg_resp_desc_fc *resp; const struct scmi_protocol_instance *pi = ph_to_pi(ph); + /* Check if the MSG_ID supports fastchannel */ + ret = scmi_protocol_msg_check(ph, message_id, &attributes); + if (ret || !MSG_SUPPORTS_FASTCHANNEL(attributes)) { + dev_dbg(ph->dev, + "Skip FC init for 0x%02X/%d domain:%d - ret:%d\n", + pi->proto->id, message_id, domain, ret); + return; + } + if (!p_addr) { ret = -EINVAL; goto err_out; @@ -1984,39 +2027,6 @@ static void scmi_common_fastchannel_db_ring(struct scmi_fc_db_info *db) #endif } -/** - * scmi_protocol_msg_check - Check protocol message attributes - * - * @ph: A reference to the protocol handle. - * @message_id: The ID of the message to check. - * @attributes: A parameter to optionally return the retrieved message - * attributes, in case of Success. - * - * An helper to check protocol message attributes for a specific protocol - * and message pair. - * - * Return: 0 on SUCCESS - */ -static int scmi_protocol_msg_check(const struct scmi_protocol_handle *ph, - u32 message_id, u32 *attributes) -{ - int ret; - struct scmi_xfer *t; - - ret = xfer_get_init(ph, PROTOCOL_MESSAGE_ATTRIBUTES, - sizeof(__le32), 0, &t); - if (ret) - return ret; - - put_unaligned_le32(message_id, t->tx.buf); - ret = do_xfer(ph, t); - if (!ret && attributes) - *attributes = get_unaligned_le32(t->rx.buf); - xfer_put(ph, t); - - return ret; -} - static const struct scmi_proto_helpers_ops helpers_ops = { .extended_name_get = scmi_common_extended_name_get, .get_max_msg_size = scmi_common_get_max_msg_size, diff --git a/drivers/firmware/arm_scmi/protocols.h b/drivers/firmware/arm_scmi/protocols.h index aaee57cdcd558..d62c4469d1fd9 100644 --- a/drivers/firmware/arm_scmi/protocols.h +++ b/drivers/firmware/arm_scmi/protocols.h @@ -31,6 +31,8 @@ #define SCMI_PROTOCOL_VENDOR_BASE 0x80 +#define MSG_SUPPORTS_FASTCHANNEL(x) ((x) & BIT(0)) + enum scmi_common_cmd { PROTOCOL_VERSION = 0x0, PROTOCOL_ATTRIBUTES = 0x1, -- GitLab From bb2c7c5e30a136c065c64ad20a3756873ac5fac5 Mon Sep 17 00:00:00 2001 From: Wentao Liang Date: Mon, 26 May 2025 11:43:44 +0800 Subject: [PATCH 1333/2211] mtd: rawnand: sunxi: Add randomizer configuration in sunxi_nfc_hw_ecc_write_chunk commit 44ed1f5ff73e9e115b6f5411744d5a22ea1c855b upstream. The function sunxi_nfc_hw_ecc_write_chunk() calls the sunxi_nfc_hw_ecc_write_chunk(), but does not call the configuration function sunxi_nfc_randomizer_config(). Consequently, the randomization might not conduct correctly, which will affect the lifespan of NAND flash. A proper implementation can be found in sunxi_nfc_hw_ecc_write_page_dma(). Add the sunxi_nfc_randomizer_config() to config randomizer. Fixes: 4be4e03efc7f ("mtd: nand: sunxi: add randomizer support") Cc: stable@vger.kernel.org # v4.6 Signed-off-by: Wentao Liang Signed-off-by: Miquel Raynal Signed-off-by: Greg Kroah-Hartman --- drivers/mtd/nand/raw/sunxi_nand.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/mtd/nand/raw/sunxi_nand.c b/drivers/mtd/nand/raw/sunxi_nand.c index c28634e20abf8..a0ec7bfb6283e 100644 --- a/drivers/mtd/nand/raw/sunxi_nand.c +++ b/drivers/mtd/nand/raw/sunxi_nand.c @@ -1049,6 +1049,7 @@ static int sunxi_nfc_hw_ecc_write_chunk(struct nand_chip *nand, if (ret) return ret; + sunxi_nfc_randomizer_config(nand, page, false); sunxi_nfc_randomizer_enable(nand); sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand, oob, 0, bbm, page); -- GitLab From 850931ba01c8846d9f06db98087c3d6a01c69474 Mon Sep 17 00:00:00 2001 From: Wentao Liang Date: Mon, 19 May 2025 23:42:24 +0800 Subject: [PATCH 1334/2211] mtd: nand: sunxi: Add randomizer configuration before randomizer enable commit 4a5a99bc79cdc4be63933653682b0261a67a0c9f upstream. In sunxi_nfc_hw_ecc_read_chunk(), the sunxi_nfc_randomizer_enable() is called without the config of randomizer. A proper implementation can be found in sunxi_nfc_hw_ecc_read_chunks_dma(). Add sunxi_nfc_randomizer_config() before the start of randomization. Fixes: 4be4e03efc7f ("mtd: nand: sunxi: add randomizer support") Cc: stable@vger.kernel.org # v4.6 Signed-off-by: Wentao Liang Signed-off-by: Miquel Raynal Signed-off-by: Greg Kroah-Hartman --- drivers/mtd/nand/raw/sunxi_nand.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/mtd/nand/raw/sunxi_nand.c b/drivers/mtd/nand/raw/sunxi_nand.c index a0ec7bfb6283e..ac887754b98e2 100644 --- a/drivers/mtd/nand/raw/sunxi_nand.c +++ b/drivers/mtd/nand/raw/sunxi_nand.c @@ -817,6 +817,7 @@ static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip *nand, if (ret) return ret; + sunxi_nfc_randomizer_config(nand, page, false); sunxi_nfc_randomizer_enable(nand); writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP, nfc->regs + NFC_REG_CMD); -- GitLab From 264edbfc3ba16043c983e26ef2beb0fa752004ae Mon Sep 17 00:00:00 2001 From: Yosry Ahmed Date: Tue, 29 Apr 2025 08:32:15 -0700 Subject: [PATCH 1335/2211] KVM: SVM: Clear current_vmcb during vCPU free for all *possible* CPUs commit 1bee4838eb3a2c689f23c7170ea66ae87ea7d93a upstream. When freeing a vCPU and thus its VMCB, clear current_vmcb for all possible CPUs, not just online CPUs, as it's theoretically possible a CPU could go offline and come back online in conjunction with KVM reusing the page for a new VMCB. Link: https://lore.kernel.org/all/20250320013759.3965869-1-yosry.ahmed@linux.dev Fixes: fd65d3142f73 ("kvm: svm: Ensure an IBPB on all affected CPUs when freeing a vmcb") Cc: stable@vger.kernel.org Cc: Jim Mattson Signed-off-by: Yosry Ahmed [sean: split to separate patch, write changelog] Signed-off-by: Sean Christopherson Signed-off-by: Greg Kroah-Hartman --- arch/x86/kvm/svm/svm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index 7cbacd0439211..1f42a71b15c02 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -1483,7 +1483,7 @@ static void svm_clear_current_vmcb(struct vmcb *vmcb) { int i; - for_each_online_cpu(i) + for_each_possible_cpu(i) cmpxchg(per_cpu_ptr(&svm_data.current_vmcb, i), vmcb, NULL); } -- GitLab From a9a76d58ba587d440446dee9f6d4b3329eaa0b13 Mon Sep 17 00:00:00 2001 From: Chao Gao Date: Mon, 24 Mar 2025 22:08:48 +0800 Subject: [PATCH 1336/2211] KVM: VMX: Flush shadow VMCS on emergency reboot commit a0ee1d5faff135e28810f29e0f06328c66f89852 upstream. Ensure the shadow VMCS cache is evicted during an emergency reboot to prevent potential memory corruption if the cache is evicted after reboot. This issue was identified through code inspection, as __loaded_vmcs_clear() flushes both the normal VMCS and the shadow VMCS. Avoid checking the "launched" state during an emergency reboot, unlike the behavior in __loaded_vmcs_clear(). This is important because reboot NMIs can interfere with operations like copy_shadow_to_vmcs12(), where shadow VMCSes are loaded directly using VMPTRLD. In such cases, if NMIs occur right after the VMCS load, the shadow VMCSes will be active but the "launched" state may not be set. Fixes: 16f5b9034b69 ("KVM: nVMX: Copy processor-specific shadow-vmcs to VMCS12") Cc: stable@vger.kernel.org Signed-off-by: Chao Gao Reviewed-by: Kai Huang Link: https://lore.kernel.org/r/20250324140849.2099723-1-chao.gao@intel.com Signed-off-by: Sean Christopherson Signed-off-by: Greg Kroah-Hartman --- arch/x86/kvm/vmx/vmx.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index a3d45b01dbadf..bcbedddacc480 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -770,8 +770,11 @@ void vmx_emergency_disable_virtualization_cpu(void) return; list_for_each_entry(v, &per_cpu(loaded_vmcss_on_cpu, cpu), - loaded_vmcss_on_cpu_link) + loaded_vmcss_on_cpu_link) { vmcs_clear(v->vmcs); + if (v->shadow_vmcs) + vmcs_clear(v->shadow_vmcs); + } kvm_cpu_vmxoff(); } -- GitLab From e93624e6458dfcb9ea42116c10e23b640f8600b5 Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Tue, 3 Jun 2025 18:53:17 +0200 Subject: [PATCH 1337/2211] dm-mirror: fix a tiny race condition commit 829451beaed6165eb11d7a9fb4e28eb17f489980 upstream. There's a tiny race condition in dm-mirror. The functions queue_bio and write_callback grab a spinlock, add a bio to the list, drop the spinlock and wake up the mirrord thread that processes bios in the list. It may be possible that the mirrord thread processes the bio just after spin_unlock_irqrestore is called, before wakeup_mirrord. This spurious wake-up is normally harmless, however if the device mapper device is unloaded just after the bio was processed, it may be possible that wakeup_mirrord(ms) uses invalid "ms" pointer. Fix this bug by moving wakeup_mirrord inside the spinlock. Signed-off-by: Mikulas Patocka Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/md/dm-raid1.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 9511dae5b556a..94b6c43dfa5cb 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -133,10 +133,9 @@ static void queue_bio(struct mirror_set *ms, struct bio *bio, int rw) spin_lock_irqsave(&ms->lock, flags); should_wake = !(bl->head); bio_list_add(bl, bio); - spin_unlock_irqrestore(&ms->lock, flags); - if (should_wake) wakeup_mirrord(ms); + spin_unlock_irqrestore(&ms->lock, flags); } static void dispatch_bios(void *context, struct bio_list *bio_list) @@ -646,9 +645,9 @@ static void write_callback(unsigned long error, void *context) if (!ms->failures.head) should_wake = 1; bio_list_add(&ms->failures, bio); - spin_unlock_irqrestore(&ms->lock, flags); if (should_wake) wakeup_mirrord(ms); + spin_unlock_irqrestore(&ms->lock, flags); } static void do_write(struct mirror_set *ms, struct bio *bio) -- GitLab From e3cf1ef5717e23f1d3cd3f730a5293460b09d71a Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Tue, 3 Jun 2025 18:55:50 +0200 Subject: [PATCH 1338/2211] dm-verity: fix a memory leak if some arguments are specified multiple times commit 66be40a14e496689e1f0add50118408e22c96169 upstream. If some of the arguments "check_at_most_once", "ignore_zero_blocks", "use_fec_from_device", "root_hash_sig_key_desc" were specified more than once on the target line, a memory leak would happen. This commit fixes the memory leak. It also fixes error handling in verity_verify_sig_parse_opt_args. Signed-off-by: Mikulas Patocka Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/md/dm-verity-fec.c | 4 ++++ drivers/md/dm-verity-target.c | 8 +++++++- drivers/md/dm-verity-verify-sig.c | 17 +++++++++++++---- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c index 6bd9848518d47..559b8179ac502 100644 --- a/drivers/md/dm-verity-fec.c +++ b/drivers/md/dm-verity-fec.c @@ -604,6 +604,10 @@ int verity_fec_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v, (*argc)--; if (!strcasecmp(arg_name, DM_VERITY_OPT_FEC_DEV)) { + if (v->fec->dev) { + ti->error = "FEC device already specified"; + return -EINVAL; + } r = dm_get_device(ti, arg_value, BLK_OPEN_READ, &v->fec->dev); if (r) { ti->error = "FEC device lookup failed"; diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 53ba0fbdf495c..ce0462e751a61 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -1080,6 +1080,9 @@ static int verity_alloc_most_once(struct dm_verity *v) { struct dm_target *ti = v->ti; + if (v->validated_blocks) + return 0; + /* the bitset can only handle INT_MAX blocks */ if (v->data_blocks > INT_MAX) { ti->error = "device too large to use check_at_most_once"; @@ -1103,6 +1106,9 @@ static int verity_alloc_zero_digest(struct dm_verity *v) struct dm_verity_io *io; u8 *zero_data; + if (v->zero_digest) + return 0; + v->zero_digest = kmalloc(v->digest_size, GFP_KERNEL); if (!v->zero_digest) @@ -1537,7 +1543,7 @@ static int verity_ctr(struct dm_target *ti, unsigned int argc, char **argv) goto bad; } - /* Root hash signature is a optional parameter*/ + /* Root hash signature is an optional parameter */ r = verity_verify_root_hash(root_hash_digest_to_validate, strlen(root_hash_digest_to_validate), verify_args.sig, diff --git a/drivers/md/dm-verity-verify-sig.c b/drivers/md/dm-verity-verify-sig.c index a9e2c6c0a33c6..d5261a0e4232e 100644 --- a/drivers/md/dm-verity-verify-sig.c +++ b/drivers/md/dm-verity-verify-sig.c @@ -71,9 +71,14 @@ int verity_verify_sig_parse_opt_args(struct dm_arg_set *as, const char *arg_name) { struct dm_target *ti = v->ti; - int ret = 0; + int ret; const char *sig_key = NULL; + if (v->signature_key_desc) { + ti->error = DM_VERITY_VERIFY_ERR("root_hash_sig_key_desc already specified"); + return -EINVAL; + } + if (!*argc) { ti->error = DM_VERITY_VERIFY_ERR("Signature key not specified"); return -EINVAL; @@ -83,14 +88,18 @@ int verity_verify_sig_parse_opt_args(struct dm_arg_set *as, (*argc)--; ret = verity_verify_get_sig_from_key(sig_key, sig_opts); - if (ret < 0) + if (ret < 0) { ti->error = DM_VERITY_VERIFY_ERR("Invalid key specified"); + return ret; + } v->signature_key_desc = kstrdup(sig_key, GFP_KERNEL); - if (!v->signature_key_desc) + if (!v->signature_key_desc) { + ti->error = DM_VERITY_VERIFY_ERR("Could not allocate memory for signature key"); return -ENOMEM; + } - return ret; + return 0; } /* -- GitLab From d6bf5ad1a5e30854d2c8610b9be3fdb6fbe3493d Mon Sep 17 00:00:00 2001 From: Md Sadre Alam Date: Thu, 10 Apr 2025 15:30:19 +0530 Subject: [PATCH 1339/2211] mtd: rawnand: qcom: Fix read len for onfi param page commit e6031b11544b44966ba020c867fe438bccd3bdfa upstream. The minimum size to fetch the data from device to QPIC buffer is 512-bytes. If size is less than 512-bytes the data will not be protected by ECC as per QPIC standard. So while reading onfi parameter page from NAND device set nandc->buf_count = 512. Cc: stable@vger.kernel.org Fixes: 89550beb098e ("mtd: rawnand: qcom: Implement exec_op()") Reviewed-by: Manivannan Sadhasivam Tested-by: Lakshmi Sowjanya D Signed-off-by: Md Sadre Alam Signed-off-by: Miquel Raynal Signed-off-by: Greg Kroah-Hartman --- drivers/mtd/nand/raw/qcom_nandc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c index b8cff9240b286..beafca6ba0df4 100644 --- a/drivers/mtd/nand/raw/qcom_nandc.c +++ b/drivers/mtd/nand/raw/qcom_nandc.c @@ -2917,7 +2917,7 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_ write_reg_dma(nandc, NAND_DEV_CMD1, 1, NAND_BAM_NEXT_SGL); } - nandc->buf_count = len; + nandc->buf_count = 512; memset(nandc->data_buffer, 0xff, nandc->buf_count); config_nand_single_cw_page_read(chip, false, 0); -- GitLab From 8e89c17dc8970c5f71a3a991f5724d4c8de42d8c Mon Sep 17 00:00:00 2001 From: Ye Bin Date: Thu, 29 May 2025 19:19:54 +0800 Subject: [PATCH 1340/2211] ftrace: Fix UAF when lookup kallsym after ftrace disabled commit f914b52c379c12288b7623bb814d0508dbe7481d upstream. The following issue happens with a buggy module: BUG: unable to handle page fault for address: ffffffffc05d0218 PGD 1bd66f067 P4D 1bd66f067 PUD 1bd671067 PMD 101808067 PTE 0 Oops: Oops: 0000 [#1] SMP KASAN PTI Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS RIP: 0010:sized_strscpy+0x81/0x2f0 RSP: 0018:ffff88812d76fa08 EFLAGS: 00010246 RAX: 0000000000000000 RBX: ffffffffc0601010 RCX: dffffc0000000000 RDX: 0000000000000038 RSI: dffffc0000000000 RDI: ffff88812608da2d RBP: 8080808080808080 R08: ffff88812608da2d R09: ffff88812608da68 R10: ffff88812608d82d R11: ffff88812608d810 R12: 0000000000000038 R13: ffff88812608da2d R14: ffffffffc05d0218 R15: fefefefefefefeff FS: 00007fef552de740(0000) GS:ffff8884251c7000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffffffffc05d0218 CR3: 00000001146f0000 CR4: 00000000000006f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: ftrace_mod_get_kallsym+0x1ac/0x590 update_iter_mod+0x239/0x5b0 s_next+0x5b/0xa0 seq_read_iter+0x8c9/0x1070 seq_read+0x249/0x3b0 proc_reg_read+0x1b0/0x280 vfs_read+0x17f/0x920 ksys_read+0xf3/0x1c0 do_syscall_64+0x5f/0x2e0 entry_SYSCALL_64_after_hwframe+0x76/0x7e The above issue may happen as follows: (1) Add kprobe tracepoint; (2) insmod test.ko; (3) Module triggers ftrace disabled; (4) rmmod test.ko; (5) cat /proc/kallsyms; --> Will trigger UAF as test.ko already removed; ftrace_mod_get_kallsym() ... strscpy(module_name, mod_map->mod->name, MODULE_NAME_LEN); ... The problem is when a module triggers an issue with ftrace and sets ftrace_disable. The ftrace_disable is set when an anomaly is discovered and to prevent any more damage, ftrace stops all text modification. The issue that happened was that the ftrace_disable stops more than just the text modification. When a module is loaded, its init functions can also be traced. Because kallsyms deletes the init functions after a module has loaded, ftrace saves them when the module is loaded and function tracing is enabled. This allows the output of the function trace to show the init function names instead of just their raw memory addresses. When a module is removed, ftrace_release_mod() is called, and if ftrace_disable is set, it just returns without doing anything more. The problem here is that it leaves the mod_list still around and if kallsyms is called, it will call into this code and access the module memory that has already been freed as it will return: strscpy(module_name, mod_map->mod->name, MODULE_NAME_LEN); Where the "mod" no longer exists and triggers a UAF bug. Link: https://lore.kernel.org/all/20250523135452.626d8dcd@gandalf.local.home/ Cc: stable@vger.kernel.org Fixes: aba4b5c22cba ("ftrace: Save module init functions kallsyms symbols for tracing") Link: https://lore.kernel.org/20250529111955.2349189-2-yebin@huaweicloud.com Signed-off-by: Ye Bin Signed-off-by: Steven Rostedt (Google) Signed-off-by: Greg Kroah-Hartman --- kernel/trace/ftrace.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index e67d67f7b9065..ad7db84b04090 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -7295,9 +7295,10 @@ void ftrace_release_mod(struct module *mod) mutex_lock(&ftrace_lock); - if (ftrace_disabled) - goto out_unlock; - + /* + * To avoid the UAF problem after the module is unloaded, the + * 'mod_map' resource needs to be released unconditionally. + */ list_for_each_entry_safe(mod_map, n, &ftrace_mod_maps, list) { if (mod_map->mod == mod) { list_del_rcu(&mod_map->list); @@ -7306,6 +7307,9 @@ void ftrace_release_mod(struct module *mod) } } + if (ftrace_disabled) + goto out_unlock; + /* * Each module has its own ftrace_pages, remove * them from the list. -- GitLab From f2986bccf250f2d5b214b329a12b303477829c52 Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Tue, 22 Apr 2025 21:17:36 +0200 Subject: [PATCH 1341/2211] dm: lock limits when reading them commit abb4cf2f4c1c1b637cad04d726f2e13fd3051e03 upstream. Lock queue limits when reading them, so that we don't read halfway modified values. Signed-off-by: Mikulas Patocka Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/md/dm-table.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 883f01e78324f..e45cffdd419a8 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -431,6 +431,7 @@ static int dm_set_device_limits(struct dm_target *ti, struct dm_dev *dev, return 0; } + mutex_lock(&q->limits_lock); if (blk_stack_limits(limits, &q->limits, get_start_sect(bdev) + start) < 0) DMWARN("%s: adding target device %pg caused an alignment inconsistency: " @@ -448,6 +449,7 @@ static int dm_set_device_limits(struct dm_target *ti, struct dm_dev *dev, */ if (!dm_target_has_integrity(ti->type)) queue_limits_stack_integrity_bdev(limits, bdev); + mutex_unlock(&q->limits_lock); return 0; } @@ -1734,8 +1736,12 @@ static int device_not_write_zeroes_capable(struct dm_target *ti, struct dm_dev * sector_t start, sector_t len, void *data) { struct request_queue *q = bdev_get_queue(dev->bdev); + int b; - return !q->limits.max_write_zeroes_sectors; + mutex_lock(&q->limits_lock); + b = !q->limits.max_write_zeroes_sectors; + mutex_unlock(&q->limits_lock); + return b; } static bool dm_table_supports_write_zeroes(struct dm_table *t) -- GitLab From 5572d21a72bb05c1971b1d60fd93defc8a64607a Mon Sep 17 00:00:00 2001 From: Xu Yang Date: Wed, 30 Apr 2025 17:45:01 +0800 Subject: [PATCH 1342/2211] phy: fsl-imx8mq-usb: fix phy_tx_vboost_level_from_property() commit b15ee09ddb987a122e74fb0fdf1bd6e864959fd3 upstream. The description of TX_VBOOST_LVL is wrong in register PHY_CTRL3 bit[31:29]. The updated description as below: 011: Corresponds to a launch amplitude of 0.844 V. 100: Corresponds to a launch amplitude of 1.008 V. 101: Corresponds to a launch amplitude of 1.156 V. This will fix the parsing function phy_tx_vboost_level_from_property() to return correct value. Fixes: 63c85ad0cd81 ("phy: fsl-imx8mp-usb: add support for phy tuning") Cc: stable@vger.kernel.org Reviewed-by: Jun Li Signed-off-by: Xu Yang Link: https://lore.kernel.org/r/20250430094502.2723983-3-xu.yang_2@nxp.com Signed-off-by: Vinod Koul Signed-off-by: Greg Kroah-Hartman --- drivers/phy/freescale/phy-fsl-imx8mq-usb.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/phy/freescale/phy-fsl-imx8mq-usb.c b/drivers/phy/freescale/phy-fsl-imx8mq-usb.c index adc6394626ce8..f914f016b3d2c 100644 --- a/drivers/phy/freescale/phy-fsl-imx8mq-usb.c +++ b/drivers/phy/freescale/phy-fsl-imx8mq-usb.c @@ -95,12 +95,12 @@ static u32 phy_tx_preemp_amp_tune_from_property(u32 microamp) static u32 phy_tx_vboost_level_from_property(u32 microvolt) { switch (microvolt) { - case 0 ... 960: - return 0; - case 961 ... 1160: - return 2; - default: + case 1156: + return 5; + case 844: return 3; + default: + return 4; } } -- GitLab From 4da7fcc098218ff92b2e83a43f545c02f714cedd Mon Sep 17 00:00:00 2001 From: Qasim Ijaz Date: Mon, 26 May 2025 19:36:07 +0100 Subject: [PATCH 1343/2211] net: ch9200: fix uninitialised access during mii_nway_restart commit 9ad0452c0277b816a435433cca601304cfac7c21 upstream. In mii_nway_restart() the code attempts to call mii->mdio_read which is ch9200_mdio_read(). ch9200_mdio_read() utilises a local buffer called "buff", which is initialised with control_read(). However "buff" is conditionally initialised inside control_read(): if (err == size) { memcpy(data, buf, size); } If the condition of "err == size" is not met, then "buff" remains uninitialised. Once this happens the uninitialised "buff" is accessed and returned during ch9200_mdio_read(): return (buff[0] | buff[1] << 8); The problem stems from the fact that ch9200_mdio_read() ignores the return value of control_read(), leading to uinit-access of "buff". To fix this we should check the return value of control_read() and return early on error. Reported-by: syzbot Closes: https://syzkaller.appspot.com/bug?extid=3361c2d6f78a3e0892f9 Tested-by: syzbot Fixes: 4a476bd6d1d9 ("usbnet: New driver for QinHeng CH9200 devices") Cc: stable@vger.kernel.org Signed-off-by: Qasim Ijaz Link: https://patch.msgid.link/20250526183607.66527-1-qasdev00@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- drivers/net/usb/ch9200.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/net/usb/ch9200.c b/drivers/net/usb/ch9200.c index f69d9b902da04..a206ffa76f1b9 100644 --- a/drivers/net/usb/ch9200.c +++ b/drivers/net/usb/ch9200.c @@ -178,6 +178,7 @@ static int ch9200_mdio_read(struct net_device *netdev, int phy_id, int loc) { struct usbnet *dev = netdev_priv(netdev); unsigned char buff[2]; + int ret; netdev_dbg(netdev, "%s phy_id:%02x loc:%02x\n", __func__, phy_id, loc); @@ -185,8 +186,10 @@ static int ch9200_mdio_read(struct net_device *netdev, int phy_id, int loc) if (phy_id != 0) return -ENODEV; - control_read(dev, REQUEST_READ, 0, loc * 2, buff, 0x02, - CONTROL_TIMEOUT_MS); + ret = control_read(dev, REQUEST_READ, 0, loc * 2, buff, 0x02, + CONTROL_TIMEOUT_MS); + if (ret < 0) + return ret; return (buff[0] | buff[1] << 8); } -- GitLab From ce4ef0274cb66a4750000f33f2d316c0dbaf4515 Mon Sep 17 00:00:00 2001 From: Lorenzo Stoakes Date: Mon, 19 May 2025 15:56:57 +0100 Subject: [PATCH 1344/2211] KVM: s390: rename PROT_NONE to PROT_TYPE_DUMMY commit 15ac613f124e51a6623975efad9657b1f3ee47e7 upstream. The enum type prot_type declared in arch/s390/kvm/gaccess.c declares an unfortunate identifier within it - PROT_NONE. This clashes with the protection bit define from the uapi for mmap() declared in include/uapi/asm-generic/mman-common.h, which is indeed what those casually reading this code would assume this to refer to. This means that any changes which subsequently alter headers in any way which results in the uapi header being imported here will cause build errors. Resolve the issue by renaming PROT_NONE to PROT_TYPE_DUMMY. Link: https://lkml.kernel.org/r/20250519145657.178365-1-lorenzo.stoakes@oracle.com Fixes: b3cefd6bf16e ("KVM: s390: Pass initialized arg even if unused") Signed-off-by: Lorenzo Stoakes Suggested-by: Ignacio Moreno Gonzalez Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202505140943.IgHDa9s7-lkp@intel.com/ Acked-by: Christian Borntraeger Acked-by: Ignacio Moreno Gonzalez Acked-by: Yang Shi Reviewed-by: David Hildenbrand Acked-by: Liam R. Howlett Reviewed-by: Oscar Salvador Reviewed-by: Claudio Imbrenda Cc: Cc: Alexander Gordeev Cc: Heiko Carstens Cc: James Houghton Cc: Janosch Frank Cc: Matthew Wilcox (Oracle) Cc: Paolo Bonzini Cc: Sven Schnelle Cc: Vasily Gorbik Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- arch/s390/kvm/gaccess.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c index a688351f4ab52..7bc97ebd60d5d 100644 --- a/arch/s390/kvm/gaccess.c +++ b/arch/s390/kvm/gaccess.c @@ -317,7 +317,7 @@ enum prot_type { PROT_TYPE_DAT = 3, PROT_TYPE_IEP = 4, /* Dummy value for passing an initialized value when code != PGM_PROTECTION */ - PROT_NONE, + PROT_TYPE_DUMMY, }; static int trans_exc_ending(struct kvm_vcpu *vcpu, int code, unsigned long gva, u8 ar, @@ -333,7 +333,7 @@ static int trans_exc_ending(struct kvm_vcpu *vcpu, int code, unsigned long gva, switch (code) { case PGM_PROTECTION: switch (prot) { - case PROT_NONE: + case PROT_TYPE_DUMMY: /* We should never get here, acts like termination */ WARN_ON_ONCE(1); break; @@ -803,7 +803,7 @@ static int guest_range_to_gpas(struct kvm_vcpu *vcpu, unsigned long ga, u8 ar, gpa = kvm_s390_real_to_abs(vcpu, ga); if (!kvm_is_gpa_in_memslot(vcpu->kvm, gpa)) { rc = PGM_ADDRESSING; - prot = PROT_NONE; + prot = PROT_TYPE_DUMMY; } } if (rc) @@ -961,7 +961,7 @@ int access_guest_with_key(struct kvm_vcpu *vcpu, unsigned long ga, u8 ar, if (rc == PGM_PROTECTION) prot = PROT_TYPE_KEYC; else - prot = PROT_NONE; + prot = PROT_TYPE_DUMMY; rc = trans_exc_ending(vcpu, rc, ga, ar, mode, prot, terminate); } out_unlock: -- GitLab From 337bf0bbb042539236d5ca7245c64c116edce36b Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Tue, 3 Jun 2025 17:48:20 +0200 Subject: [PATCH 1345/2211] sysfb: Fix screen_info type check for VGA MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit f670b50ef5e4a69bf4d2ec5ac6a9228d93b13a7a upstream. Use the helper screen_info_video_type() to get the framebuffer type from struct screen_info. Handle supported values in sorted switch statement. Reading orig_video_isVGA is unreliable. On most systems it is a VIDEO_TYPE_ constant. On some systems with VGA it is simply set to 1 to signal the presence of a VGA output. See vga_probe() for an example. Retrieving the screen_info type with the helper screen_info_video_type() detects these cases and returns the appropriate VIDEO_TYPE_ constant. For VGA, sysfb creates a device named "vga-framebuffer". The sysfb code has been taken from vga16fb, where it likely didn't work correctly either. With this bugfix applied, vga16fb loads for compatible vga-framebuffer devices. Fixes: 0db5b61e0dc0 ("fbdev/vga16fb: Create EGA/VGA devices in sysfb code") Cc: Thomas Zimmermann Cc: Javier Martinez Canillas Cc: Alex Deucher Cc: Tzung-Bi Shih Cc: Helge Deller Cc: "Uwe Kleine-König" Cc: Zsolt Kajtar Cc: # v6.1+ Signed-off-by: Thomas Zimmermann Reviewed-by: Tzung-Bi Shih Reviewed-by: Javier Martinez Canillas Link: https://lore.kernel.org/r/20250603154838.401882-1-tzimmermann@suse.de Signed-off-by: Greg Kroah-Hartman --- drivers/firmware/sysfb.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/firmware/sysfb.c b/drivers/firmware/sysfb.c index a3df782fa687b..e919940c8bf9a 100644 --- a/drivers/firmware/sysfb.c +++ b/drivers/firmware/sysfb.c @@ -124,6 +124,7 @@ static __init int sysfb_init(void) { struct screen_info *si = &screen_info; struct device *parent; + unsigned int type; struct simplefb_platform_data mode; const char *name; bool compatible; @@ -151,17 +152,26 @@ static __init int sysfb_init(void) goto put_device; } + type = screen_info_video_type(si); + /* if the FB is incompatible, create a legacy framebuffer device */ - if (si->orig_video_isVGA == VIDEO_TYPE_EFI) - name = "efi-framebuffer"; - else if (si->orig_video_isVGA == VIDEO_TYPE_VLFB) - name = "vesa-framebuffer"; - else if (si->orig_video_isVGA == VIDEO_TYPE_VGAC) - name = "vga-framebuffer"; - else if (si->orig_video_isVGA == VIDEO_TYPE_EGAC) + switch (type) { + case VIDEO_TYPE_EGAC: name = "ega-framebuffer"; - else + break; + case VIDEO_TYPE_VGAC: + name = "vga-framebuffer"; + break; + case VIDEO_TYPE_VLFB: + name = "vesa-framebuffer"; + break; + case VIDEO_TYPE_EFI: + name = "efi-framebuffer"; + break; + default: name = "platform-framebuffer"; + break; + } pd = platform_device_alloc(name, 0); if (!pd) { -- GitLab From 5c70e3ad85d2890d8af375333699429de26327f2 Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Wed, 28 May 2025 10:02:08 +0200 Subject: [PATCH 1346/2211] video: screen_info: Relocate framebuffers behind PCI bridges commit 2f29b5c231011b94007d2c8a6d793992f2275db1 upstream. Apply PCI host-bridge window offsets to screen_info framebuffers. Fixes invalid access to I/O memory. Resources behind a PCI host bridge can be relocated by a certain offset in the kernel's CPU address range used for I/O. The framebuffer memory range stored in screen_info refers to the CPU addresses as seen during boot (where the offset is 0). During boot up, firmware may assign a different memory offset to the PCI host bridge and thereby relocating the framebuffer address of the PCI graphics device as seen by the kernel. The information in screen_info must be updated as well. The helper pcibios_bus_to_resource() performs the relocation of the screen_info's framebuffer resource (given in PCI bus addresses). The result matches the I/O-memory resource of the PCI graphics device (given in CPU addresses). As before, we store away the information necessary to later update the information in screen_info itself. Commit 78aa89d1dfba ("firmware/sysfb: Update screen_info for relocated EFI framebuffers") added the code for updating screen_info. It is based on similar functionality that pre-existed in efifb. Efifb uses a pointer to the PCI resource, while the newer code does a memcpy of the region. Hence efifb sees any updates to the PCI resource and avoids the issue. v3: - Only use struct pci_bus_region for PCI bus addresses (Bjorn) - Clarify address semantics in commit messages and comments (Bjorn) v2: - Fixed tags (Takashi, Ivan) - Updated information on efifb Signed-off-by: Thomas Zimmermann Reviewed-by: Javier Martinez Canillas Reported-by: "Ivan T. Ivanov" Closes: https://bugzilla.suse.com/show_bug.cgi?id=1240696 Tested-by: "Ivan T. Ivanov" Fixes: 78aa89d1dfba ("firmware/sysfb: Update screen_info for relocated EFI framebuffers") Cc: dri-devel@lists.freedesktop.org Cc: # v6.9+ Link: https://lore.kernel.org/r/20250528080234.7380-1-tzimmermann@suse.de Signed-off-by: Greg Kroah-Hartman --- drivers/video/screen_info_pci.c | 79 +++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 29 deletions(-) diff --git a/drivers/video/screen_info_pci.c b/drivers/video/screen_info_pci.c index 6c58335171410..66bfc1d0a6dc8 100644 --- a/drivers/video/screen_info_pci.c +++ b/drivers/video/screen_info_pci.c @@ -7,8 +7,8 @@ static struct pci_dev *screen_info_lfb_pdev; static size_t screen_info_lfb_bar; -static resource_size_t screen_info_lfb_offset; -static struct resource screen_info_lfb_res = DEFINE_RES_MEM(0, 0); +static resource_size_t screen_info_lfb_res_start; // original start of resource +static resource_size_t screen_info_lfb_offset; // framebuffer offset within resource static bool __screen_info_relocation_is_valid(const struct screen_info *si, struct resource *pr) { @@ -31,7 +31,7 @@ void screen_info_apply_fixups(void) if (screen_info_lfb_pdev) { struct resource *pr = &screen_info_lfb_pdev->resource[screen_info_lfb_bar]; - if (pr->start != screen_info_lfb_res.start) { + if (pr->start != screen_info_lfb_res_start) { if (__screen_info_relocation_is_valid(si, pr)) { /* * Only update base if we have an actual @@ -47,46 +47,67 @@ void screen_info_apply_fixups(void) } } +static int __screen_info_lfb_pci_bus_region(const struct screen_info *si, unsigned int type, + struct pci_bus_region *r) +{ + u64 base, size; + + base = __screen_info_lfb_base(si); + if (!base) + return -EINVAL; + + size = __screen_info_lfb_size(si, type); + if (!size) + return -EINVAL; + + r->start = base; + r->end = base + size - 1; + + return 0; +} + static void screen_info_fixup_lfb(struct pci_dev *pdev) { unsigned int type; - struct resource res[SCREEN_INFO_MAX_RESOURCES]; - size_t i, numres; + struct pci_bus_region bus_region; int ret; + struct resource r = { + .flags = IORESOURCE_MEM, + }; + const struct resource *pr; const struct screen_info *si = &screen_info; if (screen_info_lfb_pdev) return; // already found type = screen_info_video_type(si); - if (type != VIDEO_TYPE_EFI) - return; // only applies to EFI + if (!__screen_info_has_lfb(type)) + return; // only applies to EFI; maybe VESA - ret = screen_info_resources(si, res, ARRAY_SIZE(res)); + ret = __screen_info_lfb_pci_bus_region(si, type, &bus_region); if (ret < 0) return; - numres = ret; - for (i = 0; i < numres; ++i) { - struct resource *r = &res[i]; - const struct resource *pr; - - if (!(r->flags & IORESOURCE_MEM)) - continue; - pr = pci_find_resource(pdev, r); - if (!pr) - continue; - - /* - * We've found a PCI device with the framebuffer - * resource. Store away the parameters to track - * relocation of the framebuffer aperture. - */ - screen_info_lfb_pdev = pdev; - screen_info_lfb_bar = pr - pdev->resource; - screen_info_lfb_offset = r->start - pr->start; - memcpy(&screen_info_lfb_res, r, sizeof(screen_info_lfb_res)); - } + /* + * Translate the PCI bus address to resource. Account + * for an offset if the framebuffer is behind a PCI host + * bridge. + */ + pcibios_bus_to_resource(pdev->bus, &r, &bus_region); + + pr = pci_find_resource(pdev, &r); + if (!pr) + return; + + /* + * We've found a PCI device with the framebuffer + * resource. Store away the parameters to track + * relocation of the framebuffer aperture. + */ + screen_info_lfb_pdev = pdev; + screen_info_lfb_bar = pr - pdev->resource; + screen_info_lfb_offset = r.start - pr->start; + screen_info_lfb_res_start = bus_region.start; } DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY, 16, screen_info_fixup_lfb); -- GitLab From 4df6f2a167bbc2a1c3f659c409f4e93d53612957 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Thu, 29 May 2025 11:53:20 -0500 Subject: [PATCH 1347/2211] pwm: axi-pwmgen: fix missing separate external clock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit a8841dc3dfbf127a19c3612204bd336ee559b9a1 upstream. Add proper support for external clock to the AXI PWM generator driver. In most cases, the HDL for this IP block is compiled with the default ASYNC_CLK_EN=1. With this option, there is a separate external clock that drives the PWM output separate from the peripheral clock. So the driver should be enabling the "axi" clock to power the peripheral and the "ext" clock to drive the PWM output. When ASYNC_CLK_EN=0, the "axi" clock is also used to drive the PWM output and there is no "ext" clock. Previously, if there was a separate external clock, users had to specify only the external clock and (incorrectly) omit the AXI clock in order to get the correct operating frequency for the PWM output. The devicetree bindings are updated to fix this shortcoming and this patch changes the driver to match the new bindings. To preserve compatibility with any existing dtbs that specify only one clock, we don't require the clock name on the first clock. Fixes: 41814fe5c782 ("pwm: Add driver for AXI PWM generator") Cc: stable@vger.kernel.org Acked-by: Nuno Sá Reviewed-by: Trevor Gamblin Signed-off-by: David Lechner Link: https://lore.kernel.org/r/20250529-pwm-axi-pwmgen-add-external-clock-v3-3-5d8809a7da91@baylibre.com Signed-off-by: Uwe Kleine-König Signed-off-by: Greg Kroah-Hartman --- drivers/pwm/pwm-axi-pwmgen.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/pwm/pwm-axi-pwmgen.c b/drivers/pwm/pwm-axi-pwmgen.c index b5477659ba186..73c68f494e7f3 100644 --- a/drivers/pwm/pwm-axi-pwmgen.c +++ b/drivers/pwm/pwm-axi-pwmgen.c @@ -174,7 +174,7 @@ static int axi_pwmgen_probe(struct platform_device *pdev) struct regmap *regmap; struct pwm_chip *chip; struct axi_pwmgen_ddata *ddata; - struct clk *clk; + struct clk *axi_clk, *clk; void __iomem *io_base; int ret; @@ -197,9 +197,26 @@ static int axi_pwmgen_probe(struct platform_device *pdev) ddata = pwmchip_get_drvdata(chip); ddata->regmap = regmap; - clk = devm_clk_get_enabled(dev, NULL); + /* + * Using NULL here instead of "axi" for backwards compatibility. There + * are some dtbs that don't give clock-names and have the "ext" clock + * as the one and only clock (due to mistake in the original bindings). + */ + axi_clk = devm_clk_get_enabled(dev, NULL); + if (IS_ERR(axi_clk)) + return dev_err_probe(dev, PTR_ERR(axi_clk), "failed to get axi clock\n"); + + clk = devm_clk_get_optional_enabled(dev, "ext"); if (IS_ERR(clk)) - return dev_err_probe(dev, PTR_ERR(clk), "failed to get clock\n"); + return dev_err_probe(dev, PTR_ERR(clk), "failed to get ext clock\n"); + + /* + * If there is no "ext" clock, it means the HDL was compiled with + * ASYNC_CLK_EN=0. In this case, the AXI clock is also used for the + * PWM output clock. + */ + if (!clk) + clk = axi_clk; ret = devm_clk_rate_exclusive_get(dev, clk); if (ret) -- GitLab From bf1605e2eaaa1a00d4dfda254e5342a983845310 Mon Sep 17 00:00:00 2001 From: Gabriel Shahrouzi Date: Sat, 19 Apr 2025 21:30:09 -0400 Subject: [PATCH 1348/2211] staging: iio: ad5933: Correct settling cycles encoding per datasheet commit 60638e2a2d4bc03798f00d5ab65ce9b83cb8b03b upstream. The AD5933 datasheet (Table 13) lists the maximum cycles to be 0x7FC (2044). Clamp the user input to the maximum effective value of 0x7FC cycles. Fixes: f94aa354d676 ("iio: impedance-analyzer: New driver for AD5933/4 Impedance Converter, Network Analyzer") Cc: stable@vger.kernel.org Signed-off-by: Gabriel Shahrouzi Reviewed-by: Marcelo Schmitt Link: https://patch.msgid.link/20250420013009.847851-1-gshahrouzi@gmail.com Signed-off-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman --- drivers/staging/iio/impedance-analyzer/ad5933.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/staging/iio/impedance-analyzer/ad5933.c b/drivers/staging/iio/impedance-analyzer/ad5933.c index 4ae1a7039418b..1f806ee966c37 100644 --- a/drivers/staging/iio/impedance-analyzer/ad5933.c +++ b/drivers/staging/iio/impedance-analyzer/ad5933.c @@ -411,7 +411,7 @@ static ssize_t ad5933_store(struct device *dev, ret = ad5933_cmd(st, 0); break; case AD5933_OUT_SETTLING_CYCLES: - val = clamp(val, (u16)0, (u16)0x7FF); + val = clamp(val, (u16)0, (u16)0x7FC); st->settling_cycles = val; /* 2x, 4x handling, see datasheet */ -- GitLab From 6dbda47fe8bd6aa978c150bc9d321a286d2cc3f4 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Sat, 29 Mar 2025 08:39:03 -0700 Subject: [PATCH 1349/2211] mips: Add -std= flag specified in KBUILD_CFLAGS to vdso CFLAGS commit 0f4ae7c6ecb89bfda026d210dcf8216fb67d2333 upstream. GCC 15 changed the default C standard dialect from gnu17 to gnu23, which should not have impacted the kernel because it explicitly requests the gnu11 standard in the main Makefile. However, mips/vdso code uses its own CFLAGS without a '-std=' value, which break with this dialect change because of the kernel's own definitions of bool, false, and true conflicting with the C23 reserved keywords. include/linux/stddef.h:11:9: error: cannot use keyword 'false' as enumeration constant 11 | false = 0, | ^~~~~ include/linux/stddef.h:11:9: note: 'false' is a keyword with '-std=c23' onwards include/linux/types.h:35:33: error: 'bool' cannot be defined via 'typedef' 35 | typedef _Bool bool; | ^~~~ include/linux/types.h:35:33: note: 'bool' is a keyword with '-std=c23' onwards Add -std as specified in KBUILD_CFLAGS to the decompressor and purgatory CFLAGS to eliminate these errors and make the C standard version of these areas match the rest of the kernel. Signed-off-by: Khem Raj Cc: stable@vger.kernel.org Signed-off-by: Thomas Bogendoerfer Signed-off-by: Greg Kroah-Hartman --- arch/mips/vdso/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile index b289b2c1b2946..c729bd6878042 100644 --- a/arch/mips/vdso/Makefile +++ b/arch/mips/vdso/Makefile @@ -27,6 +27,7 @@ endif # offsets. cflags-vdso := $(ccflags-vdso) \ $(filter -W%,$(filter-out -Wa$(comma)%,$(KBUILD_CFLAGS))) \ + $(filter -std=%,$(KBUILD_CFLAGS)) \ -O3 -g -fPIC -fno-strict-aliasing -fno-common -fno-builtin -G 0 \ -mrelax-pic-calls $(call cc-option, -mexplicit-relocs) \ -fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \ -- GitLab From ec5f0b44125c0c7d8f472b34ac7a61a6cf12e246 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Almeida?= Date: Tue, 29 Apr 2025 15:38:50 -0300 Subject: [PATCH 1350/2211] ovl: Fix nested backing file paths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 924577e4f6ca473de1528953a0e13505fae61d7b upstream. When the lowerdir of an overlayfs is a merged directory of another overlayfs, ovl_open_realfile() will fail to open the real file and point to a lower dentry copy, without the proper parent path. After this, d_path() will then display the path incorrectly as if the file is placed in the root directory. This bug can be triggered with the following setup: mkdir -p ovl-A/lower ovl-A/upper ovl-A/merge ovl-A/work mkdir -p ovl-B/upper ovl-B/merge ovl-B/work cp /bin/cat ovl-A/lower/ mount -t overlay overlay -o \ lowerdir=ovl-A/lower,upperdir=ovl-A/upper,workdir=ovl-A/work \ ovl-A/merge mount -t overlay overlay -o \ lowerdir=ovl-A/merge,upperdir=ovl-B/upper,workdir=ovl-B/work \ ovl-B/merge ovl-A/merge/cat /proc/self/maps | grep --color cat ovl-B/merge/cat /proc/self/maps | grep --color cat The first cat will correctly show `/ovl-A/merge/cat`, while the second one shows just `/cat`. To fix that, uses file_user_path() inside of backing_file_open() to get the correct file path for the dentry. Co-developed-by: John Schoenick Signed-off-by: John Schoenick Signed-off-by: André Almeida Fixes: def3ae83da02 ("fs: store real path instead of fake path in backing file f_path") Cc: # v6.7 Signed-off-by: Miklos Szeredi Signed-off-by: Greg Kroah-Hartman --- fs/overlayfs/file.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c index 4444c78e2e0c3..94095058da34e 100644 --- a/fs/overlayfs/file.c +++ b/fs/overlayfs/file.c @@ -48,8 +48,8 @@ static struct file *ovl_open_realfile(const struct file *file, if (!inode_owner_or_capable(real_idmap, realinode)) flags &= ~O_NOATIME; - realfile = backing_file_open(&file->f_path, flags, realpath, - current_cred()); + realfile = backing_file_open(file_user_path((struct file *) file), + flags, realpath, current_cred()); } revert_creds(old_cred); -- GitLab From 20462b6111a39c1ad54583c9884fc9fac87d0414 Mon Sep 17 00:00:00 2001 From: Wentao Liang Date: Mon, 26 May 2025 10:56:27 +0800 Subject: [PATCH 1351/2211] regulator: max14577: Add error check for max14577_read_reg() commit 65271f868cb1dca709ff69e45939bbef8d6d0b70 upstream. The function max14577_reg_get_current_limit() calls the function max14577_read_reg(), but does not check its return value. A proper implementation can be found in max14577_get_online(). Add a error check for the max14577_read_reg() and return error code if the function fails. Fixes: b0902bbeb768 ("regulator: max14577: Add regulator driver for Maxim 14577") Cc: stable@vger.kernel.org # v3.14 Signed-off-by: Wentao Liang Link: https://patch.msgid.link/20250526025627.407-1-vulab@iscas.ac.cn Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- drivers/regulator/max14577-regulator.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/regulator/max14577-regulator.c b/drivers/regulator/max14577-regulator.c index 5e7171b9065ae..41fd15adfd1fd 100644 --- a/drivers/regulator/max14577-regulator.c +++ b/drivers/regulator/max14577-regulator.c @@ -40,11 +40,14 @@ static int max14577_reg_get_current_limit(struct regulator_dev *rdev) struct max14577 *max14577 = rdev_get_drvdata(rdev); const struct maxim_charger_current *limits = &maxim_charger_currents[max14577->dev_type]; + int ret; if (rdev_get_id(rdev) != MAX14577_CHARGER) return -EINVAL; - max14577_read_reg(rmap, MAX14577_CHG_REG_CHG_CTRL4, ®_data); + ret = max14577_read_reg(rmap, MAX14577_CHG_REG_CHG_CTRL4, ®_data); + if (ret < 0) + return ret; if ((reg_data & CHGCTRL4_MBCICHWRCL_MASK) == 0) return limits->min; -- GitLab From 92776ca0ccfe78b9bfe847af206bad641fb11121 Mon Sep 17 00:00:00 2001 From: Xiaolei Wang Date: Wed, 30 Apr 2025 17:20:42 +0800 Subject: [PATCH 1352/2211] remoteproc: core: Cleanup acquired resources when rproc_handle_resources() fails in rproc_attach() commit 7692c9fbedd9087dc9050903f58095915458d9b1 upstream. When rproc->state = RPROC_DETACHED and rproc_attach() is used to attach to the remote processor, if rproc_handle_resources() returns a failure, the resources allocated by imx_rproc_prepare() should be released, otherwise the following memory leak will occur. Since almost the same thing is done in imx_rproc_prepare() and rproc_resource_cleanup(), Function rproc_resource_cleanup() is able to deal with empty lists so it is better to fix the "goto" statements in rproc_attach(). replace the "unprepare_device" goto statement with "clean_up_resources" and get rid of the "unprepare_device" label. unreferenced object 0xffff0000861c5d00 (size 128): comm "kworker/u12:3", pid 59, jiffies 4294893509 (age 149.220s) hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 02 88 00 00 00 00 00 00 10 00 00 00 00 00 ............ backtrace: [<00000000f949fe18>] slab_post_alloc_hook+0x98/0x37c [<00000000adbfb3e7>] __kmem_cache_alloc_node+0x138/0x2e0 [<00000000521c0345>] kmalloc_trace+0x40/0x158 [<000000004e330a49>] rproc_mem_entry_init+0x60/0xf8 [<000000002815755e>] imx_rproc_prepare+0xe0/0x180 [<0000000003f61b4e>] rproc_boot+0x2ec/0x528 [<00000000e7e994ac>] rproc_add+0x124/0x17c [<0000000048594076>] imx_rproc_probe+0x4ec/0x5d4 [<00000000efc298a1>] platform_probe+0x68/0xd8 [<00000000110be6fe>] really_probe+0x110/0x27c [<00000000e245c0ae>] __driver_probe_device+0x78/0x12c [<00000000f61f6f5e>] driver_probe_device+0x3c/0x118 [<00000000a7874938>] __device_attach_driver+0xb8/0xf8 [<0000000065319e69>] bus_for_each_drv+0x84/0xe4 [<00000000db3eb243>] __device_attach+0xfc/0x18c [<0000000072e4e1a4>] device_initial_probe+0x14/0x20 Fixes: 10a3d4079eae ("remoteproc: imx_rproc: move memory parsing to rproc_ops") Suggested-by: Mathieu Poirier Signed-off-by: Xiaolei Wang Reviewed-by: Peng Fan Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20250430092043.1819308-2-xiaolei.wang@windriver.com Signed-off-by: Mathieu Poirier Signed-off-by: Greg Kroah-Hartman --- drivers/remoteproc/remoteproc_core.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index d2308c2f97eb9..f1525185bf51c 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -1617,7 +1617,7 @@ static int rproc_attach(struct rproc *rproc) ret = rproc_set_rsc_table(rproc); if (ret) { dev_err(dev, "can't load resource table: %d\n", ret); - goto unprepare_device; + goto clean_up_resources; } /* reset max_notifyid */ @@ -1634,7 +1634,7 @@ static int rproc_attach(struct rproc *rproc) ret = rproc_handle_resources(rproc, rproc_loading_handlers); if (ret) { dev_err(dev, "Failed to process resources: %d\n", ret); - goto unprepare_device; + goto clean_up_resources; } /* Allocate carveout resources associated to rproc */ @@ -1653,7 +1653,6 @@ static int rproc_attach(struct rproc *rproc) clean_up_resources: rproc_resource_cleanup(rproc); -unprepare_device: /* release HW resources if needed */ rproc_unprepare_device(rproc); disable_iommu: -- GitLab From f4ef928ca504c996f9222eb2c59ac6d6eefd9c75 Mon Sep 17 00:00:00 2001 From: Xiaolei Wang Date: Wed, 30 Apr 2025 17:20:43 +0800 Subject: [PATCH 1353/2211] remoteproc: core: Release rproc->clean_table after rproc_attach() fails commit bcd241230fdbc6005230f80a4f8646ff5a84f15b upstream. When rproc->state = RPROC_DETACHED is attached to remote processor through rproc_attach(), if rproc_handle_resources() returns failure, then the clean table should be released, otherwise the following memory leak will occur. unreferenced object 0xffff000086a99800 (size 1024): comm "kworker/u12:3", pid 59, jiffies 4294893670 (age 121.140s) hex dump (first 32 bytes): 00 00 00 00 00 80 00 00 00 00 00 00 00 00 10 00 ............ 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00 ............ backtrace: [<000000008bbe4ca8>] slab_post_alloc_hook+0x98/0x3fc [<000000003b8a272b>] __kmem_cache_alloc_node+0x13c/0x230 [<000000007a507c51>] __kmalloc_node_track_caller+0x5c/0x260 [<0000000037818dae>] kmemdup+0x34/0x60 [<00000000610f7f57>] rproc_boot+0x35c/0x56c [<0000000065f8871a>] rproc_add+0x124/0x17c [<00000000497416ee>] imx_rproc_probe+0x4ec/0x5d4 [<000000003bcaa37d>] platform_probe+0x68/0xd8 [<00000000771577f9>] really_probe+0x110/0x27c [<00000000531fea59>] __driver_probe_device+0x78/0x12c [<0000000080036a04>] driver_probe_device+0x3c/0x118 [<000000007e0bddcb>] __device_attach_driver+0xb8/0xf8 [<000000000cf1fa33>] bus_for_each_drv+0x84/0xe4 [<000000001a53b53e>] __device_attach+0xfc/0x18c [<00000000d1a2a32c>] device_initial_probe+0x14/0x20 [<00000000d8f8b7ae>] bus_probe_device+0xb0/0xb4 unreferenced object 0xffff0000864c9690 (size 16): Fixes: 9dc9507f1880 ("remoteproc: Properly deal with the resource table when detaching") Signed-off-by: Xiaolei Wang Reviewed-by: Peng Fan Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20250430092043.1819308-3-xiaolei.wang@windriver.com Signed-off-by: Mathieu Poirier Signed-off-by: Greg Kroah-Hartman --- drivers/remoteproc/remoteproc_core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index f1525185bf51c..b7011eb384a5d 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -1655,6 +1655,7 @@ clean_up_resources: rproc_resource_cleanup(rproc); /* release HW resources if needed */ rproc_unprepare_device(rproc); + kfree(rproc->clean_table); disable_iommu: rproc_disable_iommu(rproc); return ret; -- GitLab From 30b031c0bd4fe7e7f52cdd1835e504e7947360f7 Mon Sep 17 00:00:00 2001 From: Beleswar Padhi Date: Tue, 13 May 2025 11:14:38 +0530 Subject: [PATCH 1354/2211] remoteproc: k3-m4: Don't assert reset in detach routine commit 23532524594c211871054a15c425812a4ac35102 upstream. The rproc_detach() function invokes __rproc_detach() before rproc_unprepare_device(). The __rproc_detach() function sets the rproc->state to "RPROC_DETACHED". However, the TI K3 M4 driver erroneously looks for "RPROC_ATTACHED" state in its .unprepare ops to identify IPC-only mode; which leads to resetting the rproc in detach routine. Therefore, correct the IPC-only mode detection logic to look for "RPROC_DETACHED" in k3_m4_rproc_unprepare() function. Fixes: ebcf9008a895 ("remoteproc: k3-m4: Add a remoteproc driver for M4F subsystem") Signed-off-by: Beleswar Padhi Reviewed-by: Hari Nagalla Reviewed-by: Martyn Welch Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20250513054510.3439842-5-b-padhi@ti.com Signed-off-by: Mathieu Poirier Signed-off-by: Greg Kroah-Hartman --- drivers/remoteproc/ti_k3_m4_remoteproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/remoteproc/ti_k3_m4_remoteproc.c b/drivers/remoteproc/ti_k3_m4_remoteproc.c index 09f0484a90e10..fba6e393635e3 100644 --- a/drivers/remoteproc/ti_k3_m4_remoteproc.c +++ b/drivers/remoteproc/ti_k3_m4_remoteproc.c @@ -228,7 +228,7 @@ static int k3_m4_rproc_unprepare(struct rproc *rproc) int ret; /* If the core is going to be detached do not assert the module reset */ - if (rproc->state == RPROC_ATTACHED) + if (rproc->state == RPROC_DETACHED) return 0; ret = kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci, -- GitLab From 180079e4da0a6d12ed6b462a3c202e012e76b11c Mon Sep 17 00:00:00 2001 From: Shyam Prasad N Date: Mon, 2 Jun 2025 22:37:13 +0530 Subject: [PATCH 1355/2211] cifs: reset connections for all channels when reconnect requested commit 1f396b9bfe39aaf55ea74a7005806164b236653d upstream. cifs_reconnect can be called with a flag to mark the session as needing reconnect too. When this is done, we expect the connections of all channels to be reconnected too, which is not happening today. Without doing this, we have seen bad things happen when primary and secondary channels are connected to different servers (in case of cloud services like Azure Files SMB). This change would force all connections to reconnect as well, not just the sessions and tcons. Cc: Signed-off-by: Shyam Prasad N Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/connect.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index 8260d0e07a628..f1044eaa3a079 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -393,6 +393,13 @@ static int __cifs_reconnect(struct TCP_Server_Info *server, if (!cifs_tcp_ses_needs_reconnect(server, 1)) return 0; + /* + * if smb session has been marked for reconnect, also reconnect all + * connections. This way, the other connections do not end up bad. + */ + if (mark_smb_session) + cifs_signal_cifsd_for_reconnect(server, mark_smb_session); + cifs_mark_tcp_ses_conns_for_reconnect(server, mark_smb_session); cifs_abort_connection(server); -- GitLab From e2328267d00afb08f07f52607816efd7e346148e Mon Sep 17 00:00:00 2001 From: Shyam Prasad N Date: Mon, 2 Jun 2025 22:37:14 +0530 Subject: [PATCH 1356/2211] cifs: update dstaddr whenever channel iface is updated commit c1846893991f3b4ec8a0cc12219ada153f0814d6 upstream. When the server interface info changes (more common in clustered servers like Azure Files), the per-channel iface gets updated. However, this did not update the corresponding dstaddr. As a result these channels will still connect (or try connecting) to older addresses. Fixes: b54034a73baf ("cifs: during reconnect, update interface if necessary") Cc: Signed-off-by: Shyam Prasad N Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/sess.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/smb/client/sess.c b/fs/smb/client/sess.c index 9b32f7821b718..d4f4145802cf2 100644 --- a/fs/smb/client/sess.c +++ b/fs/smb/client/sess.c @@ -473,6 +473,10 @@ cifs_chan_update_iface(struct cifs_ses *ses, struct TCP_Server_Info *server) ses->chans[chan_index].iface = iface; spin_unlock(&ses->chan_lock); + + spin_lock(&server->srv_lock); + memcpy(&server->dstaddr, &iface->sockaddr, sizeof(server->dstaddr)); + spin_unlock(&server->srv_lock); } static int -- GitLab From dba032110b231cb5c26d3e0c5128532a3c759a4a Mon Sep 17 00:00:00 2001 From: Shyam Prasad N Date: Mon, 2 Jun 2025 22:37:16 +0530 Subject: [PATCH 1357/2211] cifs: dns resolution is needed only for primary channel commit b4f60a053a2534c3e510ba0c1f8727566adf8317 upstream. When calling cifs_reconnect, before the connection to the server is reestablished, the code today does a DNS resolution and updates server->dstaddr. However, this is not necessary for secondary channels. Secondary channels use the interface list returned by the server to decide which address to connect to. And that happens after tcon is reconnected and server interfaces are requested. Signed-off-by: Shyam Prasad N Cc: stable@vger.kernel.org Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/connect.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index f1044eaa3a079..676870ea46acf 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -408,7 +408,8 @@ static int __cifs_reconnect(struct TCP_Server_Info *server, try_to_freeze(); cifs_server_lock(server); - if (!cifs_swn_set_server_dstaddr(server)) { + if (!cifs_swn_set_server_dstaddr(server) && + !SERVER_IS_CHAN(server)) { /* resolve the hostname again to make sure that IP address is up-to-date */ rc = reconn_set_ipaddr_from_hostname(server); cifs_dbg(FYI, "%s: reconn_set_ipaddr_from_hostname: rc=%d\n", __func__, rc); -- GitLab From a9e916fa5c7d0ec2256aa44aa24ddd92f529ce35 Mon Sep 17 00:00:00 2001 From: Ruben Devos Date: Sun, 1 Jun 2025 19:18:55 +0200 Subject: [PATCH 1358/2211] smb: client: add NULL check in automount_fullpath commit f1e7a277a1736e12cc4bd6d93b8a5c439b8ca20c upstream. page is checked for null in __build_path_from_dentry_optional_prefix when tcon->origin_fullpath is not set. However, the check is missing when it is set. Add a check to prevent a potential NULL pointer dereference. Signed-off-by: Ruben Devos Cc: stable@vger.kernel.org Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/namespace.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/smb/client/namespace.c b/fs/smb/client/namespace.c index e3f9213131c46..a6655807c0865 100644 --- a/fs/smb/client/namespace.c +++ b/fs/smb/client/namespace.c @@ -146,6 +146,9 @@ static char *automount_fullpath(struct dentry *dentry, void *page) } spin_unlock(&tcon->tc_lock); + if (unlikely(!page)) + return ERR_PTR(-ENOMEM); + s = dentry_path_raw(dentry, page, PATH_MAX); if (IS_ERR(s)) return s; -- GitLab From 704cd2f2074203306e75a2a086e514b1615fa2a1 Mon Sep 17 00:00:00 2001 From: Long Li Date: Mon, 5 May 2025 17:56:33 -0700 Subject: [PATCH 1359/2211] Drivers: hv: Allocate interrupt and monitor pages aligned to system page boundary commit 09eea7ad0b8e973dcf5ed49902838e5d68177f8e upstream. There are use cases that interrupt and monitor pages are mapped to user-mode through UIO, so they need to be system page aligned. Some Hyper-V allocation APIs introduced earlier broke those requirements. Fix this by using page allocation functions directly for interrupt and monitor pages. Cc: stable@vger.kernel.org Fixes: ca48739e59df ("Drivers: hv: vmbus: Move Hyper-V page allocator to arch neutral code") Signed-off-by: Long Li Reviewed-by: Michael Kelley Link: https://lore.kernel.org/r/1746492997-4599-2-git-send-email-longli@linuxonhyperv.com Signed-off-by: Wei Liu Message-ID: <1746492997-4599-2-git-send-email-longli@linuxonhyperv.com> Signed-off-by: Greg Kroah-Hartman --- drivers/hv/connection.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c index f001ae880e1db..27306c17b0c4e 100644 --- a/drivers/hv/connection.c +++ b/drivers/hv/connection.c @@ -206,11 +206,20 @@ int vmbus_connect(void) INIT_LIST_HEAD(&vmbus_connection.chn_list); mutex_init(&vmbus_connection.channel_mutex); + /* + * The following Hyper-V interrupt and monitor pages can be used by + * UIO for mapping to user-space, so they should always be allocated on + * system page boundaries. The system page size must be >= the Hyper-V + * page size. + */ + BUILD_BUG_ON(PAGE_SIZE < HV_HYP_PAGE_SIZE); + /* * Setup the vmbus event connection for channel interrupt * abstraction stuff */ - vmbus_connection.int_page = hv_alloc_hyperv_zeroed_page(); + vmbus_connection.int_page = + (void *)__get_free_page(GFP_KERNEL | __GFP_ZERO); if (vmbus_connection.int_page == NULL) { ret = -ENOMEM; goto cleanup; @@ -225,8 +234,8 @@ int vmbus_connect(void) * Setup the monitor notification facility. The 1st page for * parent->child and the 2nd page for child->parent */ - vmbus_connection.monitor_pages[0] = hv_alloc_hyperv_page(); - vmbus_connection.monitor_pages[1] = hv_alloc_hyperv_page(); + vmbus_connection.monitor_pages[0] = (void *)__get_free_page(GFP_KERNEL); + vmbus_connection.monitor_pages[1] = (void *)__get_free_page(GFP_KERNEL); if ((vmbus_connection.monitor_pages[0] == NULL) || (vmbus_connection.monitor_pages[1] == NULL)) { ret = -ENOMEM; @@ -342,21 +351,23 @@ void vmbus_disconnect(void) destroy_workqueue(vmbus_connection.work_queue); if (vmbus_connection.int_page) { - hv_free_hyperv_page(vmbus_connection.int_page); + free_page((unsigned long)vmbus_connection.int_page); vmbus_connection.int_page = NULL; } if (vmbus_connection.monitor_pages[0]) { if (!set_memory_encrypted( (unsigned long)vmbus_connection.monitor_pages[0], 1)) - hv_free_hyperv_page(vmbus_connection.monitor_pages[0]); + free_page((unsigned long) + vmbus_connection.monitor_pages[0]); vmbus_connection.monitor_pages[0] = NULL; } if (vmbus_connection.monitor_pages[1]) { if (!set_memory_encrypted( (unsigned long)vmbus_connection.monitor_pages[1], 1)) - hv_free_hyperv_page(vmbus_connection.monitor_pages[1]); + free_page((unsigned long) + vmbus_connection.monitor_pages[1]); vmbus_connection.monitor_pages[1] = NULL; } } -- GitLab From 157b0827d7f04fa31adb94eabd516f93b8529a88 Mon Sep 17 00:00:00 2001 From: Long Li Date: Mon, 5 May 2025 17:56:34 -0700 Subject: [PATCH 1360/2211] uio_hv_generic: Use correct size for interrupt and monitor pages commit c951ab8fd3589cf6991ed4111d2130816f2e3ac2 upstream. Interrupt and monitor pages should be in Hyper-V page size (4k bytes). This can be different from the system page size. This size is read and used by the user-mode program to determine the mapped data region. An example of such user-mode program is the VMBus driver in DPDK. Cc: stable@vger.kernel.org Fixes: 95096f2fbd10 ("uio-hv-generic: new userspace i/o driver for VMBus") Signed-off-by: Long Li Reviewed-by: Michael Kelley Link: https://lore.kernel.org/r/1746492997-4599-3-git-send-email-longli@linuxonhyperv.com Signed-off-by: Wei Liu Message-ID: <1746492997-4599-3-git-send-email-longli@linuxonhyperv.com> Signed-off-by: Greg Kroah-Hartman --- drivers/uio/uio_hv_generic.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/uio/uio_hv_generic.c b/drivers/uio/uio_hv_generic.c index c2759bbeed849..16391be4e7f2b 100644 --- a/drivers/uio/uio_hv_generic.c +++ b/drivers/uio/uio_hv_generic.c @@ -274,13 +274,13 @@ hv_uio_probe(struct hv_device *dev, pdata->info.mem[INT_PAGE_MAP].name = "int_page"; pdata->info.mem[INT_PAGE_MAP].addr = (uintptr_t)vmbus_connection.int_page; - pdata->info.mem[INT_PAGE_MAP].size = PAGE_SIZE; + pdata->info.mem[INT_PAGE_MAP].size = HV_HYP_PAGE_SIZE; pdata->info.mem[INT_PAGE_MAP].memtype = UIO_MEM_LOGICAL; pdata->info.mem[MON_PAGE_MAP].name = "monitor_page"; pdata->info.mem[MON_PAGE_MAP].addr = (uintptr_t)vmbus_connection.monitor_pages[1]; - pdata->info.mem[MON_PAGE_MAP].size = PAGE_SIZE; + pdata->info.mem[MON_PAGE_MAP].size = HV_HYP_PAGE_SIZE; pdata->info.mem[MON_PAGE_MAP].memtype = UIO_MEM_LOGICAL; pdata->recv_buf = vzalloc(RECV_BUFFER_SIZE); -- GitLab From bf1299797c3c425fd1ce41591f98b752783abe35 Mon Sep 17 00:00:00 2001 From: Long Li Date: Mon, 5 May 2025 17:56:35 -0700 Subject: [PATCH 1361/2211] uio_hv_generic: Align ring size to system page commit 0315fef2aff9f251ddef8a4b53db9187429c3553 upstream. Following the ring header, the ring data should align to system page boundary. Adjust the size if necessary. Cc: stable@vger.kernel.org Fixes: 95096f2fbd10 ("uio-hv-generic: new userspace i/o driver for VMBus") Signed-off-by: Long Li Reviewed-by: Michael Kelley Link: https://lore.kernel.org/r/1746492997-4599-4-git-send-email-longli@linuxonhyperv.com Signed-off-by: Wei Liu Message-ID: <1746492997-4599-4-git-send-email-longli@linuxonhyperv.com> Signed-off-by: Greg Kroah-Hartman --- drivers/uio/uio_hv_generic.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/uio/uio_hv_generic.c b/drivers/uio/uio_hv_generic.c index 16391be4e7f2b..a6551a795f744 100644 --- a/drivers/uio/uio_hv_generic.c +++ b/drivers/uio/uio_hv_generic.c @@ -243,6 +243,9 @@ hv_uio_probe(struct hv_device *dev, if (!ring_size) ring_size = SZ_2M; + /* Adjust ring size if necessary to have it page aligned */ + ring_size = VMBUS_RING_SIZE(ring_size); + pdata = devm_kzalloc(&dev->device, sizeof(*pdata), GFP_KERNEL); if (!pdata) return -ENOMEM; -- GitLab From 523815857b1e74b0a1d381802bd7434eda3e1359 Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Wed, 14 May 2025 09:43:15 +0200 Subject: [PATCH 1362/2211] PCI: cadence-ep: Correct PBA offset in .set_msix() callback commit c8bcb01352a86bc5592403904109c22b66bd916e upstream. While cdns_pcie_ep_set_msix() writes the Table Size field correctly (N-1), the calculation of the PBA offset is wrong because it calculates space for (N-1) entries instead of N. This results in the following QEMU error when using PCI passthrough on a device which relies on the PCI endpoint subsystem: failed to add PCI capability 0x11[0x50]@0xb0: table & pba overlap, or they don't fit in BARs, or don't align Fix the calculation of PBA offset in the MSI-X capability. [bhelgaas: more specific subject and commit log] Fixes: 3ef5d16f50f8 ("PCI: cadence: Add MSI-X support to Endpoint driver") Signed-off-by: Niklas Cassel Signed-off-by: Manivannan Sadhasivam Signed-off-by: Bjorn Helgaas Reviewed-by: Wilfred Mallawa Reviewed-by: Damien Le Moal Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20250514074313.283156-10-cassel@kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/pci/controller/cadence/pcie-cadence-ep.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/pci/controller/cadence/pcie-cadence-ep.c b/drivers/pci/controller/cadence/pcie-cadence-ep.c index 0bf4cde34f517..f700e8c490822 100644 --- a/drivers/pci/controller/cadence/pcie-cadence-ep.c +++ b/drivers/pci/controller/cadence/pcie-cadence-ep.c @@ -292,13 +292,14 @@ static int cdns_pcie_ep_set_msix(struct pci_epc *epc, u8 fn, u8 vfn, struct cdns_pcie *pcie = &ep->pcie; u32 cap = CDNS_PCIE_EP_FUNC_MSIX_CAP_OFFSET; u32 val, reg; + u16 actual_interrupts = interrupts + 1; fn = cdns_pcie_get_fn_from_vfn(pcie, fn, vfn); reg = cap + PCI_MSIX_FLAGS; val = cdns_pcie_ep_fn_readw(pcie, fn, reg); val &= ~PCI_MSIX_FLAGS_QSIZE; - val |= interrupts; + val |= interrupts; /* 0's based value */ cdns_pcie_ep_fn_writew(pcie, fn, reg, val); /* Set MSIX BAR and offset */ @@ -308,7 +309,7 @@ static int cdns_pcie_ep_set_msix(struct pci_epc *epc, u8 fn, u8 vfn, /* Set PBA BAR and offset. BAR must match MSIX BAR */ reg = cap + PCI_MSIX_PBA; - val = (offset + (interrupts * PCI_MSIX_ENTRY_SIZE)) | bir; + val = (offset + (actual_interrupts * PCI_MSIX_ENTRY_SIZE)) | bir; cdns_pcie_ep_fn_writel(pcie, fn, reg, val); return 0; -- GitLab From 68e58f57912144d98112bc6e188301e18bfefd24 Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Wed, 14 May 2025 09:43:14 +0200 Subject: [PATCH 1363/2211] PCI: dwc: ep: Correct PBA offset in .set_msix() callback commit 810276362bad172d063d1f6be1cc2cb425b90103 upstream. While dw_pcie_ep_set_msix() writes the Table Size field correctly (N-1), the calculation of the PBA offset is wrong because it calculates space for (N-1) entries instead of N. This results in the following QEMU error when using PCI passthrough on a device which relies on the PCI endpoint subsystem: failed to add PCI capability 0x11[0x50]@0xb0: table & pba overlap, or they don't fit in BARs, or don't align Fix the calculation of PBA offset in the MSI-X capability. [bhelgaas: more specific subject and commit log] Fixes: 83153d9f36e2 ("PCI: endpoint: Fix ->set_msix() to take BIR and offset as arguments") Signed-off-by: Niklas Cassel Signed-off-by: Manivannan Sadhasivam Signed-off-by: Bjorn Helgaas Reviewed-by: Wilfred Mallawa Reviewed-by: Damien Le Moal Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20250514074313.283156-9-cassel@kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/pci/controller/dwc/pcie-designware-ep.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c index 9e7e94f32b436..00289948f9c12 100644 --- a/drivers/pci/controller/dwc/pcie-designware-ep.c +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c @@ -398,6 +398,7 @@ static int dw_pcie_ep_set_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no, struct dw_pcie *pci = to_dw_pcie_from_ep(ep); struct dw_pcie_ep_func *ep_func; u32 val, reg; + u16 actual_interrupts = interrupts + 1; ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no); if (!ep_func || !ep_func->msix_cap) @@ -408,7 +409,7 @@ static int dw_pcie_ep_set_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no, reg = ep_func->msix_cap + PCI_MSIX_FLAGS; val = dw_pcie_ep_readw_dbi(ep, func_no, reg); val &= ~PCI_MSIX_FLAGS_QSIZE; - val |= interrupts; + val |= interrupts; /* 0's based value */ dw_pcie_writew_dbi(pci, reg, val); reg = ep_func->msix_cap + PCI_MSIX_TABLE; @@ -416,7 +417,7 @@ static int dw_pcie_ep_set_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no, dw_pcie_ep_writel_dbi(ep, func_no, reg, val); reg = ep_func->msix_cap + PCI_MSIX_PBA; - val = (offset + (interrupts * PCI_MSIX_ENTRY_SIZE)) | bir; + val = (offset + (actual_interrupts * PCI_MSIX_ENTRY_SIZE)) | bir; dw_pcie_ep_writel_dbi(ep, func_no, reg, val); dw_pcie_dbi_ro_wr_dis(pci); -- GitLab From b20701d594d100ceb9116fed71c4db7f8580779f Mon Sep 17 00:00:00 2001 From: Huacai Chen Date: Thu, 3 Apr 2025 12:07:56 +0800 Subject: [PATCH 1364/2211] PCI: Add ACS quirk for Loongson PCIe commit 1f3303aa92e15fa273779acac2d0023609de30f1 upstream. Loongson PCIe Root Ports don't advertise an ACS capability, but they do not allow peer-to-peer transactions between Root Ports. Add an ACS quirk so each Root Port can be in a separate IOMMU group. Signed-off-by: Xianglai Li Signed-off-by: Huacai Chen Signed-off-by: Bjorn Helgaas Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20250403040756.720409-1-chenhuacai@loongson.cn Signed-off-by: Greg Kroah-Hartman --- drivers/pci/quirks.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 064067d9c8b52..db609d26811ba 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -4995,6 +4995,18 @@ static int pci_quirk_brcm_acs(struct pci_dev *dev, u16 acs_flags) PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF); } +static int pci_quirk_loongson_acs(struct pci_dev *dev, u16 acs_flags) +{ + /* + * Loongson PCIe Root Ports don't advertise an ACS capability, but + * they do not allow peer-to-peer transactions between Root Ports. + * Allow each Root Port to be in a separate IOMMU group by masking + * SV/RR/CR/UF bits. + */ + return pci_acs_ctrl_enabled(acs_flags, + PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF); +} + /* * Wangxun 40G/25G/10G/1G NICs have no ACS capability, but on * multi-function devices, the hardware isolates the functions by @@ -5128,6 +5140,17 @@ static const struct pci_dev_acs_enabled { { PCI_VENDOR_ID_BROADCOM, 0x1762, pci_quirk_mf_endpoint_acs }, { PCI_VENDOR_ID_BROADCOM, 0x1763, pci_quirk_mf_endpoint_acs }, { PCI_VENDOR_ID_BROADCOM, 0xD714, pci_quirk_brcm_acs }, + /* Loongson PCIe Root Ports */ + { PCI_VENDOR_ID_LOONGSON, 0x3C09, pci_quirk_loongson_acs }, + { PCI_VENDOR_ID_LOONGSON, 0x3C19, pci_quirk_loongson_acs }, + { PCI_VENDOR_ID_LOONGSON, 0x3C29, pci_quirk_loongson_acs }, + { PCI_VENDOR_ID_LOONGSON, 0x7A09, pci_quirk_loongson_acs }, + { PCI_VENDOR_ID_LOONGSON, 0x7A19, pci_quirk_loongson_acs }, + { PCI_VENDOR_ID_LOONGSON, 0x7A29, pci_quirk_loongson_acs }, + { PCI_VENDOR_ID_LOONGSON, 0x7A39, pci_quirk_loongson_acs }, + { PCI_VENDOR_ID_LOONGSON, 0x7A49, pci_quirk_loongson_acs }, + { PCI_VENDOR_ID_LOONGSON, 0x7A59, pci_quirk_loongson_acs }, + { PCI_VENDOR_ID_LOONGSON, 0x7A69, pci_quirk_loongson_acs }, /* Amazon Annapurna Labs */ { PCI_VENDOR_ID_AMAZON_ANNAPURNA_LABS, 0x0031, pci_quirk_al_acs }, /* Zhaoxin multi-function devices */ -- GitLab From be0cf75cbd37f346ba0a1d4cd2b23054eee31b03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= Date: Mon, 5 May 2025 14:54:12 +0300 Subject: [PATCH 1365/2211] PCI: Fix lock symmetry in pci_slot_unlock() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit f3efb9569b4a21354ef2caf7ab0608a3e14cc6e4 upstream. The commit a4e772898f8b ("PCI: Add missing bridge lock to pci_bus_lock()") made the lock function to call depend on dev->subordinate but left pci_slot_unlock() unmodified creating locking asymmetry compared with pci_slot_lock(). Because of the asymmetric lock handling, the same bridge device is unlocked twice. First pci_bus_unlock() unlocks bus->self and then pci_slot_unlock() will unconditionally unlock the same bridge device. Move pci_dev_unlock() inside an else branch to match the logic in pci_slot_lock(). Fixes: a4e772898f8b ("PCI: Add missing bridge lock to pci_bus_lock()") Signed-off-by: Ilpo Järvinen Signed-off-by: Bjorn Helgaas Reviewed-by: Lukas Wunner Reviewed-by: Dave Jiang Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20250505115412.37628-1-ilpo.jarvinen@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/pci/pci.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 7ca5422feb2d4..51a09e48967f2 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -5643,7 +5643,8 @@ static void pci_slot_unlock(struct pci_slot *slot) continue; if (dev->subordinate) pci_bus_unlock(dev->subordinate); - pci_dev_unlock(dev); + else + pci_dev_unlock(dev); } } -- GitLab From 0835fbe0d11829f0bcc64cdeb973b3debae6dfef Mon Sep 17 00:00:00 2001 From: Shawn Lin Date: Thu, 17 Apr 2025 08:35:09 +0800 Subject: [PATCH 1366/2211] PCI: dw-rockchip: Remove PCIE_L0S_ENTRY check from rockchip_pcie_link_up() commit 7d9b5d6115532cf90a789ed6afd3f4c70ebbd827 upstream. rockchip_pcie_link_up() currently has two issues: 1. Value 0x11 of PCIE_L0S_ENTRY corresponds to L0 state, not L0S. So the naming is wrong from the very beginning. 2. Checking for value 0x11 treats other states like L0S and L1 as link down, which is wrong. Hence, remove the PCIE_L0S_ENTRY check and also its definition. This allows adding ASPM support in the successive commits. Fixes: 0e898eb8df4e ("PCI: rockchip-dwc: Add Rockchip RK356X host controller driver") Signed-off-by: Shawn Lin [mani: commit message rewording] Signed-off-by: Manivannan Sadhasivam Reviewed-by: Niklas Cassel Reviewed-by: Manivannan Sadhasivam Cc: stable@vger.kernel.org Link: https://patch.msgid.link/1744850111-236269-1-git-send-email-shawn.lin@rock-chips.com Signed-off-by: Greg Kroah-Hartman --- drivers/pci/controller/dwc/pcie-dw-rockchip.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c index 1170e1107508b..8c2b45498cc54 100644 --- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c @@ -44,7 +44,6 @@ #define PCIE_LINKUP (PCIE_SMLH_LINKUP | PCIE_RDLH_LINKUP) #define PCIE_RDLH_LINK_UP_CHGED BIT(1) #define PCIE_LINK_REQ_RST_NOT_INT BIT(2) -#define PCIE_L0S_ENTRY 0x11 #define PCIE_CLIENT_GENERAL_CONTROL 0x0 #define PCIE_CLIENT_INTR_STATUS_LEGACY 0x8 #define PCIE_CLIENT_INTR_MASK_LEGACY 0x1c @@ -177,8 +176,7 @@ static int rockchip_pcie_link_up(struct dw_pcie *pci) struct rockchip_pcie *rockchip = to_rockchip_pcie(pci); u32 val = rockchip_pcie_get_ltssm(rockchip); - if ((val & PCIE_LINKUP) == PCIE_LINKUP && - (val & PCIE_LTSSM_STATUS_MASK) == PCIE_L0S_ENTRY) + if ((val & PCIE_LINKUP) == PCIE_LINKUP) return 1; return 0; -- GitLab From ae3c4187640c30371a30fa63c74c9042b2b77cbc Mon Sep 17 00:00:00 2001 From: Diederik de Haas Date: Thu, 17 Apr 2025 16:21:18 +0200 Subject: [PATCH 1367/2211] PCI: dw-rockchip: Fix PHY function call sequence in rockchip_pcie_phy_deinit() commit 286ed198b899739862456f451eda884558526a9d upstream. The documentation for the phy_power_off() function explicitly says that it must be called before phy_exit(). Hence, follow the same rule in rockchip_pcie_phy_deinit(). Fixes: 0e898eb8df4e ("PCI: rockchip-dwc: Add Rockchip RK356X host controller driver") Signed-off-by: Diederik de Haas [mani: commit message change] Signed-off-by: Manivannan Sadhasivam Reviewed-by: Niklas Cassel Reviewed-by: Dragan Simic Acked-by: Shawn Lin Cc: stable@vger.kernel.org # v5.15+ Link: https://patch.msgid.link/20250417142138.1377451-1-didi.debian@cknow.org Signed-off-by: Greg Kroah-Hartman --- drivers/pci/controller/dwc/pcie-dw-rockchip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c index 8c2b45498cc54..6b113a1212a92 100644 --- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c @@ -377,8 +377,8 @@ static int rockchip_pcie_phy_init(struct rockchip_pcie *rockchip) static void rockchip_pcie_phy_deinit(struct rockchip_pcie *rockchip) { - phy_exit(rockchip->phy); phy_power_off(rockchip->phy); + phy_exit(rockchip->phy); } static const struct dw_pcie_ops dw_pcie_ops = { -- GitLab From 2facd42665949a8dcd1da08582388e2fdeb08b94 Mon Sep 17 00:00:00 2001 From: Sean Nyekjaer Date: Mon, 5 May 2025 21:20:08 +0200 Subject: [PATCH 1368/2211] iio: accel: fxls8962af: Fix temperature scan element sign commit 9c78317b42e7c32523c91099859bc4721e9f75dd upstream. Mark the temperature element signed, data read from the TEMP_OUT register is in two's complement format. This will avoid the temperature being mishandled and miss displayed. Fixes: a3e0b51884ee ("iio: accel: add support for FXLS8962AF/FXLS8964AF accelerometers") Suggested-by: Marcelo Schmitt Cc: stable@vger.kernel.org Reviewed-by: Marcelo Schmitt Signed-off-by: Sean Nyekjaer Link: https://patch.msgid.link/20250505-fxls-v4-2-a38652e21738@geanix.com Signed-off-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman --- drivers/iio/accel/fxls8962af-core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/iio/accel/fxls8962af-core.c b/drivers/iio/accel/fxls8962af-core.c index acadabec4df7a..f7252009f5f3a 100644 --- a/drivers/iio/accel/fxls8962af-core.c +++ b/drivers/iio/accel/fxls8962af-core.c @@ -739,6 +739,7 @@ static const struct iio_event_spec fxls8962af_event[] = { BIT(IIO_CHAN_INFO_OFFSET),\ .scan_index = -1, \ .scan_type = { \ + .sign = 's', \ .realbits = 8, \ .storagebits = 8, \ }, \ -- GitLab From 648f1d5446dde6f87a7a213acd4aaecdbf497ff8 Mon Sep 17 00:00:00 2001 From: Jacek Lawrynowicz Date: Tue, 6 May 2025 11:13:03 +0200 Subject: [PATCH 1369/2211] accel/ivpu: Improve buffer object logging commit a01e93ee44f7ed76f872d0ede82f8d31bf0a048a upstream. - Fix missing alloc log when drm_gem_handle_create() fails in drm_vma_node_allow() and open callback is not called - Add ivpu_bo->ctx_id that enables to log the actual context id instead of using 0 as default - Add couple WARNs and errors so we can catch more memory corruption issues Fixes: 37dee2a2f433 ("accel/ivpu: Improve buffer object debug logs") Cc: stable@vger.kernel.org # v6.8+ Reviewed-by: Jeff Hugo Reviewed-by: Lizhi Hou Signed-off-by: Jacek Lawrynowicz Link: https://lore.kernel.org/r/20250506091303.262034-1-jacek.lawrynowicz@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/accel/ivpu/ivpu_gem.c | 25 +++++++++++++++++-------- drivers/accel/ivpu/ivpu_gem.h | 1 + 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_gem.c b/drivers/accel/ivpu/ivpu_gem.c index c8daffd90f300..a6125e0997b01 100644 --- a/drivers/accel/ivpu/ivpu_gem.c +++ b/drivers/accel/ivpu/ivpu_gem.c @@ -26,7 +26,7 @@ static inline void ivpu_dbg_bo(struct ivpu_device *vdev, struct ivpu_bo *bo, con { ivpu_dbg(vdev, BO, "%6s: bo %8p vpu_addr %9llx size %8zu ctx %d has_pages %d dma_mapped %d mmu_mapped %d wc %d imported %d\n", - action, bo, bo->vpu_addr, ivpu_bo_size(bo), bo->ctx ? bo->ctx->id : 0, + action, bo, bo->vpu_addr, ivpu_bo_size(bo), bo->ctx_id, (bool)bo->base.pages, (bool)bo->base.sgt, bo->mmu_mapped, bo->base.map_wc, (bool)bo->base.base.import_attach); } @@ -92,8 +92,6 @@ ivpu_bo_alloc_vpu_addr(struct ivpu_bo *bo, struct ivpu_mmu_context *ctx, ivpu_err(vdev, "Failed to add BO to context %u: %d\n", ctx->id, ret); } - ivpu_dbg_bo(vdev, bo, "alloc"); - mutex_unlock(&bo->lock); drm_dev_exit(idx); @@ -172,7 +170,7 @@ struct drm_gem_object *ivpu_gem_create_object(struct drm_device *dev, size_t siz return &bo->base.base; } -static struct ivpu_bo *ivpu_bo_alloc(struct ivpu_device *vdev, u64 size, u32 flags) +static struct ivpu_bo *ivpu_bo_alloc(struct ivpu_device *vdev, u64 size, u32 flags, u32 ctx_id) { struct drm_gem_shmem_object *shmem; struct ivpu_bo *bo; @@ -190,6 +188,7 @@ static struct ivpu_bo *ivpu_bo_alloc(struct ivpu_device *vdev, u64 size, u32 fla return ERR_CAST(shmem); bo = to_ivpu_bo(&shmem->base); + bo->ctx_id = ctx_id; bo->base.map_wc = flags & DRM_IVPU_BO_WC; bo->flags = flags; @@ -197,6 +196,8 @@ static struct ivpu_bo *ivpu_bo_alloc(struct ivpu_device *vdev, u64 size, u32 fla list_add_tail(&bo->bo_list_node, &vdev->bo_list); mutex_unlock(&vdev->bo_list_lock); + ivpu_dbg_bo(vdev, bo, "alloc"); + return bo; } @@ -235,8 +236,13 @@ static void ivpu_gem_bo_free(struct drm_gem_object *obj) mutex_unlock(&vdev->bo_list_lock); drm_WARN_ON(&vdev->drm, !dma_resv_test_signaled(obj->resv, DMA_RESV_USAGE_READ)); + drm_WARN_ON(&vdev->drm, ivpu_bo_size(bo) == 0); + drm_WARN_ON(&vdev->drm, bo->base.vaddr); ivpu_bo_unbind_locked(bo); + drm_WARN_ON(&vdev->drm, bo->mmu_mapped); + drm_WARN_ON(&vdev->drm, bo->ctx); + mutex_destroy(&bo->lock); drm_WARN_ON(obj->dev, bo->base.pages_use_count > 1); @@ -271,7 +277,7 @@ int ivpu_bo_create_ioctl(struct drm_device *dev, void *data, struct drm_file *fi if (size == 0) return -EINVAL; - bo = ivpu_bo_alloc(vdev, size, args->flags); + bo = ivpu_bo_alloc(vdev, size, args->flags, file_priv->ctx.id); if (IS_ERR(bo)) { ivpu_err(vdev, "Failed to allocate BO: %pe (ctx %u size %llu flags 0x%x)", bo, file_priv->ctx.id, args->size, args->flags); @@ -279,7 +285,10 @@ int ivpu_bo_create_ioctl(struct drm_device *dev, void *data, struct drm_file *fi } ret = drm_gem_handle_create(file, &bo->base.base, &args->handle); - if (!ret) + if (ret) + ivpu_err(vdev, "Failed to create handle for BO: %pe (ctx %u size %llu flags 0x%x)", + bo, file_priv->ctx.id, args->size, args->flags); + else args->vpu_addr = bo->vpu_addr; drm_gem_object_put(&bo->base.base); @@ -302,7 +311,7 @@ ivpu_bo_create(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx, drm_WARN_ON(&vdev->drm, !PAGE_ALIGNED(range->end)); drm_WARN_ON(&vdev->drm, !PAGE_ALIGNED(size)); - bo = ivpu_bo_alloc(vdev, size, flags); + bo = ivpu_bo_alloc(vdev, size, flags, IVPU_GLOBAL_CONTEXT_MMU_SSID); if (IS_ERR(bo)) { ivpu_err(vdev, "Failed to allocate BO: %pe (vpu_addr 0x%llx size %llu flags 0x%x)", bo, range->start, size, flags); @@ -406,7 +415,7 @@ static void ivpu_bo_print_info(struct ivpu_bo *bo, struct drm_printer *p) mutex_lock(&bo->lock); drm_printf(p, "%-9p %-3u 0x%-12llx %-10lu 0x%-8x %-4u", - bo, bo->ctx ? bo->ctx->id : 0, bo->vpu_addr, bo->base.base.size, + bo, bo->ctx_id, bo->vpu_addr, bo->base.base.size, bo->flags, kref_read(&bo->base.base.refcount)); if (bo->base.pages) diff --git a/drivers/accel/ivpu/ivpu_gem.h b/drivers/accel/ivpu/ivpu_gem.h index d975000abd785..06ff8fe3e73f1 100644 --- a/drivers/accel/ivpu/ivpu_gem.h +++ b/drivers/accel/ivpu/ivpu_gem.h @@ -21,6 +21,7 @@ struct ivpu_bo { u64 vpu_addr; u32 flags; u32 job_status; /* Valid only for command buffer */ + u32 ctx_id; bool mmu_mapped; }; -- GitLab From 954b19010691f6077cbc10dbf38dac348194b8cb Mon Sep 17 00:00:00 2001 From: Jacek Lawrynowicz Date: Tue, 6 May 2025 11:20:30 +0200 Subject: [PATCH 1370/2211] accel/ivpu: Use firmware names from upstream repo commit 1c2c0e29f24360b3130c005a3c261cb8c7b363c6 upstream. Use FW names from linux-firmware repo instead of deprecated ones. The vpu_37xx.bin style names were never released and were only used for internal testing, so it is safe to remove them. Fixes: c140244f0cfb ("accel/ivpu: Add initial Panther Lake support") Cc: stable@vger.kernel.org # v6.13+ Reviewed-by: Lizhi Hou Reviewed-by: Jeff Hugo Signed-off-by: Jacek Lawrynowicz Link: https://lore.kernel.org/r/20250506092030.280276-1-jacek.lawrynowicz@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/accel/ivpu/ivpu_fw.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_fw.c b/drivers/accel/ivpu/ivpu_fw.c index 83e4995540a6e..cd40446a22a57 100644 --- a/drivers/accel/ivpu/ivpu_fw.c +++ b/drivers/accel/ivpu/ivpu_fw.c @@ -53,18 +53,18 @@ static struct { int gen; const char *name; } fw_names[] = { - { IVPU_HW_IP_37XX, "vpu_37xx.bin" }, + { IVPU_HW_IP_37XX, "intel/vpu/vpu_37xx_v1.bin" }, { IVPU_HW_IP_37XX, "intel/vpu/vpu_37xx_v0.0.bin" }, - { IVPU_HW_IP_40XX, "vpu_40xx.bin" }, + { IVPU_HW_IP_40XX, "intel/vpu/vpu_40xx_v1.bin" }, { IVPU_HW_IP_40XX, "intel/vpu/vpu_40xx_v0.0.bin" }, - { IVPU_HW_IP_50XX, "vpu_50xx.bin" }, + { IVPU_HW_IP_50XX, "intel/vpu/vpu_50xx_v1.bin" }, { IVPU_HW_IP_50XX, "intel/vpu/vpu_50xx_v0.0.bin" }, }; /* Production fw_names from the table above */ -MODULE_FIRMWARE("intel/vpu/vpu_37xx_v0.0.bin"); -MODULE_FIRMWARE("intel/vpu/vpu_40xx_v0.0.bin"); -MODULE_FIRMWARE("intel/vpu/vpu_50xx_v0.0.bin"); +MODULE_FIRMWARE("intel/vpu/vpu_37xx_v1.bin"); +MODULE_FIRMWARE("intel/vpu/vpu_40xx_v1.bin"); +MODULE_FIRMWARE("intel/vpu/vpu_50xx_v1.bin"); static int ivpu_fw_request(struct ivpu_device *vdev) { -- GitLab From d2551a6178049d385539310523439792215e4952 Mon Sep 17 00:00:00 2001 From: Jacek Lawrynowicz Date: Wed, 28 May 2025 17:43:25 +0200 Subject: [PATCH 1371/2211] accel/ivpu: Use dma_resv_lock() instead of a custom mutex commit 98d3f772ca7d6822bdfc8c960f5f909574db97c9 upstream. This fixes a potential race conditions in: - ivpu_bo_unbind_locked() where we modified the shmem->sgt without holding the dma_resv_lock(). - ivpu_bo_print_info() where we read the shmem->pages without holding the dma_resv_lock(). Using dma_resv_lock() also protects against future syncronisation issues that may arise when accessing drm_gem_shmem_object or drm_gem_object members. Fixes: 42328003ecb6 ("accel/ivpu: Refactor BO creation functions") Cc: stable@vger.kernel.org # v6.9+ Reviewed-by: Lizhi Hou Signed-off-by: Jacek Lawrynowicz Link: https://lore.kernel.org/r/20250528154325.500684-1-jacek.lawrynowicz@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/accel/ivpu/ivpu_gem.c | 63 +++++++++++++++++++---------------- drivers/accel/ivpu/ivpu_gem.h | 1 - 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_gem.c b/drivers/accel/ivpu/ivpu_gem.c index a6125e0997b01..30c1dfc8e114d 100644 --- a/drivers/accel/ivpu/ivpu_gem.c +++ b/drivers/accel/ivpu/ivpu_gem.c @@ -31,6 +31,16 @@ static inline void ivpu_dbg_bo(struct ivpu_device *vdev, struct ivpu_bo *bo, con (bool)bo->base.base.import_attach); } +static inline int ivpu_bo_lock(struct ivpu_bo *bo) +{ + return dma_resv_lock(bo->base.base.resv, NULL); +} + +static inline void ivpu_bo_unlock(struct ivpu_bo *bo) +{ + dma_resv_unlock(bo->base.base.resv); +} + /* * ivpu_bo_pin() - pin the backing physical pages and map them to VPU. * @@ -41,22 +51,22 @@ static inline void ivpu_dbg_bo(struct ivpu_device *vdev, struct ivpu_bo *bo, con int __must_check ivpu_bo_pin(struct ivpu_bo *bo) { struct ivpu_device *vdev = ivpu_bo_to_vdev(bo); + struct sg_table *sgt; int ret = 0; - mutex_lock(&bo->lock); - ivpu_dbg_bo(vdev, bo, "pin"); - drm_WARN_ON(&vdev->drm, !bo->ctx); - if (!bo->mmu_mapped) { - struct sg_table *sgt = drm_gem_shmem_get_pages_sgt(&bo->base); + sgt = drm_gem_shmem_get_pages_sgt(&bo->base); + if (IS_ERR(sgt)) { + ret = PTR_ERR(sgt); + ivpu_err(vdev, "Failed to map BO in IOMMU: %d\n", ret); + return ret; + } - if (IS_ERR(sgt)) { - ret = PTR_ERR(sgt); - ivpu_err(vdev, "Failed to map BO in IOMMU: %d\n", ret); - goto unlock; - } + ivpu_bo_lock(bo); + if (!bo->mmu_mapped) { + drm_WARN_ON(&vdev->drm, !bo->ctx); ret = ivpu_mmu_context_map_sgt(vdev, bo->ctx, bo->vpu_addr, sgt, ivpu_bo_is_snooped(bo)); if (ret) { @@ -67,7 +77,7 @@ int __must_check ivpu_bo_pin(struct ivpu_bo *bo) } unlock: - mutex_unlock(&bo->lock); + ivpu_bo_unlock(bo); return ret; } @@ -82,7 +92,7 @@ ivpu_bo_alloc_vpu_addr(struct ivpu_bo *bo, struct ivpu_mmu_context *ctx, if (!drm_dev_enter(&vdev->drm, &idx)) return -ENODEV; - mutex_lock(&bo->lock); + ivpu_bo_lock(bo); ret = ivpu_mmu_context_insert_node(ctx, range, ivpu_bo_size(bo), &bo->mm_node); if (!ret) { @@ -92,7 +102,7 @@ ivpu_bo_alloc_vpu_addr(struct ivpu_bo *bo, struct ivpu_mmu_context *ctx, ivpu_err(vdev, "Failed to add BO to context %u: %d\n", ctx->id, ret); } - mutex_unlock(&bo->lock); + ivpu_bo_unlock(bo); drm_dev_exit(idx); @@ -103,7 +113,7 @@ static void ivpu_bo_unbind_locked(struct ivpu_bo *bo) { struct ivpu_device *vdev = ivpu_bo_to_vdev(bo); - lockdep_assert(lockdep_is_held(&bo->lock) || !kref_read(&bo->base.base.refcount)); + lockdep_assert(dma_resv_held(bo->base.base.resv) || !kref_read(&bo->base.base.refcount)); if (bo->mmu_mapped) { drm_WARN_ON(&vdev->drm, !bo->ctx); @@ -121,14 +131,12 @@ static void ivpu_bo_unbind_locked(struct ivpu_bo *bo) if (bo->base.base.import_attach) return; - dma_resv_lock(bo->base.base.resv, NULL); if (bo->base.sgt) { dma_unmap_sgtable(vdev->drm.dev, bo->base.sgt, DMA_BIDIRECTIONAL, 0); sg_free_table(bo->base.sgt); kfree(bo->base.sgt); bo->base.sgt = NULL; } - dma_resv_unlock(bo->base.base.resv); } void ivpu_bo_unbind_all_bos_from_context(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx) @@ -140,12 +148,12 @@ void ivpu_bo_unbind_all_bos_from_context(struct ivpu_device *vdev, struct ivpu_m mutex_lock(&vdev->bo_list_lock); list_for_each_entry(bo, &vdev->bo_list, bo_list_node) { - mutex_lock(&bo->lock); + ivpu_bo_lock(bo); if (bo->ctx == ctx) { ivpu_dbg_bo(vdev, bo, "unbind"); ivpu_bo_unbind_locked(bo); } - mutex_unlock(&bo->lock); + ivpu_bo_unlock(bo); } mutex_unlock(&vdev->bo_list_lock); } @@ -165,7 +173,6 @@ struct drm_gem_object *ivpu_gem_create_object(struct drm_device *dev, size_t siz bo->base.pages_mark_dirty_on_put = true; /* VPU can dirty a BO anytime */ INIT_LIST_HEAD(&bo->bo_list_node); - mutex_init(&bo->lock); return &bo->base.base; } @@ -243,8 +250,6 @@ static void ivpu_gem_bo_free(struct drm_gem_object *obj) drm_WARN_ON(&vdev->drm, bo->mmu_mapped); drm_WARN_ON(&vdev->drm, bo->ctx); - mutex_destroy(&bo->lock); - drm_WARN_ON(obj->dev, bo->base.pages_use_count > 1); drm_gem_shmem_free(&bo->base); } @@ -327,9 +332,9 @@ ivpu_bo_create(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx, goto err_put; if (flags & DRM_IVPU_BO_MAPPABLE) { - dma_resv_lock(bo->base.base.resv, NULL); + ivpu_bo_lock(bo); ret = drm_gem_shmem_vmap(&bo->base, &map); - dma_resv_unlock(bo->base.base.resv); + ivpu_bo_unlock(bo); if (ret) goto err_put; @@ -352,9 +357,9 @@ void ivpu_bo_free(struct ivpu_bo *bo) struct iosys_map map = IOSYS_MAP_INIT_VADDR(bo->base.vaddr); if (bo->flags & DRM_IVPU_BO_MAPPABLE) { - dma_resv_lock(bo->base.base.resv, NULL); + ivpu_bo_lock(bo); drm_gem_shmem_vunmap(&bo->base, &map); - dma_resv_unlock(bo->base.base.resv); + ivpu_bo_unlock(bo); } drm_gem_object_put(&bo->base.base); @@ -373,12 +378,12 @@ int ivpu_bo_info_ioctl(struct drm_device *dev, void *data, struct drm_file *file bo = to_ivpu_bo(obj); - mutex_lock(&bo->lock); + ivpu_bo_lock(bo); args->flags = bo->flags; args->mmap_offset = drm_vma_node_offset_addr(&obj->vma_node); args->vpu_addr = bo->vpu_addr; args->size = obj->size; - mutex_unlock(&bo->lock); + ivpu_bo_unlock(bo); drm_gem_object_put(obj); return ret; @@ -412,7 +417,7 @@ int ivpu_bo_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file static void ivpu_bo_print_info(struct ivpu_bo *bo, struct drm_printer *p) { - mutex_lock(&bo->lock); + ivpu_bo_lock(bo); drm_printf(p, "%-9p %-3u 0x%-12llx %-10lu 0x%-8x %-4u", bo, bo->ctx_id, bo->vpu_addr, bo->base.base.size, @@ -429,7 +434,7 @@ static void ivpu_bo_print_info(struct ivpu_bo *bo, struct drm_printer *p) drm_printf(p, "\n"); - mutex_unlock(&bo->lock); + ivpu_bo_unlock(bo); } void ivpu_bo_list(struct drm_device *dev, struct drm_printer *p) diff --git a/drivers/accel/ivpu/ivpu_gem.h b/drivers/accel/ivpu/ivpu_gem.h index 06ff8fe3e73f1..07bffe98c9635 100644 --- a/drivers/accel/ivpu/ivpu_gem.h +++ b/drivers/accel/ivpu/ivpu_gem.h @@ -17,7 +17,6 @@ struct ivpu_bo { struct list_head bo_list_node; struct drm_mm_node mm_node; - struct mutex lock; /* Protects: ctx, mmu_mapped, vpu_addr */ u64 vpu_addr; u32 flags; u32 job_status; /* Valid only for command buffer */ -- GitLab From de72e0a13e0f2f45fbe21eb032821eca0c042651 Mon Sep 17 00:00:00 2001 From: Jacek Lawrynowicz Date: Wed, 28 May 2025 19:12:20 +0200 Subject: [PATCH 1372/2211] accel/ivpu: Fix warning in ivpu_gem_bo_free() commit 91274fd4ed9ba110b02c53d71d2778b7d13b49ac upstream. Don't WARN if imported buffers are in use in ivpu_gem_bo_free() as they can be indeed used in the original context/driver. Fixes: 647371a6609d ("accel/ivpu: Add GEM buffer object management") Cc: stable@vger.kernel.org # v6.3 Reviewed-by: Jeff Hugo Reviewed-by: Lizhi Hou Signed-off-by: Jacek Lawrynowicz Link: https://lore.kernel.org/r/20250528171220.513225-1-jacek.lawrynowicz@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/accel/ivpu/ivpu_gem.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/accel/ivpu/ivpu_gem.c b/drivers/accel/ivpu/ivpu_gem.c index 30c1dfc8e114d..6b1bda7e130d0 100644 --- a/drivers/accel/ivpu/ivpu_gem.c +++ b/drivers/accel/ivpu/ivpu_gem.c @@ -242,7 +242,8 @@ static void ivpu_gem_bo_free(struct drm_gem_object *obj) list_del(&bo->bo_list_node); mutex_unlock(&vdev->bo_list_lock); - drm_WARN_ON(&vdev->drm, !dma_resv_test_signaled(obj->resv, DMA_RESV_USAGE_READ)); + drm_WARN_ON(&vdev->drm, !drm_gem_is_imported(&bo->base.base) && + !dma_resv_test_signaled(obj->resv, DMA_RESV_USAGE_READ)); drm_WARN_ON(&vdev->drm, ivpu_bo_size(bo) == 0); drm_WARN_ON(&vdev->drm, bo->base.vaddr); -- GitLab From acbe1597e358aaa63d12c4caeade11972a2e5c3a Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Tue, 20 May 2025 09:14:00 +0200 Subject: [PATCH 1373/2211] dummycon: Trigger redraw when switching consoles with deferred takeover commit 03bcbbb3995ba5df43af9aba45334e35f2dfe27b upstream. Signal vt subsystem to redraw console when switching to dummycon with deferred takeover enabled. Makes the console switch to fbcon and displays the available output. With deferred takeover enabled, dummycon acts as the placeholder until the first output to the console happens. At that point, fbcon takes over. If the output happens while dummycon is not active, it cannot inform fbcon. This is the case if the vt subsystem runs in graphics mode. A typical graphical boot starts plymouth, a display manager and a compositor; all while leaving out dummycon. Switching to a text-mode console leaves the console with dummycon even if a getty terminal has been started. Returning true from dummycon's con_switch helper signals the vt subsystem to redraw the screen. If there's output available dummycon's con_putc{s} helpers trigger deferred takeover of fbcon, which sets a display mode and displays the output. If no output is available, dummycon remains active. v2: - make the comment slightly more verbose (Javier) Signed-off-by: Thomas Zimmermann Reported-by: Andrei Borzenkov Closes: https://bugzilla.suse.com/show_bug.cgi?id=1242191 Tested-by: Andrei Borzenkov Acked-by: Javier Martinez Canillas Fixes: 83d83bebf401 ("console/fbcon: Add support for deferred console takeover") Cc: Hans de Goede Cc: linux-fbdev@vger.kernel.org Cc: dri-devel@lists.freedesktop.org Cc: # v4.19+ Link: https://lore.kernel.org/r/20250520071418.8462-1-tzimmermann@suse.de Signed-off-by: Greg Kroah-Hartman --- drivers/video/console/dummycon.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c index 139049368fdcf..7d02470f19b93 100644 --- a/drivers/video/console/dummycon.c +++ b/drivers/video/console/dummycon.c @@ -85,6 +85,15 @@ static bool dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank, /* Redraw, so that we get putc(s) for output done while blanked */ return true; } + +static bool dummycon_switch(struct vc_data *vc) +{ + /* + * Redraw, so that we get putc(s) for output done while switched + * away. Informs deferred consoles to take over the display. + */ + return true; +} #else static void dummycon_putc(struct vc_data *vc, u16 c, unsigned int y, unsigned int x) { } @@ -95,6 +104,10 @@ static bool dummycon_blank(struct vc_data *vc, enum vesa_blank_mode blank, { return false; } +static bool dummycon_switch(struct vc_data *vc) +{ + return false; +} #endif static const char *dummycon_startup(void) @@ -124,11 +137,6 @@ static bool dummycon_scroll(struct vc_data *vc, unsigned int top, return false; } -static bool dummycon_switch(struct vc_data *vc) -{ - return false; -} - /* * The console `switch' structure for the dummy console * -- GitLab From 034a52b5ef57c9c8225d94e9067f3390bb33922f Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Tue, 27 May 2025 23:23:54 +0200 Subject: [PATCH 1374/2211] mm/hugetlb: fix huge_pmd_unshare() vs GUP-fast race commit 1013af4f585fccc4d3e5c5824d174de2257f7d6d upstream. huge_pmd_unshare() drops a reference on a page table that may have previously been shared across processes, potentially turning it into a normal page table used in another process in which unrelated VMAs can afterwards be installed. If this happens in the middle of a concurrent gup_fast(), gup_fast() could end up walking the page tables of another process. While I don't see any way in which that immediately leads to kernel memory corruption, it is really weird and unexpected. Fix it with an explicit broadcast IPI through tlb_remove_table_sync_one(), just like we do in khugepaged when removing page tables for a THP collapse. Link: https://lkml.kernel.org/r/20250528-hugetlb-fixes-splitrace-v2-2-1329349bad1a@google.com Link: https://lkml.kernel.org/r/20250527-hugetlb-fixes-splitrace-v1-2-f4136f5ec58a@google.com Fixes: 39dde65c9940 ("[PATCH] shared page table for hugetlb page") Signed-off-by: Jann Horn Reviewed-by: Lorenzo Stoakes Cc: Liam Howlett Cc: Muchun Song Cc: Oscar Salvador Cc: Vlastimil Babka Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- mm/hugetlb.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mm/hugetlb.c b/mm/hugetlb.c index ad646fe6688a4..49af4a7bd3d87 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -7252,6 +7252,13 @@ int huge_pmd_unshare(struct mm_struct *mm, struct vm_area_struct *vma, return 0; pud_clear(pud); + /* + * Once our caller drops the rmap lock, some other process might be + * using this page table as a normal, non-hugetlb page table. + * Wait for pending gup_fast() in other threads to finish before letting + * that happen. + */ + tlb_remove_table_sync_one(); ptdesc_pmd_pts_dec(virt_to_ptdesc(ptep)); mm_dec_nr_pmds(mm); return 1; -- GitLab From ea66a9effa4850b889f34ffebb7d735cc16d34a5 Mon Sep 17 00:00:00 2001 From: Sean Nyekjaer Date: Fri, 2 May 2025 11:37:26 +0200 Subject: [PATCH 1375/2211] iio: imu: inv_icm42600: Fix temperature calculation commit e2f820014239df9360064079ae93f838ff3b7f8c upstream. >From the documentation: "offset to be added to [Y]_raw prior toscaling by [Y]_scale" Offset should be applied before multiplying scale, so divide offset by scale to make this correct. Fixes: bc3eb0207fb5 ("iio: imu: inv_icm42600: add temperature sensor support") Signed-off-by: Sean Nyekjaer Acked-by: Jean-Baptiste Maneyrol Link: https://patch.msgid.link/20250502-imu-v1-1-129b8391a4e3@geanix.com Cc: Signed-off-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman --- drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c index 213cce1c31110..91f0f381082bd 100644 --- a/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c +++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c @@ -67,16 +67,18 @@ int inv_icm42600_temp_read_raw(struct iio_dev *indio_dev, return IIO_VAL_INT; /* * T°C = (temp / 132.48) + 25 - * Tm°C = 1000 * ((temp * 100 / 13248) + 25) + * Tm°C = 1000 * ((temp / 132.48) + 25) + * Tm°C = 7.548309 * temp + 25000 + * Tm°C = (temp + 3312) * 7.548309 * scale: 100000 / 13248 ~= 7.548309 - * offset: 25000 + * offset: 3312 */ case IIO_CHAN_INFO_SCALE: *val = 7; *val2 = 548309; return IIO_VAL_INT_PLUS_MICRO; case IIO_CHAN_INFO_OFFSET: - *val = 25000; + *val = 3312; return IIO_VAL_INT; default: return -EINVAL; -- GitLab From aaa25db0b8a3571ee8eb0829a32fa16cf6efa15e Mon Sep 17 00:00:00 2001 From: David Lechner Date: Mon, 5 May 2025 13:28:40 -0500 Subject: [PATCH 1376/2211] iio: adc: ad7944: mask high bits on direct read MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 7cdfbc0113d087348b8e65dd79276d0f57b89a10 upstream. Apply a mask to the raw value received over the SPI bus for unsigned direct reads. As we found recently, SPI controllers may not set unused bits to 0 when reading with bits_per_word != {8,16,32}. The ad7944 uses bits_per_word of 14 and 18, so we need to mask the value to be sure we returning the correct value to userspace during a direct read. Fixes: d1efcf8871db ("iio: adc: ad7944: add driver for AD7944/AD7985/AD7986") Signed-off-by: David Lechner Reviewed-by: Nuno Sá Link: https://patch.msgid.link/20250505-iio-adc-ad7944-max-high-bits-on-direct-read-v1-1-b173facceefe@baylibre.com Cc: Signed-off-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman --- drivers/iio/adc/ad7944.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/iio/adc/ad7944.c b/drivers/iio/adc/ad7944.c index 58a25792cec37..1e2cf512c2f5f 100644 --- a/drivers/iio/adc/ad7944.c +++ b/drivers/iio/adc/ad7944.c @@ -290,6 +290,8 @@ static int ad7944_single_conversion(struct ad7944_adc *adc, if (chan->scan_type.sign == 's') *val = sign_extend32(*val, chan->scan_type.realbits - 1); + else + *val &= GENMASK(chan->scan_type.realbits - 1, 0); return IIO_VAL_INT; } -- GitLab From 399e325f3f0fc5c0b977b79fe01bd449b101004a Mon Sep 17 00:00:00 2001 From: Arthur-Prince Date: Wed, 30 Apr 2025 16:07:37 -0300 Subject: [PATCH 1377/2211] iio: adc: ti-ads1298: Kconfig: add kfifo dependency to fix module build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 3c5dfea39a245b2dad869db24e2830aa299b1cf2 upstream. Add dependency to Kconfig’s ti-ads1298 because compiling it as a module failed with an undefined kfifo symbol. Fixes: 00ef7708fa60 ("iio: adc: ti-ads1298: Add driver") Signed-off-by: Arthur-Prince Co-developed-by: Mariana Valério Signed-off-by: Mariana Valério Link: https://patch.msgid.link/20250430191131.120831-1-r2.arthur.prince@gmail.com Cc: Signed-off-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman --- drivers/iio/adc/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 6c4e74420fd25..216f3c9ce183e 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -1452,6 +1452,7 @@ config TI_ADS1298 tristate "Texas Instruments ADS1298" depends on SPI select IIO_BUFFER + select IIO_KFIFO_BUF help If you say yes here you get support for Texas Instruments ADS1298 medical ADC chips -- GitLab From 0c81bcc14bd6a287a0d5f20961186dde32c529d2 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Mon, 28 Apr 2025 20:55:34 -0500 Subject: [PATCH 1378/2211] iio: adc: ad7606_spi: fix reg write value mask commit 89944d88f8795c6c89b9514cb365998145511cd4 upstream. Fix incorrect value mask for register write. Register values are 8-bit, not 9. If this function was called with a value > 0xFF and an even addr, it would cause writing to the next register. Fixes: f2a22e1e172f ("iio: adc: ad7606: Add support for software mode for ad7616") Signed-off-by: David Lechner Reviewed-by: Angelo Dureghello Link: https://patch.msgid.link/20250428-iio-adc-ad7606_spi-fix-write-value-mask-v1-1-a2d5e85a809f@baylibre.com Cc: Signed-off-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman --- drivers/iio/adc/ad7606_spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/iio/adc/ad7606_spi.c b/drivers/iio/adc/ad7606_spi.c index 32a5448116a13..42112f97fac1a 100644 --- a/drivers/iio/adc/ad7606_spi.c +++ b/drivers/iio/adc/ad7606_spi.c @@ -151,7 +151,7 @@ static int ad7606_spi_reg_write(struct ad7606_state *st, struct spi_device *spi = to_spi_device(st->dev); st->d16[0] = cpu_to_be16((st->bops->rd_wr_cmd(addr, 1) << 8) | - (val & 0x1FF)); + (val & 0xFF)); return spi_write(spi, &st->d16[0], sizeof(st->d16[0])); } -- GitLab From 76d37168155880f2b04a0aad92ceb0f9d799950e Mon Sep 17 00:00:00 2001 From: Seunghun Han Date: Wed, 26 Mar 2025 21:05:24 +0100 Subject: [PATCH 1379/2211] ACPICA: fix acpi operand cache leak in dswstate.c [ Upstream commit 156fd20a41e776bbf334bd5e45c4f78dfc90ce1c ] ACPICA commit 987a3b5cf7175916e2a4b6ea5b8e70f830dfe732 I found an ACPI cache leak in ACPI early termination and boot continuing case. When early termination occurs due to malicious ACPI table, Linux kernel terminates ACPI function and continues to boot process. While kernel terminates ACPI function, kmem_cache_destroy() reports Acpi-Operand cache leak. Boot log of ACPI operand cache leak is as follows: >[ 0.585957] ACPI: Added _OSI(Module Device) >[ 0.587218] ACPI: Added _OSI(Processor Device) >[ 0.588530] ACPI: Added _OSI(3.0 _SCP Extensions) >[ 0.589790] ACPI: Added _OSI(Processor Aggregator Device) >[ 0.591534] ACPI Error: Illegal I/O port address/length above 64K: C806E00000004002/0x2 (20170303/hwvalid-155) >[ 0.594351] ACPI Exception: AE_LIMIT, Unable to initialize fixed events (20170303/evevent-88) >[ 0.597858] ACPI: Unable to start the ACPI Interpreter >[ 0.599162] ACPI Error: Could not remove SCI handler (20170303/evmisc-281) >[ 0.601836] kmem_cache_destroy Acpi-Operand: Slab cache still has objects >[ 0.603556] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.12.0-rc5 #26 >[ 0.605159] Hardware name: innotek gmb_h virtual_box/virtual_box, BIOS virtual_box 12/01/2006 >[ 0.609177] Call Trace: >[ 0.610063] ? dump_stack+0x5c/0x81 >[ 0.611118] ? kmem_cache_destroy+0x1aa/0x1c0 >[ 0.612632] ? acpi_sleep_proc_init+0x27/0x27 >[ 0.613906] ? acpi_os_delete_cache+0xa/0x10 >[ 0.617986] ? acpi_ut_delete_caches+0x3f/0x7b >[ 0.619293] ? acpi_terminate+0xa/0x14 >[ 0.620394] ? acpi_init+0x2af/0x34f >[ 0.621616] ? __class_create+0x4c/0x80 >[ 0.623412] ? video_setup+0x7f/0x7f >[ 0.624585] ? acpi_sleep_proc_init+0x27/0x27 >[ 0.625861] ? do_one_initcall+0x4e/0x1a0 >[ 0.627513] ? kernel_init_freeable+0x19e/0x21f >[ 0.628972] ? rest_init+0x80/0x80 >[ 0.630043] ? kernel_init+0xa/0x100 >[ 0.631084] ? ret_from_fork+0x25/0x30 >[ 0.633343] vgaarb: loaded >[ 0.635036] EDAC MC: Ver: 3.0.0 >[ 0.638601] PCI: Probing PCI hardware >[ 0.639833] PCI host bridge to bus 0000:00 >[ 0.641031] pci_bus 0000:00: root bus resource [io 0x0000-0xffff] > ... Continue to boot and log is omitted ... I analyzed this memory leak in detail and found acpi_ds_obj_stack_pop_and_ delete() function miscalculated the top of the stack. acpi_ds_obj_stack_push() function uses walk_state->operand_index for start position of the top, but acpi_ds_obj_stack_pop_and_delete() function considers index 0 for it. Therefore, this causes acpi operand memory leak. This cache leak causes a security threat because an old kernel (<= 4.9) shows memory locations of kernel functions in stack dump. Some malicious users could use this information to neutralize kernel ASLR. I made a patch to fix ACPI operand cache leak. Link: https://github.com/acpica/acpica/commit/987a3b5c Signed-off-by: Seunghun Han Signed-off-by: Rafael J. Wysocki Link: https://patch.msgid.link/4999480.31r3eYUQgx@rjwysocki.net Signed-off-by: Sasha Levin --- drivers/acpi/acpica/dsutils.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/acpi/acpica/dsutils.c b/drivers/acpi/acpica/dsutils.c index fb9ed5e1da89d..2bdae8a25e084 100644 --- a/drivers/acpi/acpica/dsutils.c +++ b/drivers/acpi/acpica/dsutils.c @@ -668,6 +668,8 @@ acpi_ds_create_operands(struct acpi_walk_state *walk_state, union acpi_parse_object *arguments[ACPI_OBJ_NUM_OPERANDS]; u32 arg_count = 0; u32 index = walk_state->num_operands; + u32 prev_num_operands = walk_state->num_operands; + u32 new_num_operands; u32 i; ACPI_FUNCTION_TRACE_PTR(ds_create_operands, first_arg); @@ -696,6 +698,7 @@ acpi_ds_create_operands(struct acpi_walk_state *walk_state, /* Create the interpreter arguments, in reverse order */ + new_num_operands = index; index--; for (i = 0; i < arg_count; i++) { arg = arguments[index]; @@ -720,7 +723,11 @@ cleanup: * pop everything off of the operand stack and delete those * objects */ - acpi_ds_obj_stack_pop_and_delete(arg_count, walk_state); + walk_state->num_operands = i; + acpi_ds_obj_stack_pop_and_delete(new_num_operands, walk_state); + + /* Restore operand count */ + walk_state->num_operands = prev_num_operands; ACPI_EXCEPTION((AE_INFO, status, "While creating Arg %u", index)); return_ACPI_STATUS(status); -- GitLab From 6cd75d8f0b5b2b9f011014c2d87ca77a401c8f5d Mon Sep 17 00:00:00 2001 From: Talhah Peerbhai Date: Fri, 16 May 2025 01:27:41 +0300 Subject: [PATCH 1380/2211] ASoC: amd: yc: Add quirk for Lenovo Yoga Pro 7 14ASP9 [ Upstream commit a28206060dc5848a1a2a15b7f6ac6223d869084d ] Similar to many other Lenovo models with AMD chips, the Lenovo Yoga Pro 7 14ASP9 (product name 83HN) requires a specific quirk to ensure internal mic detection. This patch adds a quirk fixing this. Signed-off-by: Talhah Peerbhai Link: https://patch.msgid.link/20250515222741.144616-1-talhah.peerbhai@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/amd/yc/acp6x-mach.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sound/soc/amd/yc/acp6x-mach.c b/sound/soc/amd/yc/acp6x-mach.c index e632f16c91025..3d9da93d22ee8 100644 --- a/sound/soc/amd/yc/acp6x-mach.c +++ b/sound/soc/amd/yc/acp6x-mach.c @@ -311,6 +311,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "83AS"), } }, + { + .driver_data = &acp6x_card, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "83HN"), + } + }, { .driver_data = &acp6x_card, .matches = { @@ -360,7 +367,7 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "M5402RA"), } }, - { + { .driver_data = &acp6x_card, .matches = { DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), -- GitLab From 7b45d2401d9b9e4b19269a503a376df8ca90bb89 Mon Sep 17 00:00:00 2001 From: "Guilherme G. Piccoli" Date: Sun, 23 Mar 2025 14:36:24 -0300 Subject: [PATCH 1381/2211] clocksource: Fix the CPUs' choice in the watchdog per CPU verification [ Upstream commit 08d7becc1a6b8c936e25d827becabfe3bff72a36 ] Right now, if the clocksource watchdog detects a clocksource skew, it might perform a per CPU check, for example in the TSC case on x86. In other words: supposing TSC is detected as unstable by the clocksource watchdog running at CPU1, as part of marking TSC unstable the kernel will also run a check of TSC readings on some CPUs to be sure it is synced between them all. But that check happens only on some CPUs, not all of them; this choice is based on the parameter "verify_n_cpus" and in some random cpumask calculation. So, the watchdog runs such per CPU checks on up to "verify_n_cpus" random CPUs among all online CPUs, with the risk of repeating CPUs (that aren't double checked) in the cpumask random calculation. But if "verify_n_cpus" > num_online_cpus(), it should skip the random calculation and just go ahead and check the clocksource sync between all online CPUs, without the risk of skipping some CPUs due to duplicity in the random cpumask calculation. Tests in a 4 CPU laptop with TSC skew detected led to some cases of the per CPU verification skipping some CPU even with verify_n_cpus=8, due to the duplicity on random cpumask generation. Skipping the randomization when the number of online CPUs is smaller than verify_n_cpus, solves that. Suggested-by: Thadeu Lima de Souza Cascardo Signed-off-by: Guilherme G. Piccoli Signed-off-by: Thomas Gleixner Reviewed-by: Paul E. McKenney Link: https://lore.kernel.org/all/20250323173857.372390-1-gpiccoli@igalia.com Signed-off-by: Sasha Levin --- kernel/time/clocksource.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index 58fb7280cabbe..ae862ad9642cb 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c @@ -302,7 +302,7 @@ static void clocksource_verify_choose_cpus(void) { int cpu, i, n = verify_n_cpus; - if (n < 0) { + if (n < 0 || n >= num_online_cpus()) { /* Check all of the CPUs. */ cpumask_copy(&cpus_chosen, cpu_online_mask); cpumask_clear_cpu(smp_processor_id(), &cpus_chosen); -- GitLab From 0cd0ef0a0a98b4d40af1224e4d030da674237e68 Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Sun, 6 Apr 2025 22:27:29 +0200 Subject: [PATCH 1382/2211] power: supply: collie: Fix wakeup source leaks on device unbind [ Upstream commit c73d19f89cb03c43abbbfa3b9caa1b8fc719764c ] Device can be unbound, so driver must also release memory for the wakeup source. Signed-off-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20250406202730.55096-1-krzysztof.kozlowski@linaro.org Signed-off-by: Sebastian Reichel Signed-off-by: Sasha Levin --- drivers/power/supply/collie_battery.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/power/supply/collie_battery.c b/drivers/power/supply/collie_battery.c index 68390bd1004f0..3daf7befc0bf6 100644 --- a/drivers/power/supply/collie_battery.c +++ b/drivers/power/supply/collie_battery.c @@ -440,6 +440,7 @@ err_put_gpio_full: static void collie_bat_remove(struct ucb1x00_dev *dev) { + device_init_wakeup(&ucb->dev, 0); free_irq(gpiod_to_irq(collie_bat_main.gpio_full), &collie_bat_main); power_supply_unregister(collie_bat_bu.psy); power_supply_unregister(collie_bat_main.psy); -- GitLab From ddec63e2dd496cb58a9295e8a3b85dd553a79de5 Mon Sep 17 00:00:00 2001 From: Erick Shepherd Date: Mon, 31 Mar 2025 17:13:37 -0500 Subject: [PATCH 1383/2211] mmc: Add quirk to disable DDR50 tuning [ Upstream commit 9510b38dc0ba358c93cbf5ee7c28820afb85937b ] Adds the MMC_QUIRK_NO_UHS_DDR50_TUNING quirk and updates mmc_execute_tuning() to return 0 if that quirk is set. This fixes an issue on certain Swissbit SD cards that do not support DDR50 tuning where tuning requests caused I/O errors to be thrown. Signed-off-by: Erick Shepherd Acked-by: Adrian Hunter Link: https://lore.kernel.org/r/20250331221337.1414534-1-erick.shepherd@ni.com Signed-off-by: Ulf Hansson Signed-off-by: Sasha Levin --- drivers/mmc/core/card.h | 6 ++++++ drivers/mmc/core/quirks.h | 10 ++++++++++ drivers/mmc/core/sd.c | 32 ++++++++++++++++++++++++-------- include/linux/mmc/card.h | 1 + 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/drivers/mmc/core/card.h b/drivers/mmc/core/card.h index 3205feb1e8ff6..9cbdd240c3a7d 100644 --- a/drivers/mmc/core/card.h +++ b/drivers/mmc/core/card.h @@ -89,6 +89,7 @@ struct mmc_fixup { #define CID_MANFID_MICRON 0x13 #define CID_MANFID_SAMSUNG 0x15 #define CID_MANFID_APACER 0x27 +#define CID_MANFID_SWISSBIT 0x5D #define CID_MANFID_KINGSTON 0x70 #define CID_MANFID_HYNIX 0x90 #define CID_MANFID_KINGSTON_SD 0x9F @@ -294,4 +295,9 @@ static inline int mmc_card_broken_sd_poweroff_notify(const struct mmc_card *c) return c->quirks & MMC_QUIRK_BROKEN_SD_POWEROFF_NOTIFY; } +static inline int mmc_card_no_uhs_ddr50_tuning(const struct mmc_card *c) +{ + return c->quirks & MMC_QUIRK_NO_UHS_DDR50_TUNING; +} + #endif diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h index 89b512905be14..7f893bafaa607 100644 --- a/drivers/mmc/core/quirks.h +++ b/drivers/mmc/core/quirks.h @@ -34,6 +34,16 @@ static const struct mmc_fixup __maybe_unused mmc_sd_fixups[] = { MMC_QUIRK_BROKEN_SD_CACHE | MMC_QUIRK_BROKEN_SD_POWEROFF_NOTIFY, EXT_CSD_REV_ANY), + /* + * Swissbit series S46-u cards throw I/O errors during tuning requests + * after the initial tuning request expectedly times out. This has + * only been observed on cards manufactured on 01/2019 that are using + * Bay Trail host controllers. + */ + _FIXUP_EXT("0016G", CID_MANFID_SWISSBIT, 0x5342, 2019, 1, + 0, -1ull, SDIO_ANY_ID, SDIO_ANY_ID, add_quirk_sd, + MMC_QUIRK_NO_UHS_DDR50_TUNING, EXT_CSD_REV_ANY), + END_FIXUP }; diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 63915541c0e49..916ae9996e9d7 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -613,6 +613,29 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status) return 0; } +/* + * Determine if the card should tune or not. + */ +static bool mmc_sd_use_tuning(struct mmc_card *card) +{ + /* + * SPI mode doesn't define CMD19 and tuning is only valid for SDR50 and + * SDR104 mode SD-cards. Note that tuning is mandatory for SDR104. + */ + if (mmc_host_is_spi(card->host)) + return false; + + switch (card->host->ios.timing) { + case MMC_TIMING_UHS_SDR50: + case MMC_TIMING_UHS_SDR104: + return true; + case MMC_TIMING_UHS_DDR50: + return !mmc_card_no_uhs_ddr50_tuning(card); + } + + return false; +} + /* * UHS-I specific initialization procedure */ @@ -656,14 +679,7 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card) if (err) goto out; - /* - * SPI mode doesn't define CMD19 and tuning is only valid for SDR50 and - * SDR104 mode SD-cards. Note that tuning is mandatory for SDR104. - */ - if (!mmc_host_is_spi(card->host) && - (card->host->ios.timing == MMC_TIMING_UHS_SDR50 || - card->host->ios.timing == MMC_TIMING_UHS_DDR50 || - card->host->ios.timing == MMC_TIMING_UHS_SDR104)) { + if (mmc_sd_use_tuning(card)) { err = mmc_execute_tuning(card); /* diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index eb67d3d5ff5b2..2e455b20c37c2 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -295,6 +295,7 @@ struct mmc_card { #define MMC_QUIRK_BROKEN_SD_CACHE (1<<15) /* Disable broken SD cache support */ #define MMC_QUIRK_BROKEN_CACHE_FLUSH (1<<16) /* Don't flush cache until the write has occurred */ #define MMC_QUIRK_BROKEN_SD_POWEROFF_NOTIFY (1<<17) /* Disable broken SD poweroff notify support */ +#define MMC_QUIRK_NO_UHS_DDR50_TUNING (1<<18) /* Disable DDR50 tuning */ bool written_flag; /* Indicates eMMC has been written since power on */ bool reenable_cmdq; /* Re-enable Command Queue */ -- GitLab From c05aba32a9ad9ddc36dcb10c15f42752c731c678 Mon Sep 17 00:00:00 2001 From: Ahmed Salem Date: Fri, 25 Apr 2025 21:30:27 +0200 Subject: [PATCH 1384/2211] ACPICA: Avoid sequence overread in call to strncmp() [ Upstream commit 64b9dfd0776e9c38d733094859a09f13282ce6f8 ] ACPICA commit 8b83a8d88dfec59ea147fad35fc6deea8859c58c ap_get_table_length() checks if tables are valid by calling ap_is_valid_header(). The latter then calls ACPI_VALIDATE_RSDP_SIG(Table->Signature). ap_is_valid_header() accepts struct acpi_table_header as an argument, so the signature size is always fixed to 4 bytes. The problem is when the string comparison is between ACPI-defined table signature and ACPI_SIG_RSDP. Common ACPI table header specifies the Signature field to be 4 bytes long[1], with the exception of the RSDP structure whose signature is 8 bytes long "RSD PTR " (including the trailing blank character)[2]. Calling strncmp(sig, rsdp_sig, 8) would then result in a sequence overread[3] as sig would be smaller (4 bytes) than the specified bound (8 bytes). As a workaround, pass the bound conditionally based on the size of the signature being passed. Link: https://uefi.org/specs/ACPI/6.5_A/05_ACPI_Software_Programming_Model.html#system-description-table-header [1] Link: https://uefi.org/specs/ACPI/6.5_A/05_ACPI_Software_Programming_Model.html#root-system-description-pointer-rsdp-structure [2] Link: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wstringop-overread [3] Link: https://github.com/acpica/acpica/commit/8b83a8d8 Signed-off-by: Ahmed Salem Signed-off-by: Rafael J. Wysocki Link: https://patch.msgid.link/2248233.Mh6RI2rZIc@rjwysocki.net Signed-off-by: Sasha Levin --- include/acpi/actypes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index 80767e8bf3ad4..d323dfffa4bfc 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h @@ -527,7 +527,7 @@ typedef u64 acpi_integer; /* Support for the special RSDP signature (8 characters) */ -#define ACPI_VALIDATE_RSDP_SIG(a) (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, 8)) +#define ACPI_VALIDATE_RSDP_SIG(a) (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, (sizeof(a) < 8) ? ACPI_NAMESEG_SIZE : 8)) #define ACPI_MAKE_RSDP_SIG(dest) (memcpy (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8)) /* Support for OEMx signature (x can be any character) */ -- GitLab From c0a6053f904252a6ad67b8fed21d14e54af87ded Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Sun, 6 Apr 2025 09:15:05 +1000 Subject: [PATCH 1385/2211] ASoC: tas2770: Power cycle amp on ISENSE/VSENSE change [ Upstream commit f529c91be8a34ac12e7599bf87c65b6f4a2c9f5c ] The ISENSE/VSENSE blocks are only powered up when the amplifier transitions from shutdown to active. This means that if those controls are flipped on while the amplifier is already playing back audio, they will have no effect. Fix this by forcing a power cycle around transitions in those controls. Reviewed-by: Neal Gompa Signed-off-by: Hector Martin Signed-off-by: James Calligeros Link: https://patch.msgid.link/20250406-apple-codec-changes-v5-1-50a00ec850a3@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/tas2770.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/sound/soc/codecs/tas2770.c b/sound/soc/codecs/tas2770.c index 863c3f672ba98..0931b6109755f 100644 --- a/sound/soc/codecs/tas2770.c +++ b/sound/soc/codecs/tas2770.c @@ -156,11 +156,37 @@ static const struct snd_kcontrol_new isense_switch = static const struct snd_kcontrol_new vsense_switch = SOC_DAPM_SINGLE("Switch", TAS2770_PWR_CTRL, 2, 1, 1); +static int sense_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct tas2770_priv *tas2770 = snd_soc_component_get_drvdata(component); + + /* + * Powering up ISENSE/VSENSE requires a trip through the shutdown state. + * Do that here to ensure that our changes are applied properly, otherwise + * we might end up with non-functional IVSENSE if playback started earlier, + * which would break software speaker protection. + */ + switch (event) { + case SND_SOC_DAPM_PRE_REG: + return snd_soc_component_update_bits(component, TAS2770_PWR_CTRL, + TAS2770_PWR_CTRL_MASK, + TAS2770_PWR_CTRL_SHUTDOWN); + case SND_SOC_DAPM_POST_REG: + return tas2770_update_pwr_ctrl(tas2770); + default: + return 0; + } +} + static const struct snd_soc_dapm_widget tas2770_dapm_widgets[] = { SND_SOC_DAPM_AIF_IN("ASI1", "ASI1 Playback", 0, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_MUX("ASI1 Sel", SND_SOC_NOPM, 0, 0, &tas2770_asi1_mux), - SND_SOC_DAPM_SWITCH("ISENSE", TAS2770_PWR_CTRL, 3, 1, &isense_switch), - SND_SOC_DAPM_SWITCH("VSENSE", TAS2770_PWR_CTRL, 2, 1, &vsense_switch), + SND_SOC_DAPM_SWITCH_E("ISENSE", TAS2770_PWR_CTRL, 3, 1, &isense_switch, + sense_event, SND_SOC_DAPM_PRE_REG | SND_SOC_DAPM_POST_REG), + SND_SOC_DAPM_SWITCH_E("VSENSE", TAS2770_PWR_CTRL, 2, 1, &vsense_switch, + sense_event, SND_SOC_DAPM_PRE_REG | SND_SOC_DAPM_POST_REG), SND_SOC_DAPM_DAC_E("DAC", NULL, SND_SOC_NOPM, 0, 0, tas2770_dac_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_OUTPUT("OUT"), -- GitLab From 7fe1b9381b03d45d576ee80dc352906ab689824d Mon Sep 17 00:00:00 2001 From: I Hsin Cheng Date: Tue, 6 May 2025 02:54:23 +0800 Subject: [PATCH 1386/2211] ASoC: intel/sdw_utils: Assign initial value in asoc_sdw_rt_amp_spk_rtd_init() [ Upstream commit 5fb3878216aece471af030b33a9fbef3babd8617 ] Initialize "ret" with "-EINVAL" to handle cases where "strstr()" for "codec_dai->component->name_prefix" doesn't find "-1" nor "-2". In that case "name_prefix" is invalid because for current implementation it's expected to have either "-1" or "-2" in it. (Maybe "-3", "-4" and so on in the future.) Link: https://scan5.scan.coverity.com/#/project-view/36179/10063?selectedIssue=1627120 Signed-off-by: I Hsin Cheng Link: https://patch.msgid.link/20250505185423.680608-1-richard120310@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/sdw_utils/soc_sdw_rt_amp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/sdw_utils/soc_sdw_rt_amp.c b/sound/soc/sdw_utils/soc_sdw_rt_amp.c index 6951dfb565263..b3d6ca2499734 100644 --- a/sound/soc/sdw_utils/soc_sdw_rt_amp.c +++ b/sound/soc/sdw_utils/soc_sdw_rt_amp.c @@ -190,7 +190,7 @@ int asoc_sdw_rt_amp_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc const struct snd_soc_dapm_route *rt_amp_map; char codec_name[CODEC_NAME_SIZE]; struct snd_soc_dai *codec_dai; - int ret; + int ret = -EINVAL; int i; rt_amp_map = get_codec_name_and_route(dai, codec_name); -- GitLab From b01a29a80cca28f0c7d0864e2d62fb9616051bfc Mon Sep 17 00:00:00 2001 From: Armin Wolf Date: Sun, 18 May 2025 20:51:11 +0200 Subject: [PATCH 1387/2211] ACPI: bus: Bail out if acpi_kobj registration fails [ Upstream commit 94a370fc8def6038dbc02199db9584b0b3690f1a ] The ACPI sysfs code will fail to initialize if acpi_kobj is NULL, together with some ACPI drivers. Follow the other firmware subsystems and bail out if the kobject cannot be registered. Signed-off-by: Armin Wolf Link: https://patch.msgid.link/20250518185111.3560-2-W_Armin@gmx.de Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/bus.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 16917dc3ad604..6234055d25984 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c @@ -1444,8 +1444,10 @@ static int __init acpi_init(void) } acpi_kobj = kobject_create_and_add("acpi", firmware_kobj); - if (!acpi_kobj) - pr_debug("%s: kset create error\n", __func__); + if (!acpi_kobj) { + pr_err("Failed to register kobject\n"); + return -ENOMEM; + } init_prmt(); acpi_init_pcc(); -- GitLab From 66613b13cde9d10ebe8c548a13fa08f441e21437 Mon Sep 17 00:00:00 2001 From: Mario Limonciello Date: Mon, 7 Apr 2025 13:36:55 -0500 Subject: [PATCH 1388/2211] ACPI: Add missing prototype for non CONFIG_SUSPEND/CONFIG_X86 case [ Upstream commit e1bdbbc98279164d910d2de82a745f090a8b249f ] acpi_register_lps0_dev() and acpi_unregister_lps0_dev() may be used in drivers that don't require CONFIG_SUSPEND or compile on !X86. Add prototypes for those cases. Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202502191627.fRgoBwcZ-lkp@intel.com/ Signed-off-by: Mario Limonciello Link: https://patch.msgid.link/20250407183656.1503446-1-superm1@kernel.org Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- include/linux/acpi.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 4d5ee84c468ba..f826bb59556af 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -1110,13 +1110,13 @@ void acpi_os_set_prepare_extended_sleep(int (*func)(u8 sleep_state, acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state, u32 val_a, u32 val_b); -#if defined(CONFIG_SUSPEND) && defined(CONFIG_X86) struct acpi_s2idle_dev_ops { struct list_head list_node; void (*prepare)(void); void (*check)(void); void (*restore)(void); }; +#if defined(CONFIG_SUSPEND) && defined(CONFIG_X86) int acpi_register_lps0_dev(struct acpi_s2idle_dev_ops *arg); void acpi_unregister_lps0_dev(struct acpi_s2idle_dev_ops *arg); int acpi_get_lps0_constraint(struct acpi_device *adev); @@ -1125,6 +1125,13 @@ static inline int acpi_get_lps0_constraint(struct device *dev) { return ACPI_STATE_UNKNOWN; } +static inline int acpi_register_lps0_dev(struct acpi_s2idle_dev_ops *arg) +{ + return -ENODEV; +} +static inline void acpi_unregister_lps0_dev(struct acpi_s2idle_dev_ops *arg) +{ +} #endif /* CONFIG_SUSPEND && CONFIG_X86 */ void arch_reserve_mem_area(acpi_physical_address addr, size_t size); #else -- GitLab From 198c2dab022e5e94a99fff267b669d693bc7bb49 Mon Sep 17 00:00:00 2001 From: Seunghun Han Date: Wed, 26 Mar 2025 21:06:21 +0100 Subject: [PATCH 1389/2211] ACPICA: fix acpi parse and parseext cache leaks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit bed18f0bdcd6737a938264a59d67923688696fc4 ] ACPICA commit 8829e70e1360c81e7a5a901b5d4f48330e021ea5 I'm Seunghun Han, and I work for National Security Research Institute of South Korea. I have been doing a research on ACPI and found an ACPI cache leak in ACPI early abort cases. Boot log of ACPI cache leak is as follows: [ 0.352414] ACPI: Added _OSI(Module Device) [ 0.353182] ACPI: Added _OSI(Processor Device) [ 0.353182] ACPI: Added _OSI(3.0 _SCP Extensions) [ 0.353182] ACPI: Added _OSI(Processor Aggregator Device) [ 0.356028] ACPI: Unable to start the ACPI Interpreter [ 0.356799] ACPI Error: Could not remove SCI handler (20170303/evmisc-281) [ 0.360215] kmem_cache_destroy Acpi-State: Slab cache still has objects [ 0.360648] CPU: 0 PID: 1 Comm: swapper/0 Tainted: G W 4.12.0-rc4-next-20170608+ #10 [ 0.361273] Hardware name: innotek gmb_h virtual_box/virtual_box, BIOS virtual_box 12/01/2006 [ 0.361873] Call Trace: [ 0.362243] ? dump_stack+0x5c/0x81 [ 0.362591] ? kmem_cache_destroy+0x1aa/0x1c0 [ 0.362944] ? acpi_sleep_proc_init+0x27/0x27 [ 0.363296] ? acpi_os_delete_cache+0xa/0x10 [ 0.363646] ? acpi_ut_delete_caches+0x6d/0x7b [ 0.364000] ? acpi_terminate+0xa/0x14 [ 0.364000] ? acpi_init+0x2af/0x34f [ 0.364000] ? __class_create+0x4c/0x80 [ 0.364000] ? video_setup+0x7f/0x7f [ 0.364000] ? acpi_sleep_proc_init+0x27/0x27 [ 0.364000] ? do_one_initcall+0x4e/0x1a0 [ 0.364000] ? kernel_init_freeable+0x189/0x20a [ 0.364000] ? rest_init+0xc0/0xc0 [ 0.364000] ? kernel_init+0xa/0x100 [ 0.364000] ? ret_from_fork+0x25/0x30 I analyzed this memory leak in detail. I found that “Acpi-State” cache and “Acpi-Parse” cache were merged because the size of cache objects was same slab cache size. I finally found “Acpi-Parse” cache and “Acpi-parse_ext” cache were leaked using SLAB_NEVER_MERGE flag in kmem_cache_create() function. Real ACPI cache leak point is as follows: [ 0.360101] ACPI: Added _OSI(Module Device) [ 0.360101] ACPI: Added _OSI(Processor Device) [ 0.360101] ACPI: Added _OSI(3.0 _SCP Extensions) [ 0.361043] ACPI: Added _OSI(Processor Aggregator Device) [ 0.364016] ACPI: Unable to start the ACPI Interpreter [ 0.365061] ACPI Error: Could not remove SCI handler (20170303/evmisc-281) [ 0.368174] kmem_cache_destroy Acpi-Parse: Slab cache still has objects [ 0.369332] CPU: 1 PID: 1 Comm: swapper/0 Tainted: G W 4.12.0-rc4-next-20170608+ #8 [ 0.371256] Hardware name: innotek gmb_h virtual_box/virtual_box, BIOS virtual_box 12/01/2006 [ 0.372000] Call Trace: [ 0.372000] ? dump_stack+0x5c/0x81 [ 0.372000] ? kmem_cache_destroy+0x1aa/0x1c0 [ 0.372000] ? acpi_sleep_proc_init+0x27/0x27 [ 0.372000] ? acpi_os_delete_cache+0xa/0x10 [ 0.372000] ? acpi_ut_delete_caches+0x56/0x7b [ 0.372000] ? acpi_terminate+0xa/0x14 [ 0.372000] ? acpi_init+0x2af/0x34f [ 0.372000] ? __class_create+0x4c/0x80 [ 0.372000] ? video_setup+0x7f/0x7f [ 0.372000] ? acpi_sleep_proc_init+0x27/0x27 [ 0.372000] ? do_one_initcall+0x4e/0x1a0 [ 0.372000] ? kernel_init_freeable+0x189/0x20a [ 0.372000] ? rest_init+0xc0/0xc0 [ 0.372000] ? kernel_init+0xa/0x100 [ 0.372000] ? ret_from_fork+0x25/0x30 [ 0.388039] kmem_cache_destroy Acpi-parse_ext: Slab cache still has objects [ 0.389063] CPU: 1 PID: 1 Comm: swapper/0 Tainted: G W 4.12.0-rc4-next-20170608+ #8 [ 0.390557] Hardware name: innotek gmb_h virtual_box/virtual_box, BIOS virtual_box 12/01/2006 [ 0.392000] Call Trace: [ 0.392000] ? dump_stack+0x5c/0x81 [ 0.392000] ? kmem_cache_destroy+0x1aa/0x1c0 [ 0.392000] ? acpi_sleep_proc_init+0x27/0x27 [ 0.392000] ? acpi_os_delete_cache+0xa/0x10 [ 0.392000] ? acpi_ut_delete_caches+0x6d/0x7b [ 0.392000] ? acpi_terminate+0xa/0x14 [ 0.392000] ? acpi_init+0x2af/0x34f [ 0.392000] ? __class_create+0x4c/0x80 [ 0.392000] ? video_setup+0x7f/0x7f [ 0.392000] ? acpi_sleep_proc_init+0x27/0x27 [ 0.392000] ? do_one_initcall+0x4e/0x1a0 [ 0.392000] ? kernel_init_freeable+0x189/0x20a [ 0.392000] ? rest_init+0xc0/0xc0 [ 0.392000] ? kernel_init+0xa/0x100 [ 0.392000] ? ret_from_fork+0x25/0x30 When early abort is occurred due to invalid ACPI information, Linux kernel terminates ACPI by calling acpi_terminate() function. The function calls acpi_ut_delete_caches() function to delete local caches (acpi_gbl_namespace_ cache, state_cache, operand_cache, ps_node_cache, ps_node_ext_cache). But the deletion codes in acpi_ut_delete_caches() function only delete slab caches using kmem_cache_destroy() function, therefore the cache objects should be flushed before acpi_ut_delete_caches() function. "Acpi-Parse" cache and "Acpi-ParseExt" cache are used in an AML parse function, acpi_ps_parse_loop(). The function should complete all ops using acpi_ps_complete_final_op() when an error occurs due to invalid AML codes. However, the current implementation of acpi_ps_complete_final_op() does not complete all ops when it meets some errors and this cause cache leak. This cache leak has a security threat because an old kernel (<= 4.9) shows memory locations of kernel functions in stack dump. Some malicious users could use this information to neutralize kernel ASLR. To fix ACPI cache leak for enhancing security, I made a patch to complete all ops unconditionally for acpi_ps_complete_final_op() function. I hope that this patch improves the security of Linux kernel. Thank you. Link: https://github.com/acpica/acpica/commit/8829e70e Signed-off-by: Seunghun Han Signed-off-by: Rafael J. Wysocki Link: https://patch.msgid.link/2363774.ElGaqSPkdT@rjwysocki.net Signed-off-by: Sasha Levin --- drivers/acpi/acpica/psobject.c | 52 ++++++++++------------------------ 1 file changed, 15 insertions(+), 37 deletions(-) diff --git a/drivers/acpi/acpica/psobject.c b/drivers/acpi/acpica/psobject.c index 54471083ba545..0bce1baaa62b3 100644 --- a/drivers/acpi/acpica/psobject.c +++ b/drivers/acpi/acpica/psobject.c @@ -636,7 +636,8 @@ acpi_status acpi_ps_complete_final_op(struct acpi_walk_state *walk_state, union acpi_parse_object *op, acpi_status status) { - acpi_status status2; + acpi_status return_status = status; + u8 ascending = TRUE; ACPI_FUNCTION_TRACE_PTR(ps_complete_final_op, walk_state); @@ -650,7 +651,7 @@ acpi_ps_complete_final_op(struct acpi_walk_state *walk_state, op)); do { if (op) { - if (walk_state->ascending_callback != NULL) { + if (ascending && walk_state->ascending_callback != NULL) { walk_state->op = op; walk_state->op_info = acpi_ps_get_opcode_info(op->common. @@ -672,49 +673,26 @@ acpi_ps_complete_final_op(struct acpi_walk_state *walk_state, } if (status == AE_CTRL_TERMINATE) { - status = AE_OK; - - /* Clean up */ - do { - if (op) { - status2 = - acpi_ps_complete_this_op - (walk_state, op); - if (ACPI_FAILURE - (status2)) { - return_ACPI_STATUS - (status2); - } - } - - acpi_ps_pop_scope(& - (walk_state-> - parser_state), - &op, - &walk_state-> - arg_types, - &walk_state-> - arg_count); - - } while (op); - - return_ACPI_STATUS(status); + ascending = FALSE; + return_status = AE_CTRL_TERMINATE; } else if (ACPI_FAILURE(status)) { /* First error is most important */ - (void) - acpi_ps_complete_this_op(walk_state, - op); - return_ACPI_STATUS(status); + ascending = FALSE; + return_status = status; } } - status2 = acpi_ps_complete_this_op(walk_state, op); - if (ACPI_FAILURE(status2)) { - return_ACPI_STATUS(status2); + status = acpi_ps_complete_this_op(walk_state, op); + if (ACPI_FAILURE(status)) { + ascending = FALSE; + if (ACPI_SUCCESS(return_status) || + return_status == AE_CTRL_TERMINATE) { + return_status = status; + } } } @@ -724,5 +702,5 @@ acpi_ps_complete_final_op(struct acpi_walk_state *walk_state, } while (op); - return_ACPI_STATUS(status); + return_ACPI_STATUS(return_status); } -- GitLab From 7efa7856f460a5e8c63cb891212c6d5f4eafbc46 Mon Sep 17 00:00:00 2001 From: Tamir Duberstein Date: Fri, 25 Apr 2025 21:21:05 +0200 Subject: [PATCH 1390/2211] ACPICA: Apply pack(1) to union aml_resource MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit eedf3e3c2f2af55dca42b0ea81dffb808211d269 ] ACPICA commit 1c28da2242783579d59767617121035dafba18c3 This was originally done in NetBSD: https://github.com/NetBSD/src/commit/b69d1ac3f7702f67edfe412e4392f77d09804910 and is the correct alternative to the smattering of `memcpy`s I previously contributed to this repository. This also sidesteps the newly strict checks added in UBSAN: https://github.com/llvm/llvm-project/commit/792674400f6f04a074a3827349ed0e2ac10067f6 Before this change we see the following UBSAN stack trace in Fuchsia: #0 0x000021afcfdeca5e in acpi_rs_get_address_common(struct acpi_resource*, union aml_resource*) ../../third_party/acpica/source/components/resources/rsaddr.c:329 +0x6aca5e #1.2 0x000021982bc4af3c in ubsan_get_stack_trace() compiler-rt/lib/ubsan/ubsan_diag.cpp:41 +0x41f3c #1.1 0x000021982bc4af3c in maybe_print_stack_trace() compiler-rt/lib/ubsan/ubsan_diag.cpp:51 +0x41f3c #1 0x000021982bc4af3c in ~scoped_report() compiler-rt/lib/ubsan/ubsan_diag.cpp:395 +0x41f3c #2 0x000021982bc4bb6f in handletype_mismatch_impl() compiler-rt/lib/ubsan/ubsan_handlers.cpp:137 +0x42b6f #3 0x000021982bc4b723 in __ubsan_handle_type_mismatch_v1 compiler-rt/lib/ubsan/ubsan_handlers.cpp:142 +0x42723 #4 0x000021afcfdeca5e in acpi_rs_get_address_common(struct acpi_resource*, union aml_resource*) ../../third_party/acpica/source/components/resources/rsaddr.c:329 +0x6aca5e #5 0x000021afcfdf2089 in acpi_rs_convert_aml_to_resource(struct acpi_resource*, union aml_resource*, struct acpi_rsconvert_info*) ../../third_party/acpica/source/components/resources/rsmisc.c:355 +0x6b2089 #6 0x000021afcfded169 in acpi_rs_convert_aml_to_resources(u8*, u32, u32, u8, void**) ../../third_party/acpica/source/components/resources/rslist.c:137 +0x6ad169 #7 0x000021afcfe2d24a in acpi_ut_walk_aml_resources(struct acpi_walk_state*, u8*, acpi_size, acpi_walk_aml_callback, void**) ../../third_party/acpica/source/components/utilities/utresrc.c:237 +0x6ed24a #8 0x000021afcfde66b7 in acpi_rs_create_resource_list(union acpi_operand_object*, struct acpi_buffer*) ../../third_party/acpica/source/components/resources/rscreate.c:199 +0x6a66b7 #9 0x000021afcfdf6979 in acpi_rs_get_method_data(acpi_handle, const char*, struct acpi_buffer*) ../../third_party/acpica/source/components/resources/rsutils.c:770 +0x6b6979 #10 0x000021afcfdf708f in acpi_walk_resources(acpi_handle, char*, acpi_walk_resource_callback, void*) ../../third_party/acpica/source/components/resources/rsxface.c:731 +0x6b708f #11 0x000021afcfa95dcf in acpi::acpi_impl::walk_resources(acpi::acpi_impl*, acpi_handle, const char*, acpi::Acpi::resources_callable) ../../src/devices/board/lib/acpi/acpi-impl.cc:41 +0x355dcf #12 0x000021afcfaa8278 in acpi::device_builder::gather_resources(acpi::device_builder*, acpi::Acpi*, fidl::any_arena&, acpi::Manager*, acpi::device_builder::gather_resources_callback) ../../src/devices/board/lib/acpi/device-builder.cc:84 +0x368278 #13 0x000021afcfbddb87 in acpi::Manager::configure_discovered_devices(acpi::Manager*) ../../src/devices/board/lib/acpi/manager.cc:75 +0x49db87 #14 0x000021afcf99091d in publish_acpi_devices(acpi::Manager*, zx_device_t*, zx_device_t*) ../../src/devices/board/drivers/x86/acpi-nswalk.cc:95 +0x25091d #15 0x000021afcf9c1d4e in x86::X86::do_init(x86::X86*) ../../src/devices/board/drivers/x86/x86.cc:60 +0x281d4e #16 0x000021afcf9e33ad in λ(x86::X86::ddk_init::(anon class)*) ../../src/devices/board/drivers/x86/x86.cc:77 +0x2a33ad #17 0x000021afcf9e313e in fit::internal::target<(lambda at../../src/devices/board/drivers/x86/x86.cc:76:19), false, false, std::__2::allocator, void>::invoke(void*) ../../sdk/lib/fit/include/lib/fit/internal/function.h:183 +0x2a313e #18 0x000021afcfbab4c7 in fit::internal::function_base<16UL, false, void(), std::__2::allocator>::invoke(const fit::internal::function_base<16UL, false, void (), std::__2::allocator >*) ../../sdk/lib/fit/include/lib/fit/internal/function.h:522 +0x46b4c7 #19 0x000021afcfbab342 in fit::function_impl<16UL, false, void(), std::__2::allocator>::operator()(const fit::function_impl<16UL, false, void (), std::__2::allocator >*) ../../sdk/lib/fit/include/lib/fit/function.h:315 +0x46b342 #20 0x000021afcfcd98c3 in async::internal::retained_task::Handler(async_dispatcher_t*, async_task_t*, zx_status_t) ../../sdk/lib/async/task.cc:24 +0x5998c3 #21 0x00002290f9924616 in λ(const driver_runtime::Dispatcher::post_task::(anon class)*, std::__2::unique_ptr >, zx_status_t) ../../src/devices/bin/driver_runtime/dispatcher.cc:789 +0x10a616 #22 0x00002290f9924323 in fit::internal::target<(lambda at../../src/devices/bin/driver_runtime/dispatcher.cc:788:7), true, false, std::__2::allocator, void, std::__2::unique_ptr>, int>::invoke(void*, std::__2::unique_ptr >, int) ../../sdk/lib/fit/include/lib/fit/internal/function.h:128 +0x10a323 #23 0x00002290f9904b76 in fit::internal::function_base<24UL, true, void(std::__2::unique_ptr>, int), std::__2::allocator>::invoke(const fit::internal::function_base<24UL, true, void (std::__2::unique_ptr >, int), std::__2::allocator >*, std::__2::unique_ptr >, int) ../../sdk/lib/fit/include/lib/fit/internal/function.h:522 +0xeab76 #24 0x00002290f9904831 in fit::callback_impl<24UL, true, void(std::__2::unique_ptr>, int), std::__2::allocator>::operator()(fit::callback_impl<24UL, true, void (std::__2::unique_ptr >, int), std::__2::allocator >*, std::__2::unique_ptr >, int) ../../sdk/lib/fit/include/lib/fit/function.h:471 +0xea831 #25 0x00002290f98d5adc in driver_runtime::callback_request::Call(driver_runtime::callback_request*, std::__2::unique_ptr >, zx_status_t) ../../src/devices/bin/driver_runtime/callback_request.h:74 +0xbbadc #26 0x00002290f98e1e58 in driver_runtime::Dispatcher::dispatch_callback(driver_runtime::Dispatcher*, std::__2::unique_ptr >) ../../src/devices/bin/driver_runtime/dispatcher.cc:1248 +0xc7e58 #27 0x00002290f98e4159 in driver_runtime::Dispatcher::dispatch_callbacks(driver_runtime::Dispatcher*, std::__2::unique_ptr >, fbl::ref_ptr) ../../src/devices/bin/driver_runtime/dispatcher.cc:1308 +0xca159 #28 0x00002290f9918414 in λ(const driver_runtime::Dispatcher::create_with_adder::(anon class)*, std::__2::unique_ptr >, fbl::ref_ptr) ../../src/devices/bin/driver_runtime/dispatcher.cc:353 +0xfe414 #29 0x00002290f991812d in fit::internal::target<(lambda at../../src/devices/bin/driver_runtime/dispatcher.cc:351:7), true, false, std::__2::allocator, void, std::__2::unique_ptr>, fbl::ref_ptr>::invoke(void*, std::__2::unique_ptr >, fbl::ref_ptr) ../../sdk/lib/fit/include/lib/fit/internal/function.h:128 +0xfe12d #30 0x00002290f9906fc7 in fit::internal::function_base<8UL, true, void(std::__2::unique_ptr>, fbl::ref_ptr), std::__2::allocator>::invoke(const fit::internal::function_base<8UL, true, void (std::__2::unique_ptr >, fbl::ref_ptr), std::__2::allocator >*, std::__2::unique_ptr >, fbl::ref_ptr) ../../sdk/lib/fit/include/lib/fit/internal/function.h:522 +0xecfc7 #31 0x00002290f9906c66 in fit::function_impl<8UL, true, void(std::__2::unique_ptr>, fbl::ref_ptr), std::__2::allocator>::operator()(const fit::function_impl<8UL, true, void (std::__2::unique_ptr >, fbl::ref_ptr), std::__2::allocator >*, std::__2::unique_ptr >, fbl::ref_ptr) ../../sdk/lib/fit/include/lib/fit/function.h:315 +0xecc66 #32 0x00002290f98e73d9 in driver_runtime::Dispatcher::event_waiter::invoke_callback(driver_runtime::Dispatcher::event_waiter*, std::__2::unique_ptr >, fbl::ref_ptr) ../../src/devices/bin/driver_runtime/dispatcher.h:543 +0xcd3d9 #33 0x00002290f98e700d in driver_runtime::Dispatcher::event_waiter::handle_event(std::__2::unique_ptr >, async_dispatcher_t*, async::wait_base*, zx_status_t, zx_packet_signal_t const*) ../../src/devices/bin/driver_runtime/dispatcher.cc:1442 +0xcd00d #34 0x00002290f9918983 in async_loop_owned_event_handler::handle_event(async_loop_owned_event_handler*, async_dispatcher_t*, async::wait_base*, zx_status_t, zx_packet_signal_t const*) ../../src/devices/bin/driver_runtime/async_loop_owned_event_handler.h:59 +0xfe983 #35 0x00002290f9918b9e in async::wait_method, &async_loop_owned_event_handler::handle_event>::call_handler(async_dispatcher_t*, async_wait_t*, zx_status_t, zx_packet_signal_t const*) ../../sdk/lib/async/include/lib/async/cpp/wait.h:201 +0xfeb9e #36 0x00002290f99bf509 in async_loop_dispatch_wait(async_loop_t*, async_wait_t*, zx_status_t, zx_packet_signal_t const*) ../../sdk/lib/async-loop/loop.c:394 +0x1a5509 #37 0x00002290f99b9958 in async_loop_run_once(async_loop_t*, zx_time_t) ../../sdk/lib/async-loop/loop.c:343 +0x19f958 #38 0x00002290f99b9247 in async_loop_run(async_loop_t*, zx_time_t, _Bool) ../../sdk/lib/async-loop/loop.c:301 +0x19f247 #39 0x00002290f99ba962 in async_loop_run_thread(void*) ../../sdk/lib/async-loop/loop.c:860 +0x1a0962 #40 0x000041afd176ef30 in start_c11(void*) ../../zircon/third_party/ulib/musl/pthread/pthread_create.c:63 +0x84f30 #41 0x000041afd18a448d in thread_trampoline(uintptr_t, uintptr_t) ../../zircon/system/ulib/runtime/thread.cc:100 +0x1ba48d Link: https://github.com/acpica/acpica/commit/1c28da22 Signed-off-by: Rafael J. Wysocki Link: https://patch.msgid.link/4664267.LvFx2qVVIh@rjwysocki.net Signed-off-by: Tamir Duberstein [ rjw: Pick up the tag from Tamir ] Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/acpica/amlresrc.h | 8 ++++---- drivers/acpi/acpica/rsaddr.c | 13 ++++--------- drivers/acpi/acpica/rscalc.c | 22 +++++----------------- drivers/acpi/acpica/rslist.c | 12 +++--------- drivers/acpi/acpica/utresrc.c | 14 +++++--------- 5 files changed, 21 insertions(+), 48 deletions(-) diff --git a/drivers/acpi/acpica/amlresrc.h b/drivers/acpi/acpica/amlresrc.h index 4e88f9fc2a289..b6588b7fa8986 100644 --- a/drivers/acpi/acpica/amlresrc.h +++ b/drivers/acpi/acpica/amlresrc.h @@ -504,10 +504,6 @@ struct aml_resource_pin_group_config { #define AML_RESOURCE_PIN_GROUP_CONFIG_REVISION 1 /* ACPI 6.2 */ -/* restore default alignment */ - -#pragma pack() - /* Union of all resource descriptors, so we can allocate the worst case */ union aml_resource { @@ -562,6 +558,10 @@ union aml_resource { u8 byte_item; }; +/* restore default alignment */ + +#pragma pack() + /* Interfaces used by both the disassembler and compiler */ void diff --git a/drivers/acpi/acpica/rsaddr.c b/drivers/acpi/acpica/rsaddr.c index 27384ee245f09..f92010e667cda 100644 --- a/drivers/acpi/acpica/rsaddr.c +++ b/drivers/acpi/acpica/rsaddr.c @@ -272,18 +272,13 @@ u8 acpi_rs_get_address_common(struct acpi_resource *resource, union aml_resource *aml) { - struct aml_resource_address address; - ACPI_FUNCTION_ENTRY(); - /* Avoid undefined behavior: member access within misaligned address */ - - memcpy(&address, aml, sizeof(address)); - /* Validate the Resource Type */ - if ((address.resource_type > 2) && - (address.resource_type < 0xC0) && (address.resource_type != 0x0A)) { + if ((aml->address.resource_type > 2) && + (aml->address.resource_type < 0xC0) && + (aml->address.resource_type != 0x0A)) { return (FALSE); } @@ -304,7 +299,7 @@ acpi_rs_get_address_common(struct acpi_resource *resource, /* Generic resource type, just grab the type_specific byte */ resource->data.address.info.type_specific = - address.specific_flags; + aml->address.specific_flags; } return (TRUE); diff --git a/drivers/acpi/acpica/rscalc.c b/drivers/acpi/acpica/rscalc.c index 6e7a152d64595..242daf45e20ef 100644 --- a/drivers/acpi/acpica/rscalc.c +++ b/drivers/acpi/acpica/rscalc.c @@ -608,18 +608,12 @@ acpi_rs_get_list_length(u8 *aml_buffer, case ACPI_RESOURCE_NAME_SERIAL_BUS:{ - /* Avoid undefined behavior: member access within misaligned address */ - - struct aml_resource_common_serialbus - common_serial_bus; - memcpy(&common_serial_bus, aml_resource, - sizeof(common_serial_bus)); - minimum_aml_resource_length = acpi_gbl_resource_aml_serial_bus_sizes - [common_serial_bus.type]; + [aml_resource->common_serial_bus.type]; extra_struct_bytes += - common_serial_bus.resource_length - + aml_resource->common_serial_bus. + resource_length - minimum_aml_resource_length; break; } @@ -688,16 +682,10 @@ acpi_rs_get_list_length(u8 *aml_buffer, */ if (acpi_ut_get_resource_type(aml_buffer) == ACPI_RESOURCE_NAME_SERIAL_BUS) { - - /* Avoid undefined behavior: member access within misaligned address */ - - struct aml_resource_common_serialbus common_serial_bus; - memcpy(&common_serial_bus, aml_resource, - sizeof(common_serial_bus)); - buffer_size = acpi_gbl_resource_struct_serial_bus_sizes - [common_serial_bus.type] + extra_struct_bytes; + [aml_resource->common_serial_bus.type] + + extra_struct_bytes; } else { buffer_size = acpi_gbl_resource_struct_sizes[resource_index] + diff --git a/drivers/acpi/acpica/rslist.c b/drivers/acpi/acpica/rslist.c index 164c96e063c6e..e46efaa889cdd 100644 --- a/drivers/acpi/acpica/rslist.c +++ b/drivers/acpi/acpica/rslist.c @@ -55,21 +55,15 @@ acpi_rs_convert_aml_to_resources(u8 * aml, aml_resource = ACPI_CAST_PTR(union aml_resource, aml); if (acpi_ut_get_resource_type(aml) == ACPI_RESOURCE_NAME_SERIAL_BUS) { - - /* Avoid undefined behavior: member access within misaligned address */ - - struct aml_resource_common_serialbus common_serial_bus; - memcpy(&common_serial_bus, aml_resource, - sizeof(common_serial_bus)); - - if (common_serial_bus.type > AML_RESOURCE_MAX_SERIALBUSTYPE) { + if (aml_resource->common_serial_bus.type > + AML_RESOURCE_MAX_SERIALBUSTYPE) { conversion_table = NULL; } else { /* This is an I2C, SPI, UART, or CSI2 serial_bus descriptor */ conversion_table = acpi_gbl_convert_resource_serial_bus_dispatch - [common_serial_bus.type]; + [aml_resource->common_serial_bus.type]; } } else { conversion_table = diff --git a/drivers/acpi/acpica/utresrc.c b/drivers/acpi/acpica/utresrc.c index cff7901f7866e..e1cc3d3487508 100644 --- a/drivers/acpi/acpica/utresrc.c +++ b/drivers/acpi/acpica/utresrc.c @@ -361,20 +361,16 @@ acpi_ut_validate_resource(struct acpi_walk_state *walk_state, aml_resource = ACPI_CAST_PTR(union aml_resource, aml); if (resource_type == ACPI_RESOURCE_NAME_SERIAL_BUS) { - /* Avoid undefined behavior: member access within misaligned address */ - - struct aml_resource_common_serialbus common_serial_bus; - memcpy(&common_serial_bus, aml_resource, - sizeof(common_serial_bus)); - /* Validate the bus_type field */ - if ((common_serial_bus.type == 0) || - (common_serial_bus.type > AML_RESOURCE_MAX_SERIALBUSTYPE)) { + if ((aml_resource->common_serial_bus.type == 0) || + (aml_resource->common_serial_bus.type > + AML_RESOURCE_MAX_SERIALBUSTYPE)) { if (walk_state) { ACPI_ERROR((AE_INFO, "Invalid/unsupported SerialBus resource descriptor: BusType 0x%2.2X", - common_serial_bus.type)); + aml_resource->common_serial_bus. + type)); } return (AE_AML_INVALID_RESOURCE_TYPE); } -- GitLab From bc51712997e70705ae57f77e640608c11c9e8c61 Mon Sep 17 00:00:00 2001 From: Stefan Binding Date: Thu, 15 May 2025 17:28:33 +0100 Subject: [PATCH 1391/2211] ALSA: hda: cs35l41: Fix swapped l/r audio channels for Acer Helios laptops [ Upstream commit e43a93c41982e82c1b703dd7fa9c1d965260fbb3 ] Fixes audio channel assignment from ACPI using configuration table. Signed-off-by: Stefan Binding Link: https://patch.msgid.link/20250515162848.405055-3-sbinding@opensource.cirrus.com Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/pci/hda/cs35l41_hda_property.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sound/pci/hda/cs35l41_hda_property.c b/sound/pci/hda/cs35l41_hda_property.c index 61d2314834e7b..d8249d997c2a0 100644 --- a/sound/pci/hda/cs35l41_hda_property.c +++ b/sound/pci/hda/cs35l41_hda_property.c @@ -31,6 +31,9 @@ struct cs35l41_config { }; static const struct cs35l41_config cs35l41_config_table[] = { + { "10251826", 2, EXTERNAL, { CS35L41_LEFT, CS35L41_RIGHT, 0, 0 }, 0, -1, -1, 0, 0, 0 }, + { "1025182C", 2, EXTERNAL, { CS35L41_LEFT, CS35L41_RIGHT, 0, 0 }, 0, -1, -1, 0, 0, 0 }, + { "10251844", 2, EXTERNAL, { CS35L41_LEFT, CS35L41_RIGHT, 0, 0 }, 0, -1, -1, 0, 0, 0 }, { "10280B27", 2, INTERNAL, { CS35L41_LEFT, CS35L41_RIGHT, 0, 0 }, 1, 2, 0, 1000, 4500, 24 }, { "10280B28", 2, INTERNAL, { CS35L41_LEFT, CS35L41_RIGHT, 0, 0 }, 1, 2, 0, 1000, 4500, 24 }, { "10280BEB", 2, EXTERNAL, { CS35L41_LEFT, CS35L41_RIGHT, 0, 0 }, 1, -1, 0, 0, 0, 0 }, @@ -452,6 +455,9 @@ struct cs35l41_prop_model { static const struct cs35l41_prop_model cs35l41_prop_model_table[] = { { "CLSA0100", NULL, lenovo_legion_no_acpi }, { "CLSA0101", NULL, lenovo_legion_no_acpi }, + { "CSC3551", "10251826", generic_dsd_config }, + { "CSC3551", "1025182C", generic_dsd_config }, + { "CSC3551", "10251844", generic_dsd_config }, { "CSC3551", "10280B27", generic_dsd_config }, { "CSC3551", "10280B28", generic_dsd_config }, { "CSC3551", "10280BEB", generic_dsd_config }, -- GitLab From 02de16babe53c54a9aae1ba71f47ee70c2a6c939 Mon Sep 17 00:00:00 2001 From: Jerry Lv Date: Tue, 15 Apr 2025 11:40:47 +0800 Subject: [PATCH 1392/2211] power: supply: bq27xxx: Retrieve again when busy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit f16d9fb6cf03fdbdefa41a8b32ba1e57afb7ae3d ] Multiple applications may access the battery gauge at the same time, so the gauge may be busy and EBUSY will be returned. The driver will set a flag to record the EBUSY state, and this flag will be kept until the next periodic update. When this flag is set, bq27xxx_battery_get_property() will just return ENODEV until the flag is updated. Even if the gauge was busy during the last accessing attempt, returning ENODEV is not ideal, and can cause confusion in the applications layer. Instead, retry accessing the I2C to update the flag is as expected, for the gauge typically recovers from busy state within a few milliseconds. If still failed to access the gauge, the real error code would be returned instead of ENODEV (as suggested by Pali Rohár). Reviewed-by: Pali Rohár Signed-off-by: Jerry Lv Link: https://lore.kernel.org/r/20250415-foo-fix-v2-1-5b45a395e4cc@axis.com Signed-off-by: Sebastian Reichel Signed-off-by: Sasha Levin --- drivers/power/supply/bq27xxx_battery.c | 2 +- drivers/power/supply/bq27xxx_battery_i2c.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c index 1a20c775489c7..871f03d160c53 100644 --- a/drivers/power/supply/bq27xxx_battery.c +++ b/drivers/power/supply/bq27xxx_battery.c @@ -2062,7 +2062,7 @@ static int bq27xxx_battery_get_property(struct power_supply *psy, mutex_unlock(&di->lock); if (psp != POWER_SUPPLY_PROP_PRESENT && di->cache.flags < 0) - return -ENODEV; + return di->cache.flags; switch (psp) { case POWER_SUPPLY_PROP_STATUS: diff --git a/drivers/power/supply/bq27xxx_battery_i2c.c b/drivers/power/supply/bq27xxx_battery_i2c.c index ba0d22d904295..868e95f0887e1 100644 --- a/drivers/power/supply/bq27xxx_battery_i2c.c +++ b/drivers/power/supply/bq27xxx_battery_i2c.c @@ -6,6 +6,7 @@ * Andrew F. Davis */ +#include #include #include #include @@ -31,6 +32,7 @@ static int bq27xxx_battery_i2c_read(struct bq27xxx_device_info *di, u8 reg, struct i2c_msg msg[2]; u8 data[2]; int ret; + int retry = 0; if (!client->adapter) return -ENODEV; @@ -47,7 +49,16 @@ static int bq27xxx_battery_i2c_read(struct bq27xxx_device_info *di, u8 reg, else msg[1].len = 2; - ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); + do { + ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); + if (ret == -EBUSY && ++retry < 3) { + /* sleep 10 milliseconds when busy */ + usleep_range(10000, 11000); + continue; + } + break; + } while (1); + if (ret < 0) return ret; -- GitLab From 33cd650d38e494f4b3cdc2c751b16f3015ea59de Mon Sep 17 00:00:00 2001 From: Ulf Hansson Date: Wed, 2 Apr 2025 14:06:13 +0200 Subject: [PATCH 1393/2211] pmdomain: core: Reset genpd->states to avoid freeing invalid data [ Upstream commit 99012014c902cd9ad85fd288d8a107f33a69855e ] If genpd_alloc_data() allocates data for the default power-states for the genpd, let's make sure to also reset the pointer in the error path. This makes sure a genpd provider driver doesn't end up trying to free the data again, but using an invalid pointer. Signed-off-by: Ulf Hansson Reviewed-by: Dhruva Gole Link: https://lore.kernel.org/r/20250402120613.1116711-1-ulf.hansson@linaro.org Signed-off-by: Sasha Levin --- drivers/pmdomain/core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/pmdomain/core.c b/drivers/pmdomain/core.c index 8b1f894f5e790..2643525a572bb 100644 --- a/drivers/pmdomain/core.c +++ b/drivers/pmdomain/core.c @@ -2228,8 +2228,10 @@ static int genpd_alloc_data(struct generic_pm_domain *genpd) return 0; put: put_device(&genpd->dev); - if (genpd->free_states == genpd_free_default_power_state) + if (genpd->free_states == genpd_free_default_power_state) { kfree(genpd->states); + genpd->states = NULL; + } free: if (genpd_is_cpu_domain(genpd)) free_cpumask_var(genpd->cpus); -- GitLab From 9281360d1c9a09ecbd19aebccb5554ad3f48096f Mon Sep 17 00:00:00 2001 From: gldrk Date: Fri, 25 Apr 2025 21:21:52 +0200 Subject: [PATCH 1394/2211] ACPICA: utilities: Fix overflow check in vsnprintf() [ Upstream commit 12b660251007e00a3e4d47ec62dbe3a7ace7023e ] ACPICA commit d9d59b7918514ae55063b93f3ec041b1a569bf49 The old version breaks sprintf on 64-bit systems for buffers outside [0..UINT32_MAX]. Link: https://github.com/acpica/acpica/commit/d9d59b79 Signed-off-by: Rafael J. Wysocki Link: https://patch.msgid.link/4994935.GXAFRqVoOG@rjwysocki.net Signed-off-by: gldrk [ rjw: Added the tag from gldrk ] Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/acpica/utprint.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/acpi/acpica/utprint.c b/drivers/acpi/acpica/utprint.c index 42b30b9f93128..7fad03c5252c3 100644 --- a/drivers/acpi/acpica/utprint.c +++ b/drivers/acpi/acpica/utprint.c @@ -333,11 +333,8 @@ int vsnprintf(char *string, acpi_size size, const char *format, va_list args) pos = string; - if (size != ACPI_UINT32_MAX) { - end = string + size; - } else { - end = ACPI_CAST_PTR(char, ACPI_UINT32_MAX); - } + size = ACPI_MIN(size, ACPI_PTR_DIFF(ACPI_MAX_PTR, string)); + end = string + size; for (; *format; ++format) { if (*format != '%') { -- GitLab From f34e0c15561d8c5aeadb62e926adf1ccde4d9f79 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Mon, 14 Apr 2025 14:30:55 -0400 Subject: [PATCH 1395/2211] platform-msi: Add msi_remove_device_irq_domain() in platform_device_msi_free_irqs_all() [ Upstream commit 9a958e1fd40d6fae8c66385687a00ebd9575a7d2 ] platform_device_msi_init_and_alloc_irqs() performs two tasks: allocating the MSI domain for a platform device, and allocate a number of MSIs in that domain. platform_device_msi_free_irqs_all() only frees the MSIs, and leaves the MSI domain alive. Given that platform_device_msi_init_and_alloc_irqs() is the sole tool a platform device has to allocate platform MSIs, it makes sense for platform_device_msi_free_irqs_all() to teardown the MSI domain at the same time as the MSIs. This avoids warnings and unexpected behaviours when a driver repeatedly allocates and frees MSIs. Signed-off-by: Frank Li Signed-off-by: Thomas Gleixner Acked-by: Marc Zyngier Link: https://lore.kernel.org/all/20250414-ep-msi-v18-1-f69b49917464@nxp.com Signed-off-by: Sasha Levin --- drivers/base/platform-msi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/base/platform-msi.c b/drivers/base/platform-msi.c index 0e60dd650b5e0..70db08f3ac6fa 100644 --- a/drivers/base/platform-msi.c +++ b/drivers/base/platform-msi.c @@ -95,5 +95,6 @@ EXPORT_SYMBOL_GPL(platform_device_msi_init_and_alloc_irqs); void platform_device_msi_free_irqs_all(struct device *dev) { msi_domain_free_irqs_all(dev, MSI_DEFAULT_DOMAIN); + msi_remove_device_irq_domain(dev, MSI_DEFAULT_DOMAIN); } EXPORT_SYMBOL_GPL(platform_device_msi_free_irqs_all); -- GitLab From bf6a433b884fec7808b97b0edf85143308af85fa Mon Sep 17 00:00:00 2001 From: Yuanjun Gong Date: Tue, 13 May 2025 20:37:44 +0800 Subject: [PATCH 1396/2211] ASoC: tegra210_ahub: Add check to of_device_get_match_data() [ Upstream commit 04cb269c204398763a620d426cbee43064854000 ] In tegra_ahub_probe(), check the result of function of_device_get_match_data(), return an error code in case it fails. Signed-off-by: Yuanjun Gong Link: https://patch.msgid.link/20250513123744.3041724-1-ruc_gongyuanjun@163.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/tegra/tegra210_ahub.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/soc/tegra/tegra210_ahub.c b/sound/soc/tegra/tegra210_ahub.c index 1920b996e9aad..51043e556b3e9 100644 --- a/sound/soc/tegra/tegra210_ahub.c +++ b/sound/soc/tegra/tegra210_ahub.c @@ -1359,6 +1359,8 @@ static int tegra_ahub_probe(struct platform_device *pdev) return -ENOMEM; ahub->soc_data = of_device_get_match_data(&pdev->dev); + if (!ahub->soc_data) + return -ENODEV; platform_set_drvdata(pdev, ahub); -- GitLab From 8975b40c07502f99b61bde9daa59575a6dfe4674 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Tue, 27 May 2025 14:35:51 -0700 Subject: [PATCH 1397/2211] Make 'cc-option' work correctly for the -Wno-xyzzy pattern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 550ccb178de2f379f5e1a1833dd6f4bdafef4b68 ] This is the follow-up to commit a79be02bba5c ("Fix mis-uses of 'cc-option' for warning disablement") where I mentioned that the best fix would be to just make 'cc-option' a bit smarter, and work for all compiler options, including the '-Wno-xyzzy' pattern that it used to accept unknown options for. It turns out that fixing cc-option is pretty straightforward: just rewrite any '-Wno-xyzzy' option pattern to use '-Wxyzzy' instead for testing. That makes the whole artificial distinction between 'cc-option' and 'cc-disable-warning' go away, and we can happily forget about the odd build rule that you have to treat compiler options that disable warnings specially. The 'cc-disable-warning' helper remains as a backwards compatibility syntax for now, but is implemented in terms of the new and improved cc-option. Acked-by: Masahiro Yamada Cc: Greg Kroah-Hartman Cc: Arnd Bergmann Cc: Stephen Rothwell Cc: Thomas Weißschuh Cc: Nathan Chancellor Signed-off-by: Linus Torvalds Signed-off-by: Sasha Levin --- scripts/Makefile.compiler | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/Makefile.compiler b/scripts/Makefile.compiler index c6cd729b65cbf..05685b3df9e5e 100644 --- a/scripts/Makefile.compiler +++ b/scripts/Makefile.compiler @@ -43,7 +43,7 @@ as-instr = $(call try-run,\ # __cc-option # Usage: MY_CFLAGS += $(call __cc-option,$(CC),$(MY_CFLAGS),-march=winchip-c6,-march=i586) __cc-option = $(call try-run,\ - $(1) -Werror $(2) $(3) -c -x c /dev/null -o "$$TMP",$(3),$(4)) + $(1) -Werror $(2) $(3:-Wno-%=-W%) -c -x c /dev/null -o "$$TMP",$(3),$(4)) # cc-option # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) @@ -57,7 +57,7 @@ cc-option-yn = $(if $(call cc-option,$1),y,n) # cc-disable-warning # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable) -cc-disable-warning = $(if $(call cc-option,-W$(strip $1)),-Wno-$(strip $1)) +cc-disable-warning = $(call cc-option,-Wno-$(strip $1)) # gcc-min-version # Usage: cflags-$(call gcc-min-version, 70100) += -foo -- GitLab From c519f81e9c08a4d1744a96b58aaffc4b9c3ef713 Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Thu, 27 Mar 2025 08:49:44 +0800 Subject: [PATCH 1398/2211] gpiolib: of: Add polarity quirk for s5m8767 [ Upstream commit 4e310626eb4df52a31a142c1360fead0fcbd3793 ] This is prepare patch for switching s5m8767 regulator driver to use GPIO descriptor. DTS for exynos5250 spring incorrectly specifies "active low" polarity for the DVS and DS line. But per datasheet, they are actually active high. So add polarity quirk for it. Signed-off-by: Peng Fan Reviewed-by: Linus Walleij Link: https://lore.kernel.org/r/20250327004945.563765-1-peng.fan@oss.nxp.com Signed-off-by: Bartosz Golaszewski Signed-off-by: Sasha Levin --- drivers/gpio/gpiolib-of.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index 626daedb01698..36f8c7bb79d81 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c @@ -215,6 +215,15 @@ static void of_gpio_try_fixup_polarity(const struct device_node *np, */ { "lantiq,pci-xway", "gpio-reset", false }, #endif +#if IS_ENABLED(CONFIG_REGULATOR_S5M8767) + /* + * According to S5M8767, the DVS and DS pin are + * active-high signals. However, exynos5250-spring.dts use + * active-low setting. + */ + { "samsung,s5m8767-pmic", "s5m8767,pmic-buck-dvs-gpios", true }, + { "samsung,s5m8767-pmic", "s5m8767,pmic-buck-ds-gpios", true }, +#endif #if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2005) /* * DTS for Nokia N900 incorrectly specified "active high" -- GitLab From 1f152ae557d6d516cf32a8b787005cb3bd051358 Mon Sep 17 00:00:00 2001 From: Charan Teja Kalla Date: Thu, 15 May 2025 12:11:25 +0530 Subject: [PATCH 1399/2211] PM: runtime: fix denying of auto suspend in pm_suspend_timer_fn() [ Upstream commit 40d3b40dce375d6f1c1dbf08d79eed3aed6c691d ] pm_runtime_put_autosuspend() schedules a hrtimer to expire at "dev->power.timer_expires". If the hrtimer's callback, pm_suspend_timer_fn(), observes that the current time equals "dev->power.timer_expires", it unexpectedly bails out instead of proceeding with runtime suspend. pm_suspend_timer_fn(): if (expires > 0 && expires < ktime_get_mono_fast_ns()) { dev->power.timer_expires = 0; rpm_suspend(..) } Additionally, as ->timer_expires is not cleared, all the future auto suspend requests will not schedule hrtimer to perform auto suspend. rpm_suspend(): if ((rpmflags & RPM_AUTO) &&...) { if (!(dev->power.timer_expires && ...) { <-- this will fail. hrtimer_start_range_ns(&dev->power.suspend_timer,...); } } Fix this by as well checking if current time reaches the set expiration. Co-developed-by: Patrick Daly Signed-off-by: Patrick Daly Signed-off-by: Charan Teja Kalla Link: https://patch.msgid.link/20250515064125.1211561-1-quic_charante@quicinc.com Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/base/power/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 04113adb092b5..99f25d6b2027a 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -1003,7 +1003,7 @@ static enum hrtimer_restart pm_suspend_timer_fn(struct hrtimer *timer) * If 'expires' is after the current time, we've been called * too early. */ - if (expires > 0 && expires < ktime_get_mono_fast_ns()) { + if (expires > 0 && expires <= ktime_get_mono_fast_ns()) { dev->power.timer_expires = 0; rpm_suspend(dev, dev->power.timer_autosuspends ? (RPM_ASYNC | RPM_AUTO) : RPM_ASYNC); -- GitLab From 05713a9fc20a0ec3e62798448c048cc3c8e66c20 Mon Sep 17 00:00:00 2001 From: Svyatoslav Ryhel Date: Wed, 30 Apr 2025 09:02:39 +0300 Subject: [PATCH 1400/2211] power: supply: max17040: adjust thermal channel scaling [ Upstream commit d055f51731744243b244aafb1720f793a5b61f7b ] IIO thermal channel is in millidegree while power supply framework expects decidegree values. Adjust scaling to get correct readings. Signed-off-by: Svyatoslav Ryhel Link: https://lore.kernel.org/r/20250430060239.12085-2-clamor95@gmail.com Signed-off-by: Sebastian Reichel Signed-off-by: Sasha Levin --- drivers/power/supply/max17040_battery.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/power/supply/max17040_battery.c b/drivers/power/supply/max17040_battery.c index 51310f6e4803b..c1640bc6accd2 100644 --- a/drivers/power/supply/max17040_battery.c +++ b/drivers/power/supply/max17040_battery.c @@ -410,8 +410,9 @@ static int max17040_get_property(struct power_supply *psy, if (!chip->channel_temp) return -ENODATA; - iio_read_channel_processed_scale(chip->channel_temp, - &val->intval, 10); + iio_read_channel_processed(chip->channel_temp, &val->intval); + val->intval /= 100; /* Convert from milli- to deci-degree */ + break; default: return -EINVAL; -- GitLab From e8cd4a8d5b885693fa2ab0dfbf550c2a2e43b53d Mon Sep 17 00:00:00 2001 From: Peter Marheine Date: Thu, 8 May 2025 12:41:45 +1000 Subject: [PATCH 1401/2211] ACPI: battery: negate current when discharging [ Upstream commit 234f71555019d308c6bc6f98c78c5551cb8cd56a ] The ACPI specification requires that battery rate is always positive, but the kernel ABI for POWER_SUPPLY_PROP_CURRENT_NOW (Documentation/ABI/testing/sysfs-class-power) specifies that it should be negative when a battery is discharging. When reporting CURRENT_NOW, massage the value to match the documented ABI. This only changes the sign of `current_now` and not `power_now` because documentation doesn't describe any particular meaning for `power_now` so leaving `power_now` unchanged is less likely to confuse userspace unnecessarily, whereas becoming consistent with the documented ABI is worth potentially confusing clients that read `current_now`. Signed-off-by: Peter Marheine Link: https://patch.msgid.link/20250508024146.1436129-1-pmarheine@chromium.org Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/battery.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 65fa3444367a1..6a7ac34d73bda 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c @@ -243,10 +243,23 @@ static int acpi_battery_get_property(struct power_supply *psy, break; case POWER_SUPPLY_PROP_CURRENT_NOW: case POWER_SUPPLY_PROP_POWER_NOW: - if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN) + if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN) { ret = -ENODEV; - else - val->intval = battery->rate_now * 1000; + break; + } + + val->intval = battery->rate_now * 1000; + /* + * When discharging, the current should be reported as a + * negative number as per the power supply class interface + * definition. + */ + if (psp == POWER_SUPPLY_PROP_CURRENT_NOW && + (battery->state & ACPI_BATTERY_STATE_DISCHARGING) && + acpi_battery_handle_discharging(battery) + == POWER_SUPPLY_STATUS_DISCHARGING) + val->intval = -val->intval; + break; case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: -- GitLab From 2d15f5e448effbde34956ff2255ac8db0d2c01eb Mon Sep 17 00:00:00 2001 From: Sergio Perez Gonzalez Date: Sun, 25 May 2025 21:20:31 -0600 Subject: [PATCH 1402/2211] net: macb: Check return value of dma_set_mask_and_coherent() [ Upstream commit 3920a758800762917177a6b5ab39707d8e376fe6 ] Issue flagged by coverity. Add a safety check for the return value of dma_set_mask_and_coherent, go to a safe exit if it returns error. Link: https://scan7.scan.coverity.com/#/project-view/53936/11354?selectedIssue=1643754 Signed-off-by: Sergio Perez Gonzalez Reviewed-by: Claudiu Beznea Link: https://patch.msgid.link/20250526032034.84900-1-sperezglz@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/cadence/macb_main.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c index ae100ed8ed6b9..3c2a7919b1289 100644 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c @@ -5117,7 +5117,11 @@ static int macb_probe(struct platform_device *pdev) #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT if (GEM_BFEXT(DAW64, gem_readl(bp, DCFG6))) { - dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44)); + err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44)); + if (err) { + dev_err(&pdev->dev, "failed to set DMA mask\n"); + goto err_out_free_netdev; + } bp->hw_dma_cap |= HW_DMA_CAP_64B; } #endif -- GitLab From 51318d644c993b3f7a60b8616a6a5adc1e967cd2 Mon Sep 17 00:00:00 2001 From: Rengarajan S Date: Fri, 23 May 2025 23:03:26 +0530 Subject: [PATCH 1403/2211] net: lan743x: Modify the EEPROM and OTP size for PCI1xxxx devices [ Upstream commit 3b9935586a9b54d2da27901b830d3cf46ad66a1e ] Maximum OTP and EEPROM size for hearthstone PCI1xxxx devices are 8 Kb and 64 Kb respectively. Adjust max size definitions and return correct EEPROM length based on device. Also prevent out-of-bound read/write. Signed-off-by: Rengarajan S Link: https://patch.msgid.link/20250523173326.18509-1-rengarajan.s@microchip.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- .../net/ethernet/microchip/lan743x_ethtool.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_ethtool.c b/drivers/net/ethernet/microchip/lan743x_ethtool.c index 1a1cbd034eda0..2acd9c3531dea 100644 --- a/drivers/net/ethernet/microchip/lan743x_ethtool.c +++ b/drivers/net/ethernet/microchip/lan743x_ethtool.c @@ -18,6 +18,8 @@ #define EEPROM_MAC_OFFSET (0x01) #define MAX_EEPROM_SIZE (512) #define MAX_OTP_SIZE (1024) +#define MAX_HS_OTP_SIZE (8 * 1024) +#define MAX_HS_EEPROM_SIZE (64 * 1024) #define OTP_INDICATOR_1 (0xF3) #define OTP_INDICATOR_2 (0xF7) @@ -272,6 +274,9 @@ static int lan743x_hs_otp_read(struct lan743x_adapter *adapter, u32 offset, int ret; int i; + if (offset + length > MAX_HS_OTP_SIZE) + return -EINVAL; + ret = lan743x_hs_syslock_acquire(adapter, LOCK_TIMEOUT_MAX_CNT); if (ret < 0) return ret; @@ -320,6 +325,9 @@ static int lan743x_hs_otp_write(struct lan743x_adapter *adapter, u32 offset, int ret; int i; + if (offset + length > MAX_HS_OTP_SIZE) + return -EINVAL; + ret = lan743x_hs_syslock_acquire(adapter, LOCK_TIMEOUT_MAX_CNT); if (ret < 0) return ret; @@ -497,6 +505,9 @@ static int lan743x_hs_eeprom_read(struct lan743x_adapter *adapter, u32 val; int i; + if (offset + length > MAX_HS_EEPROM_SIZE) + return -EINVAL; + retval = lan743x_hs_syslock_acquire(adapter, LOCK_TIMEOUT_MAX_CNT); if (retval < 0) return retval; @@ -539,6 +550,9 @@ static int lan743x_hs_eeprom_write(struct lan743x_adapter *adapter, u32 val; int i; + if (offset + length > MAX_HS_EEPROM_SIZE) + return -EINVAL; + retval = lan743x_hs_syslock_acquire(adapter, LOCK_TIMEOUT_MAX_CNT); if (retval < 0) return retval; @@ -604,9 +618,9 @@ static int lan743x_ethtool_get_eeprom_len(struct net_device *netdev) struct lan743x_adapter *adapter = netdev_priv(netdev); if (adapter->flags & LAN743X_ADAPTER_FLAG_OTP) - return MAX_OTP_SIZE; + return adapter->is_pci11x1x ? MAX_HS_OTP_SIZE : MAX_OTP_SIZE; - return MAX_EEPROM_SIZE; + return adapter->is_pci11x1x ? MAX_HS_EEPROM_SIZE : MAX_EEPROM_SIZE; } static int lan743x_ethtool_get_eeprom(struct net_device *netdev, -- GitLab From 6c1151d53ca73f09bdecd546c6bec0c792d9b0bf Mon Sep 17 00:00:00 2001 From: Zilin Guan Date: Fri, 23 May 2025 11:47:17 +0000 Subject: [PATCH 1404/2211] tipc: use kfree_sensitive() for aead cleanup [ Upstream commit c8ef20fe7274c5766a317f9193b70bed717b6b3d ] The tipc_aead_free() function currently uses kfree() to release the aead structure. However, this structure contains sensitive information, such as key's SALT value, which should be securely erased from memory to prevent potential leakage. To enhance security, replace kfree() with kfree_sensitive() when freeing the aead structure. This change ensures that sensitive data is explicitly cleared before memory deallocation, aligning with the approach used in tipc_aead_init() and adhering to best practices for handling confidential information. Signed-off-by: Zilin Guan Reviewed-by: Tung Nguyen Link: https://patch.msgid.link/20250523114717.4021518-1-zilin@seu.edu.cn Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/tipc/crypto.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c index 79f91b6ca8c84..ea5bb131ebd06 100644 --- a/net/tipc/crypto.c +++ b/net/tipc/crypto.c @@ -425,7 +425,7 @@ static void tipc_aead_free(struct rcu_head *rp) } free_percpu(aead->tfm_entry); kfree_sensitive(aead->key); - kfree(aead); + kfree_sensitive(aead); } static int tipc_aead_users(struct tipc_aead __rcu *aead) -- GitLab From b0e647442c08bce26a2acb9b4a4682b42badbf8d Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Tue, 13 May 2025 13:57:20 +0800 Subject: [PATCH 1405/2211] f2fs: use vmalloc instead of kvmalloc in .init_{,de}compress_ctx [ Upstream commit 70dd07c888451503c3e93b6821e10d1ea1ec9930 ] .init_{,de}compress_ctx uses kvmalloc() to alloc memory, it will try to allocate physically continuous page first, it may cause more memory allocation pressure, let's use vmalloc instead to mitigate it. [Test] cd /data/local/tmp touch file f2fs_io setflags compression file f2fs_io getflags file for i in $(seq 1 10); do sync; echo 3 > /proc/sys/vm/drop_caches;\ time f2fs_io write 512 0 4096 zero osync file; truncate -s 0 file;\ done [Result] Before After Delta 21.243 21.694 -2.12% For compression, we recommend to use ioctl to compress file data in background for workaround. For decompression, only zstd will be affected. Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/compress.c | 23 ++++++++++------------- fs/f2fs/f2fs.h | 5 +++++ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c index 7f26440e8595a..b05bb7bfa14c5 100644 --- a/fs/f2fs/compress.c +++ b/fs/f2fs/compress.c @@ -178,8 +178,7 @@ void f2fs_compress_ctx_add_page(struct compress_ctx *cc, struct folio *folio) #ifdef CONFIG_F2FS_FS_LZO static int lzo_init_compress_ctx(struct compress_ctx *cc) { - cc->private = f2fs_kvmalloc(F2FS_I_SB(cc->inode), - LZO1X_MEM_COMPRESS, GFP_NOFS); + cc->private = f2fs_vmalloc(LZO1X_MEM_COMPRESS); if (!cc->private) return -ENOMEM; @@ -189,7 +188,7 @@ static int lzo_init_compress_ctx(struct compress_ctx *cc) static void lzo_destroy_compress_ctx(struct compress_ctx *cc) { - kvfree(cc->private); + vfree(cc->private); cc->private = NULL; } @@ -246,7 +245,7 @@ static int lz4_init_compress_ctx(struct compress_ctx *cc) size = LZ4HC_MEM_COMPRESS; #endif - cc->private = f2fs_kvmalloc(F2FS_I_SB(cc->inode), size, GFP_NOFS); + cc->private = f2fs_vmalloc(size); if (!cc->private) return -ENOMEM; @@ -261,7 +260,7 @@ static int lz4_init_compress_ctx(struct compress_ctx *cc) static void lz4_destroy_compress_ctx(struct compress_ctx *cc) { - kvfree(cc->private); + vfree(cc->private); cc->private = NULL; } @@ -342,8 +341,7 @@ static int zstd_init_compress_ctx(struct compress_ctx *cc) params = zstd_get_params(level, cc->rlen); workspace_size = zstd_cstream_workspace_bound(¶ms.cParams); - workspace = f2fs_kvmalloc(F2FS_I_SB(cc->inode), - workspace_size, GFP_NOFS); + workspace = f2fs_vmalloc(workspace_size); if (!workspace) return -ENOMEM; @@ -351,7 +349,7 @@ static int zstd_init_compress_ctx(struct compress_ctx *cc) if (!stream) { f2fs_err_ratelimited(F2FS_I_SB(cc->inode), "%s zstd_init_cstream failed", __func__); - kvfree(workspace); + vfree(workspace); return -EIO; } @@ -364,7 +362,7 @@ static int zstd_init_compress_ctx(struct compress_ctx *cc) static void zstd_destroy_compress_ctx(struct compress_ctx *cc) { - kvfree(cc->private); + vfree(cc->private); cc->private = NULL; cc->private2 = NULL; } @@ -423,8 +421,7 @@ static int zstd_init_decompress_ctx(struct decompress_io_ctx *dic) workspace_size = zstd_dstream_workspace_bound(max_window_size); - workspace = f2fs_kvmalloc(F2FS_I_SB(dic->inode), - workspace_size, GFP_NOFS); + workspace = f2fs_vmalloc(workspace_size); if (!workspace) return -ENOMEM; @@ -432,7 +429,7 @@ static int zstd_init_decompress_ctx(struct decompress_io_ctx *dic) if (!stream) { f2fs_err_ratelimited(F2FS_I_SB(dic->inode), "%s zstd_init_dstream failed", __func__); - kvfree(workspace); + vfree(workspace); return -EIO; } @@ -444,7 +441,7 @@ static int zstd_init_decompress_ctx(struct decompress_io_ctx *dic) static void zstd_destroy_decompress_ctx(struct decompress_io_ctx *dic) { - kvfree(dic->private); + vfree(dic->private); dic->private = NULL; dic->private2 = NULL; } diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 1219e37fa7ad3..61b715cc2e231 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -3494,6 +3494,11 @@ static inline void *f2fs_kvzalloc(struct f2fs_sb_info *sbi, return f2fs_kvmalloc(sbi, size, flags | __GFP_ZERO); } +static inline void *f2fs_vmalloc(size_t size) +{ + return vmalloc(size); +} + static inline int get_extra_isize(struct inode *inode) { return F2FS_I(inode)->i_extra_isize / sizeof(__le32); -- GitLab From 2d834477bbc1e8b8a59ff8b0c081529d6bed7b22 Mon Sep 17 00:00:00 2001 From: Hou Tao Date: Mon, 26 May 2025 14:25:34 +0800 Subject: [PATCH 1406/2211] bpf: Check rcu_read_lock_trace_held() in bpf_map_lookup_percpu_elem() [ Upstream commit d4965578267e2e81f67c86e2608481e77e9c8569 ] bpf_map_lookup_percpu_elem() helper is also available for sleepable bpf program. When BPF JIT is disabled or under 32-bit host, bpf_map_lookup_percpu_elem() will not be inlined. Using it in a sleepable bpf program will trigger the warning in bpf_map_lookup_percpu_elem(), because the bpf program only holds rcu_read_lock_trace lock. Therefore, add the missed check. Reported-by: syzbot+dce5aae19ae4d6399986@syzkaller.appspotmail.com Closes: https://lore.kernel.org/bpf/000000000000176a130617420310@google.com/ Signed-off-by: Hou Tao Link: https://lore.kernel.org/r/20250526062534.1105938-1-houtao@huaweicloud.com Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- kernel/bpf/helpers.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index a05aeb3458964..9173d107758d4 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -129,7 +129,8 @@ const struct bpf_func_proto bpf_map_peek_elem_proto = { BPF_CALL_3(bpf_map_lookup_percpu_elem, struct bpf_map *, map, void *, key, u32, cpu) { - WARN_ON_ONCE(!rcu_read_lock_held() && !rcu_read_lock_bh_held()); + WARN_ON_ONCE(!rcu_read_lock_held() && !rcu_read_lock_trace_held() && + !rcu_read_lock_bh_held()); return (unsigned long) map->ops->map_lookup_percpu_elem(map, key, cpu); } -- GitLab From 0cc5c7c14fbbfeb38a7af7145f6cea7b3f0d939c Mon Sep 17 00:00:00 2001 From: Liwei Sun Date: Tue, 13 May 2025 14:13:54 +0800 Subject: [PATCH 1407/2211] Bluetooth: btusb: Add new VID/PID 13d3/3584 for MT7922 [ Upstream commit 71d9d3522aec301e4a1c4eae4b5e0656fc4a7262 ] A new variant of MT7922 wireless device has been identified. The device introduces itself as MEDIATEK MT7922, so treat it as MediaTek device. With this patch, btusb driver works as expected: [ 3.151162] Bluetooth: Core ver 2.22 [ 3.151185] Bluetooth: HCI device and connection manager initialized [ 3.151189] Bluetooth: HCI socket layer initialized [ 3.151191] Bluetooth: L2CAP socket layer initialized [ 3.151194] Bluetooth: SCO socket layer initialized [ 3.295718] Bluetooth: hci0: HW/SW Version: 0x008a008a, Build Time: 20241106163512 [ 4.676634] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 [ 4.676637] Bluetooth: BNEP filters: protocol multicast [ 4.676640] Bluetooth: BNEP socket layer initialized [ 5.560453] Bluetooth: hci0: Device setup in 2320660 usecs [ 5.560457] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported. [ 5.619197] Bluetooth: hci0: AOSP extensions version v1.00 [ 5.619204] Bluetooth: hci0: AOSP quality report is supported [ 5.619301] Bluetooth: MGMT ver 1.23 [ 6.741247] Bluetooth: RFCOMM TTY layer initialized [ 6.741258] Bluetooth: RFCOMM socket layer initialized [ 6.741261] Bluetooth: RFCOMM ver 1.11 lspci output: 04:00.0 Network controller: MEDIATEK Corp. MT7922 802.11ax PCI Express Wireless Network Adapter USB information: T: Bus=01 Lev=01 Prnt=01 Port=04 Cnt=02 Dev#= 3 Spd=480 MxCh= 0 D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=13d3 ProdID=3584 Rev= 1.00 S: Manufacturer=MediaTek Inc. S: Product=Wireless_Device S: SerialNumber=000000000 C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms I: If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us I:* If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us Signed-off-by: Liwei Sun Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index af2be0271806f..7be13d3c82bcd 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -672,6 +672,8 @@ static const struct usb_device_id quirks_table[] = { BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3568), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x13d3, 0x3584), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3605), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3607), .driver_info = BTUSB_MEDIATEK | -- GitLab From 4d5680346499190a5295d5f64d479e077d9372ba Mon Sep 17 00:00:00 2001 From: Tan En De Date: Sat, 12 Apr 2025 10:33:03 +0800 Subject: [PATCH 1408/2211] i2c: designware: Invoke runtime suspend on quick slave re-registration [ Upstream commit 2fe2b969d911a09abcd6a47401a3c66c38a310e6 ] Replaced pm_runtime_put() with pm_runtime_put_sync_suspend() to ensure the runtime suspend is invoked immediately when unregistering a slave. This prevents a race condition where suspend was skipped when unregistering and registering slave in quick succession. For example, consider the rapid sequence of `delete_device -> new_device -> delete_device -> new_device`. In this sequence, it is observed that the dw_i2c_plat_runtime_suspend() might not be invoked after `delete_device` operation. This is because after `delete_device` operation, when the pm_runtime_put() is about to trigger suspend, the following `new_device` operation might race and cancel the suspend. If that happens, during the `new_device` operation, dw_i2c_plat_runtime_resume() is skipped (since there was no suspend), which means `i_dev->init()`, i.e. i2c_dw_init_slave(), is skipped. Since i2c_dw_init_slave() is skipped, i2c_dw_configure_fifo_slave() is skipped too, which leaves `DW_IC_INTR_MASK` unconfigured. If we inspect the interrupt mask register using devmem, it will show as zero. Example shell script to reproduce the issue: ``` #!/bin/sh SLAVE_LADDR=0x1010 SLAVE_BUS=13 NEW_DEVICE=/sys/bus/i2c/devices/i2c-$SLAVE_BUS/new_device DELETE_DEVICE=/sys/bus/i2c/devices/i2c-$SLAVE_BUS/delete_device # Create initial device echo slave-24c02 $SLAVE_LADDR > $NEW_DEVICE sleep 2 # Rapid sequence of # delete_device -> new_device -> delete_device -> new_device echo $SLAVE_LADDR > $DELETE_DEVICE echo slave-24c02 $SLAVE_LADDR > $NEW_DEVICE echo $SLAVE_LADDR > $DELETE_DEVICE echo slave-24c02 $SLAVE_LADDR > $NEW_DEVICE # Using devmem to inspect IC_INTR_MASK will show as zero ``` Signed-off-by: Tan En De Acked-by: Jarkko Nikula Link: https://lore.kernel.org/r/20250412023303.378600-1-ende.tan@starfivetech.com Signed-off-by: Andi Shyti Signed-off-by: Sasha Levin --- drivers/i2c/busses/i2c-designware-slave.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-designware-slave.c b/drivers/i2c/busses/i2c-designware-slave.c index f0f0f1f2131d0..602e98e61cc01 100644 --- a/drivers/i2c/busses/i2c-designware-slave.c +++ b/drivers/i2c/busses/i2c-designware-slave.c @@ -94,7 +94,7 @@ static int i2c_dw_unreg_slave(struct i2c_client *slave) i2c_dw_disable(dev); synchronize_irq(dev->irq); dev->slave = NULL; - pm_runtime_put(dev->dev); + pm_runtime_put_sync_suspend(dev->dev); return 0; } -- GitLab From d4b93f9c2f666011dcf810050ef60a6b8d06f186 Mon Sep 17 00:00:00 2001 From: Benjamin Lin Date: Thu, 15 May 2025 11:29:47 +0800 Subject: [PATCH 1409/2211] wifi: mt76: mt7996: drop fragments with multicast or broadcast RA [ Upstream commit 80fda1cd7b0a1edd0849dc71403a070d0922118d ] IEEE 802.11 fragmentation can only be applied to unicast frames. Therefore, drop fragments with multicast or broadcast RA. This patch addresses vulnerabilities such as CVE-2020-26145. Signed-off-by: Benjamin Lin Signed-off-by: Shayne Chen Link: https://patch.msgid.link/20250515032952.1653494-4-shayne.chen@mediatek.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt7996/mac.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c index ef2d7eaaaffdd..0990a3d481f2d 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c @@ -623,6 +623,14 @@ mt7996_mac_fill_rx(struct mt7996_dev *dev, enum mt76_rxq_id q, status->last_amsdu = amsdu_info == MT_RXD4_LAST_AMSDU_FRAME; } + /* IEEE 802.11 fragmentation can only be applied to unicast frames. + * Hence, drop fragments with multicast/broadcast RA. + * This check fixes vulnerabilities, like CVE-2020-26145. + */ + if ((ieee80211_has_morefrags(fc) || seq_ctrl & IEEE80211_SCTL_FRAG) && + FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, rxd3) != MT_RXD3_NORMAL_U2M) + return -EINVAL; + hdr_gap = (u8 *)rxd - skb->data + 2 * remove_pad; if (hdr_trans && ieee80211_has_morefrags(fc)) { if (mt7996_reverse_frag0_hdr_trans(skb, hdr_gap)) -- GitLab From 57cfe4a06d25f08c98089dea7b0d7e01b91aac84 Mon Sep 17 00:00:00 2001 From: Alok Tiwari Date: Mon, 19 May 2025 07:17:19 -0700 Subject: [PATCH 1410/2211] emulex/benet: correct command version selection in be_cmd_get_stats() [ Upstream commit edb888d29748cee674006a52e544925dacc7728e ] Logic here always sets hdr->version to 2 if it is not a BE3 or Lancer chip, even if it is BE2. Use 'else if' to prevent multiple assignments, setting version 0 for BE2, version 1 for BE3 and Lancer, and version 2 for others. Fixes potential incorrect version setting when BE2_chip and BE3_chip/lancer_chip checks could both be true. Signed-off-by: Alok Tiwari Link: https://patch.msgid.link/20250519141731.691136-1-alok.a.tiwari@oracle.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/emulex/benet/be_cmds.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index 51b8377edd1d0..a89aa4ac0a064 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c @@ -1609,7 +1609,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd) /* version 1 of the cmd is not supported only by BE2 */ if (BE2_chip(adapter)) hdr->version = 0; - if (BE3_chip(adapter) || lancer_chip(adapter)) + else if (BE3_chip(adapter) || lancer_chip(adapter)) hdr->version = 1; else hdr->version = 2; -- GitLab From b5e792c206d2a84b3e3a289122e1b0bd6ba53b22 Mon Sep 17 00:00:00 2001 From: Jiande Lu Date: Tue, 29 Apr 2025 18:16:05 +0800 Subject: [PATCH 1411/2211] Bluetooth: btusb: Add new VID/PID 13d3/3630 for MT7925 [ Upstream commit 5bd5c716f7ec3e25d8d3b8a7566e192a26f9c7ce ] Add VID 13d3 & PID 3630 for MediaTek MT7925 USB Bluetooth chip. The information in /sys/kernel/debug/usb/devices about the Bluetooth device is listed as the below. T: Bus=07 Lev=01 Prnt=01 Port=10 Cnt=02 Dev#= 2 Spd=480 MxCh= 0 D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=13d3 ProdID=3630 Rev= 1.00 S: Manufacturer=MediaTek Inc. S: Product=Wireless_Device S: SerialNumber=000000000 C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us Signed-off-by: Jiande Lu Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 7be13d3c82bcd..aa63852060500 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -714,6 +714,8 @@ static const struct usb_device_id quirks_table[] = { BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3628), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x13d3, 0x3630), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH }, /* Additional Realtek 8723AE Bluetooth devices */ { USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK }, -- GitLab From e7a18650568a46f31d0d6a7b394ec37a1b2ce18f Mon Sep 17 00:00:00 2001 From: Henk Vergonet Date: Fri, 18 Apr 2025 16:39:14 +0200 Subject: [PATCH 1412/2211] wifi: mt76: mt76x2: Add support for LiteOn WN4516R,WN4519R [ Upstream commit 3c0e4f606d8693795a2c965d6f4987b1bfc31097 ] Adds support for: - LiteOn WN4516R - LiteOn WN4519R Both use: - A nonstandard USB connector - Mediatek chipset MT7600U - ASIC revision: 76320044 Disabled VHT support on ASIC revision 76320044: This fixes the 5G connectibity issue on LiteOn WN4519R module see https://github.com/openwrt/mt76/issues/971 And may also fix the 5G issues on the XBox One Wireless Adapter see https://github.com/openwrt/mt76/issues/200 I have looked at the FCC info related to the MT7632U chip as mentioned in here: https://github.com/openwrt/mt76/issues/459 These confirm the chipset does not support 'ac' mode and hence VHT should be turned of. Signed-off-by: Henk Vergonet Acked-by: Lorenzo Bianconi Link: https://patch.msgid.link/20250418143914.31384-1-henk.vergonet@gmail.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt76x2/usb.c | 2 ++ .../net/wireless/mediatek/mt76/mt76x2/usb_init.c | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c b/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c index 84ef80ab4afbf..96cecc576a986 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c +++ b/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c @@ -17,6 +17,8 @@ static const struct usb_device_id mt76x2u_device_table[] = { { USB_DEVICE(0x057c, 0x8503) }, /* Avm FRITZ!WLAN AC860 */ { USB_DEVICE(0x7392, 0xb711) }, /* Edimax EW 7722 UAC */ { USB_DEVICE(0x0e8d, 0x7632) }, /* HC-M7662BU1 */ + { USB_DEVICE(0x0471, 0x2126) }, /* LiteOn WN4516R module, nonstandard USB connector */ + { USB_DEVICE(0x0471, 0x7600) }, /* LiteOn WN4519R module, nonstandard USB connector */ { USB_DEVICE(0x2c4e, 0x0103) }, /* Mercury UD13 */ { USB_DEVICE(0x0846, 0x9014) }, /* Netgear WNDA3100v3 */ { USB_DEVICE(0x0846, 0x9053) }, /* Netgear A6210 */ diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_init.c b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_init.c index 33a14365ec9b9..3b55628115115 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_init.c +++ b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_init.c @@ -191,6 +191,7 @@ int mt76x2u_register_device(struct mt76x02_dev *dev) { struct ieee80211_hw *hw = mt76_hw(dev); struct mt76_usb *usb = &dev->mt76.usb; + bool vht; int err; INIT_DELAYED_WORK(&dev->cal_work, mt76x2u_phy_calibrate); @@ -217,7 +218,17 @@ int mt76x2u_register_device(struct mt76x02_dev *dev) /* check hw sg support in order to enable AMSDU */ hw->max_tx_fragments = dev->mt76.usb.sg_en ? MT_TX_SG_MAX_SIZE : 1; - err = mt76_register_device(&dev->mt76, true, mt76x02_rates, + switch (dev->mt76.rev) { + case 0x76320044: + /* these ASIC revisions do not support VHT */ + vht = false; + break; + default: + vht = true; + break; + } + + err = mt76_register_device(&dev->mt76, vht, mt76x02_rates, ARRAY_SIZE(mt76x02_rates)); if (err) goto fail; -- GitLab From 7f622bb3b5bc8073815de3900f82f206a13ba641 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Sat, 10 May 2025 19:53:09 -0500 Subject: [PATCH 1413/2211] wifi: mt76: mt7921: add 160 MHz AP for mt7922 device [ Upstream commit 7011faebe543f8f094fdb3281d0ec9e1eab81309 ] This allows mt7922 in hostapd mode to transmit up to 1.4 Gbps. Signed-off-by: Samuel Williams Link: https://patch.msgid.link/20250511005316.1118961-1-sam8641@gmail.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- drivers/net/wireless/mediatek/mt76/mt7921/main.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c index 6a3629f71caaa..9c245c23a2d73 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c @@ -83,6 +83,11 @@ mt7921_init_he_caps(struct mt792x_phy *phy, enum nl80211_band band, he_cap_elem->phy_cap_info[9] |= IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU | IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU; + + if (is_mt7922(phy->mt76->dev)) { + he_cap_elem->phy_cap_info[0] |= + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; + } break; case NL80211_IFTYPE_STATION: he_cap_elem->mac_cap_info[1] |= -- GitLab From 84feb629fc10b4cf3114b90fc8ff2857616767d6 Mon Sep 17 00:00:00 2001 From: Leon Yen Date: Fri, 9 May 2025 16:21:17 +0800 Subject: [PATCH 1414/2211] wifi: mt76: mt7925: introduce thermal protection [ Upstream commit 1d81e893b422a6f0ae70f8648867c2e73edfb413 ] Add thermal protection to prevent the chip from possible overheating due to prolonged high traffic and adverse operating conditions. Signed-off-by: Leon Yen Signed-off-by: Ming Yen Hsieh Link: https://patch.msgid.link/20250509082117.453819-1-mingyen.hsieh@mediatek.com Signed-off-by: Felix Fietkau Signed-off-by: Sasha Levin --- .../net/wireless/mediatek/mt76/mt7925/init.c | 6 ++++++ .../net/wireless/mediatek/mt76/mt7925/mcu.c | 20 ++++++++++++++++++- .../net/wireless/mediatek/mt76/mt7925/mcu.h | 1 + 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/init.c b/drivers/net/wireless/mediatek/mt76/mt7925/init.c index 039949b344b98..14553dcc61c57 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/init.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/init.c @@ -204,6 +204,12 @@ static void mt7925_init_work(struct work_struct *work) return; } + ret = mt7925_mcu_set_thermal_protect(dev); + if (ret) { + dev_err(dev->mt76.dev, "thermal protection enable failed\n"); + return; + } + /* we support chip reset now */ dev->hw_init_done = true; diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c index a19c108ad4b5c..57a1db394dda4 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c @@ -961,6 +961,23 @@ int mt7925_mcu_set_deep_sleep(struct mt792x_dev *dev, bool enable) } EXPORT_SYMBOL_GPL(mt7925_mcu_set_deep_sleep); +int mt7925_mcu_set_thermal_protect(struct mt792x_dev *dev) +{ + char cmd[64]; + int ret = 0; + + snprintf(cmd, sizeof(cmd), "ThermalProtGband %d %d %d %d %d %d %d %d %d %d", + 0, 100, 90, 80, 30, 1, 1, 115, 105, 5); + ret = mt7925_mcu_chip_config(dev, cmd); + + snprintf(cmd, sizeof(cmd), "ThermalProtAband %d %d %d %d %d %d %d %d %d %d", + 1, 100, 90, 80, 30, 1, 1, 115, 105, 5); + ret |= mt7925_mcu_chip_config(dev, cmd); + + return ret; +} +EXPORT_SYMBOL_GPL(mt7925_mcu_set_thermal_protect); + int mt7925_run_firmware(struct mt792x_dev *dev) { int err; @@ -3288,7 +3305,8 @@ int mt7925_mcu_fill_message(struct mt76_dev *mdev, struct sk_buff *skb, else uni_txd->option = MCU_CMD_UNI_EXT_ACK; - if (cmd == MCU_UNI_CMD(HIF_CTRL)) + if (cmd == MCU_UNI_CMD(HIF_CTRL) || + cmd == MCU_UNI_CMD(CHIP_CONFIG)) uni_txd->option &= ~MCU_CMD_ACK; goto exit; diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.h index 887427e0760ae..780c5921679aa 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.h +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.h @@ -635,6 +635,7 @@ int mt7925_mcu_add_bss_info(struct mt792x_phy *phy, int mt7925_mcu_set_timing(struct mt792x_phy *phy, struct ieee80211_bss_conf *link_conf); int mt7925_mcu_set_deep_sleep(struct mt792x_dev *dev, bool enable); +int mt7925_mcu_set_thermal_protect(struct mt792x_dev *dev); int mt7925_mcu_set_channel_domain(struct mt76_phy *phy); int mt7925_mcu_set_radio_en(struct mt792x_phy *phy, bool enable); int mt7925_mcu_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif, -- GitLab From cba1b82bdc9925a844aababdfa95f4b26737a2c8 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Singh Date: Fri, 16 May 2025 16:02:07 +0530 Subject: [PATCH 1415/2211] wifi: mac80211: validate SCAN_FLAG_AP in scan request during MLO [ Upstream commit 78a7a126dc5b8e3c5a3d4da9f513e0236d2dc1a3 ] When an AP interface is already beaconing, a subsequent scan is not allowed unless the user space explicitly sets the flag NL80211_SCAN_FLAG_AP in the scan request. If this flag is not set, the scan request will be returned with the error code -EOPNOTSUPP. However, this restriction currently applies only to non-ML interfaces. For ML interfaces, scans are allowed without this flag being explicitly set by the user space which is wrong. This is because the beaconing check currently uses only the deflink, which does not get set during MLO. Hence to fix this, during MLO, use the existing helper ieee80211_num_beaconing_links() to know if any of the link is beaconing. Signed-off-by: Aditya Kumar Singh Link: https://patch.msgid.link/20250516-bug_fix_mlo_scan-v2-1-12e59d9110ac@oss.qualcomm.com Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- net/mac80211/cfg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index f11fd360b422d..cf2b8a05c3389 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -2876,7 +2876,7 @@ static int ieee80211_scan(struct wiphy *wiphy, * the frames sent while scanning on other channel will be * lost) */ - if (sdata->deflink.u.ap.beacon && + if (ieee80211_num_beaconing_links(sdata) && (!(wiphy->features & NL80211_FEATURE_AP_SCAN) || !(req->flags & NL80211_SCAN_FLAG_AP))) return -EOPNOTSUPP; -- GitLab From ec7d08ad9a00e465aee929820c6a6fd8c6ab1c6a Mon Sep 17 00:00:00 2001 From: Petr Malat Date: Fri, 16 May 2025 10:17:28 +0200 Subject: [PATCH 1416/2211] sctp: Do not wake readers in __sctp_write_space() [ Upstream commit af295892a7abbf05a3c2ba7abc4d81bb448623d6 ] Function __sctp_write_space() doesn't set poll key, which leads to ep_poll_callback() waking up all waiters, not only these waiting for the socket being writable. Set the key properly using wake_up_interruptible_poll(), which is preferred over the sync variant, as writers are not woken up before at least half of the queue is available. Also, TCP does the same. Signed-off-by: Petr Malat Acked-by: Xin Long Link: https://patch.msgid.link/20250516081727.1361451-1-oss@malat.biz Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/sctp/socket.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 53725ee7ba06d..b301d64d9d80f 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -9100,7 +9100,8 @@ static void __sctp_write_space(struct sctp_association *asoc) wq = rcu_dereference(sk->sk_wq); if (wq) { if (waitqueue_active(&wq->wait)) - wake_up_interruptible(&wq->wait); + wake_up_interruptible_poll(&wq->wait, EPOLLOUT | + EPOLLWRNORM | EPOLLWRBAND); /* Note that we try to include the Async I/O support * here by modeling from the current TCP/UDP code. -- GitLab From 45251bcfe031d15a3885ac15f874f65ef4580ed3 Mon Sep 17 00:00:00 2001 From: Alan Maguire Date: Mon, 19 May 2025 17:59:34 +0100 Subject: [PATCH 1417/2211] libbpf/btf: Fix string handling to support multi-split BTF [ Upstream commit 4e29128a9acec2a622734844bedee013e2901bdf ] libbpf handling of split BTF has been written largely with the assumption that multiple splits are possible, i.e. split BTF on top of split BTF on top of base BTF. One area where this does not quite work is string handling in split BTF; the start string offset should be the base BTF string section length + the base BTF string offset. This worked in the past because for a single split BTF with base the start string offset was always 0. Signed-off-by: Alan Maguire Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250519165935.261614-2-alan.maguire@oracle.com Signed-off-by: Sasha Levin --- tools/lib/bpf/btf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c index 27e7bfae953bd..4a486798fe4c0 100644 --- a/tools/lib/bpf/btf.c +++ b/tools/lib/bpf/btf.c @@ -995,7 +995,7 @@ static struct btf *btf_new_empty(struct btf *base_btf) if (base_btf) { btf->base_btf = base_btf; btf->start_id = btf__type_cnt(base_btf); - btf->start_str_off = base_btf->hdr->str_len; + btf->start_str_off = base_btf->hdr->str_len + base_btf->start_str_off; btf->swapped_endian = base_btf->swapped_endian; } -- GitLab From 77ff6aec7c319e9f867cda583a63b9c0efb79202 Mon Sep 17 00:00:00 2001 From: Mike Tipton Date: Wed, 14 May 2025 20:53:12 -0700 Subject: [PATCH 1418/2211] cpufreq: scmi: Skip SCMI devices that aren't used by the CPUs [ Upstream commit 6c9bb86922728c7a4cceb99f131e00dd87514f20 ] Currently, all SCMI devices with performance domains attempt to register a cpufreq driver, even if their performance domains aren't used to control the CPUs. The cpufreq framework only supports registering a single driver, so only the first device will succeed. And if that device isn't used for the CPUs, then cpufreq will scale the wrong domains. To avoid this, return early from scmi_cpufreq_probe() if the probing SCMI device isn't referenced by the CPU device phandles. This keeps the existing assumption that all CPUs are controlled by a single SCMI device. Signed-off-by: Mike Tipton Reviewed-by: Peng Fan Reviewed-by: Cristian Marussi Reviewed-by: Sudeep Holla Tested-by: Cristian Marussi Signed-off-by: Viresh Kumar Signed-off-by: Sasha Levin --- drivers/cpufreq/scmi-cpufreq.c | 36 +++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c index 7e7c1613a67c6..beb660ca240cc 100644 --- a/drivers/cpufreq/scmi-cpufreq.c +++ b/drivers/cpufreq/scmi-cpufreq.c @@ -367,6 +367,40 @@ static struct cpufreq_driver scmi_cpufreq_driver = { .register_em = scmi_cpufreq_register_em, }; +static bool scmi_dev_used_by_cpus(struct device *scmi_dev) +{ + struct device_node *scmi_np = dev_of_node(scmi_dev); + struct device_node *cpu_np, *np; + struct device *cpu_dev; + int cpu, idx; + + if (!scmi_np) + return false; + + for_each_possible_cpu(cpu) { + cpu_dev = get_cpu_device(cpu); + if (!cpu_dev) + continue; + + cpu_np = dev_of_node(cpu_dev); + + np = of_parse_phandle(cpu_np, "clocks", 0); + of_node_put(np); + + if (np == scmi_np) + return true; + + idx = of_property_match_string(cpu_np, "power-domain-names", "perf"); + np = of_parse_phandle(cpu_np, "power-domains", idx); + of_node_put(np); + + if (np == scmi_np) + return true; + } + + return false; +} + static int scmi_cpufreq_probe(struct scmi_device *sdev) { int ret; @@ -375,7 +409,7 @@ static int scmi_cpufreq_probe(struct scmi_device *sdev) handle = sdev->handle; - if (!handle) + if (!handle || !scmi_dev_used_by_cpus(dev)) return -ENODEV; perf_ops = handle->devm_protocol_get(sdev, SCMI_PROTOCOL_PERF, &ph); -- GitLab From 75a864f21ceeb8c1e8ce1b7589174fec2c3a039e Mon Sep 17 00:00:00 2001 From: Akhil R Date: Thu, 24 Apr 2025 11:03:20 +0530 Subject: [PATCH 1419/2211] i2c: tegra: check msg length in SMBUS block read [ Upstream commit a6e04f05ce0b070ab39d5775580e65c7d943da0b ] For SMBUS block read, do not continue to read if the message length passed from the device is '0' or greater than the maximum allowed bytes. Signed-off-by: Akhil R Acked-by: Thierry Reding Link: https://lore.kernel.org/r/20250424053320.19211-1-akhilrajeev@nvidia.com Signed-off-by: Andi Shyti Signed-off-by: Sasha Levin --- drivers/i2c/busses/i2c-tegra.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index 1df5b42041427..89ce8a62b37c6 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -1395,6 +1395,11 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], ret = tegra_i2c_xfer_msg(i2c_dev, &msgs[i], MSG_END_CONTINUE); if (ret) break; + + /* Validate message length before proceeding */ + if (msgs[i].buf[0] == 0 || msgs[i].buf[0] > I2C_SMBUS_BLOCK_MAX) + break; + /* Set the msg length from first byte */ msgs[i].len += msgs[i].buf[0]; dev_dbg(i2c_dev->dev, "reading %d bytes\n", msgs[i].len); -- GitLab From cb8484d1ba71ca9572ae6c6f97010be7bdd95fb7 Mon Sep 17 00:00:00 2001 From: Tali Perry Date: Fri, 28 Mar 2025 19:32:50 +0000 Subject: [PATCH 1420/2211] i2c: npcm: Add clock toggle recovery [ Upstream commit 38010591a0fc3203f1cee45b01ab358b72dd9ab2 ] During init of the bus, the module checks that the bus is idle. If one of the lines are stuck try to recover them first before failing. Sometimes SDA and SCL are low if improper reset occurs (e.g., reboot). Signed-off-by: Tali Perry Signed-off-by: Mohammed Elbadry Reviewed-by: Mukesh Kumar Savaliya Link: https://lore.kernel.org/r/20250328193252.1570811-1-mohammed.0.elbadry@gmail.com Signed-off-by: Andi Shyti Signed-off-by: Sasha Levin --- drivers/i2c/busses/i2c-npcm7xx.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/i2c/busses/i2c-npcm7xx.c b/drivers/i2c/busses/i2c-npcm7xx.c index a693ebb64edf4..7b6eb2bfb412e 100644 --- a/drivers/i2c/busses/i2c-npcm7xx.c +++ b/drivers/i2c/busses/i2c-npcm7xx.c @@ -1969,10 +1969,14 @@ static int npcm_i2c_init_module(struct npcm_i2c *bus, enum i2c_mode mode, /* Check HW is OK: SDA and SCL should be high at this point. */ if ((npcm_i2c_get_SDA(&bus->adap) == 0) || (npcm_i2c_get_SCL(&bus->adap) == 0)) { - dev_err(bus->dev, "I2C%d init fail: lines are low\n", bus->num); - dev_err(bus->dev, "SDA=%d SCL=%d\n", npcm_i2c_get_SDA(&bus->adap), - npcm_i2c_get_SCL(&bus->adap)); - return -ENXIO; + dev_warn(bus->dev, " I2C%d SDA=%d SCL=%d, attempting to recover\n", bus->num, + npcm_i2c_get_SDA(&bus->adap), npcm_i2c_get_SCL(&bus->adap)); + if (npcm_i2c_recovery_tgclk(&bus->adap)) { + dev_err(bus->dev, "I2C%d init fail: SDA=%d SCL=%d\n", + bus->num, npcm_i2c_get_SDA(&bus->adap), + npcm_i2c_get_SCL(&bus->adap)); + return -ENXIO; + } } npcm_i2c_int_enable(bus, true); -- GitLab From a856d71fbb5f5ccbd35aa5cd9d03f170b3950bf9 Mon Sep 17 00:00:00 2001 From: Taniya Das Date: Mon, 14 Apr 2025 14:30:41 +0530 Subject: [PATCH 1421/2211] clk: qcom: gcc-x1e80100: Set FORCE MEM CORE for UFS clocks [ Upstream commit 201bf08ba9e26eeb0a96ba3fd5c026f531b31aed ] Update the force mem core bit for UFS ICE clock and UFS PHY AXI clock to force the core on signal to remain active during halt state of the clk. If force mem core bit of the clock is not set, the memories of the subsystem will not retain the logic across power states. This is required for the MCQ feature of UFS. Signed-off-by: Taniya Das Reviewed-by: Imran Shaik Link: https://lore.kernel.org/r/20250414-gcc_ufs_mem_core-v1-2-67b5529b9b5d@quicinc.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- drivers/clk/qcom/gcc-x1e80100.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/clk/qcom/gcc-x1e80100.c b/drivers/clk/qcom/gcc-x1e80100.c index 009f39139b644..3e44757e25d32 100644 --- a/drivers/clk/qcom/gcc-x1e80100.c +++ b/drivers/clk/qcom/gcc-x1e80100.c @@ -6753,6 +6753,10 @@ static int gcc_x1e80100_probe(struct platform_device *pdev) /* Clear GDSC_SLEEP_ENA_VOTE to stop votes being auto-removed in sleep. */ regmap_write(regmap, 0x52224, 0x0); + /* FORCE_MEM_CORE_ON for ufs phy ice core and gcc ufs phy axi clocks */ + qcom_branch_set_force_mem_core(regmap, gcc_ufs_phy_ice_core_clk, true); + qcom_branch_set_force_mem_core(regmap, gcc_ufs_phy_axi_clk, true); + return qcom_cc_really_probe(&pdev->dev, &gcc_x1e80100_desc, regmap); } -- GitLab From 7c6b9f6a5335755aa688298c7e6028f144e52572 Mon Sep 17 00:00:00 2001 From: Moon Yeounsu Date: Thu, 15 May 2025 16:53:31 +0900 Subject: [PATCH 1422/2211] net: dlink: add synchronization for stats update [ Upstream commit 12889ce926e9a9baf6b83d809ba316af539b89e2 ] This patch synchronizes code that accesses from both user-space and IRQ contexts. The `get_stats()` function can be called from both context. `dev->stats.tx_errors` and `dev->stats.collisions` are also updated in the `tx_errors()` function. Therefore, these fields must also be protected by synchronized. There is no code that accessses `dev->stats.tx_errors` between the previous and updated lines, so the updating point can be moved. Signed-off-by: Moon Yeounsu Link: https://patch.msgid.link/20250515075333.48290-1-yyyynoom@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/dlink/dl2k.c | 14 +++++++++++++- drivers/net/ethernet/dlink/dl2k.h | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/dlink/dl2k.c b/drivers/net/ethernet/dlink/dl2k.c index 6bf8a7aeef908..787218d60c6b1 100644 --- a/drivers/net/ethernet/dlink/dl2k.c +++ b/drivers/net/ethernet/dlink/dl2k.c @@ -146,6 +146,8 @@ rio_probe1 (struct pci_dev *pdev, const struct pci_device_id *ent) np->ioaddr = ioaddr; np->chip_id = chip_idx; np->pdev = pdev; + + spin_lock_init(&np->stats_lock); spin_lock_init (&np->tx_lock); spin_lock_init (&np->rx_lock); @@ -865,7 +867,6 @@ tx_error (struct net_device *dev, int tx_status) frame_id = (tx_status & 0xffff0000); printk (KERN_ERR "%s: Transmit error, TxStatus %4.4x, FrameId %d.\n", dev->name, tx_status, frame_id); - dev->stats.tx_errors++; /* Ttransmit Underrun */ if (tx_status & 0x10) { dev->stats.tx_fifo_errors++; @@ -902,9 +903,15 @@ tx_error (struct net_device *dev, int tx_status) rio_set_led_mode(dev); /* Let TxStartThresh stay default value */ } + + spin_lock(&np->stats_lock); /* Maximum Collisions */ if (tx_status & 0x08) dev->stats.collisions++; + + dev->stats.tx_errors++; + spin_unlock(&np->stats_lock); + /* Restart the Tx */ dw32(MACCtrl, dr16(MACCtrl) | TxEnable); } @@ -1073,7 +1080,9 @@ get_stats (struct net_device *dev) int i; #endif unsigned int stat_reg; + unsigned long flags; + spin_lock_irqsave(&np->stats_lock, flags); /* All statistics registers need to be acknowledged, else statistic overflow could cause problems */ @@ -1123,6 +1132,9 @@ get_stats (struct net_device *dev) dr16(TCPCheckSumErrors); dr16(UDPCheckSumErrors); dr16(IPCheckSumErrors); + + spin_unlock_irqrestore(&np->stats_lock, flags); + return &dev->stats; } diff --git a/drivers/net/ethernet/dlink/dl2k.h b/drivers/net/ethernet/dlink/dl2k.h index 0e33e2eaae960..56aff2f0bdbfa 100644 --- a/drivers/net/ethernet/dlink/dl2k.h +++ b/drivers/net/ethernet/dlink/dl2k.h @@ -372,6 +372,8 @@ struct netdev_private { struct pci_dev *pdev; void __iomem *ioaddr; void __iomem *eeprom_addr; + // To ensure synchronization when stats are updated. + spinlock_t stats_lock; spinlock_t tx_lock; spinlock_t rx_lock; unsigned int rx_buf_sz; /* Based on MTU+slack. */ -- GitLab From fd1bf3985d4a904cb5baa66db12fe7e63f8a6739 Mon Sep 17 00:00:00 2001 From: Kang Yang Date: Mon, 21 Apr 2025 10:34:39 +0800 Subject: [PATCH 1423/2211] wifi: ath12k: fix macro definition HAL_RX_MSDU_PKT_LENGTH_GET [ Upstream commit a69bbf89d751ba2d6da21d773c4e29c91c5e53c4 ] Currently, HAL_RX_MSDU_PKT_LENGTH_GET uses u32_get_bits to obtain the MSDU length from the MSDU description. This is not right. Because all halphy descriptions are little endian. So use le32_get_bits for HAL_RX_MSDU_PKT_LENGTH_GET. Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Signed-off-by: Kang Yang Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250421023444.1778-9-kang.yang@oss.qualcomm.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/hal_desc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath12k/hal_desc.h b/drivers/net/wireless/ath/ath12k/hal_desc.h index c68998e9667c9..8cbe28950d0c0 100644 --- a/drivers/net/wireless/ath/ath12k/hal_desc.h +++ b/drivers/net/wireless/ath/ath12k/hal_desc.h @@ -705,7 +705,7 @@ enum hal_rx_msdu_desc_reo_dest_ind { #define RX_MSDU_DESC_INFO0_DECAP_FORMAT GENMASK(30, 29) #define HAL_RX_MSDU_PKT_LENGTH_GET(val) \ - (u32_get_bits((val), RX_MSDU_DESC_INFO0_MSDU_LENGTH)) + (le32_get_bits((val), RX_MSDU_DESC_INFO0_MSDU_LENGTH)) struct rx_msdu_desc { __le32 info0; -- GitLab From 4585e37d0846e9e3fb58756998172c460a1fc4a9 Mon Sep 17 00:00:00 2001 From: Baochen Qiang Date: Fri, 18 Apr 2025 10:55:34 +0800 Subject: [PATCH 1424/2211] wifi: ath12k: fix a possible dead lock caused by ab->base_lock [ Upstream commit ef115c265a21e3c11deee7f73bd1061775a7bf20 ] spin_lock/spin_unlock are used in ath12k_reg_chan_list_event to acquire/release ab->base_lock. For now this is safe because that function is only called in soft IRQ context. But ath12k_reg_chan_list_event() will be called from process context in an upcoming patch, and this can result in a deadlock if ab->base_lock is acquired in process context and then soft IRQ occurs on the same CPU and tries to acquire that lock. Fix it by using spin_lock_bh and spin_unlock_bh instead. Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Signed-off-by: Baochen Qiang Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250418-ath12k-6g-lp-vlp-v1-1-c869c86cad60@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/wmi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c index 17ac54047f9a7..c38d3493c6911 100644 --- a/drivers/net/wireless/ath/ath12k/wmi.c +++ b/drivers/net/wireless/ath/ath12k/wmi.c @@ -5784,7 +5784,7 @@ static int ath12k_reg_chan_list_event(struct ath12k_base *ab, struct sk_buff *sk goto fallback; } - spin_lock(&ab->base_lock); + spin_lock_bh(&ab->base_lock); if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags)) { /* Once mac is registered, ar is valid and all CC events from * fw is considered to be received due to user requests @@ -5808,7 +5808,7 @@ static int ath12k_reg_chan_list_event(struct ath12k_base *ab, struct sk_buff *sk ab->default_regd[pdev_idx] = regd; } ab->dfs_region = reg_info->dfs_region; - spin_unlock(&ab->base_lock); + spin_unlock_bh(&ab->base_lock); goto mem_free; -- GitLab From 847f414bf98126067ff4d24bd8478c65328b719b Mon Sep 17 00:00:00 2001 From: Muhammad Usama Anjum Date: Mon, 28 Apr 2025 13:02:41 +0500 Subject: [PATCH 1425/2211] wifi: ath11k: Fix QMI memory reuse logic [ Upstream commit cd2e7bae92bd7e65063ab8d04721d2b711ba4cbe ] Firmware requests 2 segments at first. The first segment is of 6799360 whose allocation fails due to dma remapping not available. The success is returned to firmware. Then firmware asks for 22 smaller segments instead of 2 big ones. Those get allocated successfully. At suspend/ hibernation time, these segments aren't freed as they will be reused by firmware after resuming. After resuming, the firmware asks for the 2 segments again with the first segment of 6799360 size. Since chunk->vaddr is not NULL, the type and size are compared with the previous type and size to know if it can be reused or not. Unfortunately, it is detected that it cannot be reused and this first smaller segment is freed. Then we continue to allocate 6799360 size memory which fails and ath11k_qmi_free_target_mem_chunk() is called which frees the second smaller segment as well. Later success is returned to firmware which asks for 22 smaller segments again. But as we had freed 2 segments already, we'll allocate the first 2 new smaller segments again and reuse the remaining 20. Hence 20 small segments are being reused instead of 22. Add skip logic when vaddr is set, but size/type don't match. Use the same skip and success logic as used when dma_alloc_coherent() fails. By skipping, the possibility of resume failure due to kernel failing to allocate memory for QMI can be avoided. kernel: ath11k_pci 0000:03:00.0: failed to allocate dma memory for qmi (524288 B type 1) ath11k_pci 0000:03:00.0: failed to allocate qmi target memory: -22 Tested-on: WCN6855 WLAN.HSP.1.1-03926.13-QCAHSPSWPL_V2_SILICONZ_CE-2.52297.6 Signed-off-by: Muhammad Usama Anjum Reviewed-by: Baochen Qiang Link: https://patch.msgid.link/20250428080242.466901-1-usama.anjum@collabora.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath11k/qmi.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/net/wireless/ath/ath11k/qmi.c b/drivers/net/wireless/ath/ath11k/qmi.c index 7a22483b35cd9..a5555c959dec9 100644 --- a/drivers/net/wireless/ath/ath11k/qmi.c +++ b/drivers/net/wireless/ath/ath11k/qmi.c @@ -1989,6 +1989,15 @@ static int ath11k_qmi_alloc_target_mem_chunk(struct ath11k_base *ab) chunk->prev_size == chunk->size) continue; + if (ab->qmi.mem_seg_count <= ATH11K_QMI_FW_MEM_REQ_SEGMENT_CNT) { + ath11k_dbg(ab, ATH11K_DBG_QMI, + "size/type mismatch (current %d %u) (prev %d %u), try later with small size\n", + chunk->size, chunk->type, + chunk->prev_size, chunk->prev_type); + ab->qmi.target_mem_delayed = true; + return 0; + } + /* cannot reuse the existing chunk */ dma_free_coherent(ab->dev, chunk->prev_size, chunk->vaddr, chunk->paddr); -- GitLab From 3cb5d934e074d67abadd22cd88ef1e4567961dac Mon Sep 17 00:00:00 2001 From: Mario Limonciello Date: Mon, 12 May 2025 12:30:32 -0500 Subject: [PATCH 1426/2211] iommu/amd: Allow matching ACPI HID devices without matching UIDs [ Upstream commit 51c33f333bbf7bdb6aa2a327e3a3e4bbb2591511 ] A BIOS upgrade has changed the IVRS DTE UID for a device that no longer matches the UID in the SSDT. In this case there is only one ACPI device on the system with that _HID but the _UID mismatch. IVRS: ``` Subtable Type : F0 [Device Entry: ACPI HID Named Device] Device ID : 0060 Data Setting (decoded below) : 40 INITPass : 0 EIntPass : 0 NMIPass : 0 Reserved : 0 System MGMT : 0 LINT0 Pass : 1 LINT1 Pass : 0 ACPI HID : "MSFT0201" ACPI CID : 0000000000000000 UID Format : 02 UID Length : 09 UID : "\_SB.MHSP" ``` SSDT: ``` Device (MHSP) { Name (_ADR, Zero) // _ADR: Address Name (_HID, "MSFT0201") // _HID: Hardware ID Name (_UID, One) // _UID: Unique ID ``` To handle this case; while enumerating ACPI devices in get_acpihid_device_id() count the number of matching ACPI devices with a matching _HID. If there is exactly one _HID match then accept it even if the UID doesn't match. Other operating systems allow this, but the current IVRS spec leaves some ambiguity whether to allow or disallow it. This should be clarified in future revisions of the spec. Output 'Firmware Bug' for this case to encourage it to be solved in the BIOS. Signed-off-by: Mario Limonciello Reviewed-by: Vasant Hegde Link: https://lore.kernel.org/r/20250512173129.1274275-1-superm1@kernel.org Signed-off-by: Joerg Roedel Signed-off-by: Sasha Levin --- drivers/iommu/amd/iommu.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index f61e48f237324..4428a9557f295 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -107,7 +107,9 @@ static inline int get_acpihid_device_id(struct device *dev, struct acpihid_map_entry **entry) { struct acpi_device *adev = ACPI_COMPANION(dev); - struct acpihid_map_entry *p; + struct acpihid_map_entry *p, *p1 = NULL; + int hid_count = 0; + bool fw_bug; if (!adev) return -ENODEV; @@ -115,12 +117,33 @@ static inline int get_acpihid_device_id(struct device *dev, list_for_each_entry(p, &acpihid_map, list) { if (acpi_dev_hid_uid_match(adev, p->hid, p->uid[0] ? p->uid : NULL)) { - if (entry) - *entry = p; - return p->devid; + p1 = p; + fw_bug = false; + hid_count = 1; + break; + } + + /* + * Count HID matches w/o UID, raise FW_BUG but allow exactly one match + */ + if (acpi_dev_hid_match(adev, p->hid)) { + p1 = p; + hid_count++; + fw_bug = true; } } - return -EINVAL; + + if (!p1) + return -EINVAL; + if (fw_bug) + dev_err_once(dev, FW_BUG "No ACPI device matched UID, but %d device%s matched HID.\n", + hid_count, hid_count > 1 ? "s" : ""); + if (hid_count > 1) + return -EINVAL; + if (entry) + *entry = p1; + + return p1->devid; } static inline int get_device_sbdf_id(struct device *dev) -- GitLab From 72b03d8abcd23b268ac3c08a063ff95855f299ee Mon Sep 17 00:00:00 2001 From: Dian-Syuan Yang Date: Wed, 7 May 2025 11:12:03 +0800 Subject: [PATCH 1427/2211] wifi: rtw89: leave idle mode when setting WEP encryption for AP mode [ Upstream commit d105652b33245162867ac769bea336976e67efb8 ] Due to mac80211 triggering the hardware to enter idle mode, it fails to install WEP key causing connected station can't ping successfully. Currently, it forces the hardware to leave idle mode before driver adding WEP keys. Signed-off-by: Dian-Syuan Yang Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250507031203.8256-1-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/cam.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw89/cam.c b/drivers/net/wireless/realtek/rtw89/cam.c index 8d140b94cb440..0c8ea5e629e6a 100644 --- a/drivers/net/wireless/realtek/rtw89/cam.c +++ b/drivers/net/wireless/realtek/rtw89/cam.c @@ -6,6 +6,7 @@ #include "debug.h" #include "fw.h" #include "mac.h" +#include "ps.h" static struct sk_buff * rtw89_cam_get_sec_key_cmd(struct rtw89_dev *rtwdev, @@ -447,9 +448,11 @@ int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev, switch (key->cipher) { case WLAN_CIPHER_SUITE_WEP40: + rtw89_leave_ips_by_hwflags(rtwdev); hw_key_type = RTW89_SEC_KEY_TYPE_WEP40; break; case WLAN_CIPHER_SUITE_WEP104: + rtw89_leave_ips_by_hwflags(rtwdev); hw_key_type = RTW89_SEC_KEY_TYPE_WEP104; break; case WLAN_CIPHER_SUITE_CCMP: -- GitLab From 0a8446058c6e304cb45cb7219586c9d30b1e8c13 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Tue, 13 May 2025 19:39:15 +0000 Subject: [PATCH 1428/2211] tcp: always seek for minimal rtt in tcp_rcv_rtt_update() [ Upstream commit b879dcb1aeeca278eacaac0b1e2425b1c7599f9f ] tcp_rcv_rtt_update() goal is to maintain an estimation of the RTT in tp->rcv_rtt_est.rtt_us, used by tcp_rcv_space_adjust() When TCP TS are enabled, tcp_rcv_rtt_update() is using EWMA to smooth the samples. Change this to immediately latch the incoming value if it is lower than tp->rcv_rtt_est.rtt_us, so that tcp_rcv_space_adjust() does not overshoot tp->rcvq_space.space and sk->sk_rcvbuf. Signed-off-by: Eric Dumazet Link: https://patch.msgid.link/20250513193919.1089692-8-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/ipv4/tcp_input.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index d29219e067b7f..cf4fef18a9cad 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -665,10 +665,12 @@ EXPORT_SYMBOL(tcp_initialize_rcv_mss); */ static void tcp_rcv_rtt_update(struct tcp_sock *tp, u32 sample, int win_dep) { - u32 new_sample = tp->rcv_rtt_est.rtt_us; - long m = sample; + u32 new_sample, old_sample = tp->rcv_rtt_est.rtt_us; + long m = sample << 3; - if (new_sample != 0) { + if (old_sample == 0 || m < old_sample) { + new_sample = m; + } else { /* If we sample in larger samples in the non-timestamp * case, we could grossly overestimate the RTT especially * with chatty applications or bulk transfer apps which @@ -679,17 +681,9 @@ static void tcp_rcv_rtt_update(struct tcp_sock *tp, u32 sample, int win_dep) * else with timestamps disabled convergence takes too * long. */ - if (!win_dep) { - m -= (new_sample >> 3); - new_sample += m; - } else { - m <<= 3; - if (m < new_sample) - new_sample = m; - } - } else { - /* No previous measure. */ - new_sample = m << 3; + if (win_dep) + return; + new_sample = old_sample - (old_sample >> 3) + sample; } tp->rcv_rtt_est.rtt_us = new_sample; -- GitLab From f97085d365eae40498372a4ced1c24b3d3ac9b24 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Tue, 13 May 2025 19:39:13 +0000 Subject: [PATCH 1429/2211] tcp: remove zero TCP TS samples for autotuning [ Upstream commit d59fc95be9d0fd05ed3ccc11b4a2f832bdf2ee03 ] For TCP flows using ms RFC 7323 timestamp granularity tcp_rcv_rtt_update() can be fed with 1 ms samples, breaking TCP autotuning for data center flows with sub ms RTT. Instead, rely on the window based samples, fed by tcp_rcv_rtt_measure() tcp_rcvbuf_grow() for a 10 second TCP_STREAM sesssion now looks saner. We can see rcvbuf is kept at a reasonable value. 222.234976: tcp:tcp_rcvbuf_grow: time=348 rtt_us=330 copied=110592 inq=0 space=40960 ooo=0 scaling_ratio=230 rcvbuf=131072 ... 222.235276: tcp:tcp_rcvbuf_grow: time=300 rtt_us=288 copied=126976 inq=0 space=110592 ooo=0 scaling_ratio=230 rcvbuf=246187 ... 222.235569: tcp:tcp_rcvbuf_grow: time=294 rtt_us=288 copied=184320 inq=0 space=126976 ooo=0 scaling_ratio=230 rcvbuf=282659 ... 222.235833: tcp:tcp_rcvbuf_grow: time=264 rtt_us=244 copied=373760 inq=0 space=184320 ooo=0 scaling_ratio=230 rcvbuf=410312 ... 222.236142: tcp:tcp_rcvbuf_grow: time=308 rtt_us=219 copied=424960 inq=20480 space=373760 ooo=0 scaling_ratio=230 rcvbuf=832022 ... 222.236378: tcp:tcp_rcvbuf_grow: time=236 rtt_us=219 copied=692224 inq=49152 space=404480 ooo=0 scaling_ratio=230 rcvbuf=900407 ... 222.236602: tcp:tcp_rcvbuf_grow: time=225 rtt_us=219 copied=730112 inq=49152 space=643072 ooo=0 scaling_ratio=230 rcvbuf=1431534 ... 222.237050: tcp:tcp_rcvbuf_grow: time=229 rtt_us=219 copied=1160192 inq=49152 space=680960 ooo=0 scaling_ratio=230 rcvbuf=1515876 ... 222.237618: tcp:tcp_rcvbuf_grow: time=305 rtt_us=218 copied=2228224 inq=49152 space=1111040 ooo=0 scaling_ratio=230 rcvbuf=2473271 ... 222.238591: tcp:tcp_rcvbuf_grow: time=224 rtt_us=218 copied=3063808 inq=360448 space=2179072 ooo=0 scaling_ratio=230 rcvbuf=4850803 ... 222.240647: tcp:tcp_rcvbuf_grow: time=260 rtt_us=218 copied=2752512 inq=0 space=2703360 ooo=0 scaling_ratio=230 rcvbuf=6017914 ... 222.243535: tcp:tcp_rcvbuf_grow: time=224 rtt_us=218 copied=2834432 inq=49152 space=2752512 ooo=0 scaling_ratio=230 rcvbuf=6127331 ... 222.245108: tcp:tcp_rcvbuf_grow: time=240 rtt_us=218 copied=2883584 inq=49152 space=2785280 ooo=0 scaling_ratio=230 rcvbuf=6200275 ... 222.245333: tcp:tcp_rcvbuf_grow: time=224 rtt_us=218 copied=2859008 inq=0 space=2834432 ooo=0 scaling_ratio=230 rcvbuf=6309692 ... 222.301021: tcp:tcp_rcvbuf_grow: time=222 rtt_us=218 copied=2883584 inq=0 space=2859008 ooo=0 scaling_ratio=230 rcvbuf=6364400 ... 222.989242: tcp:tcp_rcvbuf_grow: time=225 rtt_us=218 copied=2899968 inq=0 space=2883584 ooo=0 scaling_ratio=230 rcvbuf=6419108 ... 224.139553: tcp:tcp_rcvbuf_grow: time=224 rtt_us=218 copied=3014656 inq=65536 space=2899968 ooo=0 scaling_ratio=230 rcvbuf=6455580 ... 224.584608: tcp:tcp_rcvbuf_grow: time=232 rtt_us=218 copied=3014656 inq=49152 space=2949120 ooo=0 scaling_ratio=230 rcvbuf=6564997 ... 230.145560: tcp:tcp_rcvbuf_grow: time=223 rtt_us=218 copied=2981888 inq=0 space=2965504 ooo=0 scaling_ratio=230 rcvbuf=6601469 ... Signed-off-by: Eric Dumazet Reviewed-by: Wei Wang Link: https://patch.msgid.link/20250513193919.1089692-6-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/ipv4/tcp_input.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index cf4fef18a9cad..61ada4682094f 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -707,7 +707,7 @@ new_measure: tp->rcv_rtt_est.time = tp->tcp_mstamp; } -static s32 tcp_rtt_tsopt_us(const struct tcp_sock *tp) +static s32 tcp_rtt_tsopt_us(const struct tcp_sock *tp, u32 min_delta) { u32 delta, delta_us; @@ -717,7 +717,7 @@ static s32 tcp_rtt_tsopt_us(const struct tcp_sock *tp) if (likely(delta < INT_MAX / (USEC_PER_SEC / TCP_TS_HZ))) { if (!delta) - delta = 1; + delta = min_delta; delta_us = delta * (USEC_PER_SEC / TCP_TS_HZ); return delta_us; } @@ -735,9 +735,9 @@ static inline void tcp_rcv_rtt_measure_ts(struct sock *sk, if (TCP_SKB_CB(skb)->end_seq - TCP_SKB_CB(skb)->seq >= inet_csk(sk)->icsk_ack.rcv_mss) { - s32 delta = tcp_rtt_tsopt_us(tp); + s32 delta = tcp_rtt_tsopt_us(tp, 0); - if (delta >= 0) + if (delta > 0) tcp_rcv_rtt_update(tp, delta, 0); } } @@ -3220,7 +3220,7 @@ static bool tcp_ack_update_rtt(struct sock *sk, const int flag, */ if (seq_rtt_us < 0 && tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr && flag & FLAG_ACKED) - seq_rtt_us = ca_rtt_us = tcp_rtt_tsopt_us(tp); + seq_rtt_us = ca_rtt_us = tcp_rtt_tsopt_us(tp, 1); rs->rtt_us = ca_rtt_us; /* RTT of last (S)ACKed packet (or -1) */ if (seq_rtt_us < 0) -- GitLab From 89b20c406ea1aad40c1511013f211738e71bdaf3 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Tue, 13 May 2025 19:39:14 +0000 Subject: [PATCH 1430/2211] tcp: fix initial tp->rcvq_space.space value for passive TS enabled flows [ Upstream commit cd171461b90a2d2cf230943df60d580174633718 ] tcp_rcv_state_process() must tweak tp->advmss for TS enabled flows before the call to tcp_init_transfer() / tcp_init_buffer_space(). Otherwise tp->rcvq_space.space is off by 120 bytes (TCP_INIT_CWND * TCPOLEN_TSTAMP_ALIGNED). Signed-off-by: Eric Dumazet Reviewed-by: Wei Wang Link: https://patch.msgid.link/20250513193919.1089692-7-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/ipv4/tcp_input.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 61ada4682094f..7e772b6cb45b6 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -6835,6 +6835,9 @@ tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) if (!tp->srtt_us) tcp_synack_rtt_meas(sk, req); + if (tp->rx_opt.tstamp_ok) + tp->advmss -= TCPOLEN_TSTAMP_ALIGNED; + if (req) { tcp_rcv_synrecv_state_fastopen(sk); } else { @@ -6860,9 +6863,6 @@ tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) tp->snd_wnd = ntohs(th->window) << tp->rx_opt.snd_wscale; tcp_init_wl(tp, TCP_SKB_CB(skb)->seq); - if (tp->rx_opt.tstamp_ok) - tp->advmss -= TCPOLEN_TSTAMP_ALIGNED; - if (!inet_csk(sk)->icsk_ca_ops->cong_control) tcp_update_pacing_rate(sk); -- GitLab From 84c156a351459d9b0711d99131dcad714e31921b Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Tue, 13 May 2025 19:39:12 +0000 Subject: [PATCH 1431/2211] tcp: add receive queue awareness in tcp_rcv_space_adjust() [ Upstream commit ea33537d82921e71f852ea2ed985acc562125efe ] If the application can not drain fast enough a TCP socket queue, tcp_rcv_space_adjust() can overestimate tp->rcvq_space.space. Then sk->sk_rcvbuf can grow and hit tcp_rmem[2] for no good reason. Fix this by taking into acount the number of available bytes. Keeping sk->sk_rcvbuf at the right size allows better cache efficiency. Signed-off-by: Eric Dumazet Reviewed-by: Wei Wang Link: https://patch.msgid.link/20250513193919.1089692-5-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- include/linux/tcp.h | 2 +- net/ipv4/tcp_input.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 6a5e08b937b31..5f56fa8780131 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -336,7 +336,7 @@ struct tcp_sock { } rcv_rtt_est; /* Receiver queue space */ struct { - u32 space; + int space; u32 seq; u64 time; } rcvq_space; diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 7e772b6cb45b6..c59c1cc1a8fed 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -749,8 +749,7 @@ static inline void tcp_rcv_rtt_measure_ts(struct sock *sk, void tcp_rcv_space_adjust(struct sock *sk) { struct tcp_sock *tp = tcp_sk(sk); - u32 copied; - int time; + int time, inq, copied; trace_tcp_rcv_space_adjust(sk); @@ -761,6 +760,9 @@ void tcp_rcv_space_adjust(struct sock *sk) /* Number of bytes copied to user in last RTT */ copied = tp->copied_seq - tp->rcvq_space.seq; + /* Number of bytes in receive queue. */ + inq = tp->rcv_nxt - tp->copied_seq; + copied -= inq; if (copied <= tp->rcvq_space.space) goto new_measure; -- GitLab From dc5de5bd6deabd327ced2b2b1d0b4f14cd146afe Mon Sep 17 00:00:00 2001 From: Andrew Zaborowski Date: Fri, 9 May 2025 01:04:29 +0200 Subject: [PATCH 1432/2211] x86/sgx: Prevent attempts to reclaim poisoned pages [ Upstream commit ed16618c380c32c68c06186d0ccbb0d5e0586e59 ] TL;DR: SGX page reclaim touches the page to copy its contents to secondary storage. SGX instructions do not gracefully handle machine checks. Despite this, the existing SGX code will try to reclaim pages that it _knows_ are poisoned. Avoid even trying to reclaim poisoned pages. The longer story: Pages used by an enclave only get epc_page->poison set in arch_memory_failure() but they currently stay on sgx_active_page_list until sgx_encl_release(), with the SGX_EPC_PAGE_RECLAIMER_TRACKED flag untouched. epc_page->poison is not checked in the reclaimer logic meaning that, if other conditions are met, an attempt will be made to reclaim an EPC page that was poisoned. This is bad because 1. we don't want that page to end up added to another enclave and 2. it is likely to cause one core to shut down and the kernel to panic. Specifically, reclaiming uses microcode operations including "EWB" which accesses the EPC page contents to encrypt and write them out to non-SGX memory. Those operations cannot handle MCEs in their accesses other than by putting the executing core into a special shutdown state (affecting both threads with HT.) The kernel will subsequently panic on the remaining cores seeing the core didn't enter MCE handler(s) in time. Call sgx_unmark_page_reclaimable() to remove the affected EPC page from sgx_active_page_list on memory error to stop it being considered for reclaiming. Testing epc_page->poison in sgx_reclaim_pages() would also work but I assume it's better to add code in the less likely paths. The affected EPC page is not added to &node->sgx_poison_page_list until later in sgx_encl_release()->sgx_free_epc_page() when it is EREMOVEd. Membership on other lists doesn't change to avoid changing any of the lists' semantics except for sgx_active_page_list. There's a "TBD" comment in arch_memory_failure() about pre-emptive actions, the goal here is not to address everything that it may imply. This also doesn't completely close the time window when a memory error notification will be fatal (for a not previously poisoned EPC page) -- the MCE can happen after sgx_reclaim_pages() has selected its candidates or even *inside* a microcode operation (actually easy to trigger due to the amount of time spent in them.) The spinlock in sgx_unmark_page_reclaimable() is safe because memory_failure() runs in process context and no spinlocks are held, explicitly noted in a mm/memory-failure.c comment. Signed-off-by: Andrew Zaborowski Signed-off-by: Ingo Molnar Acked-by: Dave Hansen Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Tony Luck Cc: balrogg@gmail.com Cc: linux-sgx@vger.kernel.org Link: https://lore.kernel.org/r/20250508230429.456271-1-andrew.zaborowski@intel.com Signed-off-by: Sasha Levin --- arch/x86/kernel/cpu/sgx/main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c index 9ace84486499b..147ea26dfdad6 100644 --- a/arch/x86/kernel/cpu/sgx/main.c +++ b/arch/x86/kernel/cpu/sgx/main.c @@ -719,6 +719,8 @@ int arch_memory_failure(unsigned long pfn, int flags) goto out; } + sgx_unmark_page_reclaimable(page); + /* * TBD: Add additional plumbing to enable pre-emptive * action for asynchronous poison notification. Until -- GitLab From 3a9e74d158a9703743be1c4757db524b9ec96950 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Mon, 12 May 2025 11:27:24 +0200 Subject: [PATCH 1433/2211] ipv4/route: Use this_cpu_inc() for stats on PREEMPT_RT [ Upstream commit 1c0829788a6e6e165846b9bedd0b908ef16260b6 ] The statistics are incremented with raw_cpu_inc() assuming it always happens with bottom half disabled. Without per-CPU locking in local_bh_disable() on PREEMPT_RT this is no longer true. Use this_cpu_inc() on PREEMPT_RT for the increment to not worry about preemption. Cc: David Ahern Signed-off-by: Sebastian Andrzej Siewior Link: https://patch.msgid.link/20250512092736.229935-4-bigeasy@linutronix.de Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/ipv4/route.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 41b320f0c20eb..88d7c96bfac06 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -189,7 +189,11 @@ const __u8 ip_tos2prio[16] = { EXPORT_SYMBOL(ip_tos2prio); static DEFINE_PER_CPU(struct rt_cache_stat, rt_cache_stat); +#ifndef CONFIG_PREEMPT_RT #define RT_CACHE_STAT_INC(field) raw_cpu_inc(rt_cache_stat.field) +#else +#define RT_CACHE_STAT_INC(field) this_cpu_inc(rt_cache_stat.field) +#endif #ifdef CONFIG_PROC_FS static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos) -- GitLab From 5eb9c50e0c6d3930b26c52b2bd533aa3e10575bf Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Mon, 12 May 2025 11:27:22 +0200 Subject: [PATCH 1434/2211] net: page_pool: Don't recycle into cache on PREEMPT_RT [ Upstream commit 32471b2f481dea8624f27669d36ffd131d24b732 ] With preemptible softirq and no per-CPU locking in local_bh_disable() on PREEMPT_RT the consumer can be preempted while a skb is returned. Avoid the race by disabling the recycle into the cache on PREEMPT_RT. Cc: Jesper Dangaard Brouer Cc: Ilias Apalodimas Signed-off-by: Sebastian Andrzej Siewior Link: https://patch.msgid.link/20250512092736.229935-2-bigeasy@linutronix.de Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/core/page_pool.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/net/core/page_pool.c b/net/core/page_pool.c index 0f23b3126bdaf..b1c3e0ad6dbf4 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -829,6 +829,10 @@ static bool page_pool_napi_local(const struct page_pool *pool) const struct napi_struct *napi; u32 cpuid; + /* On PREEMPT_RT the softirq can be preempted by the consumer */ + if (IS_ENABLED(CONFIG_PREEMPT_RT)) + return false; + if (unlikely(!in_softirq())) return false; -- GitLab From 8b0741b167c6e6c37babf489e422527a34212908 Mon Sep 17 00:00:00 2001 From: Leon Romanovsky Date: Tue, 13 May 2025 13:56:22 +0300 Subject: [PATCH 1435/2211] xfrm: validate assignment of maximal possible SEQ number [ Upstream commit e86212b6b13a20c5ad404c5597933f57fd0f1519 ] Users can set any seq/seq_hi/oseq/oseq_hi values. The XFRM core code doesn't prevent from them to set even 0xFFFFFFFF, however this value will cause for traffic drop. Is is happening because SEQ numbers here mean that packet with such number was processed and next number should be sent on the wire. In this case, the next number will be 0, and it means overflow which causes to (expected) packet drops. While it can be considered as misconfiguration and handled by XFRM datapath in the same manner as any other SEQ number, let's add validation to easy for packet offloads implementations which need to configure HW with next SEQ to send and not with current SEQ like it is done in core code. Signed-off-by: Leon Romanovsky Signed-off-by: Steffen Klassert Signed-off-by: Sasha Levin --- net/xfrm/xfrm_user.c | 52 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index da2a1c00ca8a6..d41e5642625e3 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -178,11 +178,27 @@ static inline int verify_replay(struct xfrm_usersa_info *p, "Replay seq and seq_hi should be 0 for output SA"); return -EINVAL; } - if (rs->oseq_hi && !(p->flags & XFRM_STATE_ESN)) { - NL_SET_ERR_MSG( - extack, - "Replay oseq_hi should be 0 in non-ESN mode for output SA"); - return -EINVAL; + + if (!(p->flags & XFRM_STATE_ESN)) { + if (rs->oseq_hi) { + NL_SET_ERR_MSG( + extack, + "Replay oseq_hi should be 0 in non-ESN mode for output SA"); + return -EINVAL; + } + if (rs->oseq == U32_MAX) { + NL_SET_ERR_MSG( + extack, + "Replay oseq should be less than 0xFFFFFFFF in non-ESN mode for output SA"); + return -EINVAL; + } + } else { + if (rs->oseq == U32_MAX && rs->oseq_hi == U32_MAX) { + NL_SET_ERR_MSG( + extack, + "Replay oseq and oseq_hi should be less than 0xFFFFFFFF for output SA"); + return -EINVAL; + } } if (rs->bmp_len) { NL_SET_ERR_MSG(extack, "Replay bmp_len should 0 for output SA"); @@ -196,11 +212,27 @@ static inline int verify_replay(struct xfrm_usersa_info *p, "Replay oseq and oseq_hi should be 0 for input SA"); return -EINVAL; } - if (rs->seq_hi && !(p->flags & XFRM_STATE_ESN)) { - NL_SET_ERR_MSG( - extack, - "Replay seq_hi should be 0 in non-ESN mode for input SA"); - return -EINVAL; + if (!(p->flags & XFRM_STATE_ESN)) { + if (rs->seq_hi) { + NL_SET_ERR_MSG( + extack, + "Replay seq_hi should be 0 in non-ESN mode for input SA"); + return -EINVAL; + } + + if (rs->seq == U32_MAX) { + NL_SET_ERR_MSG( + extack, + "Replay seq should be less than 0xFFFFFFFF in non-ESN mode for input SA"); + return -EINVAL; + } + } else { + if (rs->seq == U32_MAX && rs->seq_hi == U32_MAX) { + NL_SET_ERR_MSG( + extack, + "Replay seq and seq_hi should be less than 0xFFFFFFFF for input SA"); + return -EINVAL; + } } } -- GitLab From 01ed9a06e59091beada219235df5040e741e9e28 Mon Sep 17 00:00:00 2001 From: Jason Xing Date: Sat, 10 May 2025 21:48:10 +0800 Subject: [PATCH 1436/2211] net: atlantic: generate software timestamp just before the doorbell [ Upstream commit 285ad7477559b6b5ceed10ba7ecfed9d17c0e7c6 ] Make sure the call of skb_tx_timestamp is as close as possible to the doorbell. Signed-off-by: Jason Xing Link: https://patch.msgid.link/20250510134812.48199-2-kerneljasonxing@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/aquantia/atlantic/aq_main.c | 1 - drivers/net/ethernet/aquantia/atlantic/aq_nic.c | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_main.c b/drivers/net/ethernet/aquantia/atlantic/aq_main.c index c1d1673c5749d..b565189e59139 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_main.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_main.c @@ -123,7 +123,6 @@ static netdev_tx_t aq_ndev_start_xmit(struct sk_buff *skb, struct net_device *nd } #endif - skb_tx_timestamp(skb); return aq_nic_xmit(aq_nic, skb); } diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c index 71e50fc65c147..b0994bd05874a 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c @@ -898,6 +898,8 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb) frags = aq_nic_map_skb(self, skb, ring); + skb_tx_timestamp(skb); + if (likely(frags)) { err = self->aq_hw_ops->hw_ring_tx_xmit(self->aq_hw, ring, frags); -- GitLab From 461d5a73ae45fbe6c300a6e64600f9792684eb52 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Wed, 14 May 2025 21:18:38 +0200 Subject: [PATCH 1437/2211] pinctrl: armada-37xx: propagate error from armada_37xx_pmx_set_by_name() [ Upstream commit 4229c28323db141eda69cb99427be75d3edba071 ] The regmap_update_bits() function can fail, so propagate its error up to the stack instead of silently ignoring that. Signed-off-by: Imre Kaloz Reviewed-by: Andrew Lunn Signed-off-by: Gabor Juhos Link: https://lore.kernel.org/20250514-pinctrl-a37xx-fixes-v2-7-07e9ac1ab737@gmail.com Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c index 4ce11c74fec1f..aa6bb1c0d9fa7 100644 --- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c @@ -358,9 +358,7 @@ static int armada_37xx_pmx_set_by_name(struct pinctrl_dev *pctldev, val = grp->val[func]; - regmap_update_bits(info->regmap, reg, mask, val); - - return 0; + return regmap_update_bits(info->regmap, reg, mask, val); } static int armada_37xx_pmx_set(struct pinctrl_dev *pctldev, -- GitLab From aefe45843ea667366e35df4fcfef5ff9051a86c9 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Wed, 14 May 2025 21:18:37 +0200 Subject: [PATCH 1438/2211] pinctrl: armada-37xx: propagate error from armada_37xx_gpio_get_direction() [ Upstream commit 6481c0a83367b0672951ccc876fbae7ee37b594b ] The regmap_read() function can fail, so propagate its error up to the stack instead of silently ignoring that. Signed-off-by: Imre Kaloz Reviewed-by: Andrew Lunn Signed-off-by: Gabor Juhos Link: https://lore.kernel.org/20250514-pinctrl-a37xx-fixes-v2-6-07e9ac1ab737@gmail.com Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c index aa6bb1c0d9fa7..c8437d45a3135 100644 --- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c @@ -400,10 +400,13 @@ static int armada_37xx_gpio_get_direction(struct gpio_chip *chip, struct armada_37xx_pinctrl *info = gpiochip_get_data(chip); unsigned int reg = OUTPUT_EN; unsigned int val, mask; + int ret; armada_37xx_update_reg(®, &offset); mask = BIT(offset); - regmap_read(info->regmap, reg, &val); + ret = regmap_read(info->regmap, reg, &val); + if (ret) + return ret; if (val & mask) return GPIO_LINE_DIRECTION_OUT; -- GitLab From 8fdf2f79ebf06b7ebe720a8e621a967ad54a0b3c Mon Sep 17 00:00:00 2001 From: Ilya Leoshkevich Date: Mon, 12 May 2025 22:57:30 +0200 Subject: [PATCH 1439/2211] bpf: Pass the same orig_call value to trampoline functions [ Upstream commit 94bde253d3ae5d8a01cb958663b12daef1d06574 ] There is currently some confusion in the s390x JIT regarding whether orig_call can be NULL and what that means. Originally the NULL value was used to distinguish the struct_ops case, but this was superseded by BPF_TRAMP_F_INDIRECT (see commit 0c970ed2f87c ("s390/bpf: Fix indirect trampoline generation"). The remaining reason to have this check is that NULL can actually be passed to the arch_bpf_trampoline_size() call - but not to the respective arch_prepare_bpf_trampoline()! call - by bpf_struct_ops_prepare_trampoline(). Remove this asymmetry by passing stub_func to both functions, so that JITs may rely on orig_call never being NULL. Signed-off-by: Ilya Leoshkevich Acked-by: Martin KaFai Lau Link: https://lore.kernel.org/r/20250512221911.61314-2-iii@linux.ibm.com Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- kernel/bpf/bpf_struct_ops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/bpf/bpf_struct_ops.c b/kernel/bpf/bpf_struct_ops.c index 477947456371a..2285b27ce68c7 100644 --- a/kernel/bpf/bpf_struct_ops.c +++ b/kernel/bpf/bpf_struct_ops.c @@ -577,7 +577,7 @@ int bpf_struct_ops_prepare_trampoline(struct bpf_tramp_links *tlinks, if (model->ret_size > 0) flags |= BPF_TRAMP_F_RET_FENTRY_RET; - size = arch_bpf_trampoline_size(model, flags, tlinks, NULL); + size = arch_bpf_trampoline_size(model, flags, tlinks, stub_func); if (size <= 0) return size ? : -EFAULT; -- GitLab From b241b5fde0ef04ea294d625574a16c350b041b58 Mon Sep 17 00:00:00 2001 From: Jason Xing Date: Sat, 10 May 2025 21:48:12 +0800 Subject: [PATCH 1440/2211] net: stmmac: generate software timestamp just before the doorbell [ Upstream commit 33d4cc81fcd930fdbcca7ac9e8959225cbec0a5e ] Make sure the call of skb_tx_timestamp is as close as possbile to the doorbell. The patch also adjusts the order of setting SKBTX_IN_PROGRESS and generate software timestamp so that without SOF_TIMESTAMPING_OPT_TX_SWHW being set the software and hardware timestamps will not appear in the error queue of socket nearly at the same time (Please see __skb_tstamp_tx()). Signed-off-by: Jason Xing Link: https://patch.msgid.link/20250510134812.48199-4-kerneljasonxing@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index f68e3ece919cc..0250c5cb28ff2 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -4424,8 +4424,6 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) if (priv->sarc_type) stmmac_set_desc_sarc(priv, first, priv->sarc_type); - skb_tx_timestamp(skb); - if (unlikely((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && priv->hwts_tx_en)) { /* declare that device is doing timestamping */ @@ -4460,6 +4458,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) } netdev_tx_sent_queue(netdev_get_tx_queue(dev, queue), skb->len); + skb_tx_timestamp(skb); stmmac_flush_tx_descriptors(priv, queue); stmmac_tx_timer_arm(priv, queue); @@ -4703,8 +4702,6 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) if (priv->sarc_type) stmmac_set_desc_sarc(priv, first, priv->sarc_type); - skb_tx_timestamp(skb); - /* Ready to fill the first descriptor and set the OWN bit w/o any * problems because all the descriptors are actually ready to be * passed to the DMA engine. @@ -4751,7 +4748,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) netdev_tx_sent_queue(netdev_get_tx_queue(dev, queue), skb->len); stmmac_enable_dma_transmission(priv, priv->ioaddr, queue); - + skb_tx_timestamp(skb); stmmac_flush_tx_descriptors(priv, queue); stmmac_tx_timer_arm(priv, queue); -- GitLab From 133f17922b3dbae44fe583fb898b92b03558a657 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Wed, 14 May 2025 21:18:36 +0200 Subject: [PATCH 1441/2211] pinctrl: armada-37xx: propagate error from armada_37xx_pmx_gpio_set_direction() [ Upstream commit bfa0ff804ffa8b1246ade8be08de98c9eb19d16f ] The armada_37xx_gpio_direction_{in,out}put() functions can fail, so propagate their error values back to the stack instead of silently ignoring those. Signed-off-by: Imre Kaloz Reviewed-by: Andrew Lunn Signed-off-by: Gabor Juhos Link: https://lore.kernel.org/20250514-pinctrl-a37xx-fixes-v2-5-07e9ac1ab737@gmail.com Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c index c8437d45a3135..f242d24d72b8d 100644 --- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c @@ -472,16 +472,17 @@ static int armada_37xx_pmx_gpio_set_direction(struct pinctrl_dev *pctldev, { struct armada_37xx_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); struct gpio_chip *chip = range->gc; + int ret; dev_dbg(info->dev, "gpio_direction for pin %u as %s-%d to %s\n", offset, range->name, offset, input ? "input" : "output"); if (input) - armada_37xx_gpio_direction_input(chip, offset); + ret = armada_37xx_gpio_direction_input(chip, offset); else - armada_37xx_gpio_direction_output(chip, offset, 0); + ret = armada_37xx_gpio_direction_output(chip, offset, 0); - return 0; + return ret; } static int armada_37xx_gpio_request_enable(struct pinctrl_dev *pctldev, -- GitLab From ddead1832f0ac9ce35a84e6f35cf5907671fcbd5 Mon Sep 17 00:00:00 2001 From: Mykyta Yatsenko Date: Wed, 14 May 2025 12:32:20 +0100 Subject: [PATCH 1442/2211] libbpf: Check bpf_map_skeleton link for NULL [ Upstream commit d0445d7dd3fd9b15af7564c38d7aa3cbc29778ee ] Avoid dereferencing bpf_map_skeleton's link field if it's NULL. If BPF map skeleton is created with the size, that indicates containing link field, but the field was not actually initialized with valid bpf_link pointer, libbpf crashes. This may happen when using libbpf-rs skeleton. Skeleton loading may still progress, but user needs to attach struct_ops map separately. Signed-off-by: Mykyta Yatsenko Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250514113220.219095-1-mykyta.yatsenko5@gmail.com Signed-off-by: Sasha Levin --- tools/lib/bpf/libbpf.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index bb24f6bac2073..1290314da6761 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -13971,6 +13971,12 @@ int bpf_object__attach_skeleton(struct bpf_object_skeleton *s) } link = map_skel->link; + if (!link) { + pr_warn("map '%s': BPF map skeleton link is uninitialized\n", + bpf_map__name(map)); + continue; + } + if (*link) continue; -- GitLab From 2cd2022c38fa26257cc6eec100ae122de9c1541c Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Wed, 14 May 2025 21:18:35 +0200 Subject: [PATCH 1443/2211] pinctrl: armada-37xx: propagate error from armada_37xx_gpio_get() [ Upstream commit 57273ff8bb16f3842c2597b5bbcd49e7fa12edf7 ] The regmap_read() function can fail, so propagate its error up to the stack instead of silently ignoring that. Signed-off-by: Imre Kaloz Reviewed-by: Andrew Lunn Signed-off-by: Gabor Juhos Link: https://lore.kernel.org/20250514-pinctrl-a37xx-fixes-v2-4-07e9ac1ab737@gmail.com Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c index f242d24d72b8d..53b6eb7486593 100644 --- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c @@ -443,11 +443,14 @@ static int armada_37xx_gpio_get(struct gpio_chip *chip, unsigned int offset) struct armada_37xx_pinctrl *info = gpiochip_get_data(chip); unsigned int reg = INPUT_VAL; unsigned int val, mask; + int ret; armada_37xx_update_reg(®, &offset); mask = BIT(offset); - regmap_read(info->regmap, reg, &val); + ret = regmap_read(info->regmap, reg, &val); + if (ret) + return ret; return (val & mask) != 0; } -- GitLab From 4d19bf267430a0d0cc2e4c5af180f0bb9c0eb0be Mon Sep 17 00:00:00 2001 From: Jason Xing Date: Sat, 10 May 2025 17:34:42 +0800 Subject: [PATCH 1444/2211] net: mlx4: add SOF_TIMESTAMPING_TX_SOFTWARE flag when getting ts info [ Upstream commit b86bcfee30576b752302c55693fff97242b35dfd ] As mlx4 has implemented skb_tx_timestamp() in mlx4_en_xmit(), the SOFTWARE flag is surely needed when users are trying to get timestamp information. Signed-off-by: Jason Xing Reviewed-by: Tariq Toukan Link: https://patch.msgid.link/20250510093442.79711-1-kerneljasonxing@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c index cd17a3f4faf83..a68cd3f0304c6 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c @@ -1897,6 +1897,7 @@ static int mlx4_en_get_ts_info(struct net_device *dev, if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS) { info->so_timestamping |= SOF_TIMESTAMPING_TX_HARDWARE | + SOF_TIMESTAMPING_TX_SOFTWARE | SOF_TIMESTAMPING_RX_HARDWARE | SOF_TIMESTAMPING_RAW_HARDWARE; -- GitLab From 07693edecfa137b0a8b065ec2d283461a961be68 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Fri, 9 May 2025 14:04:34 +0200 Subject: [PATCH 1445/2211] net: vertexcom: mse102x: Return code for mse102x_rx_pkt_spi [ Upstream commit 4ecf56f4b66011b583644bf9a62188d05dfcd78c ] The MSE102x doesn't provide any interrupt register, so the only way to handle the level interrupt is to fetch the whole packet from the MSE102x internal buffer via SPI. So in cases the interrupt handler fails to do this, it should return IRQ_NONE. This allows the core to disable the interrupt in case the issue persists and prevent an interrupt storm. Signed-off-by: Stefan Wahren Link: https://patch.msgid.link/20250509120435.43646-6-wahrenst@gmx.net Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/vertexcom/mse102x.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/vertexcom/mse102x.c b/drivers/net/ethernet/vertexcom/mse102x.c index e4d993f313740..545177e84c0eb 100644 --- a/drivers/net/ethernet/vertexcom/mse102x.c +++ b/drivers/net/ethernet/vertexcom/mse102x.c @@ -306,7 +306,7 @@ static void mse102x_dump_packet(const char *msg, int len, const char *data) data, len, true); } -static void mse102x_rx_pkt_spi(struct mse102x_net *mse) +static irqreturn_t mse102x_rx_pkt_spi(struct mse102x_net *mse) { struct sk_buff *skb; unsigned int rxalign; @@ -327,7 +327,7 @@ static void mse102x_rx_pkt_spi(struct mse102x_net *mse) mse102x_tx_cmd_spi(mse, CMD_CTR); ret = mse102x_rx_cmd_spi(mse, (u8 *)&rx); if (ret) - return; + return IRQ_NONE; cmd_resp = be16_to_cpu(rx); if ((cmd_resp & CMD_MASK) != CMD_RTS) { @@ -360,7 +360,7 @@ drop: rxalign = ALIGN(rxlen + DET_SOF_LEN + DET_DFT_LEN, 4); skb = netdev_alloc_skb_ip_align(mse->ndev, rxalign); if (!skb) - return; + return IRQ_NONE; /* 2 bytes Start of frame (before ethernet header) * 2 bytes Data frame tail (after ethernet frame) @@ -370,7 +370,7 @@ drop: if (mse102x_rx_frame_spi(mse, rxpkt, rxlen, drop)) { mse->ndev->stats.rx_errors++; dev_kfree_skb(skb); - return; + return IRQ_HANDLED; } if (netif_msg_pktdata(mse)) @@ -381,6 +381,8 @@ drop: mse->ndev->stats.rx_packets++; mse->ndev->stats.rx_bytes += rxlen; + + return IRQ_HANDLED; } static int mse102x_tx_pkt_spi(struct mse102x_net *mse, struct sk_buff *txb, @@ -512,12 +514,13 @@ static irqreturn_t mse102x_irq(int irq, void *_mse) { struct mse102x_net *mse = _mse; struct mse102x_net_spi *mses = to_mse102x_spi(mse); + irqreturn_t ret; mutex_lock(&mses->lock); - mse102x_rx_pkt_spi(mse); + ret = mse102x_rx_pkt_spi(mse); mutex_unlock(&mses->lock); - return IRQ_HANDLED; + return ret; } static int mse102x_net_open(struct net_device *ndev) -- GitLab From bc4abf1f2fb0e2aa01046be3c0dfc9679899ae1a Mon Sep 17 00:00:00 2001 From: Salah Triki Date: Sun, 27 Apr 2025 10:57:45 +0100 Subject: [PATCH 1446/2211] wireless: purelifi: plfxlc: fix memory leak in plfxlc_usb_wreq_asyn() [ Upstream commit 63a9a727d373fa5b8ce509eef50dbc45e0f745b9 ] Add usb_free_urb() in the error path to prevent memory leak. Signed-off-by: Salah Triki Link: https://patch.msgid.link/aA3_maPlEJzO7wrL@pc [fix subject] Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/purelifi/plfxlc/usb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/purelifi/plfxlc/usb.c b/drivers/net/wireless/purelifi/plfxlc/usb.c index 56d1139ba8bcc..7e7bfa532ed25 100644 --- a/drivers/net/wireless/purelifi/plfxlc/usb.c +++ b/drivers/net/wireless/purelifi/plfxlc/usb.c @@ -503,8 +503,10 @@ int plfxlc_usb_wreq_async(struct plfxlc_usb *usb, const u8 *buffer, (void *)buffer, buffer_len, complete_fn, context); r = usb_submit_urb(urb, GFP_ATOMIC); - if (r) + if (r) { + usb_free_urb(urb); dev_err(&udev->dev, "Async write submit failed (%d)\n", r); + } return r; } -- GitLab From 4c43d2c649269e91a81cbc6b2d6b7c552d3eeb45 Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Wed, 30 Apr 2025 21:10:42 +0200 Subject: [PATCH 1447/2211] wifi: mac80211: do not offer a mesh path if forwarding is disabled [ Upstream commit cf1b684a06170d253b47d6a5287821de976435bd ] When processing a PREQ the code would always check whether we have a mesh path locally and reply accordingly. However, when forwarding is disabled then we should not reply with this information as we will not forward data packets down that path. Move the check for dot11MeshForwarding up in the function and skip the mesh path lookup in that case. In the else block, set forward to false so that the rest of the function becomes a no-op and the dot11MeshForwarding check does not need to be duplicated. This explains an effect observed in the Freifunk community where mesh forwarding is disabled. In that case a mesh with three STAs and only bad links in between them, individual STAs would occionally have indirect mpath entries. This should not have happened. Signed-off-by: Benjamin Berg Reviewed-by: Rouven Czerwinski Link: https://patch.msgid.link/20250430191042.3287004-1-benjamin@sipsolutions.net Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- net/mac80211/mesh_hwmp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c index 2922a9fec950d..ba8aeb47bffd7 100644 --- a/net/mac80211/mesh_hwmp.c +++ b/net/mac80211/mesh_hwmp.c @@ -636,7 +636,7 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata, mesh_path_add_gate(mpath); } rcu_read_unlock(); - } else { + } else if (ifmsh->mshcfg.dot11MeshForwarding) { rcu_read_lock(); mpath = mesh_path_lookup(sdata, target_addr); if (mpath) { @@ -654,6 +654,8 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata, } } rcu_read_unlock(); + } else { + forward = false; } if (reply) { @@ -671,7 +673,7 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata, } } - if (forward && ifmsh->mshcfg.dot11MeshForwarding) { + if (forward) { u32 preq_id; u8 hopcount; -- GitLab From 6f84ec0a5ac7e54e58b1ec3d06801278772bd5eb Mon Sep 17 00:00:00 2001 From: Heiko Stuebner Date: Sat, 3 May 2025 22:25:31 +0200 Subject: [PATCH 1448/2211] clk: rockchip: rk3036: mark ddrphy as critical [ Upstream commit 596a977b34a722c00245801a5774aa79cec4e81d ] The ddrphy is supplied by the dpll, but due to the limited number of PLLs on the rk3036, the dpll also is used for other periperhals, like the GPU. So it happened, when the Lima driver turned off the gpu clock, this in turn also disabled the dpll and thus the ram. Signed-off-by: Heiko Stuebner Link: https://lore.kernel.org/r/20250503202532.992033-4-heiko@sntech.de Signed-off-by: Sasha Levin --- drivers/clk/rockchip/clk-rk3036.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/clk/rockchip/clk-rk3036.c b/drivers/clk/rockchip/clk-rk3036.c index d341ce0708aac..e4af3a9286379 100644 --- a/drivers/clk/rockchip/clk-rk3036.c +++ b/drivers/clk/rockchip/clk-rk3036.c @@ -431,6 +431,7 @@ static const char *const rk3036_critical_clocks[] __initconst = { "hclk_peri", "pclk_peri", "pclk_ddrupctl", + "ddrphy", }; static void __init rk3036_clk_init(struct device_node *np) -- GitLab From ff38cf0bd888fe15789a7193d07c4a876388d520 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" Date: Sun, 23 Mar 2025 15:34:20 +1300 Subject: [PATCH 1449/2211] hid-asus: check ROG Ally MCU version and warn MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 00e005c952f74f50a3f86af96f56877be4685e14 ] ASUS have fixed suspend issues arising from a flag not being cleared in the MCU FW in both the ROG Ally 1 and the ROG Ally X. Implement a check and a warning to encourage users to update the FW to a minimum supported version. Signed-off-by: Luke D. Jones Reviewed-by: Mario Limonciello Link: https://lore.kernel.org/r/20250323023421.78012-2-luke@ljones.dev Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/hid/hid-asus.c | 107 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 2 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index bcdd168cdc6d7..c5bdf0f1b32f7 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -52,6 +52,10 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define FEATURE_KBD_LED_REPORT_ID1 0x5d #define FEATURE_KBD_LED_REPORT_ID2 0x5e +#define ROG_ALLY_REPORT_SIZE 64 +#define ROG_ALLY_X_MIN_MCU 313 +#define ROG_ALLY_MIN_MCU 319 + #define SUPPORT_KBD_BACKLIGHT BIT(0) #define MAX_TOUCH_MAJOR 8 @@ -84,6 +88,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define QUIRK_MEDION_E1239T BIT(10) #define QUIRK_ROG_NKEY_KEYBOARD BIT(11) #define QUIRK_ROG_CLAYMORE_II_KEYBOARD BIT(12) +#define QUIRK_ROG_ALLY_XPAD BIT(13) #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ QUIRK_NO_INIT_REPORTS | \ @@ -534,9 +539,99 @@ static bool asus_kbd_wmi_led_control_present(struct hid_device *hdev) return !!(value & ASUS_WMI_DSTS_PRESENCE_BIT); } +/* + * We don't care about any other part of the string except the version section. + * Example strings: FGA80100.RC72LA.312_T01, FGA80100.RC71LS.318_T01 + * The bytes "5a 05 03 31 00 1a 13" and possibly more come before the version + * string, and there may be additional bytes after the version string such as + * "75 00 74 00 65 00" or a postfix such as "_T01" + */ +static int mcu_parse_version_string(const u8 *response, size_t response_size) +{ + const u8 *end = response + response_size; + const u8 *p = response; + int dots, err, version; + char buf[4]; + + dots = 0; + while (p < end && dots < 2) { + if (*p++ == '.') + dots++; + } + + if (dots != 2 || p >= end || (p + 3) >= end) + return -EINVAL; + + memcpy(buf, p, 3); + buf[3] = '\0'; + + err = kstrtoint(buf, 10, &version); + if (err || version < 0) + return -EINVAL; + + return version; +} + +static int mcu_request_version(struct hid_device *hdev) +{ + u8 *response __free(kfree) = kzalloc(ROG_ALLY_REPORT_SIZE, GFP_KERNEL); + const u8 request[] = { 0x5a, 0x05, 0x03, 0x31, 0x00, 0x20 }; + int ret; + + if (!response) + return -ENOMEM; + + ret = asus_kbd_set_report(hdev, request, sizeof(request)); + if (ret < 0) + return ret; + + ret = hid_hw_raw_request(hdev, FEATURE_REPORT_ID, response, + ROG_ALLY_REPORT_SIZE, HID_FEATURE_REPORT, + HID_REQ_GET_REPORT); + if (ret < 0) + return ret; + + ret = mcu_parse_version_string(response, ROG_ALLY_REPORT_SIZE); + if (ret < 0) { + pr_err("Failed to parse MCU version: %d\n", ret); + print_hex_dump(KERN_ERR, "MCU: ", DUMP_PREFIX_NONE, + 16, 1, response, ROG_ALLY_REPORT_SIZE, false); + } + + return ret; +} + +static void validate_mcu_fw_version(struct hid_device *hdev, int idProduct) +{ + int min_version, version; + + version = mcu_request_version(hdev); + if (version < 0) + return; + + switch (idProduct) { + case USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY: + min_version = ROG_ALLY_MIN_MCU; + break; + case USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY_X: + min_version = ROG_ALLY_X_MIN_MCU; + break; + default: + min_version = 0; + } + + if (version < min_version) { + hid_warn(hdev, + "The MCU firmware version must be %d or greater to avoid issues with suspend.\n", + min_version); + } +} + static int asus_kbd_register_leds(struct hid_device *hdev) { struct asus_drvdata *drvdata = hid_get_drvdata(hdev); + struct usb_interface *intf; + struct usb_device *udev; unsigned char kbd_func; int ret; @@ -560,6 +655,14 @@ static int asus_kbd_register_leds(struct hid_device *hdev) if (ret < 0) return ret; } + + if (drvdata->quirks & QUIRK_ROG_ALLY_XPAD) { + intf = to_usb_interface(hdev->dev.parent); + udev = interface_to_usbdev(intf); + validate_mcu_fw_version(hdev, + le16_to_cpu(udev->descriptor.idProduct)); + } + } else { /* Initialize keyboard */ ret = asus_kbd_init(hdev, FEATURE_KBD_REPORT_ID); @@ -1280,10 +1383,10 @@ static const struct hid_device_id asus_devices[] = { QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY), - QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, + QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD | QUIRK_ROG_ALLY_XPAD}, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY_X), - QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, + QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD | QUIRK_ROG_ALLY_XPAD }, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD), QUIRK_ROG_CLAYMORE_II_KEYBOARD }, -- GitLab From 85d6986da04efdbbb23d6476fa3871c3539246e8 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Mon, 5 May 2025 21:56:47 +0300 Subject: [PATCH 1450/2211] wifi: iwlwifi: mvm: fix beacon CCK flag [ Upstream commit 8d7f08922a8cb621aa5d00bdce6a7afe57af1665 ] The beacon CCK flag should be set for any CCK rate, not just for 1 Mbps. Fix that. Signed-off-by: Johannes Berg Reviewed-by: Ilan Peer Link: https://patch.msgid.link/20250505215513.fe18b7d92d7d.I7bb40a92cea102677b695beb1e2a62a5ea72678b@changeid Signed-off-by: Miri Korenblit Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c index e96ddaeeeeff5..d013de30e7ed6 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* - * Copyright (C) 2012-2014, 2018-2024 Intel Corporation + * Copyright (C) 2012-2014, 2018-2025 Intel Corporation * Copyright (C) 2013-2014 Intel Mobile Communications GmbH * Copyright (C) 2015-2017 Intel Deutschland GmbH */ @@ -962,7 +962,7 @@ u16 iwl_mvm_mac_ctxt_get_beacon_flags(const struct iwl_fw *fw, u8 rate_idx) u16 flags = iwl_mvm_mac80211_idx_to_hwrate(fw, rate_idx); bool is_new_rate = iwl_fw_lookup_cmd_ver(fw, BEACON_TEMPLATE_CMD, 0) > 10; - if (rate_idx <= IWL_FIRST_CCK_RATE) + if (rate_idx <= IWL_LAST_CCK_RATE) flags |= is_new_rate ? IWL_MAC_BEACON_CCK : IWL_MAC_BEACON_CCK_V1; -- GitLab From f0023d7a2a86999c8e1300e911d92f995a5310a8 Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Tue, 22 Apr 2025 19:56:38 +0800 Subject: [PATCH 1451/2211] f2fs: fix to bail out in get_new_segment() [ Upstream commit bb5eb8a5b222fa5092f60d5555867a05ebc3bdf2 ] ------------[ cut here ]------------ WARNING: CPU: 3 PID: 579 at fs/f2fs/segment.c:2832 new_curseg+0x5e8/0x6dc pc : new_curseg+0x5e8/0x6dc Call trace: new_curseg+0x5e8/0x6dc f2fs_allocate_data_block+0xa54/0xe28 do_write_page+0x6c/0x194 f2fs_do_write_node_page+0x38/0x78 __write_node_page+0x248/0x6d4 f2fs_sync_node_pages+0x524/0x72c f2fs_write_checkpoint+0x4bc/0x9b0 __checkpoint_and_complete_reqs+0x80/0x244 issue_checkpoint_thread+0x8c/0xec kthread+0x114/0x1bc ret_from_fork+0x10/0x20 get_new_segment() detects inconsistent status in between free_segmap and free_secmap, let's record such error into super block, and bail out get_new_segment() instead of continue using the segment. Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/segment.c | 6 +++++- include/linux/f2fs_fs.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index b9ffb2ee9548a..769a90b609e2c 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -2772,7 +2772,11 @@ find_other_zone: } got_it: /* set it as dirty segment in free segmap */ - f2fs_bug_on(sbi, test_bit(segno, free_i->free_segmap)); + if (test_bit(segno, free_i->free_segmap)) { + ret = -EFSCORRUPTED; + f2fs_stop_checkpoint(sbi, false, STOP_CP_REASON_CORRUPTED_FREE_BITMAP); + goto out_unlock; + } /* no free section in conventional zone */ if (new_sec && pinning && diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h index c24f8bc01045d..5206d63b33860 100644 --- a/include/linux/f2fs_fs.h +++ b/include/linux/f2fs_fs.h @@ -78,6 +78,7 @@ enum stop_cp_reason { STOP_CP_REASON_UPDATE_INODE, STOP_CP_REASON_FLUSH_FAIL, STOP_CP_REASON_NO_SEGMENT, + STOP_CP_REASON_CORRUPTED_FREE_BITMAP, STOP_CP_REASON_MAX, }; -- GitLab From 0ab3de047808f375a36cd345225572eb3366f3c6 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Tue, 22 Apr 2025 21:52:44 +0200 Subject: [PATCH 1452/2211] netfilter: nft_set_pipapo: clamp maximum map bucket size to INT_MAX [ Upstream commit b85e3367a5716ed3662a4fe266525190d2af76df ] Otherwise, it is possible to hit WARN_ON_ONCE in __kvmalloc_node_noprof() when resizing hashtable because __GFP_NOWARN is unset. Similar to: b541ba7d1f5a ("netfilter: conntrack: clamp maximum hashtable size to INT_MAX") Reviewed-by: Stefano Brivio Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- net/netfilter/nft_set_pipapo.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/net/netfilter/nft_set_pipapo.c b/net/netfilter/nft_set_pipapo.c index 0529e4ef75207..c5855069bdaba 100644 --- a/net/netfilter/nft_set_pipapo.c +++ b/net/netfilter/nft_set_pipapo.c @@ -663,6 +663,9 @@ static int pipapo_realloc_mt(struct nft_pipapo_field *f, check_add_overflow(rules, extra, &rules_alloc)) return -EOVERFLOW; + if (rules_alloc > (INT_MAX / sizeof(*new_mt))) + return -ENOMEM; + new_mt = kvmalloc_array(rules_alloc, sizeof(*new_mt), GFP_KERNEL_ACCOUNT); if (!new_mt) return -ENOMEM; @@ -1499,6 +1502,9 @@ static struct nft_pipapo_match *pipapo_clone(struct nft_pipapo_match *old) src->groups * NFT_PIPAPO_BUCKETS(src->bb)); if (src->rules > 0) { + if (src->rules_alloc > (INT_MAX / sizeof(*src->mt))) + goto out_mt; + dst->mt = kvmalloc_array(src->rules_alloc, sizeof(*src->mt), GFP_KERNEL_ACCOUNT); -- GitLab From d003ff1f0a32e23af89a5d632c99bc27ddfc93c7 Mon Sep 17 00:00:00 2001 From: Alan Maguire Date: Tue, 29 Apr 2025 17:10:42 +0100 Subject: [PATCH 1453/2211] libbpf: Add identical pointer detection to btf_dedup_is_equiv() [ Upstream commit 8e64c387c942229c551d0f23de4d9993d3a2acb6 ] Recently as a side-effect of commit ac053946f5c4 ("compiler.h: introduce TYPEOF_UNQUAL() macro") issues were observed in deduplication between modules and kernel BTF such that a large number of kernel types were not deduplicated so were found in module BTF (task_struct, bpf_prog etc). The root cause appeared to be a failure to dedup struct types, specifically those with members that were pointers with __percpu annotations. The issue in dedup is at the point that we are deduplicating structures, we have not yet deduplicated reference types like pointers. If multiple copies of a pointer point at the same (deduplicated) integer as in this case, we do not see them as identical. Special handling already exists to deal with structures and arrays, so add pointer handling here too. Reported-by: Alexei Starovoitov Signed-off-by: Alan Maguire Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250429161042.2069678-1-alan.maguire@oracle.com Signed-off-by: Sasha Levin --- tools/lib/bpf/btf.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c index 4a486798fe4c0..b770702dab372 100644 --- a/tools/lib/bpf/btf.c +++ b/tools/lib/bpf/btf.c @@ -4176,6 +4176,19 @@ static bool btf_dedup_identical_structs(struct btf_dedup *d, __u32 id1, __u32 id return true; } +static bool btf_dedup_identical_ptrs(struct btf_dedup *d, __u32 id1, __u32 id2) +{ + struct btf_type *t1, *t2; + + t1 = btf_type_by_id(d->btf, id1); + t2 = btf_type_by_id(d->btf, id2); + + if (!btf_is_ptr(t1) || !btf_is_ptr(t2)) + return false; + + return t1->type == t2->type; +} + /* * Check equivalence of BTF type graph formed by candidate struct/union (we'll * call it "candidate graph" in this description for brevity) to a type graph @@ -4308,6 +4321,9 @@ static int btf_dedup_is_equiv(struct btf_dedup *d, __u32 cand_id, */ if (btf_dedup_identical_structs(d, hypot_type_id, cand_id)) return 1; + /* A similar case is again observed for PTRs. */ + if (btf_dedup_identical_ptrs(d, hypot_type_id, cand_id)) + return 1; return 0; } -- GitLab From ab3f6cf370a3838ddbede04882be09d13958aec7 Mon Sep 17 00:00:00 2001 From: Justin Tee Date: Fri, 25 Apr 2025 12:47:59 -0700 Subject: [PATCH 1454/2211] scsi: lpfc: Fix lpfc_check_sli_ndlp() handling for GEN_REQUEST64 commands [ Upstream commit 05ae6c9c7315d844fbc15afe393f5ba5e5771126 ] In lpfc_check_sli_ndlp(), the get_job_els_rsp64_did remote_id assignment does not apply for GEN_REQUEST64 commands as it only has meaning for a ELS_REQUEST64 command. So, if (iocb->ndlp == ndlp) is false, we could erroneously return the wrong value. Fix by replacing the fallthrough statement with a break statement before the remote_id check. Signed-off-by: Justin Tee Link: https://lore.kernel.org/r/20250425194806.3585-2-justintee8345@gmail.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/lpfc/lpfc_hbadisc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index f2e4237ff3d99..34f77b250387c 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -5082,7 +5082,7 @@ lpfc_check_sli_ndlp(struct lpfc_hba *phba, case CMD_GEN_REQUEST64_CR: if (iocb->ndlp == ndlp) return 1; - fallthrough; + break; case CMD_ELS_REQUEST64_CR: if (remote_id == ndlp->nlp_DID) return 1; -- GitLab From 57a85eb1256568fe33af0e40d781cee8cf583f4a Mon Sep 17 00:00:00 2001 From: David Strahan Date: Wed, 23 Apr 2025 13:32:26 -0500 Subject: [PATCH 1455/2211] scsi: smartpqi: Add new PCI IDs [ Upstream commit 01b8bdddcfab035cf70fd9981cb20593564cd15d ] Add in support for more PCI devices. All PCI ID entries in Hex. Add PCI IDs for Ramaxel controllers: VID / DID / SVID / SDID ---- ---- ---- ---- Ramaxel SmartHBA RX8238-16i 9005 028f 1018 8238 Ramaxel SSSRAID card 9005 028f 1f3f 0610 Add PCI ID for Alibaba controller: VID / DID / SVID / SDID ---- ---- ---- ---- HBA AS1340 9005 028f 1ded 3301 Add PCI IDs for Inspur controller: VID / DID / SVID / SDID ---- ---- ---- ---- RT0800M6E2i 9005 028f 1bd4 00a3 Add PCI IDs for Delta controllers: VID / DID / SVID / SDID ---- ---- ---- ---- ThinkSystem 4450-8i SAS/SATA/NVMe PCIe Gen4 9005 028f 1d49 0222 24Gb HBA ThinkSystem 4450-16i SAS/SATA/NVMe PCIe Gen4 9005 028f 1d49 0223 24Gb HBA ThinkSystem 4450-8e SAS/SATA PCIe Gen4 9005 028f 1d49 0224 24Gb HBA ThinkSystem RAID 4450-16e PCIe Gen4 24Gb 9005 028f 1d49 0225 Adapter HBA ThinkSystem RAID 5450-16i PCIe Gen4 24Gb Adapter 9005 028f 1d49 0521 ThinkSystem RAID 9450-8i 4GB Flash PCIe Gen4 9005 028f 1d49 0624 24Gb Adapter ThinkSystem RAID 9450-16i 4GB Flash PCIe Gen4 9005 028f 1d49 0625 24Gb Adapter ThinkSystem RAID 9450-16i 4GB Flash PCIe Gen4 9005 028f 1d49 0626 24Gb Adapter ThinkSystem RAID 9450-32i 8GB Flash PCIe Gen4 9005 028f 1d49 0627 24Gb Adapter ThinkSystem RAID 9450-16e 4GB Flash PCIe Gen4 9005 028f 1d49 0628 24Gb Adapter Add PCI ID for Cloudnine Controller: VID / DID / SVID / SDID ---- ---- ---- ---- SmartHBA P6600-24i 9005 028f 1f51 100b Add PCI IDs for Hurraydata Controllers: VID / DID / SVID / SDID ---- ---- ---- ---- HRDT TrustHBA H4100-8i 9005 028f 207d 4044 HRDT TrustHBA H4100-8e 9005 028f 207d 4054 HRDT TrustHBA H4100-16i 9005 028f 207d 4084 HRDT TrustHBA H4100-16e 9005 028f 207d 4094 HRDT TrustRAID D3152s-8i 9005 028f 207d 4140 HRDT TrustRAID D3154s-8i 9005 028f 207d 4240 Reviewed-by: Scott Benesh Reviewed-by: Scott Teel Reviewed-by: Mike McGowen Signed-off-by: David Strahan Signed-off-by: Don Brace Link: https://lore.kernel.org/r/20250423183229.538572-3-don.brace@microchip.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/smartpqi/smartpqi_init.c | 84 +++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c index 8cc9f924a8ae6..c5a21e369e167 100644 --- a/drivers/scsi/smartpqi/smartpqi_init.c +++ b/drivers/scsi/smartpqi/smartpqi_init.c @@ -9708,6 +9708,10 @@ static const struct pci_device_id pqi_pci_id_table[] = { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, 0x1bd4, 0x0089) }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + 0x1bd4, 0x00a3) + }, { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, 0x1ff9, 0x00a1) @@ -10044,6 +10048,30 @@ static const struct pci_device_id pqi_pci_id_table[] = { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, PCI_VENDOR_ID_ADAPTEC2, 0x14f0) }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + 0x207d, 0x4044) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + 0x207d, 0x4054) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + 0x207d, 0x4084) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + 0x207d, 0x4094) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + 0x207d, 0x4140) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + 0x207d, 0x4240) + }, { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, PCI_VENDOR_ID_ADVANTECH, 0x8312) @@ -10260,6 +10288,14 @@ static const struct pci_device_id pqi_pci_id_table[] = { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, 0x1cc4, 0x0201) }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + 0x1018, 0x8238) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + 0x1f3f, 0x0610) + }, { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, PCI_VENDOR_ID_LENOVO, 0x0220) @@ -10268,10 +10304,30 @@ static const struct pci_device_id pqi_pci_id_table[] = { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, PCI_VENDOR_ID_LENOVO, 0x0221) }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_LENOVO, 0x0222) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_LENOVO, 0x0223) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_LENOVO, 0x0224) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_LENOVO, 0x0225) + }, { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, PCI_VENDOR_ID_LENOVO, 0x0520) }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_LENOVO, 0x0521) + }, { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, PCI_VENDOR_ID_LENOVO, 0x0522) @@ -10292,6 +10348,26 @@ static const struct pci_device_id pqi_pci_id_table[] = { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, PCI_VENDOR_ID_LENOVO, 0x0623) }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_LENOVO, 0x0624) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_LENOVO, 0x0625) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_LENOVO, 0x0626) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_LENOVO, 0x0627) + }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_LENOVO, 0x0628) + }, { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, 0x1014, 0x0718) @@ -10320,6 +10396,10 @@ static const struct pci_device_id pqi_pci_id_table[] = { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, 0x1137, 0x0300) }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + 0x1ded, 0x3301) + }, { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, 0x1ff9, 0x0045) @@ -10468,6 +10548,10 @@ static const struct pci_device_id pqi_pci_id_table[] = { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, 0x1f51, 0x100a) }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + 0x1f51, 0x100b) + }, { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, 0x1f51, 0x100e) -- GitLab From 91ef6a152768bb9a145c6e1f6b7b0482848ca530 Mon Sep 17 00:00:00 2001 From: Sean Christopherson Date: Fri, 14 Mar 2025 20:10:48 -0700 Subject: [PATCH 1456/2211] iommu/amd: Ensure GA log notifier callbacks finish running before module unload [ Upstream commit 94c721ea03c7078163f41dbaa101ac721ddac329 ] Synchronize RCU when unregistering KVM's GA log notifier to ensure all in-flight interrupt handlers complete before KVM-the module is unloaded. Signed-off-by: Sean Christopherson Link: https://lore.kernel.org/r/20250315031048.2374109-1-seanjc@google.com Signed-off-by: Joerg Roedel Signed-off-by: Sasha Levin --- drivers/iommu/amd/iommu.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 4428a9557f295..23e78a034da8f 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -861,6 +861,14 @@ int amd_iommu_register_ga_log_notifier(int (*notifier)(u32)) { iommu_ga_log_notifier = notifier; + /* + * Ensure all in-flight IRQ handlers run to completion before returning + * to the caller, e.g. to ensure module code isn't unloaded while it's + * being executed in the IRQ handler. + */ + if (!notifier) + synchronize_rcu(); + return 0; } EXPORT_SYMBOL(amd_iommu_register_ga_log_notifier); -- GitLab From aa3e56caf6f223e79b8e05ed7b1b0d500d6880bd Mon Sep 17 00:00:00 2001 From: Miri Korenblit Date: Thu, 24 Apr 2025 15:38:30 +0300 Subject: [PATCH 1457/2211] wifi: iwlwifi: pcie: make sure to lock rxq->read [ Upstream commit 1cc2c48c4af81bed5ddbe9f2c9d6e20fa163acf9 ] rxq->read is accessed without the rxq->lock in a few places, Make sure to have the lock there. Signed-off-by: Miri Korenblit Reviewed-by: Emmanuel Grumbach Tested-by: Emmanuel Grumbach Link: https://patch.msgid.link/20250424153620.73725f207aaa.I1a3e4b6c5fd370e029fdacfcdc9ee335788afa98@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c index 18d7d59ae5814..462ebe088b3c1 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c @@ -2726,6 +2726,8 @@ static ssize_t iwl_dbgfs_rx_queue_read(struct file *file, for (i = 0; i < trans->num_rx_queues && pos < bufsz; i++) { struct iwl_rxq *rxq = &trans_pcie->rxq[i]; + spin_lock_bh(&rxq->lock); + pos += scnprintf(buf + pos, bufsz - pos, "queue#: %2d\n", i); pos += scnprintf(buf + pos, bufsz - pos, "\tread: %u\n", @@ -2746,6 +2748,7 @@ static ssize_t iwl_dbgfs_rx_queue_read(struct file *file, pos += scnprintf(buf + pos, bufsz - pos, "\tclosed_rb_num: Not Allocated\n"); } + spin_unlock_bh(&rxq->lock); } ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); kfree(buf); @@ -3410,8 +3413,11 @@ iwl_trans_pcie_dump_data(struct iwl_trans *trans, u32 dump_mask, /* Dump RBs is supported only for pre-9000 devices (1 queue) */ struct iwl_rxq *rxq = &trans_pcie->rxq[0]; /* RBs */ + spin_lock_bh(&rxq->lock); num_rbs = iwl_get_closed_rb_stts(trans, rxq); num_rbs = (num_rbs - rxq->read) & RX_QUEUE_MASK; + spin_unlock_bh(&rxq->lock); + len += num_rbs * (sizeof(*data) + sizeof(struct iwl_fw_error_dump_rb) + (PAGE_SIZE << trans_pcie->rx_page_order)); -- GitLab From f92312f6dd0700ab1ceee175eff7e33c73d450fd Mon Sep 17 00:00:00 2001 From: Kuan-Chung Chen Date: Wed, 16 Apr 2025 16:12:39 +0800 Subject: [PATCH 1458/2211] wifi: rtw89: 8922a: fix TX fail with wrong VCO setting [ Upstream commit 20aac091a15dc7229ef1a268253fe36bb6b2be39 ] An incorrect Voltage Controlled Oscillator (VCO) setting may cause Synthesizer (SYN) unlock, which may lead to a failure in the TX authentication request. Signed-off-by: Kuan-Chung Chen Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20250416081241.36138-3-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw89/rtw8922a_rfk.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922a_rfk.c b/drivers/net/wireless/realtek/rtw89/rtw8922a_rfk.c index 28907df7407d5..c958d6ab24d32 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8922a_rfk.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8922a_rfk.c @@ -77,11 +77,6 @@ void rtw8922a_ctl_band_ch_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, RR_CFGCH_BAND0 | RR_CFGCH_CH); rf_reg[path][i] |= u32_encode_bits(central_ch, RR_CFGCH_CH); - if (band == RTW89_BAND_2G) - rtw89_write_rf(rtwdev, path, RR_SMD, RR_VCO2, 0x0); - else - rtw89_write_rf(rtwdev, path, RR_SMD, RR_VCO2, 0x1); - switch (band) { case RTW89_BAND_2G: default: -- GitLab From 606b577368a2b8239942bf579d100c8db0f0119d Mon Sep 17 00:00:00 2001 From: Edward Adam Davis Date: Wed, 23 Apr 2025 22:15:53 +0800 Subject: [PATCH 1459/2211] wifi: mac80211_hwsim: Prevent tsf from setting if beacon is disabled [ Upstream commit c575f5374be7a5c4be4acb9fe6be3a4669d94674 ] Setting tsf is meaningless if beacon is disabled, so check that beacon is enabled before setting tsf. Reported-by: syzbot+064815c6cd721082a52a@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=064815c6cd721082a52a Tested-by: syzbot+064815c6cd721082a52a@syzkaller.appspotmail.com Signed-off-by: Edward Adam Davis Link: https://patch.msgid.link/tencent_3609AC2EFAAED68CA5A7E3C6D212D1C67806@qq.com Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/virtual/mac80211_hwsim.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c index 4a2b7c9921bc6..6fcc21f596ea7 100644 --- a/drivers/net/wireless/virtual/mac80211_hwsim.c +++ b/drivers/net/wireless/virtual/mac80211_hwsim.c @@ -1229,6 +1229,11 @@ static void mac80211_hwsim_set_tsf(struct ieee80211_hw *hw, /* MLD not supported here */ u32 bcn_int = data->link_data[0].beacon_int; u64 delta = abs(tsf - now); + struct ieee80211_bss_conf *conf; + + conf = link_conf_dereference_protected(vif, data->link_data[0].link_id); + if (conf && !conf->enable_beacon) + return; /* adjust after beaconing with new timestamp at old TBTT */ if (tsf > now) { -- GitLab From 4e42f355c5105050139751b2e843aeed231c4bfc Mon Sep 17 00:00:00 2001 From: Joe Damato Date: Thu, 24 Apr 2025 00:27:31 +0000 Subject: [PATCH 1460/2211] netdevsim: Mark NAPI ID on skb in nsim_rcv [ Upstream commit f71c549b26a33fd62f1e9c7deeba738bfc73fbfc ] Previously, nsim_rcv was not marking the NAPI ID on the skb, leading to applications seeing a napi ID of 0 when using SO_INCOMING_NAPI_ID. To add to the userland confusion, netlink appears to correctly report the NAPI IDs for netdevsim queues but the resulting file descriptor from a call to accept() was reporting a NAPI ID of 0. Signed-off-by: Joe Damato Link: https://patch.msgid.link/20250424002746.16891-2-jdamato@fastly.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/netdevsim/netdev.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c index 79b898311819d..ee2a7b2f6268d 100644 --- a/drivers/net/netdevsim/netdev.c +++ b/drivers/net/netdevsim/netdev.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "netdevsim.h" @@ -341,6 +342,7 @@ static int nsim_rcv(struct nsim_rq *rq, int budget) break; skb = skb_dequeue(&rq->skb_queue); + skb_mark_napi_id(skb, &rq->napi); netif_receive_skb(skb); } -- GitLab From b562ceee43c0ae2fc69143faf49656c668c3f90a Mon Sep 17 00:00:00 2001 From: Vlad Dogaru Date: Tue, 22 Apr 2025 12:25:38 +0300 Subject: [PATCH 1461/2211] net/mlx5: HWS, Fix IP version decision [ Upstream commit 5f2f8d8b6800e4fc760c2eccec9b2bd2cacf80cf ] Unify the check for IP version when creating a definer. A given matcher is deemed to match on IPv6 if any of the higher order (>31) bits of source or destination address mask are set. A single packet cannot mix IP versions between source and destination addresses, so it makes no sense that they would be decided on independently. Signed-off-by: Vlad Dogaru Reviewed-by: Yevgeny Kliteynik Signed-off-by: Mark Bloch Link: https://patch.msgid.link/20250422092540.182091-2-mbloch@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- .../mlx5/core/steering/hws/mlx5hws_definer.c | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c index 72b19b05c0cf4..0d0591ba41fdb 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c @@ -508,9 +508,9 @@ static int hws_definer_conv_outer(struct mlx5hws_definer_conv_data *cd, u32 *match_param) { - bool is_s_ipv6, is_d_ipv6, smac_set, dmac_set; struct mlx5hws_definer_fc *fc = cd->fc; struct mlx5hws_definer_fc *curr_fc; + bool is_ipv6, smac_set, dmac_set; u32 *s_ipv6, *d_ipv6; if (HWS_IS_FLD_SET_SZ(match_param, outer_headers.l4_type, 0x2) || @@ -572,10 +572,10 @@ hws_definer_conv_outer(struct mlx5hws_definer_conv_data *cd, outer_headers.dst_ipv4_dst_ipv6.ipv6_layout); /* Assume IPv6 is used if ipv6 bits are set */ - is_s_ipv6 = s_ipv6[0] || s_ipv6[1] || s_ipv6[2]; - is_d_ipv6 = d_ipv6[0] || d_ipv6[1] || d_ipv6[2]; + is_ipv6 = s_ipv6[0] || s_ipv6[1] || s_ipv6[2] || + d_ipv6[0] || d_ipv6[1] || d_ipv6[2]; - if (is_s_ipv6) { + if (is_ipv6) { /* Handle IPv6 source address */ HWS_SET_HDR(fc, match_param, IPV6_SRC_127_96_O, outer_headers.src_ipv4_src_ipv6.ipv6_simple_layout.ipv6_127_96, @@ -589,13 +589,6 @@ hws_definer_conv_outer(struct mlx5hws_definer_conv_data *cd, HWS_SET_HDR(fc, match_param, IPV6_SRC_31_0_O, outer_headers.src_ipv4_src_ipv6.ipv6_simple_layout.ipv6_31_0, ipv6_src_outer.ipv6_address_31_0); - } else { - /* Handle IPv4 source address */ - HWS_SET_HDR(fc, match_param, IPV4_SRC_O, - outer_headers.src_ipv4_src_ipv6.ipv6_simple_layout.ipv6_31_0, - ipv4_src_dest_outer.source_address); - } - if (is_d_ipv6) { /* Handle IPv6 destination address */ HWS_SET_HDR(fc, match_param, IPV6_DST_127_96_O, outer_headers.dst_ipv4_dst_ipv6.ipv6_simple_layout.ipv6_127_96, @@ -610,6 +603,10 @@ hws_definer_conv_outer(struct mlx5hws_definer_conv_data *cd, outer_headers.dst_ipv4_dst_ipv6.ipv6_simple_layout.ipv6_31_0, ipv6_dst_outer.ipv6_address_31_0); } else { + /* Handle IPv4 source address */ + HWS_SET_HDR(fc, match_param, IPV4_SRC_O, + outer_headers.src_ipv4_src_ipv6.ipv6_simple_layout.ipv6_31_0, + ipv4_src_dest_outer.source_address); /* Handle IPv4 destination address */ HWS_SET_HDR(fc, match_param, IPV4_DST_O, outer_headers.dst_ipv4_dst_ipv6.ipv6_simple_layout.ipv6_31_0, @@ -667,9 +664,9 @@ static int hws_definer_conv_inner(struct mlx5hws_definer_conv_data *cd, u32 *match_param) { - bool is_s_ipv6, is_d_ipv6, smac_set, dmac_set; struct mlx5hws_definer_fc *fc = cd->fc; struct mlx5hws_definer_fc *curr_fc; + bool is_ipv6, smac_set, dmac_set; u32 *s_ipv6, *d_ipv6; if (HWS_IS_FLD_SET_SZ(match_param, inner_headers.l4_type, 0x2) || @@ -730,10 +727,10 @@ hws_definer_conv_inner(struct mlx5hws_definer_conv_data *cd, inner_headers.dst_ipv4_dst_ipv6.ipv6_layout); /* Assume IPv6 is used if ipv6 bits are set */ - is_s_ipv6 = s_ipv6[0] || s_ipv6[1] || s_ipv6[2]; - is_d_ipv6 = d_ipv6[0] || d_ipv6[1] || d_ipv6[2]; + is_ipv6 = s_ipv6[0] || s_ipv6[1] || s_ipv6[2] || + d_ipv6[0] || d_ipv6[1] || d_ipv6[2]; - if (is_s_ipv6) { + if (is_ipv6) { /* Handle IPv6 source address */ HWS_SET_HDR(fc, match_param, IPV6_SRC_127_96_I, inner_headers.src_ipv4_src_ipv6.ipv6_simple_layout.ipv6_127_96, @@ -747,13 +744,6 @@ hws_definer_conv_inner(struct mlx5hws_definer_conv_data *cd, HWS_SET_HDR(fc, match_param, IPV6_SRC_31_0_I, inner_headers.src_ipv4_src_ipv6.ipv6_simple_layout.ipv6_31_0, ipv6_src_inner.ipv6_address_31_0); - } else { - /* Handle IPv4 source address */ - HWS_SET_HDR(fc, match_param, IPV4_SRC_I, - inner_headers.src_ipv4_src_ipv6.ipv6_simple_layout.ipv6_31_0, - ipv4_src_dest_inner.source_address); - } - if (is_d_ipv6) { /* Handle IPv6 destination address */ HWS_SET_HDR(fc, match_param, IPV6_DST_127_96_I, inner_headers.dst_ipv4_dst_ipv6.ipv6_simple_layout.ipv6_127_96, @@ -768,6 +758,10 @@ hws_definer_conv_inner(struct mlx5hws_definer_conv_data *cd, inner_headers.dst_ipv4_dst_ipv6.ipv6_simple_layout.ipv6_31_0, ipv6_dst_inner.ipv6_address_31_0); } else { + /* Handle IPv4 source address */ + HWS_SET_HDR(fc, match_param, IPV4_SRC_I, + inner_headers.src_ipv4_src_ipv6.ipv6_simple_layout.ipv6_31_0, + ipv4_src_dest_inner.source_address); /* Handle IPv4 destination address */ HWS_SET_HDR(fc, match_param, IPV4_DST_I, inner_headers.dst_ipv4_dst_ipv6.ipv6_simple_layout.ipv6_31_0, -- GitLab From 448dc45eeacd3d22643c3785c074c0d155c51c82 Mon Sep 17 00:00:00 2001 From: Shung-Hsi Yu Date: Fri, 18 Apr 2025 15:49:43 +0800 Subject: [PATCH 1462/2211] bpf: Use proper type to calculate bpf_raw_tp_null_args.mask index [ Upstream commit 53ebef53a657d7957d35dc2b953db64f1bb28065 ] The calculation of the index used to access the mask field in 'struct bpf_raw_tp_null_args' is done with 'int' type, which could overflow when the tracepoint being attached has more than 8 arguments. While none of the tracepoints mentioned in raw_tp_null_args[] currently have more than 8 arguments, there do exist tracepoints that had more than 8 arguments (e.g. iocost_iocg_forgive_debt), so use the correct type for calculation and avoid Smatch static checker warning. Reported-by: Dan Carpenter Signed-off-by: Shung-Hsi Yu Signed-off-by: Andrii Nakryiko Acked-by: Kumar Kartikeya Dwivedi Link: https://lore.kernel.org/bpf/20250418074946.35569-1-shung-hsi.yu@suse.com Closes: https://lore.kernel.org/r/843a3b94-d53d-42db-93d4-be10a4090146@stanley.mountain/ Signed-off-by: Sasha Levin --- kernel/bpf/btf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c index 2c54c148a94f3..f83bd019db141 100644 --- a/kernel/bpf/btf.c +++ b/kernel/bpf/btf.c @@ -6684,10 +6684,10 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type, /* Is this a func with potential NULL args? */ if (strcmp(tname, raw_tp_null_args[i].func)) continue; - if (raw_tp_null_args[i].mask & (0x1 << (arg * 4))) + if (raw_tp_null_args[i].mask & (0x1ULL << (arg * 4))) info->reg_type |= PTR_MAYBE_NULL; /* Is the current arg IS_ERR? */ - if (raw_tp_null_args[i].mask & (0x2 << (arg * 4))) + if (raw_tp_null_args[i].mask & (0x2ULL << (arg * 4))) ptr_err_raw_tp = true; break; } -- GitLab From e0e8f580d5ce9f8a02dc88874f96f035300855b2 Mon Sep 17 00:00:00 2001 From: Muna Sinada Date: Tue, 25 Mar 2025 14:31:25 -0700 Subject: [PATCH 1463/2211] wifi: mac80211: VLAN traffic in multicast path [ Upstream commit 1a4a6a22552ca9d723f28a1fe35eab1b9b3d8b33 ] Currently for MLO, sending out multicast frames on each link is handled by mac80211 only when IEEE80211_HW_MLO_MCAST_MULTI_LINK_TX flag is not set. Dynamic VLAN multicast traffic utilizes software encryption. Due to this, mac80211 should handle transmitting multicast frames on all links for multicast VLAN traffic. Signed-off-by: Muna Sinada Link: https://patch.msgid.link/20250325213125.1509362-4-muna.sinada@oss.qualcomm.com [remove unnecessary parentheses] Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- net/mac80211/tx.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 0ff8b56f58070..ef16ff149730a 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -4523,8 +4523,10 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, IEEE80211_TX_CTRL_MLO_LINK_UNSPEC, NULL); } else if (ieee80211_vif_is_mld(&sdata->vif) && - sdata->vif.type == NL80211_IFTYPE_AP && - !ieee80211_hw_check(&sdata->local->hw, MLO_MCAST_MULTI_LINK_TX)) { + ((sdata->vif.type == NL80211_IFTYPE_AP && + !ieee80211_hw_check(&sdata->local->hw, MLO_MCAST_MULTI_LINK_TX)) || + (sdata->vif.type == NL80211_IFTYPE_AP_VLAN && + !sdata->wdev.use_4addr))) { ieee80211_mlo_multicast_tx(dev, skb); } else { normal: -- GitLab From 2112fba7b77997969172ceb2a9fa583621a2d241 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= Date: Thu, 3 Apr 2025 20:39:28 +0200 Subject: [PATCH 1464/2211] Revert "mac80211: Dynamically set CoDel parameters per station" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 4876376988081d636a4c4e5f03a5556386b49087 ] This reverts commit 484a54c2e597dbc4ace79c1687022282905afba0. The CoDel parameter change essentially disables CoDel on slow stations, with some questionable assumptions, as Dave pointed out in [0]. Quoting from there: But here are my pithy comments as to why this part of mac80211 is so wrong... static void sta_update_codel_params(struct sta_info *sta, u32 thr) { - if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) { 1) sta->local->num_sta is the number of associated, rather than active, stations. "Active" stations in the last 50ms or so, might have been a better thing to use, but as most people have far more than that associated, we end up with really lousy codel parameters, all the time. Mistake numero uno! 2) The STA_SLOW_THRESHOLD was completely arbitrary in 2016. - sta->cparams.target = MS2TIME(50); This, by itself, was probably not too bad. 30ms might have been better, at the time, when we were battling powersave etc, but 20ms was enough, really, to cover most scenarios, even where we had low rate 2Ghz multicast to cope with. Even then, codel has a hard time finding any sane drop rate at all, with a target this high. - sta->cparams.interval = MS2TIME(300); But this was horrible, a total mistake, that is leading to codel being completely ineffective in almost any scenario on clients or APS. 100ms, even 80ms, here, would be vastly better than this insanity. I'm seeing 5+seconds of delay accumulated in a bunch of otherwise happily fq-ing APs.... 100ms of observed jitter during a flow is enough. Certainly (in 2016) there were interactions with powersave that I did not understand, and still don't, but if you are transmitting in the first place, powersave shouldn't be a problemmmm..... - sta->cparams.ecn = false; At the time we were pretty nervous about ecn, I'm kind of sanguine about it now, and reliably indicating ecn seems better than turning it off for any reason. [...] In production, on p2p wireless, I've had 8ms and 80ms for target and interval for years now, and it works great. I think Dave's arguments above are basically sound on the face of it, and various experimentation with tighter CoDel parameters in the OpenWrt community have show promising results[1]. So I don't think there's any reason to keep this parameter fiddling; hence this revert. [0] https://lore.kernel.org/linux-wireless/CAA93jw6NJ2cmLmMauz0xAgC2MGbBq6n0ZiZzAdkK0u4b+O2yXg@mail.gmail.com/ [1] https://forum.openwrt.org/t/reducing-multiplexing-latencies-still-further-in-wifi/133605/130 Suggested-By: Dave Taht In-memory-of: Dave Taht Signed-off-by: Toke Høiland-Jørgensen Link: https://patch.msgid.link/20250403183930.197716-1-toke@toke.dk Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- include/net/mac80211.h | 16 ---------------- net/mac80211/debugfs_sta.c | 6 ------ net/mac80211/rate.c | 2 -- net/mac80211/sta_info.c | 28 ---------------------------- net/mac80211/sta_info.h | 11 ----------- net/mac80211/tx.c | 9 +-------- 6 files changed, 1 insertion(+), 71 deletions(-) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index fee854892bec5..8e70941602064 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -5311,22 +5311,6 @@ void ieee80211_get_tx_rates(struct ieee80211_vif *vif, struct ieee80211_tx_rate *dest, int max_rates); -/** - * ieee80211_sta_set_expected_throughput - set the expected tpt for a station - * - * Call this function to notify mac80211 about a change in expected throughput - * to a station. A driver for a device that does rate control in firmware can - * call this function when the expected throughput estimate towards a station - * changes. The information is used to tune the CoDel AQM applied to traffic - * going towards that station (which can otherwise be too aggressive and cause - * slow stations to starve). - * - * @pubsta: the station to set throughput for. - * @thr: the current expected throughput in kbps. - */ -void ieee80211_sta_set_expected_throughput(struct ieee80211_sta *pubsta, - u32 thr); - /** * ieee80211_tx_rate_update - transmit rate update callback * diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c index 1e9389c49a57d..e6f937cfedcf6 100644 --- a/net/mac80211/debugfs_sta.c +++ b/net/mac80211/debugfs_sta.c @@ -152,12 +152,6 @@ static ssize_t sta_aqm_read(struct file *file, char __user *userbuf, spin_lock_bh(&local->fq.lock); rcu_read_lock(); - p += scnprintf(p, - bufsz + buf - p, - "target %uus interval %uus ecn %s\n", - codel_time_to_us(sta->cparams.target), - codel_time_to_us(sta->cparams.interval), - sta->cparams.ecn ? "yes" : "no"); p += scnprintf(p, bufsz + buf - p, "tid ac backlog-bytes backlog-packets new-flows drops marks overlimit collisions tx-bytes tx-packets flags\n"); diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c index 3dc9752188d58..1b045b62961f5 100644 --- a/net/mac80211/rate.c +++ b/net/mac80211/rate.c @@ -971,8 +971,6 @@ int rate_control_set_rates(struct ieee80211_hw *hw, if (sta->uploaded) drv_sta_rate_tbl_update(hw_to_local(hw), sta->sdata, pubsta); - ieee80211_sta_set_expected_throughput(pubsta, sta_get_expected_throughput(sta)); - return 0; } EXPORT_SYMBOL(rate_control_set_rates); diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 49095f19a0f22..4eb45e08b97e7 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -18,7 +18,6 @@ #include #include -#include #include #include "ieee80211_i.h" #include "driver-ops.h" @@ -683,12 +682,6 @@ __sta_info_alloc(struct ieee80211_sub_if_data *sdata, } } - sta->cparams.ce_threshold = CODEL_DISABLED_THRESHOLD; - sta->cparams.target = MS2TIME(20); - sta->cparams.interval = MS2TIME(100); - sta->cparams.ecn = true; - sta->cparams.ce_threshold_selector = 0; - sta->cparams.ce_threshold_mask = 0; sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr); @@ -2878,27 +2871,6 @@ unsigned long ieee80211_sta_last_active(struct sta_info *sta) return sta->deflink.status_stats.last_ack; } -static void sta_update_codel_params(struct sta_info *sta, u32 thr) -{ - if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) { - sta->cparams.target = MS2TIME(50); - sta->cparams.interval = MS2TIME(300); - sta->cparams.ecn = false; - } else { - sta->cparams.target = MS2TIME(20); - sta->cparams.interval = MS2TIME(100); - sta->cparams.ecn = true; - } -} - -void ieee80211_sta_set_expected_throughput(struct ieee80211_sta *pubsta, - u32 thr) -{ - struct sta_info *sta = container_of(pubsta, struct sta_info, sta); - - sta_update_codel_params(sta, thr); -} - int ieee80211_sta_allocate_link(struct sta_info *sta, unsigned int link_id) { struct ieee80211_sub_if_data *sdata = sta->sdata; diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index 9195d5a2de0a8..a9cfeeb13e53f 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h @@ -466,14 +466,6 @@ struct ieee80211_fragment_cache { unsigned int next; }; -/* - * The bandwidth threshold below which the per-station CoDel parameters will be - * scaled to be more lenient (to prevent starvation of slow stations). This - * value will be scaled by the number of active stations when it is being - * applied. - */ -#define STA_SLOW_THRESHOLD 6000 /* 6 Mbps */ - /** * struct link_sta_info - Link STA information * All link specific sta info are stored here for reference. This can be @@ -619,7 +611,6 @@ struct link_sta_info { * @sta: station information we share with the driver * @sta_state: duplicates information about station state (for debug) * @rcu_head: RCU head used for freeing this station struct - * @cparams: CoDel parameters for this station. * @reserved_tid: reserved TID (if any, otherwise IEEE80211_TID_UNRESERVED) * @amsdu_mesh_control: track the mesh A-MSDU format used by the peer: * @@ -710,8 +701,6 @@ struct sta_info { struct dentry *debugfs_dir; #endif - struct codel_params cparams; - u8 reserved_tid; s8 amsdu_mesh_control; diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index ef16ff149730a..00c309e7768e1 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -1401,16 +1401,9 @@ static struct sk_buff *fq_tin_dequeue_func(struct fq *fq, local = container_of(fq, struct ieee80211_local, fq); txqi = container_of(tin, struct txq_info, tin); + cparams = &local->cparams; cstats = &txqi->cstats; - if (txqi->txq.sta) { - struct sta_info *sta = container_of(txqi->txq.sta, - struct sta_info, sta); - cparams = &sta->cparams; - } else { - cparams = &local->cparams; - } - if (flow == &tin->default_flow) cvars = &txqi->def_cvars; else -- GitLab From 0388a859712454a4241b14a0a15135921c36342f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Gonzalo?= Date: Wed, 13 Mar 2024 20:02:27 +0200 Subject: [PATCH 1465/2211] wifi: iwlwifi: Add missing MODULE_FIRMWARE for Qu-c0-jf-b0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 2b801487ac3be7bec561ae62d1a6c4d6f5283f8c ] The module metadata for the firmware file iwlwifi-Qu-c0-jf-b0-* is missing. Signed-off-by: Víctor Gonzalo Link: https://patch.msgid.link/20240313180227.2224780-1-victor.gonzalo@anddroptable.net Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/intel/iwlwifi/cfg/22000.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c index 2e2fcb3807efb..10d647fbc971e 100644 --- a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c +++ b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c @@ -44,6 +44,8 @@ IWL_QU_C_HR_B_FW_PRE "-" __stringify(api) ".ucode" #define IWL_QU_B_JF_B_MODULE_FIRMWARE(api) \ IWL_QU_B_JF_B_FW_PRE "-" __stringify(api) ".ucode" +#define IWL_QU_C_JF_B_MODULE_FIRMWARE(api) \ + IWL_QU_C_JF_B_FW_PRE "-" __stringify(api) ".ucode" #define IWL_CC_A_MODULE_FIRMWARE(api) \ IWL_CC_A_FW_PRE "-" __stringify(api) ".ucode" @@ -423,6 +425,7 @@ const struct iwl_cfg iwl_cfg_quz_a0_hr_b0 = { MODULE_FIRMWARE(IWL_QU_B_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL_QU_C_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL_QU_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); +MODULE_FIRMWARE(IWL_QU_C_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL_QUZ_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL_QUZ_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL_CC_A_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); -- GitLab From 23d336e8a28b8a66a56c1f65472edc0bcb4b8133 Mon Sep 17 00:00:00 2001 From: Yong Wang Date: Thu, 17 Apr 2025 15:43:13 +0200 Subject: [PATCH 1466/2211] net: bridge: mcast: update multicast contex when vlan state is changed [ Upstream commit 6c131043eaf1be2a6cc2d228f92ceb626fbcc0f3 ] When the vlan STP state is changed, which could be manipulated by "bridge vlan" commands, similar to port STP state, this also impacts multicast behaviors such as igmp query. In the scenario of per-VLAN snooping, there's a need to update the corresponding multicast context to re-arm the port query timer when vlan state becomes "forwarding" etc. Update br_vlan_set_state() function to enable vlan multicast context in such scenario. Before the patch, the IGMP query does not happen in the last step of the following test sequence, i.e. no growth for tx counter: # ip link add name br1 up type bridge vlan_filtering 1 mcast_snooping 1 mcast_vlan_snooping 1 mcast_querier 1 mcast_stats_enabled 1 # bridge vlan global set vid 1 dev br1 mcast_snooping 1 mcast_querier 1 mcast_query_interval 100 mcast_startup_query_count 0 # ip link add name swp1 up master br1 type dummy # sleep 1 # bridge vlan set vid 1 dev swp1 state 4 # ip -j -p stats show dev swp1 group xstats_slave subgroup bridge suite mcast | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]' 1 # sleep 1 # ip -j -p stats show dev swp1 group xstats_slave subgroup bridge suite mcast | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]' 1 # bridge vlan set vid 1 dev swp1 state 3 # sleep 2 # ip -j -p stats show dev swp1 group xstats_slave subgroup bridge suite mcast | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]' 1 After the patch, the IGMP query happens in the last step of the test: # ip link add name br1 up type bridge vlan_filtering 1 mcast_snooping 1 mcast_vlan_snooping 1 mcast_querier 1 mcast_stats_enabled 1 # bridge vlan global set vid 1 dev br1 mcast_snooping 1 mcast_querier 1 mcast_query_interval 100 mcast_startup_query_count 0 # ip link add name swp1 up master br1 type dummy # sleep 1 # bridge vlan set vid 1 dev swp1 state 4 # ip -j -p stats show dev swp1 group xstats_slave subgroup bridge suite mcast | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]' 1 # sleep 1 # ip -j -p stats show dev swp1 group xstats_slave subgroup bridge suite mcast | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]' 1 # bridge vlan set vid 1 dev swp1 state 3 # sleep 2 # ip -j -p stats show dev swp1 group xstats_slave subgroup bridge suite mcast | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]' 3 Signed-off-by: Yong Wang Reviewed-by: Andy Roulin Reviewed-by: Ido Schimmel Signed-off-by: Petr Machata Acked-by: Nikolay Aleksandrov Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/bridge/br_mst.c | 4 ++-- net/bridge/br_multicast.c | 26 ++++++++++++++++++++++++++ net/bridge/br_private.h | 11 ++++++++++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/net/bridge/br_mst.c b/net/bridge/br_mst.c index 1820f09ff59ce..3f24b4ee49c27 100644 --- a/net/bridge/br_mst.c +++ b/net/bridge/br_mst.c @@ -80,10 +80,10 @@ static void br_mst_vlan_set_state(struct net_bridge_vlan_group *vg, if (br_vlan_get_state(v) == state) return; - br_vlan_set_state(v, state); - if (v->vid == vg->pvid) br_vlan_set_pvid_state(vg, state); + + br_vlan_set_state(v, state); } int br_mst_set_state(struct net_bridge_port *p, u16 msti, u8 state, diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index b2ae0d2434d2e..7a91897ac6e87 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -4211,6 +4211,32 @@ static void __br_multicast_stop(struct net_bridge_mcast *brmctx) #endif } +void br_multicast_update_vlan_mcast_ctx(struct net_bridge_vlan *v, u8 state) +{ +#if IS_ENABLED(CONFIG_BRIDGE_VLAN_FILTERING) + struct net_bridge *br; + + if (!br_vlan_should_use(v)) + return; + + if (br_vlan_is_master(v)) + return; + + br = v->port->br; + + if (!br_opt_get(br, BROPT_MCAST_VLAN_SNOOPING_ENABLED)) + return; + + if (br_vlan_state_allowed(state, true)) + br_multicast_enable_port_ctx(&v->port_mcast_ctx); + + /* Multicast is not disabled for the vlan when it goes in + * blocking state because the timers will expire and stop by + * themselves without sending more queries. + */ +#endif +} + void br_multicast_toggle_one_vlan(struct net_bridge_vlan *vlan, bool on) { struct net_bridge *br; diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index df502cc1191c3..6a1bce8959afa 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -1053,6 +1053,7 @@ void br_multicast_port_ctx_init(struct net_bridge_port *port, struct net_bridge_vlan *vlan, struct net_bridge_mcast_port *pmctx); void br_multicast_port_ctx_deinit(struct net_bridge_mcast_port *pmctx); +void br_multicast_update_vlan_mcast_ctx(struct net_bridge_vlan *v, u8 state); void br_multicast_toggle_one_vlan(struct net_bridge_vlan *vlan, bool on); int br_multicast_toggle_vlan_snooping(struct net_bridge *br, bool on, struct netlink_ext_ack *extack); @@ -1503,6 +1504,11 @@ static inline void br_multicast_port_ctx_deinit(struct net_bridge_mcast_port *pm { } +static inline void br_multicast_update_vlan_mcast_ctx(struct net_bridge_vlan *v, + u8 state) +{ +} + static inline void br_multicast_toggle_one_vlan(struct net_bridge_vlan *vlan, bool on) { @@ -1854,7 +1860,9 @@ bool br_vlan_global_opts_can_enter_range(const struct net_bridge_vlan *v_curr, bool br_vlan_global_opts_fill(struct sk_buff *skb, u16 vid, u16 vid_range, const struct net_bridge_vlan *v_opts); -/* vlan state manipulation helpers using *_ONCE to annotate lock-free access */ +/* vlan state manipulation helpers using *_ONCE to annotate lock-free access, + * while br_vlan_set_state() may access data protected by multicast_lock. + */ static inline u8 br_vlan_get_state(const struct net_bridge_vlan *v) { return READ_ONCE(v->state); @@ -1863,6 +1871,7 @@ static inline u8 br_vlan_get_state(const struct net_bridge_vlan *v) static inline void br_vlan_set_state(struct net_bridge_vlan *v, u8 state) { WRITE_ONCE(v->state, state); + br_multicast_update_vlan_mcast_ctx(v, state); } static inline u8 br_vlan_get_pvid_state(const struct net_bridge_vlan_group *vg) -- GitLab From 78f768e36c065ca3f88272fcf39014782c2d4ecd Mon Sep 17 00:00:00 2001 From: Yong Wang Date: Thu, 17 Apr 2025 15:43:12 +0200 Subject: [PATCH 1467/2211] net: bridge: mcast: re-implement br_multicast_{enable, disable}_port functions [ Upstream commit 4b30ae9adb047dd0a7982975ec3933c529537026 ] When a bridge port STP state is changed from BLOCKING/DISABLED to FORWARDING, the port's igmp query timer will NOT re-arm itself if the bridge has been configured as per-VLAN multicast snooping. Solve this by choosing the correct multicast context(s) to enable/disable port multicast based on whether per-VLAN multicast snooping is enabled or not, i.e. using per-{port, VLAN} context in case of per-VLAN multicast snooping by re-implementing br_multicast_enable_port() and br_multicast_disable_port() functions. Before the patch, the IGMP query does not happen in the last step of the following test sequence, i.e. no growth for tx counter: # ip link add name br1 up type bridge vlan_filtering 1 mcast_snooping 1 mcast_vlan_snooping 1 mcast_querier 1 mcast_stats_enabled 1 # bridge vlan global set vid 1 dev br1 mcast_snooping 1 mcast_querier 1 mcast_query_interval 100 mcast_startup_query_count 0 # ip link add name swp1 up master br1 type dummy # bridge link set dev swp1 state 0 # ip -j -p stats show dev swp1 group xstats_slave subgroup bridge suite mcast | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]' 1 # sleep 1 # ip -j -p stats show dev swp1 group xstats_slave subgroup bridge suite mcast | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]' 1 # bridge link set dev swp1 state 3 # sleep 2 # ip -j -p stats show dev swp1 group xstats_slave subgroup bridge suite mcast | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]' 1 After the patch, the IGMP query happens in the last step of the test: # ip link add name br1 up type bridge vlan_filtering 1 mcast_snooping 1 mcast_vlan_snooping 1 mcast_querier 1 mcast_stats_enabled 1 # bridge vlan global set vid 1 dev br1 mcast_snooping 1 mcast_querier 1 mcast_query_interval 100 mcast_startup_query_count 0 # ip link add name swp1 up master br1 type dummy # bridge link set dev swp1 state 0 # ip -j -p stats show dev swp1 group xstats_slave subgroup bridge suite mcast | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]' 1 # sleep 1 # ip -j -p stats show dev swp1 group xstats_slave subgroup bridge suite mcast | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]' 1 # bridge link set dev swp1 state 3 # sleep 2 # ip -j -p stats show dev swp1 group xstats_slave subgroup bridge suite mcast | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]' 3 Signed-off-by: Yong Wang Reviewed-by: Andy Roulin Reviewed-by: Ido Schimmel Signed-off-by: Petr Machata Acked-by: Nikolay Aleksandrov Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/bridge/br_multicast.c | 77 +++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 8 deletions(-) diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 7a91897ac6e87..733ff6b758f69 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -2105,12 +2105,17 @@ static void __br_multicast_enable_port_ctx(struct net_bridge_mcast_port *pmctx) } } -void br_multicast_enable_port(struct net_bridge_port *port) +static void br_multicast_enable_port_ctx(struct net_bridge_mcast_port *pmctx) { - struct net_bridge *br = port->br; + struct net_bridge *br = pmctx->port->br; spin_lock_bh(&br->multicast_lock); - __br_multicast_enable_port_ctx(&port->multicast_ctx); + if (br_multicast_port_ctx_is_vlan(pmctx) && + !(pmctx->vlan->priv_flags & BR_VLFLAG_MCAST_ENABLED)) { + spin_unlock_bh(&br->multicast_lock); + return; + } + __br_multicast_enable_port_ctx(pmctx); spin_unlock_bh(&br->multicast_lock); } @@ -2137,11 +2142,67 @@ static void __br_multicast_disable_port_ctx(struct net_bridge_mcast_port *pmctx) br_multicast_rport_del_notify(pmctx, del); } +static void br_multicast_disable_port_ctx(struct net_bridge_mcast_port *pmctx) +{ + struct net_bridge *br = pmctx->port->br; + + spin_lock_bh(&br->multicast_lock); + if (br_multicast_port_ctx_is_vlan(pmctx) && + !(pmctx->vlan->priv_flags & BR_VLFLAG_MCAST_ENABLED)) { + spin_unlock_bh(&br->multicast_lock); + return; + } + + __br_multicast_disable_port_ctx(pmctx); + spin_unlock_bh(&br->multicast_lock); +} + +static void br_multicast_toggle_port(struct net_bridge_port *port, bool on) +{ +#if IS_ENABLED(CONFIG_BRIDGE_VLAN_FILTERING) + if (br_opt_get(port->br, BROPT_MCAST_VLAN_SNOOPING_ENABLED)) { + struct net_bridge_vlan_group *vg; + struct net_bridge_vlan *vlan; + + rcu_read_lock(); + vg = nbp_vlan_group_rcu(port); + if (!vg) { + rcu_read_unlock(); + return; + } + + /* iterate each vlan, toggle vlan multicast context */ + list_for_each_entry_rcu(vlan, &vg->vlan_list, vlist) { + struct net_bridge_mcast_port *pmctx = + &vlan->port_mcast_ctx; + u8 state = br_vlan_get_state(vlan); + /* enable vlan multicast context when state is + * LEARNING or FORWARDING + */ + if (on && br_vlan_state_allowed(state, true)) + br_multicast_enable_port_ctx(pmctx); + else + br_multicast_disable_port_ctx(pmctx); + } + rcu_read_unlock(); + return; + } +#endif + /* toggle port multicast context when vlan snooping is disabled */ + if (on) + br_multicast_enable_port_ctx(&port->multicast_ctx); + else + br_multicast_disable_port_ctx(&port->multicast_ctx); +} + +void br_multicast_enable_port(struct net_bridge_port *port) +{ + br_multicast_toggle_port(port, true); +} + void br_multicast_disable_port(struct net_bridge_port *port) { - spin_lock_bh(&port->br->multicast_lock); - __br_multicast_disable_port_ctx(&port->multicast_ctx); - spin_unlock_bh(&port->br->multicast_lock); + br_multicast_toggle_port(port, false); } static int __grp_src_delete_marked(struct net_bridge_port_group *pg) @@ -4330,9 +4391,9 @@ int br_multicast_toggle_vlan_snooping(struct net_bridge *br, bool on, __br_multicast_open(&br->multicast_ctx); list_for_each_entry(p, &br->port_list, list) { if (on) - br_multicast_disable_port(p); + br_multicast_disable_port_ctx(&p->multicast_ctx); else - br_multicast_enable_port(p); + br_multicast_enable_port_ctx(&p->multicast_ctx); } list_for_each_entry(vlan, &vg->vlan_list, vlist) -- GitLab From 1baee1365c631e7480a3eb318ee72bd425eb3206 Mon Sep 17 00:00:00 2001 From: Ido Schimmel Date: Tue, 15 Apr 2025 15:11:41 +0300 Subject: [PATCH 1468/2211] vxlan: Do not treat dst cache initialization errors as fatal [ Upstream commit 20c76dadc783759fd3819d289c72be590660cc8b ] FDB entries are allocated in an atomic context as they can be added from the data path when learning is enabled. After converting the FDB hash table to rhashtable, the insertion rate will be much higher (*) which will entail a much higher rate of per-CPU allocations via dst_cache_init(). When adding a large number of entries (e.g., 256k) in a batch, a small percentage (< 0.02%) of these per-CPU allocations will fail [1]. This does not happen with the current code since the insertion rate is low enough to give the per-CPU allocator a chance to asynchronously create new chunks of per-CPU memory. Given that: a. Only a small percentage of these per-CPU allocations fail. b. The scenario where this happens might not be the most realistic one. c. The driver can work correctly without dst caches. The dst_cache_*() APIs first check that the dst cache was properly initialized. d. The dst caches are not always used (e.g., 'tos inherit'). It seems reasonable to not treat these allocation failures as fatal. Therefore, do not bail when dst_cache_init() fails and suppress warnings by specifying '__GFP_NOWARN'. [1] percpu: allocation failed, size=40 align=8 atomic=1, atomic alloc failed, no space left (*) 97% reduction in average latency of vxlan_fdb_update() when adding 256k entries in a batch. Reviewed-by: Petr Machata Signed-off-by: Ido Schimmel Link: https://patch.msgid.link/20250415121143.345227-14-idosch@nvidia.com Reviewed-by: Nikolay Aleksandrov Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/vxlan/vxlan_core.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c index 474faccf75fd9..1a70770938001 100644 --- a/drivers/net/vxlan/vxlan_core.c +++ b/drivers/net/vxlan/vxlan_core.c @@ -605,10 +605,10 @@ static int vxlan_fdb_append(struct vxlan_fdb *f, if (rd == NULL) return -ENOMEM; - if (dst_cache_init(&rd->dst_cache, GFP_ATOMIC)) { - kfree(rd); - return -ENOMEM; - } + /* The driver can work correctly without a dst cache, so do not treat + * dst cache initialization errors as fatal. + */ + dst_cache_init(&rd->dst_cache, GFP_ATOMIC | __GFP_NOWARN); rd->remote_ip = *ip; rd->remote_port = port; -- GitLab From 9f20f965116574eb629c285c053844c024f52e4f Mon Sep 17 00:00:00 2001 From: Kalesh AP Date: Thu, 17 Apr 2025 10:24:47 -0700 Subject: [PATCH 1469/2211] bnxt_en: Remove unused field "ref_count" in struct bnxt_ulp [ Upstream commit 5bccacb4cc32cb835fe2fe100a210332c494e81d ] The "ref_count" field in struct bnxt_ulp is unused after commit a43c26fa2e6c ("RDMA/bnxt_re: Remove the sriov config callback"). So we can just remove it now. Reviewed-by: Somnath Kotur Signed-off-by: Kalesh AP Signed-off-by: Michael Chan Link: https://patch.msgid.link/20250417172448.1206107-4-michael.chan@broadcom.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 5 ----- drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h | 1 - 2 files changed, 6 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c index 546d9a3d7efea..b33c29fdf8fd3 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c @@ -148,7 +148,6 @@ void bnxt_unregister_dev(struct bnxt_en_dev *edev) struct net_device *dev = edev->net; struct bnxt *bp = netdev_priv(dev); struct bnxt_ulp *ulp; - int i = 0; ulp = edev->ulp_tbl; rtnl_lock(); @@ -164,10 +163,6 @@ void bnxt_unregister_dev(struct bnxt_en_dev *edev) synchronize_rcu(); ulp->max_async_event_id = 0; ulp->async_events_bmap = NULL; - while (atomic_read(&ulp->ref_count) != 0 && i < 10) { - msleep(100); - i++; - } mutex_unlock(&edev->en_dev_lock); rtnl_unlock(); return; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h index 4f4914f5c84c9..b76a231ca7dac 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h @@ -48,7 +48,6 @@ struct bnxt_ulp { unsigned long *async_events_bmap; u16 max_async_event_id; u16 msix_requested; - atomic_t ref_count; }; struct bnxt_en_dev { -- GitLab From f66971c608c49193c607733cedd4dec7c86ed020 Mon Sep 17 00:00:00 2001 From: Sarika Sharma Date: Fri, 11 Apr 2025 11:45:22 +0530 Subject: [PATCH 1470/2211] wifi: ath12k: using msdu end descriptor to check for rx multicast packets [ Upstream commit cb7433cc5cd4d07175dbc41f5a19966e9fae48be ] Currently, the RX multicast broadcast packet check is performed using bit 15 from the info6 field of the MPDU start descriptor. This check can also be done using bit 9 from the info5 field of the MSDU end descriptor. However, in some scenarios multicast bit is not set when fetched from MPDU start descriptor. Therefore, checking the RX multicast broadcast packet from the MSDU end descriptor is more reliable as it is per MSDU. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 Signed-off-by: Sarika Sharma Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250411061523.859387-2-quic_sarishar@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/hal.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/hal.c b/drivers/net/wireless/ath/ath12k/hal.c index ae386c6490594..3afb11c7bf18e 100644 --- a/drivers/net/wireless/ath/ath12k/hal.c +++ b/drivers/net/wireless/ath/ath12k/hal.c @@ -449,8 +449,8 @@ static u8 *ath12k_hw_qcn9274_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc) static bool ath12k_hw_qcn9274_rx_desc_is_da_mcbc(struct hal_rx_desc *desc) { - return __le32_to_cpu(desc->u.qcn9274.mpdu_start.info6) & - RX_MPDU_START_INFO6_MCAST_BCAST; + return __le16_to_cpu(desc->u.qcn9274.msdu_end.info5) & + RX_MSDU_END_INFO5_DA_IS_MCBC; } static void ath12k_hw_qcn9274_rx_desc_get_dot11_hdr(struct hal_rx_desc *desc, @@ -902,8 +902,8 @@ static u8 *ath12k_hw_qcn9274_compact_rx_desc_mpdu_start_addr2(struct hal_rx_desc static bool ath12k_hw_qcn9274_compact_rx_desc_is_da_mcbc(struct hal_rx_desc *desc) { - return __le32_to_cpu(desc->u.qcn9274_compact.mpdu_start.info6) & - RX_MPDU_START_INFO6_MCAST_BCAST; + return __le16_to_cpu(desc->u.qcn9274_compact.msdu_end.info5) & + RX_MSDU_END_INFO5_DA_IS_MCBC; } static void ath12k_hw_qcn9274_compact_rx_desc_get_dot11_hdr(struct hal_rx_desc *desc, -- GitLab From d589b45b7ca62c7b5f2f33b5a86a6c8492bd462d Mon Sep 17 00:00:00 2001 From: Michael Walle Date: Mon, 14 Apr 2025 10:43:36 +0200 Subject: [PATCH 1471/2211] net: ethernet: ti: am65-cpsw: handle -EPROBE_DEFER [ Upstream commit 09737cb80b8686ffca4ed1805fee745d5c85604d ] of_get_mac_address() might fetch the MAC address from NVMEM and that driver might not have been loaded. In that case, -EPROBE_DEFER is returned. Right now, this will trigger an immediate fallback to am65_cpsw_am654_get_efuse_macid() possibly resulting in a random MAC address although the MAC address is stored in the referenced NVMEM. Fix it by handling the -EPROBE_DEFER return code correctly. This also means that the creation of the MDIO device has to be moved to a later stage as -EPROBE_DEFER must not be returned after child devices are created. Signed-off-by: Michael Walle Reviewed-by: Andrew Lunn Link: https://patch.msgid.link/20250414084336.4017237-3-mwalle@kernel.org Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/ti/am65-cpsw-nuss.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c index 61788a43cb861..393cc5192e90d 100644 --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c @@ -2693,7 +2693,9 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common) goto of_node_put; ret = of_get_mac_address(port_np, port->slave.mac_addr); - if (ret) { + if (ret == -EPROBE_DEFER) { + goto of_node_put; + } else if (ret) { am65_cpsw_am654_get_efuse_macid(port_np, port->port_id, port->slave.mac_addr); @@ -3586,6 +3588,16 @@ static int am65_cpsw_nuss_probe(struct platform_device *pdev) return ret; } + am65_cpsw_nuss_get_ver(common); + + ret = am65_cpsw_nuss_init_host_p(common); + if (ret) + goto err_pm_clear; + + ret = am65_cpsw_nuss_init_slave_ports(common); + if (ret) + goto err_pm_clear; + node = of_get_child_by_name(dev->of_node, "mdio"); if (!node) { dev_warn(dev, "MDIO node not found\n"); @@ -3602,16 +3614,6 @@ static int am65_cpsw_nuss_probe(struct platform_device *pdev) } of_node_put(node); - am65_cpsw_nuss_get_ver(common); - - ret = am65_cpsw_nuss_init_host_p(common); - if (ret) - goto err_of_clear; - - ret = am65_cpsw_nuss_init_slave_ports(common); - if (ret) - goto err_of_clear; - /* init common data */ ale_params.dev = dev; ale_params.ale_ageout = AM65_CPSW_ALE_AGEOUT_DEFAULT; -- GitLab From 4b3383110b6df48e0ba5936af2cb68d5eb6bd43b Mon Sep 17 00:00:00 2001 From: Zijun Hu Date: Mon, 14 Apr 2025 19:36:52 +0800 Subject: [PATCH 1472/2211] software node: Correct a OOB check in software_node_get_reference_args() [ Upstream commit 31e4e12e0e9609850cefd4b2e1adf782f56337d6 ] software_node_get_reference_args() wants to get @index-th element, so the property value requires at least '(index + 1) * sizeof(*ref)' bytes but that can not be guaranteed by current OOB check, and may cause OOB for malformed property. Fix by using as OOB check '((index + 1) * sizeof(*ref) > prop->length)'. Reviewed-by: Sakari Ailus Signed-off-by: Zijun Hu Link: https://lore.kernel.org/r/20250414-fix_swnode-v2-1-9c9e6ae11eab@quicinc.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/base/swnode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c index eb6eb25b343ba..53b3f0061ad12 100644 --- a/drivers/base/swnode.c +++ b/drivers/base/swnode.c @@ -529,7 +529,7 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode, if (prop->is_inline) return -EINVAL; - if (index * sizeof(*ref) >= prop->length) + if ((index + 1) * sizeof(*ref) > prop->length) return -ENOENT; ref_array = prop->pointer; -- GitLab From 7e73f517ca7efa439792baa8ab69d44289793e39 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Fri, 11 Apr 2025 16:50:21 +0200 Subject: [PATCH 1473/2211] isofs: fix Y2038 and Y2156 issues in Rock Ridge TF entry [ Upstream commit 5ea45f54c8d6ca2a95b7bd450ee9eb253310bfd3 ] This change implements the Rock Ridge TF entry LONG_FORM bit, which uses the ISO 9660 17-byte date format (up to year 9999, with 10ms precision) instead of the 7-byte date format (up to year 2155, with 1s precision). Previously the LONG_FORM bit was ignored; and isofs would entirely misinterpret the date as the wrong format, resulting in garbage timestamps on the filesystem. The Y2038 issue in iso_date() is fixed by returning a struct timespec64 instead of an int. parse_rock_ridge_inode_internal() is fixed so it does proper bounds checks of the TF entry timestamps. Signed-off-by: Jonas 'Sortie' Termansen Signed-off-by: Jan Kara Link: https://patch.msgid.link/20250411145022.2292255-1-sortie@maxsi.org Signed-off-by: Sasha Levin --- fs/isofs/inode.c | 7 +++++-- fs/isofs/isofs.h | 4 +++- fs/isofs/rock.c | 40 ++++++++++++++++++++++----------------- fs/isofs/rock.h | 6 +----- fs/isofs/util.c | 49 +++++++++++++++++++++++++++++++----------------- 5 files changed, 64 insertions(+), 42 deletions(-) diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 47038e6608123..d5da9817df9b3 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -1275,6 +1275,7 @@ static int isofs_read_inode(struct inode *inode, int relocated) unsigned long offset; struct iso_inode_info *ei = ISOFS_I(inode); int ret = -EIO; + struct timespec64 ts; block = ei->i_iget5_block; bh = sb_bread(inode->i_sb, block); @@ -1387,8 +1388,10 @@ static int isofs_read_inode(struct inode *inode, int relocated) inode->i_ino, de->flags[-high_sierra]); } #endif - inode_set_mtime_to_ts(inode, - inode_set_atime_to_ts(inode, inode_set_ctime(inode, iso_date(de->date, high_sierra), 0))); + ts = iso_date(de->date, high_sierra ? ISO_DATE_HIGH_SIERRA : 0); + inode_set_ctime_to_ts(inode, ts); + inode_set_atime_to_ts(inode, ts); + inode_set_mtime_to_ts(inode, ts); ei->i_first_extent = (isonum_733(de->extent) + isonum_711(de->ext_attr_length)); diff --git a/fs/isofs/isofs.h b/fs/isofs/isofs.h index 2d55207c9a990..5065558375333 100644 --- a/fs/isofs/isofs.h +++ b/fs/isofs/isofs.h @@ -106,7 +106,9 @@ static inline unsigned int isonum_733(u8 *p) /* Ignore bigendian datum due to broken mastering programs */ return get_unaligned_le32(p); } -extern int iso_date(u8 *, int); +#define ISO_DATE_HIGH_SIERRA (1 << 0) +#define ISO_DATE_LONG_FORM (1 << 1) +struct timespec64 iso_date(u8 *p, int flags); struct inode; /* To make gcc happy */ diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c index dbf911126e610..576498245b9d7 100644 --- a/fs/isofs/rock.c +++ b/fs/isofs/rock.c @@ -412,7 +412,12 @@ repeat: } } break; - case SIG('T', 'F'): + case SIG('T', 'F'): { + int flags, size, slen; + + flags = rr->u.TF.flags & TF_LONG_FORM ? ISO_DATE_LONG_FORM : 0; + size = rr->u.TF.flags & TF_LONG_FORM ? 17 : 7; + slen = rr->len - 5; /* * Some RRIP writers incorrectly place ctime in the * TF_CREATE field. Try to handle this correctly for @@ -420,27 +425,28 @@ repeat: */ /* Rock ridge never appears on a High Sierra disk */ cnt = 0; - if (rr->u.TF.flags & TF_CREATE) { - inode_set_ctime(inode, - iso_date(rr->u.TF.times[cnt++].time, 0), - 0); + if ((rr->u.TF.flags & TF_CREATE) && size <= slen) { + inode_set_ctime_to_ts(inode, + iso_date(rr->u.TF.data + size * cnt++, flags)); + slen -= size; } - if (rr->u.TF.flags & TF_MODIFY) { - inode_set_mtime(inode, - iso_date(rr->u.TF.times[cnt++].time, 0), - 0); + if ((rr->u.TF.flags & TF_MODIFY) && size <= slen) { + inode_set_mtime_to_ts(inode, + iso_date(rr->u.TF.data + size * cnt++, flags)); + slen -= size; } - if (rr->u.TF.flags & TF_ACCESS) { - inode_set_atime(inode, - iso_date(rr->u.TF.times[cnt++].time, 0), - 0); + if ((rr->u.TF.flags & TF_ACCESS) && size <= slen) { + inode_set_atime_to_ts(inode, + iso_date(rr->u.TF.data + size * cnt++, flags)); + slen -= size; } - if (rr->u.TF.flags & TF_ATTRIBUTES) { - inode_set_ctime(inode, - iso_date(rr->u.TF.times[cnt++].time, 0), - 0); + if ((rr->u.TF.flags & TF_ATTRIBUTES) && size <= slen) { + inode_set_ctime_to_ts(inode, + iso_date(rr->u.TF.data + size * cnt++, flags)); + slen -= size; } break; + } case SIG('S', 'L'): { int slen; diff --git a/fs/isofs/rock.h b/fs/isofs/rock.h index 7755e587f7785..c0856fa9bb6a4 100644 --- a/fs/isofs/rock.h +++ b/fs/isofs/rock.h @@ -65,13 +65,9 @@ struct RR_PL_s { __u8 location[8]; }; -struct stamp { - __u8 time[7]; /* actually 6 unsigned, 1 signed */ -} __attribute__ ((packed)); - struct RR_TF_s { __u8 flags; - struct stamp times[]; /* Variable number of these beasts */ + __u8 data[]; } __attribute__ ((packed)); /* Linux-specific extension for transparent decompression */ diff --git a/fs/isofs/util.c b/fs/isofs/util.c index e88dba7216618..42f479da0b282 100644 --- a/fs/isofs/util.c +++ b/fs/isofs/util.c @@ -16,29 +16,44 @@ * to GMT. Thus we should always be correct. */ -int iso_date(u8 *p, int flag) +struct timespec64 iso_date(u8 *p, int flags) { int year, month, day, hour, minute, second, tz; - int crtime; + struct timespec64 ts; + + if (flags & ISO_DATE_LONG_FORM) { + year = (p[0] - '0') * 1000 + + (p[1] - '0') * 100 + + (p[2] - '0') * 10 + + (p[3] - '0') - 1900; + month = ((p[4] - '0') * 10 + (p[5] - '0')); + day = ((p[6] - '0') * 10 + (p[7] - '0')); + hour = ((p[8] - '0') * 10 + (p[9] - '0')); + minute = ((p[10] - '0') * 10 + (p[11] - '0')); + second = ((p[12] - '0') * 10 + (p[13] - '0')); + ts.tv_nsec = ((p[14] - '0') * 10 + (p[15] - '0')) * 10000000; + tz = p[16]; + } else { + year = p[0]; + month = p[1]; + day = p[2]; + hour = p[3]; + minute = p[4]; + second = p[5]; + ts.tv_nsec = 0; + /* High sierra has no time zone */ + tz = flags & ISO_DATE_HIGH_SIERRA ? 0 : p[6]; + } - year = p[0]; - month = p[1]; - day = p[2]; - hour = p[3]; - minute = p[4]; - second = p[5]; - if (flag == 0) tz = p[6]; /* High sierra has no time zone */ - else tz = 0; - if (year < 0) { - crtime = 0; + ts.tv_sec = 0; } else { - crtime = mktime64(year+1900, month, day, hour, minute, second); + ts.tv_sec = mktime64(year+1900, month, day, hour, minute, second); /* sign extend */ if (tz & 0x80) tz |= (-1 << 8); - + /* * The timezone offset is unreliable on some disks, * so we make a sanity check. In no case is it ever @@ -65,7 +80,7 @@ int iso_date(u8 *p, int flag) * for pointing out the sign error. */ if (-52 <= tz && tz <= 52) - crtime -= tz * 15 * 60; + ts.tv_sec -= tz * 15 * 60; } - return crtime; -} + return ts; +} -- GitLab From d728dfafc10a95895c62f3f1afd0847cca83024c Mon Sep 17 00:00:00 2001 From: Mike Looijmans Date: Fri, 14 Mar 2025 16:17:45 +0100 Subject: [PATCH 1474/2211] pinctrl: mcp23s08: Reset all pins to input at probe [ Upstream commit 3ede3f8b4b4b399b0ca41e44959f80d5cf84fc98 ] At startup, the driver just assumes that all registers have their default values. But after a soft reset, the chip will just be in the state it was, and some pins may have been configured as outputs. Any modification of the output register will cause these pins to be driven low, which leads to unexpected/unwanted effects. To prevent this from happening, set the chip's IO configuration register to a known safe mode (all inputs) before toggling any other bits. Signed-off-by: Mike Looijmans Link: https://lore.kernel.org/20250314151803.28903-1-mike.looijmans@topic.nl Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin --- drivers/pinctrl/pinctrl-mcp23s08.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c index 70d7485ada364..60fcd53830a7d 100644 --- a/drivers/pinctrl/pinctrl-mcp23s08.c +++ b/drivers/pinctrl/pinctrl-mcp23s08.c @@ -636,6 +636,14 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev, mcp->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); + /* + * Reset the chip - we don't really know what state it's in, so reset + * all pins to input first to prevent surprises. + */ + ret = mcp_write(mcp, MCP_IODIR, mcp->chip.ngpio == 16 ? 0xFFFF : 0xFF); + if (ret < 0) + return ret; + /* verify MCP_IOCON.SEQOP = 0, so sequential reads work, * and MCP_IOCON.HAEN = 1, so we work with all chips. */ -- GitLab From 41afa1abc1cd108502e946b69a360b7672f09669 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Singh Date: Tue, 8 Apr 2025 11:36:31 +0530 Subject: [PATCH 1475/2211] wifi: ath12k: fix failed to set mhi state error during reboot with hardware grouping [ Upstream commit dce7aec6b1f74b0a46b901ab8de1f7bd0515f733 ] With hardware grouping, during reboot, whenever a device is removed, it powers down itself and all its partner devices in the same group. Now this is done by all devices and hence there is multiple power down for devices and hence the following error messages can be seen: ath12k_pci 0002:01:00.0: failed to set mhi state POWER_OFF(3) in current mhi state (0x0) ath12k_pci 0002:01:00.0: failed to set mhi state: POWER_OFF(3) ath12k_pci 0002:01:00.0: failed to set mhi state DEINIT(1) in current mhi state (0x0) ath12k_pci 0002:01:00.0: failed to set mhi state: DEINIT(1) ath12k_pci 0003:01:00.0: failed to set mhi state POWER_OFF(3) in current mhi state (0x0) ath12k_pci 0003:01:00.0: failed to set mhi state: POWER_OFF(3) ath12k_pci 0003:01:00.0: failed to set mhi state DEINIT(1) in current mhi state (0x0) ath12k_pci 0003:01:00.0: failed to set mhi state: DEINIT(1) ath12k_pci 0004:01:00.0: failed to set mhi state POWER_OFF(3) in current mhi state (0x0) ath12k_pci 0004:01:00.0: failed to set mhi state: POWER_OFF(3) To prevent this, check if the ATH12K_PCI_FLAG_INIT_DONE flag is already set before powering down. If it is set, it indicates that another partner device has already performed the power down, and this device can skip this step. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Signed-off-by: Aditya Kumar Singh Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250408-fix_reboot_issues_with_hw_grouping-v4-3-95e7bf048595@oss.qualcomm.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/pci.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/wireless/ath/ath12k/pci.c b/drivers/net/wireless/ath/ath12k/pci.c index 26f4b440c26d2..0f0e13c3dd463 100644 --- a/drivers/net/wireless/ath/ath12k/pci.c +++ b/drivers/net/wireless/ath/ath12k/pci.c @@ -1301,6 +1301,9 @@ void ath12k_pci_power_down(struct ath12k_base *ab, bool is_suspend) { struct ath12k_pci *ab_pci = ath12k_pci_priv(ab); + if (!test_bit(ATH12K_PCI_FLAG_INIT_DONE, &ab_pci->flags)) + return; + /* restore aspm in case firmware bootup fails */ ath12k_pci_aspm_restore(ab_pci); -- GitLab From 2f63bf0d2b146956a2f2ff3b25cee71019e64561 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Wed, 9 Apr 2025 13:34:22 +0200 Subject: [PATCH 1476/2211] scsi: lpfc: Use memcpy() for BIOS version [ Upstream commit ae82eaf4aeea060bb736c3e20c0568b67c701d7d ] The strlcat() with FORTIFY support is triggering a panic because it thinks the target buffer will overflow although the correct target buffer size is passed in. Anyway, instead of memset() with 0 followed by a strlcat(), just use memcpy() and ensure that the resulting buffer is NULL terminated. BIOSVersion is only used for the lpfc_printf_log() which expects a properly terminated string. Signed-off-by: Daniel Wagner Link: https://lore.kernel.org/r/20250409-fix-lpfc-bios-str-v1-1-05dac9e51e13@kernel.org Reviewed-by: Justin Tee Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/lpfc/lpfc_sli.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 6748fba48a07e..4dccbaeb63283 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -6020,9 +6020,9 @@ lpfc_sli4_get_ctl_attr(struct lpfc_hba *phba) phba->sli4_hba.flash_id = bf_get(lpfc_cntl_attr_flash_id, cntl_attr); phba->sli4_hba.asic_rev = bf_get(lpfc_cntl_attr_asic_rev, cntl_attr); - memset(phba->BIOSVersion, 0, sizeof(phba->BIOSVersion)); - strlcat(phba->BIOSVersion, (char *)cntl_attr->bios_ver_str, + memcpy(phba->BIOSVersion, cntl_attr->bios_ver_str, sizeof(phba->BIOSVersion)); + phba->BIOSVersion[sizeof(phba->BIOSVersion) - 1] = '\0'; lpfc_printf_log(phba, KERN_INFO, LOG_SLI, "3086 lnk_type:%d, lnk_numb:%d, bios_ver:%s, " -- GitLab From b7129ef57d96721e218089555cabe7f6725bb899 Mon Sep 17 00:00:00 2001 From: Zijun Hu Date: Thu, 10 Apr 2025 09:01:27 +0800 Subject: [PATCH 1477/2211] sock: Correct error checking condition for (assign|release)_proto_idx() [ Upstream commit faeefc173be40512341b102cf1568aa0b6571acd ] (assign|release)_proto_idx() wrongly check find_first_zero_bit() failure by condition '(prot->inuse_idx == PROTO_INUSE_NR - 1)' obviously. Fix by correcting the condition to '(prot->inuse_idx == PROTO_INUSE_NR)' Signed-off-by: Zijun Hu Reviewed-by: Kuniyuki Iwashima Link: https://patch.msgid.link/20250410-fix_net-v2-1-d69e7c5739a4@quicinc.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/core/sock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/core/sock.c b/net/core/sock.c index 3c5386c76d6fe..9c63da2829f6e 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -3930,7 +3930,7 @@ static int assign_proto_idx(struct proto *prot) { prot->inuse_idx = find_first_zero_bit(proto_inuse_idx, PROTO_INUSE_NR); - if (unlikely(prot->inuse_idx == PROTO_INUSE_NR - 1)) { + if (unlikely(prot->inuse_idx == PROTO_INUSE_NR)) { pr_err("PROTO_INUSE_NR exhausted\n"); return -ENOSPC; } @@ -3941,7 +3941,7 @@ static int assign_proto_idx(struct proto *prot) static void release_proto_idx(struct proto *prot) { - if (prot->inuse_idx != PROTO_INUSE_NR - 1) + if (prot->inuse_idx != PROTO_INUSE_NR) clear_bit(prot->inuse_idx, proto_inuse_idx); } #else -- GitLab From 3502dd42f178dae9d54696013386bb52b4f2e655 Mon Sep 17 00:00:00 2001 From: Kyungwook Boo Date: Tue, 11 Mar 2025 14:16:02 +0900 Subject: [PATCH 1478/2211] i40e: fix MMIO write access to an invalid page in i40e_clear_hw [ Upstream commit 015bac5daca978448f2671478c553ce1f300c21e ] When the device sends a specific input, an integer underflow can occur, leading to MMIO write access to an invalid page. Prevent the integer underflow by changing the type of related variables. Signed-off-by: Kyungwook Boo Link: https://lore.kernel.org/lkml/ffc91764-1142-4ba2-91b6-8c773f6f7095@gmail.com/T/ Reviewed-by: Przemek Kitszel Reviewed-by: Simon Horman Reviewed-by: Aleksandr Loktionov Tested-by: Rinitha S (A Contingent worker at Intel) Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/i40e/i40e_common.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c index e8031f1a9b4fc..2f5a850148676 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_common.c +++ b/drivers/net/ethernet/intel/i40e/i40e_common.c @@ -817,10 +817,11 @@ int i40e_pf_reset(struct i40e_hw *hw) void i40e_clear_hw(struct i40e_hw *hw) { u32 num_queues, base_queue; - u32 num_pf_int; - u32 num_vf_int; + s32 num_pf_int; + s32 num_vf_int; u32 num_vfs; - u32 i, j; + s32 i; + u32 j; u32 val; u32 eol = 0x7ff; -- GitLab From 098983de3f69205c3333795fe6a990eb5b39fc5c Mon Sep 17 00:00:00 2001 From: Rand Deeb Date: Thu, 6 Mar 2025 13:12:00 +0300 Subject: [PATCH 1479/2211] ixgbe: Fix unreachable retry logic in combined and byte I2C write functions [ Upstream commit cdcb3804eeda24d588348bbab6766cf14fddbeaa ] The current implementation of `ixgbe_write_i2c_combined_generic_int` and `ixgbe_write_i2c_byte_generic_int` sets `max_retry` to `1`, which makes the condition `retry < max_retry` always evaluate to `false`. This renders the retry mechanism ineffective, as the debug message and retry logic are never executed. This patch increases `max_retry` to `3` in both functions, aligning them with the retry logic in `ixgbe_read_i2c_combined_generic_int`. This ensures that the retry mechanism functions as intended, improving robustness in case of I2C write failures. Found by Linux Verification Center (linuxtesting.org) with SVACE. Signed-off-by: Rand Deeb Tested-by: Rinitha S (A Contingent worker at Intel) Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c index 07eaa3c3f4d36..530e4319a2e89 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c @@ -167,7 +167,7 @@ int ixgbe_write_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr, u16 reg, u16 val, bool lock) { u32 swfw_mask = hw->phy.phy_semaphore_mask; - int max_retry = 1; + int max_retry = 3; int retry = 0; u8 reg_high; u8 csum; @@ -2284,7 +2284,7 @@ static int ixgbe_write_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset, u8 dev_addr, u8 data, bool lock) { u32 swfw_mask = hw->phy.phy_semaphore_mask; - u32 max_retry = 1; + u32 max_retry = 3; u32 retry = 0; int status; -- GitLab From 94bf4146af0f6cca3333dab3a67e32dbccb30dac Mon Sep 17 00:00:00 2001 From: Chen Linxuan Date: Fri, 11 Apr 2025 18:54:53 +0800 Subject: [PATCH 1480/2211] RDMA/hns: initialize db in update_srq_db() [ Upstream commit ffe1cee21f8b533ae27c3a31bfa56b8c1b27fa6e ] On x86_64 with gcc version 13.3.0, I compile drivers/infiniband/hw/hns/hns_roce_hw_v2.c with: make defconfig ./scripts/kconfig/merge_config.sh .config <( echo CONFIG_COMPILE_TEST=y echo CONFIG_HNS3=m echo CONFIG_INFINIBAND=m echo CONFIG_INFINIBAND_HNS_HIP08=m ) make KCFLAGS="-fno-inline-small-functions -fno-inline-functions-called-once" \ drivers/infiniband/hw/hns/hns_roce_hw_v2.o Then I get a compile error: CALL scripts/checksyscalls.sh DESCEND objtool INSTALL libsubcmd_headers CC [M] drivers/infiniband/hw/hns/hns_roce_hw_v2.o In file included from drivers/infiniband/hw/hns/hns_roce_hw_v2.c:47: drivers/infiniband/hw/hns/hns_roce_hw_v2.c: In function 'update_srq_db': drivers/infiniband/hw/hns/hns_roce_common.h:74:17: error: 'db' is used uninitialized [-Werror=uninitialized] 74 | *((__le32 *)_ptr + (field_h) / 32) &= \ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/infiniband/hw/hns/hns_roce_common.h:90:17: note: in expansion of macro '_hr_reg_clear' 90 | _hr_reg_clear(ptr, field_type, field_h, field_l); \ | ^~~~~~~~~~~~~ drivers/infiniband/hw/hns/hns_roce_common.h:95:39: note: in expansion of macro '_hr_reg_write' 95 | #define hr_reg_write(ptr, field, val) _hr_reg_write(ptr, field, val) | ^~~~~~~~~~~~~ drivers/infiniband/hw/hns/hns_roce_hw_v2.c:948:9: note: in expansion of macro 'hr_reg_write' 948 | hr_reg_write(&db, DB_TAG, srq->srqn); | ^~~~~~~~~~~~ drivers/infiniband/hw/hns/hns_roce_hw_v2.c:946:31: note: 'db' declared here 946 | struct hns_roce_v2_db db; | ^~ cc1: all warnings being treated as errors Signed-off-by: Chen Linxuan Co-developed-by: Winston Wen Signed-off-by: Winston Wen Link: https://patch.msgid.link/FF922C77946229B6+20250411105459.90782-5-chenlinxuan@uniontech.com Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c index 985b9d7d69f20..81e44b7381229 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c @@ -942,7 +942,7 @@ static void fill_wqe_idx(struct hns_roce_srq *srq, unsigned int wqe_idx) static void update_srq_db(struct hns_roce_srq *srq) { struct hns_roce_dev *hr_dev = to_hr_dev(srq->ibsrq.device); - struct hns_roce_v2_db db; + struct hns_roce_v2_db db = {}; hr_reg_write(&db, DB_TAG, srq->srqn); hr_reg_write(&db, DB_CMD, HNS_ROCE_V2_SRQ_DB); -- GitLab From 7a08a9d6f5575d43e49a46dcf58213a6ee5c3671 Mon Sep 17 00:00:00 2001 From: Mateusz Pacuszka Date: Fri, 14 Feb 2025 09:50:35 +0100 Subject: [PATCH 1481/2211] ice: fix check for existing switch rule [ Upstream commit a808691df39b52cd9db861b118e88e18b63e2299 ] In case the rule already exists and another VSI wants to subscribe to it new VSI list is being created and both VSIs are moved to it. Currently, the check for already existing VSI with the same rule is done based on fdw_id.hw_vsi_id, which applies only to LOOKUP_RX flag. Change it to vsi_handle. This is software VSI ID, but it can be applied here, because vsi_map itself is also based on it. Additionally change return status in case the VSI already exists in the VSI map to "Already exists". Such case should be handled by the caller. Signed-off-by: Mateusz Pacuszka Reviewed-by: Przemek Kitszel Reviewed-by: Michal Swiatkowski Signed-off-by: Larysa Zaremba Reviewed-by: Simon Horman Tested-by: Rafal Romanowski Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ice/ice_switch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c b/drivers/net/ethernet/intel/ice/ice_switch.c index 0e740342e2947..c5430363e7081 100644 --- a/drivers/net/ethernet/intel/ice/ice_switch.c +++ b/drivers/net/ethernet/intel/ice/ice_switch.c @@ -3146,7 +3146,7 @@ ice_add_update_vsi_list(struct ice_hw *hw, u16 vsi_handle_arr[2]; /* A rule already exists with the new VSI being added */ - if (cur_fltr->fwd_id.hw_vsi_id == new_fltr->fwd_id.hw_vsi_id) + if (cur_fltr->vsi_handle == new_fltr->vsi_handle) return -EEXIST; vsi_handle_arr[0] = cur_fltr->vsi_handle; @@ -5977,7 +5977,7 @@ ice_adv_add_update_vsi_list(struct ice_hw *hw, /* A rule already exists with the new VSI being added */ if (test_bit(vsi_handle, m_entry->vsi_list_info->vsi_map)) - return 0; + return -EEXIST; /* Update the previously created VSI list set with * the new VSI ID passed in -- GitLab From 3d2fdb77cea5a260e9f79c456b06575ec8ea2522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Ha=C5=82asa?= Date: Tue, 8 Apr 2025 13:59:41 +0200 Subject: [PATCH 1482/2211] usbnet: asix AX88772: leave the carrier control to phylink MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 4145f00227ee80f21ab274e9cd9c09758e9bcf3d ] ASIX AX88772B based USB 10/100 Ethernet adapter doesn't come up ("carrier off"), despite the built-in 100BASE-FX PHY positive link indication. The internal PHY is configured (using EEPROM) in fixed 100 Mbps full duplex mode. The primary problem appears to be using carrier_netif_{on,off}() while, at the same time, delegating carrier management to phylink. Use only the latter and remove "manual control" in the asix driver. I don't have any other AX88772 board here, but the problem doesn't seem specific to a particular board or settings - it's probably timing-dependent. Remove unused asix_adjust_link() as well. Signed-off-by: Krzysztof Hałasa Tested-by: Oleksij Rempel Link: https://patch.msgid.link/m3plhmdfte.fsf_-_@t19.piap.pl Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/usb/asix.h | 1 - drivers/net/usb/asix_common.c | 22 ---------------------- drivers/net/usb/asix_devices.c | 17 ++++------------- 3 files changed, 4 insertions(+), 36 deletions(-) diff --git a/drivers/net/usb/asix.h b/drivers/net/usb/asix.h index 74162190bccc1..8531b804021aa 100644 --- a/drivers/net/usb/asix.h +++ b/drivers/net/usb/asix.h @@ -224,7 +224,6 @@ int asix_write_rx_ctl(struct usbnet *dev, u16 mode, int in_pm); u16 asix_read_medium_status(struct usbnet *dev, int in_pm); int asix_write_medium_mode(struct usbnet *dev, u16 mode, int in_pm); -void asix_adjust_link(struct net_device *netdev); int asix_write_gpio(struct usbnet *dev, u16 value, int sleep, int in_pm); diff --git a/drivers/net/usb/asix_common.c b/drivers/net/usb/asix_common.c index 72ffc89b477ad..7fd763917ae2c 100644 --- a/drivers/net/usb/asix_common.c +++ b/drivers/net/usb/asix_common.c @@ -414,28 +414,6 @@ int asix_write_medium_mode(struct usbnet *dev, u16 mode, int in_pm) return ret; } -/* set MAC link settings according to information from phylib */ -void asix_adjust_link(struct net_device *netdev) -{ - struct phy_device *phydev = netdev->phydev; - struct usbnet *dev = netdev_priv(netdev); - u16 mode = 0; - - if (phydev->link) { - mode = AX88772_MEDIUM_DEFAULT; - - if (phydev->duplex == DUPLEX_HALF) - mode &= ~AX_MEDIUM_FD; - - if (phydev->speed != SPEED_100) - mode &= ~AX_MEDIUM_PS; - } - - asix_write_medium_mode(dev, mode, 0); - phy_print_status(phydev); - usbnet_link_change(dev, phydev->link, 0); -} - int asix_write_gpio(struct usbnet *dev, u16 value, int sleep, int in_pm) { int ret; diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c index da24941a6e444..9b0318fb50b55 100644 --- a/drivers/net/usb/asix_devices.c +++ b/drivers/net/usb/asix_devices.c @@ -752,7 +752,6 @@ static void ax88772_mac_link_down(struct phylink_config *config, struct usbnet *dev = netdev_priv(to_net_dev(config->dev)); asix_write_medium_mode(dev, 0, 0); - usbnet_link_change(dev, false, false); } static void ax88772_mac_link_up(struct phylink_config *config, @@ -783,7 +782,6 @@ static void ax88772_mac_link_up(struct phylink_config *config, m |= AX_MEDIUM_RFC; asix_write_medium_mode(dev, m, 0); - usbnet_link_change(dev, true, false); } static const struct phylink_mac_ops ax88772_phylink_mac_ops = { @@ -1350,10 +1348,9 @@ static const struct driver_info ax88772_info = { .description = "ASIX AX88772 USB 2.0 Ethernet", .bind = ax88772_bind, .unbind = ax88772_unbind, - .status = asix_status, .reset = ax88772_reset, .stop = ax88772_stop, - .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | FLAG_MULTI_PACKET, + .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_MULTI_PACKET, .rx_fixup = asix_rx_fixup_common, .tx_fixup = asix_tx_fixup, }; @@ -1362,11 +1359,9 @@ static const struct driver_info ax88772b_info = { .description = "ASIX AX88772B USB 2.0 Ethernet", .bind = ax88772_bind, .unbind = ax88772_unbind, - .status = asix_status, .reset = ax88772_reset, .stop = ax88772_stop, - .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | - FLAG_MULTI_PACKET, + .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_MULTI_PACKET, .rx_fixup = asix_rx_fixup_common, .tx_fixup = asix_tx_fixup, .data = FLAG_EEPROM_MAC, @@ -1376,11 +1371,9 @@ static const struct driver_info lxausb_t1l_info = { .description = "Linux Automation GmbH USB 10Base-T1L", .bind = ax88772_bind, .unbind = ax88772_unbind, - .status = asix_status, .reset = ax88772_reset, .stop = ax88772_stop, - .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | - FLAG_MULTI_PACKET, + .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_MULTI_PACKET, .rx_fixup = asix_rx_fixup_common, .tx_fixup = asix_tx_fixup, .data = FLAG_EEPROM_MAC, @@ -1412,10 +1405,8 @@ static const struct driver_info hg20f9_info = { .description = "HG20F9 USB 2.0 Ethernet", .bind = ax88772_bind, .unbind = ax88772_unbind, - .status = asix_status, .reset = ax88772_reset, - .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | - FLAG_MULTI_PACKET, + .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_MULTI_PACKET, .rx_fixup = asix_rx_fixup_common, .tx_fixup = asix_tx_fixup, .data = FLAG_EEPROM_MAC, -- GitLab From a58f0a0e991392f5f291ce8937aa321af275c30a Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Thu, 27 Mar 2025 13:56:06 +0800 Subject: [PATCH 1483/2211] f2fs: fix to set atomic write status more clear [ Upstream commit db03c20c0850dc8d2bcabfa54b9438f7d666c863 ] 1. After we start atomic write in a database file, before committing all data, we'd better not set inode w/ vfs dirty status to avoid redundant updates, instead, we only set inode w/ atomic dirty status. 2. After we commit all data, before committing metadata, we need to clear atomic dirty status, and set vfs dirty status to allow vfs flush dirty inode. Cc: Daeho Jeong Reported-by: Zhiguo Niu Signed-off-by: Chao Yu Reviewed-by: Daeho Jeong Reviewed-by: Zhiguo Niu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/inode.c | 4 +++- fs/f2fs/segment.c | 6 ++++++ fs/f2fs/super.c | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 50e64b7b016dc..06688b9957c81 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -34,7 +34,9 @@ void f2fs_mark_inode_dirty_sync(struct inode *inode, bool sync) if (f2fs_inode_dirtied(inode, sync)) return; - if (f2fs_is_atomic_file(inode)) + /* only atomic file w/ FI_ATOMIC_COMMITTED can be set vfs dirty */ + if (f2fs_is_atomic_file(inode) && + !is_inode_flag_set(inode, FI_ATOMIC_COMMITTED)) return; mark_inode_dirty_sync(inode); diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 769a90b609e2c..449c0acbfabc0 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -370,7 +370,13 @@ out: } else { sbi->committed_atomic_block += fi->atomic_write_cnt; set_inode_flag(inode, FI_ATOMIC_COMMITTED); + + /* + * inode may has no FI_ATOMIC_DIRTIED flag due to no write + * before commit. + */ if (is_inode_flag_set(inode, FI_ATOMIC_DIRTIED)) { + /* clear atomic dirty status and set vfs dirty status */ clear_inode_flag(inode, FI_ATOMIC_DIRTIED); f2fs_mark_inode_dirty_sync(inode, true); } diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index b1ab7ee2adf9c..330f89ddb5c8f 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1516,7 +1516,9 @@ int f2fs_inode_dirtied(struct inode *inode, bool sync) } spin_unlock(&sbi->inode_lock[DIRTY_META]); - if (!ret && f2fs_is_atomic_file(inode)) + /* if atomic write is not committed, set inode w/ atomic dirty */ + if (!ret && f2fs_is_atomic_file(inode) && + !is_inode_flag_set(inode, FI_ATOMIC_COMMITTED)) set_inode_flag(inode, FI_ATOMIC_DIRTIED); return ret; -- GitLab From b8b4b8bb346a8e0703d05c86477bf0a85e30335d Mon Sep 17 00:00:00 2001 From: Jiayuan Chen Date: Mon, 7 Apr 2025 22:21:20 +0800 Subject: [PATCH 1484/2211] bpf, sockmap: Fix data lost during EAGAIN retries [ Upstream commit 7683167196bd727ad5f3c3fc6a9ca70f54520a81 ] We call skb_bpf_redirect_clear() to clean _sk_redir before handling skb in backlog, but when sk_psock_handle_skb() return EAGAIN due to sk_rcvbuf limit, the redirect info in _sk_redir is not recovered. Fix skb redir loss during EAGAIN retries by restoring _sk_redir information using skb_bpf_set_redir(). Before this patch: ''' ./bench sockmap -c 2 -p 1 -a --rx-verdict-ingress Setting up benchmark 'sockmap'... create socket fd c1:13 p1:14 c2:15 p2:16 Benchmark 'sockmap' started. Send Speed 1343.172 MB/s, BPF Speed 1343.238 MB/s, Rcv Speed 65.271 MB/s Send Speed 1352.022 MB/s, BPF Speed 1352.088 MB/s, Rcv Speed 0 MB/s Send Speed 1354.105 MB/s, BPF Speed 1354.105 MB/s, Rcv Speed 0 MB/s Send Speed 1355.018 MB/s, BPF Speed 1354.887 MB/s, Rcv Speed 0 MB/s ''' Due to the high send rate, the RX processing path may frequently hit the sk_rcvbuf limit. Once triggered, incorrect _sk_redir will cause the flow to mistakenly enter the "!ingress" path, leading to send failures. (The Rcv speed depends on tcp_rmem). After this patch: ''' ./bench sockmap -c 2 -p 1 -a --rx-verdict-ingress Setting up benchmark 'sockmap'... create socket fd c1:13 p1:14 c2:15 p2:16 Benchmark 'sockmap' started. Send Speed 1347.236 MB/s, BPF Speed 1347.367 MB/s, Rcv Speed 65.402 MB/s Send Speed 1353.320 MB/s, BPF Speed 1353.320 MB/s, Rcv Speed 65.536 MB/s Send Speed 1353.186 MB/s, BPF Speed 1353.121 MB/s, Rcv Speed 65.536 MB/s ''' Signed-off-by: Jiayuan Chen Link: https://lore.kernel.org/r/20250407142234.47591-2-jiayuan.chen@linux.dev Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- net/core/skmsg.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/core/skmsg.c b/net/core/skmsg.c index a8d238dd982af..97f52394d1eb1 100644 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c @@ -689,7 +689,8 @@ static void sk_psock_backlog(struct work_struct *work) if (ret <= 0) { if (ret == -EAGAIN) { sk_psock_skb_state(psock, state, len, off); - + /* Restore redir info we cleared before */ + skb_bpf_set_redir(skb, psock->sk, ingress); /* Delay slightly to prioritize any * other work that might be here. */ -- GitLab From 2bd434bb0eeb680c2b3dd6c68ca319b30cb8d47f Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Tue, 8 Apr 2025 11:26:58 +0200 Subject: [PATCH 1485/2211] net: ethernet: cortina: Use TOE/TSO on all TCP [ Upstream commit 6a07e3af4973402fa199a80036c10060b922c92c ] It is desireable to push the hardware accelerator to also process non-segmented TCP frames: we pass the skb->len to the "TOE/TSO" offloader and it will handle them. Without this quirk the driver becomes unstable and lock up and and crash. I do not know exactly why, but it is probably due to the TOE (TCP offload engine) feature that is coupled with the segmentation feature - it is not possible to turn one part off and not the other, either both TOE and TSO are active, or neither of them. Not having the TOE part active seems detrimental, as if that hardware feature is not really supposed to be turned off. The datasheet says: "Based on packet parsing and TCP connection/NAT table lookup results, the NetEngine puts the packets belonging to the same TCP connection to the same queue for the software to process. The NetEngine puts incoming packets to the buffer or series of buffers for a jumbo packet. With this hardware acceleration, IP/TCP header parsing, checksum validation and connection lookup are offloaded from the software processing." After numerous tests with the hardware locking up after something between minutes and hours depending on load using iperf3 I have concluded this is necessary to stabilize the hardware. Signed-off-by: Linus Walleij Link: https://patch.msgid.link/20250408-gemini-ethernet-tso-always-v1-1-e669f932359c@linaro.org Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/cortina/gemini.c | 37 +++++++++++++++++++++------ 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/cortina/gemini.c b/drivers/net/ethernet/cortina/gemini.c index 73e1c71c5092e..92833eefc04b4 100644 --- a/drivers/net/ethernet/cortina/gemini.c +++ b/drivers/net/ethernet/cortina/gemini.c @@ -1143,6 +1143,7 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb, struct gmac_txdesc *txd; skb_frag_t *skb_frag; dma_addr_t mapping; + bool tcp = false; void *buffer; u16 mss; int ret; @@ -1150,6 +1151,13 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb, word1 = skb->len; word3 = SOF_BIT; + /* Determine if we are doing TCP */ + if (skb->protocol == htons(ETH_P_IP)) + tcp = (ip_hdr(skb)->protocol == IPPROTO_TCP); + else + /* IPv6 */ + tcp = (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP); + mss = skb_shinfo(skb)->gso_size; if (mss) { /* This means we are dealing with TCP and skb->len is the @@ -1162,8 +1170,26 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb, mss, skb->len); word1 |= TSS_MTU_ENABLE_BIT; word3 |= mss; + } else if (tcp) { + /* Even if we are not using TSO, use the hardware offloader + * for transferring the TCP frame: this hardware has partial + * TCP awareness (called TOE - TCP Offload Engine) and will + * according to the datasheet put packets belonging to the + * same TCP connection in the same queue for the TOE/TSO + * engine to process. The engine will deal with chopping + * up frames that exceed ETH_DATA_LEN which the + * checksumming engine cannot handle (see below) into + * manageable chunks. It flawlessly deals with quite big + * frames and frames containing custom DSA EtherTypes. + */ + mss = netdev->mtu + skb_tcp_all_headers(skb); + mss = min(mss, skb->len); + netdev_dbg(netdev, "TOE/TSO len %04x mtu %04x mss %04x\n", + skb->len, netdev->mtu, mss); + word1 |= TSS_MTU_ENABLE_BIT; + word3 |= mss; } else if (skb->len >= ETH_FRAME_LEN) { - /* Hardware offloaded checksumming isn't working on frames + /* Hardware offloaded checksumming isn't working on non-TCP frames * bigger than 1514 bytes. A hypothesis about this is that the * checksum buffer is only 1518 bytes, so when the frames get * bigger they get truncated, or the last few bytes get @@ -1180,21 +1206,16 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb, } if (skb->ip_summed == CHECKSUM_PARTIAL) { - int tcp = 0; - /* We do not switch off the checksumming on non TCP/UDP * frames: as is shown from tests, the checksumming engine * is smart enough to see that a frame is not actually TCP * or UDP and then just pass it through without any changes * to the frame. */ - if (skb->protocol == htons(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) word1 |= TSS_IP_CHKSUM_BIT; - tcp = ip_hdr(skb)->protocol == IPPROTO_TCP; - } else { /* IPv6 */ + else word1 |= TSS_IPV6_ENABLE_BIT; - tcp = ipv6_hdr(skb)->nexthdr == IPPROTO_TCP; - } word1 |= tcp ? TSS_TCP_CHKSUM_BIT : TSS_UDP_CHKSUM_BIT; } -- GitLab From 21b5d9a2b63daa923e9dd1a18b662bff2546f192 Mon Sep 17 00:00:00 2001 From: Wentao Liang Date: Tue, 8 Apr 2025 11:26:02 +0800 Subject: [PATCH 1486/2211] octeontx2-pf: Add error log forcn10k_map_unmap_rq_policer() [ Upstream commit 9c056ec6dd1654b1420dafbbe2a69718850e6ff2 ] The cn10k_free_matchall_ipolicer() calls the cn10k_map_unmap_rq_policer() for each queue in a for loop without checking for any errors. Check the return value of the cn10k_map_unmap_rq_policer() function during each loop, and report a warning if the function fails. Signed-off-by: Wentao Liang Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250408032602.2909-1-vulab@iscas.ac.cn Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/marvell/octeontx2/nic/cn10k.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/cn10k.c b/drivers/net/ethernet/marvell/octeontx2/nic/cn10k.c index 7417087b6db59..a2807a1e4f4a6 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/cn10k.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/cn10k.c @@ -352,9 +352,12 @@ int cn10k_free_matchall_ipolicer(struct otx2_nic *pfvf) mutex_lock(&pfvf->mbox.lock); /* Remove RQ's policer mapping */ - for (qidx = 0; qidx < hw->rx_queues; qidx++) - cn10k_map_unmap_rq_policer(pfvf, qidx, - hw->matchall_ipolicer, false); + for (qidx = 0; qidx < hw->rx_queues; qidx++) { + rc = cn10k_map_unmap_rq_policer(pfvf, qidx, hw->matchall_ipolicer, false); + if (rc) + dev_warn(pfvf->dev, "Failed to unmap RQ %d's policer (error %d).", + qidx, rc); + } rc = cn10k_free_leaf_profile(pfvf, hw->matchall_ipolicer); -- GitLab From f9eee822b4205da4783c246b0bafd79d7392d53a Mon Sep 17 00:00:00 2001 From: Baochen Qiang Date: Fri, 28 Mar 2025 13:32:24 +0800 Subject: [PATCH 1487/2211] wifi: ath11k: determine PM policy based on machine model [ Upstream commit ce8669a27016354dfa8bf3c954255cb9f3583bae ] To handle the Lenovo unexpected wakeup issue [1], previously we revert commit 166a490f59ac ("wifi: ath11k: support hibernation"). So currently WLAN target is put into WoWLAN mode during suspend. This is a temporary solution as it does not work on machines where WLAN power is cut off. The thought here is that we do WoWLAN suspend on Lenovo machines while do non-WoWLAN suspend (which is done in the reverted commit) on other machines. This requires us to identify Lenovo machines from others. For that purpose, read board vendor and product name from DMI interface, match it against all known affected machines. If there is a match, choose WoWLAN suspend mode, else choose non-WoWLAN mode. Save the mode in ab for later reference. [1] https://bugzilla.kernel.org/show_bug.cgi?id=219196 Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.30 Tested-by: Muhammad Usama Anjum Tested-by: Takashi Iwai Signed-off-by: Baochen Qiang Link: https://patch.msgid.link/20250328-ath11k-bring-hibernation-back-v3-1-23405ae23431@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath11k/core.c | 55 ++++++++++++++++++++++++++ drivers/net/wireless/ath/ath11k/core.h | 7 ++++ 2 files changed, 62 insertions(+) diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c index 8002fb32a2cc1..2ec1771262fd9 100644 --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c @@ -811,6 +811,52 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { }, }; +static const struct dmi_system_id ath11k_pm_quirk_table[] = { + { + .driver_data = (void *)ATH11K_PM_WOW, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "21J4"), + }, + }, + { + .driver_data = (void *)ATH11K_PM_WOW, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "21K4"), + }, + }, + { + .driver_data = (void *)ATH11K_PM_WOW, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "21K6"), + }, + }, + { + .driver_data = (void *)ATH11K_PM_WOW, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "21K8"), + }, + }, + { + .driver_data = (void *)ATH11K_PM_WOW, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "21KA"), + }, + }, + { + .driver_data = (void *)ATH11K_PM_WOW, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "21F9"), + }, + }, + {} +}; + static inline struct ath11k_pdev *ath11k_core_get_single_pdev(struct ath11k_base *ab) { WARN_ON(!ab->hw_params.single_pdev_only); @@ -2197,8 +2243,17 @@ EXPORT_SYMBOL(ath11k_core_pre_init); int ath11k_core_init(struct ath11k_base *ab) { + const struct dmi_system_id *dmi_id; int ret; + dmi_id = dmi_first_match(ath11k_pm_quirk_table); + if (dmi_id) + ab->pm_policy = (kernel_ulong_t)dmi_id->driver_data; + else + ab->pm_policy = ATH11K_PM_DEFAULT; + + ath11k_dbg(ab, ATH11K_DBG_BOOT, "pm policy %u\n", ab->pm_policy); + ret = ath11k_core_soc_create(ab); if (ret) { ath11k_err(ab, "failed to create soc core: %d\n", ret); diff --git a/drivers/net/wireless/ath/ath11k/core.h b/drivers/net/wireless/ath/ath11k/core.h index fcdec14eb3cfa..09fdb7be0e197 100644 --- a/drivers/net/wireless/ath/ath11k/core.h +++ b/drivers/net/wireless/ath/ath11k/core.h @@ -891,6 +891,11 @@ struct ath11k_msi_config { u16 hw_rev; }; +enum ath11k_pm_policy { + ATH11K_PM_DEFAULT, + ATH11K_PM_WOW, +}; + /* Master structure to hold the hw data which may be used in core module */ struct ath11k_base { enum ath11k_hw_rev hw_rev; @@ -1053,6 +1058,8 @@ struct ath11k_base { } testmode; #endif + enum ath11k_pm_policy pm_policy; + /* must be last */ u8 drv_priv[] __aligned(sizeof(void *)); }; -- GitLab From edbfb9752ede076d30a1c2eab8fee41c123e9bdb Mon Sep 17 00:00:00 2001 From: Hari Chandrakanthan Date: Mon, 24 Mar 2025 11:55:09 +0530 Subject: [PATCH 1488/2211] wifi: ath12k: fix link valid field initialization in the monitor Rx [ Upstream commit 2826139f9295821fe2b049318a1cc057ec003131 ] Currently, the link_valid field is not initialized in the monitor Rx path. This can result in random values for the link_valid and link_id leads to undefined behaviour in mac80211. Therefore, initialize the link_valid field in the monitor Rx path. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Signed-off-by: Hari Chandrakanthan Tested-by: Nicolas Escande Reviewed-by: Vasanthakumar Thiagarajan Signed-off-by: Karthikeyan Periyasamy Link: https://patch.msgid.link/20250324062518.2752822-2-quic_periyasa@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/dp_mon.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/wireless/ath/ath12k/dp_mon.c b/drivers/net/wireless/ath/ath12k/dp_mon.c index 6a88745369447..7bfd323cdf244 100644 --- a/drivers/net/wireless/ath/ath12k/dp_mon.c +++ b/drivers/net/wireless/ath/ath12k/dp_mon.c @@ -1080,6 +1080,8 @@ static void ath12k_dp_mon_rx_deliver_msdu(struct ath12k *ar, struct napi_struct bool is_mcbc = rxcb->is_mcbc; bool is_eapol_tkip = rxcb->is_eapol; + status->link_valid = 0; + if ((status->encoding == RX_ENC_HE) && !(status->flag & RX_FLAG_RADIOTAP_HE) && !(status->flag & RX_FLAG_SKIP_MONITOR)) { he = skb_push(msdu, sizeof(known)); -- GitLab From 11127b08210bc93305b70134c1dcc6d529114b4b Mon Sep 17 00:00:00 2001 From: Balamurugan S Date: Fri, 21 Mar 2025 16:22:39 +0530 Subject: [PATCH 1489/2211] wifi: ath12k: fix incorrect CE addresses [ Upstream commit 60031d9c3589c7983fd1deb4a4c0bebf0929890e ] In the current ath12k implementation, the CE addresses CE_HOST_IE_ADDRESS and CE_HOST_IE_2_ADDRESS are incorrect. These values were inherited from ath11k, but ath12k does not currently use them. However, the Ath12k AHB support relies on these addresses. Therefore, correct the CE addresses for ath12k. Tested-on: IPQ5332 hw1.0 AHB WLAN.WBE.1.3.1-00130-QCAHKSWPL_SILICONZ-1 Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.1.1-00210-QCAHKSWPL_SILICONZ-1 Signed-off-by: Balamurugan S Reviewed-by: Vasanthakumar Thiagarajan Signed-off-by: Raj Kumar Bhagat Link: https://patch.msgid.link/20250321-ath12k-ahb-v12-2-bb389ed76ae5@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/ce.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/ce.h b/drivers/net/wireless/ath/ath12k/ce.h index 857bc5f9e946a..f9547a3945e44 100644 --- a/drivers/net/wireless/ath/ath12k/ce.h +++ b/drivers/net/wireless/ath/ath12k/ce.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause-Clear */ /* * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022, 2024-2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef ATH12K_CE_H @@ -39,8 +39,8 @@ #define PIPEDIR_INOUT_H2H 4 /* bidirectional, host to host */ /* CE address/mask */ -#define CE_HOST_IE_ADDRESS 0x00A1803C -#define CE_HOST_IE_2_ADDRESS 0x00A18040 +#define CE_HOST_IE_ADDRESS 0x75804C +#define CE_HOST_IE_2_ADDRESS 0x758050 #define CE_HOST_IE_3_ADDRESS CE_HOST_IE_ADDRESS #define CE_HOST_IE_3_SHIFT 0xC -- GitLab From 4752355037ea7e6691a84984609f7c28783086b0 Mon Sep 17 00:00:00 2001 From: Suraj P Kizhakkethil Date: Tue, 4 Mar 2025 15:23:14 +0530 Subject: [PATCH 1490/2211] wifi: ath12k: Pass correct values of center freq1 and center freq2 for 160 MHz [ Upstream commit b1b01e46a3db5ad44d1e4691ba37c1e0832cd5cf ] Currently, for 160 MHz bandwidth, center frequency1 and center frequency2 are not passed correctly to the firmware. Set center frequency1 as the center frequency of the primary 80 MHz channel segment and center frequency2 as the center frequency of the 160 MHz channel and pass the values to the firmware. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Signed-off-by: Suraj P Kizhakkethil Reviewed-by: Aditya Kumar Singh Link: https://patch.msgid.link/20250304095315.3050325-2-quic_surapk@quicinc.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/wmi.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c index c38d3493c6911..5c2130f77dac6 100644 --- a/drivers/net/wireless/ath/ath12k/wmi.c +++ b/drivers/net/wireless/ath/ath12k/wmi.c @@ -980,14 +980,24 @@ int ath12k_wmi_vdev_down(struct ath12k *ar, u8 vdev_id) static void ath12k_wmi_put_wmi_channel(struct ath12k_wmi_channel_params *chan, struct wmi_vdev_start_req_arg *arg) { + u32 center_freq1 = arg->band_center_freq1; + memset(chan, 0, sizeof(*chan)); chan->mhz = cpu_to_le32(arg->freq); - chan->band_center_freq1 = cpu_to_le32(arg->band_center_freq1); - if (arg->mode == MODE_11AC_VHT80_80) + chan->band_center_freq1 = cpu_to_le32(center_freq1); + if (arg->mode == MODE_11BE_EHT160) { + if (arg->freq > center_freq1) + chan->band_center_freq1 = cpu_to_le32(center_freq1 + 40); + else + chan->band_center_freq1 = cpu_to_le32(center_freq1 - 40); + + chan->band_center_freq2 = cpu_to_le32(center_freq1); + } else if (arg->mode == MODE_11BE_EHT80_80) { chan->band_center_freq2 = cpu_to_le32(arg->band_center_freq2); - else + } else { chan->band_center_freq2 = 0; + } chan->info |= le32_encode_bits(arg->mode, WMI_CHAN_INFO_MODE); if (arg->passive) -- GitLab From 4930ac3bc0368e209040b242db1d7eefdafc894d Mon Sep 17 00:00:00 2001 From: Vlad Dogaru Date: Tue, 22 Apr 2025 12:25:39 +0300 Subject: [PATCH 1491/2211] net/mlx5: HWS, Harden IP version definer checks [ Upstream commit 6991a975e416154576b0f5f06256aec13e23b0a7 ] Replicate some sanity checks that firmware does, since hardware steering does not go through firmware. When creating a definer, disallow matching on IP addresses without also matching on IP version. The latter can be satisfied by matching either on the version field in the IP header, or on the ethertype field. Also refuse to match IPv4 IHL alongside IPv6. Signed-off-by: Vlad Dogaru Reviewed-by: Yevgeny Kliteynik Signed-off-by: Mark Bloch Link: https://patch.msgid.link/20250422092540.182091-3-mbloch@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- .../mlx5/core/steering/hws/mlx5hws_definer.c | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c index 0d0591ba41fdb..fc9ba534d5d97 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_definer.c @@ -508,9 +508,9 @@ static int hws_definer_conv_outer(struct mlx5hws_definer_conv_data *cd, u32 *match_param) { + bool is_ipv6, smac_set, dmac_set, ip_addr_set, ip_ver_set; struct mlx5hws_definer_fc *fc = cd->fc; struct mlx5hws_definer_fc *curr_fc; - bool is_ipv6, smac_set, dmac_set; u32 *s_ipv6, *d_ipv6; if (HWS_IS_FLD_SET_SZ(match_param, outer_headers.l4_type, 0x2) || @@ -520,6 +520,20 @@ hws_definer_conv_outer(struct mlx5hws_definer_conv_data *cd, return -EINVAL; } + ip_addr_set = HWS_IS_FLD_SET_SZ(match_param, + outer_headers.src_ipv4_src_ipv6, + 0x80) || + HWS_IS_FLD_SET_SZ(match_param, + outer_headers.dst_ipv4_dst_ipv6, 0x80); + ip_ver_set = HWS_IS_FLD_SET(match_param, outer_headers.ip_version) || + HWS_IS_FLD_SET(match_param, outer_headers.ethertype); + + if (ip_addr_set && !ip_ver_set) { + mlx5hws_err(cd->ctx, + "Unsupported match on IP address without version or ethertype\n"); + return -EINVAL; + } + /* L2 Check ethertype */ HWS_SET_HDR(fc, match_param, ETH_TYPE_O, outer_headers.ethertype, @@ -575,6 +589,12 @@ hws_definer_conv_outer(struct mlx5hws_definer_conv_data *cd, is_ipv6 = s_ipv6[0] || s_ipv6[1] || s_ipv6[2] || d_ipv6[0] || d_ipv6[1] || d_ipv6[2]; + /* IHL is an IPv4-specific field. */ + if (is_ipv6 && HWS_IS_FLD_SET(match_param, outer_headers.ipv4_ihl)) { + mlx5hws_err(cd->ctx, "Unsupported match on IPv6 address and IPv4 IHL\n"); + return -EINVAL; + } + if (is_ipv6) { /* Handle IPv6 source address */ HWS_SET_HDR(fc, match_param, IPV6_SRC_127_96_O, @@ -664,9 +684,9 @@ static int hws_definer_conv_inner(struct mlx5hws_definer_conv_data *cd, u32 *match_param) { + bool is_ipv6, smac_set, dmac_set, ip_addr_set, ip_ver_set; struct mlx5hws_definer_fc *fc = cd->fc; struct mlx5hws_definer_fc *curr_fc; - bool is_ipv6, smac_set, dmac_set; u32 *s_ipv6, *d_ipv6; if (HWS_IS_FLD_SET_SZ(match_param, inner_headers.l4_type, 0x2) || @@ -676,6 +696,20 @@ hws_definer_conv_inner(struct mlx5hws_definer_conv_data *cd, return -EINVAL; } + ip_addr_set = HWS_IS_FLD_SET_SZ(match_param, + inner_headers.src_ipv4_src_ipv6, + 0x80) || + HWS_IS_FLD_SET_SZ(match_param, + inner_headers.dst_ipv4_dst_ipv6, 0x80); + ip_ver_set = HWS_IS_FLD_SET(match_param, inner_headers.ip_version) || + HWS_IS_FLD_SET(match_param, inner_headers.ethertype); + + if (ip_addr_set && !ip_ver_set) { + mlx5hws_err(cd->ctx, + "Unsupported match on IP address without version or ethertype\n"); + return -EINVAL; + } + /* L2 Check ethertype */ HWS_SET_HDR(fc, match_param, ETH_TYPE_I, inner_headers.ethertype, @@ -730,6 +764,12 @@ hws_definer_conv_inner(struct mlx5hws_definer_conv_data *cd, is_ipv6 = s_ipv6[0] || s_ipv6[1] || s_ipv6[2] || d_ipv6[0] || d_ipv6[1] || d_ipv6[2]; + /* IHL is an IPv4-specific field. */ + if (is_ipv6 && HWS_IS_FLD_SET(match_param, inner_headers.ipv4_ihl)) { + mlx5hws_err(cd->ctx, "Unsupported match on IPv6 address and IPv4 IHL\n"); + return -EINVAL; + } + if (is_ipv6) { /* Handle IPv6 source address */ HWS_SET_HDR(fc, match_param, IPV6_SRC_127_96_I, -- GitLab From f28f1f578cd810779d01999c60618cda14c281dd Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Fri, 9 May 2025 13:06:47 -0700 Subject: [PATCH 1492/2211] fbcon: Make sure modelist not set on unregistered console [ Upstream commit cedc1b63394a866bf8663a3e40f4546f1d28c8d8 ] It looks like attempting to write to the "store_modes" sysfs node will run afoul of unregistered consoles: UBSAN: array-index-out-of-bounds in drivers/video/fbdev/core/fbcon.c:122:28 index -1 is out of range for type 'fb_info *[32]' ... fbcon_info_from_console+0x192/0x1a0 drivers/video/fbdev/core/fbcon.c:122 fbcon_new_modelist+0xbf/0x2d0 drivers/video/fbdev/core/fbcon.c:3048 fb_new_modelist+0x328/0x440 drivers/video/fbdev/core/fbmem.c:673 store_modes+0x1c9/0x3e0 drivers/video/fbdev/core/fbsysfs.c:113 dev_attr_store+0x55/0x80 drivers/base/core.c:2439 static struct fb_info *fbcon_registered_fb[FB_MAX]; ... static signed char con2fb_map[MAX_NR_CONSOLES]; ... static struct fb_info *fbcon_info_from_console(int console) ... return fbcon_registered_fb[con2fb_map[console]]; If con2fb_map contains a -1 things go wrong here. Instead, return NULL, as callers of fbcon_info_from_console() are trying to compare against existing "info" pointers, so error handling should kick in correctly. Reported-by: syzbot+a7d4444e7b6e743572f7@syzkaller.appspotmail.com Closes: https://lore.kernel.org/all/679d0a8f.050a0220.163cdc.000c.GAE@google.com/ Signed-off-by: Kees Cook Signed-off-by: Helge Deller Signed-off-by: Sasha Levin --- drivers/video/fbdev/core/fbcon.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c index 07d127110ca4c..c98786996c647 100644 --- a/drivers/video/fbdev/core/fbcon.c +++ b/drivers/video/fbdev/core/fbcon.c @@ -117,9 +117,14 @@ static signed char con2fb_map_boot[MAX_NR_CONSOLES]; static struct fb_info *fbcon_info_from_console(int console) { + signed char fb; WARN_CONSOLE_UNLOCKED(); - return fbcon_registered_fb[con2fb_map[console]]; + fb = con2fb_map[console]; + if (fb < 0 || fb >= ARRAY_SIZE(fbcon_registered_fb)) + return NULL; + + return fbcon_registered_fb[fb]; } static int logo_lines; -- GitLab From a1a63a270e438af6a108cc4faac632fae237e8f7 Mon Sep 17 00:00:00 2001 From: Marcus Folkesson Date: Wed, 26 Mar 2025 09:29:51 +0100 Subject: [PATCH 1493/2211] watchdog: da9052_wdt: respect TWDMIN [ Upstream commit 325f510fcd9cda5a44bcb662b74ba4e3dabaca10 ] We have to wait at least the minimium time for the watchdog window (TWDMIN) before writings to the wdt register after the watchdog is activated. Otherwise the chip will assert TWD_ERROR and power down to reset mode. Signed-off-by: Marcus Folkesson Reviewed-by: Guenter Roeck Link: https://lore.kernel.org/r/20250326-da9052-fixes-v3-4-a38a560fef0e@gmail.com Signed-off-by: Guenter Roeck Signed-off-by: Wim Van Sebroeck Signed-off-by: Sasha Levin --- drivers/watchdog/da9052_wdt.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/watchdog/da9052_wdt.c b/drivers/watchdog/da9052_wdt.c index d708c091bf1b1..180526220d8c4 100644 --- a/drivers/watchdog/da9052_wdt.c +++ b/drivers/watchdog/da9052_wdt.c @@ -164,6 +164,7 @@ static int da9052_wdt_probe(struct platform_device *pdev) da9052_wdt = &driver_data->wdt; da9052_wdt->timeout = DA9052_DEF_TIMEOUT; + da9052_wdt->min_hw_heartbeat_ms = DA9052_TWDMIN; da9052_wdt->info = &da9052_wdt_info; da9052_wdt->ops = &da9052_wdt_ops; da9052_wdt->parent = dev; -- GitLab From d9ab5bad38136849222fc0401498251fd506e8a2 Mon Sep 17 00:00:00 2001 From: Laurentiu Tudor Date: Tue, 8 Apr 2025 13:58:14 +0300 Subject: [PATCH 1494/2211] bus: fsl-mc: increase MC_CMD_COMPLETION_TIMEOUT_MS value [ Upstream commit 23d060136841c58c2f9ee8c08ad945d1879ead4b ] In case the MC firmware runs in debug mode with extensive prints pushed to the console, the current timeout of 500ms is not enough. Increase the timeout value so that we don't have any chance of wrongly assuming that the firmware is not responding when it's just taking more time. Signed-off-by: Laurentiu Tudor Signed-off-by: Ioana Ciornei Link: https://lore.kernel.org/r/20250408105814.2837951-7-ioana.ciornei@nxp.com Signed-off-by: Christophe Leroy Signed-off-by: Sasha Levin --- drivers/bus/fsl-mc/mc-sys.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/bus/fsl-mc/mc-sys.c b/drivers/bus/fsl-mc/mc-sys.c index f2052cd0a0517..b22c59d57c8f0 100644 --- a/drivers/bus/fsl-mc/mc-sys.c +++ b/drivers/bus/fsl-mc/mc-sys.c @@ -19,7 +19,7 @@ /* * Timeout in milliseconds to wait for the completion of an MC command */ -#define MC_CMD_COMPLETION_TIMEOUT_MS 500 +#define MC_CMD_COMPLETION_TIMEOUT_MS 15000 /* * usleep_range() min and max values used to throttle down polling -- GitLab From 69e888cbae9fcfc2aba3ae9531060dfce4ab4ced Mon Sep 17 00:00:00 2001 From: Sukrut Bellary Date: Tue, 18 Mar 2025 16:00:39 -0700 Subject: [PATCH 1495/2211] ARM: OMAP2+: Fix l4ls clk domain handling in STANDBY [ Upstream commit 47fe74098f3dadba2f9cc1e507d813a4aa93f5f3 ] Don't put the l4ls clk domain to sleep in case of standby. Since CM3 PM FW[1](ti-v4.1.y) doesn't wake-up/enable the l4ls clk domain upon wake-up, CM3 PM FW fails to wake-up the MPU. [1] https://git.ti.com/cgit/processor-firmware/ti-amx3-cm3-pm-firmware/ Signed-off-by: Sukrut Bellary Tested-by: Judith Mendez Link: https://lore.kernel.org/r/20250318230042.3138542-2-sbellary@baylibre.com Signed-off-by: Kevin Hilman Signed-off-by: Sasha Levin --- arch/arm/mach-omap2/clockdomain.h | 1 + arch/arm/mach-omap2/clockdomains33xx_data.c | 2 +- arch/arm/mach-omap2/cm33xx.c | 14 +++++++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-omap2/clockdomain.h b/arch/arm/mach-omap2/clockdomain.h index c36fb27212615..86a2f9e5d0ef9 100644 --- a/arch/arm/mach-omap2/clockdomain.h +++ b/arch/arm/mach-omap2/clockdomain.h @@ -48,6 +48,7 @@ #define CLKDM_NO_AUTODEPS (1 << 4) #define CLKDM_ACTIVE_WITH_MPU (1 << 5) #define CLKDM_MISSING_IDLE_REPORTING (1 << 6) +#define CLKDM_STANDBY_FORCE_WAKEUP BIT(7) #define CLKDM_CAN_HWSUP (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO) #define CLKDM_CAN_SWSUP (CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP) diff --git a/arch/arm/mach-omap2/clockdomains33xx_data.c b/arch/arm/mach-omap2/clockdomains33xx_data.c index 87f4e927eb183..c05a3c07d4486 100644 --- a/arch/arm/mach-omap2/clockdomains33xx_data.c +++ b/arch/arm/mach-omap2/clockdomains33xx_data.c @@ -19,7 +19,7 @@ static struct clockdomain l4ls_am33xx_clkdm = { .pwrdm = { .name = "per_pwrdm" }, .cm_inst = AM33XX_CM_PER_MOD, .clkdm_offs = AM33XX_CM_PER_L4LS_CLKSTCTRL_OFFSET, - .flags = CLKDM_CAN_SWSUP, + .flags = CLKDM_CAN_SWSUP | CLKDM_STANDBY_FORCE_WAKEUP, }; static struct clockdomain l3s_am33xx_clkdm = { diff --git a/arch/arm/mach-omap2/cm33xx.c b/arch/arm/mach-omap2/cm33xx.c index acdf72a541c02..a4dd42abda89b 100644 --- a/arch/arm/mach-omap2/cm33xx.c +++ b/arch/arm/mach-omap2/cm33xx.c @@ -20,6 +20,9 @@ #include "cm-regbits-34xx.h" #include "cm-regbits-33xx.h" #include "prm33xx.h" +#if IS_ENABLED(CONFIG_SUSPEND) +#include +#endif /* * CLKCTRL_IDLEST_*: possible values for the CM_*_CLKCTRL.IDLEST bitfield: @@ -328,8 +331,17 @@ static int am33xx_clkdm_clk_disable(struct clockdomain *clkdm) { bool hwsup = false; +#if IS_ENABLED(CONFIG_SUSPEND) + /* + * In case of standby, Don't put the l4ls clk domain to sleep. + * Since CM3 PM FW doesn't wake-up/enable the l4ls clk domain + * upon wake-up, CM3 PM FW fails to wake-up th MPU. + */ + if (pm_suspend_target_state == PM_SUSPEND_STANDBY && + (clkdm->flags & CLKDM_STANDBY_FORCE_WAKEUP)) + return 0; +#endif hwsup = am33xx_cm_is_clkdm_in_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); - if (!hwsup && (clkdm->flags & CLKDM_CAN_FORCE_SLEEP)) am33xx_clkdm_sleep(clkdm); -- GitLab From 7109ae53f971bb6f7aa50b54bca562f0928ab7d4 Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Mon, 28 Apr 2025 15:06:43 +0200 Subject: [PATCH 1496/2211] tee: Prevent size calculation wraparound on 32-bit kernels [ Upstream commit 39bb67edcc582b3b386a9ec983da67fa8a10ec03 ] The current code around TEE_IOCTL_PARAM_SIZE() is a bit wrong on 32-bit kernels: Multiplying a user-provided 32-bit value with the size of a structure can wrap around on such platforms. Fix it by using saturating arithmetic for the size calculation. This has no security consequences because, in all users of TEE_IOCTL_PARAM_SIZE(), the subsequent kcalloc() implicitly checks for wrapping. Signed-off-by: Jann Horn Signed-off-by: Jens Wiklander Tested-by: Rouven Czerwinski Signed-off-by: Sasha Levin --- drivers/tee/tee_core.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c index d113679b1e2d7..acc7998758ad8 100644 --- a/drivers/tee/tee_core.c +++ b/drivers/tee/tee_core.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -19,7 +20,7 @@ #define TEE_NUM_DEVICES 32 -#define TEE_IOCTL_PARAM_SIZE(x) (sizeof(struct tee_param) * (x)) +#define TEE_IOCTL_PARAM_SIZE(x) (size_mul(sizeof(struct tee_param), (x))) #define TEE_UUID_NS_NAME_SIZE 128 @@ -487,7 +488,7 @@ static int tee_ioctl_open_session(struct tee_context *ctx, if (copy_from_user(&arg, uarg, sizeof(arg))) return -EFAULT; - if (sizeof(arg) + TEE_IOCTL_PARAM_SIZE(arg.num_params) != buf.buf_len) + if (size_add(sizeof(arg), TEE_IOCTL_PARAM_SIZE(arg.num_params)) != buf.buf_len) return -EINVAL; if (arg.num_params) { @@ -565,7 +566,7 @@ static int tee_ioctl_invoke(struct tee_context *ctx, if (copy_from_user(&arg, uarg, sizeof(arg))) return -EFAULT; - if (sizeof(arg) + TEE_IOCTL_PARAM_SIZE(arg.num_params) != buf.buf_len) + if (size_add(sizeof(arg), TEE_IOCTL_PARAM_SIZE(arg.num_params)) != buf.buf_len) return -EINVAL; if (arg.num_params) { @@ -699,7 +700,7 @@ static int tee_ioctl_supp_recv(struct tee_context *ctx, if (get_user(num_params, &uarg->num_params)) return -EFAULT; - if (sizeof(*uarg) + TEE_IOCTL_PARAM_SIZE(num_params) != buf.buf_len) + if (size_add(sizeof(*uarg), TEE_IOCTL_PARAM_SIZE(num_params)) != buf.buf_len) return -EINVAL; params = kcalloc(num_params, sizeof(struct tee_param), GFP_KERNEL); @@ -798,7 +799,7 @@ static int tee_ioctl_supp_send(struct tee_context *ctx, get_user(num_params, &uarg->num_params)) return -EFAULT; - if (sizeof(*uarg) + TEE_IOCTL_PARAM_SIZE(num_params) > buf.buf_len) + if (size_add(sizeof(*uarg), TEE_IOCTL_PARAM_SIZE(num_params)) > buf.buf_len) return -EINVAL; params = kcalloc(num_params, sizeof(struct tee_param), GFP_KERNEL); -- GitLab From 311389a799d1b21c8e53e1a680d80a56ebf88140 Mon Sep 17 00:00:00 2001 From: Alexander Sverdlin Date: Tue, 1 Apr 2025 11:06:34 +0200 Subject: [PATCH 1497/2211] Revert "bus: ti-sysc: Probe for l4_wkup and l4_cfg interconnect devices first" [ Upstream commit 36305857b1ead8f6ca033a913162ebc09bee0b43 ] This reverts commit 4700a00755fb5a4bb5109128297d6fd2d1272ee6. It breaks target-module@2b300050 ("ti,sysc-omap2") probe on AM62x in a case when minimally-configured system tries to network-boot: [ 6.888776] probe of 2b300050.target-module returned 517 after 258 usecs [ 17.129637] probe of 2b300050.target-module returned 517 after 708 usecs [ 17.137397] platform 2b300050.target-module: deferred probe pending: (reason unknown) [ 26.878471] Waiting up to 100 more seconds for network. There are minimal configurations possible when the deferred device is not being probed any more (because everything else has been successfully probed) and deferral lists are not processed any more. Stable mmc enumeration can be achieved by filling /aliases node properly (4700a00755fb commit's rationale). After revert: [ 9.006816] IP-Config: Complete: [ 9.010058] device=lan0, ... Tested-by: Andreas Kemnade # GTA04, Panda, BT200 Reviewed-by: Tony Lindgren Signed-off-by: Alexander Sverdlin Link: https://lore.kernel.org/r/20250401090643.2776793-1-alexander.sverdlin@siemens.com Signed-off-by: Kevin Hilman Signed-off-by: Sasha Levin --- drivers/bus/ti-sysc.c | 49 ------------------------------------------- 1 file changed, 49 deletions(-) diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c index 270a94a06e05c..f715c8d281293 100644 --- a/drivers/bus/ti-sysc.c +++ b/drivers/bus/ti-sysc.c @@ -677,51 +677,6 @@ static int sysc_parse_and_check_child_range(struct sysc *ddata) return 0; } -/* Interconnect instances to probe before l4_per instances */ -static struct resource early_bus_ranges[] = { - /* am3/4 l4_wkup */ - { .start = 0x44c00000, .end = 0x44c00000 + 0x300000, }, - /* omap4/5 and dra7 l4_cfg */ - { .start = 0x4a000000, .end = 0x4a000000 + 0x300000, }, - /* omap4 l4_wkup */ - { .start = 0x4a300000, .end = 0x4a300000 + 0x30000, }, - /* omap5 and dra7 l4_wkup without dra7 dcan segment */ - { .start = 0x4ae00000, .end = 0x4ae00000 + 0x30000, }, -}; - -static atomic_t sysc_defer = ATOMIC_INIT(10); - -/** - * sysc_defer_non_critical - defer non_critical interconnect probing - * @ddata: device driver data - * - * We want to probe l4_cfg and l4_wkup interconnect instances before any - * l4_per instances as l4_per instances depend on resources on l4_cfg and - * l4_wkup interconnects. - */ -static int sysc_defer_non_critical(struct sysc *ddata) -{ - struct resource *res; - int i; - - if (!atomic_read(&sysc_defer)) - return 0; - - for (i = 0; i < ARRAY_SIZE(early_bus_ranges); i++) { - res = &early_bus_ranges[i]; - if (ddata->module_pa >= res->start && - ddata->module_pa <= res->end) { - atomic_set(&sysc_defer, 0); - - return 0; - } - } - - atomic_dec_if_positive(&sysc_defer); - - return -EPROBE_DEFER; -} - static struct device_node *stdout_path; static void sysc_init_stdout_path(struct sysc *ddata) @@ -947,10 +902,6 @@ static int sysc_map_and_check_registers(struct sysc *ddata) if (error) return error; - error = sysc_defer_non_critical(ddata); - if (error) - return error; - sysc_check_children(ddata); if (!of_property_present(np, "reg")) -- GitLab From 7c41f73b64baa78878bf6134ccc94e4b9063bf99 Mon Sep 17 00:00:00 2001 From: Stephen Smalley Date: Thu, 5 Jun 2025 12:51:16 -0400 Subject: [PATCH 1498/2211] fs/xattr.c: fix simple_xattr_list() [ Upstream commit 800d0b9b6a8b1b354637b4194cc167ad1ce2bdd3 ] commit 8b0ba61df5a1 ("fs/xattr.c: fix simple_xattr_list to always include security.* xattrs") failed to reset err after the call to security_inode_listsecurity(), which returns the length of the returned xattr name. This results in simple_xattr_list() incorrectly returning this length even if a POSIX acl is also set on the inode. Reported-by: Collin Funk Closes: https://lore.kernel.org/selinux/8734ceal7q.fsf@gmail.com/ Reported-by: Paul Eggert Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2369561 Fixes: 8b0ba61df5a1 ("fs/xattr.c: fix simple_xattr_list to always include security.* xattrs") Signed-off-by: Stephen Smalley Link: https://lore.kernel.org/20250605165116.2063-1-stephen.smalley.work@gmail.com Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/xattr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xattr.c b/fs/xattr.c index 4f5a45338a83a..0191ac2590e09 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -1341,6 +1341,7 @@ ssize_t simple_xattr_list(struct inode *inode, struct simple_xattrs *xattrs, buffer += err; } remaining_size -= err; + err = 0; read_lock(&xattrs->lock); for (rbp = rb_first(&xattrs->rb_root); rbp; rbp = rb_next(rbp)) { -- GitLab From c4972e77236c0bf045b1499443d9d8e8ad0a3cf4 Mon Sep 17 00:00:00 2001 From: Mario Limonciello Date: Tue, 3 Jun 2025 08:24:08 -0500 Subject: [PATCH 1499/2211] platform/x86/amd: pmc: Clear metrics table at start of cycle MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 4dbd11796f3a8eb95647507befc41995458a4023 ] The area of memory that contains the metrics table may contain garbage when the cycle starts. This normally doesn't matter because the cycle itself will populate it with valid data, however commit 9f5595d5f03fd ("platform/x86/amd: pmc: Require at least 2.5 seconds between HW sleep cycles") started to use it during the check() phase. Depending upon what garbage is in the table it's possible that the system will wait 2.5 seconds for even the first cycle, which will be visible to a user. To prevent this from happening explicitly clear the table when logging is started. Fixes: 9f5595d5f03fd ("platform/x86/amd: pmc: Require at least 2.5 seconds between HW sleep cycles") Signed-off-by: Mario Limonciello Link: https://lore.kernel.org/r/20250603132412.3555302-1-superm1@kernel.org Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/amd/pmc/pmc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/platform/x86/amd/pmc/pmc.c b/drivers/platform/x86/amd/pmc/pmc.c index dc071b4257d7b..357a46fdffeda 100644 --- a/drivers/platform/x86/amd/pmc/pmc.c +++ b/drivers/platform/x86/amd/pmc/pmc.c @@ -393,6 +393,8 @@ static int amd_pmc_setup_smu_logging(struct amd_pmc_dev *dev) return -ENOMEM; } + memset_io(dev->smu_virt_addr, 0, sizeof(struct smu_metrics)); + /* Start the logging */ amd_pmc_send_cmd(dev, 0, NULL, SMU_MSG_LOG_RESET, false); amd_pmc_send_cmd(dev, 0, NULL, SMU_MSG_LOG_START, false); -- GitLab From 78f8e254428255545b12b859c9ad71f0069e043a Mon Sep 17 00:00:00 2001 From: Mario Limonciello Date: Wed, 21 May 2025 19:34:56 -0500 Subject: [PATCH 1500/2211] platform/x86/amd: pmf: Prevent amd_pmf_tee_deinit() from running twice MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 93103d56650d7a38ed37ba4041578310f82776ae ] If any of the tee init fails, pass up the errors and clear the tee_ctx pointer. This will prevent cleaning up multiple times. Fixes: ac052d8c08f9d ("platform/x86/amd/pmf: Add PMF TEE interface") Suggested-by: Dan Carpenter Link: https://lore.kernel.org/r/20250512211154.2510397-3-superm1@kernel.org Signed-off-by: Mario Limonciello Link: https://lore.kernel.org/r/20250522003457.1516679-3-superm1@kernel.org Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/amd/pmf/tee-if.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/platform/x86/amd/pmf/tee-if.c b/drivers/platform/x86/amd/pmf/tee-if.c index b6bcc1d57f968..a9b195ec6f33f 100644 --- a/drivers/platform/x86/amd/pmf/tee-if.c +++ b/drivers/platform/x86/amd/pmf/tee-if.c @@ -422,12 +422,12 @@ static int amd_pmf_ta_open_session(struct tee_context *ctx, u32 *id, const uuid_ rc = tee_client_open_session(ctx, &sess_arg, NULL); if (rc < 0 || sess_arg.ret != 0) { pr_err("Failed to open TEE session err:%#x, rc:%d\n", sess_arg.ret, rc); - return rc; + return rc ?: -EINVAL; } *id = sess_arg.session; - return rc; + return 0; } static int amd_pmf_register_input_device(struct amd_pmf_dev *dev) @@ -462,7 +462,9 @@ static int amd_pmf_tee_init(struct amd_pmf_dev *dev, const uuid_t *uuid) dev->tee_ctx = tee_client_open_context(NULL, amd_pmf_amdtee_ta_match, NULL, NULL); if (IS_ERR(dev->tee_ctx)) { dev_err(dev->dev, "Failed to open TEE context\n"); - return PTR_ERR(dev->tee_ctx); + ret = PTR_ERR(dev->tee_ctx); + dev->tee_ctx = NULL; + return ret; } ret = amd_pmf_ta_open_session(dev->tee_ctx, &dev->session_id, uuid); @@ -502,9 +504,12 @@ out_ctx: static void amd_pmf_tee_deinit(struct amd_pmf_dev *dev) { + if (!dev->tee_ctx) + return; tee_shm_free(dev->fw_shm_pool); tee_client_close_session(dev->tee_ctx, dev->session_id); tee_client_close_context(dev->tee_ctx); + dev->tee_ctx = NULL; } int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev) -- GitLab From 4d71f2c1e5263a9f042faa71d59515709869dc79 Mon Sep 17 00:00:00 2001 From: Stuart Hayes Date: Mon, 9 Jun 2025 13:46:56 -0500 Subject: [PATCH 1501/2211] platform/x86: dell_rbu: Fix list usage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 61ce04601e0d8265ec6d2ffa6df5a7e1bce64854 ] Pass the correct list head to list_for_each_entry*() when looping through the packet list. Without this patch, reading the packet data via sysfs will show the data incorrectly (because it starts at the wrong packet), and clearing the packet list will result in a NULL pointer dereference. Fixes: d19f359fbdc6 ("platform/x86: dell_rbu: don't open code list_for_each_entry*()") Signed-off-by: Stuart Hayes Link: https://lore.kernel.org/r/20250609184659.7210-3-stuart.w.hayes@gmail.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/dell/dell_rbu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/dell/dell_rbu.c b/drivers/platform/x86/dell/dell_rbu.c index 9f51e0fcab04e..4d2b5f6dd513f 100644 --- a/drivers/platform/x86/dell/dell_rbu.c +++ b/drivers/platform/x86/dell/dell_rbu.c @@ -292,7 +292,7 @@ static int packet_read_list(char *data, size_t * pread_length) remaining_bytes = *pread_length; bytes_read = rbu_data.packet_read_count; - list_for_each_entry(newpacket, (&packet_data_head.list)->next, list) { + list_for_each_entry(newpacket, &packet_data_head.list, list) { bytes_copied = do_packet_read(pdest, newpacket, remaining_bytes, bytes_read, &temp_count); remaining_bytes -= bytes_copied; @@ -315,7 +315,7 @@ static void packet_empty_list(void) { struct packet_data *newpacket, *tmp; - list_for_each_entry_safe(newpacket, tmp, (&packet_data_head.list)->next, list) { + list_for_each_entry_safe(newpacket, tmp, &packet_data_head.list, list) { list_del(&newpacket->list); /* -- GitLab From 5807588a54abb02695ebcde5044ff3ba78364714 Mon Sep 17 00:00:00 2001 From: Stuart Hayes Date: Mon, 9 Jun 2025 13:46:58 -0500 Subject: [PATCH 1502/2211] platform/x86: dell_rbu: Stop overwriting data buffer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit f4b0fa38d5fefe9aed6ed831f3bd3538c168ee19 ] The dell_rbu driver will use memset() to clear the data held by each packet when it is no longer needed (when the driver is unloaded, the packet size is changed, etc). The amount of memory that is cleared (before this patch) is the normal packet size. However, the last packet in the list may be smaller. Fix this to only clear the memory actually used by each packet, to prevent it from writing past the end of data buffer. Because the packet data buffers are allocated with __get_free_pages() (in page-sized increments), this bug could only result in a buffer being overwritten when a packet size larger than one page is used. The only user of the dell_rbu module should be the Dell BIOS update program, which uses a packet size of 4096, so no issues should be seen without the patch, it just blocks the possiblity. Fixes: 6c54c28e69f2 ("[PATCH] dell_rbu: new Dell BIOS update driver") Signed-off-by: Stuart Hayes Link: https://lore.kernel.org/r/20250609184659.7210-5-stuart.w.hayes@gmail.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/dell/dell_rbu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/platform/x86/dell/dell_rbu.c b/drivers/platform/x86/dell/dell_rbu.c index 4d2b5f6dd513f..fee20866b41e4 100644 --- a/drivers/platform/x86/dell/dell_rbu.c +++ b/drivers/platform/x86/dell/dell_rbu.c @@ -322,7 +322,7 @@ static void packet_empty_list(void) * zero out the RBU packet memory before freeing * to make sure there are no stale RBU packets left in memory */ - memset(newpacket->data, 0, rbu_data.packetsize); + memset(newpacket->data, 0, newpacket->length); set_memory_wb((unsigned long)newpacket->data, 1 << newpacket->ordernum); free_pages((unsigned long) newpacket->data, -- GitLab From 7518ef0f79b57a0279a1623c3021a68ad996c129 Mon Sep 17 00:00:00 2001 From: Christophe Leroy Date: Mon, 12 May 2025 20:14:55 +0200 Subject: [PATCH 1503/2211] powerpc/vdso: Fix build of VDSO32 with pcrel [ Upstream commit b93755f408325170edb2156c6a894ed1cae5f4f6 ] Building vdso32 on power10 with pcrel leads to following errors: VDSO32A arch/powerpc/kernel/vdso/gettimeofday-32.o arch/powerpc/kernel/vdso/gettimeofday.S: Assembler messages: arch/powerpc/kernel/vdso/gettimeofday.S:40: Error: syntax error; found `@', expected `,' arch/powerpc/kernel/vdso/gettimeofday.S:71: Info: macro invoked from here arch/powerpc/kernel/vdso/gettimeofday.S:40: Error: junk at end of line: `@notoc' arch/powerpc/kernel/vdso/gettimeofday.S:71: Info: macro invoked from here ... make[2]: *** [arch/powerpc/kernel/vdso/Makefile:85: arch/powerpc/kernel/vdso/gettimeofday-32.o] Error 1 make[1]: *** [arch/powerpc/Makefile:388: vdso_prepare] Error 2 Once the above is fixed, the following happens: VDSO32C arch/powerpc/kernel/vdso/vgettimeofday-32.o cc1: error: '-mpcrel' requires '-mcmodel=medium' make[2]: *** [arch/powerpc/kernel/vdso/Makefile:89: arch/powerpc/kernel/vdso/vgettimeofday-32.o] Error 1 make[1]: *** [arch/powerpc/Makefile:388: vdso_prepare] Error 2 make: *** [Makefile:251: __sub-make] Error 2 Make sure pcrel version of CFUNC() macro is used only for powerpc64 builds and remove -mpcrel for powerpc32 builds. Fixes: 7e3a68be42e1 ("powerpc/64: vmlinux support building with PCREL addresing") Signed-off-by: Christophe Leroy Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/1fa3453f07d42a50a70114da9905bf7b73304fca.1747073669.git.christophe.leroy@csgroup.eu Signed-off-by: Sasha Levin --- arch/powerpc/include/asm/ppc_asm.h | 2 +- arch/powerpc/kernel/vdso/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index 02897f4b0dbf8..b891910fce8a6 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h @@ -183,7 +183,7 @@ /* * Used to name C functions called from asm */ -#ifdef CONFIG_PPC_KERNEL_PCREL +#if defined(__powerpc64__) && defined(CONFIG_PPC_KERNEL_PCREL) #define CFUNC(name) name@notoc #else #define CFUNC(name) name diff --git a/arch/powerpc/kernel/vdso/Makefile b/arch/powerpc/kernel/vdso/Makefile index c568cad6a22e6..6ba68b28ed870 100644 --- a/arch/powerpc/kernel/vdso/Makefile +++ b/arch/powerpc/kernel/vdso/Makefile @@ -53,7 +53,7 @@ ldflags-$(CONFIG_LD_ORPHAN_WARN) += -Wl,--orphan-handling=$(CONFIG_LD_ORPHAN_WAR ldflags-y += $(filter-out $(CC_AUTO_VAR_INIT_ZERO_ENABLER) $(CC_FLAGS_FTRACE) -Wa$(comma)%, $(KBUILD_CFLAGS)) CC32FLAGS := -m32 -CC32FLAGSREMOVE := -mcmodel=medium -mabi=elfv1 -mabi=elfv2 -mcall-aixdesc +CC32FLAGSREMOVE := -mcmodel=medium -mabi=elfv1 -mabi=elfv2 -mcall-aixdesc -mpcrel ifdef CONFIG_CC_IS_CLANG # This flag is supported by clang for 64-bit but not 32-bit so it will cause # an unused command line flag warning for this file. -- GitLab From 50452fe7caf0ce40c0756c8e50a7f677ab67085a Mon Sep 17 00:00:00 2001 From: Narayana Murty N Date: Thu, 8 May 2025 02:29:28 -0400 Subject: [PATCH 1504/2211] powerpc/eeh: Fix missing PE bridge reconfiguration during VFIO EEH recovery [ Upstream commit 33bc69cf6655cf60829a803a45275f11a74899e5 ] VFIO EEH recovery for PCI passthrough devices fails on PowerNV and pseries platforms due to missing host-side PE bridge reconfiguration. In the current implementation, eeh_pe_configure() only performs RTAS or OPAL-based bridge reconfiguration for native host devices, but skips it entirely for PEs managed through VFIO in guest passthrough scenarios. This leads to incomplete EEH recovery when a PCI error affects a passthrough device assigned to a QEMU/KVM guest. Although VFIO triggers the EEH recovery flow through VFIO_EEH_PE_ENABLE ioctl, the platform-specific bridge reconfiguration step is silently bypassed. As a result, the PE's config space is not fully restored, causing subsequent config space access failures or EEH freeze-on-access errors inside the guest. This patch fixes the issue by ensuring that eeh_pe_configure() always invokes the platform's configure_bridge() callback (e.g., pseries_eeh_phb_configure_bridge) even for VFIO-managed PEs. This ensures that RTAS or OPAL calls to reconfigure the PE bridge are correctly issued on the host side, restoring the PE's configuration space after an EEH event. This fix is essential for reliable EEH recovery in QEMU/KVM guests using VFIO PCI passthrough on PowerNV and pseries systems. Tested with: - QEMU/KVM guest using VFIO passthrough (IBM Power9,(lpar)Power11 host) - Injected EEH errors with pseries EEH errinjct tool on host, recovery verified on qemu guest. - Verified successful config space access and CAP_EXP DevCtl restoration after recovery Fixes: 212d16cdca2d ("powerpc/eeh: EEH support for VFIO PCI device") Signed-off-by: Narayana Murty N Reviewed-by: Vaibhav Jain Reviewed-by: Ganesh Goudar Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/20250508062928.146043-1-nnmlinux@linux.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/kernel/eeh.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c index 83fe99861eb17..ca7f7bb2b4786 100644 --- a/arch/powerpc/kernel/eeh.c +++ b/arch/powerpc/kernel/eeh.c @@ -1509,6 +1509,8 @@ int eeh_pe_configure(struct eeh_pe *pe) /* Invalid PE ? */ if (!pe) return -ENODEV; + else + ret = eeh_ops->configure_bridge(pe); return ret; } -- GitLab From 2e10dc9c2a87e2b34a29fa28ba756ab66290def0 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Fri, 13 Jun 2025 11:01:49 -0600 Subject: [PATCH 1505/2211] io_uring/kbuf: don't truncate end buffer for multiple buffer peeks commit 26ec15e4b0c1d7b25214d9c0be1d50492e2f006c upstream. If peeking a bunch of buffers, normally io_ring_buffers_peek() will truncate the end buffer. This isn't optimal as presumably more data will be arriving later, and hence it's better to stop with the last full buffer rather than truncate the end buffer. Cc: stable@vger.kernel.org Fixes: 35c8711c8fc4 ("io_uring/kbuf: add helpers for getting/peeking multiple buffers") Reported-by: Christian Mazakas Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- io_uring/kbuf.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/io_uring/kbuf.c b/io_uring/kbuf.c index 94602d1f7e6ff..c9289597522f6 100644 --- a/io_uring/kbuf.c +++ b/io_uring/kbuf.c @@ -262,8 +262,11 @@ static int io_ring_buffers_peek(struct io_kiocb *req, struct buf_sel_arg *arg, /* truncate end piece, if needed, for non partial buffers */ if (len > arg->max_len) { len = arg->max_len; - if (!(bl->flags & IOBL_INC)) + if (!(bl->flags & IOBL_INC)) { + if (iov != arg->iovs) + break; buf->len = len; + } } iov->iov_base = u64_to_user_ptr(buf->addr); -- GitLab From 1a4254ab06740400d633d051929b1a25bbabab1a Mon Sep 17 00:00:00 2001 From: Penglei Jiang Date: Sun, 15 Jun 2025 09:39:06 -0700 Subject: [PATCH 1506/2211] io_uring: fix task leak issue in io_wq_create() commit 89465d923bda180299e69ee2800aab84ad0ba689 upstream. Add missing put_task_struct() in the error path Cc: stable@vger.kernel.org Fixes: 0f8baa3c9802 ("io-wq: fully initialize wqe before calling cpuhp_state_add_instance_nocalls()") Signed-off-by: Penglei Jiang Link: https://lore.kernel.org/r/20250615163906.2367-1-superman.xpt@gmail.com Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- io_uring/io-wq.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/io_uring/io-wq.c b/io_uring/io-wq.c index a2d577b099308..8f555c1d7185c 100644 --- a/io_uring/io-wq.c +++ b/io_uring/io-wq.c @@ -1204,8 +1204,10 @@ struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data) atomic_set(&wq->worker_refs, 1); init_completion(&wq->worker_done); ret = cpuhp_state_add_instance_nocalls(io_wq_online, &wq->cpuhp_node); - if (ret) + if (ret) { + put_task_struct(wq->task); goto err; + } return wq; err: -- GitLab From 1cce6ac47f4a2ac1766b8a188dc8c8f6d8df2a53 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sat, 7 Jun 2025 17:43:18 -0700 Subject: [PATCH 1507/2211] drivers/rapidio/rio_cm.c: prevent possible heap overwrite commit 50695153d7ddde3b1696dbf0085be0033bf3ddb3 upstream. In riocm_cdev_ioctl(RIO_CM_CHAN_SEND) -> cm_chan_msg_send() -> riocm_ch_send() cm_chan_msg_send() checks that userspace didn't send too much data but riocm_ch_send() failed to check that userspace sent sufficient data. The result is that riocm_ch_send() can write to fields in the rio_ch_chan_hdr which were outside the bounds of the space which cm_chan_msg_send() allocated. Address this by teaching riocm_ch_send() to check that the entire rio_ch_chan_hdr was copied in from userspace. Reported-by: maher azz Cc: Matt Porter Cc: Alexandre Bounine Cc: Linus Torvalds Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- drivers/rapidio/rio_cm.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/rapidio/rio_cm.c b/drivers/rapidio/rio_cm.c index 9135227301c8d..e548edf64eca0 100644 --- a/drivers/rapidio/rio_cm.c +++ b/drivers/rapidio/rio_cm.c @@ -789,6 +789,9 @@ static int riocm_ch_send(u16 ch_id, void *buf, int len) if (buf == NULL || ch_id == 0 || len == 0 || len > RIO_MAX_MSG_SIZE) return -EINVAL; + if (len < sizeof(struct rio_ch_chan_hdr)) + return -EINVAL; /* insufficient data from user */ + ch = riocm_get_channel(ch_id); if (!ch) { riocm_error("%s(%d) ch_%d not found", current->comm, -- GitLab From 30cfeebdadd3c2c3a49b3b9ed941d3da33482502 Mon Sep 17 00:00:00 2001 From: Yao Zi Date: Thu, 5 Jun 2025 20:34:46 +0800 Subject: [PATCH 1508/2211] platform/loongarch: laptop: Get brightness setting from EC on probe commit 1205088fd0393bd9eae96b62bf1e4b9eb1b73edf upstream. Previously during driver probe, 1 is unconditionally taken as current brightness value and set to props.brightness, which will be considered as the brightness before suspend and restored to EC on resume. Since a brightness value of 1 almost never matches EC's state on coldboot (my laptop's EC defaults to 80), this causes surprising changes of screen brightness on the first time of resume after coldboot. Let's get brightness from EC and take it as the current brightness on probe of the laptop driver to avoid the surprising behavior. Tested on TongFang L860-T2 Loongson-3A5000 laptop. Cc: stable@vger.kernel.org Fixes: 6246ed09111f ("LoongArch: Add ACPI-based generic laptop driver") Signed-off-by: Yao Zi Signed-off-by: Huacai Chen Signed-off-by: Greg Kroah-Hartman --- drivers/platform/loongarch/loongson-laptop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/platform/loongarch/loongson-laptop.c b/drivers/platform/loongarch/loongson-laptop.c index 99203584949da..ba9a90818c921 100644 --- a/drivers/platform/loongarch/loongson-laptop.c +++ b/drivers/platform/loongarch/loongson-laptop.c @@ -392,8 +392,8 @@ static int laptop_backlight_register(void) if (!acpi_evalf(hotkey_handle, &status, "ECLL", "d")) return -EIO; - props.brightness = 1; props.max_brightness = status; + props.brightness = ec_get_brightness(); props.type = BACKLIGHT_PLATFORM; backlight_device_register("loongson_laptop", -- GitLab From 141523e6fd5e7afff7f424b6b5eed720e07ad691 Mon Sep 17 00:00:00 2001 From: Yao Zi Date: Thu, 5 Jun 2025 20:34:46 +0800 Subject: [PATCH 1509/2211] platform/loongarch: laptop: Unregister generic_sub_drivers on exit commit f78fb2576f22b0ba5297412a9aa7691920666c41 upstream. Without correct unregisteration, ACPI notify handlers and the platform drivers installed by generic_subdriver_init() will become dangling references after removing the loongson_laptop module, triggering various kernel faults when a hotkey is sent or at kernel shutdown. Cc: stable@vger.kernel.org Fixes: 6246ed09111f ("LoongArch: Add ACPI-based generic laptop driver") Signed-off-by: Yao Zi Signed-off-by: Huacai Chen Signed-off-by: Greg Kroah-Hartman --- drivers/platform/loongarch/loongson-laptop.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/platform/loongarch/loongson-laptop.c b/drivers/platform/loongarch/loongson-laptop.c index ba9a90818c921..fe4fec2d4f94f 100644 --- a/drivers/platform/loongarch/loongson-laptop.c +++ b/drivers/platform/loongarch/loongson-laptop.c @@ -611,11 +611,17 @@ static int __init generic_acpi_laptop_init(void) static void __exit generic_acpi_laptop_exit(void) { + int i; + if (generic_inputdev) { - if (input_device_registered) - input_unregister_device(generic_inputdev); - else + if (!input_device_registered) { input_free_device(generic_inputdev); + } else { + input_unregister_device(generic_inputdev); + + for (i = 0; i < ARRAY_SIZE(generic_sub_drivers); i++) + generic_subdriver_exit(&generic_sub_drivers[i]); + } } } -- GitLab From ec401f84e78e0846fec07c47becd2d478abe8532 Mon Sep 17 00:00:00 2001 From: Yao Zi Date: Thu, 5 Jun 2025 20:34:46 +0800 Subject: [PATCH 1510/2211] platform/loongarch: laptop: Add backlight power control support commit 53c762b47f726e4079a1f06f684bce2fc0d56fba upstream. loongson_laptop_turn_{on,off}_backlight() are designed for controlling the power of the backlight, but they aren't really used in the driver previously. Unify these two functions since they only differ in arguments passed to ACPI method, and wire up loongson_laptop_backlight_update() to update the power state of the backlight as well. Tested on the TongFang L860-T2 Loongson-3A5000 laptop. Cc: stable@vger.kernel.org Fixes: 6246ed09111f ("LoongArch: Add ACPI-based generic laptop driver") Signed-off-by: Yao Zi Signed-off-by: Huacai Chen Signed-off-by: Greg Kroah-Hartman --- drivers/platform/loongarch/loongson-laptop.c | 73 ++++++++++---------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/drivers/platform/loongarch/loongson-laptop.c b/drivers/platform/loongarch/loongson-laptop.c index fe4fec2d4f94f..61b18ac206c9e 100644 --- a/drivers/platform/loongarch/loongson-laptop.c +++ b/drivers/platform/loongarch/loongson-laptop.c @@ -56,8 +56,7 @@ static struct input_dev *generic_inputdev; static acpi_handle hotkey_handle; static struct key_entry hotkey_keycode_map[GENERIC_HOTKEY_MAP_MAX]; -int loongson_laptop_turn_on_backlight(void); -int loongson_laptop_turn_off_backlight(void); +static bool bl_powered; static int loongson_laptop_backlight_update(struct backlight_device *bd); /* 2. ACPI Helpers and device model */ @@ -354,16 +353,42 @@ static int ec_backlight_level(u8 level) return level; } +static int ec_backlight_set_power(bool state) +{ + int status; + union acpi_object arg0 = { ACPI_TYPE_INTEGER }; + struct acpi_object_list args = { 1, &arg0 }; + + arg0.integer.value = state; + status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL); + if (ACPI_FAILURE(status)) { + pr_info("Loongson lvds error: 0x%x\n", status); + return -EIO; + } + + return 0; +} + static int loongson_laptop_backlight_update(struct backlight_device *bd) { - int lvl = ec_backlight_level(bd->props.brightness); + bool target_powered = !backlight_is_blank(bd); + int ret = 0, lvl = ec_backlight_level(bd->props.brightness); if (lvl < 0) return -EIO; + if (ec_set_brightness(lvl)) return -EIO; - return 0; + if (target_powered != bl_powered) { + ret = ec_backlight_set_power(target_powered); + if (ret < 0) + return ret; + + bl_powered = target_powered; + } + + return ret; } static int loongson_laptop_get_brightness(struct backlight_device *bd) @@ -384,7 +409,7 @@ static const struct backlight_ops backlight_laptop_ops = { static int laptop_backlight_register(void) { - int status = 0; + int status = 0, ret; struct backlight_properties props; memset(&props, 0, sizeof(props)); @@ -392,44 +417,20 @@ static int laptop_backlight_register(void) if (!acpi_evalf(hotkey_handle, &status, "ECLL", "d")) return -EIO; + ret = ec_backlight_set_power(true); + if (ret) + return ret; + + bl_powered = true; + props.max_brightness = status; props.brightness = ec_get_brightness(); + props.power = BACKLIGHT_POWER_ON; props.type = BACKLIGHT_PLATFORM; backlight_device_register("loongson_laptop", NULL, NULL, &backlight_laptop_ops, &props); - return 0; -} - -int loongson_laptop_turn_on_backlight(void) -{ - int status; - union acpi_object arg0 = { ACPI_TYPE_INTEGER }; - struct acpi_object_list args = { 1, &arg0 }; - - arg0.integer.value = 1; - status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL); - if (ACPI_FAILURE(status)) { - pr_info("Loongson lvds error: 0x%x\n", status); - return -ENODEV; - } - - return 0; -} - -int loongson_laptop_turn_off_backlight(void) -{ - int status; - union acpi_object arg0 = { ACPI_TYPE_INTEGER }; - struct acpi_object_list args = { 1, &arg0 }; - - arg0.integer.value = 0; - status = acpi_evaluate_object(NULL, "\\BLSW", &args, NULL); - if (ACPI_FAILURE(status)) { - pr_info("Loongson lvds error: 0x%x\n", status); - return -ENODEV; - } return 0; } -- GitLab From c7a6bd2019e73db0a69eeb1091cd334023ddcbcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Thu, 5 Jun 2025 20:34:18 +0800 Subject: [PATCH 1511/2211] LoongArch: vDSO: Correctly use asm parameters in syscall wrappers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit e242bbbb6d7ac7556aa1e358294dc7e3c82cc902 upstream. The syscall wrappers use the "a0" register for two different register variables, both the first argument and the return value. Here the "ret" variable is used as both input and output while the argument register is only used as input. Clang treats the conflicting input parameters as an undefined behaviour and optimizes away the argument assignment. The code seems to work by chance for the most part today but that may change in the future. Specifically clock_gettime_fallback() fails with clockids from 16 to 23, as implemented by the upcoming auxiliary clocks. Switch the "ret" register variable to a pure output, similar to the other architectures' vDSO code. This works in both clang and GCC. Link: https://lore.kernel.org/lkml/20250602102825-42aa84f0-23f1-4d10-89fc-e8bbaffd291a@linutronix.de/ Link: https://lore.kernel.org/lkml/20250519082042.742926976@linutronix.de/ Fixes: c6b99bed6b8f ("LoongArch: Add VDSO and VSYSCALL support") Fixes: 18efd0b10e0f ("LoongArch: vDSO: Wire up getrandom() vDSO implementation") Cc: stable@vger.kernel.org Reviewed-by: Nathan Chancellor Reviewed-by: Yanteng Si Reviewed-by: WANG Xuerui Reviewed-by: Xi Ruoyao Signed-off-by: Thomas Weißschuh Signed-off-by: Huacai Chen Signed-off-by: Greg Kroah-Hartman --- arch/loongarch/include/asm/vdso/getrandom.h | 2 +- arch/loongarch/include/asm/vdso/gettimeofday.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/loongarch/include/asm/vdso/getrandom.h b/arch/loongarch/include/asm/vdso/getrandom.h index 02f36772541b7..7e9edc1cb610d 100644 --- a/arch/loongarch/include/asm/vdso/getrandom.h +++ b/arch/loongarch/include/asm/vdso/getrandom.h @@ -20,7 +20,7 @@ static __always_inline ssize_t getrandom_syscall(void *_buffer, size_t _len, uns asm volatile( " syscall 0\n" - : "+r" (ret) + : "=r" (ret) : "r" (nr), "r" (buffer), "r" (len), "r" (flags) : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"); diff --git a/arch/loongarch/include/asm/vdso/gettimeofday.h b/arch/loongarch/include/asm/vdso/gettimeofday.h index 89e6b222c2f2d..2d1a9c27af292 100644 --- a/arch/loongarch/include/asm/vdso/gettimeofday.h +++ b/arch/loongarch/include/asm/vdso/gettimeofday.h @@ -25,7 +25,7 @@ static __always_inline long gettimeofday_fallback( asm volatile( " syscall 0\n" - : "+r" (ret) + : "=r" (ret) : "r" (nr), "r" (tv), "r" (tz) : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"); @@ -44,7 +44,7 @@ static __always_inline long clock_gettime_fallback( asm volatile( " syscall 0\n" - : "+r" (ret) + : "=r" (ret) : "r" (nr), "r" (clkid), "r" (ts) : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"); @@ -63,7 +63,7 @@ static __always_inline int clock_getres_fallback( asm volatile( " syscall 0\n" - : "+r" (ret) + : "=r" (ret) : "r" (nr), "r" (clkid), "r" (ts) : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"); -- GitLab From d46f8f1ede200a13a1e4501d5e83e6cd4cbbe376 Mon Sep 17 00:00:00 2001 From: Huacai Chen Date: Fri, 30 May 2025 21:45:48 +0800 Subject: [PATCH 1512/2211] LoongArch: Avoid using $r0/$r1 as "mask" for csrxchg commit 52c22661c79a7b6af7fad9f77200738fc6c51878 upstream. When building kernel with LLVM there are occasionally such errors: In file included from ./include/linux/spinlock.h:59: In file included from ./include/linux/irqflags.h:17: arch/loongarch/include/asm/irqflags.h:38:3: error: must not be $r0 or $r1 38 | "csrxchg %[val], %[mask], %[reg]\n\t" | ^ :1:16: note: instantiated into assembly here 1 | csrxchg $a1, $ra, 0 | ^ To prevent the compiler from allocating $r0 or $r1 for the "mask" of the csrxchg instruction, the 'q' constraint must be used but Clang < 21 does not support it. So force to use $t0 in the inline asm, in order to avoid using $r0/$r1 while keeping the backward compatibility. Cc: stable@vger.kernel.org Link: https://github.com/llvm/llvm-project/pull/141037 Reviewed-by: Yanteng Si Suggested-by: WANG Rui Signed-off-by: Huacai Chen Signed-off-by: Greg Kroah-Hartman --- arch/loongarch/include/asm/irqflags.h | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/arch/loongarch/include/asm/irqflags.h b/arch/loongarch/include/asm/irqflags.h index 319a8c616f1f5..003172b8406be 100644 --- a/arch/loongarch/include/asm/irqflags.h +++ b/arch/loongarch/include/asm/irqflags.h @@ -14,40 +14,48 @@ static inline void arch_local_irq_enable(void) { u32 flags = CSR_CRMD_IE; + register u32 mask asm("t0") = CSR_CRMD_IE; + __asm__ __volatile__( "csrxchg %[val], %[mask], %[reg]\n\t" : [val] "+r" (flags) - : [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD) + : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD) : "memory"); } static inline void arch_local_irq_disable(void) { u32 flags = 0; + register u32 mask asm("t0") = CSR_CRMD_IE; + __asm__ __volatile__( "csrxchg %[val], %[mask], %[reg]\n\t" : [val] "+r" (flags) - : [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD) + : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD) : "memory"); } static inline unsigned long arch_local_irq_save(void) { u32 flags = 0; + register u32 mask asm("t0") = CSR_CRMD_IE; + __asm__ __volatile__( "csrxchg %[val], %[mask], %[reg]\n\t" : [val] "+r" (flags) - : [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD) + : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD) : "memory"); return flags; } static inline void arch_local_irq_restore(unsigned long flags) { + register u32 mask asm("t0") = CSR_CRMD_IE; + __asm__ __volatile__( "csrxchg %[val], %[mask], %[reg]\n\t" : [val] "+r" (flags) - : [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD) + : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD) : "memory"); } -- GitLab From 985f086f281b7bbb6644851e63af1a17ffff9277 Mon Sep 17 00:00:00 2001 From: Tianyang Zhang Date: Fri, 30 May 2025 21:45:57 +0800 Subject: [PATCH 1513/2211] LoongArch: Fix panic caused by NULL-PMD in huge_pte_offset() commit ee084fa96123ede8b0563a1b5a9b23adc43cd50d upstream. ERROR INFO: CPU 25 Unable to handle kernel paging request at virtual address 0x0 ... Call Trace: [<900000000023c30c>] huge_pte_offset+0x3c/0x58 [<900000000057fd4c>] hugetlb_follow_page_mask+0x74/0x438 [<900000000051fee8>] __get_user_pages+0xe0/0x4c8 [<9000000000522414>] faultin_page_range+0x84/0x380 [<9000000000564e8c>] madvise_vma_behavior+0x534/0xa48 [<900000000056689c>] do_madvise+0x1bc/0x3e8 [<9000000000566df4>] sys_madvise+0x24/0x38 [<90000000015b9e88>] do_syscall+0x78/0x98 [<9000000000221f18>] handle_syscall+0xb8/0x158 In some cases, pmd may be NULL and rely on NULL as the return value for processing, so it is necessary to determine this situation here. Cc: stable@vger.kernel.org Fixes: bd51834d1cf6 ("LoongArch: Return NULL from huge_pte_offset() for invalid PMD") Signed-off-by: Tianyang Zhang Signed-off-by: Huacai Chen Signed-off-by: Greg Kroah-Hartman --- arch/loongarch/mm/hugetlbpage.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/loongarch/mm/hugetlbpage.c b/arch/loongarch/mm/hugetlbpage.c index cea84d7f2b91a..02dad4624fe32 100644 --- a/arch/loongarch/mm/hugetlbpage.c +++ b/arch/loongarch/mm/hugetlbpage.c @@ -47,7 +47,8 @@ pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr, pmd = pmd_offset(pud, addr); } } - return pmd_none(pmdp_get(pmd)) ? NULL : (pte_t *) pmd; + + return (!pmd || pmd_none(pmdp_get(pmd))) ? NULL : (pte_t *) pmd; } uint64_t pmd_to_entrylo(unsigned long pmd_val) -- GitLab From da12ef7e19048dc5714032c2db587a215852b200 Mon Sep 17 00:00:00 2001 From: Artem Sadovnikov Date: Fri, 7 Mar 2025 16:34:09 +0000 Subject: [PATCH 1514/2211] jffs2: check that raw node were preallocated before writing summary commit ec9e6f22bce433b260ea226de127ec68042849b0 upstream. Syzkaller detected a kernel bug in jffs2_link_node_ref, caused by fault injection in jffs2_prealloc_raw_node_refs. jffs2_sum_write_sumnode doesn't check return value of jffs2_prealloc_raw_node_refs and simply lets any error propagate into jffs2_sum_write_data, which eventually calls jffs2_link_node_ref in order to link the summary to an expectedly allocated node. kernel BUG at fs/jffs2/nodelist.c:592! invalid opcode: 0000 [#1] PREEMPT SMP KASAN NOPTI CPU: 1 PID: 31277 Comm: syz-executor.7 Not tainted 6.1.128-syzkaller-00139-ge10f83ca10a1 #0 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014 RIP: 0010:jffs2_link_node_ref+0x570/0x690 fs/jffs2/nodelist.c:592 Call Trace: jffs2_sum_write_data fs/jffs2/summary.c:841 [inline] jffs2_sum_write_sumnode+0xd1a/0x1da0 fs/jffs2/summary.c:874 jffs2_do_reserve_space+0xa18/0xd60 fs/jffs2/nodemgmt.c:388 jffs2_reserve_space+0x55f/0xaa0 fs/jffs2/nodemgmt.c:197 jffs2_write_inode_range+0x246/0xb50 fs/jffs2/write.c:362 jffs2_write_end+0x726/0x15d0 fs/jffs2/file.c:301 generic_perform_write+0x314/0x5d0 mm/filemap.c:3856 __generic_file_write_iter+0x2ae/0x4d0 mm/filemap.c:3973 generic_file_write_iter+0xe3/0x350 mm/filemap.c:4005 call_write_iter include/linux/fs.h:2265 [inline] do_iter_readv_writev+0x20f/0x3c0 fs/read_write.c:735 do_iter_write+0x186/0x710 fs/read_write.c:861 vfs_iter_write+0x70/0xa0 fs/read_write.c:902 iter_file_splice_write+0x73b/0xc90 fs/splice.c:685 do_splice_from fs/splice.c:763 [inline] direct_splice_actor+0x10c/0x170 fs/splice.c:950 splice_direct_to_actor+0x337/0xa10 fs/splice.c:896 do_splice_direct+0x1a9/0x280 fs/splice.c:1002 do_sendfile+0xb13/0x12c0 fs/read_write.c:1255 __do_sys_sendfile64 fs/read_write.c:1323 [inline] __se_sys_sendfile64 fs/read_write.c:1309 [inline] __x64_sys_sendfile64+0x1cf/0x210 fs/read_write.c:1309 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x35/0x80 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x6e/0xd8 Fix this issue by checking return value of jffs2_prealloc_raw_node_refs before calling jffs2_sum_write_data. Found by Linux Verification Center (linuxtesting.org) with Syzkaller. Cc: stable@vger.kernel.org Fixes: 2f785402f39b ("[JFFS2] Reduce visibility of raw_node_ref to upper layers of JFFS2 code.") Signed-off-by: Artem Sadovnikov Reviewed-by: Zhihao Cheng Signed-off-by: Richard Weinberger Signed-off-by: Greg Kroah-Hartman --- fs/jffs2/summary.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fs/jffs2/summary.c b/fs/jffs2/summary.c index 4fe64519870f1..d83372d3e1a07 100644 --- a/fs/jffs2/summary.c +++ b/fs/jffs2/summary.c @@ -858,7 +858,10 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c) spin_unlock(&c->erase_completion_lock); jeb = c->nextblock; - jffs2_prealloc_raw_node_refs(c, jeb, 1); + ret = jffs2_prealloc_raw_node_refs(c, jeb, 1); + + if (ret) + goto out; if (!c->summary->sum_num || !c->summary->sum_list_head) { JFFS2_WARNING("Empty summary info!!!\n"); @@ -872,6 +875,8 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c) datasize += padsize; ret = jffs2_sum_write_data(c, jeb, infosize, datasize, padsize); + +out: spin_lock(&c->erase_completion_lock); return ret; } -- GitLab From d1b81776f337a9b997f797c70ac0a26d838a2168 Mon Sep 17 00:00:00 2001 From: Fedor Pchelkin Date: Tue, 25 Mar 2025 19:32:13 +0300 Subject: [PATCH 1515/2211] jffs2: check jffs2_prealloc_raw_node_refs() result in few other places commit 2b6d96503255a3ed676cd70f8368870c6d6a25c6 upstream. Fuzzing hit another invalid pointer dereference due to the lack of checking whether jffs2_prealloc_raw_node_refs() completed successfully. Subsequent logic implies that the node refs have been allocated. Handle that. The code is ready for propagating the error upwards. KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f] CPU: 1 PID: 5835 Comm: syz-executor145 Not tainted 5.10.234-syzkaller #0 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014 RIP: 0010:jffs2_link_node_ref+0xac/0x690 fs/jffs2/nodelist.c:600 Call Trace: jffs2_mark_erased_block fs/jffs2/erase.c:460 [inline] jffs2_erase_pending_blocks+0x688/0x1860 fs/jffs2/erase.c:118 jffs2_garbage_collect_pass+0x638/0x1a00 fs/jffs2/gc.c:253 jffs2_reserve_space+0x3f4/0xad0 fs/jffs2/nodemgmt.c:167 jffs2_write_inode_range+0x246/0xb50 fs/jffs2/write.c:362 jffs2_write_end+0x712/0x1110 fs/jffs2/file.c:302 generic_perform_write+0x2c2/0x500 mm/filemap.c:3347 __generic_file_write_iter+0x252/0x610 mm/filemap.c:3465 generic_file_write_iter+0xdb/0x230 mm/filemap.c:3497 call_write_iter include/linux/fs.h:2039 [inline] do_iter_readv_writev+0x46d/0x750 fs/read_write.c:740 do_iter_write+0x18c/0x710 fs/read_write.c:866 vfs_writev+0x1db/0x6a0 fs/read_write.c:939 do_pwritev fs/read_write.c:1036 [inline] __do_sys_pwritev fs/read_write.c:1083 [inline] __se_sys_pwritev fs/read_write.c:1078 [inline] __x64_sys_pwritev+0x235/0x310 fs/read_write.c:1078 do_syscall_64+0x30/0x40 arch/x86/entry/common.c:46 entry_SYSCALL_64_after_hwframe+0x67/0xd1 Found by Linux Verification Center (linuxtesting.org) with Syzkaller. Fixes: 2f785402f39b ("[JFFS2] Reduce visibility of raw_node_ref to upper layers of JFFS2 code.") Fixes: f560928baa60 ("[JFFS2] Allocate node_ref for wasted space when skipping to page boundary") Cc: stable@vger.kernel.org Signed-off-by: Fedor Pchelkin Reviewed-by: Zhihao Cheng Signed-off-by: Richard Weinberger Signed-off-by: Greg Kroah-Hartman --- fs/jffs2/erase.c | 4 +++- fs/jffs2/scan.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c index ef3a1e1b6cb06..fda9f4d6093f9 100644 --- a/fs/jffs2/erase.c +++ b/fs/jffs2/erase.c @@ -425,7 +425,9 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb .totlen = cpu_to_je32(c->cleanmarker_size) }; - jffs2_prealloc_raw_node_refs(c, jeb, 1); + ret = jffs2_prealloc_raw_node_refs(c, jeb, 1); + if (ret) + goto filebad; marker.hdr_crc = cpu_to_je32(crc32(0, &marker, sizeof(struct jffs2_unknown_node)-4)); diff --git a/fs/jffs2/scan.c b/fs/jffs2/scan.c index 29671e33a1714..62879c218d4b1 100644 --- a/fs/jffs2/scan.c +++ b/fs/jffs2/scan.c @@ -256,7 +256,9 @@ int jffs2_scan_medium(struct jffs2_sb_info *c) jffs2_dbg(1, "%s(): Skipping %d bytes in nextblock to ensure page alignment\n", __func__, skip); - jffs2_prealloc_raw_node_refs(c, c->nextblock, 1); + ret = jffs2_prealloc_raw_node_refs(c, c->nextblock, 1); + if (ret) + goto out; jffs2_scan_dirty_space(c, c->nextblock, skip); } #endif -- GitLab From b735c8dfbf5ce3c9311cd6804d3848578ea90bc6 Mon Sep 17 00:00:00 2001 From: Shyam Prasad N Date: Mon, 2 Jun 2025 22:37:12 +0530 Subject: [PATCH 1516/2211] cifs: deal with the channel loading lag while picking channels commit 66d590b828b1fd9fa337047ae58fe1c4c6f43609 upstream. Our current approach to select a channel for sending requests is this: 1. iterate all channels to find the min and max queue depth 2. if min and max are not the same, pick the channel with min depth 3. if min and max are same, round robin, as all channels are equally loaded The problem with this approach is that there's a lag between selecting a channel and sending the request (that increases the queue depth on the channel). While these numbers will eventually catch up, there could be a skew in the channel usage, depending on the application's I/O parallelism and the server's speed of handling requests. With sufficient parallelism, this lag can artificially increase the queue depth, thereby impacting the performance negatively. This change will change the step 1 above to start the iteration from the last selected channel. This is to reduce the skew in channel usage even in the presence of this lag. Fixes: ea90708d3cf3 ("cifs: use the least loaded channel for sending requests") Cc: Signed-off-by: Shyam Prasad N Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/transport.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index 9f13a705f7f67..35d1871187931 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -1029,14 +1029,16 @@ struct TCP_Server_Info *cifs_pick_channel(struct cifs_ses *ses) uint index = 0; unsigned int min_in_flight = UINT_MAX, max_in_flight = 0; struct TCP_Server_Info *server = NULL; - int i; + int i, start, cur; if (!ses) return NULL; spin_lock(&ses->chan_lock); + start = atomic_inc_return(&ses->chan_seq); for (i = 0; i < ses->chan_count; i++) { - server = ses->chans[i].server; + cur = (start + i) % ses->chan_count; + server = ses->chans[cur].server; if (!server || server->terminate) continue; @@ -1053,17 +1055,15 @@ struct TCP_Server_Info *cifs_pick_channel(struct cifs_ses *ses) */ if (server->in_flight < min_in_flight) { min_in_flight = server->in_flight; - index = i; + index = cur; } if (server->in_flight > max_in_flight) max_in_flight = server->in_flight; } /* if all channels are equally loaded, fall back to round-robin */ - if (min_in_flight == max_in_flight) { - index = (uint)atomic_inc_return(&ses->chan_seq); - index %= ses->chan_count; - } + if (min_in_flight == max_in_flight) + index = (uint)start % ses->chan_count; server = ses->chans[index].server; spin_unlock(&ses->chan_lock); -- GitLab From 3b2bec886f554dfb93e6eb47dc43102167db3acb Mon Sep 17 00:00:00 2001 From: Shyam Prasad N Date: Mon, 2 Jun 2025 22:37:15 +0530 Subject: [PATCH 1517/2211] cifs: serialize other channels when query server interfaces is pending commit b5e3e6e28cf3853566ba5d816f79aba5be579158 upstream. Today, during smb2_reconnect, session_mutex is released as soon as the tcon is reconnected and is in a good state. However, in case multichannel is enabled, there is also a query of server interfaces that follows. We've seen that this query can race with reconnects of other channels, causing them to step on each other with reconnects. This change extends the hold of session_mutex till after the query of server interfaces is complete. In order to avoid recursive smb2_reconnect checks during query ioctl, this change also introduces a session flag for sessions where such a query is in progress. Signed-off-by: Shyam Prasad N Cc: stable@vger.kernel.org Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/cifsglob.h | 1 + fs/smb/client/smb2pdu.c | 24 ++++++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index a38b40d68b14f..e0faee22be07e 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -1058,6 +1058,7 @@ struct cifs_chan { }; #define CIFS_SES_FLAG_SCALE_CHANNELS (0x1) +#define CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES (0x2) /* * Session structure. One of these for each uid session with a particular host diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index 176be478cd138..3eb847db7a535 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -428,14 +428,19 @@ skip_sess_setup: if (!rc && (server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL) && server->ops->query_server_interfaces) { - mutex_unlock(&ses->session_mutex); - /* - * query server network interfaces, in case they change + * query server network interfaces, in case they change. + * Also mark the session as pending this update while the query + * is in progress. This will be used to avoid calling + * smb2_reconnect recursively. */ + ses->flags |= CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES; xid = get_xid(); rc = server->ops->query_server_interfaces(xid, tcon, false); free_xid(xid); + ses->flags &= ~CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES; + + mutex_unlock(&ses->session_mutex); if (rc == -EOPNOTSUPP && ses->chan_count > 1) { /* @@ -577,11 +582,18 @@ static int smb2_ioctl_req_init(u32 opcode, struct cifs_tcon *tcon, struct TCP_Server_Info *server, void **request_buf, unsigned int *total_len) { - /* Skip reconnect only for FSCTL_VALIDATE_NEGOTIATE_INFO IOCTLs */ - if (opcode == FSCTL_VALIDATE_NEGOTIATE_INFO) { + /* + * Skip reconnect in one of the following cases: + * 1. For FSCTL_VALIDATE_NEGOTIATE_INFO IOCTLs + * 2. For FSCTL_QUERY_NETWORK_INTERFACE_INFO IOCTL when called from + * smb2_reconnect (indicated by CIFS_SES_FLAG_SCALE_CHANNELS ses flag) + */ + if (opcode == FSCTL_VALIDATE_NEGOTIATE_INFO || + (opcode == FSCTL_QUERY_NETWORK_INTERFACE_INFO && + (tcon->ses->flags & CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES))) return __smb2_plain_req_init(SMB2_IOCTL, tcon, server, request_buf, total_len); - } + return smb2_plain_req_init(SMB2_IOCTL, tcon, server, request_buf, total_len); } -- GitLab From 2c34f1e095a12be3674fb79d84d1af7896e49245 Mon Sep 17 00:00:00 2001 From: Shyam Prasad N Date: Mon, 2 Jun 2025 22:37:17 +0530 Subject: [PATCH 1518/2211] cifs: do not disable interface polling on failure commit 42ca547b13a20e7cbb04fbdf8d5f089ac4bb35b7 upstream. When a server has multichannel enabled, we keep polling the server for interfaces periodically. However, when this query fails, we disable the polling. This can be problematic as it takes away the chance for the server to start advertizing again. This change reschedules the delayed work, even if the current call failed. That way, multichannel sessions can recover. Signed-off-by: Shyam Prasad N Cc: stable@vger.kernel.org Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/connect.c | 6 +----- fs/smb/client/smb2pdu.c | 9 +++++---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index 676870ea46acf..0a5111a32fb72 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -132,13 +132,9 @@ static void smb2_query_server_interfaces(struct work_struct *work) rc = server->ops->query_server_interfaces(xid, tcon, false); free_xid(xid); - if (rc) { - if (rc == -EOPNOTSUPP) - return; - + if (rc) cifs_dbg(FYI, "%s: failed to query server interfaces: %d\n", __func__, rc); - } queue_delayed_work(cifsiod_wq, &tcon->query_interfaces, (SMB_INTERFACE_POLL_INTERVAL * HZ)); diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index 3eb847db7a535..c6ae395a46925 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -440,6 +440,10 @@ skip_sess_setup: free_xid(xid); ses->flags &= ~CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES; + /* regardless of rc value, setup polling */ + queue_delayed_work(cifsiod_wq, &tcon->query_interfaces, + (SMB_INTERFACE_POLL_INTERVAL * HZ)); + mutex_unlock(&ses->session_mutex); if (rc == -EOPNOTSUPP && ses->chan_count > 1) { @@ -460,11 +464,8 @@ skip_sess_setup: if (ses->chan_max > ses->chan_count && ses->iface_count && !SERVER_IS_CHAN(server)) { - if (ses->chan_count == 1) { + if (ses->chan_count == 1) cifs_server_dbg(VFS, "supports multichannel now\n"); - queue_delayed_work(cifsiod_wq, &tcon->query_interfaces, - (SMB_INTERFACE_POLL_INTERVAL * HZ)); - } cifs_try_adding_channels(ses); } -- GitLab From 3a83a904bf9a2bb5f2ff06ff6cfdbadea4e71ba5 Mon Sep 17 00:00:00 2001 From: Bharath SM Date: Wed, 11 Jun 2025 16:59:02 +0530 Subject: [PATCH 1519/2211] smb: improve directory cache reuse for readdir operations commit 72dd7961a4bb4fa1fc456169a61dd12e68e50645 upstream. Currently, cached directory contents were not reused across subsequent 'ls' operations because the cache validity check relied on comparing the ctx pointer, which changes with each readdir invocation. As a result, the cached dir entries was not marked as valid and the cache was not utilized for subsequent 'ls' operations. This change uses the file pointer, which remains consistent across all readdir calls for a given directory instance, to associate and validate the cache. As a result, cached directory contents can now be correctly reused, improving performance for repeated directory listings. Performance gains with local windows SMB server: Without the patch and default actimeo=1: 1000 directory enumeration operations on dir with 10k files took 135.0s With this patch and actimeo=0: 1000 directory enumeration operations on dir with 10k files took just 5.1s Signed-off-by: Bharath SM Reviewed-by: Shyam Prasad N Cc: stable@vger.kernel.org Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/cached_dir.h | 8 ++++---- fs/smb/client/readdir.c | 28 +++++++++++++++------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/fs/smb/client/cached_dir.h b/fs/smb/client/cached_dir.h index 1dfe79d947a62..bc8a812ff95f8 100644 --- a/fs/smb/client/cached_dir.h +++ b/fs/smb/client/cached_dir.h @@ -21,10 +21,10 @@ struct cached_dirent { struct cached_dirents { bool is_valid:1; bool is_failed:1; - struct dir_context *ctx; /* - * Only used to make sure we only take entries - * from a single context. Never dereferenced. - */ + struct file *file; /* + * Used to associate the cache with a single + * open file instance. + */ struct mutex de_mutex; int pos; /* Expected ctx->pos */ struct list_head entries; diff --git a/fs/smb/client/readdir.c b/fs/smb/client/readdir.c index 787d6bcb5d1dc..c3feb26fcfd03 100644 --- a/fs/smb/client/readdir.c +++ b/fs/smb/client/readdir.c @@ -850,9 +850,9 @@ static bool emit_cached_dirents(struct cached_dirents *cde, } static void update_cached_dirents_count(struct cached_dirents *cde, - struct dir_context *ctx) + struct file *file) { - if (cde->ctx != ctx) + if (cde->file != file) return; if (cde->is_valid || cde->is_failed) return; @@ -861,9 +861,9 @@ static void update_cached_dirents_count(struct cached_dirents *cde, } static void finished_cached_dirents_count(struct cached_dirents *cde, - struct dir_context *ctx) + struct dir_context *ctx, struct file *file) { - if (cde->ctx != ctx) + if (cde->file != file) return; if (cde->is_valid || cde->is_failed) return; @@ -876,11 +876,12 @@ static void finished_cached_dirents_count(struct cached_dirents *cde, static void add_cached_dirent(struct cached_dirents *cde, struct dir_context *ctx, const char *name, int namelen, - struct cifs_fattr *fattr) + struct cifs_fattr *fattr, + struct file *file) { struct cached_dirent *de; - if (cde->ctx != ctx) + if (cde->file != file) return; if (cde->is_valid || cde->is_failed) return; @@ -910,7 +911,8 @@ static void add_cached_dirent(struct cached_dirents *cde, static bool cifs_dir_emit(struct dir_context *ctx, const char *name, int namelen, struct cifs_fattr *fattr, - struct cached_fid *cfid) + struct cached_fid *cfid, + struct file *file) { bool rc; ino_t ino = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid); @@ -922,7 +924,7 @@ static bool cifs_dir_emit(struct dir_context *ctx, if (cfid) { mutex_lock(&cfid->dirents.de_mutex); add_cached_dirent(&cfid->dirents, ctx, name, namelen, - fattr); + fattr, file); mutex_unlock(&cfid->dirents.de_mutex); } @@ -1022,7 +1024,7 @@ static int cifs_filldir(char *find_entry, struct file *file, cifs_prime_dcache(file_dentry(file), &name, &fattr); return !cifs_dir_emit(ctx, name.name, name.len, - &fattr, cfid); + &fattr, cfid, file); } @@ -1073,8 +1075,8 @@ int cifs_readdir(struct file *file, struct dir_context *ctx) * we need to initialize scanning and storing the * directory content. */ - if (ctx->pos == 0 && cfid->dirents.ctx == NULL) { - cfid->dirents.ctx = ctx; + if (ctx->pos == 0 && cfid->dirents.file == NULL) { + cfid->dirents.file = file; cfid->dirents.pos = 2; } /* @@ -1142,7 +1144,7 @@ int cifs_readdir(struct file *file, struct dir_context *ctx) } else { if (cfid) { mutex_lock(&cfid->dirents.de_mutex); - finished_cached_dirents_count(&cfid->dirents, ctx); + finished_cached_dirents_count(&cfid->dirents, ctx, file); mutex_unlock(&cfid->dirents.de_mutex); } cifs_dbg(FYI, "Could not find entry\n"); @@ -1183,7 +1185,7 @@ int cifs_readdir(struct file *file, struct dir_context *ctx) ctx->pos++; if (cfid) { mutex_lock(&cfid->dirents.de_mutex); - update_cached_dirents_count(&cfid->dirents, ctx); + update_cached_dirents_count(&cfid->dirents, file); mutex_unlock(&cfid->dirents.de_mutex); } -- GitLab From dba20f641872f23bbfe00cb72bb68b1b4bc9c698 Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Fri, 6 Jun 2025 13:57:39 -0700 Subject: [PATCH 1520/2211] scsi: storvsc: Increase the timeouts to storvsc_timeout commit b2f966568faaad326de97481096d0f3dc0971c43 upstream. Currently storvsc_timeout is only used in storvsc_sdev_configure(), and 5s and 10s are used elsewhere. It turns out that rarely the 5s is not enough on Azure, so let's use storvsc_timeout everywhere. In case a timeout happens and storvsc_channel_init() returns an error, close the VMBus channel so that any host-to-guest messages in the channel's ringbuffer, which might come late, can be safely ignored. Add a "const" to storvsc_timeout. Cc: stable@kernel.org Signed-off-by: Dexuan Cui Link: https://lore.kernel.org/r/1749243459-10419-1-git-send-email-decui@microsoft.com Reviewed-by: Long Li Signed-off-by: Martin K. Petersen Signed-off-by: Greg Kroah-Hartman --- drivers/scsi/storvsc_drv.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c index 48b0ca92b44fb..954a1cc50ba74 100644 --- a/drivers/scsi/storvsc_drv.c +++ b/drivers/scsi/storvsc_drv.c @@ -362,7 +362,7 @@ MODULE_PARM_DESC(ring_avail_percent_lowater, /* * Timeout in seconds for all devices managed by this driver. */ -static int storvsc_timeout = 180; +static const int storvsc_timeout = 180; #if IS_ENABLED(CONFIG_SCSI_FC_ATTRS) static struct scsi_transport_template *fc_transport_template; @@ -768,7 +768,7 @@ static void handle_multichannel_storage(struct hv_device *device, int max_chns) return; } - t = wait_for_completion_timeout(&request->wait_event, 10*HZ); + t = wait_for_completion_timeout(&request->wait_event, storvsc_timeout * HZ); if (t == 0) { dev_err(dev, "Failed to create sub-channel: timed out\n"); return; @@ -833,7 +833,7 @@ static int storvsc_execute_vstor_op(struct hv_device *device, if (ret != 0) return ret; - t = wait_for_completion_timeout(&request->wait_event, 5*HZ); + t = wait_for_completion_timeout(&request->wait_event, storvsc_timeout * HZ); if (t == 0) return -ETIMEDOUT; @@ -1351,6 +1351,8 @@ static int storvsc_connect_to_vsp(struct hv_device *device, u32 ring_size, return ret; ret = storvsc_channel_init(device, is_fc); + if (ret) + vmbus_close(device->channel); return ret; } @@ -1668,7 +1670,7 @@ static int storvsc_host_reset_handler(struct scsi_cmnd *scmnd) if (ret != 0) return FAILED; - t = wait_for_completion_timeout(&request->wait_event, 5*HZ); + t = wait_for_completion_timeout(&request->wait_event, storvsc_timeout * HZ); if (t == 0) return TIMEOUT_ERROR; -- GitLab From c455ae2ce09ce9868e9aef68ebffab672ddd5f7b Mon Sep 17 00:00:00 2001 From: Peter Oberparleiter Date: Tue, 3 Jun 2025 20:21:56 +0200 Subject: [PATCH 1521/2211] scsi: s390: zfcp: Ensure synchronous unit_add commit 9697ca0d53e3db357be26d2414276143c4a2cd49 upstream. Improve the usability of the unit_add sysfs attribute by ensuring that the associated FCP LUN scan processing is completed synchronously. This enables configuration tooling to consistently determine the end of the scan process to allow for serialization of follow-on actions. While the scan process associated with unit_add typically completes synchronously, it is deferred to an asynchronous background process if unit_add is used before initial remote port scanning has completed. This occurs when unit_add is used immediately after setting the associated FCP device online. To ensure synchronous unit_add processing, wait for remote port scanning to complete before initiating the FCP LUN scan. Cc: stable@vger.kernel.org Reviewed-by: M Nikhil Reviewed-by: Nihar Panda Signed-off-by: Peter Oberparleiter Signed-off-by: Nihar Panda Link: https://lore.kernel.org/r/20250603182252.2287285-2-niharp@linux.ibm.com Signed-off-by: Martin K. Petersen Signed-off-by: Greg Kroah-Hartman --- drivers/s390/scsi/zfcp_sysfs.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c index cb67fa80fb12c..a95da6768f665 100644 --- a/drivers/s390/scsi/zfcp_sysfs.c +++ b/drivers/s390/scsi/zfcp_sysfs.c @@ -450,6 +450,8 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev, if (kstrtoull(buf, 0, (unsigned long long *) &fcp_lun)) return -EINVAL; + flush_work(&port->rport_work); + retval = zfcp_unit_add(port, fcp_lun); if (retval) return retval; -- GitLab From 4220cc0b98c9dcf7d7874e35ed0b18feb1fec853 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Fri, 13 Jun 2025 13:37:41 -0600 Subject: [PATCH 1522/2211] nvme: always punt polled uring_cmd end_io work to task_work commit 9ce6c9875f3e995be5fd720b65835291f8a609b1 upstream. Currently NVMe uring_cmd completions will complete locally, if they are polled. This is done because those completions are always invoked from task context. And while that is true, there's no guarantee that it's invoked under the right ring context, or even task. If someone does NVMe passthrough via multiple threads and with a limited number of poll queues, then ringA may find completions from ringB. For that case, completing the request may not be sound. Always just punt the passthrough completions via task_work, which will redirect the completion, if needed. Cc: stable@vger.kernel.org Fixes: 585079b6e425 ("nvme: wire up async polling for io passthrough commands") Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- drivers/nvme/host/ioctl.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c index a1b3c538a4bd2..64ae8af01d9a4 100644 --- a/drivers/nvme/host/ioctl.c +++ b/drivers/nvme/host/ioctl.c @@ -442,21 +442,14 @@ static enum rq_end_io_ret nvme_uring_cmd_end_io(struct request *req, pdu->result = le64_to_cpu(nvme_req(req)->result.u64); /* - * For iopoll, complete it directly. Note that using the uring_cmd - * helper for this is safe only because we check blk_rq_is_poll(). - * As that returns false if we're NOT on a polled queue, then it's - * safe to use the polled completion helper. - * - * Otherwise, move the completion to task work. + * IOPOLL could potentially complete this request directly, but + * if multiple rings are polling on the same queue, then it's possible + * for one ring to find completions for another ring. Punting the + * completion via task_work will always direct it to the right + * location, rather than potentially complete requests for ringA + * under iopoll invocations from ringB. */ - if (blk_rq_is_poll(req)) { - if (pdu->bio) - blk_rq_unmap_user(pdu->bio); - io_uring_cmd_iopoll_done(ioucmd, pdu->result, pdu->status); - } else { - io_uring_cmd_do_in_task_lazy(ioucmd, nvme_uring_task_cb); - } - + io_uring_cmd_do_in_task_lazy(ioucmd, nvme_uring_task_cb); return RQ_END_IO_FREE; } -- GitLab From f9b97d466e6026ccbdda30bb5b71965b67ccbc82 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 11 Jun 2025 08:35:01 +0000 Subject: [PATCH 1523/2211] net_sched: sch_sfq: reject invalid perturb period commit 7ca52541c05c832d32b112274f81a985101f9ba8 upstream. Gerrard Tai reported that SFQ perturb_period has no range check yet, and this can be used to trigger a race condition fixed in a separate patch. We want to make sure ctl->perturb_period * HZ will not overflow and is positive. Tested: tc qd add dev lo root sfq perturb -10 # negative value : error Error: sch_sfq: invalid perturb period. tc qd add dev lo root sfq perturb 1000000000 # too big : error Error: sch_sfq: invalid perturb period. tc qd add dev lo root sfq perturb 2000000 # acceptable value tc -s -d qd sh dev lo qdisc sfq 8005: root refcnt 2 limit 127p quantum 64Kb depth 127 flows 128 divisor 1024 perturb 2000000sec Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Reported-by: Gerrard Tai Signed-off-by: Eric Dumazet Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20250611083501.1810459-1-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- net/sched/sch_sfq.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index a903b3c468050..11a7d5a25d6b1 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c @@ -656,6 +656,14 @@ static int sfq_change(struct Qdisc *sch, struct nlattr *opt, NL_SET_ERR_MSG_MOD(extack, "invalid quantum"); return -EINVAL; } + + if (ctl->perturb_period < 0 || + ctl->perturb_period > INT_MAX / HZ) { + NL_SET_ERR_MSG_MOD(extack, "invalid perturb period"); + return -EINVAL; + } + perturb_period = ctl->perturb_period * HZ; + if (ctl_v1 && !red_check_params(ctl_v1->qth_min, ctl_v1->qth_max, ctl_v1->Wlog, ctl_v1->Scell_log, NULL)) return -EINVAL; @@ -672,14 +680,12 @@ static int sfq_change(struct Qdisc *sch, struct nlattr *opt, headdrop = q->headdrop; maxdepth = q->maxdepth; maxflows = q->maxflows; - perturb_period = q->perturb_period; quantum = q->quantum; flags = q->flags; /* update and validate configuration */ if (ctl->quantum) quantum = ctl->quantum; - perturb_period = ctl->perturb_period * HZ; if (ctl->flows) maxflows = min_t(u32, ctl->flows, SFQ_MAX_FLOWS); if (ctl->divisor) { -- GitLab From 2a3ad42a57b43145839f2f233fb562247658a6d9 Mon Sep 17 00:00:00 2001 From: Jakub Kicinski Date: Mon, 9 Jun 2025 17:12:44 -0700 Subject: [PATCH 1524/2211] net: clear the dst when changing skb protocol MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit ba9db6f907ac02215e30128770f85fbd7db2fcf9 upstream. A not-so-careful NAT46 BPF program can crash the kernel if it indiscriminately flips ingress packets from v4 to v6: BUG: kernel NULL pointer dereference, address: 0000000000000000 ip6_rcv_core (net/ipv6/ip6_input.c:190:20) ipv6_rcv (net/ipv6/ip6_input.c:306:8) process_backlog (net/core/dev.c:6186:4) napi_poll (net/core/dev.c:6906:9) net_rx_action (net/core/dev.c:7028:13) do_softirq (kernel/softirq.c:462:3) netif_rx (net/core/dev.c:5326:3) dev_loopback_xmit (net/core/dev.c:4015:2) ip_mc_finish_output (net/ipv4/ip_output.c:363:8) NF_HOOK (./include/linux/netfilter.h:314:9) ip_mc_output (net/ipv4/ip_output.c:400:5) dst_output (./include/net/dst.h:459:9) ip_local_out (net/ipv4/ip_output.c:130:9) ip_send_skb (net/ipv4/ip_output.c:1496:8) udp_send_skb (net/ipv4/udp.c:1040:8) udp_sendmsg (net/ipv4/udp.c:1328:10) The output interface has a 4->6 program attached at ingress. We try to loop the multicast skb back to the sending socket. Ingress BPF runs as part of netif_rx(), pushes a valid v6 hdr and changes skb->protocol to v6. We enter ip6_rcv_core which tries to use skb_dst(). But the dst is still an IPv4 one left after IPv4 mcast output. Clear the dst in all BPF helpers which change the protocol. Try to preserve metadata dsts, those may carry non-routing metadata. Cc: stable@vger.kernel.org Reviewed-by: Maciej Żenczykowski Acked-by: Daniel Borkmann Fixes: d219df60a70e ("bpf: Add ipip6 and ip6ip decap support for bpf_skb_adjust_room()") Fixes: 1b00e0dfe7d0 ("bpf: update skb->protocol in bpf_skb_net_grow") Fixes: 6578171a7ff0 ("bpf: add bpf_skb_change_proto helper") Reviewed-by: Willem de Bruijn Link: https://patch.msgid.link/20250610001245.1981782-1-kuba@kernel.org Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- net/core/filter.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/net/core/filter.c b/net/core/filter.c index 99b23fd2f509c..55c152c3dea50 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -3249,6 +3249,13 @@ static const struct bpf_func_proto bpf_skb_vlan_pop_proto = { .arg1_type = ARG_PTR_TO_CTX, }; +static void bpf_skb_change_protocol(struct sk_buff *skb, u16 proto) +{ + skb->protocol = htons(proto); + if (skb_valid_dst(skb)) + skb_dst_drop(skb); +} + static int bpf_skb_generic_push(struct sk_buff *skb, u32 off, u32 len) { /* Caller already did skb_cow() with len as headroom, @@ -3345,7 +3352,7 @@ static int bpf_skb_proto_4_to_6(struct sk_buff *skb) } } - skb->protocol = htons(ETH_P_IPV6); + bpf_skb_change_protocol(skb, ETH_P_IPV6); skb_clear_hash(skb); return 0; @@ -3375,7 +3382,7 @@ static int bpf_skb_proto_6_to_4(struct sk_buff *skb) } } - skb->protocol = htons(ETH_P_IP); + bpf_skb_change_protocol(skb, ETH_P_IP); skb_clear_hash(skb); return 0; @@ -3566,10 +3573,10 @@ static int bpf_skb_net_grow(struct sk_buff *skb, u32 off, u32 len_diff, /* Match skb->protocol to new outer l3 protocol */ if (skb->protocol == htons(ETH_P_IP) && flags & BPF_F_ADJ_ROOM_ENCAP_L3_IPV6) - skb->protocol = htons(ETH_P_IPV6); + bpf_skb_change_protocol(skb, ETH_P_IPV6); else if (skb->protocol == htons(ETH_P_IPV6) && flags & BPF_F_ADJ_ROOM_ENCAP_L3_IPV4) - skb->protocol = htons(ETH_P_IP); + bpf_skb_change_protocol(skb, ETH_P_IP); } if (skb_is_gso(skb)) { @@ -3622,10 +3629,10 @@ static int bpf_skb_net_shrink(struct sk_buff *skb, u32 off, u32 len_diff, /* Match skb->protocol to new outer l3 protocol */ if (skb->protocol == htons(ETH_P_IP) && flags & BPF_F_ADJ_ROOM_DECAP_L3_IPV6) - skb->protocol = htons(ETH_P_IPV6); + bpf_skb_change_protocol(skb, ETH_P_IPV6); else if (skb->protocol == htons(ETH_P_IPV6) && flags & BPF_F_ADJ_ROOM_DECAP_L3_IPV4) - skb->protocol = htons(ETH_P_IP); + bpf_skb_change_protocol(skb, ETH_P_IP); if (skb_is_gso(skb)) { struct skb_shared_info *shinfo = skb_shinfo(skb); -- GitLab From 510a29d7769907434bc26476043a36c51e034a0b Mon Sep 17 00:00:00 2001 From: Ryan Roberts Date: Fri, 6 Jun 2025 10:28:07 +0100 Subject: [PATCH 1525/2211] mm: close theoretical race where stale TLB entries could linger commit 383c4613c67c26e90e8eebb72e3083457d02033f upstream. Commit 3ea277194daa ("mm, mprotect: flush TLB if potentially racing with a parallel reclaim leaving stale TLB entries") described a theoretical race as such: """ Nadav Amit identified a theoretical race between page reclaim and mprotect due to TLB flushes being batched outside of the PTL being held. He described the race as follows: CPU0 CPU1 ---- ---- user accesses memory using RW PTE [PTE now cached in TLB] try_to_unmap_one() ==> ptep_get_and_clear() ==> set_tlb_ubc_flush_pending() mprotect(addr, PROT_READ) ==> change_pte_range() ==> [ PTE non-present - no flush ] user writes using cached RW PTE ... try_to_unmap_flush() The same type of race exists for reads when protecting for PROT_NONE and also exists for operations that can leave an old TLB entry behind such as munmap, mremap and madvise. """ The solution was to introduce flush_tlb_batched_pending() and call it under the PTL from mprotect/madvise/munmap/mremap to complete any pending tlb flushes. However, while madvise_free_pte_range() and madvise_cold_or_pageout_pte_range() were both retro-fitted to call flush_tlb_batched_pending() immediately after initially acquiring the PTL, they both temporarily release the PTL to split a large folio if they stumble upon one. In this case, where re-acquiring the PTL flush_tlb_batched_pending() must be called again, but it previously was not. Let's fix that. There are 2 Fixes: tags here: the first is the commit that fixed madvise_free_pte_range(). The second is the commit that added madvise_cold_or_pageout_pte_range(), which looks like it copy/pasted the faulty pattern from madvise_free_pte_range(). This is a theoretical bug discovered during code review. Link: https://lkml.kernel.org/r/20250606092809.4194056-1-ryan.roberts@arm.com Fixes: 3ea277194daa ("mm, mprotect: flush TLB if potentially racing with a parallel reclaim leaving stale TLB entries") Fixes: 9c276cc65a58 ("mm: introduce MADV_COLD") Signed-off-by: Ryan Roberts Reviewed-by: Jann Horn Acked-by: David Hildenbrand Cc: Liam Howlett Cc: Lorenzo Stoakes Cc: Mel Gorman Cc: Vlastimil Babka Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- mm/madvise.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mm/madvise.c b/mm/madvise.c index c211e8fa4e49b..2e66a08fd4f4c 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -495,6 +495,7 @@ restart: pte_offset_map_lock(mm, pmd, addr, &ptl); if (!start_pte) break; + flush_tlb_batched_pending(mm); arch_enter_lazy_mmu_mode(); if (!err) nr = 0; @@ -728,6 +729,7 @@ static int madvise_free_pte_range(pmd_t *pmd, unsigned long addr, start_pte = pte; if (!start_pte) break; + flush_tlb_batched_pending(mm); arch_enter_lazy_mmu_mode(); if (!err) nr = 0; -- GitLab From 5ec6148cb83782636e4857789d5b7c0194a6fb91 Mon Sep 17 00:00:00 2001 From: Marek Szyprowski Date: Wed, 7 May 2025 18:09:12 +0200 Subject: [PATCH 1526/2211] udmabuf: use sgtable-based scatterlist wrappers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit afe382843717d44b24ef5014d57dcbaab75a4052 upstream. Use common wrappers operating directly on the struct sg_table objects to fix incorrect use of scatterlists sync calls. dma_sync_sg_for_*() functions have to be called with the number of elements originally passed to dma_map_sg_*() function, not the one returned in sgtable's nents. Fixes: 1ffe09590121 ("udmabuf: fix dma-buf cpu access") CC: stable@vger.kernel.org Signed-off-by: Marek Szyprowski Acked-by: Vivek Kasireddy Reviewed-by: Christian König Signed-off-by: Christian König Link: https://lore.kernel.org/r/20250507160913.2084079-3-m.szyprowski@samsung.com Signed-off-by: Greg Kroah-Hartman --- drivers/dma-buf/udmabuf.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c index 5e836e4e5b449..959f690b12260 100644 --- a/drivers/dma-buf/udmabuf.c +++ b/drivers/dma-buf/udmabuf.c @@ -223,8 +223,7 @@ static int begin_cpu_udmabuf(struct dma_buf *buf, ubuf->sg = NULL; } } else { - dma_sync_sg_for_cpu(dev, ubuf->sg->sgl, ubuf->sg->nents, - direction); + dma_sync_sgtable_for_cpu(dev, ubuf->sg, direction); } return ret; @@ -239,7 +238,7 @@ static int end_cpu_udmabuf(struct dma_buf *buf, if (!ubuf->sg) return -EINVAL; - dma_sync_sg_for_device(dev, ubuf->sg->sgl, ubuf->sg->nents, direction); + dma_sync_sgtable_for_device(dev, ubuf->sg, direction); return 0; } -- GitLab From 47bf9d03a969d08b4ef6eeb8bd1eac98ad810a01 Mon Sep 17 00:00:00 2001 From: Kai Huang Date: Sat, 7 Jun 2025 01:07:37 +1200 Subject: [PATCH 1527/2211] x86/virt/tdx: Avoid indirect calls to TDX assembly functions commit 0b3bc018e86afdc0cbfef61328c63d5c08f8b370 upstream. Two 'static inline' TDX helper functions (sc_retry() and sc_retry_prerr()) take function pointer arguments which refer to assembly functions. Normally, the compiler inlines the TDX helper, realizes that the function pointer targets are completely static -- thus can be resolved at compile time -- and generates direct call instructions. But, other times (like when CONFIG_CC_OPTIMIZE_FOR_SIZE=y), the compiler declines to inline the helpers and will instead generate indirect call instructions. Indirect calls to assembly functions require special annotation (for various Control Flow Integrity mechanisms). But TDX assembly functions lack the special annotations and can only be called directly. Annotate both the helpers as '__always_inline' to prod the compiler into maintaining the direct calls. There is no guarantee here, but Peter has volunteered to report the compiler bug if this assumption ever breaks[1]. Fixes: 1e66a7e27539 ("x86/virt/tdx: Handle SEAMCALL no entropy error in common code") Fixes: df01f5ae07dd ("x86/virt/tdx: Add SEAMCALL error printing for module initialization") Signed-off-by: Kai Huang Signed-off-by: Dave Hansen Cc: stable@vger.kernel.org Link: https://lore.kernel.org/lkml/20250605145914.GW39944@noisy.programming.kicks-ass.net/ [1] Link: https://lore.kernel.org/all/20250606130737.30713-1-kai.huang%40intel.com Signed-off-by: Greg Kroah-Hartman --- arch/x86/include/asm/tdx.h | 2 +- arch/x86/virt/vmx/tdx/tdx.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index b5b6332940613..2d13ef1f4b057 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -97,7 +97,7 @@ void tdx_init(void); typedef u64 (*sc_func_t)(u64 fn, struct tdx_module_args *args); -static inline u64 sc_retry(sc_func_t func, u64 fn, +static __always_inline u64 sc_retry(sc_func_t func, u64 fn, struct tdx_module_args *args) { int retry = RDRAND_RETRY_LOOPS; diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 4e2b2e2ac9f90..eb91bc5448de2 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -69,8 +69,9 @@ static inline void seamcall_err_ret(u64 fn, u64 err, args->r9, args->r10, args->r11); } -static inline int sc_retry_prerr(sc_func_t func, sc_err_func_t err_func, - u64 fn, struct tdx_module_args *args) +static __always_inline int sc_retry_prerr(sc_func_t func, + sc_err_func_t err_func, + u64 fn, struct tdx_module_args *args) { u64 sret = sc_retry(func, fn, args); -- GitLab From 2cb89aef981ef7b732ccb99f96c82f314e230b2f Mon Sep 17 00:00:00 2001 From: "Xin Li (Intel)" Date: Mon, 9 Jun 2025 01:40:54 -0700 Subject: [PATCH 1528/2211] selftests/x86: Add a test to detect infinite SIGTRAP handler loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit f287822688eeb44ae1cf6ac45701d965efc33218 upstream. When FRED is enabled, if the Trap Flag (TF) is set without an external debugger attached, it can lead to an infinite loop in the SIGTRAP handler. To avoid this, the software event flag in the augmented SS must be cleared, ensuring that no single-step trap remains pending when ERETU completes. This test checks for that specific scenario—verifying whether the kernel correctly prevents an infinite SIGTRAP loop in this edge case when FRED is enabled. The test should _always_ pass with IDT event delivery, thus no need to disable the test even when FRED is not enabled. Signed-off-by: Xin Li (Intel) Signed-off-by: Dave Hansen Tested-by: Sohil Mehta Cc:stable@vger.kernel.org Link: https://lore.kernel.org/all/20250609084054.2083189-3-xin%40zytor.com Signed-off-by: Greg Kroah-Hartman --- tools/testing/selftests/x86/Makefile | 2 +- tools/testing/selftests/x86/sigtrap_loop.c | 101 +++++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/x86/sigtrap_loop.c diff --git a/tools/testing/selftests/x86/Makefile b/tools/testing/selftests/x86/Makefile index d51249f14e2fe..5656e58a53803 100644 --- a/tools/testing/selftests/x86/Makefile +++ b/tools/testing/selftests/x86/Makefile @@ -12,7 +12,7 @@ CAN_BUILD_WITH_NOPIE := $(shell ./check_cc.sh "$(CC)" trivial_program.c -no-pie) TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs syscall_nt test_mremap_vdso \ check_initial_reg_state sigreturn iopl ioperm \ - test_vsyscall mov_ss_trap \ + test_vsyscall mov_ss_trap sigtrap_loop \ syscall_arg_fault fsgsbase_restore sigaltstack TARGETS_C_BOTHBITS += nx_stack TARGETS_C_32BIT_ONLY := entry_from_vm86 test_syscall_vdso unwind_vdso \ diff --git a/tools/testing/selftests/x86/sigtrap_loop.c b/tools/testing/selftests/x86/sigtrap_loop.c new file mode 100644 index 0000000000000..9d065479e89f9 --- /dev/null +++ b/tools/testing/selftests/x86/sigtrap_loop.c @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2025 Intel Corporation + */ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include + +#ifdef __x86_64__ +# define REG_IP REG_RIP +#else +# define REG_IP REG_EIP +#endif + +static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *), int flags) +{ + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sa.sa_sigaction = handler; + sa.sa_flags = SA_SIGINFO | flags; + sigemptyset(&sa.sa_mask); + + if (sigaction(sig, &sa, 0)) + err(1, "sigaction"); + + return; +} + +static void sigtrap(int sig, siginfo_t *info, void *ctx_void) +{ + ucontext_t *ctx = (ucontext_t *)ctx_void; + static unsigned int loop_count_on_same_ip; + static unsigned long last_trap_ip; + + if (last_trap_ip == ctx->uc_mcontext.gregs[REG_IP]) { + printf("\tTrapped at %016lx\n", last_trap_ip); + + /* + * If the same IP is hit more than 10 times in a row, it is + * _considered_ an infinite loop. + */ + if (++loop_count_on_same_ip > 10) { + printf("[FAIL]\tDetected SIGTRAP infinite loop\n"); + exit(1); + } + + return; + } + + loop_count_on_same_ip = 0; + last_trap_ip = ctx->uc_mcontext.gregs[REG_IP]; + printf("\tTrapped at %016lx\n", last_trap_ip); +} + +int main(int argc, char *argv[]) +{ + sethandler(SIGTRAP, sigtrap, 0); + + /* + * Set the Trap Flag (TF) to single-step the test code, therefore to + * trigger a SIGTRAP signal after each instruction until the TF is + * cleared. + * + * Because the arithmetic flags are not significant here, the TF is + * set by pushing 0x302 onto the stack and then popping it into the + * flags register. + * + * Four instructions in the following asm code are executed with the + * TF set, thus the SIGTRAP handler is expected to run four times. + */ + printf("[RUN]\tSIGTRAP infinite loop detection\n"); + asm volatile( +#ifdef __x86_64__ + /* + * Avoid clobbering the redzone + * + * Equivalent to "sub $128, %rsp", however -128 can be encoded + * in a single byte immediate while 128 uses 4 bytes. + */ + "add $-128, %rsp\n\t" +#endif + "push $0x302\n\t" + "popf\n\t" + "nop\n\t" + "nop\n\t" + "push $0x202\n\t" + "popf\n\t" +#ifdef __x86_64__ + "sub $-128, %rsp\n\t" +#endif + ); + + printf("[OK]\tNo SIGTRAP infinite loop detected\n"); + return 0; +} -- GitLab From 1193486dffb7432a09f57f5d09049b4d4123538b Mon Sep 17 00:00:00 2001 From: Namjae Jeon Date: Fri, 13 Jun 2025 10:12:43 +0900 Subject: [PATCH 1529/2211] ksmbd: fix null pointer dereference in destroy_previous_session commit 7ac5b66acafcc9292fb935d7e03790f2b8b2dc0e upstream. If client set ->PreviousSessionId on kerberos session setup stage, NULL pointer dereference error will happen. Since sess->user is not set yet, It can pass the user argument as NULL to destroy_previous_session. sess->user will be set in ksmbd_krb5_authenticate(). So this patch move calling destroy_previous_session() after ksmbd_krb5_authenticate(). Cc: stable@vger.kernel.org Reported-by: zdi-disclosures@trendmicro.com # ZDI-CAN-27391 Signed-off-by: Namjae Jeon Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/server/smb2pdu.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index 08d9a7cfba8cd..6537ffd2b9651 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -1605,17 +1605,18 @@ static int krb5_authenticate(struct ksmbd_work *work, out_len = work->response_sz - (le16_to_cpu(rsp->SecurityBufferOffset) + 4); - /* Check previous session */ - prev_sess_id = le64_to_cpu(req->PreviousSessionId); - if (prev_sess_id && prev_sess_id != sess->id) - destroy_previous_session(conn, sess->user, prev_sess_id); - retval = ksmbd_krb5_authenticate(sess, in_blob, in_len, out_blob, &out_len); if (retval) { ksmbd_debug(SMB, "krb5 authentication failed\n"); return -EINVAL; } + + /* Check previous session */ + prev_sess_id = le64_to_cpu(req->PreviousSessionId); + if (prev_sess_id && prev_sess_id != sess->id) + destroy_previous_session(conn, sess->user, prev_sess_id); + rsp->SecurityBufferLength = cpu_to_le16(out_len); if ((conn->sign || server_conf.enforced_signing) || -- GitLab From ff67d178c64ded71641a924d0f9d3ea8f6e69d51 Mon Sep 17 00:00:00 2001 From: Rong Zhang Date: Mon, 26 May 2025 04:18:07 +0800 Subject: [PATCH 1530/2211] platform/x86: ideapad-laptop: use usleep_range() for EC polling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 5808c34216954cd832bd4b8bc52dfa287049122b upstream. It was reported that ideapad-laptop sometimes causes some recent (since 2024) Lenovo ThinkBook models shut down when: - suspending/resuming - closing/opening the lid - (dis)connecting a charger - reading/writing some sysfs properties, e.g., fan_mode, touchpad - pressing down some Fn keys, e.g., Brightness Up/Down (Fn+F5/F6) - (seldom) loading the kmod The issue has existed since the launch day of such models, and there have been some out-of-tree workarounds (see Link:) for the issue. One disables some functionalities, while another one simply shortens IDEAPAD_EC_TIMEOUT. The disabled functionalities have read_ec_data() in their call chains, which calls schedule() between each poll. It turns out that these models suffer from the indeterminacy of schedule() because of their low tolerance for being polled too frequently. Sometimes schedule() returns too soon due to the lack of ready tasks, causing the margin between two polls to be too short. In this case, the command is somehow aborted, and too many subsequent polls (they poll for "nothing!") may eventually break the state machine in the EC, resulting in a hard shutdown. This explains why shortening IDEAPAD_EC_TIMEOUT works around the issue - it reduces the total number of polls sent to the EC. Even when it doesn't lead to a shutdown, frequent polls may also disturb the ongoing operation and notably delay (+ 10-20ms) the availability of EC response. This phenomenon is unlikely to be exclusive to the models mentioned above, so dropping the schedule() manner should also slightly improve the responsiveness of various models. Fix these issues by migrating to usleep_range(150, 300). The interval is chosen to add some margin to the minimal 50us and considering EC responses are usually available after 150-2500us based on my test. It should be enough to fix these issues on all models subject to the EC bug without introducing latency on other models. Tested on ThinkBook 14 G7+ ASP and solved both issues. No regression was introduced in the test on a model without the EC bug (ThinkBook X IMH, thanks Eric). Link: https://github.com/ty2/ideapad-laptop-tb2024g6plus/commit/6c5db18c9e8109873c2c90a7d2d7f552148f7ad4 Link: https://github.com/ferstar/ideapad-laptop-tb/commit/42d1e68e5009529d31bd23f978f636f79c023e80 Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218771 Fixes: 6a09f21dd1e2 ("ideapad: add ACPI helpers") Cc: stable@vger.kernel.org Tested-by: Felix Yan Tested-by: Eric Long Tested-by: Jianfei Zhang Tested-by: Mingcong Bai Tested-by: Minh Le Tested-by: Sicheng Zhu Signed-off-by: Rong Zhang Link: https://lore.kernel.org/r/20250525201833.37939-1-i@rong.moe Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Greg Kroah-Hartman --- drivers/platform/x86/ideapad-laptop.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c index bdb4cbee42058..93aa72bff3f00 100644 --- a/drivers/platform/x86/ideapad-laptop.c +++ b/drivers/platform/x86/ideapad-laptop.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -267,6 +268,20 @@ static void ideapad_shared_exit(struct ideapad_private *priv) */ #define IDEAPAD_EC_TIMEOUT 200 /* in ms */ +/* + * Some models (e.g., ThinkBook since 2024) have a low tolerance for being + * polled too frequently. Doing so may break the state machine in the EC, + * resulting in a hard shutdown. + * + * It is also observed that frequent polls may disturb the ongoing operation + * and notably delay the availability of EC response. + * + * These values are used as the delay before the first poll and the interval + * between subsequent polls to solve the above issues. + */ +#define IDEAPAD_EC_POLL_MIN_US 150 +#define IDEAPAD_EC_POLL_MAX_US 300 + static int eval_int(acpi_handle handle, const char *name, unsigned long *res) { unsigned long long result; @@ -383,7 +398,7 @@ static int read_ec_data(acpi_handle handle, unsigned long cmd, unsigned long *da end_jiffies = jiffies + msecs_to_jiffies(IDEAPAD_EC_TIMEOUT) + 1; while (time_before(jiffies, end_jiffies)) { - schedule(); + usleep_range(IDEAPAD_EC_POLL_MIN_US, IDEAPAD_EC_POLL_MAX_US); err = eval_vpcr(handle, 1, &val); if (err) @@ -414,7 +429,7 @@ static int write_ec_cmd(acpi_handle handle, unsigned long cmd, unsigned long dat end_jiffies = jiffies + msecs_to_jiffies(IDEAPAD_EC_TIMEOUT) + 1; while (time_before(jiffies, end_jiffies)) { - schedule(); + usleep_range(IDEAPAD_EC_POLL_MIN_US, IDEAPAD_EC_POLL_MAX_US); err = eval_vpcr(handle, 1, &val); if (err) -- GitLab From 870dd7e7840cd9cd7147cfb67034d01c338f8292 Mon Sep 17 00:00:00 2001 From: Stephen Smalley Date: Fri, 13 Jun 2025 15:37:05 -0400 Subject: [PATCH 1531/2211] selinux: fix selinux_xfrm_alloc_user() to set correct ctx_len MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 86c8db86af43f52f682e53a0f2f0828683be1e52 upstream. We should count the terminating NUL byte as part of the ctx_len. Otherwise, UBSAN logs a warning: UBSAN: array-index-out-of-bounds in security/selinux/xfrm.c:99:14 index 60 is out of range for type 'char [*]' The allocation itself is correct so there is no actual out of bounds indexing, just a warning. Cc: stable@vger.kernel.org Suggested-by: Christian Göttsche Link: https://lore.kernel.org/selinux/CAEjxPJ6tA5+LxsGfOJokzdPeRomBHjKLBVR6zbrg+_w3ZZbM3A@mail.gmail.com/ Signed-off-by: Stephen Smalley Signed-off-by: Paul Moore Signed-off-by: Greg Kroah-Hartman --- security/selinux/xfrm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c index 90ec4ef1b082f..61d56b0c2be13 100644 --- a/security/selinux/xfrm.c +++ b/security/selinux/xfrm.c @@ -94,7 +94,7 @@ static int selinux_xfrm_alloc_user(struct xfrm_sec_ctx **ctxp, ctx->ctx_doi = XFRM_SC_DOI_LSM; ctx->ctx_alg = XFRM_SC_ALG_SELINUX; - ctx->ctx_len = str_len; + ctx->ctx_len = str_len + 1; memcpy(ctx->ctx_str, &uctx[1], str_len); ctx->ctx_str[str_len] = '\0'; rc = security_context_to_sid(ctx->ctx_str, str_len, -- GitLab From 6e7a2d38816d1c9dcb96c7aba6dc9634fd226411 Mon Sep 17 00:00:00 2001 From: Srinivas Pandruvada Date: Fri, 6 Jun 2025 13:53:00 -0700 Subject: [PATCH 1532/2211] platform/x86/intel-uncore-freq: Fail module load when plat_info is NULL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 685f88c72a0c4d12d3bd2ff50286938f14486f85 upstream. Address a Smatch static checker warning regarding an unchecked dereference in the function call: set_cdie_id(i, cluster_info, plat_info) when plat_info is NULL. Instead of addressing this one case, in general if plat_info is NULL then it can cause other issues. For example in a two package system it will give warning for duplicate sysfs entry as package ID will be always zero for both packages when creating string for attribute group name. plat_info is derived from TPMI ID TPMI_BUS_INFO, which is integral to the core TPMI design. Therefore, it should not be NULL on a production platform. Consequently, the module should fail to load if plat_info is NULL. Reported-by: Dan Carpenter Closes: https://lore.kernel.org/platform-driver-x86/aEKvGCLd1qmX04Tc@stanley.mountain/T/#u Fixes: 8a54e2253e4c ("platform/x86/intel-uncore-freq: Uncore frequency control via TPMI") Signed-off-by: Srinivas Pandruvada Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20250606205300.2384494-1-srinivas.pandruvada@linux.intel.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Greg Kroah-Hartman --- .../x86/intel/uncore-frequency/uncore-frequency-tpmi.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c index 0591053813a28..5ab45b7516662 100644 --- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c +++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c @@ -467,10 +467,13 @@ static int uncore_probe(struct auxiliary_device *auxdev, const struct auxiliary_ /* Get the package ID from the TPMI core */ plat_info = tpmi_get_platform_data(auxdev); - if (plat_info) - pkg = plat_info->package_id; - else + if (unlikely(!plat_info)) { dev_info(&auxdev->dev, "Platform information is NULL\n"); + ret = -ENODEV; + goto err_rem_common; + } + + pkg = plat_info->package_id; for (i = 0; i < num_resources; ++i) { struct tpmi_uncore_power_domain_info *pd_info; -- GitLab From 57ec0818698c7d587ebc204971387bdf9d3c9fa1 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Mon, 16 Jun 2025 10:13:25 -1000 Subject: [PATCH 1533/2211] sched_ext, sched/core: Don't call scx_group_set_weight() prematurely from sched_create_group() commit 33796b91871ad4010c8188372dd1faf97cf0f1c0 upstream. During task_group creation, sched_create_group() calls scx_group_set_weight() with CGROUP_WEIGHT_DFL to initialize the sched_ext portion. This is premature and ends up calling ops.cgroup_set_weight() with an incorrect @cgrp before ops.cgroup_init() is called. sched_create_group() should just initialize SCX related fields in the new task_group. Fix it by factoring out scx_tg_init() from sched_init() and making sched_create_group() call that function instead of scx_group_set_weight(). v2: Retain CONFIG_EXT_GROUP_SCHED ifdef in sched_init() as removing it leads to build failures on !CONFIG_GROUP_SCHED configs. Signed-off-by: Tejun Heo Fixes: 819513666966 ("sched_ext: Add cgroup support") Cc: stable@vger.kernel.org # v6.12+ Signed-off-by: Greg Kroah-Hartman --- kernel/sched/core.c | 4 ++-- kernel/sched/ext.c | 5 +++++ kernel/sched/ext.h | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 51f36de5990a3..d4948a8629929 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -8423,7 +8423,7 @@ void __init sched_init(void) init_cfs_bandwidth(&root_task_group.cfs_bandwidth, NULL); #endif /* CONFIG_FAIR_GROUP_SCHED */ #ifdef CONFIG_EXT_GROUP_SCHED - root_task_group.scx_weight = CGROUP_WEIGHT_DFL; + scx_tg_init(&root_task_group); #endif /* CONFIG_EXT_GROUP_SCHED */ #ifdef CONFIG_RT_GROUP_SCHED root_task_group.rt_se = (struct sched_rt_entity **)ptr; @@ -8863,7 +8863,7 @@ struct task_group *sched_create_group(struct task_group *parent) if (!alloc_rt_sched_group(tg, parent)) goto err; - scx_group_set_weight(tg, CGROUP_WEIGHT_DFL); + scx_tg_init(tg); alloc_uclamp_sched_group(tg, parent); return tg; diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c index ace5262642f9e..ddd4fa785264e 100644 --- a/kernel/sched/ext.c +++ b/kernel/sched/ext.c @@ -3918,6 +3918,11 @@ static void scx_cgroup_warn_missing_idle(struct task_group *tg) cgroup_warned_missing_idle = true; } +void scx_tg_init(struct task_group *tg) +{ + tg->scx_weight = CGROUP_WEIGHT_DFL; +} + int scx_tg_online(struct task_group *tg) { int ret = 0; diff --git a/kernel/sched/ext.h b/kernel/sched/ext.h index 1079b56b0f7ae..67032c30c754c 100644 --- a/kernel/sched/ext.h +++ b/kernel/sched/ext.h @@ -70,6 +70,7 @@ static inline void scx_update_idle(struct rq *rq, bool idle, bool do_notify) {} #ifdef CONFIG_CGROUP_SCHED #ifdef CONFIG_EXT_GROUP_SCHED +void scx_tg_init(struct task_group *tg); int scx_tg_online(struct task_group *tg); void scx_tg_offline(struct task_group *tg); int scx_cgroup_can_attach(struct cgroup_taskset *tset); @@ -79,6 +80,7 @@ void scx_cgroup_cancel_attach(struct cgroup_taskset *tset); void scx_group_set_weight(struct task_group *tg, unsigned long cgrp_weight); void scx_group_set_idle(struct task_group *tg, bool idle); #else /* CONFIG_EXT_GROUP_SCHED */ +static inline void scx_tg_init(struct task_group *tg) {} static inline int scx_tg_online(struct task_group *tg) { return 0; } static inline void scx_tg_offline(struct task_group *tg) {} static inline int scx_cgroup_can_attach(struct cgroup_taskset *tset) { return 0; } -- GitLab From 3d828519bd69bfcaabdd942a872679617ef06739 Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Mon, 16 Jun 2025 11:21:15 -0700 Subject: [PATCH 1534/2211] atm: Revert atm_account_tx() if copy_from_iter_full() fails. commit 7851263998d4269125fd6cb3fdbfc7c6db853859 upstream. In vcc_sendmsg(), we account skb->truesize to sk->sk_wmem_alloc by atm_account_tx(). It is expected to be reverted by atm_pop_raw() later called by vcc->dev->ops->send(vcc, skb). However, vcc_sendmsg() misses the same revert when copy_from_iter_full() fails, and then we will leak a socket. Let's factorise the revert part as atm_return_tx() and call it in the failure path. Note that the corresponding sk_wmem_alloc operation can be found in alloc_tx() as of the blamed commit. $ git blame -L:alloc_tx net/atm/common.c c55fa3cccbc2c~ Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Reported-by: Simon Horman Closes: https://lore.kernel.org/netdev/20250614161959.GR414686@horms.kernel.org/ Signed-off-by: Kuniyuki Iwashima Link: https://patch.msgid.link/20250616182147.963333-3-kuni1840@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- include/linux/atmdev.h | 6 ++++++ net/atm/common.c | 1 + net/atm/raw.c | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/linux/atmdev.h b/include/linux/atmdev.h index 9b02961d65ee6..45f2f278b50a8 100644 --- a/include/linux/atmdev.h +++ b/include/linux/atmdev.h @@ -249,6 +249,12 @@ static inline void atm_account_tx(struct atm_vcc *vcc, struct sk_buff *skb) ATM_SKB(skb)->atm_options = vcc->atm_options; } +static inline void atm_return_tx(struct atm_vcc *vcc, struct sk_buff *skb) +{ + WARN_ON_ONCE(refcount_sub_and_test(ATM_SKB(skb)->acct_truesize, + &sk_atm(vcc)->sk_wmem_alloc)); +} + static inline void atm_force_charge(struct atm_vcc *vcc,int truesize) { atomic_add(truesize, &sk_atm(vcc)->sk_rmem_alloc); diff --git a/net/atm/common.c b/net/atm/common.c index 9b75699992ff9..d7f7976ea13ac 100644 --- a/net/atm/common.c +++ b/net/atm/common.c @@ -635,6 +635,7 @@ int vcc_sendmsg(struct socket *sock, struct msghdr *m, size_t size) skb->dev = NULL; /* for paths shared with net_device interfaces */ if (!copy_from_iter_full(skb_put(skb, size), size, &m->msg_iter)) { + atm_return_tx(vcc, skb); kfree_skb(skb); error = -EFAULT; goto out; diff --git a/net/atm/raw.c b/net/atm/raw.c index 2b5f78a7ec3e4..1e6511ec842cb 100644 --- a/net/atm/raw.c +++ b/net/atm/raw.c @@ -36,7 +36,7 @@ static void atm_pop_raw(struct atm_vcc *vcc, struct sk_buff *skb) pr_debug("(%d) %d -= %d\n", vcc->vci, sk_wmem_alloc_get(sk), ATM_SKB(skb)->acct_truesize); - WARN_ON(refcount_sub_and_test(ATM_SKB(skb)->acct_truesize, &sk->sk_wmem_alloc)); + atm_return_tx(vcc, skb); dev_kfree_skb_any(skb); sk->sk_write_space(sk); } -- GitLab From 44b25cc82574e2bb8fe1d09a0234215261d3f525 Mon Sep 17 00:00:00 2001 From: Ping-Ke Shih Date: Mon, 9 Dec 2024 12:21:27 +0800 Subject: [PATCH 1535/2211] wifi: rtw89: phy: add dummy C2H event handler for report of TAS power commit 09489812013f9ff3850c3af9900c88012b8c1e5d upstream. The newer firmware, lik RTL8852C version 0.27.111.0, will notify driver report of TAS (Time Averaged SAR) power by new C2H events. This is to assist in higher accurate calculation of TAS. For now, driver doesn't use the report yet, so add a dummy handler to avoid it throws info like: rtw89_8852ce 0000:03:00.0: c2h class 9 func 6 not support Also add "MAC" and "PHY" to the message to disambiguate the source of C2H event. Signed-off-by: Ping-Ke Shih Link: https://patch.msgid.link/20241209042127.21424-1-pkshih@realtek.com Signed-off-by: Zenm Chen Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/realtek/rtw89/mac.c | 4 ++-- drivers/net/wireless/realtek/rtw89/phy.c | 10 ++++++++-- drivers/net/wireless/realtek/rtw89/phy.h | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c index 9b09d4b7dea59..2188bca899e39 100644 --- a/drivers/net/wireless/realtek/rtw89/mac.c +++ b/drivers/net/wireless/realtek/rtw89/mac.c @@ -5513,11 +5513,11 @@ void rtw89_mac_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb, case RTW89_MAC_C2H_CLASS_FWDBG: return; default: - rtw89_info(rtwdev, "c2h class %d not support\n", class); + rtw89_info(rtwdev, "MAC c2h class %d not support\n", class); return; } if (!handler) { - rtw89_info(rtwdev, "c2h class %d func %d not support\n", class, + rtw89_info(rtwdev, "MAC c2h class %d func %d not support\n", class, func); return; } diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c index 5c31639b4cade..355c3f58ab185 100644 --- a/drivers/net/wireless/realtek/rtw89/phy.c +++ b/drivers/net/wireless/realtek/rtw89/phy.c @@ -3062,10 +3062,16 @@ rtw89_phy_c2h_rfk_report_state(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u3 (int)(len - sizeof(report->hdr)), &report->state); } +static void +rtw89_phy_c2h_rfk_log_tas_pwr(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len) +{ +} + static void (* const rtw89_phy_c2h_rfk_report_handler[])(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len) = { [RTW89_PHY_C2H_RFK_REPORT_FUNC_STATE] = rtw89_phy_c2h_rfk_report_state, + [RTW89_PHY_C2H_RFK_LOG_TAS_PWR] = rtw89_phy_c2h_rfk_log_tas_pwr, }; bool rtw89_phy_c2h_chk_atomic(struct rtw89_dev *rtwdev, u8 class, u8 func) @@ -3119,11 +3125,11 @@ void rtw89_phy_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb, return; fallthrough; default: - rtw89_info(rtwdev, "c2h class %d not support\n", class); + rtw89_info(rtwdev, "PHY c2h class %d not support\n", class); return; } if (!handler) { - rtw89_info(rtwdev, "c2h class %d func %d not support\n", class, + rtw89_info(rtwdev, "PHY c2h class %d func %d not support\n", class, func); return; } diff --git a/drivers/net/wireless/realtek/rtw89/phy.h b/drivers/net/wireless/realtek/rtw89/phy.h index 9bb9c9c8e7a1b..961a4bacb02a5 100644 --- a/drivers/net/wireless/realtek/rtw89/phy.h +++ b/drivers/net/wireless/realtek/rtw89/phy.h @@ -151,6 +151,7 @@ enum rtw89_phy_c2h_rfk_log_func { enum rtw89_phy_c2h_rfk_report_func { RTW89_PHY_C2H_RFK_REPORT_FUNC_STATE = 0, + RTW89_PHY_C2H_RFK_LOG_TAS_PWR = 6, }; enum rtw89_phy_c2h_dm_func { -- GitLab From 82b6dfff0d6000b14b271f74e43d672d81fb390e Mon Sep 17 00:00:00 2001 From: Dhananjay Ugwekar Date: Wed, 5 Feb 2025 11:25:21 +0000 Subject: [PATCH 1536/2211] cpufreq/amd-pstate: Add missing NULL ptr check in amd_pstate_update commit 426db24d4db2e4f0d6720aeb7795eafcb9e82640 upstream. Check if policy is NULL before dereferencing it in amd_pstate_update. Fixes: e8f555daacd3 ("cpufreq/amd-pstate: fix setting policy current frequency value") Signed-off-by: Dhananjay Ugwekar Reviewed-by: Mario Limonciello Reviewed-by: Gautham R. Shenoy Link: https://lore.kernel.org/r/20250205112523.201101-11-dhananjay.ugwekar@amd.com Signed-off-by: Mario Limonciello [Minor context change fixed.] Signed-off-by: Wenshan Lan Signed-off-by: Greg Kroah-Hartman --- drivers/cpufreq/amd-pstate.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c index 7a16d19322286..62dbc5701e993 100644 --- a/drivers/cpufreq/amd-pstate.c +++ b/drivers/cpufreq/amd-pstate.c @@ -482,6 +482,9 @@ static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf, u32 nominal_perf = READ_ONCE(cpudata->nominal_perf); u64 value = prev; + if (!policy) + return; + min_perf = clamp_t(unsigned long, min_perf, cpudata->min_limit_perf, cpudata->max_limit_perf); max_perf = clamp_t(unsigned long, max_perf, cpudata->min_limit_perf, -- GitLab From f6ac7d68bbde99281ba642236e84a6e23319f2e7 Mon Sep 17 00:00:00 2001 From: WangYuli Date: Fri, 18 Apr 2025 18:37:18 -0700 Subject: [PATCH 1537/2211] Input: sparcspkr - avoid unannotated fall-through commit 8b1d858cbd4e1800e9336404ba7892b5a721230d upstream. Fix follow warnings with clang-21i (and reformat for clarity): drivers/input/misc/sparcspkr.c:78:3: warning: unannotated fall-through between switch labels [-Wimplicit-fallthrough] 78 | case SND_TONE: break; | ^ drivers/input/misc/sparcspkr.c:78:3: note: insert 'break;' to avoid fall-through 78 | case SND_TONE: break; | ^ | break; drivers/input/misc/sparcspkr.c:113:3: warning: unannotated fall-through between switch labels [-Wimplicit-fallthrough] 113 | case SND_TONE: break; | ^ drivers/input/misc/sparcspkr.c:113:3: note: insert 'break;' to avoid fall-through 113 | case SND_TONE: break; | ^ | break; 2 warnings generated. Signed-off-by: WangYuli Link: https://lore.kernel.org/r/6730E40353C76908+20250415052439.155051-1-wangyuli@uniontech.com Signed-off-by: Dmitry Torokhov Signed-off-by: Greg Kroah-Hartman --- drivers/input/misc/sparcspkr.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/input/misc/sparcspkr.c b/drivers/input/misc/sparcspkr.c index 20020cbc0752b..a94699f2bbc67 100644 --- a/drivers/input/misc/sparcspkr.c +++ b/drivers/input/misc/sparcspkr.c @@ -75,9 +75,14 @@ static int bbc_spkr_event(struct input_dev *dev, unsigned int type, unsigned int return -1; switch (code) { - case SND_BELL: if (value) value = 1000; - case SND_TONE: break; - default: return -1; + case SND_BELL: + if (value) + value = 1000; + break; + case SND_TONE: + break; + default: + return -1; } if (value > 20 && value < 32767) @@ -113,9 +118,14 @@ static int grover_spkr_event(struct input_dev *dev, unsigned int type, unsigned return -1; switch (code) { - case SND_BELL: if (value) value = 1000; - case SND_TONE: break; - default: return -1; + case SND_BELL: + if (value) + value = 1000; + break; + case SND_TONE: + break; + default: + return -1; } if (value > 20 && value < 32767) -- GitLab From a69a594794fcad96d4cfce12aab6c5014a12b4c8 Mon Sep 17 00:00:00 2001 From: Manivannan Sadhasivam Date: Tue, 25 Feb 2025 11:04:46 +0530 Subject: [PATCH 1538/2211] wifi: ath12k: Clear affinity hint before calling ath12k_pci_free_irq() in error path commit b43b1e2c52db77c872bd60d30cdcc72c47df70c7 upstream. If a shared IRQ is used by the driver due to platform limitation, then the IRQ affinity hint is set right after the allocation of IRQ vectors in ath12k_pci_msi_alloc(). This does no harm unless one of the functions requesting the IRQ fails and attempt to free the IRQ. This may end up with a warning from the IRQ core that is expecting the affinity hint to be cleared before freeing the IRQ: kernel/irq/manage.c: /* make sure affinity_hint is cleaned up */ if (WARN_ON_ONCE(desc->affinity_hint)) desc->affinity_hint = NULL; So to fix this issue, clear the IRQ affinity hint before calling ath12k_pci_free_irq() in the error path. The affinity will be cleared once again further down the error path due to code organization, but that does no harm. Fixes: a3012f206d07 ("wifi: ath12k: set IRQ affinity to CPU0 in case of one MSI vector") Signed-off-by: Manivannan Sadhasivam Reviewed-by: Baochen Qiang Link: https://patch.msgid.link/20250225053447.16824-3-manivannan.sadhasivam@linaro.org Signed-off-by: Jeff Johnson Signed-off-by: Wenshan Lan Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/ath/ath12k/pci.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/wireless/ath/ath12k/pci.c b/drivers/net/wireless/ath/ath12k/pci.c index 0f0e13c3dd463..0ac92a606cea0 100644 --- a/drivers/net/wireless/ath/ath12k/pci.c +++ b/drivers/net/wireless/ath/ath12k/pci.c @@ -1506,6 +1506,8 @@ static int ath12k_pci_probe(struct pci_dev *pdev, return 0; err_free_irq: + /* __free_irq() expects the caller to have cleared the affinity hint */ + ath12k_pci_set_irq_affinity_hint(ab_pci, NULL); ath12k_pci_free_irq(ab); err_ce_free: -- GitLab From 60606efbf52582c0ab93e99789fddced6b47297a Mon Sep 17 00:00:00 2001 From: Edward Adam Davis Date: Tue, 18 Mar 2025 11:13:45 +0800 Subject: [PATCH 1539/2211] wifi: cfg80211: init wiphy_work before allocating rfkill fails commit fc88dee89d7b63eeb17699393eb659aadf9d9b7c upstream. syzbort reported a uninitialize wiphy_work_lock in cfg80211_dev_free. [1] After rfkill allocation fails, the wiphy release process will be performed, which will cause cfg80211_dev_free to access the uninitialized wiphy_work related data. Move the initialization of wiphy_work to before rfkill initialization to avoid this issue. [1] INFO: trying to register non-static key. The code is fine but needs lockdep annotation, or maybe you didn't initialize this object before use? turning off the locking correctness validator. CPU: 0 UID: 0 PID: 5935 Comm: syz-executor550 Not tainted 6.14.0-rc6-syzkaller-00103-g4003c9e78778 #0 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 Call Trace: __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120 assign_lock_key kernel/locking/lockdep.c:983 [inline] register_lock_class+0xc39/0x1240 kernel/locking/lockdep.c:1297 __lock_acquire+0x135/0x3c40 kernel/locking/lockdep.c:5103 lock_acquire.part.0+0x11b/0x380 kernel/locking/lockdep.c:5851 __raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline] _raw_spin_lock_irqsave+0x3a/0x60 kernel/locking/spinlock.c:162 cfg80211_dev_free+0x30/0x3d0 net/wireless/core.c:1196 device_release+0xa1/0x240 drivers/base/core.c:2568 kobject_cleanup lib/kobject.c:689 [inline] kobject_release lib/kobject.c:720 [inline] kref_put include/linux/kref.h:65 [inline] kobject_put+0x1e4/0x5a0 lib/kobject.c:737 put_device+0x1f/0x30 drivers/base/core.c:3774 wiphy_free net/wireless/core.c:1224 [inline] wiphy_new_nm+0x1c1f/0x2160 net/wireless/core.c:562 ieee80211_alloc_hw_nm+0x1b7a/0x2260 net/mac80211/main.c:835 mac80211_hwsim_new_radio+0x1d6/0x54e0 drivers/net/wireless/virtual/mac80211_hwsim.c:5185 hwsim_new_radio_nl+0xb42/0x12b0 drivers/net/wireless/virtual/mac80211_hwsim.c:6242 genl_family_rcv_msg_doit+0x202/0x2f0 net/netlink/genetlink.c:1115 genl_family_rcv_msg net/netlink/genetlink.c:1195 [inline] genl_rcv_msg+0x565/0x800 net/netlink/genetlink.c:1210 netlink_rcv_skb+0x16b/0x440 net/netlink/af_netlink.c:2533 genl_rcv+0x28/0x40 net/netlink/genetlink.c:1219 netlink_unicast_kernel net/netlink/af_netlink.c:1312 [inline] netlink_unicast+0x53c/0x7f0 net/netlink/af_netlink.c:1338 netlink_sendmsg+0x8b8/0xd70 net/netlink/af_netlink.c:1882 sock_sendmsg_nosec net/socket.c:718 [inline] __sock_sendmsg net/socket.c:733 [inline] ____sys_sendmsg+0xaaf/0xc90 net/socket.c:2573 ___sys_sendmsg+0x135/0x1e0 net/socket.c:2627 __sys_sendmsg+0x16e/0x220 net/socket.c:2659 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcd/0x250 arch/x86/entry/common.c:83 Fixes: 72d520476a2f ("wifi: cfg80211: cancel wiphy_work before freeing wiphy") Reported-by: syzbot+aaf0488c83d1d5f4f029@syzkaller.appspotmail.com Close: https://syzkaller.appspot.com/bug?extid=aaf0488c83d1d5f4f029 Tested-by: syzbot+aaf0488c83d1d5f4f029@syzkaller.appspotmail.com Signed-off-by: Edward Adam Davis Link: https://patch.msgid.link/tencent_258DD9121DDDB9DD9A1939CFAA0D8625B107@qq.com Signed-off-by: Johannes Berg Signed-off-by: WangYuli Signed-off-by: Greg Kroah-Hartman --- net/wireless/core.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/wireless/core.c b/net/wireless/core.c index 1ce8fff2a28a4..586e50678ed80 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c @@ -553,6 +553,9 @@ use_default_name: INIT_WORK(&rdev->mgmt_registrations_update_wk, cfg80211_mgmt_registrations_update_wk); spin_lock_init(&rdev->mgmt_registrations_lock); + INIT_WORK(&rdev->wiphy_work, cfg80211_wiphy_work); + INIT_LIST_HEAD(&rdev->wiphy_work_list); + spin_lock_init(&rdev->wiphy_work_lock); #ifdef CONFIG_CFG80211_DEFAULT_PS rdev->wiphy.flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; @@ -570,9 +573,6 @@ use_default_name: return NULL; } - INIT_WORK(&rdev->wiphy_work, cfg80211_wiphy_work); - INIT_LIST_HEAD(&rdev->wiphy_work_list); - spin_lock_init(&rdev->wiphy_work_lock); INIT_WORK(&rdev->rfkill_block, cfg80211_rfkill_block_work); INIT_WORK(&rdev->conn_work, cfg80211_conn_work); INIT_WORK(&rdev->event_work, cfg80211_event_work); -- GitLab From 47f34289d10069343140387011d94f0c8968a62b Mon Sep 17 00:00:00 2001 From: Dev Jain Date: Tue, 27 May 2025 13:56:33 +0530 Subject: [PATCH 1540/2211] arm64: Restrict pagetable teardown to avoid false warning commit 650768c512faba8070bf4cfbb28c95eb5cd203f3 upstream. Commit 9c006972c3fe ("arm64: mmu: drop pXd_present() checks from pXd_free_pYd_table()") removes the pxd_present() checks because the caller checks pxd_present(). But, in case of vmap_try_huge_pud(), the caller only checks pud_present(); pud_free_pmd_page() recurses on each pmd through pmd_free_pte_page(), wherein the pmd may be none. Thus it is possible to hit a warning in the latter, since pmd_none => !pmd_table(). Thus, add a pmd_present() check in pud_free_pmd_page(). This problem was found by code inspection. Fixes: 9c006972c3fe ("arm64: mmu: drop pXd_present() checks from pXd_free_pYd_table()") Cc: stable@vger.kernel.org Reported-by: Ryan Roberts Acked-by: David Hildenbrand Signed-off-by: Dev Jain Reviewed-by: Catalin Marinas Reviewed-by: Anshuman Khandual Reviewed-by: Ryan Roberts Link: https://lore.kernel.org/r/20250527082633.61073-1-dev.jain@arm.com Signed-off-by: Will Deacon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/mm/mmu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index 9bcd51fd67d4e..aed8d32979d9c 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -1285,7 +1285,8 @@ int pud_free_pmd_page(pud_t *pudp, unsigned long addr) next = addr; end = addr + PUD_SIZE; do { - pmd_free_pte_page(pmdp, next); + if (pmd_present(pmdp_get(pmdp))) + pmd_free_pte_page(pmdp, next); } while (pmdp++, next += PMD_SIZE, next != end); pud_clear(pudp); -- GitLab From c4f7e90e66b6d4e2ed1fe346769ec6dc7734994b Mon Sep 17 00:00:00 2001 From: wangdicheng Date: Fri, 13 Jun 2025 14:36:36 +0800 Subject: [PATCH 1541/2211] ALSA: usb-audio: Rename ALSA kcontrol PCM and PCM1 for the KTMicro sound card commit 93adf20ff4d6e865e0b974110d3cf2f07c057177 upstream. PCM1 not in Pulseaudio's control list; standardize control to "Speaker" and "Headphone". Signed-off-by: wangdicheng Cc: Link: https://patch.msgid.link/20250613063636.239683-1-wangdich9700@163.com Signed-off-by: Takashi Iwai Signed-off-by: Greg Kroah-Hartman --- sound/usb/mixer_maps.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c index 0e9b5431a47f2..faac7df1fbcf0 100644 --- a/sound/usb/mixer_maps.c +++ b/sound/usb/mixer_maps.c @@ -383,6 +383,13 @@ static const struct usbmix_name_map ms_usb_link_map[] = { { 0 } /* terminator */ }; +/* KTMicro USB */ +static struct usbmix_name_map s31b2_0022_map[] = { + { 23, "Speaker Playback" }, + { 18, "Headphone Playback" }, + { 0 } +}; + /* ASUS ROG Zenith II with Realtek ALC1220-VB */ static const struct usbmix_name_map asus_zenith_ii_map[] = { { 19, NULL, 12 }, /* FU, Input Gain Pad - broken response, disabled */ @@ -692,6 +699,11 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = { .id = USB_ID(0x045e, 0x083c), .map = ms_usb_link_map, }, + { + /* KTMicro USB */ + .id = USB_ID(0X31b2, 0x0022), + .map = s31b2_0022_map, + }, { 0 } /* terminator */ }; -- GitLab From cb078e238054ca1c2f7a136d914fe4e3e0f77923 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Sun, 8 Jun 2025 11:14:14 +0200 Subject: [PATCH 1542/2211] ALSA: hda/intel: Add Thinkpad E15 to PM deny list commit c987a390f1b3b8bdac11031d7004e3410fe259bd upstream. Lenovo Thinkpad E15 with Conexant CX8070 codec seems causing ugly noises after runtime-PM suspend. Disable the codec runtime PM as a workaround. Link: https://bugzilla.kernel.org/show_bug.cgi?id=220210 Cc: Link: https://patch.msgid.link/20250608091415.21170-1-tiwai@suse.de Signed-off-by: Takashi Iwai Signed-off-by: Greg Kroah-Hartman --- sound/pci/hda/hda_intel.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 25b1984898ab2..1872c8b750537 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -2286,6 +2286,8 @@ static const struct snd_pci_quirk power_save_denylist[] = { SND_PCI_QUIRK(0x1734, 0x1232, "KONTRON SinglePC", 0), /* Dell ALC3271 */ SND_PCI_QUIRK(0x1028, 0x0962, "Dell ALC3271", 0), + /* https://bugzilla.kernel.org/show_bug.cgi?id=220210 */ + SND_PCI_QUIRK(0x17aa, 0x5079, "Lenovo Thinkpad E15", 0), {} }; -- GitLab From 96fe253552c26548da18759d6d63e7882374752c Mon Sep 17 00:00:00 2001 From: Edip Hazuri Date: Mon, 9 Jun 2025 10:59:44 +0300 Subject: [PATCH 1543/2211] ALSA: hda/realtek - Add mute LED support for HP Victus 16-s1xxx and HP Victus 15-fa1xxx commit a0914bf56e26d2cf457690602883f9cd2ec2c646 upstream. The mute led on those laptops is using ALC245 but requires a quirk to work This patch enables the existing quirk for the devices. Tested on my Victus 16-s1011nt Laptop and my friend's Victus 15-fa1xxx. The LED behaviour works as intended. Cc: Signed-off-by: Edip Hazuri Link: https://patch.msgid.link/20250609075943.13934-2-edip@medip.dev Signed-off-by: Takashi Iwai Signed-off-by: Greg Kroah-Hartman --- sound/pci/hda/patch_realtek.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index e714e91c27121..77da77923d551 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -10727,6 +10727,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), SND_PCI_QUIRK(0x103c, 0x8bb3, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8bb4, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x103c, 0x8bc8, "HP Victus 15-fa1xxx", ALC245_FIXUP_HP_MUTE_LED_COEFBIT), SND_PCI_QUIRK(0x103c, 0x8bcd, "HP Omen 16-xd0xxx", ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT), SND_PCI_QUIRK(0x103c, 0x8bdd, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8bde, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2), @@ -10780,6 +10781,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8c91, "HP EliteBook 660", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), SND_PCI_QUIRK(0x103c, 0x8c97, "HP ZBook", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), + SND_PCI_QUIRK(0x103c, 0x8c9c, "HP Victus 16-s1xxx (MB 8C9C)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT), SND_PCI_QUIRK(0x103c, 0x8ca1, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8ca2, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), -- GitLab From 9ef0b695a9d12e93dcd0c45e69d552f121ed86a8 Mon Sep 17 00:00:00 2001 From: Jonathan Lane Date: Wed, 11 Jun 2025 12:31:25 -0700 Subject: [PATCH 1544/2211] ALSA: hda/realtek: enable headset mic on Latitude 5420 Rugged commit efa6bdf1bc75e26cafaa5f1d775e8bb7c5b0c431 upstream. Like many Dell laptops, the 3.5mm port by default can not detect a combined headphones+mic headset or even a pure microphone. This change enables the port's functionality. Signed-off-by: Jonathan Lane Cc: Link: https://patch.msgid.link/20250611193124.26141-2-jon@borg.moe Signed-off-by: Takashi Iwai Signed-off-by: Greg Kroah-Hartman --- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 77da77923d551..c2e631b2fc3ce 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -10449,6 +10449,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB), + SND_PCI_QUIRK(0x1028, 0x0879, "Dell Latitude 5420 Rugged", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), -- GitLab From b09323c6e8f2e591008b74cad9f4c8135e53900f Mon Sep 17 00:00:00 2001 From: Chris Chiu Date: Tue, 10 Jun 2025 11:56:07 +0800 Subject: [PATCH 1545/2211] ALSA: hda/realtek: Fix built-in mic on ASUS VivoBook X513EA commit c6451a7325874c119def1d4094f6815c0c8fdc23 upstream. The built-in mic of ASUS VivoBook X513EA is broken recently by the fix of the pin sort. The fixup ALC256_FIXUP_ASUS_MIC_NO_PRESENCE is working for addressing the regression, too. Fixes: 3b4309546b48 ("ALSA: hda: Fix headset detection failure due to unstable sort") Signed-off-by: Chris Chiu Cc: Link: https://patch.msgid.link/20250610035607.690771-1-chris.chiu@canonical.com Signed-off-by: Takashi Iwai Signed-off-by: Greg Kroah-Hartman --- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index c2e631b2fc3ce..45048924d7f28 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -10840,6 +10840,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8e60, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8e61, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8e62, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x1043, 0x1032, "ASUS VivoBook X513EA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC), SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), SND_PCI_QUIRK(0x1043, 0x1054, "ASUS G614FH/FM/FP", ALC287_FIXUP_CS35L41_I2C_2), -- GitLab From d488691a4a8c0969a8f1db58e1b1eab84d3a7ec0 Mon Sep 17 00:00:00 2001 From: Richard Fitzgerald Date: Mon, 9 Jun 2025 11:21:25 +0100 Subject: [PATCH 1546/2211] ALSA: hda/realtek: Add quirk for Asus GU605C commit 7b23887a0c70d15459f02c51651a111e9e5cab86 upstream. The GU605C has similar audio hardware to the GU605M so apply the same quirk. Note that in the linked bugzilla there are two separate problems with the GU605C. This patch fixes one of the problems, so I haven't added a Closes: tag. Signed-off-by: Richard Fitzgerald Reported-by: Nick Karaolidis Link: https://bugzilla.kernel.org/show_bug.cgi?id=220152 Cc: Link: https://patch.msgid.link/20250609102125.63196-1-rf@opensource.cirrus.com Signed-off-by: Takashi Iwai Signed-off-by: Greg Kroah-Hartman --- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 45048924d7f28..cb41cd2ba0ef1 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -10841,6 +10841,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x103c, 0x8e61, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x103c, 0x8e62, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x1043, 0x1032, "ASUS VivoBook X513EA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1043, 0x1034, "ASUS GU605C", ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1), SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC), SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), SND_PCI_QUIRK(0x1043, 0x1054, "ASUS G614FH/FM/FP", ALC287_FIXUP_CS35L41_I2C_2), -- GitLab From 5cfc95dc2f0185c2afc713fdf75caac63a96323b Mon Sep 17 00:00:00 2001 From: Sean Nyekjaer Date: Mon, 5 May 2025 21:20:07 +0200 Subject: [PATCH 1547/2211] iio: accel: fxls8962af: Fix temperature calculation commit 16038474e3a0263572f36326ef85057aaf341814 upstream. According to spec temperature should be returned in milli degrees Celsius. Add in_temp_scale to calculate from Celsius to milli Celsius. Fixes: a3e0b51884ee ("iio: accel: add support for FXLS8962AF/FXLS8964AF accelerometers") Cc: stable@vger.kernel.org Reviewed-by: Marcelo Schmitt Signed-off-by: Sean Nyekjaer Link: https://patch.msgid.link/20250505-fxls-v4-1-a38652e21738@geanix.com Signed-off-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman --- drivers/iio/accel/fxls8962af-core.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/iio/accel/fxls8962af-core.c b/drivers/iio/accel/fxls8962af-core.c index f7252009f5f3a..5e17c1e6d2c71 100644 --- a/drivers/iio/accel/fxls8962af-core.c +++ b/drivers/iio/accel/fxls8962af-core.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -436,8 +437,16 @@ static int fxls8962af_read_raw(struct iio_dev *indio_dev, *val = FXLS8962AF_TEMP_CENTER_VAL; return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: - *val = 0; - return fxls8962af_read_full_scale(data, val2); + switch (chan->type) { + case IIO_TEMP: + *val = MILLIDEGREE_PER_DEGREE; + return IIO_VAL_INT; + case IIO_ACCEL: + *val = 0; + return fxls8962af_read_full_scale(data, val2); + default: + return -EINVAL; + } case IIO_CHAN_INFO_SAMP_FREQ: return fxls8962af_read_samp_freq(data, val, val2); default: @@ -736,6 +745,7 @@ static const struct iio_event_spec fxls8962af_event[] = { .type = IIO_TEMP, \ .address = FXLS8962AF_TEMP_OUT, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ + BIT(IIO_CHAN_INFO_SCALE) | \ BIT(IIO_CHAN_INFO_OFFSET),\ .scan_index = -1, \ .scan_type = { \ -- GitLab From 9cf5b2a3b72c23fb7b84736d5d19ee6ea718762b Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Tue, 27 May 2025 23:23:53 +0200 Subject: [PATCH 1548/2211] mm/hugetlb: unshare page tables during VMA split, not before commit 081056dc00a27bccb55ccc3c6f230a3d5fd3f7e0 upstream. Currently, __split_vma() triggers hugetlb page table unsharing through vm_ops->may_split(). This happens before the VMA lock and rmap locks are taken - which is too early, it allows racing VMA-locked page faults in our process and racing rmap walks from other processes to cause page tables to be shared again before we actually perform the split. Fix it by explicitly calling into the hugetlb unshare logic from __split_vma() in the same place where THP splitting also happens. At that point, both the VMA and the rmap(s) are write-locked. An annoying detail is that we can now call into the helper hugetlb_unshare_pmds() from two different locking contexts: 1. from hugetlb_split(), holding: - mmap lock (exclusively) - VMA lock - file rmap lock (exclusively) 2. hugetlb_unshare_all_pmds(), which I think is designed to be able to call us with only the mmap lock held (in shared mode), but currently only runs while holding mmap lock (exclusively) and VMA lock Backporting note: This commit fixes a racy protection that was introduced in commit b30c14cd6102 ("hugetlb: unshare some PMDs when splitting VMAs"); that commit claimed to fix an issue introduced in 5.13, but it should actually also go all the way back. [jannh@google.com: v2] Link: https://lkml.kernel.org/r/20250528-hugetlb-fixes-splitrace-v2-1-1329349bad1a@google.com Link: https://lkml.kernel.org/r/20250528-hugetlb-fixes-splitrace-v2-0-1329349bad1a@google.com Link: https://lkml.kernel.org/r/20250527-hugetlb-fixes-splitrace-v1-1-f4136f5ec58a@google.com Fixes: 39dde65c9940 ("[PATCH] shared page table for hugetlb page") Signed-off-by: Jann Horn Cc: Liam Howlett Reviewed-by: Lorenzo Stoakes Reviewed-by: Oscar Salvador Cc: Lorenzo Stoakes Cc: Vlastimil Babka Cc: [b30c14cd6102: hugetlb: unshare some PMDs when splitting VMAs] Cc: Signed-off-by: Andrew Morton [stable backport: added missing include] Signed-off-by: Jann Horn Signed-off-by: Greg Kroah-Hartman --- include/linux/hugetlb.h | 3 ++ mm/hugetlb.c | 60 +++++++++++++++++++++++--------- mm/vma.c | 7 ++++ mm/vma_internal.h | 1 + tools/testing/vma/vma_internal.h | 2 ++ 5 files changed, 57 insertions(+), 16 deletions(-) diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 12f7a7b9c06e9..3897f4492e1f4 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -272,6 +272,7 @@ long hugetlb_change_protection(struct vm_area_struct *vma, bool is_hugetlb_entry_migration(pte_t pte); bool is_hugetlb_entry_hwpoisoned(pte_t pte); void hugetlb_unshare_all_pmds(struct vm_area_struct *vma); +void hugetlb_split(struct vm_area_struct *vma, unsigned long addr); #else /* !CONFIG_HUGETLB_PAGE */ @@ -465,6 +466,8 @@ static inline vm_fault_t hugetlb_fault(struct mm_struct *mm, static inline void hugetlb_unshare_all_pmds(struct vm_area_struct *vma) { } +static inline void hugetlb_split(struct vm_area_struct *vma, unsigned long addr) {} + #endif /* !CONFIG_HUGETLB_PAGE */ #ifndef pgd_write diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 49af4a7bd3d87..9c6a4e855481a 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -87,7 +87,7 @@ static void hugetlb_vma_lock_free(struct vm_area_struct *vma); static void hugetlb_vma_lock_alloc(struct vm_area_struct *vma); static void __hugetlb_vma_unlock_write_free(struct vm_area_struct *vma); static void hugetlb_unshare_pmds(struct vm_area_struct *vma, - unsigned long start, unsigned long end); + unsigned long start, unsigned long end, bool take_locks); static struct resv_map *vma_resv_map(struct vm_area_struct *vma); static void hugetlb_free_folio(struct folio *folio) @@ -5071,26 +5071,40 @@ static int hugetlb_vm_op_split(struct vm_area_struct *vma, unsigned long addr) { if (addr & ~(huge_page_mask(hstate_vma(vma)))) return -EINVAL; + return 0; +} +void hugetlb_split(struct vm_area_struct *vma, unsigned long addr) +{ /* * PMD sharing is only possible for PUD_SIZE-aligned address ranges * in HugeTLB VMAs. If we will lose PUD_SIZE alignment due to this * split, unshare PMDs in the PUD_SIZE interval surrounding addr now. + * This function is called in the middle of a VMA split operation, with + * MM, VMA and rmap all write-locked to prevent concurrent page table + * walks (except hardware and gup_fast()). */ + vma_assert_write_locked(vma); + i_mmap_assert_write_locked(vma->vm_file->f_mapping); + if (addr & ~PUD_MASK) { - /* - * hugetlb_vm_op_split is called right before we attempt to - * split the VMA. We will need to unshare PMDs in the old and - * new VMAs, so let's unshare before we split. - */ unsigned long floor = addr & PUD_MASK; unsigned long ceil = floor + PUD_SIZE; - if (floor >= vma->vm_start && ceil <= vma->vm_end) - hugetlb_unshare_pmds(vma, floor, ceil); + if (floor >= vma->vm_start && ceil <= vma->vm_end) { + /* + * Locking: + * Use take_locks=false here. + * The file rmap lock is already held. + * The hugetlb VMA lock can't be taken when we already + * hold the file rmap lock, and we don't need it because + * its purpose is to synchronize against concurrent page + * table walks, which are not possible thanks to the + * locks held by our caller. + */ + hugetlb_unshare_pmds(vma, floor, ceil, /* take_locks = */ false); + } } - - return 0; } static unsigned long hugetlb_vm_op_pagesize(struct vm_area_struct *vma) @@ -7491,9 +7505,16 @@ void move_hugetlb_state(struct folio *old_folio, struct folio *new_folio, int re } } +/* + * If @take_locks is false, the caller must ensure that no concurrent page table + * access can happen (except for gup_fast() and hardware page walks). + * If @take_locks is true, we take the hugetlb VMA lock (to lock out things like + * concurrent page fault handling) and the file rmap lock. + */ static void hugetlb_unshare_pmds(struct vm_area_struct *vma, unsigned long start, - unsigned long end) + unsigned long end, + bool take_locks) { struct hstate *h = hstate_vma(vma); unsigned long sz = huge_page_size(h); @@ -7517,8 +7538,12 @@ static void hugetlb_unshare_pmds(struct vm_area_struct *vma, mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, mm, start, end); mmu_notifier_invalidate_range_start(&range); - hugetlb_vma_lock_write(vma); - i_mmap_lock_write(vma->vm_file->f_mapping); + if (take_locks) { + hugetlb_vma_lock_write(vma); + i_mmap_lock_write(vma->vm_file->f_mapping); + } else { + i_mmap_assert_write_locked(vma->vm_file->f_mapping); + } for (address = start; address < end; address += PUD_SIZE) { ptep = hugetlb_walk(vma, address, sz); if (!ptep) @@ -7528,8 +7553,10 @@ static void hugetlb_unshare_pmds(struct vm_area_struct *vma, spin_unlock(ptl); } flush_hugetlb_tlb_range(vma, start, end); - i_mmap_unlock_write(vma->vm_file->f_mapping); - hugetlb_vma_unlock_write(vma); + if (take_locks) { + i_mmap_unlock_write(vma->vm_file->f_mapping); + hugetlb_vma_unlock_write(vma); + } /* * No need to call mmu_notifier_arch_invalidate_secondary_tlbs(), see * Documentation/mm/mmu_notifier.rst. @@ -7544,7 +7571,8 @@ static void hugetlb_unshare_pmds(struct vm_area_struct *vma, void hugetlb_unshare_all_pmds(struct vm_area_struct *vma) { hugetlb_unshare_pmds(vma, ALIGN(vma->vm_start, PUD_SIZE), - ALIGN_DOWN(vma->vm_end, PUD_SIZE)); + ALIGN_DOWN(vma->vm_end, PUD_SIZE), + /* take_locks = */ true); } #ifdef CONFIG_CMA diff --git a/mm/vma.c b/mm/vma.c index 9b4517944901d..1d82ec4ee7bb5 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -416,7 +416,14 @@ static int __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma, init_vma_prep(&vp, vma); vp.insert = new; vma_prepare(&vp); + + /* + * Get rid of huge pages and shared page tables straddling the split + * boundary. + */ vma_adjust_trans_huge(vma, vma->vm_start, addr, 0); + if (is_vm_hugetlb_page(vma)) + hugetlb_split(vma, addr); if (new_below) { vma->vm_start = addr; diff --git a/mm/vma_internal.h b/mm/vma_internal.h index b930ab12a5878..1dd119f266e64 100644 --- a/mm/vma_internal.h +++ b/mm/vma_internal.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include diff --git a/tools/testing/vma/vma_internal.h b/tools/testing/vma/vma_internal.h index c5b9da034511c..1d5bbc8464f18 100644 --- a/tools/testing/vma/vma_internal.h +++ b/tools/testing/vma/vma_internal.h @@ -735,6 +735,8 @@ static inline void vma_adjust_trans_huge(struct vm_area_struct *vma, (void)adjust_next; } +static inline void hugetlb_split(struct vm_area_struct *, unsigned long) {} + static inline void vma_iter_free(struct vma_iterator *vmi) { mas_destroy(&vmi->mas); -- GitLab From cef081c8231b52b4a652bbd022e03d80441118be Mon Sep 17 00:00:00 2001 From: "David (Ming Qiang) Wu" Date: Mon, 12 May 2025 15:14:43 -0400 Subject: [PATCH 1549/2211] drm/amdgpu: read back register after written for VCN v4.0.5 commit ee7360fc27d6045510f8fe459b5649b2af27811a upstream. On VCN v4.0.5 there is a race condition where the WPTR is not updated after starting from idle when doorbell is used. Adding register read-back after written at function end is to ensure all register writes are done before they can be used. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12528 Signed-off-by: David (Ming Qiang) Wu Reviewed-by: Mario Limonciello Tested-by: Mario Limonciello Reviewed-by: Alex Deucher Reviewed-by: Ruijing Dong Signed-off-by: Alex Deucher (cherry picked from commit 07c9db090b86e5211188e1b351303fbc673378cf) Cc: stable@vger.kernel.org (cherry picked from commit ee7360fc27d6045510f8fe459b5649b2af27811a) Hand modified for contextual changes where there is a for loop in 6.12 that was dropped later on. Signed-off-by: Mario Limonciello Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c index e0b02bf1c5639..3d114ea7049f7 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c @@ -985,6 +985,10 @@ static int vcn_v4_0_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, b ring->doorbell_index << VCN_RB1_DB_CTRL__OFFSET__SHIFT | VCN_RB1_DB_CTRL__EN_MASK); + /* Keeping one read-back to ensure all register writes are done, otherwise + * it may introduce race conditions */ + RREG32_SOC15(VCN, inst_idx, regVCN_RB1_DB_CTRL); + return 0; } @@ -1167,6 +1171,10 @@ static int vcn_v4_0_5_start(struct amdgpu_device *adev) tmp |= VCN_RB_ENABLE__RB1_EN_MASK; WREG32_SOC15(VCN, i, regVCN_RB_ENABLE, tmp); fw_shared->sq.queue_mode &= ~(FW_QUEUE_RING_RESET | FW_QUEUE_DPG_HOLD_OFF); + + /* Keeping one read-back to ensure all register writes are done, otherwise + * it may introduce race conditions */ + RREG32_SOC15(VCN, i, regVCN_RB_ENABLE); } return 0; -- GitLab From 1814e71a4e9c20bd69dbe1e007d31c0ab2c237a2 Mon Sep 17 00:00:00 2001 From: Miguel Ojeda Date: Mon, 10 Feb 2025 17:42:45 +0100 Subject: [PATCH 1550/2211] kbuild: rust: add rustc-min-version support function commit ac954145e1ee3f72033161cbe4ac0b16b5354ae7 upstream. Introduce `rustc-min-version` support function that mimics `{gcc,clang}-min-version` ones, following commit 88b61e3bff93 ("Makefile.compiler: replace cc-ifversion with compiler-specific macros"). In addition, use it in the first use case we have in the kernel (which was done independently to minimize the changes needed for the fix). Signed-off-by: Miguel Ojeda Reviewed-by: Fiona Behrens Reviewed-by: Nicolas Schier Signed-off-by: Masahiro Yamada Signed-off-by: Miguel Ojeda Signed-off-by: Greg Kroah-Hartman --- Documentation/kbuild/makefiles.rst | 14 ++++++++++++++ arch/arm64/Makefile | 2 +- scripts/Makefile.compiler | 4 ++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Documentation/kbuild/makefiles.rst b/Documentation/kbuild/makefiles.rst index 7964e0c245aeb..81607ce407595 100644 --- a/Documentation/kbuild/makefiles.rst +++ b/Documentation/kbuild/makefiles.rst @@ -656,6 +656,20 @@ cc-cross-prefix endif endif +$(RUSTC) support functions +-------------------------- + +rustc-min-version + rustc-min-version tests if the value of $(CONFIG_RUSTC_VERSION) is greater + than or equal to the provided value and evaluates to y if so. + + Example:: + + rustflags-$(call rustc-min-version, 108500) := -Cfoo + + In this example, rustflags-y will be assigned the value -Cfoo if + $(CONFIG_RUSTC_VERSION) is >= 1.85.0. + $(LD) support functions ----------------------- diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 19a4988621ac9..88029d38b3c65 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -48,7 +48,7 @@ KBUILD_CFLAGS += $(CC_FLAGS_NO_FPU) \ KBUILD_CFLAGS += $(call cc-disable-warning, psabi) KBUILD_AFLAGS += $(compat_vdso) -ifeq ($(call test-ge, $(CONFIG_RUSTC_VERSION), 108500),y) +ifeq ($(call rustc-min-version, 108500),y) KBUILD_RUSTFLAGS += --target=aarch64-unknown-none-softfloat else KBUILD_RUSTFLAGS += --target=aarch64-unknown-none -Ctarget-feature="-neon" diff --git a/scripts/Makefile.compiler b/scripts/Makefile.compiler index 05685b3df9e5e..638e1e729986d 100644 --- a/scripts/Makefile.compiler +++ b/scripts/Makefile.compiler @@ -67,6 +67,10 @@ gcc-min-version = $(call test-ge, $(CONFIG_GCC_VERSION), $1) # Usage: cflags-$(call clang-min-version, 110000) += -foo clang-min-version = $(call test-ge, $(CONFIG_CLANG_VERSION), $1) +# rustc-min-version +# Usage: rustc-$(call rustc-min-version, 108500) += -Cfoo +rustc-min-version = $(call test-ge, $(CONFIG_RUSTC_VERSION), $1) + # ld-option # Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y) ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3)) -- GitLab From 60d8db49ef143c04f7daf90dafa3347a7af3b4c7 Mon Sep 17 00:00:00 2001 From: Gary Guo Date: Sat, 17 May 2025 09:55:59 +0100 Subject: [PATCH 1551/2211] rust: compile libcore with edition 2024 for 1.87+ commit f4daa80d6be7d3c55ca72a8e560afc4e21f886aa upstream. Rust 1.87 (released on 2025-05-15) compiles core library with edition 2024 instead of 2021 [1]. Ensure that the edition matches libcore's expectation to avoid potential breakage. [ J3m3 reported in Zulip [2] that the `rust-analyzer` target was broken after this patch -- indeed, we need to avoid `core-cfgs` since those are passed to the `rust-analyzer` target. So, instead, I tweaked the patch to create a new `core-edition` variable and explicitly mention the `--edition` flag instead of reusing `core-cfg`s. In addition, pass a new argument using this new variable to `generate_rust_analyzer.py` so that we set the right edition there. By the way, for future reference: the `filter-out` change is needed for Rust < 1.87, since otherwise we would skip the `--edition=2021` we just added, ending up with no edition flag, and thus the compiler would default to the 2015 one. [2] https://rust-for-linux.zulipchat.com/#narrow/channel/291565/topic/x/near/520206547 - Miguel ] Cc: stable@vger.kernel.org # Needed in 6.12.y and later (Rust is pinned in older LTSs). Link: https://github.com/rust-lang/rust/pull/138162 [1] Reported-by: est31 Closes: https://github.com/Rust-for-Linux/linux/issues/1163 Signed-off-by: Gary Guo Link: https://lore.kernel.org/r/20250517085600.2857460-1-gary@garyguo.net Signed-off-by: Miguel Ojeda [ Solved conflicts for 6.12.y backport. - Miguel ] Signed-off-by: Miguel Ojeda Signed-off-by: Greg Kroah-Hartman --- rust/Makefile | 14 ++++++++------ scripts/generate_rust_analyzer.py | 13 ++++++++----- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/rust/Makefile b/rust/Makefile index 1b00e16951eeb..93650b2ee7d57 100644 --- a/rust/Makefile +++ b/rust/Makefile @@ -53,6 +53,8 @@ endif core-cfgs = \ --cfg no_fp_fmt_parse +core-edition := $(if $(call rustc-min-version,108700),2024,2021) + quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $< cmd_rustdoc = \ OBJTREE=$(abspath $(objtree)) \ @@ -95,8 +97,8 @@ rustdoc-macros: $(src)/macros/lib.rs FORCE # Starting with Rust 1.82.0, skipping `-Wrustdoc::unescaped_backticks` should # not be needed -- see https://github.com/rust-lang/rust/pull/128307. -rustdoc-core: private skip_flags = -Wrustdoc::unescaped_backticks -rustdoc-core: private rustc_target_flags = $(core-cfgs) +rustdoc-core: private skip_flags = --edition=2021 -Wrustdoc::unescaped_backticks +rustdoc-core: private rustc_target_flags = --edition=$(core-edition) $(core-cfgs) rustdoc-core: $(RUST_LIB_SRC)/core/src/lib.rs FORCE +$(call if_changed,rustdoc) @@ -372,7 +374,7 @@ quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L cmd_rustc_library = \ OBJTREE=$(abspath $(objtree)) \ $(if $(skip_clippy),$(RUSTC),$(RUSTC_OR_CLIPPY)) \ - $(filter-out $(skip_flags),$(rust_flags) $(rustc_target_flags)) \ + $(filter-out $(skip_flags),$(rust_flags)) $(rustc_target_flags) \ --emit=dep-info=$(depfile) --emit=obj=$@ \ --emit=metadata=$(dir $@)$(patsubst %.o,lib%.rmeta,$(notdir $@)) \ --crate-type rlib -L$(objtree)/$(obj) \ @@ -383,7 +385,7 @@ quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L rust-analyzer: $(Q)$(srctree)/scripts/generate_rust_analyzer.py \ - --cfgs='core=$(core-cfgs)' \ + --cfgs='core=$(core-cfgs)' $(core-edition) \ $(realpath $(srctree)) $(realpath $(objtree)) \ $(rustc_sysroot) $(RUST_LIB_SRC) $(KBUILD_EXTMOD) > \ $(if $(KBUILD_EXTMOD),$(extmod_prefix),$(objtree))/rust-project.json @@ -407,9 +409,9 @@ define rule_rustc_library endef $(obj)/core.o: private skip_clippy = 1 -$(obj)/core.o: private skip_flags = -Wunreachable_pub +$(obj)/core.o: private skip_flags = --edition=2021 -Wunreachable_pub $(obj)/core.o: private rustc_objcopy = $(foreach sym,$(redirect-intrinsics),--redefine-sym $(sym)=__rust$(sym)) -$(obj)/core.o: private rustc_target_flags = $(core-cfgs) +$(obj)/core.o: private rustc_target_flags = --edition=$(core-edition) $(core-cfgs) $(obj)/core.o: $(RUST_LIB_SRC)/core/src/lib.rs \ $(wildcard $(objtree)/include/config/RUSTC_VERSION_TEXT) FORCE +$(call if_changed_rule,rustc_library) diff --git a/scripts/generate_rust_analyzer.py b/scripts/generate_rust_analyzer.py index 690f9830f0648..f9c9a2117632c 100755 --- a/scripts/generate_rust_analyzer.py +++ b/scripts/generate_rust_analyzer.py @@ -18,7 +18,7 @@ def args_crates_cfgs(cfgs): return crates_cfgs -def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs): +def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs, core_edition): # Generate the configuration list. cfg = [] with open(objtree / "include" / "generated" / "rustc_cfg") as fd: @@ -34,7 +34,7 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs): crates_indexes = {} crates_cfgs = args_crates_cfgs(cfgs) - def append_crate(display_name, root_module, deps, cfg=[], is_workspace_member=True, is_proc_macro=False): + def append_crate(display_name, root_module, deps, cfg=[], is_workspace_member=True, is_proc_macro=False, edition="2021"): crates_indexes[display_name] = len(crates) crates.append({ "display_name": display_name, @@ -43,7 +43,7 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs): "is_proc_macro": is_proc_macro, "deps": [{"crate": crates_indexes[dep], "name": dep} for dep in deps], "cfg": cfg, - "edition": "2021", + "edition": edition, "env": { "RUST_MODFILE": "This is only for rust-analyzer" } @@ -53,6 +53,7 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs): display_name, deps, cfg=[], + edition="2021", ): append_crate( display_name, @@ -60,12 +61,13 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs): deps, cfg, is_workspace_member=False, + edition=edition, ) # NB: sysroot crates reexport items from one another so setting up our transitive dependencies # here is important for ensuring that rust-analyzer can resolve symbols. The sources of truth # for this dependency graph are `(sysroot_src / crate / "Cargo.toml" for crate in crates)`. - append_sysroot_crate("core", [], cfg=crates_cfgs.get("core", [])) + append_sysroot_crate("core", [], cfg=crates_cfgs.get("core", []), edition=core_edition) append_sysroot_crate("alloc", ["core"]) append_sysroot_crate("std", ["alloc", "core"]) append_sysroot_crate("proc_macro", ["core", "std"]) @@ -155,6 +157,7 @@ def main(): parser = argparse.ArgumentParser() parser.add_argument('--verbose', '-v', action='store_true') parser.add_argument('--cfgs', action='append', default=[]) + parser.add_argument("core_edition") parser.add_argument("srctree", type=pathlib.Path) parser.add_argument("objtree", type=pathlib.Path) parser.add_argument("sysroot", type=pathlib.Path) @@ -171,7 +174,7 @@ def main(): assert args.sysroot in args.sysroot_src.parents rust_project = { - "crates": generate_crates(args.srctree, args.objtree, args.sysroot_src, args.exttree, args.cfgs), + "crates": generate_crates(args.srctree, args.objtree, args.sysroot_src, args.exttree, args.cfgs, args.core_edition), "sysroot": str(args.sysroot), } -- GitLab From dc5f0aef9ebdff30a2a90e4b418f063198308c2c Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Thu, 29 May 2025 12:28:05 +0200 Subject: [PATCH 1552/2211] net: Fix checksum update for ILA adj-transport commit 6043b794c7668c19dabc4a93c75b924a19474d59 upstream. During ILA address translations, the L4 checksums can be handled in different ways. One of them, adj-transport, consist in parsing the transport layer and updating any found checksum. This logic relies on inet_proto_csum_replace_by_diff and produces an incorrect skb->csum when in state CHECKSUM_COMPLETE. This bug can be reproduced with a simple ILA to SIR mapping, assuming packets are received with CHECKSUM_COMPLETE: $ ip a show dev eth0 14: eth0@if15: mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 62:ae:35:9e:0f:8d brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 3333:0:0:1::c078/64 scope global valid_lft forever preferred_lft forever inet6 fd00:10:244:1::c078/128 scope global nodad valid_lft forever preferred_lft forever inet6 fe80::60ae:35ff:fe9e:f8d/64 scope link proto kernel_ll valid_lft forever preferred_lft forever $ ip ila add loc_match fd00:10:244:1 loc 3333:0:0:1 \ csum-mode adj-transport ident-type luid dev eth0 Then I hit [fd00:10:244:1::c078]:8000 with a server listening only on [3333:0:0:1::c078]:8000. With the bug, the SYN packet is dropped with SKB_DROP_REASON_TCP_CSUM after inet_proto_csum_replace_by_diff changed skb->csum. The translation and drop are visible on pwru [1] traces: IFACE TUPLE FUNC eth0:9 [fd00:10:244:3::3d8]:51420->[fd00:10:244:1::c078]:8000(tcp) ipv6_rcv eth0:9 [fd00:10:244:3::3d8]:51420->[fd00:10:244:1::c078]:8000(tcp) ip6_rcv_core eth0:9 [fd00:10:244:3::3d8]:51420->[fd00:10:244:1::c078]:8000(tcp) nf_hook_slow eth0:9 [fd00:10:244:3::3d8]:51420->[fd00:10:244:1::c078]:8000(tcp) inet_proto_csum_replace_by_diff eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) tcp_v6_early_demux eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) ip6_route_input eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) ip6_input eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) ip6_input_finish eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) ip6_protocol_deliver_rcu eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) raw6_local_deliver eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) ipv6_raw_deliver eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) tcp_v6_rcv eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) __skb_checksum_complete eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) kfree_skb_reason(SKB_DROP_REASON_TCP_CSUM) eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) skb_release_head_state eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) skb_release_data eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) skb_free_head eth0:9 [fd00:10:244:3::3d8]:51420->[3333:0:0:1::c078]:8000(tcp) kfree_skbmem This is happening because inet_proto_csum_replace_by_diff is updating skb->csum when it shouldn't. The L4 checksum is updated such that it "cancels" the IPv6 address change in terms of checksum computation, so the impact on skb->csum is null. Note this would be different for an IPv4 packet since three fields would be updated: the IPv4 address, the IP checksum, and the L4 checksum. Two would cancel each other and skb->csum would still need to be updated to take the L4 checksum change into account. This patch fixes it by passing an ipv6 flag to inet_proto_csum_replace_by_diff, to skip the skb->csum update if we're in the IPv6 case. Note the behavior of the only other user of inet_proto_csum_replace_by_diff, the BPF subsystem, is left as is in this patch and fixed in the subsequent patch. With the fix, using the reproduction from above, I can confirm skb->csum is not touched by inet_proto_csum_replace_by_diff and the TCP SYN proceeds to the application after the ILA translation. Link: https://github.com/cilium/pwru [1] Fixes: 65d7ab8de582 ("net: Identifier Locator Addressing module") Signed-off-by: Paul Chaignon Acked-by: Daniel Borkmann Link: https://patch.msgid.link/b5539869e3550d46068504feb02d37653d939c0b.1748509484.git.paul.chaignon@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Paul Chaignon Signed-off-by: Greg Kroah-Hartman --- include/net/checksum.h | 2 +- net/core/filter.c | 2 +- net/core/utils.c | 4 ++-- net/ipv6/ila/ila_common.c | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/net/checksum.h b/include/net/checksum.h index 1338cb92c8e72..28b101f26636e 100644 --- a/include/net/checksum.h +++ b/include/net/checksum.h @@ -158,7 +158,7 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, const __be32 *from, const __be32 *to, bool pseudohdr); void inet_proto_csum_replace_by_diff(__sum16 *sum, struct sk_buff *skb, - __wsum diff, bool pseudohdr); + __wsum diff, bool pseudohdr, bool ipv6); static __always_inline void inet_proto_csum_replace2(__sum16 *sum, struct sk_buff *skb, diff --git a/net/core/filter.c b/net/core/filter.c index 55c152c3dea50..da94349ccb5d1 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -1999,7 +1999,7 @@ BPF_CALL_5(bpf_l4_csum_replace, struct sk_buff *, skb, u32, offset, if (unlikely(from != 0)) return -EINVAL; - inet_proto_csum_replace_by_diff(ptr, skb, to, is_pseudo); + inet_proto_csum_replace_by_diff(ptr, skb, to, is_pseudo, false); break; case 2: inet_proto_csum_replace2(ptr, skb, from, to, is_pseudo); diff --git a/net/core/utils.c b/net/core/utils.c index 27f4cffaae05d..b8c21a859e27b 100644 --- a/net/core/utils.c +++ b/net/core/utils.c @@ -473,11 +473,11 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, EXPORT_SYMBOL(inet_proto_csum_replace16); void inet_proto_csum_replace_by_diff(__sum16 *sum, struct sk_buff *skb, - __wsum diff, bool pseudohdr) + __wsum diff, bool pseudohdr, bool ipv6) { if (skb->ip_summed != CHECKSUM_PARTIAL) { csum_replace_by_diff(sum, diff); - if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) + if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr && !ipv6) skb->csum = ~csum_sub(diff, skb->csum); } else if (pseudohdr) { *sum = ~csum_fold(csum_add(diff, csum_unfold(*sum))); diff --git a/net/ipv6/ila/ila_common.c b/net/ipv6/ila/ila_common.c index 95e9146918cc6..b8d43ed4689db 100644 --- a/net/ipv6/ila/ila_common.c +++ b/net/ipv6/ila/ila_common.c @@ -86,7 +86,7 @@ static void ila_csum_adjust_transport(struct sk_buff *skb, diff = get_csum_diff(ip6h, p); inet_proto_csum_replace_by_diff(&th->check, skb, - diff, true); + diff, true, true); } break; case NEXTHDR_UDP: @@ -97,7 +97,7 @@ static void ila_csum_adjust_transport(struct sk_buff *skb, if (uh->check || skb->ip_summed == CHECKSUM_PARTIAL) { diff = get_csum_diff(ip6h, p); inet_proto_csum_replace_by_diff(&uh->check, skb, - diff, true); + diff, true, true); if (!uh->check) uh->check = CSUM_MANGLED_0; } @@ -111,7 +111,7 @@ static void ila_csum_adjust_transport(struct sk_buff *skb, diff = get_csum_diff(ip6h, p); inet_proto_csum_replace_by_diff(&ih->icmp6_cksum, skb, - diff, true); + diff, true, true); } break; } -- GitLab From 251629918451c8e602529013b93a07e20191c2fa Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Thu, 29 May 2025 12:28:35 +0200 Subject: [PATCH 1553/2211] bpf: Fix L4 csum update on IPv6 in CHECKSUM_COMPLETE commit ead7f9b8de65632ef8060b84b0c55049a33cfea1 upstream. In Cilium, we use bpf_csum_diff + bpf_l4_csum_replace to, among other things, update the L4 checksum after reverse SNATing IPv6 packets. That use case is however not currently supported and leads to invalid skb->csum values in some cases. This patch adds support for IPv6 address changes in bpf_l4_csum_update via a new flag. When calling bpf_l4_csum_replace in Cilium, it ends up calling inet_proto_csum_replace_by_diff: 1: void inet_proto_csum_replace_by_diff(__sum16 *sum, struct sk_buff *skb, 2: __wsum diff, bool pseudohdr) 3: { 4: if (skb->ip_summed != CHECKSUM_PARTIAL) { 5: csum_replace_by_diff(sum, diff); 6: if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) 7: skb->csum = ~csum_sub(diff, skb->csum); 8: } else if (pseudohdr) { 9: *sum = ~csum_fold(csum_add(diff, csum_unfold(*sum))); 10: } 11: } The bug happens when we're in the CHECKSUM_COMPLETE state. We've just updated one of the IPv6 addresses. The helper now updates the L4 header checksum on line 5. Next, it updates skb->csum on line 7. It shouldn't. For an IPv6 packet, the updates of the IPv6 address and of the L4 checksum will cancel each other. The checksums are set such that computing a checksum over the packet including its checksum will result in a sum of 0. So the same is true here when we update the L4 checksum on line 5. We'll update it as to cancel the previous IPv6 address update. Hence skb->csum should remain untouched in this case. The same bug doesn't affect IPv4 packets because, in that case, three fields are updated: the IPv4 address, the IP checksum, and the L4 checksum. The change to the IPv4 address and one of the checksums still cancel each other in skb->csum, but we're left with one checksum update and should therefore update skb->csum accordingly. That's exactly what inet_proto_csum_replace_by_diff does. This special case for IPv6 L4 checksums is also described atop inet_proto_csum_replace16, the function we should be using in this case. This patch introduces a new bpf_l4_csum_replace flag, BPF_F_IPV6, to indicate that we're updating the L4 checksum of an IPv6 packet. When the flag is set, inet_proto_csum_replace_by_diff will skip the skb->csum update. Fixes: 7d672345ed295 ("bpf: add generic bpf_csum_diff helper") Signed-off-by: Paul Chaignon Acked-by: Daniel Borkmann Link: https://patch.msgid.link/96a6bc3a443e6f0b21ff7b7834000e17fb549e05.1748509484.git.paul.chaignon@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Paul Chaignon Signed-off-by: Greg Kroah-Hartman --- include/uapi/linux/bpf.h | 2 ++ net/core/filter.c | 5 +++-- tools/include/uapi/linux/bpf.h | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 552fd633f8200..5a5cdb4539358 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -2035,6 +2035,7 @@ union bpf_attr { * for updates resulting in a null checksum the value is set to * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates * the checksum is to be computed against a pseudo-header. + * Flag **BPF_F_IPV6** should be set for IPv6 packets. * * This helper works in combination with **bpf_csum_diff**\ (), * which does not update the checksum in-place, but offers more @@ -6049,6 +6050,7 @@ enum { BPF_F_PSEUDO_HDR = (1ULL << 4), BPF_F_MARK_MANGLED_0 = (1ULL << 5), BPF_F_MARK_ENFORCE = (1ULL << 6), + BPF_F_IPV6 = (1ULL << 7), }; /* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ diff --git a/net/core/filter.c b/net/core/filter.c index da94349ccb5d1..1c0cf6f2fff52 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -1980,10 +1980,11 @@ BPF_CALL_5(bpf_l4_csum_replace, struct sk_buff *, skb, u32, offset, bool is_pseudo = flags & BPF_F_PSEUDO_HDR; bool is_mmzero = flags & BPF_F_MARK_MANGLED_0; bool do_mforce = flags & BPF_F_MARK_ENFORCE; + bool is_ipv6 = flags & BPF_F_IPV6; __sum16 *ptr; if (unlikely(flags & ~(BPF_F_MARK_MANGLED_0 | BPF_F_MARK_ENFORCE | - BPF_F_PSEUDO_HDR | BPF_F_HDR_FIELD_MASK))) + BPF_F_PSEUDO_HDR | BPF_F_HDR_FIELD_MASK | BPF_F_IPV6))) return -EINVAL; if (unlikely(offset > 0xffff || offset & 1)) return -EFAULT; @@ -1999,7 +2000,7 @@ BPF_CALL_5(bpf_l4_csum_replace, struct sk_buff *, skb, u32, offset, if (unlikely(from != 0)) return -EINVAL; - inet_proto_csum_replace_by_diff(ptr, skb, to, is_pseudo, false); + inet_proto_csum_replace_by_diff(ptr, skb, to, is_pseudo, is_ipv6); break; case 2: inet_proto_csum_replace2(ptr, skb, from, to, is_pseudo); diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 552fd633f8200..5a5cdb4539358 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -2035,6 +2035,7 @@ union bpf_attr { * for updates resulting in a null checksum the value is set to * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates * the checksum is to be computed against a pseudo-header. + * Flag **BPF_F_IPV6** should be set for IPv6 packets. * * This helper works in combination with **bpf_csum_diff**\ (), * which does not update the checksum in-place, but offers more @@ -6049,6 +6050,7 @@ enum { BPF_F_PSEUDO_HDR = (1ULL << 4), BPF_F_MARK_MANGLED_0 = (1ULL << 5), BPF_F_MARK_ENFORCE = (1ULL << 6), + BPF_F_IPV6 = (1ULL << 7), }; /* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ -- GitLab From 50189d9c5eb5cb7e45350c5f8658bb55604e739e Mon Sep 17 00:00:00 2001 From: Gao Xiang Date: Tue, 17 Jun 2025 13:40:56 +0800 Subject: [PATCH 1554/2211] erofs: remove unused trace event erofs_destroy_inode commit 30b58444807c93bffeaba7d776110f2a909d2f9a upstream. The trace event `erofs_destroy_inode` was added but remains unused. This unused event contributes approximately 5KB to the kernel module size. Reported-by: Steven Rostedt Closes: https://lore.kernel.org/r/20250612224906.15000244@batman.local.home Fixes: 13f06f48f7bf ("staging: erofs: support tracepoint") Cc: stable@vger.kernel.org Reviewed-by: Hongbo Li Signed-off-by: Gao Xiang Link: https://lore.kernel.org/r/20250617054056.3232365-1-hsiangkao@linux.alibaba.com Signed-off-by: Greg Kroah-Hartman --- include/trace/events/erofs.h | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/include/trace/events/erofs.h b/include/trace/events/erofs.h index 57df3843e650c..ad79f1ca4fb5a 100644 --- a/include/trace/events/erofs.h +++ b/include/trace/events/erofs.h @@ -211,24 +211,6 @@ TRACE_EVENT(erofs_map_blocks_exit, show_mflags(__entry->mflags), __entry->ret) ); -TRACE_EVENT(erofs_destroy_inode, - TP_PROTO(struct inode *inode), - - TP_ARGS(inode), - - TP_STRUCT__entry( - __field( dev_t, dev ) - __field( erofs_nid_t, nid ) - ), - - TP_fast_assign( - __entry->dev = inode->i_sb->s_dev; - __entry->nid = EROFS_I(inode)->nid; - ), - - TP_printk("dev = (%d,%d), nid = %llu", show_dev_nid(__entry)) -); - #endif /* _TRACE_EROFS_H */ /* This part must be outside protection */ -- GitLab From 0174154fafaf2354a72b981c810e26ebd40be6a9 Mon Sep 17 00:00:00 2001 From: Jeff Layton Date: Tue, 27 May 2025 20:12:47 -0400 Subject: [PATCH 1555/2211] nfsd: use threads array as-is in netlink interface commit 8ea688a3372e8369dc04395b39b4e71a6d91d4d5 upstream. The old nfsdfs interface for starting a server with multiple pools handles the special case of a single entry array passed down from userland by distributing the threads over every NUMA node. The netlink control interface however constructs an array of length nfsd_nrpools() and fills any unprovided slots with 0's. This behavior defeats the special casing that the old interface relies on. Change nfsd_nl_threads_set_doit() to pass down the array from userland as-is. Fixes: 7f5c330b2620 ("nfsd: allow passing in array of thread counts via netlink") Cc: stable@vger.kernel.org Reported-by: Mike Snitzer Closes: https://lore.kernel.org/linux-nfs/aDC-ftnzhJAlwqwh@kernel.org/ Signed-off-by: Jeff Layton Reviewed-by: Simon Horman Tested-by: Mike Snitzer Signed-off-by: Chuck Lever Signed-off-by: Greg Kroah-Hartman --- fs/nfsd/nfsctl.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 1ce208ca9a722..dcaa31706394c 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -1653,7 +1653,7 @@ out_unlock: */ int nfsd_nl_threads_set_doit(struct sk_buff *skb, struct genl_info *info) { - int *nthreads, count = 0, nrpools, i, ret = -EOPNOTSUPP, rem; + int *nthreads, nrpools = 0, i, ret = -EOPNOTSUPP, rem; struct net *net = genl_info_net(info); struct nfsd_net *nn = net_generic(net, nfsd_net_id); const struct nlattr *attr; @@ -1665,12 +1665,11 @@ int nfsd_nl_threads_set_doit(struct sk_buff *skb, struct genl_info *info) /* count number of SERVER_THREADS values */ nlmsg_for_each_attr(attr, info->nlhdr, GENL_HDRLEN, rem) { if (nla_type(attr) == NFSD_A_SERVER_THREADS) - count++; + nrpools++; } mutex_lock(&nfsd_mutex); - nrpools = max(count, nfsd_nrpools(net)); nthreads = kcalloc(nrpools, sizeof(int), GFP_KERNEL); if (!nthreads) { ret = -ENOMEM; -- GitLab From 353e75b55e583635bf71cde6abcec274dba05edd Mon Sep 17 00:00:00 2001 From: Jeff Layton Date: Thu, 19 Jun 2025 06:01:55 -0400 Subject: [PATCH 1556/2211] sunrpc: handle SVC_GARBAGE during svc auth processing as auth error commit 94d10a4dba0bc482f2b01e39f06d5513d0f75742 upstream. tianshuo han reported a remotely-triggerable crash if the client sends a kernel RPC server a specially crafted packet. If decoding the RPC reply fails in such a way that SVC_GARBAGE is returned without setting the rq_accept_statp pointer, then that pointer can be dereferenced and a value stored there. If it's the first time the thread has processed an RPC, then that pointer will be set to NULL and the kernel will crash. In other cases, it could create a memory scribble. The server sunrpc code treats a SVC_GARBAGE return from svc_authenticate or pg_authenticate as if it should send a GARBAGE_ARGS reply. RFC 5531 says that if authentication fails that the RPC should be rejected instead with a status of AUTH_ERR. Handle a SVC_GARBAGE return as an AUTH_ERROR, with a reason of AUTH_BADCRED instead of returning GARBAGE_ARGS in that case. This sidesteps the whole problem of touching the rpc_accept_statp pointer in this situation and avoids the crash. Cc: stable@kernel.org Fixes: 29cd2927fb91 ("SUNRPC: Fix encoding of accepted but unsuccessful RPC replies") Reported-by: tianshuo han Reviewed-by: Chuck Lever Signed-off-by: Jeff Layton Signed-off-by: Chuck Lever Signed-off-by: Greg Kroah-Hartman --- net/sunrpc/svc.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index 79879b7d39cb4..46a95877d2deb 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c @@ -1369,7 +1369,8 @@ svc_process_common(struct svc_rqst *rqstp) case SVC_OK: break; case SVC_GARBAGE: - goto err_garbage_args; + rqstp->rq_auth_stat = rpc_autherr_badcred; + goto err_bad_auth; case SVC_SYSERR: goto err_system_err; case SVC_DENIED: @@ -1510,14 +1511,6 @@ err_bad_proc: *rqstp->rq_accept_statp = rpc_proc_unavail; goto sendit; -err_garbage_args: - svc_printk(rqstp, "failed to decode RPC header\n"); - - if (serv->sv_stats) - serv->sv_stats->rpcbadfmt++; - *rqstp->rq_accept_statp = rpc_garbage_args; - goto sendit; - err_system_err: if (serv->sv_stats) serv->sv_stats->rpcbadfmt++; -- GitLab From c886784000934d5486621106da0614c85bcd76a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ADra=20Canal?= Date: Mon, 2 Jun 2025 12:14:02 -0300 Subject: [PATCH 1557/2211] drm/v3d: Avoid NULL pointer dereference in `v3d_job_update_stats()` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit e1bc3a13bd775791cca0bb144d977b00f3598042 upstream. The following kernel Oops was recently reported by Mesa CI: [ 800.139824] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000588 [ 800.148619] Mem abort info: [ 800.151402] ESR = 0x0000000096000005 [ 800.155141] EC = 0x25: DABT (current EL), IL = 32 bits [ 800.160444] SET = 0, FnV = 0 [ 800.163488] EA = 0, S1PTW = 0 [ 800.166619] FSC = 0x05: level 1 translation fault [ 800.171487] Data abort info: [ 800.174357] ISV = 0, ISS = 0x00000005, ISS2 = 0x00000000 [ 800.179832] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 [ 800.184873] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 [ 800.190176] user pgtable: 4k pages, 39-bit VAs, pgdp=00000001014c2000 [ 800.196607] [0000000000000588] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000 [ 800.205305] Internal error: Oops: 0000000096000005 [#1] PREEMPT SMP [ 800.211564] Modules linked in: vc4 snd_soc_hdmi_codec drm_display_helper v3d cec gpu_sched drm_dma_helper drm_shmem_helper drm_kms_helper drm drm_panel_orientation_quirks snd_soc_core snd_compress snd_pcm_dmaengine snd_pcm i2c_brcmstb snd_timer snd backlight [ 800.234448] CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 6.12.25+rpt-rpi-v8 #1 Debian 1:6.12.25-1+rpt1 [ 800.244182] Hardware name: Raspberry Pi 4 Model B Rev 1.4 (DT) [ 800.250005] pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 800.256959] pc : v3d_job_update_stats+0x60/0x130 [v3d] [ 800.262112] lr : v3d_job_update_stats+0x48/0x130 [v3d] [ 800.267251] sp : ffffffc080003e60 [ 800.270555] x29: ffffffc080003e60 x28: ffffffd842784980 x27: 0224012000000000 [ 800.277687] x26: ffffffd84277f630 x25: ffffff81012fd800 x24: 0000000000000020 [ 800.284818] x23: ffffff8040238b08 x22: 0000000000000570 x21: 0000000000000158 [ 800.291948] x20: 0000000000000000 x19: ffffff8040238000 x18: 0000000000000000 [ 800.299078] x17: ffffffa8c1bd2000 x16: ffffffc080000000 x15: 0000000000000000 [ 800.306208] x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 [ 800.313338] x11: 0000000000000040 x10: 0000000000001a40 x9 : ffffffd83b39757c [ 800.320468] x8 : ffffffd842786420 x7 : 7fffffffffffffff x6 : 0000000000ef32b0 [ 800.327598] x5 : 00ffffffffffffff x4 : 0000000000000015 x3 : ffffffd842784980 [ 800.334728] x2 : 0000000000000004 x1 : 0000000000010002 x0 : 000000ba4c0ca382 [ 800.341859] Call trace: [ 800.344294] v3d_job_update_stats+0x60/0x130 [v3d] [ 800.349086] v3d_irq+0x124/0x2e0 [v3d] [ 800.352835] __handle_irq_event_percpu+0x58/0x218 [ 800.357539] handle_irq_event+0x54/0xb8 [ 800.361369] handle_fasteoi_irq+0xac/0x240 [ 800.365458] handle_irq_desc+0x48/0x68 [ 800.369200] generic_handle_domain_irq+0x24/0x38 [ 800.373810] gic_handle_irq+0x48/0xd8 [ 800.377464] call_on_irq_stack+0x24/0x58 [ 800.381379] do_interrupt_handler+0x88/0x98 [ 800.385554] el1_interrupt+0x34/0x68 [ 800.389123] el1h_64_irq_handler+0x18/0x28 [ 800.393211] el1h_64_irq+0x64/0x68 [ 800.396603] default_idle_call+0x3c/0x168 [ 800.400606] do_idle+0x1fc/0x230 [ 800.403827] cpu_startup_entry+0x40/0x50 [ 800.407742] rest_init+0xe4/0xf0 [ 800.410962] start_kernel+0x5e8/0x790 [ 800.414616] __primary_switched+0x80/0x90 [ 800.418622] Code: 8b170277 8b160296 11000421 b9000861 (b9401ac1) [ 800.424707] ---[ end trace 0000000000000000 ]--- [ 800.457313] ---[ end Kernel panic - not syncing: Oops: Fatal exception in interrupt ]--- This issue happens when the file descriptor is closed before the jobs submitted by it are completed. When the job completes, we update the global GPU stats and the per-fd GPU stats, which are exposed through fdinfo. If the file descriptor was closed, then the struct `v3d_file_priv` and its stats were already freed and we can't update the per-fd stats. Therefore, if the file descriptor was already closed, don't update the per-fd GPU stats, only update the global ones. Cc: stable@vger.kernel.org # v6.12+ Reviewed-by: Jose Maria Casanova Crespo Link: https://lore.kernel.org/r/20250602151451.10161-1-mcanal@igalia.com Signed-off-by: Maíra Canal Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/v3d/v3d_sched.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/v3d/v3d_sched.c b/drivers/gpu/drm/v3d/v3d_sched.c index ad32e584deeec..c9c88d3ad6698 100644 --- a/drivers/gpu/drm/v3d/v3d_sched.c +++ b/drivers/gpu/drm/v3d/v3d_sched.c @@ -191,7 +191,6 @@ v3d_job_update_stats(struct v3d_job *job, enum v3d_queue queue) struct v3d_dev *v3d = job->v3d; struct v3d_file_priv *file = job->file->driver_priv; struct v3d_stats *global_stats = &v3d->queue[queue].stats; - struct v3d_stats *local_stats = &file->stats[queue]; u64 now = local_clock(); unsigned long flags; @@ -201,7 +200,12 @@ v3d_job_update_stats(struct v3d_job *job, enum v3d_queue queue) else preempt_disable(); - v3d_stats_update(local_stats, now); + /* Don't update the local stats if the file context has already closed */ + if (file) + v3d_stats_update(&file->stats[queue], now); + else + drm_dbg(&v3d->drm, "The file descriptor was closed before job completion\n"); + v3d_stats_update(global_stats, now); if (IS_ENABLED(CONFIG_LOCKDEP)) -- GitLab From b8abcba6e4aec53868dfe44f97270fc4dee0df2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Gonz=C3=A1lez=20Collado?= Date: Sun, 2 Mar 2025 23:15:18 +0100 Subject: [PATCH 1558/2211] Kunit to check the longest symbol length MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit c104c16073b7fdb3e4eae18f66f4009f6b073d6f upstream. The longest length of a symbol (KSYM_NAME_LEN) was increased to 512 in the reference [1]. This patch adds kunit test suite to check the longest symbol length. These tests verify that the longest symbol length defined is supported. This test can also help other efforts for longer symbol length, like [2]. The test suite defines one symbol with the longest possible length. The first test verify that functions with names of the created symbol, can be called or not. The second test, verify that the symbols are created (or not) in the kernel symbol table. [1] https://lore.kernel.org/lkml/20220802015052.10452-6-ojeda@kernel.org/ [2] https://lore.kernel.org/lkml/20240605032120.3179157-1-song@kernel.org/ Link: https://lore.kernel.org/r/20250302221518.76874-1-sergio.collado@gmail.com Tested-by: Martin Rodriguez Reboredo Reviewed-by: Shuah Khan Reviewed-by: Rae Moar Signed-off-by: Sergio González Collado Link: https://github.com/Rust-for-Linux/linux/issues/504 Reviewed-by: Rae Moar Acked-by: David Gow Signed-off-by: Shuah Khan Signed-off-by: Greg Kroah-Hartman --- arch/x86/tools/insn_decoder_test.c | 3 +- lib/Kconfig.debug | 9 ++++ lib/Makefile | 2 + lib/longest_symbol_kunit.c | 82 ++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 lib/longest_symbol_kunit.c diff --git a/arch/x86/tools/insn_decoder_test.c b/arch/x86/tools/insn_decoder_test.c index 472540aeabc23..6c2986d2ad117 100644 --- a/arch/x86/tools/insn_decoder_test.c +++ b/arch/x86/tools/insn_decoder_test.c @@ -10,6 +10,7 @@ #include #include #include +#include #define unlikely(cond) (cond) @@ -106,7 +107,7 @@ static void parse_args(int argc, char **argv) } } -#define BUFSIZE 256 +#define BUFSIZE (256 + KSYM_NAME_LEN) int main(int argc, char **argv) { diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index e48375fe5a50c..b1d7c427bbe3d 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -2807,6 +2807,15 @@ config FORTIFY_KUNIT_TEST by the str*() and mem*() family of functions. For testing runtime traps of FORTIFY_SOURCE, see LKDTM's "FORTIFY_*" tests. +config LONGEST_SYM_KUNIT_TEST + tristate "Test the longest symbol possible" if !KUNIT_ALL_TESTS + depends on KUNIT && KPROBES + default KUNIT_ALL_TESTS + help + Tests the longest symbol possible + + If unsure, say N. + config HW_BREAKPOINT_KUNIT_TEST bool "Test hw_breakpoint constraints accounting" if !KUNIT_ALL_TESTS depends on HAVE_HW_BREAKPOINT diff --git a/lib/Makefile b/lib/Makefile index 773adf88af416..fc878e716825d 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -389,6 +389,8 @@ CFLAGS_fortify_kunit.o += $(DISABLE_STRUCTLEAK_PLUGIN) obj-$(CONFIG_FORTIFY_KUNIT_TEST) += fortify_kunit.o obj-$(CONFIG_SIPHASH_KUNIT_TEST) += siphash_kunit.o obj-$(CONFIG_USERCOPY_KUNIT_TEST) += usercopy_kunit.o +obj-$(CONFIG_LONGEST_SYM_KUNIT_TEST) += longest_symbol_kunit.o +CFLAGS_longest_symbol_kunit.o += $(call cc-disable-warning, missing-prototypes) obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o diff --git a/lib/longest_symbol_kunit.c b/lib/longest_symbol_kunit.c new file mode 100644 index 0000000000000..e3c28ff1807f0 --- /dev/null +++ b/lib/longest_symbol_kunit.c @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Test the longest symbol length. Execute with: + * ./tools/testing/kunit/kunit.py run longest-symbol + * --arch=x86_64 --kconfig_add CONFIG_KPROBES=y --kconfig_add CONFIG_MODULES=y + * --kconfig_add CONFIG_RETPOLINE=n --kconfig_add CONFIG_CFI_CLANG=n + * --kconfig_add CONFIG_MITIGATION_RETPOLINE=n + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include + +#define DI(name) s##name##name +#define DDI(name) DI(n##name##name) +#define DDDI(name) DDI(n##name##name) +#define DDDDI(name) DDDI(n##name##name) +#define DDDDDI(name) DDDDI(n##name##name) + +/*Generate a symbol whose name length is 511 */ +#define LONGEST_SYM_NAME DDDDDI(g1h2i3j4k5l6m7n) + +#define RETURN_LONGEST_SYM 0xAAAAA + +noinline int LONGEST_SYM_NAME(void); +noinline int LONGEST_SYM_NAME(void) +{ + return RETURN_LONGEST_SYM; +} + +_Static_assert(sizeof(__stringify(LONGEST_SYM_NAME)) == KSYM_NAME_LEN, +"Incorrect symbol length found. Expected KSYM_NAME_LEN: " +__stringify(KSYM_NAME_LEN) ", but found: " +__stringify(sizeof(LONGEST_SYM_NAME))); + +static void test_longest_symbol(struct kunit *test) +{ + KUNIT_EXPECT_EQ(test, RETURN_LONGEST_SYM, LONGEST_SYM_NAME()); +}; + +static void test_longest_symbol_kallsyms(struct kunit *test) +{ + unsigned long (*kallsyms_lookup_name)(const char *name); + static int (*longest_sym)(void); + + struct kprobe kp = { + .symbol_name = "kallsyms_lookup_name", + }; + + if (register_kprobe(&kp) < 0) { + pr_info("%s: kprobe not registered", __func__); + KUNIT_FAIL(test, "test_longest_symbol kallsyms: kprobe not registered\n"); + return; + } + + kunit_warn(test, "test_longest_symbol kallsyms: kprobe registered\n"); + kallsyms_lookup_name = (unsigned long (*)(const char *name))kp.addr; + unregister_kprobe(&kp); + + longest_sym = + (void *) kallsyms_lookup_name(__stringify(LONGEST_SYM_NAME)); + KUNIT_EXPECT_EQ(test, RETURN_LONGEST_SYM, longest_sym()); +}; + +static struct kunit_case longest_symbol_test_cases[] = { + KUNIT_CASE(test_longest_symbol), + KUNIT_CASE(test_longest_symbol_kallsyms), + {} +}; + +static struct kunit_suite longest_symbol_test_suite = { + .name = "longest-symbol", + .test_cases = longest_symbol_test_cases, +}; +kunit_test_suite(longest_symbol_test_suite); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Test the longest symbol length"); +MODULE_AUTHOR("Sergio González Collado"); -- GitLab From c426f8c4ac47e472312dcd86fef38422c8d74033 Mon Sep 17 00:00:00 2001 From: Nathan Chancellor Date: Tue, 18 Mar 2025 15:32:30 -0700 Subject: [PATCH 1559/2211] x86/tools: Drop duplicate unlikely() definition in insn_decoder_test.c commit f710202b2a45addea3dcdcd862770ecbaf6597ef upstream. After commit c104c16073b7 ("Kunit to check the longest symbol length"), there is a warning when building with clang because there is now a definition of unlikely from compiler.h in tools/include/linux, which conflicts with the one in the instruction decoder selftest: arch/x86/tools/insn_decoder_test.c:15:9: warning: 'unlikely' macro redefined [-Wmacro-redefined] Remove the second unlikely() definition, as it is no longer necessary, clearing up the warning. Fixes: c104c16073b7 ("Kunit to check the longest symbol length") Signed-off-by: Nathan Chancellor Signed-off-by: Ingo Molnar Acked-by: Shuah Khan Link: https://lore.kernel.org/r/20250318-x86-decoder-test-fix-unlikely-redef-v1-1-74c84a7bf05b@kernel.org Signed-off-by: Greg Kroah-Hartman --- arch/x86/tools/insn_decoder_test.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/arch/x86/tools/insn_decoder_test.c b/arch/x86/tools/insn_decoder_test.c index 6c2986d2ad117..08cd913cbd4e9 100644 --- a/arch/x86/tools/insn_decoder_test.c +++ b/arch/x86/tools/insn_decoder_test.c @@ -12,8 +12,6 @@ #include #include -#define unlikely(cond) (cond) - #include #include #include -- GitLab From 348e541fef1d4eab1eeeab55b6d6aa68953ccccf Mon Sep 17 00:00:00 2001 From: Willem de Bruijn Date: Thu, 6 Mar 2025 22:34:08 -0500 Subject: [PATCH 1560/2211] ipv6: remove leftover ip6 cookie initializer commit 54580ccdd8a9c6821fd6f72171d435480867e4c3 upstream. As of the blamed commit ipc6.dontfrag is always initialized at the start of udpv6_sendmsg, by ipcm6_init_sk, to either 0 or 1. Later checks against -1 are no longer needed and the branches are now dead code. The blamed commit had removed those branches. But I had overlooked this one case. UDP has both a lockless fast path and a slower path for corked requests. This branch remained in the fast path. Fixes: 096208592b09 ("ipv6: replace ipcm6_init calls with ipcm6_init_sk") Signed-off-by: Willem de Bruijn Reviewed-by: Eric Dumazet Link: https://patch.msgid.link/20250307033620.411611-2-willemdebruijn.kernel@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- net/ipv6/ip6_output.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 89a61e040e6a1..f0e5431c2d46f 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -2043,8 +2043,6 @@ struct sk_buff *ip6_make_skb(struct sock *sk, ip6_cork_release(cork, &v6_cork); return ERR_PTR(err); } - if (ipc6->dontfrag < 0) - ipc6->dontfrag = inet6_test_bit(DONTFRAG, sk); err = __ip6_append_data(sk, &queue, cork, &v6_cork, ¤t->task_frag, getfrag, from, -- GitLab From 3c44ebad5aed3c64c7421908f7ee7c82dac6bc6d Mon Sep 17 00:00:00 2001 From: Willem de Bruijn Date: Fri, 14 Feb 2025 17:27:03 -0500 Subject: [PATCH 1561/2211] ipv6: replace ipcm6_init calls with ipcm6_init_sk commit 096208592b09c2f5fc0c1a174694efa41c04209d upstream. This initializes tclass and dontfrag before cmsg parsing, removing the need for explicit checks against -1 in each caller. Leave hlimit set to -1, because its full initialization (in ip6_sk_dst_hoplimit) requires more state (dst, flowi6, ..). This also prepares for calling sockcm_init in a follow-on patch. Signed-off-by: Willem de Bruijn Reviewed-by: David Ahern Link: https://patch.msgid.link/20250214222720.3205500-7-willemdebruijn.kernel@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- include/net/ipv6.h | 9 --------- net/ipv6/raw.c | 8 +------- net/ipv6/udp.c | 7 +------ net/l2tp/l2tp_ip6.c | 8 +------- 4 files changed, 3 insertions(+), 29 deletions(-) diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 248bfb26e2af9..6d52b5584d2fb 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -363,15 +363,6 @@ struct ipcm6_cookie { struct ipv6_txoptions *opt; }; -static inline void ipcm6_init(struct ipcm6_cookie *ipc6) -{ - *ipc6 = (struct ipcm6_cookie) { - .hlimit = -1, - .tclass = -1, - .dontfrag = -1, - }; -} - static inline void ipcm6_init_sk(struct ipcm6_cookie *ipc6, const struct sock *sk) { diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 608fa9d05b55b..328419e05c815 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -777,7 +777,7 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) fl6.flowi6_mark = READ_ONCE(sk->sk_mark); fl6.flowi6_uid = sk->sk_uid; - ipcm6_init(&ipc6); + ipcm6_init_sk(&ipc6, sk); ipc6.sockc.tsflags = READ_ONCE(sk->sk_tsflags); ipc6.sockc.mark = fl6.flowi6_mark; @@ -890,9 +890,6 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) if (hdrincl) fl6.flowi6_flags |= FLOWI_FLAG_KNOWN_NH; - if (ipc6.tclass < 0) - ipc6.tclass = np->tclass; - fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel); dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); @@ -903,9 +900,6 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) if (ipc6.hlimit < 0) ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst); - if (ipc6.dontfrag < 0) - ipc6.dontfrag = inet6_test_bit(DONTFRAG, sk); - if (msg->msg_flags&MSG_CONFIRM) goto do_confirm; diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 197d0ac47592a..57e38e5e4be92 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -1399,7 +1399,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) int is_udplite = IS_UDPLITE(sk); int (*getfrag)(void *, char *, int, int, int, struct sk_buff *); - ipcm6_init(&ipc6); + ipcm6_init_sk(&ipc6, sk); ipc6.gso_size = READ_ONCE(up->gso_size); ipc6.sockc.tsflags = READ_ONCE(sk->sk_tsflags); ipc6.sockc.mark = READ_ONCE(sk->sk_mark); @@ -1608,9 +1608,6 @@ do_udp_sendmsg: security_sk_classify_flow(sk, flowi6_to_flowi_common(fl6)); - if (ipc6.tclass < 0) - ipc6.tclass = np->tclass; - fl6->flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6->flowlabel); dst = ip6_sk_dst_lookup_flow(sk, fl6, final_p, connected); @@ -1656,8 +1653,6 @@ back_from_confirm: WRITE_ONCE(up->pending, AF_INET6); do_append_data: - if (ipc6.dontfrag < 0) - ipc6.dontfrag = inet6_test_bit(DONTFRAG, sk); up->len += ulen; err = ip6_append_data(sk, getfrag, msg, ulen, sizeof(struct udphdr), &ipc6, fl6, dst_rt6_info(dst), diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c index f4c1da0708269..b98d13584c81f 100644 --- a/net/l2tp/l2tp_ip6.c +++ b/net/l2tp/l2tp_ip6.c @@ -547,7 +547,7 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) fl6.flowi6_mark = READ_ONCE(sk->sk_mark); fl6.flowi6_uid = sk->sk_uid; - ipcm6_init(&ipc6); + ipcm6_init_sk(&ipc6, sk); if (lsa) { if (addr_len < SIN6_LEN_RFC2133) @@ -634,9 +634,6 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6)); - if (ipc6.tclass < 0) - ipc6.tclass = np->tclass; - fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel); dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); @@ -648,9 +645,6 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) if (ipc6.hlimit < 0) ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst); - if (ipc6.dontfrag < 0) - ipc6.dontfrag = inet6_test_bit(DONTFRAG, sk); - if (msg->msg_flags & MSG_CONFIRM) goto do_confirm; -- GitLab From 9411a9909e9dac48b9560a6dbba95048d1895d58 Mon Sep 17 00:00:00 2001 From: Bharath SM Date: Mon, 17 Mar 2025 15:57:27 +0530 Subject: [PATCH 1562/2211] smb: fix secondary channel creation issue with kerberos by populating hostname when adding channels commit 306cb65bb0cb243389fcbd0a66907d5bdea07d1e upstream. When mounting a share with kerberos authentication with multichannel support, share mounts correctly, but fails to create secondary channels. This occurs because the hostname is not populated when adding the channels. The hostname is necessary for the userspace cifs.upcall program to retrieve the required credentials and pass it back to kernel, without hostname secondary channels fails establish. Cc: stable@vger.kernel.org Reviewed-by: Shyam Prasad N Signed-off-by: Bharath SM Reported-by: xfuren Link: https://bugzilla.samba.org/show_bug.cgi?id=15824 Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/sess.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fs/smb/client/sess.c b/fs/smb/client/sess.c index d4f4145802cf2..10d82d0dc6a9e 100644 --- a/fs/smb/client/sess.c +++ b/fs/smb/client/sess.c @@ -526,8 +526,7 @@ cifs_ses_add_channel(struct cifs_ses *ses, ctx->domainauto = ses->domainAuto; ctx->domainname = ses->domainName; - /* no hostname for extra channels */ - ctx->server_hostname = ""; + ctx->server_hostname = ses->server->hostname; ctx->username = ses->user_name; ctx->password = ses->password; -- GitLab From 1bb894c1608cf937f0b258bd3415ba24b499e47f Mon Sep 17 00:00:00 2001 From: "James A. MacInnes" Date: Wed, 12 Feb 2025 15:03:47 -0800 Subject: [PATCH 1563/2211] drm/msm/disp: Correct porch timing for SDM845 [ Upstream commit 146e87f3e11de0dfa091ff87e34b4bc6eec761a4 ] Type-C DisplayPort inoperable due to incorrect porch settings. - Re-used wide_bus_en as flag to prevent porch shifting Fixes: c943b4948b58 ("drm/msm/dp: add displayPort driver support") Signed-off-by: James A. MacInnes Reviewed-by: Dmitry Baryshkov Patchwork: https://patchwork.freedesktop.org/patch/636945/ Link: https://lore.kernel.org/r/20250212-sdm845_dp-v2-2-4954e51458f4@gmail.com Signed-off-by: Dmitry Baryshkov Signed-off-by: Sasha Levin --- .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c index d8a2edebfe8c3..b7699ca89dcc5 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c @@ -94,17 +94,21 @@ static void drm_mode_to_intf_timing_params( timing->vsync_polarity = 0; } - /* for DP/EDP, Shift timings to align it to bottom right */ - if (phys_enc->hw_intf->cap->type == INTF_DP) { + timing->wide_bus_en = dpu_encoder_is_widebus_enabled(phys_enc->parent); + timing->compression_en = dpu_encoder_is_dsc_enabled(phys_enc->parent); + + /* + * For DP/EDP, Shift timings to align it to bottom right. + * wide_bus_en is set for everything excluding SDM845 & + * porch changes cause DisplayPort failure and HDMI tearing. + */ + if (phys_enc->hw_intf->cap->type == INTF_DP && timing->wide_bus_en) { timing->h_back_porch += timing->h_front_porch; timing->h_front_porch = 0; timing->v_back_porch += timing->v_front_porch; timing->v_front_porch = 0; } - timing->wide_bus_en = dpu_encoder_is_widebus_enabled(phys_enc->parent); - timing->compression_en = dpu_encoder_is_dsc_enabled(phys_enc->parent); - /* * for DP, divide the horizonal parameters by 2 when * widebus is enabled -- GitLab From 64fe4cd99515dc44a3349f974e77a28328f888a8 Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Tue, 20 May 2025 13:13:26 +0200 Subject: [PATCH 1564/2211] drm/msm/dsi/dsi_phy_10nm: Fix missing initial VCO rate [ Upstream commit 8a48e35becb214743214f5504e726c3ec131cd6d ] Driver unconditionally saves current state on first init in dsi_pll_10nm_init(), but does not save the VCO rate, only some of the divider registers. The state is then restored during probe/enable via msm_dsi_phy_enable() -> msm_dsi_phy_pll_restore_state() -> dsi_10nm_pll_restore_state(). Restoring calls dsi_pll_10nm_vco_set_rate() with pll_10nm->vco_current_rate=0, which basically overwrites existing rate of VCO and messes with clock hierarchy, by setting frequency to 0 to clock tree. This makes anyway little sense - VCO rate was not saved, so should not be restored. If PLL was not configured configure it to minimum rate to avoid glitches and configuring entire in clock hierarchy to 0 Hz. Suggested-by: Dmitry Baryshkov Link: https://lore.kernel.org/r/sz4kbwy5nwsebgf64ia7uq4ee7wbsa5uy3xmlqwcstsbntzcov@ew3dcyjdzmi2/ Signed-off-by: Krzysztof Kozlowski Fixes: a4ccc37693a2 ("drm/msm/dsi_pll_10nm: restore VCO rate during Reviewed-by: Dmitry Baryshkov Patchwork: https://patchwork.freedesktop.org/patch/654796/ Link: https://lore.kernel.org/r/20250520111325.92352-2-krzysztof.kozlowski@linaro.org Signed-off-by: Dmitry Baryshkov Signed-off-by: Sasha Levin --- drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c index 677c625718119..28cc550e22a88 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c @@ -703,6 +703,13 @@ static int dsi_pll_10nm_init(struct msm_dsi_phy *phy) /* TODO: Remove this when we have proper display handover support */ msm_dsi_phy_pll_save_state(phy); + /* + * Store also proper vco_current_rate, because its value will be used in + * dsi_10nm_pll_restore_state(). + */ + if (!dsi_pll_10nm_vco_recalc_rate(&pll_10nm->clk_hw, VCO_REF_CLK_RATE)) + pll_10nm->vco_current_rate = pll_10nm->phy->cfg->min_pll_rate; + return 0; } -- GitLab From 0c76d70fc3fd5257867023ff940feb9721fa7c72 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Tue, 20 May 2025 18:28:05 -0400 Subject: [PATCH 1565/2211] drm/msm: Fix CP_RESET_CONTEXT_STATE bitfield names [ Upstream commit b1c9e797ad37d188675505b66a3a4bbeea5d9560 ] Based on kgsl. Fixes: af66706accdf ("drm/msm/a6xx: Add skeleton A7xx support") Signed-off-by: Connor Abbott Patchwork: https://patchwork.freedesktop.org/patch/654922/ Signed-off-by: Rob Clark Signed-off-by: Sasha Levin --- drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml b/drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml index c6cdc5c003dc0..2ca0ad6efc96e 100644 --- a/drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml +++ b/drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml @@ -2260,7 +2260,8 @@ opcode: CP_LOAD_STATE4 (30) (4 dwords) - + + -- GitLab From 8a1f52651dd8203695d293c6824d8f6c067877d1 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Tue, 20 May 2025 18:28:06 -0400 Subject: [PATCH 1566/2211] drm/msm/a7xx: Call CP_RESET_CONTEXT_STATE [ Upstream commit 2b520c6104f34e3a548525173c38ebca4402cac3 ] Calling this packet is necessary when we switch contexts because there are various pieces of state used by userspace to synchronize between BR and BV that are persistent across submits and we need to make sure that they are in a "safe" state when switching contexts. Otherwise a userspace submission in one context could cause another context to function incorrectly and hang, effectively a denial of service (although without leaking data). This was missed during initial a7xx bringup. Fixes: af66706accdf ("drm/msm/a6xx: Add skeleton A7xx support") Signed-off-by: Connor Abbott Patchwork: https://patchwork.freedesktop.org/patch/654924/ Signed-off-by: Rob Clark Signed-off-by: Sasha Levin --- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c index d2189441aa38a..80c78aff96433 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c @@ -123,6 +123,20 @@ static void a6xx_set_pagetable(struct a6xx_gpu *a6xx_gpu, OUT_RING(ring, lower_32_bits(rbmemptr(ring, fence))); OUT_RING(ring, upper_32_bits(rbmemptr(ring, fence))); OUT_RING(ring, submit->seqno - 1); + + OUT_PKT7(ring, CP_THREAD_CONTROL, 1); + OUT_RING(ring, CP_SET_THREAD_BOTH); + + /* Reset state used to synchronize BR and BV */ + OUT_PKT7(ring, CP_RESET_CONTEXT_STATE, 1); + OUT_RING(ring, + CP_RESET_CONTEXT_STATE_0_CLEAR_ON_CHIP_TS | + CP_RESET_CONTEXT_STATE_0_CLEAR_RESOURCE_TABLE | + CP_RESET_CONTEXT_STATE_0_CLEAR_BV_BR_COUNTER | + CP_RESET_CONTEXT_STATE_0_RESET_GLOBAL_LOCAL_TS); + + OUT_PKT7(ring, CP_THREAD_CONTROL, 1); + OUT_RING(ring, CP_SET_THREAD_BR); } if (!sysprof) { -- GitLab From 9216ca340bf6c04165c39b801025d585dc49e5a9 Mon Sep 17 00:00:00 2001 From: John Keeping Date: Wed, 11 Jun 2025 12:13:06 +0100 Subject: [PATCH 1567/2211] drm/ssd130x: fix ssd132x_clear_screen() columns [ Upstream commit e479da4054875c4cc53a7fb956ebff03d2dac939 ] The number of columns relates to the width, not the height. Use the correct variable. Signed-off-by: John Keeping Reviewed-by: Javier Martinez Canillas Fixes: fdd591e00a9c ("drm/ssd130x: Add support for the SSD132x OLED controller family") Link: https://lore.kernel.org/r/20250611111307.1814876-1-jkeeping@inmusicbrands.com Signed-off-by: Javier Martinez Canillas Signed-off-by: Sasha Levin --- drivers/gpu/drm/solomon/ssd130x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/solomon/ssd130x.c b/drivers/gpu/drm/solomon/ssd130x.c index 06f5057690bd8..e0fc12d514d76 100644 --- a/drivers/gpu/drm/solomon/ssd130x.c +++ b/drivers/gpu/drm/solomon/ssd130x.c @@ -974,7 +974,7 @@ static void ssd130x_clear_screen(struct ssd130x_device *ssd130x, u8 *data_array) static void ssd132x_clear_screen(struct ssd130x_device *ssd130x, u8 *data_array) { - unsigned int columns = DIV_ROUND_UP(ssd130x->height, SSD132X_SEGMENT_WIDTH); + unsigned int columns = DIV_ROUND_UP(ssd130x->width, SSD132X_SEGMENT_WIDTH); unsigned int height = ssd130x->height; memset(data_array, 0, columns * height); -- GitLab From 114370b2717b023518f4b06c312f96dbb6fb6521 Mon Sep 17 00:00:00 2001 From: Brett Creeley Date: Mon, 9 Jun 2025 14:28:27 -0700 Subject: [PATCH 1568/2211] ionic: Prevent driver/fw getting out of sync on devcmd(s) [ Upstream commit 5466491c9e3309ed5c7adbb8fad6e93fcc9a8fe9 ] Some stress/negative firmware testing around devcmd(s) returning EAGAIN found that the done bit could get out of sync in the firmware when it wasn't cleared in a retry case. While here, change the type of the local done variable to a bool to match the return type from ionic_dev_cmd_done(). Fixes: ec8ee714736e ("ionic: stretch heartbeat detection") Signed-off-by: Brett Creeley Signed-off-by: Shannon Nelson Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250609212827.53842-1-shannon.nelson@amd.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/pensando/ionic/ionic_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/pensando/ionic/ionic_main.c b/drivers/net/ethernet/pensando/ionic/ionic_main.c index 0f817c3f92d82..533df5993048f 100644 --- a/drivers/net/ethernet/pensando/ionic/ionic_main.c +++ b/drivers/net/ethernet/pensando/ionic/ionic_main.c @@ -515,9 +515,9 @@ static int __ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_seconds, unsigned long start_time; unsigned long max_wait; unsigned long duration; - int done = 0; bool fw_up; int opcode; + bool done; int err; /* Wait for dev cmd to complete, retrying if we get EAGAIN, @@ -525,6 +525,7 @@ static int __ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_seconds, */ max_wait = jiffies + (max_seconds * HZ); try_again: + done = false; opcode = idev->opcode; start_time = jiffies; for (fw_up = ionic_is_fw_running(idev); -- GitLab From 880902675299accd14e41c6532ba6997f4b2b097 Mon Sep 17 00:00:00 2001 From: Jacob Keller Date: Tue, 10 Jun 2025 14:54:51 -0700 Subject: [PATCH 1569/2211] drm/nouveau/bl: increase buffer size to avoid truncate warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 61b2b3737499f1fb361a54a16828db24a8345e85 ] The nouveau_get_backlight_name() function generates a unique name for the backlight interface, appending an id from 1 to 99 for all backlight devices after the first. GCC 15 (and likely other compilers) produce the following -Wformat-truncation warning: nouveau_backlight.c: In function ‘nouveau_backlight_init’: nouveau_backlight.c:56:69: error: ‘%d’ directive output may be truncated writing between 1 and 10 bytes into a region of size 3 [-Werror=format-truncation=] 56 | snprintf(backlight_name, BL_NAME_SIZE, "nv_backlight%d", nb); | ^~ In function ‘nouveau_get_backlight_name’, inlined from ‘nouveau_backlight_init’ at nouveau_backlight.c:351:7: nouveau_backlight.c:56:56: note: directive argument in the range [1, 2147483647] 56 | snprintf(backlight_name, BL_NAME_SIZE, "nv_backlight%d", nb); | ^~~~~~~~~~~~~~~~ nouveau_backlight.c:56:17: note: ‘snprintf’ output between 14 and 23 bytes into a destination of size 15 56 | snprintf(backlight_name, BL_NAME_SIZE, "nv_backlight%d", nb); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The warning started appearing after commit ab244be47a8f ("drm/nouveau: Fix a potential theorical leak in nouveau_get_backlight_name()") This fix for the ida usage removed the explicit value check for ids larger than 99. The compiler is unable to intuit that the ida_alloc_max() limits the returned value range between 0 and 99. Because the compiler can no longer infer that the number ranges from 0 to 99, it thinks that it could use as many as 11 digits (10 + the potential - sign for negative numbers). The warning has gone unfixed for some time, with at least one kernel test robot report. The code breaks W=1 builds, which is especially frustrating with the introduction of CONFIG_WERROR. The string is stored temporarily on the stack and then copied into the device name. Its not a big deal to use 11 more bytes of stack rounding out to an even 24 bytes. Increase BL_NAME_SIZE to 24 to avoid the truncation warning. This fixes the W=1 builds that include this driver. Compile tested only. Fixes: ab244be47a8f ("drm/nouveau: Fix a potential theorical leak in nouveau_get_backlight_name()") Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202312050324.0kv4PnfZ-lkp@intel.com/ Suggested-by: Timur Tabi Signed-off-by: Jacob Keller Link: https://lore.kernel.org/r/20250610-jk-nouveua-drm-bl-snprintf-fix-v2-1-7fdd4b84b48e@intel.com Signed-off-by: Danilo Krummrich Signed-off-by: Sasha Levin --- drivers/gpu/drm/nouveau/nouveau_backlight.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c index d47442125fa18..9aae26eb7d8fb 100644 --- a/drivers/gpu/drm/nouveau/nouveau_backlight.c +++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c @@ -42,7 +42,7 @@ #include "nouveau_acpi.h" static struct ida bl_ida; -#define BL_NAME_SIZE 15 // 12 for name + 2 for digits + 1 for '\0' +#define BL_NAME_SIZE 24 // 12 for name + 11 for digits + 1 for '\0' static bool nouveau_get_backlight_name(char backlight_name[BL_NAME_SIZE], -- GitLab From fcc95344aa1c419d54f46c19011219363f05c593 Mon Sep 17 00:00:00 2001 From: Tzung-Bi Shih Date: Thu, 12 Jun 2025 08:30:23 +0000 Subject: [PATCH 1570/2211] drm/i915/pmu: Fix build error with GCOV and AutoFDO enabled [ Upstream commit a7137b1825b535eb7258b25beeb0d5425e0037d2 ] i915_pmu.c may fail to build with GCOV and AutoFDO enabled. ../drivers/gpu/drm/i915/i915_pmu.c:116:3: error: call to '__compiletime_assert_487' declared with 'error' attribute: BUILD_BUG_ON failed: bit > BITS_PER_TYPE(typeof_member(struct i915_pmu, enable)) - 1 116 | BUILD_BUG_ON(bit > | ^ Here is a way to reproduce the issue: $ git checkout v6.15 $ mkdir build $ ./scripts/kconfig/merge_config.sh -O build -n -m <(cat < Signed-off-by: Tzung-Bi Shih Signed-off-by: Tvrtko Ursulin Link: https://lore.kernel.org/r/20250612083023.562585-1-tzungbi@kernel.org (cherry picked from commit 686d773186bf72b739bab7e12eb8665d914676ee) Signed-off-by: Joonas Lahtinen Signed-off-by: Sasha Levin --- drivers/gpu/drm/i915/i915_pmu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c index 21eb0c5b320d5..c43223916a1b1 100644 --- a/drivers/gpu/drm/i915/i915_pmu.c +++ b/drivers/gpu/drm/i915/i915_pmu.c @@ -115,7 +115,7 @@ static u32 config_mask(const u64 config) { unsigned int bit = config_bit(config); - if (__builtin_constant_p(config)) + if (__builtin_constant_p(bit)) BUILD_BUG_ON(bit > BITS_PER_TYPE(typeof_member(struct i915_pmu, enable)) - 1); @@ -124,7 +124,7 @@ static u32 config_mask(const u64 config) BITS_PER_TYPE(typeof_member(struct i915_pmu, enable)) - 1); - return BIT(config_bit(config)); + return BIT(bit); } static bool is_engine_event(struct perf_event *event) -- GitLab From bf41b962bd0e2659f741f82d404dbd165f3f5e3f Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Tue, 10 Jun 2025 11:23:06 +0200 Subject: [PATCH 1571/2211] hwmon: (occ) Rework attribute registration for stack usage [ Upstream commit 744c2fe950e936c4d62430de899d6253424200ed ] clang produces an output with excessive stack usage when building the occ_setup_sensor_attrs() function, apparently the result of having a lot of struct literals and building with the -fno-strict-overflow option that leads clang to skip some optimization in case the 'attr' pointer overruns: drivers/hwmon/occ/common.c:775:12: error: stack frame size (1392) exceeds limit (1280) in 'occ_setup_sensor_attrs' [-Werror,-Wframe-larger-than] Replace the custom macros for initializing the attributes with a simpler function call that does not run into this corner case. Link: https://godbolt.org/z/Wf1Yx76a5 Fixes: 54076cb3b5ff ("hwmon (occ): Add sensor attributes and register hwmon device") Signed-off-by: Arnd Bergmann Link: https://lore.kernel.org/r/20250610092315.2640039-1-arnd@kernel.org Signed-off-by: Guenter Roeck Signed-off-by: Sasha Levin --- drivers/hwmon/occ/common.c | 212 +++++++++++++++---------------------- 1 file changed, 85 insertions(+), 127 deletions(-) diff --git a/drivers/hwmon/occ/common.c b/drivers/hwmon/occ/common.c index 9486db249c64f..9029ad53790b1 100644 --- a/drivers/hwmon/occ/common.c +++ b/drivers/hwmon/occ/common.c @@ -747,29 +747,30 @@ static ssize_t occ_show_extended(struct device *dev, } /* - * Some helper macros to make it easier to define an occ_attribute. Since these - * are dynamically allocated, we shouldn't use the existing kernel macros which + * A helper to make it easier to define an occ_attribute. Since these + * are dynamically allocated, we cannot use the existing kernel macros which * stringify the name argument. */ -#define ATTR_OCC(_name, _mode, _show, _store) { \ - .attr = { \ - .name = _name, \ - .mode = VERIFY_OCTAL_PERMISSIONS(_mode), \ - }, \ - .show = _show, \ - .store = _store, \ -} - -#define SENSOR_ATTR_OCC(_name, _mode, _show, _store, _nr, _index) { \ - .dev_attr = ATTR_OCC(_name, _mode, _show, _store), \ - .index = _index, \ - .nr = _nr, \ +static void occ_init_attribute(struct occ_attribute *attr, int mode, + ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf), + ssize_t (*store)(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count), + int nr, int index, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + vsnprintf(attr->name, sizeof(attr->name), fmt, args); + va_end(args); + + attr->sensor.dev_attr.attr.name = attr->name; + attr->sensor.dev_attr.attr.mode = mode; + attr->sensor.dev_attr.show = show; + attr->sensor.dev_attr.store = store; + attr->sensor.index = index; + attr->sensor.nr = nr; } -#define OCC_INIT_ATTR(_name, _mode, _show, _store, _nr, _index) \ - ((struct sensor_device_attribute_2) \ - SENSOR_ATTR_OCC(_name, _mode, _show, _store, _nr, _index)) - /* * Allocate and instatiate sensor_device_attribute_2s. It's most efficient to * use our own instead of the built-in hwmon attribute types. @@ -855,14 +856,15 @@ static int occ_setup_sensor_attrs(struct occ *occ) sensors->extended.num_sensors = 0; } - occ->attrs = devm_kzalloc(dev, sizeof(*occ->attrs) * num_attrs, + occ->attrs = devm_kcalloc(dev, num_attrs, sizeof(*occ->attrs), GFP_KERNEL); if (!occ->attrs) return -ENOMEM; /* null-terminated list */ - occ->group.attrs = devm_kzalloc(dev, sizeof(*occ->group.attrs) * - num_attrs + 1, GFP_KERNEL); + occ->group.attrs = devm_kcalloc(dev, num_attrs + 1, + sizeof(*occ->group.attrs), + GFP_KERNEL); if (!occ->group.attrs) return -ENOMEM; @@ -872,43 +874,33 @@ static int occ_setup_sensor_attrs(struct occ *occ) s = i + 1; temp = ((struct temp_sensor_2 *)sensors->temp.data) + i; - snprintf(attr->name, sizeof(attr->name), "temp%d_label", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_temp, NULL, - 0, i); + occ_init_attribute(attr, 0444, show_temp, NULL, + 0, i, "temp%d_label", s); attr++; if (sensors->temp.version == 2 && temp->fru_type == OCC_FRU_TYPE_VRM) { - snprintf(attr->name, sizeof(attr->name), - "temp%d_alarm", s); + occ_init_attribute(attr, 0444, show_temp, NULL, + 1, i, "temp%d_alarm", s); } else { - snprintf(attr->name, sizeof(attr->name), - "temp%d_input", s); + occ_init_attribute(attr, 0444, show_temp, NULL, + 1, i, "temp%d_input", s); } - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_temp, NULL, - 1, i); attr++; if (sensors->temp.version > 1) { - snprintf(attr->name, sizeof(attr->name), - "temp%d_fru_type", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_temp, NULL, 2, i); + occ_init_attribute(attr, 0444, show_temp, NULL, + 2, i, "temp%d_fru_type", s); attr++; - snprintf(attr->name, sizeof(attr->name), - "temp%d_fault", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_temp, NULL, 3, i); + occ_init_attribute(attr, 0444, show_temp, NULL, + 3, i, "temp%d_fault", s); attr++; if (sensors->temp.version == 0x10) { - snprintf(attr->name, sizeof(attr->name), - "temp%d_max", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_temp, NULL, - 4, i); + occ_init_attribute(attr, 0444, show_temp, NULL, + 4, i, "temp%d_max", s); attr++; } } @@ -917,14 +909,12 @@ static int occ_setup_sensor_attrs(struct occ *occ) for (i = 0; i < sensors->freq.num_sensors; ++i) { s = i + 1; - snprintf(attr->name, sizeof(attr->name), "freq%d_label", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_freq, NULL, - 0, i); + occ_init_attribute(attr, 0444, show_freq, NULL, + 0, i, "freq%d_label", s); attr++; - snprintf(attr->name, sizeof(attr->name), "freq%d_input", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_freq, NULL, - 1, i); + occ_init_attribute(attr, 0444, show_freq, NULL, + 1, i, "freq%d_input", s); attr++; } @@ -940,32 +930,24 @@ static int occ_setup_sensor_attrs(struct occ *occ) s = (i * 4) + 1; for (j = 0; j < 4; ++j) { - snprintf(attr->name, sizeof(attr->name), - "power%d_label", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_power, NULL, - nr++, i); + occ_init_attribute(attr, 0444, show_power, + NULL, nr++, i, + "power%d_label", s); attr++; - snprintf(attr->name, sizeof(attr->name), - "power%d_average", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_power, NULL, - nr++, i); + occ_init_attribute(attr, 0444, show_power, + NULL, nr++, i, + "power%d_average", s); attr++; - snprintf(attr->name, sizeof(attr->name), - "power%d_average_interval", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_power, NULL, - nr++, i); + occ_init_attribute(attr, 0444, show_power, + NULL, nr++, i, + "power%d_average_interval", s); attr++; - snprintf(attr->name, sizeof(attr->name), - "power%d_input", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_power, NULL, - nr++, i); + occ_init_attribute(attr, 0444, show_power, + NULL, nr++, i, + "power%d_input", s); attr++; s++; @@ -977,28 +959,20 @@ static int occ_setup_sensor_attrs(struct occ *occ) for (i = 0; i < sensors->power.num_sensors; ++i) { s = i + 1; - snprintf(attr->name, sizeof(attr->name), - "power%d_label", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_power, NULL, 0, i); + occ_init_attribute(attr, 0444, show_power, NULL, + 0, i, "power%d_label", s); attr++; - snprintf(attr->name, sizeof(attr->name), - "power%d_average", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_power, NULL, 1, i); + occ_init_attribute(attr, 0444, show_power, NULL, + 1, i, "power%d_average", s); attr++; - snprintf(attr->name, sizeof(attr->name), - "power%d_average_interval", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_power, NULL, 2, i); + occ_init_attribute(attr, 0444, show_power, NULL, + 2, i, "power%d_average_interval", s); attr++; - snprintf(attr->name, sizeof(attr->name), - "power%d_input", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_power, NULL, 3, i); + occ_init_attribute(attr, 0444, show_power, NULL, + 3, i, "power%d_input", s); attr++; } @@ -1006,56 +980,43 @@ static int occ_setup_sensor_attrs(struct occ *occ) } if (sensors->caps.num_sensors >= 1) { - snprintf(attr->name, sizeof(attr->name), "power%d_label", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, - 0, 0); + occ_init_attribute(attr, 0444, show_caps, NULL, + 0, 0, "power%d_label", s); attr++; - snprintf(attr->name, sizeof(attr->name), "power%d_cap", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, - 1, 0); + occ_init_attribute(attr, 0444, show_caps, NULL, + 1, 0, "power%d_cap", s); attr++; - snprintf(attr->name, sizeof(attr->name), "power%d_input", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, - 2, 0); + occ_init_attribute(attr, 0444, show_caps, NULL, + 2, 0, "power%d_input", s); attr++; - snprintf(attr->name, sizeof(attr->name), - "power%d_cap_not_redundant", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, - 3, 0); + occ_init_attribute(attr, 0444, show_caps, NULL, + 3, 0, "power%d_cap_not_redundant", s); attr++; - snprintf(attr->name, sizeof(attr->name), "power%d_cap_max", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, - 4, 0); + occ_init_attribute(attr, 0444, show_caps, NULL, + 4, 0, "power%d_cap_max", s); attr++; - snprintf(attr->name, sizeof(attr->name), "power%d_cap_min", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, - 5, 0); + occ_init_attribute(attr, 0444, show_caps, NULL, + 5, 0, "power%d_cap_min", s); attr++; - snprintf(attr->name, sizeof(attr->name), "power%d_cap_user", - s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0644, show_caps, - occ_store_caps_user, 6, 0); + occ_init_attribute(attr, 0644, show_caps, occ_store_caps_user, + 6, 0, "power%d_cap_user", s); attr++; if (sensors->caps.version > 1) { - snprintf(attr->name, sizeof(attr->name), - "power%d_cap_user_source", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_caps, NULL, 7, 0); + occ_init_attribute(attr, 0444, show_caps, NULL, + 7, 0, "power%d_cap_user_source", s); attr++; if (sensors->caps.version > 2) { - snprintf(attr->name, sizeof(attr->name), - "power%d_cap_min_soft", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - show_caps, NULL, - 8, 0); + occ_init_attribute(attr, 0444, show_caps, NULL, + 8, 0, + "power%d_cap_min_soft", s); attr++; } } @@ -1064,19 +1025,16 @@ static int occ_setup_sensor_attrs(struct occ *occ) for (i = 0; i < sensors->extended.num_sensors; ++i) { s = i + 1; - snprintf(attr->name, sizeof(attr->name), "extn%d_label", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - occ_show_extended, NULL, 0, i); + occ_init_attribute(attr, 0444, occ_show_extended, NULL, + 0, i, "extn%d_label", s); attr++; - snprintf(attr->name, sizeof(attr->name), "extn%d_flags", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - occ_show_extended, NULL, 1, i); + occ_init_attribute(attr, 0444, occ_show_extended, NULL, + 1, i, "extn%d_flags", s); attr++; - snprintf(attr->name, sizeof(attr->name), "extn%d_input", s); - attr->sensor = OCC_INIT_ATTR(attr->name, 0444, - occ_show_extended, NULL, 2, i); + occ_init_attribute(attr, 0444, occ_show_extended, NULL, + 2, i, "extn%d_input", s); attr++; } -- GitLab From 6869a79da2791c8769e6db8771652a2de77cad84 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Tue, 10 Jun 2025 11:25:49 +0200 Subject: [PATCH 1572/2211] hwmon: (occ) fix unaligned accesses [ Upstream commit 2c021b45c154958566aad0cae9f74ab26a2d5732 ] Passing a pointer to an unaligned integer as a function argument is undefined behavior: drivers/hwmon/occ/common.c:492:27: warning: taking address of packed member 'accumulator' of class or structure 'power_sensor_2' may result in an unaligned pointer value [-Waddress-of-packed-member] 492 | val = occ_get_powr_avg(&power->accumulator, | ^~~~~~~~~~~~~~~~~~ drivers/hwmon/occ/common.c:493:13: warning: taking address of packed member 'update_tag' of class or structure 'power_sensor_2' may result in an unaligned pointer value [-Waddress-of-packed-member] 493 | &power->update_tag); | ^~~~~~~~~~~~~~~~~ Move the get_unaligned() calls out of the function and pass these through argument registers instead. Fixes: c10e753d43eb ("hwmon (occ): Add sensor types and versions") Signed-off-by: Arnd Bergmann Link: https://lore.kernel.org/r/20250610092553.2641094-1-arnd@kernel.org Signed-off-by: Guenter Roeck Signed-off-by: Sasha Levin --- drivers/hwmon/occ/common.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/drivers/hwmon/occ/common.c b/drivers/hwmon/occ/common.c index 9029ad53790b1..b3694a4209b97 100644 --- a/drivers/hwmon/occ/common.c +++ b/drivers/hwmon/occ/common.c @@ -459,12 +459,10 @@ static ssize_t occ_show_power_1(struct device *dev, return sysfs_emit(buf, "%llu\n", val); } -static u64 occ_get_powr_avg(u64 *accum, u32 *samples) +static u64 occ_get_powr_avg(u64 accum, u32 samples) { - u64 divisor = get_unaligned_be32(samples); - - return (divisor == 0) ? 0 : - div64_u64(get_unaligned_be64(accum) * 1000000ULL, divisor); + return (samples == 0) ? 0 : + mul_u64_u32_div(accum, 1000000UL, samples); } static ssize_t occ_show_power_2(struct device *dev, @@ -489,8 +487,8 @@ static ssize_t occ_show_power_2(struct device *dev, get_unaligned_be32(&power->sensor_id), power->function_id, power->apss_channel); case 1: - val = occ_get_powr_avg(&power->accumulator, - &power->update_tag); + val = occ_get_powr_avg(get_unaligned_be64(&power->accumulator), + get_unaligned_be32(&power->update_tag)); break; case 2: val = (u64)get_unaligned_be32(&power->update_tag) * @@ -527,8 +525,8 @@ static ssize_t occ_show_power_a0(struct device *dev, return sysfs_emit(buf, "%u_system\n", get_unaligned_be32(&power->sensor_id)); case 1: - val = occ_get_powr_avg(&power->system.accumulator, - &power->system.update_tag); + val = occ_get_powr_avg(get_unaligned_be64(&power->system.accumulator), + get_unaligned_be32(&power->system.update_tag)); break; case 2: val = (u64)get_unaligned_be32(&power->system.update_tag) * @@ -541,8 +539,8 @@ static ssize_t occ_show_power_a0(struct device *dev, return sysfs_emit(buf, "%u_proc\n", get_unaligned_be32(&power->sensor_id)); case 5: - val = occ_get_powr_avg(&power->proc.accumulator, - &power->proc.update_tag); + val = occ_get_powr_avg(get_unaligned_be64(&power->proc.accumulator), + get_unaligned_be32(&power->proc.update_tag)); break; case 6: val = (u64)get_unaligned_be32(&power->proc.update_tag) * @@ -555,8 +553,8 @@ static ssize_t occ_show_power_a0(struct device *dev, return sysfs_emit(buf, "%u_vdd\n", get_unaligned_be32(&power->sensor_id)); case 9: - val = occ_get_powr_avg(&power->vdd.accumulator, - &power->vdd.update_tag); + val = occ_get_powr_avg(get_unaligned_be64(&power->vdd.accumulator), + get_unaligned_be32(&power->vdd.update_tag)); break; case 10: val = (u64)get_unaligned_be32(&power->vdd.update_tag) * @@ -569,8 +567,8 @@ static ssize_t occ_show_power_a0(struct device *dev, return sysfs_emit(buf, "%u_vdn\n", get_unaligned_be32(&power->sensor_id)); case 13: - val = occ_get_powr_avg(&power->vdn.accumulator, - &power->vdn.update_tag); + val = occ_get_powr_avg(get_unaligned_be64(&power->vdn.accumulator), + get_unaligned_be32(&power->vdn.update_tag)); break; case 14: val = (u64)get_unaligned_be32(&power->vdn.update_tag) * -- GitLab From fddf0d0d6cc929dc7b8be5f25fce7e7ce0b84cb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20S=C3=A1?= Date: Wed, 11 Jun 2025 17:26:12 +0100 Subject: [PATCH 1573/2211] hwmon: (ltc4282) avoid repeated register write MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit c25892b7a1744355e16281cd24a9b59ec15ec974 ] The fault enabled bits were being mistankenly enabled twice in case the FW property is present. Remove one of the writes. Fixes: cbc29538dbf7 ("hwmon: Add driver for LTC4282") Signed-off-by: Nuno Sá Link: https://lore.kernel.org/r/20250611-fix-ltc4282-repetead-write-v1-1-fe46edd08cf1@analog.com Signed-off-by: Guenter Roeck Signed-off-by: Sasha Levin --- drivers/hwmon/ltc4282.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/drivers/hwmon/ltc4282.c b/drivers/hwmon/ltc4282.c index 4f608a3790fb7..953dfe2bd166c 100644 --- a/drivers/hwmon/ltc4282.c +++ b/drivers/hwmon/ltc4282.c @@ -1511,13 +1511,6 @@ static int ltc4282_setup(struct ltc4282_state *st, struct device *dev) return ret; } - if (device_property_read_bool(dev, "adi,fault-log-enable")) { - ret = regmap_set_bits(st->map, LTC4282_ADC_CTRL, - LTC4282_FAULT_LOG_EN_MASK); - if (ret) - return ret; - } - if (device_property_read_bool(dev, "adi,fault-log-enable")) { ret = regmap_set_bits(st->map, LTC4282_ADC_CTRL, LTC4282_FAULT_LOG_EN_MASK); if (ret) -- GitLab From 35d78d9eb58d56fd15fb8eac9a3f439e57f0534c Mon Sep 17 00:00:00 2001 From: Simon Horman Date: Fri, 13 Jun 2025 17:46:20 +0100 Subject: [PATCH 1574/2211] pldmfw: Select CRC32 when PLDMFW is selected [ Upstream commit 1224b218a4b9203656ecc932152f4c81a97b4fcc ] pldmfw calls crc32 code and depends on it being enabled, else there is a link error as follows. So PLDMFW should select CRC32. lib/pldmfw/pldmfw.o: In function `pldmfw_flash_image': pldmfw.c:(.text+0x70f): undefined reference to `crc32_le_base' This problem was introduced by commit b8265621f488 ("Add pldmfw library for PLDM firmware update"). It manifests as of commit d69ea414c9b4 ("ice: implement device flash update via devlink"). And is more likely to occur as of commit 9ad19171b6d6 ("lib/crc: remove unnecessary prompt for CONFIG_CRC32 and drop 'default y'"). Found by chance while exercising builds based on tinyconfig. Fixes: b8265621f488 ("Add pldmfw library for PLDM firmware update") Signed-off-by: Simon Horman Reviewed-by: Jacob Keller Link: https://patch.msgid.link/20250613-pldmfw-crc32-v1-1-f3fad109eee6@kernel.org Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- lib/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Kconfig b/lib/Kconfig index b38849af6f130..b893c9288c140 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -767,6 +767,7 @@ config GENERIC_LIB_DEVMEM_IS_ALLOWED config PLDMFW bool + select CRC32 default n config ASN1_ENCODER -- GitLab From fa2a79f0da92614c5dc45c8b3d2638681c7734ee Mon Sep 17 00:00:00 2001 From: Justin Sanders Date: Tue, 10 Jun 2025 17:05:59 +0000 Subject: [PATCH 1575/2211] aoe: clean device rq_list in aoedev_downdev() [ Upstream commit 7f90d45e57cb2ef1f0adcaf925ddffdfc5e680ca ] An aoe device's rq_list contains accepted block requests that are waiting to be transmitted to the aoe target. This queue was added as part of the conversion to blk_mq. However, the queue was not cleaned out when an aoe device is downed which caused blk_mq_freeze_queue() to sleep indefinitely waiting for those requests to complete, causing a hang. This fix cleans out the queue before calling blk_mq_freeze_queue(). Link: https://bugzilla.kernel.org/show_bug.cgi?id=212665 Fixes: 3582dd291788 ("aoe: convert aoeblk to blk-mq") Signed-off-by: Justin Sanders Link: https://lore.kernel.org/r/20250610170600.869-1-jsanders.devel@gmail.com Tested-By: Valentin Kleibel Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/block/aoe/aoedev.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/block/aoe/aoedev.c b/drivers/block/aoe/aoedev.c index 3523dd82d7a00..280679bde3a50 100644 --- a/drivers/block/aoe/aoedev.c +++ b/drivers/block/aoe/aoedev.c @@ -198,6 +198,7 @@ aoedev_downdev(struct aoedev *d) { struct aoetgt *t, **tt, **te; struct list_head *head, *pos, *nx; + struct request *rq, *rqnext; int i; d->flags &= ~DEVFL_UP; @@ -223,6 +224,13 @@ aoedev_downdev(struct aoedev *d) /* clean out the in-process request (if any) */ aoe_failip(d); + /* clean out any queued block requests */ + list_for_each_entry_safe(rq, rqnext, &d->rq_list, queuelist) { + list_del_init(&rq->queuelist); + blk_mq_start_request(rq); + blk_mq_end_request(rq, BLK_STS_IOERR); + } + /* fast fail all pending I/O */ if (d->blkq) { /* UP is cleared, freeze+quiesce to insure all are errored */ -- GitLab From 6b358b3adfb9b20ac38b55e5eb42cac5c18d6baa Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 17 Jun 2025 06:43:18 -0600 Subject: [PATCH 1576/2211] io_uring/sqpoll: don't put task_struct on tctx setup failure [ Upstream commit f2320f1dd6f6f82cb2c7aff23a12bab537bdea89 ] A recent commit moved the error handling of sqpoll thread and tctx failures into the thread itself, as part of fixing an issue. However, it missed that tctx allocation may also fail, and that io_sq_offload_create() does its own error handling for the task_struct in that case. Remove the manual task putting in io_sq_offload_create(), as io_sq_thread() will notice that the tctx did not get setup and hence it should put itself and exit. Reported-by: syzbot+763e12bbf004fb1062e4@syzkaller.appspotmail.com Fixes: ac0b8b327a56 ("io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo()") Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- io_uring/sqpoll.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/io_uring/sqpoll.c b/io_uring/sqpoll.c index 9a63068948957..2faa3058b2d0e 100644 --- a/io_uring/sqpoll.c +++ b/io_uring/sqpoll.c @@ -426,7 +426,6 @@ void io_sqpoll_wait_sq(struct io_ring_ctx *ctx) __cold int io_sq_offload_create(struct io_ring_ctx *ctx, struct io_uring_params *p) { - struct task_struct *task_to_put = NULL; int ret; /* Retain compatibility with failing for an invalid attach attempt */ @@ -510,7 +509,7 @@ __cold int io_sq_offload_create(struct io_ring_ctx *ctx, rcu_assign_pointer(sqd->thread, tsk); mutex_unlock(&sqd->lock); - task_to_put = get_task_struct(tsk); + get_task_struct(tsk); ret = io_uring_alloc_task_context(tsk, ctx); wake_up_new_task(tsk); if (ret) @@ -525,8 +524,6 @@ err_sqpoll: complete(&ctx->sq_data->exited); err: io_sq_thread_finish(ctx); - if (task_to_put) - put_task_struct(task_to_put); return ret; } -- GitLab From cbea0cace663d3286bc1a81f92e9a16e0b7d3113 Mon Sep 17 00:00:00 2001 From: Krishna Kumar Date: Tue, 20 May 2025 22:36:56 +0530 Subject: [PATCH 1577/2211] net: ice: Perform accurate aRFS flow match [ Upstream commit 5d3bc9e5e725aa36cca9b794e340057feb6880b4 ] This patch fixes an issue seen in a large-scale deployment under heavy incoming pkts where the aRFS flow wrongly matches a flow and reprograms the NIC with wrong settings. That mis-steering causes RX-path latency spikes and noisy neighbor effects when many connections collide on the same hash (some of our production servers have 20-30K connections). set_rps_cpu() calls ndo_rx_flow_steer() with flow_id that is calculated by hashing the skb sized by the per rx-queue table size. This results in multiple connections (even across different rx-queues) getting the same hash value. The driver steer function modifies the wrong flow to use this rx-queue, e.g.: Flow#1 is first added: Flow#1: , Hash 'h', q#10 Later when a new flow needs to be added: Flow#2: , Hash 'h', q#20 The driver finds the hash 'h' from Flow#1 and updates it to use q#20. This results in both flows getting un-optimized - packets for Flow#1 goes to q#20, and then reprogrammed back to q#10 later and so on; and Flow #2 programming is never done as Flow#1 is matched first for all misses. Many flows may wrongly share the same hash and reprogram rules of the original flow each with their own q#. Tested on two 144-core servers with 16K netperf sessions for 180s. Netperf clients are pinned to cores 0-71 sequentially (so that wrong packets on q#s 72-143 can be measured). IRQs are set 1:1 for queues -> CPUs, enable XPS, enable aRFS (global value is 144 * rps_flow_cnt). Test notes about results from ice_rx_flow_steer(): --------------------------------------------------- 1. "Skip:" counter increments here: if (fltr_info->q_index == rxq_idx || arfs_entry->fltr_state != ICE_ARFS_ACTIVE) goto out; 2. "Add:" counter increments here: ret = arfs_entry->fltr_info.fltr_id; INIT_HLIST_NODE(&arfs_entry->list_entry); 3. "Update:" counter increments here: /* update the queue to forward to on an already existing flow */ Runtime comparison: original code vs with the patch for different rps_flow_cnt values. +-------------------------------+--------------+--------------+ | rps_flow_cnt | 512 | 2048 | +-------------------------------+--------------+--------------+ | Ratio of Pkts on Good:Bad q's | 214 vs 822K | 1.1M vs 980K | | Avoid wrong aRFS programming | 0 vs 310K | 0 vs 30K | | CPU User | 216 vs 183 | 216 vs 206 | | CPU System | 1441 vs 1171 | 1447 vs 1320 | | CPU Softirq | 1245 vs 920 | 1238 vs 961 | | CPU Total | 29 vs 22.7 | 29 vs 24.9 | | aRFS Update | 533K vs 59 | 521K vs 32 | | aRFS Skip | 82M vs 77M | 7.2M vs 4.5M | +-------------------------------+--------------+--------------+ A separate TCP_STREAM and TCP_RR with 1,4,8,16,64,128,256,512 connections showed no performance degradation. Some points on the patch/aRFS behavior: 1. Enabling full tuple matching ensures flows are always correctly matched, even with smaller hash sizes. 2. 5-6% drop in CPU utilization as the packets arrive at the correct CPUs and fewer calls to driver for programming on misses. 3. Larger hash tables reduces mis-steering due to more unique flow hashes, but still has clashes. However, with larger per-device rps_flow_cnt, old flows take more time to expire and new aRFS flows cannot be added if h/w limits are reached (rps_may_expire_flow() succeeds when 10*rps_flow_cnt pkts have been processed by this cpu that are not part of the flow). Fixes: 28bf26724fdb0 ("ice: Implement aRFS") Signed-off-by: Krishna Kumar Reviewed-by: Simon Horman Tested-by: Rinitha S (A Contingent worker at Intel) Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ice/ice_arfs.c | 48 +++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/drivers/net/ethernet/intel/ice/ice_arfs.c b/drivers/net/ethernet/intel/ice/ice_arfs.c index 405ddd17de1bf..0bb4fb56fbe61 100644 --- a/drivers/net/ethernet/intel/ice/ice_arfs.c +++ b/drivers/net/ethernet/intel/ice/ice_arfs.c @@ -377,6 +377,50 @@ ice_arfs_is_perfect_flow_set(struct ice_hw *hw, __be16 l3_proto, u8 l4_proto) return false; } +/** + * ice_arfs_cmp - Check if aRFS filter matches this flow. + * @fltr_info: filter info of the saved ARFS entry. + * @fk: flow dissector keys. + * @n_proto: One of htons(ETH_P_IP) or htons(ETH_P_IPV6). + * @ip_proto: One of IPPROTO_TCP or IPPROTO_UDP. + * + * Since this function assumes limited values for n_proto and ip_proto, it + * is meant to be called only from ice_rx_flow_steer(). + * + * Return: + * * true - fltr_info refers to the same flow as fk. + * * false - fltr_info and fk refer to different flows. + */ +static bool +ice_arfs_cmp(const struct ice_fdir_fltr *fltr_info, const struct flow_keys *fk, + __be16 n_proto, u8 ip_proto) +{ + /* Determine if the filter is for IPv4 or IPv6 based on flow_type, + * which is one of ICE_FLTR_PTYPE_NONF_IPV{4,6}_{TCP,UDP}. + */ + bool is_v4 = fltr_info->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || + fltr_info->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP; + + /* Following checks are arranged in the quickest and most discriminative + * fields first for early failure. + */ + if (is_v4) + return n_proto == htons(ETH_P_IP) && + fltr_info->ip.v4.src_port == fk->ports.src && + fltr_info->ip.v4.dst_port == fk->ports.dst && + fltr_info->ip.v4.src_ip == fk->addrs.v4addrs.src && + fltr_info->ip.v4.dst_ip == fk->addrs.v4addrs.dst && + fltr_info->ip.v4.proto == ip_proto; + + return fltr_info->ip.v6.src_port == fk->ports.src && + fltr_info->ip.v6.dst_port == fk->ports.dst && + fltr_info->ip.v6.proto == ip_proto && + !memcmp(&fltr_info->ip.v6.src_ip, &fk->addrs.v6addrs.src, + sizeof(struct in6_addr)) && + !memcmp(&fltr_info->ip.v6.dst_ip, &fk->addrs.v6addrs.dst, + sizeof(struct in6_addr)); +} + /** * ice_rx_flow_steer - steer the Rx flow to where application is being run * @netdev: ptr to the netdev being adjusted @@ -448,6 +492,10 @@ ice_rx_flow_steer(struct net_device *netdev, const struct sk_buff *skb, continue; fltr_info = &arfs_entry->fltr_info; + + if (!ice_arfs_cmp(fltr_info, &fk, n_proto, ip_proto)) + continue; + ret = fltr_info->fltr_id; if (fltr_info->q_index == rxq_idx || -- GitLab From d6715193de439b79f1d6a4c03593c7529239b545 Mon Sep 17 00:00:00 2001 From: Grzegorz Nitka Date: Fri, 16 May 2025 15:09:07 +0200 Subject: [PATCH 1578/2211] ice: fix eswitch code memory leak in reset scenario [ Upstream commit 48c8b214974dc55283bd5f12e3a483b27c403bbc ] Add simple eswitch mode checker in attaching VF procedure and allocate required port representor memory structures only in switchdev mode. The reset flows triggers VF (if present) detach/attach procedure. It might involve VF port representor(s) re-creation if the device is configured is switchdev mode (not legacy one). The memory was blindly allocated in current implementation, regardless of the mode and not freed if in legacy mode. Kmemeleak trace: unreferenced object (percpu) 0x7e3bce5b888458 (size 40): comm "bash", pid 1784, jiffies 4295743894 hex dump (first 32 bytes on cpu 45): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace (crc 0): pcpu_alloc_noprof+0x4c4/0x7c0 ice_repr_create+0x66/0x130 [ice] ice_repr_create_vf+0x22/0x70 [ice] ice_eswitch_attach_vf+0x1b/0xa0 [ice] ice_reset_all_vfs+0x1dd/0x2f0 [ice] ice_pci_err_resume+0x3b/0xb0 [ice] pci_reset_function+0x8f/0x120 reset_store+0x56/0xa0 kernfs_fop_write_iter+0x120/0x1b0 vfs_write+0x31c/0x430 ksys_write+0x61/0xd0 do_syscall_64+0x5b/0x180 entry_SYSCALL_64_after_hwframe+0x76/0x7e Testing hints (ethX is PF netdev): - create at least one VF echo 1 > /sys/class/net/ethX/device/sriov_numvfs - trigger the reset echo 1 > /sys/class/net/ethX/device/reset Fixes: 415db8399d06 ("ice: make representor code generic") Signed-off-by: Grzegorz Nitka Reviewed-by: Przemek Kitszel Reviewed-by: Simon Horman Tested-by: Rinitha S (A Contingent worker at Intel) Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ice/ice_eswitch.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/intel/ice/ice_eswitch.c b/drivers/net/ethernet/intel/ice/ice_eswitch.c index ed21d7f55ac11..5b9a7ee278f17 100644 --- a/drivers/net/ethernet/intel/ice/ice_eswitch.c +++ b/drivers/net/ethernet/intel/ice/ice_eswitch.c @@ -502,10 +502,14 @@ err_create_repr: */ int ice_eswitch_attach_vf(struct ice_pf *pf, struct ice_vf *vf) { - struct ice_repr *repr = ice_repr_create_vf(vf); struct devlink *devlink = priv_to_devlink(pf); + struct ice_repr *repr; int err; + if (!ice_is_eswitch_mode_switchdev(pf)) + return 0; + + repr = ice_repr_create_vf(vf); if (IS_ERR(repr)) return PTR_ERR(repr); -- GitLab From b268e43012ef3998f58f158a8d0f978759d4a855 Mon Sep 17 00:00:00 2001 From: Vitaly Lifshits Date: Sun, 25 May 2025 11:38:43 +0300 Subject: [PATCH 1579/2211] e1000e: set fixed clock frequency indication for Nahum 11 and Nahum 13 [ Upstream commit 688a0d61b2d7427189c4eb036ce485d8fc957cbb ] On some systems with Nahum 11 and Nahum 13 the value of the XTAL clock in the software STRAP is incorrect. This causes the PTP timer to run at the wrong rate and can lead to synchronization issues. The STRAP value is configured by the system firmware, and a firmware update is not always possible. Since the XTAL clock on these systems always runs at 38.4MHz, the driver may ignore the STRAP and just set the correct value. Fixes: cc23f4f0b6b9 ("e1000e: Add support for Meteor Lake") Signed-off-by: Vitaly Lifshits Tested-by: Mor Bar-Gabay Reviewed-by: Gil Fine Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/e1000e/netdev.c | 14 +++++++++++--- drivers/net/ethernet/intel/e1000e/ptp.c | 8 +++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 07e9033463582..5fe54e9b71e25 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -3540,9 +3540,6 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca) case e1000_pch_cnp: case e1000_pch_tgp: case e1000_pch_adp: - case e1000_pch_mtp: - case e1000_pch_lnp: - case e1000_pch_ptp: case e1000_pch_nvp: if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI) { /* Stable 24MHz frequency */ @@ -3558,6 +3555,17 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca) adapter->cc.shift = shift; } break; + case e1000_pch_mtp: + case e1000_pch_lnp: + case e1000_pch_ptp: + /* System firmware can misreport this value, so set it to a + * stable 38400KHz frequency. + */ + incperiod = INCPERIOD_38400KHZ; + incvalue = INCVALUE_38400KHZ; + shift = INCVALUE_SHIFT_38400KHZ; + adapter->cc.shift = shift; + break; case e1000_82574: case e1000_82583: /* Stable 25MHz frequency */ diff --git a/drivers/net/ethernet/intel/e1000e/ptp.c b/drivers/net/ethernet/intel/e1000e/ptp.c index 89d57dd911dc8..ea3c3eb2ef202 100644 --- a/drivers/net/ethernet/intel/e1000e/ptp.c +++ b/drivers/net/ethernet/intel/e1000e/ptp.c @@ -295,15 +295,17 @@ void e1000e_ptp_init(struct e1000_adapter *adapter) case e1000_pch_cnp: case e1000_pch_tgp: case e1000_pch_adp: - case e1000_pch_mtp: - case e1000_pch_lnp: - case e1000_pch_ptp: case e1000_pch_nvp: if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI) adapter->ptp_clock_info.max_adj = MAX_PPB_24MHZ; else adapter->ptp_clock_info.max_adj = MAX_PPB_38400KHZ; break; + case e1000_pch_mtp: + case e1000_pch_lnp: + case e1000_pch_ptp: + adapter->ptp_clock_info.max_adj = MAX_PPB_38400KHZ; + break; case e1000_82574: case e1000_82583: adapter->ptp_clock_info.max_adj = MAX_PPB_25MHZ; -- GitLab From 8873080b885145c18e8a4ef2affb858068cdc19d Mon Sep 17 00:00:00 2001 From: Chuyi Zhou Date: Tue, 17 Jun 2025 12:42:16 +0800 Subject: [PATCH 1580/2211] workqueue: Initialize wq_isolated_cpumask in workqueue_init_early() [ Upstream commit 261dce3d64021e7ec828a17b4975ce9182e54ceb ] Now when isolcpus is enabled via the cmdline, wq_isolated_cpumask does not include these isolated CPUs, even wq_unbound_cpumask has already excluded them. It is only when we successfully configure an isolate cpuset partition that wq_isolated_cpumask gets overwritten by workqueue_unbound_exclude_cpumask(), including both the cmdline-specified isolated CPUs and the isolated CPUs within the cpuset partitions. Fix this issue by initializing wq_isolated_cpumask properly in workqueue_init_early(). Fixes: fe28f631fa94 ("workqueue: Add workqueue_unbound_exclude_cpumask() to exclude CPUs from wq_unbound_cpumask") Signed-off-by: Chuyi Zhou Reviewed-by: Waiman Long Signed-off-by: Tejun Heo Signed-off-by: Sasha Levin --- kernel/workqueue.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/workqueue.c b/kernel/workqueue.c index a9d64e08dffc7..3c87eb98609c0 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -7731,7 +7731,8 @@ void __init workqueue_init_early(void) restrict_unbound_cpumask("workqueue.unbound_cpus", &wq_cmdline_cpumask); cpumask_copy(wq_requested_unbound_cpumask, wq_unbound_cpumask); - + cpumask_andnot(wq_isolated_cpumask, cpu_possible_mask, + housekeeping_cpumask(HK_TYPE_DOMAIN)); pwq_cache = KMEM_CACHE(pool_workqueue, SLAB_PANIC); unbound_wq_update_pwq_attrs_buf = alloc_workqueue_attrs(); -- GitLab From 3890da762a66191c440b0bd6e3ee45501edbb0c1 Mon Sep 17 00:00:00 2001 From: Namjae Jeon Date: Tue, 10 Jun 2025 18:52:56 +0900 Subject: [PATCH 1581/2211] ksmbd: add free_transport ops in ksmbd connection [ Upstream commit a89f5fae998bdc4d0505306f93844c9ae059d50c ] free_transport function for tcp connection can be called from smbdirect. It will cause kernel oops. This patch add free_transport ops in ksmbd connection, and add each free_transports for tcp and smbdirect. Fixes: 21a4e47578d4 ("ksmbd: fix use-after-free in __smb2_lease_break_noti()") Reviewed-by: Stefan Metzmacher Signed-off-by: Namjae Jeon Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/server/connection.c | 2 +- fs/smb/server/connection.h | 1 + fs/smb/server/transport_rdma.c | 10 ++++++++-- fs/smb/server/transport_tcp.c | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/fs/smb/server/connection.c b/fs/smb/server/connection.c index 7aaea71a4f206..9eb3e6010aa68 100644 --- a/fs/smb/server/connection.c +++ b/fs/smb/server/connection.c @@ -40,7 +40,7 @@ void ksmbd_conn_free(struct ksmbd_conn *conn) kvfree(conn->request_buf); kfree(conn->preauth_info); if (atomic_dec_and_test(&conn->refcnt)) { - ksmbd_free_transport(conn->transport); + conn->transport->ops->free_transport(conn->transport); kfree(conn); } } diff --git a/fs/smb/server/connection.h b/fs/smb/server/connection.h index 14620e147dda5..572102098c108 100644 --- a/fs/smb/server/connection.h +++ b/fs/smb/server/connection.h @@ -132,6 +132,7 @@ struct ksmbd_transport_ops { void *buf, unsigned int len, struct smb2_buffer_desc_v1 *desc, unsigned int desc_len); + void (*free_transport)(struct ksmbd_transport *kt); }; struct ksmbd_transport { diff --git a/fs/smb/server/transport_rdma.c b/fs/smb/server/transport_rdma.c index 7c5a0d712873d..6921d62934bcb 100644 --- a/fs/smb/server/transport_rdma.c +++ b/fs/smb/server/transport_rdma.c @@ -158,7 +158,8 @@ struct smb_direct_transport { }; #define KSMBD_TRANS(t) ((struct ksmbd_transport *)&((t)->transport)) - +#define SMBD_TRANS(t) ((struct smb_direct_transport *)container_of(t, \ + struct smb_direct_transport, transport)) enum { SMB_DIRECT_MSG_NEGOTIATE_REQ = 0, SMB_DIRECT_MSG_DATA_TRANSFER @@ -409,6 +410,11 @@ err: return NULL; } +static void smb_direct_free_transport(struct ksmbd_transport *kt) +{ + kfree(SMBD_TRANS(kt)); +} + static void free_transport(struct smb_direct_transport *t) { struct smb_direct_recvmsg *recvmsg; @@ -454,7 +460,6 @@ static void free_transport(struct smb_direct_transport *t) smb_direct_destroy_pools(t); ksmbd_conn_free(KSMBD_TRANS(t)->conn); - kfree(t); } static struct smb_direct_sendmsg @@ -2300,4 +2305,5 @@ static const struct ksmbd_transport_ops ksmbd_smb_direct_transport_ops = { .read = smb_direct_read, .rdma_read = smb_direct_rdma_read, .rdma_write = smb_direct_rdma_write, + .free_transport = smb_direct_free_transport, }; diff --git a/fs/smb/server/transport_tcp.c b/fs/smb/server/transport_tcp.c index abedf510899a7..4e9f98db9ff40 100644 --- a/fs/smb/server/transport_tcp.c +++ b/fs/smb/server/transport_tcp.c @@ -93,7 +93,7 @@ static struct tcp_transport *alloc_transport(struct socket *client_sk) return t; } -void ksmbd_free_transport(struct ksmbd_transport *kt) +static void ksmbd_tcp_free_transport(struct ksmbd_transport *kt) { struct tcp_transport *t = TCP_TRANS(kt); @@ -656,4 +656,5 @@ static const struct ksmbd_transport_ops ksmbd_tcp_transport_ops = { .read = ksmbd_tcp_read, .writev = ksmbd_tcp_writev, .disconnect = ksmbd_tcp_disconnect, + .free_transport = ksmbd_tcp_free_transport, }; -- GitLab From ac462a75fd38e5b4afee03292846b860c2d472fe Mon Sep 17 00:00:00 2001 From: Mina Almasry Date: Sun, 15 Jun 2025 20:07:33 +0000 Subject: [PATCH 1582/2211] net: netmem: fix skb_ensure_writable with unreadable skbs [ Upstream commit 6f793a1d053775f8324b8dba1e7ed224f8b0166f ] skb_ensure_writable should succeed when it's trying to write to the header of the unreadable skbs, so it doesn't need an unconditional skb_frags_readable check. The preceding pskb_may_pull() call will succeed if write_len is within the head and fail if we're trying to write to the unreadable payload, so we don't need an additional check. Removing this check restores DSCP functionality with unreadable skbs as it's called from dscp_tg. Cc: willemb@google.com Cc: asml.silence@gmail.com Fixes: 65249feb6b3d ("net: add support for skbs with unreadable frags") Signed-off-by: Mina Almasry Acked-by: Stanislav Fomichev Link: https://patch.msgid.link/20250615200733.520113-1-almasrymina@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/core/skbuff.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/net/core/skbuff.c b/net/core/skbuff.c index fdb36165c58f5..cf54593149cce 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -6197,9 +6197,6 @@ int skb_ensure_writable(struct sk_buff *skb, unsigned int write_len) if (!pskb_may_pull(skb, write_len)) return -ENOMEM; - if (!skb_frags_readable(skb)) - return -EFAULT; - if (!skb_cloned(skb) || skb_clone_writable(skb, write_len)) return 0; -- GitLab From 6f2cd309492924b8afd2c62aebff815c1119d124 Mon Sep 17 00:00:00 2001 From: Kalesh AP Date: Fri, 13 Jun 2025 16:18:39 -0700 Subject: [PATCH 1583/2211] bnxt_en: Fix double invocation of bnxt_ulp_stop()/bnxt_ulp_start() [ Upstream commit 1e9ac33fa271be0d2480fd732f9642d81542500b ] Before the commit under the Fixes tag below, bnxt_ulp_stop() and bnxt_ulp_start() were always invoked in pairs. After that commit, the new bnxt_ulp_restart() can be invoked after bnxt_ulp_stop() has been called. This may result in the RoCE driver's aux driver .suspend() method being invoked twice. The 2nd bnxt_re_suspend() call will crash when it dereferences a NULL pointer: (NULL ib_device): Handle device suspend call BUG: kernel NULL pointer dereference, address: 0000000000000b78 PGD 0 P4D 0 Oops: Oops: 0000 [#1] SMP PTI CPU: 20 UID: 0 PID: 181 Comm: kworker/u96:5 Tainted: G S 6.15.0-rc1 #4 PREEMPT(voluntary) Tainted: [S]=CPU_OUT_OF_SPEC Hardware name: Dell Inc. PowerEdge R730/072T6D, BIOS 2.4.3 01/17/2017 Workqueue: bnxt_pf_wq bnxt_sp_task [bnxt_en] RIP: 0010:bnxt_re_suspend+0x45/0x1f0 [bnxt_re] Code: 8b 05 a7 3c 5b f5 48 89 44 24 18 31 c0 49 8b 5c 24 08 4d 8b 2c 24 e8 ea 06 0a f4 48 c7 c6 04 60 52 c0 48 89 df e8 1b ce f9 ff <48> 8b 83 78 0b 00 00 48 8b 80 38 03 00 00 a8 40 0f 85 b5 00 00 00 RSP: 0018:ffffa2e84084fd88 EFLAGS: 00010246 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000001 RDX: 0000000000000000 RSI: ffffffffb4b6b934 RDI: 00000000ffffffff RBP: ffffa1760954c9c0 R08: 0000000000000000 R09: c0000000ffffdfff R10: 0000000000000001 R11: ffffa2e84084fb50 R12: ffffa176031ef070 R13: ffffa17609775000 R14: ffffa17603adc180 R15: 0000000000000000 FS: 0000000000000000(0000) GS:ffffa17daa397000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000b78 CR3: 00000004aaa30003 CR4: 00000000003706f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: bnxt_ulp_stop+0x69/0x90 [bnxt_en] bnxt_sp_task+0x678/0x920 [bnxt_en] ? __schedule+0x514/0xf50 process_scheduled_works+0x9d/0x400 worker_thread+0x11c/0x260 ? __pfx_worker_thread+0x10/0x10 kthread+0xfe/0x1e0 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x2b/0x40 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 Check the BNXT_EN_FLAG_ULP_STOPPED flag and do not proceed if the flag is already set. This will preserve the original symmetrical bnxt_ulp_stop() and bnxt_ulp_start(). Also, inside bnxt_ulp_start(), clear the BNXT_EN_FLAG_ULP_STOPPED flag after taking the mutex to avoid any race condition. And for symmetry, only proceed in bnxt_ulp_start() if the BNXT_EN_FLAG_ULP_STOPPED is set. Fixes: 3c163f35bd50 ("bnxt_en: Optimize recovery path ULP locking in the driver") Signed-off-by: Kalesh AP Co-developed-by: Michael Chan Signed-off-by: Michael Chan Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250613231841.377988-2-michael.chan@broadcom.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c index b33c29fdf8fd3..1867552a8bdbe 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c @@ -230,10 +230,9 @@ void bnxt_ulp_stop(struct bnxt *bp) return; mutex_lock(&edev->en_dev_lock); - if (!bnxt_ulp_registered(edev)) { - mutex_unlock(&edev->en_dev_lock); - return; - } + if (!bnxt_ulp_registered(edev) || + (edev->flags & BNXT_EN_FLAG_ULP_STOPPED)) + goto ulp_stop_exit; edev->flags |= BNXT_EN_FLAG_ULP_STOPPED; if (aux_priv) { @@ -249,6 +248,7 @@ void bnxt_ulp_stop(struct bnxt *bp) adrv->suspend(adev, pm); } } +ulp_stop_exit: mutex_unlock(&edev->en_dev_lock); } @@ -257,19 +257,13 @@ void bnxt_ulp_start(struct bnxt *bp, int err) struct bnxt_aux_priv *aux_priv = bp->aux_priv; struct bnxt_en_dev *edev = bp->edev; - if (!edev) - return; - - edev->flags &= ~BNXT_EN_FLAG_ULP_STOPPED; - - if (err) + if (!edev || err) return; mutex_lock(&edev->en_dev_lock); - if (!bnxt_ulp_registered(edev)) { - mutex_unlock(&edev->en_dev_lock); - return; - } + if (!bnxt_ulp_registered(edev) || + !(edev->flags & BNXT_EN_FLAG_ULP_STOPPED)) + goto ulp_start_exit; if (edev->ulp_tbl->msix_requested) bnxt_fill_msix_vecs(bp, edev->msix_entries); @@ -286,6 +280,8 @@ void bnxt_ulp_start(struct bnxt *bp, int err) adrv->resume(adev); } } +ulp_start_exit: + edev->flags &= ~BNXT_EN_FLAG_ULP_STOPPED; mutex_unlock(&edev->en_dev_lock); } -- GitLab From e1724f07693439deaa413ebc2a2640325cf247f5 Mon Sep 17 00:00:00 2001 From: Taehee Yoo Date: Sun, 16 Mar 2025 02:58:37 +0000 Subject: [PATCH 1584/2211] eth: bnxt: fix out-of-range access of vnic_info array [ Upstream commit 919f9f497dbcee75d487400e8f9815b74a6a37df ] The bnxt_queue_{start | stop}() access vnic_info as much as allocated, which indicates bp->nr_vnics. So, it should not reach bp->vnic_info[bp->nr_vnics]. Fixes: 661958552eda ("eth: bnxt: do not use BNXT_VNIC_NTUPLE unconditionally in queue restart logic") Signed-off-by: Taehee Yoo Reviewed-by: Michael Chan Link: https://patch.msgid.link/20250316025837.939527-1-ap420073@gmail.com Signed-off-by: Paolo Abeni Stable-dep-of: 5dacc94c6fe6 ("bnxt_en: Update MRU and RSS table of RSS contexts on queue reset") Signed-off-by: Sasha Levin --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 2bb1fce350dbb..d0a87424c74ed 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -15356,7 +15356,7 @@ static int bnxt_queue_start(struct net_device *dev, void *qmem, int idx) cpr = &rxr->bnapi->cp_ring; cpr->sw_stats->rx.rx_resets++; - for (i = 0; i <= bp->nr_vnics; i++) { + for (i = 0; i < bp->nr_vnics; i++) { vnic = &bp->vnic_info[i]; rc = bnxt_hwrm_vnic_set_rss_p5(bp, vnic, true); @@ -15384,7 +15384,7 @@ static int bnxt_queue_stop(struct net_device *dev, void *qmem, int idx) struct bnxt_vnic_info *vnic; int i; - for (i = 0; i <= bp->nr_vnics; i++) { + for (i = 0; i < bp->nr_vnics; i++) { vnic = &bp->vnic_info[i]; vnic->mru = 0; bnxt_hwrm_vnic_update(bp, vnic, -- GitLab From 672b9d85bdd2b2cc9e9a3dc3d85e4a46ce8e169d Mon Sep 17 00:00:00 2001 From: Pavan Chebbi Date: Fri, 13 Jun 2025 16:18:40 -0700 Subject: [PATCH 1585/2211] bnxt_en: Add a helper function to configure MRU and RSS [ Upstream commit e11baaea94e2923739a98abeee85eb0667c04fd3 ] Add a new helper function that will configure MRU and RSS table of a VNIC. This will be useful when we configure both on a VNIC when resetting an RX ring. This function will be used again in the next bug fix patch where we have to reconfigure VNICs for RSS contexts. Suggested-by: Michael Chan Reviewed-by: Simon Horman Reviewed-by: David Wei Signed-off-by: Pavan Chebbi Signed-off-by: Michael Chan Link: https://patch.msgid.link/20250613231841.377988-3-michael.chan@broadcom.com Signed-off-by: Jakub Kicinski Stable-dep-of: 5dacc94c6fe6 ("bnxt_en: Update MRU and RSS table of RSS contexts on queue reset") Signed-off-by: Sasha Levin --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 37 ++++++++++++++++------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index d0a87424c74ed..e3dfce365ba40 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -10390,6 +10390,26 @@ void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx, bp->num_rss_ctx--; } +static int bnxt_set_vnic_mru_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic, + u16 mru) +{ + int rc; + + if (mru) { + rc = bnxt_hwrm_vnic_set_rss_p5(bp, vnic, true); + if (rc) { + netdev_err(bp->dev, "hwrm vnic %d set rss failure rc: %d\n", + vnic->vnic_id, rc); + return rc; + } + } + vnic->mru = mru; + bnxt_hwrm_vnic_update(bp, vnic, + VNIC_UPDATE_REQ_ENABLES_MRU_VALID); + + return 0; +} + static void bnxt_hwrm_realloc_rss_ctx_vnic(struct bnxt *bp) { bool set_tpa = !!(bp->flags & BNXT_FLAG_TPA); @@ -15326,6 +15346,7 @@ static int bnxt_queue_start(struct net_device *dev, void *qmem, int idx) struct bnxt_cp_ring_info *cpr; struct bnxt_vnic_info *vnic; int i, rc; + u16 mru; rxr = &bp->rx_ring[idx]; clone = qmem; @@ -15356,18 +15377,13 @@ static int bnxt_queue_start(struct net_device *dev, void *qmem, int idx) cpr = &rxr->bnapi->cp_ring; cpr->sw_stats->rx.rx_resets++; + mru = bp->dev->mtu + ETH_HLEN + VLAN_HLEN; for (i = 0; i < bp->nr_vnics; i++) { vnic = &bp->vnic_info[i]; - rc = bnxt_hwrm_vnic_set_rss_p5(bp, vnic, true); - if (rc) { - netdev_err(bp->dev, "hwrm vnic %d set rss failure rc: %d\n", - vnic->vnic_id, rc); + rc = bnxt_set_vnic_mru_p5(bp, vnic, mru); + if (rc) return rc; - } - vnic->mru = bp->dev->mtu + ETH_HLEN + VLAN_HLEN; - bnxt_hwrm_vnic_update(bp, vnic, - VNIC_UPDATE_REQ_ENABLES_MRU_VALID); } return 0; @@ -15386,9 +15402,8 @@ static int bnxt_queue_stop(struct net_device *dev, void *qmem, int idx) for (i = 0; i < bp->nr_vnics; i++) { vnic = &bp->vnic_info[i]; - vnic->mru = 0; - bnxt_hwrm_vnic_update(bp, vnic, - VNIC_UPDATE_REQ_ENABLES_MRU_VALID); + + bnxt_set_vnic_mru_p5(bp, vnic, 0); } /* Make sure NAPI sees that the VNIC is disabled */ synchronize_net(); -- GitLab From 1f755ba8abdc4de0c1d26dcba0f8d3921bf5af52 Mon Sep 17 00:00:00 2001 From: Pavan Chebbi Date: Fri, 13 Jun 2025 16:18:41 -0700 Subject: [PATCH 1586/2211] bnxt_en: Update MRU and RSS table of RSS contexts on queue reset [ Upstream commit 5dacc94c6fe61cde6f700e95cf35af9944b022c4 ] The commit under the Fixes tag below which updates the VNICs' RSS and MRU during .ndo_queue_start(), needs to be extended to cover any non-default RSS contexts which have their own VNICs. Without this step, packets that are destined to a non-default RSS context may be dropped after .ndo_queue_start(). We further optimize this scheme by updating the VNIC only if the RX ring being restarted is in the RSS table of the VNIC. Updating the VNIC (in particular setting the MRU to 0) will momentarily stop all traffic to all rings in the RSS table. Any VNIC that has the RX ring excluded from the RSS table can skip this step and avoid the traffic disruption. Note that this scheme is just an improvement. A VNIC with multiple rings in the RSS table will still see traffic disruptions to all rings in the RSS table when one of the rings is being restarted. We are working on a FW scheme that will improve upon this further. Fixes: 5ac066b7b062 ("bnxt_en: Fix queue start to update vnic RSS table") Reported-by: David Wei Signed-off-by: Pavan Chebbi Signed-off-by: Michael Chan Link: https://patch.msgid.link/20250613231841.377988-4-michael.chan@broadcom.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 56 +++++++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index e3dfce365ba40..154f73f121eca 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -10390,11 +10390,39 @@ void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx, bp->num_rss_ctx--; } +static bool bnxt_vnic_has_rx_ring(struct bnxt *bp, struct bnxt_vnic_info *vnic, + int rxr_id) +{ + u16 tbl_size = bnxt_get_rxfh_indir_size(bp->dev); + int i, vnic_rx; + + /* Ntuple VNIC always has all the rx rings. Any change of ring id + * must be updated because a future filter may use it. + */ + if (vnic->flags & BNXT_VNIC_NTUPLE_FLAG) + return true; + + for (i = 0; i < tbl_size; i++) { + if (vnic->flags & BNXT_VNIC_RSSCTX_FLAG) + vnic_rx = ethtool_rxfh_context_indir(vnic->rss_ctx)[i]; + else + vnic_rx = bp->rss_indir_tbl[i]; + + if (rxr_id == vnic_rx) + return true; + } + + return false; +} + static int bnxt_set_vnic_mru_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic, - u16 mru) + u16 mru, int rxr_id) { int rc; + if (!bnxt_vnic_has_rx_ring(bp, vnic, rxr_id)) + return 0; + if (mru) { rc = bnxt_hwrm_vnic_set_rss_p5(bp, vnic, true); if (rc) { @@ -10410,6 +10438,24 @@ static int bnxt_set_vnic_mru_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic, return 0; } +static int bnxt_set_rss_ctx_vnic_mru(struct bnxt *bp, u16 mru, int rxr_id) +{ + struct ethtool_rxfh_context *ctx; + unsigned long context; + int rc; + + xa_for_each(&bp->dev->ethtool->rss_ctx, context, ctx) { + struct bnxt_rss_ctx *rss_ctx = ethtool_rxfh_context_priv(ctx); + struct bnxt_vnic_info *vnic = &rss_ctx->vnic; + + rc = bnxt_set_vnic_mru_p5(bp, vnic, mru, rxr_id); + if (rc) + return rc; + } + + return 0; +} + static void bnxt_hwrm_realloc_rss_ctx_vnic(struct bnxt *bp) { bool set_tpa = !!(bp->flags & BNXT_FLAG_TPA); @@ -15381,12 +15427,11 @@ static int bnxt_queue_start(struct net_device *dev, void *qmem, int idx) for (i = 0; i < bp->nr_vnics; i++) { vnic = &bp->vnic_info[i]; - rc = bnxt_set_vnic_mru_p5(bp, vnic, mru); + rc = bnxt_set_vnic_mru_p5(bp, vnic, mru, idx); if (rc) return rc; } - - return 0; + return bnxt_set_rss_ctx_vnic_mru(bp, mru, idx); err_free_hwrm_rx_ring: bnxt_hwrm_rx_ring_free(bp, rxr, false); @@ -15403,8 +15448,9 @@ static int bnxt_queue_stop(struct net_device *dev, void *qmem, int idx) for (i = 0; i < bp->nr_vnics; i++) { vnic = &bp->vnic_info[i]; - bnxt_set_vnic_mru_p5(bp, vnic, 0); + bnxt_set_vnic_mru_p5(bp, vnic, 0, idx); } + bnxt_set_rss_ctx_vnic_mru(bp, 0, idx); /* Make sure NAPI sees that the VNIC is disabled */ synchronize_net(); rxr = &bp->rx_ring[idx]; -- GitLab From 11e25a2b5d36ead218d1346b02bddb0daea79b85 Mon Sep 17 00:00:00 2001 From: Vladimir Oltean Date: Fri, 13 Jun 2025 20:47:48 +0300 Subject: [PATCH 1587/2211] ptp: fix breakage after ptp_vclock_in_use() rework [ Upstream commit 5ab73b010cad294851e558f1d4714a85c6f206c7 ] What is broken -------------- ptp4l, and any other application which calls clock_adjtime() on a physical clock, is greeted with error -EBUSY after commit 87f7ce260a3c ("ptp: remove ptp->n_vclocks check logic in ptp_vclock_in_use()"). Explanation for the breakage ---------------------------- The blamed commit was based on the false assumption that ptp_vclock_in_use() callers already test for n_vclocks prior to calling this function. This is notably incorrect for the code path below, in which there is, in fact, no n_vclocks test: ptp_clock_adjtime() -> ptp_clock_freerun() -> ptp_vclock_in_use() The result is that any clock adjustment on any physical clock is now impossible. This is _despite_ there not being any vclock over this physical clock. $ ptp4l -i eno0 -2 -P -m ptp4l[58.425]: selected /dev/ptp0 as PTP clock [ 58.429749] ptp: physical clock is free running ptp4l[58.431]: Failed to open /dev/ptp0: Device or resource busy failed to create a clock $ cat /sys/class/ptp/ptp0/n_vclocks 0 The patch makes the ptp_vclock_in_use() function say "if it's not a virtual clock, then this physical clock does have virtual clocks on top". Then ptp_clock_freerun() uses this information to say "this physical clock has virtual clocks on top, so it must stay free-running". Then ptp_clock_adjtime() uses this information to say "well, if this physical clock has to be free-running, I can't do it, return -EBUSY". Simply put, ptp_vclock_in_use() cannot be simplified so as to remove the test whether vclocks are in use. What did the blamed commit intend to fix ---------------------------------------- The blamed commit presents a lockdep warning stating "possible recursive locking detected", with the n_vclocks_store() and ptp_clock_unregister() functions involved. The recursive locking seems this: n_vclocks_store() -> mutex_lock_interruptible(&ptp->n_vclocks_mux) // 1 -> device_for_each_child_reverse(..., unregister_vclock) -> unregister_vclock() -> ptp_vclock_unregister() -> ptp_clock_unregister() -> ptp_vclock_in_use() -> mutex_lock_interruptible(&ptp->n_vclocks_mux) // 2 The issue can be triggered by creating and then deleting vclocks: $ echo 2 > /sys/class/ptp/ptp0/n_vclocks $ echo 0 > /sys/class/ptp/ptp0/n_vclocks But note that in the original stack trace, the address of the first lock is different from the address of the second lock. This is because at step 1 marked above, &ptp->n_vclocks_mux is the lock of the parent (physical) PTP clock, and at step 2, the lock is of the child (virtual) PTP clock. They are different locks of different devices. In this situation there is no real deadlock, the lockdep warning is caused by the fact that the mutexes have the same lock class on both the parent and the child. Functionally it is fine. Proposed alternative solution ----------------------------- We must reintroduce the body of ptp_vclock_in_use() mostly as it was structured prior to the blamed commit, but avoid the lockdep warning. Based on the fact that vclocks cannot be nested on top of one another (ptp_is_attribute_visible() hides n_vclocks for virtual clocks), we already know that ptp->n_vclocks is zero for a virtual clock. And ptp->is_virtual_clock is a runtime invariant, established at ptp_clock_register() time and never changed. There is no need to serialize on any mutex in order to read ptp->is_virtual_clock, and we take advantage of that by moving it outside the lock. Thus, virtual clocks do not need to acquire &ptp->n_vclocks_mux at all, and step 2 in the code walkthrough above can simply go away. We can simply return false to the question "ptp_vclock_in_use(a virtual clock)". Other notes ----------- Releasing &ptp->n_vclocks_mux before ptp_vclock_in_use() returns execution seems racy, because the returned value can become stale as soon as the function returns and before the return value is used (i.e. n_vclocks_store() can run any time). The locking requirement should somehow be transferred to the caller, to ensure a longer life time for the returned value, but this seems out of scope for this severe bug fix. Because we are also fixing up the logic from the original commit, there is another Fixes: tag for that. Fixes: 87f7ce260a3c ("ptp: remove ptp->n_vclocks check logic in ptp_vclock_in_use()") Fixes: 73f37068d540 ("ptp: support ptp physical/virtual clocks conversion") Signed-off-by: Vladimir Oltean Link: https://patch.msgid.link/20250613174749.406826-2-vladimir.oltean@nxp.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/ptp/ptp_private.h | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/drivers/ptp/ptp_private.h b/drivers/ptp/ptp_private.h index 528d86a33f37d..a6aad743c282f 100644 --- a/drivers/ptp/ptp_private.h +++ b/drivers/ptp/ptp_private.h @@ -98,7 +98,27 @@ static inline int queue_cnt(const struct timestamp_event_queue *q) /* Check if ptp virtual clock is in use */ static inline bool ptp_vclock_in_use(struct ptp_clock *ptp) { - return !ptp->is_virtual_clock; + bool in_use = false; + + /* Virtual clocks can't be stacked on top of virtual clocks. + * Avoid acquiring the n_vclocks_mux on virtual clocks, to allow this + * function to be called from code paths where the n_vclocks_mux of the + * parent physical clock is already held. Functionally that's not an + * issue, but lockdep would complain, because they have the same lock + * class. + */ + if (ptp->is_virtual_clock) + return false; + + if (mutex_lock_interruptible(&ptp->n_vclocks_mux)) + return true; + + if (ptp->n_vclocks) + in_use = true; + + mutex_unlock(&ptp->n_vclocks_mux); + + return in_use; } /* Check if ptp clock shall be free running */ -- GitLab From 61b39e189d5c969af5e7bc226fe0caedbc8a7cab Mon Sep 17 00:00:00 2001 From: Vladimir Oltean Date: Fri, 13 Jun 2025 20:47:49 +0300 Subject: [PATCH 1588/2211] ptp: allow reading of currently dialed frequency to succeed on free-running clocks [ Upstream commit aa112cbc5f0ac6f3b44d829005bf34005d9fe9bb ] There is a bug in ptp_clock_adjtime() which makes it refuse the operation even if we just want to read the current clock dialed frequency, not modify anything (tx->modes == 0). That should be possible even if the clock is free-running. For context, the kernel UAPI is the same for getting and setting the frequency of a POSIX clock. For example, ptp4l errors out at clock_create() -> clockadj_get_freq() -> clock_adjtime() time, when it should logically only have failed on actual adjustments to the clock, aka if the clock was configured as slave. But in master mode it should work. This was discovered when examining the issue described in the previous commit, where ptp_clock_freerun() returned true despite n_vclocks being zero. Fixes: 73f37068d540 ("ptp: support ptp physical/virtual clocks conversion") Signed-off-by: Vladimir Oltean Link: https://patch.msgid.link/20250613174749.406826-3-vladimir.oltean@nxp.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/ptp/ptp_clock.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c index 1a1edd87122d3..b892a7323084d 100644 --- a/drivers/ptp/ptp_clock.c +++ b/drivers/ptp/ptp_clock.c @@ -121,7 +121,8 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx) struct ptp_clock_info *ops; int err = -EOPNOTSUPP; - if (ptp_clock_freerun(ptp)) { + if (tx->modes & (ADJ_SETOFFSET | ADJ_FREQUENCY | ADJ_OFFSET) && + ptp_clock_freerun(ptp)) { pr_err("ptp: physical clock is free running\n"); return -EBUSY; } -- GitLab From 301268dbaac8e9013719e162a000202eac8054be Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Mon, 16 Jun 2025 21:12:05 +0300 Subject: [PATCH 1589/2211] wifi: carl9170: do not ping device which has failed to load firmware [ Upstream commit 15d25307692312cec4b57052da73387f91a2e870 ] Syzkaller reports [1, 2] crashes caused by an attempts to ping the device which has failed to load firmware. Since such a device doesn't pass 'ieee80211_register_hw()', an internal workqueue managed by 'ieee80211_queue_work()' is not yet created and an attempt to queue work on it causes null-ptr-deref. [1] https://syzkaller.appspot.com/bug?extid=9a4aec827829942045ff [2] https://syzkaller.appspot.com/bug?extid=0d8afba53e8fb2633217 Fixes: e4a668c59080 ("carl9170: fix spurious restart due to high latency") Signed-off-by: Dmitry Antipov Acked-by: Christian Lamparter Link: https://patch.msgid.link/20250616181205.38883-1-dmantipov@yandex.ru Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/carl9170/usb.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/ath/carl9170/usb.c b/drivers/net/wireless/ath/carl9170/usb.c index a3e03580cd9ff..564ca6a619856 100644 --- a/drivers/net/wireless/ath/carl9170/usb.c +++ b/drivers/net/wireless/ath/carl9170/usb.c @@ -438,14 +438,21 @@ static void carl9170_usb_rx_complete(struct urb *urb) if (atomic_read(&ar->rx_anch_urbs) == 0) { /* - * The system is too slow to cope with - * the enormous workload. We have simply - * run out of active rx urbs and this - * unfortunately leads to an unpredictable - * device. + * At this point, either the system is too slow to + * cope with the enormous workload (so we have simply + * run out of active rx urbs and this unfortunately + * leads to an unpredictable device), or the device + * is not fully functional after an unsuccessful + * firmware loading attempts (so it doesn't pass + * ieee80211_register_hw() and there is no internal + * workqueue at all). */ - ieee80211_queue_work(ar->hw, &ar->ping_work); + if (ar->registered) + ieee80211_queue_work(ar->hw, &ar->ping_work); + else + pr_warn_once("device %s is not registered\n", + dev_name(&ar->udev->dev)); } } else { /* -- GitLab From 517bc6836ee9fcffe2539f6f6aa3fdd9c7a7ae73 Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Mon, 16 Jun 2025 13:15:12 -0700 Subject: [PATCH 1590/2211] mpls: Use rcu_dereference_rtnl() in mpls_route_input_rcu(). [ Upstream commit 6dbb0d97c5096072c78a6abffe393584e57ae945 ] As syzbot reported [0], mpls_route_input_rcu() can be called from mpls_getroute(), where is under RTNL. net->mpls.platform_label is only updated under RTNL. Let's use rcu_dereference_rtnl() in mpls_route_input_rcu() to silence the splat. [0]: WARNING: suspicious RCU usage 6.15.0-rc7-syzkaller-00082-g5cdb2c77c4c3 #0 Not tainted ---------------------------- net/mpls/af_mpls.c:84 suspicious rcu_dereference_check() usage! other info that might help us debug this: rcu_scheduler_active = 2, debug_locks = 1 1 lock held by syz.2.4451/17730: #0: ffffffff9012a3e8 (rtnl_mutex){+.+.}-{4:4}, at: rtnl_lock net/core/rtnetlink.c:80 [inline] #0: ffffffff9012a3e8 (rtnl_mutex){+.+.}-{4:4}, at: rtnetlink_rcv_msg+0x371/0xe90 net/core/rtnetlink.c:6961 stack backtrace: CPU: 1 UID: 0 PID: 17730 Comm: syz.2.4451 Not tainted 6.15.0-rc7-syzkaller-00082-g5cdb2c77c4c3 #0 PREEMPT(full) Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/07/2025 Call Trace: __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x16c/0x1f0 lib/dump_stack.c:120 lockdep_rcu_suspicious+0x166/0x260 kernel/locking/lockdep.c:6865 mpls_route_input_rcu+0x1d4/0x200 net/mpls/af_mpls.c:84 mpls_getroute+0x621/0x1ea0 net/mpls/af_mpls.c:2381 rtnetlink_rcv_msg+0x3c9/0xe90 net/core/rtnetlink.c:6964 netlink_rcv_skb+0x16d/0x440 net/netlink/af_netlink.c:2534 netlink_unicast_kernel net/netlink/af_netlink.c:1313 [inline] netlink_unicast+0x53a/0x7f0 net/netlink/af_netlink.c:1339 netlink_sendmsg+0x8d1/0xdd0 net/netlink/af_netlink.c:1883 sock_sendmsg_nosec net/socket.c:712 [inline] __sock_sendmsg net/socket.c:727 [inline] ____sys_sendmsg+0xa98/0xc70 net/socket.c:2566 ___sys_sendmsg+0x134/0x1d0 net/socket.c:2620 __sys_sendmmsg+0x200/0x420 net/socket.c:2709 __do_sys_sendmmsg net/socket.c:2736 [inline] __se_sys_sendmmsg net/socket.c:2733 [inline] __x64_sys_sendmmsg+0x9c/0x100 net/socket.c:2733 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xcd/0x230 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f0a2818e969 Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 a8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f0a28f52038 EFLAGS: 00000246 ORIG_RAX: 0000000000000133 RAX: ffffffffffffffda RBX: 00007f0a283b5fa0 RCX: 00007f0a2818e969 RDX: 0000000000000003 RSI: 0000200000000080 RDI: 0000000000000003 RBP: 00007f0a28210ab1 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 R13: 0000000000000000 R14: 00007f0a283b5fa0 R15: 00007ffce5e9f268 Fixes: 0189197f4416 ("mpls: Basic routing support") Reported-by: syzbot+8a583bdd1a5cc0b0e068@syzkaller.appspotmail.com Closes: https://lore.kernel.org/netdev/68507981.a70a0220.395abc.01ef.GAE@google.com/ Signed-off-by: Kuniyuki Iwashima Link: https://patch.msgid.link/20250616201532.1036568-1-kuni1840@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/mpls/af_mpls.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c index df62638b64984..3373b6b34dc7d 100644 --- a/net/mpls/af_mpls.c +++ b/net/mpls/af_mpls.c @@ -81,8 +81,8 @@ static struct mpls_route *mpls_route_input_rcu(struct net *net, unsigned index) if (index < net->mpls.platform_labels) { struct mpls_route __rcu **platform_label = - rcu_dereference(net->mpls.platform_label); - rt = rcu_dereference(platform_label[index]); + rcu_dereference_rtnl(net->mpls.platform_label); + rt = rcu_dereference_rtnl(platform_label[index]); } return rt; } -- GitLab From e996507f59610e5752b8702537f13f551e7a2c96 Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Mon, 16 Jun 2025 11:21:14 -0700 Subject: [PATCH 1591/2211] atm: atmtcp: Free invalid length skb in atmtcp_c_send(). [ Upstream commit 2f370ae1fb6317985f3497b1bb80d457508ca2f7 ] syzbot reported the splat below. [0] vcc_sendmsg() copies data passed from userspace to skb and passes it to vcc->dev->ops->send(). atmtcp_c_send() accesses skb->data as struct atmtcp_hdr after checking if skb->len is 0, but it's not enough. Also, when skb->len == 0, skb and sk (vcc) were leaked because dev_kfree_skb() is not called and sk_wmem_alloc adjustment is missing to revert atm_account_tx() in vcc_sendmsg(), which is expected to be done in atm_pop_raw(). Let's properly free skb with an invalid length in atmtcp_c_send(). [0]: BUG: KMSAN: uninit-value in atmtcp_c_send+0x255/0xed0 drivers/atm/atmtcp.c:294 atmtcp_c_send+0x255/0xed0 drivers/atm/atmtcp.c:294 vcc_sendmsg+0xd7c/0xff0 net/atm/common.c:644 sock_sendmsg_nosec net/socket.c:712 [inline] __sock_sendmsg+0x330/0x3d0 net/socket.c:727 ____sys_sendmsg+0x7e0/0xd80 net/socket.c:2566 ___sys_sendmsg+0x271/0x3b0 net/socket.c:2620 __sys_sendmsg net/socket.c:2652 [inline] __do_sys_sendmsg net/socket.c:2657 [inline] __se_sys_sendmsg net/socket.c:2655 [inline] __x64_sys_sendmsg+0x211/0x3e0 net/socket.c:2655 x64_sys_call+0x32fb/0x3db0 arch/x86/include/generated/asm/syscalls_64.h:47 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xd9/0x210 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f Uninit was created at: slab_post_alloc_hook mm/slub.c:4154 [inline] slab_alloc_node mm/slub.c:4197 [inline] kmem_cache_alloc_node_noprof+0x818/0xf00 mm/slub.c:4249 kmalloc_reserve+0x13c/0x4b0 net/core/skbuff.c:579 __alloc_skb+0x347/0x7d0 net/core/skbuff.c:670 alloc_skb include/linux/skbuff.h:1336 [inline] vcc_sendmsg+0xb40/0xff0 net/atm/common.c:628 sock_sendmsg_nosec net/socket.c:712 [inline] __sock_sendmsg+0x330/0x3d0 net/socket.c:727 ____sys_sendmsg+0x7e0/0xd80 net/socket.c:2566 ___sys_sendmsg+0x271/0x3b0 net/socket.c:2620 __sys_sendmsg net/socket.c:2652 [inline] __do_sys_sendmsg net/socket.c:2657 [inline] __se_sys_sendmsg net/socket.c:2655 [inline] __x64_sys_sendmsg+0x211/0x3e0 net/socket.c:2655 x64_sys_call+0x32fb/0x3db0 arch/x86/include/generated/asm/syscalls_64.h:47 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xd9/0x210 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f CPU: 1 UID: 0 PID: 5798 Comm: syz-executor192 Not tainted 6.16.0-rc1-syzkaller-00010-g2c4a1f3fe03e #0 PREEMPT(undef) Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/07/2025 Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Reported-by: syzbot+1d3c235276f62963e93a@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=1d3c235276f62963e93a Tested-by: syzbot+1d3c235276f62963e93a@syzkaller.appspotmail.com Signed-off-by: Kuniyuki Iwashima Link: https://patch.msgid.link/20250616182147.963333-2-kuni1840@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/atm/atmtcp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/atm/atmtcp.c b/drivers/atm/atmtcp.c index d4aa0f353b6c8..eeae160c898d3 100644 --- a/drivers/atm/atmtcp.c +++ b/drivers/atm/atmtcp.c @@ -288,7 +288,9 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb) struct sk_buff *new_skb; int result = 0; - if (!skb->len) return 0; + if (skb->len < sizeof(struct atmtcp_hdr)) + goto done; + dev = vcc->dev_data; hdr = (struct atmtcp_hdr *) skb->data; if (hdr->length == ATMTCP_HDR_MAGIC) { -- GitLab From 397c1faf8fde78325e5cbb3bb72351006fe673ad Mon Sep 17 00:00:00 2001 From: Neal Cardwell Date: Fri, 13 Jun 2025 15:30:56 -0400 Subject: [PATCH 1592/2211] tcp: fix tcp_packet_delayed() for tcp_is_non_sack_preventing_reopen() behavior [ Upstream commit d0fa59897e049e84432600e86df82aab3dce7aa5 ] After the following commit from 2024: commit e37ab7373696 ("tcp: fix to allow timestamp undo if no retransmits were sent") ...there was buggy behavior where TCP connections without SACK support could easily see erroneous undo events at the end of fast recovery or RTO recovery episodes. The erroneous undo events could cause those connections to suffer repeated loss recovery episodes and high retransmit rates. The problem was an interaction between the non-SACK behavior on these connections and the undo logic. The problem is that, for non-SACK connections at the end of a loss recovery episode, if snd_una == high_seq, then tcp_is_non_sack_preventing_reopen() holds steady in CA_Recovery or CA_Loss, but clears tp->retrans_stamp to 0. Then upon the next ACK the "tcp: fix to allow timestamp undo if no retransmits were sent" logic saw the tp->retrans_stamp at 0 and erroneously concluded that no data was retransmitted, and erroneously performed an undo of the cwnd reduction, restoring cwnd immediately to the value it had before loss recovery. This caused an immediate burst of traffic and build-up of queues and likely another immediate loss recovery episode. This commit fixes tcp_packet_delayed() to ignore zero retrans_stamp values for non-SACK connections when snd_una is at or above high_seq, because tcp_is_non_sack_preventing_reopen() clears retrans_stamp in this case, so it's not a valid signal that we can undo. Note that the commit named in the Fixes footer restored long-present behavior from roughly 2005-2019, so apparently this bug was present for a while during that era, and this was simply not caught. Fixes: e37ab7373696 ("tcp: fix to allow timestamp undo if no retransmits were sent") Reported-by: Eric Wheeler Closes: https://lore.kernel.org/netdev/64ea9333-e7f9-0df-b0f2-8d566143acab@ewheeler.net/ Signed-off-by: Neal Cardwell Co-developed-by: Yuchung Cheng Signed-off-by: Yuchung Cheng Reviewed-by: Eric Dumazet Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/ipv4/tcp_input.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index c59c1cc1a8fed..d176e7888a203 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -2482,20 +2482,33 @@ static inline bool tcp_packet_delayed(const struct tcp_sock *tp) { const struct sock *sk = (const struct sock *)tp; - if (tp->retrans_stamp && - tcp_tsopt_ecr_before(tp, tp->retrans_stamp)) - return true; /* got echoed TS before first retransmission */ - - /* Check if nothing was retransmitted (retrans_stamp==0), which may - * happen in fast recovery due to TSQ. But we ignore zero retrans_stamp - * in TCP_SYN_SENT, since when we set FLAG_SYN_ACKED we also clear - * retrans_stamp even if we had retransmitted the SYN. + /* Received an echoed timestamp before the first retransmission? */ + if (tp->retrans_stamp) + return tcp_tsopt_ecr_before(tp, tp->retrans_stamp); + + /* We set tp->retrans_stamp upon the first retransmission of a loss + * recovery episode, so normally if tp->retrans_stamp is 0 then no + * retransmission has happened yet (likely due to TSQ, which can cause + * fast retransmits to be delayed). So if snd_una advanced while + * (tp->retrans_stamp is 0 then apparently a packet was merely delayed, + * not lost. But there are exceptions where we retransmit but then + * clear tp->retrans_stamp, so we check for those exceptions. */ - if (!tp->retrans_stamp && /* no record of a retransmit/SYN? */ - sk->sk_state != TCP_SYN_SENT) /* not the FLAG_SYN_ACKED case? */ - return true; /* nothing was retransmitted */ - return false; + /* (1) For non-SACK connections, tcp_is_non_sack_preventing_reopen() + * clears tp->retrans_stamp when snd_una == high_seq. + */ + if (!tcp_is_sack(tp) && !before(tp->snd_una, tp->high_seq)) + return false; + + /* (2) In TCP_SYN_SENT tcp_clean_rtx_queue() clears tp->retrans_stamp + * when setting FLAG_SYN_ACKED is set, even if the SYN was + * retransmitted. + */ + if (sk->sk_state == TCP_SYN_SENT) + return false; + + return true; /* tp->retrans_stamp is zero; no retransmit yet */ } /* Undo procedures. */ -- GitLab From 0d3d91c3500f0c480e016faa4e2259c588616e59 Mon Sep 17 00:00:00 2001 From: Haixia Qu Date: Tue, 17 Jun 2025 05:56:24 +0000 Subject: [PATCH 1593/2211] tipc: fix null-ptr-deref when acquiring remote ip of ethernet bearer [ Upstream commit f82727adcf2992822e12198792af450a76ebd5ef ] The reproduction steps: 1. create a tun interface 2. enable l2 bearer 3. TIPC_NL_UDP_GET_REMOTEIP with media name set to tun tipc: Started in network mode tipc: Node identity 8af312d38a21, cluster identity 4711 tipc: Enabled bearer , priority 1 Oops: general protection fault KASAN: null-ptr-deref in range CPU: 1 UID: 1000 PID: 559 Comm: poc Not tainted 6.16.0-rc1+ #117 PREEMPT Hardware name: QEMU Ubuntu 24.04 PC RIP: 0010:tipc_udp_nl_dump_remoteip+0x4a4/0x8f0 the ub was in fact a struct dev. when bid != 0 && skip_cnt != 0, bearer_list[bid] may be NULL or other media when other thread changes it. fix this by checking media_id. Fixes: 832629ca5c313 ("tipc: add UDP remoteip dump to netlink API") Signed-off-by: Haixia Qu Reviewed-by: Tung Nguyen Link: https://patch.msgid.link/20250617055624.2680-1-hxqu@hillstonenet.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/tipc/udp_media.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c index 108a4cc2e0010..258d6aa4f21ae 100644 --- a/net/tipc/udp_media.c +++ b/net/tipc/udp_media.c @@ -489,7 +489,7 @@ int tipc_udp_nl_dump_remoteip(struct sk_buff *skb, struct netlink_callback *cb) rtnl_lock(); b = tipc_bearer_find(net, bname); - if (!b) { + if (!b || b->bcast_addr.media_id != TIPC_MEDIA_TYPE_UDP) { rtnl_unlock(); return -EINVAL; } @@ -500,7 +500,7 @@ int tipc_udp_nl_dump_remoteip(struct sk_buff *skb, struct netlink_callback *cb) rtnl_lock(); b = rtnl_dereference(tn->bearer_list[bid]); - if (!b) { + if (!b || b->bcast_addr.media_id != TIPC_MEDIA_TYPE_UDP) { rtnl_unlock(); return -EINVAL; } -- GitLab From 31d50dfe9c602ff05e3862b43d9831d8b57c9ea0 Mon Sep 17 00:00:00 2001 From: David Wei Date: Tue, 17 Jun 2025 14:21:02 -0700 Subject: [PATCH 1594/2211] tcp: fix passive TFO socket having invalid NAPI ID [ Upstream commit dbe0ca8da1f62b6252e7be6337209f4d86d4a914 ] There is a bug with passive TFO sockets returning an invalid NAPI ID 0 from SO_INCOMING_NAPI_ID. Normally this is not an issue, but zero copy receive relies on a correct NAPI ID to process sockets on the right queue. Fix by adding a sk_mark_napi_id_set(). Fixes: e5907459ce7e ("tcp: Record Rx hash and NAPI ID in tcp_child_process") Signed-off-by: David Wei Reviewed-by: Kuniyuki Iwashima Reviewed-by: Eric Dumazet Link: https://patch.msgid.link/20250617212102.175711-5-dw@davidwei.uk Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/ipv4/tcp_fastopen.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net/ipv4/tcp_fastopen.c b/net/ipv4/tcp_fastopen.c index 32b28fc21b63c..408985eb74eef 100644 --- a/net/ipv4/tcp_fastopen.c +++ b/net/ipv4/tcp_fastopen.c @@ -3,6 +3,7 @@ #include #include #include +#include void tcp_fastopen_init_key_once(struct net *net) { @@ -279,6 +280,8 @@ static struct sock *tcp_fastopen_create_child(struct sock *sk, refcount_set(&req->rsk_refcnt, 2); + sk_mark_napi_id_set(child, skb); + /* Now finish processing the fastopen child socket. */ tcp_init_transfer(child, BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, skb); -- GitLab From 670179265ad787b9dd8e701601914618b8927755 Mon Sep 17 00:00:00 2001 From: Jakub Kicinski Date: Mon, 16 Jun 2025 12:55:10 -0700 Subject: [PATCH 1595/2211] eth: fbnic: avoid double free when failing to DMA-map FW msg [ Upstream commit 5bd1bafd4474ee26f504b41aba11f3e2a1175b88 ] The semantics are that caller of fbnic_mbx_map_msg() retains the ownership of the message on error. All existing callers dutifully free the page. Fixes: da3cde08209e ("eth: fbnic: Add FW communication mechanism") Reviewed-by: Alexander Duyck Signed-off-by: Jakub Kicinski Reviewed-by: Jacob Keller Link: https://patch.msgid.link/20250616195510.225819-1-kuba@kernel.org Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/meta/fbnic/fbnic_fw.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_fw.c b/drivers/net/ethernet/meta/fbnic/fbnic_fw.c index 7775418316df5..d6cf97ecf3276 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_fw.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_fw.c @@ -127,11 +127,8 @@ static int fbnic_mbx_map_msg(struct fbnic_dev *fbd, int mbx_idx, return -EBUSY; addr = dma_map_single(fbd->dev, msg, PAGE_SIZE, direction); - if (dma_mapping_error(fbd->dev, addr)) { - free_page((unsigned long)msg); - + if (dma_mapping_error(fbd->dev, addr)) return -ENOSPC; - } mbx->buf_info[tail].msg = msg; mbx->buf_info[tail].addr = addr; -- GitLab From 41017bd66c533f7af912c58273c7dfd5de0065d4 Mon Sep 17 00:00:00 2001 From: Alexey Kodanev Date: Mon, 16 Jun 2025 11:37:43 +0000 Subject: [PATCH 1596/2211] net: lan743x: fix potential out-of-bounds write in lan743x_ptp_io_event_clock_get() [ Upstream commit e353b0854d3a1a31cb061df8d022fbfea53a0f24 ] Before calling lan743x_ptp_io_event_clock_get(), the 'channel' value is checked against the maximum value of PCI11X1X_PTP_IO_MAX_CHANNELS(8). This seems correct and aligns with the PTP interrupt status register (PTP_INT_STS) specifications. However, lan743x_ptp_io_event_clock_get() writes to ptp->extts[] with only LAN743X_PTP_N_EXTTS(4) elements, using channel as an index: lan743x_ptp_io_event_clock_get(..., u8 channel,...) { ... /* Update Local timestamp */ extts = &ptp->extts[channel]; extts->ts.tv_sec = sec; ... } To avoid an out-of-bounds write and utilize all the supported GPIO inputs, set LAN743X_PTP_N_EXTTS to 8. Detected using the static analysis tool - Svace. Fixes: 60942c397af6 ("net: lan743x: Add support for PTP-IO Event Input External Timestamp (extts)") Signed-off-by: Alexey Kodanev Reviewed-by: Jacob Keller Acked-by: Rengarajan S Link: https://patch.msgid.link/20250616113743.36284-1-aleksei.kodanev@bell-sw.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- drivers/net/ethernet/microchip/lan743x_ptp.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_ptp.h b/drivers/net/ethernet/microchip/lan743x_ptp.h index 0d29914cd4606..225e8232474d7 100644 --- a/drivers/net/ethernet/microchip/lan743x_ptp.h +++ b/drivers/net/ethernet/microchip/lan743x_ptp.h @@ -18,9 +18,9 @@ */ #define LAN743X_PTP_N_EVENT_CHAN 2 #define LAN743X_PTP_N_PEROUT LAN743X_PTP_N_EVENT_CHAN -#define LAN743X_PTP_N_EXTTS 4 -#define LAN743X_PTP_N_PPS 0 #define PCI11X1X_PTP_IO_MAX_CHANNELS 8 +#define LAN743X_PTP_N_EXTTS PCI11X1X_PTP_IO_MAX_CHANNELS +#define LAN743X_PTP_N_PPS 0 #define PTP_CMD_CTL_TIMEOUT_CNT 50 struct lan743x_adapter; -- GitLab From 0f8df5d6f25ac17c52a8bc6418e60a3e63130550 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Thu, 19 Jun 2025 12:10:31 +1000 Subject: [PATCH 1597/2211] ublk: santizize the arguments from userspace when adding a device [ Upstream commit 8c8472855884355caf3d8e0c50adf825f83454b2 ] Sanity check the values for queue depth and number of queues we get from userspace when adding a device. Signed-off-by: Ronnie Sahlberg Reviewed-by: Ming Lei Fixes: 71f28f3136af ("ublk_drv: add io_uring based userspace block driver") Fixes: 62fe99cef94a ("ublk: add read()/write() support for ublk char device") Link: https://lore.kernel.org/r/20250619021031.181340-1-ronniesahlberg@gmail.com Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/block/ublk_drv.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index a01a547c562f3..746ef36e58df2 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -2457,6 +2457,9 @@ static int ublk_ctrl_add_dev(struct io_uring_cmd *cmd) if (copy_from_user(&info, argp, sizeof(info))) return -EFAULT; + if (info.queue_depth > UBLK_MAX_QUEUE_DEPTH || info.nr_hw_queues > UBLK_MAX_NR_QUEUES) + return -EINVAL; + if (capable(CAP_SYS_ADMIN)) info.flags &= ~UBLK_F_UNPRIVILEGED_DEV; else if (!(info.flags & UBLK_F_UNPRIVILEGED_DEV)) -- GitLab From abf32d8fa10321026c5741586539da785a217a96 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Thu, 5 Sep 2024 17:00:51 +0200 Subject: [PATCH 1598/2211] drm/xe: Wire up device shutdown handler [ Upstream commit 501d799a47e2b83b4e41d5306c2266ea5c100a08 ] The system is turning off, and we should probably put the device in a safe power state. We don't need to evict VRAM or suspend running jobs to a safe state, as the device is rebooted anyway. This does not imply the system is necessarily reset, as we can kexec into a new kernel. Without shutting down, things like USB Type-C may mysteriously start failing. References: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3500 Signed-off-by: Maarten Lankhorst [mlankhorst: Add !xe_driver_flr_disabled assert] Reviewed-by: Rodrigo Vivi Link: https://patchwork.freedesktop.org/patch/msgid/20240905150052.174895-4-maarten.lankhorst@linux.intel.com Stable-dep-of: 16c1241b0875 ("drm/xe/bmg: Update Wa_16023588340") Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/display/xe_display.c | 43 +++++++++++++++++++++++++ drivers/gpu/drm/xe/display/xe_display.h | 4 +++ drivers/gpu/drm/xe/xe_device.c | 40 +++++++++++++++++++---- drivers/gpu/drm/xe/xe_gt.c | 7 ++++ drivers/gpu/drm/xe/xe_gt.h | 1 + 5 files changed, 89 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c index c6e0c8d77a70f..a1928cedc7ddf 100644 --- a/drivers/gpu/drm/xe/display/xe_display.c +++ b/drivers/gpu/drm/xe/display/xe_display.c @@ -352,6 +352,36 @@ void xe_display_pm_suspend(struct xe_device *xe) __xe_display_pm_suspend(xe, false); } +void xe_display_pm_shutdown(struct xe_device *xe) +{ + struct intel_display *display = &xe->display; + + if (!xe->info.probe_display) + return; + + intel_power_domains_disable(xe); + intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true); + if (has_display(xe)) { + drm_kms_helper_poll_disable(&xe->drm); + intel_display_driver_disable_user_access(xe); + intel_display_driver_suspend(xe); + } + + xe_display_flush_cleanup_work(xe); + intel_dp_mst_suspend(xe); + intel_hpd_cancel_work(xe); + + if (has_display(xe)) + intel_display_driver_suspend_access(xe); + + intel_encoder_suspend_all(display); + intel_encoder_shutdown_all(display); + + intel_opregion_suspend(display, PCI_D3cold); + + intel_dmc_suspend(xe); +} + void xe_display_pm_runtime_suspend(struct xe_device *xe) { if (!xe->info.probe_display) @@ -376,6 +406,19 @@ void xe_display_pm_suspend_late(struct xe_device *xe) intel_display_power_suspend_late(xe); } +void xe_display_pm_shutdown_late(struct xe_device *xe) +{ + if (!xe->info.probe_display) + return; + + /* + * The only requirement is to reboot with display DC states disabled, + * for now leaving all display power wells in the INIT power domain + * enabled. + */ + intel_power_domains_driver_remove(xe); +} + void xe_display_pm_resume_early(struct xe_device *xe) { if (!xe->info.probe_display) diff --git a/drivers/gpu/drm/xe/display/xe_display.h b/drivers/gpu/drm/xe/display/xe_display.h index bed55fd26f304..17afa537aee50 100644 --- a/drivers/gpu/drm/xe/display/xe_display.h +++ b/drivers/gpu/drm/xe/display/xe_display.h @@ -35,7 +35,9 @@ void xe_display_irq_reset(struct xe_device *xe); void xe_display_irq_postinstall(struct xe_device *xe, struct xe_gt *gt); void xe_display_pm_suspend(struct xe_device *xe); +void xe_display_pm_shutdown(struct xe_device *xe); void xe_display_pm_suspend_late(struct xe_device *xe); +void xe_display_pm_shutdown_late(struct xe_device *xe); void xe_display_pm_resume_early(struct xe_device *xe); void xe_display_pm_resume(struct xe_device *xe); void xe_display_pm_runtime_suspend(struct xe_device *xe); @@ -66,7 +68,9 @@ static inline void xe_display_irq_reset(struct xe_device *xe) {} static inline void xe_display_irq_postinstall(struct xe_device *xe, struct xe_gt *gt) {} static inline void xe_display_pm_suspend(struct xe_device *xe) {} +static inline void xe_display_pm_shutdown(struct xe_device *xe) {} static inline void xe_display_pm_suspend_late(struct xe_device *xe) {} +static inline void xe_display_pm_shutdown_late(struct xe_device *xe) {} static inline void xe_display_pm_resume_early(struct xe_device *xe) {} static inline void xe_display_pm_resume(struct xe_device *xe) {} static inline void xe_display_pm_runtime_suspend(struct xe_device *xe) {} diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c index 23e02372a49db..0c3db53b93d8a 100644 --- a/drivers/gpu/drm/xe/xe_device.c +++ b/drivers/gpu/drm/xe/xe_device.c @@ -374,6 +374,11 @@ err: return ERR_PTR(err); } +static bool xe_driver_flr_disabled(struct xe_device *xe) +{ + return xe_mmio_read32(xe_root_mmio_gt(xe), GU_CNTL_PROTECTED) & DRIVERINT_FLR_DIS; +} + /* * The driver-initiated FLR is the highest level of reset that we can trigger * from within the driver. It is different from the PCI FLR in that it doesn't @@ -387,17 +392,12 @@ err: * if/when a new instance of i915 is bound to the device it will do a full * re-init anyway. */ -static void xe_driver_flr(struct xe_device *xe) +static void __xe_driver_flr(struct xe_device *xe) { const unsigned int flr_timeout = 3 * MICRO; /* specs recommend a 3s wait */ struct xe_gt *gt = xe_root_mmio_gt(xe); int ret; - if (xe_mmio_read32(gt, GU_CNTL_PROTECTED) & DRIVERINT_FLR_DIS) { - drm_info_once(&xe->drm, "BIOS Disabled Driver-FLR\n"); - return; - } - drm_dbg(&xe->drm, "Triggering Driver-FLR\n"); /* @@ -438,6 +438,16 @@ static void xe_driver_flr(struct xe_device *xe) xe_mmio_write32(gt, GU_DEBUG, DRIVERFLR_STATUS); } +static void xe_driver_flr(struct xe_device *xe) +{ + if (xe_driver_flr_disabled(xe)) { + drm_info_once(&xe->drm, "BIOS Disabled Driver-FLR\n"); + return; + } + + __xe_driver_flr(xe); +} + static void xe_driver_flr_fini(void *arg) { struct xe_device *xe = arg; @@ -797,6 +807,24 @@ void xe_device_remove(struct xe_device *xe) void xe_device_shutdown(struct xe_device *xe) { + struct xe_gt *gt; + u8 id; + + drm_dbg(&xe->drm, "Shutting down device\n"); + + if (xe_driver_flr_disabled(xe)) { + xe_display_pm_shutdown(xe); + + xe_irq_suspend(xe); + + for_each_gt(gt, xe, id) + xe_gt_shutdown(gt); + + xe_display_pm_shutdown_late(xe); + } else { + /* BOOM! */ + __xe_driver_flr(xe); + } } /** diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c index 3a7628fb5ad32..258a6d6715679 100644 --- a/drivers/gpu/drm/xe/xe_gt.c +++ b/drivers/gpu/drm/xe/xe_gt.c @@ -865,6 +865,13 @@ err_msg: return err; } +void xe_gt_shutdown(struct xe_gt *gt) +{ + xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); + do_gt_reset(gt); + xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL); +} + /** * xe_gt_sanitize_freq() - Restore saved frequencies if necessary. * @gt: the GT object diff --git a/drivers/gpu/drm/xe/xe_gt.h b/drivers/gpu/drm/xe/xe_gt.h index ee138e9768a23..881f1cbc2c491 100644 --- a/drivers/gpu/drm/xe/xe_gt.h +++ b/drivers/gpu/drm/xe/xe_gt.h @@ -48,6 +48,7 @@ void xe_gt_record_user_engines(struct xe_gt *gt); void xe_gt_suspend_prepare(struct xe_gt *gt); int xe_gt_suspend(struct xe_gt *gt); +void xe_gt_shutdown(struct xe_gt *gt); int xe_gt_resume(struct xe_gt *gt); void xe_gt_reset_async(struct xe_gt *gt); void xe_gt_sanitize(struct xe_gt *gt); -- GitLab From d42b44736ea29fa6d0c3cb9c75569314134b7732 Mon Sep 17 00:00:00 2001 From: Himal Prasad Ghimiray Date: Mon, 14 Oct 2024 13:25:44 +0530 Subject: [PATCH 1599/2211] drm/xe/gt: Update handling of xe_force_wake_get return [ Upstream commit 30d105577a3319094f8ae5ff1ceea670f1931487 ] xe_force_wake_get() now returns the reference count-incremented domain mask. If it fails for individual domains, the return value will always be 0. However, for XE_FORCEWAKE_ALL, it may return a non-zero value even in the event of failure. Use helper xe_force_wake_ref_has_domain to verify all domains are initialized or not. Update the return handling of xe_force_wake_get() to reflect this behavior, and ensure that the return value is passed as input to xe_force_wake_put(). v3 - return xe_wakeref_t instead of int in xe_force_wake_get() - xe_force_wake_put() error doesn't need to be checked. It internally WARNS on domain ack failure. v4 - Rebase fix v5 - return unsigned int for xe_force_wake_get() - remove redundant XE_WARN_ON() v6 - use helper for checking all initialized domains are awake or not. v7 - Fix commit message v9 - Remove redundant WARN_ON (Badal) Cc: Badal Nilawar Cc: Matthew Brost Cc: Rodrigo Vivi Cc: Lucas De Marchi Signed-off-by: Himal Prasad Ghimiray Reviewed-by: Nirmoy Das Reviewed-by: Badal Nilawar Link: https://patchwork.freedesktop.org/patch/msgid/20241014075601.2324382-10-himal.prasad.ghimiray@intel.com Signed-off-by: Rodrigo Vivi Stable-dep-of: 16c1241b0875 ("drm/xe/bmg: Update Wa_16023588340") Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_gt.c | 105 ++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 47 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c index 258a6d6715679..335548e3b6b9c 100644 --- a/drivers/gpu/drm/xe/xe_gt.c +++ b/drivers/gpu/drm/xe/xe_gt.c @@ -98,14 +98,14 @@ void xe_gt_sanitize(struct xe_gt *gt) static void xe_gt_enable_host_l2_vram(struct xe_gt *gt) { + unsigned int fw_ref; u32 reg; - int err; if (!XE_WA(gt, 16023588340)) return; - err = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT); - if (WARN_ON(err)) + fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT); + if (!fw_ref) return; if (!xe_gt_is_media_type(gt)) { @@ -115,13 +115,13 @@ static void xe_gt_enable_host_l2_vram(struct xe_gt *gt) } xe_gt_mcr_multicast_write(gt, XEHPC_L3CLOS_MASK(3), 0x3); - xe_force_wake_put(gt_to_fw(gt), XE_FW_GT); + xe_force_wake_put(gt_to_fw(gt), fw_ref); } static void xe_gt_disable_host_l2_vram(struct xe_gt *gt) { + unsigned int fw_ref; u32 reg; - int err; if (!XE_WA(gt, 16023588340)) return; @@ -129,15 +129,15 @@ static void xe_gt_disable_host_l2_vram(struct xe_gt *gt) if (xe_gt_is_media_type(gt)) return; - err = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT); - if (WARN_ON(err)) + fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT); + if (!fw_ref) return; reg = xe_gt_mcr_unicast_read_any(gt, XE2_GAMREQSTRM_CTRL); reg &= ~CG_DIS_CNTLBUS; xe_gt_mcr_multicast_write(gt, XE2_GAMREQSTRM_CTRL, reg); - xe_force_wake_put(gt_to_fw(gt), XE_FW_GT); + xe_force_wake_put(gt_to_fw(gt), fw_ref); } /** @@ -405,11 +405,14 @@ static void dump_pat_on_error(struct xe_gt *gt) static int gt_fw_domain_init(struct xe_gt *gt) { + unsigned int fw_ref; int err, i; - err = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT); - if (err) + fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT); + if (!fw_ref) { + err = -ETIMEDOUT; goto err_hw_fence_irq; + } if (!xe_gt_is_media_type(gt)) { err = xe_ggtt_init(gt_to_tile(gt)->mem.ggtt); @@ -444,14 +447,12 @@ static int gt_fw_domain_init(struct xe_gt *gt) */ gt->info.gmdid = xe_mmio_read32(gt, GMD_ID); - err = xe_force_wake_put(gt_to_fw(gt), XE_FW_GT); - XE_WARN_ON(err); - + xe_force_wake_put(gt_to_fw(gt), fw_ref); return 0; err_force_wake: dump_pat_on_error(gt); - xe_force_wake_put(gt_to_fw(gt), XE_FW_GT); + xe_force_wake_put(gt_to_fw(gt), fw_ref); err_hw_fence_irq: for (i = 0; i < XE_ENGINE_CLASS_MAX; ++i) xe_hw_fence_irq_finish(>->fence_irq[i]); @@ -461,11 +462,14 @@ err_hw_fence_irq: static int all_fw_domain_init(struct xe_gt *gt) { + unsigned int fw_ref; int err, i; - err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); - if (err) - goto err_hw_fence_irq; + fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); + if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL)) { + err = -ETIMEDOUT; + goto err_force_wake; + } xe_gt_mcr_set_implicit_defaults(gt); xe_wa_process_gt(gt); @@ -531,14 +535,12 @@ static int all_fw_domain_init(struct xe_gt *gt) if (IS_SRIOV_PF(gt_to_xe(gt))) xe_gt_sriov_pf_init_hw(gt); - err = xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL); - XE_WARN_ON(err); + xe_force_wake_put(gt_to_fw(gt), fw_ref); return 0; err_force_wake: - xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL); -err_hw_fence_irq: + xe_force_wake_put(gt_to_fw(gt), fw_ref); for (i = 0; i < XE_ENGINE_CLASS_MAX; ++i) xe_hw_fence_irq_finish(>->fence_irq[i]); @@ -551,11 +553,12 @@ err_hw_fence_irq: */ int xe_gt_init_hwconfig(struct xe_gt *gt) { + unsigned int fw_ref; int err; - err = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT); - if (err) - goto out; + fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT); + if (!fw_ref) + return -ETIMEDOUT; xe_gt_mcr_init_early(gt); xe_pat_init(gt); @@ -573,8 +576,7 @@ int xe_gt_init_hwconfig(struct xe_gt *gt) xe_gt_enable_host_l2_vram(gt); out_fw: - xe_force_wake_put(gt_to_fw(gt), XE_FW_GT); -out: + xe_force_wake_put(gt_to_fw(gt), fw_ref); return err; } @@ -744,6 +746,7 @@ static int do_gt_restart(struct xe_gt *gt) static int gt_reset(struct xe_gt *gt) { + unsigned int fw_ref; int err; if (xe_device_wedged(gt_to_xe(gt))) @@ -764,9 +767,11 @@ static int gt_reset(struct xe_gt *gt) xe_gt_sanitize(gt); - err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); - if (err) - goto err_msg; + fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); + if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL)) { + err = -ETIMEDOUT; + goto err_out; + } xe_uc_gucrc_disable(>->uc); xe_uc_stop_prepare(>->uc); @@ -784,8 +789,7 @@ static int gt_reset(struct xe_gt *gt) if (err) goto err_out; - err = xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL); - XE_WARN_ON(err); + xe_force_wake_put(gt_to_fw(gt), fw_ref); xe_pm_runtime_put(gt_to_xe(gt)); xe_gt_info(gt, "reset done\n"); @@ -793,8 +797,7 @@ static int gt_reset(struct xe_gt *gt) return 0; err_out: - XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL)); -err_msg: + xe_force_wake_put(gt_to_fw(gt), fw_ref); XE_WARN_ON(xe_uc_start(>->uc)); err_fail: xe_gt_err(gt, "reset failed (%pe)\n", ERR_PTR(err)); @@ -826,22 +829,25 @@ void xe_gt_reset_async(struct xe_gt *gt) void xe_gt_suspend_prepare(struct xe_gt *gt) { - XE_WARN_ON(xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL)); + unsigned int fw_ref; + + fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); xe_uc_suspend_prepare(>->uc); - XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL)); + xe_force_wake_put(gt_to_fw(gt), fw_ref); } int xe_gt_suspend(struct xe_gt *gt) { + unsigned int fw_ref; int err; xe_gt_dbg(gt, "suspending\n"); xe_gt_sanitize(gt); - err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); - if (err) + fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); + if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL)) goto err_msg; err = xe_uc_suspend(>->uc); @@ -852,14 +858,15 @@ int xe_gt_suspend(struct xe_gt *gt) xe_gt_disable_host_l2_vram(gt); - XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL)); + xe_force_wake_put(gt_to_fw(gt), fw_ref); xe_gt_dbg(gt, "suspended\n"); return 0; -err_force_wake: - XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL)); err_msg: + err = -ETIMEDOUT; +err_force_wake: + xe_force_wake_put(gt_to_fw(gt), fw_ref); xe_gt_err(gt, "suspend failed (%pe)\n", ERR_PTR(err)); return err; @@ -867,9 +874,11 @@ err_msg: void xe_gt_shutdown(struct xe_gt *gt) { - xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); + unsigned int fw_ref; + + fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); do_gt_reset(gt); - xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL); + xe_force_wake_put(gt_to_fw(gt), fw_ref); } /** @@ -894,11 +903,12 @@ int xe_gt_sanitize_freq(struct xe_gt *gt) int xe_gt_resume(struct xe_gt *gt) { + unsigned int fw_ref; int err; xe_gt_dbg(gt, "resuming\n"); - err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); - if (err) + fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); + if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL)) goto err_msg; err = do_gt_restart(gt); @@ -907,14 +917,15 @@ int xe_gt_resume(struct xe_gt *gt) xe_gt_idle_enable_pg(gt); - XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL)); + xe_force_wake_put(gt_to_fw(gt), fw_ref); xe_gt_dbg(gt, "resumed\n"); return 0; -err_force_wake: - XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL)); err_msg: + err = -ETIMEDOUT; +err_force_wake: + xe_force_wake_put(gt_to_fw(gt), fw_ref); xe_gt_err(gt, "resume failed (%pe)\n", ERR_PTR(err)); return err; -- GitLab From 929544ba3c35a13f9ad473ed7fd4698738db5659 Mon Sep 17 00:00:00 2001 From: Vinay Belgaumkar Date: Thu, 12 Jun 2025 00:09:01 -0700 Subject: [PATCH 1600/2211] drm/xe/bmg: Update Wa_16023588340 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 16c1241b08751a67cd7a0221ea9f82b0b02806f4 ] This allows for additional L2 caching modes. Fixes: 01570b446939 ("drm/xe/bmg: implement Wa_16023588340") Cc: Matthew Auld Reviewed-by: Matthew Auld Signed-off-by: Vinay Belgaumkar Link: https://lore.kernel.org/r/20250612-wa-14022085890-v4-2-94ba5dcc1e30@intel.com Signed-off-by: Lucas De Marchi (cherry picked from commit 6ab42fa03d4c88a0ddf5e56e62794853b198e7bf) Signed-off-by: Thomas Hellström Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_gt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c index 335548e3b6b9c..231ed53cf907c 100644 --- a/drivers/gpu/drm/xe/xe_gt.c +++ b/drivers/gpu/drm/xe/xe_gt.c @@ -114,7 +114,7 @@ static void xe_gt_enable_host_l2_vram(struct xe_gt *gt) xe_gt_mcr_multicast_write(gt, XE2_GAMREQSTRM_CTRL, reg); } - xe_gt_mcr_multicast_write(gt, XEHPC_L3CLOS_MASK(3), 0x3); + xe_gt_mcr_multicast_write(gt, XEHPC_L3CLOS_MASK(3), 0xF); xe_force_wake_put(gt_to_fw(gt), fw_ref); } -- GitLab From 988edde4d52d5c02ea4dd95d7619372a5e2fb7b7 Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Tue, 17 Jun 2025 15:40:42 -0700 Subject: [PATCH 1601/2211] calipso: Fix null-ptr-deref in calipso_req_{set,del}attr(). [ Upstream commit 10876da918fa1aec0227fb4c67647513447f53a9 ] syzkaller reported a null-ptr-deref in sock_omalloc() while allocating a CALIPSO option. [0] The NULL is of struct sock, which was fetched by sk_to_full_sk() in calipso_req_setattr(). Since commit a1a5344ddbe8 ("tcp: avoid two atomic ops for syncookies"), reqsk->rsk_listener could be NULL when SYN Cookie is returned to its client, as hinted by the leading SYN Cookie log. Here are 3 options to fix the bug: 1) Return 0 in calipso_req_setattr() 2) Return an error in calipso_req_setattr() 3) Alaways set rsk_listener 1) is no go as it bypasses LSM, but 2) effectively disables SYN Cookie for CALIPSO. 3) is also no go as there have been many efforts to reduce atomic ops and make TCP robust against DDoS. See also commit 3b24d854cb35 ("tcp/dccp: do not touch listener sk_refcnt under synflood"). As of the blamed commit, SYN Cookie already did not need refcounting, and no one has stumbled on the bug for 9 years, so no CALIPSO user will care about SYN Cookie. Let's return an error in calipso_req_setattr() and calipso_req_delattr() in the SYN Cookie case. This can be reproduced by [1] on Fedora and now connect() of nc times out. [0]: TCP: request_sock_TCPv6: Possible SYN flooding on port [::]:20002. Sending cookies. Oops: general protection fault, probably for non-canonical address 0xdffffc0000000006: 0000 [#1] PREEMPT SMP KASAN NOPTI KASAN: null-ptr-deref in range [0x0000000000000030-0x0000000000000037] CPU: 3 UID: 0 PID: 12262 Comm: syz.1.2611 Not tainted 6.14.0 #2 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014 RIP: 0010:read_pnet include/net/net_namespace.h:406 [inline] RIP: 0010:sock_net include/net/sock.h:655 [inline] RIP: 0010:sock_kmalloc+0x35/0x170 net/core/sock.c:2806 Code: 89 d5 41 54 55 89 f5 53 48 89 fb e8 25 e3 c6 fd e8 f0 91 e3 00 48 8d 7b 30 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 <80> 3c 02 00 0f 85 26 01 00 00 48 b8 00 00 00 00 00 fc ff df 4c 8b RSP: 0018:ffff88811af89038 EFLAGS: 00010216 RAX: dffffc0000000000 RBX: 0000000000000000 RCX: ffff888105266400 RDX: 0000000000000006 RSI: ffff88800c890000 RDI: 0000000000000030 RBP: 0000000000000050 R08: 0000000000000000 R09: ffff88810526640e R10: ffffed1020a4cc81 R11: ffff88810526640f R12: 0000000000000000 R13: 0000000000000820 R14: ffff888105266400 R15: 0000000000000050 FS: 00007f0653a07640(0000) GS:ffff88811af80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f863ba096f4 CR3: 00000000163c0005 CR4: 0000000000770ef0 PKRU: 80000000 Call Trace: ipv6_renew_options+0x279/0x950 net/ipv6/exthdrs.c:1288 calipso_req_setattr+0x181/0x340 net/ipv6/calipso.c:1204 calipso_req_setattr+0x56/0x80 net/netlabel/netlabel_calipso.c:597 netlbl_req_setattr+0x18a/0x440 net/netlabel/netlabel_kapi.c:1249 selinux_netlbl_inet_conn_request+0x1fb/0x320 security/selinux/netlabel.c:342 selinux_inet_conn_request+0x1eb/0x2c0 security/selinux/hooks.c:5551 security_inet_conn_request+0x50/0xa0 security/security.c:4945 tcp_v6_route_req+0x22c/0x550 net/ipv6/tcp_ipv6.c:825 tcp_conn_request+0xec8/0x2b70 net/ipv4/tcp_input.c:7275 tcp_v6_conn_request+0x1e3/0x440 net/ipv6/tcp_ipv6.c:1328 tcp_rcv_state_process+0xafa/0x52b0 net/ipv4/tcp_input.c:6781 tcp_v6_do_rcv+0x8a6/0x1a40 net/ipv6/tcp_ipv6.c:1667 tcp_v6_rcv+0x505e/0x5b50 net/ipv6/tcp_ipv6.c:1904 ip6_protocol_deliver_rcu+0x17c/0x1da0 net/ipv6/ip6_input.c:436 ip6_input_finish+0x103/0x180 net/ipv6/ip6_input.c:480 NF_HOOK include/linux/netfilter.h:314 [inline] NF_HOOK include/linux/netfilter.h:308 [inline] ip6_input+0x13c/0x6b0 net/ipv6/ip6_input.c:491 dst_input include/net/dst.h:469 [inline] ip6_rcv_finish net/ipv6/ip6_input.c:79 [inline] ip6_rcv_finish+0xb6/0x490 net/ipv6/ip6_input.c:69 NF_HOOK include/linux/netfilter.h:314 [inline] NF_HOOK include/linux/netfilter.h:308 [inline] ipv6_rcv+0xf9/0x490 net/ipv6/ip6_input.c:309 __netif_receive_skb_one_core+0x12e/0x1f0 net/core/dev.c:5896 __netif_receive_skb+0x1d/0x170 net/core/dev.c:6009 process_backlog+0x41e/0x13b0 net/core/dev.c:6357 __napi_poll+0xbd/0x710 net/core/dev.c:7191 napi_poll net/core/dev.c:7260 [inline] net_rx_action+0x9de/0xde0 net/core/dev.c:7382 handle_softirqs+0x19a/0x770 kernel/softirq.c:561 do_softirq.part.0+0x36/0x70 kernel/softirq.c:462 do_softirq arch/x86/include/asm/preempt.h:26 [inline] __local_bh_enable_ip+0xf1/0x110 kernel/softirq.c:389 local_bh_enable include/linux/bottom_half.h:33 [inline] rcu_read_unlock_bh include/linux/rcupdate.h:919 [inline] __dev_queue_xmit+0xc2a/0x3c40 net/core/dev.c:4679 dev_queue_xmit include/linux/netdevice.h:3313 [inline] neigh_hh_output include/net/neighbour.h:523 [inline] neigh_output include/net/neighbour.h:537 [inline] ip6_finish_output2+0xd69/0x1f80 net/ipv6/ip6_output.c:141 __ip6_finish_output net/ipv6/ip6_output.c:215 [inline] ip6_finish_output+0x5dc/0xd60 net/ipv6/ip6_output.c:226 NF_HOOK_COND include/linux/netfilter.h:303 [inline] ip6_output+0x24b/0x8d0 net/ipv6/ip6_output.c:247 dst_output include/net/dst.h:459 [inline] NF_HOOK include/linux/netfilter.h:314 [inline] NF_HOOK include/linux/netfilter.h:308 [inline] ip6_xmit+0xbbc/0x20d0 net/ipv6/ip6_output.c:366 inet6_csk_xmit+0x39a/0x720 net/ipv6/inet6_connection_sock.c:135 __tcp_transmit_skb+0x1a7b/0x3b40 net/ipv4/tcp_output.c:1471 tcp_transmit_skb net/ipv4/tcp_output.c:1489 [inline] tcp_send_syn_data net/ipv4/tcp_output.c:4059 [inline] tcp_connect+0x1c0c/0x4510 net/ipv4/tcp_output.c:4148 tcp_v6_connect+0x156c/0x2080 net/ipv6/tcp_ipv6.c:333 __inet_stream_connect+0x3a7/0xed0 net/ipv4/af_inet.c:677 tcp_sendmsg_fastopen+0x3e2/0x710 net/ipv4/tcp.c:1039 tcp_sendmsg_locked+0x1e82/0x3570 net/ipv4/tcp.c:1091 tcp_sendmsg+0x2f/0x50 net/ipv4/tcp.c:1358 inet6_sendmsg+0xb9/0x150 net/ipv6/af_inet6.c:659 sock_sendmsg_nosec net/socket.c:718 [inline] __sock_sendmsg+0xf4/0x2a0 net/socket.c:733 __sys_sendto+0x29a/0x390 net/socket.c:2187 __do_sys_sendto net/socket.c:2194 [inline] __se_sys_sendto net/socket.c:2190 [inline] __x64_sys_sendto+0xe1/0x1c0 net/socket.c:2190 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xc3/0x1d0 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f06553c47ed Code: 02 b8 ff ff ff ff c3 66 0f 1f 44 00 00 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 a8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f0653a06fc8 EFLAGS: 00000246 ORIG_RAX: 000000000000002c RAX: ffffffffffffffda RBX: 00007f0655605fa0 RCX: 00007f06553c47ed RDX: 0000000000000000 RSI: 0000000000000000 RDI: 000000000000000b RBP: 00007f065545db38 R08: 0000200000000140 R09: 000000000000001c R10: f7384d4ea84b01bd R11: 0000000000000246 R12: 0000000000000000 R13: 00007f0655605fac R14: 00007f0655606038 R15: 00007f06539e7000 Modules linked in: [1]: dnf install -y selinux-policy-targeted policycoreutils netlabel_tools procps-ng nmap-ncat mount -t selinuxfs none /sys/fs/selinux load_policy netlabelctl calipso add pass doi:1 netlabelctl map del default netlabelctl map add default address:::1 protocol:calipso,1 sysctl net.ipv4.tcp_syncookies=2 nc -l ::1 80 & nc ::1 80 Fixes: e1adea927080 ("calipso: Allow request sockets to be relabelled by the lsm.") Reported-by: syzkaller Reported-by: John Cheung Closes: https://lore.kernel.org/netdev/CAP=Rh=MvfhrGADy+-WJiftV2_WzMH4VEhEFmeT28qY+4yxNu4w@mail.gmail.com/ Signed-off-by: Kuniyuki Iwashima Acked-by: Paul Moore Link: https://patch.msgid.link/20250617224125.17299-1-kuni1840@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/ipv6/calipso.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/net/ipv6/calipso.c b/net/ipv6/calipso.c index 62618a058b8fa..a247bb93908bf 100644 --- a/net/ipv6/calipso.c +++ b/net/ipv6/calipso.c @@ -1207,6 +1207,10 @@ static int calipso_req_setattr(struct request_sock *req, struct ipv6_opt_hdr *old, *new; struct sock *sk = sk_to_full_sk(req_to_sk(req)); + /* sk is NULL for SYN+ACK w/ SYN Cookie */ + if (!sk) + return -ENOMEM; + if (req_inet->ipv6_opt && req_inet->ipv6_opt->hopopt) old = req_inet->ipv6_opt->hopopt; else @@ -1247,6 +1251,10 @@ static void calipso_req_delattr(struct request_sock *req) struct ipv6_txoptions *txopts; struct sock *sk = sk_to_full_sk(req_to_sk(req)); + /* sk is NULL for SYN+ACK w/ SYN Cookie */ + if (!sk) + return; + if (!req_inet->ipv6_opt || !req_inet->ipv6_opt->hopopt) return; -- GitLab From b4603bf956c42241aa407e903d2f330f7a913821 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Wed, 18 Jun 2025 13:59:02 +0000 Subject: [PATCH 1602/2211] mlxbf_gige: return EPROBE_DEFER if PHY IRQ is not available [ Upstream commit e7ea5f5b1858ddb96b152584d5fe06e6fc623e89 ] The message "Error getting PHY irq. Use polling instead" is emitted when the mlxbf_gige driver is loaded by the kernel before the associated gpio-mlxbf driver, and thus the call to get the PHY IRQ fails since it is not yet available. The driver probe() must return -EPROBE_DEFER if acpi_dev_gpio_irq_get_by() returns the same. Fixes: 6c2a6ddca763 ("net: mellanox: mlxbf_gige: Replace non-standard interrupt handling") Signed-off-by: David Thompson Reviewed-by: Asmaa Mnebhi Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250618135902.346-1-davthompson@nvidia.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c index 385a56ac73481..c82254a8ae661 100644 --- a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c +++ b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c @@ -447,8 +447,10 @@ static int mlxbf_gige_probe(struct platform_device *pdev) priv->llu_plu_irq = platform_get_irq(pdev, MLXBF_GIGE_LLU_PLU_INTR_IDX); phy_irq = acpi_dev_gpio_irq_get_by(ACPI_COMPANION(&pdev->dev), "phy", 0); - if (phy_irq < 0) { - dev_err(&pdev->dev, "Error getting PHY irq. Use polling instead"); + if (phy_irq == -EPROBE_DEFER) { + err = -EPROBE_DEFER; + goto out; + } else if (phy_irq < 0) { phy_irq = PHY_POLL; } -- GitLab From f4d80b16ecc4229f7e6345158ef34c36be323f0e Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 18 Jun 2025 14:08:43 +0000 Subject: [PATCH 1603/2211] net: atm: add lec_mutex [ Upstream commit d13a3824bfd2b4774b671a75cf766a16637a0e67 ] syzbot found its way in net/atm/lec.c, and found an error path in lecd_attach() could leave a dangling pointer in dev_lec[]. Add a mutex to protect dev_lecp[] uses from lecd_attach(), lec_vcc_attach() and lec_mcast_attach(). Following patch will use this mutex for /proc/net/atm/lec. BUG: KASAN: slab-use-after-free in lecd_attach net/atm/lec.c:751 [inline] BUG: KASAN: slab-use-after-free in lane_ioctl+0x2224/0x23e0 net/atm/lec.c:1008 Read of size 8 at addr ffff88807c7b8e68 by task syz.1.17/6142 CPU: 1 UID: 0 PID: 6142 Comm: syz.1.17 Not tainted 6.16.0-rc1-syzkaller-00239-g08215f5486ec #0 PREEMPT(full) Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/07/2025 Call Trace: __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:408 [inline] print_report+0xcd/0x680 mm/kasan/report.c:521 kasan_report+0xe0/0x110 mm/kasan/report.c:634 lecd_attach net/atm/lec.c:751 [inline] lane_ioctl+0x2224/0x23e0 net/atm/lec.c:1008 do_vcc_ioctl+0x12c/0x930 net/atm/ioctl.c:159 sock_do_ioctl+0x118/0x280 net/socket.c:1190 sock_ioctl+0x227/0x6b0 net/socket.c:1311 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:907 [inline] __se_sys_ioctl fs/ioctl.c:893 [inline] __x64_sys_ioctl+0x18e/0x210 fs/ioctl.c:893 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xcd/0x4c0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f Allocated by task 6132: kasan_save_stack+0x33/0x60 mm/kasan/common.c:47 kasan_save_track+0x14/0x30 mm/kasan/common.c:68 poison_kmalloc_redzone mm/kasan/common.c:377 [inline] __kasan_kmalloc+0xaa/0xb0 mm/kasan/common.c:394 kasan_kmalloc include/linux/kasan.h:260 [inline] __do_kmalloc_node mm/slub.c:4328 [inline] __kvmalloc_node_noprof+0x27b/0x620 mm/slub.c:5015 alloc_netdev_mqs+0xd2/0x1570 net/core/dev.c:11711 lecd_attach net/atm/lec.c:737 [inline] lane_ioctl+0x17db/0x23e0 net/atm/lec.c:1008 do_vcc_ioctl+0x12c/0x930 net/atm/ioctl.c:159 sock_do_ioctl+0x118/0x280 net/socket.c:1190 sock_ioctl+0x227/0x6b0 net/socket.c:1311 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:907 [inline] __se_sys_ioctl fs/ioctl.c:893 [inline] __x64_sys_ioctl+0x18e/0x210 fs/ioctl.c:893 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xcd/0x4c0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f Freed by task 6132: kasan_save_stack+0x33/0x60 mm/kasan/common.c:47 kasan_save_track+0x14/0x30 mm/kasan/common.c:68 kasan_save_free_info+0x3b/0x60 mm/kasan/generic.c:576 poison_slab_object mm/kasan/common.c:247 [inline] __kasan_slab_free+0x51/0x70 mm/kasan/common.c:264 kasan_slab_free include/linux/kasan.h:233 [inline] slab_free_hook mm/slub.c:2381 [inline] slab_free mm/slub.c:4643 [inline] kfree+0x2b4/0x4d0 mm/slub.c:4842 free_netdev+0x6c5/0x910 net/core/dev.c:11892 lecd_attach net/atm/lec.c:744 [inline] lane_ioctl+0x1ce8/0x23e0 net/atm/lec.c:1008 do_vcc_ioctl+0x12c/0x930 net/atm/ioctl.c:159 sock_do_ioctl+0x118/0x280 net/socket.c:1190 sock_ioctl+0x227/0x6b0 net/socket.c:1311 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:907 [inline] __se_sys_ioctl fs/ioctl.c:893 [inline] __x64_sys_ioctl+0x18e/0x210 fs/ioctl.c:893 Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Reported-by: syzbot+8b64dec3affaed7b3af5@syzkaller.appspotmail.com Closes: https://lore.kernel.org/netdev/6852c6f6.050a0220.216029.0018.GAE@google.com/T/#u Signed-off-by: Eric Dumazet Link: https://patch.msgid.link/20250618140844.1686882-2-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/atm/lec.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/net/atm/lec.c b/net/atm/lec.c index a948dd47c3f34..09c042e1e4696 100644 --- a/net/atm/lec.c +++ b/net/atm/lec.c @@ -124,6 +124,7 @@ static unsigned char bus_mac[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; /* Device structures */ static struct net_device *dev_lec[MAX_LEC_ITF]; +static DEFINE_MUTEX(lec_mutex); #if IS_ENABLED(CONFIG_BRIDGE) static void lec_handle_bridge(struct sk_buff *skb, struct net_device *dev) @@ -685,6 +686,7 @@ static int lec_vcc_attach(struct atm_vcc *vcc, void __user *arg) int bytes_left; struct atmlec_ioc ioc_data; + lockdep_assert_held(&lec_mutex); /* Lecd must be up in this case */ bytes_left = copy_from_user(&ioc_data, arg, sizeof(struct atmlec_ioc)); if (bytes_left != 0) @@ -710,6 +712,7 @@ static int lec_vcc_attach(struct atm_vcc *vcc, void __user *arg) static int lec_mcast_attach(struct atm_vcc *vcc, int arg) { + lockdep_assert_held(&lec_mutex); if (arg < 0 || arg >= MAX_LEC_ITF) return -EINVAL; arg = array_index_nospec(arg, MAX_LEC_ITF); @@ -725,6 +728,7 @@ static int lecd_attach(struct atm_vcc *vcc, int arg) int i; struct lec_priv *priv; + lockdep_assert_held(&lec_mutex); if (arg < 0) arg = 0; if (arg >= MAX_LEC_ITF) @@ -742,6 +746,7 @@ static int lecd_attach(struct atm_vcc *vcc, int arg) snprintf(dev_lec[i]->name, IFNAMSIZ, "lec%d", i); if (register_netdev(dev_lec[i])) { free_netdev(dev_lec[i]); + dev_lec[i] = NULL; return -EINVAL; } @@ -1003,6 +1008,7 @@ static int lane_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) return -ENOIOCTLCMD; } + mutex_lock(&lec_mutex); switch (cmd) { case ATMLEC_CTRL: err = lecd_attach(vcc, (int)arg); @@ -1017,6 +1023,7 @@ static int lane_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) break; } + mutex_unlock(&lec_mutex); return err; } -- GitLab From 5fe1b23a2f87f43aeeac51e08819cbc6fd808cbc Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 18 Jun 2025 14:08:44 +0000 Subject: [PATCH 1604/2211] net: atm: fix /proc/net/atm/lec handling [ Upstream commit d03b79f459c7935cff830d98373474f440bd03ae ] /proc/net/atm/lec must ensure safety against dev_lec[] changes. It appears it had dev_put() calls without prior dev_hold(), leading to imbalance and UAF. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Eric Dumazet Acked-by: Francois Romieu # Minor atm contributor Link: https://patch.msgid.link/20250618140844.1686882-3-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/atm/lec.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/net/atm/lec.c b/net/atm/lec.c index 09c042e1e4696..42e8047c65105 100644 --- a/net/atm/lec.c +++ b/net/atm/lec.c @@ -909,7 +909,6 @@ static void *lec_itf_walk(struct lec_state *state, loff_t *l) v = (dev && netdev_priv(dev)) ? lec_priv_walk(state, l, netdev_priv(dev)) : NULL; if (!v && dev) { - dev_put(dev); /* Partial state reset for the next time we get called */ dev = NULL; } @@ -933,6 +932,7 @@ static void *lec_seq_start(struct seq_file *seq, loff_t *pos) { struct lec_state *state = seq->private; + mutex_lock(&lec_mutex); state->itf = 0; state->dev = NULL; state->locked = NULL; @@ -950,8 +950,9 @@ static void lec_seq_stop(struct seq_file *seq, void *v) if (state->dev) { spin_unlock_irqrestore(&state->locked->lec_arp_lock, state->flags); - dev_put(state->dev); + state->dev = NULL; } + mutex_unlock(&lec_mutex); } static void *lec_seq_next(struct seq_file *seq, void *v, loff_t *pos) -- GitLab From 031d274c7bc2ff30349b12b1949ec49806762758 Mon Sep 17 00:00:00 2001 From: Avadhut Naik Date: Fri, 13 Jun 2025 00:51:35 +0000 Subject: [PATCH 1605/2211] EDAC/amd64: Correct number of UMCs for family 19h models 70h-7fh commit b2e673ae53ef4b943f68585207a5f21cfc9a0714 upstream. AMD's Family 19h-based Models 70h-7fh support 4 unified memory controllers (UMC) per processor die. The amd64_edac driver, however, assumes only 2 UMCs are supported since max_mcs variable for the models has not been explicitly set to 4. The same results in incomplete or incorrect memory information being logged to dmesg by the module during initialization in some instances. Fixes: 6c79e42169fe ("EDAC/amd64: Add support for ECC on family 19h model 60h-7Fh") Closes: https://lore.kernel.org/all/27dc093f-ce27-4c71-9e81-786150a040b6@reox.at/ Reported-by: reox Signed-off-by: Avadhut Naik Signed-off-by: Borislav Petkov (AMD) Cc: stable@kernel.org Link: https://lore.kernel.org/20250613005233.2330627-1-avadhut.naik@amd.com Signed-off-by: Greg Kroah-Hartman --- drivers/edac/amd64_edac.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 5d356b7c45897..c0a8f9c8d4f0b 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c @@ -3882,6 +3882,7 @@ static int per_family_init(struct amd64_pvt *pvt) break; case 0x70 ... 0x7f: pvt->ctl_name = "F19h_M70h"; + pvt->max_mcs = 4; pvt->flags.zn_regs_v2 = 1; break; case 0x90 ... 0x9f: -- GitLab From a5b7c237ea36c2fac7669e51450c2c072de25d56 Mon Sep 17 00:00:00 2001 From: Akhil R Date: Tue, 3 Jun 2025 21:00:20 +0530 Subject: [PATCH 1606/2211] dt-bindings: i2c: nvidia,tegra20-i2c: Specify the required properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 903cc7096db22f889d48e2cee8840709ce04fdac upstream. Specify the properties which are essential and which are not for the Tegra I2C driver to function correctly. This was not added correctly when the TXT binding was converted to yaml. All the existing DT nodes have these properties already and hence this does not break the ABI. dmas and dma-names which were specified as a must in the TXT binding is now made optional since the driver can work in PIO mode if dmas are missing. Fixes: f10a9b722f80 ("dt-bindings: i2c: tegra: Convert to json-schema”) Signed-off-by: Akhil R Cc: # v5.17+ Reviewed-by: Krzysztof Kozlowski Signed-off-by: Andi Shyti Link: https://lore.kernel.org/r/20250603153022.39434-1-akhilrajeev@nvidia.com Signed-off-by: Greg Kroah-Hartman --- .../bindings/i2c/nvidia,tegra20-i2c.yaml | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/i2c/nvidia,tegra20-i2c.yaml b/Documentation/devicetree/bindings/i2c/nvidia,tegra20-i2c.yaml index b57ae6963e629..6b6f6762d122f 100644 --- a/Documentation/devicetree/bindings/i2c/nvidia,tegra20-i2c.yaml +++ b/Documentation/devicetree/bindings/i2c/nvidia,tegra20-i2c.yaml @@ -97,7 +97,10 @@ properties: resets: items: - - description: module reset + - description: + Module reset. This property is optional for controllers in Tegra194, + Tegra234 etc where an internal software reset is available as an + alternative. reset-names: items: @@ -116,6 +119,13 @@ properties: - const: rx - const: tx +required: + - compatible + - reg + - interrupts + - clocks + - clock-names + allOf: - $ref: /schemas/i2c/i2c-controller.yaml - if: @@ -169,6 +179,18 @@ allOf: properties: power-domains: false + - if: + not: + properties: + compatible: + contains: + enum: + - nvidia,tegra194-i2c + then: + required: + - resets + - reset-names + unevaluatedProperties: false examples: -- GitLab From 43f26094d6702e494e800532c3f1606e7a68eb30 Mon Sep 17 00:00:00 2001 From: Paul Aurich Date: Wed, 20 Nov 2024 08:01:54 -0800 Subject: [PATCH 1607/2211] smb: Log an error when close_all_cached_dirs fails commit a2182743a8b4969481f64aec4908ff162e8a206c upstream. Under low-memory conditions, close_all_cached_dirs() can't move the dentries to a separate list to dput() them once the locks are dropped. This will result in a "Dentry still in use" error, so add an error message that makes it clear this is what happened: [ 495.281119] CIFS: VFS: \\otters.example.com\share Out of memory while dropping dentries [ 495.281595] ------------[ cut here ]------------ [ 495.281887] BUG: Dentry ffff888115531138{i=78,n=/} still in use (2) [unmount of cifs cifs] [ 495.282391] WARNING: CPU: 1 PID: 2329 at fs/dcache.c:1536 umount_check+0xc8/0xf0 Also, bail out of looping through all tcons as soon as a single allocation fails, since we're already in trouble, and kmalloc() attempts for subseqeuent tcons are likely to fail just like the first one did. Signed-off-by: Paul Aurich Acked-by: Bharath SM Suggested-by: Ruben Devos Cc: stable@vger.kernel.org Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/cached_dir.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/smb/client/cached_dir.c b/fs/smb/client/cached_dir.c index 7497946672953..d64742ba371aa 100644 --- a/fs/smb/client/cached_dir.c +++ b/fs/smb/client/cached_dir.c @@ -484,8 +484,17 @@ void close_all_cached_dirs(struct cifs_sb_info *cifs_sb) spin_lock(&cfids->cfid_list_lock); list_for_each_entry(cfid, &cfids->entries, entry) { tmp_list = kmalloc(sizeof(*tmp_list), GFP_ATOMIC); - if (tmp_list == NULL) - break; + if (tmp_list == NULL) { + /* + * If the malloc() fails, we won't drop all + * dentries, and unmounting is likely to trigger + * a 'Dentry still in use' error. + */ + cifs_tcon_dbg(VFS, "Out of memory while dropping dentries\n"); + spin_unlock(&cfids->cfid_list_lock); + spin_unlock(&cifs_sb->tlink_tree_lock); + goto done; + } spin_lock(&cfid->fid_lock); tmp_list->dentry = cfid->dentry; cfid->dentry = NULL; @@ -497,6 +506,7 @@ void close_all_cached_dirs(struct cifs_sb_info *cifs_sb) } spin_unlock(&cifs_sb->tlink_tree_lock); +done: list_for_each_entry_safe(tmp_list, q, &entry, entry) { list_del(&tmp_list->entry); dput(tmp_list->dentry); -- GitLab From 966dbf35e36f81541d0ba69d24a5131109fcbb5e Mon Sep 17 00:00:00 2001 From: Claudiu Beznea Date: Thu, 16 Jan 2025 20:22:48 +0200 Subject: [PATCH 1608/2211] serial: sh-sci: Clean sci_ports[0] after at earlycon exit commit 5f1017069933489add0c08659673443c9905659e upstream. The early_console_setup() function initializes sci_ports[0].port with an object of type struct uart_port obtained from the struct earlycon_device passed as an argument to early_console_setup(). Later, during serial port probing, the serial port used as earlycon (e.g., port A) might be remapped to a different position in the sci_ports[] array, and a different serial port (e.g., port B) might be assigned to slot 0. For example: sci_ports[0] = port B sci_ports[X] = port A In this scenario, the new port mapped at index zero (port B) retains the data associated with the earlycon configuration. Consequently, after the Linux boot process, any access to the serial port now mapped to sci_ports[0] (port B) will block the original earlycon port (port A). To address this, introduce an early_console_exit() function to clean up sci_ports[0] when earlycon is exited. To prevent the cleanup of sci_ports[0] while the serial device is still being used by earlycon, introduce the struct sci_port::probing flag and account for it in early_console_exit(). Fixes: 0b0cced19ab1 ("serial: sh-sci: Add CONFIG_SERIAL_EARLYCON support") Cc: stable@vger.kernel.org Signed-off-by: Claudiu Beznea Link: https://lore.kernel.org/r/20250116182249.3828577-5-claudiu.beznea.uj@bp.renesas.com Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/sh-sci.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index aacbed76c7c54..519a48f89f20e 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -183,6 +183,7 @@ static struct sci_port sci_ports[SCI_NPORTS]; static unsigned long sci_ports_in_use; static struct uart_driver sci_uart_driver; static bool sci_uart_earlycon; +static bool sci_uart_earlycon_dev_probing; static inline struct sci_port * to_sci_port(struct uart_port *uart) @@ -3404,7 +3405,8 @@ static struct plat_sci_port *sci_parse_dt(struct platform_device *pdev, static int sci_probe_single(struct platform_device *dev, unsigned int index, struct plat_sci_port *p, - struct sci_port *sciport) + struct sci_port *sciport, + struct resource *sci_res) { int ret; @@ -3451,6 +3453,14 @@ static int sci_probe_single(struct platform_device *dev, sciport->port.flags |= UPF_HARD_FLOW; } + if (sci_uart_earlycon && sci_ports[0].port.mapbase == sci_res->start) { + /* + * Skip cleanup the sci_port[0] in early_console_exit(), this + * port is the same as the earlycon one. + */ + sci_uart_earlycon_dev_probing = true; + } + return uart_add_one_port(&sci_uart_driver, &sciport->port); } @@ -3509,7 +3519,7 @@ static int sci_probe(struct platform_device *dev) platform_set_drvdata(dev, sp); - ret = sci_probe_single(dev, dev_id, p, sp); + ret = sci_probe_single(dev, dev_id, p, sp, res); if (ret) return ret; @@ -3666,6 +3676,22 @@ sh_early_platform_init_buffer("earlyprintk", &sci_driver, #ifdef CONFIG_SERIAL_SH_SCI_EARLYCON static struct plat_sci_port port_cfg; +static int early_console_exit(struct console *co) +{ + struct sci_port *sci_port = &sci_ports[0]; + + /* + * Clean the slot used by earlycon. A new SCI device might + * map to this slot. + */ + if (!sci_uart_earlycon_dev_probing) { + memset(sci_port, 0, sizeof(*sci_port)); + sci_uart_earlycon = false; + } + + return 0; +} + static int __init early_console_setup(struct earlycon_device *device, int type) { @@ -3683,6 +3709,8 @@ static int __init early_console_setup(struct earlycon_device *device, SCSCR_RE | SCSCR_TE | port_cfg.scscr); device->con->write = serial_console_write; + device->con->exit = early_console_exit; + return 0; } static int __init sci_early_console_setup(struct earlycon_device *device, -- GitLab From 977b7cc77852d1dea5b02e821c8841665097f246 Mon Sep 17 00:00:00 2001 From: Claudiu Beznea Date: Thu, 16 Jan 2025 20:22:49 +0200 Subject: [PATCH 1609/2211] serial: sh-sci: Increment the runtime usage counter for the earlycon device commit 651dee03696e1dfde6d9a7e8664bbdcd9a10ea7f upstream. In the sh-sci driver, serial ports are mapped to the sci_ports[] array, with earlycon mapped at index zero. The uart_add_one_port() function eventually calls __device_attach(), which, in turn, calls pm_request_idle(). The identified code path is as follows: uart_add_one_port() -> serial_ctrl_register_port() -> serial_core_register_port() -> serial_core_port_device_add() -> serial_base_port_add() -> device_add() -> bus_probe_device() -> device_initial_probe() -> __device_attach() -> // ... if (dev->p->dead) { // ... } else if (dev->driver) { // ... } else { // ... pm_request_idle(dev); // ... } The earlycon device clocks are enabled by the bootloader. However, the pm_request_idle() call in __device_attach() disables the SCI port clocks while earlycon is still active. The earlycon write function, serial_console_write(), calls sci_poll_put_char() via serial_console_putchar(). If the SCI port clocks are disabled, writing to earlycon may sometimes cause the SR.TDFE bit to remain unset indefinitely, causing the while loop in sci_poll_put_char() to never exit. On single-core SoCs, this can result in the system being blocked during boot when this issue occurs. To resolve this, increment the runtime PM usage counter for the earlycon SCI device before registering the UART port. Fixes: 0b0cced19ab1 ("serial: sh-sci: Add CONFIG_SERIAL_EARLYCON support") Cc: stable@vger.kernel.org Signed-off-by: Claudiu Beznea Link: https://lore.kernel.org/r/20250116182249.3828577-6-claudiu.beznea.uj@bp.renesas.com Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/sh-sci.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 519a48f89f20e..53236e3e4fa47 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -3454,6 +3454,22 @@ static int sci_probe_single(struct platform_device *dev, } if (sci_uart_earlycon && sci_ports[0].port.mapbase == sci_res->start) { + /* + * In case: + * - this is the earlycon port (mapped on index 0 in sci_ports[]) and + * - it now maps to an alias other than zero and + * - the earlycon is still alive (e.g., "earlycon keep_bootcon" is + * available in bootargs) + * + * we need to avoid disabling clocks and PM domains through the runtime + * PM APIs called in __device_attach(). For this, increment the runtime + * PM reference counter (the clocks and PM domains were already enabled + * by the bootloader). Otherwise the earlycon may access the HW when it + * has no clocks enabled leading to failures (infinite loop in + * sci_poll_put_char()). + */ + pm_runtime_get_noresume(&dev->dev); + /* * Skip cleanup the sci_port[0] in early_console_exit(), this * port is the same as the earlycon one. -- GitLab From e27cb3ac5a83ef3bf4020eecff77877727b4d99a Mon Sep 17 00:00:00 2001 From: zhangjian Date: Thu, 19 Jun 2025 09:18:29 +0800 Subject: [PATCH 1610/2211] smb: client: fix first command failure during re-negotiation commit 34331d7beed7576acfc98e991c39738b96162499 upstream. after fabc4ed200f9, server_unresponsive add a condition to check whether client need to reconnect depending on server->lstrp. When client failed to reconnect for some time and abort connection, server->lstrp is updated for the last time. In the following scene, server->lstrp is too old. This cause next command failure in re-negotiation rather than waiting for re-negotiation done. 1. mount -t cifs -o username=Everyone,echo_internal=10 //$server_ip/export /mnt 2. ssh $server_ip "echo b > /proc/sysrq-trigger &" 3. ls /mnt 4. sleep 21s 5. ssh $server_ip "service firewalld stop" 6. ls # return EHOSTDOWN If the interval between 5 and 6 is too small, 6 may trigger sending negotiation request. Before backgrounding cifsd thread try to receive negotiation response from server in cifs_readv_from_socket, server_unresponsive may trigger cifs_reconnect which cause 6 to be failed: ls thread ---------------- smb2_negotiate server->tcpStatus = CifsInNegotiate compound_send_recv wait_for_compound_request cifsd thread ---------------- cifs_readv_from_socket server_unresponsive server->tcpStatus == CifsInNegotiate && jiffies > server->lstrp + 20s cifs_reconnect cifs_abort_connection: mid_state = MID_RETRY_NEEDED ls thread ---------------- cifs_sync_mid_result return EAGAIN smb2_negotiate return EHOSTDOWN Though server->lstrp means last server response time, it is updated in cifs_abort_connection and cifs_get_tcp_session. We can also update server->lstrp before switching into CifsInNegotiate state to avoid failure in 6. Fixes: 7ccc1465465d ("smb: client: fix hang in wait_for_response() for negproto") Acked-by: Paulo Alcantara (Red Hat) Acked-by: Meetakshi Setiya Signed-off-by: zhangjian Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/connect.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index 0a5111a32fb72..91f5fd818cbf4 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -3993,6 +3993,7 @@ retry: return 0; } + server->lstrp = jiffies; server->tcpStatus = CifsInNegotiate; spin_unlock(&server->srv_lock); -- GitLab From 8ae7814589d7bd850294ac14ec4c1725dafd42ca Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 18 Jun 2025 18:51:40 +0200 Subject: [PATCH 1611/2211] smb: client: fix max_sge overflow in smb_extract_folioq_to_rdma() commit a379a8a2a0032e12e7ef397197c9c2ad011588d6 upstream. This fixes the following problem: [ 749.901015] [ T8673] run fstests cifs/001 at 2025-06-17 09:40:30 [ 750.346409] [ T9870] ================================================================== [ 750.346814] [ T9870] BUG: KASAN: slab-out-of-bounds in smb_set_sge+0x2cc/0x3b0 [cifs] [ 750.347330] [ T9870] Write of size 8 at addr ffff888011082890 by task xfs_io/9870 [ 750.347705] [ T9870] [ 750.348077] [ T9870] CPU: 0 UID: 0 PID: 9870 Comm: xfs_io Kdump: loaded Not tainted 6.16.0-rc2-metze.02+ #1 PREEMPT(voluntary) [ 750.348082] [ T9870] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 750.348085] [ T9870] Call Trace: [ 750.348086] [ T9870] [ 750.348088] [ T9870] dump_stack_lvl+0x76/0xa0 [ 750.348106] [ T9870] print_report+0xd1/0x640 [ 750.348116] [ T9870] ? __pfx__raw_spin_lock_irqsave+0x10/0x10 [ 750.348120] [ T9870] ? kasan_complete_mode_report_info+0x26/0x210 [ 750.348124] [ T9870] kasan_report+0xe7/0x130 [ 750.348128] [ T9870] ? smb_set_sge+0x2cc/0x3b0 [cifs] [ 750.348262] [ T9870] ? smb_set_sge+0x2cc/0x3b0 [cifs] [ 750.348377] [ T9870] __asan_report_store8_noabort+0x17/0x30 [ 750.348381] [ T9870] smb_set_sge+0x2cc/0x3b0 [cifs] [ 750.348496] [ T9870] smbd_post_send_iter+0x1990/0x3070 [cifs] [ 750.348625] [ T9870] ? __pfx_smbd_post_send_iter+0x10/0x10 [cifs] [ 750.348741] [ T9870] ? update_stack_state+0x2a0/0x670 [ 750.348749] [ T9870] ? cifs_flush+0x153/0x320 [cifs] [ 750.348870] [ T9870] ? cifs_flush+0x153/0x320 [cifs] [ 750.348990] [ T9870] ? update_stack_state+0x2a0/0x670 [ 750.348995] [ T9870] smbd_send+0x58c/0x9c0 [cifs] [ 750.349117] [ T9870] ? __pfx_smbd_send+0x10/0x10 [cifs] [ 750.349231] [ T9870] ? unwind_get_return_address+0x65/0xb0 [ 750.349235] [ T9870] ? __pfx_stack_trace_consume_entry+0x10/0x10 [ 750.349242] [ T9870] ? arch_stack_walk+0xa7/0x100 [ 750.349250] [ T9870] ? stack_trace_save+0x92/0xd0 [ 750.349254] [ T9870] __smb_send_rqst+0x931/0xec0 [cifs] [ 750.349374] [ T9870] ? kernel_text_address+0x173/0x190 [ 750.349379] [ T9870] ? kasan_save_stack+0x39/0x70 [ 750.349382] [ T9870] ? kasan_save_track+0x18/0x70 [ 750.349385] [ T9870] ? __kasan_slab_alloc+0x9d/0xa0 [ 750.349389] [ T9870] ? __pfx___smb_send_rqst+0x10/0x10 [cifs] [ 750.349508] [ T9870] ? smb2_mid_entry_alloc+0xb4/0x7e0 [cifs] [ 750.349626] [ T9870] ? cifs_call_async+0x277/0xb00 [cifs] [ 750.349746] [ T9870] ? cifs_issue_write+0x256/0x610 [cifs] [ 750.349867] [ T9870] ? netfs_do_issue_write+0xc2/0x340 [netfs] [ 750.349900] [ T9870] ? netfs_advance_write+0x45b/0x1270 [netfs] [ 750.349929] [ T9870] ? netfs_write_folio+0xd6c/0x1be0 [netfs] [ 750.349958] [ T9870] ? netfs_writepages+0x2e9/0xa80 [netfs] [ 750.349987] [ T9870] ? do_writepages+0x21f/0x590 [ 750.349993] [ T9870] ? filemap_fdatawrite_wbc+0xe1/0x140 [ 750.349997] [ T9870] ? entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 750.350002] [ T9870] smb_send_rqst+0x22e/0x2f0 [cifs] [ 750.350131] [ T9870] ? __pfx_smb_send_rqst+0x10/0x10 [cifs] [ 750.350255] [ T9870] ? local_clock_noinstr+0xe/0xd0 [ 750.350261] [ T9870] ? kasan_save_alloc_info+0x37/0x60 [ 750.350268] [ T9870] ? __kasan_check_write+0x14/0x30 [ 750.350271] [ T9870] ? _raw_spin_lock+0x81/0xf0 [ 750.350275] [ T9870] ? __pfx__raw_spin_lock+0x10/0x10 [ 750.350278] [ T9870] ? smb2_setup_async_request+0x293/0x580 [cifs] [ 750.350398] [ T9870] cifs_call_async+0x477/0xb00 [cifs] [ 750.350518] [ T9870] ? __pfx_smb2_writev_callback+0x10/0x10 [cifs] [ 750.350636] [ T9870] ? __pfx_cifs_call_async+0x10/0x10 [cifs] [ 750.350756] [ T9870] ? __pfx__raw_spin_lock+0x10/0x10 [ 750.350760] [ T9870] ? __kasan_check_write+0x14/0x30 [ 750.350763] [ T9870] ? __smb2_plain_req_init+0x933/0x1090 [cifs] [ 750.350891] [ T9870] smb2_async_writev+0x15ff/0x2460 [cifs] [ 750.351008] [ T9870] ? sched_clock_noinstr+0x9/0x10 [ 750.351012] [ T9870] ? local_clock_noinstr+0xe/0xd0 [ 750.351018] [ T9870] ? __pfx_smb2_async_writev+0x10/0x10 [cifs] [ 750.351144] [ T9870] ? __pfx__raw_spin_lock_irqsave+0x10/0x10 [ 750.351150] [ T9870] ? _raw_spin_unlock+0xe/0x40 [ 750.351154] [ T9870] ? cifs_pick_channel+0x242/0x370 [cifs] [ 750.351275] [ T9870] cifs_issue_write+0x256/0x610 [cifs] [ 750.351554] [ T9870] ? cifs_issue_write+0x256/0x610 [cifs] [ 750.351677] [ T9870] netfs_do_issue_write+0xc2/0x340 [netfs] [ 750.351710] [ T9870] netfs_advance_write+0x45b/0x1270 [netfs] [ 750.351740] [ T9870] ? rolling_buffer_append+0x12d/0x440 [netfs] [ 750.351769] [ T9870] netfs_write_folio+0xd6c/0x1be0 [netfs] [ 750.351798] [ T9870] ? __kasan_check_write+0x14/0x30 [ 750.351804] [ T9870] netfs_writepages+0x2e9/0xa80 [netfs] [ 750.351835] [ T9870] ? __pfx_netfs_writepages+0x10/0x10 [netfs] [ 750.351864] [ T9870] ? exit_files+0xab/0xe0 [ 750.351867] [ T9870] ? do_exit+0x148f/0x2980 [ 750.351871] [ T9870] ? do_group_exit+0xb5/0x250 [ 750.351874] [ T9870] ? arch_do_signal_or_restart+0x92/0x630 [ 750.351879] [ T9870] ? exit_to_user_mode_loop+0x98/0x170 [ 750.351882] [ T9870] ? do_syscall_64+0x2cf/0xd80 [ 750.351886] [ T9870] ? entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 750.351890] [ T9870] do_writepages+0x21f/0x590 [ 750.351894] [ T9870] ? __pfx_do_writepages+0x10/0x10 [ 750.351897] [ T9870] filemap_fdatawrite_wbc+0xe1/0x140 [ 750.351901] [ T9870] __filemap_fdatawrite_range+0xba/0x100 [ 750.351904] [ T9870] ? __pfx___filemap_fdatawrite_range+0x10/0x10 [ 750.351912] [ T9870] ? __kasan_check_write+0x14/0x30 [ 750.351916] [ T9870] filemap_write_and_wait_range+0x7d/0xf0 [ 750.351920] [ T9870] cifs_flush+0x153/0x320 [cifs] [ 750.352042] [ T9870] filp_flush+0x107/0x1a0 [ 750.352046] [ T9870] filp_close+0x14/0x30 [ 750.352049] [ T9870] put_files_struct.part.0+0x126/0x2a0 [ 750.352053] [ T9870] ? __pfx__raw_spin_lock+0x10/0x10 [ 750.352058] [ T9870] exit_files+0xab/0xe0 [ 750.352061] [ T9870] do_exit+0x148f/0x2980 [ 750.352065] [ T9870] ? __pfx_do_exit+0x10/0x10 [ 750.352069] [ T9870] ? __kasan_check_write+0x14/0x30 [ 750.352072] [ T9870] ? _raw_spin_lock_irq+0x8a/0xf0 [ 750.352076] [ T9870] do_group_exit+0xb5/0x250 [ 750.352080] [ T9870] get_signal+0x22d3/0x22e0 [ 750.352086] [ T9870] ? __pfx_get_signal+0x10/0x10 [ 750.352089] [ T9870] ? fpregs_assert_state_consistent+0x68/0x100 [ 750.352101] [ T9870] ? folio_add_lru+0xda/0x120 [ 750.352105] [ T9870] arch_do_signal_or_restart+0x92/0x630 [ 750.352109] [ T9870] ? __pfx_arch_do_signal_or_restart+0x10/0x10 [ 750.352115] [ T9870] exit_to_user_mode_loop+0x98/0x170 [ 750.352118] [ T9870] do_syscall_64+0x2cf/0xd80 [ 750.352123] [ T9870] ? __kasan_check_read+0x11/0x20 [ 750.352126] [ T9870] ? count_memcg_events+0x1b4/0x420 [ 750.352132] [ T9870] ? handle_mm_fault+0x148/0x690 [ 750.352136] [ T9870] ? _raw_spin_lock_irq+0x8a/0xf0 [ 750.352140] [ T9870] ? __kasan_check_read+0x11/0x20 [ 750.352143] [ T9870] ? fpregs_assert_state_consistent+0x68/0x100 [ 750.352146] [ T9870] ? irqentry_exit_to_user_mode+0x2e/0x250 [ 750.352151] [ T9870] ? irqentry_exit+0x43/0x50 [ 750.352154] [ T9870] ? exc_page_fault+0x75/0xe0 [ 750.352160] [ T9870] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 750.352163] [ T9870] RIP: 0033:0x7858c94ab6e2 [ 750.352167] [ T9870] Code: Unable to access opcode bytes at 0x7858c94ab6b8. [ 750.352175] [ T9870] RSP: 002b:00007858c9248ce8 EFLAGS: 00000246 ORIG_RAX: 0000000000000022 [ 750.352179] [ T9870] RAX: fffffffffffffdfe RBX: 00007858c92496c0 RCX: 00007858c94ab6e2 [ 750.352182] [ T9870] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000 [ 750.352184] [ T9870] RBP: 00007858c9248d10 R08: 0000000000000000 R09: 0000000000000000 [ 750.352185] [ T9870] R10: 0000000000000000 R11: 0000000000000246 R12: fffffffffffffde0 [ 750.352187] [ T9870] R13: 0000000000000020 R14: 0000000000000002 R15: 00007ffc072d2230 [ 750.352191] [ T9870] [ 750.352195] [ T9870] [ 750.395206] [ T9870] Allocated by task 9870 on cpu 0 at 750.346406s: [ 750.395523] [ T9870] kasan_save_stack+0x39/0x70 [ 750.395532] [ T9870] kasan_save_track+0x18/0x70 [ 750.395536] [ T9870] kasan_save_alloc_info+0x37/0x60 [ 750.395539] [ T9870] __kasan_slab_alloc+0x9d/0xa0 [ 750.395543] [ T9870] kmem_cache_alloc_noprof+0x13c/0x3f0 [ 750.395548] [ T9870] mempool_alloc_slab+0x15/0x20 [ 750.395553] [ T9870] mempool_alloc_noprof+0x135/0x340 [ 750.395557] [ T9870] smbd_post_send_iter+0x63e/0x3070 [cifs] [ 750.395694] [ T9870] smbd_send+0x58c/0x9c0 [cifs] [ 750.395819] [ T9870] __smb_send_rqst+0x931/0xec0 [cifs] [ 750.395950] [ T9870] smb_send_rqst+0x22e/0x2f0 [cifs] [ 750.396081] [ T9870] cifs_call_async+0x477/0xb00 [cifs] [ 750.396232] [ T9870] smb2_async_writev+0x15ff/0x2460 [cifs] [ 750.396359] [ T9870] cifs_issue_write+0x256/0x610 [cifs] [ 750.396492] [ T9870] netfs_do_issue_write+0xc2/0x340 [netfs] [ 750.396544] [ T9870] netfs_advance_write+0x45b/0x1270 [netfs] [ 750.396576] [ T9870] netfs_write_folio+0xd6c/0x1be0 [netfs] [ 750.396608] [ T9870] netfs_writepages+0x2e9/0xa80 [netfs] [ 750.396639] [ T9870] do_writepages+0x21f/0x590 [ 750.396643] [ T9870] filemap_fdatawrite_wbc+0xe1/0x140 [ 750.396647] [ T9870] __filemap_fdatawrite_range+0xba/0x100 [ 750.396651] [ T9870] filemap_write_and_wait_range+0x7d/0xf0 [ 750.396656] [ T9870] cifs_flush+0x153/0x320 [cifs] [ 750.396787] [ T9870] filp_flush+0x107/0x1a0 [ 750.396791] [ T9870] filp_close+0x14/0x30 [ 750.396795] [ T9870] put_files_struct.part.0+0x126/0x2a0 [ 750.396800] [ T9870] exit_files+0xab/0xe0 [ 750.396803] [ T9870] do_exit+0x148f/0x2980 [ 750.396808] [ T9870] do_group_exit+0xb5/0x250 [ 750.396813] [ T9870] get_signal+0x22d3/0x22e0 [ 750.396817] [ T9870] arch_do_signal_or_restart+0x92/0x630 [ 750.396822] [ T9870] exit_to_user_mode_loop+0x98/0x170 [ 750.396827] [ T9870] do_syscall_64+0x2cf/0xd80 [ 750.396832] [ T9870] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 750.396836] [ T9870] [ 750.397150] [ T9870] The buggy address belongs to the object at ffff888011082800 which belongs to the cache smbd_request_0000000008f3bd7b of size 144 [ 750.397798] [ T9870] The buggy address is located 0 bytes to the right of allocated 144-byte region [ffff888011082800, ffff888011082890) [ 750.398469] [ T9870] [ 750.398800] [ T9870] The buggy address belongs to the physical page: [ 750.399141] [ T9870] page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x11082 [ 750.399148] [ T9870] flags: 0xfffffc0000000(node=0|zone=1|lastcpupid=0x1fffff) [ 750.399155] [ T9870] page_type: f5(slab) [ 750.399161] [ T9870] raw: 000fffffc0000000 ffff888022d65640 dead000000000122 0000000000000000 [ 750.399165] [ T9870] raw: 0000000000000000 0000000080100010 00000000f5000000 0000000000000000 [ 750.399169] [ T9870] page dumped because: kasan: bad access detected [ 750.399172] [ T9870] [ 750.399505] [ T9870] Memory state around the buggy address: [ 750.399863] [ T9870] ffff888011082780: fb fb fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 750.400247] [ T9870] ffff888011082800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 750.400618] [ T9870] >ffff888011082880: 00 00 fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 750.400982] [ T9870] ^ [ 750.401370] [ T9870] ffff888011082900: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 750.401774] [ T9870] ffff888011082980: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 750.402171] [ T9870] ================================================================== [ 750.402696] [ T9870] Disabling lock debugging due to kernel taint [ 750.403202] [ T9870] BUG: unable to handle page fault for address: ffff8880110a2000 [ 750.403797] [ T9870] #PF: supervisor write access in kernel mode [ 750.404204] [ T9870] #PF: error_code(0x0003) - permissions violation [ 750.404581] [ T9870] PGD 5ce01067 P4D 5ce01067 PUD 5ce02067 PMD 78aa063 PTE 80000000110a2021 [ 750.404969] [ T9870] Oops: Oops: 0003 [#1] SMP KASAN PTI [ 750.405394] [ T9870] CPU: 0 UID: 0 PID: 9870 Comm: xfs_io Kdump: loaded Tainted: G B 6.16.0-rc2-metze.02+ #1 PREEMPT(voluntary) [ 750.406510] [ T9870] Tainted: [B]=BAD_PAGE [ 750.406967] [ T9870] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 750.407440] [ T9870] RIP: 0010:smb_set_sge+0x15c/0x3b0 [cifs] [ 750.408065] [ T9870] Code: 48 83 f8 ff 0f 84 b0 00 00 00 48 ba 00 00 00 00 00 fc ff df 4c 89 e1 48 c1 e9 03 80 3c 11 00 0f 85 69 01 00 00 49 8d 7c 24 08 <49> 89 04 24 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 0f [ 750.409283] [ T9870] RSP: 0018:ffffc90005e2e758 EFLAGS: 00010246 [ 750.409803] [ T9870] RAX: ffff888036c53400 RBX: ffffc90005e2e878 RCX: 1ffff11002214400 [ 750.410323] [ T9870] RDX: dffffc0000000000 RSI: dffffc0000000000 RDI: ffff8880110a2008 [ 750.411217] [ T9870] RBP: ffffc90005e2e798 R08: 0000000000000001 R09: 0000000000000400 [ 750.411770] [ T9870] R10: ffff888011082800 R11: 0000000000000000 R12: ffff8880110a2000 [ 750.412325] [ T9870] R13: 0000000000000000 R14: ffffc90005e2e888 R15: ffff88801a4b6000 [ 750.412901] [ T9870] FS: 0000000000000000(0000) GS:ffff88812bc68000(0000) knlGS:0000000000000000 [ 750.413477] [ T9870] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 750.414077] [ T9870] CR2: ffff8880110a2000 CR3: 000000005b0a6005 CR4: 00000000000726f0 [ 750.414654] [ T9870] Call Trace: [ 750.415211] [ T9870] [ 750.415748] [ T9870] smbd_post_send_iter+0x1990/0x3070 [cifs] [ 750.416449] [ T9870] ? __pfx_smbd_post_send_iter+0x10/0x10 [cifs] [ 750.417128] [ T9870] ? update_stack_state+0x2a0/0x670 [ 750.417685] [ T9870] ? cifs_flush+0x153/0x320 [cifs] [ 750.418380] [ T9870] ? cifs_flush+0x153/0x320 [cifs] [ 750.419055] [ T9870] ? update_stack_state+0x2a0/0x670 [ 750.419624] [ T9870] smbd_send+0x58c/0x9c0 [cifs] [ 750.420297] [ T9870] ? __pfx_smbd_send+0x10/0x10 [cifs] [ 750.420936] [ T9870] ? unwind_get_return_address+0x65/0xb0 [ 750.421456] [ T9870] ? __pfx_stack_trace_consume_entry+0x10/0x10 [ 750.421954] [ T9870] ? arch_stack_walk+0xa7/0x100 [ 750.422460] [ T9870] ? stack_trace_save+0x92/0xd0 [ 750.422948] [ T9870] __smb_send_rqst+0x931/0xec0 [cifs] [ 750.423579] [ T9870] ? kernel_text_address+0x173/0x190 [ 750.424056] [ T9870] ? kasan_save_stack+0x39/0x70 [ 750.424813] [ T9870] ? kasan_save_track+0x18/0x70 [ 750.425323] [ T9870] ? __kasan_slab_alloc+0x9d/0xa0 [ 750.425831] [ T9870] ? __pfx___smb_send_rqst+0x10/0x10 [cifs] [ 750.426548] [ T9870] ? smb2_mid_entry_alloc+0xb4/0x7e0 [cifs] [ 750.427231] [ T9870] ? cifs_call_async+0x277/0xb00 [cifs] [ 750.427882] [ T9870] ? cifs_issue_write+0x256/0x610 [cifs] [ 750.428909] [ T9870] ? netfs_do_issue_write+0xc2/0x340 [netfs] [ 750.429425] [ T9870] ? netfs_advance_write+0x45b/0x1270 [netfs] [ 750.429882] [ T9870] ? netfs_write_folio+0xd6c/0x1be0 [netfs] [ 750.430345] [ T9870] ? netfs_writepages+0x2e9/0xa80 [netfs] [ 750.430809] [ T9870] ? do_writepages+0x21f/0x590 [ 750.431239] [ T9870] ? filemap_fdatawrite_wbc+0xe1/0x140 [ 750.431652] [ T9870] ? entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 750.432041] [ T9870] smb_send_rqst+0x22e/0x2f0 [cifs] [ 750.432586] [ T9870] ? __pfx_smb_send_rqst+0x10/0x10 [cifs] [ 750.433108] [ T9870] ? local_clock_noinstr+0xe/0xd0 [ 750.433482] [ T9870] ? kasan_save_alloc_info+0x37/0x60 [ 750.433855] [ T9870] ? __kasan_check_write+0x14/0x30 [ 750.434214] [ T9870] ? _raw_spin_lock+0x81/0xf0 [ 750.434561] [ T9870] ? __pfx__raw_spin_lock+0x10/0x10 [ 750.434903] [ T9870] ? smb2_setup_async_request+0x293/0x580 [cifs] [ 750.435394] [ T9870] cifs_call_async+0x477/0xb00 [cifs] [ 750.435892] [ T9870] ? __pfx_smb2_writev_callback+0x10/0x10 [cifs] [ 750.436388] [ T9870] ? __pfx_cifs_call_async+0x10/0x10 [cifs] [ 750.436881] [ T9870] ? __pfx__raw_spin_lock+0x10/0x10 [ 750.437237] [ T9870] ? __kasan_check_write+0x14/0x30 [ 750.437579] [ T9870] ? __smb2_plain_req_init+0x933/0x1090 [cifs] [ 750.438062] [ T9870] smb2_async_writev+0x15ff/0x2460 [cifs] [ 750.438557] [ T9870] ? sched_clock_noinstr+0x9/0x10 [ 750.438906] [ T9870] ? local_clock_noinstr+0xe/0xd0 [ 750.439293] [ T9870] ? __pfx_smb2_async_writev+0x10/0x10 [cifs] [ 750.439786] [ T9870] ? __pfx__raw_spin_lock_irqsave+0x10/0x10 [ 750.440143] [ T9870] ? _raw_spin_unlock+0xe/0x40 [ 750.440495] [ T9870] ? cifs_pick_channel+0x242/0x370 [cifs] [ 750.440989] [ T9870] cifs_issue_write+0x256/0x610 [cifs] [ 750.441492] [ T9870] ? cifs_issue_write+0x256/0x610 [cifs] [ 750.441987] [ T9870] netfs_do_issue_write+0xc2/0x340 [netfs] [ 750.442387] [ T9870] netfs_advance_write+0x45b/0x1270 [netfs] [ 750.442969] [ T9870] ? rolling_buffer_append+0x12d/0x440 [netfs] [ 750.443376] [ T9870] netfs_write_folio+0xd6c/0x1be0 [netfs] [ 750.443768] [ T9870] ? __kasan_check_write+0x14/0x30 [ 750.444145] [ T9870] netfs_writepages+0x2e9/0xa80 [netfs] [ 750.444541] [ T9870] ? __pfx_netfs_writepages+0x10/0x10 [netfs] [ 750.444936] [ T9870] ? exit_files+0xab/0xe0 [ 750.445312] [ T9870] ? do_exit+0x148f/0x2980 [ 750.445672] [ T9870] ? do_group_exit+0xb5/0x250 [ 750.446028] [ T9870] ? arch_do_signal_or_restart+0x92/0x630 [ 750.446402] [ T9870] ? exit_to_user_mode_loop+0x98/0x170 [ 750.446762] [ T9870] ? do_syscall_64+0x2cf/0xd80 [ 750.447132] [ T9870] ? entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 750.447499] [ T9870] do_writepages+0x21f/0x590 [ 750.447859] [ T9870] ? __pfx_do_writepages+0x10/0x10 [ 750.448236] [ T9870] filemap_fdatawrite_wbc+0xe1/0x140 [ 750.448595] [ T9870] __filemap_fdatawrite_range+0xba/0x100 [ 750.448953] [ T9870] ? __pfx___filemap_fdatawrite_range+0x10/0x10 [ 750.449336] [ T9870] ? __kasan_check_write+0x14/0x30 [ 750.449697] [ T9870] filemap_write_and_wait_range+0x7d/0xf0 [ 750.450062] [ T9870] cifs_flush+0x153/0x320 [cifs] [ 750.450592] [ T9870] filp_flush+0x107/0x1a0 [ 750.450952] [ T9870] filp_close+0x14/0x30 [ 750.451322] [ T9870] put_files_struct.part.0+0x126/0x2a0 [ 750.451678] [ T9870] ? __pfx__raw_spin_lock+0x10/0x10 [ 750.452033] [ T9870] exit_files+0xab/0xe0 [ 750.452401] [ T9870] do_exit+0x148f/0x2980 [ 750.452751] [ T9870] ? __pfx_do_exit+0x10/0x10 [ 750.453109] [ T9870] ? __kasan_check_write+0x14/0x30 [ 750.453459] [ T9870] ? _raw_spin_lock_irq+0x8a/0xf0 [ 750.453787] [ T9870] do_group_exit+0xb5/0x250 [ 750.454082] [ T9870] get_signal+0x22d3/0x22e0 [ 750.454406] [ T9870] ? __pfx_get_signal+0x10/0x10 [ 750.454709] [ T9870] ? fpregs_assert_state_consistent+0x68/0x100 [ 750.455031] [ T9870] ? folio_add_lru+0xda/0x120 [ 750.455347] [ T9870] arch_do_signal_or_restart+0x92/0x630 [ 750.455656] [ T9870] ? __pfx_arch_do_signal_or_restart+0x10/0x10 [ 750.455967] [ T9870] exit_to_user_mode_loop+0x98/0x170 [ 750.456282] [ T9870] do_syscall_64+0x2cf/0xd80 [ 750.456591] [ T9870] ? __kasan_check_read+0x11/0x20 [ 750.456897] [ T9870] ? count_memcg_events+0x1b4/0x420 [ 750.457280] [ T9870] ? handle_mm_fault+0x148/0x690 [ 750.457616] [ T9870] ? _raw_spin_lock_irq+0x8a/0xf0 [ 750.457925] [ T9870] ? __kasan_check_read+0x11/0x20 [ 750.458297] [ T9870] ? fpregs_assert_state_consistent+0x68/0x100 [ 750.458672] [ T9870] ? irqentry_exit_to_user_mode+0x2e/0x250 [ 750.459191] [ T9870] ? irqentry_exit+0x43/0x50 [ 750.459600] [ T9870] ? exc_page_fault+0x75/0xe0 [ 750.460130] [ T9870] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 750.460570] [ T9870] RIP: 0033:0x7858c94ab6e2 [ 750.461206] [ T9870] Code: Unable to access opcode bytes at 0x7858c94ab6b8. [ 750.461780] [ T9870] RSP: 002b:00007858c9248ce8 EFLAGS: 00000246 ORIG_RAX: 0000000000000022 [ 750.462327] [ T9870] RAX: fffffffffffffdfe RBX: 00007858c92496c0 RCX: 00007858c94ab6e2 [ 750.462653] [ T9870] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000 [ 750.462969] [ T9870] RBP: 00007858c9248d10 R08: 0000000000000000 R09: 0000000000000000 [ 750.463290] [ T9870] R10: 0000000000000000 R11: 0000000000000246 R12: fffffffffffffde0 [ 750.463640] [ T9870] R13: 0000000000000020 R14: 0000000000000002 R15: 00007ffc072d2230 [ 750.463965] [ T9870] [ 750.464285] [ T9870] Modules linked in: siw ib_uverbs ccm cmac nls_utf8 cifs cifs_arc4 nls_ucs2_utils rdma_cm iw_cm ib_cm ib_core cifs_md4 netfs softdog vboxsf vboxguest cpuid intel_rapl_msr intel_rapl_common intel_uncore_frequency_common intel_pmc_core pmt_telemetry pmt_class intel_pmc_ssram_telemetry intel_vsec polyval_clmulni ghash_clmulni_intel sha1_ssse3 aesni_intel rapl i2c_piix4 i2c_smbus joydev input_leds mac_hid sunrpc binfmt_misc kvm_intel kvm irqbypass sch_fq_codel efi_pstore nfnetlink vsock_loopback vmw_vsock_virtio_transport_common vmw_vsock_vmci_transport vsock vmw_vmci dmi_sysfs ip_tables x_tables autofs4 hid_generic vboxvideo usbhid drm_vram_helper psmouse vga16fb vgastate drm_ttm_helper serio_raw hid ahci libahci ttm pata_acpi video wmi [last unloaded: vboxguest] [ 750.467127] [ T9870] CR2: ffff8880110a2000 cc: Tom Talpey cc: linux-cifs@vger.kernel.org Reviewed-by: David Howells Reviewed-by: Tom Talpey Fixes: c45ebd636c32 ("cifs: Provide the capability to extract from ITER_FOLIOQ to RDMA SGEs") Signed-off-by: Stefan Metzmacher Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/smbdirect.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/smb/client/smbdirect.c b/fs/smb/client/smbdirect.c index b0b7254661e92..9d8be034f103f 100644 --- a/fs/smb/client/smbdirect.c +++ b/fs/smb/client/smbdirect.c @@ -2552,13 +2552,14 @@ static ssize_t smb_extract_folioq_to_rdma(struct iov_iter *iter, size_t fsize = folioq_folio_size(folioq, slot); if (offset < fsize) { - size_t part = umin(maxsize - ret, fsize - offset); + size_t part = umin(maxsize, fsize - offset); if (!smb_set_sge(rdma, folio_page(folio, 0), offset, part)) return -EIO; offset += part; ret += part; + maxsize -= part; } if (offset >= fsize) { @@ -2573,7 +2574,7 @@ static ssize_t smb_extract_folioq_to_rdma(struct iov_iter *iter, slot = 0; } } - } while (rdma->nr_sge < rdma->max_sge || maxsize > 0); + } while (rdma->nr_sge < rdma->max_sge && maxsize > 0); iter->folioq = folioq; iter->folioq_slot = slot; -- GitLab From 989c77a3dec8b18f49d7976170b93c220a8634aa Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Mon, 19 May 2025 18:07:11 +0200 Subject: [PATCH 1612/2211] s390/pci: Fix __pcilg_mio_inuser() inline assembly commit c4abe6234246c75cdc43326415d9cff88b7cf06c upstream. Use "a" constraint for the shift operand of the __pcilg_mio_inuser() inline assembly. The used "d" constraint allows the compiler to use any general purpose register for the shift operand, including register zero. If register zero is used this my result in incorrect code generation: 8f6: a7 0a ff f8 ahi %r0,-8 8fa: eb 32 00 00 00 0c srlg %r3,%r2,0 <---- If register zero is selected to contain the shift value, the srlg instruction ignores the contents of the register and always shifts zero bits. Therefore use the "a" constraint which does not permit to select register zero. Fixes: f058599e22d5 ("s390/pci: Fix s390_mmio_read/write with MIO") Cc: stable@vger.kernel.org Reported-by: Niklas Schnelle Reviewed-by: Niklas Schnelle Signed-off-by: Heiko Carstens Signed-off-by: Niklas Schnelle Signed-off-by: Greg Kroah-Hartman --- arch/s390/pci/pci_mmio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/s390/pci/pci_mmio.c b/arch/s390/pci/pci_mmio.c index 4779c3cb6cfab..0fa34c5012967 100644 --- a/arch/s390/pci/pci_mmio.c +++ b/arch/s390/pci/pci_mmio.c @@ -228,7 +228,7 @@ static inline int __pcilg_mio_inuser( [ioaddr_len] "+&d" (ioaddr_len.pair), [cc] "+d" (cc), [val] "=d" (val), [dst] "+a" (dst), [cnt] "+d" (cnt), [tmp] "=d" (tmp), - [shift] "+d" (shift) + [shift] "+a" (shift) :: "cc", "memory"); /* did we write everything to the user space buffer? */ -- GitLab From 456019adaa2f5366b89c868dea9b483179bece54 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Thu, 5 Jun 2025 12:31:45 +0200 Subject: [PATCH 1613/2211] perf: Fix sample vs do_exit() [ Upstream commit 4f6fc782128355931527cefe3eb45338abd8ab39 ] Baisheng Gao reported an ARM64 crash, which Mark decoded as being a synchronous external abort -- most likely due to trying to access MMIO in bad ways. The crash further shows perf trying to do a user stack sample while in exit_mmap()'s tlb_finish_mmu() -- i.e. while tearing down the address space it is trying to access. It turns out that we stop perf after we tear down the userspace mm; a receipie for disaster, since perf likes to access userspace for various reasons. Flip this order by moving up where we stop perf in do_exit(). Additionally, harden PERF_SAMPLE_CALLCHAIN and PERF_SAMPLE_STACK_USER to abort when the current task does not have an mm (exit_mm() makes sure to set current->mm = NULL; before commencing with the actual teardown). Such that CPU wide events don't trip on this same problem. Fixes: c5ebcedb566e ("perf: Add ability to attach user stack dump to sample") Reported-by: Baisheng Gao Suggested-by: Mark Rutland Signed-off-by: Peter Zijlstra (Intel) Link: https://lkml.kernel.org/r/20250605110815.GQ39944@noisy.programming.kicks-ass.net Signed-off-by: Sasha Levin --- kernel/events/core.c | 7 +++++++ kernel/exit.c | 17 +++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index 9ce82904f761d..ed3bc2e390511 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -7097,6 +7097,10 @@ perf_sample_ustack_size(u16 stack_size, u16 header_size, if (!regs) return 0; + /* No mm, no stack, no dump. */ + if (!current->mm) + return 0; + /* * Check if we fit in with the requested stack size into the: * - TASK_SIZE @@ -7808,6 +7812,9 @@ perf_callchain(struct perf_event *event, struct pt_regs *regs) const u32 max_stack = event->attr.sample_max_stack; struct perf_callchain_entry *callchain; + if (!current->mm) + user = false; + if (!kernel && !user) return &__empty_callchain; diff --git a/kernel/exit.c b/kernel/exit.c index 56b8bd9487b4b..d465b36bcc869 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -923,6 +923,15 @@ void __noreturn do_exit(long code) tsk->exit_code = code; taskstats_exit(tsk, group_dead); + /* + * Since sampling can touch ->mm, make sure to stop everything before we + * tear it down. + * + * Also flushes inherited counters to the parent - before the parent + * gets woken up by child-exit notifications. + */ + perf_event_exit_task(tsk); + exit_mm(); if (group_dead) @@ -939,14 +948,6 @@ void __noreturn do_exit(long code) exit_task_work(tsk); exit_thread(tsk); - /* - * Flush inherited counters to the parent - before the parent - * gets woken up by child-exit notifications. - * - * because of cgroup mode, must be called before cgroup_exit() - */ - perf_event_exit_task(tsk); - sched_autogroup_exit_task(tsk); cgroup_exit(tsk); -- GitLab From 7335c33d621fd8f942fdf9f4ef1e9dbd01712b1a Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Thu, 5 Jun 2025 12:37:11 +0200 Subject: [PATCH 1614/2211] perf: Fix cgroup state vs ERROR [ Upstream commit 61988e36dc5457cdff7ae7927e8d9ad1419ee998 ] While chasing down a missing perf_cgroup_event_disable() elsewhere, Leo Yan found that both perf_put_aux_event() and perf_remove_sibling_event() were also missing one. Specifically, the rule is that events that switch to OFF,ERROR need to call perf_cgroup_event_disable(). Unify the disable paths to ensure this. Fixes: ab43762ef010 ("perf: Allow normal events to output AUX data") Fixes: 9f0c4fa111dc ("perf/core: Add a new PERF_EV_CAP_SIBLING event capability") Reported-by: Leo Yan Signed-off-by: Peter Zijlstra (Intel) Link: https://lkml.kernel.org/r/20250605123343.GD35970@noisy.programming.kicks-ass.net Signed-off-by: Sasha Levin --- kernel/events/core.c | 51 ++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index ed3bc2e390511..3389a5a2724df 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -2111,8 +2111,9 @@ perf_aux_output_match(struct perf_event *event, struct perf_event *aux_event) } static void put_event(struct perf_event *event); -static void event_sched_out(struct perf_event *event, - struct perf_event_context *ctx); +static void __event_disable(struct perf_event *event, + struct perf_event_context *ctx, + enum perf_event_state state); static void perf_put_aux_event(struct perf_event *event) { @@ -2145,8 +2146,7 @@ static void perf_put_aux_event(struct perf_event *event) * state so that we don't try to schedule it again. Note * that perf_event_enable() will clear the ERROR status. */ - event_sched_out(iter, ctx); - perf_event_set_state(event, PERF_EVENT_STATE_ERROR); + __event_disable(iter, ctx, PERF_EVENT_STATE_ERROR); } } @@ -2204,18 +2204,6 @@ static inline struct list_head *get_event_list(struct perf_event *event) &event->pmu_ctx->flexible_active; } -/* - * Events that have PERF_EV_CAP_SIBLING require being part of a group and - * cannot exist on their own, schedule them out and move them into the ERROR - * state. Also see _perf_event_enable(), it will not be able to recover - * this ERROR state. - */ -static inline void perf_remove_sibling_event(struct perf_event *event) -{ - event_sched_out(event, event->ctx); - perf_event_set_state(event, PERF_EVENT_STATE_ERROR); -} - static void perf_group_detach(struct perf_event *event) { struct perf_event *leader = event->group_leader; @@ -2251,8 +2239,15 @@ static void perf_group_detach(struct perf_event *event) */ list_for_each_entry_safe(sibling, tmp, &event->sibling_list, sibling_list) { + /* + * Events that have PERF_EV_CAP_SIBLING require being part of + * a group and cannot exist on their own, schedule them out + * and move them into the ERROR state. Also see + * _perf_event_enable(), it will not be able to recover this + * ERROR state. + */ if (sibling->event_caps & PERF_EV_CAP_SIBLING) - perf_remove_sibling_event(sibling); + __event_disable(sibling, ctx, PERF_EVENT_STATE_ERROR); sibling->group_leader = sibling; list_del_init(&sibling->sibling_list); @@ -2512,6 +2507,15 @@ static void perf_remove_from_context(struct perf_event *event, unsigned long fla event_function_call(event, __perf_remove_from_context, (void *)flags); } +static void __event_disable(struct perf_event *event, + struct perf_event_context *ctx, + enum perf_event_state state) +{ + event_sched_out(event, ctx); + perf_cgroup_event_disable(event, ctx); + perf_event_set_state(event, state); +} + /* * Cross CPU call to disable a performance event */ @@ -2526,13 +2530,18 @@ static void __perf_event_disable(struct perf_event *event, perf_pmu_disable(event->pmu_ctx->pmu); ctx_time_update_event(ctx, event); + /* + * When disabling a group leader, the whole group becomes ineligible + * to run, so schedule out the full group. + */ if (event == event->group_leader) group_sched_out(event, ctx); - else - event_sched_out(event, ctx); - perf_event_set_state(event, PERF_EVENT_STATE_OFF); - perf_cgroup_event_disable(event, ctx); + /* + * But only mark the leader OFF; the siblings will remain + * INACTIVE. + */ + __event_disable(event, ctx, PERF_EVENT_STATE_OFF); perf_pmu_enable(event->pmu_ctx->pmu); } -- GitLab From fd199366bf3862402116b2e270d5c9e7adbc5c0a Mon Sep 17 00:00:00 2001 From: Luo Gengkun Date: Wed, 4 Jun 2025 03:39:24 +0000 Subject: [PATCH 1615/2211] perf/core: Fix WARN in perf_cgroup_switch() [ Upstream commit 3172fb986666dfb71bf483b6d3539e1e587fa197 ] There may be concurrency between perf_cgroup_switch and perf_cgroup_event_disable. Consider the following scenario: after a new perf cgroup event is created on CPU0, the new event may not trigger a reprogramming, causing ctx->is_active to be 0. In this case, when CPU1 disables this perf event, it executes __perf_remove_from_context-> list _del_event->perf_cgroup_event_disable on CPU1, which causes a race with perf_cgroup_switch running on CPU0. The following describes the details of this concurrency scenario: CPU0 CPU1 perf_cgroup_switch: ... # cpuctx->cgrp is not NULL here if (READ_ONCE(cpuctx->cgrp) == NULL) return; perf_remove_from_context: ... raw_spin_lock_irq(&ctx->lock); ... # ctx->is_active == 0 because reprogramm is not # tigger, so CPU1 can do __perf_remove_from_context # for CPU0 __perf_remove_from_context: perf_cgroup_event_disable: ... if (--ctx->nr_cgroups) ... # this warning will happened because CPU1 changed # ctx.nr_cgroups to 0. WARN_ON_ONCE(cpuctx->ctx.nr_cgroups == 0); [peterz: use guard instead of goto unlock] Fixes: db4a835601b7 ("perf/core: Set cgroup in CPU contexts for new cgroup events") Signed-off-by: Luo Gengkun Signed-off-by: Peter Zijlstra (Intel) Link: https://lkml.kernel.org/r/20250604033924.3914647-3-luogengkun@huaweicloud.com Signed-off-by: Sasha Levin --- kernel/events/core.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index 3389a5a2724df..7210104b3345c 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -206,6 +206,19 @@ static void perf_ctx_unlock(struct perf_cpu_context *cpuctx, __perf_ctx_unlock(&cpuctx->ctx); } +typedef struct { + struct perf_cpu_context *cpuctx; + struct perf_event_context *ctx; +} class_perf_ctx_lock_t; + +static inline void class_perf_ctx_lock_destructor(class_perf_ctx_lock_t *_T) +{ perf_ctx_unlock(_T->cpuctx, _T->ctx); } + +static inline class_perf_ctx_lock_t +class_perf_ctx_lock_constructor(struct perf_cpu_context *cpuctx, + struct perf_event_context *ctx) +{ perf_ctx_lock(cpuctx, ctx); return (class_perf_ctx_lock_t){ cpuctx, ctx }; } + #define TASK_TOMBSTONE ((void *)-1L) static bool is_kernel_event(struct perf_event *event) @@ -898,7 +911,13 @@ static void perf_cgroup_switch(struct task_struct *task) if (READ_ONCE(cpuctx->cgrp) == cgrp) return; - perf_ctx_lock(cpuctx, cpuctx->task_ctx); + guard(perf_ctx_lock)(cpuctx, cpuctx->task_ctx); + /* + * Re-check, could've raced vs perf_remove_from_context(). + */ + if (READ_ONCE(cpuctx->cgrp) == NULL) + return; + perf_ctx_disable(&cpuctx->ctx, true); ctx_sched_out(&cpuctx->ctx, NULL, EVENT_ALL|EVENT_CGROUP); @@ -916,7 +935,6 @@ static void perf_cgroup_switch(struct task_struct *task) ctx_sched_in(&cpuctx->ctx, NULL, EVENT_ALL|EVENT_CGROUP); perf_ctx_enable(&cpuctx->ctx, true); - perf_ctx_unlock(cpuctx, cpuctx->task_ctx); } static int perf_cgroup_ensure_storage(struct perf_event *event, -- GitLab From 22f935bc86bdfbde04009f05eee191d220cd8c89 Mon Sep 17 00:00:00 2001 From: Tengda Wu Date: Wed, 4 Jun 2025 00:55:33 +0000 Subject: [PATCH 1616/2211] arm64/ptrace: Fix stack-out-of-bounds read in regs_get_kernel_stack_nth() [ Upstream commit 39dfc971e42d886e7df01371cd1bef505076d84c ] KASAN reports a stack-out-of-bounds read in regs_get_kernel_stack_nth(). Call Trace: [ 97.283505] BUG: KASAN: stack-out-of-bounds in regs_get_kernel_stack_nth+0xa8/0xc8 [ 97.284677] Read of size 8 at addr ffff800089277c10 by task 1.sh/2550 [ 97.285732] [ 97.286067] CPU: 7 PID: 2550 Comm: 1.sh Not tainted 6.6.0+ #11 [ 97.287032] Hardware name: linux,dummy-virt (DT) [ 97.287815] Call trace: [ 97.288279] dump_backtrace+0xa0/0x128 [ 97.288946] show_stack+0x20/0x38 [ 97.289551] dump_stack_lvl+0x78/0xc8 [ 97.290203] print_address_description.constprop.0+0x84/0x3c8 [ 97.291159] print_report+0xb0/0x280 [ 97.291792] kasan_report+0x84/0xd0 [ 97.292421] __asan_load8+0x9c/0xc0 [ 97.293042] regs_get_kernel_stack_nth+0xa8/0xc8 [ 97.293835] process_fetch_insn+0x770/0xa30 [ 97.294562] kprobe_trace_func+0x254/0x3b0 [ 97.295271] kprobe_dispatcher+0x98/0xe0 [ 97.295955] kprobe_breakpoint_handler+0x1b0/0x210 [ 97.296774] call_break_hook+0xc4/0x100 [ 97.297451] brk_handler+0x24/0x78 [ 97.298073] do_debug_exception+0xac/0x178 [ 97.298785] el1_dbg+0x70/0x90 [ 97.299344] el1h_64_sync_handler+0xcc/0xe8 [ 97.300066] el1h_64_sync+0x78/0x80 [ 97.300699] kernel_clone+0x0/0x500 [ 97.301331] __arm64_sys_clone+0x70/0x90 [ 97.302084] invoke_syscall+0x68/0x198 [ 97.302746] el0_svc_common.constprop.0+0x11c/0x150 [ 97.303569] do_el0_svc+0x38/0x50 [ 97.304164] el0_svc+0x44/0x1d8 [ 97.304749] el0t_64_sync_handler+0x100/0x130 [ 97.305500] el0t_64_sync+0x188/0x190 [ 97.306151] [ 97.306475] The buggy address belongs to stack of task 1.sh/2550 [ 97.307461] and is located at offset 0 in frame: [ 97.308257] __se_sys_clone+0x0/0x138 [ 97.308910] [ 97.309241] This frame has 1 object: [ 97.309873] [48, 184) 'args' [ 97.309876] [ 97.310749] The buggy address belongs to the virtual mapping at [ 97.310749] [ffff800089270000, ffff800089279000) created by: [ 97.310749] dup_task_struct+0xc0/0x2e8 [ 97.313347] [ 97.313674] The buggy address belongs to the physical page: [ 97.314604] page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x14f69a [ 97.315885] flags: 0x15ffffe00000000(node=1|zone=2|lastcpupid=0xfffff) [ 97.316957] raw: 015ffffe00000000 0000000000000000 dead000000000122 0000000000000000 [ 97.318207] raw: 0000000000000000 0000000000000000 00000001ffffffff 0000000000000000 [ 97.319445] page dumped because: kasan: bad access detected [ 97.320371] [ 97.320694] Memory state around the buggy address: [ 97.321511] ffff800089277b00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 97.322681] ffff800089277b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 97.323846] >ffff800089277c00: 00 00 f1 f1 f1 f1 f1 f1 00 00 00 00 00 00 00 00 [ 97.325023] ^ [ 97.325683] ffff800089277c80: 00 00 00 00 00 00 00 00 00 f3 f3 f3 f3 f3 f3 f3 [ 97.326856] ffff800089277d00: f3 f3 00 00 00 00 00 00 00 00 00 00 00 00 00 00 This issue seems to be related to the behavior of some gcc compilers and was also fixed on the s390 architecture before: commit d93a855c31b7 ("s390/ptrace: Avoid KASAN false positives in regs_get_kernel_stack_nth()") As described in that commit, regs_get_kernel_stack_nth() has confirmed that `addr` is on the stack, so reading the value at `*addr` should be allowed. Use READ_ONCE_NOCHECK() helper to silence the KASAN check for this case. Fixes: 0a8ea52c3eb1 ("arm64: Add HAVE_REGS_AND_STACK_ACCESS_API feature") Signed-off-by: Tengda Wu Link: https://lore.kernel.org/r/20250604005533.1278992-1-wutengda@huaweicloud.com [will: Use '*addr' as the argument to READ_ONCE_NOCHECK()] Signed-off-by: Will Deacon Signed-off-by: Sasha Levin --- arch/arm64/kernel/ptrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 1559a239137f3..1a8f4284cb69a 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -140,7 +140,7 @@ unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n) addr += n; if (regs_within_kernel_stack(regs, (unsigned long)addr)) - return *addr; + return READ_ONCE_NOCHECK(*addr); else return 0; } -- GitLab From 38cd10628252fb709c3d1f34c6db1d3823ac7674 Mon Sep 17 00:00:00 2001 From: Vitaliy Shevtsov Date: Thu, 12 Jun 2025 21:35:18 +0500 Subject: [PATCH 1617/2211] scsi: elx: efct: Fix memory leak in efct_hw_parse_filter() [ Upstream commit 2a8a5a5dd06eef580f9818567773fd75057cb875 ] strsep() modifies the address of the pointer passed to it so that it no longer points to the original address. This means kfree() gets the wrong pointer. Fix this by passing unmodified pointer returned from kstrdup() to kfree(). Found by Linux Verification Center (linuxtesting.org) with Svace. Fixes: 4df84e846624 ("scsi: elx: efct: Driver initialization routines") Signed-off-by: Vitaliy Shevtsov Link: https://lore.kernel.org/r/20250612163616.24298-1-v.shevtsov@mt-integration.ru Reviewed-by: Daniel Wagner Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/elx/efct/efct_hw.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/elx/efct/efct_hw.c b/drivers/scsi/elx/efct/efct_hw.c index 5a5525054d71c..5b079b8b7a082 100644 --- a/drivers/scsi/elx/efct/efct_hw.c +++ b/drivers/scsi/elx/efct/efct_hw.c @@ -1120,7 +1120,7 @@ int efct_hw_parse_filter(struct efct_hw *hw, void *value) { int rc = 0; - char *p = NULL; + char *p = NULL, *pp = NULL; char *token; u32 idx = 0; @@ -1132,6 +1132,7 @@ efct_hw_parse_filter(struct efct_hw *hw, void *value) efc_log_err(hw->os, "p is NULL\n"); return -ENOMEM; } + pp = p; idx = 0; while ((token = strsep(&p, ",")) && *token) { @@ -1144,7 +1145,7 @@ efct_hw_parse_filter(struct efct_hw *hw, void *value) if (idx == ARRAY_SIZE(hw->config.filter_def)) break; } - kfree(p); + kfree(pp); return rc; } -- GitLab From ee85e957f6d748ff4d2dd63401e81a94d1503671 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Thu, 5 Jun 2025 11:44:46 +0530 Subject: [PATCH 1618/2211] RISC-V: KVM: Fix the size parameter check in SBI SFENCE calls [ Upstream commit 6aba0cb5bba6141158d5449f2cf53187b7f755f9 ] As-per the SBI specification, an SBI remote fence operation applies to the entire address space if either: 1) start_addr and size are both 0 2) size is equal to 2^XLEN-1 >From the above, only #1 is checked by SBI SFENCE calls so fix the size parameter check in SBI SFENCE calls to cover #2 as well. Fixes: 13acfec2dbcc ("RISC-V: KVM: Add remote HFENCE functions based on VCPU requests") Reviewed-by: Atish Patra Signed-off-by: Anup Patel Link: https://lore.kernel.org/r/20250605061458.196003-2-apatel@ventanamicro.com Signed-off-by: Anup Patel Signed-off-by: Sasha Levin --- arch/riscv/kvm/vcpu_sbi_replace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/riscv/kvm/vcpu_sbi_replace.c b/arch/riscv/kvm/vcpu_sbi_replace.c index 5fbf3f94f1e85..9752d2ffff683 100644 --- a/arch/riscv/kvm/vcpu_sbi_replace.c +++ b/arch/riscv/kvm/vcpu_sbi_replace.c @@ -103,7 +103,7 @@ static int kvm_sbi_ext_rfence_handler(struct kvm_vcpu *vcpu, struct kvm_run *run kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_FENCE_I_SENT); break; case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA: - if (cp->a2 == 0 && cp->a3 == 0) + if ((cp->a2 == 0 && cp->a3 == 0) || cp->a3 == -1UL) kvm_riscv_hfence_vvma_all(vcpu->kvm, hbase, hmask); else kvm_riscv_hfence_vvma_gva(vcpu->kvm, hbase, hmask, @@ -111,7 +111,7 @@ static int kvm_sbi_ext_rfence_handler(struct kvm_vcpu *vcpu, struct kvm_run *run kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_HFENCE_VVMA_SENT); break; case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID: - if (cp->a2 == 0 && cp->a3 == 0) + if ((cp->a2 == 0 && cp->a3 == 0) || cp->a3 == -1UL) kvm_riscv_hfence_vvma_asid_all(vcpu->kvm, hbase, hmask, cp->a4); else -- GitLab From ca1f9cc89ca9421dbd724512a5e5521d3a501140 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Thu, 5 Jun 2025 11:44:47 +0530 Subject: [PATCH 1619/2211] RISC-V: KVM: Don't treat SBI HFENCE calls as NOPs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 2e7be162996640bbe3b6da694cc064c511b8a5d9 ] The SBI specification clearly states that SBI HFENCE calls should return SBI_ERR_NOT_SUPPORTED when one of the target hart doesn’t support hypervisor extension (aka nested virtualization in-case of KVM RISC-V). Fixes: c7fa3c48de86 ("RISC-V: KVM: Treat SBI HFENCE calls as NOPs") Reviewed-by: Atish Patra Signed-off-by: Anup Patel Link: https://lore.kernel.org/r/20250605061458.196003-3-apatel@ventanamicro.com Signed-off-by: Anup Patel Signed-off-by: Sasha Levin --- arch/riscv/kvm/vcpu_sbi_replace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/riscv/kvm/vcpu_sbi_replace.c b/arch/riscv/kvm/vcpu_sbi_replace.c index 9752d2ffff683..b17fad091babd 100644 --- a/arch/riscv/kvm/vcpu_sbi_replace.c +++ b/arch/riscv/kvm/vcpu_sbi_replace.c @@ -127,9 +127,9 @@ static int kvm_sbi_ext_rfence_handler(struct kvm_vcpu *vcpu, struct kvm_run *run case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID: /* * Until nested virtualization is implemented, the - * SBI HFENCE calls should be treated as NOPs + * SBI HFENCE calls should return not supported + * hence fallthrough. */ - break; default: retdata->err_val = SBI_ERR_NOT_SUPPORTED; } -- GitLab From 1afda9f2bd85461349717714fdc1e7d8f1f53819 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 16 Jun 2025 15:45:03 +0200 Subject: [PATCH 1620/2211] gpio: pca953x: fix wrong error probe return value [ Upstream commit 0a1db19f66c0960eb00e1f2ccd40708b6747f5b1 ] The second argument to dev_err_probe() is the error value. Pass the return value of devm_request_threaded_irq() there instead of the irq number. Signed-off-by: Sascha Hauer Fixes: c47f7ff0fe61 ("gpio: pca953x: Utilise dev_err_probe() where it makes sense") Link: https://lore.kernel.org/r/20250616134503.1201138-1-s.hauer@pengutronix.de Signed-off-by: Bartosz Golaszewski Signed-off-by: Sasha Levin --- drivers/gpio/gpio-pca953x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c index ef3aee1cabcfd..bb7c1bf5f856e 100644 --- a/drivers/gpio/gpio-pca953x.c +++ b/drivers/gpio/gpio-pca953x.c @@ -951,7 +951,7 @@ static int pca953x_irq_setup(struct pca953x_chip *chip, int irq_base) IRQF_ONESHOT | IRQF_SHARED, dev_name(dev), chip); if (ret) - return dev_err_probe(dev, client->irq, "failed to request irq\n"); + return dev_err_probe(dev, ret, "failed to request irq\n"); return 0; } -- GitLab From e6386adcb435ebdb305d0838bd478f66b0bcee28 Mon Sep 17 00:00:00 2001 From: Ian Rogers Date: Fri, 13 Jun 2025 17:41:05 -0700 Subject: [PATCH 1621/2211] perf evsel: Missed close() when probing hybrid core PMUs [ Upstream commit ebec62bc7ec435b475722a5467d67c720a1ad79f ] Add missing close() to avoid leaking perf events. In past perfs this mattered little as the function was just used by 'perf list'. As the function is now used to detect hybrid PMUs leaking the perf event is somewhat more painful. Fixes: b41f1cec91c37eee ("perf list: Skip unsupported events") Signed-off-by: Ian Rogers Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Andi Kleen Cc: Ingo Molnar Cc: Jiapeng Chong Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Michael Petlan Cc: Namhyung Kim Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Tiezhu Yang Link: https://lore.kernel.org/r/20250614004108.1650988-2-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/util/print-events.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/perf/util/print-events.c b/tools/perf/util/print-events.c index 81e0135cddf01..a1c71d9793bd8 100644 --- a/tools/perf/util/print-events.c +++ b/tools/perf/util/print-events.c @@ -282,6 +282,7 @@ bool is_event_supported(u8 type, u64 config) ret = evsel__open(evsel, NULL, tmap) >= 0; } + evsel__close(evsel); evsel__delete(evsel); } -- GitLab From b99cf44daacfd5c104cc1956d2a4479e5653708a Mon Sep 17 00:00:00 2001 From: Ian Rogers Date: Fri, 13 Jun 2025 17:41:04 -0700 Subject: [PATCH 1622/2211] perf test: Directory file descriptor leak [ Upstream commit 19f4422d485b2d0a935117a1a16015328f99be25 ] Add missed close when iterating over the script directories. Fixes: f3295f5b067d3c26 ("perf tests: Use scandirat for shell script finding") Signed-off-by: Ian Rogers Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Andi Kleen Cc: Ingo Molnar Cc: Jiapeng Chong Cc: Jiri Olsa Cc: Kan Liang Cc: Mark Rutland Cc: Michael Petlan Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Tiezhu Yang Link: https://lore.kernel.org/r/20250614004108.1650988-1-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/perf/tests/tests-scripts.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/perf/tests/tests-scripts.c b/tools/perf/tests/tests-scripts.c index ed114b0442936..b6986d50dde6c 100644 --- a/tools/perf/tests/tests-scripts.c +++ b/tools/perf/tests/tests-scripts.c @@ -255,6 +255,7 @@ static void append_scripts_in_dir(int dir_fd, continue; /* Skip scripts that have a separate driver. */ fd = openat(dir_fd, ent->d_name, O_PATH); append_scripts_in_dir(fd, result, result_sz); + close(fd); } for (i = 0; i < n_dirs; i++) /* Clean up */ zfree(&entlist[i]); -- GitLab From fddf20b3341d8af171fd7adbe03fb5d6832b0f5a Mon Sep 17 00:00:00 2001 From: David Thompson Date: Fri, 13 Jun 2025 16:34:43 +0000 Subject: [PATCH 1623/2211] gpio: mlxbf3: only get IRQ for device instance 0 [ Upstream commit 10af0273a35ab4513ca1546644b8c853044da134 ] The gpio-mlxbf3 driver interfaces with two GPIO controllers, device instance 0 and 1. There is a single IRQ resource shared between the two controllers, and it is found in the ACPI table for device instance 0. The driver should not attempt to get an IRQ resource when probing device instance 1, otherwise the following error is logged: mlxbf3_gpio MLNXBF33:01: error -ENXIO: IRQ index 0 not found Signed-off-by: David Thompson Reviewed-by: Shravan Kumar Ramani Fixes: cd33f216d241 ("gpio: mlxbf3: Add gpio driver support") Link: https://lore.kernel.org/r/20250613163443.1065217-1-davthompson@nvidia.com Signed-off-by: Bartosz Golaszewski Signed-off-by: Sasha Levin --- drivers/gpio/gpio-mlxbf3.c | 54 ++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/drivers/gpio/gpio-mlxbf3.c b/drivers/gpio/gpio-mlxbf3.c index 10ea71273c891..9875e34bde72a 100644 --- a/drivers/gpio/gpio-mlxbf3.c +++ b/drivers/gpio/gpio-mlxbf3.c @@ -190,7 +190,9 @@ static int mlxbf3_gpio_probe(struct platform_device *pdev) struct mlxbf3_gpio_context *gs; struct gpio_irq_chip *girq; struct gpio_chip *gc; + char *colon_ptr; int ret, irq; + long num; gs = devm_kzalloc(dev, sizeof(*gs), GFP_KERNEL); if (!gs) @@ -227,25 +229,39 @@ static int mlxbf3_gpio_probe(struct platform_device *pdev) gc->owner = THIS_MODULE; gc->add_pin_ranges = mlxbf3_gpio_add_pin_ranges; - irq = platform_get_irq(pdev, 0); - if (irq >= 0) { - girq = &gs->gc.irq; - gpio_irq_chip_set_chip(girq, &gpio_mlxbf3_irqchip); - girq->default_type = IRQ_TYPE_NONE; - /* This will let us handle the parent IRQ in the driver */ - girq->num_parents = 0; - girq->parents = NULL; - girq->parent_handler = NULL; - girq->handler = handle_bad_irq; - - /* - * Directly request the irq here instead of passing - * a flow-handler because the irq is shared. - */ - ret = devm_request_irq(dev, irq, mlxbf3_gpio_irq_handler, - IRQF_SHARED, dev_name(dev), gs); - if (ret) - return dev_err_probe(dev, ret, "failed to request IRQ"); + colon_ptr = strchr(dev_name(dev), ':'); + if (!colon_ptr) { + dev_err(dev, "invalid device name format\n"); + return -EINVAL; + } + + ret = kstrtol(++colon_ptr, 16, &num); + if (ret) { + dev_err(dev, "invalid device instance\n"); + return ret; + } + + if (!num) { + irq = platform_get_irq(pdev, 0); + if (irq >= 0) { + girq = &gs->gc.irq; + gpio_irq_chip_set_chip(girq, &gpio_mlxbf3_irqchip); + girq->default_type = IRQ_TYPE_NONE; + /* This will let us handle the parent IRQ in the driver */ + girq->num_parents = 0; + girq->parents = NULL; + girq->parent_handler = NULL; + girq->handler = handle_bad_irq; + + /* + * Directly request the irq here instead of passing + * a flow-handler because the irq is shared. + */ + ret = devm_request_irq(dev, irq, mlxbf3_gpio_irq_handler, + IRQF_SHARED, dev_name(dev), gs); + if (ret) + return dev_err_probe(dev, ret, "failed to request IRQ"); + } } platform_set_drvdata(pdev, gs); -- GitLab From f4d483852a455f8e1b6b8ccb4dcf53888e0e79b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Sun, 8 Jun 2025 16:10:33 +0200 Subject: [PATCH 1624/2211] cifs: Remove duplicate fattr->cf_dtype assignment from wsl_to_fattr() function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 840738eae94864993a735ab677b9795bb8f3b961 ] Commit 8bd25b61c5a5 ("smb: client: set correct d_type for reparse DFS/DFSR and mount point") deduplicated assignment of fattr->cf_dtype member from all places to end of the function cifs_reparse_point_to_fattr(). The only one missing place which was not deduplicated is wsl_to_fattr(). Fix it. Fixes: 8bd25b61c5a5 ("smb: client: set correct d_type for reparse DFS/DFSR and mount point") Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/reparse.c | 1 - 1 file changed, 1 deletion(-) diff --git a/fs/smb/client/reparse.c b/fs/smb/client/reparse.c index b6556fe3dfa11..4d45c31336df1 100644 --- a/fs/smb/client/reparse.c +++ b/fs/smb/client/reparse.c @@ -738,7 +738,6 @@ out: if (!have_xattr_dev && (tag == IO_REPARSE_TAG_LX_CHR || tag == IO_REPARSE_TAG_LX_BLK)) return false; - fattr->cf_dtype = S_DT(fattr->cf_mode); return true; } -- GitLab From da70cb95b8b56fa279052a277391ca47f670ec64 Mon Sep 17 00:00:00 2001 From: Martin KaFai Lau Date: Wed, 7 May 2025 13:32:32 -0700 Subject: [PATCH 1625/2211] bpftool: Fix cgroup command to only show cgroup bpf programs commit b69d4413aa1961930fbf9ffad8376d577378daf9 upstream. The netkit program is not a cgroup bpf program and should not be shown in the output of the "bpftool cgroup show" command. However, if the netkit device happens to have ifindex 3, the "bpftool cgroup show" command will output the netkit bpf program as well: > ip -d link show dev nk1 3: nk1@if2: ... link/ether ... netkit mode ... > bpftool net show tc: nk1(3) netkit/peer tw_ns_nk2phy prog_id 469447 > bpftool cgroup show /sys/fs/cgroup/... ID AttachType AttachFlags Name ... ... ... 469447 netkit_peer tw_ns_nk2phy The reason is that the target_fd (which is the cgroup_fd here) and the target_ifindex are in a union in the uapi/linux/bpf.h. The bpftool iterates all values in "enum bpf_attach_type" which includes non cgroup attach types like netkit. The cgroup_fd is usually 3 here, so the bug is triggered when the netkit ifindex just happens to be 3 as well. The bpftool's cgroup.c already has a list of cgroup-only attach type defined in "cgroup_attach_types[]". This patch fixes it by iterating over "cgroup_attach_types[]" instead of "__MAX_BPF_ATTACH_TYPE". Cc: Quentin Monnet Reported-by: Takshak Chahande Signed-off-by: Martin KaFai Lau Acked-by: Daniel Borkmann Reviewed-by: Quentin Monnet Link: https://lore.kernel.org/r/20250507203232.1420762-1-martin.lau@linux.dev Signed-off-by: Alexei Starovoitov Signed-off-by: Greg Kroah-Hartman --- tools/bpf/bpftool/cgroup.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/bpf/bpftool/cgroup.c b/tools/bpf/bpftool/cgroup.c index afab728468bf6..4189c9d74fb06 100644 --- a/tools/bpf/bpftool/cgroup.c +++ b/tools/bpf/bpftool/cgroup.c @@ -318,11 +318,11 @@ static int show_bpf_progs(int cgroup_fd, enum bpf_attach_type type, static int do_show(int argc, char **argv) { - enum bpf_attach_type type; int has_attached_progs; const char *path; int cgroup_fd; int ret = -1; + unsigned int i; query_flags = 0; @@ -370,14 +370,14 @@ static int do_show(int argc, char **argv) "AttachFlags", "Name"); btf_vmlinux = libbpf_find_kernel_btf(); - for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) { + for (i = 0; i < ARRAY_SIZE(cgroup_attach_types); i++) { /* * Not all attach types may be supported, so it's expected, * that some requests will fail. * If we were able to get the show for at least one * attach type, let's return 0. */ - if (show_bpf_progs(cgroup_fd, type, 0) == 0) + if (show_bpf_progs(cgroup_fd, cgroup_attach_types[i], 0) == 0) ret = 0; } @@ -400,9 +400,9 @@ exit: static int do_show_tree_fn(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftw) { - enum bpf_attach_type type; int has_attached_progs; int cgroup_fd; + unsigned int i; if (typeflag != FTW_D) return 0; @@ -434,8 +434,8 @@ static int do_show_tree_fn(const char *fpath, const struct stat *sb, } btf_vmlinux = libbpf_find_kernel_btf(); - for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) - show_bpf_progs(cgroup_fd, type, ftw->level); + for (i = 0; i < ARRAY_SIZE(cgroup_attach_types); i++) + show_bpf_progs(cgroup_fd, cgroup_attach_types[i], ftw->level); if (errno == EINVAL) /* Last attach type does not support query. -- GitLab From 783cd2c3dca8b6c434e955b84c20c8940588dc68 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 27 Jun 2025 11:11:46 +0100 Subject: [PATCH 1626/2211] Linux 6.12.35 Link: https://lore.kernel.org/r/20250623130642.015559452@linuxfoundation.org Tested-by: Harshit Mogalapalli Tested-by: Peter Schneider Tested-by: Florian Fainelli Tested-by: Ron Economos Tested-by: Salvatore Bonaccorso Link: https://lore.kernel.org/r/20250624121426.466976226@linuxfoundation.org Tested-by: Peter Schneider Tested-by: Florian Fainelli Tested-by: Jon Hunter Tested-by: Linux Kernel Functional Testing Tested-by: Brett Mastbergen Tested-by: Mark Brown Tested-by: Miguel Ojeda Signed-off-by: Greg Kroah-Hartman --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b58a061cb3595..535df76f6f78c 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 12 -SUBLEVEL = 34 +SUBLEVEL = 35 EXTRAVERSION = NAME = Baby Opossum Posse -- GitLab From 2bd2d17852dc2c9e9885e8b3bf99f411e9000669 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 6 Jun 2025 10:11:44 +0000 Subject: [PATCH 1627/2211] ANDROID: GKI: x86: remove CFI_AUTO_DEFAULT=N from gki_defconfig In commit 5a8d073d87da ("x86/Kconfig: make CFI_AUTO_DEFAULT depend on !RUST or Rust >= 1.88"), CFI_AUTO_DEFAULT is properly handled, so no need to explicitly disable it in the gki_defconfig file. Remove it to fix up the build properly. Fixes: 5a8d073d87da ("x86/Kconfig: make CFI_AUTO_DEFAULT depend on !RUST or Rust >= 1.88") Change-Id: I4c6f565c3be56ef00625dd93fd6e85cec2dadd2e Signed-off-by: Greg Kroah-Hartman --- arch/x86/configs/gki_defconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig index 6be7afdf8ac87..567fdfb229cb5 100644 --- a/arch/x86/configs/gki_defconfig +++ b/arch/x86/configs/gki_defconfig @@ -70,7 +70,6 @@ CONFIG_NR_CPUS=32 CONFIG_EFI=y CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE="console=ttynull stack_depot_disable=on cgroup_disable=pressure bootconfig" -# CONFIG_CFI_AUTO_DEFAULT is not set CONFIG_HIBERNATION=y CONFIG_PM_WAKELOCKS=y CONFIG_PM_WAKELOCKS_LIMIT=0 -- GitLab From 1142d4db4988c4be6351e22f6e13679adaec2f2b Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 6 Jun 2025 11:51:36 +0000 Subject: [PATCH 1628/2211] Revert "ipv6: save dontfrag in cork" This reverts commit c1502fc84d1c65e17ba25fcde1c52cbe52f79157 which is commit a18dfa9925b9ef6107ea3aa5814ca3c704d34a8a upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I903d355bf399107b2cd8482f437fbddfc55a8ff3 Signed-off-by: Greg Kroah-Hartman --- include/linux/ipv6.h | 1 - net/ipv6/ip6_output.c | 9 ++++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 6705d9c6758cc..9f0193b969f64 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -214,7 +214,6 @@ struct inet6_cork { struct ipv6_txoptions *opt; u8 hop_limit; u8 tclass; - u8 dontfrag:1; }; /* struct ipv6_pinfo - ipv6 private area */ diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 89a61e040e6a1..434ddf263b88a 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -1386,7 +1386,6 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork, } v6_cork->hop_limit = ipc6->hlimit; v6_cork->tclass = ipc6->tclass; - v6_cork->dontfrag = ipc6->dontfrag; if (rt->dst.flags & DST_XFRM_TUNNEL) mtu = READ_ONCE(np->pmtudisc) >= IPV6_PMTUDISC_PROBE ? READ_ONCE(rt->dst.dev->mtu) : dst_mtu(&rt->dst); @@ -1418,7 +1417,7 @@ static int __ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb), void *from, size_t length, int transhdrlen, - unsigned int flags) + unsigned int flags, struct ipcm6_cookie *ipc6) { struct sk_buff *skb, *skb_prev = NULL; struct inet_cork *cork = &cork_full->base; @@ -1472,7 +1471,7 @@ static int __ip6_append_data(struct sock *sk, if (headersize + transhdrlen > mtu) goto emsgsize; - if (cork->length + length > mtu - headersize && v6_cork->dontfrag && + if (cork->length + length > mtu - headersize && ipc6->dontfrag && (sk->sk_protocol == IPPROTO_UDP || sk->sk_protocol == IPPROTO_ICMPV6 || sk->sk_protocol == IPPROTO_RAW)) { @@ -1844,7 +1843,7 @@ int ip6_append_data(struct sock *sk, return __ip6_append_data(sk, &sk->sk_write_queue, &inet->cork, &np->cork, sk_page_frag(sk), getfrag, - from, length, transhdrlen, flags); + from, length, transhdrlen, flags, ipc6); } EXPORT_SYMBOL_GPL(ip6_append_data); @@ -2049,7 +2048,7 @@ struct sk_buff *ip6_make_skb(struct sock *sk, err = __ip6_append_data(sk, &queue, cork, &v6_cork, ¤t->task_frag, getfrag, from, length + exthdrlen, transhdrlen + exthdrlen, - flags); + flags, ipc6); if (err) { __ip6_flush_pending_frames(sk, &queue, cork, &v6_cork); return ERR_PTR(err); -- GitLab From ff7f30c2c621ce8e74f467504284e0a1cdc41a87 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 6 Jun 2025 11:53:26 +0000 Subject: [PATCH 1629/2211] Revert "usb: xhci: set page size to the xHCI-supported size" This reverts commit 1c171908807cb3717c7a38e51363d1fb8e887e13 which is commit 68c1f1671650b49bbd26e6a65ddcf33f2565efa3 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I86a180900b707071e5d8fca2cec1ac304ad075a7 Signed-off-by: Greg Kroah-Hartman --- drivers/usb/host/xhci-mem.c | 34 ++++++++++++++++------------------ drivers/usb/host/xhci.h | 8 ++++---- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index f328a27310b49..ea80497c7a9d0 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -1950,6 +1950,7 @@ no_bw: xhci->interrupters = NULL; xhci->page_size = 0; + xhci->page_shift = 0; xhci->usb2_rhub.bus_state.bus_suspended = 0; xhci->usb3_rhub.bus_state.bus_suspended = 0; } @@ -2372,22 +2373,6 @@ xhci_create_secondary_interrupter(struct usb_hcd *hcd, unsigned int segs, } EXPORT_SYMBOL_GPL(xhci_create_secondary_interrupter); -static void xhci_hcd_page_size(struct xhci_hcd *xhci) -{ - u32 page_size; - - page_size = readl(&xhci->op_regs->page_size) & XHCI_PAGE_SIZE_MASK; - if (!is_power_of_2(page_size)) { - xhci_warn(xhci, "Invalid page size register = 0x%x\n", page_size); - /* Fallback to 4K page size, since that's common */ - page_size = 1; - } - - xhci->page_size = page_size << 12; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, "HCD page size set to %iK", - xhci->page_size >> 10); -} - int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) { struct xhci_interrupter *ir; @@ -2395,7 +2380,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) dma_addr_t dma; unsigned int val, val2; u64 val_64; - u32 temp; + u32 page_size, temp; int i; INIT_LIST_HEAD(&xhci->cmd_list); @@ -2404,7 +2389,20 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) INIT_DELAYED_WORK(&xhci->cmd_timer, xhci_handle_command_timeout); init_completion(&xhci->cmd_ring_stop_completion); - xhci_hcd_page_size(xhci); + page_size = readl(&xhci->op_regs->page_size); + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "Supported page size register = 0x%x", page_size); + val = ffs(page_size) - 1; + if (val < 16) + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "Supported page size of %iK", (1 << (val + 12)) / 1024); + else + xhci_warn(xhci, "WARN: no supported page size\n"); + /* Use 4K pages, since that's common and the minimum the HC supports */ + xhci->page_shift = 12; + xhci->page_size = 1 << xhci->page_shift; + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "HCD page size set to %iK", xhci->page_size / 1024); /* * Program the Number of Device Slots Enabled field in the CONFIG diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 0dd6f59dff8e4..e4b54d23511cd 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -212,9 +212,6 @@ struct xhci_op_regs { #define CONFIG_CIE (1 << 9) /* bits 10:31 - reserved and should be preserved */ -/* bits 15:0 - HCD page shift bit */ -#define XHCI_PAGE_SIZE_MASK 0xffff - /** * struct xhci_intr_reg - Interrupt Register Set * @irq_pending: IMAN - Interrupt Management Register. Used to enable @@ -1523,7 +1520,10 @@ struct xhci_hcd { u16 max_interrupters; /* imod_interval in ns (I * 250ns) */ u32 imod_interval; - u32 page_size; + /* 4KB min, 128MB max */ + int page_size; + /* Valid values are 12 to 20, inclusive */ + int page_shift; /* MSI-X/MSI vectors */ int nvecs; /* optional clocks */ -- GitLab From 3aa4e29eeaba371679f15063378744253eee315c Mon Sep 17 00:00:00 2001 From: Giuliano Procida Date: Tue, 1 Jul 2025 12:44:36 +0100 Subject: [PATCH 1630/2211] ANDROID: GKI: fix up CRC issue with struct drm_atomic_state In commit 93f581d7634f ("drm/gem: Test for imported GEM buffers with helper"), a new .h file is included in the drm include files, which messes with the definition of struct drm_atomic_state by moving some fields from "unknown" to "known". Fix this up by adding ANDROID_KABI_DECLONLY directives for every type affected in every affected source file. Fixes: 93f581d7634f ("drm/gem: Test for imported GEM buffers with helper") Change-Id: Ia1ecbc152650747bc321156d6920e42121eb34ee Signed-off-by: Giuliano Procida --- drivers/gpu/drm/drm_atomic.c | 5 +++++ drivers/gpu/drm/drm_client.c | 4 ++++ drivers/gpu/drm/drm_debugfs.c | 4 ++++ drivers/gpu/drm/drm_file.c | 4 ++++ drivers/gpu/drm/drm_framebuffer.c | 5 +++++ drivers/gpu/drm/drm_syncobj.c | 5 +++++ drivers/gpu/drm/ttm/ttm_bo.c | 5 +++++ drivers/gpu/drm/ttm/ttm_bo_util.c | 4 ++++ drivers/gpu/drm/ttm/ttm_bo_vm.c | 5 +++++ drivers/gpu/drm/ttm/ttm_device.c | 5 +++++ drivers/gpu/drm/ttm/ttm_range_manager.c | 5 +++++ drivers/gpu/drm/ttm/ttm_resource.c | 4 ++++ drivers/gpu/drm/ttm/ttm_tt.c | 4 ++++ 13 files changed, 59 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 0fc99da93afe1..5056afdab939f 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -46,6 +46,11 @@ #include "drm_crtc_internal.h" #include "drm_internal.h" +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); +ANDROID_KABI_DECLONLY(iosys_map); + void __drm_crtc_commit_free(struct kref *kref) { struct drm_crtc_commit *commit = diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c index bfedcbf516dbe..e4c8fd1d4c028 100644 --- a/drivers/gpu/drm/drm_client.c +++ b/drivers/gpu/drm/drm_client.c @@ -23,6 +23,10 @@ #include "drm_crtc_internal.h" #include "drm_internal.h" +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); + /** * DOC: overview * diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c index 98a37dc3324e4..d7f82257f4fdb 100644 --- a/drivers/gpu/drm/drm_debugfs.c +++ b/drivers/gpu/drm/drm_debugfs.c @@ -45,6 +45,10 @@ #include "drm_crtc_internal.h" #include "drm_internal.h" +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); + /*************************************************** * Initialization, etc. **************************************************/ diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c index e2cf118ff01d3..164f0f2c29f6d 100644 --- a/drivers/gpu/drm/drm_file.c +++ b/drivers/gpu/drm/drm_file.c @@ -49,6 +49,10 @@ #include "drm_crtc_internal.h" #include "drm_internal.h" +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); + /* from BKL pushdown */ DEFINE_MUTEX(drm_global_mutex); diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c index 888aadb6a4acb..cec1bcb57c079 100644 --- a/drivers/gpu/drm/drm_framebuffer.c +++ b/drivers/gpu/drm/drm_framebuffer.c @@ -38,6 +38,11 @@ #include "drm_crtc_internal.h" #include "drm_internal.h" +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); +ANDROID_KABI_DECLONLY(iosys_map); + /** * DOC: overview * diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index 8e3d2d7060f80..396dc12374d65 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -211,6 +211,11 @@ #include "drm_internal.h" +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); +ANDROID_KABI_DECLONLY(iosys_map); + struct syncobj_wait_entry { struct list_head node; struct task_struct *task; diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 320592435252e..e384705fbdb31 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -46,6 +46,11 @@ #include "ttm_module.h" +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); +ANDROID_KABI_DECLONLY(sg_table); + static void ttm_bo_mem_space_debug(struct ttm_buffer_object *bo, struct ttm_placement *placement) { diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 3c07f4712d5cc..fcad827d09475 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -37,6 +37,10 @@ #include +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); + struct ttm_transfer_obj { struct ttm_buffer_object base; struct ttm_buffer_object *bo; diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c index 4212b8c91dd42..b00c5acc6b7d4 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c @@ -38,6 +38,11 @@ #include #include +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); +ANDROID_KABI_DECLONLY(sg_table); + static vm_fault_t ttm_bo_vm_fault_idle(struct ttm_buffer_object *bo, struct vm_fault *vmf) { diff --git a/drivers/gpu/drm/ttm/ttm_device.c b/drivers/gpu/drm/ttm/ttm_device.c index e7cc4954c1bc3..68a4dfb5eafb1 100644 --- a/drivers/gpu/drm/ttm/ttm_device.c +++ b/drivers/gpu/drm/ttm/ttm_device.c @@ -37,6 +37,11 @@ #include "ttm_module.h" +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); +ANDROID_KABI_DECLONLY(sg_table); + /* * ttm_global_mutex - protecting the global state */ diff --git a/drivers/gpu/drm/ttm/ttm_range_manager.c b/drivers/gpu/drm/ttm/ttm_range_manager.c index ae11d07eb63a8..efcef5ec792d3 100644 --- a/drivers/gpu/drm/ttm/ttm_range_manager.c +++ b/drivers/gpu/drm/ttm/ttm_range_manager.c @@ -37,6 +37,11 @@ #include #include +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); +ANDROID_KABI_DECLONLY(sg_table); + /* * Currently we use a spinlock for the lock, but a mutex *may* be * more appropriate to reduce scheduling latency if the range manager diff --git a/drivers/gpu/drm/ttm/ttm_resource.c b/drivers/gpu/drm/ttm/ttm_resource.c index 6d764ba88aab6..d757006f2a0e5 100644 --- a/drivers/gpu/drm/ttm/ttm_resource.c +++ b/drivers/gpu/drm/ttm/ttm_resource.c @@ -33,6 +33,10 @@ #include +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); + /* Detach the cursor from the bulk move list*/ static void ttm_resource_cursor_clear_bulk(struct ttm_resource_cursor *cursor) diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index 4b51b90231267..4b86c0c91b0cd 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c @@ -45,6 +45,10 @@ #include "ttm_module.h" +#include +ANDROID_KABI_DECLONLY(dma_buf); +ANDROID_KABI_DECLONLY(dma_buf_attachment); + static unsigned long ttm_pages_limit; MODULE_PARM_DESC(pages_limit, "Limit for the allocated pages"); -- GitLab From dd2cdf31a02e9037449ae36a8f3a57768f90df4b Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 6 Jun 2025 10:25:15 +0000 Subject: [PATCH 1631/2211] Revert "serial: mctrl_gpio: split disable_ms into sync and no_sync APIs" This reverts commit e6a46719a2369eb5186d4f7e6c0478720ca1ec3d which is commit 1bd2aad57da95f7f2d2bb52f7ad15c0f4993a685 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I28be8dc4d16e6d15707544c89cc140bd4e905ca8 Signed-off-by: Greg Kroah-Hartman --- Documentation/driver-api/serial/driver.rst | 2 +- drivers/tty/serial/8250/8250_port.c | 2 +- drivers/tty/serial/atmel_serial.c | 2 +- drivers/tty/serial/imx.c | 2 +- drivers/tty/serial/serial_mctrl_gpio.c | 34 +++++----------------- drivers/tty/serial/serial_mctrl_gpio.h | 17 ++--------- drivers/tty/serial/sh-sci.c | 2 +- drivers/tty/serial/stm32-usart.c | 2 +- 8 files changed, 16 insertions(+), 47 deletions(-) diff --git a/Documentation/driver-api/serial/driver.rst b/Documentation/driver-api/serial/driver.rst index 60434f2b02863..84b43061c11be 100644 --- a/Documentation/driver-api/serial/driver.rst +++ b/Documentation/driver-api/serial/driver.rst @@ -103,4 +103,4 @@ Some helpers are provided in order to set/get modem control lines via GPIO. .. kernel-doc:: drivers/tty/serial/serial_mctrl_gpio.c :identifiers: mctrl_gpio_init mctrl_gpio_free mctrl_gpio_to_gpiod mctrl_gpio_set mctrl_gpio_get mctrl_gpio_enable_ms - mctrl_gpio_disable_ms_sync mctrl_gpio_disable_ms_no_sync + mctrl_gpio_disable_ms diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index 0519679929652..c1376727642a7 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -1657,7 +1657,7 @@ static void serial8250_disable_ms(struct uart_port *port) if (up->bugs & UART_BUG_NOMSR) return; - mctrl_gpio_disable_ms_no_sync(up->gpios); + mctrl_gpio_disable_ms(up->gpios); up->ier &= ~UART_IER_MSI; serial_port_out(port, UART_IER, up->ier); diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index 8bd39586a49f7..09b246c9e389e 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c @@ -700,7 +700,7 @@ static void atmel_disable_ms(struct uart_port *port) atmel_port->ms_irq_enabled = false; - mctrl_gpio_disable_ms_no_sync(atmel_port->gpios); + mctrl_gpio_disable_ms(atmel_port->gpios); if (!mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_CTS)) idr |= ATMEL_US_CTSIC; diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 8e3b15534bc72..90974d338f3c0 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -1596,7 +1596,7 @@ static void imx_uart_shutdown(struct uart_port *port) imx_uart_dma_exit(sport); } - mctrl_gpio_disable_ms_sync(sport->gpios); + mctrl_gpio_disable_ms(sport->gpios); uart_port_lock_irqsave(&sport->port, &flags); ucr2 = imx_uart_readl(sport, UCR2); diff --git a/drivers/tty/serial/serial_mctrl_gpio.c b/drivers/tty/serial/serial_mctrl_gpio.c index ca55bcc0b6111..8855688a5b6c0 100644 --- a/drivers/tty/serial/serial_mctrl_gpio.c +++ b/drivers/tty/serial/serial_mctrl_gpio.c @@ -322,7 +322,11 @@ void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios) } EXPORT_SYMBOL_GPL(mctrl_gpio_enable_ms); -static void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios, bool sync) +/** + * mctrl_gpio_disable_ms - disable irqs and handling of changes to the ms lines + * @gpios: gpios to disable + */ +void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios) { enum mctrl_gpio_idx i; @@ -338,34 +342,10 @@ static void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios, bool sync) if (!gpios->irq[i]) continue; - if (sync) - disable_irq(gpios->irq[i]); - else - disable_irq_nosync(gpios->irq[i]); + disable_irq(gpios->irq[i]); } } - -/** - * mctrl_gpio_disable_ms_sync - disable irqs and handling of changes to the ms - * lines, and wait for any pending IRQ to be processed - * @gpios: gpios to disable - */ -void mctrl_gpio_disable_ms_sync(struct mctrl_gpios *gpios) -{ - mctrl_gpio_disable_ms(gpios, true); -} -EXPORT_SYMBOL_GPL(mctrl_gpio_disable_ms_sync); - -/** - * mctrl_gpio_disable_ms_no_sync - disable irqs and handling of changes to the - * ms lines, and return immediately - * @gpios: gpios to disable - */ -void mctrl_gpio_disable_ms_no_sync(struct mctrl_gpios *gpios) -{ - mctrl_gpio_disable_ms(gpios, false); -} -EXPORT_SYMBOL_GPL(mctrl_gpio_disable_ms_no_sync); +EXPORT_SYMBOL_GPL(mctrl_gpio_disable_ms); void mctrl_gpio_enable_irq_wake(struct mctrl_gpios *gpios) { diff --git a/drivers/tty/serial/serial_mctrl_gpio.h b/drivers/tty/serial/serial_mctrl_gpio.h index 79e97838ebe56..fc76910fb105a 100644 --- a/drivers/tty/serial/serial_mctrl_gpio.h +++ b/drivers/tty/serial/serial_mctrl_gpio.h @@ -87,16 +87,9 @@ void mctrl_gpio_free(struct device *dev, struct mctrl_gpios *gpios); void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios); /* - * Disable gpio interrupts to report status line changes, and block until - * any corresponding IRQ is processed + * Disable gpio interrupts to report status line changes. */ -void mctrl_gpio_disable_ms_sync(struct mctrl_gpios *gpios); - -/* - * Disable gpio interrupts to report status line changes, and return - * immediately - */ -void mctrl_gpio_disable_ms_no_sync(struct mctrl_gpios *gpios); +void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios); /* * Enable gpio wakeup interrupts to enable wake up source. @@ -155,11 +148,7 @@ static inline void mctrl_gpio_enable_ms(struct mctrl_gpios *gpios) { } -static inline void mctrl_gpio_disable_ms_sync(struct mctrl_gpios *gpios) -{ -} - -static inline void mctrl_gpio_disable_ms_no_sync(struct mctrl_gpios *gpios) +static inline void mctrl_gpio_disable_ms(struct mctrl_gpios *gpios) { } diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 779074b1c2be4..bc6cffb915766 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -2309,7 +2309,7 @@ static void sci_shutdown(struct uart_port *port) dev_dbg(port->dev, "%s(%d)\n", __func__, port->line); s->autorts = false; - mctrl_gpio_disable_ms_sync(to_sci_port(port)->gpios); + mctrl_gpio_disable_ms(to_sci_port(port)->gpios); uart_port_lock_irqsave(port, &flags); sci_stop_rx(port); diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c index e685cace5c854..9b9981352b1e1 100644 --- a/drivers/tty/serial/stm32-usart.c +++ b/drivers/tty/serial/stm32-usart.c @@ -944,7 +944,7 @@ static void stm32_usart_enable_ms(struct uart_port *port) static void stm32_usart_disable_ms(struct uart_port *port) { - mctrl_gpio_disable_ms_sync(to_stm32_port(port)->gpios); + mctrl_gpio_disable_ms(to_stm32_port(port)->gpios); } /* Transmit stop */ -- GitLab From 5035b6dea6fcc1a3ccb90a451d4af442ec741fbe Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 6 Jun 2025 11:52:03 +0000 Subject: [PATCH 1632/2211] Revert "genirq/msi: Store the IOMMU IOVA directly in msi_desc instead of iommu_cookie" This reverts commit 53f42776e435f63e5f8e61955e4c205dbfeaf524 which is commit 1f7df3a691740a7736bbc99dc4ed536120eb4746 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I6cc1f1a93d322e461655a8ce36e090d235de7646 Signed-off-by: Greg Kroah-Hartman --- drivers/iommu/dma-iommu.c | 28 +++++++++++++++------------- include/linux/msi.h | 33 +++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index af815307cfea8..24b242deb12d2 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -2197,7 +2197,7 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) static DEFINE_MUTEX(msi_prepare_lock); /* see below */ if (!domain || !domain->iova_cookie) { - msi_desc_set_iommu_msi_iova(desc, 0, 0); + desc->iommu_cookie = NULL; return 0; } @@ -2209,12 +2209,11 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) mutex_lock(&msi_prepare_lock); msi_page = iommu_dma_get_msi_page(dev, msi_addr, domain); mutex_unlock(&msi_prepare_lock); + + msi_desc_set_iommu_cookie(desc, msi_page); + if (!msi_page) return -ENOMEM; - - msi_desc_set_iommu_msi_iova( - desc, msi_page->iova, - ilog2(cookie_msi_granule(domain->iova_cookie))); return 0; } @@ -2225,15 +2224,18 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) */ void iommu_dma_compose_msi_msg(struct msi_desc *desc, struct msi_msg *msg) { -#ifdef CONFIG_IRQ_MSI_IOMMU - if (desc->iommu_msi_shift) { - u64 msi_iova = desc->iommu_msi_iova << desc->iommu_msi_shift; + struct device *dev = msi_desc_to_dev(desc); + const struct iommu_domain *domain = iommu_get_domain_for_dev(dev); + const struct iommu_dma_msi_page *msi_page; - msg->address_hi = upper_32_bits(msi_iova); - msg->address_lo = lower_32_bits(msi_iova) | - (msg->address_lo & ((1 << desc->iommu_msi_shift) - 1)); - } -#endif + msi_page = msi_desc_get_iommu_cookie(desc); + + if (!domain || !domain->iova_cookie || WARN_ON(!msi_page)) + return; + + msg->address_hi = upper_32_bits(msi_page->iova); + msg->address_lo &= cookie_msi_granule(domain->iova_cookie) - 1; + msg->address_lo += lower_32_bits(msi_page->iova); } static int iommu_dma_init(void) diff --git a/include/linux/msi.h b/include/linux/msi.h index 63d0e51f7a801..59a421fc42bf0 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h @@ -165,10 +165,6 @@ struct msi_desc_data { * @dev: Pointer to the device which uses this descriptor * @msg: The last set MSI message cached for reuse * @affinity: Optional pointer to a cpu affinity mask for this descriptor - * @iommu_msi_iova: Optional shifted IOVA from the IOMMU to override the msi_addr. - * Only used if iommu_msi_shift != 0 - * @iommu_msi_shift: Indicates how many bits of the original address should be - * preserved when using iommu_msi_iova. * @sysfs_attr: Pointer to sysfs device attribute * * @write_msi_msg: Callback that may be called when the MSI message @@ -187,8 +183,7 @@ struct msi_desc { struct msi_msg msg; struct irq_affinity_desc *affinity; #ifdef CONFIG_IRQ_MSI_IOMMU - u64 iommu_msi_iova : 58; - u64 iommu_msi_shift : 6; + const void *iommu_cookie; #endif #ifdef CONFIG_SYSFS struct device_attribute *sysfs_attrs; @@ -289,15 +284,29 @@ struct msi_desc *msi_next_desc(struct device *dev, unsigned int domid, #define msi_desc_to_dev(desc) ((desc)->dev) -static inline void msi_desc_set_iommu_msi_iova(struct msi_desc *desc, u64 msi_iova, - unsigned int msi_shift) -{ #ifdef CONFIG_IRQ_MSI_IOMMU - desc->iommu_msi_iova = msi_iova >> msi_shift; - desc->iommu_msi_shift = msi_shift; -#endif +static inline const void *msi_desc_get_iommu_cookie(struct msi_desc *desc) +{ + return desc->iommu_cookie; +} + +static inline void msi_desc_set_iommu_cookie(struct msi_desc *desc, + const void *iommu_cookie) +{ + desc->iommu_cookie = iommu_cookie; +} +#else +static inline const void *msi_desc_get_iommu_cookie(struct msi_desc *desc) +{ + return NULL; } +static inline void msi_desc_set_iommu_cookie(struct msi_desc *desc, + const void *iommu_cookie) +{ +} +#endif + int msi_domain_insert_msi_desc(struct device *dev, unsigned int domid, struct msi_desc *init_desc); /** -- GitLab From 70c9466818f943f065a9b6da45e7a0316f24240a Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 6 Jun 2025 11:54:29 +0000 Subject: [PATCH 1633/2211] Revert "crypto: ahash - Set default reqsize from ahash_alg" This reverts commit 9f27b38771b05067f5fadf4628296efb768e50d4 which is commit 9e01aaa1033d6e40f8d7cf4f20931a61ce9e3f04 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: Ib90b0adcb219ff6bbb5771482f0e456bed7cdc40 Signed-off-by: Greg Kroah-Hartman --- crypto/ahash.c | 4 ---- include/crypto/hash.h | 3 --- 2 files changed, 7 deletions(-) diff --git a/crypto/ahash.c b/crypto/ahash.c index fe19bf7f15eb9..bcd9de009a91b 100644 --- a/crypto/ahash.c +++ b/crypto/ahash.c @@ -473,7 +473,6 @@ static int crypto_ahash_init_tfm(struct crypto_tfm *tfm) struct ahash_alg *alg = crypto_ahash_alg(hash); crypto_ahash_set_statesize(hash, alg->halg.statesize); - crypto_ahash_set_reqsize(hash, alg->reqsize); if (tfm->__crt_alg->cra_type == &crypto_shash_type) return crypto_init_ahash_using_shash(tfm); @@ -639,9 +638,6 @@ static int ahash_prepare_alg(struct ahash_alg *alg) if (alg->halg.statesize == 0) return -EINVAL; - if (alg->reqsize && alg->reqsize < alg->halg.statesize) - return -EINVAL; - err = hash_prepare_alg(&alg->halg); if (err) return err; diff --git a/include/crypto/hash.h b/include/crypto/hash.h index 20dbb24a8cbe5..38511727b2ff4 100644 --- a/include/crypto/hash.h +++ b/include/crypto/hash.h @@ -132,7 +132,6 @@ struct ahash_request { * This is a counterpart to @init_tfm, used to remove * various changes set in @init_tfm. * @clone_tfm: Copy transform into new object, may allocate memory. - * @reqsize: Size of the request context. * @halg: see struct hash_alg_common */ struct ahash_alg { @@ -149,8 +148,6 @@ struct ahash_alg { void (*exit_tfm)(struct crypto_ahash *tfm); int (*clone_tfm)(struct crypto_ahash *dst, struct crypto_ahash *src); - unsigned int reqsize; - struct hash_alg_common halg; }; -- GitLab From 2b9efc3752675c5208eb496aa9de239696aeb435 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 2 Jul 2025 09:51:50 +0000 Subject: [PATCH 1634/2211] Revert "net: page_pool: avoid false positive warning if NAPI was never added" This reverts commit 247b420fea7988dca0e1287f1d4eb1e0b16b20f1 which is commit c1e00bc4be06cacee6307cedb9b55bbaddb5044d upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I5ed1598f3985ad8b7b6de88577a980f1f87b2d0f Signed-off-by: Greg Kroah-Hartman --- net/core/dev.h | 12 ------------ net/core/page_pool.c | 7 +++++-- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/net/core/dev.h b/net/core/dev.h index 764e0097ccf22..2e3bb7669984a 100644 --- a/net/core/dev.h +++ b/net/core/dev.h @@ -148,18 +148,6 @@ void xdp_do_check_flushed(struct napi_struct *napi); static inline void xdp_do_check_flushed(struct napi_struct *napi) { } #endif -/* Best effort check that NAPI is not idle (can't be scheduled to run) */ -static inline void napi_assert_will_not_race(const struct napi_struct *napi) -{ - /* uninitialized instance, can't race */ - if (!napi->poll_list.next) - return; - - /* SCHED bit is set on disabled instances */ - WARN_ON(!test_bit(NAPI_STATE_SCHED, &napi->state)); - WARN_ON(READ_ONCE(napi->list_owner) != -1); -} - void kick_defer_list_purge(struct softnet_data *sd, unsigned int cpu); #define XMIT_RECURSION_LIMIT 8 diff --git a/net/core/page_pool.c b/net/core/page_pool.c index c8ce069605c42..7b20f6fcb82c0 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -25,7 +25,6 @@ #include -#include "dev.h" #include "mp_dmabuf_devmem.h" #include "netmem_priv.h" #include "page_pool_priv.h" @@ -1109,7 +1108,11 @@ void page_pool_disable_direct_recycling(struct page_pool *pool) if (!pool->p.napi) return; - napi_assert_will_not_race(pool->p.napi); + /* To avoid races with recycling and additional barriers make sure + * pool and NAPI are unlinked when NAPI is disabled. + */ + WARN_ON(!test_bit(NAPI_STATE_SCHED, &pool->p.napi->state)); + WARN_ON(READ_ONCE(pool->p.napi->list_owner) != -1); WRITE_ONCE(pool->p.napi, NULL); } -- GitLab From 6de79a4718d68bad92858f46d79e8db35aaac75d Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 6 Jun 2025 11:52:40 +0000 Subject: [PATCH 1635/2211] Revert "espintcp: remove encap socket caching to avoid reference leak" This reverts commit 9cbca30102028f9ad3d2098f935c4368f581fd07 which is commit 028363685bd0b7a19b4a820f82dd905b1dc83999 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: Ifec9e4a0d3e7404091dd8bcc60e2cf06815d9c3b Signed-off-by: Greg Kroah-Hartman --- include/net/xfrm.h | 1 + net/ipv4/esp4.c | 49 +++++++++++++++++++++++++++++++++++++++---- net/ipv6/esp6.c | 49 +++++++++++++++++++++++++++++++++++++++---- net/xfrm/xfrm_state.c | 3 +++ 4 files changed, 94 insertions(+), 8 deletions(-) diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 865ecb643fa46..cd4ff247e0793 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -233,6 +233,7 @@ struct xfrm_state { /* Data for encapsulator */ struct xfrm_encap_tmpl *encap; + struct sock __rcu *encap_sk; /* NAT keepalive */ u32 nat_keepalive_interval; /* seconds */ diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index cbe4c6fc8b8e9..f0a7f06df3ade 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c @@ -120,16 +120,47 @@ static void esp_ssg_unref(struct xfrm_state *x, void *tmp, struct sk_buff *skb) } #ifdef CONFIG_INET_ESPINTCP +struct esp_tcp_sk { + struct sock *sk; + struct rcu_head rcu; +}; + +static void esp_free_tcp_sk(struct rcu_head *head) +{ + struct esp_tcp_sk *esk = container_of(head, struct esp_tcp_sk, rcu); + + sock_put(esk->sk); + kfree(esk); +} + static struct sock *esp_find_tcp_sk(struct xfrm_state *x) { struct xfrm_encap_tmpl *encap = x->encap; struct net *net = xs_net(x); + struct esp_tcp_sk *esk; __be16 sport, dport; + struct sock *nsk; struct sock *sk; + sk = rcu_dereference(x->encap_sk); + if (sk && sk->sk_state == TCP_ESTABLISHED) + return sk; + spin_lock_bh(&x->lock); sport = encap->encap_sport; dport = encap->encap_dport; + nsk = rcu_dereference_protected(x->encap_sk, + lockdep_is_held(&x->lock)); + if (sk && sk == nsk) { + esk = kmalloc(sizeof(*esk), GFP_ATOMIC); + if (!esk) { + spin_unlock_bh(&x->lock); + return ERR_PTR(-ENOMEM); + } + RCU_INIT_POINTER(x->encap_sk, NULL); + esk->sk = sk; + call_rcu(&esk->rcu, esp_free_tcp_sk); + } spin_unlock_bh(&x->lock); sk = inet_lookup_established(net, net->ipv4.tcp_death_row.hashinfo, x->id.daddr.a4, @@ -142,6 +173,20 @@ static struct sock *esp_find_tcp_sk(struct xfrm_state *x) return ERR_PTR(-EINVAL); } + spin_lock_bh(&x->lock); + nsk = rcu_dereference_protected(x->encap_sk, + lockdep_is_held(&x->lock)); + if (encap->encap_sport != sport || + encap->encap_dport != dport) { + sock_put(sk); + sk = nsk ?: ERR_PTR(-EREMCHG); + } else if (sk == nsk) { + sock_put(sk); + } else { + rcu_assign_pointer(x->encap_sk, sk); + } + spin_unlock_bh(&x->lock); + return sk; } @@ -166,8 +211,6 @@ static int esp_output_tcp_finish(struct xfrm_state *x, struct sk_buff *skb) err = espintcp_push_skb(sk, skb); bh_unlock_sock(sk); - sock_put(sk); - out: rcu_read_unlock(); return err; @@ -351,8 +394,6 @@ static struct ip_esp_hdr *esp_output_tcp_encap(struct xfrm_state *x, if (IS_ERR(sk)) return ERR_CAST(sk); - sock_put(sk); - *lenp = htons(len); esph = (struct ip_esp_hdr *)(lenp + 1); diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index 62d17d7f6d9a9..3810cfbc44103 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c @@ -137,16 +137,47 @@ static void esp_ssg_unref(struct xfrm_state *x, void *tmp, struct sk_buff *skb) } #ifdef CONFIG_INET6_ESPINTCP +struct esp_tcp_sk { + struct sock *sk; + struct rcu_head rcu; +}; + +static void esp_free_tcp_sk(struct rcu_head *head) +{ + struct esp_tcp_sk *esk = container_of(head, struct esp_tcp_sk, rcu); + + sock_put(esk->sk); + kfree(esk); +} + static struct sock *esp6_find_tcp_sk(struct xfrm_state *x) { struct xfrm_encap_tmpl *encap = x->encap; struct net *net = xs_net(x); + struct esp_tcp_sk *esk; __be16 sport, dport; + struct sock *nsk; struct sock *sk; + sk = rcu_dereference(x->encap_sk); + if (sk && sk->sk_state == TCP_ESTABLISHED) + return sk; + spin_lock_bh(&x->lock); sport = encap->encap_sport; dport = encap->encap_dport; + nsk = rcu_dereference_protected(x->encap_sk, + lockdep_is_held(&x->lock)); + if (sk && sk == nsk) { + esk = kmalloc(sizeof(*esk), GFP_ATOMIC); + if (!esk) { + spin_unlock_bh(&x->lock); + return ERR_PTR(-ENOMEM); + } + RCU_INIT_POINTER(x->encap_sk, NULL); + esk->sk = sk; + call_rcu(&esk->rcu, esp_free_tcp_sk); + } spin_unlock_bh(&x->lock); sk = __inet6_lookup_established(net, net->ipv4.tcp_death_row.hashinfo, &x->id.daddr.in6, @@ -159,6 +190,20 @@ static struct sock *esp6_find_tcp_sk(struct xfrm_state *x) return ERR_PTR(-EINVAL); } + spin_lock_bh(&x->lock); + nsk = rcu_dereference_protected(x->encap_sk, + lockdep_is_held(&x->lock)); + if (encap->encap_sport != sport || + encap->encap_dport != dport) { + sock_put(sk); + sk = nsk ?: ERR_PTR(-EREMCHG); + } else if (sk == nsk) { + sock_put(sk); + } else { + rcu_assign_pointer(x->encap_sk, sk); + } + spin_unlock_bh(&x->lock); + return sk; } @@ -183,8 +228,6 @@ static int esp_output_tcp_finish(struct xfrm_state *x, struct sk_buff *skb) err = espintcp_push_skb(sk, skb); bh_unlock_sock(sk); - sock_put(sk); - out: rcu_read_unlock(); return err; @@ -381,8 +424,6 @@ static struct ip_esp_hdr *esp6_output_tcp_encap(struct xfrm_state *x, if (IS_ERR(sk)) return ERR_CAST(sk); - sock_put(sk); - *lenp = htons(len); esph = (struct ip_esp_hdr *)(lenp + 1); diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 2f4c348fe6c12..b839cfe31296c 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -773,6 +773,9 @@ int __xfrm_state_delete(struct xfrm_state *x) xfrm_nat_keepalive_state_updated(x); spin_unlock(&net->xfrm.xfrm_state_lock); + if (x->encap_sk) + sock_put(rcu_dereference_raw(x->encap_sk)); + xfrm_dev_state_delete(x); /* All xfrm_state objects are created by xfrm_state_alloc. -- GitLab From 614334d6e9a37a0c8f6f489e31e7791dfe6b6d25 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 6 Jun 2025 11:53:52 +0000 Subject: [PATCH 1636/2211] Revert "perf: Avoid the read if the count is already updated" This reverts commit 887e39ac4704e2285dc3622e1ea40cd3130199d2 which is commit 8ce939a0fa194939cc1f92dbd8bc1a7806e7d40a upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I39e9126c8e78ae62d961dd9e3873d43b3b9e4498 Signed-off-by: Greg Kroah-Hartman --- include/linux/perf_event.h | 8 +------- kernel/events/core.c | 33 +++++++++++++++++---------------- kernel/events/ring_buffer.c | 1 - 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 76e4cd7993c13..35a988493e7aa 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -1064,13 +1064,7 @@ struct perf_output_handle { struct perf_buffer *rb; unsigned long wakeup; unsigned long size; - union { - u64 flags; /* perf_output*() */ - u64 aux_flags; /* perf_aux_output*() */ - struct { - u64 skip_read : 1; - }; - }; + u64 aux_flags; union { void *addr; unsigned long head; diff --git a/kernel/events/core.c b/kernel/events/core.c index c8e43bd569e81..e095f1c0e2de5 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -1196,12 +1196,6 @@ static void perf_assert_pmu_disabled(struct pmu *pmu) WARN_ON_ONCE(*this_cpu_ptr(pmu->pmu_disable_count) == 0); } -static inline void perf_pmu_read(struct perf_event *event) -{ - if (event->state == PERF_EVENT_STATE_ACTIVE) - event->pmu->read(event); -} - static void get_ctx(struct perf_event_context *ctx) { refcount_inc(&ctx->refcount); @@ -3489,7 +3483,8 @@ static void __perf_event_sync_stat(struct perf_event *event, * we know the event must be on the current CPU, therefore we * don't need to use it. */ - perf_pmu_read(event); + if (event->state == PERF_EVENT_STATE_ACTIVE) + event->pmu->read(event); perf_event_update_time(event); @@ -4640,8 +4635,15 @@ static void __perf_event_read(void *info) pmu->read(event); - for_each_sibling_event(sub, event) - perf_pmu_read(sub); + for_each_sibling_event(sub, event) { + if (sub->state == PERF_EVENT_STATE_ACTIVE) { + /* + * Use sibling's PMU rather than @event's since + * sibling could be on different (eg: software) PMU. + */ + sub->pmu->read(sub); + } + } data->ret = pmu->commit_txn(pmu); @@ -7393,8 +7395,9 @@ static void perf_output_read_group(struct perf_output_handle *handle, if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) values[n++] = running; - if ((leader != event) && !handle->skip_read) - perf_pmu_read(leader); + if ((leader != event) && + (leader->state == PERF_EVENT_STATE_ACTIVE)) + leader->pmu->read(leader); values[n++] = perf_event_count(leader, self); if (read_format & PERF_FORMAT_ID) @@ -7407,8 +7410,9 @@ static void perf_output_read_group(struct perf_output_handle *handle, for_each_sibling_event(sub, leader) { n = 0; - if ((sub != event) && !handle->skip_read) - perf_pmu_read(sub); + if ((sub != event) && + (sub->state == PERF_EVENT_STATE_ACTIVE)) + sub->pmu->read(sub); values[n++] = perf_event_count(sub, self); if (read_format & PERF_FORMAT_ID) @@ -7467,9 +7471,6 @@ void perf_output_sample(struct perf_output_handle *handle, { u64 sample_type = data->type; - if (data->sample_flags & PERF_SAMPLE_READ) - handle->skip_read = 1; - perf_output_put(handle, *header); if (sample_type & PERF_SAMPLE_IDENTIFIER) diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c index b4edac7d9cd34..15da251f4ae8b 100644 --- a/kernel/events/ring_buffer.c +++ b/kernel/events/ring_buffer.c @@ -185,7 +185,6 @@ __perf_output_begin(struct perf_output_handle *handle, handle->rb = rb; handle->event = event; - handle->flags = 0; have_lost = local_read(&rb->lost); if (unlikely(have_lost)) { -- GitLab From 7689df00e1b6a210aa95c67b068d0d0965306768 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 3 Jul 2025 09:05:29 +0000 Subject: [PATCH 1637/2211] ANDROID: GKI: add devm_register_sys_off_handler to db845c symbol list. In commit 3e79182c82a1 ("pinctrl: qcom: switch to devm_register_sys_off_handler()"), pinpinctrl-msm module was moved to use devm_register_sys_off_handler which is needed by the db845c target, so add the symbol to that target to fix the build. Fixes: 3e79182c82a1 ("pinctrl: qcom: switch to devm_register_sys_off_handler()") Change-Id: I56f03e371581e2576091adde071205ae65e11df0 Signed-off-by: Greg Kroah-Hartman --- gki/aarch64/symbols/db845c | 1 + 1 file changed, 1 insertion(+) diff --git a/gki/aarch64/symbols/db845c b/gki/aarch64/symbols/db845c index 7a3c4d98e642d..cabbc303a028a 100644 --- a/gki/aarch64/symbols/db845c +++ b/gki/aarch64/symbols/db845c @@ -173,6 +173,7 @@ devm_pm_opp_of_add_table devm_pm_opp_set_config devm_pm_runtime_enable + devm_register_sys_off_handler devm_regmap_add_irq_chip devm_regmap_field_alloc __devm_regmap_init -- GitLab From b914826a458755697d0b1945a87f6a21931d9495 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 3 Jul 2025 09:11:10 +0000 Subject: [PATCH 1638/2211] Revert "coredump: hand a pidfd to the usermode coredump helper" This reverts commit 510cf09f2dedfc44ec8501793e825f8d12e80809 which is commit b5325b2a270fcaf7b2a9a0f23d422ca8a5a8bdea upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I4a79afe6af53e2a6384faa9edad4736391d1b2a1 Signed-off-by: Greg Kroah-Hartman --- fs/coredump.c | 56 +++------------------------------------- include/linux/coredump.h | 1 - 2 files changed, 4 insertions(+), 53 deletions(-) diff --git a/fs/coredump.c b/fs/coredump.c index 64894ba6efca4..d3575afe9e75c 100644 --- a/fs/coredump.c +++ b/fs/coredump.c @@ -43,8 +43,6 @@ #include #include #include -#include -#include #include #include @@ -62,12 +60,6 @@ static void free_vma_snapshot(struct coredump_params *cprm); #define CORE_FILE_NOTE_SIZE_DEFAULT (4*1024*1024) /* Define a reasonable max cap */ #define CORE_FILE_NOTE_SIZE_MAX (16*1024*1024) -/* - * File descriptor number for the pidfd for the thread-group leader of - * the coredumping task installed into the usermode helper's file - * descriptor table. - */ -#define COREDUMP_PIDFD_NUMBER 3 static int core_uses_pid; static unsigned int core_pipe_limit; @@ -347,27 +339,6 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm, case 'C': err = cn_printf(cn, "%d", cprm->cpu); break; - /* pidfd number */ - case 'F': { - /* - * Installing a pidfd only makes sense if - * we actually spawn a usermode helper. - */ - if (!ispipe) - break; - - /* - * Note that we'll install a pidfd for the - * thread-group leader. We know that task - * linkage hasn't been removed yet and even if - * this @current isn't the actual thread-group - * leader we know that the thread-group leader - * cannot be reaped until @current has exited. - */ - cprm->pid = task_tgid(current); - err = cn_printf(cn, "%d", COREDUMP_PIDFD_NUMBER); - break; - } default: break; } @@ -522,7 +493,7 @@ static void wait_for_dump_helpers(struct file *file) } /* - * umh_coredump_setup + * umh_pipe_setup * helper function to customize the process used * to collect the core in userspace. Specifically * it sets up a pipe and installs it as fd 0 (stdin) @@ -532,31 +503,12 @@ static void wait_for_dump_helpers(struct file *file) * is a special value that we use to trap recursive * core dumps */ -static int umh_coredump_setup(struct subprocess_info *info, struct cred *new) +static int umh_pipe_setup(struct subprocess_info *info, struct cred *new) { struct file *files[2]; struct coredump_params *cp = (struct coredump_params *)info->data; int err; - if (cp->pid) { - struct file *pidfs_file __free(fput) = NULL; - - pidfs_file = pidfs_alloc_file(cp->pid, O_RDWR); - if (IS_ERR(pidfs_file)) - return PTR_ERR(pidfs_file); - - /* - * Usermode helpers are childen of either - * system_unbound_wq or of kthreadd. So we know that - * we're starting off with a clean file descriptor - * table. So we should always be able to use - * COREDUMP_PIDFD_NUMBER as our file descriptor value. - */ - err = replace_fd(COREDUMP_PIDFD_NUMBER, pidfs_file, 0); - if (err < 0) - return err; - } - err = create_pipe_files(files, 0); if (err) return err; @@ -646,7 +598,7 @@ void do_coredump(const kernel_siginfo_t *siginfo) } if (cprm.limit == 1) { - /* See umh_coredump_setup() which sets RLIMIT_CORE = 1. + /* See umh_pipe_setup() which sets RLIMIT_CORE = 1. * * Normally core limits are irrelevant to pipes, since * we're not writing to the file system, but we use @@ -685,7 +637,7 @@ void do_coredump(const kernel_siginfo_t *siginfo) retval = -ENOMEM; sub_info = call_usermodehelper_setup(helper_argv[0], helper_argv, NULL, GFP_KERNEL, - umh_coredump_setup, NULL, &cprm); + umh_pipe_setup, NULL, &cprm); if (sub_info) retval = call_usermodehelper_exec(sub_info, UMH_WAIT_EXEC); diff --git a/include/linux/coredump.h b/include/linux/coredump.h index 76e41805b92de..77e6e195d1d68 100644 --- a/include/linux/coredump.h +++ b/include/linux/coredump.h @@ -28,7 +28,6 @@ struct coredump_params { int vma_count; size_t vma_data_size; struct core_vma_metadata *vma_meta; - struct pid *pid; }; extern unsigned int core_file_note_size_limit; -- GitLab From 6da4371380fb119ad2fbf1fc1fdc635e037cbf2f Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 4 Jul 2025 07:02:08 +0000 Subject: [PATCH 1639/2211] Revert "usb: typec: ucsi: fix Clang -Wsign-conversion warning" This reverts commit 4490c7951898dc64505533e7979837429bc9e290 which is commit f4239ace2dd8606f6824757f192965a95746da05 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: Ief1921fb7a64095dfde41fc131a0ff30d2db3d37 Signed-off-by: Greg Kroah-Hartman --- drivers/usb/typec/ucsi/ucsi.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h index 0568e643e8447..5863a20b6c5dd 100644 --- a/drivers/usb/typec/ucsi/ucsi.h +++ b/drivers/usb/typec/ucsi/ucsi.h @@ -367,7 +367,7 @@ struct ucsi_debugfs_entry { u64 low; u64 high; } response; - int status; + u32 status; struct dentry *dentry; }; -- GitLab From 7a5c39c1569ed7dbb0daefab2f9df64824746365 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 4 Jul 2025 11:47:48 +0000 Subject: [PATCH 1640/2211] Revert "page_pool: Track DMA-mapped pages and unmap them when destroying the pool" This reverts commit 4f51fb0d257ff4d406ec27966902de075e3b118e which is commit ee62ce7a1d909ccba0399680a03c2dee83bcae95 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I1778b757059df295816de520022729e7ab7348a1 Signed-off-by: Greg Kroah-Hartman --- include/linux/mm.h | 46 ++------------------ include/linux/poison.h | 4 -- include/net/page_pool/types.h | 6 --- net/core/netmem_priv.h | 28 +----------- net/core/page_pool.c | 81 ++++++----------------------------- 5 files changed, 18 insertions(+), 147 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 59322f4f53154..f767c5f1b7849 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4307,51 +4307,13 @@ void prep_new_hpage(struct page *page, gfp_t gfp_flags, unsigned int alloc_flags void prep_compound_page(struct page *page, unsigned int order); #endif -/* - * DMA mapping IDs for page_pool - * - * When DMA-mapping a page, page_pool allocates an ID (from an xarray) and - * stashes it in the upper bits of page->pp_magic. We always want to be able to - * unambiguously identify page pool pages (using page_pool_page_is_pp()). Non-PP - * pages can have arbitrary kernel pointers stored in the same field as pp_magic - * (since it overlaps with page->lru.next), so we must ensure that we cannot - * mistake a valid kernel pointer with any of the values we write into this - * field. - * - * On architectures that set POISON_POINTER_DELTA, this is already ensured, - * since this value becomes part of PP_SIGNATURE; meaning we can just use the - * space between the PP_SIGNATURE value (without POISON_POINTER_DELTA), and the - * lowest bits of POISON_POINTER_DELTA. On arches where POISON_POINTER_DELTA is - * 0, we make sure that we leave the two topmost bits empty, as that guarantees - * we won't mistake a valid kernel pointer for a value we set, regardless of the - * VMSPLIT setting. - * - * Altogether, this means that the number of bits available is constrained by - * the size of an unsigned long (at the upper end, subtracting two bits per the - * above), and the definition of PP_SIGNATURE (with or without - * POISON_POINTER_DELTA). - */ -#define PP_DMA_INDEX_SHIFT (1 + __fls(PP_SIGNATURE - POISON_POINTER_DELTA)) -#if POISON_POINTER_DELTA > 0 -/* PP_SIGNATURE includes POISON_POINTER_DELTA, so limit the size of the DMA - * index to not overlap with that if set - */ -#define PP_DMA_INDEX_BITS MIN(32, __ffs(POISON_POINTER_DELTA) - PP_DMA_INDEX_SHIFT) -#else -/* Always leave out the topmost two; see above. */ -#define PP_DMA_INDEX_BITS MIN(32, BITS_PER_LONG - PP_DMA_INDEX_SHIFT - 2) -#endif - -#define PP_DMA_INDEX_MASK GENMASK(PP_DMA_INDEX_BITS + PP_DMA_INDEX_SHIFT - 1, \ - PP_DMA_INDEX_SHIFT) - /* Mask used for checking in page_pool_page_is_pp() below. page->pp_magic is * OR'ed with PP_SIGNATURE after the allocation in order to preserve bit 0 for - * the head page of compound page and bit 1 for pfmemalloc page, as well as the - * bits used for the DMA index. page_is_pfmemalloc() is checked in - * __page_pool_put_page() to avoid recycling the pfmemalloc page. + * the head page of compound page and bit 1 for pfmemalloc page. + * page_is_pfmemalloc() is checked in __page_pool_put_page() to avoid recycling + * the pfmemalloc page. */ -#define PP_MAGIC_MASK ~(PP_DMA_INDEX_MASK | 0x3UL) +#define PP_MAGIC_MASK ~0x3UL #ifdef CONFIG_PAGE_POOL static inline bool page_pool_page_is_pp(struct page *page) diff --git a/include/linux/poison.h b/include/linux/poison.h index 8ca2235f78d5d..331a9a996fa87 100644 --- a/include/linux/poison.h +++ b/include/linux/poison.h @@ -70,10 +70,6 @@ #define KEY_DESTROY 0xbd /********** net/core/page_pool.c **********/ -/* - * page_pool uses additional free bits within this value to store data, see the - * definition of PP_DMA_INDEX_MASK in mm.h - */ #define PP_SIGNATURE (0x40 + POISON_POINTER_DELTA) /********** net/core/skbuff.c **********/ diff --git a/include/net/page_pool/types.h b/include/net/page_pool/types.h index 76be8c3ed8937..382fac9155034 100644 --- a/include/net/page_pool/types.h +++ b/include/net/page_pool/types.h @@ -6,7 +6,6 @@ #include #include #include -#include #include #include @@ -35,9 +34,6 @@ #define PP_FLAG_ALL (PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV | \ PP_FLAG_SYSTEM_POOL | PP_FLAG_ALLOW_UNREADABLE_NETMEM) -/* Index limit to stay within PP_DMA_INDEX_BITS for DMA indices */ -#define PP_DMA_INDEX_LIMIT XA_LIMIT(1, BIT(PP_DMA_INDEX_BITS) - 1) - /* * Fast allocation side cache array/stack * @@ -221,8 +217,6 @@ struct page_pool { void *mp_priv; - struct xarray dma_mapped; - #ifdef CONFIG_PAGE_POOL_STATS /* recycle stats are per-cpu to avoid locking */ struct page_pool_recycle_stats __percpu *recycle_stats; diff --git a/net/core/netmem_priv.h b/net/core/netmem_priv.h index cd95394399b40..f33162fd281c2 100644 --- a/net/core/netmem_priv.h +++ b/net/core/netmem_priv.h @@ -5,7 +5,7 @@ static inline unsigned long netmem_get_pp_magic(netmem_ref netmem) { - return __netmem_clear_lsb(netmem)->pp_magic & ~PP_DMA_INDEX_MASK; + return __netmem_clear_lsb(netmem)->pp_magic; } static inline void netmem_or_pp_magic(netmem_ref netmem, unsigned long pp_magic) @@ -15,8 +15,6 @@ static inline void netmem_or_pp_magic(netmem_ref netmem, unsigned long pp_magic) static inline void netmem_clear_pp_magic(netmem_ref netmem) { - WARN_ON_ONCE(__netmem_clear_lsb(netmem)->pp_magic & PP_DMA_INDEX_MASK); - __netmem_clear_lsb(netmem)->pp_magic = 0; } @@ -35,28 +33,4 @@ static inline void netmem_set_dma_addr(netmem_ref netmem, { __netmem_clear_lsb(netmem)->dma_addr = dma_addr; } - -static inline unsigned long netmem_get_dma_index(netmem_ref netmem) -{ - unsigned long magic; - - if (WARN_ON_ONCE(netmem_is_net_iov(netmem))) - return 0; - - magic = __netmem_clear_lsb(netmem)->pp_magic; - - return (magic & PP_DMA_INDEX_MASK) >> PP_DMA_INDEX_SHIFT; -} - -static inline void netmem_set_dma_index(netmem_ref netmem, - unsigned long id) -{ - unsigned long magic; - - if (WARN_ON_ONCE(netmem_is_net_iov(netmem))) - return; - - magic = netmem_get_pp_magic(netmem) | (id << PP_DMA_INDEX_SHIFT); - __netmem_clear_lsb(netmem)->pp_magic = magic; -} #endif diff --git a/net/core/page_pool.c b/net/core/page_pool.c index 492d8d7c26b2b..7b20f6fcb82c0 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -272,7 +272,8 @@ static int page_pool_init(struct page_pool *pool, /* Driver calling page_pool_create() also call page_pool_destroy() */ refcount_set(&pool->user_cnt, 1); - xa_init_flags(&pool->dma_mapped, XA_FLAGS_ALLOC1); + if (pool->dma_map) + get_device(pool->p.dev); if (pool->slow.flags & PP_FLAG_ALLOW_UNREADABLE_NETMEM) { /* We rely on rtnl_lock()ing to make sure netdev_rx_queue @@ -310,7 +311,9 @@ free_ptr_ring: static void page_pool_uninit(struct page_pool *pool) { ptr_ring_cleanup(&pool->ring, NULL); - xa_destroy(&pool->dma_mapped); + + if (pool->dma_map) + put_device(pool->p.dev); #ifdef CONFIG_PAGE_POOL_STATS if (!pool->system) @@ -451,21 +454,13 @@ page_pool_dma_sync_for_device(const struct page_pool *pool, netmem_ref netmem, u32 dma_sync_size) { - if (pool->dma_sync && dma_dev_need_sync(pool->p.dev)) { - rcu_read_lock(); - /* re-check under rcu_read_lock() to sync with page_pool_scrub() */ - if (pool->dma_sync) - __page_pool_dma_sync_for_device(pool, netmem, - dma_sync_size); - rcu_read_unlock(); - } + if (pool->dma_sync && dma_dev_need_sync(pool->p.dev)) + __page_pool_dma_sync_for_device(pool, netmem, dma_sync_size); } -static bool page_pool_dma_map(struct page_pool *pool, netmem_ref netmem, gfp_t gfp) +static bool page_pool_dma_map(struct page_pool *pool, netmem_ref netmem) { dma_addr_t dma; - int err; - u32 id; /* Setup DMA mapping: use 'struct page' area for storing DMA-addr * since dma_addr_t can be either 32 or 64 bits and does not always fit @@ -479,30 +474,15 @@ static bool page_pool_dma_map(struct page_pool *pool, netmem_ref netmem, gfp_t g if (dma_mapping_error(pool->p.dev, dma)) return false; - if (page_pool_set_dma_addr_netmem(netmem, dma)) { - WARN_ONCE(1, "unexpected DMA address, please report to netdev@"); + if (page_pool_set_dma_addr_netmem(netmem, dma)) goto unmap_failed; - } - - if (in_softirq()) - err = xa_alloc(&pool->dma_mapped, &id, netmem_to_page(netmem), - PP_DMA_INDEX_LIMIT, gfp); - else - err = xa_alloc_bh(&pool->dma_mapped, &id, netmem_to_page(netmem), - PP_DMA_INDEX_LIMIT, gfp); - if (err) { - WARN_ONCE(err != -ENOMEM, "couldn't track DMA mapping, please report to netdev@"); - goto unset_failed; - } - netmem_set_dma_index(netmem, id); page_pool_dma_sync_for_device(pool, netmem, pool->p.max_len); return true; -unset_failed: - page_pool_set_dma_addr_netmem(netmem, 0); unmap_failed: + WARN_ONCE(1, "unexpected DMA address, please report to netdev@"); dma_unmap_page_attrs(pool->p.dev, dma, PAGE_SIZE << pool->p.order, pool->p.dma_dir, DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_WEAK_ORDERING); @@ -519,7 +499,7 @@ static struct page *__page_pool_alloc_page_order(struct page_pool *pool, if (unlikely(!page)) return NULL; - if (pool->dma_map && unlikely(!page_pool_dma_map(pool, page_to_netmem(page), gfp))) { + if (pool->dma_map && unlikely(!page_pool_dma_map(pool, page_to_netmem(page)))) { put_page(page); return NULL; } @@ -566,7 +546,7 @@ static noinline netmem_ref __page_pool_alloc_pages_slow(struct page_pool *pool, */ for (i = 0; i < nr_pages; i++) { netmem = pool->alloc.cache[i]; - if (dma_map && unlikely(!page_pool_dma_map(pool, netmem, gfp))) { + if (dma_map && unlikely(!page_pool_dma_map(pool, netmem))) { put_page(netmem_to_page(netmem)); continue; } @@ -668,8 +648,6 @@ void page_pool_clear_pp_info(netmem_ref netmem) static __always_inline void __page_pool_release_page_dma(struct page_pool *pool, netmem_ref netmem) { - struct page *old, *page = netmem_to_page(netmem); - unsigned long id; dma_addr_t dma; if (!pool->dma_map) @@ -678,17 +656,6 @@ static __always_inline void __page_pool_release_page_dma(struct page_pool *pool, */ return; - id = netmem_get_dma_index(netmem); - if (!id) - return; - - if (in_softirq()) - old = xa_cmpxchg(&pool->dma_mapped, id, page, NULL, 0); - else - old = xa_cmpxchg_bh(&pool->dma_mapped, id, page, NULL, 0); - if (old != page) - return; - dma = page_pool_get_dma_addr_netmem(netmem); /* When page is unmapped, it cannot be returned to our pool */ @@ -696,7 +663,6 @@ static __always_inline void __page_pool_release_page_dma(struct page_pool *pool, PAGE_SIZE << pool->p.order, pool->p.dma_dir, DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_WEAK_ORDERING); page_pool_set_dma_addr_netmem(netmem, 0); - netmem_set_dma_index(netmem, 0); } /* Disconnects a page (from a page_pool). API users can have a need @@ -1071,29 +1037,8 @@ static void page_pool_empty_alloc_cache_once(struct page_pool *pool) static void page_pool_scrub(struct page_pool *pool) { - unsigned long id; - void *ptr; - page_pool_empty_alloc_cache_once(pool); - if (!pool->destroy_cnt++ && pool->dma_map) { - if (pool->dma_sync) { - /* Disable page_pool_dma_sync_for_device() */ - pool->dma_sync = false; - - /* Make sure all concurrent returns that may see the old - * value of dma_sync (and thus perform a sync) have - * finished before doing the unmapping below. Skip the - * wait if the device doesn't actually need syncing, or - * if there are no outstanding mapped pages. - */ - if (dma_dev_need_sync(pool->p.dev) && - !xa_empty(&pool->dma_mapped)) - synchronize_net(); - } - - xa_for_each(&pool->dma_mapped, id, ptr) - __page_pool_release_page_dma(pool, page_to_netmem(ptr)); - } + pool->destroy_cnt++; /* No more consumers should exist, but producers could still * be in-flight. -- GitLab From 1d7d3adfa49d079ad42c53ec701dfa3e4d9932a8 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 4 Jul 2025 11:48:33 +0000 Subject: [PATCH 1641/2211] Revert "dm: fix dm_blk_report_zones" This reverts commit f9c1bdf24615303d48a2d0fd629c88f3189563aa which is commit 37f53a2c60d03743e0eacf7a0c01c279776fef4e upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I2c68f02b113ceb0e47d458a5cba00a908b805203 Signed-off-by: Greg Kroah-Hartman --- drivers/md/dm-core.h | 1 - drivers/md/dm-zone.c | 25 ++++++++----------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/drivers/md/dm-core.h b/drivers/md/dm-core.h index f3a3f2ef63226..3637761f35853 100644 --- a/drivers/md/dm-core.h +++ b/drivers/md/dm-core.h @@ -141,7 +141,6 @@ struct mapped_device { #ifdef CONFIG_BLK_DEV_ZONED unsigned int nr_zones; void *zone_revalidate_map; - struct task_struct *revalidate_map_task; #endif #ifdef CONFIG_IMA diff --git a/drivers/md/dm-zone.c b/drivers/md/dm-zone.c index 836ec36cb43c6..2ade229c3976d 100644 --- a/drivers/md/dm-zone.c +++ b/drivers/md/dm-zone.c @@ -56,31 +56,24 @@ int dm_blk_report_zones(struct gendisk *disk, sector_t sector, { struct mapped_device *md = disk->private_data; struct dm_table *map; - struct dm_table *zone_revalidate_map = md->zone_revalidate_map; - int srcu_idx, ret = -EIO; - bool put_table = false; + int srcu_idx, ret; - if (!zone_revalidate_map || md->revalidate_map_task != current) { - /* - * Regular user context or - * Zone revalidation during __bind() is in progress, but this - * call is from a different process - */ + if (!md->zone_revalidate_map) { + /* Regular user context */ if (dm_suspended_md(md)) return -EAGAIN; map = dm_get_live_table(md, &srcu_idx); - put_table = true; + if (!map) + return -EIO; } else { /* Zone revalidation during __bind() */ - map = zone_revalidate_map; + map = md->zone_revalidate_map; } - if (map) - ret = dm_blk_do_report_zones(md, map, sector, nr_zones, cb, - data); + ret = dm_blk_do_report_zones(md, map, sector, nr_zones, cb, data); - if (put_table) + if (!md->zone_revalidate_map) dm_put_live_table(md, srcu_idx); return ret; @@ -182,9 +175,7 @@ int dm_revalidate_zones(struct dm_table *t, struct request_queue *q) * our table for dm_blk_report_zones() to use directly. */ md->zone_revalidate_map = t; - md->revalidate_map_task = current; ret = blk_revalidate_disk_zones(disk); - md->revalidate_map_task = NULL; md->zone_revalidate_map = NULL; if (ret) { -- GitLab From f80fdf48b80c243a92546de228024be6eb1a1b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Sat, 2 Nov 2024 17:58:31 +0100 Subject: [PATCH 1642/2211] cifs: Correctly set SMB1 SessionKey field in Session Setup Request MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 89381c72d52094988e11d23ef24a00066a0fa458 ] [MS-CIFS] specification in section 2.2.4.53.1 where is described SMB_COM_SESSION_SETUP_ANDX Request, for SessionKey field says: The client MUST set this field to be equal to the SessionKey field in the SMB_COM_NEGOTIATE Response for this SMB connection. Linux SMB client currently set this field to zero. This is working fine against Windows NT SMB servers thanks to [MS-CIFS] product behavior <94>: Windows NT Server ignores the client's SessionKey. For compatibility with [MS-CIFS], set this SessionKey field in Session Setup Request to value retrieved from Negotiate response. Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/cifsglob.h | 1 + fs/smb/client/cifspdu.h | 6 +++--- fs/smb/client/cifssmb.c | 1 + fs/smb/client/sess.c | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index e0faee22be07e..d573740e54a1a 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -739,6 +739,7 @@ struct TCP_Server_Info { char workstation_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL]; __u32 sequence_number; /* for signing, protected by srv_mutex */ __u32 reconnect_instance; /* incremented on each reconnect */ + __le32 session_key_id; /* retrieved from negotiate response and send in session setup request */ struct session_key session_key; unsigned long lstrp; /* when we got last response from this server */ struct cifs_secmech secmech; /* crypto sec mech functs, descriptors */ diff --git a/fs/smb/client/cifspdu.h b/fs/smb/client/cifspdu.h index 28f8ca470770d..688a26aeef3b4 100644 --- a/fs/smb/client/cifspdu.h +++ b/fs/smb/client/cifspdu.h @@ -557,7 +557,7 @@ typedef union smb_com_session_setup_andx { __le16 MaxBufferSize; __le16 MaxMpxCount; __le16 VcNumber; - __u32 SessionKey; + __le32 SessionKey; __le16 SecurityBlobLength; __u32 Reserved; __le32 Capabilities; /* see below */ @@ -576,7 +576,7 @@ typedef union smb_com_session_setup_andx { __le16 MaxBufferSize; __le16 MaxMpxCount; __le16 VcNumber; - __u32 SessionKey; + __le32 SessionKey; __le16 CaseInsensitivePasswordLength; /* ASCII password len */ __le16 CaseSensitivePasswordLength; /* Unicode password length*/ __u32 Reserved; /* see below */ @@ -614,7 +614,7 @@ typedef union smb_com_session_setup_andx { __le16 MaxBufferSize; __le16 MaxMpxCount; __le16 VcNumber; - __u32 SessionKey; + __le32 SessionKey; __le16 PasswordLength; __u32 Reserved; /* encrypt key len and offset */ __le16 ByteCount; diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index cf8d9de2298fc..d6ba55d4720d2 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -481,6 +481,7 @@ CIFSSMBNegotiate(const unsigned int xid, server->max_rw = le32_to_cpu(pSMBr->MaxRawSize); cifs_dbg(NOISY, "Max buf = %d\n", ses->server->maxBuf); server->capabilities = le32_to_cpu(pSMBr->Capabilities); + server->session_key_id = pSMBr->SessionKey; server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); server->timeAdj *= 60; diff --git a/fs/smb/client/sess.c b/fs/smb/client/sess.c index 10d82d0dc6a9e..830516a9e03b0 100644 --- a/fs/smb/client/sess.c +++ b/fs/smb/client/sess.c @@ -658,6 +658,7 @@ static __u32 cifs_ssetup_hdr(struct cifs_ses *ses, USHRT_MAX)); pSMB->req.MaxMpxCount = cpu_to_le16(server->maxReq); pSMB->req.VcNumber = cpu_to_le16(1); + pSMB->req.SessionKey = server->session_key_id; /* Now no need to set SMBFLG_CASELESS or obsolete CANONICAL PATH */ -- GitLab From ef4b3a7bf95bb3ceda05ae933b33984c88d679cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Tue, 31 Dec 2024 16:06:22 +0100 Subject: [PATCH 1643/2211] cifs: Fix cifs_query_path_info() for Windows NT servers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit a3e771afbb3bce91c8296828304903e7348003fe ] For TRANS2 QUERY_PATH_INFO request when the path does not exist, the Windows NT SMB server returns error response STATUS_OBJECT_NAME_NOT_FOUND or ERRDOS/ERRbadfile without the SMBFLG_RESPONSE flag set. Similarly it returns STATUS_DELETE_PENDING when the file is being deleted. And looks like that any error response from TRANS2 QUERY_PATH_INFO does not have SMBFLG_RESPONSE flag set. So relax check in check_smb_hdr() for detecting if the packet is response for this special case. This change fixes stat() operation against Windows NT SMB servers and also all operations which depends on -ENOENT result from stat like creat() or mkdir(). Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/misc.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fs/smb/client/misc.c b/fs/smb/client/misc.c index 4373dd64b66d4..5122f3895dfc2 100644 --- a/fs/smb/client/misc.c +++ b/fs/smb/client/misc.c @@ -323,6 +323,14 @@ check_smb_hdr(struct smb_hdr *smb) if (smb->Command == SMB_COM_LOCKING_ANDX) return 0; + /* + * Windows NT server returns error resposne (e.g. STATUS_DELETE_PENDING + * or STATUS_OBJECT_NAME_NOT_FOUND or ERRDOS/ERRbadfile or any other) + * for some TRANS2 requests without the RESPONSE flag set in header. + */ + if (smb->Command == SMB_COM_TRANSACTION2 && smb->Status.CifsError != 0) + return 0; + cifs_dbg(VFS, "Server sent request, not response. mid=%u\n", get_mid(smb)); return 1; -- GitLab From 61dd1dcf0549f7fea388f4bcc02c614d4b407827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Sun, 6 Oct 2024 19:24:29 +0200 Subject: [PATCH 1644/2211] cifs: Fix encoding of SMB1 Session Setup NTLMSSP Request in non-UNICODE mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 6510ef4230b68c960309e0c1d6eb3e32eb785142 ] SMB1 Session Setup NTLMSSP Request in non-UNICODE mode is similar to UNICODE mode, just strings are encoded in ASCII and not in UTF-16. With this change it is possible to setup SMB1 session with NTLM authentication in non-UNICODE mode with Windows SMB server. This change fixes mounting SMB1 servers with -o nounicode mount option together with -o sec=ntlmssp mount option (which is the default sec=). Signed-off-by: Pali Rohár Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/sess.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/fs/smb/client/sess.c b/fs/smb/client/sess.c index 830516a9e03b0..8be7c4d2d9d62 100644 --- a/fs/smb/client/sess.c +++ b/fs/smb/client/sess.c @@ -1715,22 +1715,22 @@ _sess_auth_rawntlmssp_assemble_req(struct sess_data *sess_data) pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base; capabilities = cifs_ssetup_hdr(ses, server, pSMB); - if ((pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) == 0) { - cifs_dbg(VFS, "NTLMSSP requires Unicode support\n"); - return -ENOSYS; - } - pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC; capabilities |= CAP_EXTENDED_SECURITY; pSMB->req.Capabilities |= cpu_to_le32(capabilities); bcc_ptr = sess_data->iov[2].iov_base; - /* unicode strings must be word aligned */ - if (!IS_ALIGNED(sess_data->iov[0].iov_len + sess_data->iov[1].iov_len, 2)) { - *bcc_ptr = 0; - bcc_ptr++; + + if (pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) { + /* unicode strings must be word aligned */ + if (!IS_ALIGNED(sess_data->iov[0].iov_len + sess_data->iov[1].iov_len, 2)) { + *bcc_ptr = 0; + bcc_ptr++; + } + unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp); + } else { + ascii_oslm_strings(&bcc_ptr, sess_data->nls_cp); } - unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp); sess_data->iov[2].iov_len = (long) bcc_ptr - (long) sess_data->iov[2].iov_base; -- GitLab From 605daf6ae663e0f0ab9c5934dcc13d9d18a324fb Mon Sep 17 00:00:00 2001 From: Han Young Date: Sun, 4 May 2025 20:57:04 +0800 Subject: [PATCH 1645/2211] NFSv4: Always set NLINK even if the server doesn't support it [ Upstream commit 3a3065352f73381d3a1aa0ccab44aec3a5a9b365 ] fattr4_numlinks is a recommended attribute, so the client should emulate it even if the server doesn't support it. In decode_attr_nlink function in nfs4xdr.c, nlink is initialized to 1. However, this default value isn't set to the inode due to the check in nfs_fhget. So if the server doesn't support numlinks, inode's nlink will be zero, the mount will fail with error "Stale file handle". Set the nlink to 1 if the server doesn't support it. Signed-off-by: Han Young Signed-off-by: Anna Schumaker Signed-off-by: Sasha Levin --- fs/nfs/inode.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 330273cf94531..9f10771331007 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -557,6 +557,8 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) set_nlink(inode, fattr->nlink); else if (fattr_supported & NFS_ATTR_FATTR_NLINK) nfs_set_cache_invalid(inode, NFS_INO_INVALID_NLINK); + else + set_nlink(inode, 1); if (fattr->valid & NFS_ATTR_FATTR_OWNER) inode->i_uid = fattr->uid; else if (fattr_supported & NFS_ATTR_FATTR_OWNER) -- GitLab From 871d1d7f374e7b9a81ebaaa6b6ed3e10cab257eb Mon Sep 17 00:00:00 2001 From: Olga Kornievskaia Date: Fri, 25 Apr 2025 14:09:21 -0400 Subject: [PATCH 1646/2211] NFSv4.2: fix listxattr to return selinux security label [ Upstream commit 243fea134633ba3d64aceb4c16129c59541ea2c6 ] Currently, when NFS is queried for all the labels present on the file via a command example "getfattr -d -m . /mnt/testfile", it does not return the security label. Yet when asked specifically for the label (getfattr -n security.selinux) it will be returned. Include the security label when all attributes are queried. Signed-off-by: Olga Kornievskaia Signed-off-by: Anna Schumaker Signed-off-by: Sasha Levin --- fs/nfs/nfs4proc.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 57d49e874f51f..9832e27b5d29b 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -10814,7 +10814,7 @@ const struct nfs4_minor_version_ops *nfs_v4_minor_ops[] = { static ssize_t nfs4_listxattr(struct dentry *dentry, char *list, size_t size) { - ssize_t error, error2, error3; + ssize_t error, error2, error3, error4; size_t left = size; error = generic_listxattr(dentry, list, left); @@ -10837,8 +10837,16 @@ static ssize_t nfs4_listxattr(struct dentry *dentry, char *list, size_t size) error3 = nfs4_listxattr_nfs4_user(d_inode(dentry), list, left); if (error3 < 0) return error3; + if (list) { + list += error3; + left -= error3; + } + + error4 = security_inode_listsecurity(d_inode(dentry), list, left); + if (error4 < 0) + return error4; - error += error2 + error3; + error += error2 + error3 + error4; if (size && error > size) return -ERANGE; return error; -- GitLab From 7dd032d12405681a900eb0dc3c438ea5e77744e5 Mon Sep 17 00:00:00 2001 From: Sagi Grimberg Date: Fri, 25 Apr 2025 15:49:19 +0300 Subject: [PATCH 1647/2211] NFSv4.2: fix setattr caching of TIME_[MODIFY|ACCESS]_SET when timestamps are delegated [ Upstream commit aba41e90aadeca8d4656f90639aa5f91ce564f1c ] nfs_setattr will flush all pending writes before updating a file time attributes. However when the client holds delegated timestamps, it can update its timestamps locally as it is the authority for the file times attributes. The client will later set the file attributes by adding a setattr to the delegreturn compound updating the server time attributes. Fix nfs_setattr to avoid flushing pending writes when the file time attributes are delegated and the mtime/atime are set to a fixed timestamp (ATTR_[MODIFY|ACCESS]_SET. Also, when sending the setattr procedure over the wire, we need to clear the correct attribute bits from the bitmask. I was able to measure a noticable speedup when measuring untar performance. Test: $ time tar xzf ~/dir.tgz Baseline: 1m13.072s Patched: 0m49.038s Which is more than 30% latency improvement. Signed-off-by: Sagi Grimberg Signed-off-by: Anna Schumaker Signed-off-by: Sasha Levin --- fs/nfs/inode.c | 49 +++++++++++++++++++++++++++++++++++++++++++---- fs/nfs/nfs4proc.c | 8 ++++---- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 9f10771331007..16607b24ab9c1 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -635,6 +635,34 @@ nfs_fattr_fixup_delegated(struct inode *inode, struct nfs_fattr *fattr) } } +static void nfs_set_timestamps_to_ts(struct inode *inode, struct iattr *attr) +{ + unsigned int cache_flags = 0; + + if (attr->ia_valid & ATTR_MTIME_SET) { + struct timespec64 ctime = inode_get_ctime(inode); + struct timespec64 mtime = inode_get_mtime(inode); + struct timespec64 now; + int updated = 0; + + now = inode_set_ctime_current(inode); + if (!timespec64_equal(&now, &ctime)) + updated |= S_CTIME; + + inode_set_mtime_to_ts(inode, attr->ia_mtime); + if (!timespec64_equal(&now, &mtime)) + updated |= S_MTIME; + + inode_maybe_inc_iversion(inode, updated); + cache_flags |= NFS_INO_INVALID_CTIME | NFS_INO_INVALID_MTIME; + } + if (attr->ia_valid & ATTR_ATIME_SET) { + inode_set_atime_to_ts(inode, attr->ia_atime); + cache_flags |= NFS_INO_INVALID_ATIME; + } + NFS_I(inode)->cache_validity &= ~cache_flags; +} + static void nfs_update_timestamps(struct inode *inode, unsigned int ia_valid) { enum file_time_flags time_flags = 0; @@ -703,14 +731,27 @@ nfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, if (nfs_have_delegated_mtime(inode) && attr->ia_valid & ATTR_MTIME) { spin_lock(&inode->i_lock); - nfs_update_timestamps(inode, attr->ia_valid); + if (attr->ia_valid & ATTR_MTIME_SET) { + nfs_set_timestamps_to_ts(inode, attr); + attr->ia_valid &= ~(ATTR_MTIME|ATTR_MTIME_SET| + ATTR_ATIME|ATTR_ATIME_SET); + } else { + nfs_update_timestamps(inode, attr->ia_valid); + attr->ia_valid &= ~(ATTR_MTIME|ATTR_ATIME); + } spin_unlock(&inode->i_lock); - attr->ia_valid &= ~(ATTR_MTIME | ATTR_ATIME); } else if (nfs_have_delegated_atime(inode) && attr->ia_valid & ATTR_ATIME && !(attr->ia_valid & ATTR_MTIME)) { - nfs_update_delegated_atime(inode); - attr->ia_valid &= ~ATTR_ATIME; + if (attr->ia_valid & ATTR_ATIME_SET) { + spin_lock(&inode->i_lock); + nfs_set_timestamps_to_ts(inode, attr); + spin_unlock(&inode->i_lock); + attr->ia_valid &= ~(ATTR_ATIME|ATTR_ATIME_SET); + } else { + nfs_update_delegated_atime(inode); + attr->ia_valid &= ~ATTR_ATIME; + } } /* Optimization: if the end result is no change, don't RPC */ diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 9832e27b5d29b..413f8be7106cc 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -313,14 +313,14 @@ static void nfs4_bitmap_copy_adjust(__u32 *dst, const __u32 *src, if (nfs_have_delegated_mtime(inode)) { if (!(cache_validity & NFS_INO_INVALID_ATIME)) - dst[1] &= ~FATTR4_WORD1_TIME_ACCESS; + dst[1] &= ~(FATTR4_WORD1_TIME_ACCESS|FATTR4_WORD1_TIME_ACCESS_SET); if (!(cache_validity & NFS_INO_INVALID_MTIME)) - dst[1] &= ~FATTR4_WORD1_TIME_MODIFY; + dst[1] &= ~(FATTR4_WORD1_TIME_MODIFY|FATTR4_WORD1_TIME_MODIFY_SET); if (!(cache_validity & NFS_INO_INVALID_CTIME)) - dst[1] &= ~FATTR4_WORD1_TIME_METADATA; + dst[1] &= ~(FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY_SET); } else if (nfs_have_delegated_atime(inode)) { if (!(cache_validity & NFS_INO_INVALID_ATIME)) - dst[1] &= ~FATTR4_WORD1_TIME_ACCESS; + dst[1] &= ~(FATTR4_WORD1_TIME_ACCESS|FATTR4_WORD1_TIME_ACCESS_SET); } } -- GitLab From 8a997e1ab550f807f6bfc56b1b8ad9e86f6f89a6 Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Fri, 11 Apr 2025 21:14:10 +0800 Subject: [PATCH 1648/2211] mailbox: Not protect module_put with spin_lock_irqsave [ Upstream commit dddbd233e67e792bb0a3f9694a4707e6be29b2c6 ] &chan->lock is not supposed to protect 'chan->mbox'. And in __mbox_bind_client, try_module_get is also not protected by &chan->lock. So move module_put out of the lock protected region. Signed-off-by: Peng Fan Signed-off-by: Jassi Brar Signed-off-by: Sasha Levin --- drivers/mailbox/mailbox.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c index cb174e788a96c..92c2fb618c8e1 100644 --- a/drivers/mailbox/mailbox.c +++ b/drivers/mailbox/mailbox.c @@ -490,8 +490,8 @@ void mbox_free_channel(struct mbox_chan *chan) if (chan->txdone_method == TXDONE_BY_ACK) chan->txdone_method = TXDONE_BY_POLL; - module_put(chan->mbox->dev->driver->owner); spin_unlock_irqrestore(&chan->lock, flags); + module_put(chan->mbox->dev->driver->owner); } EXPORT_SYMBOL_GPL(mbox_free_channel); -- GitLab From b9c7bc45ead8c9651f76a4077b92ae1caa080514 Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Sun, 6 Apr 2025 21:50:11 +0200 Subject: [PATCH 1649/2211] mfd: max14577: Fix wakeup source leaks on device unbind [ Upstream commit d905d06e64b0eb3da43af6186c132f5282197998 ] Device can be unbound, so driver must also release memory for the wakeup source. Signed-off-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20250406-mfd-device-wakekup-leak-v1-3-318e14bdba0a@linaro.org Signed-off-by: Lee Jones Signed-off-by: Sasha Levin --- drivers/mfd/max14577.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/mfd/max14577.c b/drivers/mfd/max14577.c index 6fce79ec2dc64..7e7e8af9af224 100644 --- a/drivers/mfd/max14577.c +++ b/drivers/mfd/max14577.c @@ -456,6 +456,7 @@ static void max14577_i2c_remove(struct i2c_client *i2c) { struct max14577 *max14577 = i2c_get_clientdata(i2c); + device_init_wakeup(max14577->dev, false); mfd_remove_devices(max14577->dev); regmap_del_irq_chip(max14577->irq, max14577->irq_data); if (max14577->dev_type == MAXIM_DEVICE_TYPE_MAX77836) -- GitLab From 5fc29fb747a11d5cd39bbbb15233b3cc15a911c8 Mon Sep 17 00:00:00 2001 From: Nikhil Jha Date: Wed, 19 Mar 2025 13:02:40 -0400 Subject: [PATCH 1650/2211] sunrpc: don't immediately retransmit on seqno miss [ Upstream commit fadc0f3bb2de8c570ced6d9c1f97222213d93140 ] RFC2203 requires that retransmitted messages use a new gss sequence number, but the same XID. This means that if the server is just slow (e.x. overloaded), the client might receive a response using an older seqno than the one it has recorded. Currently, Linux's client immediately retransmits in this case. However, this leads to a lot of wasted retransmits until the server eventually responds faster than the client can resend. Client -> SEQ 1 -> Server Client -> SEQ 2 -> Server Client <- SEQ 1 <- Server (misses, expecting seqno = 2) Client -> SEQ 3 -> Server (immediate retransmission on miss) Client <- SEQ 2 <- Server (misses, expecting seqno = 3) Client -> SEQ 4 -> Server (immediate retransmission on miss) ... and so on ... This commit makes it so that we ignore messages with bad checksums due to seqnum mismatch, and rely on the usual timeout behavior for retransmission instead of doing so immediately. Signed-off-by: Nikhil Jha Acked-by: Chuck Lever Signed-off-by: Anna Schumaker Signed-off-by: Sasha Levin --- net/sunrpc/clnt.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 17a4de75bfaf6..e492655cb2212 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -2749,8 +2749,13 @@ out_verifier: case -EPROTONOSUPPORT: goto out_err; case -EACCES: - /* Re-encode with a fresh cred */ - fallthrough; + /* possible RPCSEC_GSS out-of-sequence event (RFC2203), + * reset recv state and keep waiting, don't retransmit + */ + task->tk_rqstp->rq_reply_bytes_recvd = 0; + task->tk_status = xprt_request_enqueue_receive(task); + task->tk_action = call_transmit_status; + return -EBADMSG; default: goto out_garbage; } -- GitLab From 77da6180985317dba41cb12bc0aea88f4bc102ab Mon Sep 17 00:00:00 2001 From: Matthew Sakai Date: Mon, 12 May 2025 21:10:10 -0400 Subject: [PATCH 1651/2211] dm vdo indexer: don't read request structure after enqueuing [ Upstream commit 3da732687d72078e52cc7f334a482383e84ca156 ] The function get_volume_page_protected may place a request on a queue for another thread to process asynchronously. When this happens, the volume should not read the request from the original thread. This can not currently cause problems, due to the way request processing is handled, but it is not safe in general. Reviewed-by: Ken Raeburn Signed-off-by: Matthew Sakai Signed-off-by: Mikulas Patocka Signed-off-by: Sasha Levin --- drivers/md/dm-vdo/indexer/volume.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/drivers/md/dm-vdo/indexer/volume.c b/drivers/md/dm-vdo/indexer/volume.c index 655453bb276be..425b3a74f4dba 100644 --- a/drivers/md/dm-vdo/indexer/volume.c +++ b/drivers/md/dm-vdo/indexer/volume.c @@ -754,10 +754,11 @@ static int get_volume_page_protected(struct volume *volume, struct uds_request * u32 physical_page, struct cached_page **page_ptr) { struct cached_page *page; + unsigned int zone_number = request->zone_number; get_page_from_cache(&volume->page_cache, physical_page, &page); if (page != NULL) { - if (request->zone_number == 0) { + if (zone_number == 0) { /* Only one zone is allowed to update the LRU. */ make_page_most_recent(&volume->page_cache, page); } @@ -767,7 +768,7 @@ static int get_volume_page_protected(struct volume *volume, struct uds_request * } /* Prepare to enqueue a read for the page. */ - end_pending_search(&volume->page_cache, request->zone_number); + end_pending_search(&volume->page_cache, zone_number); mutex_lock(&volume->read_threads_mutex); /* @@ -787,8 +788,7 @@ static int get_volume_page_protected(struct volume *volume, struct uds_request * * the order does not matter for correctness as it does below. */ mutex_unlock(&volume->read_threads_mutex); - begin_pending_search(&volume->page_cache, physical_page, - request->zone_number); + begin_pending_search(&volume->page_cache, physical_page, zone_number); return UDS_QUEUED; } @@ -797,7 +797,7 @@ static int get_volume_page_protected(struct volume *volume, struct uds_request * * "search pending" state in careful order so no other thread can mess with the data before * the caller gets to look at it. */ - begin_pending_search(&volume->page_cache, physical_page, request->zone_number); + begin_pending_search(&volume->page_cache, physical_page, zone_number); mutex_unlock(&volume->read_threads_mutex); *page_ptr = page; return UDS_SUCCESS; @@ -849,6 +849,7 @@ static int search_cached_index_page(struct volume *volume, struct uds_request *r { int result; struct cached_page *page = NULL; + unsigned int zone_number = request->zone_number; u32 physical_page = map_to_physical_page(volume->geometry, chapter, index_page_number); @@ -858,18 +859,18 @@ static int search_cached_index_page(struct volume *volume, struct uds_request *r * invalidation by the reader thread, before the reader thread has noticed that the * invalidate_counter has been incremented. */ - begin_pending_search(&volume->page_cache, physical_page, request->zone_number); + begin_pending_search(&volume->page_cache, physical_page, zone_number); result = get_volume_page_protected(volume, request, physical_page, &page); if (result != UDS_SUCCESS) { - end_pending_search(&volume->page_cache, request->zone_number); + end_pending_search(&volume->page_cache, zone_number); return result; } result = uds_search_chapter_index_page(&page->index_page, volume->geometry, &request->record_name, record_page_number); - end_pending_search(&volume->page_cache, request->zone_number); + end_pending_search(&volume->page_cache, zone_number); return result; } @@ -882,6 +883,7 @@ int uds_search_cached_record_page(struct volume *volume, struct uds_request *req { struct cached_page *record_page; struct index_geometry *geometry = volume->geometry; + unsigned int zone_number = request->zone_number; int result; u32 physical_page, page_number; @@ -905,11 +907,11 @@ int uds_search_cached_record_page(struct volume *volume, struct uds_request *req * invalidation by the reader thread, before the reader thread has noticed that the * invalidate_counter has been incremented. */ - begin_pending_search(&volume->page_cache, physical_page, request->zone_number); + begin_pending_search(&volume->page_cache, physical_page, zone_number); result = get_volume_page_protected(volume, request, physical_page, &record_page); if (result != UDS_SUCCESS) { - end_pending_search(&volume->page_cache, request->zone_number); + end_pending_search(&volume->page_cache, zone_number); return result; } @@ -917,7 +919,7 @@ int uds_search_cached_record_page(struct volume *volume, struct uds_request *req &request->record_name, geometry, &request->old_metadata)) *found = true; - end_pending_search(&volume->page_cache, request->zone_number); + end_pending_search(&volume->page_cache, zone_number); return UDS_SUCCESS; } -- GitLab From dcd5b32139cd62b4e8827c77723e47a183bea9a0 Mon Sep 17 00:00:00 2001 From: Sven Schwermer Date: Fri, 4 Apr 2025 20:40:36 +0200 Subject: [PATCH 1652/2211] leds: multicolor: Fix intensity setting while SW blinking [ Upstream commit e35ca991a777ef513040cbb36bc8245a031a2633 ] When writing to the multi_intensity file, don't unconditionally call led_set_brightness. By only doing this if blinking is inactive we prevent blinking from stopping if the blinking is in its off phase while the file is written. Instead, if blinking is active, the changed intensity values are applied upon the next blink. This is consistent with changing the brightness on monochrome LEDs with active blinking. Suggested-by: Jacek Anaszewski Acked-by: Jacek Anaszewski Acked-by: Pavel Machek Reviewed-by: Tobias Deiminger Tested-by: Sven Schuchmann Signed-off-by: Sven Schwermer Link: https://lore.kernel.org/r/20250404184043.227116-1-sven@svenschwermer.de Signed-off-by: Lee Jones Signed-off-by: Sasha Levin --- drivers/leds/led-class-multicolor.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/leds/led-class-multicolor.c b/drivers/leds/led-class-multicolor.c index 30c1ecb5f361e..c707be97049b7 100644 --- a/drivers/leds/led-class-multicolor.c +++ b/drivers/leds/led-class-multicolor.c @@ -61,7 +61,8 @@ static ssize_t multi_intensity_store(struct device *dev, for (i = 0; i < mcled_cdev->num_colors; i++) mcled_cdev->subled_info[i].intensity = intensity_value[i]; - led_set_brightness(led_cdev, led_cdev->brightness); + if (!test_bit(LED_BLINK_SW, &led_cdev->work_flags)) + led_set_brightness(led_cdev, led_cdev->brightness); ret = size; err_out: mutex_unlock(&led_cdev->led_access); -- GitLab From 3a0f33c420c5fa8cc3c95d396f4d3828a18e1890 Mon Sep 17 00:00:00 2001 From: Guang Yuan Wu Date: Fri, 2 May 2025 04:04:21 +0000 Subject: [PATCH 1653/2211] fuse: fix race between concurrent setattrs from multiple nodes [ Upstream commit 69efbff69f89c9b2b72c4d82ad8b59706add768a ] When mounting a user-space filesystem on multiple clients, after concurrent ->setattr() calls from different node, stale inode attributes may be cached in some node. This is caused by fuse_setattr() racing with fuse_reverse_inval_inode(). When filesystem server receives setattr request, the client node with valid iattr cached will be required to update the fuse_inode's attr_version and invalidate the cache by fuse_reverse_inval_inode(), and at the next call to ->getattr() they will be fetched from user space. The race scenario is: 1. client-1 sends setattr (iattr-1) request to server 2. client-1 receives the reply from server 3. before client-1 updates iattr-1 to the cached attributes by fuse_change_attributes_common(), server receives another setattr (iattr-2) request from client-2 4. server requests client-1 to update the inode attr_version and invalidate the cached iattr, and iattr-1 becomes staled 5. client-2 receives the reply from server, and caches iattr-2 6. continue with step 2, client-1 invokes fuse_change_attributes_common(), and caches iattr-1 The issue has been observed from concurrent of chmod, chown, or truncate, which all invoke ->setattr() call. The solution is to use fuse_inode's attr_version to check whether the attributes have been modified during the setattr request's lifetime. If so, mark the attributes as invalid in the function fuse_change_attributes_common(). Signed-off-by: Guang Yuan Wu Reviewed-by: Bernd Schubert Signed-off-by: Miklos Szeredi Signed-off-by: Sasha Levin --- fs/fuse/dir.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index ff543dc09130e..ce7324d0d9ed1 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1921,6 +1921,7 @@ int fuse_do_setattr(struct mnt_idmap *idmap, struct dentry *dentry, int err; bool trust_local_cmtime = is_wb; bool fault_blocked = false; + u64 attr_version; if (!fc->default_permissions) attr->ia_valid |= ATTR_FORCE; @@ -2005,6 +2006,8 @@ int fuse_do_setattr(struct mnt_idmap *idmap, struct dentry *dentry, if (fc->handle_killpriv_v2 && !capable(CAP_FSETID)) inarg.valid |= FATTR_KILL_SUIDGID; } + + attr_version = fuse_get_attr_version(fm->fc); fuse_setattr_fill(fc, &args, inode, &inarg, &outarg); err = fuse_simple_request(fm, &args); if (err) { @@ -2030,6 +2033,14 @@ int fuse_do_setattr(struct mnt_idmap *idmap, struct dentry *dentry, /* FIXME: clear I_DIRTY_SYNC? */ } + if (fi->attr_version > attr_version) { + /* + * Apply attributes, for example for fsnotify_change(), but set + * attribute timeout to zero. + */ + outarg.attr_valid = outarg.attr_valid_nsec = 0; + } + fuse_change_attributes_common(inode, &outarg.attr, NULL, ATTR_TIMEOUT(&outarg), fuse_get_cache_mask(inode)); -- GitLab From b3dc5c735a754142831f705068fcfa77551724ff Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Fri, 9 May 2025 17:06:58 +0200 Subject: [PATCH 1654/2211] cxl/region: Add a dev_err() on missing target list entries [ Upstream commit d90acdf49e18029cfe4194475c45ef143657737a ] Broken target lists are hard to discover as the driver fails at a later initialization stage. Add an error message for this. Example log messages: cxl_mem mem1: failed to find endpoint6:0000:e0:01.3 in target list of decoder1.1 cxl_port endpoint6: failed to register decoder6.0: -6 cxl_port endpoint6: probe: 0 Signed-off-by: Robert Richter Reviewed-by: Gregory Price Reviewed-by: Jonathan Cameron Reviewed-by: Dave Jiang Reviewed-by: Dan Williams Reviewed-by: Alison Schofield Reviewed-by: "Fabio M. De Francesco" Tested-by: Gregory Price Acked-by: Dan Williams Link: https://patch.msgid.link/20250509150700.2817697-14-rrichter@amd.com Signed-off-by: Dave Jiang Signed-off-by: Sasha Levin --- drivers/cxl/core/region.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index a0d6e8d7f42c8..f5429666822f0 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -1781,6 +1781,13 @@ static int find_pos_and_ways(struct cxl_port *port, struct range *range, } put_device(dev); + if (rc) + dev_err(port->uport_dev, + "failed to find %s:%s in target list of %s\n", + dev_name(&port->dev), + dev_name(port->parent_dport->dport_dev), + dev_name(&cxlsd->cxld.dev)); + return rc; } -- GitLab From 9453ce2dd672b17c74faf14c8604b85ac4476830 Mon Sep 17 00:00:00 2001 From: Scott Mayhew Date: Wed, 16 Apr 2025 11:23:38 -0400 Subject: [PATCH 1655/2211] NFSv4: xattr handlers should check for absent nfs filehandles [ Upstream commit 6e9a2f8dbe93c8004c2af2c0158888628b7ca034 ] The nfs inodes for referral anchors that have not yet been followed have their filehandles zeroed out. Attempting to call getxattr() on one of these will cause the nfs client to send a GETATTR to the nfs server with the preceding PUTFH sans filehandle. The server will reply NFS4ERR_NOFILEHANDLE, leading to -EIO being returned to the application. For example: $ strace -e trace=getxattr getfattr -n system.nfs4_acl /mnt/t/ref getxattr("/mnt/t/ref", "system.nfs4_acl", NULL, 0) = -1 EIO (Input/output error) /mnt/t/ref: system.nfs4_acl: Input/output error +++ exited with 1 +++ Have the xattr handlers return -ENODATA instead. Signed-off-by: Scott Mayhew Signed-off-by: Anna Schumaker Signed-off-by: Sasha Levin --- fs/nfs/nfs4proc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 413f8be7106cc..77b239b10d418 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -6174,6 +6174,8 @@ static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen, struct nfs_server *server = NFS_SERVER(inode); int ret; + if (unlikely(NFS_FH(inode)->size == 0)) + return -ENODATA; if (!nfs4_server_supports_acls(server, type)) return -EOPNOTSUPP; ret = nfs_revalidate_inode(inode, NFS_INO_INVALID_CHANGE); @@ -6248,6 +6250,9 @@ static int nfs4_proc_set_acl(struct inode *inode, const void *buf, { struct nfs4_exception exception = { }; int err; + + if (unlikely(NFS_FH(inode)->size == 0)) + return -ENODATA; do { err = __nfs4_proc_set_acl(inode, buf, buflen, type); trace_nfs4_set_acl(inode, err); -- GitLab From 2414d3452ae6d340dc5962ce6def39d42abe7b18 Mon Sep 17 00:00:00 2001 From: Alexis Czezar Torreno Date: Mon, 7 Apr 2025 11:47:24 +0800 Subject: [PATCH 1656/2211] hwmon: (pmbus/max34440) Fix support for max34451 [ Upstream commit 19932f844f3f51646f762f3eac4744ec3a405064 ] The max344** family has an issue with some PMBUS address being switched. This includes max34451 however version MAX34451-NA6 and later has this issue fixed and this commit supports that update. Signed-off-by: Alexis Czezar Torreno Link: https://lore.kernel.org/r/20250407-dev_adpm12160-v3-1-9cd3095445c8@analog.com Signed-off-by: Guenter Roeck Signed-off-by: Sasha Levin --- drivers/hwmon/pmbus/max34440.c | 48 +++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/drivers/hwmon/pmbus/max34440.c b/drivers/hwmon/pmbus/max34440.c index fe7f6b1b09851..e14be8ebaad30 100644 --- a/drivers/hwmon/pmbus/max34440.c +++ b/drivers/hwmon/pmbus/max34440.c @@ -34,16 +34,21 @@ enum chips { max34440, max34441, max34446, max34451, max34460, max34461 }; /* * The whole max344* family have IOUT_OC_WARN_LIMIT and IOUT_OC_FAULT_LIMIT * swapped from the standard pmbus spec addresses. + * For max34451, version MAX34451ETNA6+ and later has this issue fixed. */ #define MAX34440_IOUT_OC_WARN_LIMIT 0x46 #define MAX34440_IOUT_OC_FAULT_LIMIT 0x4A +#define MAX34451ETNA6_MFR_REV 0x0012 + #define MAX34451_MFR_CHANNEL_CONFIG 0xe4 #define MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK 0x3f struct max34440_data { int id; struct pmbus_driver_info info; + u8 iout_oc_warn_limit; + u8 iout_oc_fault_limit; }; #define to_max34440_data(x) container_of(x, struct max34440_data, info) @@ -60,11 +65,11 @@ static int max34440_read_word_data(struct i2c_client *client, int page, switch (reg) { case PMBUS_IOUT_OC_FAULT_LIMIT: ret = pmbus_read_word_data(client, page, phase, - MAX34440_IOUT_OC_FAULT_LIMIT); + data->iout_oc_fault_limit); break; case PMBUS_IOUT_OC_WARN_LIMIT: ret = pmbus_read_word_data(client, page, phase, - MAX34440_IOUT_OC_WARN_LIMIT); + data->iout_oc_warn_limit); break; case PMBUS_VIRT_READ_VOUT_MIN: ret = pmbus_read_word_data(client, page, phase, @@ -133,11 +138,11 @@ static int max34440_write_word_data(struct i2c_client *client, int page, switch (reg) { case PMBUS_IOUT_OC_FAULT_LIMIT: - ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_FAULT_LIMIT, + ret = pmbus_write_word_data(client, page, data->iout_oc_fault_limit, word); break; case PMBUS_IOUT_OC_WARN_LIMIT: - ret = pmbus_write_word_data(client, page, MAX34440_IOUT_OC_WARN_LIMIT, + ret = pmbus_write_word_data(client, page, data->iout_oc_warn_limit, word); break; case PMBUS_VIRT_RESET_POUT_HISTORY: @@ -235,6 +240,25 @@ static int max34451_set_supported_funcs(struct i2c_client *client, */ int page, rv; + bool max34451_na6 = false; + + rv = i2c_smbus_read_word_data(client, PMBUS_MFR_REVISION); + if (rv < 0) + return rv; + + if (rv >= MAX34451ETNA6_MFR_REV) { + max34451_na6 = true; + data->info.format[PSC_VOLTAGE_IN] = direct; + data->info.format[PSC_CURRENT_IN] = direct; + data->info.m[PSC_VOLTAGE_IN] = 1; + data->info.b[PSC_VOLTAGE_IN] = 0; + data->info.R[PSC_VOLTAGE_IN] = 3; + data->info.m[PSC_CURRENT_IN] = 1; + data->info.b[PSC_CURRENT_IN] = 0; + data->info.R[PSC_CURRENT_IN] = 2; + data->iout_oc_fault_limit = PMBUS_IOUT_OC_FAULT_LIMIT; + data->iout_oc_warn_limit = PMBUS_IOUT_OC_WARN_LIMIT; + } for (page = 0; page < 16; page++) { rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page); @@ -251,16 +275,30 @@ static int max34451_set_supported_funcs(struct i2c_client *client, case 0x20: data->info.func[page] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT; + + if (max34451_na6) + data->info.func[page] |= PMBUS_HAVE_VIN | + PMBUS_HAVE_STATUS_INPUT; break; case 0x21: data->info.func[page] = PMBUS_HAVE_VOUT; + + if (max34451_na6) + data->info.func[page] |= PMBUS_HAVE_VIN; break; case 0x22: data->info.func[page] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT; + + if (max34451_na6) + data->info.func[page] |= PMBUS_HAVE_IIN | + PMBUS_HAVE_STATUS_INPUT; break; case 0x23: data->info.func[page] = PMBUS_HAVE_IOUT; + + if (max34451_na6) + data->info.func[page] |= PMBUS_HAVE_IIN; break; default: break; @@ -494,6 +532,8 @@ static int max34440_probe(struct i2c_client *client) return -ENOMEM; data->id = i2c_match_id(max34440_id, client)->driver_data; data->info = max34440_info[data->id]; + data->iout_oc_fault_limit = MAX34440_IOUT_OC_FAULT_LIMIT; + data->iout_oc_warn_limit = MAX34440_IOUT_OC_WARN_LIMIT; if (data->id == max34451) { rv = max34451_set_supported_funcs(client, data); -- GitLab From 0fce0027a56a2bf9ca0f18fc751061070062dd48 Mon Sep 17 00:00:00 2001 From: Namjae Jeon Date: Tue, 27 May 2025 11:23:01 +0900 Subject: [PATCH 1657/2211] ksmbd: allow a filename to contain special characters on SMB3.1.1 posix extension [ Upstream commit dc3e0f17f74558e8a2fce00608855f050de10230 ] If client send SMB2_CREATE_POSIX_CONTEXT to ksmbd, Allow a filename to contain special characters. Reported-by: Philipp Kerling Signed-off-by: Namjae Jeon Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/server/smb2pdu.c | 53 +++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index 6537ffd2b9651..ef921a370cb98 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -2871,7 +2871,7 @@ int smb2_open(struct ksmbd_work *work) int req_op_level = 0, open_flags = 0, may_flags = 0, file_info = 0; int rc = 0; int contxt_cnt = 0, query_disk_id = 0; - int maximal_access_ctxt = 0, posix_ctxt = 0; + bool maximal_access_ctxt = false, posix_ctxt = false; int s_type = 0; int next_off = 0; char *name = NULL; @@ -2898,6 +2898,27 @@ int smb2_open(struct ksmbd_work *work) return create_smb2_pipe(work); } + if (req->CreateContextsOffset && tcon->posix_extensions) { + context = smb2_find_context_vals(req, SMB2_CREATE_TAG_POSIX, 16); + if (IS_ERR(context)) { + rc = PTR_ERR(context); + goto err_out2; + } else if (context) { + struct create_posix *posix = (struct create_posix *)context; + + if (le16_to_cpu(context->DataOffset) + + le32_to_cpu(context->DataLength) < + sizeof(struct create_posix) - 4) { + rc = -EINVAL; + goto err_out2; + } + ksmbd_debug(SMB, "get posix context\n"); + + posix_mode = le32_to_cpu(posix->Mode); + posix_ctxt = true; + } + } + if (req->NameLength) { name = smb2_get_name((char *)req + le16_to_cpu(req->NameOffset), le16_to_cpu(req->NameLength), @@ -2920,9 +2941,11 @@ int smb2_open(struct ksmbd_work *work) goto err_out2; } - rc = ksmbd_validate_filename(name); - if (rc < 0) - goto err_out2; + if (posix_ctxt == false) { + rc = ksmbd_validate_filename(name); + if (rc < 0) + goto err_out2; + } if (ksmbd_share_veto_filename(share, name)) { rc = -ENOENT; @@ -3080,28 +3103,6 @@ int smb2_open(struct ksmbd_work *work) rc = -EBADF; goto err_out2; } - - if (tcon->posix_extensions) { - context = smb2_find_context_vals(req, - SMB2_CREATE_TAG_POSIX, 16); - if (IS_ERR(context)) { - rc = PTR_ERR(context); - goto err_out2; - } else if (context) { - struct create_posix *posix = - (struct create_posix *)context; - if (le16_to_cpu(context->DataOffset) + - le32_to_cpu(context->DataLength) < - sizeof(struct create_posix) - 4) { - rc = -EINVAL; - goto err_out2; - } - ksmbd_debug(SMB, "get posix context\n"); - - posix_mode = le32_to_cpu(posix->Mode); - posix_ctxt = 1; - } - } } if (ksmbd_override_fsids(work)) { -- GitLab From 229aa5b810e0b455b1790ced309e259c930a6326 Mon Sep 17 00:00:00 2001 From: Namjae Jeon Date: Wed, 21 May 2025 09:02:29 +0900 Subject: [PATCH 1658/2211] ksmbd: provide zero as a unique ID to the Mac client [ Upstream commit 571781eb7ffefa65b0e922c8031e42b4411a40d4 ] The Mac SMB client code seems to expect the on-disk file identifier to have the semantics of HFS+ Catalog Node Identifier (CNID). ksmbd provides the inode number as a unique ID to the client, but in the case of subvolumes of btrfs, there are cases where different files have the same inode number, so the mac smb client treats it as an error. There is a report that a similar problem occurs when the share is ZFS. Returning UniqueId of zero will make the Mac client to stop using and trusting the file id returned from the server. Reported-by: Justin Turner Arthur Signed-off-by: Namjae Jeon Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/server/connection.h | 1 + fs/smb/server/smb2pdu.c | 19 +++++++++++++++++-- fs/smb/server/smb2pdu.h | 3 +++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/fs/smb/server/connection.h b/fs/smb/server/connection.h index 572102098c108..dd3e0e3f7bf04 100644 --- a/fs/smb/server/connection.h +++ b/fs/smb/server/connection.h @@ -108,6 +108,7 @@ struct ksmbd_conn { __le16 signing_algorithm; bool binding; atomic_t refcnt; + bool is_aapl; }; struct ksmbd_conn_ops { diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index ef921a370cb98..5d2324c09a070 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -3535,6 +3535,15 @@ int smb2_open(struct ksmbd_work *work) ksmbd_debug(SMB, "get query on disk id context\n"); query_disk_id = 1; } + + if (conn->is_aapl == false) { + context = smb2_find_context_vals(req, SMB2_CREATE_AAPL, 4); + if (IS_ERR(context)) { + rc = PTR_ERR(context); + goto err_out1; + } else if (context) + conn->is_aapl = true; + } } rc = ksmbd_vfs_getattr(&path, &stat); @@ -3974,7 +3983,10 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level, if (dinfo->EaSize) dinfo->ExtFileAttributes = FILE_ATTRIBUTE_REPARSE_POINT_LE; dinfo->Reserved = 0; - dinfo->UniqueId = cpu_to_le64(ksmbd_kstat->kstat->ino); + if (conn->is_aapl) + dinfo->UniqueId = 0; + else + dinfo->UniqueId = cpu_to_le64(ksmbd_kstat->kstat->ino); if (d_info->hide_dot_file && d_info->name[0] == '.') dinfo->ExtFileAttributes |= FILE_ATTRIBUTE_HIDDEN_LE; memcpy(dinfo->FileName, conv_name, conv_len); @@ -3991,7 +4003,10 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level, smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode); if (fibdinfo->EaSize) fibdinfo->ExtFileAttributes = FILE_ATTRIBUTE_REPARSE_POINT_LE; - fibdinfo->UniqueId = cpu_to_le64(ksmbd_kstat->kstat->ino); + if (conn->is_aapl) + fibdinfo->UniqueId = 0; + else + fibdinfo->UniqueId = cpu_to_le64(ksmbd_kstat->kstat->ino); fibdinfo->ShortNameLength = 0; fibdinfo->Reserved = 0; fibdinfo->Reserved2 = cpu_to_le16(0); diff --git a/fs/smb/server/smb2pdu.h b/fs/smb/server/smb2pdu.h index 17a0b18a8406b..16ae8a10490be 100644 --- a/fs/smb/server/smb2pdu.h +++ b/fs/smb/server/smb2pdu.h @@ -63,6 +63,9 @@ struct preauth_integrity_info { #define SMB2_SESSION_TIMEOUT (10 * HZ) +/* Apple Defined Contexts */ +#define SMB2_CREATE_AAPL "AAPL" + struct create_durable_req_v2 { struct create_context_hdr ccontext; __u8 Name[8]; -- GitLab From 58364e74070bf5f505a738b84346d8785b15a066 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Sat, 8 Mar 2025 13:45:06 +0900 Subject: [PATCH 1659/2211] rust: module: place cleanup_module() in .exit.text section [ Upstream commit 249c3a0e53acefc2b06d3b3e1fc28fb2081f878d ] Place cleanup_module() in .exit.text section. Currently, cleanup_module() is likely placed in the .text section. It's inconsistent with the layout of C modules, where cleanup_module() is placed in .exit.text. [ Boqun asked for an example of how the section changed to be put in the log. Tomonori provided the following examples: C module: $ objdump -t ~/build/x86/drivers/block/loop.o|grep clean 0000000000000000 l O .exit.data 0000000000000008 __UNIQUE_ID___addressable_cleanup_module412 0000000000000000 g F .exit.text 000000000000009c cleanup_module Rust module without this patch: $ objdump -t ~/build/x86/samples/rust/rust_minimal.o|grep clean 00000000000002b0 g F .text 00000000000000c6 cleanup_module 0000000000000000 g O .exit.data 0000000000000008 _R...___UNIQUE_ID___addressable_cleanup_module Rust module with this patch: $ objdump -t ~/build/x86/samples/rust/rust_minimal.o|grep clean 0000000000000000 g F .exit.text 00000000000000c6 cleanup_module 0000000000000000 g O .exit.data 0000000000000008 _R...___UNIQUE_ID___addressable_cleanup_module - Miguel ] Signed-off-by: FUJITA Tomonori Acked-by: Jarkko Sakkinen Link: https://lore.kernel.org/r/20250308044506.14458-1-fujita.tomonori@gmail.com Signed-off-by: Miguel Ojeda Signed-off-by: Sasha Levin --- rust/macros/module.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rust/macros/module.rs b/rust/macros/module.rs index da2a18b276e0b..a5ea5850e307a 100644 --- a/rust/macros/module.rs +++ b/rust/macros/module.rs @@ -260,6 +260,7 @@ pub(crate) fn module(ts: TokenStream) -> TokenStream { #[cfg(MODULE)] #[doc(hidden)] #[no_mangle] + #[link_section = \".exit.text\"] pub extern \"C\" fn cleanup_module() {{ // SAFETY: // - This function is inaccessible to the outside due to the double -- GitLab From 6298a28a2c2add0aaab7ca17ea632f6e2e075955 Mon Sep 17 00:00:00 2001 From: Rudraksha Gupta Date: Thu, 22 May 2025 05:02:31 -0700 Subject: [PATCH 1660/2211] rust: arm: fix unknown (to Clang) argument '-mno-fdpic' [ Upstream commit 977c4308ee4270cf46e2c66b37de8e04670daa0c ] Currently rust on arm fails to compile due to '-mno-fdpic'. This flag disables a GCC feature that we don't want for kernel builds, so let's skip it as it doesn't apply to Clang. UPD include/generated/asm-offsets.h CALL scripts/checksyscalls.sh RUSTC L rust/core.o BINDGEN rust/bindings/bindings_generated.rs BINDGEN rust/bindings/bindings_helpers_generated.rs CC rust/helpers/helpers.o Unable to generate bindings: clang diagnosed error: error: unknown argument: '-mno-fdpic' make[2]: *** [rust/Makefile:369: rust/bindings/bindings_helpers_generated.rs] Error 1 make[2]: *** Deleting file 'rust/bindings/bindings_helpers_generated.rs' make[2]: *** Waiting for unfinished jobs.... Unable to generate bindings: clang diagnosed error: error: unknown argument: '-mno-fdpic' make[2]: *** [rust/Makefile:349: rust/bindings/bindings_generated.rs] Error 1 make[2]: *** Deleting file 'rust/bindings/bindings_generated.rs' make[1]: *** [/home/pmos/build/src/linux-next-next-20250521/Makefile:1285: prepare] Error 2 make: *** [Makefile:248: __sub-make] Error 2 [ Naresh provided the draft diff [1]. Ben explained [2]: FDPIC is only relevant with no-MMU targets, and then only for userspace. When configured for the arm-*-uclinuxfdpiceabi target, GCC enables FDPIC by default to facilitate compiling userspace programs. FDPIC is never used for the kernel, and we pass -mno-fdpic when building the kernel to override the default and make sure FDPIC is disabled. and [3]: -mno-fdpic disables a GCC feature that we don't want for kernel builds. clang does not support this feature, so it always behaves as though -mno-fdpic is passed. Therefore, it should be fine to mix the two, at least as far as FDPIC is concerned. [1] https://lore.kernel.org/rust-for-linux/CA+G9fYt4otQK4pHv8pJBW9e28yHSGCDncKquwuJiJ_1ou0pq0w@mail.gmail.com/ [2] https://lore.kernel.org/rust-for-linux/aAKrq2InExQk7f_k@dell-precision-5540/ [3] https://lore.kernel.org/rust-for-linux/aAo_F_UP1Gd4jHlZ@dell-precision-5540/ - Miguel ] Reported-by: Linux Kernel Functional Testing Closes: https://lore.kernel.org/all/CA+G9fYvOanQBYXKSg7C6EU30k8sTRC0JRPJXYu7wWK51w38QUQ@mail.gmail.com/ Suggested-by: Miguel Ojeda Acked-by: Naresh Kamboju Signed-off-by: Rudraksha Gupta Link: https://lore.kernel.org/r/20250522-rust-mno-fdpic-arm-fix-v2-1-a6f691d9c198@gmail.com [ Reworded title. - Miguel ] Signed-off-by: Miguel Ojeda Signed-off-by: Sasha Levin --- rust/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/Makefile b/rust/Makefile index 93650b2ee7d57..b8b7f817c48e4 100644 --- a/rust/Makefile +++ b/rust/Makefile @@ -238,7 +238,7 @@ bindgen_skip_c_flags := -mno-fp-ret-in-387 -mpreferred-stack-boundary=% \ -fzero-call-used-regs=% -fno-stack-clash-protection \ -fno-inline-functions-called-once -fsanitize=bounds-strict \ -fstrict-flex-arrays=% -fmin-function-alignment=% \ - -fzero-init-padding-bits=% \ + -fzero-init-padding-bits=% -mno-fdpic \ --param=% --param asan-% # Derived from `scripts/Makefile.clang`. -- GitLab From 98fd66c8ba77e3a7137575f610271014bc0e701f Mon Sep 17 00:00:00 2001 From: Yi Sun Date: Fri, 9 May 2025 08:03:04 +0800 Subject: [PATCH 1661/2211] dmaengine: idxd: Check availability of workqueue allocated by idxd wq driver before using [ Upstream commit 17502e7d7b7113346296f6758324798d536c31fd ] Running IDXD workloads in a container with the /dev directory mounted can trigger a call trace or even a kernel panic when the parent process of the container is terminated. This issue occurs because, under certain configurations, Docker does not properly propagate the mount replica back to the original mount point. In this case, when the user driver detaches, the WQ is destroyed but it still calls destroy_workqueue() attempting to completes all pending work. It's necessary to check wq->wq and skip the drain if it no longer exists. Signed-off-by: Yi Sun Reviewed-by: Dave Jiang Reviewed-by: Anil S Keshavamurthy Link: https://lore.kernel.org/r/20250509000304.1402863-1-yi.sun@intel.com Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/dma/idxd/cdev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c index 19a58c4ecef3f..8b27bd545685a 100644 --- a/drivers/dma/idxd/cdev.c +++ b/drivers/dma/idxd/cdev.c @@ -354,7 +354,9 @@ static void idxd_cdev_evl_drain_pasid(struct idxd_wq *wq, u32 pasid) set_bit(h, evl->bmap); h = (h + 1) % size; } - drain_workqueue(wq->wq); + if (wq->wq) + drain_workqueue(wq->wq); + mutex_unlock(&evl->lock); } -- GitLab From 80fb5c71ae2141b25abca170939b896b3c8aa53c Mon Sep 17 00:00:00 2001 From: Thomas Gessler Date: Wed, 7 May 2025 20:21:01 +0200 Subject: [PATCH 1662/2211] dmaengine: xilinx_dma: Set dma_device directions [ Upstream commit 7e01511443c30a55a5ae78d3debd46d4d872517e ] Coalesce the direction bits from the enabled TX and/or RX channels into the directions bit mask of dma_device. Without this mask set, dma_get_slave_caps() in the DMAEngine fails, which prevents the driver from being used with an IIO DMAEngine buffer. Signed-off-by: Thomas Gessler Reviewed-by: Suraj Gupta Tested-by: Folker Schwesinger Link: https://lore.kernel.org/r/20250507182101.909010-1-thomas.gessler@brueckmann-gmbh.de Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/dma/xilinx/xilinx_dma.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c index 5eb51ae93e89d..aa59b62cd83fb 100644 --- a/drivers/dma/xilinx/xilinx_dma.c +++ b/drivers/dma/xilinx/xilinx_dma.c @@ -2906,6 +2906,8 @@ static int xilinx_dma_chan_probe(struct xilinx_dma_device *xdev, return -EINVAL; } + xdev->common.directions |= chan->direction; + /* Request the interrupt */ chan->irq = of_irq_get(node, chan->tdest); if (chan->irq < 0) -- GitLab From 9f0fa018111143a5a02abd15d2aaa1d4a835b67b Mon Sep 17 00:00:00 2001 From: Wenbin Yao Date: Tue, 22 Apr 2025 18:36:23 +0800 Subject: [PATCH 1663/2211] PCI: dwc: Make link training more robust by setting PORT_LOGIC_LINK_WIDTH to one lane [ Upstream commit af3c6eacce0c464f28fe0e3d365b3860aba07931 ] As per DWC PCIe registers description 4.30a, section 1.13.43, NUM_OF_LANES named as PORT_LOGIC_LINK_WIDTH in PCIe DWC driver, is referred to as the "Predetermined Number of Lanes" in PCIe r6.0, sec 4.2.7.2.1, which explains the conditions required to enter Polling.Configuration: Next state is Polling.Configuration after at least 1024 TS1 Ordered Sets were transmitted, and all Lanes that detected a Receiver during Detect receive eight consecutive training sequences ... Otherwise, after a 24 ms timeout the next state is: Polling.Configuration if, (i) Any Lane, which detected a Receiver during Detect, received eight consecutive training sequences ... and a minimum of 1024 TS1 Ordered Sets are transmitted after receiving one TS1 or TS2 Ordered Set. And (ii) At least a predetermined set of Lanes that detected a Receiver during Detect have detected an exit from Electrical Idle at least once since entering Polling.Active. Note: This may prevent one or more bad Receivers or Transmitters from holding up a valid Link from being configured, and allow for additional training in Polling.Configuration. The exact set of predetermined Lanes is implementation specific. Note: Any Lane that receives eight consecutive TS1 or TS2 Ordered Sets should have detected an exit from Electrical Idle at least once since entering Polling.Active. In a PCIe link supporting multiple lanes, if PORT_LOGIC_LINK_WIDTH is set to lane width the hardware supports, all lanes that detect a receiver during the Detect phase must receive eight consecutive training sequences. Otherwise, LTSSM will not enter Polling.Configuration and link training will fail. Therefore, always set PORT_LOGIC_LINK_WIDTH to 1, regardless of the number of lanes the port actually supports, to make link up more robust. This setting will not affect the intended link width if all lanes are functional. Additionally, the link can still be established with at least one lane if other lanes are faulty. Co-developed-by: Qiang Yu Signed-off-by: Qiang Yu Signed-off-by: Wenbin Yao [mani: subject change] Signed-off-by: Manivannan Sadhasivam [bhelgaas: update PCIe spec citation, format quote] Signed-off-by: Bjorn Helgaas Tested-by: Niklas Cassel Link: https://patch.msgid.link/20250422103623.462277-1-quic_wenbyao@quicinc.com Signed-off-by: Sasha Levin --- drivers/pci/controller/dwc/pcie-designware.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/pci/controller/dwc/pcie-designware.c b/drivers/pci/controller/dwc/pcie-designware.c index 6d6cbc8b5b2c6..d40afe74ddd1a 100644 --- a/drivers/pci/controller/dwc/pcie-designware.c +++ b/drivers/pci/controller/dwc/pcie-designware.c @@ -752,22 +752,19 @@ static void dw_pcie_link_set_max_link_width(struct dw_pcie *pci, u32 num_lanes) /* Set link width speed control register */ lwsc = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL); lwsc &= ~PORT_LOGIC_LINK_WIDTH_MASK; + lwsc |= PORT_LOGIC_LINK_WIDTH_1_LANES; switch (num_lanes) { case 1: plc |= PORT_LINK_MODE_1_LANES; - lwsc |= PORT_LOGIC_LINK_WIDTH_1_LANES; break; case 2: plc |= PORT_LINK_MODE_2_LANES; - lwsc |= PORT_LOGIC_LINK_WIDTH_2_LANES; break; case 4: plc |= PORT_LINK_MODE_4_LANES; - lwsc |= PORT_LOGIC_LINK_WIDTH_4_LANES; break; case 8: plc |= PORT_LINK_MODE_8_LANES; - lwsc |= PORT_LOGIC_LINK_WIDTH_8_LANES; break; default: dev_err(pci->dev, "num-lanes %u: invalid value\n", num_lanes); -- GitLab From 1d34f7fb7a7e7ce941ae48a5109fcd6d15c47594 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 1 Apr 2025 10:17:08 +0100 Subject: [PATCH 1664/2211] PCI: apple: Fix missing OF node reference in apple_pcie_setup_port [ Upstream commit 7fa9fbf39116b061f8a41cd84f1884c545f322c4 ] In the success path, we hang onto a reference to the node, so make sure to grab one. The caller iterator puts our borrowed reference when we return. Signed-off-by: Hector Martin Signed-off-by: Alyssa Rosenzweig Signed-off-by: Marc Zyngier Signed-off-by: Manivannan Sadhasivam Tested-by: Janne Grunau Reviewed-by: Rob Herring (Arm) Reviewed-by: Manivannan Sadhasivam Acked-by: Alyssa Rosenzweig Link: https://patch.msgid.link/20250401091713.2765724-9-maz@kernel.org Signed-off-by: Sasha Levin --- drivers/pci/controller/pcie-apple.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c index ddc65368e77d1..7f02fe198d41c 100644 --- a/drivers/pci/controller/pcie-apple.c +++ b/drivers/pci/controller/pcie-apple.c @@ -585,6 +585,9 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie, list_add_tail(&port->entry, &pcie->ports); init_completion(&pcie->event); + /* In the success path, we keep a reference to np around */ + of_node_get(np); + ret = apple_pcie_port_register_irqs(port); WARN_ON(ret); -- GitLab From 519ab9c725db7271d268acb27bdc0b0639ec6234 Mon Sep 17 00:00:00 2001 From: Richard Zhu Date: Wed, 16 Apr 2025 16:13:11 +0800 Subject: [PATCH 1665/2211] PCI: imx6: Add workaround for errata ERR051624 [ Upstream commit ce0c43e855c7f652b6351110aaaabf9b521debd7 ] ERR051624: The Controller Without Vaux Cannot Exit L23 Ready Through Beacon or PERST# De-assertion When the auxiliary power is not available, the controller cannot exit from L23 Ready with beacon or PERST# de-assertion when main power is not removed. So the workaround is to set SS_RW_REG_1[SYS_AUX_PWR_DET] to 1. This workaround is required irrespective of whether Vaux is supplied to the link partner or not. Signed-off-by: Richard Zhu [mani: subject and description rewording] Signed-off-by: Manivannan Sadhasivam Reviewed-by: Frank Li Reviewed-by: Manivannan Sadhasivam Link: https://patch.msgid.link/20250416081314.3929794-5-hongxing.zhu@nxp.com Signed-off-by: Sasha Levin --- drivers/pci/controller/dwc/pci-imx6.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller/dwc/pci-imx6.c index ad3028b755d16..3b24fed3177de 100644 --- a/drivers/pci/controller/dwc/pci-imx6.c +++ b/drivers/pci/controller/dwc/pci-imx6.c @@ -48,6 +48,8 @@ #define IMX95_PCIE_SS_RW_REG_0 0xf0 #define IMX95_PCIE_REF_CLKEN BIT(23) #define IMX95_PCIE_PHY_CR_PARA_SEL BIT(9) +#define IMX95_PCIE_SS_RW_REG_1 0xf4 +#define IMX95_PCIE_SYS_AUX_PWR_DET BIT(31) #define IMX95_PE0_GEN_CTRL_1 0x1050 #define IMX95_PCIE_DEVICE_TYPE GENMASK(3, 0) @@ -206,6 +208,19 @@ static unsigned int imx_pcie_grp_offset(const struct imx_pcie *imx_pcie) static int imx95_pcie_init_phy(struct imx_pcie *imx_pcie) { + /* + * ERR051624: The Controller Without Vaux Cannot Exit L23 Ready + * Through Beacon or PERST# De-assertion + * + * When the auxiliary power is not available, the controller + * cannot exit from L23 Ready with beacon or PERST# de-assertion + * when main power is not removed. + * + * Workaround: Set SS_RW_REG_1[SYS_AUX_PWR_DET] to 1. + */ + regmap_set_bits(imx_pcie->iomuxc_gpr, IMX95_PCIE_SS_RW_REG_1, + IMX95_PCIE_SYS_AUX_PWR_DET); + regmap_update_bits(imx_pcie->iomuxc_gpr, IMX95_PCIE_SS_RW_REG_0, IMX95_PCIE_PHY_CR_PARA_SEL, -- GitLab From 7b86ce16706b985e27fe589675f1dee1708032c8 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Wed, 28 May 2025 08:45:34 +0200 Subject: [PATCH 1666/2211] nvme-tcp: fix I/O stalls on congested sockets [ Upstream commit f42d4796ee100fade86086d1cf98537fb4d326c8 ] When the socket is busy processing nvme_tcp_try_recv() might return -EAGAIN, but this doesn't automatically imply that the sending side is blocked, too. So check if there are pending requests once nvme_tcp_try_recv() returns -EAGAIN and continue with the sending loop to avoid I/O stalls. Signed-off-by: Hannes Reinecke Acked-by: Chris Leech Reviewed-by: Sagi Grimberg Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/host/tcp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 4cc72be28c731..13ede6e309092 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -1349,7 +1349,7 @@ static int nvme_tcp_try_recv(struct nvme_tcp_queue *queue) queue->nr_cqe = 0; consumed = sock->ops->read_sock(sk, &rd_desc, nvme_tcp_recv_skb); release_sock(sk); - return consumed; + return consumed == -EAGAIN ? 0 : consumed; } static void nvme_tcp_io_work(struct work_struct *w) @@ -1377,6 +1377,11 @@ static void nvme_tcp_io_work(struct work_struct *w) else if (unlikely(result < 0)) return; + /* did we get some space after spending time in recv? */ + if (nvme_tcp_queue_has_pending(queue) && + sk_stream_is_writeable(queue->sock->sk)) + pending = true; + if (!pending || !queue->rd_enabled) return; -- GitLab From 78a4adcd3fedb0728436e8094848ebf4c6bae006 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Wed, 28 May 2025 08:45:33 +0200 Subject: [PATCH 1667/2211] nvme-tcp: sanitize request list handling [ Upstream commit 0bf04c874fcb1ae46a863034296e4b33d8fbd66c ] Validate the request in nvme_tcp_handle_r2t() to ensure it's not part of any list, otherwise a malicious R2T PDU might inject a loop in request list processing. Signed-off-by: Hannes Reinecke Reviewed-by: Sagi Grimberg Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/host/tcp.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 13ede6e309092..25e486e6e8054 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -453,7 +453,8 @@ nvme_tcp_fetch_request(struct nvme_tcp_queue *queue) return NULL; } - list_del(&req->entry); + list_del_init(&req->entry); + init_llist_node(&req->lentry); return req; } @@ -561,6 +562,8 @@ static int nvme_tcp_init_request(struct blk_mq_tag_set *set, req->queue = queue; nvme_req(rq)->ctrl = &ctrl->ctrl; nvme_req(rq)->cmd = &pdu->cmd; + init_llist_node(&req->lentry); + INIT_LIST_HEAD(&req->entry); return 0; } @@ -765,6 +768,14 @@ static int nvme_tcp_handle_r2t(struct nvme_tcp_queue *queue, return -EPROTO; } + if (llist_on_list(&req->lentry) || + !list_empty(&req->entry)) { + dev_err(queue->ctrl->ctrl.device, + "req %d unexpected r2t while processing request\n", + rq->tag); + return -EPROTO; + } + req->pdu_len = 0; req->h2cdata_left = r2t_length; req->h2cdata_offset = r2t_offset; @@ -2599,6 +2610,8 @@ static void nvme_tcp_submit_async_event(struct nvme_ctrl *arg) ctrl->async_req.offset = 0; ctrl->async_req.curr_bio = NULL; ctrl->async_req.data_len = 0; + init_llist_node(&ctrl->async_req.lentry); + INIT_LIST_HEAD(&ctrl->async_req.entry); nvme_tcp_queue_request(&ctrl->async_req, true, true); } -- GitLab From 3b611834b9386de52bc1036c19077a06816b1a92 Mon Sep 17 00:00:00 2001 From: Yu Kuai Date: Sat, 24 May 2025 14:13:10 +0800 Subject: [PATCH 1668/2211] md/md-bitmap: fix dm-raid max_write_behind setting [ Upstream commit 2afe17794cfed5f80295b1b9facd66e6f65e5002 ] It's supposed to be COUNTER_MAX / 2, not COUNTER_MAX. Link: https://lore.kernel.org/linux-raid/20250524061320.370630-14-yukuai1@huaweicloud.com Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Signed-off-by: Sasha Levin --- drivers/md/md-bitmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index fbb4f57010da6..c12359fd3a420 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -787,7 +787,7 @@ static int md_bitmap_new_disk_sb(struct bitmap *bitmap) * is a good choice? We choose COUNTER_MAX / 2 arbitrarily. */ write_behind = bitmap->mddev->bitmap_info.max_write_behind; - if (write_behind > COUNTER_MAX) + if (write_behind > COUNTER_MAX / 2) write_behind = COUNTER_MAX / 2; sb->write_behind = cpu_to_le32(write_behind); bitmap->mddev->bitmap_info.max_write_behind = write_behind; -- GitLab From 861204dce6ed0ff2ac1c1225129c11afe38aacfd Mon Sep 17 00:00:00 2001 From: Yifan Zhang Date: Wed, 21 May 2025 18:06:28 +0800 Subject: [PATCH 1669/2211] amd/amdkfd: fix a kfd_process ref leak [ Upstream commit 90237b16ec1d7afa16e2173cc9a664377214cdd9 ] This patch is to fix a kfd_prcess ref leak. Signed-off-by: Yifan Zhang Reviewed-by: Philip Yang Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdkfd/kfd_events.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_events.c index ea37922492093..6798510c4a707 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c @@ -1315,6 +1315,7 @@ void kfd_signal_poison_consumed_event(struct kfd_node *dev, u32 pasid) user_gpu_id = kfd_process_get_user_gpu_id(p, dev->id); if (unlikely(user_gpu_id == -EINVAL)) { WARN_ONCE(1, "Could not get user_gpu_id from dev->id:%x\n", dev->id); + kfd_unref_process(p); return; } -- GitLab From 667c3f52373ff5354cb3543e27237eb7df7b2333 Mon Sep 17 00:00:00 2001 From: Linggang Zeng Date: Tue, 27 May 2025 13:15:59 +0800 Subject: [PATCH 1670/2211] bcache: fix NULL pointer in cache_set_flush() [ Upstream commit 1e46ed947ec658f89f1a910d880cd05e42d3763e ] 1. LINE#1794 - LINE#1887 is some codes about function of bch_cache_set_alloc(). 2. LINE#2078 - LINE#2142 is some codes about function of register_cache_set(). 3. register_cache_set() will call bch_cache_set_alloc() in LINE#2098. 1794 struct cache_set *bch_cache_set_alloc(struct cache_sb *sb) 1795 { ... 1860 if (!(c->devices = kcalloc(c->nr_uuids, sizeof(void *), GFP_KERNEL)) || 1861 mempool_init_slab_pool(&c->search, 32, bch_search_cache) || 1862 mempool_init_kmalloc_pool(&c->bio_meta, 2, 1863 sizeof(struct bbio) + sizeof(struct bio_vec) * 1864 bucket_pages(c)) || 1865 mempool_init_kmalloc_pool(&c->fill_iter, 1, iter_size) || 1866 bioset_init(&c->bio_split, 4, offsetof(struct bbio, bio), 1867 BIOSET_NEED_BVECS|BIOSET_NEED_RESCUER) || 1868 !(c->uuids = alloc_bucket_pages(GFP_KERNEL, c)) || 1869 !(c->moving_gc_wq = alloc_workqueue("bcache_gc", 1870 WQ_MEM_RECLAIM, 0)) || 1871 bch_journal_alloc(c) || 1872 bch_btree_cache_alloc(c) || 1873 bch_open_buckets_alloc(c) || 1874 bch_bset_sort_state_init(&c->sort, ilog2(c->btree_pages))) 1875 goto err; ^^^^^^^^ 1876 ... 1883 return c; 1884 err: 1885 bch_cache_set_unregister(c); ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1886 return NULL; 1887 } ... 2078 static const char *register_cache_set(struct cache *ca) 2079 { ... 2098 c = bch_cache_set_alloc(&ca->sb); 2099 if (!c) 2100 return err; ^^^^^^^^^^ ... 2128 ca->set = c; 2129 ca->set->cache[ca->sb.nr_this_dev] = ca; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ... 2138 return NULL; 2139 err: 2140 bch_cache_set_unregister(c); 2141 return err; 2142 } (1) If LINE#1860 - LINE#1874 is true, then do 'goto err'(LINE#1875) and call bch_cache_set_unregister()(LINE#1885). (2) As (1) return NULL(LINE#1886), LINE#2098 - LINE#2100 would return. (3) As (2) has returned, LINE#2128 - LINE#2129 would do *not* give the value to c->cache[], it means that c->cache[] is NULL. LINE#1624 - LINE#1665 is some codes about function of cache_set_flush(). As (1), in LINE#1885 call bch_cache_set_unregister() ---> bch_cache_set_stop() ---> closure_queue() -.-> cache_set_flush() (as below LINE#1624) 1624 static void cache_set_flush(struct closure *cl) 1625 { ... 1654 for_each_cache(ca, c, i) 1655 if (ca->alloc_thread) ^^ 1656 kthread_stop(ca->alloc_thread); ... 1665 } (4) In LINE#1655 ca is NULL(see (3)) in cache_set_flush() then the kernel crash occurred as below: [ 846.712887] bcache: register_cache() error drbd6: cannot allocate memory [ 846.713242] bcache: register_bcache() error : failed to register device [ 846.713336] bcache: cache_set_free() Cache set 2f84bdc1-498a-4f2f-98a7-01946bf54287 unregistered [ 846.713768] BUG: unable to handle kernel NULL pointer dereference at 00000000000009f8 [ 846.714790] PGD 0 P4D 0 [ 846.715129] Oops: 0000 [#1] SMP PTI [ 846.715472] CPU: 19 PID: 5057 Comm: kworker/19:16 Kdump: loaded Tainted: G OE --------- - - 4.18.0-147.5.1.el8_1.5es.3.x86_64 #1 [ 846.716082] Hardware name: ESPAN GI-25212/X11DPL-i, BIOS 2.1 06/15/2018 [ 846.716451] Workqueue: events cache_set_flush [bcache] [ 846.716808] RIP: 0010:cache_set_flush+0xc9/0x1b0 [bcache] [ 846.717155] Code: 00 4c 89 a5 b0 03 00 00 48 8b 85 68 f6 ff ff a8 08 0f 84 88 00 00 00 31 db 66 83 bd 3c f7 ff ff 00 48 8b 85 48 ff ff ff 74 28 <48> 8b b8 f8 09 00 00 48 85 ff 74 05 e8 b6 58 a2 e1 0f b7 95 3c f7 [ 846.718026] RSP: 0018:ffffb56dcf85fe70 EFLAGS: 00010202 [ 846.718372] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000 [ 846.718725] RDX: 0000000000000001 RSI: 0000000040000001 RDI: 0000000000000000 [ 846.719076] RBP: ffffa0ccc0f20df8 R08: ffffa0ce1fedb118 R09: 000073746e657665 [ 846.719428] R10: 8080808080808080 R11: 0000000000000000 R12: ffffa0ce1fee8700 [ 846.719779] R13: ffffa0ccc0f211a8 R14: ffffa0cd1b902840 R15: ffffa0ccc0f20e00 [ 846.720132] FS: 0000000000000000(0000) GS:ffffa0ce1fec0000(0000) knlGS:0000000000000000 [ 846.720726] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 846.721073] CR2: 00000000000009f8 CR3: 00000008ba00a005 CR4: 00000000007606e0 [ 846.721426] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 846.721778] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 846.722131] PKRU: 55555554 [ 846.722467] Call Trace: [ 846.722814] process_one_work+0x1a7/0x3b0 [ 846.723157] worker_thread+0x30/0x390 [ 846.723501] ? create_worker+0x1a0/0x1a0 [ 846.723844] kthread+0x112/0x130 [ 846.724184] ? kthread_flush_work_fn+0x10/0x10 [ 846.724535] ret_from_fork+0x35/0x40 Now, check whether that ca is NULL in LINE#1655 to fix the issue. Signed-off-by: Linggang Zeng Signed-off-by: Mingzhe Zou Signed-off-by: Coly Li Link: https://lore.kernel.org/r/20250527051601.74407-2-colyli@kernel.org Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/md/bcache/super.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index e42f1400cea9d..f5171167819b5 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -1733,7 +1733,12 @@ static CLOSURE_CALLBACK(cache_set_flush) mutex_unlock(&b->write_lock); } - if (ca->alloc_thread) + /* + * If the register_cache_set() call to bch_cache_set_alloc() failed, + * ca has not been assigned a value and return error. + * So we need check ca is not NULL during bch_cache_set_unregister(). + */ + if (ca && ca->alloc_thread) kthread_stop(ca->alloc_thread); if (c->journal.cur) { -- GitLab From 777580609d57861b8db3860c74142735d4c611e4 Mon Sep 17 00:00:00 2001 From: Philip Yang Date: Wed, 14 May 2025 11:13:52 -0400 Subject: [PATCH 1671/2211] drm/amdgpu: seq64 memory unmap uses uninterruptible lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit a359288ccb4dd8edb086e7de8fdf6e36f544c922 ] To unmap and free seq64 memory when drm node close to free vm, if there is signal accepted, then taking vm lock failed and leaking seq64 va mapping, and then dmesg has error log "still active bo inside vm". Change to use uninterruptible lock fix the mapping leaking and no dmesg error log. Signed-off-by: Philip Yang Reviewed-by: Christian König Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c index e22cb2b5cd926..dba8051b8c14b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c @@ -133,7 +133,7 @@ void amdgpu_seq64_unmap(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv) vm = &fpriv->vm; - drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT, 0); + drm_exec_init(&exec, 0, 0); drm_exec_until_all_locked(&exec) { r = amdgpu_vm_lock_pd(vm, &exec, 0); if (likely(!r)) -- GitLab From aefd0a935625165a6ca36d0258d2d053901555df Mon Sep 17 00:00:00 2001 From: "Lin.Cao" Date: Thu, 15 May 2025 10:07:13 +0800 Subject: [PATCH 1672/2211] drm/scheduler: signal scheduled fence when kill job MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 471db2c2d4f80ee94225a1ef246e4f5011733e50 ] When an entity from application B is killed, drm_sched_entity_kill() removes all jobs belonging to that entity through drm_sched_entity_kill_jobs_work(). If application A's job depends on a scheduled fence from application B's job, and that fence is not properly signaled during the killing process, application A's dependency cannot be cleared. This leads to application A hanging indefinitely while waiting for a dependency that will never be resolved. Fix this issue by ensuring that scheduled fences are properly signaled when an entity is killed, allowing dependent applications to continue execution. Signed-off-by: Lin.Cao Reviewed-by: Philipp Stanner Signed-off-by: Christian König Link: https://lore.kernel.org/r/20250515020713.1110476-1-lincao12@amd.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/scheduler/sched_entity.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/scheduler/sched_entity.c b/drivers/gpu/drm/scheduler/sched_entity.c index 002057be0d84a..c9c50e3b18a23 100644 --- a/drivers/gpu/drm/scheduler/sched_entity.c +++ b/drivers/gpu/drm/scheduler/sched_entity.c @@ -189,6 +189,7 @@ static void drm_sched_entity_kill_jobs_work(struct work_struct *wrk) { struct drm_sched_job *job = container_of(wrk, typeof(*job), work); + drm_sched_fence_scheduled(job->s_fence, NULL); drm_sched_fence_finished(job->s_fence, -ESRCH); WARN_ON(job->s_fence->parent); job->sched->ops->free_job(job); -- GitLab From 6795442e6ae570fbb246bc9989a5e2faaff86b63 Mon Sep 17 00:00:00 2001 From: Jonathan Cameron Date: Sun, 13 Apr 2025 11:34:41 +0100 Subject: [PATCH 1673/2211] iio: pressure: zpa2326: Use aligned_s64 for the timestamp [ Upstream commit 886a446b76afddfad307488e95e87f23a08ffd51 ] On x86_32 s64 fields are only 32-bit aligned. Hence force the alignment of the field and padding in the structure by using aligned_s64 instead. Reviewed-by: David Lechner Link: https://patch.msgid.link/20250413103443.2420727-19-jic23@kernel.org Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/pressure/zpa2326.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/iio/pressure/zpa2326.c b/drivers/iio/pressure/zpa2326.c index b4c6c7c472569..8fae58db1d639 100644 --- a/drivers/iio/pressure/zpa2326.c +++ b/drivers/iio/pressure/zpa2326.c @@ -582,7 +582,7 @@ static int zpa2326_fill_sample_buffer(struct iio_dev *indio_dev, struct { u32 pressure; u16 temperature; - u64 timestamp; + aligned_s64 timestamp; } sample; int err; -- GitLab From 4f95f49d2bd02f4e4c2e97d4793ee83d0a5a3831 Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Wed, 26 Mar 2025 19:05:00 +0000 Subject: [PATCH 1674/2211] um: Add cmpxchg8b_emu and checksum functions to asm-prototypes.h [ Upstream commit 674d03f6bd6b0f8327f1a4920ff5893557facfbd ] With CONFIG_GENDWARFKSYMS, um builds fail due to missing prototypes in asm/asm-prototypes.h. Add declarations for cmpxchg8b_emu and the exported checksum functions, including csum_partial_copy_generic as it's also exported. Cc: Masahiro Yamada Cc: linux-kbuild@vger.kernel.org Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202503251216.lE4t9Ikj-lkp@intel.com/ Signed-off-by: Sami Tolvanen Link: https://patch.msgid.link/20250326190500.847236-2-samitolvanen@google.com Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- arch/um/include/asm/asm-prototypes.h | 5 +++++ arch/x86/um/asm/checksum.h | 3 +++ 2 files changed, 8 insertions(+) diff --git a/arch/um/include/asm/asm-prototypes.h b/arch/um/include/asm/asm-prototypes.h index 5898a26daa0dd..408b31d591279 100644 --- a/arch/um/include/asm/asm-prototypes.h +++ b/arch/um/include/asm/asm-prototypes.h @@ -1 +1,6 @@ #include +#include + +#ifdef CONFIG_UML_X86 +extern void cmpxchg8b_emu(void); +#endif diff --git a/arch/x86/um/asm/checksum.h b/arch/x86/um/asm/checksum.h index b07824500363f..ddc144657efad 100644 --- a/arch/x86/um/asm/checksum.h +++ b/arch/x86/um/asm/checksum.h @@ -20,6 +20,9 @@ */ extern __wsum csum_partial(const void *buff, int len, __wsum sum); +/* Do not call this directly. Declared for export type visibility. */ +extern __visible __wsum csum_partial_copy_generic(const void *src, void *dst, int len); + /** * csum_fold - Fold and invert a 32bit checksum. * sum: 32bit unfolded sum -- GitLab From cf6d532de4423183952b178bac1e08e9641c844f Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Tue, 8 Apr 2025 09:45:24 +0200 Subject: [PATCH 1675/2211] um: use proper care when taking mmap lock during segfault [ Upstream commit 6767e8784cd2e8b386a62330ea6864949d983a3e ] Segfaults can occur at times where the mmap lock cannot be taken. If that happens the segfault handler may not be able to take the mmap lock. Fix the code to use the same approach as most other architectures. Unfortunately, this requires copying code from mm/memory.c and modifying it slightly as UML does not have exception tables. Signed-off-by: Benjamin Berg Link: https://patch.msgid.link/20250408074524.300153-2-benjamin@sipsolutions.net Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- arch/um/kernel/trap.c | 129 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 117 insertions(+), 12 deletions(-) diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c index 97c8df9c44017..9077bdb26cc35 100644 --- a/arch/um/kernel/trap.c +++ b/arch/um/kernel/trap.c @@ -17,6 +17,122 @@ #include #include +/* + * NOTE: UML does not have exception tables. As such, this is almost a copy + * of the code in mm/memory.c, only adjusting the logic to simply check whether + * we are coming from the kernel instead of doing an additional lookup in the + * exception table. + * We can do this simplification because we never get here if the exception was + * fixable. + */ +static inline bool get_mmap_lock_carefully(struct mm_struct *mm, bool is_user) +{ + if (likely(mmap_read_trylock(mm))) + return true; + + if (!is_user) + return false; + + return !mmap_read_lock_killable(mm); +} + +static inline bool mmap_upgrade_trylock(struct mm_struct *mm) +{ + /* + * We don't have this operation yet. + * + * It should be easy enough to do: it's basically a + * atomic_long_try_cmpxchg_acquire() + * from RWSEM_READER_BIAS -> RWSEM_WRITER_LOCKED, but + * it also needs the proper lockdep magic etc. + */ + return false; +} + +static inline bool upgrade_mmap_lock_carefully(struct mm_struct *mm, bool is_user) +{ + mmap_read_unlock(mm); + if (!is_user) + return false; + + return !mmap_write_lock_killable(mm); +} + +/* + * Helper for page fault handling. + * + * This is kind of equivalend to "mmap_read_lock()" followed + * by "find_extend_vma()", except it's a lot more careful about + * the locking (and will drop the lock on failure). + * + * For example, if we have a kernel bug that causes a page + * fault, we don't want to just use mmap_read_lock() to get + * the mm lock, because that would deadlock if the bug were + * to happen while we're holding the mm lock for writing. + * + * So this checks the exception tables on kernel faults in + * order to only do this all for instructions that are actually + * expected to fault. + * + * We can also actually take the mm lock for writing if we + * need to extend the vma, which helps the VM layer a lot. + */ +static struct vm_area_struct * +um_lock_mm_and_find_vma(struct mm_struct *mm, + unsigned long addr, bool is_user) +{ + struct vm_area_struct *vma; + + if (!get_mmap_lock_carefully(mm, is_user)) + return NULL; + + vma = find_vma(mm, addr); + if (likely(vma && (vma->vm_start <= addr))) + return vma; + + /* + * Well, dang. We might still be successful, but only + * if we can extend a vma to do so. + */ + if (!vma || !(vma->vm_flags & VM_GROWSDOWN)) { + mmap_read_unlock(mm); + return NULL; + } + + /* + * We can try to upgrade the mmap lock atomically, + * in which case we can continue to use the vma + * we already looked up. + * + * Otherwise we'll have to drop the mmap lock and + * re-take it, and also look up the vma again, + * re-checking it. + */ + if (!mmap_upgrade_trylock(mm)) { + if (!upgrade_mmap_lock_carefully(mm, is_user)) + return NULL; + + vma = find_vma(mm, addr); + if (!vma) + goto fail; + if (vma->vm_start <= addr) + goto success; + if (!(vma->vm_flags & VM_GROWSDOWN)) + goto fail; + } + + if (expand_stack_locked(vma, addr)) + goto fail; + +success: + mmap_write_downgrade(mm); + return vma; + +fail: + mmap_write_unlock(mm); + return NULL; +} + /* * Note this is constrained to return 0, -EFAULT, -EACCES, -ENOMEM by * segv(). @@ -43,21 +159,10 @@ int handle_page_fault(unsigned long address, unsigned long ip, if (is_user) flags |= FAULT_FLAG_USER; retry: - mmap_read_lock(mm); - vma = find_vma(mm, address); - if (!vma) - goto out; - if (vma->vm_start <= address) - goto good_area; - if (!(vma->vm_flags & VM_GROWSDOWN)) - goto out; - if (is_user && !ARCH_IS_STACKGROW(address)) - goto out; - vma = expand_stack(mm, address); + vma = um_lock_mm_and_find_vma(mm, address, is_user); if (!vma) goto out_nosemaphore; -good_area: *code_out = SEGV_ACCERR; if (is_write) { if (!(vma->vm_flags & VM_WRITE)) -- GitLab From a0baf4d78b2bed782b5851751d80e9ad21a52372 Mon Sep 17 00:00:00 2001 From: Rengarajan S Date: Fri, 25 Apr 2025 20:25:00 +0530 Subject: [PATCH 1676/2211] 8250: microchip: pci1xxxx: Add PCIe Hot reset disable support for Rev C0 and later devices [ Upstream commit c40b91e38eb8d4489def095d62ab476d45871323 ] Systems that issue PCIe hot reset requests during a suspend/resume cycle cause PCI1XXXX device revisions prior to C0 to get its UART configuration registers reset to hardware default values. This results in device inaccessibility and data transfer failures. Starting with Revision C0, support was added in the device hardware (via the Hot Reset Disable Bit) to allow resetting only the PCIe interface and its associated logic, but preserving the UART configuration during a hot reset. This patch enables the hot reset disable feature during suspend/ resume for C0 and later revisions of the device. Signed-off-by: Rengarajan S Reviewed-by: Jiri Slaby Link: https://lore.kernel.org/r/20250425145500.29036-1-rengarajan.s@microchip.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/tty/serial/8250/8250_pci1xxxx.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/tty/serial/8250/8250_pci1xxxx.c b/drivers/tty/serial/8250/8250_pci1xxxx.c index f462b3d1c104c..d6b01e015a96b 100644 --- a/drivers/tty/serial/8250/8250_pci1xxxx.c +++ b/drivers/tty/serial/8250/8250_pci1xxxx.c @@ -115,6 +115,7 @@ #define UART_RESET_REG 0x94 #define UART_RESET_D3_RESET_DISABLE BIT(16) +#define UART_RESET_HOT_RESET_DISABLE BIT(17) #define UART_BURST_STATUS_REG 0x9C #define UART_TX_BURST_FIFO 0xA0 @@ -620,6 +621,10 @@ static int pci1xxxx_suspend(struct device *dev) } data = readl(p + UART_RESET_REG); + + if (priv->dev_rev >= 0xC0) + data |= UART_RESET_HOT_RESET_DISABLE; + writel(data | UART_RESET_D3_RESET_DISABLE, p + UART_RESET_REG); if (wakeup) @@ -647,7 +652,12 @@ static int pci1xxxx_resume(struct device *dev) } data = readl(p + UART_RESET_REG); + + if (priv->dev_rev >= 0xC0) + data &= ~UART_RESET_HOT_RESET_DISABLE; + writel(data & ~UART_RESET_D3_RESET_DISABLE, p + UART_RESET_REG); + iounmap(p); for (i = 0; i < priv->nr; i++) { -- GitLab From c7bfbba30fd1092a57ff6d15911c6e062d864083 Mon Sep 17 00:00:00 2001 From: James Clark Date: Tue, 25 Mar 2025 11:58:47 +0000 Subject: [PATCH 1677/2211] coresight: Only check bottom two claim bits [ Upstream commit a4e65842e1142aa18ef36113fbd81d614eaefe5a ] The use of the whole register and == could break the claim mechanism if any of the other bits are used in the future. The referenced doc "PSCI - ARM DEN 0022D" also says to only read and clear the bottom two bits. Use FIELD_GET() to extract only the relevant part. Reviewed-by: Leo Yan Reviewed-by: Yeoreum Yun Signed-off-by: James Clark Signed-off-by: Suzuki K Poulose Link: https://lore.kernel.org/r/20250325-james-coresight-claim-tags-v4-2-dfbd3822b2e5@linaro.org Signed-off-by: Sasha Levin --- drivers/hwtracing/coresight/coresight-core.c | 3 ++- drivers/hwtracing/coresight/coresight-priv.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c index c7e35a431ab00..b7941d8abbfe7 100644 --- a/drivers/hwtracing/coresight/coresight-core.c +++ b/drivers/hwtracing/coresight/coresight-core.c @@ -97,7 +97,8 @@ coresight_find_out_connection(struct coresight_device *src_dev, static inline u32 coresight_read_claim_tags(struct coresight_device *csdev) { - return csdev_access_relaxed_read32(&csdev->access, CORESIGHT_CLAIMCLR); + return FIELD_GET(CORESIGHT_CLAIM_MASK, + csdev_access_relaxed_read32(&csdev->access, CORESIGHT_CLAIMCLR)); } static inline bool coresight_is_claimed_self_hosted(struct coresight_device *csdev) diff --git a/drivers/hwtracing/coresight/coresight-priv.h b/drivers/hwtracing/coresight/coresight-priv.h index 05f891ca6b5c9..cc7ff1e36ef42 100644 --- a/drivers/hwtracing/coresight/coresight-priv.h +++ b/drivers/hwtracing/coresight/coresight-priv.h @@ -35,6 +35,7 @@ extern const struct device_type coresight_dev_type[]; * Coresight device CLAIM protocol. * See PSCI - ARM DEN 0022D, Section: 6.8.1 Debug and Trace save and restore. */ +#define CORESIGHT_CLAIM_MASK GENMASK(1, 0) #define CORESIGHT_CLAIM_SELF_HOSTED BIT(1) #define TIMEOUT_US 100 -- GitLab From ba78c2b3254c4a458c01776612e8a573e12f8d26 Mon Sep 17 00:00:00 2001 From: Michael Grzeschik Date: Thu, 17 Apr 2025 19:40:17 +0200 Subject: [PATCH 1678/2211] usb: dwc2: also exit clock_gating when stopping udc while suspended [ Upstream commit af076a41f8a28faf9ceb9dd2d88aef2c202ef39a ] It is possible that the gadget will be disabled, while the udc is suspended. When enabling the udc in that case, the clock gating will not be enabled again. Leaving the phy unclocked. Even when the udc is not enabled, connecting this powered but not clocked phy leads to enumeration errors on the host side. To ensure that the clock gating will be in an valid state, we ensure that the clock gating will be enabled before stopping the udc. Signed-off-by: Michael Grzeschik Acked-by: Minas Harutyunyan Link: https://lore.kernel.org/r/20250417-dwc2_clock_gating-v1-1-8ea7c4d53d73@pengutronix.de Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/dwc2/gadget.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index bd4c788f03bc1..d3d0d75ab1f59 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c @@ -4604,6 +4604,12 @@ static int dwc2_hsotg_udc_stop(struct usb_gadget *gadget) if (!hsotg) return -ENODEV; + /* Exit clock gating when driver is stopped. */ + if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_NONE && + hsotg->bus_suspended && !hsotg->params.no_clock_gating) { + dwc2_gadget_exit_clock_gating(hsotg, 0); + } + /* all endpoints should be shutdown */ for (ep = 1; ep < hsotg->num_of_eps; ep++) { if (hsotg->eps_in[ep]) -- GitLab From 71f79ec25a5a4ef118dc977a607860514aff7e03 Mon Sep 17 00:00:00 2001 From: Purva Yeshi Date: Thu, 10 Apr 2025 22:34:08 +0530 Subject: [PATCH 1679/2211] iio: adc: ad_sigma_delta: Fix use of uninitialized status_pos [ Upstream commit e5cdb098a3cb165d52282ffc3a6448642953ea13 ] Fix Smatch-detected issue: drivers/iio/adc/ad_sigma_delta.c:604 ad_sd_trigger_handler() error: uninitialized symbol 'status_pos'. The variable `status_pos` was only initialized in specific switch cases (1, 2, 3, 4), which could leave it uninitialized if `reg_size` had an unexpected value. Fix by adding a default case to the switch block to catch unexpected values of `reg_size`. Use `dev_err_ratelimited()` for error logging and `goto irq_handled` instead of returning early. Signed-off-by: Purva Yeshi Link: https://patch.msgid.link/20250410170408.8585-1-purvayeshi550@gmail.com Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/adc/ad_sigma_delta.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c index ea4aabd3960a0..3df1d4f6bc959 100644 --- a/drivers/iio/adc/ad_sigma_delta.c +++ b/drivers/iio/adc/ad_sigma_delta.c @@ -477,6 +477,10 @@ static irqreturn_t ad_sd_trigger_handler(int irq, void *p) * byte set to zero. */ ad_sd_read_reg_raw(sigma_delta, data_reg, transfer_size, &data[1]); break; + + default: + dev_err_ratelimited(&indio_dev->dev, "Unsupported reg_size: %u\n", reg_size); + goto irq_handled; } /* -- GitLab From a10c8bff454b11ef553d9df19ee722d2df34cd0e Mon Sep 17 00:00:00 2001 From: Chenyuan Yang Date: Mon, 10 Mar 2025 20:05:11 -0500 Subject: [PATCH 1680/2211] misc: tps6594-pfsm: Add NULL pointer check in tps6594_pfsm_probe() [ Upstream commit a99b598d836c9c6411110c70a2da134c78d96e67 ] The returned value, pfsm->miscdev.name, from devm_kasprintf() could be NULL. A pointer check is added to prevent potential NULL pointer dereference. This is similar to the fix in commit 3027e7b15b02 ("ice: Fix some null pointer dereference issues in ice_ptp.c"). This issue is found by our static analysis tool. Signed-off-by: Chenyuan Yang Link: https://lore.kernel.org/r/20250311010511.1028269-1-chenyuan0y@gmail.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/misc/tps6594-pfsm.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/misc/tps6594-pfsm.c b/drivers/misc/tps6594-pfsm.c index 9bcca1856bfee..db3d6a21a2122 100644 --- a/drivers/misc/tps6594-pfsm.c +++ b/drivers/misc/tps6594-pfsm.c @@ -281,6 +281,9 @@ static int tps6594_pfsm_probe(struct platform_device *pdev) pfsm->miscdev.minor = MISC_DYNAMIC_MINOR; pfsm->miscdev.name = devm_kasprintf(dev, GFP_KERNEL, "pfsm-%ld-0x%02x", tps->chip_id, tps->reg); + if (!pfsm->miscdev.name) + return -ENOMEM; + pfsm->miscdev.fops = &tps6594_pfsm_fops; pfsm->miscdev.parent = dev->parent; pfsm->chip_id = tps->chip_id; -- GitLab From 358d5ba08f1609c34a054aed88c431844d09705a Mon Sep 17 00:00:00 2001 From: Chen Yufeng Date: Tue, 15 Apr 2025 14:58:57 +0800 Subject: [PATCH 1681/2211] usb: potential integer overflow in usbg_make_tpg() [ Upstream commit 153874010354d050f62f8ae25cbb960c17633dc5 ] The variable tpgt in usbg_make_tpg() is defined as unsigned long and is assigned to tpgt->tport_tpgt, which is defined as u16. This may cause an integer overflow when tpgt is greater than USHRT_MAX (65535). I haven't tried to trigger it myself, but it is possible to trigger it by calling usbg_make_tpg() with a large value for tpgt. I modified the type of tpgt to match tpgt->tport_tpgt and adjusted the relevant code accordingly. This patch is similar to commit 59c816c1f24d ("vhost/scsi: potential memory corruption"). Signed-off-by: Chen Yufeng Link: https://lore.kernel.org/r/20250415065857.1619-1-chenyufeng@iie.ac.cn Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/gadget/function/f_tcm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c index 7b23631f47449..6ad205046032c 100644 --- a/drivers/usb/gadget/function/f_tcm.c +++ b/drivers/usb/gadget/function/f_tcm.c @@ -1297,14 +1297,14 @@ static struct se_portal_group *usbg_make_tpg(struct se_wwn *wwn, struct usbg_tport *tport = container_of(wwn, struct usbg_tport, tport_wwn); struct usbg_tpg *tpg; - unsigned long tpgt; + u16 tpgt; int ret; struct f_tcm_opts *opts; unsigned i; if (strstr(name, "tpgt_") != name) return ERR_PTR(-EINVAL); - if (kstrtoul(name + 5, 0, &tpgt) || tpgt > UINT_MAX) + if (kstrtou16(name + 5, 0, &tpgt)) return ERR_PTR(-EINVAL); ret = -ENODEV; mutex_lock(&tpg_instances_lock); -- GitLab From 685d29f2c5057b32c7b1b46f2a7d303b926c8f72 Mon Sep 17 00:00:00 2001 From: Jakub Lewalski Date: Mon, 31 Mar 2025 18:06:19 +0200 Subject: [PATCH 1682/2211] tty: serial: uartlite: register uart driver in init [ Upstream commit 6bd697b5fc39fd24e2aa418c7b7d14469f550a93 ] When two instances of uart devices are probing, a concurrency race can occur. If one thread calls uart_register_driver function, which first allocates and assigns memory to 'uart_state' member of uart_driver structure, the other instance can bypass uart driver registration and call ulite_assign. This calls uart_add_one_port, which expects the uart driver to be fully initialized. This leads to a kernel panic due to a null pointer dereference: [ 8.143581] BUG: kernel NULL pointer dereference, address: 00000000000002b8 [ 8.156982] #PF: supervisor write access in kernel mode [ 8.156984] #PF: error_code(0x0002) - not-present page [ 8.156986] PGD 0 P4D 0 ... [ 8.180668] RIP: 0010:mutex_lock+0x19/0x30 [ 8.188624] Call Trace: [ 8.188629] ? __die_body.cold+0x1a/0x1f [ 8.195260] ? page_fault_oops+0x15c/0x290 [ 8.209183] ? __irq_resolve_mapping+0x47/0x80 [ 8.209187] ? exc_page_fault+0x64/0x140 [ 8.209190] ? asm_exc_page_fault+0x22/0x30 [ 8.209196] ? mutex_lock+0x19/0x30 [ 8.223116] uart_add_one_port+0x60/0x440 [ 8.223122] ? proc_tty_register_driver+0x43/0x50 [ 8.223126] ? tty_register_driver+0x1ca/0x1e0 [ 8.246250] ulite_probe+0x357/0x4b0 [uartlite] To prevent it, move uart driver registration in to init function. This will ensure that uart_driver is always registered when probe function is called. Signed-off-by: Jakub Lewalski Signed-off-by: Elodie Decerle Link: https://lore.kernel.org/r/20250331160732.2042-1-elodie.decerle@nokia.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/tty/serial/uartlite.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/drivers/tty/serial/uartlite.c b/drivers/tty/serial/uartlite.c index 68357ac8ffe3c..71890f3244a0f 100644 --- a/drivers/tty/serial/uartlite.c +++ b/drivers/tty/serial/uartlite.c @@ -880,16 +880,6 @@ of_err: pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); - if (!ulite_uart_driver.state) { - dev_dbg(&pdev->dev, "uartlite: calling uart_register_driver()\n"); - ret = uart_register_driver(&ulite_uart_driver); - if (ret < 0) { - dev_err(&pdev->dev, "Failed to register driver\n"); - clk_disable_unprepare(pdata->clk); - return ret; - } - } - ret = ulite_assign(&pdev->dev, id, res->start, irq, pdata); pm_runtime_mark_last_busy(&pdev->dev); @@ -929,16 +919,25 @@ static struct platform_driver ulite_platform_driver = { static int __init ulite_init(void) { + int ret; + + pr_debug("uartlite: calling uart_register_driver()\n"); + ret = uart_register_driver(&ulite_uart_driver); + if (ret) + return ret; pr_debug("uartlite: calling platform_driver_register()\n"); - return platform_driver_register(&ulite_platform_driver); + ret = platform_driver_register(&ulite_platform_driver); + if (ret) + uart_unregister_driver(&ulite_uart_driver); + + return ret; } static void __exit ulite_exit(void) { platform_driver_unregister(&ulite_platform_driver); - if (ulite_uart_driver.state) - uart_unregister_driver(&ulite_uart_driver); + uart_unregister_driver(&ulite_uart_driver); } module_init(ulite_init); -- GitLab From 4fb6703824793bcdddaf5b4efaa6cba16328878e Mon Sep 17 00:00:00 2001 From: Chance Yang Date: Fri, 11 Apr 2025 16:33:26 +0800 Subject: [PATCH 1683/2211] usb: common: usb-conn-gpio: use a unique name for usb connector device [ Upstream commit d4e5b10c55627e2f3fc9e5b337a28b4e2f02a55e ] The current implementation of the usb-conn-gpio driver uses a fixed "usb-charger" name for all USB connector devices. This causes conflicts in the power supply subsystem when multiple USB connectors are present, as duplicate names are not allowed. Use IDA to manage unique IDs for naming usb connectors (e.g., usb-charger-0, usb-charger-1). Signed-off-by: Chance Yang Link: https://lore.kernel.org/r/20250411-work-next-v3-1-7cd9aa80190c@kneron.us Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/common/usb-conn-gpio.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/usb/common/usb-conn-gpio.c b/drivers/usb/common/usb-conn-gpio.c index 501e8bc9738eb..1096a884c8d70 100644 --- a/drivers/usb/common/usb-conn-gpio.c +++ b/drivers/usb/common/usb-conn-gpio.c @@ -20,6 +20,9 @@ #include #include #include +#include + +static DEFINE_IDA(usb_conn_ida); #define USB_GPIO_DEB_MS 20 /* ms */ #define USB_GPIO_DEB_US ((USB_GPIO_DEB_MS) * 1000) /* us */ @@ -29,6 +32,7 @@ struct usb_conn_info { struct device *dev; + int conn_id; /* store the IDA-allocated ID */ struct usb_role_switch *role_sw; enum usb_role last_role; struct regulator *vbus; @@ -160,7 +164,17 @@ static int usb_conn_psy_register(struct usb_conn_info *info) .of_node = dev->of_node, }; - desc->name = "usb-charger"; + info->conn_id = ida_alloc(&usb_conn_ida, GFP_KERNEL); + if (info->conn_id < 0) + return info->conn_id; + + desc->name = devm_kasprintf(dev, GFP_KERNEL, "usb-charger-%d", + info->conn_id); + if (!desc->name) { + ida_free(&usb_conn_ida, info->conn_id); + return -ENOMEM; + } + desc->properties = usb_charger_properties; desc->num_properties = ARRAY_SIZE(usb_charger_properties); desc->get_property = usb_charger_get_property; @@ -168,8 +182,10 @@ static int usb_conn_psy_register(struct usb_conn_info *info) cfg.drv_data = info; info->charger = devm_power_supply_register(dev, desc, &cfg); - if (IS_ERR(info->charger)) - dev_err(dev, "Unable to register charger\n"); + if (IS_ERR(info->charger)) { + dev_err(dev, "Unable to register charger %d\n", info->conn_id); + ida_free(&usb_conn_ida, info->conn_id); + } return PTR_ERR_OR_ZERO(info->charger); } @@ -277,6 +293,9 @@ static void usb_conn_remove(struct platform_device *pdev) cancel_delayed_work_sync(&info->dw_det); + if (info->charger) + ida_free(&usb_conn_ida, info->conn_id); + if (info->last_role == USB_ROLE_HOST && info->vbus) regulator_disable(info->vbus); -- GitLab From 53809d38ec3648d0b3532dd46dbf042d2751f479 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Fri, 21 Mar 2025 18:49:49 +0200 Subject: [PATCH 1684/2211] usb: Add checks for snprintf() calls in usb_alloc_dev() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 82fe5107fa3d21d6c3fba091c9dbc50495588630 ] When creating a device path in the driver the snprintf() takes up to 16 characters long argument along with the additional up to 12 characters for the signed integer (as it can't see the actual limits) and tries to pack this into 16 bytes array. GCC complains about that when build with `make W=1`: drivers/usb/core/usb.c:705:25: note: ‘snprintf’ output between 3 and 28 bytes into a destination of size 16 Since everything works until now, let's just check for the potential buffer overflow and bail out. It is most likely a never happen situation, but at least it makes GCC happy. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20250321164949.423957-1-andriy.shevchenko@linux.intel.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/core/usb.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 0b4685aad2d50..118fa4c93a795 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -695,15 +695,16 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, device_set_of_node_from_dev(&dev->dev, bus->sysdev); dev_set_name(&dev->dev, "usb%d", bus->busnum); } else { + int n; + /* match any labeling on the hubs; it's one-based */ if (parent->devpath[0] == '0') { - snprintf(dev->devpath, sizeof dev->devpath, - "%d", port1); + n = snprintf(dev->devpath, sizeof(dev->devpath), "%d", port1); /* Root ports are not counted in route string */ dev->route = 0; } else { - snprintf(dev->devpath, sizeof dev->devpath, - "%s.%d", parent->devpath, port1); + n = snprintf(dev->devpath, sizeof(dev->devpath), "%s.%d", + parent->devpath, port1); /* Route string assumes hubs have less than 16 ports */ if (port1 < 15) dev->route = parent->route + @@ -712,6 +713,11 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, dev->route = parent->route + (15 << ((parent->level - 1)*4)); } + if (n >= sizeof(dev->devpath)) { + usb_put_hcd(bus_to_hcd(bus)); + usb_put_dev(dev); + return NULL; + } dev->dev.parent = &parent->dev; dev_set_name(&dev->dev, "%d-%s", bus->busnum, dev->devpath); -- GitLab From 43ea23645b16b41095939344f28f3c6077014c8a Mon Sep 17 00:00:00 2001 From: Robert Hodaszi Date: Thu, 3 Apr 2025 16:40:04 +0200 Subject: [PATCH 1685/2211] usb: cdc-wdm: avoid setting WDM_READ for ZLP-s [ Upstream commit 387602d8a75574fafb451b7a8215e78dfd67ee63 ] Don't set WDM_READ flag in wdm_in_callback() for ZLP-s, otherwise when userspace tries to poll for available data, it might - incorrectly - believe there is something available, and when it tries to non-blocking read it, it might get stuck in the read loop. For example this is what glib does for non-blocking read (briefly): 1. poll() 2. if poll returns with non-zero, starts a read data loop: a. loop on poll() (EINTR disabled) b. if revents was set, reads data I. if read returns with EINTR or EAGAIN, goto 2.a. II. otherwise return with data So if ZLP sets WDM_READ (#1), we expect data, and try to read it (#2). But as that was a ZLP, and we are doing non-blocking read, wdm_read() returns with EAGAIN (#2.b.I), so loop again, and try to read again (#2.a.). With glib, we might stuck in this loop forever, as EINTR is disabled (#2.a). Signed-off-by: Robert Hodaszi Acked-by: Oliver Neukum Link: https://lore.kernel.org/r/20250403144004.3889125-1-robert.hodaszi@digi.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/class/cdc-wdm.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 16e7fa4d488d3..ecd6d1f39e498 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c @@ -92,7 +92,6 @@ struct wdm_device { u16 wMaxCommand; u16 wMaxPacketSize; __le16 inum; - int reslength; int length; int read; int count; @@ -214,6 +213,11 @@ static void wdm_in_callback(struct urb *urb) if (desc->rerr == 0 && status != -EPIPE) desc->rerr = status; + if (length == 0) { + dev_dbg(&desc->intf->dev, "received ZLP\n"); + goto skip_zlp; + } + if (length + desc->length > desc->wMaxCommand) { /* The buffer would overflow */ set_bit(WDM_OVERFLOW, &desc->flags); @@ -222,18 +226,18 @@ static void wdm_in_callback(struct urb *urb) if (!test_bit(WDM_OVERFLOW, &desc->flags)) { memmove(desc->ubuf + desc->length, desc->inbuf, length); desc->length += length; - desc->reslength = length; } } skip_error: if (desc->rerr) { /* - * Since there was an error, userspace may decide to not read - * any data after poll'ing. + * If there was a ZLP or an error, userspace may decide to not + * read any data after poll'ing. * We should respond to further attempts from the device to send * data, so that we can get unstuck. */ +skip_zlp: schedule_work(&desc->service_outs_intr); } else { set_bit(WDM_READ, &desc->flags); @@ -585,15 +589,6 @@ retry: goto retry; } - if (!desc->reslength) { /* zero length read */ - dev_dbg(&desc->intf->dev, "zero length - clearing WDM_READ\n"); - clear_bit(WDM_READ, &desc->flags); - rv = service_outstanding_interrupt(desc); - spin_unlock_irq(&desc->iuspin); - if (rv < 0) - goto err; - goto retry; - } cntr = desc->length; spin_unlock_irq(&desc->iuspin); } @@ -1016,7 +1011,7 @@ static void service_interrupt_work(struct work_struct *work) spin_lock_irq(&desc->iuspin); service_outstanding_interrupt(desc); - if (!desc->resp_count) { + if (!desc->resp_count && (desc->length || desc->rerr)) { set_bit(WDM_READ, &desc->flags); wake_up(&desc->wait); } -- GitLab From cf69fedbb119236a1ec97a3707609fb6446766c7 Mon Sep 17 00:00:00 2001 From: Peter Korsgaard Date: Tue, 18 Mar 2025 16:22:07 +0100 Subject: [PATCH 1686/2211] usb: gadget: f_hid: wake up readers on disable/unbind [ Upstream commit 937a8a3a8d46a3377b4195cd8f2aa656666ebc8b ] Similar to how it is done in the write path. Add a disabled flag to track the function state and use it to exit the read loops to ensure no readers get stuck when the function is disabled/unbound, protecting against corruption when the waitq and spinlocks are reinitialized in hidg_bind(). Signed-off-by: Peter Korsgaard Link: https://lore.kernel.org/r/20250318152207.330997-1-peter@korsgaard.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/gadget/function/f_hid.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c index c7a05f842745b..d8bd2d82e9ec6 100644 --- a/drivers/usb/gadget/function/f_hid.c +++ b/drivers/usb/gadget/function/f_hid.c @@ -75,6 +75,7 @@ struct f_hidg { /* recv report */ spinlock_t read_spinlock; wait_queue_head_t read_queue; + bool disabled; /* recv report - interrupt out only (use_out_ep == 1) */ struct list_head completed_out_req; unsigned int qlen; @@ -329,7 +330,7 @@ static ssize_t f_hidg_intout_read(struct file *file, char __user *buffer, spin_lock_irqsave(&hidg->read_spinlock, flags); -#define READ_COND_INTOUT (!list_empty(&hidg->completed_out_req)) +#define READ_COND_INTOUT (!list_empty(&hidg->completed_out_req) || hidg->disabled) /* wait for at least one buffer to complete */ while (!READ_COND_INTOUT) { @@ -343,6 +344,11 @@ static ssize_t f_hidg_intout_read(struct file *file, char __user *buffer, spin_lock_irqsave(&hidg->read_spinlock, flags); } + if (hidg->disabled) { + spin_unlock_irqrestore(&hidg->read_spinlock, flags); + return -ESHUTDOWN; + } + /* pick the first one */ list = list_first_entry(&hidg->completed_out_req, struct f_hidg_req_list, list); @@ -387,7 +393,7 @@ static ssize_t f_hidg_intout_read(struct file *file, char __user *buffer, return count; } -#define READ_COND_SSREPORT (hidg->set_report_buf != NULL) +#define READ_COND_SSREPORT (hidg->set_report_buf != NULL || hidg->disabled) static ssize_t f_hidg_ssreport_read(struct file *file, char __user *buffer, size_t count, loff_t *ptr) @@ -1012,6 +1018,11 @@ static void hidg_disable(struct usb_function *f) } spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); + spin_lock_irqsave(&hidg->read_spinlock, flags); + hidg->disabled = true; + spin_unlock_irqrestore(&hidg->read_spinlock, flags); + wake_up(&hidg->read_queue); + spin_lock_irqsave(&hidg->write_spinlock, flags); if (!hidg->write_pending) { free_ep_req(hidg->in_ep, hidg->req); @@ -1097,6 +1108,10 @@ static int hidg_set_alt(struct usb_function *f, unsigned intf, unsigned alt) } } + spin_lock_irqsave(&hidg->read_spinlock, flags); + hidg->disabled = false; + spin_unlock_irqrestore(&hidg->read_spinlock, flags); + if (hidg->in_ep != NULL) { spin_lock_irqsave(&hidg->write_spinlock, flags); hidg->req = req_in; -- GitLab From 10cc2cfd3e5d0e0ec7590c4bee8bcea10e5492c4 Mon Sep 17 00:00:00 2001 From: Jos Wang Date: Sun, 9 Feb 2025 15:19:26 +0800 Subject: [PATCH 1687/2211] usb: typec: displayport: Receive DP Status Update NAK request exit dp altmode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit b4b38ffb38c91afd4dc387608db26f6fc34ed40b ] Although some Type-C DRD devices that do not support the DP Sink function (such as Huawei Mate 40Pro), the Source Port initiates Enter Mode CMD, but the device responds to Enter Mode ACK, the Source port then initiates DP Status Update CMD, and the device responds to DP Status Update NAK. As PD2.0 spec ("6.4.4.3.4 Enter Mode Command"),A DR_Swap Message Shall Not be sent during Modal Operation between the Port Partners. At this time, the source port initiates DR_Swap message through the "echo device > /sys/class/typec/port0/data_role" command to switch the data role from host to device. The device will initiate a Hard Reset for recovery, resulting in the failure of data role swap. Therefore, when DP Status Update NAK is received, Exit Mode CMD is initiated to exit the currently entered DP altmode. Signed-off-by: Jos Wang Reviewed-by: Heikki Krogerus Link: https://lore.kernel.org/r/20250209071926.69625-1-joswang1221@gmail.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/typec/altmodes/displayport.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c index 92cc1b1361208..4976a7238b287 100644 --- a/drivers/usb/typec/altmodes/displayport.c +++ b/drivers/usb/typec/altmodes/displayport.c @@ -393,6 +393,10 @@ static int dp_altmode_vdm(struct typec_altmode *alt, break; case CMDT_RSP_NAK: switch (cmd) { + case DP_CMD_STATUS_UPDATE: + if (typec_altmode_exit(alt)) + dev_err(&dp->alt->dev, "Exit Mode Failed!\n"); + break; case DP_CMD_CONFIGURE: dp->data.conf = 0; ret = dp_altmode_configured(dp); -- GitLab From 1ef2737432fcc292ba140c52ad6402ad5a12bcd2 Mon Sep 17 00:00:00 2001 From: Michael Grzeschik Date: Fri, 4 Apr 2025 00:21:01 +0200 Subject: [PATCH 1688/2211] usb: typec: mux: do not return on EOPNOTSUPP in {mux, switch}_set [ Upstream commit 0f7bbef1794dc87141897f804e5871a293aa174b ] Since the typec connectors can have many muxes or switches for different lanes (sbu, usb2, usb3) going into different modal states (usb2, usb3, audio, debug) all of them will be called on typec_switch_set and typec_mux_set. But not all of them will be handling the expected mode. If one of the mux or switch will come back with EOPTNOSUPP this is no reason to stop running through the next ones. Therefor we skip this particular error value and continue calling the next. Signed-off-by: Michael Grzeschik Reviewed-by: Heikki Krogerus Link: https://lore.kernel.org/r/20250404-ml-topic-typec-mux-v1-1-22c0526381ba@pengutronix.de Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/typec/mux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/usb/typec/mux.c b/drivers/usb/typec/mux.c index 49926d6e72c71..182c902c42f61 100644 --- a/drivers/usb/typec/mux.c +++ b/drivers/usb/typec/mux.c @@ -214,7 +214,7 @@ int typec_switch_set(struct typec_switch *sw, sw_dev = sw->sw_devs[i]; ret = sw_dev->set(sw_dev, orientation); - if (ret) + if (ret && ret != -EOPNOTSUPP) return ret; } @@ -378,7 +378,7 @@ int typec_mux_set(struct typec_mux *mux, struct typec_mux_state *state) mux_dev = mux->mux_devs[i]; ret = mux_dev->set(mux_dev, state); - if (ret) + if (ret && ret != -EOPNOTSUPP) return ret; } -- GitLab From 1346d12e4658cc39c36d7af04e8406931493a763 Mon Sep 17 00:00:00 2001 From: Andy Chiu Date: Tue, 8 Apr 2025 02:08:32 +0800 Subject: [PATCH 1689/2211] riscv: add a data fence for CMODX in the kernel mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit ca358692de41b273468e625f96926fa53e13bd8c ] RISC-V spec explicitly calls out that a local fence.i is not enough for the code modification to be visble from a remote hart. In fact, it states: To make a store to instruction memory visible to all RISC-V harts, the writing hart also has to execute a data FENCE before requesting that all remote RISC-V harts execute a FENCE.I. Although current riscv drivers for IPI use ordered MMIO when sending IPIs in order to synchronize the action between previous csd writes, riscv does not restrict itself to any particular flavor of IPI. Any driver or firmware implementation that does not order data writes before the IPI may pose a risk for code-modifying race. Thus, add a fence here to order data writes before making the IPI. Signed-off-by: Andy Chiu Reviewed-by: Björn Töpel Link: https://lore.kernel.org/r/20250407180838.42877-8-andybnac@gmail.com Signed-off-by: Alexandre Ghiti Signed-off-by: Palmer Dabbelt Signed-off-by: Sasha Levin --- arch/riscv/mm/cacheflush.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/arch/riscv/mm/cacheflush.c b/arch/riscv/mm/cacheflush.c index b816727298872..b2e4b81763f88 100644 --- a/arch/riscv/mm/cacheflush.c +++ b/arch/riscv/mm/cacheflush.c @@ -24,7 +24,20 @@ void flush_icache_all(void) if (num_online_cpus() < 2) return; - else if (riscv_use_sbi_for_rfence()) + + /* + * Make sure all previous writes to the D$ are ordered before making + * the IPI. The RISC-V spec states that a hart must execute a data fence + * before triggering a remote fence.i in order to make the modification + * visable for remote harts. + * + * IPIs on RISC-V are triggered by MMIO writes to either CLINT or + * S-IMSIC, so the fence ensures previous data writes "happen before" + * the MMIO. + */ + RISCV_FENCE(w, o); + + if (riscv_use_sbi_for_rfence()) sbi_remote_fence_i(NULL); else on_each_cpu(ipi_remote_fence_i, NULL, 1); -- GitLab From c863f7e08f6e5d6a6c45b66a2d3a78d46c87d55e Mon Sep 17 00:00:00 2001 From: Cezary Rojewski Date: Fri, 30 May 2025 16:13:09 +0200 Subject: [PATCH 1690/2211] ALSA: hda: Ignore unsol events for cards being shut down MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 3f100f524e75586537e337b34d18c8d604b398e7 ] For the classic snd_hda_intel driver, codec->card and bus->card point to the exact same thing. When snd_card_diconnect() fires, bus->shutdown is set thanks to azx_dev_disconnect(). card->shutdown is already set when that happens but both provide basically the same functionality. For the DSP snd_soc_avs driver where multiple codecs are located on multiple cards, bus->shutdown 'shortcut' is not sufficient. One codec card may be unregistered while other codecs are still operational. Proper check in form of card->shutdown must be used to verify whether the codec's card is being shut down. Reviewed-by: Amadeusz Sławiński Signed-off-by: Cezary Rojewski Link: https://patch.msgid.link/20250530141309.2943404-1-cezary.rojewski@intel.com Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/pci/hda/hda_bind.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c index 90633970b59f7..f8f1b1f6b1382 100644 --- a/sound/pci/hda/hda_bind.c +++ b/sound/pci/hda/hda_bind.c @@ -44,7 +44,7 @@ static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev) struct hda_codec *codec = container_of(dev, struct hda_codec, core); /* ignore unsol events during shutdown */ - if (codec->bus->shutdown) + if (codec->card->shutdown || codec->bus->shutdown) return; /* ignore unsol events during system suspend/resume */ -- GitLab From 2b331e7b6cc572276144a4d956dd46cc1c28cd30 Mon Sep 17 00:00:00 2001 From: Vijendar Mukunda Date: Thu, 29 May 2025 11:08:13 +0530 Subject: [PATCH 1691/2211] ALSA: hda: Add new pci id for AMD GPU display HD audio controller [ Upstream commit ab72bfce7647522e01a181e3600c3d14ff5c143e ] Add new pci id for AMD GPU display HD audio controller(device id- 0xab40). Signed-off-by: Vijendar Mukunda Reviewed-by: Alex Deucher Link: https://patch.msgid.link/20250529053838.2350071-1-Vijendar.Mukunda@amd.com Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/pci/hda/hda_intel.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 1872c8b750537..d4e325b785332 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -2727,6 +2727,9 @@ static const struct pci_device_id azx_ids[] = { { PCI_VDEVICE(ATI, 0xab38), .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | AZX_DCAPS_PM_RUNTIME }, + { PCI_VDEVICE(ATI, 0xab40), + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | + AZX_DCAPS_PM_RUNTIME }, /* GLENFLY */ { PCI_DEVICE(PCI_VENDOR_ID_GLENFLY, PCI_ANY_ID), .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, -- GitLab From 1818fc3602e87c3ed62c3d576ebb485a1f64a04a Mon Sep 17 00:00:00 2001 From: Mario Limonciello Date: Tue, 27 May 2025 12:26:56 -0500 Subject: [PATCH 1692/2211] ALSA: usb-audio: Add a quirk for Lenovo Thinkpad Thunderbolt 3 dock [ Upstream commit 4919353c7789b8047e06a9b2b943f775a8f72883 ] The audio controller in the Lenovo Thinkpad Thunderbolt 3 dock doesn't support reading the sampling rate. Add a quirk for it. Suggested-by: Takashi Iwai Signed-off-by: Mario Limonciello Link: https://patch.msgid.link/20250527172657.1972565-1-superm1@kernel.org Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/usb/quirks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index c7387081577cd..0da4ee9757c01 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -2282,6 +2282,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_DISABLE_AUTOSUSPEND), DEVICE_FLG(0x17aa, 0x104d, /* Lenovo ThinkStation P620 Internal Speaker + Front Headset */ QUIRK_FLAG_DISABLE_AUTOSUSPEND), + DEVICE_FLG(0x17ef, 0x3083, /* Lenovo TBT3 dock */ + QUIRK_FLAG_GET_SAMPLE_RATE), DEVICE_FLG(0x1852, 0x5062, /* Luxman D-08u */ QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY), DEVICE_FLG(0x1852, 0x5065, /* Luxman DA-06 */ -- GitLab From 7d468ca41a159d160658027fab457a5009294488 Mon Sep 17 00:00:00 2001 From: Shuming Fan Date: Mon, 2 Jun 2025 16:58:51 +0800 Subject: [PATCH 1693/2211] ASoC: rt1320: fix speaker noise when volume bar is 100% [ Upstream commit 9adf2de86611ac108d07e769a699556d87f052e2 ] This patch updates the settings to fix the speaker noise. Signed-off-by: Shuming Fan Link: https://patch.msgid.link/20250602085851.4081886-1-shumingf@realtek.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/rt1320-sdw.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/sound/soc/codecs/rt1320-sdw.c b/sound/soc/codecs/rt1320-sdw.c index f2d194e76a947..8755a63478d79 100644 --- a/sound/soc/codecs/rt1320-sdw.c +++ b/sound/soc/codecs/rt1320-sdw.c @@ -2085,7 +2085,7 @@ static const struct reg_sequence rt1320_vc_patch_code_write[] = { { 0x3fc2bfc0, 0x03 }, { 0x0000d486, 0x43 }, { SDW_SDCA_CTL(FUNC_NUM_AMP, RT1320_SDCA_ENT_PDE23, RT1320_SDCA_CTL_REQ_POWER_STATE, 0), 0x00 }, - { 0x1000db00, 0x04 }, + { 0x1000db00, 0x07 }, { 0x1000db01, 0x00 }, { 0x1000db02, 0x11 }, { 0x1000db03, 0x00 }, @@ -2106,6 +2106,21 @@ static const struct reg_sequence rt1320_vc_patch_code_write[] = { { 0x1000db12, 0x00 }, { 0x1000db13, 0x00 }, { 0x1000db14, 0x45 }, + { 0x1000db15, 0x0d }, + { 0x1000db16, 0x01 }, + { 0x1000db17, 0x00 }, + { 0x1000db18, 0x00 }, + { 0x1000db19, 0xbf }, + { 0x1000db1a, 0x13 }, + { 0x1000db1b, 0x09 }, + { 0x1000db1c, 0x00 }, + { 0x1000db1d, 0x00 }, + { 0x1000db1e, 0x00 }, + { 0x1000db1f, 0x12 }, + { 0x1000db20, 0x09 }, + { 0x1000db21, 0x00 }, + { 0x1000db22, 0x00 }, + { 0x1000db23, 0x00 }, { 0x0000d540, 0x01 }, { 0x0000c081, 0xfc }, { 0x0000f01e, 0x80 }, -- GitLab From a52f78bc8bb1afdca540c75c56ceb96393e9aa93 Mon Sep 17 00:00:00 2001 From: Dmitry Kandybka Date: Tue, 22 Apr 2025 12:32:04 +0300 Subject: [PATCH 1694/2211] ceph: fix possible integer overflow in ceph_zero_objects() [ Upstream commit 0abd87942e0c93964e93224836944712feba1d91 ] In 'ceph_zero_objects', promote 'object_size' to 'u64' to avoid possible integer overflow. Compile tested only. Found by Linux Verification Center (linuxtesting.org) with SVACE. Signed-off-by: Dmitry Kandybka Reviewed-by: Viacheslav Dubeyko Signed-off-by: Ilya Dryomov Signed-off-by: Sasha Levin --- fs/ceph/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 851d70200c6b8..a7254cab44cc2 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -2616,7 +2616,7 @@ static int ceph_zero_objects(struct inode *inode, loff_t offset, loff_t length) s32 stripe_unit = ci->i_layout.stripe_unit; s32 stripe_count = ci->i_layout.stripe_count; s32 object_size = ci->i_layout.object_size; - u64 object_set_size = object_size * stripe_count; + u64 object_set_size = (u64) object_size * stripe_count; u64 nearly, t; /* round offset up to next period boundary */ -- GitLab From ae2353d862eb09816d2db270791f3475d247fbb9 Mon Sep 17 00:00:00 2001 From: Ziqi Chen Date: Thu, 22 May 2025 16:12:28 +0800 Subject: [PATCH 1695/2211] scsi: ufs: core: Don't perform UFS clkscaling during host async scan [ Upstream commit e97633492f5a3eca7b3ff03b4ef6f993017f7955 ] When preparing for UFS clock scaling, the UFS driver will quiesce all sdevs queues in the UFS SCSI host tagset list and then unquiesce them in ufshcd_clock_scaling_unprepare(). If the UFS SCSI host async scan is in progress at this time, some LUs may be added to the tagset list between UFS clkscale prepare and unprepare. This can cause two issues: 1. During clock scaling, there may be I/O requests issued through new added queues that have not been quiesced, leading to task abort issue. 2. These new added queues that have not been quiesced will be unquiesced as well when UFS clkscale is unprepared, resulting in warning prints. Therefore, use the mutex lock scan_mutex in ufshcd_clock_scaling_prepare() and ufshcd_clock_scaling_unprepare() to protect it. Co-developed-by: Can Guo Signed-off-by: Can Guo Signed-off-by: Ziqi Chen Link: https://lore.kernel.org/r/20250522081233.2358565-1-quic_ziqichen@quicinc.com Suggested-by: Bart Van Assche Reviewed-by: Bart Van Assche Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/ufs/core/ufshcd.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index 374f505fec3d1..c5cef57e64ce3 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -1392,6 +1392,7 @@ static int ufshcd_clock_scaling_prepare(struct ufs_hba *hba, u64 timeout_us) * make sure that there are no outstanding requests when * clock scaling is in progress */ + mutex_lock(&hba->host->scan_mutex); blk_mq_quiesce_tagset(&hba->host->tag_set); mutex_lock(&hba->wb_mutex); down_write(&hba->clk_scaling_lock); @@ -1402,6 +1403,7 @@ static int ufshcd_clock_scaling_prepare(struct ufs_hba *hba, u64 timeout_us) up_write(&hba->clk_scaling_lock); mutex_unlock(&hba->wb_mutex); blk_mq_unquiesce_tagset(&hba->host->tag_set); + mutex_unlock(&hba->host->scan_mutex); goto out; } @@ -1423,6 +1425,7 @@ static void ufshcd_clock_scaling_unprepare(struct ufs_hba *hba, int err, bool sc mutex_unlock(&hba->wb_mutex); blk_mq_unquiesce_tagset(&hba->host->tag_set); + mutex_unlock(&hba->host->scan_mutex); ufshcd_release(hba); } -- GitLab From 04373900864e2e8bf4ab0cd5add5a41245bfb5d5 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Mon, 21 Apr 2025 16:15:19 -0700 Subject: [PATCH 1696/2211] ovl: Check for NULL d_inode() in ovl_dentry_upper() [ Upstream commit 8a39f1c870e9d6fbac5638f3a42a6a6363829c49 ] In ovl_path_type() and ovl_is_metacopy_dentry() GCC notices that it is possible for OVL_E() to return NULL (which implies that d_inode(dentry) may be NULL). This would result in out of bounds reads via container_of(), seen with GCC 15's -Warray-bounds -fdiagnostics-details. For example: In file included from arch/x86/include/generated/asm/rwonce.h:1, from include/linux/compiler.h:339, from include/linux/export.h:5, from include/linux/linkage.h:7, from include/linux/fs.h:5, from fs/overlayfs/util.c:7: In function 'ovl_upperdentry_dereference', inlined from 'ovl_dentry_upper' at ../fs/overlayfs/util.c:305:9, inlined from 'ovl_path_type' at ../fs/overlayfs/util.c:216:6: include/asm-generic/rwonce.h:44:26: error: array subscript 0 is outside array bounds of 'struct inode[7486503276667837]' [-Werror=array-bounds=] 44 | #define __READ_ONCE(x) (*(const volatile __unqual_scalar_typeof(x) *)&(x)) | ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/asm-generic/rwonce.h:50:9: note: in expansion of macro '__READ_ONCE' 50 | __READ_ONCE(x); \ | ^~~~~~~~~~~ fs/overlayfs/ovl_entry.h:195:16: note: in expansion of macro 'READ_ONCE' 195 | return READ_ONCE(oi->__upperdentry); | ^~~~~~~~~ 'ovl_path_type': event 1 185 | return inode ? OVL_I(inode)->oe : NULL; 'ovl_path_type': event 2 Avoid this by allowing ovl_dentry_upper() to return NULL if d_inode() is NULL, as that means the problematic dereferencing can never be reached. Note that this fixes the over-eager compiler warning in an effort to being able to enable -Warray-bounds globally. There is no known behavioral bug here. Suggested-by: Amir Goldstein Signed-off-by: Kees Cook Signed-off-by: Miklos Szeredi Signed-off-by: Sasha Levin --- fs/overlayfs/util.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 8f080046c59d9..99571de665dde 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -300,7 +300,9 @@ enum ovl_path_type ovl_path_realdata(struct dentry *dentry, struct path *path) struct dentry *ovl_dentry_upper(struct dentry *dentry) { - return ovl_upperdentry_dereference(OVL_I(d_inode(dentry))); + struct inode *inode = d_inode(dentry); + + return inode ? ovl_upperdentry_dereference(OVL_I(inode)) : NULL; } struct dentry *ovl_dentry_lower(struct dentry *dentry) -- GitLab From bbe9231fe611a54a447962494472f604419bad59 Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Sat, 7 Jun 2025 09:18:43 +0930 Subject: [PATCH 1697/2211] btrfs: handle csum tree error with rescue=ibadroots correctly [ Upstream commit 547e836661554dcfa15c212a3821664e85b4191a ] [BUG] There is syzbot based reproducer that can crash the kernel, with the following call trace: (With some debug output added) DEBUG: rescue=ibadroots parsed BTRFS: device fsid 14d642db-7b15-43e4-81e6-4b8fac6a25f8 devid 1 transid 8 /dev/loop0 (7:0) scanned by repro (1010) BTRFS info (device loop0): first mount of filesystem 14d642db-7b15-43e4-81e6-4b8fac6a25f8 BTRFS info (device loop0): using blake2b (blake2b-256-generic) checksum algorithm BTRFS info (device loop0): using free-space-tree BTRFS warning (device loop0): checksum verify failed on logical 5312512 mirror 1 wanted 0xb043382657aede36608fd3386d6b001692ff406164733d94e2d9a180412c6003 found 0x810ceb2bacb7f0f9eb2bf3b2b15c02af867cb35ad450898169f3b1f0bd818651 level 0 DEBUG: read tree root path failed for tree csum, ret=-5 BTRFS warning (device loop0): checksum verify failed on logical 5328896 mirror 1 wanted 0x51be4e8b303da58e6340226815b70e3a93592dac3f30dd510c7517454de8567a found 0x51be4e8b303da58e634022a315b70e3a93592dac3f30dd510c7517454de8567a level 0 BTRFS warning (device loop0): checksum verify failed on logical 5292032 mirror 1 wanted 0x1924ccd683be9efc2fa98582ef58760e3848e9043db8649ee382681e220cdee4 found 0x0cb6184f6e8799d9f8cb335dccd1d1832da1071d12290dab3b85b587ecacca6e level 0 process 'repro' launched './file2' with NULL argv: empty string added DEBUG: no csum root, idatacsums=0 ibadroots=134217728 Oops: general protection fault, probably for non-canonical address 0xdffffc0000000041: 0000 [#1] SMP KASAN NOPTI KASAN: null-ptr-deref in range [0x0000000000000208-0x000000000000020f] CPU: 5 UID: 0 PID: 1010 Comm: repro Tainted: G OE 6.15.0-custom+ #249 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS unknown 02/02/2022 RIP: 0010:btrfs_lookup_csum+0x93/0x3d0 [btrfs] Call Trace: btrfs_lookup_bio_sums+0x47a/0xdf0 [btrfs] btrfs_submit_bbio+0x43e/0x1a80 [btrfs] submit_one_bio+0xde/0x160 [btrfs] btrfs_readahead+0x498/0x6a0 [btrfs] read_pages+0x1c3/0xb20 page_cache_ra_order+0x4b5/0xc20 filemap_get_pages+0x2d3/0x19e0 filemap_read+0x314/0xde0 __kernel_read+0x35b/0x900 bprm_execve+0x62e/0x1140 do_execveat_common.isra.0+0x3fc/0x520 __x64_sys_execveat+0xdc/0x130 do_syscall_64+0x54/0x1d0 entry_SYSCALL_64_after_hwframe+0x76/0x7e ---[ end trace 0000000000000000 ]--- [CAUSE] Firstly the fs has a corrupted csum tree root, thus to mount the fs we have to go "ro,rescue=ibadroots" mount option. Normally with that mount option, a bad csum tree root should set BTRFS_FS_STATE_NO_DATA_CSUMS flag, so that any future data read will ignore csum search. But in this particular case, we have the following call trace that caused NULL csum root, but not setting BTRFS_FS_STATE_NO_DATA_CSUMS: load_global_roots_objectid(): ret = btrfs_search_slot(); /* Succeeded */ btrfs_item_key_to_cpu() found = true; /* We found the root item for csum tree. */ root = read_tree_root_path(); if (IS_ERR(root)) { if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) /* * Since we have rescue=ibadroots mount option, * @ret is still 0. */ break; if (!found || ret) { /* @found is true, @ret is 0, error handling for csum * tree is skipped. */ } This means we completely skipped to set BTRFS_FS_STATE_NO_DATA_CSUMS if the csum tree is corrupted, which results unexpected later csum lookup. [FIX] If read_tree_root_path() failed, always populate @ret to the error number. As at the end of the function, we need @ret to determine if we need to do the extra error handling for csum tree. Fixes: abed4aaae4f7 ("btrfs: track the csum, extent, and free space trees in a rb tree") Reported-by: Zhiyu Zhang Reported-by: Longxing Li Reviewed-by: David Sterba Signed-off-by: Qu Wenruo Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/disk-io.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 147c50ef912ac..96282bf28b19c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2168,8 +2168,7 @@ static int load_global_roots_objectid(struct btrfs_root *tree_root, found = true; root = read_tree_root_path(tree_root, path, &key); if (IS_ERR(root)) { - if (!btrfs_test_opt(fs_info, IGNOREBADROOTS)) - ret = PTR_ERR(root); + ret = PTR_ERR(root); break; } set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); -- GitLab From 5b930e72aaeaf16dae45eef1aa1ae4b8114d3460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= Date: Mon, 12 May 2025 21:22:15 +0200 Subject: [PATCH 1698/2211] drm/i915/gem: Allow EXEC_CAPTURE on recoverable contexts on DG1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 25eeba495b2fc16037647c1a51bcdf6fc157af5c ] The intel-media-driver is currently broken on DG1 because it uses EXEC_CAPTURE with recovarable contexts. Relax the check to allow that. I've also submitted a fix for the intel-media-driver: https://github.com/intel/media-driver/pull/1920 Cc: stable@vger.kernel.org # v6.0+ Cc: Matthew Auld Cc: Thomas Hellström Testcase: igt/gem_exec_capture/capture-invisible Fixes: 71b1669ea9bd ("drm/i915/uapi: tweak error capture on recoverable contexts") Reviewed-by: Andi Shyti Signed-off-by: Ville Syrjälä Signed-off-by: Andi Shyti Link: https://lore.kernel.org/r/20250411144313.11660-2-ville.syrjala@linux.intel.com (cherry picked from commit d6e020819612a4a06207af858e0978be4d3e3140) Signed-off-by: Joonas Lahtinen Stable-dep-of: ed5915cfce2a ("Revert "drm/i915/gem: Allow EXEC_CAPTURE on recoverable contexts on DG1"") Signed-off-by: Sasha Levin --- drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c index a3b83cfe17267..841438301d802 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c @@ -2014,7 +2014,7 @@ static int eb_capture_stage(struct i915_execbuffer *eb) continue; if (i915_gem_context_is_recoverable(eb->gem_context) && - (IS_DGFX(eb->i915) || GRAPHICS_VER_FULL(eb->i915) > IP_VER(12, 0))) + GRAPHICS_VER_FULL(eb->i915) > IP_VER(12, 10)) return -EINVAL; for_each_batch_create_order(eb, j) { -- GitLab From 7952c4bb509259a4c26e35cdc7e5bd7cb4da2882 Mon Sep 17 00:00:00 2001 From: Joonas Lahtinen Date: Thu, 22 May 2025 09:41:27 +0300 Subject: [PATCH 1699/2211] Revert "drm/i915/gem: Allow EXEC_CAPTURE on recoverable contexts on DG1" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit ed5915cfce2abb9a553c3737badebd4a11d6c9c7 ] This reverts commit d6e020819612a4a06207af858e0978be4d3e3140. The IS_DGFX check was put in place because error capture of buffer objects is expected to be broken on devices with VRAM. Userspace fix[1] to the impacted media driver has been submitted, merged and a new driver release is out as 25.2.3 where the capture flag is dropped on DG1 thus unblocking the usage of media driver on DG1. [1] https://github.com/intel/media-driver/commit/93c07d9b4b96a78bab21f6acd4eb863f4313ea4a Cc: stable@vger.kernel.org # v6.0+ Cc: Ville Syrjälä Cc: Andi Shyti Cc: Matthew Auld Cc: Thomas Hellström Cc: Tvrtko Ursulin Acked-by: Tvrtko Ursulin Reviewed-by: Andi Shyti Link: https://lore.kernel.org/r/20250522064127.24293-1-joonas.lahtinen@linux.intel.com [Joonas: Update message to point out the merged userspace fix] Signed-off-by: Joonas Lahtinen (cherry picked from commit d2dc30e0aa252830f908c8e793d3139d51321370) Signed-off-by: Joonas Lahtinen Signed-off-by: Sasha Levin --- drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c index 841438301d802..a3b83cfe17267 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c @@ -2014,7 +2014,7 @@ static int eb_capture_stage(struct i915_execbuffer *eb) continue; if (i915_gem_context_is_recoverable(eb->gem_context) && - GRAPHICS_VER_FULL(eb->i915) > IP_VER(12, 10)) + (IS_DGFX(eb->i915) || GRAPHICS_VER_FULL(eb->i915) > IP_VER(12, 0))) return -EINVAL; for_each_batch_create_order(eb, j) { -- GitLab From 1fe766ddb90cf897c6b470303f8fd08b47663d6c Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Mon, 13 Jan 2025 13:53:41 +1030 Subject: [PATCH 1700/2211] btrfs: factor out nocow ordered extent and extent map generation into a helper [ Upstream commit 10326fdcb3ace2f2dcbc8b9fc50b87e5cab93345 ] Currently we're doing all the ordered extent and extent map generation inside a while() loop of run_delalloc_nocow(). This makes it pretty hard to read, nor doing proper error handling. So move that part of code into a helper, nocow_one_range(). This should not change anything, but there is a tiny timing change where btrfs_dec_nocow_writers() is only called after nocow_one_range() helper exits. This timing change is small, and makes error handling easier, thus should be fine. Reviewed-by: Boris Burkov Signed-off-by: Qu Wenruo Signed-off-by: David Sterba Stable-dep-of: 1f2889f5594a ("btrfs: fix qgroup reservation leak on failure to allocate ordered extent") Signed-off-by: Sasha Levin --- fs/btrfs/inode.c | 122 +++++++++++++++++++++++------------------------ 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 1ab5b0c1b9b76..65517efd3433e 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -2055,6 +2055,63 @@ static void cleanup_dirty_folios(struct btrfs_inode *inode, mapping_set_error(mapping, error); } +static int nocow_one_range(struct btrfs_inode *inode, struct folio *locked_folio, + struct extent_state **cached, + struct can_nocow_file_extent_args *nocow_args, + u64 file_pos, bool is_prealloc) +{ + struct btrfs_ordered_extent *ordered; + u64 len = nocow_args->file_extent.num_bytes; + u64 end = file_pos + len - 1; + int ret = 0; + + lock_extent(&inode->io_tree, file_pos, end, cached); + + if (is_prealloc) { + struct extent_map *em; + + em = btrfs_create_io_em(inode, file_pos, &nocow_args->file_extent, + BTRFS_ORDERED_PREALLOC); + if (IS_ERR(em)) { + unlock_extent(&inode->io_tree, file_pos, end, cached); + return PTR_ERR(em); + } + free_extent_map(em); + } + + ordered = btrfs_alloc_ordered_extent(inode, file_pos, &nocow_args->file_extent, + is_prealloc + ? (1 << BTRFS_ORDERED_PREALLOC) + : (1 << BTRFS_ORDERED_NOCOW)); + if (IS_ERR(ordered)) { + if (is_prealloc) + btrfs_drop_extent_map_range(inode, file_pos, end, false); + unlock_extent(&inode->io_tree, file_pos, end, cached); + return PTR_ERR(ordered); + } + + if (btrfs_is_data_reloc_root(inode->root)) + /* + * Errors are handled later, as we must prevent + * extent_clear_unlock_delalloc() in error handler from freeing + * metadata of the created ordered extent. + */ + ret = btrfs_reloc_clone_csums(ordered); + btrfs_put_ordered_extent(ordered); + + extent_clear_unlock_delalloc(inode, file_pos, end, locked_folio, cached, + EXTENT_LOCKED | EXTENT_DELALLOC | + EXTENT_CLEAR_DATA_RESV, + PAGE_UNLOCK | PAGE_SET_ORDERED); + + /* + * btrfs_reloc_clone_csums() error, now we're OK to call error handler, + * as metadata for created ordered extent will only be freed by + * btrfs_finish_ordered_io(). + */ + return ret; +} + /* * when nowcow writeback call back. This checks for snapshots or COW copies * of the extents that exist in the file, and COWs the file as required. @@ -2099,15 +2156,12 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode, while (cur_offset <= end) { struct btrfs_block_group *nocow_bg = NULL; - struct btrfs_ordered_extent *ordered; struct btrfs_key found_key; struct btrfs_file_extent_item *fi; struct extent_buffer *leaf; struct extent_state *cached_state = NULL; u64 extent_end; - u64 nocow_end; int extent_type; - bool is_prealloc; ret = btrfs_lookup_file_extent(NULL, root, path, ino, cur_offset, 0); @@ -2242,67 +2296,13 @@ must_cow: } } - nocow_end = cur_offset + nocow_args.file_extent.num_bytes - 1; - lock_extent(&inode->io_tree, cur_offset, nocow_end, &cached_state); - - is_prealloc = extent_type == BTRFS_FILE_EXTENT_PREALLOC; - if (is_prealloc) { - struct extent_map *em; - - em = btrfs_create_io_em(inode, cur_offset, - &nocow_args.file_extent, - BTRFS_ORDERED_PREALLOC); - if (IS_ERR(em)) { - unlock_extent(&inode->io_tree, cur_offset, - nocow_end, &cached_state); - btrfs_dec_nocow_writers(nocow_bg); - ret = PTR_ERR(em); - goto error; - } - free_extent_map(em); - } - - ordered = btrfs_alloc_ordered_extent(inode, cur_offset, - &nocow_args.file_extent, - is_prealloc - ? (1 << BTRFS_ORDERED_PREALLOC) - : (1 << BTRFS_ORDERED_NOCOW)); + ret = nocow_one_range(inode, locked_folio, &cached_state, + &nocow_args, cur_offset, + extent_type == BTRFS_FILE_EXTENT_PREALLOC); btrfs_dec_nocow_writers(nocow_bg); - if (IS_ERR(ordered)) { - if (is_prealloc) { - btrfs_drop_extent_map_range(inode, cur_offset, - nocow_end, false); - } - unlock_extent(&inode->io_tree, cur_offset, - nocow_end, &cached_state); - ret = PTR_ERR(ordered); + if (ret < 0) goto error; - } - - if (btrfs_is_data_reloc_root(root)) - /* - * Error handled later, as we must prevent - * extent_clear_unlock_delalloc() in error handler - * from freeing metadata of created ordered extent. - */ - ret = btrfs_reloc_clone_csums(ordered); - btrfs_put_ordered_extent(ordered); - - extent_clear_unlock_delalloc(inode, cur_offset, nocow_end, - locked_folio, &cached_state, - EXTENT_LOCKED | EXTENT_DELALLOC | - EXTENT_CLEAR_DATA_RESV, - PAGE_UNLOCK | PAGE_SET_ORDERED); - cur_offset = extent_end; - - /* - * btrfs_reloc_clone_csums() error, now we're OK to call error - * handler, as metadata for created ordered extent will only - * be freed by btrfs_finish_ordered_io(). - */ - if (ret) - goto error; } btrfs_release_path(path); -- GitLab From 4cce1b05eb950896f0e7734d03d96b4dcaad87d1 Mon Sep 17 00:00:00 2001 From: David Sterba Date: Tue, 22 Apr 2025 17:55:41 +0200 Subject: [PATCH 1701/2211] btrfs: use unsigned types for constants defined as bit shifts [ Upstream commit 05a6ec865d091fe8244657df8063f74e704d1711 ] The unsigned type is a recommended practice (CWE-190, CWE-194) for bit shifts to avoid problems with potential unwanted sign extensions. Although there are no such cases in btrfs codebase, follow the recommendation. Reviewed-by: Boris Burkov Signed-off-by: David Sterba Stable-dep-of: 1f2889f5594a ("btrfs: fix qgroup reservation leak on failure to allocate ordered extent") Signed-off-by: Sasha Levin --- fs/btrfs/backref.h | 4 ++-- fs/btrfs/direct-io.c | 4 ++-- fs/btrfs/extent_io.h | 2 +- fs/btrfs/inode.c | 12 ++++++------ fs/btrfs/ordered-data.c | 4 ++-- fs/btrfs/raid56.c | 5 ++--- fs/btrfs/tests/extent-io-tests.c | 6 +++--- fs/btrfs/zstd.c | 2 +- 8 files changed, 19 insertions(+), 20 deletions(-) diff --git a/fs/btrfs/backref.h b/fs/btrfs/backref.h index e8c22cccb5c13..7dfcc9351bce5 100644 --- a/fs/btrfs/backref.h +++ b/fs/btrfs/backref.h @@ -427,8 +427,8 @@ struct btrfs_backref_node *btrfs_backref_alloc_node( struct btrfs_backref_edge *btrfs_backref_alloc_edge( struct btrfs_backref_cache *cache); -#define LINK_LOWER (1 << 0) -#define LINK_UPPER (1 << 1) +#define LINK_LOWER (1U << 0) +#define LINK_UPPER (1U << 1) void btrfs_backref_link_edge(struct btrfs_backref_edge *edge, struct btrfs_backref_node *lower, diff --git a/fs/btrfs/direct-io.c b/fs/btrfs/direct-io.c index bd38df5647e35..71984d7db839b 100644 --- a/fs/btrfs/direct-io.c +++ b/fs/btrfs/direct-io.c @@ -151,8 +151,8 @@ static struct extent_map *btrfs_create_dio_extent(struct btrfs_inode *inode, } ordered = btrfs_alloc_ordered_extent(inode, start, file_extent, - (1 << type) | - (1 << BTRFS_ORDERED_DIRECT)); + (1U << type) | + (1U << BTRFS_ORDERED_DIRECT)); if (IS_ERR(ordered)) { if (em) { free_extent_map(em); diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index fcb60837d7dc6..039a73731135a 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h @@ -79,7 +79,7 @@ enum { * single word in a bitmap may straddle two pages in the extent buffer. */ #define BIT_BYTE(nr) ((nr) / BITS_PER_BYTE) -#define BYTE_MASK ((1 << BITS_PER_BYTE) - 1) +#define BYTE_MASK ((1U << BITS_PER_BYTE) - 1) #define BITMAP_FIRST_BYTE_MASK(start) \ ((BYTE_MASK << ((start) & (BITS_PER_BYTE - 1))) & BYTE_MASK) #define BITMAP_LAST_BYTE_MASK(nbits) \ diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 65517efd3433e..94664c1822930 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1249,7 +1249,7 @@ static void submit_one_async_extent(struct async_chunk *async_chunk, free_extent_map(em); ordered = btrfs_alloc_ordered_extent(inode, start, &file_extent, - 1 << BTRFS_ORDERED_COMPRESSED); + 1U << BTRFS_ORDERED_COMPRESSED); if (IS_ERR(ordered)) { btrfs_drop_extent_map_range(inode, start, end, false); ret = PTR_ERR(ordered); @@ -1484,7 +1484,7 @@ static noinline int cow_file_range(struct btrfs_inode *inode, free_extent_map(em); ordered = btrfs_alloc_ordered_extent(inode, start, &file_extent, - 1 << BTRFS_ORDERED_REGULAR); + 1U << BTRFS_ORDERED_REGULAR); if (IS_ERR(ordered)) { unlock_extent(&inode->io_tree, start, start + ram_size - 1, &cached); @@ -2081,8 +2081,8 @@ static int nocow_one_range(struct btrfs_inode *inode, struct folio *locked_folio ordered = btrfs_alloc_ordered_extent(inode, file_pos, &nocow_args->file_extent, is_prealloc - ? (1 << BTRFS_ORDERED_PREALLOC) - : (1 << BTRFS_ORDERED_NOCOW)); + ? (1U << BTRFS_ORDERED_PREALLOC) + : (1U << BTRFS_ORDERED_NOCOW)); if (IS_ERR(ordered)) { if (is_prealloc) btrfs_drop_extent_map_range(inode, file_pos, end, false); @@ -9683,8 +9683,8 @@ ssize_t btrfs_do_encoded_write(struct kiocb *iocb, struct iov_iter *from, free_extent_map(em); ordered = btrfs_alloc_ordered_extent(inode, start, &file_extent, - (1 << BTRFS_ORDERED_ENCODED) | - (1 << BTRFS_ORDERED_COMPRESSED)); + (1U << BTRFS_ORDERED_ENCODED) | + (1U << BTRFS_ORDERED_COMPRESSED)); if (IS_ERR(ordered)) { btrfs_drop_extent_map_range(inode, start, end, false); ret = PTR_ERR(ordered); diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index 4ed11b089ea95..7baee52cac184 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -155,7 +155,7 @@ static struct btrfs_ordered_extent *alloc_ordered_extent( u64 qgroup_rsv = 0; if (flags & - ((1 << BTRFS_ORDERED_NOCOW) | (1 << BTRFS_ORDERED_PREALLOC))) { + ((1U << BTRFS_ORDERED_NOCOW) | (1U << BTRFS_ORDERED_PREALLOC))) { /* For nocow write, we can release the qgroup rsv right now */ ret = btrfs_qgroup_free_data(inode, NULL, file_offset, num_bytes, &qgroup_rsv); if (ret < 0) @@ -253,7 +253,7 @@ static void insert_ordered_extent(struct btrfs_ordered_extent *entry) * @disk_bytenr: Offset of extent on disk. * @disk_num_bytes: Size of extent on disk. * @offset: Offset into unencoded data where file data starts. - * @flags: Flags specifying type of extent (1 << BTRFS_ORDERED_*). + * @flags: Flags specifying type of extent (1U << BTRFS_ORDERED_*). * @compress_type: Compression algorithm used for data. * * Most of these parameters correspond to &struct btrfs_file_extent_item. The diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c index 39bec672df0cc..8afadf994b8c8 100644 --- a/fs/btrfs/raid56.c +++ b/fs/btrfs/raid56.c @@ -200,8 +200,7 @@ int btrfs_alloc_stripe_hash_table(struct btrfs_fs_info *info) struct btrfs_stripe_hash_table *x; struct btrfs_stripe_hash *cur; struct btrfs_stripe_hash *h; - int num_entries = 1 << BTRFS_STRIPE_HASH_TABLE_BITS; - int i; + unsigned int num_entries = 1U << BTRFS_STRIPE_HASH_TABLE_BITS; if (info->stripe_hash_table) return 0; @@ -222,7 +221,7 @@ int btrfs_alloc_stripe_hash_table(struct btrfs_fs_info *info) h = table->table; - for (i = 0; i < num_entries; i++) { + for (unsigned int i = 0; i < num_entries; i++) { cur = h + i; INIT_LIST_HEAD(&cur->hash_list); spin_lock_init(&cur->lock); diff --git a/fs/btrfs/tests/extent-io-tests.c b/fs/btrfs/tests/extent-io-tests.c index 0a2dbfaaf49e2..de226209220fe 100644 --- a/fs/btrfs/tests/extent-io-tests.c +++ b/fs/btrfs/tests/extent-io-tests.c @@ -14,9 +14,9 @@ #include "../disk-io.h" #include "../btrfs_inode.h" -#define PROCESS_UNLOCK (1 << 0) -#define PROCESS_RELEASE (1 << 1) -#define PROCESS_TEST_LOCKED (1 << 2) +#define PROCESS_UNLOCK (1U << 0) +#define PROCESS_RELEASE (1U << 1) +#define PROCESS_TEST_LOCKED (1U << 2) static noinline int process_page_range(struct inode *inode, u64 start, u64 end, unsigned long flags) diff --git a/fs/btrfs/zstd.c b/fs/btrfs/zstd.c index 866607fd3e588..c9ea37fabf659 100644 --- a/fs/btrfs/zstd.c +++ b/fs/btrfs/zstd.c @@ -24,7 +24,7 @@ #include "super.h" #define ZSTD_BTRFS_MAX_WINDOWLOG 17 -#define ZSTD_BTRFS_MAX_INPUT (1 << ZSTD_BTRFS_MAX_WINDOWLOG) +#define ZSTD_BTRFS_MAX_INPUT (1U << ZSTD_BTRFS_MAX_WINDOWLOG) #define ZSTD_BTRFS_DEFAULT_LEVEL 3 #define ZSTD_BTRFS_MAX_LEVEL 15 /* 307s to avoid pathologically clashing with transaction commit */ -- GitLab From f51efc4606e44b6faf6575bc2c0452e7105c6305 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Wed, 7 May 2025 13:05:36 +0100 Subject: [PATCH 1702/2211] btrfs: fix qgroup reservation leak on failure to allocate ordered extent [ Upstream commit 1f2889f5594a2bc4c6a52634c4a51b93e785def5 ] If we fail to allocate an ordered extent for a COW write we end up leaking a qgroup data reservation since we called btrfs_qgroup_release_data() but we didn't call btrfs_qgroup_free_refroot() (which would happen when running the respective data delayed ref created by ordered extent completion or when finishing the ordered extent in case an error happened). So make sure we call btrfs_qgroup_free_refroot() if we fail to allocate an ordered extent for a COW write. Fixes: 7dbeaad0af7d ("btrfs: change timing for qgroup reserved space for ordered extents to fix reserved space leak") CC: stable@vger.kernel.org # 6.1+ Reviewed-by: Boris Burkov Reviewed-by: Qu Wenruo Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/ordered-data.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index 7baee52cac184..880f9553d79d3 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -153,9 +153,10 @@ static struct btrfs_ordered_extent *alloc_ordered_extent( struct btrfs_ordered_extent *entry; int ret; u64 qgroup_rsv = 0; + const bool is_nocow = (flags & + ((1U << BTRFS_ORDERED_NOCOW) | (1U << BTRFS_ORDERED_PREALLOC))); - if (flags & - ((1U << BTRFS_ORDERED_NOCOW) | (1U << BTRFS_ORDERED_PREALLOC))) { + if (is_nocow) { /* For nocow write, we can release the qgroup rsv right now */ ret = btrfs_qgroup_free_data(inode, NULL, file_offset, num_bytes, &qgroup_rsv); if (ret < 0) @@ -170,8 +171,13 @@ static struct btrfs_ordered_extent *alloc_ordered_extent( return ERR_PTR(ret); } entry = kmem_cache_zalloc(btrfs_ordered_extent_cache, GFP_NOFS); - if (!entry) + if (!entry) { + if (!is_nocow) + btrfs_qgroup_free_refroot(inode->root->fs_info, + btrfs_root_id(inode->root), + qgroup_rsv, BTRFS_QGROUP_RSV_DATA); return ERR_PTR(-ENOMEM); + } entry->file_offset = file_offset; entry->num_bytes = num_bytes; -- GitLab From 4b58be1bc42281ed534642869d7164842d8aea79 Mon Sep 17 00:00:00 2001 From: Dave Kleikamp Date: Thu, 20 Feb 2025 10:31:19 -0600 Subject: [PATCH 1703/2211] fs/jfs: consolidate sanity checking in dbMount [ Upstream commit 0d250b1c52484d489e31df2cf9118b7c4bd49d31 ] Sanity checks have been added to dbMount as individual if clauses with identical error handling. Move these all into one clause. Signed-off-by: Dave Kleikamp Stable-dep-of: 37bfb464ddca ("jfs: validate AG parameters in dbMount() to prevent crashes") Signed-off-by: Sasha Levin --- fs/jfs/jfs_dmap.c | 37 +++++++++---------------------------- 1 file changed, 9 insertions(+), 28 deletions(-) diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c index 0e1019382cf51..26e89d0c69b61 100644 --- a/fs/jfs/jfs_dmap.c +++ b/fs/jfs/jfs_dmap.c @@ -178,45 +178,26 @@ int dbMount(struct inode *ipbmap) dbmp_le = (struct dbmap_disk *) mp->data; bmp->db_mapsize = le64_to_cpu(dbmp_le->dn_mapsize); bmp->db_nfree = le64_to_cpu(dbmp_le->dn_nfree); - bmp->db_l2nbperpage = le32_to_cpu(dbmp_le->dn_l2nbperpage); - if (bmp->db_l2nbperpage > L2PSIZE - L2MINBLOCKSIZE || - bmp->db_l2nbperpage < 0) { - err = -EINVAL; - goto err_release_metapage; - } - bmp->db_numag = le32_to_cpu(dbmp_le->dn_numag); - if (!bmp->db_numag || bmp->db_numag > MAXAG) { - err = -EINVAL; - goto err_release_metapage; - } - bmp->db_maxlevel = le32_to_cpu(dbmp_le->dn_maxlevel); bmp->db_maxag = le32_to_cpu(dbmp_le->dn_maxag); bmp->db_agpref = le32_to_cpu(dbmp_le->dn_agpref); - if (bmp->db_maxag >= MAXAG || bmp->db_maxag < 0 || - bmp->db_agpref >= MAXAG || bmp->db_agpref < 0) { - err = -EINVAL; - goto err_release_metapage; - } - bmp->db_aglevel = le32_to_cpu(dbmp_le->dn_aglevel); bmp->db_agheight = le32_to_cpu(dbmp_le->dn_agheight); bmp->db_agwidth = le32_to_cpu(dbmp_le->dn_agwidth); - if (!bmp->db_agwidth) { - err = -EINVAL; - goto err_release_metapage; - } bmp->db_agstart = le32_to_cpu(dbmp_le->dn_agstart); bmp->db_agl2size = le32_to_cpu(dbmp_le->dn_agl2size); - if (bmp->db_agl2size > L2MAXL2SIZE - L2MAXAG || - bmp->db_agl2size < 0) { - err = -EINVAL; - goto err_release_metapage; - } - if (((bmp->db_mapsize - 1) >> bmp->db_agl2size) > MAXAG) { + if ((bmp->db_l2nbperpage > L2PSIZE - L2MINBLOCKSIZE) || + (bmp->db_l2nbperpage < 0) || + !bmp->db_numag || (bmp->db_numag > MAXAG) || + (bmp->db_maxag >= MAXAG) || (bmp->db_maxag < 0) || + (bmp->db_agpref >= MAXAG) || (bmp->db_agpref < 0) || + !bmp->db_agwidth || + (bmp->db_agl2size > L2MAXL2SIZE - L2MAXAG) || + (bmp->db_agl2size < 0) || + ((bmp->db_mapsize - 1) >> bmp->db_agl2size) > MAXAG) { err = -EINVAL; goto err_release_metapage; } -- GitLab From 8b69608c6b6779a7ab07ce4467a56df90152cfb9 Mon Sep 17 00:00:00 2001 From: Vasiliy Kovalev Date: Mon, 10 Mar 2025 11:56:02 +0300 Subject: [PATCH 1704/2211] jfs: validate AG parameters in dbMount() to prevent crashes [ Upstream commit 37bfb464ddca87f203071b5bd562cd91ddc0b40a ] Validate db_agheight, db_agwidth, and db_agstart in dbMount to catch corrupted metadata early and avoid undefined behavior in dbAllocAG. Limits are derived from L2LPERCTL, LPERCTL/MAXAG, and CTLTREESIZE: - agheight: 0 to L2LPERCTL/2 (0 to 5) ensures shift (L2LPERCTL - 2*agheight) >= 0. - agwidth: 1 to min(LPERCTL/MAXAG, 2^(L2LPERCTL - 2*agheight)) ensures agperlev >= 1. - Ranges: 1-8 (agheight 0-3), 1-4 (agheight 4), 1 (agheight 5). - LPERCTL/MAXAG = 1024/128 = 8 limits leaves per AG; 2^(10 - 2*agheight) prevents division to 0. - agstart: 0 to CTLTREESIZE-1 - agwidth*(MAXAG-1) keeps ti within stree (size 1365). - Ranges: 0-1237 (agwidth 1), 0-348 (agwidth 8). UBSAN: shift-out-of-bounds in fs/jfs/jfs_dmap.c:1400:9 shift exponent -335544310 is negative CPU: 0 UID: 0 PID: 5822 Comm: syz-executor130 Not tainted 6.14.0-rc5-syzkaller #0 Hardware name: Google Compute Engine/Google Compute Engine, BIOS Google 02/12/2025 Call Trace: __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x241/0x360 lib/dump_stack.c:120 ubsan_epilogue lib/ubsan.c:231 [inline] __ubsan_handle_shift_out_of_bounds+0x3c8/0x420 lib/ubsan.c:468 dbAllocAG+0x1087/0x10b0 fs/jfs/jfs_dmap.c:1400 dbDiscardAG+0x352/0xa20 fs/jfs/jfs_dmap.c:1613 jfs_ioc_trim+0x45a/0x6b0 fs/jfs/jfs_discard.c:105 jfs_ioctl+0x2cd/0x3e0 fs/jfs/ioctl.c:131 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:906 [inline] __se_sys_ioctl+0xf5/0x170 fs/ioctl.c:892 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f Found by Linux Verification Center (linuxtesting.org) with Syzkaller. Cc: stable@vger.kernel.org Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Reported-by: syzbot+fe8264911355151c487f@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=fe8264911355151c487f Signed-off-by: Vasiliy Kovalev Signed-off-by: Dave Kleikamp Signed-off-by: Sasha Levin --- fs/jfs/jfs_dmap.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c index 26e89d0c69b61..35e063c9f3a42 100644 --- a/fs/jfs/jfs_dmap.c +++ b/fs/jfs/jfs_dmap.c @@ -194,7 +194,11 @@ int dbMount(struct inode *ipbmap) !bmp->db_numag || (bmp->db_numag > MAXAG) || (bmp->db_maxag >= MAXAG) || (bmp->db_maxag < 0) || (bmp->db_agpref >= MAXAG) || (bmp->db_agpref < 0) || - !bmp->db_agwidth || + (bmp->db_agheight < 0) || (bmp->db_agheight > (L2LPERCTL >> 1)) || + (bmp->db_agwidth < 1) || (bmp->db_agwidth > (LPERCTL / MAXAG)) || + (bmp->db_agwidth > (1 << (L2LPERCTL - (bmp->db_agheight << 1)))) || + (bmp->db_agstart < 0) || + (bmp->db_agstart > (CTLTREESIZE - 1 - bmp->db_agwidth * (MAXAG - 1))) || (bmp->db_agl2size > L2MAXL2SIZE - L2MAXAG) || (bmp->db_agl2size < 0) || ((bmp->db_mapsize - 1) >> bmp->db_agl2size) > MAXAG) { -- GitLab From 2dc8ebfb6955996dd67490e40d2239d56dcc373d Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Mon, 24 Mar 2025 19:51:29 +0800 Subject: [PATCH 1705/2211] ASoC: codec: wcd9335: Convert to GPIO descriptors [ Upstream commit d5099bc1b56417733f4cccf10c61ee74dadd5562 ] of_gpio.h is deprecated, update the driver to use GPIO descriptors. - Use dev_gpiod_get to get GPIO descriptor. - Use gpiod_set_value to configure output value. With legacy of_gpio API, the driver set gpio value 0 to assert reset, and 1 to deassert reset. And the reset-gpios use GPIO_ACTIVE_LOW flag in DTS, so set GPIOD_OUT_LOW when get GPIO descriptors, and set value 1 means output low, set value 0 means output high with gpiod API. The in-tree DTS files have the right polarity set up already so we can expect this to "just work" Reviewed-by: Linus Walleij Signed-off-by: Peng Fan Link: https://patch.msgid.link/20250324-wcd-gpiod-v2-3-773f67ce3b56@nxp.com Reviewed-by: Bartosz Golaszewski Signed-off-by: Mark Brown Stable-dep-of: 9079db287fc3 ("ASoC: codecs: wcd9335: Fix missing free of regulator supplies") Signed-off-by: Sasha Levin --- sound/soc/codecs/wcd9335.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c index 373a31ddccb2d..db6a1facf8a92 100644 --- a/sound/soc/codecs/wcd9335.c +++ b/sound/soc/codecs/wcd9335.c @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include @@ -329,7 +329,7 @@ struct wcd9335_codec { int comp_enabled[COMPANDER_MAX]; int intr1; - int reset_gpio; + struct gpio_desc *reset_gpio; struct regulator_bulk_data supplies[WCD9335_MAX_SUPPLY]; unsigned int rx_port_value[WCD9335_RX_MAX]; @@ -4973,12 +4973,11 @@ static const struct regmap_irq_chip wcd9335_regmap_irq1_chip = { static int wcd9335_parse_dt(struct wcd9335_codec *wcd) { struct device *dev = wcd->dev; - struct device_node *np = dev->of_node; int ret; - wcd->reset_gpio = of_get_named_gpio(np, "reset-gpios", 0); - if (wcd->reset_gpio < 0) - return dev_err_probe(dev, wcd->reset_gpio, "Reset GPIO missing from DT\n"); + wcd->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(wcd->reset_gpio)) + return dev_err_probe(dev, PTR_ERR(wcd->reset_gpio), "Reset GPIO missing from DT\n"); wcd->mclk = devm_clk_get(dev, "mclk"); if (IS_ERR(wcd->mclk)) @@ -5021,9 +5020,9 @@ static int wcd9335_power_on_reset(struct wcd9335_codec *wcd) */ usleep_range(600, 650); - gpio_direction_output(wcd->reset_gpio, 0); + gpiod_set_value(wcd->reset_gpio, 1); msleep(20); - gpio_set_value(wcd->reset_gpio, 1); + gpiod_set_value(wcd->reset_gpio, 0); msleep(20); return 0; -- GitLab From a8795f3cd289cd958f6396a1b43ba46fa8e22a2e Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Mon, 26 May 2025 11:47:01 +0200 Subject: [PATCH 1706/2211] ASoC: codecs: wcd9335: Fix missing free of regulator supplies [ Upstream commit 9079db287fc3e38e040b0edeb0a25770bb679c8e ] Driver gets and enables all regulator supplies in probe path (wcd9335_parse_dt() and wcd9335_power_on_reset()), but does not cleanup in final error paths and in unbind (missing remove() callback). This leads to leaked memory and unbalanced regulator enable count during probe errors or unbind. Fix this by converting entire code into devm_regulator_bulk_get_enable() which also greatly simplifies the code. Fixes: 20aedafdf492 ("ASoC: wcd9335: add support to wcd9335 codec") Cc: stable@vger.kernel.org Signed-off-by: Krzysztof Kozlowski Link: https://patch.msgid.link/20250526-b4-b4-asoc-wcd9395-vdd-px-fixes-v1-1-0b8a2993b7d3@linaro.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/wcd9335.c | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c index db6a1facf8a92..1375ac571fbf3 100644 --- a/sound/soc/codecs/wcd9335.c +++ b/sound/soc/codecs/wcd9335.c @@ -330,7 +330,6 @@ struct wcd9335_codec { int intr1; struct gpio_desc *reset_gpio; - struct regulator_bulk_data supplies[WCD9335_MAX_SUPPLY]; unsigned int rx_port_value[WCD9335_RX_MAX]; unsigned int tx_port_value[WCD9335_TX_MAX]; @@ -353,6 +352,10 @@ struct wcd9335_irq { char *name; }; +static const char * const wcd9335_supplies[] = { + "vdd-buck", "vdd-buck-sido", "vdd-tx", "vdd-rx", "vdd-io", +}; + static const struct wcd9335_slim_ch wcd9335_tx_chs[WCD9335_TX_MAX] = { WCD9335_SLIM_TX_CH(0), WCD9335_SLIM_TX_CH(1), @@ -4987,30 +4990,16 @@ static int wcd9335_parse_dt(struct wcd9335_codec *wcd) if (IS_ERR(wcd->native_clk)) return dev_err_probe(dev, PTR_ERR(wcd->native_clk), "slimbus clock not found\n"); - wcd->supplies[0].supply = "vdd-buck"; - wcd->supplies[1].supply = "vdd-buck-sido"; - wcd->supplies[2].supply = "vdd-tx"; - wcd->supplies[3].supply = "vdd-rx"; - wcd->supplies[4].supply = "vdd-io"; - - ret = regulator_bulk_get(dev, WCD9335_MAX_SUPPLY, wcd->supplies); + ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(wcd9335_supplies), + wcd9335_supplies); if (ret) - return dev_err_probe(dev, ret, "Failed to get supplies\n"); + return dev_err_probe(dev, ret, "Failed to get and enable supplies\n"); return 0; } static int wcd9335_power_on_reset(struct wcd9335_codec *wcd) { - struct device *dev = wcd->dev; - int ret; - - ret = regulator_bulk_enable(WCD9335_MAX_SUPPLY, wcd->supplies); - if (ret) { - dev_err(dev, "Failed to get supplies: err = %d\n", ret); - return ret; - } - /* * For WCD9335, it takes about 600us for the Vout_A and * Vout_D to be ready after BUCK_SIDO is powered up. -- GitLab From 4149f0ee5e0850b57d8b91b9f0139f4166a64ba7 Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Tue, 13 May 2025 19:25:38 +0800 Subject: [PATCH 1707/2211] f2fs: don't over-report free space or inodes in statvfs [ Upstream commit a9201960623287927bf5776de3f70fb2fbde7e02 ] This fixes an analogus bug that was fixed in modern filesystems: a) xfs in commit 4b8d867ca6e2 ("xfs: don't over-report free space or inodes in statvfs") b) ext4 in commit f87d3af74193 ("ext4: don't over-report free space or inodes in statvfs") where statfs can report misleading / incorrect information where project quota is enabled, and the free space is less than the remaining quota. This commit will resolve a test failure in generic/762 which tests for this bug. generic/762 - output mismatch (see /share/git/fstests/results//generic/762.out.bad) # --- tests/generic/762.out 2025-04-15 10:21:53.371067071 +0800 # +++ /share/git/fstests/results//generic/762.out.bad 2025-05-13 16:13:37.000000000 +0800 # @@ -6,8 +6,10 @@ # root blocks2 is in range # dir blocks2 is in range # root bavail2 is in range # -dir bavail2 is in range # +dir bavail2 has value of 1539066 # +dir bavail2 is NOT in range 304734.87 .. 310891.13 # root blocks3 is in range # ... # (Run 'diff -u /share/git/fstests/tests/generic/762.out /share/git/fstests/results//generic/762.out.bad' to see the entire diff) HINT: You _MAY_ be missing kernel fix: XXXXXXXXXXXXXX xfs: don't over-report free space or inodes in statvfs Cc: stable@kernel.org Fixes: ddc34e328d06 ("f2fs: introduce f2fs_statfs_project") Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/super.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 330f89ddb5c8f..f0e83ea56e38c 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1787,26 +1787,32 @@ static int f2fs_statfs_project(struct super_block *sb, limit = min_not_zero(dquot->dq_dqb.dqb_bsoftlimit, dquot->dq_dqb.dqb_bhardlimit); - if (limit) - limit >>= sb->s_blocksize_bits; + limit >>= sb->s_blocksize_bits; + + if (limit) { + uint64_t remaining = 0; - if (limit && buf->f_blocks > limit) { curblock = (dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace) >> sb->s_blocksize_bits; - buf->f_blocks = limit; - buf->f_bfree = buf->f_bavail = - (buf->f_blocks > curblock) ? - (buf->f_blocks - curblock) : 0; + if (limit > curblock) + remaining = limit - curblock; + + buf->f_blocks = min(buf->f_blocks, limit); + buf->f_bfree = min(buf->f_bfree, remaining); + buf->f_bavail = min(buf->f_bavail, remaining); } limit = min_not_zero(dquot->dq_dqb.dqb_isoftlimit, dquot->dq_dqb.dqb_ihardlimit); - if (limit && buf->f_files > limit) { - buf->f_files = limit; - buf->f_ffree = - (buf->f_files > dquot->dq_dqb.dqb_curinodes) ? - (buf->f_files - dquot->dq_dqb.dqb_curinodes) : 0; + if (limit) { + uint64_t remaining = 0; + + if (limit > dquot->dq_dqb.dqb_curinodes) + remaining = limit - dquot->dq_dqb.dqb_curinodes; + + buf->f_files = min(buf->f_files, limit); + buf->f_ffree = min(buf->f_ffree, remaining); } spin_unlock(&dquot->dq_dqb_lock); -- GitLab From b5939ac40380f5c570185ac4a48673422a2feafa Mon Sep 17 00:00:00 2001 From: Zhang Zekun Date: Sat, 31 Aug 2024 12:04:12 +0800 Subject: [PATCH 1708/2211] PCI: apple: Use helper function for_each_child_of_node_scoped() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit f60b4e06a945f25d463ae065c6e41c6e24faee0a ] The for_each_available_child_of_node_scoped() helper provides a scope-based clean-up functionality to put the device_node automatically, and as such, there is no need to call of_node_put() directly. Thus, use this helper to simplify the code. Signed-off-by: Zhang Zekun Reviewed-by: Jonathan Cameron Reviewed-by: Manivannan Sadhasivam Link: https://lore.kernel.org/r/20240831040413.126417-6-zhangzekun11@huawei.com [kwilczynski: commit log] Signed-off-by: Krzysztof Wilczyński Stable-dep-of: 751bec089c4e ("PCI: apple: Set only available ports up") Signed-off-by: Sasha Levin --- drivers/pci/controller/pcie-apple.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c index 7f02fe198d41c..43280a366266b 100644 --- a/drivers/pci/controller/pcie-apple.c +++ b/drivers/pci/controller/pcie-apple.c @@ -767,7 +767,6 @@ static int apple_pcie_init(struct pci_config_window *cfg) { struct device *dev = cfg->parent; struct platform_device *platform = to_platform_device(dev); - struct device_node *of_port; struct apple_pcie *pcie; int ret; @@ -790,11 +789,10 @@ static int apple_pcie_init(struct pci_config_window *cfg) if (ret) return ret; - for_each_child_of_node(dev->of_node, of_port) { + for_each_child_of_node_scoped(dev->of_node, of_port) { ret = apple_pcie_setup_port(pcie, of_port); if (ret) { dev_err(pcie->dev, "Port %pOF setup fail: %d\n", of_port, ret); - of_node_put(of_port); return ret; } } -- GitLab From fe823232012572381b5801f126c31958163ec421 Mon Sep 17 00:00:00 2001 From: Janne Grunau Date: Tue, 1 Apr 2025 10:17:01 +0100 Subject: [PATCH 1709/2211] PCI: apple: Set only available ports up [ Upstream commit 751bec089c4eed486578994abd2c5395f08d0302 ] Iterating over disabled ports results in of_irq_parse_raw() parsing the wrong "interrupt-map" entries, as it takes the status of the node into account. This became apparent after disabling unused PCIe ports in the Apple Silicon device trees instead of deleting them. Switching from for_each_child_of_node_scoped() to for_each_available_child_of_node_scoped() solves this issue. Fixes: 1e33888fbe44 ("PCI: apple: Add initial hardware bring-up") Fixes: a0189fdfb73d ("arm64: dts: apple: t8103: Disable unused PCIe ports") Signed-off-by: Janne Grunau Signed-off-by: Alyssa Rosenzweig Signed-off-by: Marc Zyngier Signed-off-by: Manivannan Sadhasivam Tested-by: Janne Grunau Reviewed-by: Rob Herring (Arm) Reviewed-by: Manivannan Sadhasivam Acked-by: Alyssa Rosenzweig Cc: stable@vger.kernel.org Link: https://lore.kernel.org/asahi/20230214-apple_dts_pcie_disable_unused-v1-0-5ea0d3ddcde3@jannau.net/ Link: https://lore.kernel.org/asahi/1ea2107a-bb86-8c22-0bbc-82c453ab08ce@linaro.org/ Link: https://patch.msgid.link/20250401091713.2765724-2-maz@kernel.org Signed-off-by: Sasha Levin --- drivers/pci/controller/pcie-apple.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c index 43280a366266b..16725f9536f65 100644 --- a/drivers/pci/controller/pcie-apple.c +++ b/drivers/pci/controller/pcie-apple.c @@ -789,7 +789,7 @@ static int apple_pcie_init(struct pci_config_window *cfg) if (ret) return ret; - for_each_child_of_node_scoped(dev->of_node, of_port) { + for_each_available_child_of_node_scoped(dev->of_node, of_port) { ret = apple_pcie_setup_port(pcie, of_port); if (ret) { dev_err(pcie->dev, "Port %pOF setup fail: %d\n", of_port, ret); -- GitLab From 341de32ea4d6e728cee3430753ea78edbbb8ff44 Mon Sep 17 00:00:00 2001 From: Karol Wachowski Date: Mon, 30 Sep 2024 21:53:16 +0200 Subject: [PATCH 1710/2211] accel/ivpu: Do not fail on cmdq if failed to allocate preemption buffers [ Upstream commit 08eb99ce911d3ea202f79b42b96cd6e8498f7f69 ] Allow to proceed with job command queue creation even if preemption buffers failed to be allocated, print warning that preemption on such command queue will be disabled. Signed-off-by: Karol Wachowski Reviewed-by: Jacek Lawrynowicz Reviewed-by: Jeffrey Hugo Link: https://patchwork.freedesktop.org/patch/msgid/20240930195322.461209-26-jacek.lawrynowicz@linux.intel.com Signed-off-by: Jacek Lawrynowicz Stable-dep-of: a47e36dc5d90 ("accel/ivpu: Trigger device recovery on engine reset/resume failure") Signed-off-by: Sasha Levin --- drivers/accel/ivpu/ivpu_job.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_job.c b/drivers/accel/ivpu/ivpu_job.c index 27121c66e48f8..58d64a221a1e0 100644 --- a/drivers/accel/ivpu/ivpu_job.c +++ b/drivers/accel/ivpu/ivpu_job.c @@ -60,6 +60,7 @@ static int ivpu_preemption_buffers_create(struct ivpu_device *vdev, err_free_primary: ivpu_bo_free(cmdq->primary_preempt_buf); + cmdq->primary_preempt_buf = NULL; return -ENOMEM; } @@ -69,10 +70,10 @@ static void ivpu_preemption_buffers_free(struct ivpu_device *vdev, if (vdev->fw->sched_mode != VPU_SCHEDULING_MODE_HW) return; - drm_WARN_ON(&vdev->drm, !cmdq->primary_preempt_buf); - drm_WARN_ON(&vdev->drm, !cmdq->secondary_preempt_buf); - ivpu_bo_free(cmdq->primary_preempt_buf); - ivpu_bo_free(cmdq->secondary_preempt_buf); + if (cmdq->primary_preempt_buf) + ivpu_bo_free(cmdq->primary_preempt_buf); + if (cmdq->secondary_preempt_buf) + ivpu_bo_free(cmdq->secondary_preempt_buf); } static struct ivpu_cmdq *ivpu_cmdq_alloc(struct ivpu_file_priv *file_priv) @@ -98,12 +99,10 @@ static struct ivpu_cmdq *ivpu_cmdq_alloc(struct ivpu_file_priv *file_priv) ret = ivpu_preemption_buffers_create(vdev, file_priv, cmdq); if (ret) - goto err_free_cmdq_mem; + ivpu_warn(vdev, "Failed to allocate preemption buffers, preemption limited\n"); return cmdq; -err_free_cmdq_mem: - ivpu_bo_free(cmdq->mem); err_erase_xa: xa_erase(&vdev->db_xa, cmdq->db_id); err_free_cmdq: @@ -363,10 +362,16 @@ static int ivpu_cmdq_push_job(struct ivpu_cmdq *cmdq, struct ivpu_job *job) if (vdev->fw->sched_mode == VPU_SCHEDULING_MODE_HW && (unlikely(!(ivpu_test_mode & IVPU_TEST_MODE_PREEMPTION_DISABLE)))) { - entry->primary_preempt_buf_addr = cmdq->primary_preempt_buf->vpu_addr; - entry->primary_preempt_buf_size = ivpu_bo_size(cmdq->primary_preempt_buf); - entry->secondary_preempt_buf_addr = cmdq->secondary_preempt_buf->vpu_addr; - entry->secondary_preempt_buf_size = ivpu_bo_size(cmdq->secondary_preempt_buf); + if (cmdq->primary_preempt_buf) { + entry->primary_preempt_buf_addr = cmdq->primary_preempt_buf->vpu_addr; + entry->primary_preempt_buf_size = ivpu_bo_size(cmdq->primary_preempt_buf); + } + + if (cmdq->secondary_preempt_buf) { + entry->secondary_preempt_buf_addr = cmdq->secondary_preempt_buf->vpu_addr; + entry->secondary_preempt_buf_size = + ivpu_bo_size(cmdq->secondary_preempt_buf); + } } wmb(); /* Ensure that tail is updated after filling entry */ -- GitLab From 0c3fa6e8441b1e1d18923fa121ea5f6f1793cf08 Mon Sep 17 00:00:00 2001 From: Andrzej Kacprowski Date: Thu, 17 Oct 2024 16:58:09 +0200 Subject: [PATCH 1711/2211] accel/ivpu: Remove copy engine support [ Upstream commit 94b2a2c0e7cba3f163609dbd94120ee533ad2a07 ] Copy engine was deprecated by the FW and is no longer supported. Compute engine includes all copy engine functionality and should be used instead. This change does not affect user space as the copy engine was never used outside of a couple of tests. Signed-off-by: Andrzej Kacprowski Reviewed-by: Jacek Lawrynowicz Reviewed-by: Jeffrey Hugo Signed-off-by: Jacek Lawrynowicz Link: https://patchwork.freedesktop.org/patch/msgid/20241017145817.121590-4-jacek.lawrynowicz@linux.intel.com Stable-dep-of: a47e36dc5d90 ("accel/ivpu: Trigger device recovery on engine reset/resume failure") Signed-off-by: Sasha Levin --- drivers/accel/ivpu/ivpu_drv.h | 5 +--- drivers/accel/ivpu/ivpu_job.c | 43 +++++++++++-------------------- drivers/accel/ivpu/ivpu_jsm_msg.c | 8 +++--- include/uapi/drm/ivpu_accel.h | 6 +---- 4 files changed, 21 insertions(+), 41 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_drv.h b/drivers/accel/ivpu/ivpu_drv.h index 1fe6a3bd4e36b..4519c93fb377c 100644 --- a/drivers/accel/ivpu/ivpu_drv.h +++ b/drivers/accel/ivpu/ivpu_drv.h @@ -50,11 +50,8 @@ #define IVPU_JOB_ID_JOB_MASK GENMASK(7, 0) #define IVPU_JOB_ID_CONTEXT_MASK GENMASK(31, 8) -#define IVPU_NUM_ENGINES 2 #define IVPU_NUM_PRIORITIES 4 -#define IVPU_NUM_CMDQS_PER_CTX (IVPU_NUM_ENGINES * IVPU_NUM_PRIORITIES) - -#define IVPU_CMDQ_INDEX(engine, priority) ((engine) * IVPU_NUM_PRIORITIES + (priority)) +#define IVPU_NUM_CMDQS_PER_CTX (IVPU_NUM_PRIORITIES) #define IVPU_PLATFORM_SILICON 0 #define IVPU_PLATFORM_SIMICS 2 diff --git a/drivers/accel/ivpu/ivpu_job.c b/drivers/accel/ivpu/ivpu_job.c index 58d64a221a1e0..ed3f60d809bc0 100644 --- a/drivers/accel/ivpu/ivpu_job.c +++ b/drivers/accel/ivpu/ivpu_job.c @@ -224,8 +224,7 @@ static int ivpu_cmdq_fini(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cm static struct ivpu_cmdq *ivpu_cmdq_acquire(struct ivpu_file_priv *file_priv, u16 engine, u8 priority) { - int cmdq_idx = IVPU_CMDQ_INDEX(engine, priority); - struct ivpu_cmdq *cmdq = file_priv->cmdq[cmdq_idx]; + struct ivpu_cmdq *cmdq = file_priv->cmdq[priority]; int ret; lockdep_assert_held(&file_priv->lock); @@ -234,7 +233,7 @@ static struct ivpu_cmdq *ivpu_cmdq_acquire(struct ivpu_file_priv *file_priv, u16 cmdq = ivpu_cmdq_alloc(file_priv); if (!cmdq) return NULL; - file_priv->cmdq[cmdq_idx] = cmdq; + file_priv->cmdq[priority] = cmdq; } ret = ivpu_cmdq_init(file_priv, cmdq, engine, priority); @@ -244,15 +243,14 @@ static struct ivpu_cmdq *ivpu_cmdq_acquire(struct ivpu_file_priv *file_priv, u16 return cmdq; } -static void ivpu_cmdq_release_locked(struct ivpu_file_priv *file_priv, u16 engine, u8 priority) +static void ivpu_cmdq_release_locked(struct ivpu_file_priv *file_priv, u8 priority) { - int cmdq_idx = IVPU_CMDQ_INDEX(engine, priority); - struct ivpu_cmdq *cmdq = file_priv->cmdq[cmdq_idx]; + struct ivpu_cmdq *cmdq = file_priv->cmdq[priority]; lockdep_assert_held(&file_priv->lock); if (cmdq) { - file_priv->cmdq[cmdq_idx] = NULL; + file_priv->cmdq[priority] = NULL; ivpu_cmdq_fini(file_priv, cmdq); ivpu_cmdq_free(file_priv, cmdq); } @@ -260,14 +258,12 @@ static void ivpu_cmdq_release_locked(struct ivpu_file_priv *file_priv, u16 engin void ivpu_cmdq_release_all_locked(struct ivpu_file_priv *file_priv) { - u16 engine; u8 priority; lockdep_assert_held(&file_priv->lock); - for (engine = 0; engine < IVPU_NUM_ENGINES; engine++) - for (priority = 0; priority < IVPU_NUM_PRIORITIES; priority++) - ivpu_cmdq_release_locked(file_priv, engine, priority); + for (priority = 0; priority < IVPU_NUM_PRIORITIES; priority++) + ivpu_cmdq_release_locked(file_priv, priority); } /* @@ -278,19 +274,15 @@ void ivpu_cmdq_release_all_locked(struct ivpu_file_priv *file_priv) */ static void ivpu_cmdq_reset(struct ivpu_file_priv *file_priv) { - u16 engine; u8 priority; mutex_lock(&file_priv->lock); - for (engine = 0; engine < IVPU_NUM_ENGINES; engine++) { - for (priority = 0; priority < IVPU_NUM_PRIORITIES; priority++) { - int cmdq_idx = IVPU_CMDQ_INDEX(engine, priority); - struct ivpu_cmdq *cmdq = file_priv->cmdq[cmdq_idx]; + for (priority = 0; priority < IVPU_NUM_PRIORITIES; priority++) { + struct ivpu_cmdq *cmdq = file_priv->cmdq[priority]; - if (cmdq) - cmdq->db_registered = false; - } + if (cmdq) + cmdq->db_registered = false; } mutex_unlock(&file_priv->lock); @@ -311,16 +303,11 @@ void ivpu_cmdq_reset_all_contexts(struct ivpu_device *vdev) static void ivpu_cmdq_fini_all(struct ivpu_file_priv *file_priv) { - u16 engine; u8 priority; - for (engine = 0; engine < IVPU_NUM_ENGINES; engine++) { - for (priority = 0; priority < IVPU_NUM_PRIORITIES; priority++) { - int cmdq_idx = IVPU_CMDQ_INDEX(engine, priority); - - if (file_priv->cmdq[cmdq_idx]) - ivpu_cmdq_fini(file_priv, file_priv->cmdq[cmdq_idx]); - } + for (priority = 0; priority < IVPU_NUM_PRIORITIES; priority++) { + if (file_priv->cmdq[priority]) + ivpu_cmdq_fini(file_priv, file_priv->cmdq[priority]); } } @@ -703,7 +690,7 @@ int ivpu_submit_ioctl(struct drm_device *dev, void *data, struct drm_file *file) int idx, ret; u8 priority; - if (params->engine > DRM_IVPU_ENGINE_COPY) + if (params->engine != DRM_IVPU_ENGINE_COMPUTE) return -EINVAL; if (params->priority > DRM_IVPU_JOB_PRIORITY_REALTIME) diff --git a/drivers/accel/ivpu/ivpu_jsm_msg.c b/drivers/accel/ivpu/ivpu_jsm_msg.c index ae91ad24d10d8..33d597b2a7f53 100644 --- a/drivers/accel/ivpu/ivpu_jsm_msg.c +++ b/drivers/accel/ivpu/ivpu_jsm_msg.c @@ -132,7 +132,7 @@ int ivpu_jsm_get_heartbeat(struct ivpu_device *vdev, u32 engine, u64 *heartbeat) struct vpu_jsm_msg resp; int ret; - if (engine > VPU_ENGINE_COPY) + if (engine != VPU_ENGINE_COMPUTE) return -EINVAL; req.payload.query_engine_hb.engine_idx = engine; @@ -155,7 +155,7 @@ int ivpu_jsm_reset_engine(struct ivpu_device *vdev, u32 engine) struct vpu_jsm_msg resp; int ret; - if (engine > VPU_ENGINE_COPY) + if (engine != VPU_ENGINE_COMPUTE) return -EINVAL; req.payload.engine_reset.engine_idx = engine; @@ -174,7 +174,7 @@ int ivpu_jsm_preempt_engine(struct ivpu_device *vdev, u32 engine, u32 preempt_id struct vpu_jsm_msg resp; int ret; - if (engine > VPU_ENGINE_COPY) + if (engine != VPU_ENGINE_COMPUTE) return -EINVAL; req.payload.engine_preempt.engine_idx = engine; @@ -346,7 +346,7 @@ int ivpu_jsm_hws_resume_engine(struct ivpu_device *vdev, u32 engine) struct vpu_jsm_msg resp; int ret; - if (engine >= VPU_ENGINE_NB) + if (engine != VPU_ENGINE_COMPUTE) return -EINVAL; req.payload.hws_resume_engine.engine_idx = engine; diff --git a/include/uapi/drm/ivpu_accel.h b/include/uapi/drm/ivpu_accel.h index 13001da141c33..4b261eb705bc0 100644 --- a/include/uapi/drm/ivpu_accel.h +++ b/include/uapi/drm/ivpu_accel.h @@ -261,7 +261,7 @@ struct drm_ivpu_bo_info { /* drm_ivpu_submit engines */ #define DRM_IVPU_ENGINE_COMPUTE 0 -#define DRM_IVPU_ENGINE_COPY 1 +#define DRM_IVPU_ENGINE_COPY 1 /* Deprecated */ /** * struct drm_ivpu_submit - Submit commands to the VPU @@ -292,10 +292,6 @@ struct drm_ivpu_submit { * %DRM_IVPU_ENGINE_COMPUTE: * * Performs Deep Learning Neural Compute Inference Operations - * - * %DRM_IVPU_ENGINE_COPY: - * - * Performs memory copy operations to/from system memory allocated for VPU */ __u32 engine; -- GitLab From fbc93866b0cf0aafa64fa29f9ff1c6a9b0db9357 Mon Sep 17 00:00:00 2001 From: Karol Wachowski Date: Thu, 17 Oct 2024 16:58:13 +0200 Subject: [PATCH 1712/2211] accel/ivpu: Make command queue ID allocated on XArray [ Upstream commit 76ad741ec7349bb1112f3a0ff27adf1ca75cf025 ] Use XArray for dynamic command queue ID allocations instead of fixed ones. This is required by upcoming changes to UAPI that will allow to manage command queues by user space instead of having predefined number of queues in a context. Signed-off-by: Karol Wachowski Reviewed-by: Jacek Lawrynowicz Reviewed-by: Jeffrey Hugo Signed-off-by: Jacek Lawrynowicz Link: https://patchwork.freedesktop.org/patch/msgid/20241017145817.121590-8-jacek.lawrynowicz@linux.intel.com Stable-dep-of: a47e36dc5d90 ("accel/ivpu: Trigger device recovery on engine reset/resume failure") Signed-off-by: Sasha Levin --- drivers/accel/ivpu/ivpu_drv.c | 6 +++ drivers/accel/ivpu/ivpu_drv.h | 7 ++- drivers/accel/ivpu/ivpu_job.c | 91 ++++++++++++++++++----------------- drivers/accel/ivpu/ivpu_job.h | 2 + 4 files changed, 60 insertions(+), 46 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_drv.c b/drivers/accel/ivpu/ivpu_drv.c index 67d56a944d549..00208c4a65807 100644 --- a/drivers/accel/ivpu/ivpu_drv.c +++ b/drivers/accel/ivpu/ivpu_drv.c @@ -102,6 +102,8 @@ static void file_priv_release(struct kref *ref) pm_runtime_get_sync(vdev->drm.dev); mutex_lock(&vdev->context_list_lock); file_priv_unbind(vdev, file_priv); + drm_WARN_ON(&vdev->drm, !xa_empty(&file_priv->cmdq_xa)); + xa_destroy(&file_priv->cmdq_xa); mutex_unlock(&vdev->context_list_lock); pm_runtime_put_autosuspend(vdev->drm.dev); @@ -261,6 +263,10 @@ static int ivpu_open(struct drm_device *dev, struct drm_file *file) file_priv->job_limit.min = FIELD_PREP(IVPU_JOB_ID_CONTEXT_MASK, (file_priv->ctx.id - 1)); file_priv->job_limit.max = file_priv->job_limit.min | IVPU_JOB_ID_JOB_MASK; + xa_init_flags(&file_priv->cmdq_xa, XA_FLAGS_ALLOC1); + file_priv->cmdq_limit.min = IVPU_CMDQ_MIN_ID; + file_priv->cmdq_limit.max = IVPU_CMDQ_MAX_ID; + mutex_unlock(&vdev->context_list_lock); drm_dev_exit(idx); diff --git a/drivers/accel/ivpu/ivpu_drv.h b/drivers/accel/ivpu/ivpu_drv.h index 4519c93fb377c..f2ba3ed8b3fc5 100644 --- a/drivers/accel/ivpu/ivpu_drv.h +++ b/drivers/accel/ivpu/ivpu_drv.h @@ -53,6 +53,9 @@ #define IVPU_NUM_PRIORITIES 4 #define IVPU_NUM_CMDQS_PER_CTX (IVPU_NUM_PRIORITIES) +#define IVPU_CMDQ_MIN_ID 1 +#define IVPU_CMDQ_MAX_ID 255 + #define IVPU_PLATFORM_SILICON 0 #define IVPU_PLATFORM_SIMICS 2 #define IVPU_PLATFORM_FPGA 3 @@ -171,13 +174,15 @@ struct ivpu_file_priv { struct kref ref; struct ivpu_device *vdev; struct mutex lock; /* Protects cmdq */ - struct ivpu_cmdq *cmdq[IVPU_NUM_CMDQS_PER_CTX]; + struct xarray cmdq_xa; struct ivpu_mmu_context ctx; struct mutex ms_lock; /* Protects ms_instance_list, ms_info_bo */ struct list_head ms_instance_list; struct ivpu_bo *ms_info_bo; struct xa_limit job_limit; u32 job_id_next; + struct xa_limit cmdq_limit; + u32 cmdq_id_next; bool has_mmu_faults; bool bound; bool aborted; diff --git a/drivers/accel/ivpu/ivpu_job.c b/drivers/accel/ivpu/ivpu_job.c index ed3f60d809bc0..5eaf219170eee 100644 --- a/drivers/accel/ivpu/ivpu_job.c +++ b/drivers/accel/ivpu/ivpu_job.c @@ -93,9 +93,16 @@ static struct ivpu_cmdq *ivpu_cmdq_alloc(struct ivpu_file_priv *file_priv) goto err_free_cmdq; } + ret = xa_alloc_cyclic(&file_priv->cmdq_xa, &cmdq->id, cmdq, file_priv->cmdq_limit, + &file_priv->cmdq_id_next, GFP_KERNEL); + if (ret < 0) { + ivpu_err(vdev, "Failed to allocate command queue id: %d\n", ret); + goto err_erase_db_xa; + } + cmdq->mem = ivpu_bo_create_global(vdev, SZ_4K, DRM_IVPU_BO_WC | DRM_IVPU_BO_MAPPABLE); if (!cmdq->mem) - goto err_erase_xa; + goto err_erase_cmdq_xa; ret = ivpu_preemption_buffers_create(vdev, file_priv, cmdq); if (ret) @@ -103,7 +110,9 @@ static struct ivpu_cmdq *ivpu_cmdq_alloc(struct ivpu_file_priv *file_priv) return cmdq; -err_erase_xa: +err_erase_cmdq_xa: + xa_erase(&file_priv->cmdq_xa, cmdq->id); +err_erase_db_xa: xa_erase(&vdev->db_xa, cmdq->db_id); err_free_cmdq: kfree(cmdq); @@ -127,13 +136,13 @@ static int ivpu_hws_cmdq_init(struct ivpu_file_priv *file_priv, struct ivpu_cmdq struct ivpu_device *vdev = file_priv->vdev; int ret; - ret = ivpu_jsm_hws_create_cmdq(vdev, file_priv->ctx.id, file_priv->ctx.id, cmdq->db_id, + ret = ivpu_jsm_hws_create_cmdq(vdev, file_priv->ctx.id, file_priv->ctx.id, cmdq->id, task_pid_nr(current), engine, cmdq->mem->vpu_addr, ivpu_bo_size(cmdq->mem)); if (ret) return ret; - ret = ivpu_jsm_hws_set_context_sched_properties(vdev, file_priv->ctx.id, cmdq->db_id, + ret = ivpu_jsm_hws_set_context_sched_properties(vdev, file_priv->ctx.id, cmdq->id, priority); if (ret) return ret; @@ -147,20 +156,21 @@ static int ivpu_register_db(struct ivpu_file_priv *file_priv, struct ivpu_cmdq * int ret; if (vdev->fw->sched_mode == VPU_SCHEDULING_MODE_HW) - ret = ivpu_jsm_hws_register_db(vdev, file_priv->ctx.id, cmdq->db_id, cmdq->db_id, + ret = ivpu_jsm_hws_register_db(vdev, file_priv->ctx.id, cmdq->id, cmdq->db_id, cmdq->mem->vpu_addr, ivpu_bo_size(cmdq->mem)); else ret = ivpu_jsm_register_db(vdev, file_priv->ctx.id, cmdq->db_id, cmdq->mem->vpu_addr, ivpu_bo_size(cmdq->mem)); if (!ret) - ivpu_dbg(vdev, JOB, "DB %d registered to ctx %d\n", cmdq->db_id, file_priv->ctx.id); + ivpu_dbg(vdev, JOB, "DB %d registered to cmdq %d ctx %d\n", + cmdq->db_id, cmdq->id, file_priv->ctx.id); return ret; } static int -ivpu_cmdq_init(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cmdq, u16 engine, u8 priority) +ivpu_cmdq_init(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cmdq, u8 priority) { struct ivpu_device *vdev = file_priv->vdev; struct vpu_job_queue_header *jobq_header; @@ -176,13 +186,13 @@ ivpu_cmdq_init(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cmdq, u16 eng cmdq->jobq = (struct vpu_job_queue *)ivpu_bo_vaddr(cmdq->mem); jobq_header = &cmdq->jobq->header; - jobq_header->engine_idx = engine; + jobq_header->engine_idx = VPU_ENGINE_COMPUTE; jobq_header->head = 0; jobq_header->tail = 0; wmb(); /* Flush WC buffer for jobq->header */ if (vdev->fw->sched_mode == VPU_SCHEDULING_MODE_HW) { - ret = ivpu_hws_cmdq_init(file_priv, cmdq, engine, priority); + ret = ivpu_hws_cmdq_init(file_priv, cmdq, VPU_ENGINE_COMPUTE, priority); if (ret) return ret; } @@ -209,9 +219,9 @@ static int ivpu_cmdq_fini(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cm cmdq->db_registered = false; if (vdev->fw->sched_mode == VPU_SCHEDULING_MODE_HW) { - ret = ivpu_jsm_hws_destroy_cmdq(vdev, file_priv->ctx.id, cmdq->db_id); + ret = ivpu_jsm_hws_destroy_cmdq(vdev, file_priv->ctx.id, cmdq->id); if (!ret) - ivpu_dbg(vdev, JOB, "Command queue %d destroyed\n", cmdq->db_id); + ivpu_dbg(vdev, JOB, "Command queue %d destroyed\n", cmdq->id); } ret = ivpu_jsm_unregister_db(vdev, cmdq->db_id); @@ -221,51 +231,46 @@ static int ivpu_cmdq_fini(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cm return 0; } -static struct ivpu_cmdq *ivpu_cmdq_acquire(struct ivpu_file_priv *file_priv, u16 engine, - u8 priority) +static struct ivpu_cmdq *ivpu_cmdq_acquire(struct ivpu_file_priv *file_priv, u8 priority) { - struct ivpu_cmdq *cmdq = file_priv->cmdq[priority]; + struct ivpu_cmdq *cmdq; + unsigned long cmdq_id; int ret; lockdep_assert_held(&file_priv->lock); + xa_for_each(&file_priv->cmdq_xa, cmdq_id, cmdq) + if (cmdq->priority == priority) + break; + if (!cmdq) { cmdq = ivpu_cmdq_alloc(file_priv); if (!cmdq) return NULL; - file_priv->cmdq[priority] = cmdq; + cmdq->priority = priority; } - ret = ivpu_cmdq_init(file_priv, cmdq, engine, priority); + ret = ivpu_cmdq_init(file_priv, cmdq, priority); if (ret) return NULL; return cmdq; } -static void ivpu_cmdq_release_locked(struct ivpu_file_priv *file_priv, u8 priority) +void ivpu_cmdq_release_all_locked(struct ivpu_file_priv *file_priv) { - struct ivpu_cmdq *cmdq = file_priv->cmdq[priority]; + struct ivpu_cmdq *cmdq; + unsigned long cmdq_id; lockdep_assert_held(&file_priv->lock); - if (cmdq) { - file_priv->cmdq[priority] = NULL; + xa_for_each(&file_priv->cmdq_xa, cmdq_id, cmdq) { + xa_erase(&file_priv->cmdq_xa, cmdq_id); ivpu_cmdq_fini(file_priv, cmdq); ivpu_cmdq_free(file_priv, cmdq); } } -void ivpu_cmdq_release_all_locked(struct ivpu_file_priv *file_priv) -{ - u8 priority; - - lockdep_assert_held(&file_priv->lock); - - for (priority = 0; priority < IVPU_NUM_PRIORITIES; priority++) - ivpu_cmdq_release_locked(file_priv, priority); -} - /* * Mark the doorbell as unregistered * This function needs to be called when the VPU hardware is restarted @@ -274,16 +279,13 @@ void ivpu_cmdq_release_all_locked(struct ivpu_file_priv *file_priv) */ static void ivpu_cmdq_reset(struct ivpu_file_priv *file_priv) { - u8 priority; + struct ivpu_cmdq *cmdq; + unsigned long cmdq_id; mutex_lock(&file_priv->lock); - for (priority = 0; priority < IVPU_NUM_PRIORITIES; priority++) { - struct ivpu_cmdq *cmdq = file_priv->cmdq[priority]; - - if (cmdq) - cmdq->db_registered = false; - } + xa_for_each(&file_priv->cmdq_xa, cmdq_id, cmdq) + cmdq->db_registered = false; mutex_unlock(&file_priv->lock); } @@ -303,12 +305,11 @@ void ivpu_cmdq_reset_all_contexts(struct ivpu_device *vdev) static void ivpu_cmdq_fini_all(struct ivpu_file_priv *file_priv) { - u8 priority; + struct ivpu_cmdq *cmdq; + unsigned long cmdq_id; - for (priority = 0; priority < IVPU_NUM_PRIORITIES; priority++) { - if (file_priv->cmdq[priority]) - ivpu_cmdq_fini(file_priv, file_priv->cmdq[priority]); - } + xa_for_each(&file_priv->cmdq_xa, cmdq_id, cmdq) + ivpu_cmdq_fini(file_priv, cmdq); } void ivpu_context_abort_locked(struct ivpu_file_priv *file_priv) @@ -335,8 +336,8 @@ static int ivpu_cmdq_push_job(struct ivpu_cmdq *cmdq, struct ivpu_job *job) /* Check if there is space left in job queue */ if (next_entry == header->head) { - ivpu_dbg(vdev, JOB, "Job queue full: ctx %d engine %d db %d head %d tail %d\n", - job->file_priv->ctx.id, job->engine_idx, cmdq->db_id, header->head, tail); + ivpu_dbg(vdev, JOB, "Job queue full: ctx %d cmdq %d db %d head %d tail %d\n", + job->file_priv->ctx.id, cmdq->id, cmdq->db_id, header->head, tail); return -EBUSY; } @@ -550,7 +551,7 @@ static int ivpu_job_submit(struct ivpu_job *job, u8 priority) mutex_lock(&vdev->submitted_jobs_lock); mutex_lock(&file_priv->lock); - cmdq = ivpu_cmdq_acquire(file_priv, job->engine_idx, priority); + cmdq = ivpu_cmdq_acquire(file_priv, priority); if (!cmdq) { ivpu_warn_ratelimited(vdev, "Failed to get job queue, ctx %d engine %d prio %d\n", file_priv->ctx.id, job->engine_idx, priority); diff --git a/drivers/accel/ivpu/ivpu_job.h b/drivers/accel/ivpu/ivpu_job.h index 0ae77f0638fad..af1ed039569cd 100644 --- a/drivers/accel/ivpu/ivpu_job.h +++ b/drivers/accel/ivpu/ivpu_job.h @@ -28,8 +28,10 @@ struct ivpu_cmdq { struct ivpu_bo *secondary_preempt_buf; struct ivpu_bo *mem; u32 entry_count; + u32 id; u32 db_id; bool db_registered; + u8 priority; }; /** -- GitLab From d80302350c32c56b927876fd9c8ed018b96cbb1c Mon Sep 17 00:00:00 2001 From: Karol Wachowski Date: Tue, 7 Jan 2025 18:32:24 +0100 Subject: [PATCH 1713/2211] accel/ivpu: Separate DB ID and CMDQ ID allocations from CMDQ allocation [ Upstream commit 950942b4813f8c44dbec683fdb140cf4a238516b ] Move doorbell ID and command queue ID XArray allocations from command queue memory allocation function. This will allow ID allocations to be done without the need for actual memory allocation. Signed-off-by: Karol Wachowski Signed-off-by: Maciej Falkowski Reviewed-by: Jacek Lawrynowicz Signed-off-by: Jacek Lawrynowicz Link: https://patchwork.freedesktop.org/patch/msgid/20250107173238.381120-2-maciej.falkowski@linux.intel.com Stable-dep-of: a47e36dc5d90 ("accel/ivpu: Trigger device recovery on engine reset/resume failure") Signed-off-by: Sasha Levin --- drivers/accel/ivpu/ivpu_job.c | 88 +++++++++++++++++++++++++---------- 1 file changed, 64 insertions(+), 24 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_job.c b/drivers/accel/ivpu/ivpu_job.c index 5eaf219170eee..e57acae3b42ef 100644 --- a/drivers/accel/ivpu/ivpu_job.c +++ b/drivers/accel/ivpu/ivpu_job.c @@ -86,23 +86,9 @@ static struct ivpu_cmdq *ivpu_cmdq_alloc(struct ivpu_file_priv *file_priv) if (!cmdq) return NULL; - ret = xa_alloc_cyclic(&vdev->db_xa, &cmdq->db_id, NULL, vdev->db_limit, &vdev->db_next, - GFP_KERNEL); - if (ret < 0) { - ivpu_err(vdev, "Failed to allocate doorbell id: %d\n", ret); - goto err_free_cmdq; - } - - ret = xa_alloc_cyclic(&file_priv->cmdq_xa, &cmdq->id, cmdq, file_priv->cmdq_limit, - &file_priv->cmdq_id_next, GFP_KERNEL); - if (ret < 0) { - ivpu_err(vdev, "Failed to allocate command queue id: %d\n", ret); - goto err_erase_db_xa; - } - cmdq->mem = ivpu_bo_create_global(vdev, SZ_4K, DRM_IVPU_BO_WC | DRM_IVPU_BO_MAPPABLE); if (!cmdq->mem) - goto err_erase_cmdq_xa; + goto err_free_cmdq; ret = ivpu_preemption_buffers_create(vdev, file_priv, cmdq); if (ret) @@ -110,10 +96,6 @@ static struct ivpu_cmdq *ivpu_cmdq_alloc(struct ivpu_file_priv *file_priv) return cmdq; -err_erase_cmdq_xa: - xa_erase(&file_priv->cmdq_xa, cmdq->id); -err_erase_db_xa: - xa_erase(&vdev->db_xa, cmdq->db_id); err_free_cmdq: kfree(cmdq); return NULL; @@ -231,30 +213,88 @@ static int ivpu_cmdq_fini(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cm return 0; } +static int ivpu_db_id_alloc(struct ivpu_device *vdev, u32 *db_id) +{ + int ret; + u32 id; + + ret = xa_alloc_cyclic(&vdev->db_xa, &id, NULL, vdev->db_limit, &vdev->db_next, GFP_KERNEL); + if (ret < 0) + return ret; + + *db_id = id; + return 0; +} + +static int ivpu_cmdq_id_alloc(struct ivpu_file_priv *file_priv, u32 *cmdq_id) +{ + int ret; + u32 id; + + ret = xa_alloc_cyclic(&file_priv->cmdq_xa, &id, NULL, file_priv->cmdq_limit, + &file_priv->cmdq_id_next, GFP_KERNEL); + if (ret < 0) + return ret; + + *cmdq_id = id; + return 0; +} + static struct ivpu_cmdq *ivpu_cmdq_acquire(struct ivpu_file_priv *file_priv, u8 priority) { + struct ivpu_device *vdev = file_priv->vdev; struct ivpu_cmdq *cmdq; - unsigned long cmdq_id; + unsigned long id; int ret; lockdep_assert_held(&file_priv->lock); - xa_for_each(&file_priv->cmdq_xa, cmdq_id, cmdq) + xa_for_each(&file_priv->cmdq_xa, id, cmdq) if (cmdq->priority == priority) break; if (!cmdq) { cmdq = ivpu_cmdq_alloc(file_priv); - if (!cmdq) + if (!cmdq) { + ivpu_err(vdev, "Failed to allocate command queue\n"); return NULL; + } + + ret = ivpu_db_id_alloc(vdev, &cmdq->db_id); + if (ret) { + ivpu_err(file_priv->vdev, "Failed to allocate doorbell ID: %d\n", ret); + goto err_free_cmdq; + } + + ret = ivpu_cmdq_id_alloc(file_priv, &cmdq->id); + if (ret) { + ivpu_err(vdev, "Failed to allocate command queue ID: %d\n", ret); + goto err_erase_db_id; + } + cmdq->priority = priority; + ret = xa_err(xa_store(&file_priv->cmdq_xa, cmdq->id, cmdq, GFP_KERNEL)); + if (ret) { + ivpu_err(vdev, "Failed to store command queue in cmdq_xa: %d\n", ret); + goto err_erase_cmdq_id; + } } ret = ivpu_cmdq_init(file_priv, cmdq, priority); - if (ret) - return NULL; + if (ret) { + ivpu_err(vdev, "Failed to initialize command queue: %d\n", ret); + goto err_free_cmdq; + } return cmdq; + +err_erase_cmdq_id: + xa_erase(&file_priv->cmdq_xa, cmdq->id); +err_erase_db_id: + xa_erase(&vdev->db_xa, cmdq->db_id); +err_free_cmdq: + ivpu_cmdq_free(file_priv, cmdq); + return NULL; } void ivpu_cmdq_release_all_locked(struct ivpu_file_priv *file_priv) -- GitLab From 397f3a7402faed3a3a212df1ccde8cea381bb8c2 Mon Sep 17 00:00:00 2001 From: Karol Wachowski Date: Tue, 4 Feb 2025 09:46:19 +0100 Subject: [PATCH 1714/2211] accel/ivpu: Add debugfs interface for setting HWS priority bands [ Upstream commit 320323d2e5456df9d6236ac1ce9c030b1a74aa5b ] Add debugfs interface to modify following priority bands properties: * grace period * process grace period * process quantum This allows for the adjustment of hardware scheduling algorithm parameters for each existing priority band, facilitating validation and fine-tuning. Reviewed-by: Jacek Lawrynowicz Signed-off-by: Karol Wachowski Signed-off-by: Jacek Lawrynowicz Link: https://patchwork.freedesktop.org/patch/msgid/20250204084622.2422544-4-jacek.lawrynowicz@linux.intel.com Stable-dep-of: a47e36dc5d90 ("accel/ivpu: Trigger device recovery on engine reset/resume failure") Signed-off-by: Sasha Levin --- drivers/accel/ivpu/ivpu_debugfs.c | 84 +++++++++++++++++++++++++++++++ drivers/accel/ivpu/ivpu_hw.c | 21 ++++++++ drivers/accel/ivpu/ivpu_hw.h | 5 ++ drivers/accel/ivpu/ivpu_jsm_msg.c | 29 ++++------- 4 files changed, 121 insertions(+), 18 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_debugfs.c b/drivers/accel/ivpu/ivpu_debugfs.c index 05a0d99ce95c4..1edf6e5644026 100644 --- a/drivers/accel/ivpu/ivpu_debugfs.c +++ b/drivers/accel/ivpu/ivpu_debugfs.c @@ -423,6 +423,88 @@ static int dct_active_set(void *data, u64 active_percent) DEFINE_DEBUGFS_ATTRIBUTE(ivpu_dct_fops, dct_active_get, dct_active_set, "%llu\n"); +static int priority_bands_show(struct seq_file *s, void *v) +{ + struct ivpu_device *vdev = s->private; + struct ivpu_hw_info *hw = vdev->hw; + + for (int band = VPU_JOB_SCHEDULING_PRIORITY_BAND_IDLE; + band < VPU_JOB_SCHEDULING_PRIORITY_BAND_COUNT; band++) { + switch (band) { + case VPU_JOB_SCHEDULING_PRIORITY_BAND_IDLE: + seq_puts(s, "Idle: "); + break; + + case VPU_JOB_SCHEDULING_PRIORITY_BAND_NORMAL: + seq_puts(s, "Normal: "); + break; + + case VPU_JOB_SCHEDULING_PRIORITY_BAND_FOCUS: + seq_puts(s, "Focus: "); + break; + + case VPU_JOB_SCHEDULING_PRIORITY_BAND_REALTIME: + seq_puts(s, "Realtime: "); + break; + } + + seq_printf(s, "grace_period %9u process_grace_period %9u process_quantum %9u\n", + hw->hws.grace_period[band], hw->hws.process_grace_period[band], + hw->hws.process_quantum[band]); + } + + return 0; +} + +static int priority_bands_fops_open(struct inode *inode, struct file *file) +{ + return single_open(file, priority_bands_show, inode->i_private); +} + +static ssize_t +priority_bands_fops_write(struct file *file, const char __user *user_buf, size_t size, loff_t *pos) +{ + struct seq_file *s = file->private_data; + struct ivpu_device *vdev = s->private; + char buf[64]; + u32 grace_period; + u32 process_grace_period; + u32 process_quantum; + u32 band; + int ret; + + if (size >= sizeof(buf)) + return -EINVAL; + + ret = simple_write_to_buffer(buf, sizeof(buf) - 1, pos, user_buf, size); + if (ret < 0) + return ret; + + buf[size] = '\0'; + ret = sscanf(buf, "%u %u %u %u", &band, &grace_period, &process_grace_period, + &process_quantum); + if (ret != 4) + return -EINVAL; + + if (band >= VPU_JOB_SCHEDULING_PRIORITY_BAND_COUNT) + return -EINVAL; + + vdev->hw->hws.grace_period[band] = grace_period; + vdev->hw->hws.process_grace_period[band] = process_grace_period; + vdev->hw->hws.process_quantum[band] = process_quantum; + + return size; +} + +static const struct file_operations ivpu_hws_priority_bands_fops = { + .owner = THIS_MODULE, + .open = priority_bands_fops_open, + .write = priority_bands_fops_write, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + void ivpu_debugfs_init(struct ivpu_device *vdev) { struct dentry *debugfs_root = vdev->drm.debugfs_root; @@ -445,6 +527,8 @@ void ivpu_debugfs_init(struct ivpu_device *vdev) &fw_trace_hw_comp_mask_fops); debugfs_create_file("fw_trace_level", 0200, debugfs_root, vdev, &fw_trace_level_fops); + debugfs_create_file("hws_priority_bands", 0200, debugfs_root, vdev, + &ivpu_hws_priority_bands_fops); debugfs_create_file("reset_engine", 0200, debugfs_root, vdev, &ivpu_reset_engine_fops); diff --git a/drivers/accel/ivpu/ivpu_hw.c b/drivers/accel/ivpu/ivpu_hw.c index 1214f155afa11..37ef8ce642109 100644 --- a/drivers/accel/ivpu/ivpu_hw.c +++ b/drivers/accel/ivpu/ivpu_hw.c @@ -110,6 +110,26 @@ static void timeouts_init(struct ivpu_device *vdev) } } +static void priority_bands_init(struct ivpu_device *vdev) +{ + /* Idle */ + vdev->hw->hws.grace_period[VPU_JOB_SCHEDULING_PRIORITY_BAND_IDLE] = 0; + vdev->hw->hws.process_grace_period[VPU_JOB_SCHEDULING_PRIORITY_BAND_IDLE] = 50000; + vdev->hw->hws.process_quantum[VPU_JOB_SCHEDULING_PRIORITY_BAND_IDLE] = 160000; + /* Normal */ + vdev->hw->hws.grace_period[VPU_JOB_SCHEDULING_PRIORITY_BAND_NORMAL] = 50000; + vdev->hw->hws.process_grace_period[VPU_JOB_SCHEDULING_PRIORITY_BAND_NORMAL] = 50000; + vdev->hw->hws.process_quantum[VPU_JOB_SCHEDULING_PRIORITY_BAND_NORMAL] = 300000; + /* Focus */ + vdev->hw->hws.grace_period[VPU_JOB_SCHEDULING_PRIORITY_BAND_FOCUS] = 50000; + vdev->hw->hws.process_grace_period[VPU_JOB_SCHEDULING_PRIORITY_BAND_FOCUS] = 50000; + vdev->hw->hws.process_quantum[VPU_JOB_SCHEDULING_PRIORITY_BAND_FOCUS] = 200000; + /* Realtime */ + vdev->hw->hws.grace_period[VPU_JOB_SCHEDULING_PRIORITY_BAND_REALTIME] = 0; + vdev->hw->hws.process_grace_period[VPU_JOB_SCHEDULING_PRIORITY_BAND_REALTIME] = 50000; + vdev->hw->hws.process_quantum[VPU_JOB_SCHEDULING_PRIORITY_BAND_REALTIME] = 200000; +} + static void memory_ranges_init(struct ivpu_device *vdev) { if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX) { @@ -248,6 +268,7 @@ int ivpu_hw_init(struct ivpu_device *vdev) { ivpu_hw_btrs_info_init(vdev); ivpu_hw_btrs_freq_ratios_init(vdev); + priority_bands_init(vdev); memory_ranges_init(vdev); platform_init(vdev); wa_init(vdev); diff --git a/drivers/accel/ivpu/ivpu_hw.h b/drivers/accel/ivpu/ivpu_hw.h index 1e85306bcd065..1c016b99a0fdd 100644 --- a/drivers/accel/ivpu/ivpu_hw.h +++ b/drivers/accel/ivpu/ivpu_hw.h @@ -45,6 +45,11 @@ struct ivpu_hw_info { u8 pn_ratio; u32 profiling_freq; } pll; + struct { + u32 grace_period[VPU_HWS_NUM_PRIORITY_BANDS]; + u32 process_quantum[VPU_HWS_NUM_PRIORITY_BANDS]; + u32 process_grace_period[VPU_HWS_NUM_PRIORITY_BANDS]; + } hws; u32 tile_fuse; u32 sku; u16 config; diff --git a/drivers/accel/ivpu/ivpu_jsm_msg.c b/drivers/accel/ivpu/ivpu_jsm_msg.c index 33d597b2a7f53..21018feb45978 100644 --- a/drivers/accel/ivpu/ivpu_jsm_msg.c +++ b/drivers/accel/ivpu/ivpu_jsm_msg.c @@ -7,6 +7,7 @@ #include "ivpu_hw.h" #include "ivpu_ipc.h" #include "ivpu_jsm_msg.h" +#include "vpu_jsm_api.h" const char *ivpu_jsm_msg_type_to_str(enum vpu_ipc_msg_type type) { @@ -409,26 +410,18 @@ int ivpu_jsm_hws_setup_priority_bands(struct ivpu_device *vdev) { struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_SET_PRIORITY_BAND_SETUP }; struct vpu_jsm_msg resp; + struct ivpu_hw_info *hw = vdev->hw; + struct vpu_ipc_msg_payload_hws_priority_band_setup *setup = + &req.payload.hws_priority_band_setup; int ret; - /* Idle */ - req.payload.hws_priority_band_setup.grace_period[0] = 0; - req.payload.hws_priority_band_setup.process_grace_period[0] = 50000; - req.payload.hws_priority_band_setup.process_quantum[0] = 160000; - /* Normal */ - req.payload.hws_priority_band_setup.grace_period[1] = 50000; - req.payload.hws_priority_band_setup.process_grace_period[1] = 50000; - req.payload.hws_priority_band_setup.process_quantum[1] = 300000; - /* Focus */ - req.payload.hws_priority_band_setup.grace_period[2] = 50000; - req.payload.hws_priority_band_setup.process_grace_period[2] = 50000; - req.payload.hws_priority_band_setup.process_quantum[2] = 200000; - /* Realtime */ - req.payload.hws_priority_band_setup.grace_period[3] = 0; - req.payload.hws_priority_band_setup.process_grace_period[3] = 50000; - req.payload.hws_priority_band_setup.process_quantum[3] = 200000; - - req.payload.hws_priority_band_setup.normal_band_percentage = 10; + for (int band = VPU_JOB_SCHEDULING_PRIORITY_BAND_IDLE; + band < VPU_JOB_SCHEDULING_PRIORITY_BAND_COUNT; band++) { + setup->grace_period[band] = hw->hws.grace_period[band]; + setup->process_grace_period[band] = hw->hws.process_grace_period[band]; + setup->process_quantum[band] = hw->hws.process_quantum[band]; + } + setup->normal_band_percentage = 10; ret = ivpu_ipc_send_receive_internal(vdev, &req, VPU_JSM_MSG_SET_PRIORITY_BAND_SETUP_RSP, &resp, VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); -- GitLab From 6420a8d27ef3ffc9ee7b4c0bc7d6194f56ac0825 Mon Sep 17 00:00:00 2001 From: Karol Wachowski Date: Wed, 28 May 2025 17:42:53 +0200 Subject: [PATCH 1715/2211] accel/ivpu: Trigger device recovery on engine reset/resume failure [ Upstream commit a47e36dc5d90dc664cac87304c17d50f1595d634 ] Trigger full device recovery when the driver fails to restore device state via engine reset and resume operations. This is necessary because, even if submissions from a faulty context are blocked, the NPU may still process previously submitted faulty jobs if the engine reset fails to abort them. Such jobs can continue to generate faults and occupy device resources. When engine reset is ineffective, the only way to recover is to perform a full device recovery. Fixes: dad945c27a42 ("accel/ivpu: Add handling of VPU_JSM_STATUS_MVNCI_CONTEXT_VIOLATION_HW") Cc: stable@vger.kernel.org # v6.15+ Signed-off-by: Karol Wachowski Reviewed-by: Lizhi Hou Signed-off-by: Jacek Lawrynowicz Link: https://lore.kernel.org/r/20250528154253.500556-1-jacek.lawrynowicz@linux.intel.com Signed-off-by: Sasha Levin --- drivers/accel/ivpu/ivpu_job.c | 6 ++++-- drivers/accel/ivpu/ivpu_jsm_msg.c | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_job.c b/drivers/accel/ivpu/ivpu_job.c index e57acae3b42ef..e631098718b15 100644 --- a/drivers/accel/ivpu/ivpu_job.c +++ b/drivers/accel/ivpu/ivpu_job.c @@ -849,7 +849,8 @@ void ivpu_context_abort_thread_handler(struct work_struct *work) unsigned long id; if (vdev->fw->sched_mode == VPU_SCHEDULING_MODE_HW) - ivpu_jsm_reset_engine(vdev, 0); + if (ivpu_jsm_reset_engine(vdev, 0)) + return; mutex_lock(&vdev->context_list_lock); xa_for_each(&vdev->context_xa, ctx_id, file_priv) { @@ -865,7 +866,8 @@ void ivpu_context_abort_thread_handler(struct work_struct *work) if (vdev->fw->sched_mode != VPU_SCHEDULING_MODE_HW) return; - ivpu_jsm_hws_resume_engine(vdev, 0); + if (ivpu_jsm_hws_resume_engine(vdev, 0)) + return; /* * In hardware scheduling mode NPU already has stopped processing jobs * and won't send us any further notifications, thus we have to free job related resources diff --git a/drivers/accel/ivpu/ivpu_jsm_msg.c b/drivers/accel/ivpu/ivpu_jsm_msg.c index 21018feb45978..7c08308d5725d 100644 --- a/drivers/accel/ivpu/ivpu_jsm_msg.c +++ b/drivers/accel/ivpu/ivpu_jsm_msg.c @@ -7,6 +7,7 @@ #include "ivpu_hw.h" #include "ivpu_ipc.h" #include "ivpu_jsm_msg.h" +#include "ivpu_pm.h" #include "vpu_jsm_api.h" const char *ivpu_jsm_msg_type_to_str(enum vpu_ipc_msg_type type) @@ -163,8 +164,10 @@ int ivpu_jsm_reset_engine(struct ivpu_device *vdev, u32 engine) ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_ENGINE_RESET_DONE, &resp, VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); - if (ret) + if (ret) { ivpu_err_ratelimited(vdev, "Failed to reset engine %d: %d\n", engine, ret); + ivpu_pm_trigger_recovery(vdev, "Engine reset failed"); + } return ret; } @@ -354,8 +357,10 @@ int ivpu_jsm_hws_resume_engine(struct ivpu_device *vdev, u32 engine) ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_HWS_RESUME_ENGINE_DONE, &resp, VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm); - if (ret) + if (ret) { ivpu_err_ratelimited(vdev, "Failed to resume engine %d: %d\n", engine, ret); + ivpu_pm_trigger_recovery(vdev, "Engine resume failed"); + } return ret; } -- GitLab From 61a9ad7b69ce688697e5f63332f03e17725353bc Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Wed, 18 Jun 2025 21:13:55 -0700 Subject: [PATCH 1716/2211] af_unix: Don't leave consecutive consumed OOB skbs. [ Upstream commit 32ca245464e1479bfea8592b9db227fdc1641705 ] Jann Horn reported a use-after-free in unix_stream_read_generic(). The following sequences reproduce the issue: $ python3 from socket import * s1, s2 = socketpair(AF_UNIX, SOCK_STREAM) s1.send(b'x', MSG_OOB) s2.recv(1, MSG_OOB) # leave a consumed OOB skb s1.send(b'y', MSG_OOB) s2.recv(1, MSG_OOB) # leave a consumed OOB skb s1.send(b'z', MSG_OOB) s2.recv(1) # recv 'z' illegally s2.recv(1, MSG_OOB) # access 'z' skb (use-after-free) Even though a user reads OOB data, the skb holding the data stays on the recv queue to mark the OOB boundary and break the next recv(). After the last send() in the scenario above, the sk2's recv queue has 2 leading consumed OOB skbs and 1 real OOB skb. Then, the following happens during the next recv() without MSG_OOB 1. unix_stream_read_generic() peeks the first consumed OOB skb 2. manage_oob() returns the next consumed OOB skb 3. unix_stream_read_generic() fetches the next not-yet-consumed OOB skb 4. unix_stream_read_generic() reads and frees the OOB skb , and the last recv(MSG_OOB) triggers KASAN splat. The 3. above occurs because of the SO_PEEK_OFF code, which does not expect unix_skb_len(skb) to be 0, but this is true for such consumed OOB skbs. while (skip >= unix_skb_len(skb)) { skip -= unix_skb_len(skb); skb = skb_peek_next(skb, &sk->sk_receive_queue); ... } In addition to this use-after-free, there is another issue that ioctl(SIOCATMARK) does not function properly with consecutive consumed OOB skbs. So, nothing good comes out of such a situation. Instead of complicating manage_oob(), ioctl() handling, and the next ECONNRESET fix by introducing a loop for consecutive consumed OOB skbs, let's not leave such consecutive OOB unnecessarily. Now, while receiving an OOB skb in unix_stream_recv_urg(), if its previous skb is a consumed OOB skb, it is freed. [0]: BUG: KASAN: slab-use-after-free in unix_stream_read_actor (net/unix/af_unix.c:3027) Read of size 4 at addr ffff888106ef2904 by task python3/315 CPU: 2 UID: 0 PID: 315 Comm: python3 Not tainted 6.16.0-rc1-00407-gec315832f6f9 #8 PREEMPT(voluntary) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-4.fc42 04/01/2014 Call Trace: dump_stack_lvl (lib/dump_stack.c:122) print_report (mm/kasan/report.c:409 mm/kasan/report.c:521) kasan_report (mm/kasan/report.c:636) unix_stream_read_actor (net/unix/af_unix.c:3027) unix_stream_read_generic (net/unix/af_unix.c:2708 net/unix/af_unix.c:2847) unix_stream_recvmsg (net/unix/af_unix.c:3048) sock_recvmsg (net/socket.c:1063 (discriminator 20) net/socket.c:1085 (discriminator 20)) __sys_recvfrom (net/socket.c:2278) __x64_sys_recvfrom (net/socket.c:2291 (discriminator 1) net/socket.c:2287 (discriminator 1) net/socket.c:2287 (discriminator 1)) do_syscall_64 (arch/x86/entry/syscall_64.c:63 (discriminator 1) arch/x86/entry/syscall_64.c:94 (discriminator 1)) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) RIP: 0033:0x7f8911fcea06 Code: 5d e8 41 8b 93 08 03 00 00 59 5e 48 83 f8 fc 75 19 83 e2 39 83 fa 08 75 11 e8 26 ff ff ff 66 0f 1f 44 00 00 48 8b 45 10 0f 05 <48> 8b 5d f8 c9 c3 0f 1f 40 00 f3 0f 1e fa 55 48 89 e5 48 83 ec 08 RSP: 002b:00007fffdb0dccb0 EFLAGS: 00000202 ORIG_RAX: 000000000000002d RAX: ffffffffffffffda RBX: 00007fffdb0dcdc8 RCX: 00007f8911fcea06 RDX: 0000000000000001 RSI: 00007f8911a5e060 RDI: 0000000000000006 RBP: 00007fffdb0dccd0 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000001 R11: 0000000000000202 R12: 00007f89119a7d20 R13: ffffffffc4653600 R14: 0000000000000000 R15: 0000000000000000 Allocated by task 315: kasan_save_stack (mm/kasan/common.c:48) kasan_save_track (mm/kasan/common.c:60 (discriminator 1) mm/kasan/common.c:69 (discriminator 1)) __kasan_slab_alloc (mm/kasan/common.c:348) kmem_cache_alloc_node_noprof (./include/linux/kasan.h:250 mm/slub.c:4148 mm/slub.c:4197 mm/slub.c:4249) __alloc_skb (net/core/skbuff.c:660 (discriminator 4)) alloc_skb_with_frags (./include/linux/skbuff.h:1336 net/core/skbuff.c:6668) sock_alloc_send_pskb (net/core/sock.c:2993) unix_stream_sendmsg (./include/net/sock.h:1847 net/unix/af_unix.c:2256 net/unix/af_unix.c:2418) __sys_sendto (net/socket.c:712 (discriminator 20) net/socket.c:727 (discriminator 20) net/socket.c:2226 (discriminator 20)) __x64_sys_sendto (net/socket.c:2233 (discriminator 1) net/socket.c:2229 (discriminator 1) net/socket.c:2229 (discriminator 1)) do_syscall_64 (arch/x86/entry/syscall_64.c:63 (discriminator 1) arch/x86/entry/syscall_64.c:94 (discriminator 1)) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) Freed by task 315: kasan_save_stack (mm/kasan/common.c:48) kasan_save_track (mm/kasan/common.c:60 (discriminator 1) mm/kasan/common.c:69 (discriminator 1)) kasan_save_free_info (mm/kasan/generic.c:579 (discriminator 1)) __kasan_slab_free (mm/kasan/common.c:271) kmem_cache_free (mm/slub.c:4643 (discriminator 3) mm/slub.c:4745 (discriminator 3)) unix_stream_read_generic (net/unix/af_unix.c:3010) unix_stream_recvmsg (net/unix/af_unix.c:3048) sock_recvmsg (net/socket.c:1063 (discriminator 20) net/socket.c:1085 (discriminator 20)) __sys_recvfrom (net/socket.c:2278) __x64_sys_recvfrom (net/socket.c:2291 (discriminator 1) net/socket.c:2287 (discriminator 1) net/socket.c:2287 (discriminator 1)) do_syscall_64 (arch/x86/entry/syscall_64.c:63 (discriminator 1) arch/x86/entry/syscall_64.c:94 (discriminator 1)) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) The buggy address belongs to the object at ffff888106ef28c0 which belongs to the cache skbuff_head_cache of size 224 The buggy address is located 68 bytes inside of freed 224-byte region [ffff888106ef28c0, ffff888106ef29a0) The buggy address belongs to the physical page: page: refcount:0 mapcount:0 mapping:0000000000000000 index:0xffff888106ef3cc0 pfn:0x106ef2 head: order:1 mapcount:0 entire_mapcount:0 nr_pages_mapped:0 pincount:0 flags: 0x200000000000040(head|node=0|zone=2) page_type: f5(slab) raw: 0200000000000040 ffff8881001d28c0 ffffea000422fe00 0000000000000004 raw: ffff888106ef3cc0 0000000080190010 00000000f5000000 0000000000000000 head: 0200000000000040 ffff8881001d28c0 ffffea000422fe00 0000000000000004 head: ffff888106ef3cc0 0000000080190010 00000000f5000000 0000000000000000 head: 0200000000000001 ffffea00041bbc81 00000000ffffffff 00000000ffffffff head: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000 page dumped because: kasan: bad access detected Memory state around the buggy address: ffff888106ef2800: 00 00 00 00 00 00 00 00 00 00 00 00 fc fc fc fc ffff888106ef2880: fc fc fc fc fc fc fc fc fa fb fb fb fb fb fb fb >ffff888106ef2900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ^ ffff888106ef2980: fb fb fb fb fc fc fc fc fc fc fc fc fc fc fc fc ffff888106ef2a00: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb Fixes: 314001f0bf92 ("af_unix: Add OOB support") Reported-by: Jann Horn Signed-off-by: Kuniyuki Iwashima Reviewed-by: Jann Horn Link: https://patch.msgid.link/20250619041457.1132791-2-kuni1840@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/unix/af_unix.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 6b17623004439..2dfd3b70a7178 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -2613,11 +2613,11 @@ struct unix_stream_read_state { #if IS_ENABLED(CONFIG_AF_UNIX_OOB) static int unix_stream_recv_urg(struct unix_stream_read_state *state) { + struct sk_buff *oob_skb, *read_skb = NULL; struct socket *sock = state->socket; struct sock *sk = sock->sk; struct unix_sock *u = unix_sk(sk); int chunk = 1; - struct sk_buff *oob_skb; mutex_lock(&u->iolock); unix_state_lock(sk); @@ -2632,9 +2632,16 @@ static int unix_stream_recv_urg(struct unix_stream_read_state *state) oob_skb = u->oob_skb; - if (!(state->flags & MSG_PEEK)) + if (!(state->flags & MSG_PEEK)) { WRITE_ONCE(u->oob_skb, NULL); + if (oob_skb->prev != (struct sk_buff *)&sk->sk_receive_queue && + !unix_skb_len(oob_skb->prev)) { + read_skb = oob_skb->prev; + __skb_unlink(read_skb, &sk->sk_receive_queue); + } + } + spin_unlock(&sk->sk_receive_queue.lock); unix_state_unlock(sk); @@ -2645,6 +2652,8 @@ static int unix_stream_recv_urg(struct unix_stream_read_state *state) mutex_unlock(&u->iolock); + consume_skb(read_skb); + if (chunk < 0) return -EFAULT; -- GitLab From a4dae6cbd23b01883cd23f58690ae3eeab847a2d Mon Sep 17 00:00:00 2001 From: Wolfram Sang Date: Thu, 22 May 2025 08:43:49 +0200 Subject: [PATCH 1717/2211] i2c: tiny-usb: disable zero-length read messages commit cbdb25ccf7566eee0c2b945e35cb98baf9ed0aa6 upstream. This driver passes the length of an i2c_msg directly to usb_control_msg(). If the message is now a read and of length 0, it violates the USB protocol and a warning will be printed. Enable the I2C_AQ_NO_ZERO_LEN_READ quirk for this adapter thus forbidding 0-length read messages altogether. Fixes: e8c76eed2ecd ("i2c: New i2c-tiny-usb bus driver") Signed-off-by: Wolfram Sang Cc: # v2.6.22+ Signed-off-by: Andi Shyti Link: https://lore.kernel.org/r/20250522064349.3823-2-wsa+renesas@sang-engineering.com Signed-off-by: Greg Kroah-Hartman --- drivers/i2c/busses/i2c-tiny-usb.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/i2c/busses/i2c-tiny-usb.c b/drivers/i2c/busses/i2c-tiny-usb.c index 0f2ed181b2665..0cc7c0a816fc0 100644 --- a/drivers/i2c/busses/i2c-tiny-usb.c +++ b/drivers/i2c/busses/i2c-tiny-usb.c @@ -138,6 +138,11 @@ out: return ret; } +/* prevent invalid 0-length usb_control_msg */ +static const struct i2c_adapter_quirks usb_quirks = { + .flags = I2C_AQ_NO_ZERO_LEN_READ, +}; + /* This is the actual algorithm we define */ static const struct i2c_algorithm usb_algorithm = { .xfer = usb_xfer, @@ -246,6 +251,7 @@ static int i2c_tiny_usb_probe(struct usb_interface *interface, /* setup i2c adapter description */ dev->adapter.owner = THIS_MODULE; dev->adapter.class = I2C_CLASS_HWMON; + dev->adapter.quirks = &usb_quirks; dev->adapter.algo = &usb_algorithm; dev->adapter.algo_data = dev; snprintf(dev->adapter.name, sizeof(dev->adapter.name), -- GitLab From 28f0c4c93a1d0ad6c165f47fff2d522b7662073a Mon Sep 17 00:00:00 2001 From: Wolfram Sang Date: Thu, 22 May 2025 08:42:35 +0200 Subject: [PATCH 1718/2211] i2c: robotfuzz-osif: disable zero-length read messages commit 56ad91c1aa9c18064348edf69308080b03c9dc48 upstream. This driver passes the length of an i2c_msg directly to usb_control_msg(). If the message is now a read and of length 0, it violates the USB protocol and a warning will be printed. Enable the I2C_AQ_NO_ZERO_LEN_READ quirk for this adapter thus forbidding 0-length read messages altogether. Fixes: 83e53a8f120f ("i2c: Add bus driver for for OSIF USB i2c device.") Signed-off-by: Wolfram Sang Cc: # v3.14+ Signed-off-by: Andi Shyti Link: https://lore.kernel.org/r/20250522064234.3721-2-wsa+renesas@sang-engineering.com Signed-off-by: Greg Kroah-Hartman --- drivers/i2c/busses/i2c-robotfuzz-osif.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/i2c/busses/i2c-robotfuzz-osif.c b/drivers/i2c/busses/i2c-robotfuzz-osif.c index 80d45079b763c..e0a76fb5bc31f 100644 --- a/drivers/i2c/busses/i2c-robotfuzz-osif.c +++ b/drivers/i2c/busses/i2c-robotfuzz-osif.c @@ -111,6 +111,11 @@ static u32 osif_func(struct i2c_adapter *adapter) return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; } +/* prevent invalid 0-length usb_control_msg */ +static const struct i2c_adapter_quirks osif_quirks = { + .flags = I2C_AQ_NO_ZERO_LEN_READ, +}; + static const struct i2c_algorithm osif_algorithm = { .xfer = osif_xfer, .functionality = osif_func, @@ -143,6 +148,7 @@ static int osif_probe(struct usb_interface *interface, priv->adapter.owner = THIS_MODULE; priv->adapter.class = I2C_CLASS_HWMON; + priv->adapter.quirks = &osif_quirks; priv->adapter.algo = &osif_algorithm; priv->adapter.algo_data = priv; snprintf(priv->adapter.name, sizeof(priv->adapter.name), -- GitLab From 59e31c92b3bc47396ad737536983fbf536c7e966 Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Tue, 24 Jun 2025 09:40:30 +0200 Subject: [PATCH 1719/2211] ata: ahci: Use correct DMI identifier for ASUSPRO-D840SA LPM quirk commit 3e0809b1664b9dc650d9dbca9a2d3ac690d4f661 upstream. ASUS store the board name in DMI_PRODUCT_NAME rather than DMI_PRODUCT_VERSION. (Apparently it is only Lenovo that stores the model-name in DMI_PRODUCT_VERSION.) Use the correct DMI identifier, DMI_PRODUCT_NAME, to match the ASUSPRO-D840SA board, such that the quirk actually gets applied. Cc: stable@vger.kernel.org Reported-by: Andy Yang Tested-by: Andy Yang Closes: https://lore.kernel.org/linux-ide/aFb3wXAwJSSJUB7o@ryzen/ Fixes: b5acc3628898 ("ata: ahci: Disallow LPM for ASUSPRO-D840SA motherboard") Reviewed-by: Hans de Goede Reviewed-by: Damien Le Moal Link: https://lore.kernel.org/r/20250624074029.963028-2-cassel@kernel.org Signed-off-by: Niklas Cassel Signed-off-by: Greg Kroah-Hartman --- drivers/ata/ahci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 395240cb3666e..a6a66d7947638 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -1456,7 +1456,7 @@ static bool ahci_broken_lpm(struct pci_dev *pdev) { .matches = { DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), - DMI_MATCH(DMI_PRODUCT_VERSION, "ASUSPRO D840MB_M840SA"), + DMI_MATCH(DMI_PRODUCT_NAME, "ASUSPRO D840MB_M840SA"), }, /* 320 is broken, there is no known good version. */ }, -- GitLab From f85c7138f786f059b2a4bdb1e918c89c29d5817d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 25 Jun 2025 10:13:04 +0200 Subject: [PATCH 1720/2211] smb: client: remove \t from TP_printk statements commit e97f9540ce001503a4539f337da742c1dfa7d86a upstream. The generate '[FAILED TO PARSE]' strings in trace-cmd report output like this: rm-5298 [001] 6084.533748493: smb3_exit_err: [FAILED TO PARSE] xid=972 func_name=cifs_rmdir rc=-39 rm-5298 [001] 6084.533959234: smb3_enter: [FAILED TO PARSE] xid=973 func_name=cifs_closedir rm-5298 [001] 6084.533967630: smb3_close_enter: [FAILED TO PARSE] xid=973 fid=94489281833 tid=1 sesid=96758029877361 rm-5298 [001] 6084.534004008: smb3_cmd_enter: [FAILED TO PARSE] tid=1 sesid=96758029877361 cmd=6 mid=566 rm-5298 [001] 6084.552248232: smb3_cmd_done: [FAILED TO PARSE] tid=1 sesid=96758029877361 cmd=6 mid=566 rm-5298 [001] 6084.552280542: smb3_close_done: [FAILED TO PARSE] xid=973 fid=94489281833 tid=1 sesid=96758029877361 rm-5298 [001] 6084.552316034: smb3_exit_done: [FAILED TO PARSE] xid=973 func_name=cifs_closedir Cc: stable@vger.kernel.org Signed-off-by: Stefan Metzmacher Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/trace.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/fs/smb/client/trace.h b/fs/smb/client/trace.h index 12cbd3428a6da..9c3cc7c3300c2 100644 --- a/fs/smb/client/trace.h +++ b/fs/smb/client/trace.h @@ -140,7 +140,7 @@ DECLARE_EVENT_CLASS(smb3_rw_err_class, __entry->len = len; __entry->rc = rc; ), - TP_printk("\tR=%08x[%x] xid=%u sid=0x%llx tid=0x%x fid=0x%llx offset=0x%llx len=0x%x rc=%d", + TP_printk("R=%08x[%x] xid=%u sid=0x%llx tid=0x%x fid=0x%llx offset=0x%llx len=0x%x rc=%d", __entry->rreq_debug_id, __entry->rreq_debug_index, __entry->xid, __entry->sesid, __entry->tid, __entry->fid, __entry->offset, __entry->len, __entry->rc) @@ -190,7 +190,7 @@ DECLARE_EVENT_CLASS(smb3_other_err_class, __entry->len = len; __entry->rc = rc; ), - TP_printk("\txid=%u sid=0x%llx tid=0x%x fid=0x%llx offset=0x%llx len=0x%x rc=%d", + TP_printk("xid=%u sid=0x%llx tid=0x%x fid=0x%llx offset=0x%llx len=0x%x rc=%d", __entry->xid, __entry->sesid, __entry->tid, __entry->fid, __entry->offset, __entry->len, __entry->rc) ) @@ -247,7 +247,7 @@ DECLARE_EVENT_CLASS(smb3_copy_range_err_class, __entry->len = len; __entry->rc = rc; ), - TP_printk("\txid=%u sid=0x%llx tid=0x%x source fid=0x%llx source offset=0x%llx target fid=0x%llx target offset=0x%llx len=0x%x rc=%d", + TP_printk("xid=%u sid=0x%llx tid=0x%x source fid=0x%llx source offset=0x%llx target fid=0x%llx target offset=0x%llx len=0x%x rc=%d", __entry->xid, __entry->sesid, __entry->tid, __entry->target_fid, __entry->src_offset, __entry->target_fid, __entry->target_offset, __entry->len, __entry->rc) ) @@ -298,7 +298,7 @@ DECLARE_EVENT_CLASS(smb3_copy_range_done_class, __entry->target_offset = target_offset; __entry->len = len; ), - TP_printk("\txid=%u sid=0x%llx tid=0x%x source fid=0x%llx source offset=0x%llx target fid=0x%llx target offset=0x%llx len=0x%x", + TP_printk("xid=%u sid=0x%llx tid=0x%x source fid=0x%llx source offset=0x%llx target fid=0x%llx target offset=0x%llx len=0x%x", __entry->xid, __entry->sesid, __entry->tid, __entry->target_fid, __entry->src_offset, __entry->target_fid, __entry->target_offset, __entry->len) ) @@ -482,7 +482,7 @@ DECLARE_EVENT_CLASS(smb3_fd_class, __entry->tid = tid; __entry->sesid = sesid; ), - TP_printk("\txid=%u sid=0x%llx tid=0x%x fid=0x%llx", + TP_printk("xid=%u sid=0x%llx tid=0x%x fid=0x%llx", __entry->xid, __entry->sesid, __entry->tid, __entry->fid) ) @@ -521,7 +521,7 @@ DECLARE_EVENT_CLASS(smb3_fd_err_class, __entry->sesid = sesid; __entry->rc = rc; ), - TP_printk("\txid=%u sid=0x%llx tid=0x%x fid=0x%llx rc=%d", + TP_printk("xid=%u sid=0x%llx tid=0x%x fid=0x%llx rc=%d", __entry->xid, __entry->sesid, __entry->tid, __entry->fid, __entry->rc) ) @@ -793,7 +793,7 @@ DECLARE_EVENT_CLASS(smb3_cmd_err_class, __entry->status = status; __entry->rc = rc; ), - TP_printk("\tsid=0x%llx tid=0x%x cmd=%u mid=%llu status=0x%x rc=%d", + TP_printk("sid=0x%llx tid=0x%x cmd=%u mid=%llu status=0x%x rc=%d", __entry->sesid, __entry->tid, __entry->cmd, __entry->mid, __entry->status, __entry->rc) ) @@ -828,7 +828,7 @@ DECLARE_EVENT_CLASS(smb3_cmd_done_class, __entry->cmd = cmd; __entry->mid = mid; ), - TP_printk("\tsid=0x%llx tid=0x%x cmd=%u mid=%llu", + TP_printk("sid=0x%llx tid=0x%x cmd=%u mid=%llu", __entry->sesid, __entry->tid, __entry->cmd, __entry->mid) ) @@ -866,7 +866,7 @@ DECLARE_EVENT_CLASS(smb3_mid_class, __entry->when_sent = when_sent; __entry->when_received = when_received; ), - TP_printk("\tcmd=%u mid=%llu pid=%u, when_sent=%lu when_rcv=%lu", + TP_printk("cmd=%u mid=%llu pid=%u, when_sent=%lu when_rcv=%lu", __entry->cmd, __entry->mid, __entry->pid, __entry->when_sent, __entry->when_received) ) @@ -897,7 +897,7 @@ DECLARE_EVENT_CLASS(smb3_exit_err_class, __assign_str(func_name); __entry->rc = rc; ), - TP_printk("\t%s: xid=%u rc=%d", + TP_printk("%s: xid=%u rc=%d", __get_str(func_name), __entry->xid, __entry->rc) ) @@ -923,7 +923,7 @@ DECLARE_EVENT_CLASS(smb3_sync_err_class, __entry->ino = ino; __entry->rc = rc; ), - TP_printk("\tino=%lu rc=%d", + TP_printk("ino=%lu rc=%d", __entry->ino, __entry->rc) ) @@ -949,7 +949,7 @@ DECLARE_EVENT_CLASS(smb3_enter_exit_class, __entry->xid = xid; __assign_str(func_name); ), - TP_printk("\t%s: xid=%u", + TP_printk("%s: xid=%u", __get_str(func_name), __entry->xid) ) -- GitLab From c5d5b0047b0c0f304608f3824139f7bd34c48413 Mon Sep 17 00:00:00 2001 From: SeongJae Park Date: Thu, 19 Jun 2025 11:36:07 -0700 Subject: [PATCH 1721/2211] mm/damon/sysfs-schemes: free old damon_sysfs_scheme_filter->memcg_path on write commit 4f489fe6afb395dbc79840efa3c05440b760d883 upstream. memcg_path_store() assigns a newly allocated memory buffer to filter->memcg_path, without deallocating the previously allocated and assigned memory buffer. As a result, users can leak kernel memory by continuously writing a data to memcg_path DAMOS sysfs file. Fix the leak by deallocating the previously set memory buffer. Link: https://lkml.kernel.org/r/20250619183608.6647-2-sj@kernel.org Fixes: 7ee161f18b5d ("mm/damon/sysfs-schemes: implement filter directory") Signed-off-by: SeongJae Park Cc: Shuah Khan Cc: [6.3.x] Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- mm/damon/sysfs-schemes.c | 1 + 1 file changed, 1 insertion(+) diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index b095457380b56..d9e01648db70e 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -423,6 +423,7 @@ static ssize_t memcg_path_store(struct kobject *kobj, return -ENOMEM; strscpy(path, buf, count + 1); + kfree(filter->memcg_path); filter->memcg_path = path; return count; } -- GitLab From 13e23872a96150901a924498c58f05759d8f69e1 Mon Sep 17 00:00:00 2001 From: Oliver Schramm Date: Sun, 22 Jun 2025 00:30:01 +0200 Subject: [PATCH 1722/2211] ASoC: amd: yc: Add DMI quirk for Lenovo IdeaPad Slim 5 15 commit bf39286adc5e10ce3e32eb86ad316ae56f3b52a0 upstream. It's smaller brother has already received the patch to enable the microphone, now add it too to the DMI quirk table. Cc: stable@vger.kernel.org Signed-off-by: Oliver Schramm Link: https://patch.msgid.link/20250621223000.11817-2-oliver.schramm97@gmail.com Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- sound/soc/amd/yc/acp6x-mach.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sound/soc/amd/yc/acp6x-mach.c b/sound/soc/amd/yc/acp6x-mach.c index 3d9da93d22ee8..b27966f82c8b6 100644 --- a/sound/soc/amd/yc/acp6x-mach.c +++ b/sound/soc/amd/yc/acp6x-mach.c @@ -353,6 +353,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "83J2"), } }, + { + .driver_data = &acp6x_card, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "83J3"), + } + }, { .driver_data = &acp6x_card, .matches = { -- GitLab From f855b119e62b004a5044ed565f2a2b368c4d3f16 Mon Sep 17 00:00:00 2001 From: Fedor Pchelkin Date: Wed, 11 Jun 2025 22:20:10 +0300 Subject: [PATCH 1723/2211] s390/pkey: Prevent overflow in size calculation for memdup_user() commit 7360ee47599af91a1d5f4e74d635d9408a54e489 upstream. Number of apqn target list entries contained in 'nr_apqns' variable is determined by userspace via an ioctl call so the result of the product in calculation of size passed to memdup_user() may overflow. In this case the actual size of the allocated area and the value describing it won't be in sync leading to various types of unpredictable behaviour later. Use a proper memdup_array_user() helper which returns an error if an overflow is detected. Note that it is different from when nr_apqns is initially zero - that case is considered valid and should be handled in subsequent pkey_handler implementations. Found by Linux Verification Center (linuxtesting.org). Fixes: f2bbc96e7cfa ("s390/pkey: add CCA AES cipher key support") Cc: stable@vger.kernel.org Signed-off-by: Fedor Pchelkin Reviewed-by: Holger Dengler Reviewed-by: Heiko Carstens Link: https://lore.kernel.org/r/20250611192011.206057-1-pchelkin@ispras.ru Signed-off-by: Alexander Gordeev Signed-off-by: Greg Kroah-Hartman --- drivers/s390/crypto/pkey_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/s390/crypto/pkey_api.c b/drivers/s390/crypto/pkey_api.c index 3a39e167bdbff..d62fea0fbdfc1 100644 --- a/drivers/s390/crypto/pkey_api.c +++ b/drivers/s390/crypto/pkey_api.c @@ -85,7 +85,7 @@ static void *_copy_apqns_from_user(void __user *uapqns, size_t nr_apqns) if (!uapqns || nr_apqns == 0) return NULL; - return memdup_user(uapqns, nr_apqns * sizeof(struct pkey_apqn)); + return memdup_array_user(uapqns, nr_apqns, sizeof(struct pkey_apqn)); } static int pkey_ioctl_genseck(struct pkey_genseck __user *ugs) -- GitLab From 93abf5e0d584bb53b43db54e37434647040cf5f1 Mon Sep 17 00:00:00 2001 From: David Hildenbrand Date: Tue, 17 Jun 2025 16:35:32 +0200 Subject: [PATCH 1724/2211] fs/proc/task_mmu: fix PAGE_IS_PFNZERO detection for the huge zero folio commit 4a5e85f4eb8fd18b1266342d100e4f0849544ca0 upstream. is_zero_pfn() does not work for the huge zero folio. Fix it by using is_huge_zero_pmd(). This can cause the PAGEMAP_SCAN ioctl against /proc/pid/pagemap to present pages as PAGE_IS_PRESENT rather than as PAGE_IS_PFNZERO. Found by code inspection. Link: https://lkml.kernel.org/r/20250617143532.2375383-1-david@redhat.com Fixes: 52526ca7fdb9 ("fs/proc/task_mmu: implement IOCTL to get and optionally clear info about PTEs") Signed-off-by: David Hildenbrand Cc: Muhammad Usama Anjum Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- fs/proc/task_mmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 536b7dc453818..96fe904b2ac58 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -2155,7 +2155,7 @@ static unsigned long pagemap_thp_category(struct pagemap_scan_private *p, categories |= PAGE_IS_FILE; } - if (is_zero_pfn(pmd_pfn(pmd))) + if (is_huge_zero_pmd(pmd)) categories |= PAGE_IS_PFNZERO; if (pmd_soft_dirty(pmd)) categories |= PAGE_IS_SOFT_DIRTY; -- GitLab From 29d39e0d5f16c060e32542b2cf351c09fd22b250 Mon Sep 17 00:00:00 2001 From: Yu Kuai Date: Thu, 19 Jun 2025 21:26:55 +0800 Subject: [PATCH 1725/2211] lib/group_cpus: fix NULL pointer dereference from group_cpus_evenly() commit df831e97739405ecbaddb85516bc7d4d1c933d6b upstream. While testing null_blk with configfs, echo 0 > poll_queues will trigger following panic: BUG: kernel NULL pointer dereference, address: 0000000000000010 Oops: Oops: 0000 [#1] SMP NOPTI CPU: 27 UID: 0 PID: 920 Comm: bash Not tainted 6.15.0-02023-gadbdb95c8696-dirty #1238 PREEMPT(undef) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.1-2.fc37 04/01/2014 RIP: 0010:__bitmap_or+0x48/0x70 Call Trace: __group_cpus_evenly+0x822/0x8c0 group_cpus_evenly+0x2d9/0x490 blk_mq_map_queues+0x1e/0x110 null_map_queues+0xc9/0x170 [null_blk] blk_mq_update_queue_map+0xdb/0x160 blk_mq_update_nr_hw_queues+0x22b/0x560 nullb_update_nr_hw_queues+0x71/0xf0 [null_blk] nullb_device_poll_queues_store+0xa4/0x130 [null_blk] configfs_write_iter+0x109/0x1d0 vfs_write+0x26e/0x6f0 ksys_write+0x79/0x180 __x64_sys_write+0x1d/0x30 x64_sys_call+0x45c4/0x45f0 do_syscall_64+0xa5/0x240 entry_SYSCALL_64_after_hwframe+0x76/0x7e Root cause is that numgrps is set to 0, and ZERO_SIZE_PTR is returned from kcalloc(), and later ZERO_SIZE_PTR will be deferenced. Fix the problem by checking numgrps first in group_cpus_evenly(), and return NULL directly if numgrps is zero. [yukuai3@huawei.com: also fix the non-SMP version] Link: https://lkml.kernel.org/r/20250620010958.1265984-1-yukuai1@huaweicloud.com Link: https://lkml.kernel.org/r/20250619132655.3318883-1-yukuai1@huaweicloud.com Fixes: 6a6dcae8f486 ("blk-mq: Build default queue map via group_cpus_evenly()") Signed-off-by: Yu Kuai Reviewed-by: Ming Lei Reviewed-by: Jens Axboe Cc: ErKun Yang Cc: John Garry Cc: Thomas Gleinxer Cc: "zhangyi (F)" Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- lib/group_cpus.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/group_cpus.c b/lib/group_cpus.c index ee272c4cefcc1..18d43a406114b 100644 --- a/lib/group_cpus.c +++ b/lib/group_cpus.c @@ -352,6 +352,9 @@ struct cpumask *group_cpus_evenly(unsigned int numgrps) int ret = -ENOMEM; struct cpumask *masks = NULL; + if (numgrps == 0) + return NULL; + if (!zalloc_cpumask_var(&nmsk, GFP_KERNEL)) return NULL; @@ -426,8 +429,12 @@ struct cpumask *group_cpus_evenly(unsigned int numgrps) #else /* CONFIG_SMP */ struct cpumask *group_cpus_evenly(unsigned int numgrps) { - struct cpumask *masks = kcalloc(numgrps, sizeof(*masks), GFP_KERNEL); + struct cpumask *masks; + if (numgrps == 0) + return NULL; + + masks = kcalloc(numgrps, sizeof(*masks), GFP_KERNEL); if (!masks) return NULL; -- GitLab From fe30c30bf3bb68d4a4d8c7c814769857b5c973e6 Mon Sep 17 00:00:00 2001 From: Nam Cao Date: Thu, 19 Jun 2025 17:58:58 +0200 Subject: [PATCH 1726/2211] Revert "riscv: Define TASK_SIZE_MAX for __access_ok()" commit 890ba5be6335dbbbc99af14ea007befb5f83f174 upstream. This reverts commit ad5643cf2f69 ("riscv: Define TASK_SIZE_MAX for __access_ok()"). This commit changes TASK_SIZE_MAX to be LONG_MAX to optimize access_ok(), because the previous TASK_SIZE_MAX (default to TASK_SIZE) requires some computation. The reasoning was that all user addresses are less than LONG_MAX, and all kernel addresses are greater than LONG_MAX. Therefore access_ok() can filter kernel addresses. Addresses between TASK_SIZE and LONG_MAX are not valid user addresses, but access_ok() let them pass. That was thought to be okay, because they are not valid addresses at hardware level. Unfortunately, one case is missed: get_user_pages_fast() happily accepts addresses between TASK_SIZE and LONG_MAX. futex(), for instance, uses get_user_pages_fast(). This causes the problem reported by Robert [1]. Therefore, revert this commit. TASK_SIZE_MAX is changed to the default: TASK_SIZE. This unfortunately reduces performance, because TASK_SIZE is more expensive to compute compared to LONG_MAX. But correctness first, we can think about optimization later, if required. Reported-by: Closes: https://lore.kernel.org/linux-riscv/77605.1750245028@localhost/ Signed-off-by: Nam Cao Cc: stable@vger.kernel.org Reviewed-by: Alexandre Ghiti Fixes: ad5643cf2f69 ("riscv: Define TASK_SIZE_MAX for __access_ok()") Link: https://lore.kernel.org/r/20250619155858.1249789-1-namcao@linutronix.de Signed-off-by: Palmer Dabbelt Signed-off-by: Greg Kroah-Hartman --- arch/riscv/include/asm/pgtable.h | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h index 479550cdb440f..03881122506a7 100644 --- a/arch/riscv/include/asm/pgtable.h +++ b/arch/riscv/include/asm/pgtable.h @@ -916,7 +916,6 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte) */ #ifdef CONFIG_64BIT #define TASK_SIZE_64 (PGDIR_SIZE * PTRS_PER_PGD / 2) -#define TASK_SIZE_MAX LONG_MAX #ifdef CONFIG_COMPAT #define TASK_SIZE_32 (_AC(0x80000000, UL) - PAGE_SIZE) -- GitLab From 874b5818ca355e28888de8bad8ff659e1ec3410f Mon Sep 17 00:00:00 2001 From: Nam Cao Date: Fri, 20 Jun 2025 13:09:39 +0200 Subject: [PATCH 1727/2211] Revert "riscv: misaligned: fix sleeping function called during misaligned access handling" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 2f73c62d4e13df67380ff6faca39eec2bf08dd93 upstream. This reverts commit 61a74ad25462 ("riscv: misaligned: fix sleeping function called during misaligned access handling"). The commit addresses a sleeping in atomic context problem, but it is not the correct fix as explained by Clément: "Using nofault would lead to failure to read from user memory that is paged out for instance. This is not really acceptable, we should handle user misaligned access even at an address that would generate a page fault." This bug has been properly fixed by commit 453805f0a28f ("riscv: misaligned: enable IRQs while handling misaligned accesses"). Revert this improper fix. Link: https://lore.kernel.org/linux-riscv/b779beed-e44e-4a5e-9551-4647682b0d21@rivosinc.com/ Signed-off-by: Nam Cao Cc: stable@vger.kernel.org Reviewed-by: Clément Léger Reviewed-by: Alexandre Ghiti Fixes: 61a74ad25462 ("riscv: misaligned: fix sleeping function called during misaligned access handling") Link: https://lore.kernel.org/r/20250620110939.1642735-1-namcao@linutronix.de Signed-off-by: Palmer Dabbelt Signed-off-by: Greg Kroah-Hartman --- arch/riscv/kernel/traps_misaligned.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/riscv/kernel/traps_misaligned.c b/arch/riscv/kernel/traps_misaligned.c index 36ac96eac9c9e..d14bfc23e315b 100644 --- a/arch/riscv/kernel/traps_misaligned.c +++ b/arch/riscv/kernel/traps_misaligned.c @@ -429,7 +429,7 @@ int handle_misaligned_load(struct pt_regs *regs) val.data_u64 = 0; if (user_mode(regs)) { - if (copy_from_user_nofault(&val, (u8 __user *)addr, len)) + if (copy_from_user(&val, (u8 __user *)addr, len)) return -1; } else { memcpy(&val, (u8 *)addr, len); @@ -530,7 +530,7 @@ int handle_misaligned_store(struct pt_regs *regs) return -EOPNOTSUPP; if (user_mode(regs)) { - if (copy_to_user_nofault((u8 __user *)addr, &val, len)) + if (copy_to_user((u8 __user *)addr, &val, len)) return -1; } else { memcpy((u8 *)addr, &val, len); -- GitLab From ac758d459642b62ee974ea83f6eec7b96bda06dc Mon Sep 17 00:00:00 2001 From: Haoxiang Li Date: Fri, 16 May 2025 15:16:55 +0300 Subject: [PATCH 1728/2211] drm/xe/display: Add check for alloc_ordered_workqueue() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 62207293479e6c03ef498a70f2914c51f4d31d2c upstream. Add check for the return value of alloc_ordered_workqueue() in xe_display_create() to catch potential exception. Fixes: 44e694958b95 ("drm/xe/display: Implement display support") Cc: stable@vger.kernel.org Signed-off-by: Haoxiang Li Reviewed-by: Matthew Auld Link: https://lore.kernel.org/r/4ee1b0e5d1626ce1dde2e82af05c2edaed50c3aa.1747397638.git.jani.nikula@intel.com Signed-off-by: Jani Nikula (cherry picked from commit 5b62d63395d5b7d4094e7cd380bccae4b25415cb) Signed-off-by: Thomas Hellström Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/xe/display/xe_display.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c index a1928cedc7ddf..e164e2d71e115 100644 --- a/drivers/gpu/drm/xe/display/xe_display.c +++ b/drivers/gpu/drm/xe/display/xe_display.c @@ -96,6 +96,8 @@ int xe_display_create(struct xe_device *xe) spin_lock_init(&xe->display.fb_tracking.lock); xe->display.hotplug.dp_wq = alloc_ordered_workqueue("xe-dp", 0); + if (!xe->display.hotplug.dp_wq) + return -ENOMEM; return drmm_add_action_or_reset(&xe->drm, display_destroy, NULL); } -- GitLab From a4f182ffa30c52ad1c8e12edfb8049ee748c0f1b Mon Sep 17 00:00:00 2001 From: Thomas Zeitlhofer Date: Mon, 19 May 2025 10:54:46 +0200 Subject: [PATCH 1729/2211] HID: wacom: fix crash in wacom_aes_battery_handler() [ Upstream commit f3054152c12e2eed1e72704aff47b0ea58229584 ] Commit fd2a9b29dc9c ("HID: wacom: Remove AES power_supply after extended inactivity") introduced wacom_aes_battery_handler() which is scheduled as a delayed work (aes_battery_work). In wacom_remove(), aes_battery_work is not canceled. Consequently, if the device is removed while aes_battery_work is still pending, then hard crashes or "Oops: general protection fault..." are experienced when wacom_aes_battery_handler() is finally called. E.g., this happens with built-in USB devices after resume from hibernate when aes_battery_work was still pending at the time of hibernation. So, take care to cancel aes_battery_work in wacom_remove(). Fixes: fd2a9b29dc9c ("HID: wacom: Remove AES power_supply after extended inactivity") Signed-off-by: Thomas Zeitlhofer Acked-by: Ping Cheng Signed-off-by: Jiri Kosina Signed-off-by: Sasha Levin --- drivers/hid/wacom_sys.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index 34428349fa311..64afaa243942c 100644 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c @@ -2874,6 +2874,7 @@ static void wacom_remove(struct hid_device *hdev) hid_hw_stop(hdev); cancel_delayed_work_sync(&wacom->init_work); + cancel_delayed_work_sync(&wacom->aes_battery_work); cancel_work_sync(&wacom->wireless_work); cancel_work_sync(&wacom->battery_work); cancel_work_sync(&wacom->remote_work); -- GitLab From a07005a77b18ae59b8471e7e4d991fa9f642b3c2 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Fri, 20 Jun 2025 14:28:44 +0000 Subject: [PATCH 1730/2211] atm: clip: prevent NULL deref in clip_push() [ Upstream commit b993ea46b3b601915ceaaf3c802adf11e7d6bac6 ] Blamed commit missed that vcc_destroy_socket() calls clip_push() with a NULL skb. If clip_devs is NULL, clip_push() then crashes when reading skb->truesize. Fixes: 93a2014afbac ("atm: fix a UAF in lec_arp_clear_vccs()") Reported-by: syzbot+1316233c4c6803382a8b@syzkaller.appspotmail.com Closes: https://lore.kernel.org/netdev/68556f59.a00a0220.137b3.004e.GAE@google.com/T/#u Signed-off-by: Eric Dumazet Cc: Cong Wang Cc: Gengming Liu Reviewed-by: Simon Horman Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/atm/clip.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/net/atm/clip.c b/net/atm/clip.c index 42b910cb4e8ee..0d7744442b25a 100644 --- a/net/atm/clip.c +++ b/net/atm/clip.c @@ -193,12 +193,6 @@ static void clip_push(struct atm_vcc *vcc, struct sk_buff *skb) pr_debug("\n"); - if (!clip_devs) { - atm_return(vcc, skb->truesize); - kfree_skb(skb); - return; - } - if (!skb) { pr_debug("removing VCC %p\n", clip_vcc); if (clip_vcc->entry) @@ -208,6 +202,11 @@ static void clip_push(struct atm_vcc *vcc, struct sk_buff *skb) return; } atm_return(vcc, skb->truesize); + if (!clip_devs) { + kfree_skb(skb); + return; + } + skb->dev = clip_vcc->entry ? clip_vcc->entry->neigh->dev : clip_devs; /* clip_vcc->entry == NULL if we don't have an IP address yet */ if (!skb->dev) { -- GitLab From ce23b73f0f27e2dbeb81734a79db710f05aa33c6 Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Tue, 17 Jun 2025 09:58:13 -0700 Subject: [PATCH 1731/2211] Bluetooth: hci_core: Fix use-after-free in vhci_flush() [ Upstream commit 1d6123102e9fbedc8d25bf4731da6d513173e49e ] syzbot reported use-after-free in vhci_flush() without repro. [0] From the splat, a thread close()d a vhci file descriptor while its device was being used by iotcl() on another thread. Once the last fd refcnt is released, vhci_release() calls hci_unregister_dev(), hci_free_dev(), and kfree() for struct vhci_data, which is set to hci_dev->dev->driver_data. The problem is that there is no synchronisation after unlinking hdev from hci_dev_list in hci_unregister_dev(). There might be another thread still accessing the hdev which was fetched before the unlink operation. We can use SRCU for such synchronisation. Let's run hci_dev_reset() under SRCU and wait for its completion in hci_unregister_dev(). Another option would be to restore hci_dev->destruct(), which was removed in commit 587ae086f6e4 ("Bluetooth: Remove unused hci-destruct cb"). However, this would not be a good solution, as we should not run hci_unregister_dev() while there are in-flight ioctl() requests, which could lead to another data-race KCSAN splat. Note that other drivers seem to have the same problem, for exmaple, virtbt_remove(). [0]: BUG: KASAN: slab-use-after-free in skb_queue_empty_lockless include/linux/skbuff.h:1891 [inline] BUG: KASAN: slab-use-after-free in skb_queue_purge_reason+0x99/0x360 net/core/skbuff.c:3937 Read of size 8 at addr ffff88807cb8d858 by task syz.1.219/6718 CPU: 1 UID: 0 PID: 6718 Comm: syz.1.219 Not tainted 6.16.0-rc1-syzkaller-00196-g08207f42d3ff #0 PREEMPT(full) Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/07/2025 Call Trace: dump_stack_lvl+0x189/0x250 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:408 [inline] print_report+0xd2/0x2b0 mm/kasan/report.c:521 kasan_report+0x118/0x150 mm/kasan/report.c:634 skb_queue_empty_lockless include/linux/skbuff.h:1891 [inline] skb_queue_purge_reason+0x99/0x360 net/core/skbuff.c:3937 skb_queue_purge include/linux/skbuff.h:3368 [inline] vhci_flush+0x44/0x50 drivers/bluetooth/hci_vhci.c:69 hci_dev_do_reset net/bluetooth/hci_core.c:552 [inline] hci_dev_reset+0x420/0x5c0 net/bluetooth/hci_core.c:592 sock_do_ioctl+0xd9/0x300 net/socket.c:1190 sock_ioctl+0x576/0x790 net/socket.c:1311 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:907 [inline] __se_sys_ioctl+0xf9/0x170 fs/ioctl.c:893 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xfa/0x3b0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7fcf5b98e929 Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 a8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007fcf5c7b9038 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 RAX: ffffffffffffffda RBX: 00007fcf5bbb6160 RCX: 00007fcf5b98e929 RDX: 0000000000000000 RSI: 00000000400448cb RDI: 0000000000000009 RBP: 00007fcf5ba10b39 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 R13: 0000000000000000 R14: 00007fcf5bbb6160 R15: 00007ffd6353d528 Allocated by task 6535: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x3e/0x80 mm/kasan/common.c:68 poison_kmalloc_redzone mm/kasan/common.c:377 [inline] __kasan_kmalloc+0x93/0xb0 mm/kasan/common.c:394 kasan_kmalloc include/linux/kasan.h:260 [inline] __kmalloc_cache_noprof+0x230/0x3d0 mm/slub.c:4359 kmalloc_noprof include/linux/slab.h:905 [inline] kzalloc_noprof include/linux/slab.h:1039 [inline] vhci_open+0x57/0x360 drivers/bluetooth/hci_vhci.c:635 misc_open+0x2bc/0x330 drivers/char/misc.c:161 chrdev_open+0x4c9/0x5e0 fs/char_dev.c:414 do_dentry_open+0xdf0/0x1970 fs/open.c:964 vfs_open+0x3b/0x340 fs/open.c:1094 do_open fs/namei.c:3887 [inline] path_openat+0x2ee5/0x3830 fs/namei.c:4046 do_filp_open+0x1fa/0x410 fs/namei.c:4073 do_sys_openat2+0x121/0x1c0 fs/open.c:1437 do_sys_open fs/open.c:1452 [inline] __do_sys_openat fs/open.c:1468 [inline] __se_sys_openat fs/open.c:1463 [inline] __x64_sys_openat+0x138/0x170 fs/open.c:1463 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xfa/0x3b0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f Freed by task 6535: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x3e/0x80 mm/kasan/common.c:68 kasan_save_free_info+0x46/0x50 mm/kasan/generic.c:576 poison_slab_object mm/kasan/common.c:247 [inline] __kasan_slab_free+0x62/0x70 mm/kasan/common.c:264 kasan_slab_free include/linux/kasan.h:233 [inline] slab_free_hook mm/slub.c:2381 [inline] slab_free mm/slub.c:4643 [inline] kfree+0x18e/0x440 mm/slub.c:4842 vhci_release+0xbc/0xd0 drivers/bluetooth/hci_vhci.c:671 __fput+0x44c/0xa70 fs/file_table.c:465 task_work_run+0x1d1/0x260 kernel/task_work.c:227 exit_task_work include/linux/task_work.h:40 [inline] do_exit+0x6ad/0x22e0 kernel/exit.c:955 do_group_exit+0x21c/0x2d0 kernel/exit.c:1104 __do_sys_exit_group kernel/exit.c:1115 [inline] __se_sys_exit_group kernel/exit.c:1113 [inline] __x64_sys_exit_group+0x3f/0x40 kernel/exit.c:1113 x64_sys_call+0x21ba/0x21c0 arch/x86/include/generated/asm/syscalls_64.h:232 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xfa/0x3b0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f The buggy address belongs to the object at ffff88807cb8d800 which belongs to the cache kmalloc-1k of size 1024 The buggy address is located 88 bytes inside of freed 1024-byte region [ffff88807cb8d800, ffff88807cb8dc00) Fixes: bf18c7118cf8 ("Bluetooth: vhci: Free driver_data on file release") Reported-by: syzbot+2faa4825e556199361f9@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=f62d64848fc4c7c30cd6 Signed-off-by: Kuniyuki Iwashima Acked-by: Paul Menzel Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- include/net/bluetooth/hci_core.h | 2 ++ net/bluetooth/hci_core.c | 34 ++++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index e9e3366d059ef..730aa0245aef9 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -338,6 +339,7 @@ struct adv_monitor { struct hci_dev { struct list_head list; + struct srcu_struct srcu; struct mutex lock; struct ida unset_handle_ida; diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 0d3816c807588..b74ada8092378 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -64,7 +64,7 @@ static DEFINE_IDA(hci_index_ida); /* Get HCI device by index. * Device is held on return. */ -struct hci_dev *hci_dev_get(int index) +static struct hci_dev *__hci_dev_get(int index, int *srcu_index) { struct hci_dev *hdev = NULL, *d; @@ -77,6 +77,8 @@ struct hci_dev *hci_dev_get(int index) list_for_each_entry(d, &hci_dev_list, list) { if (d->id == index) { hdev = hci_dev_hold(d); + if (srcu_index) + *srcu_index = srcu_read_lock(&d->srcu); break; } } @@ -84,6 +86,22 @@ struct hci_dev *hci_dev_get(int index) return hdev; } +struct hci_dev *hci_dev_get(int index) +{ + return __hci_dev_get(index, NULL); +} + +static struct hci_dev *hci_dev_get_srcu(int index, int *srcu_index) +{ + return __hci_dev_get(index, srcu_index); +} + +static void hci_dev_put_srcu(struct hci_dev *hdev, int srcu_index) +{ + srcu_read_unlock(&hdev->srcu, srcu_index); + hci_dev_put(hdev); +} + /* ---- Inquiry support ---- */ bool hci_discovery_active(struct hci_dev *hdev) @@ -568,9 +586,9 @@ static int hci_dev_do_reset(struct hci_dev *hdev) int hci_dev_reset(__u16 dev) { struct hci_dev *hdev; - int err; + int err, srcu_index; - hdev = hci_dev_get(dev); + hdev = hci_dev_get_srcu(dev, &srcu_index); if (!hdev) return -ENODEV; @@ -592,7 +610,7 @@ int hci_dev_reset(__u16 dev) err = hci_dev_do_reset(hdev); done: - hci_dev_put(hdev); + hci_dev_put_srcu(hdev, srcu_index); return err; } @@ -2439,6 +2457,11 @@ struct hci_dev *hci_alloc_dev_priv(int sizeof_priv) if (!hdev) return NULL; + if (init_srcu_struct(&hdev->srcu)) { + kfree(hdev); + return NULL; + } + hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1); hdev->esco_type = (ESCO_HV1); hdev->link_mode = (HCI_LM_ACCEPT); @@ -2684,6 +2707,9 @@ void hci_unregister_dev(struct hci_dev *hdev) list_del(&hdev->list); write_unlock(&hci_dev_list_lock); + synchronize_srcu(&hdev->srcu); + cleanup_srcu_struct(&hdev->srcu); + disable_work_sync(&hdev->rx_work); disable_work_sync(&hdev->cmd_work); disable_work_sync(&hdev->tx_work); -- GitLab From 0ee87c2814deb5e42921281116ac3abcb326880b Mon Sep 17 00:00:00 2001 From: Youngjun Lee Date: Mon, 23 Jun 2025 20:05:25 +0900 Subject: [PATCH 1732/2211] ALSA: usb-audio: Fix out-of-bounds read in snd_usb_get_audioformat_uac3() [ Upstream commit fb4e2a6e8f28a3c0ad382e363aeb9cd822007b8a ] In snd_usb_get_audioformat_uac3(), the length value returned from snd_usb_ctl_msg() is used directly for memory allocation without validation. This length is controlled by the USB device. The allocated buffer is cast to a uac3_cluster_header_descriptor and its fields are accessed without verifying that the buffer is large enough. If the device returns a smaller than expected length, this leads to an out-of-bounds read. Add a length check to ensure the buffer is large enough for uac3_cluster_header_descriptor. Signed-off-by: Youngjun Lee Fixes: 9a2fe9b801f5 ("ALSA: usb: initial USB Audio Device Class 3.0 support") Link: https://patch.msgid.link/20250623-uac3-oob-fix-v1-1-527303eaf40a@samsung.com Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/usb/stream.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/usb/stream.c b/sound/usb/stream.c index c1ea8844a46fc..aa91d63749f2c 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -987,6 +987,8 @@ snd_usb_get_audioformat_uac3(struct snd_usb_audio *chip, * and request Cluster Descriptor */ wLength = le16_to_cpu(hc_header.wLength); + if (wLength < sizeof(cluster)) + return NULL; cluster = kzalloc(wLength, GFP_KERNEL); if (!cluster) return ERR_PTR(-ENOMEM); -- GitLab From b10a7953649b12d7f9f8fbfcc62f9223ba7f4697 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Sun, 22 Jun 2025 18:03:29 -0400 Subject: [PATCH 1733/2211] attach_recursive_mnt(): do not lock the covering tree when sliding something under it [ Upstream commit ce7df19686530920f2f6b636e71ce5eb1d9303ef ] If we are propagating across the userns boundary, we need to lock the mounts added there. However, in case when something has already been mounted there and we end up sliding a new tree under that, the stuff that had been there before should not get locked. IOW, lock_mnt_tree() should be called before we reparent the preexisting tree on top of what we are adding. Fixes: 3bd045cc9c4b ("separate copying and locking mount tree on cross-userns copies") Signed-off-by: Al Viro Signed-off-by: Sasha Levin --- fs/namespace.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/namespace.c b/fs/namespace.c index 843bc6191f30b..b5c5cf01d0c40 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -2521,14 +2521,14 @@ static int attach_recursive_mnt(struct mount *source_mnt, hlist_for_each_entry_safe(child, n, &tree_list, mnt_hash) { struct mount *q; hlist_del_init(&child->mnt_hash); - q = __lookup_mnt(&child->mnt_parent->mnt, - child->mnt_mountpoint); - if (q) - mnt_change_mountpoint(child, smp, q); /* Notice when we are propagating across user namespaces */ if (child->mnt_parent->mnt_ns->user_ns != user_ns) lock_mnt_tree(child); child->mnt.mnt_flags &= ~MNT_LOCKED; + q = __lookup_mnt(&child->mnt_parent->mnt, + child->mnt_mountpoint); + if (q) + mnt_change_mountpoint(child, smp, q); commit_tree(child); } put_mountpoint(smp); -- GitLab From 5b7d9b26a177a5ad5d49be3c2973bbf78cc042fa Mon Sep 17 00:00:00 2001 From: Yuan Chen Date: Wed, 18 Jun 2025 09:19:33 +0800 Subject: [PATCH 1734/2211] libbpf: Fix null pointer dereference in btf_dump__free on allocation failure [ Upstream commit aa485e8789d56a4573f7c8d000a182b749eaa64d ] When btf_dump__new() fails to allocate memory for the internal hashmap (btf_dump->type_names), it returns an error code. However, the cleanup function btf_dump__free() does not check if btf_dump->type_names is NULL before attempting to free it. This leads to a null pointer dereference when btf_dump__free() is called on a btf_dump object. Fixes: 351131b51c7a ("libbpf: add btf_dump API for BTF-to-C conversion") Signed-off-by: Yuan Chen Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250618011933.11423-1-chenyuan_fl@163.com Signed-off-by: Sasha Levin --- tools/lib/bpf/btf_dump.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/lib/bpf/btf_dump.c b/tools/lib/bpf/btf_dump.c index 46cce18c83086..12306b5de3efb 100644 --- a/tools/lib/bpf/btf_dump.c +++ b/tools/lib/bpf/btf_dump.c @@ -225,6 +225,9 @@ static void btf_dump_free_names(struct hashmap *map) size_t bkt; struct hashmap_entry *cur; + if (!map) + return; + hashmap__for_each_entry(map, cur, bkt) free((void *)cur->pkey); -- GitLab From 715f6dbe9bdf6adf3b5d22d6f269f9572fe11070 Mon Sep 17 00:00:00 2001 From: Thomas Fourier Date: Thu, 19 Jun 2025 11:45:30 +0200 Subject: [PATCH 1735/2211] ethernet: ionic: Fix DMA mapping tests [ Upstream commit d5e3241c5a386a2425823c8c7afb77a465bd040f ] Change error values of `ionic_tx_map_single()` and `ionic_tx_map_frag()` from 0 to `DMA_MAPPING_ERROR` to prevent collision with 0 as a valid address. This also fixes the use of `dma_mapping_error()` to test against 0 in `ionic_xdp_post_frame()` Fixes: 0f3154e6bcb3 ("ionic: Add Tx and Rx handling") Fixes: 56e41ee12d2d ("ionic: better dma-map error handling") Fixes: ac8813c0ab7d ("ionic: convert Rx queue buffers to use page_pool") Signed-off-by: Thomas Fourier Reviewed-by: Brett Creeley Link: https://patch.msgid.link/20250619094538.283723-2-fourier.thomas@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/pensando/ionic/ionic_txrx.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/pensando/ionic/ionic_txrx.c b/drivers/net/ethernet/pensando/ionic/ionic_txrx.c index 0eeda7e502db2..0f5758c273c22 100644 --- a/drivers/net/ethernet/pensando/ionic/ionic_txrx.c +++ b/drivers/net/ethernet/pensando/ionic/ionic_txrx.c @@ -321,7 +321,7 @@ static int ionic_xdp_post_frame(struct ionic_queue *q, struct xdp_frame *frame, len, DMA_TO_DEVICE); } else /* XDP_REDIRECT */ { dma_addr = ionic_tx_map_single(q, frame->data, len); - if (!dma_addr) + if (dma_addr == DMA_MAPPING_ERROR) return -EIO; } @@ -357,7 +357,7 @@ static int ionic_xdp_post_frame(struct ionic_queue *q, struct xdp_frame *frame, } else { dma_addr = ionic_tx_map_frag(q, frag, 0, skb_frag_size(frag)); - if (dma_mapping_error(q->dev, dma_addr)) { + if (dma_addr == DMA_MAPPING_ERROR) { ionic_tx_desc_unmap_bufs(q, desc_info); return -EIO; } @@ -1083,7 +1083,7 @@ static dma_addr_t ionic_tx_map_single(struct ionic_queue *q, net_warn_ratelimited("%s: DMA single map failed on %s!\n", dev_name(dev), q->name); q_to_tx_stats(q)->dma_map_err++; - return 0; + return DMA_MAPPING_ERROR; } return dma_addr; } @@ -1100,7 +1100,7 @@ static dma_addr_t ionic_tx_map_frag(struct ionic_queue *q, net_warn_ratelimited("%s: DMA frag map failed on %s!\n", dev_name(dev), q->name); q_to_tx_stats(q)->dma_map_err++; - return 0; + return DMA_MAPPING_ERROR; } return dma_addr; } @@ -1116,7 +1116,7 @@ static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb, int frag_idx; dma_addr = ionic_tx_map_single(q, skb->data, skb_headlen(skb)); - if (!dma_addr) + if (dma_addr == DMA_MAPPING_ERROR) return -EIO; buf_info->dma_addr = dma_addr; buf_info->len = skb_headlen(skb); @@ -1126,7 +1126,7 @@ static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb, nfrags = skb_shinfo(skb)->nr_frags; for (frag_idx = 0; frag_idx < nfrags; frag_idx++, frag++) { dma_addr = ionic_tx_map_frag(q, frag, 0, skb_frag_size(frag)); - if (!dma_addr) + if (dma_addr == DMA_MAPPING_ERROR) goto dma_fail; buf_info->dma_addr = dma_addr; buf_info->len = skb_frag_size(frag); -- GitLab From 8d049443f7e5b5922bfd51c6c5a59a3110e7cd90 Mon Sep 17 00:00:00 2001 From: Lachlan Hodges Date: Sat, 21 Jun 2025 22:32:09 +1000 Subject: [PATCH 1736/2211] wifi: mac80211: fix beacon interval calculation overflow [ Upstream commit 7a3750ff0f2e8fee338a9c168f429f6c37f0e820 ] As we are converting from TU to usecs, a beacon interval of 100*1024 usecs will lead to integer wrapping. To fix change to use a u32. Fixes: 057d5f4ba1e4 ("mac80211: sync dtim_count to TSF") Signed-off-by: Lachlan Hodges Link: https://patch.msgid.link/20250621123209.511796-1-lachlan.hodges@morsemicro.com Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- net/mac80211/util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/mac80211/util.c b/net/mac80211/util.c index a98ae563613c0..77638e965726c 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -3908,7 +3908,7 @@ void ieee80211_recalc_dtim(struct ieee80211_local *local, { u64 tsf = drv_get_tsf(local, sdata); u64 dtim_count = 0; - u16 beacon_int = sdata->vif.bss_conf.beacon_int * 1024; + u32 beacon_int = sdata->vif.bss_conf.beacon_int * 1024; u8 dtim_period = sdata->vif.bss_conf.dtim_period; struct ps_data *ps; u8 bcns_from_dtim; -- GitLab From 949060a62399fc25117c2dff95ec4854bc9d6e1d Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Wed, 18 Jun 2025 21:13:57 -0700 Subject: [PATCH 1737/2211] af_unix: Don't set -ECONNRESET for consumed OOB skb. [ Upstream commit 2a5a4841846b079b5fca5752fe94e59346fbda40 ] Christian Brauner reported that even after MSG_OOB data is consumed, calling close() on the receiver socket causes the peer's recv() to return -ECONNRESET: 1. send() and recv() an OOB data. >>> from socket import * >>> s1, s2 = socketpair(AF_UNIX, SOCK_STREAM) >>> s1.send(b'x', MSG_OOB) 1 >>> s2.recv(1, MSG_OOB) b'x' 2. close() for s2 sets ECONNRESET to s1->sk_err even though s2 consumed the OOB data >>> s2.close() >>> s1.recv(10, MSG_DONTWAIT) ... ConnectionResetError: [Errno 104] Connection reset by peer Even after being consumed, the skb holding the OOB 1-byte data stays in the recv queue to mark the OOB boundary and break recv() at that point. This must be considered while close()ing a socket. Let's skip the leading consumed OOB skb while checking the -ECONNRESET condition in unix_release_sock(). Fixes: 314001f0bf92 ("af_unix: Add OOB support") Reported-by: Christian Brauner Closes: https://lore.kernel.org/netdev/20250529-sinkt-abfeuern-e7b08200c6b0@brauner/ Signed-off-by: Kuniyuki Iwashima Acked-by: Christian Brauner Link: https://patch.msgid.link/20250619041457.1132791-4-kuni1840@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/unix/af_unix.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 2dfd3b70a7178..45f8e21829ecd 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -666,6 +666,11 @@ static void unix_sock_destructor(struct sock *sk) #endif } +static unsigned int unix_skb_len(const struct sk_buff *skb) +{ + return skb->len - UNIXCB(skb).consumed; +} + static void unix_release_sock(struct sock *sk, int embrion) { struct unix_sock *u = unix_sk(sk); @@ -700,10 +705,16 @@ static void unix_release_sock(struct sock *sk, int embrion) if (skpair != NULL) { if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) { + struct sk_buff *skb = skb_peek(&sk->sk_receive_queue); + +#if IS_ENABLED(CONFIG_AF_UNIX_OOB) + if (skb && !unix_skb_len(skb)) + skb = skb_peek_next(skb, &sk->sk_receive_queue); +#endif unix_state_lock(skpair); /* No more writes */ WRITE_ONCE(skpair->sk_shutdown, SHUTDOWN_MASK); - if (!skb_queue_empty_lockless(&sk->sk_receive_queue) || embrion) + if (skb || embrion) WRITE_ONCE(skpair->sk_err, ECONNRESET); unix_state_unlock(skpair); skpair->sk_state_change(skpair); @@ -2594,11 +2605,6 @@ static long unix_stream_data_wait(struct sock *sk, long timeo, return timeo; } -static unsigned int unix_skb_len(const struct sk_buff *skb) -{ - return skb->len - UNIXCB(skb).consumed; -} - struct unix_stream_read_state { int (*recv_actor)(struct sk_buff *, int, int, struct unix_stream_read_state *); -- GitLab From a4afc3d522ca03920fe14c2b95638237fb6edbd8 Mon Sep 17 00:00:00 2001 From: Muna Sinada Date: Tue, 25 Mar 2025 14:31:23 -0700 Subject: [PATCH 1738/2211] wifi: mac80211: Add link iteration macro for link data [ Upstream commit f61c7b3d442bef91dd432d468d08f72eadcc3209 ] Currently before iterating through valid links we are utilizing open-coding when checking if vif valid_links is a non-zero value. Add new macro, for_each_link_data(), which iterates through link_id and checks if it is set on vif valid_links. If it is a valid link then access link data for that link id. Signed-off-by: Muna Sinada Link: https://patch.msgid.link/20250325213125.1509362-2-muna.sinada@oss.qualcomm.com Signed-off-by: Johannes Berg Stable-dep-of: d87c3ca0f8f1 ("wifi: mac80211: finish link init before RCU publish") Signed-off-by: Sasha Levin --- net/mac80211/ieee80211_i.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index bfe0514efca37..41e69e066b386 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -1209,6 +1209,15 @@ struct ieee80211_sub_if_data *vif_to_sdata(struct ieee80211_vif *p) if ((_link = wiphy_dereference((local)->hw.wiphy, \ ___sdata->link[___link_id]))) +#define for_each_link_data(sdata, __link) \ + struct ieee80211_sub_if_data *__sdata = sdata; \ + for (int __link_id = 0; \ + __link_id < ARRAY_SIZE((__sdata)->link); __link_id++) \ + if ((!(__sdata)->vif.valid_links || \ + (__sdata)->vif.valid_links & BIT(__link_id)) && \ + ((__link) = sdata_dereference((__sdata)->link[__link_id], \ + (__sdata)))) + static inline int ieee80211_get_mbssid_beacon_len(struct cfg80211_mbssid_elems *elems, struct cfg80211_rnr_elems *rnr_elems, -- GitLab From d383657857385e44a921b591adf4b546d6f5cb90 Mon Sep 17 00:00:00 2001 From: Muna Sinada Date: Tue, 25 Mar 2025 14:31:24 -0700 Subject: [PATCH 1739/2211] wifi: mac80211: Create separate links for VLAN interfaces [ Upstream commit 90233b0ad215efc9ea56a7c0b09021bcd4eea4ac ] Currently, MLD links for an AP_VLAN interface type is not fully supported. Add allocation of separate links for each VLAN interface and copy chanctx and chandef of AP bss to VLAN where necessary. Separate links are created because for Dynamic VLAN each link will have its own default_multicast_key. Signed-off-by: Muna Sinada Link: https://patch.msgid.link/20250325213125.1509362-3-muna.sinada@oss.qualcomm.com Signed-off-by: Johannes Berg Stable-dep-of: d87c3ca0f8f1 ("wifi: mac80211: finish link init before RCU publish") Signed-off-by: Sasha Levin --- net/mac80211/chan.c | 3 ++ net/mac80211/ieee80211_i.h | 3 ++ net/mac80211/iface.c | 12 ++++- net/mac80211/link.c | 90 ++++++++++++++++++++++++++++++++++++-- 4 files changed, 103 insertions(+), 5 deletions(-) diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c index cca6d14084d21..282e8c13e2bfc 100644 --- a/net/mac80211/chan.c +++ b/net/mac80211/chan.c @@ -2097,6 +2097,9 @@ void ieee80211_link_release_channel(struct ieee80211_link_data *link) { struct ieee80211_sub_if_data *sdata = link->sdata; + if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) + return; + lockdep_assert_wiphy(sdata->local->hw.wiphy); if (rcu_access_pointer(link->conf->chanctx_conf)) diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 41e69e066b386..2f017dbbcb975 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -2070,6 +2070,9 @@ static inline void ieee80211_vif_clear_links(struct ieee80211_sub_if_data *sdata ieee80211_vif_set_links(sdata, 0, 0); } +void ieee80211_apvlan_link_setup(struct ieee80211_sub_if_data *sdata); +void ieee80211_apvlan_link_clear(struct ieee80211_sub_if_data *sdata); + /* tx handling */ void ieee80211_clear_tx_pending(struct ieee80211_local *local); void ieee80211_tx_pending(struct tasklet_struct *t); diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 7e1e561ef76c1..209d6ffa8e426 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -494,6 +494,9 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do break; list_del_rcu(&sdata->u.mntr.list); break; + case NL80211_IFTYPE_AP_VLAN: + ieee80211_apvlan_link_clear(sdata); + break; default: break; } @@ -1268,6 +1271,8 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up) sdata->crypto_tx_tailroom_needed_cnt += master->crypto_tx_tailroom_needed_cnt; + ieee80211_apvlan_link_setup(sdata); + break; } case NL80211_IFTYPE_AP: @@ -1322,7 +1327,12 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up) case NL80211_IFTYPE_AP_VLAN: /* no need to tell driver, but set carrier and chanctx */ if (sdata->bss->active) { - ieee80211_link_vlan_copy_chanctx(&sdata->deflink); + struct ieee80211_link_data *link; + + for_each_link_data(sdata, link) { + ieee80211_link_vlan_copy_chanctx(link); + } + netif_carrier_on(dev); ieee80211_set_vif_encap_ops(sdata); } else { diff --git a/net/mac80211/link.c b/net/mac80211/link.c index 46092fbcde90e..0525f9e44c37b 100644 --- a/net/mac80211/link.c +++ b/net/mac80211/link.c @@ -12,6 +12,71 @@ #include "key.h" #include "debugfs_netdev.h" +static void ieee80211_update_apvlan_links(struct ieee80211_sub_if_data *sdata) +{ + struct ieee80211_sub_if_data *vlan; + struct ieee80211_link_data *link; + u16 ap_bss_links = sdata->vif.valid_links; + u16 new_links, vlan_links; + unsigned long add; + + list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) { + int link_id; + + if (!vlan) + continue; + + /* No support for 4addr with MLO yet */ + if (vlan->wdev.use_4addr) + return; + + vlan_links = vlan->vif.valid_links; + + new_links = ap_bss_links; + + add = new_links & ~vlan_links; + if (!add) + continue; + + ieee80211_vif_set_links(vlan, add, 0); + + for_each_set_bit(link_id, &add, IEEE80211_MLD_MAX_NUM_LINKS) { + link = sdata_dereference(vlan->link[link_id], vlan); + ieee80211_link_vlan_copy_chanctx(link); + } + } +} + +void ieee80211_apvlan_link_setup(struct ieee80211_sub_if_data *sdata) +{ + struct ieee80211_sub_if_data *ap_bss = container_of(sdata->bss, + struct ieee80211_sub_if_data, u.ap); + u16 new_links = ap_bss->vif.valid_links; + unsigned long add; + int link_id; + + if (!ap_bss->vif.valid_links) + return; + + add = new_links; + for_each_set_bit(link_id, &add, IEEE80211_MLD_MAX_NUM_LINKS) { + sdata->wdev.valid_links |= BIT(link_id); + ether_addr_copy(sdata->wdev.links[link_id].addr, + ap_bss->wdev.links[link_id].addr); + } + + ieee80211_vif_set_links(sdata, new_links, 0); +} + +void ieee80211_apvlan_link_clear(struct ieee80211_sub_if_data *sdata) +{ + if (!sdata->wdev.valid_links) + return; + + sdata->wdev.valid_links = 0; + ieee80211_vif_clear_links(sdata); +} + void ieee80211_link_setup(struct ieee80211_link_data *link) { if (link->sdata->vif.type == NL80211_IFTYPE_STATION) @@ -31,6 +96,17 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata, rcu_assign_pointer(sdata->vif.link_conf[link_id], link_conf); rcu_assign_pointer(sdata->link[link_id], link); + if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { + struct ieee80211_sub_if_data *ap_bss; + struct ieee80211_bss_conf *ap_bss_conf; + + ap_bss = container_of(sdata->bss, + struct ieee80211_sub_if_data, u.ap); + ap_bss_conf = sdata_dereference(ap_bss->vif.link_conf[link_id], + ap_bss); + memcpy(link_conf, ap_bss_conf, sizeof(*link_conf)); + } + link->sdata = sdata; link->link_id = link_id; link->conf = link_conf; @@ -51,6 +127,7 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata, if (!deflink) { switch (sdata->vif.type) { case NL80211_IFTYPE_AP: + case NL80211_IFTYPE_AP_VLAN: ether_addr_copy(link_conf->addr, sdata->wdev.links[link_id].addr); link_conf->bssid = link_conf->addr; @@ -174,6 +251,7 @@ static void ieee80211_set_vif_links_bitmaps(struct ieee80211_sub_if_data *sdata, switch (sdata->vif.type) { case NL80211_IFTYPE_AP: + case NL80211_IFTYPE_AP_VLAN: /* in an AP all links are always active */ sdata->vif.active_links = valid_links; @@ -275,12 +353,16 @@ static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata, ieee80211_set_vif_links_bitmaps(sdata, new_links, dormant_links); /* tell the driver */ - ret = drv_change_vif_links(sdata->local, sdata, - old_links & old_active, - new_links & sdata->vif.active_links, - old); + if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN) + ret = drv_change_vif_links(sdata->local, sdata, + old_links & old_active, + new_links & sdata->vif.active_links, + old); if (!new_links) ieee80211_debugfs_recreate_netdev(sdata, false); + + if (sdata->vif.type == NL80211_IFTYPE_AP) + ieee80211_update_apvlan_links(sdata); } if (ret) { -- GitLab From 353739da693e74008b69ad2e92d96b92da9890b9 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Tue, 24 Jun 2025 13:07:49 +0200 Subject: [PATCH 1740/2211] wifi: mac80211: finish link init before RCU publish [ Upstream commit d87c3ca0f8f1ca4c25f2ed819e954952f4d8d709 ] Since the link/conf pointers can be accessed without any protection other than RCU, make sure the data is actually set up before publishing the structures. Fixes: b2e8434f1829 ("wifi: mac80211: set up/tear down client vif links properly") Link: https://patch.msgid.link/20250624130749.9a308b713c74.I4a80f5eead112a38730939ea591d2e275c721256@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- net/mac80211/link.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/mac80211/link.c b/net/mac80211/link.c index 0525f9e44c37b..9484449d6a347 100644 --- a/net/mac80211/link.c +++ b/net/mac80211/link.c @@ -93,9 +93,6 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata, if (link_id < 0) link_id = 0; - rcu_assign_pointer(sdata->vif.link_conf[link_id], link_conf); - rcu_assign_pointer(sdata->link[link_id], link); - if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { struct ieee80211_sub_if_data *ap_bss; struct ieee80211_bss_conf *ap_bss_conf; @@ -142,6 +139,9 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata, ieee80211_link_debugfs_add(link); } + + rcu_assign_pointer(sdata->vif.link_conf[link_id], link_conf); + rcu_assign_pointer(sdata->link[link_id], link); } void ieee80211_link_stop(struct ieee80211_link_data *link) -- GitLab From dbcd546400ead10272d11a96f0607c380c74c3bc Mon Sep 17 00:00:00 2001 From: Stefano Garzarella Date: Mon, 23 Jun 2025 12:00:53 +0200 Subject: [PATCH 1741/2211] vsock/uapi: fix linux/vm_sockets.h userspace compilation errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 22bbc1dcd0d6785fb390c41f0dd5b5e218d23bdd ] If a userspace application just include will fail to build with the following errors: /usr/include/linux/vm_sockets.h:182:39: error: invalid application of ‘sizeof’ to incomplete type ‘struct sockaddr’ 182 | unsigned char svm_zero[sizeof(struct sockaddr) - | ^~~~~~ /usr/include/linux/vm_sockets.h:183:39: error: ‘sa_family_t’ undeclared here (not in a function) 183 | sizeof(sa_family_t) - | Include for userspace (guarded by ifndef __KERNEL__) where `struct sockaddr` and `sa_family_t` are defined. We already do something similar in and . Fixes: d021c344051a ("VSOCK: Introduce VM Sockets") Reported-by: Daan De Meyer Signed-off-by: Stefano Garzarella Link: https://patch.msgid.link/20250623100053.40979-1-sgarzare@redhat.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- include/uapi/linux/vm_sockets.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/uapi/linux/vm_sockets.h b/include/uapi/linux/vm_sockets.h index ed07181d4eff9..e05280e415228 100644 --- a/include/uapi/linux/vm_sockets.h +++ b/include/uapi/linux/vm_sockets.h @@ -17,6 +17,10 @@ #ifndef _UAPI_VM_SOCKETS_H #define _UAPI_VM_SOCKETS_H +#ifndef __KERNEL__ +#include /* for struct sockaddr and sa_family_t */ +#endif + #include #include -- GitLab From c6665b8f0f58082c480ed8627029f44d046ef2c8 Mon Sep 17 00:00:00 2001 From: Yan Zhai Date: Mon, 23 Jun 2025 09:06:38 -0700 Subject: [PATCH 1742/2211] bnxt: properly flush XDP redirect lists [ Upstream commit 9caca6ac0e26cd20efd490d8b3b2ffb1c7c00f6f ] We encountered following crash when testing a XDP_REDIRECT feature in production: [56251.579676] list_add corruption. next->prev should be prev (ffff93120dd40f30), but was ffffb301ef3a6740. (next=ffff93120dd 40f30). [56251.601413] ------------[ cut here ]------------ [56251.611357] kernel BUG at lib/list_debug.c:29! [56251.621082] Oops: invalid opcode: 0000 [#1] PREEMPT SMP NOPTI [56251.632073] CPU: 111 UID: 0 PID: 0 Comm: swapper/111 Kdump: loaded Tainted: P O 6.12.33-cloudflare-2025.6. 3 #1 [56251.653155] Tainted: [P]=PROPRIETARY_MODULE, [O]=OOT_MODULE [56251.663877] Hardware name: MiTAC GC68B-B8032-G11P6-GPU/S8032GM-HE-CFR, BIOS V7.020.B10-sig 01/22/2025 [56251.682626] RIP: 0010:__list_add_valid_or_report+0x4b/0xa0 [56251.693203] Code: 0e 48 c7 c7 68 e7 d9 97 e8 42 16 fe ff 0f 0b 48 8b 52 08 48 39 c2 74 14 48 89 f1 48 c7 c7 90 e7 d9 97 48 89 c6 e8 25 16 fe ff <0f> 0b 4c 8b 02 49 39 f0 74 14 48 89 d1 48 c7 c7 e8 e7 d9 97 4c 89 [56251.725811] RSP: 0018:ffff93120dd40b80 EFLAGS: 00010246 [56251.736094] RAX: 0000000000000075 RBX: ffffb301e6bba9d8 RCX: 0000000000000000 [56251.748260] RDX: 0000000000000000 RSI: ffff9149afda0b80 RDI: ffff9149afda0b80 [56251.760349] RBP: ffff9131e49c8000 R08: 0000000000000000 R09: ffff93120dd40a18 [56251.772382] R10: ffff9159cf2ce1a8 R11: 0000000000000003 R12: ffff911a80850000 [56251.784364] R13: ffff93120fbc7000 R14: 0000000000000010 R15: ffff9139e7510e40 [56251.796278] FS: 0000000000000000(0000) GS:ffff9149afd80000(0000) knlGS:0000000000000000 [56251.809133] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [56251.819561] CR2: 00007f5e85e6f300 CR3: 00000038b85e2006 CR4: 0000000000770ef0 [56251.831365] PKRU: 55555554 [56251.838653] Call Trace: [56251.845560] [56251.851943] cpu_map_enqueue.cold+0x5/0xa [56251.860243] xdp_do_redirect+0x2d9/0x480 [56251.868388] bnxt_rx_xdp+0x1d8/0x4c0 [bnxt_en] [56251.877028] bnxt_rx_pkt+0x5f7/0x19b0 [bnxt_en] [56251.885665] ? cpu_max_write+0x1e/0x100 [56251.893510] ? srso_alias_return_thunk+0x5/0xfbef5 [56251.902276] __bnxt_poll_work+0x190/0x340 [bnxt_en] [56251.911058] bnxt_poll+0xab/0x1b0 [bnxt_en] [56251.919041] ? srso_alias_return_thunk+0x5/0xfbef5 [56251.927568] ? srso_alias_return_thunk+0x5/0xfbef5 [56251.935958] ? srso_alias_return_thunk+0x5/0xfbef5 [56251.944250] __napi_poll+0x2b/0x160 [56251.951155] bpf_trampoline_6442548651+0x79/0x123 [56251.959262] __napi_poll+0x5/0x160 [56251.966037] net_rx_action+0x3d2/0x880 [56251.973133] ? srso_alias_return_thunk+0x5/0xfbef5 [56251.981265] ? srso_alias_return_thunk+0x5/0xfbef5 [56251.989262] ? __hrtimer_run_queues+0x162/0x2a0 [56251.996967] ? srso_alias_return_thunk+0x5/0xfbef5 [56252.004875] ? srso_alias_return_thunk+0x5/0xfbef5 [56252.012673] ? bnxt_msix+0x62/0x70 [bnxt_en] [56252.019903] handle_softirqs+0xcf/0x270 [56252.026650] irq_exit_rcu+0x67/0x90 [56252.032933] common_interrupt+0x85/0xa0 [56252.039498] [56252.044246] [56252.048935] asm_common_interrupt+0x26/0x40 [56252.055727] RIP: 0010:cpuidle_enter_state+0xb8/0x420 [56252.063305] Code: dc 01 00 00 e8 f9 79 3b ff e8 64 f7 ff ff 49 89 c5 0f 1f 44 00 00 31 ff e8 a5 32 3a ff 45 84 ff 0f 85 ae 01 00 00 fb 45 85 f6 <0f> 88 88 01 00 00 48 8b 04 24 49 63 ce 4c 89 ea 48 6b f1 68 48 29 [56252.088911] RSP: 0018:ffff93120c97fe98 EFLAGS: 00000202 [56252.096912] RAX: ffff9149afd80000 RBX: ffff9141d3a72800 RCX: 0000000000000000 [56252.106844] RDX: 00003329176c6b98 RSI: ffffffe36db3fdc7 RDI: 0000000000000000 [56252.116733] RBP: 0000000000000002 R08: 0000000000000002 R09: 000000000000004e [56252.126652] R10: ffff9149afdb30c4 R11: 071c71c71c71c71c R12: ffffffff985ff860 [56252.136637] R13: 00003329176c6b98 R14: 0000000000000002 R15: 0000000000000000 [56252.146667] ? cpuidle_enter_state+0xab/0x420 [56252.153909] cpuidle_enter+0x2d/0x40 [56252.160360] do_idle+0x176/0x1c0 [56252.166456] cpu_startup_entry+0x29/0x30 [56252.173248] start_secondary+0xf7/0x100 [56252.179941] common_startup_64+0x13e/0x141 [56252.186886] From the crash dump, we found that the cpu_map_flush_list inside redirect info is partially corrupted: its list_head->next points to itself, but list_head->prev points to a valid list of unflushed bq entries. This turned out to be a result of missed XDP flush on redirect lists. By digging in the actual source code, we found that commit 7f0a168b0441 ("bnxt_en: Add completion ring pointer in TX and RX ring structures") incorrectly overwrites the event mask for XDP_REDIRECT in bnxt_rx_xdp. We can stably reproduce this crash by returning XDP_TX and XDP_REDIRECT randomly for incoming packets in a naive XDP program. Properly propagate the XDP_REDIRECT events back fixes the crash. Fixes: a7559bc8c17c ("bnxt: support transmit and free of aggregation buffers") Tested-by: Andrew Rzeznik Signed-off-by: Yan Zhai Acked-by: Jesper Dangaard Brouer Reviewed-by: Michael Chan Reviewed-by: Andy Gospodarek Link: https://patch.msgid.link/aFl7jpCNzscumuN2@debian.debian Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 154f73f121eca..ad4aec522f4f8 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -2871,6 +2871,7 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, { struct bnxt_napi *bnapi = cpr->bnapi; u32 raw_cons = cpr->cp_raw_cons; + bool flush_xdp = false; u32 cons; int rx_pkts = 0; u8 event = 0; @@ -2924,6 +2925,8 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, else rc = bnxt_force_rx_discard(bp, cpr, &raw_cons, &event); + if (event & BNXT_REDIRECT_EVENT) + flush_xdp = true; if (likely(rc >= 0)) rx_pkts += rc; /* Increment rx_pkts when rc is -ENOMEM to count towards @@ -2948,7 +2951,7 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, } } - if (event & BNXT_REDIRECT_EVENT) { + if (flush_xdp) { xdp_do_flush(); event &= ~BNXT_REDIRECT_EVENT; } -- GitLab From e1f6654f229949c657dd8276f26030880c94456e Mon Sep 17 00:00:00 2001 From: Tiwei Bie Date: Fri, 6 Jun 2025 20:44:25 +0800 Subject: [PATCH 1743/2211] um: ubd: Add missing error check in start_io_thread() [ Upstream commit c55c7a85e02a7bfee20a3ffebdff7cbeb41613ef ] The subsequent call to os_set_fd_block() overwrites the previous return value. OR the two return values together to fix it. Fixes: f88f0bdfc32f ("um: UBD Improvements") Signed-off-by: Tiwei Bie Link: https://patch.msgid.link/20250606124428.148164-2-tiwei.btw@antgroup.com Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- arch/um/drivers/ubd_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/um/drivers/ubd_user.c b/arch/um/drivers/ubd_user.c index b4f8b8e605644..592b899820d64 100644 --- a/arch/um/drivers/ubd_user.c +++ b/arch/um/drivers/ubd_user.c @@ -41,7 +41,7 @@ int start_io_thread(unsigned long sp, int *fd_out) *fd_out = fds[1]; err = os_set_fd_block(*fd_out, 0); - err = os_set_fd_block(kernel_fd, 0); + err |= os_set_fd_block(kernel_fd, 0); if (err) { printk("start_io_thread - failed to set nonblocking I/O.\n"); goto out_close; -- GitLab From 11b3e07e7d6a2aecfddf1e3aafe6e3cb04514732 Mon Sep 17 00:00:00 2001 From: Adin Scannell Date: Tue, 24 Jun 2025 22:02:15 -0700 Subject: [PATCH 1744/2211] libbpf: Fix possible use-after-free for externs [ Upstream commit fa6f092cc0a02d0fcee37e9e8172eda372a03d33 ] The `name` field in `obj->externs` points into the BTF data at initial open time. However, some functions may invalidate this after opening and before loading (e.g. `bpf_map__set_value_size`), which results in pointers into freed memory and undefined behavior. The simplest solution is to simply `strdup` these strings, similar to the `essent_name`, and free them at the same time. In order to test this path, the `global_map_resize` BPF selftest is modified slightly to ensure the presence of an extern, which causes this test to fail prior to the fix. Given there isn't an obvious API or error to test against, I opted to add this to the existing test as an aspect of the resizing feature rather than duplicate the test. Fixes: 9d0a23313b1a ("libbpf: Add capability for resizing datasec maps") Signed-off-by: Adin Scannell Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250625050215.2777374-1-amscanne@meta.com Signed-off-by: Sasha Levin --- tools/lib/bpf/libbpf.c | 10 +++++++--- .../selftests/bpf/progs/test_global_map_resize.c | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 1290314da6761..36e341b4b77bf 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -596,7 +596,7 @@ struct extern_desc { int sym_idx; int btf_id; int sec_btf_id; - const char *name; + char *name; char *essent_name; bool is_set; bool is_weak; @@ -4223,7 +4223,9 @@ static int bpf_object__collect_externs(struct bpf_object *obj) return ext->btf_id; } t = btf__type_by_id(obj->btf, ext->btf_id); - ext->name = btf__name_by_offset(obj->btf, t->name_off); + ext->name = strdup(btf__name_by_offset(obj->btf, t->name_off)); + if (!ext->name) + return -ENOMEM; ext->sym_idx = i; ext->is_weak = ELF64_ST_BIND(sym->st_info) == STB_WEAK; @@ -9062,8 +9064,10 @@ void bpf_object__close(struct bpf_object *obj) zfree(&obj->btf_custom_path); zfree(&obj->kconfig); - for (i = 0; i < obj->nr_extern; i++) + for (i = 0; i < obj->nr_extern; i++) { + zfree(&obj->externs[i].name); zfree(&obj->externs[i].essent_name); + } zfree(&obj->externs); obj->nr_extern = 0; diff --git a/tools/testing/selftests/bpf/progs/test_global_map_resize.c b/tools/testing/selftests/bpf/progs/test_global_map_resize.c index a3f220ba7025b..ee65bad0436d0 100644 --- a/tools/testing/selftests/bpf/progs/test_global_map_resize.c +++ b/tools/testing/selftests/bpf/progs/test_global_map_resize.c @@ -32,6 +32,16 @@ int my_int_last SEC(".data.array_not_last"); int percpu_arr[1] SEC(".data.percpu_arr"); +/* at least one extern is included, to ensure that a specific + * regression is tested whereby resizing resulted in a free-after-use + * bug after type information is invalidated by the resize operation. + * + * There isn't a particularly good API to test for this specific condition, + * but by having externs for the resizing tests it will cover this path. + */ +extern int LINUX_KERNEL_VERSION __kconfig; +long version_sink; + SEC("tp/syscalls/sys_enter_getpid") int bss_array_sum(void *ctx) { @@ -44,6 +54,9 @@ int bss_array_sum(void *ctx) for (size_t i = 0; i < bss_array_len; ++i) sum += array[i]; + /* see above; ensure this is not optimized out */ + version_sink = LINUX_KERNEL_VERSION; + return 0; } @@ -59,6 +72,9 @@ int data_array_sum(void *ctx) for (size_t i = 0; i < data_array_len; ++i) sum += my_array[i]; + /* see above; ensure this is not optimized out */ + version_sink = LINUX_KERNEL_VERSION; + return 0; } -- GitLab From a493e780b53a82aa8d32b30fed1b9025b47b50c5 Mon Sep 17 00:00:00 2001 From: Simon Horman Date: Tue, 24 Jun 2025 17:35:12 +0100 Subject: [PATCH 1745/2211] net: enetc: Correct endianness handling in _enetc_rd_reg64 [ Upstream commit 7b515f35a911fdc31fbde6531828dcd6ae9803d3 ] enetc_hw.h provides two versions of _enetc_rd_reg64. One which simply calls ioread64() when available. And another that composes the 64-bit result from ioread32() calls. In the second case the code appears to assume that each ioread32() call returns a little-endian value. However both the shift and logical or used to compose the return value would not work correctly on big endian systems if this were the case. Moreover, this is inconsistent with the first case where the return value of ioread64() is assumed to be in host byte order. It appears that the correct approach is for both versions to treat the return value of ioread*() functions as being in host byte order. And this patch corrects the ioread32()-based version to do so. This is a bug but would only manifest on big endian systems that make use of the ioread32-based implementation of _enetc_rd_reg64. While all in-tree users of this driver are little endian and make use of the ioread64-based implementation of _enetc_rd_reg64. Thus, no in-tree user of this driver is affected by this bug. Flagged by Sparse. Compile tested only. Fixes: 16eb4c85c964 ("enetc: Add ethtool statistics") Closes: https://lore.kernel.org/all/AM9PR04MB850500D3FC24FE23DEFCEA158879A@AM9PR04MB8505.eurprd04.prod.outlook.com/ Signed-off-by: Simon Horman Reviewed-by: Wei Fang Link: https://patch.msgid.link/20250624-etnetc-le-v1-1-a73a95d96e4e@kernel.org Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/freescale/enetc/enetc_hw.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/freescale/enetc/enetc_hw.h b/drivers/net/ethernet/freescale/enetc/enetc_hw.h index 1619943fb2637..4e8881b479e48 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc_hw.h +++ b/drivers/net/ethernet/freescale/enetc/enetc_hw.h @@ -485,7 +485,7 @@ static inline u64 _enetc_rd_reg64(void __iomem *reg) tmp = ioread32(reg + 4); } while (high != tmp); - return le64_to_cpu((__le64)high << 32 | low); + return (u64)high << 32 | low; } #endif -- GitLab From 12bcb7eb0fb963eaff53ac7e4dbe046fbd6bf0c0 Mon Sep 17 00:00:00 2001 From: Jakub Kicinski Date: Tue, 24 Jun 2025 14:10:01 -0700 Subject: [PATCH 1746/2211] netlink: specs: tc: replace underscores with dashes in names [ Upstream commit eef0eaeca7fa8e358a31e89802f564451b797718 ] We're trying to add a strict regexp for the name format in the spec. Underscores will not be allowed, dashes should be used instead. This makes no difference to C (codegen, if used, replaces special chars in names) but it gives more uniform naming in Python. Fixes: a1bcfde83669 ("doc/netlink/specs: Add a spec for tc") Reviewed-by: Donald Hunter Link: https://patch.msgid.link/20250624211002.3475021-10-kuba@kernel.org Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- Documentation/netlink/specs/tc.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/netlink/specs/tc.yaml b/Documentation/netlink/specs/tc.yaml index c5579a5412fc9..043f205bc1ae7 100644 --- a/Documentation/netlink/specs/tc.yaml +++ b/Documentation/netlink/specs/tc.yaml @@ -227,7 +227,7 @@ definitions: type: u8 doc: log(P_max / (qth-max - qth-min)) - - name: Scell_log + name: Scell-log type: u8 doc: cell size for idle damping - @@ -248,7 +248,7 @@ definitions: name: DPs type: u32 - - name: def_DP + name: def-DP type: u32 - name: grio -- GitLab From ae539d963a17443ec54cba8a767e4ffa318264f4 Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Tue, 24 Jun 2025 14:45:00 -0700 Subject: [PATCH 1747/2211] atm: Release atm_dev_mutex after removing procfs in atm_dev_deregister(). [ Upstream commit a433791aeaea6e84df709e0b9584b9bbe040cd1c ] syzbot reported a warning below during atm_dev_register(). [0] Before creating a new device and procfs/sysfs for it, atm_dev_register() looks up a duplicated device by __atm_dev_lookup(). These operations are done under atm_dev_mutex. However, when removing a device in atm_dev_deregister(), it releases the mutex just after removing the device from the list that __atm_dev_lookup() iterates over. So, there will be a small race window where the device does not exist on the device list but procfs/sysfs are still not removed, triggering the splat. Let's hold the mutex until procfs/sysfs are removed in atm_dev_deregister(). [0]: proc_dir_entry 'atm/atmtcp:0' already registered WARNING: CPU: 0 PID: 5919 at fs/proc/generic.c:377 proc_register+0x455/0x5f0 fs/proc/generic.c:377 Modules linked in: CPU: 0 UID: 0 PID: 5919 Comm: syz-executor284 Not tainted 6.16.0-rc2-syzkaller-00047-g52da431bf03b #0 PREEMPT(full) Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/07/2025 RIP: 0010:proc_register+0x455/0x5f0 fs/proc/generic.c:377 Code: 48 89 f9 48 c1 e9 03 80 3c 01 00 0f 85 a2 01 00 00 48 8b 44 24 10 48 c7 c7 20 c0 c2 8b 48 8b b0 d8 00 00 00 e8 0c 02 1c ff 90 <0f> 0b 90 90 48 c7 c7 80 f2 82 8e e8 0b de 23 09 48 8b 4c 24 28 48 RSP: 0018:ffffc9000466fa30 EFLAGS: 00010282 RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffffffff817ae248 RDX: ffff888026280000 RSI: ffffffff817ae255 RDI: 0000000000000001 RBP: ffff8880232bed48 R08: 0000000000000001 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000001 R12: ffff888076ed2140 R13: dffffc0000000000 R14: ffff888078a61340 R15: ffffed100edda444 FS: 00007f38b3b0c6c0(0000) GS:ffff888124753000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f38b3bdf953 CR3: 0000000076d58000 CR4: 00000000003526f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: proc_create_data+0xbe/0x110 fs/proc/generic.c:585 atm_proc_dev_register+0x112/0x1e0 net/atm/proc.c:361 atm_dev_register+0x46d/0x890 net/atm/resources.c:113 atmtcp_create+0x77/0x210 drivers/atm/atmtcp.c:369 atmtcp_attach drivers/atm/atmtcp.c:403 [inline] atmtcp_ioctl+0x2f9/0xd60 drivers/atm/atmtcp.c:464 do_vcc_ioctl+0x12c/0x930 net/atm/ioctl.c:159 sock_do_ioctl+0x115/0x280 net/socket.c:1190 sock_ioctl+0x227/0x6b0 net/socket.c:1311 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:907 [inline] __se_sys_ioctl fs/ioctl.c:893 [inline] __x64_sys_ioctl+0x18b/0x210 fs/ioctl.c:893 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xcd/0x4c0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f38b3b74459 Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 51 18 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b0 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f38b3b0c198 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 RAX: ffffffffffffffda RBX: 00007f38b3bfe318 RCX: 00007f38b3b74459 RDX: 0000000000000000 RSI: 0000000000006180 RDI: 0000000000000005 RBP: 00007f38b3bfe310 R08: 65732f636f72702f R09: 65732f636f72702f R10: 65732f636f72702f R11: 0000000000000246 R12: 00007f38b3bcb0ac R13: 00007f38b3b0c1a0 R14: 0000200000000200 R15: 00007f38b3bcb03b Fixes: 64bf69ddff76 ("[ATM]: deregistration removes device from atm_devs list immediately") Reported-by: syzbot+8bd335d2ad3b93e80715@syzkaller.appspotmail.com Closes: https://lore.kernel.org/netdev/685316de.050a0220.216029.0087.GAE@google.com/ Tested-by: syzbot+8bd335d2ad3b93e80715@syzkaller.appspotmail.com Signed-off-by: Kuniyuki Iwashima Link: https://patch.msgid.link/20250624214505.570679-1-kuni1840@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/atm/resources.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/net/atm/resources.c b/net/atm/resources.c index 995d29e7fb138..b19d851e1f443 100644 --- a/net/atm/resources.c +++ b/net/atm/resources.c @@ -146,11 +146,10 @@ void atm_dev_deregister(struct atm_dev *dev) */ mutex_lock(&atm_dev_mutex); list_del(&dev->dev_list); - mutex_unlock(&atm_dev_mutex); - atm_dev_release_vccs(dev); atm_unregister_sysfs(dev); atm_proc_dev_deregister(dev); + mutex_unlock(&atm_dev_mutex); atm_dev_put(dev); } -- GitLab From 3b6a9d35defb4d76916e2a0d3f246f632db9f280 Mon Sep 17 00:00:00 2001 From: Salvatore Bonaccorso Date: Wed, 25 Jun 2025 20:41:28 +0200 Subject: [PATCH 1748/2211] ALSA: hda/realtek: Fix built-in mic on ASUS VivoBook X507UAR [ Upstream commit 7ab6847a03229e73bb7c58ca397630f699e79b53 ] The built-in mic of ASUS VivoBook X507UAR is broken recently by the fix of the pin sort. The fixup ALC256_FIXUP_ASUS_MIC_NO_PRESENCE is working for addressing the regression, too. Fixes: 3b4309546b48 ("ALSA: hda: Fix headset detection failure due to unstable sort") Reported-by: Igor Tamara Closes: https://bugs.debian.org/1108069 Signed-off-by: Salvatore Bonaccorso Link: https://lore.kernel.org/CADdHDco7_o=4h_epjEAb92Dj-vUz_PoTC2-W9g5ncT2E0NzfeQ@mail.gmail.com Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index cb41cd2ba0ef1..94c5151c456d6 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -10933,6 +10933,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x1043, 0x1da2, "ASUS UP6502ZA/ZD", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x1043, 0x1df3, "ASUS UM5606WA", ALC294_FIXUP_BASS_SPEAKER_15), SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402ZA", ALC245_FIXUP_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1043, 0x1e10, "ASUS VivoBook X507UAR", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502), SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x1043, 0x1e1f, "ASUS Vivobook 15 X1504VAP", ALC2XX_FIXUP_HEADSET_MIC), -- GitLab From 104048a4a49e5135b0bf05528ca94224ca684e10 Mon Sep 17 00:00:00 2001 From: Jakub Kicinski Date: Tue, 24 Jun 2025 11:32:58 -0700 Subject: [PATCH 1749/2211] net: selftests: fix TCP packet checksum [ Upstream commit 8d89661a36dd3bb8c9902cff36dc0c144dce3faf ] The length in the pseudo header should be the length of the L3 payload AKA the L4 header+payload. The selftest code builds the packet from the lower layers up, so all the headers are pushed already when it constructs L4. We need to subtract the lower layer headers from skb->len. Fixes: 3e1e58d64c3d ("net: add generic selftest support") Signed-off-by: Jakub Kicinski Reviewed-by: Gerhard Engleder Reported-by: Oleksij Rempel Tested-by: Oleksij Rempel Reviewed-by: Oleksij Rempel Link: https://patch.msgid.link/20250624183258.3377740-1-kuba@kernel.org Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- net/core/selftests.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/net/core/selftests.c b/net/core/selftests.c index 561653f9d71d4..ef27594d6a996 100644 --- a/net/core/selftests.c +++ b/net/core/selftests.c @@ -160,8 +160,9 @@ static struct sk_buff *net_test_get_skb(struct net_device *ndev, skb->csum = 0; skb->ip_summed = CHECKSUM_PARTIAL; if (attr->tcp) { - thdr->check = ~tcp_v4_check(skb->len, ihdr->saddr, - ihdr->daddr, 0); + int l4len = skb->len - skb_transport_offset(skb); + + thdr->check = ~tcp_v4_check(l4len, ihdr->saddr, ihdr->daddr, 0); skb->csum_start = skb_transport_header(skb) - skb->head; skb->csum_offset = offsetof(struct tcphdr, check); } else { -- GitLab From 840fe792a17069d99becbdd927822f175470cb3c Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Tue, 11 Mar 2025 18:00:57 -0400 Subject: [PATCH 1750/2211] drm/amdgpu/discovery: optionally use fw based ip discovery [ Upstream commit 80a0e828293389358f7db56adcdcb22b28df5e11 ] On chips without native IP discovery support, use the fw binary if available, otherwise we can continue without it. Signed-off-by: Alex Deucher Reviewed-by: Flora Cui Signed-off-by: Alex Deucher Stable-dep-of: 73eab78721f7 ("drm/amd: Adjust output for discovery error handling") Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c index 018240a2ab96a..8929478a8f45c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c @@ -2429,6 +2429,38 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev) { int r; + switch (adev->asic_type) { + case CHIP_VEGA10: + case CHIP_VEGA12: + case CHIP_RAVEN: + case CHIP_VEGA20: + case CHIP_ARCTURUS: + case CHIP_ALDEBARAN: + /* this is not fatal. We have a fallback below + * if the new firmwares are not present. some of + * this will be overridden below to keep things + * consistent with the current behavior. + */ + r = amdgpu_discovery_reg_base_init(adev); + if (!r) { + amdgpu_discovery_harvest_ip(adev); + amdgpu_discovery_get_gfx_info(adev); + amdgpu_discovery_get_mall_info(adev); + amdgpu_discovery_get_vcn_info(adev); + } + break; + default: + r = amdgpu_discovery_reg_base_init(adev); + if (r) + return -EINVAL; + + amdgpu_discovery_harvest_ip(adev); + amdgpu_discovery_get_gfx_info(adev); + amdgpu_discovery_get_mall_info(adev); + amdgpu_discovery_get_vcn_info(adev); + break; + } + switch (adev->asic_type) { case CHIP_VEGA10: vega10_reg_base_init(adev); @@ -2591,14 +2623,6 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev) adev->ip_versions[XGMI_HWIP][0] = IP_VERSION(6, 1, 0); break; default: - r = amdgpu_discovery_reg_base_init(adev); - if (r) - return -EINVAL; - - amdgpu_discovery_harvest_ip(adev); - amdgpu_discovery_get_gfx_info(adev); - amdgpu_discovery_get_mall_info(adev); - amdgpu_discovery_get_vcn_info(adev); break; } -- GitLab From 23116bf9a3d046fb0057cb6a121f97219dce4607 Mon Sep 17 00:00:00 2001 From: Mario Limonciello Date: Tue, 17 Jun 2025 13:30:52 -0500 Subject: [PATCH 1751/2211] drm/amd: Adjust output for discovery error handling [ Upstream commit 73eab78721f7b85216f1ca8c7b732f13213b5b32 ] commit 017fbb6690c2 ("drm/amdgpu/discovery: check ip_discovery fw file available") added support for reading an amdgpu IP discovery bin file for some specific products. If it's not found then it will fallback to hardcoded values. However if it's not found there is also a lot of noise about missing files and errors. Adjust the error handling to decrease most messages to DEBUG and to show users less about missing files. Reviewed-by: Lijo Lazar Reported-by: Marcus Seyfarth Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4312 Tested-by: Marcus Seyfarth Fixes: 017fbb6690c2 ("drm/amdgpu/discovery: check ip_discovery fw file available") Acked-by: Alex Deucher Link: https://lore.kernel.org/r/20250617183052.1692059-1-superm1@kernel.org Signed-off-by: Mario Limonciello Signed-off-by: Alex Deucher (cherry picked from commit 49f1f9f6c3c9febf8ba93f94a8d9c8d03e1ea0a1) Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c index 8929478a8f45c..34d41e3ce3474 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c @@ -301,10 +301,12 @@ static int amdgpu_discovery_read_binary_from_file(struct amdgpu_device *adev, const struct firmware *fw; int r; - r = request_firmware(&fw, fw_name, adev->dev); + r = firmware_request_nowarn(&fw, fw_name, adev->dev); if (r) { - dev_err(adev->dev, "can't load firmware \"%s\"\n", - fw_name); + if (amdgpu_discovery == 2) + dev_err(adev->dev, "can't load firmware \"%s\"\n", fw_name); + else + drm_info(&adev->ddev, "Optional firmware \"%s\" was not found\n", fw_name); return r; } @@ -419,16 +421,12 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev) /* Read from file if it is the preferred option */ fw_name = amdgpu_discovery_get_fw_name(adev); if (fw_name != NULL) { - dev_info(adev->dev, "use ip discovery information from file"); + drm_dbg(&adev->ddev, "use ip discovery information from file"); r = amdgpu_discovery_read_binary_from_file(adev, adev->mman.discovery_bin, fw_name); - - if (r) { - dev_err(adev->dev, "failed to read ip discovery binary from file\n"); - r = -EINVAL; + if (r) goto out; - } - } else { + drm_dbg(&adev->ddev, "use ip discovery information from memory"); r = amdgpu_discovery_read_binary_from_mem( adev, adev->mman.discovery_bin); if (r) @@ -1286,10 +1284,8 @@ static int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev) int r; r = amdgpu_discovery_init(adev); - if (r) { - DRM_ERROR("amdgpu_discovery_init failed\n"); + if (r) return r; - } adev->gfx.xcc_mask = 0; adev->sdma.sdma_mask = 0; @@ -2451,8 +2447,10 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev) break; default: r = amdgpu_discovery_reg_base_init(adev); - if (r) - return -EINVAL; + if (r) { + drm_err(&adev->ddev, "discovery failed: %d\n", r); + return r; + } amdgpu_discovery_harvest_ip(adev); amdgpu_discovery_get_gfx_info(adev); -- GitLab From 18ec560e3e9b476e63c671514dcb8b9163a578a2 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Fri, 20 Jun 2025 13:18:18 +0200 Subject: [PATCH 1752/2211] drm/i915: fix build error some more [ Upstream commit d02b2103a08b6d6908f1d3d8e8783d3f342555ac ] An earlier patch fixed a build failure with clang, but I still see the same problem with some configurations using gcc: drivers/gpu/drm/i915/i915_pmu.c: In function 'config_mask': include/linux/compiler_types.h:568:38: error: call to '__compiletime_assert_462' declared with attribute error: BUILD_BUG_ON failed: bit > BITS_PER_TYPE(typeof_member(struct i915_pmu, enable)) - 1 drivers/gpu/drm/i915/i915_pmu.c:116:3: note: in expansion of macro 'BUILD_BUG_ON' 116 | BUILD_BUG_ON(bit > As I understand it, the problem is that the function is not always fully inlined, but the __builtin_constant_p() can still evaluate the argument as being constant. Marking it as __always_inline so far works for me in all configurations. Fixes: a7137b1825b5 ("drm/i915/pmu: Fix build error with GCOV and AutoFDO enabled") Fixes: a644fde77ff7 ("drm/i915/pmu: Change bitmask of enabled events to u32") Reviewed-by: Rodrigo Vivi Signed-off-by: Arnd Bergmann Link: https://lore.kernel.org/r/20250620111824.3395007-1-arnd@kernel.org Signed-off-by: Rodrigo Vivi (cherry picked from commit ef69f9dd1cd7301cdf04ba326ed28152a3affcf6) Signed-off-by: Joonas Lahtinen Signed-off-by: Sasha Levin --- drivers/gpu/drm/i915/i915_pmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c index c43223916a1b1..5cc302ad13e16 100644 --- a/drivers/gpu/drm/i915/i915_pmu.c +++ b/drivers/gpu/drm/i915/i915_pmu.c @@ -111,7 +111,7 @@ static unsigned int config_bit(const u64 config) return other_bit(config); } -static u32 config_mask(const u64 config) +static __always_inline u32 config_mask(const u64 config) { unsigned int bit = config_bit(config); -- GitLab From 29a7c0b653162b85130a38fa11e2c343a0c57f72 Mon Sep 17 00:00:00 2001 From: Wolfram Sang Date: Sat, 15 Mar 2025 21:15:11 +0100 Subject: [PATCH 1753/2211] drm/bridge: ti-sn65dsi86: make use of debugfs_init callback [ Upstream commit 1d1f7b15cb9c11974cebfd39da51dc69b8cb31ff ] Do not create a custom directory in debugfs-root, but use the debugfs_init callback to create a custom directory at the given place for the bridge. The new directory layout looks like this on a Renesas GrayHawk-Single with a R-Car V4M SoC: /sys/kernel/debug/dri/feb00000.display/DP-1/1-002c Signed-off-by: Wolfram Sang Reviewed-by: Dmitry Baryshkov Reviewed-by: Douglas Anderson Signed-off-by: Douglas Anderson Link: https://patchwork.freedesktop.org/patch/msgid/20250315201651.7339-2-wsa+renesas@sang-engineering.com Stable-dep-of: 55e8ff842051 ("drm/bridge: ti-sn65dsi86: Add HPD for DisplayPort connector type") Signed-off-by: Sasha Levin --- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 40 +++++++-------------------- 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c index 95ce50ed53acf..ca7597805e30f 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c @@ -424,36 +424,8 @@ static int status_show(struct seq_file *s, void *data) return 0; } - DEFINE_SHOW_ATTRIBUTE(status); -static void ti_sn65dsi86_debugfs_remove(void *data) -{ - debugfs_remove_recursive(data); -} - -static void ti_sn65dsi86_debugfs_init(struct ti_sn65dsi86 *pdata) -{ - struct device *dev = pdata->dev; - struct dentry *debugfs; - int ret; - - debugfs = debugfs_create_dir(dev_name(dev), NULL); - - /* - * We might get an error back if debugfs wasn't enabled in the kernel - * so let's just silently return upon failure. - */ - if (IS_ERR_OR_NULL(debugfs)) - return; - - ret = devm_add_action_or_reset(dev, ti_sn65dsi86_debugfs_remove, debugfs); - if (ret) - return; - - debugfs_create_file("status", 0600, debugfs, pdata, &status_fops); -} - /* ----------------------------------------------------------------------------- * Auxiliary Devices (*not* AUX) */ @@ -1217,6 +1189,15 @@ static const struct drm_edid *ti_sn_bridge_edid_read(struct drm_bridge *bridge, return drm_edid_read_ddc(connector, &pdata->aux.ddc); } +static void ti_sn65dsi86_debugfs_init(struct drm_bridge *bridge, struct dentry *root) +{ + struct ti_sn65dsi86 *pdata = bridge_to_ti_sn65dsi86(bridge); + struct dentry *debugfs; + + debugfs = debugfs_create_dir(dev_name(pdata->dev), root); + debugfs_create_file("status", 0600, debugfs, pdata, &status_fops); +} + static const struct drm_bridge_funcs ti_sn_bridge_funcs = { .attach = ti_sn_bridge_attach, .detach = ti_sn_bridge_detach, @@ -1230,6 +1211,7 @@ static const struct drm_bridge_funcs ti_sn_bridge_funcs = { .atomic_reset = drm_atomic_helper_bridge_reset, .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, + .debugfs_init = ti_sn65dsi86_debugfs_init, }; static void ti_sn_bridge_parse_lanes(struct ti_sn65dsi86 *pdata, @@ -1938,8 +1920,6 @@ static int ti_sn65dsi86_probe(struct i2c_client *client) if (ret) return ret; - ti_sn65dsi86_debugfs_init(pdata); - /* * Break ourselves up into a collection of aux devices. The only real * motiviation here is to solve the chicken-and-egg problem of probe -- GitLab From 3549ad85aaf33562229c6b75d2c7235ad8b98e01 Mon Sep 17 00:00:00 2001 From: Jayesh Choudhary Date: Tue, 24 Jun 2025 10:18:35 +0530 Subject: [PATCH 1754/2211] drm/bridge: ti-sn65dsi86: Add HPD for DisplayPort connector type [ Upstream commit 55e8ff842051b1150461d7595d8f1d033c69d66b ] By default, HPD was disabled on SN65DSI86 bridge. When the driver was added (commit "a095f15c00e27"), the HPD_DISABLE bit was set in pre-enable call which was moved to other function calls subsequently. Later on, commit "c312b0df3b13" added detect utility for DP mode. But with HPD_DISABLE bit set, all the HPD events are disabled[0] and the debounced state always return 1 (always connected state). Set HPD_DISABLE bit conditionally based on display sink's connector type. Since the HPD_STATE is reflected correctly only after waiting for debounce time (~100-400ms) and adding this delay in detect() is not feasible owing to the performace impact (glitches and frame drop), remove runtime calls in detect() and add hpd_enable()/disable() bridge hooks with runtime calls, to detect hpd properly without any delay. [0]: (Pg. 32) Fixes: c312b0df3b13 ("drm/bridge: ti-sn65dsi86: Implement bridge connector operations for DP") Cc: Max Krummenacher Reviewed-by: Douglas Anderson Tested-by: Ernest Van Hoecke Signed-off-by: Jayesh Choudhary Signed-off-by: Douglas Anderson Link: https://lore.kernel.org/r/20250624044835.165708-1-j-choudhary@ti.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 69 +++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c index ca7597805e30f..5500767cda7e4 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c @@ -331,12 +331,18 @@ static void ti_sn65dsi86_enable_comms(struct ti_sn65dsi86 *pdata) * 200 ms. We'll assume that the panel driver will have the hardcoded * delay in its prepare and always disable HPD. * - * If HPD somehow makes sense on some future panel we'll have to - * change this to be conditional on someone specifying that HPD should - * be used. + * For DisplayPort bridge type, we need HPD. So we use the bridge type + * to conditionally disable HPD. + * NOTE: The bridge type is set in ti_sn_bridge_probe() but enable_comms() + * can be called before. So for DisplayPort, HPD will be enabled once + * bridge type is set. We are using bridge type instead of "no-hpd" + * property because it is not used properly in devicetree description + * and hence is unreliable. */ - regmap_update_bits(pdata->regmap, SN_HPD_DISABLE_REG, HPD_DISABLE, - HPD_DISABLE); + + if (pdata->bridge.type != DRM_MODE_CONNECTOR_DisplayPort) + regmap_update_bits(pdata->regmap, SN_HPD_DISABLE_REG, HPD_DISABLE, + HPD_DISABLE); pdata->comms_enabled = true; @@ -1173,9 +1179,14 @@ static enum drm_connector_status ti_sn_bridge_detect(struct drm_bridge *bridge) struct ti_sn65dsi86 *pdata = bridge_to_ti_sn65dsi86(bridge); int val = 0; - pm_runtime_get_sync(pdata->dev); + /* + * Runtime reference is grabbed in ti_sn_bridge_hpd_enable() + * as the chip won't report HPD just after being powered on. + * HPD_DEBOUNCED_STATE reflects correct state only after the + * debounce time (~100-400 ms). + */ + regmap_read(pdata->regmap, SN_HPD_DISABLE_REG, &val); - pm_runtime_put_autosuspend(pdata->dev); return val & HPD_DEBOUNCED_STATE ? connector_status_connected : connector_status_disconnected; @@ -1198,6 +1209,26 @@ static void ti_sn65dsi86_debugfs_init(struct drm_bridge *bridge, struct dentry * debugfs_create_file("status", 0600, debugfs, pdata, &status_fops); } +static void ti_sn_bridge_hpd_enable(struct drm_bridge *bridge) +{ + struct ti_sn65dsi86 *pdata = bridge_to_ti_sn65dsi86(bridge); + + /* + * Device needs to be powered on before reading the HPD state + * for reliable hpd detection in ti_sn_bridge_detect() due to + * the high debounce time. + */ + + pm_runtime_get_sync(pdata->dev); +} + +static void ti_sn_bridge_hpd_disable(struct drm_bridge *bridge) +{ + struct ti_sn65dsi86 *pdata = bridge_to_ti_sn65dsi86(bridge); + + pm_runtime_put_autosuspend(pdata->dev); +} + static const struct drm_bridge_funcs ti_sn_bridge_funcs = { .attach = ti_sn_bridge_attach, .detach = ti_sn_bridge_detach, @@ -1212,6 +1243,8 @@ static const struct drm_bridge_funcs ti_sn_bridge_funcs = { .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, .debugfs_init = ti_sn65dsi86_debugfs_init, + .hpd_enable = ti_sn_bridge_hpd_enable, + .hpd_disable = ti_sn_bridge_hpd_disable, }; static void ti_sn_bridge_parse_lanes(struct ti_sn65dsi86 *pdata, @@ -1300,8 +1333,26 @@ static int ti_sn_bridge_probe(struct auxiliary_device *adev, pdata->bridge.type = pdata->next_bridge->type == DRM_MODE_CONNECTOR_DisplayPort ? DRM_MODE_CONNECTOR_DisplayPort : DRM_MODE_CONNECTOR_eDP; - if (pdata->bridge.type == DRM_MODE_CONNECTOR_DisplayPort) - pdata->bridge.ops = DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_DETECT; + if (pdata->bridge.type == DRM_MODE_CONNECTOR_DisplayPort) { + pdata->bridge.ops = DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_DETECT | + DRM_BRIDGE_OP_HPD; + /* + * If comms were already enabled they would have been enabled + * with the wrong value of HPD_DISABLE. Update it now. Comms + * could be enabled if anyone is holding a pm_runtime reference + * (like if a GPIO is in use). Note that in most cases nobody + * is doing AUX channel xfers before the bridge is added so + * HPD doesn't _really_ matter then. The only exception is in + * the eDP case where the panel wants to read the EDID before + * the bridge is added. We always consistently have HPD disabled + * for eDP. + */ + mutex_lock(&pdata->comms_mutex); + if (pdata->comms_enabled) + regmap_update_bits(pdata->regmap, SN_HPD_DISABLE_REG, + HPD_DISABLE, 0); + mutex_unlock(&pdata->comms_mutex); + }; drm_bridge_add(&pdata->bridge); -- GitLab From 1b12f8dabbb8fd7d5a2611dd7bc5982ffbc2e5df Mon Sep 17 00:00:00 2001 From: Michal Wajdeczko Date: Fri, 13 Jun 2025 00:09:36 +0200 Subject: [PATCH 1755/2211] drm/xe: Process deferred GGTT node removals on device unwind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit af2b588abe006bd55ddd358c4c3b87523349c475 ] While we are indirectly draining our dedicated workqueue ggtt->wq that we use to complete asynchronous removal of some GGTT nodes, this happends as part of the managed-drm unwinding (ggtt_fini_early), which could be later then manage-device unwinding, where we could already unmap our MMIO/GMS mapping (mmio_fini). This was recently observed during unsuccessful VF initialization: [ ] xe 0000:00:02.1: probe with driver xe failed with error -62 [ ] xe 0000:00:02.1: DEVRES REL ffff88811e747340 __xe_bo_unpin_map_no_vm (16 bytes) [ ] xe 0000:00:02.1: DEVRES REL ffff88811e747540 __xe_bo_unpin_map_no_vm (16 bytes) [ ] xe 0000:00:02.1: DEVRES REL ffff88811e747240 __xe_bo_unpin_map_no_vm (16 bytes) [ ] xe 0000:00:02.1: DEVRES REL ffff88811e747040 tiles_fini (16 bytes) [ ] xe 0000:00:02.1: DEVRES REL ffff88811e746840 mmio_fini (16 bytes) [ ] xe 0000:00:02.1: DEVRES REL ffff88811e747f40 xe_bo_pinned_fini (16 bytes) [ ] xe 0000:00:02.1: DEVRES REL ffff88811e746b40 devm_drm_dev_init_release (16 bytes) [ ] xe 0000:00:02.1: [drm:drm_managed_release] drmres release begin [ ] xe 0000:00:02.1: [drm:drm_managed_release] REL ffff88810ef81640 __fini_relay (8 bytes) [ ] xe 0000:00:02.1: [drm:drm_managed_release] REL ffff88810ef80d40 guc_ct_fini (8 bytes) [ ] xe 0000:00:02.1: [drm:drm_managed_release] REL ffff88810ef80040 __drmm_mutex_release (8 bytes) [ ] xe 0000:00:02.1: [drm:drm_managed_release] REL ffff88810ef80140 ggtt_fini_early (8 bytes) and this was leading to: [ ] BUG: unable to handle page fault for address: ffffc900058162a0 [ ] #PF: supervisor write access in kernel mode [ ] #PF: error_code(0x0002) - not-present page [ ] Oops: Oops: 0002 [#1] SMP NOPTI [ ] Tainted: [W]=WARN [ ] Workqueue: xe-ggtt-wq ggtt_node_remove_work_func [xe] [ ] RIP: 0010:xe_ggtt_set_pte+0x6d/0x350 [xe] [ ] Call Trace: [ ] [ ] xe_ggtt_clear+0xb0/0x270 [xe] [ ] ggtt_node_remove+0xbb/0x120 [xe] [ ] ggtt_node_remove_work_func+0x30/0x50 [xe] [ ] process_one_work+0x22b/0x6f0 [ ] worker_thread+0x1e8/0x3d Add managed-device action that will explicitly drain the workqueue with all pending node removals prior to releasing MMIO/GSM mapping. Fixes: 919bb54e989c ("drm/xe: Fix missing runtime outer protection for ggtt_remove_node") Signed-off-by: Michal Wajdeczko Cc: Rodrigo Vivi Cc: Lucas De Marchi Reviewed-by: Rodrigo Vivi Link: https://lore.kernel.org/r/20250612220937.857-2-michal.wajdeczko@intel.com (cherry picked from commit 89d2835c3680ab1938e22ad81b1c9f8c686bd391) Signed-off-by: Thomas Hellström Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_ggtt.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c index ff19eca5d358b..e9820126feb96 100644 --- a/drivers/gpu/drm/xe/xe_ggtt.c +++ b/drivers/gpu/drm/xe/xe_ggtt.c @@ -198,6 +198,13 @@ static const struct xe_ggtt_pt_ops xelpg_pt_wa_ops = { .ggtt_set_pte = xe_ggtt_set_pte_and_flush, }; +static void dev_fini_ggtt(void *arg) +{ + struct xe_ggtt *ggtt = arg; + + drain_workqueue(ggtt->wq); +} + /** * xe_ggtt_init_early - Early GGTT initialization * @ggtt: the &xe_ggtt to be initialized @@ -254,6 +261,10 @@ int xe_ggtt_init_early(struct xe_ggtt *ggtt) if (err) return err; + err = devm_add_action_or_reset(xe->drm.dev, dev_fini_ggtt, ggtt); + if (err) + return err; + if (IS_SRIOV_VF(xe)) { err = xe_gt_sriov_vf_prepare_ggtt(xe_tile_get_gt(ggtt->tile, 0)); if (err) -- GitLab From 7f3ead8ebc0ef65b6c89a13912b4e80218425629 Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Wed, 25 Jun 2025 12:22:38 -0300 Subject: [PATCH 1756/2211] smb: client: fix potential deadlock when reconnecting channels [ Upstream commit 711741f94ac3cf9f4e3aa73aa171e76d188c0819 ] Fix cifs_signal_cifsd_for_reconnect() to take the correct lock order and prevent the following deadlock from happening ====================================================== WARNING: possible circular locking dependency detected 6.16.0-rc3-build2+ #1301 Tainted: G S W ------------------------------------------------------ cifsd/6055 is trying to acquire lock: ffff88810ad56038 (&tcp_ses->srv_lock){+.+.}-{3:3}, at: cifs_signal_cifsd_for_reconnect+0x134/0x200 but task is already holding lock: ffff888119c64330 (&ret_buf->chan_lock){+.+.}-{3:3}, at: cifs_signal_cifsd_for_reconnect+0xcf/0x200 which lock already depends on the new lock. the existing dependency chain (in reverse order) is: -> #2 (&ret_buf->chan_lock){+.+.}-{3:3}: validate_chain+0x1cf/0x270 __lock_acquire+0x60e/0x780 lock_acquire.part.0+0xb4/0x1f0 _raw_spin_lock+0x2f/0x40 cifs_setup_session+0x81/0x4b0 cifs_get_smb_ses+0x771/0x900 cifs_mount_get_session+0x7e/0x170 cifs_mount+0x92/0x2d0 cifs_smb3_do_mount+0x161/0x460 smb3_get_tree+0x55/0x90 vfs_get_tree+0x46/0x180 do_new_mount+0x1b0/0x2e0 path_mount+0x6ee/0x740 do_mount+0x98/0xe0 __do_sys_mount+0x148/0x180 do_syscall_64+0xa4/0x260 entry_SYSCALL_64_after_hwframe+0x76/0x7e -> #1 (&ret_buf->ses_lock){+.+.}-{3:3}: validate_chain+0x1cf/0x270 __lock_acquire+0x60e/0x780 lock_acquire.part.0+0xb4/0x1f0 _raw_spin_lock+0x2f/0x40 cifs_match_super+0x101/0x320 sget+0xab/0x270 cifs_smb3_do_mount+0x1e0/0x460 smb3_get_tree+0x55/0x90 vfs_get_tree+0x46/0x180 do_new_mount+0x1b0/0x2e0 path_mount+0x6ee/0x740 do_mount+0x98/0xe0 __do_sys_mount+0x148/0x180 do_syscall_64+0xa4/0x260 entry_SYSCALL_64_after_hwframe+0x76/0x7e -> #0 (&tcp_ses->srv_lock){+.+.}-{3:3}: check_noncircular+0x95/0xc0 check_prev_add+0x115/0x2f0 validate_chain+0x1cf/0x270 __lock_acquire+0x60e/0x780 lock_acquire.part.0+0xb4/0x1f0 _raw_spin_lock+0x2f/0x40 cifs_signal_cifsd_for_reconnect+0x134/0x200 __cifs_reconnect+0x8f/0x500 cifs_handle_standard+0x112/0x280 cifs_demultiplex_thread+0x64d/0xbc0 kthread+0x2f7/0x310 ret_from_fork+0x2a/0x230 ret_from_fork_asm+0x1a/0x30 other info that might help us debug this: Chain exists of: &tcp_ses->srv_lock --> &ret_buf->ses_lock --> &ret_buf->chan_lock Possible unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&ret_buf->chan_lock); lock(&ret_buf->ses_lock); lock(&ret_buf->chan_lock); lock(&tcp_ses->srv_lock); *** DEADLOCK *** 3 locks held by cifsd/6055: #0: ffffffff857de398 (&cifs_tcp_ses_lock){+.+.}-{3:3}, at: cifs_signal_cifsd_for_reconnect+0x7b/0x200 #1: ffff888119c64060 (&ret_buf->ses_lock){+.+.}-{3:3}, at: cifs_signal_cifsd_for_reconnect+0x9c/0x200 #2: ffff888119c64330 (&ret_buf->chan_lock){+.+.}-{3:3}, at: cifs_signal_cifsd_for_reconnect+0xcf/0x200 Cc: linux-cifs@vger.kernel.org Reported-by: David Howells Fixes: d7d7a66aacd6 ("cifs: avoid use of global locks for high contention data") Reviewed-by: David Howells Tested-by: David Howells Signed-off-by: Paulo Alcantara (Red Hat) Signed-off-by: David Howells Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/cifsglob.h | 1 + fs/smb/client/connect.c | 58 +++++++++++++++++++++++++--------------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index d573740e54a1a..c66655adecb2c 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -677,6 +677,7 @@ inc_rfc1001_len(void *buf, int count) struct TCP_Server_Info { struct list_head tcp_ses_list; struct list_head smb_ses_list; + struct list_head rlist; /* reconnect list */ spinlock_t srv_lock; /* protect anything here that is not protected */ __u64 conn_id; /* connection identifier (useful for debugging) */ int srv_count; /* reference counter */ diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index 91f5fd818cbf4..9275e0d1e2f64 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -140,6 +140,14 @@ static void smb2_query_server_interfaces(struct work_struct *work) (SMB_INTERFACE_POLL_INTERVAL * HZ)); } +#define set_need_reco(server) \ +do { \ + spin_lock(&server->srv_lock); \ + if (server->tcpStatus != CifsExiting) \ + server->tcpStatus = CifsNeedReconnect; \ + spin_unlock(&server->srv_lock); \ +} while (0) + /* * Update the tcpStatus for the server. * This is used to signal the cifsd thread to call cifs_reconnect @@ -153,39 +161,45 @@ void cifs_signal_cifsd_for_reconnect(struct TCP_Server_Info *server, bool all_channels) { - struct TCP_Server_Info *pserver; + struct TCP_Server_Info *nserver; struct cifs_ses *ses; + LIST_HEAD(reco); int i; - /* If server is a channel, select the primary channel */ - pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; - /* if we need to signal just this channel */ if (!all_channels) { - spin_lock(&server->srv_lock); - if (server->tcpStatus != CifsExiting) - server->tcpStatus = CifsNeedReconnect; - spin_unlock(&server->srv_lock); + set_need_reco(server); return; } - spin_lock(&cifs_tcp_ses_lock); - list_for_each_entry(ses, &pserver->smb_ses_list, smb_ses_list) { - if (cifs_ses_exiting(ses)) - continue; - spin_lock(&ses->chan_lock); - for (i = 0; i < ses->chan_count; i++) { - if (!ses->chans[i].server) + if (SERVER_IS_CHAN(server)) + server = server->primary_server; + scoped_guard(spinlock, &cifs_tcp_ses_lock) { + set_need_reco(server); + list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) { + spin_lock(&ses->ses_lock); + if (ses->ses_status == SES_EXITING) { + spin_unlock(&ses->ses_lock); continue; - - spin_lock(&ses->chans[i].server->srv_lock); - if (ses->chans[i].server->tcpStatus != CifsExiting) - ses->chans[i].server->tcpStatus = CifsNeedReconnect; - spin_unlock(&ses->chans[i].server->srv_lock); + } + spin_lock(&ses->chan_lock); + for (i = 1; i < ses->chan_count; i++) { + nserver = ses->chans[i].server; + if (!nserver) + continue; + nserver->srv_count++; + list_add(&nserver->rlist, &reco); + } + spin_unlock(&ses->chan_lock); + spin_unlock(&ses->ses_lock); } - spin_unlock(&ses->chan_lock); } - spin_unlock(&cifs_tcp_ses_lock); + + list_for_each_entry_safe(server, nserver, &reco, rlist) { + list_del_init(&server->rlist); + set_need_reco(server); + cifs_put_tcp_session(server, 0); + } } /* -- GitLab From a9bb4006c4f3ad19e075931b52e74fcbbfbbaeab Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 28 May 2025 18:01:30 +0200 Subject: [PATCH 1757/2211] smb: smbdirect: add smbdirect_pdu.h with protocol definitions [ Upstream commit 00fab6cf323fa5850e6cbe283b23e605e6e97912 ] This is just a start moving into a common smbdirect layer. It will be used in the next commits... Cc: Steve French Cc: Tom Talpey Cc: Long Li Cc: Namjae Jeon Cc: Hyunchul Lee Cc: Meetakshi Setiya Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher Signed-off-by: Steve French Stable-dep-of: 43e7e284fc77 ("cifs: Fix the smbd_response slab to allow usercopy") Signed-off-by: Sasha Levin --- fs/smb/common/smbdirect/smbdirect_pdu.h | 55 +++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 fs/smb/common/smbdirect/smbdirect_pdu.h diff --git a/fs/smb/common/smbdirect/smbdirect_pdu.h b/fs/smb/common/smbdirect/smbdirect_pdu.h new file mode 100644 index 0000000000000..ae9fdb05ce231 --- /dev/null +++ b/fs/smb/common/smbdirect/smbdirect_pdu.h @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2017 Stefan Metzmacher + */ + +#ifndef __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_PDU_H__ +#define __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_PDU_H__ + +#define SMBDIRECT_V1 0x0100 + +/* SMBD negotiation request packet [MS-SMBD] 2.2.1 */ +struct smbdirect_negotiate_req { + __le16 min_version; + __le16 max_version; + __le16 reserved; + __le16 credits_requested; + __le32 preferred_send_size; + __le32 max_receive_size; + __le32 max_fragmented_size; +} __packed; + +/* SMBD negotiation response packet [MS-SMBD] 2.2.2 */ +struct smbdirect_negotiate_resp { + __le16 min_version; + __le16 max_version; + __le16 negotiated_version; + __le16 reserved; + __le16 credits_requested; + __le16 credits_granted; + __le32 status; + __le32 max_readwrite_size; + __le32 preferred_send_size; + __le32 max_receive_size; + __le32 max_fragmented_size; +} __packed; + +#define SMBDIRECT_DATA_MIN_HDR_SIZE 0x14 +#define SMBDIRECT_DATA_OFFSET 0x18 + +#define SMBDIRECT_FLAG_RESPONSE_REQUESTED 0x0001 + +/* SMBD data transfer packet with payload [MS-SMBD] 2.2.3 */ +struct smbdirect_data_transfer { + __le16 credits_requested; + __le16 credits_granted; + __le16 flags; + __le16 reserved; + __le32 remaining_data_length; + __le32 data_offset; + __le32 data_length; + __le32 padding; + __u8 buffer[]; +} __packed; + +#endif /* __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_PDU_H__ */ -- GitLab From 6509de31b1b67fd55d51ddaeac45f81bab6b3bc2 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 28 May 2025 18:01:31 +0200 Subject: [PATCH 1758/2211] smb: client: make use of common smbdirect_pdu.h [ Upstream commit 64946d5be665ddac6b5bf11f5b5ff319aae0f4c6 ] Cc: Steve French Cc: Tom Talpey Cc: Long Li Cc: Namjae Jeon Cc: Hyunchul Lee Cc: Meetakshi Setiya Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher Signed-off-by: Steve French Stable-dep-of: 43e7e284fc77 ("cifs: Fix the smbd_response slab to allow usercopy") Signed-off-by: Sasha Levin --- fs/smb/client/smbdirect.c | 40 ++++++++++++++++++-------------------- fs/smb/client/smbdirect.h | 41 --------------------------------------- 2 files changed, 19 insertions(+), 62 deletions(-) diff --git a/fs/smb/client/smbdirect.c b/fs/smb/client/smbdirect.c index 9d8be034f103f..d506ab259e082 100644 --- a/fs/smb/client/smbdirect.c +++ b/fs/smb/client/smbdirect.c @@ -7,6 +7,7 @@ #include #include #include +#include "../common/smbdirect/smbdirect_pdu.h" #include "smbdirect.h" #include "cifs_debug.h" #include "cifsproto.h" @@ -50,9 +51,6 @@ struct smb_extract_to_rdma { static ssize_t smb_extract_iter_to_rdma(struct iov_iter *iter, size_t len, struct smb_extract_to_rdma *rdma); -/* SMBD version number */ -#define SMBD_V1 0x0100 - /* Port numbers for SMBD transport */ #define SMB_PORT 445 #define SMBD_PORT 5445 @@ -299,7 +297,7 @@ static void send_done(struct ib_cq *cq, struct ib_wc *wc) mempool_free(request, request->info->request_mempool); } -static void dump_smbd_negotiate_resp(struct smbd_negotiate_resp *resp) +static void dump_smbdirect_negotiate_resp(struct smbdirect_negotiate_resp *resp) { log_rdma_event(INFO, "resp message min_version %u max_version %u negotiated_version %u credits_requested %u credits_granted %u status %u max_readwrite_size %u preferred_send_size %u max_receive_size %u max_fragmented_size %u\n", resp->min_version, resp->max_version, @@ -318,15 +316,15 @@ static bool process_negotiation_response( struct smbd_response *response, int packet_length) { struct smbd_connection *info = response->info; - struct smbd_negotiate_resp *packet = smbd_response_payload(response); + struct smbdirect_negotiate_resp *packet = smbd_response_payload(response); - if (packet_length < sizeof(struct smbd_negotiate_resp)) { + if (packet_length < sizeof(struct smbdirect_negotiate_resp)) { log_rdma_event(ERR, "error: packet_length=%d\n", packet_length); return false; } - if (le16_to_cpu(packet->negotiated_version) != SMBD_V1) { + if (le16_to_cpu(packet->negotiated_version) != SMBDIRECT_V1) { log_rdma_event(ERR, "error: negotiated_version=%x\n", le16_to_cpu(packet->negotiated_version)); return false; @@ -448,7 +446,7 @@ static void smbd_post_send_credits(struct work_struct *work) /* Called from softirq, when recv is done */ static void recv_done(struct ib_cq *cq, struct ib_wc *wc) { - struct smbd_data_transfer *data_transfer; + struct smbdirect_data_transfer *data_transfer; struct smbd_response *response = container_of(wc->wr_cqe, struct smbd_response, cqe); struct smbd_connection *info = response->info; @@ -474,7 +472,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc) switch (response->type) { /* SMBD negotiation response */ case SMBD_NEGOTIATE_RESP: - dump_smbd_negotiate_resp(smbd_response_payload(response)); + dump_smbdirect_negotiate_resp(smbd_response_payload(response)); info->full_packet_received = true; info->negotiate_done = process_negotiation_response(response, wc->byte_len); @@ -531,7 +529,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc) /* Send a KEEP_ALIVE response right away if requested */ info->keep_alive_requested = KEEP_ALIVE_NONE; if (le16_to_cpu(data_transfer->flags) & - SMB_DIRECT_RESPONSE_REQUESTED) { + SMBDIRECT_FLAG_RESPONSE_REQUESTED) { info->keep_alive_requested = KEEP_ALIVE_PENDING; } @@ -686,7 +684,7 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info) struct ib_send_wr send_wr; int rc = -ENOMEM; struct smbd_request *request; - struct smbd_negotiate_req *packet; + struct smbdirect_negotiate_req *packet; request = mempool_alloc(info->request_mempool, GFP_KERNEL); if (!request) @@ -695,8 +693,8 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info) request->info = info; packet = smbd_request_payload(request); - packet->min_version = cpu_to_le16(SMBD_V1); - packet->max_version = cpu_to_le16(SMBD_V1); + packet->min_version = cpu_to_le16(SMBDIRECT_V1); + packet->max_version = cpu_to_le16(SMBDIRECT_V1); packet->reserved = 0; packet->credits_requested = cpu_to_le16(info->send_credit_target); packet->preferred_send_size = cpu_to_le32(info->max_send_size); @@ -774,10 +772,10 @@ static int manage_credits_prior_sending(struct smbd_connection *info) /* * Check if we need to send a KEEP_ALIVE message * The idle connection timer triggers a KEEP_ALIVE message when expires - * SMB_DIRECT_RESPONSE_REQUESTED is set in the message flag to have peer send + * SMBDIRECT_FLAG_RESPONSE_REQUESTED is set in the message flag to have peer send * back a response. * return value: - * 1 if SMB_DIRECT_RESPONSE_REQUESTED needs to be set + * 1 if SMBDIRECT_FLAG_RESPONSE_REQUESTED needs to be set * 0: otherwise */ static int manage_keep_alive_before_sending(struct smbd_connection *info) @@ -837,7 +835,7 @@ static int smbd_post_send_iter(struct smbd_connection *info, int header_length; int data_length; struct smbd_request *request; - struct smbd_data_transfer *packet; + struct smbdirect_data_transfer *packet; int new_credits = 0; wait_credit: @@ -919,7 +917,7 @@ wait_send_queue: packet->flags = 0; if (manage_keep_alive_before_sending(info)) - packet->flags |= cpu_to_le16(SMB_DIRECT_RESPONSE_REQUESTED); + packet->flags |= cpu_to_le16(SMBDIRECT_FLAG_RESPONSE_REQUESTED); packet->reserved = 0; if (!data_length) @@ -938,10 +936,10 @@ wait_send_queue: le32_to_cpu(packet->remaining_data_length)); /* Map the packet to DMA */ - header_length = sizeof(struct smbd_data_transfer); + header_length = sizeof(struct smbdirect_data_transfer); /* If this is a packet without payload, don't send padding */ if (!data_length) - header_length = offsetof(struct smbd_data_transfer, padding); + header_length = offsetof(struct smbdirect_data_transfer, padding); request->sge[0].addr = ib_dma_map_single(info->id->device, (void *)packet, @@ -1432,7 +1430,7 @@ static int allocate_caches_and_workqueue(struct smbd_connection *info) kmem_cache_create( name, sizeof(struct smbd_request) + - sizeof(struct smbd_data_transfer), + sizeof(struct smbdirect_data_transfer), 0, SLAB_HWCACHE_ALIGN, NULL); if (!info->request_cache) return -ENOMEM; @@ -1735,7 +1733,7 @@ static int smbd_recv_buf(struct smbd_connection *info, char *buf, unsigned int size) { struct smbd_response *response; - struct smbd_data_transfer *data_transfer; + struct smbdirect_data_transfer *data_transfer; int to_copy, to_read, data_read, offset; u32 data_length, remaining_data_length, data_offset; int rc; diff --git a/fs/smb/client/smbdirect.h b/fs/smb/client/smbdirect.h index c08e3665150d7..4da0974ce7305 100644 --- a/fs/smb/client/smbdirect.h +++ b/fs/smb/client/smbdirect.h @@ -177,47 +177,6 @@ enum smbd_message_type { SMBD_TRANSFER_DATA, }; -#define SMB_DIRECT_RESPONSE_REQUESTED 0x0001 - -/* SMBD negotiation request packet [MS-SMBD] 2.2.1 */ -struct smbd_negotiate_req { - __le16 min_version; - __le16 max_version; - __le16 reserved; - __le16 credits_requested; - __le32 preferred_send_size; - __le32 max_receive_size; - __le32 max_fragmented_size; -} __packed; - -/* SMBD negotiation response packet [MS-SMBD] 2.2.2 */ -struct smbd_negotiate_resp { - __le16 min_version; - __le16 max_version; - __le16 negotiated_version; - __le16 reserved; - __le16 credits_requested; - __le16 credits_granted; - __le32 status; - __le32 max_readwrite_size; - __le32 preferred_send_size; - __le32 max_receive_size; - __le32 max_fragmented_size; -} __packed; - -/* SMBD data transfer packet with payload [MS-SMBD] 2.2.3 */ -struct smbd_data_transfer { - __le16 credits_requested; - __le16 credits_granted; - __le16 flags; - __le16 reserved; - __le32 remaining_data_length; - __le32 data_offset; - __le32 data_length; - __le32 padding; - __u8 buffer[]; -} __packed; - /* The packet fields for a registered RDMA buffer */ struct smbd_buffer_descriptor_v1 { __le64 offset; -- GitLab From a6ec1fcafd411e57b04b6373d68aa268973cfab8 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 28 May 2025 18:01:33 +0200 Subject: [PATCH 1759/2211] smb: smbdirect: add smbdirect.h with public structures [ Upstream commit 7e136a718633b2c54764e185f3bfccf0763fc1dd ] Will be used in client and server in the next commits. Cc: Steve French Cc: Tom Talpey Cc: Long Li Cc: Namjae Jeon Cc: Hyunchul Lee CC: Meetakshi Setiya Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher Signed-off-by: Steve French Stable-dep-of: 43e7e284fc77 ("cifs: Fix the smbd_response slab to allow usercopy") Signed-off-by: Sasha Levin --- fs/smb/common/smbdirect/smbdirect.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 fs/smb/common/smbdirect/smbdirect.h diff --git a/fs/smb/common/smbdirect/smbdirect.h b/fs/smb/common/smbdirect/smbdirect.h new file mode 100644 index 0000000000000..eedbdf0d04337 --- /dev/null +++ b/fs/smb/common/smbdirect/smbdirect.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2017, Microsoft Corporation. + * Copyright (C) 2018, LG Electronics. + */ + +#ifndef __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_H__ +#define __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_H__ + +/* SMB-DIRECT buffer descriptor V1 structure [MS-SMBD] 2.2.3.1 */ +struct smbdirect_buffer_descriptor_v1 { + __le64 offset; + __le32 token; + __le32 length; +} __packed; + +#endif /* __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_H__ */ -- GitLab From f4b05342c2937d04405a8e36887453b509bc9993 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 28 May 2025 18:01:36 +0200 Subject: [PATCH 1760/2211] smb: smbdirect: add smbdirect_socket.h [ Upstream commit 22234e37d7e97652cb53133009da5e14793d3c10 ] This abstracts the common smbdirect layer. Currently with just a few things in it, but that will change over time until everything is in common. Will be used in client and server in the next commits Cc: Steve French Cc: Tom Talpey Cc: Long Li Cc: Namjae Jeon Cc: Hyunchul Lee Cc: Meetakshi Setiya Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher Signed-off-by: Steve French Stable-dep-of: 43e7e284fc77 ("cifs: Fix the smbd_response slab to allow usercopy") Signed-off-by: Sasha Levin --- fs/smb/common/smbdirect/smbdirect_socket.h | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 fs/smb/common/smbdirect/smbdirect_socket.h diff --git a/fs/smb/common/smbdirect/smbdirect_socket.h b/fs/smb/common/smbdirect/smbdirect_socket.h new file mode 100644 index 0000000000000..69a55561f91ae --- /dev/null +++ b/fs/smb/common/smbdirect/smbdirect_socket.h @@ -0,0 +1,41 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2025 Stefan Metzmacher + */ + +#ifndef __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_SOCKET_H__ +#define __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_SOCKET_H__ + +enum smbdirect_socket_status { + SMBDIRECT_SOCKET_CREATED, + SMBDIRECT_SOCKET_CONNECTING, + SMBDIRECT_SOCKET_CONNECTED, + SMBDIRECT_SOCKET_NEGOTIATE_FAILED, + SMBDIRECT_SOCKET_DISCONNECTING, + SMBDIRECT_SOCKET_DISCONNECTED, + SMBDIRECT_SOCKET_DESTROYED +}; + +struct smbdirect_socket { + enum smbdirect_socket_status status; + + /* RDMA related */ + struct { + struct rdma_cm_id *cm_id; + } rdma; + + /* IB verbs related */ + struct { + struct ib_pd *pd; + struct ib_cq *send_cq; + struct ib_cq *recv_cq; + + /* + * shortcuts for rdma.cm_id->{qp,device}; + */ + struct ib_qp *qp; + struct ib_device *dev; + } ib; +}; + +#endif /* __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_SOCKET_H__ */ -- GitLab From c39639bc77232578885032a712bea547891a8dcd Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 28 May 2025 18:01:37 +0200 Subject: [PATCH 1761/2211] smb: client: make use of common smbdirect_socket [ Upstream commit c3011b9a7deaaaabdf955815d29eac39c8b75e67 ] This is the next step in the direction of a common smbdirect layer. Currently only structures are shared, but that will change over time until everything is shared. Cc: Steve French Cc: Tom Talpey Cc: Long Li Cc: Namjae Jeon Cc: Hyunchul Lee Cc: Meetakshi Setiya Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher Signed-off-by: Steve French Stable-dep-of: 43e7e284fc77 ("cifs: Fix the smbd_response slab to allow usercopy") Signed-off-by: Sasha Levin --- fs/smb/client/cifs_debug.c | 2 +- fs/smb/client/smbdirect.c | 258 ++++++++++++++++++++----------------- fs/smb/client/smbdirect.h | 12 +- 3 files changed, 146 insertions(+), 126 deletions(-) diff --git a/fs/smb/client/cifs_debug.c b/fs/smb/client/cifs_debug.c index e03c890de0a06..56b0b5c82dd19 100644 --- a/fs/smb/client/cifs_debug.c +++ b/fs/smb/client/cifs_debug.c @@ -387,7 +387,7 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) seq_printf(m, "\nSMBDirect (in hex) protocol version: %x " "transport status: %x", server->smbd_conn->protocol, - server->smbd_conn->transport_status); + server->smbd_conn->socket.status); seq_printf(m, "\nConn receive_credit_max: %x " "send_credit_target: %x max_send_size: %x", server->smbd_conn->receive_credit_max, diff --git a/fs/smb/client/smbdirect.c b/fs/smb/client/smbdirect.c index d506ab259e082..ac489df8151a1 100644 --- a/fs/smb/client/smbdirect.c +++ b/fs/smb/client/smbdirect.c @@ -163,10 +163,11 @@ static void smbd_disconnect_rdma_work(struct work_struct *work) { struct smbd_connection *info = container_of(work, struct smbd_connection, disconnect_work); + struct smbdirect_socket *sc = &info->socket; - if (info->transport_status == SMBD_CONNECTED) { - info->transport_status = SMBD_DISCONNECTING; - rdma_disconnect(info->id); + if (sc->status == SMBDIRECT_SOCKET_CONNECTED) { + sc->status = SMBDIRECT_SOCKET_DISCONNECTING; + rdma_disconnect(sc->rdma.cm_id); } } @@ -180,6 +181,7 @@ static int smbd_conn_upcall( struct rdma_cm_id *id, struct rdma_cm_event *event) { struct smbd_connection *info = id->context; + struct smbdirect_socket *sc = &info->socket; log_rdma_event(INFO, "event=%d status=%d\n", event->event, event->status); @@ -203,7 +205,7 @@ static int smbd_conn_upcall( case RDMA_CM_EVENT_ESTABLISHED: log_rdma_event(INFO, "connected event=%d\n", event->event); - info->transport_status = SMBD_CONNECTED; + sc->status = SMBDIRECT_SOCKET_CONNECTED; wake_up_interruptible(&info->conn_wait); break; @@ -211,20 +213,20 @@ static int smbd_conn_upcall( case RDMA_CM_EVENT_UNREACHABLE: case RDMA_CM_EVENT_REJECTED: log_rdma_event(INFO, "connecting failed event=%d\n", event->event); - info->transport_status = SMBD_DISCONNECTED; + sc->status = SMBDIRECT_SOCKET_DISCONNECTED; wake_up_interruptible(&info->conn_wait); break; case RDMA_CM_EVENT_DEVICE_REMOVAL: case RDMA_CM_EVENT_DISCONNECTED: /* This happens when we fail the negotiation */ - if (info->transport_status == SMBD_NEGOTIATE_FAILED) { - info->transport_status = SMBD_DISCONNECTED; + if (sc->status == SMBDIRECT_SOCKET_NEGOTIATE_FAILED) { + sc->status = SMBDIRECT_SOCKET_DISCONNECTED; wake_up(&info->conn_wait); break; } - info->transport_status = SMBD_DISCONNECTED; + sc->status = SMBDIRECT_SOCKET_DISCONNECTED; wake_up_interruptible(&info->disconn_wait); wake_up_interruptible(&info->wait_reassembly_queue); wake_up_interruptible_all(&info->wait_send_queue); @@ -273,6 +275,8 @@ static void send_done(struct ib_cq *cq, struct ib_wc *wc) int i; struct smbd_request *request = container_of(wc->wr_cqe, struct smbd_request, cqe); + struct smbd_connection *info = request->info; + struct smbdirect_socket *sc = &info->socket; log_rdma_send(INFO, "smbd_request 0x%p completed wc->status=%d\n", request, wc->status); @@ -284,7 +288,7 @@ static void send_done(struct ib_cq *cq, struct ib_wc *wc) } for (i = 0; i < request->num_sge; i++) - ib_dma_unmap_single(request->info->id->device, + ib_dma_unmap_single(sc->ib.dev, request->sge[i].addr, request->sge[i].length, DMA_TO_DEVICE); @@ -391,8 +395,9 @@ static void smbd_post_send_credits(struct work_struct *work) struct smbd_connection *info = container_of(work, struct smbd_connection, post_send_credits_work); + struct smbdirect_socket *sc = &info->socket; - if (info->transport_status != SMBD_CONNECTED) { + if (sc->status != SMBDIRECT_SOCKET_CONNECTED) { wake_up(&info->wait_receive_queues); return; } @@ -633,32 +638,34 @@ static int smbd_ia_open( struct smbd_connection *info, struct sockaddr *dstaddr, int port) { + struct smbdirect_socket *sc = &info->socket; int rc; - info->id = smbd_create_id(info, dstaddr, port); - if (IS_ERR(info->id)) { - rc = PTR_ERR(info->id); + sc->rdma.cm_id = smbd_create_id(info, dstaddr, port); + if (IS_ERR(sc->rdma.cm_id)) { + rc = PTR_ERR(sc->rdma.cm_id); goto out1; } + sc->ib.dev = sc->rdma.cm_id->device; - if (!frwr_is_supported(&info->id->device->attrs)) { + if (!frwr_is_supported(&sc->ib.dev->attrs)) { log_rdma_event(ERR, "Fast Registration Work Requests (FRWR) is not supported\n"); log_rdma_event(ERR, "Device capability flags = %llx max_fast_reg_page_list_len = %u\n", - info->id->device->attrs.device_cap_flags, - info->id->device->attrs.max_fast_reg_page_list_len); + sc->ib.dev->attrs.device_cap_flags, + sc->ib.dev->attrs.max_fast_reg_page_list_len); rc = -EPROTONOSUPPORT; goto out2; } info->max_frmr_depth = min_t(int, smbd_max_frmr_depth, - info->id->device->attrs.max_fast_reg_page_list_len); + sc->ib.dev->attrs.max_fast_reg_page_list_len); info->mr_type = IB_MR_TYPE_MEM_REG; - if (info->id->device->attrs.kernel_cap_flags & IBK_SG_GAPS_REG) + if (sc->ib.dev->attrs.kernel_cap_flags & IBK_SG_GAPS_REG) info->mr_type = IB_MR_TYPE_SG_GAPS; - info->pd = ib_alloc_pd(info->id->device, 0); - if (IS_ERR(info->pd)) { - rc = PTR_ERR(info->pd); + sc->ib.pd = ib_alloc_pd(sc->ib.dev, 0); + if (IS_ERR(sc->ib.pd)) { + rc = PTR_ERR(sc->ib.pd); log_rdma_event(ERR, "ib_alloc_pd() returned %d\n", rc); goto out2; } @@ -666,8 +673,8 @@ static int smbd_ia_open( return 0; out2: - rdma_destroy_id(info->id); - info->id = NULL; + rdma_destroy_id(sc->rdma.cm_id); + sc->rdma.cm_id = NULL; out1: return rc; @@ -681,6 +688,7 @@ out1: */ static int smbd_post_send_negotiate_req(struct smbd_connection *info) { + struct smbdirect_socket *sc = &info->socket; struct ib_send_wr send_wr; int rc = -ENOMEM; struct smbd_request *request; @@ -704,18 +712,18 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info) request->num_sge = 1; request->sge[0].addr = ib_dma_map_single( - info->id->device, (void *)packet, + sc->ib.dev, (void *)packet, sizeof(*packet), DMA_TO_DEVICE); - if (ib_dma_mapping_error(info->id->device, request->sge[0].addr)) { + if (ib_dma_mapping_error(sc->ib.dev, request->sge[0].addr)) { rc = -EIO; goto dma_mapping_failed; } request->sge[0].length = sizeof(*packet); - request->sge[0].lkey = info->pd->local_dma_lkey; + request->sge[0].lkey = sc->ib.pd->local_dma_lkey; ib_dma_sync_single_for_device( - info->id->device, request->sge[0].addr, + sc->ib.dev, request->sge[0].addr, request->sge[0].length, DMA_TO_DEVICE); request->cqe.done = send_done; @@ -732,14 +740,14 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info) request->sge[0].length, request->sge[0].lkey); atomic_inc(&info->send_pending); - rc = ib_post_send(info->id->qp, &send_wr, NULL); + rc = ib_post_send(sc->ib.qp, &send_wr, NULL); if (!rc) return 0; /* if we reach here, post send failed */ log_rdma_send(ERR, "ib_post_send failed rc=%d\n", rc); atomic_dec(&info->send_pending); - ib_dma_unmap_single(info->id->device, request->sge[0].addr, + ib_dma_unmap_single(sc->ib.dev, request->sge[0].addr, request->sge[0].length, DMA_TO_DEVICE); smbd_disconnect_rdma_connection(info); @@ -791,6 +799,7 @@ static int manage_keep_alive_before_sending(struct smbd_connection *info) static int smbd_post_send(struct smbd_connection *info, struct smbd_request *request) { + struct smbdirect_socket *sc = &info->socket; struct ib_send_wr send_wr; int rc, i; @@ -799,7 +808,7 @@ static int smbd_post_send(struct smbd_connection *info, "rdma_request sge[%d] addr=0x%llx length=%u\n", i, request->sge[i].addr, request->sge[i].length); ib_dma_sync_single_for_device( - info->id->device, + sc->ib.dev, request->sge[i].addr, request->sge[i].length, DMA_TO_DEVICE); @@ -814,7 +823,7 @@ static int smbd_post_send(struct smbd_connection *info, send_wr.opcode = IB_WR_SEND; send_wr.send_flags = IB_SEND_SIGNALED; - rc = ib_post_send(info->id->qp, &send_wr, NULL); + rc = ib_post_send(sc->ib.qp, &send_wr, NULL); if (rc) { log_rdma_send(ERR, "ib_post_send failed rc=%d\n", rc); smbd_disconnect_rdma_connection(info); @@ -831,6 +840,7 @@ static int smbd_post_send_iter(struct smbd_connection *info, struct iov_iter *iter, int *_remaining_data_length) { + struct smbdirect_socket *sc = &info->socket; int i, rc; int header_length; int data_length; @@ -842,11 +852,11 @@ wait_credit: /* Wait for send credits. A SMBD packet needs one credit */ rc = wait_event_interruptible(info->wait_send_queue, atomic_read(&info->send_credits) > 0 || - info->transport_status != SMBD_CONNECTED); + sc->status != SMBDIRECT_SOCKET_CONNECTED); if (rc) goto err_wait_credit; - if (info->transport_status != SMBD_CONNECTED) { + if (sc->status != SMBDIRECT_SOCKET_CONNECTED) { log_outgoing(ERR, "disconnected not sending on wait_credit\n"); rc = -EAGAIN; goto err_wait_credit; @@ -859,9 +869,9 @@ wait_credit: wait_send_queue: wait_event(info->wait_post_send, atomic_read(&info->send_pending) < info->send_credit_target || - info->transport_status != SMBD_CONNECTED); + sc->status != SMBDIRECT_SOCKET_CONNECTED); - if (info->transport_status != SMBD_CONNECTED) { + if (sc->status != SMBDIRECT_SOCKET_CONNECTED) { log_outgoing(ERR, "disconnected not sending on wait_send_queue\n"); rc = -EAGAIN; goto err_wait_send_queue; @@ -888,8 +898,8 @@ wait_send_queue: .nr_sge = 1, .max_sge = SMBDIRECT_MAX_SEND_SGE, .sge = request->sge, - .device = info->id->device, - .local_dma_lkey = info->pd->local_dma_lkey, + .device = sc->ib.dev, + .local_dma_lkey = sc->ib.pd->local_dma_lkey, .direction = DMA_TO_DEVICE, }; @@ -941,18 +951,18 @@ wait_send_queue: if (!data_length) header_length = offsetof(struct smbdirect_data_transfer, padding); - request->sge[0].addr = ib_dma_map_single(info->id->device, + request->sge[0].addr = ib_dma_map_single(sc->ib.dev, (void *)packet, header_length, DMA_TO_DEVICE); - if (ib_dma_mapping_error(info->id->device, request->sge[0].addr)) { + if (ib_dma_mapping_error(sc->ib.dev, request->sge[0].addr)) { rc = -EIO; request->sge[0].addr = 0; goto err_dma; } request->sge[0].length = header_length; - request->sge[0].lkey = info->pd->local_dma_lkey; + request->sge[0].lkey = sc->ib.pd->local_dma_lkey; rc = smbd_post_send(info, request); if (!rc) @@ -961,7 +971,7 @@ wait_send_queue: err_dma: for (i = 0; i < request->num_sge; i++) if (request->sge[i].addr) - ib_dma_unmap_single(info->id->device, + ib_dma_unmap_single(sc->ib.dev, request->sge[i].addr, request->sge[i].length, DMA_TO_DEVICE); @@ -1006,17 +1016,18 @@ static int smbd_post_send_empty(struct smbd_connection *info) static int smbd_post_recv( struct smbd_connection *info, struct smbd_response *response) { + struct smbdirect_socket *sc = &info->socket; struct ib_recv_wr recv_wr; int rc = -EIO; response->sge.addr = ib_dma_map_single( - info->id->device, response->packet, + sc->ib.dev, response->packet, info->max_receive_size, DMA_FROM_DEVICE); - if (ib_dma_mapping_error(info->id->device, response->sge.addr)) + if (ib_dma_mapping_error(sc->ib.dev, response->sge.addr)) return rc; response->sge.length = info->max_receive_size; - response->sge.lkey = info->pd->local_dma_lkey; + response->sge.lkey = sc->ib.pd->local_dma_lkey; response->cqe.done = recv_done; @@ -1025,9 +1036,9 @@ static int smbd_post_recv( recv_wr.sg_list = &response->sge; recv_wr.num_sge = 1; - rc = ib_post_recv(info->id->qp, &recv_wr, NULL); + rc = ib_post_recv(sc->ib.qp, &recv_wr, NULL); if (rc) { - ib_dma_unmap_single(info->id->device, response->sge.addr, + ib_dma_unmap_single(sc->ib.dev, response->sge.addr, response->sge.length, DMA_FROM_DEVICE); smbd_disconnect_rdma_connection(info); log_rdma_recv(ERR, "ib_post_recv failed rc=%d\n", rc); @@ -1185,9 +1196,10 @@ static struct smbd_response *get_receive_buffer(struct smbd_connection *info) static void put_receive_buffer( struct smbd_connection *info, struct smbd_response *response) { + struct smbdirect_socket *sc = &info->socket; unsigned long flags; - ib_dma_unmap_single(info->id->device, response->sge.addr, + ib_dma_unmap_single(sc->ib.dev, response->sge.addr, response->sge.length, DMA_FROM_DEVICE); spin_lock_irqsave(&info->receive_queue_lock, flags); @@ -1287,6 +1299,7 @@ static void idle_connection_timer(struct work_struct *work) void smbd_destroy(struct TCP_Server_Info *server) { struct smbd_connection *info = server->smbd_conn; + struct smbdirect_socket *sc; struct smbd_response *response; unsigned long flags; @@ -1294,19 +1307,21 @@ void smbd_destroy(struct TCP_Server_Info *server) log_rdma_event(INFO, "rdma session already destroyed\n"); return; } + sc = &info->socket; log_rdma_event(INFO, "destroying rdma session\n"); - if (info->transport_status != SMBD_DISCONNECTED) { - rdma_disconnect(server->smbd_conn->id); + if (sc->status != SMBDIRECT_SOCKET_DISCONNECTED) { + rdma_disconnect(sc->rdma.cm_id); log_rdma_event(INFO, "wait for transport being disconnected\n"); wait_event_interruptible( info->disconn_wait, - info->transport_status == SMBD_DISCONNECTED); + sc->status == SMBDIRECT_SOCKET_DISCONNECTED); } log_rdma_event(INFO, "destroying qp\n"); - ib_drain_qp(info->id->qp); - rdma_destroy_qp(info->id); + ib_drain_qp(sc->ib.qp); + rdma_destroy_qp(sc->rdma.cm_id); + sc->ib.qp = NULL; log_rdma_event(INFO, "cancelling idle timer\n"); cancel_delayed_work_sync(&info->idle_timer_work); @@ -1353,10 +1368,10 @@ void smbd_destroy(struct TCP_Server_Info *server) } destroy_mr_list(info); - ib_free_cq(info->send_cq); - ib_free_cq(info->recv_cq); - ib_dealloc_pd(info->pd); - rdma_destroy_id(info->id); + ib_free_cq(sc->ib.send_cq); + ib_free_cq(sc->ib.recv_cq); + ib_dealloc_pd(sc->ib.pd); + rdma_destroy_id(sc->rdma.cm_id); /* free mempools */ mempool_destroy(info->request_mempool); @@ -1365,7 +1380,7 @@ void smbd_destroy(struct TCP_Server_Info *server) mempool_destroy(info->response_mempool); kmem_cache_destroy(info->response_cache); - info->transport_status = SMBD_DESTROYED; + sc->status = SMBDIRECT_SOCKET_DESTROYED; destroy_workqueue(info->workqueue); log_rdma_event(INFO, "rdma session destroyed\n"); @@ -1390,7 +1405,7 @@ int smbd_reconnect(struct TCP_Server_Info *server) * This is possible if transport is disconnected and we haven't received * notification from RDMA, but upper layer has detected timeout */ - if (server->smbd_conn->transport_status == SMBD_CONNECTED) { + if (server->smbd_conn->socket.status == SMBDIRECT_SOCKET_CONNECTED) { log_rdma_event(INFO, "disconnecting transport\n"); smbd_destroy(server); } @@ -1489,6 +1504,7 @@ static struct smbd_connection *_smbd_get_connection( { int rc; struct smbd_connection *info; + struct smbdirect_socket *sc; struct rdma_conn_param conn_param; struct ib_qp_init_attr qp_attr; struct sockaddr_in *addr_in = (struct sockaddr_in *) dstaddr; @@ -1498,29 +1514,30 @@ static struct smbd_connection *_smbd_get_connection( info = kzalloc(sizeof(struct smbd_connection), GFP_KERNEL); if (!info) return NULL; + sc = &info->socket; - info->transport_status = SMBD_CONNECTING; + sc->status = SMBDIRECT_SOCKET_CONNECTING; rc = smbd_ia_open(info, dstaddr, port); if (rc) { log_rdma_event(INFO, "smbd_ia_open rc=%d\n", rc); goto create_id_failed; } - if (smbd_send_credit_target > info->id->device->attrs.max_cqe || - smbd_send_credit_target > info->id->device->attrs.max_qp_wr) { + if (smbd_send_credit_target > sc->ib.dev->attrs.max_cqe || + smbd_send_credit_target > sc->ib.dev->attrs.max_qp_wr) { log_rdma_event(ERR, "consider lowering send_credit_target = %d. Possible CQE overrun, device reporting max_cqe %d max_qp_wr %d\n", smbd_send_credit_target, - info->id->device->attrs.max_cqe, - info->id->device->attrs.max_qp_wr); + sc->ib.dev->attrs.max_cqe, + sc->ib.dev->attrs.max_qp_wr); goto config_failed; } - if (smbd_receive_credit_max > info->id->device->attrs.max_cqe || - smbd_receive_credit_max > info->id->device->attrs.max_qp_wr) { + if (smbd_receive_credit_max > sc->ib.dev->attrs.max_cqe || + smbd_receive_credit_max > sc->ib.dev->attrs.max_qp_wr) { log_rdma_event(ERR, "consider lowering receive_credit_max = %d. Possible CQE overrun, device reporting max_cqe %d max_qp_wr %d\n", smbd_receive_credit_max, - info->id->device->attrs.max_cqe, - info->id->device->attrs.max_qp_wr); + sc->ib.dev->attrs.max_cqe, + sc->ib.dev->attrs.max_qp_wr); goto config_failed; } @@ -1531,32 +1548,30 @@ static struct smbd_connection *_smbd_get_connection( info->max_receive_size = smbd_max_receive_size; info->keep_alive_interval = smbd_keep_alive_interval; - if (info->id->device->attrs.max_send_sge < SMBDIRECT_MAX_SEND_SGE || - info->id->device->attrs.max_recv_sge < SMBDIRECT_MAX_RECV_SGE) { + if (sc->ib.dev->attrs.max_send_sge < SMBDIRECT_MAX_SEND_SGE || + sc->ib.dev->attrs.max_recv_sge < SMBDIRECT_MAX_RECV_SGE) { log_rdma_event(ERR, "device %.*s max_send_sge/max_recv_sge = %d/%d too small\n", IB_DEVICE_NAME_MAX, - info->id->device->name, - info->id->device->attrs.max_send_sge, - info->id->device->attrs.max_recv_sge); + sc->ib.dev->name, + sc->ib.dev->attrs.max_send_sge, + sc->ib.dev->attrs.max_recv_sge); goto config_failed; } - info->send_cq = NULL; - info->recv_cq = NULL; - info->send_cq = - ib_alloc_cq_any(info->id->device, info, + sc->ib.send_cq = + ib_alloc_cq_any(sc->ib.dev, info, info->send_credit_target, IB_POLL_SOFTIRQ); - if (IS_ERR(info->send_cq)) { - info->send_cq = NULL; + if (IS_ERR(sc->ib.send_cq)) { + sc->ib.send_cq = NULL; goto alloc_cq_failed; } - info->recv_cq = - ib_alloc_cq_any(info->id->device, info, + sc->ib.recv_cq = + ib_alloc_cq_any(sc->ib.dev, info, info->receive_credit_max, IB_POLL_SOFTIRQ); - if (IS_ERR(info->recv_cq)) { - info->recv_cq = NULL; + if (IS_ERR(sc->ib.recv_cq)) { + sc->ib.recv_cq = NULL; goto alloc_cq_failed; } @@ -1570,29 +1585,30 @@ static struct smbd_connection *_smbd_get_connection( qp_attr.cap.max_inline_data = 0; qp_attr.sq_sig_type = IB_SIGNAL_REQ_WR; qp_attr.qp_type = IB_QPT_RC; - qp_attr.send_cq = info->send_cq; - qp_attr.recv_cq = info->recv_cq; + qp_attr.send_cq = sc->ib.send_cq; + qp_attr.recv_cq = sc->ib.recv_cq; qp_attr.port_num = ~0; - rc = rdma_create_qp(info->id, info->pd, &qp_attr); + rc = rdma_create_qp(sc->rdma.cm_id, sc->ib.pd, &qp_attr); if (rc) { log_rdma_event(ERR, "rdma_create_qp failed %i\n", rc); goto create_qp_failed; } + sc->ib.qp = sc->rdma.cm_id->qp; memset(&conn_param, 0, sizeof(conn_param)); conn_param.initiator_depth = 0; conn_param.responder_resources = - min(info->id->device->attrs.max_qp_rd_atom, + min(sc->ib.dev->attrs.max_qp_rd_atom, SMBD_CM_RESPONDER_RESOURCES); info->responder_resources = conn_param.responder_resources; log_rdma_mr(INFO, "responder_resources=%d\n", info->responder_resources); /* Need to send IRD/ORD in private data for iWARP */ - info->id->device->ops.get_port_immutable( - info->id->device, info->id->port_num, &port_immutable); + sc->ib.dev->ops.get_port_immutable( + sc->ib.dev, sc->rdma.cm_id->port_num, &port_immutable); if (port_immutable.core_cap_flags & RDMA_CORE_PORT_IWARP) { ird_ord_hdr[0] = info->responder_resources; ird_ord_hdr[1] = 1; @@ -1613,16 +1629,16 @@ static struct smbd_connection *_smbd_get_connection( init_waitqueue_head(&info->conn_wait); init_waitqueue_head(&info->disconn_wait); init_waitqueue_head(&info->wait_reassembly_queue); - rc = rdma_connect(info->id, &conn_param); + rc = rdma_connect(sc->rdma.cm_id, &conn_param); if (rc) { log_rdma_event(ERR, "rdma_connect() failed with %i\n", rc); goto rdma_connect_failed; } wait_event_interruptible( - info->conn_wait, info->transport_status != SMBD_CONNECTING); + info->conn_wait, sc->status != SMBDIRECT_SOCKET_CONNECTING); - if (info->transport_status != SMBD_CONNECTED) { + if (sc->status != SMBDIRECT_SOCKET_CONNECTED) { log_rdma_event(ERR, "rdma_connect failed port=%d\n", port); goto rdma_connect_failed; } @@ -1673,26 +1689,26 @@ allocate_mr_failed: negotiation_failed: cancel_delayed_work_sync(&info->idle_timer_work); destroy_caches_and_workqueue(info); - info->transport_status = SMBD_NEGOTIATE_FAILED; + sc->status = SMBDIRECT_SOCKET_NEGOTIATE_FAILED; init_waitqueue_head(&info->conn_wait); - rdma_disconnect(info->id); + rdma_disconnect(sc->rdma.cm_id); wait_event(info->conn_wait, - info->transport_status == SMBD_DISCONNECTED); + sc->status == SMBDIRECT_SOCKET_DISCONNECTED); allocate_cache_failed: rdma_connect_failed: - rdma_destroy_qp(info->id); + rdma_destroy_qp(sc->rdma.cm_id); create_qp_failed: alloc_cq_failed: - if (info->send_cq) - ib_free_cq(info->send_cq); - if (info->recv_cq) - ib_free_cq(info->recv_cq); + if (sc->ib.send_cq) + ib_free_cq(sc->ib.send_cq); + if (sc->ib.recv_cq) + ib_free_cq(sc->ib.recv_cq); config_failed: - ib_dealloc_pd(info->pd); - rdma_destroy_id(info->id); + ib_dealloc_pd(sc->ib.pd); + rdma_destroy_id(sc->rdma.cm_id); create_id_failed: kfree(info); @@ -1732,6 +1748,7 @@ try_again: static int smbd_recv_buf(struct smbd_connection *info, char *buf, unsigned int size) { + struct smbdirect_socket *sc = &info->socket; struct smbd_response *response; struct smbdirect_data_transfer *data_transfer; int to_copy, to_read, data_read, offset; @@ -1846,12 +1863,12 @@ read_rfc1002_done: rc = wait_event_interruptible( info->wait_reassembly_queue, info->reassembly_data_length >= size || - info->transport_status != SMBD_CONNECTED); + sc->status != SMBDIRECT_SOCKET_CONNECTED); /* Don't return any data if interrupted */ if (rc) return rc; - if (info->transport_status != SMBD_CONNECTED) { + if (sc->status != SMBDIRECT_SOCKET_CONNECTED) { log_read(ERR, "disconnected\n"); return -ECONNABORTED; } @@ -1869,6 +1886,7 @@ static int smbd_recv_page(struct smbd_connection *info, struct page *page, unsigned int page_offset, unsigned int to_read) { + struct smbdirect_socket *sc = &info->socket; int ret; char *to_address; void *page_address; @@ -1877,7 +1895,7 @@ static int smbd_recv_page(struct smbd_connection *info, ret = wait_event_interruptible( info->wait_reassembly_queue, info->reassembly_data_length >= to_read || - info->transport_status != SMBD_CONNECTED); + sc->status != SMBDIRECT_SOCKET_CONNECTED); if (ret) return ret; @@ -1952,12 +1970,13 @@ int smbd_send(struct TCP_Server_Info *server, int num_rqst, struct smb_rqst *rqst_array) { struct smbd_connection *info = server->smbd_conn; + struct smbdirect_socket *sc = &info->socket; struct smb_rqst *rqst; struct iov_iter iter; unsigned int remaining_data_length, klen; int rc, i, rqst_idx; - if (info->transport_status != SMBD_CONNECTED) + if (sc->status != SMBDIRECT_SOCKET_CONNECTED) return -EAGAIN; /* @@ -2051,6 +2070,7 @@ static void smbd_mr_recovery_work(struct work_struct *work) { struct smbd_connection *info = container_of(work, struct smbd_connection, mr_recovery_work); + struct smbdirect_socket *sc = &info->socket; struct smbd_mr *smbdirect_mr; int rc; @@ -2068,7 +2088,7 @@ static void smbd_mr_recovery_work(struct work_struct *work) } smbdirect_mr->mr = ib_alloc_mr( - info->pd, info->mr_type, + sc->ib.pd, info->mr_type, info->max_frmr_depth); if (IS_ERR(smbdirect_mr->mr)) { log_rdma_mr(ERR, "ib_alloc_mr failed mr_type=%x max_frmr_depth=%x\n", @@ -2097,12 +2117,13 @@ static void smbd_mr_recovery_work(struct work_struct *work) static void destroy_mr_list(struct smbd_connection *info) { + struct smbdirect_socket *sc = &info->socket; struct smbd_mr *mr, *tmp; cancel_work_sync(&info->mr_recovery_work); list_for_each_entry_safe(mr, tmp, &info->mr_list, list) { if (mr->state == MR_INVALIDATED) - ib_dma_unmap_sg(info->id->device, mr->sgt.sgl, + ib_dma_unmap_sg(sc->ib.dev, mr->sgt.sgl, mr->sgt.nents, mr->dir); ib_dereg_mr(mr->mr); kfree(mr->sgt.sgl); @@ -2119,6 +2140,7 @@ static void destroy_mr_list(struct smbd_connection *info) */ static int allocate_mr_list(struct smbd_connection *info) { + struct smbdirect_socket *sc = &info->socket; int i; struct smbd_mr *smbdirect_mr, *tmp; @@ -2134,7 +2156,7 @@ static int allocate_mr_list(struct smbd_connection *info) smbdirect_mr = kzalloc(sizeof(*smbdirect_mr), GFP_KERNEL); if (!smbdirect_mr) goto cleanup_entries; - smbdirect_mr->mr = ib_alloc_mr(info->pd, info->mr_type, + smbdirect_mr->mr = ib_alloc_mr(sc->ib.pd, info->mr_type, info->max_frmr_depth); if (IS_ERR(smbdirect_mr->mr)) { log_rdma_mr(ERR, "ib_alloc_mr failed mr_type=%x max_frmr_depth=%x\n", @@ -2179,20 +2201,20 @@ cleanup_entries: */ static struct smbd_mr *get_mr(struct smbd_connection *info) { + struct smbdirect_socket *sc = &info->socket; struct smbd_mr *ret; int rc; again: rc = wait_event_interruptible(info->wait_mr, atomic_read(&info->mr_ready_count) || - info->transport_status != SMBD_CONNECTED); + sc->status != SMBDIRECT_SOCKET_CONNECTED); if (rc) { log_rdma_mr(ERR, "wait_event_interruptible rc=%x\n", rc); return NULL; } - if (info->transport_status != SMBD_CONNECTED) { - log_rdma_mr(ERR, "info->transport_status=%x\n", - info->transport_status); + if (sc->status != SMBDIRECT_SOCKET_CONNECTED) { + log_rdma_mr(ERR, "sc->status=%x\n", sc->status); return NULL; } @@ -2245,6 +2267,7 @@ struct smbd_mr *smbd_register_mr(struct smbd_connection *info, struct iov_iter *iter, bool writing, bool need_invalidate) { + struct smbdirect_socket *sc = &info->socket; struct smbd_mr *smbdirect_mr; int rc, num_pages; enum dma_data_direction dir; @@ -2274,7 +2297,7 @@ struct smbd_mr *smbd_register_mr(struct smbd_connection *info, num_pages, iov_iter_count(iter), info->max_frmr_depth); smbd_iter_to_mr(info, iter, &smbdirect_mr->sgt, info->max_frmr_depth); - rc = ib_dma_map_sg(info->id->device, smbdirect_mr->sgt.sgl, + rc = ib_dma_map_sg(sc->ib.dev, smbdirect_mr->sgt.sgl, smbdirect_mr->sgt.nents, dir); if (!rc) { log_rdma_mr(ERR, "ib_dma_map_sg num_pages=%x dir=%x rc=%x\n", @@ -2310,7 +2333,7 @@ struct smbd_mr *smbd_register_mr(struct smbd_connection *info, * on IB_WR_REG_MR. Hardware enforces a barrier and order of execution * on the next ib_post_send when we actually send I/O to remote peer */ - rc = ib_post_send(info->id->qp, ®_wr->wr, NULL); + rc = ib_post_send(sc->ib.qp, ®_wr->wr, NULL); if (!rc) return smbdirect_mr; @@ -2319,7 +2342,7 @@ struct smbd_mr *smbd_register_mr(struct smbd_connection *info, /* If all failed, attempt to recover this MR by setting it MR_ERROR*/ map_mr_error: - ib_dma_unmap_sg(info->id->device, smbdirect_mr->sgt.sgl, + ib_dma_unmap_sg(sc->ib.dev, smbdirect_mr->sgt.sgl, smbdirect_mr->sgt.nents, smbdirect_mr->dir); dma_map_error: @@ -2357,6 +2380,7 @@ int smbd_deregister_mr(struct smbd_mr *smbdirect_mr) { struct ib_send_wr *wr; struct smbd_connection *info = smbdirect_mr->conn; + struct smbdirect_socket *sc = &info->socket; int rc = 0; if (smbdirect_mr->need_invalidate) { @@ -2370,7 +2394,7 @@ int smbd_deregister_mr(struct smbd_mr *smbdirect_mr) wr->send_flags = IB_SEND_SIGNALED; init_completion(&smbdirect_mr->invalidate_done); - rc = ib_post_send(info->id->qp, wr, NULL); + rc = ib_post_send(sc->ib.qp, wr, NULL); if (rc) { log_rdma_mr(ERR, "ib_post_send failed rc=%x\n", rc); smbd_disconnect_rdma_connection(info); @@ -2387,7 +2411,7 @@ int smbd_deregister_mr(struct smbd_mr *smbdirect_mr) if (smbdirect_mr->state == MR_INVALIDATED) { ib_dma_unmap_sg( - info->id->device, smbdirect_mr->sgt.sgl, + sc->ib.dev, smbdirect_mr->sgt.sgl, smbdirect_mr->sgt.nents, smbdirect_mr->dir); smbdirect_mr->state = MR_READY; diff --git a/fs/smb/client/smbdirect.h b/fs/smb/client/smbdirect.h index 4da0974ce7305..ffc38a48b6140 100644 --- a/fs/smb/client/smbdirect.h +++ b/fs/smb/client/smbdirect.h @@ -15,6 +15,8 @@ #include #include +#include "../common/smbdirect/smbdirect_socket.h" + extern int rdma_readwrite_threshold; extern int smbd_max_frmr_depth; extern int smbd_keep_alive_interval; @@ -50,14 +52,8 @@ enum smbd_connection_status { * 5. mempools for allocating packets */ struct smbd_connection { - enum smbd_connection_status transport_status; - - /* RDMA related */ - struct rdma_cm_id *id; - struct ib_qp_init_attr qp_attr; - struct ib_pd *pd; - struct ib_cq *send_cq, *recv_cq; - struct ib_device_attr dev_attr; + struct smbdirect_socket socket; + int ri_rc; struct completion ri_done; wait_queue_head_t conn_wait; -- GitLab From 69cafc413c2d8e304e1b4fe7b8320916f78feac6 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 28 May 2025 18:01:39 +0200 Subject: [PATCH 1762/2211] smb: smbdirect: introduce smbdirect_socket_parameters [ Upstream commit dce8047f4725d4469c0813ff50c4115fc2d0b628 ] This is the next step in the direction of a common smbdirect layer. Cc: Steve French Cc: Tom Talpey Cc: Long Li Cc: Namjae Jeon Cc: Hyunchul Lee Cc: Meetakshi Setiya Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher Signed-off-by: Steve French Stable-dep-of: 43e7e284fc77 ("cifs: Fix the smbd_response slab to allow usercopy") Signed-off-by: Sasha Levin --- fs/smb/client/smbdirect.h | 1 + fs/smb/common/smbdirect/smbdirect.h | 20 ++++++++++++++++++++ fs/smb/common/smbdirect/smbdirect_socket.h | 2 ++ 3 files changed, 23 insertions(+) diff --git a/fs/smb/client/smbdirect.h b/fs/smb/client/smbdirect.h index ffc38a48b6140..4b559a4147af1 100644 --- a/fs/smb/client/smbdirect.h +++ b/fs/smb/client/smbdirect.h @@ -15,6 +15,7 @@ #include #include +#include "../common/smbdirect/smbdirect.h" #include "../common/smbdirect/smbdirect_socket.h" extern int rdma_readwrite_threshold; diff --git a/fs/smb/common/smbdirect/smbdirect.h b/fs/smb/common/smbdirect/smbdirect.h index eedbdf0d04337..b9a385344ff31 100644 --- a/fs/smb/common/smbdirect/smbdirect.h +++ b/fs/smb/common/smbdirect/smbdirect.h @@ -14,4 +14,24 @@ struct smbdirect_buffer_descriptor_v1 { __le32 length; } __packed; +/* + * Connection parameters mostly from [MS-SMBD] 3.1.1.1 + * + * These are setup and negotiated at the beginning of a + * connection and remain constant unless explicitly changed. + * + * Some values are important for the upper layer. + */ +struct smbdirect_socket_parameters { + __u16 recv_credit_max; + __u16 send_credit_target; + __u32 max_send_size; + __u32 max_fragmented_send_size; + __u32 max_recv_size; + __u32 max_fragmented_recv_size; + __u32 max_read_write_size; + __u32 keepalive_interval_msec; + __u32 keepalive_timeout_msec; +} __packed; + #endif /* __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_H__ */ diff --git a/fs/smb/common/smbdirect/smbdirect_socket.h b/fs/smb/common/smbdirect/smbdirect_socket.h index 69a55561f91ae..e5b15cc44a7ba 100644 --- a/fs/smb/common/smbdirect/smbdirect_socket.h +++ b/fs/smb/common/smbdirect/smbdirect_socket.h @@ -36,6 +36,8 @@ struct smbdirect_socket { struct ib_qp *qp; struct ib_device *dev; } ib; + + struct smbdirect_socket_parameters parameters; }; #endif /* __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_SOCKET_H__ */ -- GitLab From b8ddcca4391ee49ee410c7452268c993a87cf190 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 28 May 2025 18:01:40 +0200 Subject: [PATCH 1763/2211] smb: client: make use of common smbdirect_socket_parameters [ Upstream commit cc55f65dd352bdb7bdf8db1c36fb348c294c3b66 ] Cc: Steve French Cc: Tom Talpey Cc: Long Li Cc: Namjae Jeon Cc: Hyunchul Lee Cc: Meetakshi Setiya Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher Signed-off-by: Steve French Stable-dep-of: 43e7e284fc77 ("cifs: Fix the smbd_response slab to allow usercopy") Signed-off-by: Sasha Levin --- fs/smb/client/cifs_debug.c | 21 +++++---- fs/smb/client/smb2ops.c | 14 ++++-- fs/smb/client/smbdirect.c | 91 ++++++++++++++++++++++---------------- fs/smb/client/smbdirect.h | 10 +---- 4 files changed, 77 insertions(+), 59 deletions(-) diff --git a/fs/smb/client/cifs_debug.c b/fs/smb/client/cifs_debug.c index 56b0b5c82dd19..c0196be0e65fc 100644 --- a/fs/smb/client/cifs_debug.c +++ b/fs/smb/client/cifs_debug.c @@ -362,6 +362,10 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) c = 0; spin_lock(&cifs_tcp_ses_lock); list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) { +#ifdef CONFIG_CIFS_SMB_DIRECT + struct smbdirect_socket_parameters *sp; +#endif + /* channel info will be printed as a part of sessions below */ if (SERVER_IS_CHAN(server)) continue; @@ -383,6 +387,7 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) seq_printf(m, "\nSMBDirect transport not available"); goto skip_rdma; } + sp = &server->smbd_conn->socket.parameters; seq_printf(m, "\nSMBDirect (in hex) protocol version: %x " "transport status: %x", @@ -390,18 +395,18 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) server->smbd_conn->socket.status); seq_printf(m, "\nConn receive_credit_max: %x " "send_credit_target: %x max_send_size: %x", - server->smbd_conn->receive_credit_max, - server->smbd_conn->send_credit_target, - server->smbd_conn->max_send_size); + sp->recv_credit_max, + sp->send_credit_target, + sp->max_send_size); seq_printf(m, "\nConn max_fragmented_recv_size: %x " "max_fragmented_send_size: %x max_receive_size:%x", - server->smbd_conn->max_fragmented_recv_size, - server->smbd_conn->max_fragmented_send_size, - server->smbd_conn->max_receive_size); + sp->max_fragmented_recv_size, + sp->max_fragmented_send_size, + sp->max_recv_size); seq_printf(m, "\nConn keep_alive_interval: %x " "max_readwrite_size: %x rdma_readwrite_threshold: %x", - server->smbd_conn->keep_alive_interval, - server->smbd_conn->max_readwrite_size, + sp->keepalive_interval_msec * 1000, + sp->max_read_write_size, server->smbd_conn->rdma_readwrite_threshold); seq_printf(m, "\nDebug count_get_receive_buffer: %x " "count_put_receive_buffer: %x count_send_empty: %x", diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 74bcc51ccd32f..e596bc4837b68 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -504,6 +504,9 @@ smb3_negotiate_wsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) wsize = min_t(unsigned int, wsize, server->max_write); #ifdef CONFIG_CIFS_SMB_DIRECT if (server->rdma) { + struct smbdirect_socket_parameters *sp = + &server->smbd_conn->socket.parameters; + if (server->sign) /* * Account for SMB2 data transfer packet header and @@ -511,12 +514,12 @@ smb3_negotiate_wsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) */ wsize = min_t(unsigned int, wsize, - server->smbd_conn->max_fragmented_send_size - + sp->max_fragmented_send_size - SMB2_READWRITE_PDU_HEADER_SIZE - sizeof(struct smb2_transform_hdr)); else wsize = min_t(unsigned int, - wsize, server->smbd_conn->max_readwrite_size); + wsize, sp->max_read_write_size); } #endif if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) @@ -552,6 +555,9 @@ smb3_negotiate_rsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) rsize = min_t(unsigned int, rsize, server->max_read); #ifdef CONFIG_CIFS_SMB_DIRECT if (server->rdma) { + struct smbdirect_socket_parameters *sp = + &server->smbd_conn->socket.parameters; + if (server->sign) /* * Account for SMB2 data transfer packet header and @@ -559,12 +565,12 @@ smb3_negotiate_rsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) */ rsize = min_t(unsigned int, rsize, - server->smbd_conn->max_fragmented_recv_size - + sp->max_fragmented_recv_size - SMB2_READWRITE_PDU_HEADER_SIZE - sizeof(struct smb2_transform_hdr)); else rsize = min_t(unsigned int, - rsize, server->smbd_conn->max_readwrite_size); + rsize, sp->max_read_write_size); } #endif diff --git a/fs/smb/client/smbdirect.c b/fs/smb/client/smbdirect.c index ac489df8151a1..cbc85bca006f7 100644 --- a/fs/smb/client/smbdirect.c +++ b/fs/smb/client/smbdirect.c @@ -320,6 +320,8 @@ static bool process_negotiation_response( struct smbd_response *response, int packet_length) { struct smbd_connection *info = response->info; + struct smbdirect_socket *sc = &info->socket; + struct smbdirect_socket_parameters *sp = &sc->parameters; struct smbdirect_negotiate_resp *packet = smbd_response_payload(response); if (packet_length < sizeof(struct smbdirect_negotiate_resp)) { @@ -349,20 +351,20 @@ static bool process_negotiation_response( atomic_set(&info->receive_credits, 0); - if (le32_to_cpu(packet->preferred_send_size) > info->max_receive_size) { + if (le32_to_cpu(packet->preferred_send_size) > sp->max_recv_size) { log_rdma_event(ERR, "error: preferred_send_size=%d\n", le32_to_cpu(packet->preferred_send_size)); return false; } - info->max_receive_size = le32_to_cpu(packet->preferred_send_size); + sp->max_recv_size = le32_to_cpu(packet->preferred_send_size); if (le32_to_cpu(packet->max_receive_size) < SMBD_MIN_RECEIVE_SIZE) { log_rdma_event(ERR, "error: max_receive_size=%d\n", le32_to_cpu(packet->max_receive_size)); return false; } - info->max_send_size = min_t(int, info->max_send_size, - le32_to_cpu(packet->max_receive_size)); + sp->max_send_size = min_t(u32, sp->max_send_size, + le32_to_cpu(packet->max_receive_size)); if (le32_to_cpu(packet->max_fragmented_size) < SMBD_MIN_FRAGMENTED_SIZE) { @@ -370,18 +372,18 @@ static bool process_negotiation_response( le32_to_cpu(packet->max_fragmented_size)); return false; } - info->max_fragmented_send_size = + sp->max_fragmented_send_size = le32_to_cpu(packet->max_fragmented_size); info->rdma_readwrite_threshold = - rdma_readwrite_threshold > info->max_fragmented_send_size ? - info->max_fragmented_send_size : + rdma_readwrite_threshold > sp->max_fragmented_send_size ? + sp->max_fragmented_send_size : rdma_readwrite_threshold; - info->max_readwrite_size = min_t(u32, + sp->max_read_write_size = min_t(u32, le32_to_cpu(packet->max_readwrite_size), info->max_frmr_depth * PAGE_SIZE); - info->max_frmr_depth = info->max_readwrite_size / PAGE_SIZE; + info->max_frmr_depth = sp->max_read_write_size / PAGE_SIZE; return true; } @@ -689,6 +691,7 @@ out1: static int smbd_post_send_negotiate_req(struct smbd_connection *info) { struct smbdirect_socket *sc = &info->socket; + struct smbdirect_socket_parameters *sp = &sc->parameters; struct ib_send_wr send_wr; int rc = -ENOMEM; struct smbd_request *request; @@ -704,11 +707,11 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info) packet->min_version = cpu_to_le16(SMBDIRECT_V1); packet->max_version = cpu_to_le16(SMBDIRECT_V1); packet->reserved = 0; - packet->credits_requested = cpu_to_le16(info->send_credit_target); - packet->preferred_send_size = cpu_to_le32(info->max_send_size); - packet->max_receive_size = cpu_to_le32(info->max_receive_size); + packet->credits_requested = cpu_to_le16(sp->send_credit_target); + packet->preferred_send_size = cpu_to_le32(sp->max_send_size); + packet->max_receive_size = cpu_to_le32(sp->max_recv_size); packet->max_fragmented_size = - cpu_to_le32(info->max_fragmented_recv_size); + cpu_to_le32(sp->max_fragmented_recv_size); request->num_sge = 1; request->sge[0].addr = ib_dma_map_single( @@ -800,6 +803,7 @@ static int smbd_post_send(struct smbd_connection *info, struct smbd_request *request) { struct smbdirect_socket *sc = &info->socket; + struct smbdirect_socket_parameters *sp = &sc->parameters; struct ib_send_wr send_wr; int rc, i; @@ -831,7 +835,7 @@ static int smbd_post_send(struct smbd_connection *info, } else /* Reset timer for idle connection after packet is sent */ mod_delayed_work(info->workqueue, &info->idle_timer_work, - info->keep_alive_interval*HZ); + msecs_to_jiffies(sp->keepalive_interval_msec)); return rc; } @@ -841,6 +845,7 @@ static int smbd_post_send_iter(struct smbd_connection *info, int *_remaining_data_length) { struct smbdirect_socket *sc = &info->socket; + struct smbdirect_socket_parameters *sp = &sc->parameters; int i, rc; int header_length; int data_length; @@ -868,7 +873,7 @@ wait_credit: wait_send_queue: wait_event(info->wait_post_send, - atomic_read(&info->send_pending) < info->send_credit_target || + atomic_read(&info->send_pending) < sp->send_credit_target || sc->status != SMBDIRECT_SOCKET_CONNECTED); if (sc->status != SMBDIRECT_SOCKET_CONNECTED) { @@ -878,7 +883,7 @@ wait_send_queue: } if (unlikely(atomic_inc_return(&info->send_pending) > - info->send_credit_target)) { + sp->send_credit_target)) { atomic_dec(&info->send_pending); goto wait_send_queue; } @@ -917,7 +922,7 @@ wait_send_queue: /* Fill in the packet header */ packet = smbd_request_payload(request); - packet->credits_requested = cpu_to_le16(info->send_credit_target); + packet->credits_requested = cpu_to_le16(sp->send_credit_target); new_credits = manage_credits_prior_sending(info); atomic_add(new_credits, &info->receive_credits); @@ -1017,16 +1022,17 @@ static int smbd_post_recv( struct smbd_connection *info, struct smbd_response *response) { struct smbdirect_socket *sc = &info->socket; + struct smbdirect_socket_parameters *sp = &sc->parameters; struct ib_recv_wr recv_wr; int rc = -EIO; response->sge.addr = ib_dma_map_single( sc->ib.dev, response->packet, - info->max_receive_size, DMA_FROM_DEVICE); + sp->max_recv_size, DMA_FROM_DEVICE); if (ib_dma_mapping_error(sc->ib.dev, response->sge.addr)) return rc; - response->sge.length = info->max_receive_size; + response->sge.length = sp->max_recv_size; response->sge.lkey = sc->ib.pd->local_dma_lkey; response->cqe.done = recv_done; @@ -1274,6 +1280,8 @@ static void idle_connection_timer(struct work_struct *work) struct smbd_connection *info = container_of( work, struct smbd_connection, idle_timer_work.work); + struct smbdirect_socket *sc = &info->socket; + struct smbdirect_socket_parameters *sp = &sc->parameters; if (info->keep_alive_requested != KEEP_ALIVE_NONE) { log_keep_alive(ERR, @@ -1288,7 +1296,7 @@ static void idle_connection_timer(struct work_struct *work) /* Setup the next idle timeout work */ queue_delayed_work(info->workqueue, &info->idle_timer_work, - info->keep_alive_interval*HZ); + msecs_to_jiffies(sp->keepalive_interval_msec)); } /* @@ -1300,6 +1308,7 @@ void smbd_destroy(struct TCP_Server_Info *server) { struct smbd_connection *info = server->smbd_conn; struct smbdirect_socket *sc; + struct smbdirect_socket_parameters *sp; struct smbd_response *response; unsigned long flags; @@ -1308,6 +1317,7 @@ void smbd_destroy(struct TCP_Server_Info *server) return; } sc = &info->socket; + sp = &sc->parameters; log_rdma_event(INFO, "destroying rdma session\n"); if (sc->status != SMBDIRECT_SOCKET_DISCONNECTED) { @@ -1349,7 +1359,7 @@ void smbd_destroy(struct TCP_Server_Info *server) log_rdma_event(INFO, "free receive buffers\n"); wait_event(info->wait_receive_queues, info->count_receive_queue + info->count_empty_packet_queue - == info->receive_credit_max); + == sp->recv_credit_max); destroy_receive_buffers(info); /* @@ -1437,6 +1447,8 @@ static void destroy_caches_and_workqueue(struct smbd_connection *info) #define MAX_NAME_LEN 80 static int allocate_caches_and_workqueue(struct smbd_connection *info) { + struct smbdirect_socket *sc = &info->socket; + struct smbdirect_socket_parameters *sp = &sc->parameters; char name[MAX_NAME_LEN]; int rc; @@ -1451,7 +1463,7 @@ static int allocate_caches_and_workqueue(struct smbd_connection *info) return -ENOMEM; info->request_mempool = - mempool_create(info->send_credit_target, mempool_alloc_slab, + mempool_create(sp->send_credit_target, mempool_alloc_slab, mempool_free_slab, info->request_cache); if (!info->request_mempool) goto out1; @@ -1461,13 +1473,13 @@ static int allocate_caches_and_workqueue(struct smbd_connection *info) kmem_cache_create( name, sizeof(struct smbd_response) + - info->max_receive_size, + sp->max_recv_size, 0, SLAB_HWCACHE_ALIGN, NULL); if (!info->response_cache) goto out2; info->response_mempool = - mempool_create(info->receive_credit_max, mempool_alloc_slab, + mempool_create(sp->recv_credit_max, mempool_alloc_slab, mempool_free_slab, info->response_cache); if (!info->response_mempool) goto out3; @@ -1477,7 +1489,7 @@ static int allocate_caches_and_workqueue(struct smbd_connection *info) if (!info->workqueue) goto out4; - rc = allocate_receive_buffers(info, info->receive_credit_max); + rc = allocate_receive_buffers(info, sp->recv_credit_max); if (rc) { log_rdma_event(ERR, "failed to allocate receive buffers\n"); goto out5; @@ -1505,6 +1517,7 @@ static struct smbd_connection *_smbd_get_connection( int rc; struct smbd_connection *info; struct smbdirect_socket *sc; + struct smbdirect_socket_parameters *sp; struct rdma_conn_param conn_param; struct ib_qp_init_attr qp_attr; struct sockaddr_in *addr_in = (struct sockaddr_in *) dstaddr; @@ -1515,6 +1528,7 @@ static struct smbd_connection *_smbd_get_connection( if (!info) return NULL; sc = &info->socket; + sp = &sc->parameters; sc->status = SMBDIRECT_SOCKET_CONNECTING; rc = smbd_ia_open(info, dstaddr, port); @@ -1541,12 +1555,12 @@ static struct smbd_connection *_smbd_get_connection( goto config_failed; } - info->receive_credit_max = smbd_receive_credit_max; - info->send_credit_target = smbd_send_credit_target; - info->max_send_size = smbd_max_send_size; - info->max_fragmented_recv_size = smbd_max_fragmented_recv_size; - info->max_receive_size = smbd_max_receive_size; - info->keep_alive_interval = smbd_keep_alive_interval; + sp->recv_credit_max = smbd_receive_credit_max; + sp->send_credit_target = smbd_send_credit_target; + sp->max_send_size = smbd_max_send_size; + sp->max_fragmented_recv_size = smbd_max_fragmented_recv_size; + sp->max_recv_size = smbd_max_receive_size; + sp->keepalive_interval_msec = smbd_keep_alive_interval * 1000; if (sc->ib.dev->attrs.max_send_sge < SMBDIRECT_MAX_SEND_SGE || sc->ib.dev->attrs.max_recv_sge < SMBDIRECT_MAX_RECV_SGE) { @@ -1561,7 +1575,7 @@ static struct smbd_connection *_smbd_get_connection( sc->ib.send_cq = ib_alloc_cq_any(sc->ib.dev, info, - info->send_credit_target, IB_POLL_SOFTIRQ); + sp->send_credit_target, IB_POLL_SOFTIRQ); if (IS_ERR(sc->ib.send_cq)) { sc->ib.send_cq = NULL; goto alloc_cq_failed; @@ -1569,7 +1583,7 @@ static struct smbd_connection *_smbd_get_connection( sc->ib.recv_cq = ib_alloc_cq_any(sc->ib.dev, info, - info->receive_credit_max, IB_POLL_SOFTIRQ); + sp->recv_credit_max, IB_POLL_SOFTIRQ); if (IS_ERR(sc->ib.recv_cq)) { sc->ib.recv_cq = NULL; goto alloc_cq_failed; @@ -1578,8 +1592,8 @@ static struct smbd_connection *_smbd_get_connection( memset(&qp_attr, 0, sizeof(qp_attr)); qp_attr.event_handler = smbd_qp_async_error_upcall; qp_attr.qp_context = info; - qp_attr.cap.max_send_wr = info->send_credit_target; - qp_attr.cap.max_recv_wr = info->receive_credit_max; + qp_attr.cap.max_send_wr = sp->send_credit_target; + qp_attr.cap.max_recv_wr = sp->recv_credit_max; qp_attr.cap.max_send_sge = SMBDIRECT_MAX_SEND_SGE; qp_attr.cap.max_recv_sge = SMBDIRECT_MAX_RECV_SGE; qp_attr.cap.max_inline_data = 0; @@ -1654,7 +1668,7 @@ static struct smbd_connection *_smbd_get_connection( init_waitqueue_head(&info->wait_send_queue); INIT_DELAYED_WORK(&info->idle_timer_work, idle_connection_timer); queue_delayed_work(info->workqueue, &info->idle_timer_work, - info->keep_alive_interval*HZ); + msecs_to_jiffies(sp->keepalive_interval_msec)); init_waitqueue_head(&info->wait_send_pending); atomic_set(&info->send_pending, 0); @@ -1971,6 +1985,7 @@ int smbd_send(struct TCP_Server_Info *server, { struct smbd_connection *info = server->smbd_conn; struct smbdirect_socket *sc = &info->socket; + struct smbdirect_socket_parameters *sp = &sc->parameters; struct smb_rqst *rqst; struct iov_iter iter; unsigned int remaining_data_length, klen; @@ -1988,10 +2003,10 @@ int smbd_send(struct TCP_Server_Info *server, for (i = 0; i < num_rqst; i++) remaining_data_length += smb_rqst_len(server, &rqst_array[i]); - if (unlikely(remaining_data_length > info->max_fragmented_send_size)) { + if (unlikely(remaining_data_length > sp->max_fragmented_send_size)) { /* assertion: payload never exceeds negotiated maximum */ log_write(ERR, "payload size %d > max size %d\n", - remaining_data_length, info->max_fragmented_send_size); + remaining_data_length, sp->max_fragmented_send_size); return -EINVAL; } diff --git a/fs/smb/client/smbdirect.h b/fs/smb/client/smbdirect.h index 4b559a4147af1..3d552ab27e0f3 100644 --- a/fs/smb/client/smbdirect.h +++ b/fs/smb/client/smbdirect.h @@ -69,15 +69,7 @@ struct smbd_connection { spinlock_t lock_new_credits_offered; int new_credits_offered; - /* Connection parameters defined in [MS-SMBD] 3.1.1.1 */ - int receive_credit_max; - int send_credit_target; - int max_send_size; - int max_fragmented_recv_size; - int max_fragmented_send_size; - int max_receive_size; - int keep_alive_interval; - int max_readwrite_size; + /* dynamic connection parameters defined in [MS-SMBD] 3.1.1.1 */ enum keep_alive_status keep_alive_requested; int protocol; atomic_t send_credits; -- GitLab From 87dcc7e33fc3dcb8ed32333cec016528b5bb6ce4 Mon Sep 17 00:00:00 2001 From: David Howells Date: Wed, 25 Jun 2025 14:15:04 +0100 Subject: [PATCH 1764/2211] cifs: Fix the smbd_response slab to allow usercopy [ Upstream commit 43e7e284fc77b710d899569360ea46fa3374ae22 ] The handling of received data in the smbdirect client code involves using copy_to_iter() to copy data from the smbd_reponse struct's packet trailer to a folioq buffer provided by netfslib that encapsulates a chunk of pagecache. If, however, CONFIG_HARDENED_USERCOPY=y, this will result in the checks then performed in copy_to_iter() oopsing with something like the following: CIFS: Attempting to mount //172.31.9.1/test CIFS: VFS: RDMA transport established usercopy: Kernel memory exposure attempt detected from SLUB object 'smbd_response_0000000091e24ea1' (offset 81, size 63)! ------------[ cut here ]------------ kernel BUG at mm/usercopy.c:102! ... RIP: 0010:usercopy_abort+0x6c/0x80 ... Call Trace: __check_heap_object+0xe3/0x120 __check_object_size+0x4dc/0x6d0 smbd_recv+0x77f/0xfe0 [cifs] cifs_readv_from_socket+0x276/0x8f0 [cifs] cifs_read_from_socket+0xcd/0x120 [cifs] cifs_demultiplex_thread+0x7e9/0x2d50 [cifs] kthread+0x396/0x830 ret_from_fork+0x2b8/0x3b0 ret_from_fork_asm+0x1a/0x30 The problem is that the smbd_response slab's packet field isn't marked as being permitted for usercopy. Fix this by passing parameters to kmem_slab_create() to indicate that copy_to_iter() is permitted from the packet region of the smbd_response slab objects, less the header space. Fixes: ee4cdf7ba857 ("netfs: Speed up buffered reading") Reported-by: Stefan Metzmacher Link: https://lore.kernel.org/r/acb7f612-df26-4e2a-a35d-7cd040f513e1@samba.org/ Signed-off-by: David Howells Reviewed-by: Stefan Metzmacher Tested-by: Stefan Metzmacher cc: Paulo Alcantara cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/smbdirect.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/fs/smb/client/smbdirect.c b/fs/smb/client/smbdirect.c index cbc85bca006f7..b7932f63b4650 100644 --- a/fs/smb/client/smbdirect.c +++ b/fs/smb/client/smbdirect.c @@ -1452,6 +1452,9 @@ static int allocate_caches_and_workqueue(struct smbd_connection *info) char name[MAX_NAME_LEN]; int rc; + if (WARN_ON_ONCE(sp->max_recv_size < sizeof(struct smbdirect_data_transfer))) + return -ENOMEM; + scnprintf(name, MAX_NAME_LEN, "smbd_request_%p", info); info->request_cache = kmem_cache_create( @@ -1469,12 +1472,17 @@ static int allocate_caches_and_workqueue(struct smbd_connection *info) goto out1; scnprintf(name, MAX_NAME_LEN, "smbd_response_%p", info); + + struct kmem_cache_args response_args = { + .align = __alignof__(struct smbd_response), + .useroffset = (offsetof(struct smbd_response, packet) + + sizeof(struct smbdirect_data_transfer)), + .usersize = sp->max_recv_size - sizeof(struct smbdirect_data_transfer), + }; info->response_cache = - kmem_cache_create( - name, - sizeof(struct smbd_response) + - sp->max_recv_size, - 0, SLAB_HWCACHE_ALIGN, NULL); + kmem_cache_create(name, + sizeof(struct smbd_response) + sp->max_recv_size, + &response_args, SLAB_HWCACHE_ALIGN); if (!info->response_cache) goto out2; -- GitLab From bced02aca3437d6666abcac5dd417cab3f61444d Mon Sep 17 00:00:00 2001 From: David Howells Date: Wed, 2 Apr 2025 20:27:26 +0100 Subject: [PATCH 1765/2211] cifs: Fix reading into an ITER_FOLIOQ from the smbdirect code [ Upstream commit 263debecb4aa7cec0a86487e6f409814f6194a21 ] When performing a file read from RDMA, smbd_recv() prints an "Invalid msg type 4" error and fails the I/O. This is due to the switch-statement there not handling the ITER_FOLIOQ handed down from netfslib. Fix this by collapsing smbd_recv_buf() and smbd_recv_page() into smbd_recv() and just using copy_to_iter() instead of memcpy(). This future-proofs the function too, in case more ITER_* types are added. Fixes: ee4cdf7ba857 ("netfs: Speed up buffered reading") Reported-by: Stefan Metzmacher Signed-off-by: David Howells cc: Tom Talpey cc: Paulo Alcantara (Red Hat) cc: Matthew Wilcox cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/smbdirect.c | 112 ++++++-------------------------------- 1 file changed, 17 insertions(+), 95 deletions(-) diff --git a/fs/smb/client/smbdirect.c b/fs/smb/client/smbdirect.c index b7932f63b4650..ac06f2617f346 100644 --- a/fs/smb/client/smbdirect.c +++ b/fs/smb/client/smbdirect.c @@ -1755,35 +1755,39 @@ try_again: } /* - * Receive data from receive reassembly queue + * Receive data from the transport's receive reassembly queue * All the incoming data packets are placed in reassembly queue - * buf: the buffer to read data into + * iter: the buffer to read data into * size: the length of data to read * return value: actual data read - * Note: this implementation copies the data from reassebmly queue to receive + * + * Note: this implementation copies the data from reassembly queue to receive * buffers used by upper layer. This is not the optimal code path. A better way * to do it is to not have upper layer allocate its receive buffers but rather * borrow the buffer from reassembly queue, and return it after data is * consumed. But this will require more changes to upper layer code, and also * need to consider packet boundaries while they still being reassembled. */ -static int smbd_recv_buf(struct smbd_connection *info, char *buf, - unsigned int size) +int smbd_recv(struct smbd_connection *info, struct msghdr *msg) { struct smbdirect_socket *sc = &info->socket; struct smbd_response *response; struct smbdirect_data_transfer *data_transfer; + size_t size = iov_iter_count(&msg->msg_iter); int to_copy, to_read, data_read, offset; u32 data_length, remaining_data_length, data_offset; int rc; + if (WARN_ON_ONCE(iov_iter_rw(&msg->msg_iter) == WRITE)) + return -EINVAL; /* It's a bug in upper layer to get there */ + again: /* * No need to hold the reassembly queue lock all the time as we are * the only one reading from the front of the queue. The transport * may add more entries to the back of the queue at the same time */ - log_read(INFO, "size=%d info->reassembly_data_length=%d\n", size, + log_read(INFO, "size=%zd info->reassembly_data_length=%d\n", size, info->reassembly_data_length); if (info->reassembly_data_length >= size) { int queue_length; @@ -1821,7 +1825,10 @@ again: if (response->first_segment && size == 4) { unsigned int rfc1002_len = data_length + remaining_data_length; - *((__be32 *)buf) = cpu_to_be32(rfc1002_len); + __be32 rfc1002_hdr = cpu_to_be32(rfc1002_len); + if (copy_to_iter(&rfc1002_hdr, sizeof(rfc1002_hdr), + &msg->msg_iter) != sizeof(rfc1002_hdr)) + return -EFAULT; data_read = 4; response->first_segment = false; log_read(INFO, "returning rfc1002 length %d\n", @@ -1830,10 +1837,9 @@ again: } to_copy = min_t(int, data_length - offset, to_read); - memcpy( - buf + data_read, - (char *)data_transfer + data_offset + offset, - to_copy); + if (copy_to_iter((char *)data_transfer + data_offset + offset, + to_copy, &msg->msg_iter) != to_copy) + return -EFAULT; /* move on to the next buffer? */ if (to_copy == data_length - offset) { @@ -1898,90 +1904,6 @@ read_rfc1002_done: goto again; } -/* - * Receive a page from receive reassembly queue - * page: the page to read data into - * to_read: the length of data to read - * return value: actual data read - */ -static int smbd_recv_page(struct smbd_connection *info, - struct page *page, unsigned int page_offset, - unsigned int to_read) -{ - struct smbdirect_socket *sc = &info->socket; - int ret; - char *to_address; - void *page_address; - - /* make sure we have the page ready for read */ - ret = wait_event_interruptible( - info->wait_reassembly_queue, - info->reassembly_data_length >= to_read || - sc->status != SMBDIRECT_SOCKET_CONNECTED); - if (ret) - return ret; - - /* now we can read from reassembly queue and not sleep */ - page_address = kmap_atomic(page); - to_address = (char *) page_address + page_offset; - - log_read(INFO, "reading from page=%p address=%p to_read=%d\n", - page, to_address, to_read); - - ret = smbd_recv_buf(info, to_address, to_read); - kunmap_atomic(page_address); - - return ret; -} - -/* - * Receive data from transport - * msg: a msghdr point to the buffer, can be ITER_KVEC or ITER_BVEC - * return: total bytes read, or 0. SMB Direct will not do partial read. - */ -int smbd_recv(struct smbd_connection *info, struct msghdr *msg) -{ - char *buf; - struct page *page; - unsigned int to_read, page_offset; - int rc; - - if (iov_iter_rw(&msg->msg_iter) == WRITE) { - /* It's a bug in upper layer to get there */ - cifs_dbg(VFS, "Invalid msg iter dir %u\n", - iov_iter_rw(&msg->msg_iter)); - rc = -EINVAL; - goto out; - } - - switch (iov_iter_type(&msg->msg_iter)) { - case ITER_KVEC: - buf = msg->msg_iter.kvec->iov_base; - to_read = msg->msg_iter.kvec->iov_len; - rc = smbd_recv_buf(info, buf, to_read); - break; - - case ITER_BVEC: - page = msg->msg_iter.bvec->bv_page; - page_offset = msg->msg_iter.bvec->bv_offset; - to_read = msg->msg_iter.bvec->bv_len; - rc = smbd_recv_page(info, page, page_offset, to_read); - break; - - default: - /* It's a bug in upper layer to get there */ - cifs_dbg(VFS, "Invalid msg type %d\n", - iov_iter_type(&msg->msg_iter)); - rc = -EINVAL; - } - -out: - /* SMBDirect will read it all or nothing */ - if (rc > 0) - msg->msg_iter.count = 0; - return rc; -} - /* * Send data to transport * Each rqst is transported as a SMBDirect payload -- GitLab From 8ed96d8e0559b55b150a04a4ee1daa3102d80543 Mon Sep 17 00:00:00 2001 From: Avadhut Naik Date: Thu, 29 May 2025 20:50:04 +0000 Subject: [PATCH 1766/2211] EDAC/amd64: Fix size calculation for Non-Power-of-Two DIMMs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit a3f3040657417aeadb9622c629d4a0c2693a0f93 upstream. Each Chip-Select (CS) of a Unified Memory Controller (UMC) on AMD Zen-based SOCs has an Address Mask and a Secondary Address Mask register associated with it. The amd64_edac module logs DIMM sizes on a per-UMC per-CS granularity during init using these two registers. Currently, the module primarily considers only the Address Mask register for computing DIMM sizes. The Secondary Address Mask register is only considered for odd CS. Additionally, if it has been considered, the Address Mask register is ignored altogether for that CS. For power-of-two DIMMs i.e. DIMMs whose total capacity is a power of two (32GB, 64GB, etc), this is not an issue since only the Address Mask register is used. For non-power-of-two DIMMs i.e., DIMMs whose total capacity is not a power of two (48GB, 96GB, etc), however, the Secondary Address Mask register is used in conjunction with the Address Mask register. However, since the module only considers either of the two registers for a CS, the size computed by the module is incorrect. The Secondary Address Mask register is not considered for even CS, and the Address Mask register is not considered for odd CS. Introduce a new helper function so that both Address Mask and Secondary Address Mask registers are considered, when valid, for computing DIMM sizes. Furthermore, also rename some variables for greater clarity. Fixes: 81f5090db843 ("EDAC/amd64: Support asymmetric dual-rank DIMMs") Closes: https://lore.kernel.org/dbec22b6-00f2-498b-b70d-ab6f8a5ec87e@natrix.lt Reported-by: Žilvinas Žaltiena Signed-off-by: Avadhut Naik Signed-off-by: Borislav Petkov (AMD) Reviewed-by: Yazen Ghannam Tested-by: Žilvinas Žaltiena Cc: stable@vger.kernel.org Link: https://lore.kernel.org/20250529205013.403450-1-avadhut.naik@amd.com Signed-off-by: Greg Kroah-Hartman --- drivers/edac/amd64_edac.c | 57 ++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index c0a8f9c8d4f0b..322ba16b31bf2 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c @@ -1208,7 +1208,9 @@ static int umc_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt) if (csrow_enabled(2 * dimm + 1, ctrl, pvt)) cs_mode |= CS_ODD_PRIMARY; - /* Asymmetric dual-rank DIMM support. */ + if (csrow_sec_enabled(2 * dimm, ctrl, pvt)) + cs_mode |= CS_EVEN_SECONDARY; + if (csrow_sec_enabled(2 * dimm + 1, ctrl, pvt)) cs_mode |= CS_ODD_SECONDARY; @@ -1229,12 +1231,13 @@ static int umc_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt) return cs_mode; } -static int __addr_mask_to_cs_size(u32 addr_mask_orig, unsigned int cs_mode, - int csrow_nr, int dimm) +static int calculate_cs_size(u32 mask, unsigned int cs_mode) { - u32 msb, weight, num_zero_bits; - u32 addr_mask_deinterleaved; - int size = 0; + int msb, weight, num_zero_bits; + u32 deinterleaved_mask; + + if (!mask) + return 0; /* * The number of zero bits in the mask is equal to the number of bits @@ -1247,19 +1250,30 @@ static int __addr_mask_to_cs_size(u32 addr_mask_orig, unsigned int cs_mode, * without swapping with the most significant bit. This can be handled * by keeping the MSB where it is and ignoring the single zero bit. */ - msb = fls(addr_mask_orig) - 1; - weight = hweight_long(addr_mask_orig); + msb = fls(mask) - 1; + weight = hweight_long(mask); num_zero_bits = msb - weight - !!(cs_mode & CS_3R_INTERLEAVE); /* Take the number of zero bits off from the top of the mask. */ - addr_mask_deinterleaved = GENMASK_ULL(msb - num_zero_bits, 1); + deinterleaved_mask = GENMASK(msb - num_zero_bits, 1); + edac_dbg(1, " Deinterleaved AddrMask: 0x%x\n", deinterleaved_mask); + + return (deinterleaved_mask >> 2) + 1; +} + +static int __addr_mask_to_cs_size(u32 addr_mask, u32 addr_mask_sec, + unsigned int cs_mode, int csrow_nr, int dimm) +{ + int size; edac_dbg(1, "CS%d DIMM%d AddrMasks:\n", csrow_nr, dimm); - edac_dbg(1, " Original AddrMask: 0x%x\n", addr_mask_orig); - edac_dbg(1, " Deinterleaved AddrMask: 0x%x\n", addr_mask_deinterleaved); + edac_dbg(1, " Primary AddrMask: 0x%x\n", addr_mask); /* Register [31:1] = Address [39:9]. Size is in kBs here. */ - size = (addr_mask_deinterleaved >> 2) + 1; + size = calculate_cs_size(addr_mask, cs_mode); + + edac_dbg(1, " Secondary AddrMask: 0x%x\n", addr_mask_sec); + size += calculate_cs_size(addr_mask_sec, cs_mode); /* Return size in MBs. */ return size >> 10; @@ -1268,8 +1282,8 @@ static int __addr_mask_to_cs_size(u32 addr_mask_orig, unsigned int cs_mode, static int umc_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc, unsigned int cs_mode, int csrow_nr) { + u32 addr_mask = 0, addr_mask_sec = 0; int cs_mask_nr = csrow_nr; - u32 addr_mask_orig; int dimm, size = 0; /* No Chip Selects are enabled. */ @@ -1307,13 +1321,13 @@ static int umc_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc, if (!pvt->flags.zn_regs_v2) cs_mask_nr >>= 1; - /* Asymmetric dual-rank DIMM support. */ - if ((csrow_nr & 1) && (cs_mode & CS_ODD_SECONDARY)) - addr_mask_orig = pvt->csels[umc].csmasks_sec[cs_mask_nr]; - else - addr_mask_orig = pvt->csels[umc].csmasks[cs_mask_nr]; + if (cs_mode & (CS_EVEN_PRIMARY | CS_ODD_PRIMARY)) + addr_mask = pvt->csels[umc].csmasks[cs_mask_nr]; + + if (cs_mode & (CS_EVEN_SECONDARY | CS_ODD_SECONDARY)) + addr_mask_sec = pvt->csels[umc].csmasks_sec[cs_mask_nr]; - return __addr_mask_to_cs_size(addr_mask_orig, cs_mode, csrow_nr, dimm); + return __addr_mask_to_cs_size(addr_mask, addr_mask_sec, cs_mode, csrow_nr, dimm); } static void umc_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl) @@ -3515,9 +3529,10 @@ static void gpu_get_err_info(struct mce *m, struct err_info *err) static int gpu_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc, unsigned int cs_mode, int csrow_nr) { - u32 addr_mask_orig = pvt->csels[umc].csmasks[csrow_nr]; + u32 addr_mask = pvt->csels[umc].csmasks[csrow_nr]; + u32 addr_mask_sec = pvt->csels[umc].csmasks_sec[csrow_nr]; - return __addr_mask_to_cs_size(addr_mask_orig, cs_mode, csrow_nr, csrow_nr >> 1); + return __addr_mask_to_cs_size(addr_mask, addr_mask_sec, cs_mode, csrow_nr, csrow_nr >> 1); } static void gpu_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl) -- GitLab From 2b9052d88de72e5b8d4423d84ca3ba64d7fe34e4 Mon Sep 17 00:00:00 2001 From: "Xin Li (Intel)" Date: Fri, 20 Jun 2025 16:15:03 -0700 Subject: [PATCH 1767/2211] x86/traps: Initialize DR6 by writing its architectural reset value commit 5f465c148c61e876b6d6eacd8e8e365f2d47758f upstream. Initialize DR6 by writing its architectural reset value to avoid incorrectly zeroing DR6 to clear DR6.BLD at boot time, which leads to a false bus lock detected warning. The Intel SDM says: 1) Certain debug exceptions may clear bits 0-3 of DR6. 2) BLD induced #DB clears DR6.BLD and any other debug exception doesn't modify DR6.BLD. 3) RTM induced #DB clears DR6.RTM and any other debug exception sets DR6.RTM. To avoid confusion in identifying debug exceptions, debug handlers should set DR6.BLD and DR6.RTM, and clear other DR6 bits before returning. The DR6 architectural reset value 0xFFFF0FF0, already defined as macro DR6_RESERVED, satisfies these requirements, so just use it to reinitialize DR6 whenever needed. Since clear_all_debug_regs() no longer zeros all debug registers, rename it to initialize_debug_regs() to better reflect its current behavior. Since debug_read_clear_dr6() no longer clears DR6, rename it to debug_read_reset_dr6() to better reflect its current behavior. Fixes: ebb1064e7c2e9 ("x86/traps: Handle #DB for bus lock") Reported-by: Sohil Mehta Suggested-by: H. Peter Anvin (Intel) Signed-off-by: Xin Li (Intel) Signed-off-by: Dave Hansen Reviewed-by: H. Peter Anvin (Intel) Reviewed-by: Sohil Mehta Acked-by: Peter Zijlstra (Intel) Tested-by: Sohil Mehta Link: https://lore.kernel.org/lkml/06e68373-a92b-472e-8fd9-ba548119770c@intel.com/ Cc:stable@vger.kernel.org Link: https://lore.kernel.org/all/20250620231504.2676902-2-xin%40zytor.com Signed-off-by: Greg Kroah-Hartman --- arch/x86/include/uapi/asm/debugreg.h | 21 ++++++++++++++++- arch/x86/kernel/cpu/common.c | 24 ++++++++------------ arch/x86/kernel/traps.c | 34 +++++++++++++++++----------- 3 files changed, 51 insertions(+), 28 deletions(-) diff --git a/arch/x86/include/uapi/asm/debugreg.h b/arch/x86/include/uapi/asm/debugreg.h index 0007ba077c0c2..41da492dfb01f 100644 --- a/arch/x86/include/uapi/asm/debugreg.h +++ b/arch/x86/include/uapi/asm/debugreg.h @@ -15,7 +15,26 @@ which debugging register was responsible for the trap. The other bits are either reserved or not of interest to us. */ -/* Define reserved bits in DR6 which are always set to 1 */ +/* + * Define bits in DR6 which are set to 1 by default. + * + * This is also the DR6 architectural value following Power-up, Reset or INIT. + * + * Note, with the introduction of Bus Lock Detection (BLD) and Restricted + * Transactional Memory (RTM), the DR6 register has been modified: + * + * 1) BLD flag (bit 11) is no longer reserved to 1 if the CPU supports + * Bus Lock Detection. The assertion of a bus lock could clear it. + * + * 2) RTM flag (bit 16) is no longer reserved to 1 if the CPU supports + * restricted transactional memory. #DB occurred inside an RTM region + * could clear it. + * + * Apparently, DR6.BLD and DR6.RTM are active low bits. + * + * As a result, DR6_RESERVED is an incorrect name now, but it is kept for + * compatibility. + */ #define DR6_RESERVED (0xFFFF0FF0) #define DR_TRAP0 (0x1) /* db0 */ diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index b487754455236..a11c61fd7d52c 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -2145,20 +2145,16 @@ EXPORT_PER_CPU_SYMBOL(__stack_chk_guard); #endif /* CONFIG_X86_64 */ -/* - * Clear all 6 debug registers: - */ -static void clear_all_debug_regs(void) +static void initialize_debug_regs(void) { - int i; - - for (i = 0; i < 8; i++) { - /* Ignore db4, db5 */ - if ((i == 4) || (i == 5)) - continue; - - set_debugreg(0, i); - } + /* Control register first -- to make sure everything is disabled. */ + set_debugreg(0, 7); + set_debugreg(DR6_RESERVED, 6); + /* dr5 and dr4 don't exist */ + set_debugreg(0, 3); + set_debugreg(0, 2); + set_debugreg(0, 1); + set_debugreg(0, 0); } #ifdef CONFIG_KGDB @@ -2319,7 +2315,7 @@ void cpu_init(void) load_mm_ldt(&init_mm); - clear_all_debug_regs(); + initialize_debug_regs(); dbg_restore_debug_regs(); doublefault_init_cpu_tss(); diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index b18fc7539b8d7..243f3bc9b4dc5 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -977,24 +977,32 @@ static bool is_sysenter_singlestep(struct pt_regs *regs) #endif } -static __always_inline unsigned long debug_read_clear_dr6(void) +static __always_inline unsigned long debug_read_reset_dr6(void) { unsigned long dr6; + get_debugreg(dr6, 6); + dr6 ^= DR6_RESERVED; /* Flip to positive polarity */ + /* * The Intel SDM says: * - * Certain debug exceptions may clear bits 0-3. The remaining - * contents of the DR6 register are never cleared by the - * processor. To avoid confusion in identifying debug - * exceptions, debug handlers should clear the register before - * returning to the interrupted task. + * Certain debug exceptions may clear bits 0-3 of DR6. + * + * BLD induced #DB clears DR6.BLD and any other debug + * exception doesn't modify DR6.BLD. * - * Keep it simple: clear DR6 immediately. + * RTM induced #DB clears DR6.RTM and any other debug + * exception sets DR6.RTM. + * + * To avoid confusion in identifying debug exceptions, + * debug handlers should set DR6.BLD and DR6.RTM, and + * clear other DR6 bits before returning. + * + * Keep it simple: write DR6 with its architectural reset + * value 0xFFFF0FF0, defined as DR6_RESERVED, immediately. */ - get_debugreg(dr6, 6); set_debugreg(DR6_RESERVED, 6); - dr6 ^= DR6_RESERVED; /* Flip to positive polarity */ return dr6; } @@ -1194,13 +1202,13 @@ out: /* IST stack entry */ DEFINE_IDTENTRY_DEBUG(exc_debug) { - exc_debug_kernel(regs, debug_read_clear_dr6()); + exc_debug_kernel(regs, debug_read_reset_dr6()); } /* User entry, runs on regular task stack */ DEFINE_IDTENTRY_DEBUG_USER(exc_debug) { - exc_debug_user(regs, debug_read_clear_dr6()); + exc_debug_user(regs, debug_read_reset_dr6()); } #ifdef CONFIG_X86_FRED @@ -1219,7 +1227,7 @@ DEFINE_FREDENTRY_DEBUG(exc_debug) { /* * FRED #DB stores DR6 on the stack in the format which - * debug_read_clear_dr6() returns for the IDT entry points. + * debug_read_reset_dr6() returns for the IDT entry points. */ unsigned long dr6 = fred_event_data(regs); @@ -1234,7 +1242,7 @@ DEFINE_FREDENTRY_DEBUG(exc_debug) /* 32 bit does not have separate entry points. */ DEFINE_IDTENTRY_RAW(exc_debug) { - unsigned long dr6 = debug_read_clear_dr6(); + unsigned long dr6 = debug_read_reset_dr6(); if (user_mode(regs)) exc_debug_user(regs, dr6); -- GitLab From 379cca2ad9da4993beebe50bb2261752d1591c34 Mon Sep 17 00:00:00 2001 From: Nathan Chancellor Date: Mon, 9 Jun 2025 14:13:14 -0700 Subject: [PATCH 1768/2211] staging: rtl8723bs: Avoid memset() in aes_cipher() and aes_decipher() commit a55bc4ffc06d8c965a7d6f0a01ed0ed41380df28 upstream. After commit 6f110a5e4f99 ("Disable SLUB_TINY for build testing"), which causes CONFIG_KASAN to be enabled in allmodconfig again, arm64 allmodconfig builds with older versions of clang (15 through 17) show an instance of -Wframe-larger-than (which breaks the build with CONFIG_WERROR=y): drivers/staging/rtl8723bs/core/rtw_security.c:1287:5: error: stack frame size (2208) exceeds limit (2048) in 'rtw_aes_decrypt' [-Werror,-Wframe-larger-than] 1287 | u32 rtw_aes_decrypt(struct adapter *padapter, u8 *precvframe) | ^ This comes from aes_decipher() being inlined in rtw_aes_decrypt(). Running the same build with CONFIG_FRAME_WARN=128 shows aes_cipher() also uses a decent amount of stack, just under the limit of 2048: drivers/staging/rtl8723bs/core/rtw_security.c:864:19: warning: stack frame size (1952) exceeds limit (128) in 'aes_cipher' [-Wframe-larger-than] 864 | static signed int aes_cipher(u8 *key, uint hdrlen, | ^ -Rpass-analysis=stack-frame-layout only shows one large structure on the stack, which is the ctx variable inlined from aes128k128d(). A good number of the other variables come from the additional checks of fortified string routines, which are present in memset(), which both aes_cipher() and aes_decipher() use to initialize some temporary buffers. In this case, since the size is known at compile time, these additional checks should not result in any code generation changes but allmodconfig has several sanitizers enabled, which may make it harder for the compiler to eliminate the compile time checks and the variables that come about from them. The memset() calls are just initializing these buffers to zero, so use '= {}' instead, which is used all over the kernel and does the exact same thing as memset() without the fortify checks, which drops the stack usage of these functions by a few hundred kilobytes. drivers/staging/rtl8723bs/core/rtw_security.c:864:19: warning: stack frame size (1584) exceeds limit (128) in 'aes_cipher' [-Wframe-larger-than] 864 | static signed int aes_cipher(u8 *key, uint hdrlen, | ^ drivers/staging/rtl8723bs/core/rtw_security.c:1271:5: warning: stack frame size (1456) exceeds limit (128) in 'rtw_aes_decrypt' [-Wframe-larger-than] 1271 | u32 rtw_aes_decrypt(struct adapter *padapter, u8 *precvframe) | ^ Cc: stable@vger.kernel.org Fixes: 554c0a3abf21 ("staging: Add rtl8723bs sdio wifi driver") Signed-off-by: Nathan Chancellor Reviewed-by: Dan Carpenter Link: https://lore.kernel.org/r/20250609-rtl8723bs-fix-clang-arm64-wflt-v1-1-e2accba43def@kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/staging/rtl8723bs/core/rtw_security.c | 44 ++++++------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/drivers/staging/rtl8723bs/core/rtw_security.c b/drivers/staging/rtl8723bs/core/rtw_security.c index 1e9eff01b1aa5..e9f382c280d9b 100644 --- a/drivers/staging/rtl8723bs/core/rtw_security.c +++ b/drivers/staging/rtl8723bs/core/rtw_security.c @@ -868,29 +868,21 @@ static signed int aes_cipher(u8 *key, uint hdrlen, num_blocks, payload_index; u8 pn_vector[6]; - u8 mic_iv[16]; - u8 mic_header1[16]; - u8 mic_header2[16]; - u8 ctr_preload[16]; + u8 mic_iv[16] = {}; + u8 mic_header1[16] = {}; + u8 mic_header2[16] = {}; + u8 ctr_preload[16] = {}; /* Intermediate Buffers */ - u8 chain_buffer[16]; - u8 aes_out[16]; - u8 padded_buffer[16]; + u8 chain_buffer[16] = {}; + u8 aes_out[16] = {}; + u8 padded_buffer[16] = {}; u8 mic[8]; uint frtype = GetFrameType(pframe); uint frsubtype = GetFrameSubType(pframe); frsubtype = frsubtype>>4; - memset((void *)mic_iv, 0, 16); - memset((void *)mic_header1, 0, 16); - memset((void *)mic_header2, 0, 16); - memset((void *)ctr_preload, 0, 16); - memset((void *)chain_buffer, 0, 16); - memset((void *)aes_out, 0, 16); - memset((void *)padded_buffer, 0, 16); - if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen == WLAN_HDR_A3_QOS_LEN)) a4_exists = 0; else @@ -1080,15 +1072,15 @@ static signed int aes_decipher(u8 *key, uint hdrlen, num_blocks, payload_index; signed int res = _SUCCESS; u8 pn_vector[6]; - u8 mic_iv[16]; - u8 mic_header1[16]; - u8 mic_header2[16]; - u8 ctr_preload[16]; + u8 mic_iv[16] = {}; + u8 mic_header1[16] = {}; + u8 mic_header2[16] = {}; + u8 ctr_preload[16] = {}; /* Intermediate Buffers */ - u8 chain_buffer[16]; - u8 aes_out[16]; - u8 padded_buffer[16]; + u8 chain_buffer[16] = {}; + u8 aes_out[16] = {}; + u8 padded_buffer[16] = {}; u8 mic[8]; uint frtype = GetFrameType(pframe); @@ -1096,14 +1088,6 @@ static signed int aes_decipher(u8 *key, uint hdrlen, frsubtype = frsubtype>>4; - memset((void *)mic_iv, 0, 16); - memset((void *)mic_header1, 0, 16); - memset((void *)mic_header2, 0, 16); - memset((void *)ctr_preload, 0, 16); - memset((void *)chain_buffer, 0, 16); - memset((void *)aes_out, 0, 16); - memset((void *)padded_buffer, 0, 16); - /* start to decrypt the payload */ num_blocks = (plen-8) / 16; /* plen including LLC, payload_length and mic) */ -- GitLab From 1f6e759907003d2d5a42aa67c35af6ec9ff27a79 Mon Sep 17 00:00:00 2001 From: Yao Zi Date: Mon, 23 Jun 2025 09:34:45 +0000 Subject: [PATCH 1769/2211] dt-bindings: serial: 8250: Make clocks and clock-frequency exclusive commit 09812134071b3941fb81def30b61ed36d3a5dfb5 upstream. The 8250 binding before converting to json-schema states, - clock-frequency : the input clock frequency for the UART or - clocks phandle to refer to the clk used as per Documentation/devicetree for clock-related properties, where "or" indicates these properties shouldn't exist at the same time. Additionally, the behavior of Linux's driver is strange when both clocks and clock-frequency are specified: it ignores clocks and obtains the frequency from clock-frequency, left the specified clocks unclaimed. It may even be disabled, which is undesired most of the time. But "anyOf" doesn't prevent these two properties from coexisting, as it considers the object valid as long as there's at LEAST one match. Let's switch to "oneOf" and disallows the other property if one exists, precisely matching the original binding and avoiding future confusion on the driver's behavior. Fixes: e69f5dc623f9 ("dt-bindings: serial: Convert 8250 to json-schema") Cc: stable Signed-off-by: Yao Zi Reviewed-by: Conor Dooley Link: https://lore.kernel.org/r/20250623093445.62327-1-ziyao@disroot.org Signed-off-by: Greg Kroah-Hartman --- Documentation/devicetree/bindings/serial/8250.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/serial/8250.yaml b/Documentation/devicetree/bindings/serial/8250.yaml index 692aa05500fd5..6ba0325039be2 100644 --- a/Documentation/devicetree/bindings/serial/8250.yaml +++ b/Documentation/devicetree/bindings/serial/8250.yaml @@ -45,7 +45,7 @@ allOf: - ns16550 - ns16550a then: - anyOf: + oneOf: - required: [ clock-frequency ] - required: [ clocks ] -- GitLab From 2b8788496f1322c1d7764cb06fcdaaa3e8e12a50 Mon Sep 17 00:00:00 2001 From: Aidan Stewart Date: Tue, 17 Jun 2025 10:48:19 -0600 Subject: [PATCH 1770/2211] serial: core: restore of_node information in sysfs commit d36f0e9a0002f04f4d6dd9be908d58fe5bd3a279 upstream. Since in v6.8-rc1, the of_node symlink under tty devices is missing. This breaks any udev rules relying on this information. Link the of_node information in the serial controller device with the parent defined in the device tree. This will also apply to the serial device which takes the serial controller as a parent device. Fixes: b286f4e87e32 ("serial: core: Move tty and serdev to be children of serial core port device") Cc: stable@vger.kernel.org Signed-off-by: Aidan Stewart Link: https://lore.kernel.org/r/20250617164819.13912-1-astewart@tektelic.com Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/serial_base_bus.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/tty/serial/serial_base_bus.c b/drivers/tty/serial/serial_base_bus.c index 5d1677f1b651c..cb3b127b06b61 100644 --- a/drivers/tty/serial/serial_base_bus.c +++ b/drivers/tty/serial/serial_base_bus.c @@ -72,6 +72,7 @@ static int serial_base_device_init(struct uart_port *port, dev->parent = parent_dev; dev->bus = &serial_base_bus_type; dev->release = release; + device_set_of_node_from_dev(dev, parent_dev); if (!serial_base_initialized) { dev_dbg(port->dev, "uart_add_one_port() called before arch_initcall()?\n"); -- GitLab From 765af231964d6a6e0ad6946a247d0b4d43d0242f Mon Sep 17 00:00:00 2001 From: Fabio Estevam Date: Thu, 19 Jun 2025 08:46:17 -0300 Subject: [PATCH 1771/2211] serial: imx: Restore original RXTL for console to fix data loss commit f23c52aafb1675ab1d1f46914556d8e29cbbf7b3 upstream. Commit 7a637784d517 ("serial: imx: reduce RX interrupt frequency") introduced a regression on the i.MX6UL EVK board. The issue can be reproduced with the following steps: - Open vi on the board. - Paste a text file (~150 characters). - Save the file, then repeat the process. - Compare the sha256sum of the saved files. The checksums do not match due to missing characters or entire lines. Fix this by restoring the RXTL value to 1 when the UART is used as a console. This ensures timely RX interrupts and reliable data reception in console mode. With this change, pasted content is saved correctly, and checksums are always consistent. Cc: stable Fixes: 7a637784d517 ("serial: imx: reduce RX interrupt frequency") Signed-off-by: Fabio Estevam Reviewed-by: Stefan Wahren Link: https://lore.kernel.org/r/20250619114617.2791939-1-festevam@gmail.com Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/imx.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 8e3b15534bc72..deb9635cb48dc 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -233,6 +233,7 @@ struct imx_port { enum imx_tx_state tx_state; struct hrtimer trigger_start_tx; struct hrtimer trigger_stop_tx; + unsigned int rxtl; }; struct imx_port_ucrs { @@ -1328,6 +1329,7 @@ static void imx_uart_clear_rx_errors(struct imx_port *sport) #define TXTL_DEFAULT 8 #define RXTL_DEFAULT 8 /* 8 characters or aging timer */ +#define RXTL_CONSOLE_DEFAULT 1 #define TXTL_DMA 8 /* DMA burst setting */ #define RXTL_DMA 9 /* DMA burst setting */ @@ -1445,7 +1447,7 @@ static void imx_uart_disable_dma(struct imx_port *sport) ucr1 &= ~(UCR1_RXDMAEN | UCR1_TXDMAEN | UCR1_ATDMAEN); imx_uart_writel(sport, ucr1, UCR1); - imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT); + imx_uart_setup_ufcr(sport, TXTL_DEFAULT, sport->rxtl); sport->dma_is_enabled = 0; } @@ -1470,7 +1472,12 @@ static int imx_uart_startup(struct uart_port *port) return retval; } - imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT); + if (uart_console(&sport->port)) + sport->rxtl = RXTL_CONSOLE_DEFAULT; + else + sport->rxtl = RXTL_DEFAULT; + + imx_uart_setup_ufcr(sport, TXTL_DEFAULT, sport->rxtl); /* disable the DREN bit (Data Ready interrupt enable) before * requesting IRQs @@ -1936,7 +1943,7 @@ static int imx_uart_poll_init(struct uart_port *port) if (retval) clk_disable_unprepare(sport->clk_ipg); - imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT); + imx_uart_setup_ufcr(sport, TXTL_DEFAULT, sport->rxtl); uart_port_lock_irqsave(&sport->port, &flags); @@ -2028,7 +2035,7 @@ static int imx_uart_rs485_config(struct uart_port *port, struct ktermios *termio /* If the receiver trigger is 0, set it to a default value */ ufcr = imx_uart_readl(sport, UFCR); if ((ufcr & UFCR_RXTL_MASK) == 0) - imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT); + imx_uart_setup_ufcr(sport, TXTL_DEFAULT, sport->rxtl); imx_uart_start_rx(port); } @@ -2213,7 +2220,7 @@ imx_uart_console_setup(struct console *co, char *options) else imx_uart_console_get_options(sport, &baud, &parity, &bits); - imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT); + imx_uart_setup_ufcr(sport, TXTL_DEFAULT, sport->rxtl); retval = uart_set_options(&sport->port, co, baud, parity, bits, flow); -- GitLab From 5a8400ebc2463cb01a9bdc0b296ecfaca8e7c3c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Danis?= Date: Thu, 12 Jun 2025 09:50:34 +0200 Subject: [PATCH 1772/2211] Bluetooth: L2CAP: Fix L2CAP MTU negotiation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 042bb9603c44620dce98717a2d23235ca57a00d7 upstream. OBEX download from iPhone is currently slow due to small packet size used to transfer data which doesn't follow the MTU negotiated during L2CAP connection, i.e. 672 bytes instead of 32767: < ACL Data TX: Handle 11 flags 0x00 dlen 12 L2CAP: Connection Request (0x02) ident 18 len 4 PSM: 4103 (0x1007) Source CID: 72 > ACL Data RX: Handle 11 flags 0x02 dlen 16 L2CAP: Connection Response (0x03) ident 18 len 8 Destination CID: 14608 Source CID: 72 Result: Connection successful (0x0000) Status: No further information available (0x0000) < ACL Data TX: Handle 11 flags 0x00 dlen 27 L2CAP: Configure Request (0x04) ident 20 len 19 Destination CID: 14608 Flags: 0x0000 Option: Maximum Transmission Unit (0x01) [mandatory] MTU: 32767 Option: Retransmission and Flow Control (0x04) [mandatory] Mode: Enhanced Retransmission (0x03) TX window size: 63 Max transmit: 3 Retransmission timeout: 2000 Monitor timeout: 12000 Maximum PDU size: 1009 > ACL Data RX: Handle 11 flags 0x02 dlen 26 L2CAP: Configure Request (0x04) ident 72 len 18 Destination CID: 72 Flags: 0x0000 Option: Retransmission and Flow Control (0x04) [mandatory] Mode: Enhanced Retransmission (0x03) TX window size: 32 Max transmit: 255 Retransmission timeout: 0 Monitor timeout: 0 Maximum PDU size: 65527 Option: Frame Check Sequence (0x05) [mandatory] FCS: 16-bit FCS (0x01) < ACL Data TX: Handle 11 flags 0x00 dlen 29 L2CAP: Configure Response (0x05) ident 72 len 21 Source CID: 14608 Flags: 0x0000 Result: Success (0x0000) Option: Maximum Transmission Unit (0x01) [mandatory] MTU: 672 Option: Retransmission and Flow Control (0x04) [mandatory] Mode: Enhanced Retransmission (0x03) TX window size: 32 Max transmit: 255 Retransmission timeout: 2000 Monitor timeout: 12000 Maximum PDU size: 1009 > ACL Data RX: Handle 11 flags 0x02 dlen 32 L2CAP: Configure Response (0x05) ident 20 len 24 Source CID: 72 Flags: 0x0000 Result: Success (0x0000) Option: Maximum Transmission Unit (0x01) [mandatory] MTU: 32767 Option: Retransmission and Flow Control (0x04) [mandatory] Mode: Enhanced Retransmission (0x03) TX window size: 63 Max transmit: 3 Retransmission timeout: 2000 Monitor timeout: 12000 Maximum PDU size: 1009 Option: Frame Check Sequence (0x05) [mandatory] FCS: 16-bit FCS (0x01) ... > ACL Data RX: Handle 11 flags 0x02 dlen 680 Channel: 72 len 676 ctrl 0x0202 [PSM 4103 mode Enhanced Retransmission (0x03)] {chan 8} I-frame: Unsegmented TxSeq 1 ReqSeq 2 < ACL Data TX: Handle 11 flags 0x00 dlen 13 Channel: 14608 len 9 ctrl 0x0204 [PSM 4103 mode Enhanced Retransmission (0x03)] {chan 8} I-frame: Unsegmented TxSeq 2 ReqSeq 2 > ACL Data RX: Handle 11 flags 0x02 dlen 680 Channel: 72 len 676 ctrl 0x0304 [PSM 4103 mode Enhanced Retransmission (0x03)] {chan 8} I-frame: Unsegmented TxSeq 2 ReqSeq 3 The MTUs are negotiated for each direction. In this traces 32767 for iPhone->localhost and no MTU for localhost->iPhone, which based on '4.4 L2CAP_CONFIGURATION_REQ' (Core specification v5.4, Vol. 3, Part A): The only parameters that should be included in the L2CAP_CONFIGURATION_REQ packet are those that require different values than the default or previously agreed values. ... Any missing configuration parameters are assumed to have their most recently explicitly or implicitly accepted values. and '5.1 Maximum transmission unit (MTU)': If the remote device sends a positive L2CAP_CONFIGURATION_RSP packet it should include the actual MTU to be used on this channel for traffic flowing into the local device. ... The default value is 672 octets. is set by BlueZ to 672 bytes. It seems that the iPhone used the lowest negotiated value to transfer data to the localhost instead of the negotiated one for the incoming direction. This could be fixed by using the MTU negotiated for the other direction, if exists, in the L2CAP_CONFIGURATION_RSP. This allows to use segmented packets as in the following traces: < ACL Data TX: Handle 11 flags 0x00 dlen 12 L2CAP: Connection Request (0x02) ident 22 len 4 PSM: 4103 (0x1007) Source CID: 72 < ACL Data TX: Handle 11 flags 0x00 dlen 27 L2CAP: Configure Request (0x04) ident 24 len 19 Destination CID: 2832 Flags: 0x0000 Option: Maximum Transmission Unit (0x01) [mandatory] MTU: 32767 Option: Retransmission and Flow Control (0x04) [mandatory] Mode: Enhanced Retransmission (0x03) TX window size: 63 Max transmit: 3 Retransmission timeout: 2000 Monitor timeout: 12000 Maximum PDU size: 1009 > ACL Data RX: Handle 11 flags 0x02 dlen 26 L2CAP: Configure Request (0x04) ident 15 len 18 Destination CID: 72 Flags: 0x0000 Option: Retransmission and Flow Control (0x04) [mandatory] Mode: Enhanced Retransmission (0x03) TX window size: 32 Max transmit: 255 Retransmission timeout: 0 Monitor timeout: 0 Maximum PDU size: 65527 Option: Frame Check Sequence (0x05) [mandatory] FCS: 16-bit FCS (0x01) < ACL Data TX: Handle 11 flags 0x00 dlen 29 L2CAP: Configure Response (0x05) ident 15 len 21 Source CID: 2832 Flags: 0x0000 Result: Success (0x0000) Option: Maximum Transmission Unit (0x01) [mandatory] MTU: 32767 Option: Retransmission and Flow Control (0x04) [mandatory] Mode: Enhanced Retransmission (0x03) TX window size: 32 Max transmit: 255 Retransmission timeout: 2000 Monitor timeout: 12000 Maximum PDU size: 1009 > ACL Data RX: Handle 11 flags 0x02 dlen 32 L2CAP: Configure Response (0x05) ident 24 len 24 Source CID: 72 Flags: 0x0000 Result: Success (0x0000) Option: Maximum Transmission Unit (0x01) [mandatory] MTU: 32767 Option: Retransmission and Flow Control (0x04) [mandatory] Mode: Enhanced Retransmission (0x03) TX window size: 63 Max transmit: 3 Retransmission timeout: 2000 Monitor timeout: 12000 Maximum PDU size: 1009 Option: Frame Check Sequence (0x05) [mandatory] FCS: 16-bit FCS (0x01) ... > ACL Data RX: Handle 11 flags 0x02 dlen 1009 Channel: 72 len 1005 ctrl 0x4202 [PSM 4103 mode Enhanced Retransmission (0x03)] {chan 8} I-frame: Start (len 21884) TxSeq 1 ReqSeq 2 > ACL Data RX: Handle 11 flags 0x02 dlen 1009 Channel: 72 len 1005 ctrl 0xc204 [PSM 4103 mode Enhanced Retransmission (0x03)] {chan 8} I-frame: Continuation TxSeq 2 ReqSeq 2 This has been tested with kernel 5.4 and BlueZ 5.77. Cc: stable@vger.kernel.org Signed-off-by: Frédéric Danis Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Greg Kroah-Hartman --- net/bluetooth/l2cap_core.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index a40534bf9084d..0628fedc0e29b 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -3380,7 +3380,7 @@ static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC }; struct l2cap_conf_efs efs; u8 remote_efs = 0; - u16 mtu = L2CAP_DEFAULT_MTU; + u16 mtu = 0; u16 result = L2CAP_CONF_SUCCESS; u16 size; @@ -3485,6 +3485,13 @@ done: /* Configure output options and let the other side know * which ones we don't like. */ + /* If MTU is not provided in configure request, use the most recently + * explicitly or implicitly accepted value for the other direction, + * or the default value. + */ + if (mtu == 0) + mtu = chan->imtu ? chan->imtu : L2CAP_DEFAULT_MTU; + if (mtu < L2CAP_DEFAULT_MIN_MTU) result = L2CAP_CONF_UNACCEPT; else { -- GitLab From b9f78c36c095cc1fcd5741fdec3ebfd87c8c6f04 Mon Sep 17 00:00:00 2001 From: Heinz Mauelshagen Date: Tue, 10 Jun 2025 20:53:30 +0200 Subject: [PATCH 1773/2211] dm-raid: fix variable in journal device check commit db53805156f1e0aa6d059c0d3f9ac660d4ef3eb4 upstream. Replace "rdev" with correct loop variable name "r". Signed-off-by: Heinz Mauelshagen Cc: stable@vger.kernel.org Fixes: 63c32ed4afc2 ("dm raid: add raid4/5/6 journaling support") Signed-off-by: Mikulas Patocka Signed-off-by: Greg Kroah-Hartman --- drivers/md/dm-raid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 1e0d3b9b75d6f..163a5bbd485f9 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -2410,7 +2410,7 @@ static int super_init_validation(struct raid_set *rs, struct md_rdev *rdev) */ sb_retrieve_failed_devices(sb, failed_devices); rdev_for_each(r, mddev) { - if (test_bit(Journal, &rdev->flags) || + if (test_bit(Journal, &r->flags) || !r->sb_page) continue; sb2 = page_address(r->sb_page); -- GitLab From 2088895d5903082bb9021770b919e733c57edbc1 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Wed, 28 May 2025 12:28:27 +0100 Subject: [PATCH 1774/2211] btrfs: fix a race between renames and directory logging commit 3ca864de852bc91007b32d2a0d48993724f4abad upstream. We have a race between a rename and directory inode logging that if it happens and we crash/power fail before the rename completes, the next time the filesystem is mounted, the log replay code will end up deleting the file that was being renamed. This is best explained following a step by step analysis of an interleaving of steps that lead into this situation. Consider the initial conditions: 1) We are at transaction N; 2) We have directories A and B created in a past transaction (< N); 3) We have inode X corresponding to a file that has 2 hardlinks, one in directory A and the other in directory B, so we'll name them as "A/foo_link1" and "B/foo_link2". Both hard links were persisted in a past transaction (< N); 4) We have inode Y corresponding to a file that as a single hard link and is located in directory A, we'll name it as "A/bar". This file was also persisted in a past transaction (< N). The steps leading to a file loss are the following and for all of them we are under transaction N: 1) Link "A/foo_link1" is removed, so inode's X last_unlink_trans field is updated to N, through btrfs_unlink() -> btrfs_record_unlink_dir(); 2) Task A starts a rename for inode Y, with the goal of renaming from "A/bar" to "A/baz", so we enter btrfs_rename(); 3) Task A inserts the new BTRFS_INODE_REF_KEY for inode Y by calling btrfs_insert_inode_ref(); 4) Because the rename happens in the same directory, we don't set the last_unlink_trans field of directoty A's inode to the current transaction id, that is, we don't cal btrfs_record_unlink_dir(); 5) Task A then removes the entries from directory A (BTRFS_DIR_ITEM_KEY and BTRFS_DIR_INDEX_KEY items) when calling __btrfs_unlink_inode() (actually the dir index item is added as a delayed item, but the effect is the same); 6) Now before task A adds the new entry "A/baz" to directory A by calling btrfs_add_link(), another task, task B is logging inode X; 7) Task B starts a fsync of inode X and after logging inode X, at btrfs_log_inode_parent() it calls btrfs_log_all_parents(), since inode X has a last_unlink_trans value of N, set at in step 1; 8) At btrfs_log_all_parents() we search for all parent directories of inode X using the commit root, so we find directories A and B and log them. Bu when logging direct A, we don't have a dir index item for inode Y anymore, neither the old name "A/bar" nor for the new name "A/baz" since the rename has deleted the old name but has not yet inserted the new name - task A hasn't called yet btrfs_add_link() to do that. Note that logging directory A doesn't fallback to a transaction commit because its last_unlink_trans has a lower value than the current transaction's id (see step 4); 9) Task B finishes logging directories A and B and gets back to btrfs_sync_file() where it calls btrfs_sync_log() to persist the log tree; 10) Task B successfully persisted the log tree, btrfs_sync_log() completed with success, and a power failure happened. We have a log tree without any directory entry for inode Y, so the log replay code deletes the entry for inode Y, name "A/bar", from the subvolume tree since it doesn't exist in the log tree and the log tree is authorative for its index (we logged a BTRFS_DIR_LOG_INDEX_KEY item that covers the index range for the dentry that corresponds to "A/bar"). Since there's no other hard link for inode Y and the log replay code deletes the name "A/bar", the file is lost. The issue wouldn't happen if task B synced the log only after task A called btrfs_log_new_name(), which would update the log with the new name for inode Y ("A/bar"). Fix this by pinning the log root during renames before removing the old directory entry, and unpinning after btrfs_log_new_name() is called. Fixes: 259c4b96d78d ("btrfs: stop doing unnecessary log updates during a rename") CC: stable@vger.kernel.org # 5.18+ Reviewed-by: Boris Burkov Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Greg Kroah-Hartman --- fs/btrfs/inode.c | 81 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 64 insertions(+), 17 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 94664c1822930..cc6a350ae6ede 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -7997,6 +7997,7 @@ static int btrfs_rename_exchange(struct inode *old_dir, int ret; int ret2; bool need_abort = false; + bool logs_pinned = false; struct fscrypt_name old_fname, new_fname; struct fscrypt_str *old_name, *new_name; @@ -8120,6 +8121,31 @@ static int btrfs_rename_exchange(struct inode *old_dir, inode_inc_iversion(new_inode); simple_rename_timestamp(old_dir, old_dentry, new_dir, new_dentry); + if (old_ino != BTRFS_FIRST_FREE_OBJECTID && + new_ino != BTRFS_FIRST_FREE_OBJECTID) { + /* + * If we are renaming in the same directory (and it's not for + * root entries) pin the log early to prevent any concurrent + * task from logging the directory after we removed the old + * entries and before we add the new entries, otherwise that + * task can sync a log without any entry for the inodes we are + * renaming and therefore replaying that log, if a power failure + * happens after syncing the log, would result in deleting the + * inodes. + * + * If the rename affects two different directories, we want to + * make sure the that there's no log commit that contains + * updates for only one of the directories but not for the + * other. + * + * If we are renaming an entry for a root, we don't care about + * log updates since we called btrfs_set_log_full_commit(). + */ + btrfs_pin_log_trans(root); + btrfs_pin_log_trans(dest); + logs_pinned = true; + } + if (old_dentry->d_parent != new_dentry->d_parent) { btrfs_record_unlink_dir(trans, BTRFS_I(old_dir), BTRFS_I(old_inode), true); @@ -8177,30 +8203,23 @@ static int btrfs_rename_exchange(struct inode *old_dir, BTRFS_I(new_inode)->dir_index = new_idx; /* - * Now pin the logs of the roots. We do it to ensure that no other task - * can sync the logs while we are in progress with the rename, because - * that could result in an inconsistency in case any of the inodes that - * are part of this rename operation were logged before. + * Do the log updates for all inodes. + * + * If either entry is for a root we don't need to update the logs since + * we've called btrfs_set_log_full_commit() before. */ - if (old_ino != BTRFS_FIRST_FREE_OBJECTID) - btrfs_pin_log_trans(root); - if (new_ino != BTRFS_FIRST_FREE_OBJECTID) - btrfs_pin_log_trans(dest); - - /* Do the log updates for all inodes. */ - if (old_ino != BTRFS_FIRST_FREE_OBJECTID) + if (logs_pinned) { btrfs_log_new_name(trans, old_dentry, BTRFS_I(old_dir), old_rename_ctx.index, new_dentry->d_parent); - if (new_ino != BTRFS_FIRST_FREE_OBJECTID) btrfs_log_new_name(trans, new_dentry, BTRFS_I(new_dir), new_rename_ctx.index, old_dentry->d_parent); + } - /* Now unpin the logs. */ - if (old_ino != BTRFS_FIRST_FREE_OBJECTID) +out_fail: + if (logs_pinned) { btrfs_end_log_trans(root); - if (new_ino != BTRFS_FIRST_FREE_OBJECTID) btrfs_end_log_trans(dest); -out_fail: + } ret2 = btrfs_end_transaction(trans); ret = ret ? ret : ret2; out_notrans: @@ -8250,6 +8269,7 @@ static int btrfs_rename(struct mnt_idmap *idmap, int ret2; u64 old_ino = btrfs_ino(BTRFS_I(old_inode)); struct fscrypt_name old_fname, new_fname; + bool logs_pinned = false; if (btrfs_ino(BTRFS_I(new_dir)) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) return -EPERM; @@ -8384,6 +8404,29 @@ static int btrfs_rename(struct mnt_idmap *idmap, inode_inc_iversion(old_inode); simple_rename_timestamp(old_dir, old_dentry, new_dir, new_dentry); + if (old_ino != BTRFS_FIRST_FREE_OBJECTID) { + /* + * If we are renaming in the same directory (and it's not a + * root entry) pin the log to prevent any concurrent task from + * logging the directory after we removed the old entry and + * before we add the new entry, otherwise that task can sync + * a log without any entry for the inode we are renaming and + * therefore replaying that log, if a power failure happens + * after syncing the log, would result in deleting the inode. + * + * If the rename affects two different directories, we want to + * make sure the that there's no log commit that contains + * updates for only one of the directories but not for the + * other. + * + * If we are renaming an entry for a root, we don't care about + * log updates since we called btrfs_set_log_full_commit(). + */ + btrfs_pin_log_trans(root); + btrfs_pin_log_trans(dest); + logs_pinned = true; + } + if (old_dentry->d_parent != new_dentry->d_parent) btrfs_record_unlink_dir(trans, BTRFS_I(old_dir), BTRFS_I(old_inode), true); @@ -8432,7 +8475,7 @@ static int btrfs_rename(struct mnt_idmap *idmap, if (old_inode->i_nlink == 1) BTRFS_I(old_inode)->dir_index = index; - if (old_ino != BTRFS_FIRST_FREE_OBJECTID) + if (logs_pinned) btrfs_log_new_name(trans, old_dentry, BTRFS_I(old_dir), rename_ctx.index, new_dentry->d_parent); @@ -8448,6 +8491,10 @@ static int btrfs_rename(struct mnt_idmap *idmap, } } out_fail: + if (logs_pinned) { + btrfs_end_log_trans(root); + btrfs_end_log_trans(dest); + } ret2 = btrfs_end_transaction(trans); ret = ret ? ret : ret2; out_notrans: -- GitLab From 6c59782898d44a02e935f2bf95916f8d9f0c43c0 Mon Sep 17 00:00:00 2001 From: Mark Harmstone Date: Thu, 29 May 2025 10:37:44 +0100 Subject: [PATCH 1775/2211] btrfs: update superblock's device bytes_used when dropping chunk commit ae4477f937569d097ca5dbce92a89ba384b49bc6 upstream. Each superblock contains a copy of the device item for that device. In a transaction which drops a chunk but doesn't create any new ones, we were correctly updating the device item in the chunk tree but not copying over the new bytes_used value to the superblock. This can be seen by doing the following: # dd if=/dev/zero of=test bs=4096 count=2621440 # mkfs.btrfs test # mount test /root/temp # cd /root/temp # for i in {00..10}; do dd if=/dev/zero of=$i bs=4096 count=32768; done # sync # rm * # sync # btrfs balance start -dusage=0 . # sync # cd # umount /root/temp # btrfs check test For btrfs-check to detect this, you will also need my patch at https://github.com/kdave/btrfs-progs/pull/991. Change btrfs_remove_dev_extents() so that it adds the devices to the fs_info->post_commit_list if they're not there already. This causes btrfs_commit_device_sizes() to be called, which updates the bytes_used value in the superblock. Fixes: bbbf7243d62d ("btrfs: combine device update operations during transaction commit") CC: stable@vger.kernel.org # 5.10+ Reviewed-by: Qu Wenruo Signed-off-by: Mark Harmstone Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Greg Kroah-Hartman --- fs/btrfs/volumes.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 8e65018600010..58e0cac5779dd 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -3268,6 +3268,12 @@ int btrfs_remove_chunk(struct btrfs_trans_handle *trans, u64 chunk_offset) device->bytes_used - dev_extent_len); atomic64_add(dev_extent_len, &fs_info->free_chunk_space); btrfs_clear_space_info_full(fs_info); + + if (list_empty(&device->post_commit_list)) { + list_add_tail(&device->post_commit_list, + &trans->transaction->dev_update_list); + } + mutex_unlock(&fs_info->chunk_mutex); } } -- GitLab From 74b0b4cf13fc0d3198dfcfb433616da642c7629a Mon Sep 17 00:00:00 2001 From: Khairul Anuar Romli Date: Mon, 16 Jun 2025 09:13:53 +0800 Subject: [PATCH 1776/2211] spi: spi-cadence-quadspi: Fix pm runtime unbalance commit b07f349d1864abe29436f45e3047da2bdd476462 upstream. Having PM put sync in remove function is causing PM underflow during remove operation. This is caused by the function, runtime_pm_get_sync, not being called anywhere during the op. Ensure that calls to pm_runtime_enable()/pm_runtime_disable() and pm_runtime_get_sync()/pm_runtime_put_sync() match. echo 108d2000.spi > /sys/bus/platform/drivers/cadence-qspi/unbind [ 49.644256] Deleting MTD partitions on "108d2000.spi.0": [ 49.649575] Deleting u-boot MTD partition [ 49.684087] Deleting root MTD partition [ 49.724188] cadence-qspi 108d2000.spi: Runtime PM usage count underflow! Continuous bind/unbind will result in an "Unbalanced pm_runtime_enable" error. Subsequent unbind attempts will return a "No such device" error, while bind attempts will return a "Resource temporarily unavailable" error. [ 47.592434] cadence-qspi 108d2000.spi: Runtime PM usage count underflow! [ 49.592233] cadence-qspi 108d2000.spi: detected FIFO depth (1024) different from config (128) [ 53.232309] cadence-qspi 108d2000.spi: Runtime PM usage count underflow! [ 55.828550] cadence-qspi 108d2000.spi: detected FIFO depth (1024) different from config (128) [ 57.940627] cadence-qspi 108d2000.spi: Runtime PM usage count underflow! [ 59.912490] cadence-qspi 108d2000.spi: detected FIFO depth (1024) different from config (128) [ 61.876243] cadence-qspi 108d2000.spi: Runtime PM usage count underflow! [ 61.883000] platform 108d2000.spi: Unbalanced pm_runtime_enable! [ 532.012270] cadence-qspi 108d2000.spi: probe with driver cadence-qspi failed1 Also, change clk_disable_unprepare() to clk_disable() since continuous bind and unbind operations will trigger a warning indicating that the clock is already unprepared. Fixes: 4892b374c9b7 ("mtd: spi-nor: cadence-quadspi: Add runtime PM support") cc: stable@vger.kernel.org # 6.6+ Signed-off-by: Khairul Anuar Romli Reviewed-by: Matthew Gerlach Link: https://patch.msgid.link/4e7a4b8aba300e629b45a04f90bddf665fbdb335.1749601877.git.khairul.anuar.romli@altera.com Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- drivers/spi/spi-cadence-quadspi.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/spi/spi-cadence-quadspi.c b/drivers/spi/spi-cadence-quadspi.c index f9463f263fba1..12f8073cb5968 100644 --- a/drivers/spi/spi-cadence-quadspi.c +++ b/drivers/spi/spi-cadence-quadspi.c @@ -1929,10 +1929,10 @@ static int cqspi_probe(struct platform_device *pdev) goto probe_setup_failed; } - ret = devm_pm_runtime_enable(dev); - if (ret) { - if (cqspi->rx_chan) - dma_release_channel(cqspi->rx_chan); + pm_runtime_enable(dev); + + if (cqspi->rx_chan) { + dma_release_channel(cqspi->rx_chan); goto probe_setup_failed; } @@ -1952,6 +1952,7 @@ static int cqspi_probe(struct platform_device *pdev) return 0; probe_setup_failed: cqspi_controller_enable(cqspi, 0); + pm_runtime_disable(dev); probe_reset_failed: if (cqspi->is_jh7110) cqspi_jh7110_disable_clk(pdev, cqspi); @@ -1970,7 +1971,8 @@ static void cqspi_remove(struct platform_device *pdev) if (cqspi->rx_chan) dma_release_channel(cqspi->rx_chan); - clk_disable_unprepare(cqspi->clk); + if (pm_runtime_get_sync(&pdev->dev) >= 0) + clk_disable(cqspi->clk); if (cqspi->is_jh7110) cqspi_jh7110_disable_clk(pdev, cqspi); -- GitLab From db0035ec7a6bba261eb80e2a50b39315fcc6ade6 Mon Sep 17 00:00:00 2001 From: Jiawen Wu Date: Wed, 25 Jun 2025 10:39:24 +0800 Subject: [PATCH 1777/2211] net: libwx: fix the creation of page_pool commit 85720e04d9af0b77f8092b12a06661a8d459d4a0 upstream. 'rx_ring->size' means the count of ring descriptors multiplied by the size of one descriptor. When increasing the count of ring descriptors, it may exceed the limit of pool size. [ 864.209610] page_pool_create_percpu() gave up with errno -7 [ 864.209613] txgbe 0000:11:00.0: Page pool creation failed: -7 Fix to set the pool_size to the count of ring descriptors. Fixes: 850b971110b2 ("net: libwx: Allocate Rx and Tx resources") Cc: stable@vger.kernel.org Signed-off-by: Jiawen Wu Reviewed-by: Simon Horman Reviewed-by: Mina Almasry Link: https://patch.msgid.link/434C72BFB40E350A+20250625023924.21821-1-jiawenwu@trustnetic.com Signed-off-by: Paolo Abeni Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/wangxun/libwx/wx_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.c b/drivers/net/ethernet/wangxun/libwx/wx_lib.c index 71c891d14fb62..8450856cc4abd 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c +++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c @@ -2425,7 +2425,7 @@ static int wx_alloc_page_pool(struct wx_ring *rx_ring) struct page_pool_params pp_params = { .flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV, .order = 0, - .pool_size = rx_ring->size, + .pool_size = rx_ring->count, .nid = dev_to_node(rx_ring->dev), .dev = rx_ring->dev, .dma_dir = DMA_FROM_DEVICE, -- GitLab From cf95f8426f889949b738f51ffcd72884411f3a6a Mon Sep 17 00:00:00 2001 From: "Liam R. Howlett" Date: Mon, 16 Jun 2025 14:45:20 -0400 Subject: [PATCH 1778/2211] maple_tree: fix MA_STATE_PREALLOC flag in mas_preallocate() commit fba46a5d83ca8decb338722fb4899026d8d9ead2 upstream. Temporarily clear the preallocation flag when explicitly requesting allocations. Pre-existing allocations are already counted against the request through mas_node_count_gfp(), but the allocations will not happen if the MA_STATE_PREALLOC flag is set. This flag is meant to avoid re-allocating in bulk allocation mode, and to detect issues with preallocation calculations. The MA_STATE_PREALLOC flag should also always be set on zero allocations so that detection of underflow allocations will print a WARN_ON() during consumption. User visible effect of this flaw is a WARN_ON() followed by a null pointer dereference when subsequent requests for larger number of nodes is ignored, such as the vma merge retry in mmap_region() caused by drivers altering the vma flags (which happens in v6.6, at least) Link: https://lkml.kernel.org/r/20250616184521.3382795-3-Liam.Howlett@oracle.com Fixes: 54a611b60590 ("Maple Tree: add new data structure") Signed-off-by: Liam R. Howlett Reported-by: Zhaoyang Huang Reported-by: Hailong Liu Link: https://lore.kernel.org/all/1652f7eb-a51b-4fee-8058-c73af63bacd1@oppo.com/ Link: https://lore.kernel.org/all/20250428184058.1416274-1-Liam.Howlett@oracle.com/ Link: https://lore.kernel.org/all/20250429014754.1479118-1-Liam.Howlett@oracle.com/ Cc: Lorenzo Stoakes Cc: Suren Baghdasaryan Cc: Hailong Liu Cc: zhangpeng.00@bytedance.com Cc: Steve Kang Cc: Matthew Wilcox Cc: Sidhartha Kumar Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- lib/maple_tree.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 8d73ccf66f3aa..44441ec5b0aff 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -5542,8 +5542,9 @@ int mas_preallocate(struct ma_state *mas, void *entry, gfp_t gfp) mas_wr_store_type(&wr_mas); request = mas_prealloc_calc(mas, entry); if (!request) - return ret; + goto set_flag; + mas->mas_flags &= ~MA_STATE_PREALLOC; mas_node_count_gfp(mas, request, gfp); if (mas_is_err(mas)) { mas_set_alloc_req(mas, 0); @@ -5553,6 +5554,7 @@ int mas_preallocate(struct ma_state *mas, void *entry, gfp_t gfp) return ret; } +set_flag: mas->mas_flags |= MA_STATE_PREALLOC; return ret; } -- GitLab From 7b4ac8433c7d6682c7f770dce222999bd28335c1 Mon Sep 17 00:00:00 2001 From: David Hildenbrand Date: Wed, 11 Jun 2025 15:13:14 +0200 Subject: [PATCH 1779/2211] mm/gup: revert "mm: gup: fix infinite loop within __get_longterm_locked" commit 517f496e1e61bd169d585dab4dd77e7147506322 upstream. After commit 1aaf8c122918 ("mm: gup: fix infinite loop within __get_longterm_locked") we are able to longterm pin folios that are not supposed to get longterm pinned, simply because they temporarily have the LRU flag cleared (esp. temporarily isolated). For example, two __get_longterm_locked() callers can race, or __get_longterm_locked() can race with anything else that temporarily isolates folios. The introducing commit mentions the use case of a driver that uses vm_ops->fault to insert pages allocated through cma_alloc() into the page tables, assuming they can later get longterm pinned. These pages/ folios would never have the LRU flag set and consequently cannot get isolated. There is no known in-tree user making use of that so far, fortunately. To handle that in the future -- and avoid retrying forever to isolate/migrate them -- we will need a different mechanism for the CMA area *owner* to indicate that it actually already allocated the page and is fine with longterm pinning it. The LRU flag is not suitable for that. Probably we can lookup the relevant CMA area and query the bitmap; we only have have to care about some races, probably. If already allocated, we could just allow longterm pinning) Anyhow, let's fix the "must not be longterm pinned" problem first by reverting the original commit. Link: https://lkml.kernel.org/r/20250611131314.594529-1-david@redhat.com Fixes: 1aaf8c122918 ("mm: gup: fix infinite loop within __get_longterm_locked") Signed-off-by: David Hildenbrand Closes: https://lore.kernel.org/all/20250522092755.GA3277597@tiffany/ Reported-by: Hyesoo Yu Reviewed-by: John Hubbard Cc: Jason Gunthorpe Cc: Peter Xu Cc: Zhaoyang Huang Cc: Aijun Sun Cc: Alistair Popple Cc: Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- mm/gup.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/mm/gup.c b/mm/gup.c index 90866b827b60f..e323843cc5dd8 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -2326,13 +2326,13 @@ static void pofs_unpin(struct pages_or_folios *pofs) /* * Returns the number of collected folios. Return value is always >= 0. */ -static void collect_longterm_unpinnable_folios( +static unsigned long collect_longterm_unpinnable_folios( struct list_head *movable_folio_list, struct pages_or_folios *pofs) { + unsigned long i, collected = 0; struct folio *prev_folio = NULL; bool drain_allow = true; - unsigned long i; for (i = 0; i < pofs->nr_entries; i++) { struct folio *folio = pofs_get_folio(pofs, i); @@ -2344,6 +2344,8 @@ static void collect_longterm_unpinnable_folios( if (folio_is_longterm_pinnable(folio)) continue; + collected++; + if (folio_is_device_coherent(folio)) continue; @@ -2365,6 +2367,8 @@ static void collect_longterm_unpinnable_folios( NR_ISOLATED_ANON + folio_is_file_lru(folio), folio_nr_pages(folio)); } + + return collected; } /* @@ -2441,9 +2445,11 @@ static long check_and_migrate_movable_pages_or_folios(struct pages_or_folios *pofs) { LIST_HEAD(movable_folio_list); + unsigned long collected; - collect_longterm_unpinnable_folios(&movable_folio_list, pofs); - if (list_empty(&movable_folio_list)) + collected = collect_longterm_unpinnable_folios(&movable_folio_list, + pofs); + if (!collected) return 0; return migrate_longterm_unpinnable_folios(&movable_folio_list, pofs); -- GitLab From c465f523333ecc5d89934ed03835fbdbfd9e4c14 Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Thu, 5 Jun 2025 11:26:33 +0800 Subject: [PATCH 1780/2211] f2fs: fix to zero post-eof page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit ba8dac350faf16afc129ce6303ca4feaf083ccb1 upstream. fstest reports a f2fs bug: #generic/363 42s ... [failed, exit status 1]- output mismatch (see /share/git/fstests/results//generic/363.out.bad) # --- tests/generic/363.out 2025-01-12 21:57:40.271440542 +0800 # +++ /share/git/fstests/results//generic/363.out.bad 2025-05-19 19:55:58.000000000 +0800 # @@ -1,2 +1,78 @@ # QA output created by 363 # fsx -q -S 0 -e 1 -N 100000 # +READ BAD DATA: offset = 0xd6fb, size = 0xf044, fname = /mnt/f2fs/junk # +OFFSET GOOD BAD RANGE # +0x1540d 0x0000 0x2a25 0x0 # +operation# (mod 256) for the bad data may be 37 # +0x1540e 0x0000 0x2527 0x1 # ... # (Run 'diff -u /share/git/fstests/tests/generic/363.out /share/git/fstests/results//generic/363.out.bad' to see the entire diff) Ran: generic/363 Failures: generic/363 Failed 1 of 1 tests The root cause is user can update post-eof page via mmap [1], however, f2fs missed to zero post-eof page in below operations, so, once it expands i_size, then it will include dummy data locates previous post-eof page, so during below operations, we need to zero post-eof page. Operations which can include dummy data after previous i_size after expanding i_size: - write - mapwrite [1] - truncate - fallocate * preallocate * zero_range * insert_range * collapse_range - clone_range (doesn’t support in f2fs) - copy_range (doesn’t support in f2fs) [1] https://man7.org/linux/man-pages/man2/mmap.2.html 'BUG section' Cc: stable@kernel.org Signed-off-by: Chao Yu Reviewed-by: Zhiguo Niu Signed-off-by: Jaegeuk Kim Signed-off-by: Greg Kroah-Hartman --- fs/f2fs/file.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 71ddecaf771f8..02f438cd6bfaf 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -35,6 +35,17 @@ #include #include +static void f2fs_zero_post_eof_page(struct inode *inode, loff_t new_size) +{ + loff_t old_size = i_size_read(inode); + + if (old_size >= new_size) + return; + + /* zero or drop pages only in range of [old_size, new_size] */ + truncate_pagecache(inode, old_size); +} + static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf) { struct inode *inode = file_inode(vmf->vma->vm_file); @@ -103,8 +114,13 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); + filemap_invalidate_lock(inode->i_mapping); + f2fs_zero_post_eof_page(inode, (folio->index + 1) << PAGE_SHIFT); + filemap_invalidate_unlock(inode->i_mapping); + file_update_time(vmf->vma->vm_file); filemap_invalidate_lock_shared(inode->i_mapping); + folio_lock(folio); if (unlikely(folio->mapping != inode->i_mapping || folio_pos(folio) > i_size_read(inode) || @@ -1064,6 +1080,8 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, f2fs_down_write(&fi->i_gc_rwsem[WRITE]); filemap_invalidate_lock(inode->i_mapping); + if (attr->ia_size > old_size) + f2fs_zero_post_eof_page(inode, attr->ia_size); truncate_setsize(inode, attr->ia_size); if (attr->ia_size <= old_size) @@ -1182,6 +1200,10 @@ static int f2fs_punch_hole(struct inode *inode, loff_t offset, loff_t len) if (ret) return ret; + filemap_invalidate_lock(inode->i_mapping); + f2fs_zero_post_eof_page(inode, offset + len); + filemap_invalidate_unlock(inode->i_mapping); + pg_start = ((unsigned long long) offset) >> PAGE_SHIFT; pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT; @@ -1465,6 +1487,8 @@ static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len) f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); filemap_invalidate_lock(inode->i_mapping); + f2fs_zero_post_eof_page(inode, offset + len); + f2fs_lock_op(sbi); f2fs_drop_extent_tree(inode); truncate_pagecache(inode, offset); @@ -1586,6 +1610,10 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len, if (ret) return ret; + filemap_invalidate_lock(mapping); + f2fs_zero_post_eof_page(inode, offset + len); + filemap_invalidate_unlock(mapping); + pg_start = ((unsigned long long) offset) >> PAGE_SHIFT; pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT; @@ -1717,6 +1745,8 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len) /* avoid gc operation during block exchange */ f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); filemap_invalidate_lock(mapping); + + f2fs_zero_post_eof_page(inode, offset + len); truncate_pagecache(inode, offset); while (!ret && idx > pg_start) { @@ -1774,6 +1804,10 @@ static int f2fs_expand_inode_data(struct inode *inode, loff_t offset, if (err) return err; + filemap_invalidate_lock(inode->i_mapping); + f2fs_zero_post_eof_page(inode, offset + len); + filemap_invalidate_unlock(inode->i_mapping); + f2fs_balance_fs(sbi, true); pg_start = ((unsigned long long)offset) >> PAGE_SHIFT; @@ -4715,6 +4749,10 @@ static ssize_t f2fs_write_checks(struct kiocb *iocb, struct iov_iter *from) err = file_modified(file); if (err) return err; + + filemap_invalidate_lock(inode->i_mapping); + f2fs_zero_post_eof_page(inode, iocb->ki_pos + iov_iter_count(from)); + filemap_invalidate_unlock(inode->i_mapping); return count; } -- GitLab From 4b4b639cc50a8101c27a64c3fb63449c1393583e Mon Sep 17 00:00:00 2001 From: Iusico Maxim Date: Thu, 5 Jun 2025 19:55:50 +0200 Subject: [PATCH 1781/2211] HID: lenovo: Restrict F7/9/11 mode to compact keyboards only commit 9327e3ee5b077c4ab4495a09b67624f670ed88b6 upstream. Commit 2f2bd7cbd1d1 ("hid: lenovo: Resend all settings on reset_resume for compact keyboards") introduced a regression for ThinkPad TrackPoint Keyboard II by removing the conditional check for enabling F7/9/11 mode needed for compact keyboards only. As a result, the non-compact keyboards can no longer toggle Fn-lock via Fn+Esc, although it can be controlled via sysfs knob that directly sends raw commands. This patch restores the previous conditional check without any additions. Cc: stable@vger.kernel.org Fixes: 2f2bd7cbd1d1 ("hid: lenovo: Resend all settings on reset_resume for compact keyboards") Signed-off-by: Iusico Maxim Signed-off-by: Jiri Kosina Signed-off-by: Greg Kroah-Hartman --- drivers/hid/hid-lenovo.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c index f66194fde8912..56e530860caef 100644 --- a/drivers/hid/hid-lenovo.c +++ b/drivers/hid/hid-lenovo.c @@ -529,11 +529,14 @@ static void lenovo_features_set_cptkbd(struct hid_device *hdev) /* * Tell the keyboard a driver understands it, and turn F7, F9, F11 into - * regular keys + * regular keys (Compact only) */ - ret = lenovo_send_cmd_cptkbd(hdev, 0x01, 0x03); - if (ret) - hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret); + if (hdev->product == USB_DEVICE_ID_LENOVO_CUSBKBD || + hdev->product == USB_DEVICE_ID_LENOVO_CBTKBD) { + ret = lenovo_send_cmd_cptkbd(hdev, 0x01, 0x03); + if (ret) + hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret); + } /* Switch middle button to native mode */ ret = lenovo_send_cmd_cptkbd(hdev, 0x09, 0x01); -- GitLab From a85999b9876543aa9b7a204ee2a660e1d1806262 Mon Sep 17 00:00:00 2001 From: Qasim Ijaz Date: Fri, 6 Jun 2025 19:49:57 +0100 Subject: [PATCH 1782/2211] HID: wacom: fix memory leak on kobject creation failure commit 5ae416c5b1e2e816aee7b3fc8347adf70afabb4c upstream. During wacom_initialize_remotes() a fifo buffer is allocated with kfifo_alloc() and later a cleanup action is registered during devm_add_action_or_reset() to clean it up. However if the code fails to create a kobject and register it with sysfs the code simply returns -ENOMEM before the cleanup action is registered leading to a memory leak. Fix this by ensuring the fifo is freed when the kobject creation and registration process fails. Fixes: 83e6b40e2de6 ("HID: wacom: EKR: have the wacom resources dynamically allocated") Reviewed-by: Ping Cheng Cc: stable@vger.kernel.org Signed-off-by: Qasim Ijaz Signed-off-by: Jiri Kosina Signed-off-by: Greg Kroah-Hartman --- drivers/hid/wacom_sys.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index 64afaa243942c..53517bcb6a352 100644 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c @@ -2021,8 +2021,10 @@ static int wacom_initialize_remotes(struct wacom *wacom) remote->remote_dir = kobject_create_and_add("wacom_remote", &wacom->hdev->dev.kobj); - if (!remote->remote_dir) + if (!remote->remote_dir) { + kfifo_free(&remote->remote_fifo); return -ENOMEM; + } error = sysfs_create_files(remote->remote_dir, remote_unpair_attrs); -- GitLab From 2746d020667ef384765004c74c9f22a589a1682e Mon Sep 17 00:00:00 2001 From: Qasim Ijaz Date: Fri, 6 Jun 2025 19:49:58 +0100 Subject: [PATCH 1783/2211] HID: wacom: fix memory leak on sysfs attribute creation failure commit 1a19ae437ca5d5c7d9ec2678946fb339b1c706bf upstream. When sysfs_create_files() fails during wacom_initialize_remotes() the fifo buffer is not freed leading to a memory leak. Fix this by calling kfifo_free() before returning. Fixes: 83e6b40e2de6 ("HID: wacom: EKR: have the wacom resources dynamically allocated") Reviewed-by: Ping Cheng Cc: stable@vger.kernel.org Signed-off-by: Qasim Ijaz Signed-off-by: Jiri Kosina Signed-off-by: Greg Kroah-Hartman --- drivers/hid/wacom_sys.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index 53517bcb6a352..55bd8829d27ee 100644 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c @@ -2031,6 +2031,7 @@ static int wacom_initialize_remotes(struct wacom *wacom) if (error) { hid_err(wacom->hdev, "cannot create sysfs group err: %d\n", error); + kfifo_free(&remote->remote_fifo); return error; } -- GitLab From 70017f56b12077f7f066395390c349af8b8d9fbb Mon Sep 17 00:00:00 2001 From: Qasim Ijaz Date: Fri, 6 Jun 2025 19:49:59 +0100 Subject: [PATCH 1784/2211] HID: wacom: fix kobject reference count leak commit 85a720f4337f0ddf1603c8b75a8f1ffbbe022ef9 upstream. When sysfs_create_files() fails in wacom_initialize_remotes() the error is returned and the cleanup action will not have been registered yet. As a result the kobject???s refcount is never dropped, so the kobject can never be freed leading to a reference leak. Fix this by calling kobject_put() before returning. Fixes: 83e6b40e2de6 ("HID: wacom: EKR: have the wacom resources dynamically allocated") Acked-by: Ping Cheng Cc: stable@vger.kernel.org Signed-off-by: Qasim Ijaz Signed-off-by: Jiri Kosina Signed-off-by: Greg Kroah-Hartman --- drivers/hid/wacom_sys.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index 55bd8829d27ee..1b1112772777c 100644 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c @@ -2032,6 +2032,7 @@ static int wacom_initialize_remotes(struct wacom *wacom) hid_err(wacom->hdev, "cannot create sysfs group err: %d\n", error); kfifo_free(&remote->remote_fifo); + kobject_put(remote->remote_dir); return error; } -- GitLab From 19a47c966deb36624843b7301f0373a3dc541a05 Mon Sep 17 00:00:00 2001 From: Chen Yu Date: Wed, 4 Jun 2025 12:25:56 +0800 Subject: [PATCH 1785/2211] scsi: megaraid_sas: Fix invalid node index commit 752eb816b55adb0673727ba0ed96609a17895654 upstream. On a system with DRAM interleave enabled, out-of-bound access is detected: megaraid_sas 0000:3f:00.0: requested/available msix 128/128 poll_queue 0 ------------[ cut here ]------------ UBSAN: array-index-out-of-bounds in ./arch/x86/include/asm/topology.h:72:28 index -1 is out of range for type 'cpumask *[1024]' dump_stack_lvl+0x5d/0x80 ubsan_epilogue+0x5/0x2b __ubsan_handle_out_of_bounds.cold+0x46/0x4b megasas_alloc_irq_vectors+0x149/0x190 [megaraid_sas] megasas_probe_one.cold+0xa4d/0x189c [megaraid_sas] local_pci_probe+0x42/0x90 pci_device_probe+0xdc/0x290 really_probe+0xdb/0x340 __driver_probe_device+0x78/0x110 driver_probe_device+0x1f/0xa0 __driver_attach+0xba/0x1c0 bus_for_each_dev+0x8b/0xe0 bus_add_driver+0x142/0x220 driver_register+0x72/0xd0 megasas_init+0xdf/0xff0 [megaraid_sas] do_one_initcall+0x57/0x310 do_init_module+0x90/0x250 init_module_from_file+0x85/0xc0 idempotent_init_module+0x114/0x310 __x64_sys_finit_module+0x65/0xc0 do_syscall_64+0x82/0x170 entry_SYSCALL_64_after_hwframe+0x76/0x7e Fix it accordingly. Signed-off-by: Chen Yu Link: https://lore.kernel.org/r/20250604042556.3731059-1-yu.c.chen@intel.com Fixes: 8049da6f3943 ("scsi: megaraid_sas: Use irq_set_affinity_and_hint()") Cc: stable@vger.kernel.org Signed-off-by: Martin K. Petersen Signed-off-by: Greg Kroah-Hartman --- drivers/scsi/megaraid/megaraid_sas_base.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index 21f22e913cd08..8a44e01ebf9b6 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c @@ -5910,7 +5910,11 @@ megasas_set_high_iops_queue_affinity_and_hint(struct megasas_instance *instance) const struct cpumask *mask; if (instance->perf_mode == MR_BALANCED_PERF_MODE) { - mask = cpumask_of_node(dev_to_node(&instance->pdev->dev)); + int nid = dev_to_node(&instance->pdev->dev); + + if (nid == NUMA_NO_NODE) + nid = 0; + mask = cpumask_of_node(nid); for (i = 0; i < instance->low_latency_index_start; i++) { irq = pci_irq_vector(instance->pdev, i); -- GitLab From 6a87e794046f5db667acc99c671781102b28931b Mon Sep 17 00:00:00 2001 From: anvithdosapati Date: Mon, 16 Jun 2025 08:57:34 +0000 Subject: [PATCH 1786/2211] scsi: ufs: core: Fix clk scaling to be conditional in reset and restore commit 2e083cd802294693a5414e4557a183dd7e442e71 upstream. In ufshcd_host_reset_and_restore(), scale up clocks only when clock scaling is supported. Without this change CPU latency is voted for 0 (ufshcd_pm_qos_update) during resume unconditionally. Signed-off-by: anvithdosapati Link: https://lore.kernel.org/r/20250616085734.2133581-1-anvithdosapati@google.com Fixes: a3cd5ec55f6c ("scsi: ufs: add load based scaling of UFS gear") Cc: stable@vger.kernel.org Reviewed-by: Bart Van Assche Signed-off-by: Martin K. Petersen Signed-off-by: Greg Kroah-Hartman --- drivers/ufs/core/ufshcd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index c5cef57e64ce3..a6299cb19237c 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -7743,7 +7743,8 @@ static int ufshcd_host_reset_and_restore(struct ufs_hba *hba) hba->silence_err_logs = false; /* scale up clocks to max frequency before full reinitialization */ - ufshcd_scale_clks(hba, ULONG_MAX, true); + if (ufshcd_is_clkscaling_supported(hba)) + ufshcd_scale_clks(hba, ULONG_MAX, true); err = ufshcd_hba_enable(hba); -- GitLab From 3d379b2a732824f32799a4477d5e4fa82f84a415 Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Mon, 24 Mar 2025 10:44:09 +0100 Subject: [PATCH 1787/2211] drm/ast: Fix comment on modeset lock commit 7cce65f3789e04c0f7668a66563e680d81d54493 upstream. The ast driver protects the commit tail against concurrent reads of the display modes by acquiring a lock. The comment is misleading as the lock is not released in atomic_flush, but at the end of the commit-tail helper. Rewrite the comment. Signed-off-by: Thomas Zimmermann Fixes: 1fe182154984 ("drm/ast: Acquire I/O-register lock in atomic_commit_tail function") Cc: Thomas Zimmermann Cc: Jocelyn Falempe Cc: Dave Airlie Cc: dri-devel@lists.freedesktop.org Cc: # v6.2+ Reviewed-by: Jocelyn Falempe Link: https://lore.kernel.org/r/20250324094520.192974-2-tzimmermann@suse.de Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/ast/ast_mode.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index 24ed1cd3caf17..162dc0698f4ac 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c @@ -1319,9 +1319,9 @@ static void ast_mode_config_helper_atomic_commit_tail(struct drm_atomic_state *s /* * Concurrent operations could possibly trigger a call to - * drm_connector_helper_funcs.get_modes by trying to read the - * display modes. Protect access to I/O registers by acquiring - * the I/O-register lock. Released in atomic_flush(). + * drm_connector_helper_funcs.get_modes by reading the display + * modes. Protect access to registers by acquiring the modeset + * lock. */ mutex_lock(&ast->modeset_lock); drm_atomic_helper_commit_tail(state); -- GitLab From 2dae4a71a13650496576bd77b145d7a21a149f96 Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Fri, 28 Mar 2025 10:17:05 +0100 Subject: [PATCH 1788/2211] drm/cirrus-qemu: Fix pitch programming commit 4bfb389a0136a13f0802eeb5e97a0e76d88f77ae upstream. Do not set CR1B[6] when programming the pitch. The bit effects VGA text mode and is not interpreted by qemu. [1] It has no affect on the scanline pitch. The scanline bit that is set into CR1B[6] belongs into CR13[7], which the driver sets up correctly. This bug goes back to the driver's initial commit. Signed-off-by: Thomas Zimmermann Acked-by: Gerd Hoffmann Link: https://gitlab.com/qemu-project/qemu/-/blob/stable-9.2/hw/display/cirrus_vga.c?ref_type=heads#L1112 # 1 Fixes: f9aa76a85248 ("drm/kms: driver for virtual cirrus under qemu") Cc: Adam Jackson Cc: Dave Airlie Cc: Maarten Lankhorst Cc: Maxime Ripard Cc: Thomas Zimmermann Cc: # v3.5+ Link: https://lore.kernel.org/r/20250328091821.195061-2-tzimmermann@suse.de Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/tiny/cirrus.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/gpu/drm/tiny/cirrus.c b/drivers/gpu/drm/tiny/cirrus.c index 751326e3d9c37..c7e81f2610f8c 100644 --- a/drivers/gpu/drm/tiny/cirrus.c +++ b/drivers/gpu/drm/tiny/cirrus.c @@ -318,7 +318,6 @@ static void cirrus_pitch_set(struct cirrus_device *cirrus, unsigned int pitch) /* Enable extended blanking and pitch bits, and enable full memory */ cr1b = 0x22; cr1b |= (pitch >> 7) & 0x10; - cr1b |= (pitch >> 6) & 0x40; wreg_crt(cirrus, 0x1b, cr1b); cirrus_set_start_address(cirrus, 0); -- GitLab From b464edc12d5bd4347b0c9866d32e3594fa8ad4be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ADra=20Canal?= Date: Mon, 2 Jun 2025 10:22:16 -0300 Subject: [PATCH 1789/2211] drm/etnaviv: Protect the scheduler's pending list with its lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 61ee19dedb8d753249e20308782bf4e9e2fb7344 upstream. Commit 704d3d60fec4 ("drm/etnaviv: don't block scheduler when GPU is still active") ensured that active jobs are returned to the pending list when extending the timeout. However, it didn't use the pending list's lock to manipulate the list, which causes a race condition as the scheduler's workqueues are running. Hold the lock while manipulating the scheduler's pending list to prevent a race. Cc: stable@vger.kernel.org Fixes: 704d3d60fec4 ("drm/etnaviv: don't block scheduler when GPU is still active") Reported-by: Philipp Stanner Closes: https://lore.kernel.org/dri-devel/964e59ba1539083ef29b06d3c78f5e2e9b138ab8.camel@mailbox.org/ Reviewed-by: Lucas Stach Reviewed-by: Philipp Stanner Link: https://lore.kernel.org/r/20250602132240.93314-1-mcanal@igalia.com Signed-off-by: Maíra Canal Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/etnaviv/etnaviv_sched.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_sched.c b/drivers/gpu/drm/etnaviv/etnaviv_sched.c index ab9ca4824b62e..e60288af35027 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_sched.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_sched.c @@ -34,6 +34,7 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_job(struct drm_sched_job *sched_job) { struct etnaviv_gem_submit *submit = to_etnaviv_submit(sched_job); + struct drm_gpu_scheduler *sched = sched_job->sched; struct etnaviv_gpu *gpu = submit->gpu; u32 dma_addr; int change; @@ -76,7 +77,9 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_job(struct drm_sched_job return DRM_GPU_SCHED_STAT_NOMINAL; out_no_timeout: - list_add(&sched_job->list, &sched_job->sched->pending_list); + spin_lock(&sched->job_list_lock); + list_add(&sched_job->list, &sched->pending_list); + spin_unlock(&sched->job_list_lock); return DRM_GPU_SCHED_STAT_NOMINAL; } -- GitLab From 7271a32074ebfb0853c2e7b6819c3502fb99d8c1 Mon Sep 17 00:00:00 2001 From: Thierry Reding Date: Mon, 21 Apr 2025 11:13:05 -0500 Subject: [PATCH 1790/2211] drm/tegra: Assign plane type before registration commit 9ff4fdf4f44b69237c0afc1d3a8dac916ce66f3e upstream. Changes to a plane's type after it has been registered aren't propagated to userspace automatically. This could possibly be achieved by updating the property, but since we can already determine which type this should be before the registration, passing in the right type from the start is a much better solution. Suggested-by: Aaron Kling Signed-off-by: Thierry Reding Cc: stable@vger.kernel.org Fixes: 473079549f27 ("drm/tegra: dc: Add Tegra186 support") Signed-off-by: Aaron Kling Signed-off-by: Thierry Reding Link: https://lore.kernel.org/r/20250421-tegra-drm-primary-v2-1-7f740c4c2121@gmail.com Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/tegra/dc.c | 12 ++++++++---- drivers/gpu/drm/tegra/hub.c | 4 ++-- drivers/gpu/drm/tegra/hub.h | 3 ++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index be61c9d1a4f0e..b584ce6d10d94 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c @@ -1320,10 +1320,16 @@ static struct drm_plane *tegra_dc_add_shared_planes(struct drm_device *drm, if (wgrp->dc == dc->pipe) { for (j = 0; j < wgrp->num_windows; j++) { unsigned int index = wgrp->windows[j]; + enum drm_plane_type type; + + if (primary) + type = DRM_PLANE_TYPE_OVERLAY; + else + type = DRM_PLANE_TYPE_PRIMARY; plane = tegra_shared_plane_create(drm, dc, wgrp->index, - index); + index, type); if (IS_ERR(plane)) return plane; @@ -1331,10 +1337,8 @@ static struct drm_plane *tegra_dc_add_shared_planes(struct drm_device *drm, * Choose the first shared plane owned by this * head as the primary plane. */ - if (!primary) { - plane->type = DRM_PLANE_TYPE_PRIMARY; + if (!primary) primary = plane; - } } } } diff --git a/drivers/gpu/drm/tegra/hub.c b/drivers/gpu/drm/tegra/hub.c index e0c2019a591b1..3507dd6e90234 100644 --- a/drivers/gpu/drm/tegra/hub.c +++ b/drivers/gpu/drm/tegra/hub.c @@ -755,9 +755,9 @@ static const struct drm_plane_helper_funcs tegra_shared_plane_helper_funcs = { struct drm_plane *tegra_shared_plane_create(struct drm_device *drm, struct tegra_dc *dc, unsigned int wgrp, - unsigned int index) + unsigned int index, + enum drm_plane_type type) { - enum drm_plane_type type = DRM_PLANE_TYPE_OVERLAY; struct tegra_drm *tegra = drm->dev_private; struct tegra_display_hub *hub = tegra->hub; struct tegra_shared_plane *plane; diff --git a/drivers/gpu/drm/tegra/hub.h b/drivers/gpu/drm/tegra/hub.h index 23c4b2115ed1e..a66f18c4facc9 100644 --- a/drivers/gpu/drm/tegra/hub.h +++ b/drivers/gpu/drm/tegra/hub.h @@ -80,7 +80,8 @@ void tegra_display_hub_cleanup(struct tegra_display_hub *hub); struct drm_plane *tegra_shared_plane_create(struct drm_device *drm, struct tegra_dc *dc, unsigned int wgrp, - unsigned int index); + unsigned int index, + enum drm_plane_type type); int tegra_display_hub_atomic_check(struct drm_device *drm, struct drm_atomic_state *state); -- GitLab From 31ac2c680a8ac11dc54a5b339a07e138bcedd924 Mon Sep 17 00:00:00 2001 From: Qiu-ji Chen Date: Wed, 6 Nov 2024 17:59:06 +0800 Subject: [PATCH 1791/2211] drm/tegra: Fix a possible null pointer dereference commit 780351a5f61416ed2ba1199cc57e4a076fca644d upstream. In tegra_crtc_reset(), new memory is allocated with kzalloc(), but no check is performed. Before calling __drm_atomic_helper_crtc_reset, state should be checked to prevent possible null pointer dereference. Fixes: b7e0b04ae450 ("drm/tegra: Convert to using __drm_atomic_helper_crtc_reset() for reset.") Cc: stable@vger.kernel.org Signed-off-by: Qiu-ji Chen Signed-off-by: Thierry Reding Link: https://lore.kernel.org/r/20241106095906.15247-1-chenqiuji666@gmail.com Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/tegra/dc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index b584ce6d10d94..51ca78551b57e 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c @@ -1392,7 +1392,10 @@ static void tegra_crtc_reset(struct drm_crtc *crtc) if (crtc->state) tegra_crtc_atomic_destroy_state(crtc, crtc->state); - __drm_atomic_helper_crtc_reset(crtc, &state->base); + if (state) + __drm_atomic_helper_crtc_reset(crtc, &state->base); + else + __drm_atomic_helper_crtc_reset(crtc, NULL); } static struct drm_crtc_state * -- GitLab From 4da83f06c3ed7453d4c0bb3547f7c7b5b15ba654 Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Mon, 3 Mar 2025 15:52:56 +0100 Subject: [PATCH 1792/2211] drm/udl: Unregister device before cleaning up on disconnect commit ff9cb6d2035c586ea7c8f1754d4409eec7a2d26d upstream. Disconnecting a DisplayLink device results in the following kernel error messages [ 93.041748] [drm:udl_urb_completion [udl]] *ERROR* udl_urb_completion - nonzero write bulk status received: -115 [ 93.055299] [drm:udl_submit_urb [udl]] *ERROR* usb_submit_urb error fffffffe [ 93.065363] [drm:udl_urb_completion [udl]] *ERROR* udl_urb_completion - nonzero write bulk status received: -115 [ 93.078207] [drm:udl_submit_urb [udl]] *ERROR* usb_submit_urb error fffffffe coming from KMS poll helpers. Shutting down poll helpers runs them one final time when the USB device is already gone. Run drm_dev_unplug() first in udl's USB disconnect handler. Udl's polling code already handles disconnects gracefully if the device has been marked as unplugged. Signed-off-by: Thomas Zimmermann Fixes: b1a981bd5576 ("drm/udl: drop drm_driver.release hook") Cc: dri-devel@lists.freedesktop.org Cc: # v5.8+ Reviewed-by: Patrik Jakobsson Link: https://patchwork.freedesktop.org/patch/msgid/20250303145604.62962-2-tzimmermann@suse.de Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/udl/udl_drv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c index 280a09a6e2ad7..0f712eb685ba2 100644 --- a/drivers/gpu/drm/udl/udl_drv.c +++ b/drivers/gpu/drm/udl/udl_drv.c @@ -126,9 +126,9 @@ static void udl_usb_disconnect(struct usb_interface *interface) { struct drm_device *dev = usb_get_intfdata(interface); + drm_dev_unplug(dev); drm_kms_helper_poll_fini(dev); udl_drop_usb(dev); - drm_dev_unplug(dev); } /* -- GitLab From 1847ea44e3bdf7da8ff4158bc01b43a2e46394bd Mon Sep 17 00:00:00 2001 From: Stephan Gerhold Date: Tue, 29 Apr 2025 10:33:56 +0200 Subject: [PATCH 1793/2211] drm/msm/gpu: Fix crash when throttling GPU immediately during boot commit b71717735be48d7743a34897e9e44a0b53e30c0e upstream. There is a small chance that the GPU is already hot during boot. In that case, the call to of_devfreq_cooling_register() will immediately try to apply devfreq cooling, as seen in the following crash: Unable to handle kernel paging request at virtual address 0000000000014110 pc : a6xx_gpu_busy+0x1c/0x58 [msm] lr : msm_devfreq_get_dev_status+0xbc/0x140 [msm] Call trace: a6xx_gpu_busy+0x1c/0x58 [msm] (P) devfreq_simple_ondemand_func+0x3c/0x150 devfreq_update_target+0x44/0xd8 qos_max_notifier_call+0x30/0x84 blocking_notifier_call_chain+0x6c/0xa0 pm_qos_update_target+0xd0/0x110 freq_qos_apply+0x3c/0x74 apply_constraint+0x88/0x148 __dev_pm_qos_update_request+0x7c/0xcc dev_pm_qos_update_request+0x38/0x5c devfreq_cooling_set_cur_state+0x98/0xf0 __thermal_cdev_update+0x64/0xb4 thermal_cdev_update+0x4c/0x58 step_wise_manage+0x1f0/0x318 __thermal_zone_device_update+0x278/0x424 __thermal_cooling_device_register+0x2bc/0x308 thermal_of_cooling_device_register+0x10/0x1c of_devfreq_cooling_register_power+0x240/0x2bc of_devfreq_cooling_register+0x14/0x20 msm_devfreq_init+0xc4/0x1a0 [msm] msm_gpu_init+0x304/0x574 [msm] adreno_gpu_init+0x1c4/0x2e0 [msm] a6xx_gpu_init+0x5c8/0x9c8 [msm] adreno_bind+0x2a8/0x33c [msm] ... At this point we haven't initialized the GMU at all yet, so we cannot read the GMU registers inside a6xx_gpu_busy(). A similar issue was fixed before in commit 6694482a70e9 ("drm/msm: Avoid unclocked GMU register access in 6xx gpu_busy"): msm_devfreq_init() does call devfreq_suspend_device(), but unlike msm_devfreq_suspend(), it doesn't set the df->suspended flag accordingly. This means the df->suspended flag does not match the actual devfreq state after initialization and msm_devfreq_get_dev_status() will end up accessing GMU registers, causing the crash. Fix this by setting df->suspended correctly during initialization. Cc: stable@vger.kernel.org Fixes: 6694482a70e9 ("drm/msm: Avoid unclocked GMU register access in 6xx gpu_busy") Signed-off-by: Stephan Gerhold Reviewed-by: Douglas Anderson Reviewed-by: Konrad Dybcio Patchwork: https://patchwork.freedesktop.org/patch/650772/ Signed-off-by: Rob Clark Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/msm/msm_gpu_devfreq.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/msm/msm_gpu_devfreq.c b/drivers/gpu/drm/msm/msm_gpu_devfreq.c index 6970b0f7f457c..2e1d5c3432728 100644 --- a/drivers/gpu/drm/msm/msm_gpu_devfreq.c +++ b/drivers/gpu/drm/msm/msm_gpu_devfreq.c @@ -156,6 +156,7 @@ void msm_devfreq_init(struct msm_gpu *gpu) priv->gpu_devfreq_config.downdifferential = 10; mutex_init(&df->lock); + df->suspended = true; ret = dev_pm_qos_add_request(&gpu->pdev->dev, &df->boost_freq, DEV_PM_QOS_MIN_FREQUENCY, 0); -- GitLab From b681e2a8a7595431479a3743ef2e148f79cbe4b5 Mon Sep 17 00:00:00 2001 From: Jay Cornwall Date: Wed, 11 Jun 2025 09:52:14 -0500 Subject: [PATCH 1794/2211] drm/amdkfd: Fix race in GWS queue scheduling commit cfb05257ae168a0496c7637e1d9e3ab8a25cbffe upstream. q->gws is not updated atomically with qpd->mapped_gws_queue. If a runlist is created between pqm_set_gws and update_queue it will contain a queue which uses GWS in a process with no GWS allocated. This will result in a scheduler hang. Use q->properties.is_gws which is changed while holding the DQM lock. Signed-off-by: Jay Cornwall Reviewed-by: Harish Kasiviswanathan Signed-off-by: Alex Deucher (cherry picked from commit b98370220eb3110e82248e3354e16a489a492cfb) Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c index 1f9f5bfeaf868..d87b895660c21 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c @@ -237,7 +237,7 @@ static int pm_map_queues_v9(struct packet_manager *pm, uint32_t *buffer, packet->bitfields2.engine_sel = engine_sel__mes_map_queues__compute_vi; - packet->bitfields2.gws_control_queue = q->gws ? 1 : 0; + packet->bitfields2.gws_control_queue = q->properties.is_gws ? 1 : 0; packet->bitfields2.extended_engine_sel = extended_engine_sel__mes_map_queues__legacy_engine_sel; packet->bitfields2.queue_type = -- GitLab From 0d11689681d90dfefe94cdff1f332debba6fda8e Mon Sep 17 00:00:00 2001 From: Aradhya Bhatia Date: Sat, 29 Mar 2025 17:09:14 +0530 Subject: [PATCH 1795/2211] drm/bridge: cdns-dsi: Fix the clock variable for mode_valid() commit 132bdcec399be6ae947582249a134b38cf56731c upstream. The crtc_* mode parameters do not get generated (duplicated in this case) from the regular parameters before the mode validation phase begins. The rest of the code conditionally uses the crtc_* parameters only during the bridge enable phase, but sticks to the regular parameters for mode validation. In this singular instance, however, the driver tries to use the crtc_clock parameter even during the mode validation, causing the validation to fail. Allow the D-Phy config checks to use mode->clock instead of mode->crtc_clock during mode_valid checks, like everywhere else in the driver. Fixes: fced5a364dee ("drm/bridge: cdns: Convert to phy framework") Cc: stable@vger.kernel.org Reviewed-by: Tomi Valkeinen Reviewed-by: Dmitry Baryshkov Tested-by: Tomi Valkeinen Signed-off-by: Aradhya Bhatia Signed-off-by: Aradhya Bhatia Link: https://lore.kernel.org/r/20250329113925.68204-4-aradhya.bhatia@linux.dev Signed-off-by: Dmitry Baryshkov Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c index 7457d38622b0c..1e93da035afbf 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c @@ -568,13 +568,14 @@ static int cdns_dsi_check_conf(struct cdns_dsi *dsi, struct phy_configure_opts_mipi_dphy *phy_cfg = &output->phy_opts.mipi_dphy; unsigned long dsi_hss_hsa_hse_hbp; unsigned int nlanes = output->dev->lanes; + int mode_clock = (mode_valid_check ? mode->clock : mode->crtc_clock); int ret; ret = cdns_dsi_mode2cfg(dsi, mode, dsi_cfg, mode_valid_check); if (ret) return ret; - phy_mipi_dphy_get_default_config(mode->crtc_clock * 1000, + phy_mipi_dphy_get_default_config(mode_clock * 1000, mipi_dsi_pixel_format_to_bpp(output->dev->format), nlanes, phy_cfg); -- GitLab From 750442b99e0a5379c7dc09e394b4b4cd04bece91 Mon Sep 17 00:00:00 2001 From: Aradhya Bhatia Date: Sat, 29 Mar 2025 17:09:13 +0530 Subject: [PATCH 1796/2211] drm/bridge: cdns-dsi: Fix phy de-init and flag it so commit fd2611c13f69cbbc6b81d9fc7502abf4f7031d21 upstream. The driver code doesn't have a Phy de-initialization path as yet, and so it does not clear the phy_initialized flag while suspending. This is a problem because after resume the driver looks at this flag to determine if a Phy re-initialization is required or not. It is in fact required because the hardware is resuming from a suspend, but the driver does not carry out any re-initialization causing the D-Phy to not work at all. Call the counterparts of phy_init() and phy_power_on(), that are phy_exit() and phy_power_off(), from _bridge_post_disable(), and clear the flags so that the Phy can be initialized again when required. Fixes: fced5a364dee ("drm/bridge: cdns: Convert to phy framework") Cc: stable@vger.kernel.org Reviewed-by: Dmitry Baryshkov Reviewed-by: Tomi Valkeinen Tested-by: Tomi Valkeinen Signed-off-by: Aradhya Bhatia Signed-off-by: Aradhya Bhatia Link: https://lore.kernel.org/r/20250329113925.68204-3-aradhya.bhatia@linux.dev Signed-off-by: Dmitry Baryshkov Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c index 1e93da035afbf..f8f48a57e8377 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c @@ -681,6 +681,11 @@ static void cdns_dsi_bridge_post_disable(struct drm_bridge *bridge) struct cdns_dsi_input *input = bridge_to_cdns_dsi_input(bridge); struct cdns_dsi *dsi = input_to_dsi(input); + dsi->phy_initialized = false; + dsi->link_initialized = false; + phy_power_off(dsi->dphy); + phy_exit(dsi->dphy); + pm_runtime_put(dsi->base.dev); } @@ -1153,7 +1158,6 @@ static int __maybe_unused cdns_dsi_suspend(struct device *dev) clk_disable_unprepare(dsi->dsi_sys_clk); clk_disable_unprepare(dsi->dsi_p_clk); reset_control_assert(dsi->dsi_p_rst); - dsi->link_initialized = false; return 0; } -- GitLab From 40261f044793df77ebeab583d6ca7acae746702f Mon Sep 17 00:00:00 2001 From: Aradhya Bhatia Date: Sat, 29 Mar 2025 17:09:12 +0530 Subject: [PATCH 1797/2211] drm/bridge: cdns-dsi: Fix connecting to next bridge commit 688eb4d465484bc2a3471a6a6f06f833b58c7867 upstream. Fix the OF node pointer passed to the of_drm_find_bridge() call to find the next bridge in the display chain. The code to find the next panel (and create its panel-bridge) works fine, but to find the next (non-panel) bridge does not. To find the next bridge in the pipeline, we need to pass "np" - the OF node pointer of the next entity in the devicetree chain. Passing "of_node" to of_drm_find_bridge (which is what the code does currently) will fetch the bridge for the cdns-dsi which is not what's required. Fix that. Fixes: e19233955d9e ("drm/bridge: Add Cadence DSI driver") Cc: stable@vger.kernel.org Reviewed-by: Dmitry Baryshkov Reviewed-by: Tomi Valkeinen Tested-by: Tomi Valkeinen Signed-off-by: Aradhya Bhatia Signed-off-by: Aradhya Bhatia Link: https://lore.kernel.org/r/20250329113925.68204-2-aradhya.bhatia@linux.dev Signed-off-by: Dmitry Baryshkov Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c index f8f48a57e8377..19c21daa84e96 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c @@ -958,7 +958,7 @@ static int cdns_dsi_attach(struct mipi_dsi_host *host, bridge = drm_panel_bridge_add_typed(panel, DRM_MODE_CONNECTOR_DSI); } else { - bridge = of_drm_find_bridge(dev->dev.of_node); + bridge = of_drm_find_bridge(np); if (!bridge) bridge = ERR_PTR(-EINVAL); } -- GitLab From 88189662ade0b99d30291e5360cff86c4b2e472d Mon Sep 17 00:00:00 2001 From: Aradhya Bhatia Date: Sat, 29 Mar 2025 17:09:15 +0530 Subject: [PATCH 1798/2211] drm/bridge: cdns-dsi: Check return value when getting default PHY config commit c6a7ef0d4856b9629df390e9935d7fd67fe39f81 upstream. Check for the return value of the phy_mipi_dphy_get_default_config() call, and in case of an error, return back the same. Fixes: fced5a364dee ("drm/bridge: cdns: Convert to phy framework") Cc: stable@vger.kernel.org Reviewed-by: Tomi Valkeinen Reviewed-by: Dmitry Baryshkov Tested-by: Tomi Valkeinen Signed-off-by: Aradhya Bhatia Signed-off-by: Aradhya Bhatia Link: https://lore.kernel.org/r/20250329113925.68204-5-aradhya.bhatia@linux.dev Signed-off-by: Dmitry Baryshkov Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c index 19c21daa84e96..738fb24991d95 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c @@ -575,9 +575,11 @@ static int cdns_dsi_check_conf(struct cdns_dsi *dsi, if (ret) return ret; - phy_mipi_dphy_get_default_config(mode_clock * 1000, - mipi_dsi_pixel_format_to_bpp(output->dev->format), - nlanes, phy_cfg); + ret = phy_mipi_dphy_get_default_config(mode_clock * 1000, + mipi_dsi_pixel_format_to_bpp(output->dev->format), + nlanes, phy_cfg); + if (ret) + return ret; ret = cdns_dsi_adjust_phy_config(dsi, dsi_cfg, phy_cfg, mode, mode_valid_check); if (ret) -- GitLab From b7e273ebb39921248bcf0b6d47939463f2b13960 Mon Sep 17 00:00:00 2001 From: Aradhya Bhatia Date: Sat, 29 Mar 2025 17:09:16 +0530 Subject: [PATCH 1799/2211] drm/bridge: cdns-dsi: Wait for Clk and Data Lanes to be ready commit 47c03e6660e96cbba0239125b1d4a9db3c724b1d upstream. Once the DSI Link and DSI Phy are initialized, the code needs to wait for Clk and Data Lanes to be ready, before continuing configuration. This is in accordance with the DSI Start-up procedure, found in the Technical Reference Manual of Texas Instrument's J721E SoC[0] which houses this DSI TX controller. If the previous bridge (or crtc/encoder) are configured pre-maturely, the input signal FIFO gets corrupt. This introduces a color-shift on the display. Allow the driver to wait for the clk and data lanes to get ready during DSI enable. [0]: See section 12.6.5.7.3 "Start-up Procedure" in J721E SoC TRM TRM Link: http://www.ti.com/lit/pdf/spruil1 Fixes: e19233955d9e ("drm/bridge: Add Cadence DSI driver") Cc: stable@vger.kernel.org Tested-by: Dominik Haller Reviewed-by: Tomi Valkeinen Tested-by: Tomi Valkeinen Signed-off-by: Aradhya Bhatia Signed-off-by: Aradhya Bhatia Link: https://lore.kernel.org/r/20250329113925.68204-6-aradhya.bhatia@linux.dev Signed-off-by: Dmitry Baryshkov Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c index 738fb24991d95..89eed0668bfb2 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c @@ -769,7 +769,7 @@ static void cdns_dsi_bridge_enable(struct drm_bridge *bridge) struct phy_configure_opts_mipi_dphy *phy_cfg = &output->phy_opts.mipi_dphy; unsigned long tx_byte_period; struct cdns_dsi_cfg dsi_cfg; - u32 tmp, reg_wakeup, div; + u32 tmp, reg_wakeup, div, status; int nlanes; if (WARN_ON(pm_runtime_get_sync(dsi->base.dev) < 0)) @@ -786,6 +786,19 @@ static void cdns_dsi_bridge_enable(struct drm_bridge *bridge) cdns_dsi_hs_init(dsi); cdns_dsi_init_link(dsi); + /* + * Now that the DSI Link and DSI Phy are initialized, + * wait for the CLK and Data Lanes to be ready. + */ + tmp = CLK_LANE_RDY; + for (int i = 0; i < nlanes; i++) + tmp |= DATA_LANE_RDY(i); + + if (readl_poll_timeout(dsi->regs + MCTL_MAIN_STS, status, + (tmp == (status & tmp)), 100, 500000)) + dev_err(dsi->base.dev, + "Timed Out: DSI-DPhy Clock and Data Lanes not ready.\n"); + writel(HBP_LEN(dsi_cfg.hbp) | HSA_LEN(dsi_cfg.hsa), dsi->regs + VID_HSIZE1); writel(HFP_LEN(dsi_cfg.hfp) | HACT_LEN(dsi_cfg.hact), -- GitLab From 4ce9f2dc9ff7cc410e8c5d936ec551e26b9599a9 Mon Sep 17 00:00:00 2001 From: Wentao Liang Date: Mon, 26 May 2025 10:37:31 +0800 Subject: [PATCH 1800/2211] drm/amd/display: Add null pointer check for get_first_active_display() commit c3e9826a22027a21d998d3e64882fa377b613006 upstream. The function mod_hdcp_hdcp1_enable_encryption() calls the function get_first_active_display(), but does not check its return value. The return value is a null pointer if the display list is empty. This will lead to a null pointer dereference in mod_hdcp_hdcp2_enable_encryption(). Add a null pointer check for get_first_active_display() and return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND if the function return null. Fixes: 2deade5ede56 ("drm/amd/display: Remove hdcp display state with mst fix") Signed-off-by: Wentao Liang Reviewed-by: Alex Hung Signed-off-by: Alex Deucher Cc: stable@vger.kernel.org # v5.8 Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c index 8c137d7c032e1..e58e7b93810be 100644 --- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c +++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c @@ -368,6 +368,9 @@ enum mod_hdcp_status mod_hdcp_hdcp1_enable_encryption(struct mod_hdcp *hdcp) struct mod_hdcp_display *display = get_first_active_display(hdcp); enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS; + if (!display) + return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND; + mutex_lock(&psp->hdcp_context.mutex); hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf; memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory)); -- GitLab From e2c3133ff4d594f68d3bae82b2637e96b509e063 Mon Sep 17 00:00:00 2001 From: John Olender Date: Tue, 29 Apr 2025 07:24:28 -0400 Subject: [PATCH 1801/2211] drm/amdgpu: amdgpu_vram_mgr_new(): Clamp lpfn to total vram commit 4d2f6b4e4c7ed32e7fa39fcea37344a9eab99094 upstream. The drm_mm allocator tolerated being passed end > mm->size, but the drm_buddy allocator does not. Restore the pre-buddy-allocator behavior of allowing such placements. Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3448 Signed-off-by: John Olender Reviewed-by: Alex Deucher Reviewed-by: Arunpravin Paneer Selvam Signed-off-by: Alex Deucher Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index ff5e52025266c..8f58ec6f14009 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -463,7 +463,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, int r; lpfn = (u64)place->lpfn << PAGE_SHIFT; - if (!lpfn) + if (!lpfn || lpfn > man->size) lpfn = man->size; fpfn = (u64)place->fpfn << PAGE_SHIFT; -- GitLab From ca8efc6a89716245408eb00a6a83dfa13dea7a2f Mon Sep 17 00:00:00 2001 From: Zhongwei Zhang Date: Tue, 13 May 2025 16:45:59 +0800 Subject: [PATCH 1802/2211] drm/amd/display: Correct non-OLED pre_T11_delay. commit 893f07452bca56ff146a6be02b3294a9ea23d18a upstream. [Why] Only OLED panels require non-zero pre_T11_delay defaultly. Others should be controlled by power sequence. [How] For non OLED, pre_T11_delay delay in code should be zero. Also post_T7_delay. Cc: Mario Limonciello Cc: Alex Deucher Cc: stable@vger.kernel.org Reviewed-by: Charlene Liu Signed-off-by: Zhongwei Zhang Signed-off-by: Wayne Lin Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c index 59457ca24e1dc..1e69dd6aa3d40 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c @@ -951,8 +951,8 @@ void dce110_edp_backlight_control( struct dc_context *ctx = link->ctx; struct bp_transmitter_control cntl = { 0 }; uint8_t pwrseq_instance = 0; - unsigned int pre_T11_delay = OLED_PRE_T11_DELAY; - unsigned int post_T7_delay = OLED_POST_T7_DELAY; + unsigned int pre_T11_delay = (link->dpcd_sink_ext_caps.bits.oled ? OLED_PRE_T11_DELAY : 0); + unsigned int post_T7_delay = (link->dpcd_sink_ext_caps.bits.oled ? OLED_POST_T7_DELAY : 0); if (dal_graphics_object_id_get_connector_id(link->link_enc->connector) != CONNECTOR_ID_EDP) { @@ -1067,7 +1067,8 @@ void dce110_edp_backlight_control( if (!enable) { /*follow oem panel config's requirement*/ pre_T11_delay += link->panel_config.pps.extra_pre_t11_ms; - msleep(pre_T11_delay); + if (pre_T11_delay) + msleep(pre_T11_delay); } } -- GitLab From 0bc8ad50f0768226a296949977937e7f5d02a308 Mon Sep 17 00:00:00 2001 From: Matthew Auld Date: Wed, 14 May 2025 16:24:25 +0100 Subject: [PATCH 1803/2211] drm/xe/vm: move rebind_work init earlier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit a63e99b4d6d3a0353ef47146dd5bd562f08e1786 upstream. In xe_vm_close_and_put() we need to be able to call flush_work(rebind_work), however during vm creation we can call this on the error path, before having actually set up the worker, leading to a splat from flush_work(). It looks like we can simply move the worker init step earlier to fix this. Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel GPUs") Signed-off-by: Matthew Auld Cc: Matthew Brost Cc: # v6.8+ Reviewed-by: Matthew Brost Link: https://lore.kernel.org/r/20250514152424.149591-3-matthew.auld@intel.com (cherry picked from commit 96af397aa1a2d1032a6e28ff3f4bc0ab4be40e1d) Signed-off-by: Thomas Hellström Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/xe/xe_vm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c index de257a032225f..15fd497c920c8 100644 --- a/drivers/gpu/drm/xe/xe_vm.c +++ b/drivers/gpu/drm/xe/xe_vm.c @@ -1477,8 +1477,10 @@ struct xe_vm *xe_vm_create(struct xe_device *xe, u32 flags) * scheduler drops all the references of it, hence protecting the VM * for this case is necessary. */ - if (flags & XE_VM_FLAG_LR_MODE) + if (flags & XE_VM_FLAG_LR_MODE) { + INIT_WORK(&vm->preempt.rebind_work, preempt_rebind_work_func); xe_pm_runtime_get_noresume(xe); + } vm_resv_obj = drm_gpuvm_resv_object_alloc(&xe->drm); if (!vm_resv_obj) { @@ -1523,10 +1525,8 @@ struct xe_vm *xe_vm_create(struct xe_device *xe, u32 flags) vm->batch_invalidate_tlb = true; } - if (vm->flags & XE_VM_FLAG_LR_MODE) { - INIT_WORK(&vm->preempt.rebind_work, preempt_rebind_work_func); + if (vm->flags & XE_VM_FLAG_LR_MODE) vm->batch_invalidate_tlb = false; - } /* Fill pt_root after allocating scratch tables */ for_each_tile(tile, xe, id) { -- GitLab From f684192fca9156bd2525ca3ac342a11329440df4 Mon Sep 17 00:00:00 2001 From: Matthew Auld Date: Wed, 28 May 2025 12:33:29 +0100 Subject: [PATCH 1804/2211] drm/xe/sched: stop re-submitting signalled jobs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 0ee54d5cacc0276ec631ac149825a24b59c51c38 upstream. Customer is reporting a really subtle issue where we get random DMAR faults, hangs and other nasties for kernel migration jobs when stressing stuff like s2idle/s3/s4. The explosions seems to happen somewhere after resuming the system with splats looking something like: PM: suspend exit rfkill: input handler disabled xe 0000:00:02.0: [drm] GT0: Engine reset: engine_class=bcs, logical_mask: 0x2, guc_id=0 xe 0000:00:02.0: [drm] GT0: Timedout job: seqno=24496, lrc_seqno=24496, guc_id=0, flags=0x13 in no process [-1] xe 0000:00:02.0: [drm] GT0: Kernel-submitted job timed out The likely cause appears to be a race between suspend cancelling the worker that processes the free_job()'s, such that we still have pending jobs to be freed after the cancel. Following from this, on resume the pending_list will now contain at least one already complete job, but it looks like we call drm_sched_resubmit_jobs(), which will then call run_job() on everything still on the pending_list. But if the job was already complete, then all the resources tied to the job, like the bb itself, any memory that is being accessed, the iommu mappings etc. might be long gone since those are usually tied to the fence signalling. This scenario can be seen in ftrace when running a slightly modified xe_pm IGT (kernel was only modified to inject artificial latency into free_job to make the race easier to hit): xe_sched_job_run: dev=0000:00:02.0, fence=0xffff888276cc8540, seqno=0, lrc_seqno=0, gt=0, guc_id=0, batch_addr=0x000000146910 ... xe_exec_queue_stop: dev=0000:00:02.0, 3:0x2, gt=0, width=1, guc_id=0, guc_state=0x0, flags=0x13 xe_exec_queue_stop: dev=0000:00:02.0, 3:0x2, gt=0, width=1, guc_id=1, guc_state=0x0, flags=0x4 xe_exec_queue_stop: dev=0000:00:02.0, 4:0x1, gt=1, width=1, guc_id=0, guc_state=0x0, flags=0x3 xe_exec_queue_stop: dev=0000:00:02.0, 1:0x1, gt=1, width=1, guc_id=1, guc_state=0x0, flags=0x3 xe_exec_queue_stop: dev=0000:00:02.0, 4:0x1, gt=1, width=1, guc_id=2, guc_state=0x0, flags=0x3 xe_exec_queue_resubmit: dev=0000:00:02.0, 3:0x2, gt=0, width=1, guc_id=0, guc_state=0x0, flags=0x13 xe_sched_job_run: dev=0000:00:02.0, fence=0xffff888276cc8540, seqno=0, lrc_seqno=0, gt=0, guc_id=0, batch_addr=0x000000146910 ... ..... xe_exec_queue_memory_cat_error: dev=0000:00:02.0, 3:0x2, gt=0, width=1, guc_id=0, guc_state=0x3, flags=0x13 So the job_run() is clearly triggered twice for the same job, even though the first must have already signalled to completion during suspend. We can also see a CAT error after the re-submit. To prevent this only resubmit jobs on the pending_list that have not yet signalled. v2: - Make sure to re-arm the fence callbacks with sched_start(). v3 (Matt B): - Stop using drm_sched_resubmit_jobs(), which appears to be deprecated and just open-code a simple loop such that we skip calling run_job() on anything already signalled. Link: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/4856 Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel GPUs") Signed-off-by: Matthew Auld Cc: Thomas Hellström Cc: Matthew Brost Cc: William Tseng Cc: # v6.8+ Reviewed-by: Matthew Brost Reviewed-by: Tejas Upadhyay Link: https://lore.kernel.org/r/20250528113328.289392-2-matthew.auld@intel.com (cherry picked from commit 38fafa9f392f3110d2de431432d43f4eef99cd1b) Signed-off-by: Thomas Hellström Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/xe/xe_gpu_scheduler.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/xe/xe_gpu_scheduler.h b/drivers/gpu/drm/xe/xe_gpu_scheduler.h index 64b2ae6839db2..400b2e9e89ab9 100644 --- a/drivers/gpu/drm/xe/xe_gpu_scheduler.h +++ b/drivers/gpu/drm/xe/xe_gpu_scheduler.h @@ -51,7 +51,15 @@ static inline void xe_sched_tdr_queue_imm(struct xe_gpu_scheduler *sched) static inline void xe_sched_resubmit_jobs(struct xe_gpu_scheduler *sched) { - drm_sched_resubmit_jobs(&sched->base); + struct drm_sched_job *s_job; + + list_for_each_entry(s_job, &sched->base.pending_list, list) { + struct drm_sched_fence *s_fence = s_job->s_fence; + struct dma_fence *hw_fence = s_fence->parent; + + if (hw_fence && !dma_fence_is_signaled(hw_fence)) + sched->base.ops->run_job(s_job); + } } static inline bool -- GitLab From 57f1ed963cb26264b7206cce00d28defae39362c Mon Sep 17 00:00:00 2001 From: Matthew Auld Date: Tue, 3 Jun 2025 18:42:14 +0100 Subject: [PATCH 1805/2211] drm/xe/guc_submit: add back fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 2e824747cfbdf1fba88df5e5800d284b2602ae8f upstream. Daniele noticed that the fix in commit 2d2be279f1ca ("drm/xe: fix UAF around queue destruction") looks to have been unintentionally removed as part of handling a conflict in some past merge commit. Add it back. Fixes: ac44ff7cec33 ("Merge tag 'drm-xe-fixes-2024-10-10' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-fixes") Reported-by: Daniele Ceraolo Spurio Signed-off-by: Matthew Auld Cc: Matthew Brost Cc: # v6.12+ Reviewed-by: Matthew Brost Link: https://lore.kernel.org/r/20250603174213.1543579-2-matthew.auld@intel.com (cherry picked from commit 9d9fca62dc49d96f97045b6d8e7402a95f8cf92a) Signed-off-by: Thomas Hellström Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/xe/xe_guc_submit.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c index 20d05efdd406e..3e6a7b3bde8ac 100644 --- a/drivers/gpu/drm/xe/xe_guc_submit.c +++ b/drivers/gpu/drm/xe/xe_guc_submit.c @@ -227,6 +227,17 @@ static bool exec_queue_killed_or_banned_or_wedged(struct xe_exec_queue *q) static void guc_submit_fini(struct drm_device *drm, void *arg) { struct xe_guc *guc = arg; + struct xe_device *xe = guc_to_xe(guc); + struct xe_gt *gt = guc_to_gt(guc); + int ret; + + ret = wait_event_timeout(guc->submission_state.fini_wq, + xa_empty(&guc->submission_state.exec_queue_lookup), + HZ * 5); + + drain_workqueue(xe->destroy_wq); + + xe_gt_assert(gt, ret); xa_destroy(&guc->submission_state.exec_queue_lookup); } -- GitLab From ba1ffc32bda798613999916c60a03462233ae067 Mon Sep 17 00:00:00 2001 From: Yihan Zhu Date: Tue, 27 May 2025 16:47:40 -0400 Subject: [PATCH 1806/2211] drm/amd/display: Fix RMCM programming seq errors commit 158f9944ac05dafd2d3a23d0688e6cf40ef68b90 upstream. [WHY & HOW] Fix RMCM programming sequence errors and mapping issues to pass the RMCM test. Cc: Mario Limonciello Cc: Alex Deucher Reviewed-by: Dmytro Laktyushkin Signed-off-by: Yihan Zhu Signed-off-by: Alex Hung Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher (cherry picked from commit 11baa4975025033547f45f5894087a0dda6efbb8) Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- .../dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c b/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c index 0090b7bc232bf..157903115f3b4 100644 --- a/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c @@ -4651,7 +4651,10 @@ static void calculate_tdlut_setting( //the tdlut is fetched during the 2 row times of prefetch. if (p->setup_for_tdlut) { *p->tdlut_groups_per_2row_ub = (unsigned int)math_ceil2((double) *p->tdlut_bytes_per_frame / *p->tdlut_bytes_per_group, 1); - *p->tdlut_opt_time = (*p->tdlut_bytes_per_frame - p->cursor_buffer_size * 1024) / tdlut_drain_rate; + if (*p->tdlut_bytes_per_frame > p->cursor_buffer_size * 1024) + *p->tdlut_opt_time = (*p->tdlut_bytes_per_frame - p->cursor_buffer_size * 1024) / tdlut_drain_rate; + else + *p->tdlut_opt_time = 0; *p->tdlut_drain_time = p->cursor_buffer_size * 1024 / tdlut_drain_rate; } -- GitLab From 593517e5561cb8f7f03503de3d75169b855b1d00 Mon Sep 17 00:00:00 2001 From: Frank Min Date: Wed, 4 Jun 2025 21:00:44 +0800 Subject: [PATCH 1807/2211] drm/amdgpu: Add kicker device detection commit 0bbf5fd86c585d437b75003f11365b324360a5d6 upstream. 1. add kicker device list 2. add kicker device checking helper function Signed-off-by: Frank Min Reviewed-by: Hawking Zhang Signed-off-by: Alex Deucher (cherry picked from commit 09aa2b408f4ab689c3541d22b0968de0392ee406) Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 17 +++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c index 4c7b53648a507..eb83d7c1f784c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c @@ -30,6 +30,10 @@ #define AMDGPU_UCODE_NAME_MAX (128) +static const struct kicker_device kicker_device_list[] = { + {0x744B, 0x00}, +}; + static void amdgpu_ucode_print_common_hdr(const struct common_firmware_header *hdr) { DRM_DEBUG("size_bytes: %u\n", le32_to_cpu(hdr->size_bytes)); @@ -1383,6 +1387,19 @@ static const char *amdgpu_ucode_legacy_naming(struct amdgpu_device *adev, int bl return NULL; } +bool amdgpu_is_kicker_fw(struct amdgpu_device *adev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(kicker_device_list); i++) { + if (adev->pdev->device == kicker_device_list[i].device && + adev->pdev->revision == kicker_device_list[i].revision) + return true; + } + + return false; +} + void amdgpu_ucode_ip_version_decode(struct amdgpu_device *adev, int block_type, char *ucode_prefix, int len) { int maj, min, rev; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h index 4e23419b92d4e..fd08b015b2a7a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h @@ -595,6 +595,11 @@ struct amdgpu_firmware { uint64_t fw_buf_mc; }; +struct kicker_device{ + unsigned short device; + u8 revision; +}; + void amdgpu_ucode_print_mc_hdr(const struct common_firmware_header *hdr); void amdgpu_ucode_print_smc_hdr(const struct common_firmware_header *hdr); void amdgpu_ucode_print_imu_hdr(const struct common_firmware_header *hdr); @@ -622,5 +627,6 @@ amdgpu_ucode_get_load_type(struct amdgpu_device *adev, int load_type); const char *amdgpu_ucode_name(enum AMDGPU_UCODE_ID ucode_id); void amdgpu_ucode_ip_version_decode(struct amdgpu_device *adev, int block_type, char *ucode_prefix, int len); +bool amdgpu_is_kicker_fw(struct amdgpu_device *adev); #endif -- GitLab From e881b82f5d3d8d54d168cd276169f0fee01bf0e7 Mon Sep 17 00:00:00 2001 From: Alex Hung Date: Tue, 3 Jun 2025 18:30:55 -0600 Subject: [PATCH 1808/2211] drm/amd/display: Check dce_hwseq before dereferencing it commit b669507b637eb6b1aaecf347f193efccc65d756e upstream. [WHAT] hws was checked for null earlier in dce110_blank_stream, indicating hws can be null, and should be checked whenever it is used. Cc: Mario Limonciello Cc: Alex Deucher Reviewed-by: Aurabindo Pillai Signed-off-by: Alex Hung Signed-off-by: Aurabindo Pillai Signed-off-by: Alex Deucher (cherry picked from commit 79db43611ff61280b6de58ce1305e0b2ecf675ad) Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c index 1e69dd6aa3d40..03b22e9115ea8 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c @@ -1217,7 +1217,7 @@ void dce110_blank_stream(struct pipe_ctx *pipe_ctx) struct dce_hwseq *hws = link->dc->hwseq; if (link->local_sink && link->local_sink->sink_signal == SIGNAL_TYPE_EDP) { - if (!link->skip_implict_edp_power_control) + if (!link->skip_implict_edp_power_control && hws) hws->funcs.edp_backlight_control(link, false); link->dc->hwss.set_abm_immediate_disable(pipe_ctx); } -- GitLab From 57e044005e9ed43d869015c8a8bc21fe9ba461b8 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Thu, 12 Jun 2025 15:14:12 -0700 Subject: [PATCH 1809/2211] drm/xe: Fix memset on iomem MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 87a15c89d8c7b00b0fc94e0d4f554f7ee2fe6961 upstream. It should rather use xe_map_memset() as the BO is created with XE_BO_FLAG_VRAM_IF_DGFX in xe_guc_pc_init(). Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel GPUs") Cc: stable@vger.kernel.org Reviewed-by: Matthew Brost Link: https://lore.kernel.org/r/20250612-vmap-vaddr-v1-1-26238ed443eb@intel.com Signed-off-by: Lucas De Marchi (cherry picked from commit 21cf47d89fba353b2d5915ba4718040c4cb955d3) Signed-off-by: Thomas Hellström Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/xe/xe_guc_pc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/xe/xe_guc_pc.c b/drivers/gpu/drm/xe/xe_guc_pc.c index 034b29984d5ed..f978da8be35c2 100644 --- a/drivers/gpu/drm/xe/xe_guc_pc.c +++ b/drivers/gpu/drm/xe/xe_guc_pc.c @@ -975,7 +975,7 @@ int xe_guc_pc_start(struct xe_guc_pc *pc) goto out; } - memset(pc->bo->vmap.vaddr, 0, size); + xe_map_memset(xe, &pc->bo->vmap, 0, 0, size); slpc_shared_data_write(pc, header.size, size); ret = pc_action_reset(pc); -- GitLab From a6d81b2d7037ef36163ad16459ed3fd17cb1b596 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Wed, 2 Apr 2025 22:38:05 -0700 Subject: [PATCH 1810/2211] drm/xe: Fix taking invalid lock on wedge commit 1e1981b16bb1bbe2fafa57ed439b45cb5b34e32d upstream. If device wedges on e.g. GuC upload, the submission is not yet enabled and the state is not even initialized. Protect the wedge call so it does nothing in this case. It fixes the following splat: [] xe 0000:bf:00.0: [drm] device wedged, needs recovery [] ------------[ cut here ]------------ [] DEBUG_LOCKS_WARN_ON(lock->magic != lock) [] WARNING: CPU: 48 PID: 312 at kernel/locking/mutex.c:564 __mutex_lock+0x8a1/0xe60 ... [] RIP: 0010:__mutex_lock+0x8a1/0xe60 [] mutex_lock_nested+0x1b/0x30 [] xe_guc_submit_wedge+0x80/0x2b0 [xe] Reviewed-by: Balasubramani Vivekanandan Link: https://lore.kernel.org/r/20250402-warn-after-wedge-v1-1-93e971511fa5@intel.com Signed-off-by: Lucas De Marchi Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/xe/xe_guc_submit.c | 9 +++++++++ drivers/gpu/drm/xe/xe_guc_types.h | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c index 3e6a7b3bde8ac..c57e294c7dec8 100644 --- a/drivers/gpu/drm/xe/xe_guc_submit.c +++ b/drivers/gpu/drm/xe/xe_guc_submit.c @@ -309,6 +309,8 @@ int xe_guc_submit_init(struct xe_guc *guc, unsigned int num_ids) primelockdep(guc); + guc->submission_state.initialized = true; + return drmm_add_action_or_reset(&xe->drm, guc_submit_fini, guc); } @@ -837,6 +839,13 @@ void xe_guc_submit_wedge(struct xe_guc *guc) xe_gt_assert(guc_to_gt(guc), guc_to_xe(guc)->wedged.mode); + /* + * If device is being wedged even before submission_state is + * initialized, there's nothing to do here. + */ + if (!guc->submission_state.initialized) + return; + err = devm_add_action_or_reset(guc_to_xe(guc)->drm.dev, guc_submit_wedged_fini, guc); if (err) { diff --git a/drivers/gpu/drm/xe/xe_guc_types.h b/drivers/gpu/drm/xe/xe_guc_types.h index ed150fc09ad04..7842b71e68beb 100644 --- a/drivers/gpu/drm/xe/xe_guc_types.h +++ b/drivers/gpu/drm/xe/xe_guc_types.h @@ -74,6 +74,11 @@ struct xe_guc { struct mutex lock; /** @submission_state.enabled: submission is enabled */ bool enabled; + /** + * @submission_state.initialized: mark when submission state is + * even initialized - before that not even the lock is valid + */ + bool initialized; /** @submission_state.fini_wq: submit fini wait queue */ wait_queue_head_t fini_wq; } submission_state; -- GitLab From e5e199678029275ffd1b0de0383c389057def0e0 Mon Sep 17 00:00:00 2001 From: Daniele Ceraolo Spurio Date: Wed, 11 Jun 2025 14:44:54 -0700 Subject: [PATCH 1811/2211] drm/xe: Fix early wedge on GuC load failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit a39d082c3553d35b4fe5585e1e2fb221c130cae8 upstream. When the GuC fails to load we declare the device wedged. However, the very first GuC load attempt on GT0 (from xe_gt_init_hwconfig) is done before the GT1 GuC objects are initialized, so things go bad when the wedge code attempts to cleanup GT1. To fix this, check the initialization status in the functions called during wedge. Fixes: 7dbe8af13c18 ("drm/xe: Wedge the entire device") Signed-off-by: Daniele Ceraolo Spurio Cc: Rodrigo Vivi Cc: Matthew Brost Cc: Jonathan Cavitt Cc: Lucas De Marchi Cc: Zhanjun Dong Cc: stable@vger.kernel.org # v6.12+: 1e1981b16bb1: drm/xe: Fix taking invalid lock on wedge Cc: stable@vger.kernel.org # v6.12+ Reviewed-by: Jonathan Cavitt Reviewed-by: Lucas De Marchi Link: https://lore.kernel.org/r/20250611214453.1159846-2-daniele.ceraolospurio@intel.com Signed-off-by: Lucas De Marchi (cherry picked from commit 0b93b7dcd9eb888a6ac7546560877705d4ad61bf) Signed-off-by: Thomas Hellström Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c | 8 ++++++++ drivers/gpu/drm/xe/xe_guc_ct.c | 7 +++++-- drivers/gpu/drm/xe/xe_guc_ct.h | 5 +++++ drivers/gpu/drm/xe/xe_guc_submit.c | 3 +++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c index 3155825fa46ad..9deb9b44c3c3e 100644 --- a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c +++ b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c @@ -137,6 +137,14 @@ void xe_gt_tlb_invalidation_reset(struct xe_gt *gt) struct xe_gt_tlb_invalidation_fence *fence, *next; int pending_seqno; + /* + * we can get here before the CTs are even initialized if we're wedging + * very early, in which case there are not going to be any pending + * fences so we can bail immediately. + */ + if (!xe_guc_ct_initialized(>->uc.guc.ct)) + return; + /* * CT channel is already disabled at this point. No new TLB requests can * appear. diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c index cd6a5f09d631e..1f74f6bd50f31 100644 --- a/drivers/gpu/drm/xe/xe_guc_ct.c +++ b/drivers/gpu/drm/xe/xe_guc_ct.c @@ -454,6 +454,9 @@ void xe_guc_ct_disable(struct xe_guc_ct *ct) */ void xe_guc_ct_stop(struct xe_guc_ct *ct) { + if (!xe_guc_ct_initialized(ct)) + return; + xe_guc_ct_set_state(ct, XE_GUC_CT_STATE_STOPPED); stop_g2h_handler(ct); } @@ -638,7 +641,7 @@ static int __guc_ct_send_locked(struct xe_guc_ct *ct, const u32 *action, u16 seqno; int ret; - xe_gt_assert(gt, ct->state != XE_GUC_CT_STATE_NOT_INITIALIZED); + xe_gt_assert(gt, xe_guc_ct_initialized(ct)); xe_gt_assert(gt, !g2h_len || !g2h_fence); xe_gt_assert(gt, !num_g2h || !g2h_fence); xe_gt_assert(gt, !g2h_len || num_g2h); @@ -1209,7 +1212,7 @@ static int g2h_read(struct xe_guc_ct *ct, u32 *msg, bool fast_path) u32 action; u32 *hxg; - xe_gt_assert(gt, ct->state != XE_GUC_CT_STATE_NOT_INITIALIZED); + xe_gt_assert(gt, xe_guc_ct_initialized(ct)); lockdep_assert_held(&ct->fast_lock); if (ct->state == XE_GUC_CT_STATE_DISABLED) diff --git a/drivers/gpu/drm/xe/xe_guc_ct.h b/drivers/gpu/drm/xe/xe_guc_ct.h index 190202fce2d04..13e316668e901 100644 --- a/drivers/gpu/drm/xe/xe_guc_ct.h +++ b/drivers/gpu/drm/xe/xe_guc_ct.h @@ -23,6 +23,11 @@ void xe_guc_ct_snapshot_print(struct xe_guc_ct_snapshot *snapshot, void xe_guc_ct_snapshot_free(struct xe_guc_ct_snapshot *snapshot); void xe_guc_ct_print(struct xe_guc_ct *ct, struct drm_printer *p, bool atomic); +static inline bool xe_guc_ct_initialized(struct xe_guc_ct *ct) +{ + return ct->state != XE_GUC_CT_STATE_NOT_INITIALIZED; +} + static inline bool xe_guc_ct_enabled(struct xe_guc_ct *ct) { return ct->state == XE_GUC_CT_STATE_ENABLED; diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c index c57e294c7dec8..0e17820a35e2c 100644 --- a/drivers/gpu/drm/xe/xe_guc_submit.c +++ b/drivers/gpu/drm/xe/xe_guc_submit.c @@ -1722,6 +1722,9 @@ int xe_guc_submit_reset_prepare(struct xe_guc *guc) { int ret; + if (!guc->submission_state.initialized) + return 0; + /* * Using an atomic here rather than submission_state.lock as this * function can be called while holding the CT lock (engine reset -- GitLab From cc0a3fd781bf83d631d988568871808d06046e75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= Date: Fri, 14 Mar 2025 17:01:34 +0200 Subject: [PATCH 1812/2211] drm/i915/dsi: Fix off by one in BXT_MIPI_TRANS_VTOTAL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit c464ce6af332e7c802c36cd337cacf81db05400c upstream. BXT_MIPI_TRANS_VTOTAL must be programmed with vtotal-1 instead of vtotal. Make it so. Cc: stable@vger.kernel.org Signed-off-by: Ville Syrjälä Link: https://patchwork.freedesktop.org/patch/msgid/20250314150136.22564-1-ville.syrjala@linux.intel.com Reviewed-by: Jani Nikula (cherry picked from commit 7b3685c9b38c3097f465efec8b24dbed63258cf6) Signed-off-by: Joonas Lahtinen Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/i915/display/vlv_dsi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c index d21f3fb397060..3c7789ca62075 100644 --- a/drivers/gpu/drm/i915/display/vlv_dsi.c +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c @@ -1059,7 +1059,7 @@ static void bxt_dsi_get_pipe_config(struct intel_encoder *encoder, BXT_MIPI_TRANS_VACTIVE(port)); adjusted_mode->crtc_vtotal = intel_de_read(display, - BXT_MIPI_TRANS_VTOTAL(port)); + BXT_MIPI_TRANS_VTOTAL(port)) + 1; hactive = adjusted_mode->crtc_hdisplay; hfp = intel_de_read(display, MIPI_HFP_COUNT(display, port)); @@ -1264,7 +1264,7 @@ static void set_dsi_timings(struct intel_encoder *encoder, intel_de_write(display, BXT_MIPI_TRANS_VACTIVE(port), adjusted_mode->crtc_vdisplay); intel_de_write(display, BXT_MIPI_TRANS_VTOTAL(port), - adjusted_mode->crtc_vtotal); + adjusted_mode->crtc_vtotal - 1); } intel_de_write(display, MIPI_HACTIVE_AREA_COUNT(display, port), -- GitLab From 9cfa2fea2566fc488aa59e80ea00422c3e441e47 Mon Sep 17 00:00:00 2001 From: Jesse Zhang Date: Mon, 16 Jun 2025 19:21:41 +0800 Subject: [PATCH 1813/2211] drm/amdgpu: Fix SDMA UTC_L1 handling during start/stop sequences commit 7f3b16f3f229e37cc3e02e9e4e7106c523b119e9 upstream. This commit makes two key fixes to SDMA v4.4.2 handling: 1. disable UTC_L1 in sdma_cntl register when stopping SDMA engines by reading the current value before modifying UTC_L1_ENABLE bit. 2. Ensure UTC_L1_ENABLE is consistently managed by: - Adding the missing register write when enabling UTC_L1 during start - Keeping UTC_L1 enabled by default as per hardware requirements v2: Correct SDMA_CNTL setting (Philip) Suggested-by: Jonathan Kim Signed-off-by: Jesse Zhang Acked-by: Alex Deucher Signed-off-by: Alex Deucher (cherry picked from commit 375bf564654e85a7b1b0657b191645b3edca1bda) Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c index 4dd86c682ee6a..1e4ce06f5f2c3 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c @@ -485,7 +485,7 @@ static void sdma_v4_4_2_inst_gfx_stop(struct amdgpu_device *adev, { struct amdgpu_ring *sdma[AMDGPU_MAX_SDMA_INSTANCES]; u32 doorbell_offset, doorbell; - u32 rb_cntl, ib_cntl; + u32 rb_cntl, ib_cntl, sdma_cntl; int i; for_each_inst(i, inst_mask) { @@ -497,6 +497,9 @@ static void sdma_v4_4_2_inst_gfx_stop(struct amdgpu_device *adev, ib_cntl = RREG32_SDMA(i, regSDMA_GFX_IB_CNTL); ib_cntl = REG_SET_FIELD(ib_cntl, SDMA_GFX_IB_CNTL, IB_ENABLE, 0); WREG32_SDMA(i, regSDMA_GFX_IB_CNTL, ib_cntl); + sdma_cntl = RREG32_SDMA(i, regSDMA_CNTL); + sdma_cntl = REG_SET_FIELD(sdma_cntl, SDMA_CNTL, UTC_L1_ENABLE, 0); + WREG32_SDMA(i, regSDMA_CNTL, sdma_cntl); if (sdma[i]->use_doorbell) { doorbell = RREG32_SDMA(i, regSDMA_GFX_DOORBELL); @@ -953,6 +956,7 @@ static int sdma_v4_4_2_inst_start(struct amdgpu_device *adev, /* set utc l1 enable flag always to 1 */ temp = RREG32_SDMA(i, regSDMA_CNTL); temp = REG_SET_FIELD(temp, SDMA_CNTL, UTC_L1_ENABLE, 1); + WREG32_SDMA(i, regSDMA_CNTL, temp); if (amdgpu_ip_version(adev, SDMA0_HWIP, 0) < IP_VERSION(4, 4, 5)) { /* enable context empty interrupt during initialization */ -- GitLab From 5f2e040f19c4d73496ac8c32f2c441a6146430c9 Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Mon, 2 Jun 2025 11:31:52 -0400 Subject: [PATCH 1814/2211] drm/amdgpu: switch job hw_fence to amdgpu_fence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit ebe43542702c3d15d1a1d95e8e13b1b54076f05a upstream. Use the amdgpu fence container so we can store additional data in the fence. This also fixes the start_time handling for MCBP since we were casting the fence to an amdgpu_fence and it wasn't. Fixes: 3f4c175d62d8 ("drm/amdgpu: MCBP based on DRM scheduler (v9)") Reviewed-by: Christian König Signed-off-by: Alex Deucher (cherry picked from commit bf1cd14f9e2e1fdf981eed273ddd595863f5288c) Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 30 +++++---------------- drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 12 ++++----- drivers/gpu/drm/amd/amdgpu/amdgpu_job.h | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 16 +++++++++++ 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c index 9da4414de6177..81f16e4447f8e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c @@ -1902,7 +1902,7 @@ no_preempt: continue; } job = to_amdgpu_job(s_job); - if (preempted && (&job->hw_fence) == fence) + if (preempted && (&job->hw_fence.base) == fence) /* mark the job as preempted */ job->preemption_status |= AMDGPU_IB_PREEMPTED; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index ca0411c9500e7..a55e611605fca 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -5861,7 +5861,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev, * * job->base holds a reference to parent fence */ - if (job && dma_fence_is_signaled(&job->hw_fence)) { + if (job && dma_fence_is_signaled(&job->hw_fence.base)) { job_signaled = true; dev_info(adev->dev, "Guilty job already signaled, skipping HW reset"); goto skip_hw_reset; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index 2f24a6aa13bf6..569e0e5373927 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c @@ -41,22 +41,6 @@ #include "amdgpu_trace.h" #include "amdgpu_reset.h" -/* - * Fences mark an event in the GPUs pipeline and are used - * for GPU/CPU synchronization. When the fence is written, - * it is expected that all buffers associated with that fence - * are no longer in use by the associated ring on the GPU and - * that the relevant GPU caches have been flushed. - */ - -struct amdgpu_fence { - struct dma_fence base; - - /* RB, DMA, etc. */ - struct amdgpu_ring *ring; - ktime_t start_timestamp; -}; - static struct kmem_cache *amdgpu_fence_slab; int amdgpu_fence_slab_init(void) @@ -151,12 +135,12 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f, struct amd am_fence = kmem_cache_alloc(amdgpu_fence_slab, GFP_ATOMIC); if (am_fence == NULL) return -ENOMEM; - fence = &am_fence->base; - am_fence->ring = ring; } else { /* take use of job-embedded fence */ - fence = &job->hw_fence; + am_fence = &job->hw_fence; } + fence = &am_fence->base; + am_fence->ring = ring; seq = ++ring->fence_drv.sync_seq; if (job && job->job_run_counter) { @@ -718,7 +702,7 @@ void amdgpu_fence_driver_clear_job_fences(struct amdgpu_ring *ring) * it right here or we won't be able to track them in fence_drv * and they will remain unsignaled during sa_bo free. */ - job = container_of(old, struct amdgpu_job, hw_fence); + job = container_of(old, struct amdgpu_job, hw_fence.base); if (!job->base.s_fence && !dma_fence_is_signaled(old)) dma_fence_signal(old); RCU_INIT_POINTER(*ptr, NULL); @@ -780,7 +764,7 @@ static const char *amdgpu_fence_get_timeline_name(struct dma_fence *f) static const char *amdgpu_job_fence_get_timeline_name(struct dma_fence *f) { - struct amdgpu_job *job = container_of(f, struct amdgpu_job, hw_fence); + struct amdgpu_job *job = container_of(f, struct amdgpu_job, hw_fence.base); return (const char *)to_amdgpu_ring(job->base.sched)->name; } @@ -810,7 +794,7 @@ static bool amdgpu_fence_enable_signaling(struct dma_fence *f) */ static bool amdgpu_job_fence_enable_signaling(struct dma_fence *f) { - struct amdgpu_job *job = container_of(f, struct amdgpu_job, hw_fence); + struct amdgpu_job *job = container_of(f, struct amdgpu_job, hw_fence.base); if (!timer_pending(&to_amdgpu_ring(job->base.sched)->fence_drv.fallback_timer)) amdgpu_fence_schedule_fallback(to_amdgpu_ring(job->base.sched)); @@ -845,7 +829,7 @@ static void amdgpu_job_fence_free(struct rcu_head *rcu) struct dma_fence *f = container_of(rcu, struct dma_fence, rcu); /* free job if fence has a parent job */ - kfree(container_of(f, struct amdgpu_job, hw_fence)); + kfree(container_of(f, struct amdgpu_job, hw_fence.base)); } /** diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index 1ce20a19be8ba..7e6057a6e7f17 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c @@ -259,8 +259,8 @@ void amdgpu_job_free_resources(struct amdgpu_job *job) /* Check if any fences where initialized */ if (job->base.s_fence && job->base.s_fence->finished.ops) f = &job->base.s_fence->finished; - else if (job->hw_fence.ops) - f = &job->hw_fence; + else if (job->hw_fence.base.ops) + f = &job->hw_fence.base; else f = NULL; @@ -277,10 +277,10 @@ static void amdgpu_job_free_cb(struct drm_sched_job *s_job) amdgpu_sync_free(&job->explicit_sync); /* only put the hw fence if has embedded fence */ - if (!job->hw_fence.ops) + if (!job->hw_fence.base.ops) kfree(job); else - dma_fence_put(&job->hw_fence); + dma_fence_put(&job->hw_fence.base); } void amdgpu_job_set_gang_leader(struct amdgpu_job *job, @@ -309,10 +309,10 @@ void amdgpu_job_free(struct amdgpu_job *job) if (job->gang_submit != &job->base.s_fence->scheduled) dma_fence_put(job->gang_submit); - if (!job->hw_fence.ops) + if (!job->hw_fence.base.ops) kfree(job); else - dma_fence_put(&job->hw_fence); + dma_fence_put(&job->hw_fence.base); } struct dma_fence *amdgpu_job_submit(struct amdgpu_job *job) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h index ce6b9ba967fff..4fe033d8f3568 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h @@ -48,7 +48,7 @@ struct amdgpu_job { struct drm_sched_job base; struct amdgpu_vm *vm; struct amdgpu_sync explicit_sync; - struct dma_fence hw_fence; + struct amdgpu_fence hw_fence; struct dma_fence *gang_submit; uint32_t preamble_status; uint32_t preemption_status; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h index f93f510022018..9af2cda676ad7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h @@ -126,6 +126,22 @@ struct amdgpu_fence_driver { struct dma_fence **fences; }; +/* + * Fences mark an event in the GPUs pipeline and are used + * for GPU/CPU synchronization. When the fence is written, + * it is expected that all buffers associated with that fence + * are no longer in use by the associated ring on the GPU and + * that the relevant GPU caches have been flushed. + */ + +struct amdgpu_fence { + struct dma_fence base; + + /* RB, DMA, etc. */ + struct amdgpu_ring *ring; + ktime_t start_timestamp; +}; + extern const struct drm_sched_backend_ops amdgpu_sched_ops; void amdgpu_fence_driver_clear_job_fences(struct amdgpu_ring *ring); -- GitLab From 8cd7ee9cd7decf195a4fa0098a1a0308d85f9ad9 Mon Sep 17 00:00:00 2001 From: Alex Hung Date: Thu, 29 May 2025 10:59:19 -0600 Subject: [PATCH 1815/2211] drm/amd/display: Fix mpv playback corruption on weston commit 8724a5380c4390eed81e271d22f34ff06453ded9 upstream. [WHAT] Severe video playback corruption is observed in the following setup: weston 14.0.90 (built from source) + mpv v0.40.0 with command: mpv bbb_sunflower_1080p_60fps_normal.mp4 --vo=gpu [HOW] ABGR16161616 needs to be included in dml2/2.1 translation. Cc: Mario Limonciello Cc: Alex Deucher Acked-by: Aurabindo Pillai Reviewed-by: Harry Wentland Reviewed-by: Austin Zheng Signed-off-by: Alex Hung Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher (cherry picked from commit d023de809f85307ca819a9dbbceee6ae1f50e2ad) Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- .../gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c | 1 + drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c | 1 + 2 files changed, 2 insertions(+) diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c b/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c index 7e3d506bb79b9..f3aa93ddbf9c9 100644 --- a/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c @@ -762,6 +762,7 @@ static void populate_dml21_plane_config_from_plane_state(struct dml2_context *dm plane->pixel_format = dml2_420_10; break; case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: plane->pixel_format = dml2_444_64; diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c b/drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c index 92a3fff1e2616..405aefd14d9b4 100644 --- a/drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c @@ -909,6 +909,7 @@ static void populate_dml_surface_cfg_from_plane_state(enum dml_project_id dml2_p out->SourcePixelFormat[location] = dml_420_10; break; case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: out->SourcePixelFormat[location] = dml_444_64; -- GitLab From 0519b6107583ccf45ffbd3873292aeb8fe4dbff8 Mon Sep 17 00:00:00 2001 From: Ricardo Ribalda Date: Mon, 24 Feb 2025 10:34:55 +0000 Subject: [PATCH 1816/2211] media: uvcvideo: Rollback non processed entities on error commit a70705d3c020d0d5c3ab6a5cc93e011ac35e7d48 upstream. If we fail to commit an entity, we need to restore the UVC_CTRL_DATA_BACKUP for the other uncommitted entities. Otherwise the control cache and the device would be out of sync. Cc: stable@kernel.org Fixes: b4012002f3a3 ("[media] uvcvideo: Add support for control events") Reported-by: Hans de Goede Closes: https://lore.kernel.org/linux-media/fe845e04-9fde-46ee-9763-a6f00867929a@redhat.com/ Signed-off-by: Ricardo Ribalda Message-ID: <20250224-uvc-data-backup-v2-3-de993ed9823b@chromium.org> Signed-off-by: Hans de Goede Signed-off-by: Hans Verkuil Signed-off-by: Ricardo Ribalda Signed-off-by: Greg Kroah-Hartman --- drivers/media/usb/uvc/uvc_ctrl.c | 34 +++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index c70d9c24c6fb3..957d620ad671c 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1848,7 +1848,7 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev, unsigned int processed_ctrls = 0; struct uvc_control *ctrl; unsigned int i; - int ret; + int ret = 0; if (entity == NULL) return 0; @@ -1877,8 +1877,6 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev, dev->intfnum, ctrl->info.selector, uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), ctrl->info.size); - else - ret = 0; if (!ret) processed_ctrls++; @@ -1890,17 +1888,24 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev, ctrl->dirty = 0; - if (ret < 0) { + if (ret < 0 && !rollback) { if (err_ctrl) *err_ctrl = ctrl; - return ret; + /* + * If we fail to set a control, we need to rollback + * the next ones. + */ + rollback = 1; } - if (!rollback && handle && + if (!rollback && handle && !ret && ctrl->info.flags & UVC_CTRL_FLAG_ASYNCHRONOUS) uvc_ctrl_set_handle(handle, ctrl, handle); } + if (ret) + return ret; + return processed_ctrls; } @@ -1931,7 +1936,8 @@ int __uvc_ctrl_commit(struct uvc_fh *handle, int rollback, struct uvc_video_chain *chain = handle->chain; struct uvc_control *err_ctrl; struct uvc_entity *entity; - int ret = 0; + int ret_out = 0; + int ret; /* Find the control. */ list_for_each_entry(entity, &chain->entities, chain) { @@ -1942,17 +1948,23 @@ int __uvc_ctrl_commit(struct uvc_fh *handle, int rollback, ctrls->error_idx = uvc_ctrl_find_ctrl_idx(entity, ctrls, err_ctrl); - goto done; + /* + * When we fail to commit an entity, we need to + * restore the UVC_CTRL_DATA_BACKUP for all the + * controls in the other entities, otherwise our cache + * and the hardware will be out of sync. + */ + rollback = 1; + + ret_out = ret; } else if (ret > 0 && !rollback) { uvc_ctrl_send_events(handle, entity, ctrls->controls, ctrls->count); } } - ret = 0; -done: mutex_unlock(&chain->ctrl_mutex); - return ret; + return ret_out; } int uvc_ctrl_get(struct uvc_video_chain *chain, -- GitLab From f609cebca1e29ce4a92c2c7c9b2533601539ab50 Mon Sep 17 00:00:00 2001 From: "Chang S. Bae" Date: Tue, 15 Apr 2025 19:16:57 -0700 Subject: [PATCH 1817/2211] x86/fpu: Refactor xfeature bitmask update code for sigframe XSAVE commit 64e54461ab6e8524a8de4e63b7d1a3e4481b5cf3 upstream. Currently, saving register states in the signal frame, the legacy feature bits are always set in xregs_state->header->xfeatures. This code sequence can be generalized for reuse in similar cases. Refactor the logic to ensure a consistent approach across similar usages. Signed-off-by: Chang S. Bae Signed-off-by: Ingo Molnar Cc: Andy Lutomirski Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Oleg Nesterov Link: https://lore.kernel.org/r/20250416021720.12305-8-chang.seok.bae@intel.com Cc: Ben Hutchings Signed-off-by: Greg Kroah-Hartman --- arch/x86/kernel/fpu/signal.c | 11 +---------- arch/x86/kernel/fpu/xstate.h | 13 +++++++++++++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/arch/x86/kernel/fpu/signal.c b/arch/x86/kernel/fpu/signal.c index 8f62e0666dea5..8abe60919e2f9 100644 --- a/arch/x86/kernel/fpu/signal.c +++ b/arch/x86/kernel/fpu/signal.c @@ -119,7 +119,6 @@ static inline bool save_xstate_epilog(void __user *buf, int ia32_frame, { struct xregs_state __user *x = buf; struct _fpx_sw_bytes sw_bytes = {}; - u32 xfeatures; int err; /* Setup the bytes not touched by the [f]xsave and reserved for SW. */ @@ -132,12 +131,6 @@ static inline bool save_xstate_epilog(void __user *buf, int ia32_frame, err |= __put_user(FP_XSTATE_MAGIC2, (__u32 __user *)(buf + fpstate->user_size)); - /* - * Read the xfeatures which we copied (directly from the cpu or - * from the state in task struct) to the user buffers. - */ - err |= __get_user(xfeatures, (__u32 __user *)&x->header.xfeatures); - /* * For legacy compatible, we always set FP/SSE bits in the bit * vector while saving the state to the user context. This will @@ -149,9 +142,7 @@ static inline bool save_xstate_epilog(void __user *buf, int ia32_frame, * header as well as change any contents in the memory layout. * xrestore as part of sigreturn will capture all the changes. */ - xfeatures |= XFEATURE_MASK_FPSSE; - - err |= __put_user(xfeatures, (__u32 __user *)&x->header.xfeatures); + err |= set_xfeature_in_sigframe(x, XFEATURE_MASK_FPSSE); return !err; } diff --git a/arch/x86/kernel/fpu/xstate.h b/arch/x86/kernel/fpu/xstate.h index aa16f1a1bbcf1..422aca3a26236 100644 --- a/arch/x86/kernel/fpu/xstate.h +++ b/arch/x86/kernel/fpu/xstate.h @@ -69,6 +69,19 @@ static inline u64 xfeatures_mask_independent(void) return fpu_kernel_cfg.independent_features; } +static inline int set_xfeature_in_sigframe(struct xregs_state __user *xbuf, u64 mask) +{ + u64 xfeatures; + int err; + + /* Read the xfeatures value already saved in the user buffer */ + err = __get_user(xfeatures, &xbuf->header.xfeatures); + xfeatures |= mask; + err |= __put_user(xfeatures, &xbuf->header.xfeatures); + + return err; +} + /* * Update the value of PKRU register that was already pushed onto the signal frame. */ -- GitLab From c216c235ac1b3f07e5f17310be89713369d7f73b Mon Sep 17 00:00:00 2001 From: "Chang S. Bae" Date: Tue, 15 Apr 2025 19:16:58 -0700 Subject: [PATCH 1818/2211] x86/pkeys: Simplify PKRU update in signal frame commit d1e420772cd1eb0afe5858619c73ce36f3e781a1 upstream. The signal delivery logic was modified to always set the PKRU bit in xregs_state->header->xfeatures by this commit: ae6012d72fa6 ("x86/pkeys: Ensure updated PKRU value is XRSTOR'd") However, the change derives the bitmask value using XGETBV(1), rather than simply updating the buffer that already holds the value. Thus, this approach induces an unnecessary dependency on XGETBV1 for PKRU handling. Eliminate the dependency by using the established helper function. Subsequently, remove the now-unused 'mask' argument. Signed-off-by: Chang S. Bae Signed-off-by: Ingo Molnar Cc: Andy Lutomirski Cc: Aruna Ramakrishna Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Oleg Nesterov Cc: Tony W Wang-oc Cc: Dave Hansen Link: https://lore.kernel.org/r/20250416021720.12305-9-chang.seok.bae@intel.com Cc: Ben Hutchings Signed-off-by: Greg Kroah-Hartman --- arch/x86/kernel/fpu/xstate.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/arch/x86/kernel/fpu/xstate.h b/arch/x86/kernel/fpu/xstate.h index 422aca3a26236..f7d8f3d73599e 100644 --- a/arch/x86/kernel/fpu/xstate.h +++ b/arch/x86/kernel/fpu/xstate.h @@ -85,18 +85,15 @@ static inline int set_xfeature_in_sigframe(struct xregs_state __user *xbuf, u64 /* * Update the value of PKRU register that was already pushed onto the signal frame. */ -static inline int update_pkru_in_sigframe(struct xregs_state __user *buf, u64 mask, u32 pkru) +static inline int update_pkru_in_sigframe(struct xregs_state __user *buf, u32 pkru) { - u64 xstate_bv; int err; if (unlikely(!cpu_feature_enabled(X86_FEATURE_OSPKE))) return 0; /* Mark PKRU as in-use so that it is restored correctly. */ - xstate_bv = (mask & xfeatures_in_use()) | XFEATURE_MASK_PKRU; - - err = __put_user(xstate_bv, &buf->header.xfeatures); + err = set_xfeature_in_sigframe(buf, XFEATURE_MASK_PKRU); if (err) return err; @@ -317,7 +314,7 @@ static inline int xsave_to_user_sigframe(struct xregs_state __user *buf, u32 pkr clac(); if (!err) - err = update_pkru_in_sigframe(buf, mask, pkru); + err = update_pkru_in_sigframe(buf, pkru); return err; } -- GitLab From 6d56ea133adf0389b216ba6e47f7f35e95776713 Mon Sep 17 00:00:00 2001 From: Jiawen Wu Date: Mon, 24 Mar 2025 18:32:35 +0800 Subject: [PATCH 1819/2211] net: libwx: fix Tx L4 checksum commit c7d82913d5f9e97860772ee4051eaa66b56a6273 upstream. The hardware only supports L4 checksum offload for TCP/UDP/SCTP protocol. There was a bug to set Tx checksum flag for the other protocol that results in Tx ring hang. Fix to compute software checksum for these packets. Fixes: 3403960cdf86 ("net: wangxun: libwx add tx offload functions") Signed-off-by: Jiawen Wu Link: https://patch.msgid.link/20250324103235.823096-2-jiawenwu@trustnetic.com Signed-off-by: Jakub Kicinski Signed-off-by: Wenshan Lan Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/wangxun/libwx/wx_lib.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.c b/drivers/net/ethernet/wangxun/libwx/wx_lib.c index 8450856cc4abd..d8a6fea961c02 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c +++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c @@ -1336,6 +1336,7 @@ static void wx_tx_csum(struct wx_ring *tx_ring, struct wx_tx_buffer *first, u8 tun_prot = 0; if (skb->ip_summed != CHECKSUM_PARTIAL) { +csum_failed: if (!(first->tx_flags & WX_TX_FLAGS_HW_VLAN) && !(first->tx_flags & WX_TX_FLAGS_CC)) return; @@ -1429,7 +1430,8 @@ static void wx_tx_csum(struct wx_ring *tx_ring, struct wx_tx_buffer *first, WX_TXD_L4LEN_SHIFT; break; default: - break; + skb_checksum_help(skb); + goto csum_failed; } /* update TX checksum flag */ -- GitLab From 8b8a366e8cb266883bf794b9efc0513c3c356d04 Mon Sep 17 00:00:00 2001 From: Penglei Jiang Date: Tue, 17 Jun 2025 09:56:44 -0700 Subject: [PATCH 1820/2211] io_uring: fix potential page leak in io_sqe_buffer_register() Commit e1c75831f682eef0f68b35723437146ed86070b1 upstream. If allocation of the 'imu' fails, then the existing pages aren't unpinned in the error path. This is mostly a theoretical issue, requiring fault injection to hit. Move unpin_user_pages() to unified error handling to fix the page leak issue. Fixes: d8c2237d0aa9 ("io_uring: add io_pin_pages() helper") Signed-off-by: Penglei Jiang Link: https://lore.kernel.org/r/20250617165644.79165-1-superman.xpt@gmail.com Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- io_uring/rsrc.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c index a67bae350416b..9983b940eb574 100644 --- a/io_uring/rsrc.c +++ b/io_uring/rsrc.c @@ -983,10 +983,8 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov, goto done; ret = io_buffer_account_pin(ctx, pages, nr_pages, imu, last_hpage); - if (ret) { - unpin_user_pages(pages, nr_pages); + if (ret) goto done; - } size = iov->iov_len; /* store original address for later verification */ @@ -1010,8 +1008,11 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov, size -= vec_len; } done: - if (ret) + if (ret) { kvfree(imu); + if (pages) + unpin_user_pages(pages, nr_pages); + } kvfree(pages); return ret; } -- GitLab From 53fd75f25b223878b5fff14932e3a22f42b54f77 Mon Sep 17 00:00:00 2001 From: Pavel Begunkov Date: Tue, 24 Jun 2025 14:40:33 +0100 Subject: [PATCH 1821/2211] io_uring/rsrc: fix folio unpinning Commit 5afb4bf9fc62d828647647ec31745083637132e4 upstream. syzbot complains about an unmapping failure: [ 108.070381][ T14] kernel BUG at mm/gup.c:71! [ 108.070502][ T14] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP [ 108.123672][ T14] Hardware name: QEMU KVM Virtual Machine, BIOS edk2-20250221-8.fc42 02/21/2025 [ 108.127458][ T14] Workqueue: iou_exit io_ring_exit_work [ 108.174205][ T14] Call trace: [ 108.175649][ T14] sanity_check_pinned_pages+0x7cc/0x7d0 (P) [ 108.178138][ T14] unpin_user_page+0x80/0x10c [ 108.180189][ T14] io_release_ubuf+0x84/0xf8 [ 108.182196][ T14] io_free_rsrc_node+0x250/0x57c [ 108.184345][ T14] io_rsrc_data_free+0x148/0x298 [ 108.186493][ T14] io_sqe_buffers_unregister+0x84/0xa0 [ 108.188991][ T14] io_ring_ctx_free+0x48/0x480 [ 108.191057][ T14] io_ring_exit_work+0x764/0x7d8 [ 108.193207][ T14] process_one_work+0x7e8/0x155c [ 108.195431][ T14] worker_thread+0x958/0xed8 [ 108.197561][ T14] kthread+0x5fc/0x75c [ 108.199362][ T14] ret_from_fork+0x10/0x20 We can pin a tail page of a folio, but then io_uring will try to unpin the head page of the folio. While it should be fine in terms of keeping the page actually alive, mm folks say it's wrong and triggers a debug warning. Use unpin_user_folio() instead of unpin_user_page*. Cc: stable@vger.kernel.org Debugged-by: David Hildenbrand Reported-by: syzbot+1d335893772467199ab6@syzkaller.appspotmail.com Closes: https://lkml.kernel.org/r/683f1551.050a0220.55ceb.0017.GAE@google.com Fixes: a8edbb424b139 ("io_uring/rsrc: enable multi-hugepage buffer coalescing") Signed-off-by: Pavel Begunkov Link: https://lore.kernel.org/io-uring/a28b0f87339ac2acf14a645dad1e95bbcbf18acd.1750771718.git.asml.silence@gmail.com/ [axboe: adapt to current tree, massage commit message] Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- io_uring/rsrc.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c index 9983b940eb574..1380fe8bf7c8a 100644 --- a/io_uring/rsrc.c +++ b/io_uring/rsrc.c @@ -119,8 +119,11 @@ static void io_buffer_unmap(struct io_ring_ctx *ctx, struct io_mapped_ubuf **slo if (imu != &dummy_ubuf) { if (!refcount_dec_and_test(&imu->refs)) return; - for (i = 0; i < imu->nr_bvecs; i++) - unpin_user_page(imu->bvec[i].bv_page); + for (i = 0; i < imu->nr_bvecs; i++) { + struct folio *folio = page_folio(imu->bvec[i].bv_page); + + unpin_user_folio(folio, 1); + } if (imu->acct_pages) io_unaccount_mem(ctx, imu->acct_pages); kvfree(imu); @@ -1010,8 +1013,10 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov, done: if (ret) { kvfree(imu); - if (pages) - unpin_user_pages(pages, nr_pages); + if (pages) { + for (i = 0; i < nr_pages; i++) + unpin_user_folio(page_folio(pages[i]), 1); + } } kvfree(pages); return ret; -- GitLab From 50998b0ae7d9d552e96d8b7239981cf05f65eff5 Mon Sep 17 00:00:00 2001 From: Pavel Begunkov Date: Tue, 24 Jun 2025 14:40:34 +0100 Subject: [PATCH 1822/2211] io_uring/rsrc: don't rely on user vaddr alignment Commit 3a3c6d61577dbb23c09df3e21f6f9eda1ecd634b upstream. There is no guaranteed alignment for user pointers, however the calculation of an offset of the first page into a folio after coalescing uses some weird bit mask logic, get rid of it. Cc: stable@vger.kernel.org Reported-by: David Hildenbrand Fixes: a8edbb424b139 ("io_uring/rsrc: enable multi-hugepage buffer coalescing") Signed-off-by: Pavel Begunkov Link: https://lore.kernel.org/io-uring/e387b4c78b33f231105a601d84eefd8301f57954.1750771718.git.asml.silence@gmail.com/ Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- io_uring/rsrc.c | 5 ++++- io_uring/rsrc.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c index 1380fe8bf7c8a..1687e35e21c93 100644 --- a/io_uring/rsrc.c +++ b/io_uring/rsrc.c @@ -918,6 +918,7 @@ static bool io_try_coalesce_buffer(struct page ***pages, int *nr_pages, return false; data->folio_shift = folio_shift(folio); + data->first_folio_page_idx = folio_page_idx(folio, page_array[0]); /* * Check if pages are contiguous inside a folio, and all folios have * the same page count except for the head and tail. @@ -998,7 +999,9 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov, if (coalesced) imu->folio_shift = data.folio_shift; refcount_set(&imu->refs, 1); - off = (unsigned long) iov->iov_base & ((1UL << imu->folio_shift) - 1); + off = (unsigned long)iov->iov_base & ~PAGE_MASK; + if (coalesced) + off += data.first_folio_page_idx << PAGE_SHIFT; *pimu = imu; ret = 0; diff --git a/io_uring/rsrc.h b/io_uring/rsrc.h index 8ed5880362102..459cf4c6e8564 100644 --- a/io_uring/rsrc.h +++ b/io_uring/rsrc.h @@ -56,6 +56,7 @@ struct io_imu_folio_data { /* For non-head/tail folios, has to be fully included */ unsigned int nr_pages_mid; unsigned int folio_shift; + unsigned long first_folio_page_idx; }; void io_rsrc_node_ref_zero(struct io_rsrc_node *node); -- GitLab From 399214d70304acba4068ae203534a122d7faa792 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Sat, 8 Feb 2025 10:50:34 -0700 Subject: [PATCH 1823/2211] io_uring/net: improve recv bundles Commit 7c71a0af81ba72de9b2c501065e4e718aba9a271 upstream. Current recv bundles are only supported for multishot receives, and additionally they also always post at least 2 CQEs if more data is available than what a buffer will hold. This happens because the initial bundle recv will do a single buffer, and then do the rest of what is in the socket as a followup receive. As shown in a test program, if 1k buffers are available and 32k is available to receive in the socket, you'd get the following completions: bundle=1, mshot=0 cqe res 1024 cqe res 1024 [...] cqe res 1024 bundle=1, mshot=1 cqe res 1024 cqe res 31744 where bundle=1 && mshot=0 will post 32 1k completions, and bundle=1 && mshot=1 will post a 1k completion and then a 31k completion. To support bundle recv without multishot, it's possible to simply retry the recv immediately and post a single completion, rather than split it into two completions. With the below patch, the same test looks as follows: bundle=1, mshot=0 cqe res 32768 bundle=1, mshot=1 cqe res 32768 where mshot=0 works fine for bundles, and both of them post just a single 32k completion rather than split it into separate completions. Posting fewer completions is always a nice win, and not needing multishot for proper bundle efficiency is nice for cases that can't necessarily use multishot. Reported-by: Norman Maurer Link: https://lore.kernel.org/r/184f9f92-a682-4205-a15d-89e18f664502@kernel.dk Fixes: 2f9c9515bdfd ("io_uring/net: support bundles for recv") Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- io_uring/net.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/io_uring/net.c b/io_uring/net.c index 384915d931b72..38f74dc5b9e71 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -76,6 +76,7 @@ struct io_sr_msg { /* initialised and used only by !msg send variants */ u16 addr_len; u16 buf_group; + bool retry; void __user *addr; void __user *msg_control; /* used only for send zerocopy */ @@ -203,6 +204,7 @@ static inline void io_mshot_prep_retry(struct io_kiocb *req, req->flags &= ~REQ_F_BL_EMPTY; sr->done_io = 0; + sr->retry = false; sr->len = 0; /* get from the provided buffer */ req->buf_index = sr->buf_group; } @@ -409,6 +411,7 @@ int io_sendmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg); sr->done_io = 0; + sr->retry = false; if (req->opcode == IORING_OP_SEND) { if (READ_ONCE(sqe->__pad3[0])) @@ -780,6 +783,7 @@ int io_recvmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg); sr->done_io = 0; + sr->retry = false; if (unlikely(sqe->file_index || sqe->addr2)) return -EINVAL; @@ -828,6 +832,9 @@ int io_recvmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) return io_recvmsg_prep_setup(req); } +/* bits to clear in old and inherit in new cflags on bundle retry */ +#define CQE_F_MASK (IORING_CQE_F_SOCK_NONEMPTY|IORING_CQE_F_MORE) + /* * Finishes io_recv and io_recvmsg. * @@ -847,9 +854,19 @@ static inline bool io_recv_finish(struct io_kiocb *req, int *ret, if (sr->flags & IORING_RECVSEND_BUNDLE) { cflags |= io_put_kbufs(req, *ret, io_bundle_nbufs(kmsg, *ret), issue_flags); + if (sr->retry) + cflags = req->cqe.flags | (cflags & CQE_F_MASK); /* bundle with no more immediate buffers, we're done */ if (req->flags & REQ_F_BL_EMPTY) goto finish; + /* if more is available, retry and append to this one */ + if (!sr->retry && kmsg->msg.msg_inq > 0 && *ret > 0) { + req->cqe.flags = cflags & ~CQE_F_MASK; + sr->len = kmsg->msg.msg_inq; + sr->done_io += *ret; + sr->retry = true; + return false; + } } else { cflags |= io_put_kbuf(req, *ret, issue_flags); } @@ -1228,6 +1245,7 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) struct io_kiocb *notif; zc->done_io = 0; + zc->retry = false; req->flags |= REQ_F_POLL_NO_LAZY; if (unlikely(READ_ONCE(sqe->__pad2[0]) || READ_ONCE(sqe->addr3))) -- GitLab From 0c07f2bf49f268836173a2fabcbe4b5f9995220d Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 21 May 2025 18:51:49 -0600 Subject: [PATCH 1824/2211] io_uring/net: only retry recv bundle for a full transfer Commit 3a08988123c868dbfdd054541b1090fb891fa49e upstream. If a shorter than assumed transfer was seen, a partial buffer will have been filled. For that case it isn't sane to attempt to fill more into the bundle before posting a completion, as that will cause a gap in the received data. Check if the iterator has hit zero and only allow to continue a bundle operation if that is the case. Also ensure that for putting finished buffers, only the current transfer is accounted. Otherwise too many buffers may be put for a short transfer. Link: https://github.com/axboe/liburing/issues/1409 Cc: stable@vger.kernel.org Fixes: 7c71a0af81ba ("io_uring/net: improve recv bundles") Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- io_uring/net.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/io_uring/net.c b/io_uring/net.c index 38f74dc5b9e71..0df6876f70beb 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -852,18 +852,24 @@ static inline bool io_recv_finish(struct io_kiocb *req, int *ret, cflags |= IORING_CQE_F_SOCK_NONEMPTY; if (sr->flags & IORING_RECVSEND_BUNDLE) { - cflags |= io_put_kbufs(req, *ret, io_bundle_nbufs(kmsg, *ret), + size_t this_ret = *ret - sr->done_io; + + cflags |= io_put_kbufs(req, *ret, io_bundle_nbufs(kmsg, this_ret), issue_flags); if (sr->retry) cflags = req->cqe.flags | (cflags & CQE_F_MASK); /* bundle with no more immediate buffers, we're done */ if (req->flags & REQ_F_BL_EMPTY) goto finish; - /* if more is available, retry and append to this one */ - if (!sr->retry && kmsg->msg.msg_inq > 0 && *ret > 0) { + /* + * If more is available AND it was a full transfer, retry and + * append to this one + */ + if (!sr->retry && kmsg->msg.msg_inq > 0 && this_ret > 0 && + !iov_iter_count(&kmsg->msg.msg_iter)) { req->cqe.flags = cflags & ~CQE_F_MASK; sr->len = kmsg->msg.msg_inq; - sr->done_io += *ret; + sr->done_io += this_ret; sr->retry = true; return false; } -- GitLab From 725fcba8bd2e381765cd3833e41348d0c61bcc61 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 28 May 2025 13:45:44 -0600 Subject: [PATCH 1825/2211] io_uring/net: only consider msg_inq if larger than 1 Commit 2c7f023219966777be0687e15b57689894304cd3 upstream. Currently retry and general validity of msg_inq is gated on it being larger than zero, but it's entirely possible for this to be slightly inaccurate. In particular, if FIN is received, it'll return 1. Just use larger than 1 as the check. This covers both the FIN case, and at the same time, it doesn't make much sense to retry a recv immediately if there's even just a single 1 byte of valid data in the socket. Leave the SOCK_NONEMPTY flagging when larger than 0 still, as an app may use that for the final receive. Cc: stable@vger.kernel.org Reported-by: Christian Mazakas Fixes: 7c71a0af81ba ("io_uring/net: improve recv bundles") Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- io_uring/net.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/io_uring/net.c b/io_uring/net.c index 0df6876f70beb..60bba37d0e0cb 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -865,7 +865,7 @@ static inline bool io_recv_finish(struct io_kiocb *req, int *ret, * If more is available AND it was a full transfer, retry and * append to this one */ - if (!sr->retry && kmsg->msg.msg_inq > 0 && this_ret > 0 && + if (!sr->retry && kmsg->msg.msg_inq > 1 && this_ret > 0 && !iov_iter_count(&kmsg->msg.msg_iter)) { req->cqe.flags = cflags & ~CQE_F_MASK; sr->len = kmsg->msg.msg_inq; @@ -1111,7 +1111,7 @@ static int io_recv_buf_select(struct io_kiocb *req, struct io_async_msghdr *kmsg arg.mode |= KBUF_MODE_FREE; } - if (kmsg->msg.msg_inq > 0) + if (kmsg->msg.msg_inq > 1) arg.max_len = min_not_zero(sr->len, kmsg->msg.msg_inq); ret = io_buffers_peek(req, &arg); -- GitLab From b8be3ae062e63e5efade5e22995ac0077abe0070 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Fri, 20 Jun 2025 07:41:21 -0600 Subject: [PATCH 1826/2211] io_uring/net: always use current transfer count for buffer put A previous fix corrected the retry condition for when to continue a current bundle, but it missed that the current (not the total) transfer count also applies to the buffer put. If not, then for incrementally consumed buffer rings repeated completions on the same request may end up over consuming. Reported-by: Roy Tang (ErgoniaTrading) Cc: stable@vger.kernel.org Fixes: 3a08988123c8 ("io_uring/net: only retry recv bundle for a full transfer") Link: https://github.com/axboe/liburing/issues/1423 Signed-off-by: Jens Axboe (cherry picked from commit 51a4598ad5d9eb6be4ec9ba65bbfdf0ac302eb2e) Signed-off-by: Greg Kroah-Hartman --- io_uring/net.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/io_uring/net.c b/io_uring/net.c index 60bba37d0e0cb..d18b751eb8122 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -854,7 +854,7 @@ static inline bool io_recv_finish(struct io_kiocb *req, int *ret, if (sr->flags & IORING_RECVSEND_BUNDLE) { size_t this_ret = *ret - sr->done_io; - cflags |= io_put_kbufs(req, *ret, io_bundle_nbufs(kmsg, this_ret), + cflags |= io_put_kbufs(req, this_ret, io_bundle_nbufs(kmsg, this_ret), issue_flags); if (sr->retry) cflags = req->cqe.flags | (cflags & CQE_F_MASK); -- GitLab From c8d152b8c1968d3fcc5ce059225fef40dec4bca9 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 25 Jun 2025 10:17:06 -0600 Subject: [PATCH 1827/2211] io_uring/net: mark iov as dynamically allocated even for single segments Commit 9a709b7e98e6fa51600b5f2d24c5068efa6d39de upstream. A bigger array of vecs could've been allocated, but io_ring_buffers_peek() still decided to cap the mapped range depending on how much data was available. Hence don't rely on the segment count to know if the request should be marked as needing cleanup, always check upfront if the iov array is different than the fast_iov array. Fixes: 26ec15e4b0c1 ("io_uring/kbuf: don't truncate end buffer for multiple buffer peeks") Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- io_uring/net.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/io_uring/net.c b/io_uring/net.c index d18b751eb8122..5db69a45dac56 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -1118,6 +1118,12 @@ static int io_recv_buf_select(struct io_kiocb *req, struct io_async_msghdr *kmsg if (unlikely(ret < 0)) return ret; + if (arg.iovs != &kmsg->fast_iov && arg.iovs != kmsg->free_iov) { + kmsg->free_iov_nr = ret; + kmsg->free_iov = arg.iovs; + req->flags |= REQ_F_NEED_CLEANUP; + } + /* special case 1 vec, can be a fast path */ if (ret == 1) { sr->buf = arg.iovs[0].iov_base; @@ -1126,11 +1132,6 @@ static int io_recv_buf_select(struct io_kiocb *req, struct io_async_msghdr *kmsg } iov_iter_init(&kmsg->msg.msg_iter, ITER_DEST, arg.iovs, ret, arg.out_len); - if (arg.iovs != &kmsg->fast_iov && arg.iovs != kmsg->free_iov) { - kmsg->free_iov_nr = ret; - kmsg->free_iov = arg.iovs; - req->flags |= REQ_F_NEED_CLEANUP; - } } else { void __user *buf; -- GitLab From 560c3b51c799ef0ae07d30c41e920422fe6eb5b3 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Thu, 26 Jun 2025 12:17:48 -0600 Subject: [PATCH 1828/2211] io_uring/kbuf: flag partial buffer mappings A previous commit aborted mapping more for a non-incremental ring for bundle peeking, but depending on where in the process this peeking happened, it would not necessarily prevent a retry by the user. That can create gaps in the received/read data. Add struct buf_sel_arg->partial_map, which can pass this information back. The networking side can then map that to internal state and use it to gate retry as well. Since this necessitates a new flag, change io_sr_msg->retry to a retry_flags member, and store both the retry and partial map condition in there. Cc: stable@vger.kernel.org Fixes: 26ec15e4b0c1 ("io_uring/kbuf: don't truncate end buffer for multiple buffer peeks") Signed-off-by: Jens Axboe (cherry picked from commit 178b8ff66ff827c41b4fa105e9aabb99a0b5c537) Signed-off-by: Greg Kroah-Hartman --- io_uring/kbuf.c | 1 + io_uring/kbuf.h | 1 + io_uring/net.c | 23 +++++++++++++++-------- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/io_uring/kbuf.c b/io_uring/kbuf.c index c9289597522f6..9bd27deeee6fa 100644 --- a/io_uring/kbuf.c +++ b/io_uring/kbuf.c @@ -263,6 +263,7 @@ static int io_ring_buffers_peek(struct io_kiocb *req, struct buf_sel_arg *arg, if (len > arg->max_len) { len = arg->max_len; if (!(bl->flags & IOBL_INC)) { + arg->partial_map = 1; if (iov != arg->iovs) break; buf->len = len; diff --git a/io_uring/kbuf.h b/io_uring/kbuf.h index 36aadfe5ac002..2586a292dfb91 100644 --- a/io_uring/kbuf.h +++ b/io_uring/kbuf.h @@ -61,6 +61,7 @@ struct buf_sel_arg { size_t max_len; unsigned short nr_iovs; unsigned short mode; + unsigned short partial_map; }; void __user *io_buffer_select(struct io_kiocb *req, size_t *len, diff --git a/io_uring/net.c b/io_uring/net.c index 5db69a45dac56..0116cfaec8488 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -76,13 +76,18 @@ struct io_sr_msg { /* initialised and used only by !msg send variants */ u16 addr_len; u16 buf_group; - bool retry; + unsigned short retry_flags; void __user *addr; void __user *msg_control; /* used only for send zerocopy */ struct io_kiocb *notif; }; +enum sr_retry_flags { + IO_SR_MSG_RETRY = 1, + IO_SR_MSG_PARTIAL_MAP = 2, +}; + /* * Number of times we'll try and do receives if there's more data. If we * exceed this limit, then add us to the back of the queue and retry from @@ -204,7 +209,7 @@ static inline void io_mshot_prep_retry(struct io_kiocb *req, req->flags &= ~REQ_F_BL_EMPTY; sr->done_io = 0; - sr->retry = false; + sr->retry_flags = 0; sr->len = 0; /* get from the provided buffer */ req->buf_index = sr->buf_group; } @@ -411,7 +416,7 @@ int io_sendmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg); sr->done_io = 0; - sr->retry = false; + sr->retry_flags = 0; if (req->opcode == IORING_OP_SEND) { if (READ_ONCE(sqe->__pad3[0])) @@ -783,7 +788,7 @@ int io_recvmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg); sr->done_io = 0; - sr->retry = false; + sr->retry_flags = 0; if (unlikely(sqe->file_index || sqe->addr2)) return -EINVAL; @@ -856,7 +861,7 @@ static inline bool io_recv_finish(struct io_kiocb *req, int *ret, cflags |= io_put_kbufs(req, this_ret, io_bundle_nbufs(kmsg, this_ret), issue_flags); - if (sr->retry) + if (sr->retry_flags & IO_SR_MSG_RETRY) cflags = req->cqe.flags | (cflags & CQE_F_MASK); /* bundle with no more immediate buffers, we're done */ if (req->flags & REQ_F_BL_EMPTY) @@ -865,12 +870,12 @@ static inline bool io_recv_finish(struct io_kiocb *req, int *ret, * If more is available AND it was a full transfer, retry and * append to this one */ - if (!sr->retry && kmsg->msg.msg_inq > 1 && this_ret > 0 && + if (!sr->retry_flags && kmsg->msg.msg_inq > 1 && this_ret > 0 && !iov_iter_count(&kmsg->msg.msg_iter)) { req->cqe.flags = cflags & ~CQE_F_MASK; sr->len = kmsg->msg.msg_inq; sr->done_io += this_ret; - sr->retry = true; + sr->retry_flags |= IO_SR_MSG_RETRY; return false; } } else { @@ -1123,6 +1128,8 @@ static int io_recv_buf_select(struct io_kiocb *req, struct io_async_msghdr *kmsg kmsg->free_iov = arg.iovs; req->flags |= REQ_F_NEED_CLEANUP; } + if (arg.partial_map) + sr->retry_flags |= IO_SR_MSG_PARTIAL_MAP; /* special case 1 vec, can be a fast path */ if (ret == 1) { @@ -1252,7 +1259,7 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) struct io_kiocb *notif; zc->done_io = 0; - zc->retry = false; + zc->retry_flags = 0; req->flags |= REQ_F_POLL_NO_LAZY; if (unlikely(READ_ONCE(sqe->__pad2[0]) || READ_ONCE(sqe->addr3))) -- GitLab From 1f4b030e083917196529ac87032e2f47fab1fece Mon Sep 17 00:00:00 2001 From: Lorenzo Stoakes Date: Fri, 6 Jun 2025 13:50:32 +0100 Subject: [PATCH 1829/2211] mm/vma: reset VMA iterator on commit_merge() OOM failure commit 0cf4b1687a187ba9247c71721d8b064634eda1f7 upstream. While an OOM failure in commit_merge() isn't really feasible due to the allocation which might fail (a maple tree pre-allocation) being 'too small to fail', we do need to handle this case correctly regardless. In vma_merge_existing_range(), we can theoretically encounter failures which result in an OOM error in two ways - firstly dup_anon_vma() might fail with an OOM error, and secondly commit_merge() failing, ultimately, to pre-allocate a maple tree node. The abort logic for dup_anon_vma() resets the VMA iterator to the initial range, ensuring that any logic looping on this iterator will correctly proceed to the next VMA. However the commit_merge() abort logic does not do the same thing. This resulted in a syzbot report occurring because mlockall() iterates through VMAs, is tolerant of errors, but ended up with an incorrect previous VMA being specified due to incorrect iterator state. While making this change, it became apparent we are duplicating logic - the logic introduced in commit 41e6ddcaa0f1 ("mm/vma: add give_up_on_oom option on modify/merge, use in uffd release") duplicates the vmg->give_up_on_oom check in both abort branches. Additionally, we observe that we can perform the anon_dup check safely on dup_anon_vma() failure, as this will not be modified should this call fail. Finally, we need to reset the iterator in both cases, so now we can simply use the exact same code to abort for both. We remove the VM_WARN_ON(err != -ENOMEM) as it would be silly for this to be otherwise and it allows us to implement the abort check more neatly. Link: https://lkml.kernel.org/r/20250606125032.164249-1-lorenzo.stoakes@oracle.com Fixes: 47b16d0462a4 ("mm: abort vma_modify() on merge out of memory failure") Signed-off-by: Lorenzo Stoakes Reported-by: syzbot+d16409ea9ecc16ed261a@syzkaller.appspotmail.com Closes: https://lore.kernel.org/linux-mm/6842cc67.a00a0220.29ac89.003b.GAE@google.com/ Reviewed-by: Pedro Falcato Reviewed-by: Vlastimil Babka Reviewed-by: Liam R. Howlett Cc: Jann Horn Cc: Signed-off-by: Andrew Morton Signed-off-by: Lorenzo Stoakes Signed-off-by: Greg Kroah-Hartman --- mm/vma.c | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/mm/vma.c b/mm/vma.c index 1d82ec4ee7bb5..140f7017bb634 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -836,9 +836,6 @@ static struct vm_area_struct *vma_merge_existing_range(struct vma_merge_struct * err = dup_anon_vma(next, vma, &anon_dup); } - if (err) - goto abort; - /* * In nearly all cases, we expand vmg->vma. There is one exception - * merge_right where we partially span the VMA. In this case we shrink @@ -846,22 +843,11 @@ static struct vm_area_struct *vma_merge_existing_range(struct vma_merge_struct * */ expanded = !merge_right || merge_will_delete_vma; - if (commit_merge(vmg, adjust, - merge_will_delete_vma ? vma : NULL, - merge_will_delete_next ? next : NULL, - adj_start, expanded)) { - if (anon_dup) - unlink_anon_vmas(anon_dup); - - /* - * We've cleaned up any cloned anon_vma's, no VMAs have been - * modified, no harm no foul if the user requests that we not - * report this and just give up, leaving the VMAs unmerged. - */ - if (!vmg->give_up_on_oom) - vmg->state = VMA_MERGE_ERROR_NOMEM; - return NULL; - } + if (err || commit_merge(vmg, adjust, + merge_will_delete_vma ? vma : NULL, + merge_will_delete_next ? next : NULL, + adj_start, expanded)) + goto abort; res = merge_left ? prev : next; khugepaged_enter_vma(res, vmg->flags); @@ -873,6 +859,9 @@ abort: vma_iter_set(vmg->vmi, start); vma_iter_load(vmg->vmi); + if (anon_dup) + unlink_anon_vmas(anon_dup); + /* * This means we have failed to clone anon_vma's correctly, but no * actual changes to VMAs have occurred, so no harm no foul - if the -- GitLab From 37cb5967bd2513416398ff1a87a5ee2e63270b00 Mon Sep 17 00:00:00 2001 From: Heiner Kallweit Date: Thu, 24 Oct 2024 22:42:33 +0200 Subject: [PATCH 1830/2211] r8169: add support for RTL8125D commit f75d1fbe7809bc5ed134204b920fd9e2fc5db1df upstream. This adds support for new chip version RTL8125D, which can be found on boards like Gigabyte X870E AORUS ELITE WIFI7. Firmware rtl8125d-1.fw for this chip version is available in linux-firmware already. Signed-off-by: Heiner Kallweit Reviewed-by: Simon Horman Link: https://patch.msgid.link/d0306912-e88e-4c25-8b5d-545ae8834c0c@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Mathieu Tortuyaux Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/realtek/r8169.h | 1 + drivers/net/ethernet/realtek/r8169_main.c | 23 +++++++++++++------ .../net/ethernet/realtek/r8169_phy_config.c | 10 ++++++++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/realtek/r8169.h b/drivers/net/ethernet/realtek/r8169.h index e2db944e6fa8b..be4c9622618d8 100644 --- a/drivers/net/ethernet/realtek/r8169.h +++ b/drivers/net/ethernet/realtek/r8169.h @@ -68,6 +68,7 @@ enum mac_version { /* support for RTL_GIGA_MAC_VER_60 has been removed */ RTL_GIGA_MAC_VER_61, RTL_GIGA_MAC_VER_63, + RTL_GIGA_MAC_VER_64, RTL_GIGA_MAC_VER_65, RTL_GIGA_MAC_VER_66, RTL_GIGA_MAC_NONE diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c index 85bb5121cd245..7b82779e4cd5d 100644 --- a/drivers/net/ethernet/realtek/r8169_main.c +++ b/drivers/net/ethernet/realtek/r8169_main.c @@ -55,6 +55,7 @@ #define FIRMWARE_8107E_2 "rtl_nic/rtl8107e-2.fw" #define FIRMWARE_8125A_3 "rtl_nic/rtl8125a-3.fw" #define FIRMWARE_8125B_2 "rtl_nic/rtl8125b-2.fw" +#define FIRMWARE_8125D_1 "rtl_nic/rtl8125d-1.fw" #define FIRMWARE_8126A_2 "rtl_nic/rtl8126a-2.fw" #define FIRMWARE_8126A_3 "rtl_nic/rtl8126a-3.fw" @@ -138,6 +139,7 @@ static const struct { [RTL_GIGA_MAC_VER_61] = {"RTL8125A", FIRMWARE_8125A_3}, /* reserve 62 for CFG_METHOD_4 in the vendor driver */ [RTL_GIGA_MAC_VER_63] = {"RTL8125B", FIRMWARE_8125B_2}, + [RTL_GIGA_MAC_VER_64] = {"RTL8125D", FIRMWARE_8125D_1}, [RTL_GIGA_MAC_VER_65] = {"RTL8126A", FIRMWARE_8126A_2}, [RTL_GIGA_MAC_VER_66] = {"RTL8126A", FIRMWARE_8126A_3}, }; @@ -707,6 +709,7 @@ MODULE_FIRMWARE(FIRMWARE_8168FP_3); MODULE_FIRMWARE(FIRMWARE_8107E_2); MODULE_FIRMWARE(FIRMWARE_8125A_3); MODULE_FIRMWARE(FIRMWARE_8125B_2); +MODULE_FIRMWARE(FIRMWARE_8125D_1); MODULE_FIRMWARE(FIRMWARE_8126A_2); MODULE_FIRMWARE(FIRMWARE_8126A_3); @@ -2098,10 +2101,7 @@ static void rtl_set_eee_txidle_timer(struct rtl8169_private *tp) tp->tx_lpi_timer = timer_val; r8168_mac_ocp_write(tp, 0xe048, timer_val); break; - case RTL_GIGA_MAC_VER_61: - case RTL_GIGA_MAC_VER_63: - case RTL_GIGA_MAC_VER_65: - case RTL_GIGA_MAC_VER_66: + case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_66: tp->tx_lpi_timer = timer_val; RTL_W16(tp, EEE_TXIDLE_TIMER_8125, timer_val); break; @@ -2233,6 +2233,9 @@ static enum mac_version rtl8169_get_mac_version(u16 xid, bool gmii) { 0x7cf, 0x64a, RTL_GIGA_MAC_VER_66 }, { 0x7cf, 0x649, RTL_GIGA_MAC_VER_65 }, + /* 8125D family. */ + { 0x7cf, 0x688, RTL_GIGA_MAC_VER_64 }, + /* 8125B family. */ { 0x7cf, 0x641, RTL_GIGA_MAC_VER_63 }, @@ -2500,9 +2503,7 @@ static void rtl_init_rxcfg(struct rtl8169_private *tp) case RTL_GIGA_MAC_VER_61: RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST); break; - case RTL_GIGA_MAC_VER_63: - case RTL_GIGA_MAC_VER_65: - case RTL_GIGA_MAC_VER_66: + case RTL_GIGA_MAC_VER_63 ... RTL_GIGA_MAC_VER_66: RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST | RX_PAUSE_SLOT_ON); break; @@ -3840,6 +3841,12 @@ static void rtl_hw_start_8125b(struct rtl8169_private *tp) rtl_hw_start_8125_common(tp); } +static void rtl_hw_start_8125d(struct rtl8169_private *tp) +{ + rtl_set_def_aspm_entry_latency(tp); + rtl_hw_start_8125_common(tp); +} + static void rtl_hw_start_8126a(struct rtl8169_private *tp) { rtl_disable_zrxdc_timeout(tp); @@ -3889,6 +3896,7 @@ static void rtl_hw_config(struct rtl8169_private *tp) [RTL_GIGA_MAC_VER_53] = rtl_hw_start_8117, [RTL_GIGA_MAC_VER_61] = rtl_hw_start_8125a_2, [RTL_GIGA_MAC_VER_63] = rtl_hw_start_8125b, + [RTL_GIGA_MAC_VER_64] = rtl_hw_start_8125d, [RTL_GIGA_MAC_VER_65] = rtl_hw_start_8126a, [RTL_GIGA_MAC_VER_66] = rtl_hw_start_8126a, }; @@ -3906,6 +3914,7 @@ static void rtl_hw_start_8125(struct rtl8169_private *tp) /* disable interrupt coalescing */ switch (tp->mac_version) { case RTL_GIGA_MAC_VER_61: + case RTL_GIGA_MAC_VER_64: for (i = 0xa00; i < 0xb00; i += 4) RTL_W32(tp, i, 0); break; diff --git a/drivers/net/ethernet/realtek/r8169_phy_config.c b/drivers/net/ethernet/realtek/r8169_phy_config.c index cf29b12084826..d09b2a41cd062 100644 --- a/drivers/net/ethernet/realtek/r8169_phy_config.c +++ b/drivers/net/ethernet/realtek/r8169_phy_config.c @@ -1104,6 +1104,15 @@ static void rtl8125b_hw_phy_config(struct rtl8169_private *tp, rtl8125b_config_eee_phy(phydev); } +static void rtl8125d_hw_phy_config(struct rtl8169_private *tp, + struct phy_device *phydev) +{ + r8169_apply_firmware(tp); + rtl8125_legacy_force_mode(phydev); + rtl8168g_disable_aldps(phydev); + rtl8125b_config_eee_phy(phydev); +} + static void rtl8126a_hw_phy_config(struct rtl8169_private *tp, struct phy_device *phydev) { @@ -1160,6 +1169,7 @@ void r8169_hw_phy_config(struct rtl8169_private *tp, struct phy_device *phydev, [RTL_GIGA_MAC_VER_53] = rtl8117_hw_phy_config, [RTL_GIGA_MAC_VER_61] = rtl8125a_2_hw_phy_config, [RTL_GIGA_MAC_VER_63] = rtl8125b_hw_phy_config, + [RTL_GIGA_MAC_VER_64] = rtl8125d_hw_phy_config, [RTL_GIGA_MAC_VER_65] = rtl8126a_hw_phy_config, [RTL_GIGA_MAC_VER_66] = rtl8126a_hw_phy_config, }; -- GitLab From 5eb0b10eea271e2e1f7d4fa1a6af6c09b2ecc4f5 Mon Sep 17 00:00:00 2001 From: Heiner Kallweit Date: Tue, 15 Oct 2024 07:47:14 +0200 Subject: [PATCH 1831/2211] net: phy: realtek: merge the drivers for internal NBase-T PHY's commit f87a17ed3b51fba4dfdd8f8b643b5423a85fc551 upstream. The Realtek RTL8125/RTL8126 NBase-T MAC/PHY chips have internal PHY's which are register-compatible, at least for the registers we use here. So let's use just one PHY driver to support all of them. These internal PHY's exist also as external C45 PHY's, but on the internal PHY's no access to MMD registers is possible. This can be used to differentiate between the internal and external version. As a side effect the drivers for two now external-only drivers don't require read_mmd/write_mmd hooks any longer. Signed-off-by: Heiner Kallweit Link: https://patch.msgid.link/c57081a6-811f-4571-ab35-34f4ca6de9af@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Mathieu Tortuyaux Signed-off-by: Greg Kroah-Hartman --- drivers/net/phy/realtek.c | 53 +++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c index 166f6a7283731..830a0d337de5d 100644 --- a/drivers/net/phy/realtek.c +++ b/drivers/net/phy/realtek.c @@ -92,6 +92,7 @@ #define RTL_GENERIC_PHYID 0x001cc800 #define RTL_8211FVD_PHYID 0x001cc878 +#define RTL_8221B 0x001cc840 #define RTL_8221B_VB_CG 0x001cc849 #define RTL_8221B_VN_CG 0x001cc84a #define RTL_8251B 0x001cc862 @@ -1040,6 +1041,23 @@ static bool rtlgen_supports_2_5gbps(struct phy_device *phydev) return val >= 0 && val & MDIO_PMA_SPEED_2_5G; } +/* On internal PHY's MMD reads over C22 always return 0. + * Check a MMD register which is known to be non-zero. + */ +static bool rtlgen_supports_mmd(struct phy_device *phydev) +{ + int val; + + phy_lock_mdio_bus(phydev); + __phy_write(phydev, MII_MMD_CTRL, MDIO_MMD_PCS); + __phy_write(phydev, MII_MMD_DATA, MDIO_PCS_EEE_ABLE); + __phy_write(phydev, MII_MMD_CTRL, MDIO_MMD_PCS | MII_MMD_CTRL_NOINCR); + val = __phy_read(phydev, MII_MMD_DATA); + phy_unlock_mdio_bus(phydev); + + return val > 0; +} + static int rtlgen_match_phy_device(struct phy_device *phydev) { return phydev->phy_id == RTL_GENERIC_PHYID && @@ -1049,7 +1067,8 @@ static int rtlgen_match_phy_device(struct phy_device *phydev) static int rtl8226_match_phy_device(struct phy_device *phydev) { return phydev->phy_id == RTL_GENERIC_PHYID && - rtlgen_supports_2_5gbps(phydev); + rtlgen_supports_2_5gbps(phydev) && + rtlgen_supports_mmd(phydev); } static int rtlgen_is_c45_match(struct phy_device *phydev, unsigned int id, @@ -1061,6 +1080,11 @@ static int rtlgen_is_c45_match(struct phy_device *phydev, unsigned int id, return !is_c45 && (id == phydev->phy_id); } +static int rtl8221b_match_phy_device(struct phy_device *phydev) +{ + return phydev->phy_id == RTL_8221B && rtlgen_supports_mmd(phydev); +} + static int rtl8221b_vb_cg_c22_match_phy_device(struct phy_device *phydev) { return rtlgen_is_c45_match(phydev, RTL_8221B_VB_CG, false); @@ -1081,9 +1105,21 @@ static int rtl8221b_vn_cg_c45_match_phy_device(struct phy_device *phydev) return rtlgen_is_c45_match(phydev, RTL_8221B_VN_CG, true); } -static int rtl8251b_c22_match_phy_device(struct phy_device *phydev) +static int rtl_internal_nbaset_match_phy_device(struct phy_device *phydev) { - return rtlgen_is_c45_match(phydev, RTL_8251B, false); + if (phydev->is_c45) + return false; + + switch (phydev->phy_id) { + case RTL_GENERIC_PHYID: + case RTL_8221B: + case RTL_8251B: + break; + default: + return false; + } + + return rtlgen_supports_2_5gbps(phydev) && !rtlgen_supports_mmd(phydev); } static int rtl8251b_c45_match_phy_device(struct phy_device *phydev) @@ -1345,10 +1381,8 @@ static struct phy_driver realtek_drvs[] = { .resume = rtlgen_resume, .read_page = rtl821x_read_page, .write_page = rtl821x_write_page, - .read_mmd = rtl822x_read_mmd, - .write_mmd = rtl822x_write_mmd, }, { - PHY_ID_MATCH_EXACT(0x001cc840), + .match_phy_device = rtl8221b_match_phy_device, .name = "RTL8226B_RTL8221B 2.5Gbps PHY", .get_features = rtl822x_get_features, .config_aneg = rtl822x_config_aneg, @@ -1359,8 +1393,6 @@ static struct phy_driver realtek_drvs[] = { .resume = rtlgen_resume, .read_page = rtl821x_read_page, .write_page = rtl821x_write_page, - .read_mmd = rtl822x_read_mmd, - .write_mmd = rtl822x_write_mmd, }, { PHY_ID_MATCH_EXACT(0x001cc838), .name = "RTL8226-CG 2.5Gbps PHY", @@ -1438,8 +1470,9 @@ static struct phy_driver realtek_drvs[] = { .read_page = rtl821x_read_page, .write_page = rtl821x_write_page, }, { - .match_phy_device = rtl8251b_c22_match_phy_device, - .name = "RTL8126A-internal 5Gbps PHY", + .match_phy_device = rtl_internal_nbaset_match_phy_device, + .name = "Realtek Internal NBASE-T PHY", + .flags = PHY_IS_INTERNAL, .get_features = rtl822x_get_features, .config_aneg = rtl822x_config_aneg, .read_status = rtl822x_read_status, -- GitLab From 5d479182d4ccde76df830a72927b3bdaafd142bf Mon Sep 17 00:00:00 2001 From: Heiner Kallweit Date: Thu, 17 Oct 2024 18:01:13 +0200 Subject: [PATCH 1832/2211] net: phy: realtek: add RTL8125D-internal PHY commit 8989bad541133c43550bff2b80edbe37b8fb9659 upstream. The first boards show up with Realtek's RTL8125D. This MAC/PHY chip comes with an integrated 2.5Gbps PHY with ID 0x001cc841. It's not clear yet whether there's an external version of this PHY and how Realtek calls it, therefore use the numeric id for now. Link: https://lore.kernel.org/netdev/2ada65e1-5dfa-456c-9334-2bc51272e9da@gmail.com/T/ Signed-off-by: Heiner Kallweit Message-ID: <7d2924de-053b-44d2-a479-870dc3878170@gmail.com> Reviewed-by: Andrew Lunn Signed-off-by: Andrew Lunn Signed-off-by: Mathieu Tortuyaux Signed-off-by: Greg Kroah-Hartman --- drivers/net/phy/realtek.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c index 830a0d337de5d..8ce5705af69c5 100644 --- a/drivers/net/phy/realtek.c +++ b/drivers/net/phy/realtek.c @@ -1114,6 +1114,7 @@ static int rtl_internal_nbaset_match_phy_device(struct phy_device *phydev) case RTL_GENERIC_PHYID: case RTL_8221B: case RTL_8251B: + case 0x001cc841: break; default: return false; -- GitLab From 10b3772292bf1be45604ba83fd9650eb94382e78 Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Thu, 12 Dec 2024 16:43:58 +1030 Subject: [PATCH 1833/2211] btrfs: do proper folio cleanup when cow_file_range() failed [ Upstream commit 06f364284794f149d2abc167c11d556cf20c954b ] [BUG] When testing with COW fixup marked as BUG_ON() (this is involved with the new pin_user_pages*() change, which should not result new out-of-band dirty pages), I hit a crash triggered by the BUG_ON() from hitting COW fixup path. This BUG_ON() happens just after a failed btrfs_run_delalloc_range(): BTRFS error (device dm-2): failed to run delalloc range, root 348 ino 405 folio 65536 submit_bitmap 6-15 start 90112 len 106496: -28 ------------[ cut here ]------------ kernel BUG at fs/btrfs/extent_io.c:1444! Internal error: Oops - BUG: 00000000f2000800 [#1] SMP CPU: 0 UID: 0 PID: 434621 Comm: kworker/u24:8 Tainted: G OE 6.12.0-rc7-custom+ #86 Hardware name: QEMU KVM Virtual Machine, BIOS unknown 2/2/2022 Workqueue: events_unbound btrfs_async_reclaim_data_space [btrfs] pc : extent_writepage_io+0x2d4/0x308 [btrfs] lr : extent_writepage_io+0x2d4/0x308 [btrfs] Call trace: extent_writepage_io+0x2d4/0x308 [btrfs] extent_writepage+0x218/0x330 [btrfs] extent_write_cache_pages+0x1d4/0x4b0 [btrfs] btrfs_writepages+0x94/0x150 [btrfs] do_writepages+0x74/0x190 filemap_fdatawrite_wbc+0x88/0xc8 start_delalloc_inodes+0x180/0x3b0 [btrfs] btrfs_start_delalloc_roots+0x174/0x280 [btrfs] shrink_delalloc+0x114/0x280 [btrfs] flush_space+0x250/0x2f8 [btrfs] btrfs_async_reclaim_data_space+0x180/0x228 [btrfs] process_one_work+0x164/0x408 worker_thread+0x25c/0x388 kthread+0x100/0x118 ret_from_fork+0x10/0x20 Code: aa1403e1 9402f3ef aa1403e0 9402f36f (d4210000) ---[ end trace 0000000000000000 ]--- [CAUSE] That failure is mostly from cow_file_range(), where we can hit -ENOSPC. Although the -ENOSPC is already a bug related to our space reservation code, let's just focus on the error handling. For example, we have the following dirty range [0, 64K) of an inode, with 4K sector size and 4K page size: 0 16K 32K 48K 64K |///////////////////////////////////////| |#######################################| Where |///| means page are still dirty, and |###| means the extent io tree has EXTENT_DELALLOC flag. - Enter extent_writepage() for page 0 - Enter btrfs_run_delalloc_range() for range [0, 64K) - Enter cow_file_range() for range [0, 64K) - Function btrfs_reserve_extent() only reserved one 16K extent So we created extent map and ordered extent for range [0, 16K) 0 16K 32K 48K 64K |////////|//////////////////////////////| |<- OE ->|##############################| And range [0, 16K) has its delalloc flag cleared. But since we haven't yet submit any bio, involved 4 pages are still dirty. - Function btrfs_reserve_extent() returns with -ENOSPC Now we have to run error cleanup, which will clear all EXTENT_DELALLOC* flags and clear the dirty flags for the remaining ranges: 0 16K 32K 48K 64K |////////| | | | | Note that range [0, 16K) still has its pages dirty. - Some time later, writeback is triggered again for the range [0, 16K) since the page range still has dirty flags. - btrfs_run_delalloc_range() will do nothing because there is no EXTENT_DELALLOC flag. - extent_writepage_io() finds page 0 has no ordered flag Which falls into the COW fixup path, triggering the BUG_ON(). Unfortunately this error handling bug dates back to the introduction of btrfs. Thankfully with the abuse of COW fixup, at least it won't crash the kernel. [FIX] Instead of immediately unlocking the extent and folios, we keep the extent and folios locked until either erroring out or the whole delalloc range finished. When the whole delalloc range finished without error, we just unlock the whole range with PAGE_SET_ORDERED (and PAGE_UNLOCK for !keep_locked cases), with EXTENT_DELALLOC and EXTENT_LOCKED cleared. And the involved folios will be properly submitted, with their dirty flags cleared during submission. For the error path, it will be a little more complex: - The range with ordered extent allocated (range (1)) We only clear the EXTENT_DELALLOC and EXTENT_LOCKED, as the remaining flags are cleaned up by btrfs_mark_ordered_io_finished()->btrfs_finish_one_ordered(). For folios we finish the IO (clear dirty, start writeback and immediately finish the writeback) and unlock the folios. - The range with reserved extent but no ordered extent (range(2)) - The range we never touched (range(3)) For both range (2) and range(3) the behavior is not changed. Now even if cow_file_range() failed halfway with some successfully reserved extents/ordered extents, we will keep all folios clean, so there will be no future writeback triggered on them. CC: stable@vger.kernel.org Reviewed-by: Boris Burkov Signed-off-by: Qu Wenruo Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/inode.c | 77 +++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 40 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index cc6a350ae6ede..2f0b2cb2ae6e8 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1408,6 +1408,17 @@ static noinline int cow_file_range(struct btrfs_inode *inode, alloc_hint = btrfs_get_extent_allocation_hint(inode, start, num_bytes); + /* + * We're not doing compressed IO, don't unlock the first page (which + * the caller expects to stay locked), don't clear any dirty bits and + * don't set any writeback bits. + * + * Do set the Ordered (Private2) bit so we know this page was properly + * setup for writepage. + */ + page_ops = (keep_locked ? 0 : PAGE_UNLOCK); + page_ops |= PAGE_SET_ORDERED; + /* * Relocation relies on the relocated extents to have exactly the same * size as the original extents. Normally writeback for relocation data @@ -1470,6 +1481,10 @@ static noinline int cow_file_range(struct btrfs_inode *inode, file_extent.offset = 0; file_extent.compression = BTRFS_COMPRESS_NONE; + /* + * Locked range will be released either during error clean up or + * after the whole range is finished. + */ lock_extent(&inode->io_tree, start, start + ram_size - 1, &cached); @@ -1515,27 +1530,12 @@ static noinline int cow_file_range(struct btrfs_inode *inode, btrfs_dec_block_group_reservations(fs_info, ins.objectid); - /* - * We're not doing compressed IO, don't unlock the first page - * (which the caller expects to stay locked), don't clear any - * dirty bits and don't set any writeback bits - * - * Do set the Ordered (Private2) bit so we know this page was - * properly setup for writepage. - */ - page_ops = (keep_locked ? 0 : PAGE_UNLOCK); - page_ops |= PAGE_SET_ORDERED; - - extent_clear_unlock_delalloc(inode, start, start + ram_size - 1, - locked_folio, &cached, - EXTENT_LOCKED | EXTENT_DELALLOC, - page_ops); - if (num_bytes < cur_alloc_size) + if (num_bytes < ram_size) num_bytes = 0; else - num_bytes -= cur_alloc_size; + num_bytes -= ram_size; alloc_hint = ins.objectid + ins.offset; - start += cur_alloc_size; + start += ram_size; extent_reserved = false; /* @@ -1546,6 +1546,8 @@ static noinline int cow_file_range(struct btrfs_inode *inode, if (ret) goto out_unlock; } + extent_clear_unlock_delalloc(inode, orig_start, end, locked_folio, &cached, + EXTENT_LOCKED | EXTENT_DELALLOC, page_ops); done: if (done_offset) *done_offset = end; @@ -1561,40 +1563,35 @@ out_unlock: * Now, we have three regions to clean up: * * |-------(1)----|---(2)---|-------------(3)----------| - * `- orig_start `- start `- start + cur_alloc_size `- end + * `- orig_start `- start `- start + ram_size `- end * * We process each region below. */ - clear_bits = EXTENT_LOCKED | EXTENT_DELALLOC | EXTENT_DELALLOC_NEW | - EXTENT_DEFRAG | EXTENT_CLEAR_META_RESV; - page_ops = PAGE_UNLOCK | PAGE_START_WRITEBACK | PAGE_END_WRITEBACK; - /* * For the range (1). We have already instantiated the ordered extents * for this region. They are cleaned up by * btrfs_cleanup_ordered_extents() in e.g, - * btrfs_run_delalloc_range(). EXTENT_LOCKED | EXTENT_DELALLOC are - * already cleared in the above loop. And, EXTENT_DELALLOC_NEW | - * EXTENT_DEFRAG | EXTENT_CLEAR_META_RESV are handled by the cleanup - * function. + * btrfs_run_delalloc_range(). + * EXTENT_DELALLOC_NEW | EXTENT_DEFRAG | EXTENT_CLEAR_META_RESV + * are also handled by the cleanup function. * - * However, in case of @keep_locked, we still need to unlock the pages - * (except @locked_folio) to ensure all the pages are unlocked. + * So here we only clear EXTENT_LOCKED and EXTENT_DELALLOC flag, and + * finish the writeback of the involved folios, which will be never submitted. */ - if (keep_locked && orig_start < start) { + if (orig_start < start) { + clear_bits = EXTENT_LOCKED | EXTENT_DELALLOC; + page_ops = PAGE_UNLOCK | PAGE_START_WRITEBACK | PAGE_END_WRITEBACK; + if (!locked_folio) mapping_set_error(inode->vfs_inode.i_mapping, ret); extent_clear_unlock_delalloc(inode, orig_start, start - 1, - locked_folio, NULL, 0, page_ops); + locked_folio, NULL, clear_bits, page_ops); } - /* - * At this point we're unlocked, we want to make sure we're only - * clearing these flags under the extent lock, so lock the rest of the - * range and clear everything up. - */ - lock_extent(&inode->io_tree, start, end, NULL); + clear_bits = EXTENT_LOCKED | EXTENT_DELALLOC | EXTENT_DELALLOC_NEW | + EXTENT_DEFRAG | EXTENT_CLEAR_META_RESV; + page_ops = PAGE_UNLOCK | PAGE_START_WRITEBACK | PAGE_END_WRITEBACK; /* * For the range (2). If we reserved an extent for our delalloc range @@ -1608,11 +1605,11 @@ out_unlock: */ if (extent_reserved) { extent_clear_unlock_delalloc(inode, start, - start + cur_alloc_size - 1, + start + ram_size - 1, locked_folio, &cached, clear_bits, page_ops); - btrfs_qgroup_free_data(inode, NULL, start, cur_alloc_size, NULL); - start += cur_alloc_size; + btrfs_qgroup_free_data(inode, NULL, start, ram_size, NULL); + start += ram_size; } /* -- GitLab From 0a8ac8f8430dbd0b49600085c8513eba7eb749bd Mon Sep 17 00:00:00 2001 From: Angelo Dureghello Date: Mon, 28 Oct 2024 22:45:32 +0100 Subject: [PATCH 1834/2211] iio: dac: ad3552r: changes to use FIELD_PREP [ Upstream commit d5ac6cb1c8f3e14d93e2a50d9357a8acdbc5c166 ] Changes to use FIELD_PREP, so that driver-specific ad3552r_field_prep is removed. Variables (arrays) that was used to call ad3552r_field_prep are removed too. Signed-off-by: Angelo Dureghello Reviewed-by: David Lechner Link: https://patch.msgid.link/20241028-wip-bl-ad3552r-axi-v0-iio-testing-v9-5-f6960b4f9719@kernel-space.org Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/dac/ad3552r.c | 167 ++++++++++++-------------------------- 1 file changed, 50 insertions(+), 117 deletions(-) diff --git a/drivers/iio/dac/ad3552r.c b/drivers/iio/dac/ad3552r.c index 390d3fab21478..aa453d3de5e1c 100644 --- a/drivers/iio/dac/ad3552r.c +++ b/drivers/iio/dac/ad3552r.c @@ -6,6 +6,7 @@ * Copyright 2021 Analog Devices Inc. */ #include +#include #include #include #include @@ -210,46 +211,6 @@ static const s32 gains_scaling_table[] = { [AD3552R_CH_GAIN_SCALING_0_125] = 125 }; -enum ad3552r_dev_attributes { - /* - Direct register values */ - /* From 0-3 */ - AD3552R_SDO_DRIVE_STRENGTH, - /* - * 0 -> Internal Vref, vref_io pin floating (default) - * 1 -> Internal Vref, vref_io driven by internal vref - * 2 or 3 -> External Vref - */ - AD3552R_VREF_SELECT, - /* Read registers in ascending order if set. Else descending */ - AD3552R_ADDR_ASCENSION, -}; - -enum ad3552r_ch_attributes { - /* DAC powerdown */ - AD3552R_CH_DAC_POWERDOWN, - /* DAC amplifier powerdown */ - AD3552R_CH_AMPLIFIER_POWERDOWN, - /* Select the output range. Select from enum ad3552r_ch_output_range */ - AD3552R_CH_OUTPUT_RANGE_SEL, - /* - * Over-rider the range selector in order to manually set the output - * voltage range - */ - AD3552R_CH_RANGE_OVERRIDE, - /* Manually set the offset voltage */ - AD3552R_CH_GAIN_OFFSET, - /* Sets the polarity of the offset. */ - AD3552R_CH_GAIN_OFFSET_POLARITY, - /* PDAC gain scaling */ - AD3552R_CH_GAIN_SCALING_P, - /* NDAC gain scaling */ - AD3552R_CH_GAIN_SCALING_N, - /* Rfb value */ - AD3552R_CH_RFB, - /* Channel select. When set allow Input -> DAC and Mask -> DAC */ - AD3552R_CH_SELECT, -}; - struct ad3552r_ch_data { s32 scale_int; s32 scale_dec; @@ -285,45 +246,6 @@ struct ad3552r_desc { unsigned int num_ch; }; -static const u16 addr_mask_map[][2] = { - [AD3552R_ADDR_ASCENSION] = { - AD3552R_REG_ADDR_INTERFACE_CONFIG_A, - AD3552R_MASK_ADDR_ASCENSION - }, - [AD3552R_SDO_DRIVE_STRENGTH] = { - AD3552R_REG_ADDR_INTERFACE_CONFIG_D, - AD3552R_MASK_SDO_DRIVE_STRENGTH - }, - [AD3552R_VREF_SELECT] = { - AD3552R_REG_ADDR_SH_REFERENCE_CONFIG, - AD3552R_MASK_REFERENCE_VOLTAGE_SEL - }, -}; - -/* 0 -> reg addr, 1->ch0 mask, 2->ch1 mask */ -static const u16 addr_mask_map_ch[][3] = { - [AD3552R_CH_DAC_POWERDOWN] = { - AD3552R_REG_ADDR_POWERDOWN_CONFIG, - AD3552R_MASK_CH_DAC_POWERDOWN(0), - AD3552R_MASK_CH_DAC_POWERDOWN(1) - }, - [AD3552R_CH_AMPLIFIER_POWERDOWN] = { - AD3552R_REG_ADDR_POWERDOWN_CONFIG, - AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(0), - AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(1) - }, - [AD3552R_CH_OUTPUT_RANGE_SEL] = { - AD3552R_REG_ADDR_CH0_CH1_OUTPUT_RANGE, - AD3552R_MASK_CH_OUTPUT_RANGE_SEL(0), - AD3552R_MASK_CH_OUTPUT_RANGE_SEL(1) - }, - [AD3552R_CH_SELECT] = { - AD3552R_REG_ADDR_CH_SELECT_16B, - AD3552R_MASK_CH(0), - AD3552R_MASK_CH(1) - } -}; - static u8 _ad3552r_reg_len(u8 addr) { switch (addr) { @@ -399,11 +321,6 @@ static int ad3552r_read_reg(struct ad3552r_desc *dac, u8 addr, u16 *val) return 0; } -static u16 ad3552r_field_prep(u16 val, u16 mask) -{ - return (val << __ffs(mask)) & mask; -} - /* Update field of a register, shift val if needed */ static int ad3552r_update_reg_field(struct ad3552r_desc *dac, u8 addr, u16 mask, u16 val) @@ -416,21 +333,11 @@ static int ad3552r_update_reg_field(struct ad3552r_desc *dac, u8 addr, u16 mask, return ret; reg &= ~mask; - reg |= ad3552r_field_prep(val, mask); + reg |= val; return ad3552r_write_reg(dac, addr, reg); } -static int ad3552r_set_ch_value(struct ad3552r_desc *dac, - enum ad3552r_ch_attributes attr, - u8 ch, - u16 val) -{ - /* Update register related to attributes in chip */ - return ad3552r_update_reg_field(dac, addr_mask_map_ch[attr][0], - addr_mask_map_ch[attr][ch + 1], val); -} - #define AD3552R_CH_DAC(_idx) ((struct iio_chan_spec) { \ .type = IIO_VOLTAGE, \ .output = true, \ @@ -510,8 +417,14 @@ static int ad3552r_write_raw(struct iio_dev *indio_dev, val); break; case IIO_CHAN_INFO_ENABLE: - err = ad3552r_set_ch_value(dac, AD3552R_CH_DAC_POWERDOWN, - chan->channel, !val); + if (chan->channel == 0) + val = FIELD_PREP(AD3552R_MASK_CH_DAC_POWERDOWN(0), !val); + else + val = FIELD_PREP(AD3552R_MASK_CH_DAC_POWERDOWN(1), !val); + + err = ad3552r_update_reg_field(dac, AD3552R_REG_ADDR_POWERDOWN_CONFIG, + AD3552R_MASK_CH_DAC_POWERDOWN(chan->channel), + val); break; default: err = -EINVAL; @@ -721,9 +634,9 @@ static int ad3552r_reset(struct ad3552r_desc *dac) return ret; return ad3552r_update_reg_field(dac, - addr_mask_map[AD3552R_ADDR_ASCENSION][0], - addr_mask_map[AD3552R_ADDR_ASCENSION][1], - val); + AD3552R_REG_ADDR_INTERFACE_CONFIG_A, + AD3552R_MASK_ADDR_ASCENSION, + FIELD_PREP(AD3552R_MASK_ADDR_ASCENSION, val)); } static void ad3552r_get_custom_range(struct ad3552r_desc *dac, s32 i, s32 *v_min, @@ -818,20 +731,20 @@ static int ad3552r_configure_custom_gain(struct ad3552r_desc *dac, "mandatory custom-output-range-config property missing\n"); dac->ch_data[ch].range_override = 1; - reg |= ad3552r_field_prep(1, AD3552R_MASK_CH_RANGE_OVERRIDE); + reg |= FIELD_PREP(AD3552R_MASK_CH_RANGE_OVERRIDE, 1); err = fwnode_property_read_u32(gain_child, "adi,gain-scaling-p", &val); if (err) return dev_err_probe(dev, err, "mandatory adi,gain-scaling-p property missing\n"); - reg |= ad3552r_field_prep(val, AD3552R_MASK_CH_GAIN_SCALING_P); + reg |= FIELD_PREP(AD3552R_MASK_CH_GAIN_SCALING_P, val); dac->ch_data[ch].p = val; err = fwnode_property_read_u32(gain_child, "adi,gain-scaling-n", &val); if (err) return dev_err_probe(dev, err, "mandatory adi,gain-scaling-n property missing\n"); - reg |= ad3552r_field_prep(val, AD3552R_MASK_CH_GAIN_SCALING_N); + reg |= FIELD_PREP(AD3552R_MASK_CH_GAIN_SCALING_N, val); dac->ch_data[ch].n = val; err = fwnode_property_read_u32(gain_child, "adi,rfb-ohms", &val); @@ -847,9 +760,9 @@ static int ad3552r_configure_custom_gain(struct ad3552r_desc *dac, dac->ch_data[ch].gain_offset = val; offset = abs((s32)val); - reg |= ad3552r_field_prep((offset >> 8), AD3552R_MASK_CH_OFFSET_BIT_8); + reg |= FIELD_PREP(AD3552R_MASK_CH_OFFSET_BIT_8, (offset >> 8)); - reg |= ad3552r_field_prep((s32)val < 0, AD3552R_MASK_CH_OFFSET_POLARITY); + reg |= FIELD_PREP(AD3552R_MASK_CH_OFFSET_POLARITY, (s32)val < 0); addr = AD3552R_REG_ADDR_CH_GAIN(ch); err = ad3552r_write_reg(dac, addr, offset & AD3552R_MASK_CH_OFFSET_BITS_0_7); @@ -892,9 +805,9 @@ static int ad3552r_configure_device(struct ad3552r_desc *dac) } err = ad3552r_update_reg_field(dac, - addr_mask_map[AD3552R_VREF_SELECT][0], - addr_mask_map[AD3552R_VREF_SELECT][1], - val); + AD3552R_REG_ADDR_SH_REFERENCE_CONFIG, + AD3552R_MASK_REFERENCE_VOLTAGE_SEL, + FIELD_PREP(AD3552R_MASK_REFERENCE_VOLTAGE_SEL, val)); if (err) return err; @@ -906,9 +819,9 @@ static int ad3552r_configure_device(struct ad3552r_desc *dac) } err = ad3552r_update_reg_field(dac, - addr_mask_map[AD3552R_SDO_DRIVE_STRENGTH][0], - addr_mask_map[AD3552R_SDO_DRIVE_STRENGTH][1], - val); + AD3552R_REG_ADDR_INTERFACE_CONFIG_D, + AD3552R_MASK_SDO_DRIVE_STRENGTH, + FIELD_PREP(AD3552R_MASK_SDO_DRIVE_STRENGTH, val)); if (err) return err; } @@ -944,9 +857,15 @@ static int ad3552r_configure_device(struct ad3552r_desc *dac) "Invalid adi,output-range-microvolt value\n"); val = err; - err = ad3552r_set_ch_value(dac, - AD3552R_CH_OUTPUT_RANGE_SEL, - ch, val); + if (ch == 0) + val = FIELD_PREP(AD3552R_MASK_CH_OUTPUT_RANGE_SEL(0), val); + else + val = FIELD_PREP(AD3552R_MASK_CH_OUTPUT_RANGE_SEL(1), val); + + err = ad3552r_update_reg_field(dac, + AD3552R_REG_ADDR_CH0_CH1_OUTPUT_RANGE, + AD3552R_MASK_CH_OUTPUT_RANGE_SEL(ch), + val); if (err) return err; @@ -964,7 +883,14 @@ static int ad3552r_configure_device(struct ad3552r_desc *dac) ad3552r_calc_gain_and_offset(dac, ch); dac->enabled_ch |= BIT(ch); - err = ad3552r_set_ch_value(dac, AD3552R_CH_SELECT, ch, 1); + if (ch == 0) + val = FIELD_PREP(AD3552R_MASK_CH(0), 1); + else + val = FIELD_PREP(AD3552R_MASK_CH(1), 1); + + err = ad3552r_update_reg_field(dac, + AD3552R_REG_ADDR_CH_SELECT_16B, + AD3552R_MASK_CH(ch), val); if (err < 0) return err; @@ -976,8 +902,15 @@ static int ad3552r_configure_device(struct ad3552r_desc *dac) /* Disable unused channels */ for_each_clear_bit(ch, &dac->enabled_ch, dac->model_data->num_hw_channels) { - err = ad3552r_set_ch_value(dac, AD3552R_CH_AMPLIFIER_POWERDOWN, - ch, 1); + if (ch == 0) + val = FIELD_PREP(AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(0), 1); + else + val = FIELD_PREP(AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(1), 1); + + err = ad3552r_update_reg_field(dac, + AD3552R_REG_ADDR_POWERDOWN_CONFIG, + AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(ch), + val); if (err) return err; } -- GitLab From c890a5b80d1f21b7ac0bb3134babd949b90dd5c3 Mon Sep 17 00:00:00 2001 From: Angelo Dureghello Date: Mon, 28 Oct 2024 22:45:33 +0100 Subject: [PATCH 1835/2211] iio: dac: ad3552r: extract common code (no changes in behavior intended) [ Upstream commit f665d7d33d7909cf51e2db0f0767ecab0295c0bd ] Extracting common code, to share common code to be used later by the AXI driver version (ad3552r-axi.c). Signed-off-by: Angelo Dureghello Reviewed-by: David Lechner Link: https://patch.msgid.link/20241028-wip-bl-ad3552r-axi-v0-iio-testing-v9-6-f6960b4f9719@kernel-space.org Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/dac/Makefile | 2 +- drivers/iio/dac/ad3552r-common.c | 249 +++++++++++++++++++ drivers/iio/dac/ad3552r.c | 398 +++---------------------------- drivers/iio/dac/ad3552r.h | 224 +++++++++++++++++ 4 files changed, 501 insertions(+), 372 deletions(-) create mode 100644 drivers/iio/dac/ad3552r-common.c create mode 100644 drivers/iio/dac/ad3552r.h diff --git a/drivers/iio/dac/Makefile b/drivers/iio/dac/Makefile index 2cf148f16306d..56a125f56284f 100644 --- a/drivers/iio/dac/Makefile +++ b/drivers/iio/dac/Makefile @@ -4,7 +4,7 @@ # # When adding new entries keep the list in alphabetical order -obj-$(CONFIG_AD3552R) += ad3552r.o +obj-$(CONFIG_AD3552R) += ad3552r.o ad3552r-common.o obj-$(CONFIG_AD5360) += ad5360.o obj-$(CONFIG_AD5380) += ad5380.o obj-$(CONFIG_AD5421) += ad5421.o diff --git a/drivers/iio/dac/ad3552r-common.c b/drivers/iio/dac/ad3552r-common.c new file mode 100644 index 0000000000000..2dfeca3656d21 --- /dev/null +++ b/drivers/iio/dac/ad3552r-common.c @@ -0,0 +1,249 @@ +// SPDX-License-Identifier: GPL-2.0+ +// +// Copyright (c) 2010-2024 Analog Devices Inc. +// Copyright (c) 2024 Baylibre, SAS + +#include +#include +#include +#include +#include + +#include "ad3552r.h" + +const s32 ad3552r_ch_ranges[AD3552R_MAX_RANGES][2] = { + [AD3552R_CH_OUTPUT_RANGE_0__2P5V] = { 0, 2500 }, + [AD3552R_CH_OUTPUT_RANGE_0__5V] = { 0, 5000 }, + [AD3552R_CH_OUTPUT_RANGE_0__10V] = { 0, 10000 }, + [AD3552R_CH_OUTPUT_RANGE_NEG_5__5V] = { -5000, 5000 }, + [AD3552R_CH_OUTPUT_RANGE_NEG_10__10V] = { -10000, 10000 } +}; +EXPORT_SYMBOL_NS_GPL(ad3552r_ch_ranges, IIO_AD3552R); + +const s32 ad3542r_ch_ranges[AD3542R_MAX_RANGES][2] = { + [AD3542R_CH_OUTPUT_RANGE_0__2P5V] = { 0, 2500 }, + [AD3542R_CH_OUTPUT_RANGE_0__3V] = { 0, 3000 }, + [AD3542R_CH_OUTPUT_RANGE_0__5V] = { 0, 5000 }, + [AD3542R_CH_OUTPUT_RANGE_0__10V] = { 0, 10000 }, + [AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V] = { -2500, 7500 }, + [AD3542R_CH_OUTPUT_RANGE_NEG_5__5V] = { -5000, 5000 } +}; +EXPORT_SYMBOL_NS_GPL(ad3542r_ch_ranges, IIO_AD3552R); + +/* Gain * AD3552R_GAIN_SCALE */ +static const s32 gains_scaling_table[] = { + [AD3552R_CH_GAIN_SCALING_1] = 1000, + [AD3552R_CH_GAIN_SCALING_0_5] = 500, + [AD3552R_CH_GAIN_SCALING_0_25] = 250, + [AD3552R_CH_GAIN_SCALING_0_125] = 125 +}; + +u16 ad3552r_calc_custom_gain(u8 p, u8 n, s16 goffs) +{ + return FIELD_PREP(AD3552R_MASK_CH_RANGE_OVERRIDE, 1) | + FIELD_PREP(AD3552R_MASK_CH_GAIN_SCALING_P, p) | + FIELD_PREP(AD3552R_MASK_CH_GAIN_SCALING_N, n) | + FIELD_PREP(AD3552R_MASK_CH_OFFSET_BIT_8, abs(goffs)) | + FIELD_PREP(AD3552R_MASK_CH_OFFSET_POLARITY, goffs < 0); +} +EXPORT_SYMBOL_NS_GPL(ad3552r_calc_custom_gain, IIO_AD3552R); + +static void ad3552r_get_custom_range(struct ad3552r_ch_data *ch_data, + s32 *v_min, s32 *v_max) +{ + s64 vref, tmp, common, offset, gn, gp; + /* + * From datasheet formula (In Volts): + * Vmin = 2.5 + [(GainN + Offset / 1024) * 2.5 * Rfb * 1.03] + * Vmax = 2.5 - [(GainP + Offset / 1024) * 2.5 * Rfb * 1.03] + * Calculus are converted to milivolts + */ + vref = 2500; + /* 2.5 * 1.03 * 1000 (To mV) */ + common = 2575 * ch_data->rfb; + offset = ch_data->gain_offset; + + gn = gains_scaling_table[ch_data->n]; + tmp = (1024 * gn + AD3552R_GAIN_SCALE * offset) * common; + tmp = div_s64(tmp, 1024 * AD3552R_GAIN_SCALE); + *v_max = vref + tmp; + + gp = gains_scaling_table[ch_data->p]; + tmp = (1024 * gp - AD3552R_GAIN_SCALE * offset) * common; + tmp = div_s64(tmp, 1024 * AD3552R_GAIN_SCALE); + *v_min = vref - tmp; +} + +void ad3552r_calc_gain_and_offset(struct ad3552r_ch_data *ch_data, + const struct ad3552r_model_data *model_data) +{ + s32 idx, v_max, v_min, span, rem; + s64 tmp; + + if (ch_data->range_override) { + ad3552r_get_custom_range(ch_data, &v_min, &v_max); + } else { + /* Normal range */ + idx = ch_data->range; + v_min = model_data->ranges_table[idx][0]; + v_max = model_data->ranges_table[idx][1]; + } + + /* + * From datasheet formula: + * Vout = Span * (D / 65536) + Vmin + * Converted to scale and offset: + * Scale = Span / 65536 + * Offset = 65536 * Vmin / Span + * + * Reminders are in micros in order to be printed as + * IIO_VAL_INT_PLUS_MICRO + */ + span = v_max - v_min; + ch_data->scale_int = div_s64_rem(span, 65536, &rem); + /* Do operations in microvolts */ + ch_data->scale_dec = DIV_ROUND_CLOSEST((s64)rem * 1000000, 65536); + + ch_data->offset_int = div_s64_rem(v_min * 65536, span, &rem); + tmp = (s64)rem * 1000000; + ch_data->offset_dec = div_s64(tmp, span); +} +EXPORT_SYMBOL_NS_GPL(ad3552r_calc_gain_and_offset, IIO_AD3552R); + +int ad3552r_get_ref_voltage(struct device *dev, u32 *val) +{ + int voltage; + int delta = 100000; + + voltage = devm_regulator_get_enable_read_voltage(dev, "vref"); + if (voltage < 0 && voltage != -ENODEV) + return dev_err_probe(dev, voltage, + "Error getting vref voltage\n"); + + if (voltage == -ENODEV) { + if (device_property_read_bool(dev, "adi,vref-out-en")) + *val = AD3552R_INTERNAL_VREF_PIN_2P5V; + else + *val = AD3552R_INTERNAL_VREF_PIN_FLOATING; + + return 0; + } + + if (voltage > 2500000 + delta || voltage < 2500000 - delta) { + dev_warn(dev, "vref-supply must be 2.5V"); + return -EINVAL; + } + + *val = AD3552R_EXTERNAL_VREF_PIN_INPUT; + + return 0; +} +EXPORT_SYMBOL_NS_GPL(ad3552r_get_ref_voltage, IIO_AD3552R); + +int ad3552r_get_drive_strength(struct device *dev, u32 *val) +{ + int err; + u32 drive_strength; + + err = device_property_read_u32(dev, "adi,sdo-drive-strength", + &drive_strength); + if (err) + return err; + + if (drive_strength > 3) { + dev_err_probe(dev, -EINVAL, + "adi,sdo-drive-strength must be less than 4\n"); + return -EINVAL; + } + + *val = drive_strength; + + return 0; +} +EXPORT_SYMBOL_NS_GPL(ad3552r_get_drive_strength, IIO_AD3552R); + +int ad3552r_get_custom_gain(struct device *dev, struct fwnode_handle *child, + u8 *gs_p, u8 *gs_n, u16 *rfb, s16 *goffs) +{ + int err; + u32 val; + struct fwnode_handle *gain_child __free(fwnode_handle) = + fwnode_get_named_child_node(child, + "custom-output-range-config"); + + if (!gain_child) + return dev_err_probe(dev, -EINVAL, + "custom-output-range-config mandatory\n"); + + err = fwnode_property_read_u32(gain_child, "adi,gain-scaling-p", &val); + if (err) + return dev_err_probe(dev, err, + "adi,gain-scaling-p mandatory\n"); + *gs_p = val; + + err = fwnode_property_read_u32(gain_child, "adi,gain-scaling-n", &val); + if (err) + return dev_err_probe(dev, err, + "adi,gain-scaling-n property mandatory\n"); + *gs_n = val; + + err = fwnode_property_read_u32(gain_child, "adi,rfb-ohms", &val); + if (err) + return dev_err_probe(dev, err, + "adi,rfb-ohms mandatory\n"); + *rfb = val; + + err = fwnode_property_read_u32(gain_child, "adi,gain-offset", &val); + if (err) + return dev_err_probe(dev, err, + "adi,gain-offset mandatory\n"); + *goffs = val; + + return 0; +} +EXPORT_SYMBOL_NS_GPL(ad3552r_get_custom_gain, IIO_AD3552R); + +static int ad3552r_find_range(const struct ad3552r_model_data *model_info, + s32 *vals) +{ + int i; + + for (i = 0; i < model_info->num_ranges; i++) + if (vals[0] == model_info->ranges_table[i][0] * 1000 && + vals[1] == model_info->ranges_table[i][1] * 1000) + return i; + + return -EINVAL; +} + +int ad3552r_get_output_range(struct device *dev, + const struct ad3552r_model_data *model_info, + struct fwnode_handle *child, u32 *val) +{ + int ret; + s32 vals[2]; + + /* This property is optional, so returning -ENOENT if missing */ + if (!fwnode_property_present(child, "adi,output-range-microvolt")) + return -ENOENT; + + ret = fwnode_property_read_u32_array(child, + "adi,output-range-microvolt", + vals, 2); + if (ret) + return dev_err_probe(dev, ret, + "invalid adi,output-range-microvolt\n"); + + ret = ad3552r_find_range(model_info, vals); + if (ret < 0) + return dev_err_probe(dev, ret, + "invalid adi,output-range-microvolt value\n"); + + *val = ret; + + return 0; +} +EXPORT_SYMBOL_NS_GPL(ad3552r_get_output_range, IIO_AD3552R); + +MODULE_DESCRIPTION("ad3552r common functions"); +MODULE_LICENSE("GPL"); diff --git a/drivers/iio/dac/ad3552r.c b/drivers/iio/dac/ad3552r.c index aa453d3de5e1c..5b2ce2aa67a47 100644 --- a/drivers/iio/dac/ad3552r.c +++ b/drivers/iio/dac/ad3552r.c @@ -12,226 +12,9 @@ #include #include #include -#include #include -/* Register addresses */ -/* Primary address space */ -#define AD3552R_REG_ADDR_INTERFACE_CONFIG_A 0x00 -#define AD3552R_MASK_SOFTWARE_RESET (BIT(7) | BIT(0)) -#define AD3552R_MASK_ADDR_ASCENSION BIT(5) -#define AD3552R_MASK_SDO_ACTIVE BIT(4) -#define AD3552R_REG_ADDR_INTERFACE_CONFIG_B 0x01 -#define AD3552R_MASK_SINGLE_INST BIT(7) -#define AD3552R_MASK_SHORT_INSTRUCTION BIT(3) -#define AD3552R_REG_ADDR_DEVICE_CONFIG 0x02 -#define AD3552R_MASK_DEVICE_STATUS(n) BIT(4 + (n)) -#define AD3552R_MASK_CUSTOM_MODES GENMASK(3, 2) -#define AD3552R_MASK_OPERATING_MODES GENMASK(1, 0) -#define AD3552R_REG_ADDR_CHIP_TYPE 0x03 -#define AD3552R_MASK_CLASS GENMASK(7, 0) -#define AD3552R_REG_ADDR_PRODUCT_ID_L 0x04 -#define AD3552R_REG_ADDR_PRODUCT_ID_H 0x05 -#define AD3552R_REG_ADDR_CHIP_GRADE 0x06 -#define AD3552R_MASK_GRADE GENMASK(7, 4) -#define AD3552R_MASK_DEVICE_REVISION GENMASK(3, 0) -#define AD3552R_REG_ADDR_SCRATCH_PAD 0x0A -#define AD3552R_REG_ADDR_SPI_REVISION 0x0B -#define AD3552R_REG_ADDR_VENDOR_L 0x0C -#define AD3552R_REG_ADDR_VENDOR_H 0x0D -#define AD3552R_REG_ADDR_STREAM_MODE 0x0E -#define AD3552R_MASK_LENGTH GENMASK(7, 0) -#define AD3552R_REG_ADDR_TRANSFER_REGISTER 0x0F -#define AD3552R_MASK_MULTI_IO_MODE GENMASK(7, 6) -#define AD3552R_MASK_STREAM_LENGTH_KEEP_VALUE BIT(2) -#define AD3552R_REG_ADDR_INTERFACE_CONFIG_C 0x10 -#define AD3552R_MASK_CRC_ENABLE (GENMASK(7, 6) |\ - GENMASK(1, 0)) -#define AD3552R_MASK_STRICT_REGISTER_ACCESS BIT(5) -#define AD3552R_REG_ADDR_INTERFACE_STATUS_A 0x11 -#define AD3552R_MASK_INTERFACE_NOT_READY BIT(7) -#define AD3552R_MASK_CLOCK_COUNTING_ERROR BIT(5) -#define AD3552R_MASK_INVALID_OR_NO_CRC BIT(3) -#define AD3552R_MASK_WRITE_TO_READ_ONLY_REGISTER BIT(2) -#define AD3552R_MASK_PARTIAL_REGISTER_ACCESS BIT(1) -#define AD3552R_MASK_REGISTER_ADDRESS_INVALID BIT(0) -#define AD3552R_REG_ADDR_INTERFACE_CONFIG_D 0x14 -#define AD3552R_MASK_ALERT_ENABLE_PULLUP BIT(6) -#define AD3552R_MASK_MEM_CRC_EN BIT(4) -#define AD3552R_MASK_SDO_DRIVE_STRENGTH GENMASK(3, 2) -#define AD3552R_MASK_DUAL_SPI_SYNCHROUNOUS_EN BIT(1) -#define AD3552R_MASK_SPI_CONFIG_DDR BIT(0) -#define AD3552R_REG_ADDR_SH_REFERENCE_CONFIG 0x15 -#define AD3552R_MASK_IDUMP_FAST_MODE BIT(6) -#define AD3552R_MASK_SAMPLE_HOLD_DIFFERENTIAL_USER_EN BIT(5) -#define AD3552R_MASK_SAMPLE_HOLD_USER_TRIM GENMASK(4, 3) -#define AD3552R_MASK_SAMPLE_HOLD_USER_ENABLE BIT(2) -#define AD3552R_MASK_REFERENCE_VOLTAGE_SEL GENMASK(1, 0) -#define AD3552R_REG_ADDR_ERR_ALARM_MASK 0x16 -#define AD3552R_MASK_REF_RANGE_ALARM BIT(6) -#define AD3552R_MASK_CLOCK_COUNT_ERR_ALARM BIT(5) -#define AD3552R_MASK_MEM_CRC_ERR_ALARM BIT(4) -#define AD3552R_MASK_SPI_CRC_ERR_ALARM BIT(3) -#define AD3552R_MASK_WRITE_TO_READ_ONLY_ALARM BIT(2) -#define AD3552R_MASK_PARTIAL_REGISTER_ACCESS_ALARM BIT(1) -#define AD3552R_MASK_REGISTER_ADDRESS_INVALID_ALARM BIT(0) -#define AD3552R_REG_ADDR_ERR_STATUS 0x17 -#define AD3552R_MASK_REF_RANGE_ERR_STATUS BIT(6) -#define AD3552R_MASK_DUAL_SPI_STREAM_EXCEEDS_DAC_ERR_STATUS BIT(5) -#define AD3552R_MASK_MEM_CRC_ERR_STATUS BIT(4) -#define AD3552R_MASK_RESET_STATUS BIT(0) -#define AD3552R_REG_ADDR_POWERDOWN_CONFIG 0x18 -#define AD3552R_MASK_CH_DAC_POWERDOWN(ch) BIT(4 + (ch)) -#define AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(ch) BIT(ch) -#define AD3552R_REG_ADDR_CH0_CH1_OUTPUT_RANGE 0x19 -#define AD3552R_MASK_CH_OUTPUT_RANGE_SEL(ch) ((ch) ? GENMASK(7, 4) :\ - GENMASK(3, 0)) -#define AD3552R_REG_ADDR_CH_OFFSET(ch) (0x1B + (ch) * 2) -#define AD3552R_MASK_CH_OFFSET_BITS_0_7 GENMASK(7, 0) -#define AD3552R_REG_ADDR_CH_GAIN(ch) (0x1C + (ch) * 2) -#define AD3552R_MASK_CH_RANGE_OVERRIDE BIT(7) -#define AD3552R_MASK_CH_GAIN_SCALING_N GENMASK(6, 5) -#define AD3552R_MASK_CH_GAIN_SCALING_P GENMASK(4, 3) -#define AD3552R_MASK_CH_OFFSET_POLARITY BIT(2) -#define AD3552R_MASK_CH_OFFSET_BIT_8 BIT(0) -/* - * Secondary region - * For multibyte registers specify the highest address because the access is - * done in descending order - */ -#define AD3552R_SECONDARY_REGION_START 0x28 -#define AD3552R_REG_ADDR_HW_LDAC_16B 0x28 -#define AD3552R_REG_ADDR_CH_DAC_16B(ch) (0x2C - (1 - ch) * 2) -#define AD3552R_REG_ADDR_DAC_PAGE_MASK_16B 0x2E -#define AD3552R_REG_ADDR_CH_SELECT_16B 0x2F -#define AD3552R_REG_ADDR_INPUT_PAGE_MASK_16B 0x31 -#define AD3552R_REG_ADDR_SW_LDAC_16B 0x32 -#define AD3552R_REG_ADDR_CH_INPUT_16B(ch) (0x36 - (1 - ch) * 2) -/* 3 bytes registers */ -#define AD3552R_REG_START_24B 0x37 -#define AD3552R_REG_ADDR_HW_LDAC_24B 0x37 -#define AD3552R_REG_ADDR_CH_DAC_24B(ch) (0x3D - (1 - ch) * 3) -#define AD3552R_REG_ADDR_DAC_PAGE_MASK_24B 0x40 -#define AD3552R_REG_ADDR_CH_SELECT_24B 0x41 -#define AD3552R_REG_ADDR_INPUT_PAGE_MASK_24B 0x44 -#define AD3552R_REG_ADDR_SW_LDAC_24B 0x45 -#define AD3552R_REG_ADDR_CH_INPUT_24B(ch) (0x4B - (1 - ch) * 3) - -/* Useful defines */ -#define AD3552R_MAX_CH 2 -#define AD3552R_MASK_CH(ch) BIT(ch) -#define AD3552R_MASK_ALL_CH GENMASK(1, 0) -#define AD3552R_MAX_REG_SIZE 3 -#define AD3552R_READ_BIT BIT(7) -#define AD3552R_ADDR_MASK GENMASK(6, 0) -#define AD3552R_MASK_DAC_12B 0xFFF0 -#define AD3552R_DEFAULT_CONFIG_B_VALUE 0x8 -#define AD3552R_SCRATCH_PAD_TEST_VAL1 0x34 -#define AD3552R_SCRATCH_PAD_TEST_VAL2 0xB2 -#define AD3552R_GAIN_SCALE 1000 -#define AD3552R_LDAC_PULSE_US 100 - -enum ad3552r_ch_vref_select { - /* Internal source with Vref I/O floating */ - AD3552R_INTERNAL_VREF_PIN_FLOATING, - /* Internal source with Vref I/O at 2.5V */ - AD3552R_INTERNAL_VREF_PIN_2P5V, - /* External source with Vref I/O as input */ - AD3552R_EXTERNAL_VREF_PIN_INPUT -}; - -enum ad3552r_id { - AD3541R_ID = 0x400b, - AD3542R_ID = 0x4009, - AD3551R_ID = 0x400a, - AD3552R_ID = 0x4008, -}; - -enum ad3552r_ch_output_range { - /* Range from 0 V to 2.5 V. Requires Rfb1x connection */ - AD3552R_CH_OUTPUT_RANGE_0__2P5V, - /* Range from 0 V to 5 V. Requires Rfb1x connection */ - AD3552R_CH_OUTPUT_RANGE_0__5V, - /* Range from 0 V to 10 V. Requires Rfb2x connection */ - AD3552R_CH_OUTPUT_RANGE_0__10V, - /* Range from -5 V to 5 V. Requires Rfb2x connection */ - AD3552R_CH_OUTPUT_RANGE_NEG_5__5V, - /* Range from -10 V to 10 V. Requires Rfb4x connection */ - AD3552R_CH_OUTPUT_RANGE_NEG_10__10V, -}; - -static const s32 ad3552r_ch_ranges[][2] = { - [AD3552R_CH_OUTPUT_RANGE_0__2P5V] = {0, 2500}, - [AD3552R_CH_OUTPUT_RANGE_0__5V] = {0, 5000}, - [AD3552R_CH_OUTPUT_RANGE_0__10V] = {0, 10000}, - [AD3552R_CH_OUTPUT_RANGE_NEG_5__5V] = {-5000, 5000}, - [AD3552R_CH_OUTPUT_RANGE_NEG_10__10V] = {-10000, 10000} -}; - -enum ad3542r_ch_output_range { - /* Range from 0 V to 2.5 V. Requires Rfb1x connection */ - AD3542R_CH_OUTPUT_RANGE_0__2P5V, - /* Range from 0 V to 3 V. Requires Rfb1x connection */ - AD3542R_CH_OUTPUT_RANGE_0__3V, - /* Range from 0 V to 5 V. Requires Rfb1x connection */ - AD3542R_CH_OUTPUT_RANGE_0__5V, - /* Range from 0 V to 10 V. Requires Rfb2x connection */ - AD3542R_CH_OUTPUT_RANGE_0__10V, - /* Range from -2.5 V to 7.5 V. Requires Rfb2x connection */ - AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V, - /* Range from -5 V to 5 V. Requires Rfb2x connection */ - AD3542R_CH_OUTPUT_RANGE_NEG_5__5V, -}; - -static const s32 ad3542r_ch_ranges[][2] = { - [AD3542R_CH_OUTPUT_RANGE_0__2P5V] = {0, 2500}, - [AD3542R_CH_OUTPUT_RANGE_0__3V] = {0, 3000}, - [AD3542R_CH_OUTPUT_RANGE_0__5V] = {0, 5000}, - [AD3542R_CH_OUTPUT_RANGE_0__10V] = {0, 10000}, - [AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V] = {-2500, 7500}, - [AD3542R_CH_OUTPUT_RANGE_NEG_5__5V] = {-5000, 5000} -}; - -enum ad3552r_ch_gain_scaling { - /* Gain scaling of 1 */ - AD3552R_CH_GAIN_SCALING_1, - /* Gain scaling of 0.5 */ - AD3552R_CH_GAIN_SCALING_0_5, - /* Gain scaling of 0.25 */ - AD3552R_CH_GAIN_SCALING_0_25, - /* Gain scaling of 0.125 */ - AD3552R_CH_GAIN_SCALING_0_125, -}; - -/* Gain * AD3552R_GAIN_SCALE */ -static const s32 gains_scaling_table[] = { - [AD3552R_CH_GAIN_SCALING_1] = 1000, - [AD3552R_CH_GAIN_SCALING_0_5] = 500, - [AD3552R_CH_GAIN_SCALING_0_25] = 250, - [AD3552R_CH_GAIN_SCALING_0_125] = 125 -}; - -struct ad3552r_ch_data { - s32 scale_int; - s32 scale_dec; - s32 offset_int; - s32 offset_dec; - s16 gain_offset; - u16 rfb; - u8 n; - u8 p; - u8 range; - bool range_override; -}; - -struct ad3552r_model_data { - const char *model_name; - enum ad3552r_id chip_id; - unsigned int num_hw_channels; - const s32 (*ranges_table)[2]; - int num_ranges; - bool requires_output_range; -}; +#include "ad3552r.h" struct ad3552r_desc { const struct ad3552r_model_data *model_data; @@ -639,136 +422,35 @@ static int ad3552r_reset(struct ad3552r_desc *dac) FIELD_PREP(AD3552R_MASK_ADDR_ASCENSION, val)); } -static void ad3552r_get_custom_range(struct ad3552r_desc *dac, s32 i, s32 *v_min, - s32 *v_max) -{ - s64 vref, tmp, common, offset, gn, gp; - /* - * From datasheet formula (In Volts): - * Vmin = 2.5 + [(GainN + Offset / 1024) * 2.5 * Rfb * 1.03] - * Vmax = 2.5 - [(GainP + Offset / 1024) * 2.5 * Rfb * 1.03] - * Calculus are converted to milivolts - */ - vref = 2500; - /* 2.5 * 1.03 * 1000 (To mV) */ - common = 2575 * dac->ch_data[i].rfb; - offset = dac->ch_data[i].gain_offset; - - gn = gains_scaling_table[dac->ch_data[i].n]; - tmp = (1024 * gn + AD3552R_GAIN_SCALE * offset) * common; - tmp = div_s64(tmp, 1024 * AD3552R_GAIN_SCALE); - *v_max = vref + tmp; - - gp = gains_scaling_table[dac->ch_data[i].p]; - tmp = (1024 * gp - AD3552R_GAIN_SCALE * offset) * common; - tmp = div_s64(tmp, 1024 * AD3552R_GAIN_SCALE); - *v_min = vref - tmp; -} - -static void ad3552r_calc_gain_and_offset(struct ad3552r_desc *dac, s32 ch) -{ - s32 idx, v_max, v_min, span, rem; - s64 tmp; - - if (dac->ch_data[ch].range_override) { - ad3552r_get_custom_range(dac, ch, &v_min, &v_max); - } else { - /* Normal range */ - idx = dac->ch_data[ch].range; - v_min = dac->model_data->ranges_table[idx][0]; - v_max = dac->model_data->ranges_table[idx][1]; - } - - /* - * From datasheet formula: - * Vout = Span * (D / 65536) + Vmin - * Converted to scale and offset: - * Scale = Span / 65536 - * Offset = 65536 * Vmin / Span - * - * Reminders are in micros in order to be printed as - * IIO_VAL_INT_PLUS_MICRO - */ - span = v_max - v_min; - dac->ch_data[ch].scale_int = div_s64_rem(span, 65536, &rem); - /* Do operations in microvolts */ - dac->ch_data[ch].scale_dec = DIV_ROUND_CLOSEST((s64)rem * 1000000, - 65536); - - dac->ch_data[ch].offset_int = div_s64_rem(v_min * 65536, span, &rem); - tmp = (s64)rem * 1000000; - dac->ch_data[ch].offset_dec = div_s64(tmp, span); -} - -static int ad3552r_find_range(const struct ad3552r_model_data *model_data, - s32 *vals) -{ - int i; - - for (i = 0; i < model_data->num_ranges; i++) - if (vals[0] == model_data->ranges_table[i][0] * 1000 && - vals[1] == model_data->ranges_table[i][1] * 1000) - return i; - - return -EINVAL; -} - static int ad3552r_configure_custom_gain(struct ad3552r_desc *dac, struct fwnode_handle *child, u32 ch) { struct device *dev = &dac->spi->dev; - u32 val; int err; u8 addr; - u16 reg = 0, offset; - - struct fwnode_handle *gain_child __free(fwnode_handle) - = fwnode_get_named_child_node(child, - "custom-output-range-config"); - if (!gain_child) - return dev_err_probe(dev, -EINVAL, - "mandatory custom-output-range-config property missing\n"); - - dac->ch_data[ch].range_override = 1; - reg |= FIELD_PREP(AD3552R_MASK_CH_RANGE_OVERRIDE, 1); - - err = fwnode_property_read_u32(gain_child, "adi,gain-scaling-p", &val); - if (err) - return dev_err_probe(dev, err, - "mandatory adi,gain-scaling-p property missing\n"); - reg |= FIELD_PREP(AD3552R_MASK_CH_GAIN_SCALING_P, val); - dac->ch_data[ch].p = val; - - err = fwnode_property_read_u32(gain_child, "adi,gain-scaling-n", &val); - if (err) - return dev_err_probe(dev, err, - "mandatory adi,gain-scaling-n property missing\n"); - reg |= FIELD_PREP(AD3552R_MASK_CH_GAIN_SCALING_N, val); - dac->ch_data[ch].n = val; - - err = fwnode_property_read_u32(gain_child, "adi,rfb-ohms", &val); - if (err) - return dev_err_probe(dev, err, - "mandatory adi,rfb-ohms property missing\n"); - dac->ch_data[ch].rfb = val; + u16 reg; - err = fwnode_property_read_u32(gain_child, "adi,gain-offset", &val); + err = ad3552r_get_custom_gain(dev, child, + &dac->ch_data[ch].p, + &dac->ch_data[ch].n, + &dac->ch_data[ch].rfb, + &dac->ch_data[ch].gain_offset); if (err) - return dev_err_probe(dev, err, - "mandatory adi,gain-offset property missing\n"); - dac->ch_data[ch].gain_offset = val; + return err; - offset = abs((s32)val); - reg |= FIELD_PREP(AD3552R_MASK_CH_OFFSET_BIT_8, (offset >> 8)); + dac->ch_data[ch].range_override = 1; - reg |= FIELD_PREP(AD3552R_MASK_CH_OFFSET_POLARITY, (s32)val < 0); addr = AD3552R_REG_ADDR_CH_GAIN(ch); err = ad3552r_write_reg(dac, addr, - offset & AD3552R_MASK_CH_OFFSET_BITS_0_7); + abs((s32)dac->ch_data[ch].gain_offset) & + AD3552R_MASK_CH_OFFSET_BITS_0_7); if (err) return dev_err_probe(dev, err, "Error writing register\n"); + reg = ad3552r_calc_custom_gain(dac->ch_data[ch].p, dac->ch_data[ch].n, + dac->ch_data[ch].gain_offset); + err = ad3552r_write_reg(dac, addr, reg); if (err) return dev_err_probe(dev, err, "Error writing register\n"); @@ -779,30 +461,17 @@ static int ad3552r_configure_custom_gain(struct ad3552r_desc *dac, static int ad3552r_configure_device(struct ad3552r_desc *dac) { struct device *dev = &dac->spi->dev; - int err, cnt = 0, voltage, delta = 100000; - u32 vals[2], val, ch; + int err, cnt = 0; + u32 val, ch; dac->gpio_ldac = devm_gpiod_get_optional(dev, "ldac", GPIOD_OUT_HIGH); if (IS_ERR(dac->gpio_ldac)) return dev_err_probe(dev, PTR_ERR(dac->gpio_ldac), "Error getting gpio ldac"); - voltage = devm_regulator_get_enable_read_voltage(dev, "vref"); - if (voltage < 0 && voltage != -ENODEV) - return dev_err_probe(dev, voltage, "Error getting vref voltage\n"); - - if (voltage == -ENODEV) { - if (device_property_read_bool(dev, "adi,vref-out-en")) - val = AD3552R_INTERNAL_VREF_PIN_2P5V; - else - val = AD3552R_INTERNAL_VREF_PIN_FLOATING; - } else { - if (voltage > 2500000 + delta || voltage < 2500000 - delta) { - dev_warn(dev, "vref-supply must be 2.5V"); - return -EINVAL; - } - val = AD3552R_EXTERNAL_VREF_PIN_INPUT; - } + err = ad3552r_get_ref_voltage(dev, &val); + if (err < 0) + return err; err = ad3552r_update_reg_field(dac, AD3552R_REG_ADDR_SH_REFERENCE_CONFIG, @@ -811,13 +480,8 @@ static int ad3552r_configure_device(struct ad3552r_desc *dac) if (err) return err; - err = device_property_read_u32(dev, "adi,sdo-drive-strength", &val); + err = ad3552r_get_drive_strength(dev, &val); if (!err) { - if (val > 3) { - dev_err(dev, "adi,sdo-drive-strength must be less than 4\n"); - return -EINVAL; - } - err = ad3552r_update_reg_field(dac, AD3552R_REG_ADDR_INTERFACE_CONFIG_D, AD3552R_MASK_SDO_DRIVE_STRENGTH, @@ -842,21 +506,12 @@ static int ad3552r_configure_device(struct ad3552r_desc *dac) "reg must be less than %d\n", dac->model_data->num_hw_channels); - if (fwnode_property_present(child, "adi,output-range-microvolt")) { - err = fwnode_property_read_u32_array(child, - "adi,output-range-microvolt", - vals, - 2); - if (err) - return dev_err_probe(dev, err, - "adi,output-range-microvolt property could not be parsed\n"); - - err = ad3552r_find_range(dac->model_data, vals); - if (err < 0) - return dev_err_probe(dev, err, - "Invalid adi,output-range-microvolt value\n"); + err = ad3552r_get_output_range(dev, dac->model_data, + child, &val); + if (err && err != -ENOENT) + return err; - val = err; + if (!err) { if (ch == 0) val = FIELD_PREP(AD3552R_MASK_CH_OUTPUT_RANGE_SEL(0), val); else @@ -880,7 +535,7 @@ static int ad3552r_configure_device(struct ad3552r_desc *dac) return err; } - ad3552r_calc_gain_and_offset(dac, ch); + ad3552r_calc_gain_and_offset(&dac->ch_data[ch], dac->model_data); dac->enabled_ch |= BIT(ch); if (ch == 0) @@ -1079,3 +734,4 @@ module_spi_driver(ad3552r_driver); MODULE_AUTHOR("Mihail Chindris "); MODULE_DESCRIPTION("Analog Device AD3552R DAC"); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(IIO_AD3552R); diff --git a/drivers/iio/dac/ad3552r.h b/drivers/iio/dac/ad3552r.h new file mode 100644 index 0000000000000..7511e3f1882cb --- /dev/null +++ b/drivers/iio/dac/ad3552r.h @@ -0,0 +1,224 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * AD3552R Digital <-> Analog converters common header + * + * Copyright 2021-2024 Analog Devices Inc. + * Author: Angelo Dureghello + */ + +#ifndef __DRIVERS_IIO_DAC_AD3552R_H__ +#define __DRIVERS_IIO_DAC_AD3552R_H__ + +/* Register addresses */ +/* Primary address space */ +#define AD3552R_REG_ADDR_INTERFACE_CONFIG_A 0x00 +#define AD3552R_MASK_SOFTWARE_RESET (BIT(7) | BIT(0)) +#define AD3552R_MASK_ADDR_ASCENSION BIT(5) +#define AD3552R_MASK_SDO_ACTIVE BIT(4) +#define AD3552R_REG_ADDR_INTERFACE_CONFIG_B 0x01 +#define AD3552R_MASK_SINGLE_INST BIT(7) +#define AD3552R_MASK_SHORT_INSTRUCTION BIT(3) +#define AD3552R_REG_ADDR_DEVICE_CONFIG 0x02 +#define AD3552R_MASK_DEVICE_STATUS(n) BIT(4 + (n)) +#define AD3552R_MASK_CUSTOM_MODES GENMASK(3, 2) +#define AD3552R_MASK_OPERATING_MODES GENMASK(1, 0) +#define AD3552R_REG_ADDR_CHIP_TYPE 0x03 +#define AD3552R_MASK_CLASS GENMASK(7, 0) +#define AD3552R_REG_ADDR_PRODUCT_ID_L 0x04 +#define AD3552R_REG_ADDR_PRODUCT_ID_H 0x05 +#define AD3552R_REG_ADDR_CHIP_GRADE 0x06 +#define AD3552R_MASK_GRADE GENMASK(7, 4) +#define AD3552R_MASK_DEVICE_REVISION GENMASK(3, 0) +#define AD3552R_REG_ADDR_SCRATCH_PAD 0x0A +#define AD3552R_REG_ADDR_SPI_REVISION 0x0B +#define AD3552R_REG_ADDR_VENDOR_L 0x0C +#define AD3552R_REG_ADDR_VENDOR_H 0x0D +#define AD3552R_REG_ADDR_STREAM_MODE 0x0E +#define AD3552R_MASK_LENGTH GENMASK(7, 0) +#define AD3552R_REG_ADDR_TRANSFER_REGISTER 0x0F +#define AD3552R_MASK_MULTI_IO_MODE GENMASK(7, 6) +#define AD3552R_MASK_STREAM_LENGTH_KEEP_VALUE BIT(2) +#define AD3552R_REG_ADDR_INTERFACE_CONFIG_C 0x10 +#define AD3552R_MASK_CRC_ENABLE \ + (GENMASK(7, 6) | GENMASK(1, 0)) +#define AD3552R_MASK_STRICT_REGISTER_ACCESS BIT(5) +#define AD3552R_REG_ADDR_INTERFACE_STATUS_A 0x11 +#define AD3552R_MASK_INTERFACE_NOT_READY BIT(7) +#define AD3552R_MASK_CLOCK_COUNTING_ERROR BIT(5) +#define AD3552R_MASK_INVALID_OR_NO_CRC BIT(3) +#define AD3552R_MASK_WRITE_TO_READ_ONLY_REGISTER BIT(2) +#define AD3552R_MASK_PARTIAL_REGISTER_ACCESS BIT(1) +#define AD3552R_MASK_REGISTER_ADDRESS_INVALID BIT(0) +#define AD3552R_REG_ADDR_INTERFACE_CONFIG_D 0x14 +#define AD3552R_MASK_ALERT_ENABLE_PULLUP BIT(6) +#define AD3552R_MASK_MEM_CRC_EN BIT(4) +#define AD3552R_MASK_SDO_DRIVE_STRENGTH GENMASK(3, 2) +#define AD3552R_MASK_DUAL_SPI_SYNCHROUNOUS_EN BIT(1) +#define AD3552R_MASK_SPI_CONFIG_DDR BIT(0) +#define AD3552R_REG_ADDR_SH_REFERENCE_CONFIG 0x15 +#define AD3552R_MASK_IDUMP_FAST_MODE BIT(6) +#define AD3552R_MASK_SAMPLE_HOLD_DIFF_USER_EN BIT(5) +#define AD3552R_MASK_SAMPLE_HOLD_USER_TRIM GENMASK(4, 3) +#define AD3552R_MASK_SAMPLE_HOLD_USER_ENABLE BIT(2) +#define AD3552R_MASK_REFERENCE_VOLTAGE_SEL GENMASK(1, 0) +#define AD3552R_REG_ADDR_ERR_ALARM_MASK 0x16 +#define AD3552R_MASK_REF_RANGE_ALARM BIT(6) +#define AD3552R_MASK_CLOCK_COUNT_ERR_ALARM BIT(5) +#define AD3552R_MASK_MEM_CRC_ERR_ALARM BIT(4) +#define AD3552R_MASK_SPI_CRC_ERR_ALARM BIT(3) +#define AD3552R_MASK_WRITE_TO_READ_ONLY_ALARM BIT(2) +#define AD3552R_MASK_PARTIAL_REGISTER_ACCESS_ALARM BIT(1) +#define AD3552R_MASK_REGISTER_ADDRESS_INVALID_ALARM BIT(0) +#define AD3552R_REG_ADDR_ERR_STATUS 0x17 +#define AD3552R_MASK_REF_RANGE_ERR_STATUS BIT(6) +#define AD3552R_MASK_STREAM_EXCEEDS_DAC_ERR_STATUS BIT(5) +#define AD3552R_MASK_MEM_CRC_ERR_STATUS BIT(4) +#define AD3552R_MASK_RESET_STATUS BIT(0) +#define AD3552R_REG_ADDR_POWERDOWN_CONFIG 0x18 +#define AD3552R_MASK_CH_DAC_POWERDOWN(ch) BIT(4 + (ch)) +#define AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(ch) BIT(ch) +#define AD3552R_REG_ADDR_CH0_CH1_OUTPUT_RANGE 0x19 +#define AD3552R_MASK_CH0_RANGE GENMASK(2, 0) +#define AD3552R_MASK_CH1_RANGE GENMASK(6, 4) +#define AD3552R_MASK_CH_OUTPUT_RANGE GENMASK(7, 0) +#define AD3552R_MASK_CH_OUTPUT_RANGE_SEL(ch) \ + ((ch) ? GENMASK(7, 4) : GENMASK(3, 0)) +#define AD3552R_REG_ADDR_CH_OFFSET(ch) (0x1B + (ch) * 2) +#define AD3552R_MASK_CH_OFFSET_BITS_0_7 GENMASK(7, 0) +#define AD3552R_REG_ADDR_CH_GAIN(ch) (0x1C + (ch) * 2) +#define AD3552R_MASK_CH_RANGE_OVERRIDE BIT(7) +#define AD3552R_MASK_CH_GAIN_SCALING_N GENMASK(6, 5) +#define AD3552R_MASK_CH_GAIN_SCALING_P GENMASK(4, 3) +#define AD3552R_MASK_CH_OFFSET_POLARITY BIT(2) +#define AD3552R_MASK_CH_OFFSET_BIT_8 BIT(8) +/* + * Secondary region + * For multibyte registers specify the highest address because the access is + * done in descending order + */ +#define AD3552R_SECONDARY_REGION_START 0x28 +#define AD3552R_REG_ADDR_HW_LDAC_16B 0x28 +#define AD3552R_REG_ADDR_CH_DAC_16B(ch) (0x2C - (1 - (ch)) * 2) +#define AD3552R_REG_ADDR_DAC_PAGE_MASK_16B 0x2E +#define AD3552R_REG_ADDR_CH_SELECT_16B 0x2F +#define AD3552R_REG_ADDR_INPUT_PAGE_MASK_16B 0x31 +#define AD3552R_REG_ADDR_SW_LDAC_16B 0x32 +#define AD3552R_REG_ADDR_CH_INPUT_16B(ch) (0x36 - (1 - (ch)) * 2) +/* 3 bytes registers */ +#define AD3552R_REG_START_24B 0x37 +#define AD3552R_REG_ADDR_HW_LDAC_24B 0x37 +#define AD3552R_REG_ADDR_CH_DAC_24B(ch) (0x3D - (1 - (ch)) * 3) +#define AD3552R_REG_ADDR_DAC_PAGE_MASK_24B 0x40 +#define AD3552R_REG_ADDR_CH_SELECT_24B 0x41 +#define AD3552R_REG_ADDR_INPUT_PAGE_MASK_24B 0x44 +#define AD3552R_REG_ADDR_SW_LDAC_24B 0x45 +#define AD3552R_REG_ADDR_CH_INPUT_24B(ch) (0x4B - (1 - (ch)) * 3) + +#define AD3552R_MAX_CH 2 +#define AD3552R_MASK_CH(ch) BIT(ch) +#define AD3552R_MASK_ALL_CH GENMASK(1, 0) +#define AD3552R_MAX_REG_SIZE 3 +#define AD3552R_READ_BIT BIT(7) +#define AD3552R_ADDR_MASK GENMASK(6, 0) +#define AD3552R_MASK_DAC_12B GENMASK(15, 4) +#define AD3552R_DEFAULT_CONFIG_B_VALUE 0x8 +#define AD3552R_SCRATCH_PAD_TEST_VAL1 0x34 +#define AD3552R_SCRATCH_PAD_TEST_VAL2 0xB2 +#define AD3552R_GAIN_SCALE 1000 +#define AD3552R_LDAC_PULSE_US 100 + +#define AD3552R_MAX_RANGES 5 +#define AD3542R_MAX_RANGES 6 + +extern const s32 ad3552r_ch_ranges[AD3552R_MAX_RANGES][2]; +extern const s32 ad3542r_ch_ranges[AD3542R_MAX_RANGES][2]; + +enum ad3552r_id { + AD3541R_ID = 0x400b, + AD3542R_ID = 0x4009, + AD3551R_ID = 0x400a, + AD3552R_ID = 0x4008, +}; + +struct ad3552r_model_data { + const char *model_name; + enum ad3552r_id chip_id; + unsigned int num_hw_channels; + const s32 (*ranges_table)[2]; + int num_ranges; + bool requires_output_range; +}; + +struct ad3552r_ch_data { + s32 scale_int; + s32 scale_dec; + s32 offset_int; + s32 offset_dec; + s16 gain_offset; + u16 rfb; + u8 n; + u8 p; + u8 range; + bool range_override; +}; + +enum ad3552r_ch_gain_scaling { + /* Gain scaling of 1 */ + AD3552R_CH_GAIN_SCALING_1, + /* Gain scaling of 0.5 */ + AD3552R_CH_GAIN_SCALING_0_5, + /* Gain scaling of 0.25 */ + AD3552R_CH_GAIN_SCALING_0_25, + /* Gain scaling of 0.125 */ + AD3552R_CH_GAIN_SCALING_0_125, +}; + +enum ad3552r_ch_vref_select { + /* Internal source with Vref I/O floating */ + AD3552R_INTERNAL_VREF_PIN_FLOATING, + /* Internal source with Vref I/O at 2.5V */ + AD3552R_INTERNAL_VREF_PIN_2P5V, + /* External source with Vref I/O as input */ + AD3552R_EXTERNAL_VREF_PIN_INPUT +}; + +enum ad3542r_ch_output_range { + /* Range from 0 V to 2.5 V. Requires Rfb1x connection */ + AD3542R_CH_OUTPUT_RANGE_0__2P5V, + /* Range from 0 V to 3 V. Requires Rfb1x connection */ + AD3542R_CH_OUTPUT_RANGE_0__3V, + /* Range from 0 V to 5 V. Requires Rfb1x connection */ + AD3542R_CH_OUTPUT_RANGE_0__5V, + /* Range from 0 V to 10 V. Requires Rfb2x connection */ + AD3542R_CH_OUTPUT_RANGE_0__10V, + /* Range from -2.5 V to 7.5 V. Requires Rfb2x connection */ + AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V, + /* Range from -5 V to 5 V. Requires Rfb2x connection */ + AD3542R_CH_OUTPUT_RANGE_NEG_5__5V, +}; + +enum ad3552r_ch_output_range { + /* Range from 0 V to 2.5 V. Requires Rfb1x connection */ + AD3552R_CH_OUTPUT_RANGE_0__2P5V, + /* Range from 0 V to 5 V. Requires Rfb1x connection */ + AD3552R_CH_OUTPUT_RANGE_0__5V, + /* Range from 0 V to 10 V. Requires Rfb2x connection */ + AD3552R_CH_OUTPUT_RANGE_0__10V, + /* Range from -5 V to 5 V. Requires Rfb2x connection */ + AD3552R_CH_OUTPUT_RANGE_NEG_5__5V, + /* Range from -10 V to 10 V. Requires Rfb4x connection */ + AD3552R_CH_OUTPUT_RANGE_NEG_10__10V, +}; + +int ad3552r_get_output_range(struct device *dev, + const struct ad3552r_model_data *model_info, + struct fwnode_handle *child, u32 *val); +int ad3552r_get_custom_gain(struct device *dev, struct fwnode_handle *child, + u8 *gs_p, u8 *gs_n, u16 *rfb, s16 *goffs); +u16 ad3552r_calc_custom_gain(u8 p, u8 n, s16 goffs); +int ad3552r_get_ref_voltage(struct device *dev, u32 *val); +int ad3552r_get_drive_strength(struct device *dev, u32 *val); +void ad3552r_calc_gain_and_offset(struct ad3552r_ch_data *ch_data, + const struct ad3552r_model_data *model_data); + +#endif /* __DRIVERS_IIO_DAC_AD3552R_H__ */ -- GitLab From b2d2be772d50d8b83054a05d63653432d01264c1 Mon Sep 17 00:00:00 2001 From: Angelo Dureghello Date: Wed, 8 Jan 2025 18:29:15 +0100 Subject: [PATCH 1836/2211] iio: dac: ad3552r-common: fix ad3541/2r ranges [ Upstream commit 1e758b613212b6964518a67939535910b5aee831 ] Fix ad3541/2r voltage ranges to be as per ad3542r datasheet, rev. C, table 38 (page 57). The wrong ad354xr ranges was generating erroneous Vpp output. In more details: - fix wrong number of ranges, they are 5 ranges, not 6, - remove non-existent 0-3V range, - adjust order, since ad3552r_find_range() get a wrong index, producing a wrong Vpp as output. Retested all the ranges on real hardware, EVALAD3542RFMCZ: adi,output-range-microvolt (fdt): <(000000) (2500000)>; ok (Rfbx1, switch 10) <(000000) (5000000)>; ok (Rfbx1, switch 10) <(000000) (10000000)>; ok (Rfbx1, switch 10) <(-5000000) (5000000)>; ok (Rfbx2, switch +/- 5) <(-2500000) (7500000)>; ok (Rfbx2, switch -2.5/7.5) Fixes: 8f2b54824b28 ("drivers:iio:dac: Add AD3552R driver support") Signed-off-by: Angelo Dureghello Reviewed-by: David Lechner Link: https://patch.msgid.link/20250108-wip-bl-ad3552r-axi-v0-iio-testing-carlos-v2-1-2dac02f04638@baylibre.com Cc: Signed-off-by: Jonathan Cameron Signed-off-by: Sasha Levin --- drivers/iio/dac/ad3552r-common.c | 5 ++--- drivers/iio/dac/ad3552r.h | 9 ++++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/drivers/iio/dac/ad3552r-common.c b/drivers/iio/dac/ad3552r-common.c index 2dfeca3656d21..94869ad15c27e 100644 --- a/drivers/iio/dac/ad3552r-common.c +++ b/drivers/iio/dac/ad3552r-common.c @@ -22,11 +22,10 @@ EXPORT_SYMBOL_NS_GPL(ad3552r_ch_ranges, IIO_AD3552R); const s32 ad3542r_ch_ranges[AD3542R_MAX_RANGES][2] = { [AD3542R_CH_OUTPUT_RANGE_0__2P5V] = { 0, 2500 }, - [AD3542R_CH_OUTPUT_RANGE_0__3V] = { 0, 3000 }, [AD3542R_CH_OUTPUT_RANGE_0__5V] = { 0, 5000 }, [AD3542R_CH_OUTPUT_RANGE_0__10V] = { 0, 10000 }, - [AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V] = { -2500, 7500 }, - [AD3542R_CH_OUTPUT_RANGE_NEG_5__5V] = { -5000, 5000 } + [AD3542R_CH_OUTPUT_RANGE_NEG_5__5V] = { -5000, 5000 }, + [AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V] = { -2500, 7500 } }; EXPORT_SYMBOL_NS_GPL(ad3542r_ch_ranges, IIO_AD3552R); diff --git a/drivers/iio/dac/ad3552r.h b/drivers/iio/dac/ad3552r.h index 7511e3f1882cb..c20f64f80d5db 100644 --- a/drivers/iio/dac/ad3552r.h +++ b/drivers/iio/dac/ad3552r.h @@ -128,7 +128,8 @@ #define AD3552R_LDAC_PULSE_US 100 #define AD3552R_MAX_RANGES 5 -#define AD3542R_MAX_RANGES 6 +#define AD3542R_MAX_RANGES 5 +#define AD3552R_QUAD_SPI 2 extern const s32 ad3552r_ch_ranges[AD3552R_MAX_RANGES][2]; extern const s32 ad3542r_ch_ranges[AD3542R_MAX_RANGES][2]; @@ -185,16 +186,14 @@ enum ad3552r_ch_vref_select { enum ad3542r_ch_output_range { /* Range from 0 V to 2.5 V. Requires Rfb1x connection */ AD3542R_CH_OUTPUT_RANGE_0__2P5V, - /* Range from 0 V to 3 V. Requires Rfb1x connection */ - AD3542R_CH_OUTPUT_RANGE_0__3V, /* Range from 0 V to 5 V. Requires Rfb1x connection */ AD3542R_CH_OUTPUT_RANGE_0__5V, /* Range from 0 V to 10 V. Requires Rfb2x connection */ AD3542R_CH_OUTPUT_RANGE_0__10V, - /* Range from -2.5 V to 7.5 V. Requires Rfb2x connection */ - AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V, /* Range from -5 V to 5 V. Requires Rfb2x connection */ AD3542R_CH_OUTPUT_RANGE_NEG_5__5V, + /* Range from -2.5 V to 7.5 V. Requires Rfb2x connection */ + AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V, }; enum ad3552r_ch_output_range { -- GitLab From ab64e42864c98261f97a74c0cf14401c6020d5b3 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Wed, 2 Jul 2025 17:33:25 -0400 Subject: [PATCH 1837/2211] drm/xe: Carve out wopcm portion from the stolen memory [ Upstream commit e977499820782ab1c69f354d9f41b6d9ad1f43d9 ] The top of stolen memory is WOPCM, which shouldn't be accessed. Remove this portion from the stolen memory region for discrete platforms. This was already done for integrated, but was missing for discrete platforms. This also moves get_wopcm_size() so detect_bar2_dgfx() and detect_bar2_integrated can use the same function. v2: Improve commit message and suitable stable version tag(Lucas) Fixes: d8b52a02cb40 ("drm/xe: Implement stolen memory.") Cc: Maarten Lankhorst Cc: Matthew Auld Cc: Lucas De Marchi Cc: stable@vger.kernel.org # v6.11+ Reviewed-by: Lucas De Marchi Link: https://patchwork.freedesktop.org/patch/msgid/20250210143654.2076747-1-nirmoy.das@intel.com Signed-off-by: Nirmoy Das (cherry picked from commit 2c7f45cc7e197a792ce5c693e56ea48f60b312da) Signed-off-by: Rodrigo Vivi Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c | 54 ++++++++++++++------------ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c index ef84fa757b26f..34e38bb167bac 100644 --- a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c +++ b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c @@ -57,12 +57,35 @@ bool xe_ttm_stolen_cpu_access_needs_ggtt(struct xe_device *xe) return GRAPHICS_VERx100(xe) < 1270 && !IS_DGFX(xe); } +static u32 get_wopcm_size(struct xe_device *xe) +{ + u32 wopcm_size; + u64 val; + + val = xe_mmio_read64_2x32(xe_root_mmio_gt(xe), STOLEN_RESERVED); + val = REG_FIELD_GET64(WOPCM_SIZE_MASK, val); + + switch (val) { + case 0x5 ... 0x6: + val--; + fallthrough; + case 0x0 ... 0x3: + wopcm_size = (1U << val) * SZ_1M; + break; + default: + WARN(1, "Missing case wopcm_size=%llx\n", val); + wopcm_size = 0; + } + + return wopcm_size; +} + static s64 detect_bar2_dgfx(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr) { struct xe_tile *tile = xe_device_get_root_tile(xe); struct xe_gt *mmio = xe_root_mmio_gt(xe); struct pci_dev *pdev = to_pci_dev(xe->drm.dev); - u64 stolen_size; + u64 stolen_size, wopcm_size; u64 tile_offset; u64 tile_size; @@ -74,7 +97,13 @@ static s64 detect_bar2_dgfx(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr) if (drm_WARN_ON(&xe->drm, tile_size < mgr->stolen_base)) return 0; + /* Carve out the top of DSM as it contains the reserved WOPCM region */ + wopcm_size = get_wopcm_size(xe); + if (drm_WARN_ON(&xe->drm, !wopcm_size)) + return 0; + stolen_size = tile_size - mgr->stolen_base; + stolen_size -= wopcm_size; /* Verify usage fits in the actual resource available */ if (mgr->stolen_base + stolen_size <= pci_resource_len(pdev, LMEM_BAR)) @@ -89,29 +118,6 @@ static s64 detect_bar2_dgfx(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr) return ALIGN_DOWN(stolen_size, SZ_1M); } -static u32 get_wopcm_size(struct xe_device *xe) -{ - u32 wopcm_size; - u64 val; - - val = xe_mmio_read64_2x32(xe_root_mmio_gt(xe), STOLEN_RESERVED); - val = REG_FIELD_GET64(WOPCM_SIZE_MASK, val); - - switch (val) { - case 0x5 ... 0x6: - val--; - fallthrough; - case 0x0 ... 0x3: - wopcm_size = (1U << val) * SZ_1M; - break; - default: - WARN(1, "Missing case wopcm_size=%llx\n", val); - wopcm_size = 0; - } - - return wopcm_size; -} - static u32 detect_bar2_integrated(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr) { struct pci_dev *pdev = to_pci_dev(xe->drm.dev); -- GitLab From 287b9cec2eef6cdd06381fbead1885d47d26a11c Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Wed, 2 Jul 2025 17:41:11 -0400 Subject: [PATCH 1838/2211] usb: typec: tcpm: PSSourceOffTimer timeout in PR_Swap enters ERROR_RECOVERY MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 659f5d55feb75782bd46cf130da3c1f240afe9ba ] As PD2.0 spec ("6.5.6.2 PSSourceOffTimer"),the PSSourceOffTimer is used by the Policy Engine in Dual-Role Power device that is currently acting as a Sink to timeout on a PS_RDY Message during a Power Role Swap sequence. This condition leads to a Hard Reset for USB Type-A and Type-B Plugs and Error Recovery for Type-C plugs and return to USB Default Operation. Therefore, after PSSourceOffTimer timeout, the tcpm state machine should switch from PR_SWAP_SNK_SRC_SINK_OFF to ERROR_RECOVERY. This can also solve the test items in the USB power delivery compliance test: TEST.PD.PROT.SNK.12 PR_Swap – PSSourceOffTimer Timeout [1] https://usb.org/document-library/usb-power-delivery-compliance-test-specification-0/USB_PD3_CTS_Q4_2025_OR.zip Fixes: f0690a25a140 ("staging: typec: USB Type-C Port Manager (tcpm)") Cc: stable Signed-off-by: Jos Wang Reviewed-by: Heikki Krogerus Tested-by: Amit Sunil Dhamne Link: https://lore.kernel.org/r/20250213134921.3798-1-joswang1221@gmail.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/typec/tcpm/tcpm.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index 1d8e760df483c..9838a2c8c1b85 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -5566,8 +5566,7 @@ static void run_state_machine(struct tcpm_port *port) tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_USB, port->pps_data.active, 0); tcpm_set_charge(port, false); - tcpm_set_state(port, hard_reset_state(port), - PD_T_PS_SOURCE_OFF); + tcpm_set_state(port, ERROR_RECOVERY, PD_T_PS_SOURCE_OFF); break; case PR_SWAP_SNK_SRC_SOURCE_ON: tcpm_enable_auto_vbus_discharge(port, true); -- GitLab From 8e2dcdf22c8b2f85ddb784883c92d1a6caed3c1f Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Wed, 2 Jul 2025 17:47:38 -0400 Subject: [PATCH 1839/2211] drm/msm/dp: account for widebus and yuv420 during mode validation [ Upstream commit df9cf852ca3099feb8fed781bdd5d3863af001c8 ] Widebus allows the DP controller to operate in 2 pixel per clock mode. The mode validation logic validates the mode->clock against the max DP pixel clock. However the max DP pixel clock limit assumes widebus is already enabled. Adjust the mode validation logic to only compare the adjusted pixel clock which accounts for widebus against the max DP pixel clock. Also fix the mode validation logic for YUV420 modes as in that case as well, only half the pixel clock is needed. Cc: stable@vger.kernel.org Fixes: 757a2f36ab09 ("drm/msm/dp: enable widebus feature for display port") Fixes: 6db6e5606576 ("drm/msm/dp: change clock related programming for YUV420 over DP") Reviewed-by: Dmitry Baryshkov Tested-by: Dale Whinham Patchwork: https://patchwork.freedesktop.org/patch/635789/ Link: https://lore.kernel.org/r/20250206-dp-widebus-fix-v2-1-cb89a0313286@quicinc.com Signed-off-by: Abhinav Kumar Signed-off-by: Sasha Levin --- drivers/gpu/drm/msm/dp/dp_display.c | 11 ++++++----- drivers/gpu/drm/msm/dp/dp_drm.c | 5 ++++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c index e1228fb093ee0..a5c1534eafdb1 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -928,16 +928,17 @@ enum drm_mode_status dp_bridge_mode_valid(struct drm_bridge *bridge, return -EINVAL; } - if (mode->clock > DP_MAX_PIXEL_CLK_KHZ) - return MODE_CLOCK_HIGH; - dp_display = container_of(dp, struct dp_display_private, dp_display); link_info = &dp_display->panel->link_info; - if (drm_mode_is_420_only(&dp->connector->display_info, mode) && - dp_display->panel->vsc_sdp_supported) + if ((drm_mode_is_420_only(&dp->connector->display_info, mode) && + dp_display->panel->vsc_sdp_supported) || + msm_dp_wide_bus_available(dp)) mode_pclk_khz /= 2; + if (mode_pclk_khz > DP_MAX_PIXEL_CLK_KHZ) + return MODE_CLOCK_HIGH; + mode_bpp = dp->connector->display_info.bpc * num_components; if (!mode_bpp) mode_bpp = default_bpp; diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c index 1b9be5bd97f12..da0176eae3fe3 100644 --- a/drivers/gpu/drm/msm/dp/dp_drm.c +++ b/drivers/gpu/drm/msm/dp/dp_drm.c @@ -257,7 +257,10 @@ static enum drm_mode_status edp_bridge_mode_valid(struct drm_bridge *bridge, return -EINVAL; } - if (mode->clock > DP_MAX_PIXEL_CLK_KHZ) + if (msm_dp_wide_bus_available(dp)) + mode_pclk_khz /= 2; + + if (mode_pclk_khz > DP_MAX_PIXEL_CLK_KHZ) return MODE_CLOCK_HIGH; /* -- GitLab From 0d087de947babf7ed70029d042abcc6ed06ff415 Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Wed, 11 Dec 2024 10:06:28 +0100 Subject: [PATCH 1840/2211] drm/fbdev-dma: Add shadow buffering for deferred I/O MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 3603996432997f7c88da37a97062a46cda01ac9d ] DMA areas are not necessarily backed by struct page, so we cannot rely on it for deferred I/O. Allocate a shadow buffer for drivers that require deferred I/O and use it as framebuffer memory. Fixes driver errors about being "Unable to handle kernel NULL pointer dereference at virtual address" or "Unable to handle kernel paging request at virtual address". The patch splits drm_fbdev_dma_driver_fbdev_probe() in an initial allocation, which creates the DMA-backed buffer object, and a tail that sets up the fbdev data structures. There is a tail function for direct memory mappings and a tail function for deferred I/O with the shadow buffer. It is no longer possible to use deferred I/O without shadow buffer. It can be re-added if there exists a reliably test for usable struct page in the allocated DMA-backed buffer object. Signed-off-by: Thomas Zimmermann Reported-by: Nuno Gonçalves CLoses: https://lore.kernel.org/dri-devel/CAEXMXLR55DziAMbv_+2hmLeH-jP96pmit6nhs6siB22cpQFr9w@mail.gmail.com/ Tested-by: Nuno Gonçalves Fixes: 5ab91447aa13 ("drm/tiny/ili9225: Use fbdev-dma") Cc: Thomas Zimmermann Cc: # v6.11+ Reviewed-by: Simona Vetter Reviewed-by: Javier Martinez Canillas Link: https://patchwork.freedesktop.org/patch/msgid/20241211090643.74250-1-tzimmermann@suse.de Signed-off-by: Sasha Levin --- drivers/gpu/drm/drm_fbdev_dma.c | 219 +++++++++++++++++++++++--------- 1 file changed, 156 insertions(+), 63 deletions(-) diff --git a/drivers/gpu/drm/drm_fbdev_dma.c b/drivers/gpu/drm/drm_fbdev_dma.c index 7c8287c18e381..6fcf2a8bf6762 100644 --- a/drivers/gpu/drm/drm_fbdev_dma.c +++ b/drivers/gpu/drm/drm_fbdev_dma.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT #include +#include #include #include @@ -72,43 +73,108 @@ static const struct fb_ops drm_fbdev_dma_fb_ops = { .fb_destroy = drm_fbdev_dma_fb_destroy, }; -FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS(drm_fbdev_dma, +FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS(drm_fbdev_dma_shadowed, drm_fb_helper_damage_range, drm_fb_helper_damage_area); -static int drm_fbdev_dma_deferred_fb_mmap(struct fb_info *info, struct vm_area_struct *vma) +static void drm_fbdev_dma_shadowed_fb_destroy(struct fb_info *info) { struct drm_fb_helper *fb_helper = info->par; - struct drm_framebuffer *fb = fb_helper->fb; - struct drm_gem_dma_object *dma = drm_fb_dma_get_gem_obj(fb, 0); + void *shadow = info->screen_buffer; + + if (!fb_helper->dev) + return; - if (!dma->map_noncoherent) - vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); + if (info->fbdefio) + fb_deferred_io_cleanup(info); + drm_fb_helper_fini(fb_helper); + vfree(shadow); - return fb_deferred_io_mmap(info, vma); + drm_client_buffer_vunmap(fb_helper->buffer); + drm_client_framebuffer_delete(fb_helper->buffer); + drm_client_release(&fb_helper->client); + drm_fb_helper_unprepare(fb_helper); + kfree(fb_helper); } -static const struct fb_ops drm_fbdev_dma_deferred_fb_ops = { +static const struct fb_ops drm_fbdev_dma_shadowed_fb_ops = { .owner = THIS_MODULE, .fb_open = drm_fbdev_dma_fb_open, .fb_release = drm_fbdev_dma_fb_release, - __FB_DEFAULT_DEFERRED_OPS_RDWR(drm_fbdev_dma), + FB_DEFAULT_DEFERRED_OPS(drm_fbdev_dma_shadowed), DRM_FB_HELPER_DEFAULT_OPS, - __FB_DEFAULT_DEFERRED_OPS_DRAW(drm_fbdev_dma), - .fb_mmap = drm_fbdev_dma_deferred_fb_mmap, - .fb_destroy = drm_fbdev_dma_fb_destroy, + .fb_destroy = drm_fbdev_dma_shadowed_fb_destroy, }; /* * struct drm_fb_helper */ +static void drm_fbdev_dma_damage_blit_real(struct drm_fb_helper *fb_helper, + struct drm_clip_rect *clip, + struct iosys_map *dst) +{ + struct drm_framebuffer *fb = fb_helper->fb; + size_t offset = clip->y1 * fb->pitches[0]; + size_t len = clip->x2 - clip->x1; + unsigned int y; + void *src; + + switch (drm_format_info_bpp(fb->format, 0)) { + case 1: + offset += clip->x1 / 8; + len = DIV_ROUND_UP(len + clip->x1 % 8, 8); + break; + case 2: + offset += clip->x1 / 4; + len = DIV_ROUND_UP(len + clip->x1 % 4, 4); + break; + case 4: + offset += clip->x1 / 2; + len = DIV_ROUND_UP(len + clip->x1 % 2, 2); + break; + default: + offset += clip->x1 * fb->format->cpp[0]; + len *= fb->format->cpp[0]; + break; + } + + src = fb_helper->info->screen_buffer + offset; + iosys_map_incr(dst, offset); /* go to first pixel within clip rect */ + + for (y = clip->y1; y < clip->y2; y++) { + iosys_map_memcpy_to(dst, 0, src, len); + iosys_map_incr(dst, fb->pitches[0]); + src += fb->pitches[0]; + } +} + +static int drm_fbdev_dma_damage_blit(struct drm_fb_helper *fb_helper, + struct drm_clip_rect *clip) +{ + struct drm_client_buffer *buffer = fb_helper->buffer; + struct iosys_map dst; + + /* + * For fbdev emulation, we only have to protect against fbdev modeset + * operations. Nothing else will involve the client buffer's BO. So it + * is sufficient to acquire struct drm_fb_helper.lock here. + */ + mutex_lock(&fb_helper->lock); + + dst = buffer->map; + drm_fbdev_dma_damage_blit_real(fb_helper, clip, &dst); + + mutex_unlock(&fb_helper->lock); + + return 0; +} + static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper, struct drm_fb_helper_surface_size *sizes) { return drm_fbdev_dma_driver_fbdev_probe(fb_helper, sizes); } - static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *clip) { @@ -120,6 +186,10 @@ static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper, return 0; if (helper->fb->funcs->dirty) { + ret = drm_fbdev_dma_damage_blit(helper, clip); + if (drm_WARN_ONCE(dev, ret, "Damage blitter failed: ret=%d\n", ret)) + return ret; + ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1); if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret)) return ret; @@ -137,14 +207,80 @@ static const struct drm_fb_helper_funcs drm_fbdev_dma_helper_funcs = { * struct drm_fb_helper */ +static int drm_fbdev_dma_driver_fbdev_probe_tail(struct drm_fb_helper *fb_helper, + struct drm_fb_helper_surface_size *sizes) +{ + struct drm_device *dev = fb_helper->dev; + struct drm_client_buffer *buffer = fb_helper->buffer; + struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(buffer->gem); + struct drm_framebuffer *fb = fb_helper->fb; + struct fb_info *info = fb_helper->info; + struct iosys_map map = buffer->map; + + info->fbops = &drm_fbdev_dma_fb_ops; + + /* screen */ + info->flags |= FBINFO_VIRTFB; /* system memory */ + if (dma_obj->map_noncoherent) + info->flags |= FBINFO_READS_FAST; /* signal caching */ + info->screen_size = sizes->surface_height * fb->pitches[0]; + info->screen_buffer = map.vaddr; + if (!(info->flags & FBINFO_HIDE_SMEM_START)) { + if (!drm_WARN_ON(dev, is_vmalloc_addr(info->screen_buffer))) + info->fix.smem_start = page_to_phys(virt_to_page(info->screen_buffer)); + } + info->fix.smem_len = info->screen_size; + + return 0; +} + +static int drm_fbdev_dma_driver_fbdev_probe_tail_shadowed(struct drm_fb_helper *fb_helper, + struct drm_fb_helper_surface_size *sizes) +{ + struct drm_client_buffer *buffer = fb_helper->buffer; + struct fb_info *info = fb_helper->info; + size_t screen_size = buffer->gem->size; + void *screen_buffer; + int ret; + + /* + * Deferred I/O requires struct page for framebuffer memory, + * which is not guaranteed for all DMA ranges. We thus create + * a shadow buffer in system memory. + */ + screen_buffer = vzalloc(screen_size); + if (!screen_buffer) + return -ENOMEM; + + info->fbops = &drm_fbdev_dma_shadowed_fb_ops; + + /* screen */ + info->flags |= FBINFO_VIRTFB; /* system memory */ + info->flags |= FBINFO_READS_FAST; /* signal caching */ + info->screen_buffer = screen_buffer; + info->fix.smem_len = screen_size; + + fb_helper->fbdefio.delay = HZ / 20; + fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io; + + info->fbdefio = &fb_helper->fbdefio; + ret = fb_deferred_io_init(info); + if (ret) + goto err_vfree; + + return 0; + +err_vfree: + vfree(screen_buffer); + return ret; +} + int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper, struct drm_fb_helper_surface_size *sizes) { struct drm_client_dev *client = &fb_helper->client; struct drm_device *dev = fb_helper->dev; - bool use_deferred_io = false; struct drm_client_buffer *buffer; - struct drm_gem_dma_object *dma_obj; struct drm_framebuffer *fb; struct fb_info *info; u32 format; @@ -161,19 +297,9 @@ int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper, sizes->surface_height, format); if (IS_ERR(buffer)) return PTR_ERR(buffer); - dma_obj = to_drm_gem_dma_obj(buffer->gem); fb = buffer->fb; - /* - * Deferred I/O requires struct page for framebuffer memory, - * which is not guaranteed for all DMA ranges. We thus only - * install deferred I/O if we have a framebuffer that requires - * it. - */ - if (fb->funcs->dirty) - use_deferred_io = true; - ret = drm_client_buffer_vmap(buffer, &map); if (ret) { goto err_drm_client_buffer_delete; @@ -194,45 +320,12 @@ int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper, drm_fb_helper_fill_info(info, fb_helper, sizes); - if (use_deferred_io) - info->fbops = &drm_fbdev_dma_deferred_fb_ops; + if (fb->funcs->dirty) + ret = drm_fbdev_dma_driver_fbdev_probe_tail_shadowed(fb_helper, sizes); else - info->fbops = &drm_fbdev_dma_fb_ops; - - /* screen */ - info->flags |= FBINFO_VIRTFB; /* system memory */ - if (dma_obj->map_noncoherent) - info->flags |= FBINFO_READS_FAST; /* signal caching */ - info->screen_size = sizes->surface_height * fb->pitches[0]; - info->screen_buffer = map.vaddr; - if (!(info->flags & FBINFO_HIDE_SMEM_START)) { - if (!drm_WARN_ON(dev, is_vmalloc_addr(info->screen_buffer))) - info->fix.smem_start = page_to_phys(virt_to_page(info->screen_buffer)); - } - info->fix.smem_len = info->screen_size; - - /* - * Only set up deferred I/O if the screen buffer supports - * it. If this disagrees with the previous test for ->dirty, - * mmap on the /dev/fb file might not work correctly. - */ - if (!is_vmalloc_addr(info->screen_buffer) && info->fix.smem_start) { - unsigned long pfn = info->fix.smem_start >> PAGE_SHIFT; - - if (drm_WARN_ON(dev, !pfn_to_page(pfn))) - use_deferred_io = false; - } - - /* deferred I/O */ - if (use_deferred_io) { - fb_helper->fbdefio.delay = HZ / 20; - fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io; - - info->fbdefio = &fb_helper->fbdefio; - ret = fb_deferred_io_init(info); - if (ret) - goto err_drm_fb_helper_release_info; - } + ret = drm_fbdev_dma_driver_fbdev_probe_tail(fb_helper, sizes); + if (ret) + goto err_drm_fb_helper_release_info; return 0; -- GitLab From c223f378b695619f211660f4991a31773cce5b6e Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Sat, 15 Feb 2025 11:04:15 +0000 Subject: [PATCH 1841/2211] btrfs: skip inodes without loaded extent maps when shrinking extent maps [ Upstream commit c6c9c4d56483d941f567eb921434c25fc6086dfa ] If there are inodes that don't have any loaded extent maps, we end up grabbing a reference on them and later adding a delayed iput, which wakes up the cleaner and makes it do unnecessary work. This is common when for example the inodes were open only to run stat(2) or all their extent maps were already released through the folio release callback (btrfs_release_folio()) or released by a previous run of the shrinker, or directories which never have extent maps. Reported-by: Ivan Shapovalov Tested-by: Ivan Shapovalov Link: https://lore.kernel.org/linux-btrfs/0414d690ac5680d0d77dfc930606cdc36e42e12f.camel@intelfx.name/ CC: stable@vger.kernel.org # 6.13+ Reviewed-by: Johannes Thumshirn Reviewed-by: Qu Wenruo Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/extent_map.c | 78 +++++++++++++++++++++++++++++++------------ 1 file changed, 57 insertions(+), 21 deletions(-) diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index 1d93e1202c339..d67abf5f97a77 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c @@ -1133,6 +1133,8 @@ static long btrfs_scan_inode(struct btrfs_inode *inode, struct btrfs_em_shrink_c long nr_dropped = 0; struct rb_node *node; + lockdep_assert_held_write(&tree->lock); + /* * Take the mmap lock so that we serialize with the inode logging phase * of fsync because we may need to set the full sync flag on the inode, @@ -1144,28 +1146,12 @@ static long btrfs_scan_inode(struct btrfs_inode *inode, struct btrfs_em_shrink_c * to find new extents, which may not be there yet because ordered * extents haven't completed yet. * - * We also do a try lock because otherwise we could deadlock. This is - * because the shrinker for this filesystem may be invoked while we are - * in a path that is holding the mmap lock in write mode. For example in - * a reflink operation while COWing an extent buffer, when allocating - * pages for a new extent buffer and under memory pressure, the shrinker - * may be invoked, and therefore we would deadlock by attempting to read - * lock the mmap lock while we are holding already a write lock on it. + * We also do a try lock because we don't want to block for too long and + * we are holding the extent map tree's lock in write mode. */ if (!down_read_trylock(&inode->i_mmap_lock)) return 0; - /* - * We want to be fast so if the lock is busy we don't want to spend time - * waiting for it - either some task is about to do IO for the inode or - * we may have another task shrinking extent maps, here in this code, so - * skip this inode. - */ - if (!write_trylock(&tree->lock)) { - up_read(&inode->i_mmap_lock); - return 0; - } - node = rb_first(&tree->root); while (node) { struct rb_node *next = rb_next(node); @@ -1205,21 +1191,71 @@ next: break; node = next; } - write_unlock(&tree->lock); up_read(&inode->i_mmap_lock); return nr_dropped; } +static struct btrfs_inode *find_first_inode_to_shrink(struct btrfs_root *root, + u64 min_ino) +{ + struct btrfs_inode *inode; + unsigned long from = min_ino; + + xa_lock(&root->inodes); + while (true) { + struct extent_map_tree *tree; + + inode = xa_find(&root->inodes, &from, ULONG_MAX, XA_PRESENT); + if (!inode) + break; + + tree = &inode->extent_tree; + + /* + * We want to be fast so if the lock is busy we don't want to + * spend time waiting for it (some task is about to do IO for + * the inode). + */ + if (!write_trylock(&tree->lock)) + goto next; + + /* + * Skip inode if it doesn't have loaded extent maps, so we avoid + * getting a reference and doing an iput later. This includes + * cases like files that were opened for things like stat(2), or + * files with all extent maps previously released through the + * release folio callback (btrfs_release_folio()) or released in + * a previous run, or directories which never have extent maps. + */ + if (RB_EMPTY_ROOT(&tree->root)) { + write_unlock(&tree->lock); + goto next; + } + + if (igrab(&inode->vfs_inode)) + break; + + write_unlock(&tree->lock); +next: + from = btrfs_ino(inode) + 1; + cond_resched_lock(&root->inodes.xa_lock); + } + xa_unlock(&root->inodes); + + return inode; +} + static long btrfs_scan_root(struct btrfs_root *root, struct btrfs_em_shrink_ctx *ctx) { struct btrfs_inode *inode; long nr_dropped = 0; u64 min_ino = ctx->last_ino + 1; - inode = btrfs_find_first_inode(root, min_ino); + inode = find_first_inode_to_shrink(root, min_ino); while (inode) { nr_dropped += btrfs_scan_inode(inode, ctx); + write_unlock(&inode->extent_tree.lock); min_ino = btrfs_ino(inode) + 1; ctx->last_ino = btrfs_ino(inode); @@ -1230,7 +1266,7 @@ static long btrfs_scan_root(struct btrfs_root *root, struct btrfs_em_shrink_ctx cond_resched(); - inode = btrfs_find_first_inode(root, min_ino); + inode = find_first_inode_to_shrink(root, min_ino); } if (inode) { -- GitLab From fef55c4d9c9c22264d2b2ceae1e26922cb6129a5 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Thu, 29 Aug 2024 15:23:32 +0100 Subject: [PATCH 1842/2211] btrfs: make the extent map shrinker run asynchronously as a work queue job [ Upstream commit 1020443840569535f6025a855958f07ea3eebf71 ] Currently the extent map shrinker is run synchronously for kswapd tasks that end up calling the fs shrinker (fs/super.c:super_cache_scan()). This has some disadvantages and for some heavy workloads with memory pressure it can cause some delays and stalls that make a machine unresponsive for some periods. This happens because: 1) We can have several kswapd tasks on machines with multiple NUMA zones, and running the extent map shrinker concurrently can cause high contention on some spin locks, namely the spin locks that protect the radix tree that tracks roots, the per root xarray that tracks open inodes and the list of delayed iputs. This not only delays the shrinker but also causes high CPU consumption and makes the task running the shrinker monopolize a core, resulting in the symptoms of an unresponsive system. This was noted in previous commits such as commit ae1e766f623f ("btrfs: only run the extent map shrinker from kswapd tasks"); 2) The extent map shrinker's iteration over inodes can often be slow, even after changing the data structure that tracks open inodes for a root from a red black tree (up to kernel 6.10) to an xarray (kernel 6.10+). The transition to the xarray while it made things a bit faster, it's still somewhat slow - for example in a test scenario with 10000 inodes that have no extent maps loaded, the extent map shrinker took between 5ms to 8ms, using a release, non-debug kernel. Iterating over the extent maps of an inode can also be slow if have an inode with many thousands of extent maps, since we use a red black tree to track and search extent maps. So having the extent map shrinker run synchronously adds extra delay for other things a kswapd task does. So make the extent map shrinker run asynchronously as a job for the system unbounded workqueue, just like what we do for data and metadata space reclaim jobs. Reviewed-by: Josef Bacik Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/disk-io.c | 2 ++ fs/btrfs/extent_map.c | 51 ++++++++++++++++++++++++++++++++++++------- fs/btrfs/extent_map.h | 3 ++- fs/btrfs/fs.h | 2 ++ fs/btrfs/super.c | 13 +++-------- 5 files changed, 52 insertions(+), 19 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 96282bf28b19c..e655fa3bfd9be 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2785,6 +2785,7 @@ void btrfs_init_fs_info(struct btrfs_fs_info *fs_info) btrfs_init_scrub(fs_info); btrfs_init_balance(fs_info); btrfs_init_async_reclaim_work(fs_info); + btrfs_init_extent_map_shrinker_work(fs_info); rwlock_init(&fs_info->block_group_cache_lock); fs_info->block_group_cache_tree = RB_ROOT_CACHED; @@ -4334,6 +4335,7 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info) cancel_work_sync(&fs_info->async_reclaim_work); cancel_work_sync(&fs_info->async_data_reclaim_work); cancel_work_sync(&fs_info->preempt_reclaim_work); + cancel_work_sync(&fs_info->extent_map_shrinker_work); /* Cancel or finish ongoing discard work */ btrfs_discard_cleanup(fs_info); diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index d67abf5f97a77..61477cb69a6fd 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c @@ -1128,7 +1128,8 @@ struct btrfs_em_shrink_ctx { static long btrfs_scan_inode(struct btrfs_inode *inode, struct btrfs_em_shrink_ctx *ctx) { - const u64 cur_fs_gen = btrfs_get_fs_generation(inode->root->fs_info); + struct btrfs_fs_info *fs_info = inode->root->fs_info; + const u64 cur_fs_gen = btrfs_get_fs_generation(fs_info); struct extent_map_tree *tree = &inode->extent_tree; long nr_dropped = 0; struct rb_node *node; @@ -1187,7 +1188,8 @@ next: * lock. This is to avoid slowing other tasks trying to take the * lock. */ - if (need_resched() || rwlock_needbreak(&tree->lock)) + if (need_resched() || rwlock_needbreak(&tree->lock) || + btrfs_fs_closing(fs_info)) break; node = next; } @@ -1261,7 +1263,8 @@ static long btrfs_scan_root(struct btrfs_root *root, struct btrfs_em_shrink_ctx ctx->last_ino = btrfs_ino(inode); btrfs_add_delayed_iput(inode); - if (ctx->scanned >= ctx->nr_to_scan) + if (ctx->scanned >= ctx->nr_to_scan || + btrfs_fs_closing(inode->root->fs_info)) break; cond_resched(); @@ -1290,16 +1293,19 @@ static long btrfs_scan_root(struct btrfs_root *root, struct btrfs_em_shrink_ctx return nr_dropped; } -long btrfs_free_extent_maps(struct btrfs_fs_info *fs_info, long nr_to_scan) +static void btrfs_extent_map_shrinker_worker(struct work_struct *work) { + struct btrfs_fs_info *fs_info; struct btrfs_em_shrink_ctx ctx; u64 start_root_id; u64 next_root_id; bool cycled = false; long nr_dropped = 0; + fs_info = container_of(work, struct btrfs_fs_info, extent_map_shrinker_work); + ctx.scanned = 0; - ctx.nr_to_scan = nr_to_scan; + ctx.nr_to_scan = atomic64_read(&fs_info->extent_map_shrinker_nr_to_scan); /* * In case we have multiple tasks running this shrinker, make the next @@ -1317,12 +1323,12 @@ long btrfs_free_extent_maps(struct btrfs_fs_info *fs_info, long nr_to_scan) if (trace_btrfs_extent_map_shrinker_scan_enter_enabled()) { s64 nr = percpu_counter_sum_positive(&fs_info->evictable_extent_maps); - trace_btrfs_extent_map_shrinker_scan_enter(fs_info, nr_to_scan, + trace_btrfs_extent_map_shrinker_scan_enter(fs_info, ctx.nr_to_scan, nr, ctx.last_root, ctx.last_ino); } - while (ctx.scanned < ctx.nr_to_scan) { + while (ctx.scanned < ctx.nr_to_scan && !btrfs_fs_closing(fs_info)) { struct btrfs_root *root; unsigned long count; @@ -1380,5 +1386,34 @@ long btrfs_free_extent_maps(struct btrfs_fs_info *fs_info, long nr_to_scan) ctx.last_ino); } - return nr_dropped; + atomic64_set(&fs_info->extent_map_shrinker_nr_to_scan, 0); +} + +void btrfs_free_extent_maps(struct btrfs_fs_info *fs_info, long nr_to_scan) +{ + /* + * Do nothing if the shrinker is already running. In case of high memory + * pressure we can have a lot of tasks calling us and all passing the + * same nr_to_scan value, but in reality we may need only to free + * nr_to_scan extent maps (or less). In case we need to free more than + * that, we will be called again by the fs shrinker, so no worries about + * not doing enough work to reclaim memory from extent maps. + * We can also be repeatedly called with the same nr_to_scan value + * simply because the shrinker runs asynchronously and multiple calls + * to this function are made before the shrinker does enough progress. + * + * That's why we set the atomic counter to nr_to_scan only if its + * current value is zero, instead of incrementing the counter by + * nr_to_scan. + */ + if (atomic64_cmpxchg(&fs_info->extent_map_shrinker_nr_to_scan, 0, nr_to_scan) != 0) + return; + + queue_work(system_unbound_wq, &fs_info->extent_map_shrinker_work); +} + +void btrfs_init_extent_map_shrinker_work(struct btrfs_fs_info *fs_info) +{ + atomic64_set(&fs_info->extent_map_shrinker_nr_to_scan, 0); + INIT_WORK(&fs_info->extent_map_shrinker_work, btrfs_extent_map_shrinker_worker); } diff --git a/fs/btrfs/extent_map.h b/fs/btrfs/extent_map.h index 5154a8f1d26c9..cd123b266b641 100644 --- a/fs/btrfs/extent_map.h +++ b/fs/btrfs/extent_map.h @@ -189,6 +189,7 @@ void btrfs_drop_extent_map_range(struct btrfs_inode *inode, int btrfs_replace_extent_map_range(struct btrfs_inode *inode, struct extent_map *new_em, bool modified); -long btrfs_free_extent_maps(struct btrfs_fs_info *fs_info, long nr_to_scan); +void btrfs_free_extent_maps(struct btrfs_fs_info *fs_info, long nr_to_scan); +void btrfs_init_extent_map_shrinker_work(struct btrfs_fs_info *fs_info); #endif diff --git a/fs/btrfs/fs.h b/fs/btrfs/fs.h index bb822e425d7fa..374843aca60d8 100644 --- a/fs/btrfs/fs.h +++ b/fs/btrfs/fs.h @@ -639,6 +639,8 @@ struct btrfs_fs_info { spinlock_t extent_map_shrinker_lock; u64 extent_map_shrinker_last_root; u64 extent_map_shrinker_last_ino; + atomic64_t extent_map_shrinker_nr_to_scan; + struct work_struct extent_map_shrinker_work; /* Protected by 'trans_lock'. */ struct list_head dirty_cowonly_roots; diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index bcb8def4ade20..6119a06b05693 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -28,7 +28,6 @@ #include #include #include -#include #include "messages.h" #include "delayed-inode.h" #include "ctree.h" @@ -2399,16 +2398,10 @@ static long btrfs_free_cached_objects(struct super_block *sb, struct shrink_cont const long nr_to_scan = min_t(unsigned long, LONG_MAX, sc->nr_to_scan); struct btrfs_fs_info *fs_info = btrfs_sb(sb); - /* - * We may be called from any task trying to allocate memory and we don't - * want to slow it down with scanning and dropping extent maps. It would - * also cause heavy lock contention if many tasks concurrently enter - * here. Therefore only allow kswapd tasks to scan and drop extent maps. - */ - if (!current_is_kswapd()) - return 0; + btrfs_free_extent_maps(fs_info, nr_to_scan); - return btrfs_free_extent_maps(fs_info, nr_to_scan); + /* The extent map shrinker runs asynchronously, so always return 0. */ + return 0; } static const struct super_operations btrfs_super_ops = { -- GitLab From fbbb0e0de97f6e00bbe5c2d6dc417011c235bef1 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Sat, 15 Feb 2025 11:11:29 +0000 Subject: [PATCH 1843/2211] btrfs: do regular iput instead of delayed iput during extent map shrinking [ Upstream commit 15b3b3254d1453a8db038b7d44b311a2d6c71f98 ] The extent map shrinker now runs in the system unbound workqueue and no longer in kswapd context so it can directly do an iput() on inodes even if that blocks or needs to acquire any lock (we aren't holding any locks when requesting the delayed iput from the shrinker). So we don't need to add a delayed iput, wake up the cleaner and delegate the iput() to the cleaner, which also adds extra contention on the spinlock that protects the delayed iputs list. Reported-by: Ivan Shapovalov Tested-by: Ivan Shapovalov Link: https://lore.kernel.org/linux-btrfs/0414d690ac5680d0d77dfc930606cdc36e42e12f.camel@intelfx.name/ CC: stable@vger.kernel.org # 6.12+ Reviewed-by: Johannes Thumshirn Reviewed-by: Qu Wenruo Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/extent_map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index 61477cb69a6fd..93043edc8ff93 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c @@ -1261,7 +1261,7 @@ static long btrfs_scan_root(struct btrfs_root *root, struct btrfs_em_shrink_ctx min_ino = btrfs_ino(inode) + 1; ctx->last_ino = btrfs_ino(inode); - btrfs_add_delayed_iput(inode); + iput(&inode->vfs_inode); if (ctx->scanned >= ctx->nr_to_scan || btrfs_fs_closing(inode->root->fs_info)) -- GitLab From 1fc00e145172068ddeb56275c3db1fbd6ae4dddf Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Wed, 2 Jul 2025 18:01:44 -0400 Subject: [PATCH 1844/2211] riscv/atomic: Do proper sign extension also for unsigned in arch_cmpxchg [ Upstream commit 1898300abf3508bca152e65b36cce5bf93d7e63e ] Sign extend also an unsigned compare value to match what lr.w is doing. Otherwise try_cmpxchg may spuriously return true when used on a u32 value that has the sign bit set, as it happens often in inode_set_ctime_current. Do this in three conversion steps. The first conversion to long is needed to avoid a -Wpointer-to-int-cast warning when arch_cmpxchg is used with a pointer type. Then convert to int and back to long to always sign extend the 32-bit value to 64-bit. Fixes: 6c58f25e6938 ("riscv/atomic: Fix sign extension for RV64I") Signed-off-by: Andreas Schwab Reviewed-by: Alexandre Ghiti Reviewed-by: Andrew Jones Tested-by: Xi Ruoyao Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/mvmed0k4prh.fsf@suse.de Signed-off-by: Palmer Dabbelt Signed-off-by: Sasha Levin --- arch/riscv/include/asm/cmpxchg.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/riscv/include/asm/cmpxchg.h b/arch/riscv/include/asm/cmpxchg.h index ebbce134917cc..6efa95ad033ab 100644 --- a/arch/riscv/include/asm/cmpxchg.h +++ b/arch/riscv/include/asm/cmpxchg.h @@ -169,7 +169,7 @@ break; \ case 4: \ __arch_cmpxchg(".w", ".w" sc_sfx, prepend, append, \ - __ret, __ptr, (long), __old, __new); \ + __ret, __ptr, (long)(int)(long), __old, __new); \ break; \ case 8: \ __arch_cmpxchg(".d", ".d" sc_sfx, prepend, append, \ -- GitLab From 4ea0883b5af75553946c2d083b688789547d47a7 Mon Sep 17 00:00:00 2001 From: Dragan Simic Date: Sun, 2 Mar 2025 19:48:03 +0100 Subject: [PATCH 1845/2211] arm64: dts: rockchip: Add avdd HDMI supplies to RockPro64 board dtsi [ Upstream commit bd1c959f37f384b477f51572331b0dc828bd009a ] Add missing "avdd-0v9-supply" and "avdd-1v8-supply" properties to the "hdmi" node in the Pine64 RockPro64 board dtsi file. To achieve this, also add the associated "vcca_0v9" regulator that produces the 0.9 V supply, [1][2] which hasn't been defined previously in the board dtsi file. This also eliminates the following warnings from the kernel log: dwhdmi-rockchip ff940000.hdmi: supply avdd-0v9 not found, using dummy regulator dwhdmi-rockchip ff940000.hdmi: supply avdd-1v8 not found, using dummy regulator There are no functional changes to the way board works with these additions, because the "vcc1v8_dvp" and "vcca_0v9" regulators are always enabled, [1][2] but these additions improve the accuracy of hardware description. These changes apply to the both supported hardware revisions of the Pine64 RockPro64, i.e. to the production-run revisions 2.0 and 2.1. [1][2] [1] https://files.pine64.org/doc/rockpro64/rockpro64_v21-SCH.pdf [2] https://files.pine64.org/doc/rockpro64/rockpro64_v20-SCH.pdf Fixes: e4f3fb490967 ("arm64: dts: rockchip: add initial dts support for Rockpro64") Cc: stable@vger.kernel.org Suggested-by: Diederik de Haas Signed-off-by: Dragan Simic Tested-by: Diederik de Haas Link: https://lore.kernel.org/r/df3d7e8fe74ed5e727e085b18c395260537bb5ac.1740941097.git.dsimic@manjaro.org Signed-off-by: Heiko Stuebner Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi index 11d99d8b34a2b..66d010a9e8c31 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi @@ -227,6 +227,16 @@ vin-supply = <&vcc12v_dcin>; }; + vcca_0v9: vcca-0v9 { + compatible = "regulator-fixed"; + regulator-name = "vcca_0v9"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + vin-supply = <&vcc3v3_sys>; + }; + vdd_log: vdd-log { compatible = "pwm-regulator"; pwms = <&pwm2 0 25000 1>; @@ -312,6 +322,8 @@ }; &hdmi { + avdd-0v9-supply = <&vcca_0v9>; + avdd-1v8-supply = <&vcc1v8_dvp>; ddc-i2c-bus = <&i2c3>; pinctrl-names = "default"; pinctrl-0 = <&hdmi_cec>; -- GitLab From 37d28309ee8b9e6203716e39da652c3ab943e1d2 Mon Sep 17 00:00:00 2001 From: Andres Traumann Date: Tue, 25 Mar 2025 17:25:35 +0700 Subject: [PATCH 1846/2211] ALSA: hda/realtek: Bass speaker fixup for ASUS UM5606KA [ Upstream commit be8cd366beb80c709adbc7688ee72750f5aee3ff ] This patch applies the ALC294 bass speaker fixup (ALC294_FIXUP_BASS_SPEAKER_15), previously introduced in commit a7df7f909cec ("ALSA: hda: improve bass speaker support for ASUS Zenbook UM5606WA"), to the ASUS Zenbook UM5606KA. This hardware configuration matches ASUS Zenbook UM5606WA, where DAC NID 0x06 was removed from the bass speaker (NID 0x15), routing both speaker pins to DAC NID 0x03. This resolves the bass speaker routing issue, ensuring correct audio output on ASUS UM5606KA. Signed-off-by: Andres Traumann Cc: Link: https://patch.msgid.link/20250325102535.8172-1-andres.traumann.01@gmail.com Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 94c5151c456d6..30e9e26c5b2a7 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -10859,6 +10859,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x1043, 0x1204, "ASUS Strix G615JHR_JMR_JPR", ALC287_FIXUP_TAS2781_I2C), SND_PCI_QUIRK(0x1043, 0x1214, "ASUS Strix G615LH_LM_LP", ALC287_FIXUP_TAS2781_I2C), SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1043, 0x1264, "ASUS UM5606KA", ALC294_FIXUP_BASS_SPEAKER_15), SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1043, 0x1294, "ASUS B3405CVA", ALC245_FIXUP_CS35L41_SPI_2), -- GitLab From 6c7dc7ad867c14638cadfe9c0a2e93d2507002c7 Mon Sep 17 00:00:00 2001 From: Jonathan Kim Date: Tue, 5 Nov 2024 12:38:30 -0500 Subject: [PATCH 1847/2211] drm/amdkfd: remove gfx 12 trap handler page size cap [ Upstream commit cd82f29ec51b2e616289db7b258a936127c16efa ] GFX 12 does not require a page size cap for the trap handler because it does not require a CWSR work around like GFX 11 did. Signed-off-by: Jonathan Kim Reviewed-by: David Belanger Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdkfd/kfd_device.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c index 9186ef0bd2a32..07eadab4c1c4d 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c @@ -537,7 +537,8 @@ static void kfd_cwsr_init(struct kfd_dev *kfd) kfd->cwsr_isa = cwsr_trap_gfx11_hex; kfd->cwsr_isa_size = sizeof(cwsr_trap_gfx11_hex); } else { - BUILD_BUG_ON(sizeof(cwsr_trap_gfx12_hex) > PAGE_SIZE); + BUILD_BUG_ON(sizeof(cwsr_trap_gfx12_hex) + > KFD_CWSR_TMA_OFFSET); kfd->cwsr_isa = cwsr_trap_gfx12_hex; kfd->cwsr_isa_size = sizeof(cwsr_trap_gfx12_hex); } -- GitLab From 725a59d29adb517cc197763edbe91606fc564d6f Mon Sep 17 00:00:00 2001 From: Jay Cornwall Date: Fri, 7 Feb 2025 16:40:34 -0500 Subject: [PATCH 1848/2211] drm/amdkfd: Fix instruction hazard in gfx12 trap handler [ Upstream commit 424648c3838133f93a34fdfe4f9d5597551e7b3b ] VALU instructions with SGPR source need wait states to avoid hazard with SALU using different SGPR. v2: Eliminate some hazards to reduce code explosion Signed-off-by: Jay Cornwall Reviewed-by: Lancelot Six Acked-by: Alex Deucher Signed-off-by: Alex Deucher (cherry picked from commit 7e0459d453b911435673edd7a86eadc600c63238) Cc: stable@vger.kernel.org # 6.12.x Signed-off-by: Sasha Levin --- .../gpu/drm/amd/amdkfd/cwsr_trap_handler.h | 677 ++++++++++-------- .../amd/amdkfd/cwsr_trap_handler_gfx12.asm | 82 ++- 2 files changed, 404 insertions(+), 355 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler.h b/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler.h index 7062f12b5b751..6c8c9935a0f2e 100644 --- a/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler.h +++ b/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler.h @@ -3640,7 +3640,7 @@ static const uint32_t cwsr_trap_gfx9_4_3_hex[] = { }; static const uint32_t cwsr_trap_gfx12_hex[] = { - 0xbfa00001, 0xbfa0024b, + 0xbfa00001, 0xbfa002a2, 0xb0804009, 0xb8f8f804, 0x9178ff78, 0x00008c00, 0xb8fbf811, 0x8b6eff78, @@ -3714,7 +3714,15 @@ static const uint32_t cwsr_trap_gfx12_hex[] = { 0x00011677, 0xd7610000, 0x00011a79, 0xd7610000, 0x00011c7e, 0xd7610000, - 0x00011e7f, 0xbefe00ff, + 0x00011e7f, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xbefe00ff, 0x00003fff, 0xbeff0080, 0xee0a407a, 0x000c0000, 0x00004000, 0xd760007a, @@ -3751,38 +3759,46 @@ static const uint32_t cwsr_trap_gfx12_hex[] = { 0x00000200, 0xbef600ff, 0x01000000, 0x7e000280, 0x7e020280, 0x7e040280, - 0xbefd0080, 0xbe804ec2, - 0xbf94fffe, 0xb8faf804, - 0x8b7a847a, 0x91788478, - 0x8c787a78, 0xd7610002, - 0x0000fa71, 0x807d817d, - 0xd7610002, 0x0000fa6c, - 0x807d817d, 0x917aff6d, - 0x80000000, 0xd7610002, - 0x0000fa7a, 0x807d817d, - 0xd7610002, 0x0000fa6e, - 0x807d817d, 0xd7610002, - 0x0000fa6f, 0x807d817d, - 0xd7610002, 0x0000fa78, - 0x807d817d, 0xb8faf811, - 0xd7610002, 0x0000fa7a, - 0x807d817d, 0xd7610002, - 0x0000fa7b, 0x807d817d, - 0xb8f1f801, 0xd7610002, - 0x0000fa71, 0x807d817d, - 0xb8f1f814, 0xd7610002, - 0x0000fa71, 0x807d817d, - 0xb8f1f815, 0xd7610002, - 0x0000fa71, 0x807d817d, - 0xb8f1f812, 0xd7610002, - 0x0000fa71, 0x807d817d, - 0xb8f1f813, 0xd7610002, - 0x0000fa71, 0x807d817d, + 0xbe804ec2, 0xbf94fffe, + 0xb8faf804, 0x8b7a847a, + 0x91788478, 0x8c787a78, + 0x917aff6d, 0x80000000, + 0xd7610002, 0x00010071, + 0xd7610002, 0x0001026c, + 0xd7610002, 0x0001047a, + 0xd7610002, 0x0001066e, + 0xd7610002, 0x0001086f, + 0xd7610002, 0x00010a78, + 0xd7610002, 0x00010e7b, + 0xd8500000, 0x00000000, + 0xd8500000, 0x00000000, + 0xd8500000, 0x00000000, + 0xd8500000, 0x00000000, + 0xd8500000, 0x00000000, + 0xd8500000, 0x00000000, + 0xd8500000, 0x00000000, + 0xd8500000, 0x00000000, + 0xb8faf811, 0xd7610002, + 0x00010c7a, 0xb8faf801, + 0xd7610002, 0x0001107a, + 0xb8faf814, 0xd7610002, + 0x0001127a, 0xb8faf815, + 0xd7610002, 0x0001147a, + 0xb8faf812, 0xd7610002, + 0x0001167a, 0xb8faf813, + 0xd7610002, 0x0001187a, 0xb8faf802, 0xd7610002, - 0x0000fa7a, 0x807d817d, - 0xbefa50c1, 0xbfc70000, - 0xd7610002, 0x0000fa7a, - 0x807d817d, 0xbefe00ff, + 0x00011a7a, 0xbefa50c1, + 0xbfc70000, 0xd7610002, + 0x00011c7a, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xbefe00ff, 0x0000ffff, 0xbeff0080, 0xc4068070, 0x008ce802, 0x00000000, 0xbefe00c1, @@ -3797,329 +3813,356 @@ static const uint32_t cwsr_trap_gfx12_hex[] = { 0xbe824102, 0xbe844104, 0xbe864106, 0xbe884108, 0xbe8a410a, 0xbe8c410c, - 0xbe8e410e, 0xd7610002, - 0x0000f200, 0x80798179, - 0xd7610002, 0x0000f201, - 0x80798179, 0xd7610002, - 0x0000f202, 0x80798179, - 0xd7610002, 0x0000f203, - 0x80798179, 0xd7610002, - 0x0000f204, 0x80798179, - 0xd7610002, 0x0000f205, - 0x80798179, 0xd7610002, - 0x0000f206, 0x80798179, - 0xd7610002, 0x0000f207, - 0x80798179, 0xd7610002, - 0x0000f208, 0x80798179, - 0xd7610002, 0x0000f209, - 0x80798179, 0xd7610002, - 0x0000f20a, 0x80798179, - 0xd7610002, 0x0000f20b, - 0x80798179, 0xd7610002, - 0x0000f20c, 0x80798179, - 0xd7610002, 0x0000f20d, - 0x80798179, 0xd7610002, - 0x0000f20e, 0x80798179, - 0xd7610002, 0x0000f20f, - 0x80798179, 0xbf06a079, - 0xbfa10007, 0xc4068070, + 0xbe8e410e, 0xbf068079, + 0xbfa10032, 0xd7610002, + 0x00010000, 0xd7610002, + 0x00010201, 0xd7610002, + 0x00010402, 0xd7610002, + 0x00010603, 0xd7610002, + 0x00010804, 0xd7610002, + 0x00010a05, 0xd7610002, + 0x00010c06, 0xd7610002, + 0x00010e07, 0xd7610002, + 0x00011008, 0xd7610002, + 0x00011209, 0xd7610002, + 0x0001140a, 0xd7610002, + 0x0001160b, 0xd7610002, + 0x0001180c, 0xd7610002, + 0x00011a0d, 0xd7610002, + 0x00011c0e, 0xd7610002, + 0x00011e0f, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0x80799079, + 0xbfa00038, 0xd7610002, + 0x00012000, 0xd7610002, + 0x00012201, 0xd7610002, + 0x00012402, 0xd7610002, + 0x00012603, 0xd7610002, + 0x00012804, 0xd7610002, + 0x00012a05, 0xd7610002, + 0x00012c06, 0xd7610002, + 0x00012e07, 0xd7610002, + 0x00013008, 0xd7610002, + 0x00013209, 0xd7610002, + 0x0001340a, 0xd7610002, + 0x0001360b, 0xd7610002, + 0x0001380c, 0xd7610002, + 0x00013a0d, 0xd7610002, + 0x00013c0e, 0xd7610002, + 0x00013e0f, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0x80799079, + 0xc4068070, 0x008ce802, + 0x00000000, 0x8070ff70, + 0x00000080, 0xbef90080, + 0x7e040280, 0x807d907d, + 0xbf0aff7d, 0x00000060, + 0xbfa2ff88, 0xbe804100, + 0xbe824102, 0xbe844104, + 0xbe864106, 0xbe884108, + 0xbe8a410a, 0xd7610002, + 0x00010000, 0xd7610002, + 0x00010201, 0xd7610002, + 0x00010402, 0xd7610002, + 0x00010603, 0xd7610002, + 0x00010804, 0xd7610002, + 0x00010a05, 0xd7610002, + 0x00010c06, 0xd7610002, + 0x00010e07, 0xd7610002, + 0x00011008, 0xd7610002, + 0x00011209, 0xd7610002, + 0x0001140a, 0xd7610002, + 0x0001160b, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xd8500000, + 0x00000000, 0xc4068070, 0x008ce802, 0x00000000, + 0xbefe00c1, 0x857d9973, + 0x8b7d817d, 0xbf06817d, + 0xbfa20002, 0xbeff0080, + 0xbfa00001, 0xbeff00c1, + 0xb8fb4306, 0x8b7bc17b, + 0xbfa10044, 0x8b7aff6d, + 0x80000000, 0xbfa10041, + 0x847b897b, 0xbef6007b, + 0xb8f03b05, 0x80708170, + 0xbf0d9973, 0xbfa20002, + 0x84708970, 0xbfa00001, + 0x84708a70, 0xb8fa1e06, + 0x847a8a7a, 0x80707a70, + 0x8070ff70, 0x00000200, 0x8070ff70, 0x00000080, - 0xbef90080, 0x7e040280, - 0x807d907d, 0xbf0aff7d, - 0x00000060, 0xbfa2ffbb, - 0xbe804100, 0xbe824102, - 0xbe844104, 0xbe864106, - 0xbe884108, 0xbe8a410a, - 0xd7610002, 0x0000f200, - 0x80798179, 0xd7610002, - 0x0000f201, 0x80798179, - 0xd7610002, 0x0000f202, - 0x80798179, 0xd7610002, - 0x0000f203, 0x80798179, - 0xd7610002, 0x0000f204, - 0x80798179, 0xd7610002, - 0x0000f205, 0x80798179, - 0xd7610002, 0x0000f206, - 0x80798179, 0xd7610002, - 0x0000f207, 0x80798179, - 0xd7610002, 0x0000f208, - 0x80798179, 0xd7610002, - 0x0000f209, 0x80798179, - 0xd7610002, 0x0000f20a, - 0x80798179, 0xd7610002, - 0x0000f20b, 0x80798179, - 0xc4068070, 0x008ce802, - 0x00000000, 0xbefe00c1, - 0x857d9973, 0x8b7d817d, - 0xbf06817d, 0xbfa20002, - 0xbeff0080, 0xbfa00001, - 0xbeff00c1, 0xb8fb4306, - 0x8b7bc17b, 0xbfa10044, - 0x8b7aff6d, 0x80000000, - 0xbfa10041, 0x847b897b, - 0xbef6007b, 0xb8f03b05, - 0x80708170, 0xbf0d9973, - 0xbfa20002, 0x84708970, - 0xbfa00001, 0x84708a70, - 0xb8fa1e06, 0x847a8a7a, - 0x80707a70, 0x8070ff70, - 0x00000200, 0x8070ff70, - 0x00000080, 0xbef600ff, - 0x01000000, 0xd71f0000, - 0x000100c1, 0xd7200000, - 0x000200c1, 0x16000084, - 0x857d9973, 0x8b7d817d, - 0xbf06817d, 0xbefd0080, - 0xbfa20013, 0xbe8300ff, - 0x00000080, 0xbf800000, - 0xbf800000, 0xbf800000, - 0xd8d80000, 0x01000000, - 0xbf8a0000, 0xc4068070, - 0x008ce801, 0x00000000, - 0x807d037d, 0x80700370, - 0xd5250000, 0x0001ff00, - 0x00000080, 0xbf0a7b7d, - 0xbfa2fff3, 0xbfa00012, - 0xbe8300ff, 0x00000100, + 0xbef600ff, 0x01000000, + 0xd71f0000, 0x000100c1, + 0xd7200000, 0x000200c1, + 0x16000084, 0x857d9973, + 0x8b7d817d, 0xbf06817d, + 0xbefd0080, 0xbfa20013, + 0xbe8300ff, 0x00000080, 0xbf800000, 0xbf800000, 0xbf800000, 0xd8d80000, 0x01000000, 0xbf8a0000, 0xc4068070, 0x008ce801, 0x00000000, 0x807d037d, 0x80700370, 0xd5250000, - 0x0001ff00, 0x00000100, + 0x0001ff00, 0x00000080, 0xbf0a7b7d, 0xbfa2fff3, - 0xbefe00c1, 0x857d9973, - 0x8b7d817d, 0xbf06817d, - 0xbfa20004, 0xbef000ff, - 0x00000200, 0xbeff0080, - 0xbfa00003, 0xbef000ff, - 0x00000400, 0xbeff00c1, - 0xb8fb3b05, 0x807b817b, - 0x847b827b, 0x857d9973, - 0x8b7d817d, 0xbf06817d, - 0xbfa2001b, 0xbef600ff, - 0x01000000, 0xbefd0084, - 0xbf0a7b7d, 0xbfa10040, - 0x7e008700, 0x7e028701, - 0x7e048702, 0x7e068703, - 0xc4068070, 0x008ce800, - 0x00000000, 0xc4068070, - 0x008ce801, 0x00008000, - 0xc4068070, 0x008ce802, - 0x00010000, 0xc4068070, - 0x008ce803, 0x00018000, - 0x807d847d, 0x8070ff70, - 0x00000200, 0xbf0a7b7d, - 0xbfa2ffeb, 0xbfa0002a, + 0xbfa00012, 0xbe8300ff, + 0x00000100, 0xbf800000, + 0xbf800000, 0xbf800000, + 0xd8d80000, 0x01000000, + 0xbf8a0000, 0xc4068070, + 0x008ce801, 0x00000000, + 0x807d037d, 0x80700370, + 0xd5250000, 0x0001ff00, + 0x00000100, 0xbf0a7b7d, + 0xbfa2fff3, 0xbefe00c1, + 0x857d9973, 0x8b7d817d, + 0xbf06817d, 0xbfa20004, + 0xbef000ff, 0x00000200, + 0xbeff0080, 0xbfa00003, + 0xbef000ff, 0x00000400, + 0xbeff00c1, 0xb8fb3b05, + 0x807b817b, 0x847b827b, + 0x857d9973, 0x8b7d817d, + 0xbf06817d, 0xbfa2001b, 0xbef600ff, 0x01000000, 0xbefd0084, 0xbf0a7b7d, - 0xbfa10015, 0x7e008700, + 0xbfa10040, 0x7e008700, 0x7e028701, 0x7e048702, 0x7e068703, 0xc4068070, 0x008ce800, 0x00000000, 0xc4068070, 0x008ce801, - 0x00010000, 0xc4068070, - 0x008ce802, 0x00020000, + 0x00008000, 0xc4068070, + 0x008ce802, 0x00010000, 0xc4068070, 0x008ce803, - 0x00030000, 0x807d847d, - 0x8070ff70, 0x00000400, + 0x00018000, 0x807d847d, + 0x8070ff70, 0x00000200, 0xbf0a7b7d, 0xbfa2ffeb, - 0xb8fb1e06, 0x8b7bc17b, - 0xbfa1000d, 0x847b837b, - 0x807b7d7b, 0xbefe00c1, - 0xbeff0080, 0x7e008700, + 0xbfa0002a, 0xbef600ff, + 0x01000000, 0xbefd0084, + 0xbf0a7b7d, 0xbfa10015, + 0x7e008700, 0x7e028701, + 0x7e048702, 0x7e068703, 0xc4068070, 0x008ce800, - 0x00000000, 0x807d817d, - 0x8070ff70, 0x00000080, - 0xbf0a7b7d, 0xbfa2fff7, - 0xbfa0016e, 0xbef4007e, - 0x8b75ff7f, 0x0000ffff, - 0x8c75ff75, 0x00040000, - 0xbef60080, 0xbef700ff, - 0x10807fac, 0xbef1007f, - 0xb8f20742, 0x84729972, - 0x8b6eff7f, 0x04000000, - 0xbfa1003b, 0xbefe00c1, - 0x857d9972, 0x8b7d817d, - 0xbf06817d, 0xbfa20002, - 0xbeff0080, 0xbfa00001, - 0xbeff00c1, 0xb8ef4306, - 0x8b6fc16f, 0xbfa10030, - 0x846f896f, 0xbef6006f, + 0x00000000, 0xc4068070, + 0x008ce801, 0x00010000, + 0xc4068070, 0x008ce802, + 0x00020000, 0xc4068070, + 0x008ce803, 0x00030000, + 0x807d847d, 0x8070ff70, + 0x00000400, 0xbf0a7b7d, + 0xbfa2ffeb, 0xb8fb1e06, + 0x8b7bc17b, 0xbfa1000d, + 0x847b837b, 0x807b7d7b, + 0xbefe00c1, 0xbeff0080, + 0x7e008700, 0xc4068070, + 0x008ce800, 0x00000000, + 0x807d817d, 0x8070ff70, + 0x00000080, 0xbf0a7b7d, + 0xbfa2fff7, 0xbfa0016e, + 0xbef4007e, 0x8b75ff7f, + 0x0000ffff, 0x8c75ff75, + 0x00040000, 0xbef60080, + 0xbef700ff, 0x10807fac, + 0xbef1007f, 0xb8f20742, + 0x84729972, 0x8b6eff7f, + 0x04000000, 0xbfa1003b, + 0xbefe00c1, 0x857d9972, + 0x8b7d817d, 0xbf06817d, + 0xbfa20002, 0xbeff0080, + 0xbfa00001, 0xbeff00c1, + 0xb8ef4306, 0x8b6fc16f, + 0xbfa10030, 0x846f896f, + 0xbef6006f, 0xb8f83b05, + 0x80788178, 0xbf0d9972, + 0xbfa20002, 0x84788978, + 0xbfa00001, 0x84788a78, + 0xb8ee1e06, 0x846e8a6e, + 0x80786e78, 0x8078ff78, + 0x00000200, 0x8078ff78, + 0x00000080, 0xbef600ff, + 0x01000000, 0x857d9972, + 0x8b7d817d, 0xbf06817d, + 0xbefd0080, 0xbfa2000d, + 0xc4050078, 0x0080e800, + 0x00000000, 0xbf8a0000, + 0xdac00000, 0x00000000, + 0x807dff7d, 0x00000080, + 0x8078ff78, 0x00000080, + 0xbf0a6f7d, 0xbfa2fff4, + 0xbfa0000c, 0xc4050078, + 0x0080e800, 0x00000000, + 0xbf8a0000, 0xdac00000, + 0x00000000, 0x807dff7d, + 0x00000100, 0x8078ff78, + 0x00000100, 0xbf0a6f7d, + 0xbfa2fff4, 0xbef80080, + 0xbefe00c1, 0x857d9972, + 0x8b7d817d, 0xbf06817d, + 0xbfa20002, 0xbeff0080, + 0xbfa00001, 0xbeff00c1, + 0xb8ef3b05, 0x806f816f, + 0x846f826f, 0x857d9972, + 0x8b7d817d, 0xbf06817d, + 0xbfa2002c, 0xbef600ff, + 0x01000000, 0xbeee0078, + 0x8078ff78, 0x00000200, + 0xbefd0084, 0xbf0a6f7d, + 0xbfa10061, 0xc4050078, + 0x008ce800, 0x00000000, + 0xc4050078, 0x008ce801, + 0x00008000, 0xc4050078, + 0x008ce802, 0x00010000, + 0xc4050078, 0x008ce803, + 0x00018000, 0xbf8a0000, + 0x7e008500, 0x7e028501, + 0x7e048502, 0x7e068503, + 0x807d847d, 0x8078ff78, + 0x00000200, 0xbf0a6f7d, + 0xbfa2ffea, 0xc405006e, + 0x008ce800, 0x00000000, + 0xc405006e, 0x008ce801, + 0x00008000, 0xc405006e, + 0x008ce802, 0x00010000, + 0xc405006e, 0x008ce803, + 0x00018000, 0xbf8a0000, + 0xbfa0003d, 0xbef600ff, + 0x01000000, 0xbeee0078, + 0x8078ff78, 0x00000400, + 0xbefd0084, 0xbf0a6f7d, + 0xbfa10016, 0xc4050078, + 0x008ce800, 0x00000000, + 0xc4050078, 0x008ce801, + 0x00010000, 0xc4050078, + 0x008ce802, 0x00020000, + 0xc4050078, 0x008ce803, + 0x00030000, 0xbf8a0000, + 0x7e008500, 0x7e028501, + 0x7e048502, 0x7e068503, + 0x807d847d, 0x8078ff78, + 0x00000400, 0xbf0a6f7d, + 0xbfa2ffea, 0xb8ef1e06, + 0x8b6fc16f, 0xbfa1000f, + 0x846f836f, 0x806f7d6f, + 0xbefe00c1, 0xbeff0080, + 0xc4050078, 0x008ce800, + 0x00000000, 0xbf8a0000, + 0x7e008500, 0x807d817d, + 0x8078ff78, 0x00000080, + 0xbf0a6f7d, 0xbfa2fff6, + 0xbeff00c1, 0xc405006e, + 0x008ce800, 0x00000000, + 0xc405006e, 0x008ce801, + 0x00010000, 0xc405006e, + 0x008ce802, 0x00020000, + 0xc405006e, 0x008ce803, + 0x00030000, 0xbf8a0000, 0xb8f83b05, 0x80788178, 0xbf0d9972, 0xbfa20002, 0x84788978, 0xbfa00001, 0x84788a78, 0xb8ee1e06, 0x846e8a6e, 0x80786e78, 0x8078ff78, 0x00000200, - 0x8078ff78, 0x00000080, - 0xbef600ff, 0x01000000, - 0x857d9972, 0x8b7d817d, - 0xbf06817d, 0xbefd0080, - 0xbfa2000d, 0xc4050078, - 0x0080e800, 0x00000000, - 0xbf8a0000, 0xdac00000, - 0x00000000, 0x807dff7d, - 0x00000080, 0x8078ff78, - 0x00000080, 0xbf0a6f7d, - 0xbfa2fff4, 0xbfa0000c, - 0xc4050078, 0x0080e800, - 0x00000000, 0xbf8a0000, - 0xdac00000, 0x00000000, - 0x807dff7d, 0x00000100, - 0x8078ff78, 0x00000100, - 0xbf0a6f7d, 0xbfa2fff4, - 0xbef80080, 0xbefe00c1, - 0x857d9972, 0x8b7d817d, - 0xbf06817d, 0xbfa20002, - 0xbeff0080, 0xbfa00001, - 0xbeff00c1, 0xb8ef3b05, - 0x806f816f, 0x846f826f, - 0x857d9972, 0x8b7d817d, - 0xbf06817d, 0xbfa2002c, + 0x80f8ff78, 0x00000050, 0xbef600ff, 0x01000000, - 0xbeee0078, 0x8078ff78, - 0x00000200, 0xbefd0084, - 0xbf0a6f7d, 0xbfa10061, - 0xc4050078, 0x008ce800, - 0x00000000, 0xc4050078, - 0x008ce801, 0x00008000, - 0xc4050078, 0x008ce802, - 0x00010000, 0xc4050078, - 0x008ce803, 0x00018000, - 0xbf8a0000, 0x7e008500, - 0x7e028501, 0x7e048502, - 0x7e068503, 0x807d847d, + 0xbefd00ff, 0x0000006c, + 0x80f89078, 0xf462403a, + 0xf0000000, 0xbf8a0000, + 0x80fd847d, 0xbf800000, + 0xbe804300, 0xbe824302, + 0x80f8a078, 0xf462603a, + 0xf0000000, 0xbf8a0000, + 0x80fd887d, 0xbf800000, + 0xbe804300, 0xbe824302, + 0xbe844304, 0xbe864306, + 0x80f8c078, 0xf462803a, + 0xf0000000, 0xbf8a0000, + 0x80fd907d, 0xbf800000, + 0xbe804300, 0xbe824302, + 0xbe844304, 0xbe864306, + 0xbe884308, 0xbe8a430a, + 0xbe8c430c, 0xbe8e430e, + 0xbf06807d, 0xbfa1fff0, + 0xb980f801, 0x00000000, + 0xb8f83b05, 0x80788178, + 0xbf0d9972, 0xbfa20002, + 0x84788978, 0xbfa00001, + 0x84788a78, 0xb8ee1e06, + 0x846e8a6e, 0x80786e78, 0x8078ff78, 0x00000200, - 0xbf0a6f7d, 0xbfa2ffea, - 0xc405006e, 0x008ce800, - 0x00000000, 0xc405006e, - 0x008ce801, 0x00008000, - 0xc405006e, 0x008ce802, - 0x00010000, 0xc405006e, - 0x008ce803, 0x00018000, - 0xbf8a0000, 0xbfa0003d, 0xbef600ff, 0x01000000, - 0xbeee0078, 0x8078ff78, - 0x00000400, 0xbefd0084, - 0xbf0a6f7d, 0xbfa10016, - 0xc4050078, 0x008ce800, - 0x00000000, 0xc4050078, - 0x008ce801, 0x00010000, - 0xc4050078, 0x008ce802, - 0x00020000, 0xc4050078, - 0x008ce803, 0x00030000, - 0xbf8a0000, 0x7e008500, - 0x7e028501, 0x7e048502, - 0x7e068503, 0x807d847d, - 0x8078ff78, 0x00000400, - 0xbf0a6f7d, 0xbfa2ffea, - 0xb8ef1e06, 0x8b6fc16f, - 0xbfa1000f, 0x846f836f, - 0x806f7d6f, 0xbefe00c1, - 0xbeff0080, 0xc4050078, - 0x008ce800, 0x00000000, - 0xbf8a0000, 0x7e008500, - 0x807d817d, 0x8078ff78, - 0x00000080, 0xbf0a6f7d, - 0xbfa2fff6, 0xbeff00c1, - 0xc405006e, 0x008ce800, - 0x00000000, 0xc405006e, - 0x008ce801, 0x00010000, - 0xc405006e, 0x008ce802, - 0x00020000, 0xc405006e, - 0x008ce803, 0x00030000, - 0xbf8a0000, 0xb8f83b05, - 0x80788178, 0xbf0d9972, - 0xbfa20002, 0x84788978, - 0xbfa00001, 0x84788a78, - 0xb8ee1e06, 0x846e8a6e, - 0x80786e78, 0x8078ff78, - 0x00000200, 0x80f8ff78, - 0x00000050, 0xbef600ff, - 0x01000000, 0xbefd00ff, - 0x0000006c, 0x80f89078, - 0xf462403a, 0xf0000000, - 0xbf8a0000, 0x80fd847d, - 0xbf800000, 0xbe804300, - 0xbe824302, 0x80f8a078, - 0xf462603a, 0xf0000000, - 0xbf8a0000, 0x80fd887d, - 0xbf800000, 0xbe804300, - 0xbe824302, 0xbe844304, - 0xbe864306, 0x80f8c078, - 0xf462803a, 0xf0000000, - 0xbf8a0000, 0x80fd907d, - 0xbf800000, 0xbe804300, - 0xbe824302, 0xbe844304, - 0xbe864306, 0xbe884308, - 0xbe8a430a, 0xbe8c430c, - 0xbe8e430e, 0xbf06807d, - 0xbfa1fff0, 0xb980f801, - 0x00000000, 0xb8f83b05, - 0x80788178, 0xbf0d9972, - 0xbfa20002, 0x84788978, - 0xbfa00001, 0x84788a78, - 0xb8ee1e06, 0x846e8a6e, - 0x80786e78, 0x8078ff78, - 0x00000200, 0xbef600ff, - 0x01000000, 0xbeff0071, - 0xf4621bfa, 0xf0000000, - 0x80788478, 0xf4621b3a, + 0xbeff0071, 0xf4621bfa, 0xf0000000, 0x80788478, - 0xf4621b7a, 0xf0000000, - 0x80788478, 0xf4621c3a, + 0xf4621b3a, 0xf0000000, + 0x80788478, 0xf4621b7a, 0xf0000000, 0x80788478, - 0xf4621c7a, 0xf0000000, - 0x80788478, 0xf4621eba, + 0xf4621c3a, 0xf0000000, + 0x80788478, 0xf4621c7a, 0xf0000000, 0x80788478, - 0xf4621efa, 0xf0000000, - 0x80788478, 0xf4621e7a, + 0xf4621eba, 0xf0000000, + 0x80788478, 0xf4621efa, 0xf0000000, 0x80788478, - 0xf4621cfa, 0xf0000000, - 0x80788478, 0xf4621bba, + 0xf4621e7a, 0xf0000000, + 0x80788478, 0xf4621cfa, 0xf0000000, 0x80788478, - 0xbf8a0000, 0xb96ef814, 0xf4621bba, 0xf0000000, 0x80788478, 0xbf8a0000, - 0xb96ef815, 0xf4621bba, + 0xb96ef814, 0xf4621bba, 0xf0000000, 0x80788478, - 0xbf8a0000, 0xb96ef812, + 0xbf8a0000, 0xb96ef815, 0xf4621bba, 0xf0000000, 0x80788478, 0xbf8a0000, - 0xb96ef813, 0x8b6eff7f, - 0x04000000, 0xbfa1000d, - 0x80788478, 0xf4621bba, + 0xb96ef812, 0xf4621bba, 0xf0000000, 0x80788478, - 0xbf8a0000, 0xbf0d806e, - 0xbfa10006, 0x856e906e, - 0x8b6e6e6e, 0xbfa10003, - 0xbe804ec1, 0x816ec16e, - 0xbfa0fffb, 0xbefd006f, - 0xbefe0070, 0xbeff0071, - 0xb97b2011, 0x857b867b, - 0xb97b0191, 0x857b827b, - 0xb97bba11, 0xb973f801, - 0xb8ee3b05, 0x806e816e, - 0xbf0d9972, 0xbfa20002, - 0x846e896e, 0xbfa00001, - 0x846e8a6e, 0xb8ef1e06, - 0x846f8a6f, 0x806e6f6e, - 0x806eff6e, 0x00000200, - 0x806e746e, 0x826f8075, - 0x8b6fff6f, 0x0000ffff, - 0xf4605c37, 0xf8000050, - 0xf4605d37, 0xf8000060, - 0xf4601e77, 0xf8000074, - 0xbf8a0000, 0x8b6dff6d, - 0x0000ffff, 0x8bfe7e7e, - 0x8bea6a6a, 0xb97af804, + 0xbf8a0000, 0xb96ef813, + 0x8b6eff7f, 0x04000000, + 0xbfa1000d, 0x80788478, + 0xf4621bba, 0xf0000000, + 0x80788478, 0xbf8a0000, + 0xbf0d806e, 0xbfa10006, + 0x856e906e, 0x8b6e6e6e, + 0xbfa10003, 0xbe804ec1, + 0x816ec16e, 0xbfa0fffb, + 0xbefd006f, 0xbefe0070, + 0xbeff0071, 0xb97b2011, + 0x857b867b, 0xb97b0191, + 0x857b827b, 0xb97bba11, + 0xb973f801, 0xb8ee3b05, + 0x806e816e, 0xbf0d9972, + 0xbfa20002, 0x846e896e, + 0xbfa00001, 0x846e8a6e, + 0xb8ef1e06, 0x846f8a6f, + 0x806e6f6e, 0x806eff6e, + 0x00000200, 0x806e746e, + 0x826f8075, 0x8b6fff6f, + 0x0000ffff, 0xf4605c37, + 0xf8000050, 0xf4605d37, + 0xf8000060, 0xf4601e77, + 0xf8000074, 0xbf8a0000, + 0x8b6dff6d, 0x0000ffff, + 0x8bfe7e7e, 0x8bea6a6a, + 0xb97af804, 0xbe804ec2, + 0xbf94fffe, 0xbe804a6c, 0xbe804ec2, 0xbf94fffe, - 0xbe804a6c, 0xbe804ec2, - 0xbf94fffe, 0xbfb10000, + 0xbfb10000, 0xbf9f0000, 0xbf9f0000, 0xbf9f0000, 0xbf9f0000, 0xbf9f0000, - 0xbf9f0000, 0x00000000, }; diff --git a/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler_gfx12.asm b/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler_gfx12.asm index 7b9d36e5fa437..5a1a1b1f897fe 100644 --- a/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler_gfx12.asm +++ b/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler_gfx12.asm @@ -30,6 +30,7 @@ #define CHIP_GFX12 37 #define SINGLE_STEP_MISSED_WORKAROUND 1 //workaround for lost TRAP_AFTER_INST exception when SAVECTX raised +#define HAVE_VALU_SGPR_HAZARD (ASIC_FAMILY == CHIP_GFX12) var SQ_WAVE_STATE_PRIV_BARRIER_COMPLETE_MASK = 0x4 var SQ_WAVE_STATE_PRIV_SCC_SHIFT = 9 @@ -351,6 +352,7 @@ L_HAVE_VGPRS: v_writelane_b32 v0, ttmp13, 0xD v_writelane_b32 v0, exec_lo, 0xE v_writelane_b32 v0, exec_hi, 0xF + valu_sgpr_hazard() s_mov_b32 exec_lo, 0x3FFF s_mov_b32 exec_hi, 0x0 @@ -417,7 +419,6 @@ L_SAVE_HWREG: v_mov_b32 v0, 0x0 //Offset[31:0] from buffer resource v_mov_b32 v1, 0x0 //Offset[63:32] from buffer resource v_mov_b32 v2, 0x0 //Set of SGPRs for TCP store - s_mov_b32 m0, 0x0 //Next lane of v2 to write to // Ensure no further changes to barrier or LDS state. // STATE_PRIV.BARRIER_COMPLETE may change up to this point. @@ -430,40 +431,41 @@ L_SAVE_HWREG: s_andn2_b32 s_save_state_priv, s_save_state_priv, SQ_WAVE_STATE_PRIV_BARRIER_COMPLETE_MASK s_or_b32 s_save_state_priv, s_save_state_priv, s_save_tmp - write_hwreg_to_v2(s_save_m0) - write_hwreg_to_v2(s_save_pc_lo) s_andn2_b32 s_save_tmp, s_save_pc_hi, S_SAVE_PC_HI_FIRST_WAVE_MASK - write_hwreg_to_v2(s_save_tmp) - write_hwreg_to_v2(s_save_exec_lo) - write_hwreg_to_v2(s_save_exec_hi) - write_hwreg_to_v2(s_save_state_priv) + v_writelane_b32 v2, s_save_m0, 0x0 + v_writelane_b32 v2, s_save_pc_lo, 0x1 + v_writelane_b32 v2, s_save_tmp, 0x2 + v_writelane_b32 v2, s_save_exec_lo, 0x3 + v_writelane_b32 v2, s_save_exec_hi, 0x4 + v_writelane_b32 v2, s_save_state_priv, 0x5 + v_writelane_b32 v2, s_save_xnack_mask, 0x7 + valu_sgpr_hazard() s_getreg_b32 s_save_tmp, hwreg(HW_REG_WAVE_EXCP_FLAG_PRIV) - write_hwreg_to_v2(s_save_tmp) + v_writelane_b32 v2, s_save_tmp, 0x6 - write_hwreg_to_v2(s_save_xnack_mask) + s_getreg_b32 s_save_tmp, hwreg(HW_REG_WAVE_MODE) + v_writelane_b32 v2, s_save_tmp, 0x8 - s_getreg_b32 s_save_m0, hwreg(HW_REG_WAVE_MODE) - write_hwreg_to_v2(s_save_m0) + s_getreg_b32 s_save_tmp, hwreg(HW_REG_WAVE_SCRATCH_BASE_LO) + v_writelane_b32 v2, s_save_tmp, 0x9 - s_getreg_b32 s_save_m0, hwreg(HW_REG_WAVE_SCRATCH_BASE_LO) - write_hwreg_to_v2(s_save_m0) + s_getreg_b32 s_save_tmp, hwreg(HW_REG_WAVE_SCRATCH_BASE_HI) + v_writelane_b32 v2, s_save_tmp, 0xA - s_getreg_b32 s_save_m0, hwreg(HW_REG_WAVE_SCRATCH_BASE_HI) - write_hwreg_to_v2(s_save_m0) + s_getreg_b32 s_save_tmp, hwreg(HW_REG_WAVE_EXCP_FLAG_USER) + v_writelane_b32 v2, s_save_tmp, 0xB - s_getreg_b32 s_save_m0, hwreg(HW_REG_WAVE_EXCP_FLAG_USER) - write_hwreg_to_v2(s_save_m0) - - s_getreg_b32 s_save_m0, hwreg(HW_REG_WAVE_TRAP_CTRL) - write_hwreg_to_v2(s_save_m0) + s_getreg_b32 s_save_tmp, hwreg(HW_REG_WAVE_TRAP_CTRL) + v_writelane_b32 v2, s_save_tmp, 0xC s_getreg_b32 s_save_tmp, hwreg(HW_REG_WAVE_STATUS) - write_hwreg_to_v2(s_save_tmp) + v_writelane_b32 v2, s_save_tmp, 0xD s_get_barrier_state s_save_tmp, -1 s_wait_kmcnt (0) - write_hwreg_to_v2(s_save_tmp) + v_writelane_b32 v2, s_save_tmp, 0xE + valu_sgpr_hazard() // Write HWREGs with 16 VGPR lanes. TTMPs occupy space after this. s_mov_b32 exec_lo, 0xFFFF @@ -497,10 +499,12 @@ L_SAVE_SGPR_LOOP: s_movrels_b64 s12, s12 //s12 = s[12+m0], s13 = s[13+m0] s_movrels_b64 s14, s14 //s14 = s[14+m0], s15 = s[15+m0] - write_16sgpr_to_v2(s0) - - s_cmp_eq_u32 ttmp13, 0x20 //have 32 VGPR lanes filled? - s_cbranch_scc0 L_SAVE_SGPR_SKIP_TCP_STORE + s_cmp_eq_u32 ttmp13, 0x0 + s_cbranch_scc0 L_WRITE_V2_SECOND_HALF + write_16sgpr_to_v2(s0, 0x0) + s_branch L_SAVE_SGPR_SKIP_TCP_STORE +L_WRITE_V2_SECOND_HALF: + write_16sgpr_to_v2(s0, 0x10) buffer_store_dword v2, v0, s_save_buf_rsrc0, s_save_mem_offset scope:SCOPE_SYS s_add_u32 s_save_mem_offset, s_save_mem_offset, 0x80 @@ -1056,27 +1060,21 @@ L_END_PGM: s_endpgm_saved end -function write_hwreg_to_v2(s) - // Copy into VGPR for later TCP store. - v_writelane_b32 v2, s, m0 - s_add_u32 m0, m0, 0x1 -end - - -function write_16sgpr_to_v2(s) +function write_16sgpr_to_v2(s, lane_offset) // Copy into VGPR for later TCP store. for var sgpr_idx = 0; sgpr_idx < 16; sgpr_idx ++ - v_writelane_b32 v2, s[sgpr_idx], ttmp13 - s_add_u32 ttmp13, ttmp13, 0x1 + v_writelane_b32 v2, s[sgpr_idx], sgpr_idx + lane_offset end + valu_sgpr_hazard() + s_add_u32 ttmp13, ttmp13, 0x10 end function write_12sgpr_to_v2(s) // Copy into VGPR for later TCP store. for var sgpr_idx = 0; sgpr_idx < 12; sgpr_idx ++ - v_writelane_b32 v2, s[sgpr_idx], ttmp13 - s_add_u32 ttmp13, ttmp13, 0x1 + v_writelane_b32 v2, s[sgpr_idx], sgpr_idx end + valu_sgpr_hazard() end function read_hwreg_from_mem(s, s_rsrc, s_mem_offset) @@ -1128,3 +1126,11 @@ function get_wave_size2(s_reg) s_getreg_b32 s_reg, hwreg(HW_REG_WAVE_STATUS,SQ_WAVE_STATUS_WAVE64_SHIFT,SQ_WAVE_STATUS_WAVE64_SIZE) s_lshl_b32 s_reg, s_reg, S_WAVE_SIZE end + +function valu_sgpr_hazard +#if HAVE_VALU_SGPR_HAZARD + for var rep = 0; rep < 8; rep ++ + ds_nop + end +#endif +end -- GitLab From 442312c2a90d60c7a5197246583fa91d9e579985 Mon Sep 17 00:00:00 2001 From: Qingfang Deng Date: Tue, 18 Mar 2025 11:24:23 +0800 Subject: [PATCH 1849/2211] net: stmmac: Fix accessing freed irq affinity_hint [ Upstream commit c60d101a226f18e9a8f01bb4c6ca2b47dfcb15ef ] The cpumask should not be a local variable, since its pointer is saved to irq_desc and may be accessed from procfs. To fix it, use the persistent mask cpumask_of(cpu#). Cc: stable@vger.kernel.org Fixes: 8deec94c6040 ("net: stmmac: set IRQ affinity hint for multi MSI vectors") Signed-off-by: Qingfang Deng Reviewed-by: Jacob Keller Link: https://patch.msgid.link/20250318032424.112067-1-dqfext@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 0250c5cb28ff2..36328298dc9b8 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -3603,7 +3603,6 @@ static int stmmac_request_irq_multi_msi(struct net_device *dev) { struct stmmac_priv *priv = netdev_priv(dev); enum request_irq_err irq_err; - cpumask_t cpu_mask; int irq_idx = 0; char *int_name; int ret; @@ -3732,9 +3731,8 @@ static int stmmac_request_irq_multi_msi(struct net_device *dev) irq_idx = i; goto irq_error; } - cpumask_clear(&cpu_mask); - cpumask_set_cpu(i % num_online_cpus(), &cpu_mask); - irq_set_affinity_hint(priv->rx_irq[i], &cpu_mask); + irq_set_affinity_hint(priv->rx_irq[i], + cpumask_of(i % num_online_cpus())); } /* Request Tx MSI irq */ @@ -3757,9 +3755,8 @@ static int stmmac_request_irq_multi_msi(struct net_device *dev) irq_idx = i; goto irq_error; } - cpumask_clear(&cpu_mask); - cpumask_set_cpu(i % num_online_cpus(), &cpu_mask); - irq_set_affinity_hint(priv->tx_irq[i], &cpu_mask); + irq_set_affinity_hint(priv->tx_irq[i], + cpumask_of(i % num_online_cpus())); } return 0; -- GitLab From f68b27d82a749117d9c7d7f33fa53f46373e38e2 Mon Sep 17 00:00:00 2001 From: Han Xu Date: Wed, 26 Mar 2025 17:41:51 -0500 Subject: [PATCH 1850/2211] spi: fsl-qspi: use devm function instead of driver remove [ Upstream commit 40369bfe717e96e26650eeecfa5a6363563df6e4 ] Driver use devm APIs to manage clk/irq/resources and register the spi controller, but the legacy remove function will be called first during device detach and trigger kernel panic. Drop the remove function and use devm_add_action_or_reset() for driver cleanup to ensure the release sequence. Trigger kernel panic on i.MX8MQ by echo 30bb0000.spi >/sys/bus/platform/drivers/fsl-quadspi/unbind Cc: stable@vger.kernel.org Fixes: 8fcb830a00f0 ("spi: spi-fsl-qspi: use devm_spi_register_controller") Reported-by: Kevin Hao Signed-off-by: Han Xu Reviewed-by: Frank Li Link: https://patch.msgid.link/20250326224152.2147099-1-han.xu@nxp.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-fsl-qspi.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/drivers/spi/spi-fsl-qspi.c b/drivers/spi/spi-fsl-qspi.c index 79bac30e79af6..310350d2c5302 100644 --- a/drivers/spi/spi-fsl-qspi.c +++ b/drivers/spi/spi-fsl-qspi.c @@ -839,6 +839,19 @@ static const struct spi_controller_mem_ops fsl_qspi_mem_ops = { .get_name = fsl_qspi_get_name, }; +static void fsl_qspi_cleanup(void *data) +{ + struct fsl_qspi *q = data; + + /* disable the hardware */ + qspi_writel(q, QUADSPI_MCR_MDIS_MASK, q->iobase + QUADSPI_MCR); + qspi_writel(q, 0x0, q->iobase + QUADSPI_RSER); + + fsl_qspi_clk_disable_unprep(q); + + mutex_destroy(&q->lock); +} + static int fsl_qspi_probe(struct platform_device *pdev) { struct spi_controller *ctlr; @@ -928,6 +941,10 @@ static int fsl_qspi_probe(struct platform_device *pdev) ctlr->dev.of_node = np; + ret = devm_add_action_or_reset(dev, fsl_qspi_cleanup, q); + if (ret) + goto err_destroy_mutex; + ret = devm_spi_register_controller(dev, ctlr); if (ret) goto err_destroy_mutex; @@ -947,19 +964,6 @@ err_put_ctrl: return ret; } -static void fsl_qspi_remove(struct platform_device *pdev) -{ - struct fsl_qspi *q = platform_get_drvdata(pdev); - - /* disable the hardware */ - qspi_writel(q, QUADSPI_MCR_MDIS_MASK, q->iobase + QUADSPI_MCR); - qspi_writel(q, 0x0, q->iobase + QUADSPI_RSER); - - fsl_qspi_clk_disable_unprep(q); - - mutex_destroy(&q->lock); -} - static int fsl_qspi_suspend(struct device *dev) { return 0; @@ -997,7 +1001,6 @@ static struct platform_driver fsl_qspi_driver = { .pm = &fsl_qspi_pm_ops, }, .probe = fsl_qspi_probe, - .remove_new = fsl_qspi_remove, }; module_platform_driver(fsl_qspi_driver); -- GitLab From 5f4863cfb29a7b4fe7625ce148d0b9000b75b802 Mon Sep 17 00:00:00 2001 From: Naohiro Aota Date: Wed, 19 Feb 2025 16:02:11 +0900 Subject: [PATCH 1851/2211] btrfs: zoned: fix extent range end unlock in cow_file_range() [ Upstream commit 5a4041f2c47247575a6c2e53ce14f7b0ac946c33 ] Running generic/751 on the for-next branch often results in a hang like below. They are both stack by locking an extent. This suggests someone forget to unlock an extent. INFO: task kworker/u128:1:12 blocked for more than 323 seconds. Not tainted 6.13.0-BTRFS-ZNS+ #503 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. task:kworker/u128:1 state:D stack:0 pid:12 tgid:12 ppid:2 flags:0x00004000 Workqueue: btrfs-fixup btrfs_work_helper [btrfs] Call Trace: __schedule+0x534/0xdd0 schedule+0x39/0x140 __lock_extent+0x31b/0x380 [btrfs] ? __pfx_autoremove_wake_function+0x10/0x10 btrfs_writepage_fixup_worker+0xf1/0x3a0 [btrfs] btrfs_work_helper+0xff/0x480 [btrfs] ? lock_release+0x178/0x2c0 process_one_work+0x1ee/0x570 ? srso_return_thunk+0x5/0x5f worker_thread+0x1d1/0x3b0 ? __pfx_worker_thread+0x10/0x10 kthread+0x10b/0x230 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x30/0x50 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 INFO: task kworker/u134:0:184 blocked for more than 323 seconds. Not tainted 6.13.0-BTRFS-ZNS+ #503 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. task:kworker/u134:0 state:D stack:0 pid:184 tgid:184 ppid:2 flags:0x00004000 Workqueue: writeback wb_workfn (flush-btrfs-4) Call Trace: __schedule+0x534/0xdd0 schedule+0x39/0x140 __lock_extent+0x31b/0x380 [btrfs] ? __pfx_autoremove_wake_function+0x10/0x10 find_lock_delalloc_range+0xdb/0x260 [btrfs] writepage_delalloc+0x12f/0x500 [btrfs] ? srso_return_thunk+0x5/0x5f extent_write_cache_pages+0x232/0x840 [btrfs] btrfs_writepages+0x72/0x130 [btrfs] do_writepages+0xe7/0x260 ? srso_return_thunk+0x5/0x5f ? lock_acquire+0xd2/0x300 ? srso_return_thunk+0x5/0x5f ? find_held_lock+0x2b/0x80 ? wbc_attach_and_unlock_inode.part.0+0x102/0x250 ? wbc_attach_and_unlock_inode.part.0+0x102/0x250 __writeback_single_inode+0x5c/0x4b0 writeback_sb_inodes+0x22d/0x550 __writeback_inodes_wb+0x4c/0xe0 wb_writeback+0x2f6/0x3f0 wb_workfn+0x32a/0x510 process_one_work+0x1ee/0x570 ? srso_return_thunk+0x5/0x5f worker_thread+0x1d1/0x3b0 ? __pfx_worker_thread+0x10/0x10 kthread+0x10b/0x230 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x30/0x50 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 This happens because we have another success path for the zoned mode. When there is no active zone available, btrfs_reserve_extent() returns -EAGAIN. In this case, we have two reactions. (1) If the given range is never allocated, we can only wait for someone to finish a zone, so wait on BTRFS_FS_NEED_ZONE_FINISH bit and retry afterward. (2) Or, if some allocations are already done, we must bail out and let the caller to send IOs for the allocation. This is because these IOs may be necessary to finish a zone. The commit 06f364284794 ("btrfs: do proper folio cleanup when cow_file_range() failed") moved the unlock code from the inside of the loop to the outside. So, previously, the allocated extents are unlocked just after the allocation and so before returning from the function. However, they are no longer unlocked on the case (2) above. That caused the hang issue. Fix the issue by modifying the 'end' to the end of the allocated range. Then, we can exit the loop and the same unlock code can properly handle the case. Reported-by: Shin'ichiro Kawasaki Tested-by: Johannes Thumshirn Fixes: 06f364284794 ("btrfs: do proper folio cleanup when cow_file_range() failed") CC: stable@vger.kernel.org Reviewed-by: Qu Wenruo Reviewed-by: Johannes Thumshirn Signed-off-by: Naohiro Aota Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/inode.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 2f0b2cb2ae6e8..921ec3802648b 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1463,8 +1463,13 @@ static noinline int cow_file_range(struct btrfs_inode *inode, continue; } if (done_offset) { - *done_offset = start - 1; - return 0; + /* + * Move @end to the end of the processed range, + * and exit the loop to unlock the processed extents. + */ + end = start - 1; + ret = 0; + break; } ret = -ENOSPC; } -- GitLab From 07836bc18f4ae42da4e922244f4685561c18755e Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Wed, 2 Jul 2025 19:02:58 -0400 Subject: [PATCH 1852/2211] btrfs: fix use-after-free on inode when scanning root during em shrinking [ Upstream commit 59f37036bb7ab3d554c24abc856aabca01126414 ] At btrfs_scan_root() we are accessing the inode's root (and fs_info) in a call to btrfs_fs_closing() after we have scheduled the inode for a delayed iput, and that can result in a use-after-free on the inode in case the cleaner kthread does the iput before we dereference the inode in the call to btrfs_fs_closing(). Fix this by using the fs_info stored already in a local variable instead of doing inode->root->fs_info. Fixes: 102044384056 ("btrfs: make the extent map shrinker run asynchronously as a work queue job") CC: stable@vger.kernel.org # 6.13+ Tested-by: Ivan Shapovalov Link: https://lore.kernel.org/linux-btrfs/0414d690ac5680d0d77dfc930606cdc36e42e12f.camel@intelfx.name/ Reviewed-by: Johannes Thumshirn Reviewed-by: Qu Wenruo Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/extent_map.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index 93043edc8ff93..36af9aa9aab13 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c @@ -1250,6 +1250,7 @@ next: static long btrfs_scan_root(struct btrfs_root *root, struct btrfs_em_shrink_ctx *ctx) { + struct btrfs_fs_info *fs_info = root->fs_info; struct btrfs_inode *inode; long nr_dropped = 0; u64 min_ino = ctx->last_ino + 1; @@ -1264,7 +1265,7 @@ static long btrfs_scan_root(struct btrfs_root *root, struct btrfs_em_shrink_ctx iput(&inode->vfs_inode); if (ctx->scanned >= ctx->nr_to_scan || - btrfs_fs_closing(inode->root->fs_info)) + btrfs_fs_closing(fs_info)) break; cond_resched(); -- GitLab From 270165467169795280d89006e6bdfaedfae16ac7 Mon Sep 17 00:00:00 2001 From: Kevin Hao Date: Thu, 10 Apr 2025 14:56:09 +0800 Subject: [PATCH 1853/2211] spi: fsl-qspi: Fix double cleanup in probe error path [ Upstream commit 5d07ab2a7fa1305e429d9221716582f290b58078 ] Commit 40369bfe717e ("spi: fsl-qspi: use devm function instead of driver remove") introduced managed cleanup via fsl_qspi_cleanup(), but incorrectly retain manual cleanup in two scenarios: - On devm_add_action_or_reset() failure, the function automatically call fsl_qspi_cleanup(). However, the current code still jumps to err_destroy_mutex, repeating cleanup. - After the fsl_qspi_cleanup() action is added successfully, there is no need to manually perform the cleanup in the subsequent error path. However, the current code still jumps to err_destroy_mutex on spi controller failure, repeating cleanup. Skip redundant manual cleanup calls to fix these issues. Cc: stable@vger.kernel.org Fixes: 40369bfe717e ("spi: fsl-qspi: use devm function instead of driver remove") Signed-off-by: Kevin Hao Link: https://patch.msgid.link/20250410-spi-v1-1-56e867cc19cf@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-fsl-qspi.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/spi/spi-fsl-qspi.c b/drivers/spi/spi-fsl-qspi.c index 310350d2c5302..21e357966d2a2 100644 --- a/drivers/spi/spi-fsl-qspi.c +++ b/drivers/spi/spi-fsl-qspi.c @@ -943,17 +943,14 @@ static int fsl_qspi_probe(struct platform_device *pdev) ret = devm_add_action_or_reset(dev, fsl_qspi_cleanup, q); if (ret) - goto err_destroy_mutex; + goto err_put_ctrl; ret = devm_spi_register_controller(dev, ctlr); if (ret) - goto err_destroy_mutex; + goto err_put_ctrl; return 0; -err_destroy_mutex: - mutex_destroy(&q->lock); - err_disable_clk: fsl_qspi_clk_disable_unprep(q); -- GitLab From df64e51d4ab83244b6a4eb11eb41f89403611e24 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 6 Jul 2025 11:01:50 +0200 Subject: [PATCH 1854/2211] Linux 6.12.36 Link: https://lore.kernel.org/r/20250703143955.956569535@linuxfoundation.org Tested-by: Florian Fainelli Tested-by: Hardik Garg Tested-by: Salvatore Bonaccorso Tested-by: Shuah Khan Tested-by: Ron Economos Tested-by: Jon Hunter Tested-by: Mark Brown Tested-by: Linux Kernel Functional Testing Tested-by: Peter Schneider Tested-by: Pascal Ernster Signed-off-by: Greg Kroah-Hartman --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 535df76f6f78c..7012820523fff 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 12 -SUBLEVEL = 35 +SUBLEVEL = 36 EXTRAVERSION = NAME = Baby Opossum Posse -- GitLab From a0b4b5586dffa8cd3a737711b8e7d0a84e477363 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 9 Jul 2025 09:55:30 +0000 Subject: [PATCH 1855/2211] Revert "PCI: endpoint: Retain fixed-size BAR size as well as aligned size" This reverts commit 0a3e2ec5085a31ab0e2d5b86bd8b1f1ef061a994 which is commit 793908d60b8745c386b9f4e29eb702f74ceb0886 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I755ab2605f391a43d42d845a72cb5e3eff0ecd6c Signed-off-by: Greg Kroah-Hartman --- drivers/pci/endpoint/pci-epf-core.c | 22 +++++++--------------- include/linux/pci-epf.h | 3 --- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/drivers/pci/endpoint/pci-epf-core.c b/drivers/pci/endpoint/pci-epf-core.c index 963d2f3aa5d47..50bc2892a36c5 100644 --- a/drivers/pci/endpoint/pci-epf-core.c +++ b/drivers/pci/endpoint/pci-epf-core.c @@ -236,13 +236,12 @@ void pci_epf_free_space(struct pci_epf *epf, void *addr, enum pci_barno bar, } dev = epc->dev.parent; - dma_free_coherent(dev, epf_bar[bar].aligned_size, addr, + dma_free_coherent(dev, epf_bar[bar].size, addr, epf_bar[bar].phys_addr); epf_bar[bar].phys_addr = 0; epf_bar[bar].addr = NULL; epf_bar[bar].size = 0; - epf_bar[bar].aligned_size = 0; epf_bar[bar].barno = 0; epf_bar[bar].flags = 0; } @@ -265,7 +264,7 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar, enum pci_epc_interface_type type) { u64 bar_fixed_size = epc_features->bar[bar].fixed_size; - size_t aligned_size, align = epc_features->align; + size_t align = epc_features->align; struct pci_epf_bar *epf_bar; dma_addr_t phys_addr; struct pci_epc *epc; @@ -282,18 +281,12 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar, return NULL; } size = bar_fixed_size; - } else { - /* BAR size must be power of two */ - size = roundup_pow_of_two(size); } - /* - * Allocate enough memory to accommodate the iATU alignment - * requirement. In most cases, this will be the same as .size but - * it might be different if, for example, the fixed size of a BAR - * is smaller than align. - */ - aligned_size = align ? ALIGN(size, align) : size; + if (align) + size = ALIGN(size, align); + else + size = roundup_pow_of_two(size); if (type == PRIMARY_INTERFACE) { epc = epf->epc; @@ -304,7 +297,7 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar, } dev = epc->dev.parent; - space = dma_alloc_coherent(dev, aligned_size, &phys_addr, GFP_KERNEL); + space = dma_alloc_coherent(dev, size, &phys_addr, GFP_KERNEL); if (!space) { dev_err(dev, "failed to allocate mem space\n"); return NULL; @@ -313,7 +306,6 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar, epf_bar[bar].phys_addr = phys_addr; epf_bar[bar].addr = space; epf_bar[bar].size = size; - epf_bar[bar].aligned_size = aligned_size; epf_bar[bar].barno = bar; if (upper_32_bits(size) || epc_features->bar[bar].only_64bit) epf_bar[bar].flags |= PCI_BASE_ADDRESS_MEM_TYPE_64; diff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h index 2f65d00aee48d..18b5dc1f94d77 100644 --- a/include/linux/pci-epf.h +++ b/include/linux/pci-epf.h @@ -114,8 +114,6 @@ struct pci_epf_driver { * @phys_addr: physical address that should be mapped to the BAR * @addr: virtual address corresponding to the @phys_addr * @size: the size of the address space present in BAR - * @aligned_size: the size actually allocated to accommodate the iATU alignment - * requirement * @barno: BAR number * @flags: flags that are set for the BAR */ @@ -123,7 +121,6 @@ struct pci_epf_bar { dma_addr_t phys_addr; void *addr; size_t size; - size_t aligned_size; enum pci_barno barno; int flags; }; -- GitLab From 5f92e5fdd1489e189206252cd830f7ad4d8c3bf9 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 9 Jul 2025 09:56:29 +0000 Subject: [PATCH 1856/2211] Revert "Bluetooth: MGMT: Protect mgmt_pending list with its own lock" This reverts commit 4e83f2dbb2bf677e614109df24426c4dded472d4 which is commit 6fe26f694c824b8a4dbf50c635bee1302e3f099c upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: Ia71be8ae26f83011527d07fbbfdf9d6d282f23a4 Signed-off-by: Greg Kroah-Hartman --- include/net/bluetooth/hci_core.h | 1 - net/bluetooth/hci_core.c | 1 - net/bluetooth/mgmt.c | 101 ++++++++++++++++--------------- net/bluetooth/mgmt_util.c | 32 ++-------- net/bluetooth/mgmt_util.h | 4 +- 5 files changed, 59 insertions(+), 80 deletions(-) diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 1bdad615e7d03..4dd08ba13aa67 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -540,7 +540,6 @@ struct hci_dev { struct hci_conn_hash conn_hash; struct list_head mesh_pending; - struct mutex mgmt_pending_lock; struct list_head mgmt_pending; struct list_head reject_list; struct list_head accept_list; diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 38e4773989eec..fa6c00ad2dca7 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -2505,7 +2505,6 @@ struct hci_dev *hci_alloc_dev_priv(int sizeof_priv) mutex_init(&hdev->lock); mutex_init(&hdev->req_lock); - mutex_init(&hdev->mgmt_pending_lock); ida_init(&hdev->unset_handle_ida); diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 7664e7ba372ce..54210cfee6a34 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c @@ -1440,17 +1440,22 @@ static void settings_rsp(struct mgmt_pending_cmd *cmd, void *data) send_settings_rsp(cmd->sk, cmd->opcode, match->hdev); + list_del(&cmd->list); + if (match->sk == NULL) { match->sk = cmd->sk; sock_hold(match->sk); } + + mgmt_pending_free(cmd); } static void cmd_status_rsp(struct mgmt_pending_cmd *cmd, void *data) { u8 *status = data; - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, *status); + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, *status); + mgmt_pending_remove(cmd); } static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data) @@ -1464,6 +1469,8 @@ static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data) if (cmd->cmd_complete) { cmd->cmd_complete(cmd, match->mgmt_status); + mgmt_pending_remove(cmd); + return; } @@ -1472,13 +1479,13 @@ static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data) static int generic_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status) { - return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, + return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, cmd->param, cmd->param_len); } static int addr_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status) { - return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, + return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, cmd->param, sizeof(struct mgmt_addr_info)); } @@ -1518,7 +1525,7 @@ static void mgmt_set_discoverable_complete(struct hci_dev *hdev, void *data, if (err) { u8 mgmt_err = mgmt_status(err); - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); goto done; } @@ -1693,7 +1700,7 @@ static void mgmt_set_connectable_complete(struct hci_dev *hdev, void *data, if (err) { u8 mgmt_err = mgmt_status(err); - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); goto done; } @@ -1929,8 +1936,8 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err) new_settings(hdev, NULL); } - mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, true, - cmd_status_rsp, &mgmt_err); + mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp, + &mgmt_err); return; } @@ -1940,7 +1947,7 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err) changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED); } - mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, true, settings_rsp, &match); + mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match); if (changed) new_settings(hdev, match.sk); @@ -2060,12 +2067,12 @@ static void set_le_complete(struct hci_dev *hdev, void *data, int err) bt_dev_dbg(hdev, "err %d", err); if (status) { - mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, true, cmd_status_rsp, - &status); + mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp, + &status); return; } - mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, true, settings_rsp, &match); + mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match); new_settings(hdev, match.sk); @@ -2124,7 +2131,7 @@ static void set_mesh_complete(struct hci_dev *hdev, void *data, int err) struct sock *sk = cmd->sk; if (status) { - mgmt_pending_foreach(MGMT_OP_SET_MESH_RECEIVER, hdev, true, + mgmt_pending_foreach(MGMT_OP_SET_MESH_RECEIVER, hdev, cmd_status_rsp, &status); return; } @@ -2565,7 +2572,7 @@ static void mgmt_class_complete(struct hci_dev *hdev, void *data, int err) bt_dev_dbg(hdev, "err %d", err); - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), hdev->dev_class, 3); mgmt_pending_free(cmd); @@ -3353,7 +3360,7 @@ static int pairing_complete(struct mgmt_pending_cmd *cmd, u8 status) bacpy(&rp.addr.bdaddr, &conn->dst); rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type); - err = mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_PAIR_DEVICE, + err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status, &rp, sizeof(rp)); /* So we don't get further callbacks for this connection */ @@ -5243,7 +5250,7 @@ static void mgmt_add_adv_patterns_monitor_complete(struct hci_dev *hdev, hci_update_passive_scan(hdev); } - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(status), &rp, sizeof(rp)); mgmt_pending_remove(cmd); @@ -5458,7 +5465,7 @@ static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev, hci_update_passive_scan(hdev); } - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(status), &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -5857,7 +5864,7 @@ static void start_discovery_complete(struct hci_dev *hdev, void *data, int err) cmd != pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev)) return; - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err), + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), cmd->param, 1); mgmt_pending_remove(cmd); @@ -6095,7 +6102,7 @@ static void stop_discovery_complete(struct hci_dev *hdev, void *data, int err) bt_dev_dbg(hdev, "err %d", err); - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err), + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), cmd->param, 1); mgmt_pending_remove(cmd); @@ -6320,7 +6327,7 @@ static void set_advertising_complete(struct hci_dev *hdev, void *data, int err) u8 status = mgmt_status(err); if (status) { - mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, true, + mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, cmd_status_rsp, &status); return; } @@ -6330,7 +6337,7 @@ static void set_advertising_complete(struct hci_dev *hdev, void *data, int err) else hci_dev_clear_flag(hdev, HCI_ADVERTISING); - mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, true, settings_rsp, + mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp, &match); new_settings(hdev, match.sk); @@ -6674,7 +6681,7 @@ static void set_bredr_complete(struct hci_dev *hdev, void *data, int err) */ hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED); - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); } else { send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev); new_settings(hdev, cmd->sk); @@ -6811,7 +6818,7 @@ static void set_secure_conn_complete(struct hci_dev *hdev, void *data, int err) if (err) { u8 mgmt_err = mgmt_status(err); - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); goto done; } @@ -7258,7 +7265,7 @@ static void get_conn_info_complete(struct hci_dev *hdev, void *data, int err) rp.max_tx_power = HCI_TX_POWER_INVALID; } - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_GET_CONN_INFO, status, + mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_GET_CONN_INFO, status, &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -7418,7 +7425,7 @@ static void get_clock_info_complete(struct hci_dev *hdev, void *data, int err) } complete: - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, &rp, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -8668,10 +8675,10 @@ static void add_advertising_complete(struct hci_dev *hdev, void *data, int err) rp.instance = cp->instance; if (err) - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err)); else - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), &rp, sizeof(rp)); add_adv_complete(hdev, cmd->sk, cp->instance, err); @@ -8859,10 +8866,10 @@ static void add_ext_adv_params_complete(struct hci_dev *hdev, void *data, hci_remove_adv_instance(hdev, cp->instance); - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err)); } else { - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), &rp, sizeof(rp)); } @@ -9009,10 +9016,10 @@ static void add_ext_adv_data_complete(struct hci_dev *hdev, void *data, int err) rp.instance = cp->instance; if (err) - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err)); else - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err), &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -9171,10 +9178,10 @@ static void remove_advertising_complete(struct hci_dev *hdev, void *data, rp.instance = cp->instance; if (err) - mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err)); else - mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, + mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, MGMT_STATUS_SUCCESS, &rp, sizeof(rp)); mgmt_pending_free(cmd); @@ -9445,7 +9452,7 @@ void mgmt_index_removed(struct hci_dev *hdev) if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) return; - mgmt_pending_foreach(0, hdev, true, cmd_complete_rsp, &match); + mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &match); if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev, NULL, 0, @@ -9483,8 +9490,7 @@ void mgmt_power_on(struct hci_dev *hdev, int err) hci_update_passive_scan(hdev); } - mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, true, settings_rsp, - &match); + mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match); new_settings(hdev, match.sk); @@ -9499,8 +9505,7 @@ void __mgmt_power_off(struct hci_dev *hdev) struct cmd_lookup match = { NULL, hdev }; u8 zero_cod[] = { 0, 0, 0 }; - mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, true, settings_rsp, - &match); + mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match); /* If the power off is because of hdev unregistration let * use the appropriate INVALID_INDEX status. Otherwise use @@ -9514,7 +9519,7 @@ void __mgmt_power_off(struct hci_dev *hdev) else match.mgmt_status = MGMT_STATUS_NOT_POWERED; - mgmt_pending_foreach(0, hdev, true, cmd_complete_rsp, &match); + mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &match); if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) { mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, @@ -9755,6 +9760,7 @@ static void unpair_device_rsp(struct mgmt_pending_cmd *cmd, void *data) device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk); cmd->cmd_complete(cmd, 0); + mgmt_pending_remove(cmd); } bool mgmt_powering_down(struct hci_dev *hdev) @@ -9810,8 +9816,8 @@ void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, struct mgmt_cp_disconnect *cp; struct mgmt_pending_cmd *cmd; - mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, true, - unpair_device_rsp, hdev); + mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp, + hdev); cmd = pending_find(MGMT_OP_DISCONNECT, hdev); if (!cmd) @@ -10004,7 +10010,7 @@ void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status) if (status) { u8 mgmt_err = mgmt_status(status); - mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, true, + mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, cmd_status_rsp, &mgmt_err); return; } @@ -10014,8 +10020,8 @@ void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status) else changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY); - mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, true, - settings_rsp, &match); + mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp, + &match); if (changed) new_settings(hdev, match.sk); @@ -10039,12 +10045,9 @@ void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, { struct cmd_lookup match = { NULL, hdev, mgmt_status(status) }; - mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, false, sk_lookup, - &match); - mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, false, sk_lookup, - &match); - mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, false, sk_lookup, - &match); + mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match); + mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match); + mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match); if (!status) { mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class, diff --git a/net/bluetooth/mgmt_util.c b/net/bluetooth/mgmt_util.c index a88a07da39473..3713ff490c65d 100644 --- a/net/bluetooth/mgmt_util.c +++ b/net/bluetooth/mgmt_util.c @@ -217,47 +217,30 @@ int mgmt_cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status, struct mgmt_pending_cmd *mgmt_pending_find(unsigned short channel, u16 opcode, struct hci_dev *hdev) { - struct mgmt_pending_cmd *cmd, *tmp; - - mutex_lock(&hdev->mgmt_pending_lock); + struct mgmt_pending_cmd *cmd; - list_for_each_entry_safe(cmd, tmp, &hdev->mgmt_pending, list) { + list_for_each_entry(cmd, &hdev->mgmt_pending, list) { if (hci_sock_get_channel(cmd->sk) != channel) continue; - - if (cmd->opcode == opcode) { - mutex_unlock(&hdev->mgmt_pending_lock); + if (cmd->opcode == opcode) return cmd; - } } - mutex_unlock(&hdev->mgmt_pending_lock); - return NULL; } -void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, bool remove, +void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, void (*cb)(struct mgmt_pending_cmd *cmd, void *data), void *data) { struct mgmt_pending_cmd *cmd, *tmp; - mutex_lock(&hdev->mgmt_pending_lock); - list_for_each_entry_safe(cmd, tmp, &hdev->mgmt_pending, list) { if (opcode > 0 && cmd->opcode != opcode) continue; - if (remove) - list_del(&cmd->list); - cb(cmd, data); - - if (remove) - mgmt_pending_free(cmd); } - - mutex_unlock(&hdev->mgmt_pending_lock); } struct mgmt_pending_cmd *mgmt_pending_new(struct sock *sk, u16 opcode, @@ -271,7 +254,7 @@ struct mgmt_pending_cmd *mgmt_pending_new(struct sock *sk, u16 opcode, return NULL; cmd->opcode = opcode; - cmd->hdev = hdev; + cmd->index = hdev->id; cmd->param = kmemdup(data, len, GFP_KERNEL); if (!cmd->param) { @@ -297,9 +280,7 @@ struct mgmt_pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode, if (!cmd) return NULL; - mutex_lock(&hdev->mgmt_pending_lock); list_add_tail(&cmd->list, &hdev->mgmt_pending); - mutex_unlock(&hdev->mgmt_pending_lock); return cmd; } @@ -313,10 +294,7 @@ void mgmt_pending_free(struct mgmt_pending_cmd *cmd) void mgmt_pending_remove(struct mgmt_pending_cmd *cmd) { - mutex_lock(&cmd->hdev->mgmt_pending_lock); list_del(&cmd->list); - mutex_unlock(&cmd->hdev->mgmt_pending_lock); - mgmt_pending_free(cmd); } diff --git a/net/bluetooth/mgmt_util.h b/net/bluetooth/mgmt_util.h index 024e51dd69375..f2ba994ab1d84 100644 --- a/net/bluetooth/mgmt_util.h +++ b/net/bluetooth/mgmt_util.h @@ -33,7 +33,7 @@ struct mgmt_mesh_tx { struct mgmt_pending_cmd { struct list_head list; u16 opcode; - struct hci_dev *hdev; + int index; void *param; size_t param_len; struct sock *sk; @@ -54,7 +54,7 @@ int mgmt_cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status, struct mgmt_pending_cmd *mgmt_pending_find(unsigned short channel, u16 opcode, struct hci_dev *hdev); -void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, bool remove, +void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev, void (*cb)(struct mgmt_pending_cmd *cmd, void *data), void *data); struct mgmt_pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode, -- GitLab From 669e6c723b3213ea1a2b4a4d21f6ba052f846921 Mon Sep 17 00:00:00 2001 From: Hugo Villeneuve Date: Thu, 29 May 2025 16:29:22 -0400 Subject: [PATCH 1857/2211] rtc: pcf2127: add missing semicolon after statement commit 08d82d0cad51c2b1d454fe41ea1ff96ade676961 upstream. Replace comma with semicolon at the end of the statement when setting config.max_register. Fixes: fd28ceb4603f ("rtc: pcf2127: add variant-specific configuration structure") Cc: stable@vger.kernel.org Cc: Elena Popa Signed-off-by: Hugo Villeneuve Link: https://lore.kernel.org/r/20250529202923.1552560-1-hugo@hugovil.com Signed-off-by: Alexandre Belloni Signed-off-by: Greg Kroah-Hartman --- drivers/rtc/rtc-pcf2127.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c index 9c04c4e1a49c3..b8cb09a82ea93 100644 --- a/drivers/rtc/rtc-pcf2127.c +++ b/drivers/rtc/rtc-pcf2127.c @@ -1456,7 +1456,7 @@ static int pcf2127_spi_probe(struct spi_device *spi) variant = &pcf21xx_cfg[type]; } - config.max_register = variant->max_register, + config.max_register = variant->max_register; regmap = devm_regmap_init_spi(spi, &config); if (IS_ERR(regmap)) { -- GitLab From ee61aec8529efb8b50260ce731ddaf831bc11d4a Mon Sep 17 00:00:00 2001 From: Elena Popa Date: Fri, 30 May 2025 13:40:00 +0300 Subject: [PATCH 1858/2211] rtc: pcf2127: fix SPI command byte for PCF2131 commit fa78e9b606a472495ef5b6b3d8b45c37f7727f9d upstream. PCF2131 was not responding to read/write operations using SPI. PCF2131 has a different command byte definition, compared to PCF2127/29. Added the new command byte definition when PCF2131 is detected. Fixes: afc505bf9039 ("rtc: pcf2127: add support for PCF2131 RTC") Cc: stable@vger.kernel.org Signed-off-by: Elena Popa Acked-by: Hugo Villeneuve Link: https://lore.kernel.org/r/20250530104001.957977-1-elena.popa@nxp.com Signed-off-by: Alexandre Belloni Signed-off-by: Greg Kroah-Hartman --- drivers/rtc/rtc-pcf2127.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c index b8cb09a82ea93..fc079b9dcf719 100644 --- a/drivers/rtc/rtc-pcf2127.c +++ b/drivers/rtc/rtc-pcf2127.c @@ -1383,6 +1383,11 @@ static int pcf2127_i2c_probe(struct i2c_client *client) variant = &pcf21xx_cfg[type]; } + if (variant->type == PCF2131) { + config.read_flag_mask = 0x0; + config.write_flag_mask = 0x0; + } + config.max_register = variant->max_register, regmap = devm_regmap_init(&client->dev, &pcf2127_i2c_regmap, -- GitLab From bd6c1932ac9c28a4a1aca2c355ebfab3d239d04f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Jo=C5=84czyk?= Date: Sat, 7 Jun 2025 23:06:08 +0200 Subject: [PATCH 1859/2211] rtc: cmos: use spin_lock_irqsave in cmos_interrupt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 00a39d8652ff9088de07a6fe6e9e1893452fe0dd upstream. cmos_interrupt() can be called in a non-interrupt context, such as in an ACPI event handler (which runs in an interrupt thread). Therefore, usage of spin_lock(&rtc_lock) is insecure. Use spin_lock_irqsave() / spin_unlock_irqrestore() instead. Before a misguided commit 6950d046eb6e ("rtc: cmos: Replace spin_lock_irqsave with spin_lock in hard IRQ") the cmos_interrupt() function used spin_lock_irqsave(). That commit changed it to spin_lock() and broke locking, which was partially fixed in commit 13be2efc390a ("rtc: cmos: Disable irq around direct invocation of cmos_interrupt()") That second commit did not take account of the ACPI fixed event handler pathway, however. It introduced local_irq_disable() workarounds in cmos_check_wkalrm(), which can cause problems on PREEMPT_RT kernels and are now unnecessary. Add an explicit comment so that this change will not be reverted by mistake. Cc: stable@vger.kernel.org Fixes: 6950d046eb6e ("rtc: cmos: Replace spin_lock_irqsave with spin_lock in hard IRQ") Signed-off-by: Mateusz Jończyk Reviewed-by: Sebastian Andrzej Siewior Tested-by: Chris Bainbridge Reported-by: Chris Bainbridge Closes: https://lore.kernel.org/all/aDtJ92foPUYmGheF@debian.local/ Link: https://lore.kernel.org/r/20250607210608.14835-1-mat.jonczyk@o2.pl Signed-off-by: Alexandre Belloni Signed-off-by: Greg Kroah-Hartman --- drivers/rtc/rtc-cmos.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 5849d2970bba4..095de4e0e4f38 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -697,8 +697,12 @@ static irqreturn_t cmos_interrupt(int irq, void *p) { u8 irqstat; u8 rtc_control; + unsigned long flags; - spin_lock(&rtc_lock); + /* We cannot use spin_lock() here, as cmos_interrupt() is also called + * in a non-irq context. + */ + spin_lock_irqsave(&rtc_lock, flags); /* When the HPET interrupt handler calls us, the interrupt * status is passed as arg1 instead of the irq number. But @@ -732,7 +736,7 @@ static irqreturn_t cmos_interrupt(int irq, void *p) hpet_mask_rtc_irq_bit(RTC_AIE); CMOS_READ(RTC_INTR_FLAGS); } - spin_unlock(&rtc_lock); + spin_unlock_irqrestore(&rtc_lock, flags); if (is_intr(irqstat)) { rtc_update_irq(p, 1, irqstat); @@ -1300,9 +1304,7 @@ static void cmos_check_wkalrm(struct device *dev) * ACK the rtc irq here */ if (t_now >= cmos->alarm_expires && cmos_use_acpi_alarm()) { - local_irq_disable(); cmos_interrupt(0, (void *)cmos->rtc); - local_irq_enable(); return; } -- GitLab From 892f6ed9a4a38bb3360fdff091b9241cfa105b61 Mon Sep 17 00:00:00 2001 From: Bui Quang Minh Date: Mon, 30 Jun 2025 22:13:14 +0700 Subject: [PATCH 1860/2211] virtio-net: xsk: rx: fix the frame's length check commit 5177373c31318c3c6a190383bfd232e6cf565c36 upstream. When calling buf_to_xdp, the len argument is the frame data's length without virtio header's length (vi->hdr_len). We check that len with xsk_pool_get_rx_frame_size() + vi->hdr_len to ensure the provided len does not larger than the allocated chunk size. The additional vi->hdr_len is because in virtnet_add_recvbuf_xsk, we use part of XDP_PACKET_HEADROOM for virtio header and ask the vhost to start placing data from hard_start + XDP_PACKET_HEADROOM - vi->hdr_len not hard_start + XDP_PACKET_HEADROOM But the first buffer has virtio_header, so the maximum frame's length in the first buffer can only be xsk_pool_get_rx_frame_size() not xsk_pool_get_rx_frame_size() + vi->hdr_len like in the current check. This commit adds an additional argument to buf_to_xdp differentiate between the first buffer and other ones to correctly calculate the maximum frame's length. Cc: stable@vger.kernel.org Reviewed-by: Xuan Zhuo Fixes: a4e7ba702701 ("virtio_net: xsk: rx: support recv small mode") Signed-off-by: Bui Quang Minh Link: https://patch.msgid.link/20250630151315.86722-2-minhquangbui99@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Greg Kroah-Hartman --- drivers/net/virtio_net.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 6d36cb204f9bc..1389bc2680a02 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -1098,15 +1098,29 @@ static void sg_fill_dma(struct scatterlist *sg, dma_addr_t addr, u32 len) sg->length = len; } +/* Note that @len is the length of received data without virtio header */ static struct xdp_buff *buf_to_xdp(struct virtnet_info *vi, - struct receive_queue *rq, void *buf, u32 len) + struct receive_queue *rq, void *buf, + u32 len, bool first_buf) { struct xdp_buff *xdp; u32 bufsize; xdp = (struct xdp_buff *)buf; - bufsize = xsk_pool_get_rx_frame_size(rq->xsk_pool) + vi->hdr_len; + /* In virtnet_add_recvbuf_xsk, we use part of XDP_PACKET_HEADROOM for + * virtio header and ask the vhost to fill data from + * hard_start + XDP_PACKET_HEADROOM - vi->hdr_len + * The first buffer has virtio header so the remaining region for frame + * data is + * xsk_pool_get_rx_frame_size() + * While other buffers than the first one do not have virtio header, so + * the maximum frame data's length can be + * xsk_pool_get_rx_frame_size() + vi->hdr_len + */ + bufsize = xsk_pool_get_rx_frame_size(rq->xsk_pool); + if (!first_buf) + bufsize += vi->hdr_len; if (unlikely(len > bufsize)) { pr_debug("%s: rx error: len %u exceeds truesize %u\n", @@ -1231,7 +1245,7 @@ static int xsk_append_merge_buffer(struct virtnet_info *vi, u64_stats_add(&stats->bytes, len); - xdp = buf_to_xdp(vi, rq, buf, len); + xdp = buf_to_xdp(vi, rq, buf, len, false); if (!xdp) goto err; @@ -1329,7 +1343,7 @@ static void virtnet_receive_xsk_buf(struct virtnet_info *vi, struct receive_queu u64_stats_add(&stats->bytes, len); - xdp = buf_to_xdp(vi, rq, buf, len); + xdp = buf_to_xdp(vi, rq, buf, len, true); if (!xdp) return; -- GitLab From bc68bc3563344ccdc57d1961457cdeecab8f81ef Mon Sep 17 00:00:00 2001 From: Bui Quang Minh Date: Mon, 30 Jun 2025 21:42:10 +0700 Subject: [PATCH 1861/2211] virtio-net: ensure the received length does not exceed allocated size commit 315dbdd7cdf6aa533829774caaf4d25f1fd20e73 upstream. In xdp_linearize_page, when reading the following buffers from the ring, we forget to check the received length with the true allocate size. This can lead to an out-of-bound read. This commit adds that missing check. Cc: Fixes: 4941d472bf95 ("virtio-net: do not reset during XDP set") Signed-off-by: Bui Quang Minh Acked-by: Jason Wang Link: https://patch.msgid.link/20250630144212.48471-2-minhquangbui99@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Greg Kroah-Hartman --- drivers/net/virtio_net.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 1389bc2680a02..54c5d9a14c672 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -765,6 +765,26 @@ static unsigned int mergeable_ctx_to_truesize(void *mrg_ctx) return (unsigned long)mrg_ctx & ((1 << MRG_CTX_HEADER_SHIFT) - 1); } +static int check_mergeable_len(struct net_device *dev, void *mrg_ctx, + unsigned int len) +{ + unsigned int headroom, tailroom, room, truesize; + + truesize = mergeable_ctx_to_truesize(mrg_ctx); + headroom = mergeable_ctx_to_headroom(mrg_ctx); + tailroom = headroom ? sizeof(struct skb_shared_info) : 0; + room = SKB_DATA_ALIGN(headroom + tailroom); + + if (len > truesize - room) { + pr_debug("%s: rx error: len %u exceeds truesize %lu\n", + dev->name, len, (unsigned long)(truesize - room)); + DEV_STATS_INC(dev, rx_length_errors); + return -1; + } + + return 0; +} + static struct sk_buff *virtnet_build_skb(void *buf, unsigned int buflen, unsigned int headroom, unsigned int len) @@ -1663,7 +1683,8 @@ static unsigned int virtnet_get_headroom(struct virtnet_info *vi) * across multiple buffers (num_buf > 1), and we make sure buffers * have enough headroom. */ -static struct page *xdp_linearize_page(struct receive_queue *rq, +static struct page *xdp_linearize_page(struct net_device *dev, + struct receive_queue *rq, int *num_buf, struct page *p, int offset, @@ -1683,18 +1704,27 @@ static struct page *xdp_linearize_page(struct receive_queue *rq, memcpy(page_address(page) + page_off, page_address(p) + offset, *len); page_off += *len; + /* Only mergeable mode can go inside this while loop. In small mode, + * *num_buf == 1, so it cannot go inside. + */ while (--*num_buf) { unsigned int buflen; void *buf; + void *ctx; int off; - buf = virtnet_rq_get_buf(rq, &buflen, NULL); + buf = virtnet_rq_get_buf(rq, &buflen, &ctx); if (unlikely(!buf)) goto err_buf; p = virt_to_head_page(buf); off = buf - page_address(p); + if (check_mergeable_len(dev, ctx, buflen)) { + put_page(p); + goto err_buf; + } + /* guard against a misconfigured or uncooperative backend that * is sending packet larger than the MTU. */ @@ -1783,7 +1813,7 @@ static struct sk_buff *receive_small_xdp(struct net_device *dev, headroom = vi->hdr_len + header_offset; buflen = SKB_DATA_ALIGN(GOOD_PACKET_LEN + headroom) + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); - xdp_page = xdp_linearize_page(rq, &num_buf, page, + xdp_page = xdp_linearize_page(dev, rq, &num_buf, page, offset, header_offset, &tlen); if (!xdp_page) @@ -2118,7 +2148,7 @@ static void *mergeable_xdp_get_buf(struct virtnet_info *vi, */ if (!xdp_prog->aux->xdp_has_frags) { /* linearize data for XDP */ - xdp_page = xdp_linearize_page(rq, num_buf, + xdp_page = xdp_linearize_page(vi->dev, rq, num_buf, *page, offset, XDP_PACKET_HEADROOM, len); -- GitLab From 2640c230aac454a23fed17a5e72a5f9216ddd955 Mon Sep 17 00:00:00 2001 From: Niklas Schnelle Date: Wed, 25 Jun 2025 11:28:28 +0200 Subject: [PATCH 1862/2211] s390/pci: Fix stale function handles in error handling commit 45537926dd2aaa9190ac0fac5a0fbeefcadfea95 upstream. The error event information for PCI error events contains a function handle for the respective function. This handle is generally captured at the time the error event was recorded. Due to delays in processing or cascading issues, it may happen that during firmware recovery multiple events are generated. When processing these events in order Linux may already have recovered an affected function making the event information stale. Fix this by doing an unconditional CLP List PCI function retrieving the current function handle with the zdev->state_lock held and ignoring the event if its function handle is stale. Cc: stable@vger.kernel.org Fixes: 4cdf2f4e24ff ("s390/pci: implement minimal PCI error recovery") Reviewed-by: Julian Ruess Reviewed-by: Gerd Bayer Reviewed-by: Farhan Ali Signed-off-by: Niklas Schnelle Signed-off-by: Alexander Gordeev Signed-off-by: Greg Kroah-Hartman --- arch/s390/pci/pci_event.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/arch/s390/pci/pci_event.c b/arch/s390/pci/pci_event.c index 6f48a1073c6e8..9432fd407db62 100644 --- a/arch/s390/pci/pci_event.c +++ b/arch/s390/pci/pci_event.c @@ -260,6 +260,8 @@ static void __zpci_event_error(struct zpci_ccdf_err *ccdf) struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid); struct pci_dev *pdev = NULL; pci_ers_result_t ers_res; + u32 fh = 0; + int rc; zpci_dbg(3, "err fid:%x, fh:%x, pec:%x\n", ccdf->fid, ccdf->fh, ccdf->pec); @@ -268,6 +270,15 @@ static void __zpci_event_error(struct zpci_ccdf_err *ccdf) if (zdev) { mutex_lock(&zdev->state_lock); + rc = clp_refresh_fh(zdev->fid, &fh); + if (rc) + goto no_pdev; + if (!fh || ccdf->fh != fh) { + /* Ignore events with stale handles */ + zpci_dbg(3, "err fid:%x, fh:%x (stale %x)\n", + ccdf->fid, fh, ccdf->fh); + goto no_pdev; + } zpci_update_fh(zdev, ccdf->fh); if (zdev->zbus->bus) pdev = pci_get_slot(zdev->zbus->bus, zdev->devfn); -- GitLab From a54280b0eb9988d1cbf4e186fe334ace221ddf2c Mon Sep 17 00:00:00 2001 From: Niklas Schnelle Date: Wed, 25 Jun 2025 11:28:29 +0200 Subject: [PATCH 1863/2211] s390/pci: Do not try re-enabling load/store if device is disabled commit b97a7972b1f4f81417840b9a2ab0c19722b577d5 upstream. If a device is disabled unblocking load/store on its own is not useful as a full re-enable of the function is necessary anyway. Note that SCLP Write Event Data Action Qualifier 0 (Reset) leaves the device disabled and triggers this case unless the driver already requests a reset. Cc: stable@vger.kernel.org Fixes: 4cdf2f4e24ff ("s390/pci: implement minimal PCI error recovery") Reviewed-by: Farhan Ali Signed-off-by: Niklas Schnelle Signed-off-by: Alexander Gordeev Signed-off-by: Greg Kroah-Hartman --- arch/s390/pci/pci_event.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/s390/pci/pci_event.c b/arch/s390/pci/pci_event.c index 9432fd407db62..ef44feb1a9daa 100644 --- a/arch/s390/pci/pci_event.c +++ b/arch/s390/pci/pci_event.c @@ -105,6 +105,10 @@ static pci_ers_result_t zpci_event_do_error_state_clear(struct pci_dev *pdev, struct zpci_dev *zdev = to_zpci(pdev); int rc; + /* The underlying device may have been disabled by the event */ + if (!zdev_enabled(zdev)) + return PCI_ERS_RESULT_NEED_RESET; + pr_info("%s: Unblocking device access for examination\n", pci_name(pdev)); rc = zpci_reset_load_store_blocked(zdev); if (rc) { -- GitLab From e036b72d6a16dcb8c7a32041e41405e11de10cca Mon Sep 17 00:00:00 2001 From: Jiawen Wu Date: Tue, 1 Jul 2025 14:30:28 +0800 Subject: [PATCH 1864/2211] net: txgbe: request MISC IRQ in ndo_open commit cc9f7f65cd2f31150b10e6956f1f0882e1bbae49 upstream. Move the creating of irq_domain for MISC IRQ from .probe to .ndo_open, and free it in .ndo_stop, to maintain consistency with the queue IRQs. This it for subsequent adjustments to the IRQ vectors. Fixes: aefd013624a1 ("net: txgbe: use irq_domain for interrupt controller") Cc: stable@vger.kernel.org Signed-off-by: Jiawen Wu Reviewed-by: Michal Swiatkowski Link: https://patch.msgid.link/20250701063030.59340-2-jiawenwu@trustnetic.com Signed-off-by: Paolo Abeni Signed-off-by: Greg Kroah-Hartman --- .../net/ethernet/wangxun/txgbe/txgbe_irq.c | 2 +- .../net/ethernet/wangxun/txgbe/txgbe_main.c | 22 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c index 0ee73a265545c..c698f4ec751a2 100644 --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c @@ -68,7 +68,6 @@ free_queue_irqs: free_irq(wx->msix_q_entries[vector].vector, wx->q_vector[vector]); } - wx_reset_interrupt_capability(wx); return err; } @@ -169,6 +168,7 @@ void txgbe_free_misc_irq(struct txgbe *txgbe) free_irq(txgbe->link_irq, txgbe); free_irq(txgbe->misc.irq, txgbe); txgbe_del_irq_domain(txgbe); + txgbe->wx->misc_irq_domain = false; } int txgbe_setup_misc_irq(struct txgbe *txgbe) diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c index 7e352837184fa..9ede260b85dcb 100644 --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c @@ -308,10 +308,14 @@ static int txgbe_open(struct net_device *netdev) wx_configure(wx); - err = txgbe_request_queue_irqs(wx); + err = txgbe_setup_misc_irq(wx->priv); if (err) goto err_free_resources; + err = txgbe_request_queue_irqs(wx); + if (err) + goto err_free_misc_irq; + /* Notify the stack of the actual queue counts. */ err = netif_set_real_num_tx_queues(netdev, wx->num_tx_queues); if (err) @@ -327,6 +331,9 @@ static int txgbe_open(struct net_device *netdev) err_free_irq: wx_free_irq(wx); +err_free_misc_irq: + txgbe_free_misc_irq(wx->priv); + wx_reset_interrupt_capability(wx); err_free_resources: wx_free_resources(wx); err_reset: @@ -365,6 +372,7 @@ static int txgbe_close(struct net_device *netdev) txgbe_down(wx); wx_free_irq(wx); + txgbe_free_misc_irq(wx->priv); wx_free_resources(wx); txgbe_fdir_filter_exit(wx); wx_control_hw(wx, false); @@ -410,7 +418,6 @@ static void txgbe_shutdown(struct pci_dev *pdev) int txgbe_setup_tc(struct net_device *dev, u8 tc) { struct wx *wx = netdev_priv(dev); - struct txgbe *txgbe = wx->priv; /* Hardware has to reinitialize queues and interrupts to * match packet buffer alignment. Unfortunately, the @@ -421,7 +428,6 @@ int txgbe_setup_tc(struct net_device *dev, u8 tc) else txgbe_reset(wx); - txgbe_free_misc_irq(txgbe); wx_clear_interrupt_scheme(wx); if (tc) @@ -430,7 +436,6 @@ int txgbe_setup_tc(struct net_device *dev, u8 tc) netdev_reset_tc(dev); wx_init_interrupt_scheme(wx); - txgbe_setup_misc_irq(txgbe); if (netif_running(dev)) txgbe_open(dev); @@ -677,13 +682,9 @@ static int txgbe_probe(struct pci_dev *pdev, txgbe_init_fdir(txgbe); - err = txgbe_setup_misc_irq(txgbe); - if (err) - goto err_release_hw; - err = txgbe_init_phy(txgbe); if (err) - goto err_free_misc_irq; + goto err_release_hw; err = register_netdev(netdev); if (err) @@ -711,8 +712,6 @@ static int txgbe_probe(struct pci_dev *pdev, err_remove_phy: txgbe_remove_phy(txgbe); -err_free_misc_irq: - txgbe_free_misc_irq(txgbe); err_release_hw: wx_clear_interrupt_scheme(wx); wx_control_hw(wx, false); @@ -746,7 +745,6 @@ static void txgbe_remove(struct pci_dev *pdev) unregister_netdev(netdev); txgbe_remove_phy(txgbe); - txgbe_free_misc_irq(txgbe); wx_free_isb_resources(wx); pci_release_selected_regions(pdev, -- GitLab From 75705b44e0b9aaa74f4c163d93d388bcba9e386a Mon Sep 17 00:00:00 2001 From: HarshaVardhana S A Date: Tue, 1 Jul 2025 14:22:54 +0200 Subject: [PATCH 1865/2211] vsock/vmci: Clear the vmci transport packet properly when initializing it commit 223e2288f4b8c262a864e2c03964ffac91744cd5 upstream. In vmci_transport_packet_init memset the vmci_transport_packet before populating the fields to avoid any uninitialised data being left in the structure. Cc: Bryan Tan Cc: Vishnu Dasa Cc: Broadcom internal kernel review list Cc: Stefano Garzarella Cc: "David S. Miller" Cc: Eric Dumazet Cc: Jakub Kicinski Cc: Paolo Abeni Cc: Simon Horman Cc: virtualization@lists.linux.dev Cc: netdev@vger.kernel.org Cc: stable Signed-off-by: HarshaVardhana S A Signed-off-by: Greg Kroah-Hartman Fixes: d021c344051a ("VSOCK: Introduce VM Sockets") Acked-by: Stefano Garzarella Link: https://patch.msgid.link/20250701122254.2397440-1-gregkh@linuxfoundation.org Signed-off-by: Paolo Abeni Signed-off-by: Greg Kroah-Hartman --- net/vmw_vsock/vmci_transport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c index b370070194fa4..7eccd6708d664 100644 --- a/net/vmw_vsock/vmci_transport.c +++ b/net/vmw_vsock/vmci_transport.c @@ -119,6 +119,8 @@ vmci_transport_packet_init(struct vmci_transport_packet *pkt, u16 proto, struct vmci_handle handle) { + memset(pkt, 0, sizeof(*pkt)); + /* We register the stream control handler as an any cid handle so we * must always send from a source address of VMADDR_CID_ANY */ @@ -131,8 +133,6 @@ vmci_transport_packet_init(struct vmci_transport_packet *pkt, pkt->type = type; pkt->src_port = src->svm_port; pkt->dst_port = dst->svm_port; - memset(&pkt->proto, 0, sizeof(pkt->proto)); - memset(&pkt->_reserved2, 0, sizeof(pkt->_reserved2)); switch (pkt->type) { case VMCI_TRANSPORT_PACKET_TYPE_INVALID: -- GitLab From 9546118ba789ed141db3545fd78ae5faaec1dfae Mon Sep 17 00:00:00 2001 From: Jiawen Wu Date: Tue, 1 Jul 2025 15:06:25 +0800 Subject: [PATCH 1866/2211] net: libwx: fix the incorrect display of the queue number commit 5186ff7e1d0e26aaef998ba18b31c79c28d1441f upstream. When setting "ethtool -L eth0 combined 1", the number of RX/TX queue is changed to be 1. RSS is disabled at this moment, and the indices of FDIR have not be changed in wx_set_rss_queues(). So the combined count still shows the previous value. This issue was introduced when supporting FDIR. Fix it for those devices that support FDIR. Fixes: 34744a7749b3 ("net: txgbe: add FDIR info to ethtool ops") Cc: stable@vger.kernel.org Signed-off-by: Jiawen Wu Reviewed-by: Simon Horman Link: https://patch.msgid.link/A5C8FE56D6C04608+20250701070625.73680-1-jiawenwu@trustnetic.com Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/wangxun/libwx/wx_lib.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.c b/drivers/net/ethernet/wangxun/libwx/wx_lib.c index d8a6fea961c02..ea2123ea6e387 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c +++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c @@ -1585,6 +1585,7 @@ static void wx_set_rss_queues(struct wx *wx) clear_bit(WX_FLAG_FDIR_HASH, wx->flags); + wx->ring_feature[RING_F_FDIR].indices = 1; /* Use Flow Director in addition to RSS to ensure the best * distribution of flows across cores, even when an FDIR flow * isn't matched. -- GitLab From cf7235914dc4f6fb1bc4dead4431f96954a6f426 Mon Sep 17 00:00:00 2001 From: Victor Shih Date: Fri, 6 Jun 2025 19:01:20 +0800 Subject: [PATCH 1867/2211] mmc: sdhci: Add a helper function for dump register in dynamic debug mode commit 2881ba9af073faa8ee7408a8d1e0575e50eb3f6c upstream. Add a helper function for dump register in dynamic debug mode. Signed-off-by: Victor Shih Acked-by: Adrian Hunter Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20250606110121.96314-3-victorshihgli@gmail.com Signed-off-by: Ulf Hansson Signed-off-by: Greg Kroah-Hartman --- drivers/mmc/host/sdhci.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index f531b617f28d7..da1b0a46b1d9c 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -825,4 +825,20 @@ void sdhci_switch_external_dma(struct sdhci_host *host, bool en); void sdhci_set_data_timeout_irq(struct sdhci_host *host, bool enable); void __sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd); +#if defined(CONFIG_DYNAMIC_DEBUG) || \ + (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE)) +#define SDHCI_DBG_ANYWAY 0 +#elif defined(DEBUG) +#define SDHCI_DBG_ANYWAY 1 +#else +#define SDHCI_DBG_ANYWAY 0 +#endif + +#define sdhci_dbg_dumpregs(host, fmt) \ +do { \ + DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \ + if (DYNAMIC_DEBUG_BRANCH(descriptor) || SDHCI_DBG_ANYWAY) \ + sdhci_dumpregs(host); \ +} while (0) + #endif /* __SDHCI_HW_H */ -- GitLab From ec9be081c5779bd7ded6c28e8cd036275689e7cf Mon Sep 17 00:00:00 2001 From: Ulf Hansson Date: Tue, 24 Jun 2025 13:09:32 +0200 Subject: [PATCH 1868/2211] Revert "mmc: sdhci: Disable SD card clock before changing parameters" commit dcc3bcfc5b50c625b475dcc25d167b6b947a6637 upstream. It has turned out the trying to strictly conform to the SDHCI specification is causing problems. Let's revert and start over. This reverts commit fb3bbc46c94f261b6156ee863c1b06c84cf157dc. Cc: Erick Shepherd Cc: stable@vger.kernel.org Fixes: fb3bbc46c94f ("mmc: sdhci: Disable SD card clock before changing parameters") Suggested-by: Adrian Hunter Reported-by: Jonathan Liu Reported-by: Salvatore Bonaccorso Closes: https://bugs.debian.org/1108065 Acked-by: Adrian Hunter Signed-off-by: Ulf Hansson Link: https://lore.kernel.org/r/20250624110932.176925-1-ulf.hansson@linaro.org Signed-off-by: Greg Kroah-Hartman --- drivers/mmc/host/sdhci.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 8ae76300d157d..4b91c9e966357 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -2035,15 +2035,10 @@ void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) host->mmc->actual_clock = 0; - clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); - if (clk & SDHCI_CLOCK_CARD_EN) - sdhci_writew(host, clk & ~SDHCI_CLOCK_CARD_EN, - SDHCI_CLOCK_CONTROL); + sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL); - if (clock == 0) { - sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL); + if (clock == 0) return; - } clk = sdhci_calc_clk(host, clock, &host->mmc->actual_clock); sdhci_enable_clk(host, clk); -- GitLab From 50345c93698eea674fe4741ed8e4bfd14c3b24d8 Mon Sep 17 00:00:00 2001 From: Avri Altman Date: Mon, 26 May 2025 14:44:45 +0300 Subject: [PATCH 1869/2211] mmc: core: sd: Apply BROKEN_SD_DISCARD quirk earlier commit 009c3a4bc41e855fd76f92727f9fbae4e5917d7f upstream. Move the BROKEN_SD_DISCARD quirk for certain SanDisk SD cards from the `mmc_blk_fixups[]` to `mmc_sd_fixups[]`. This ensures the quirk is applied earlier in the device initialization process, aligning with the reasoning in [1]. Applying the quirk sooner prevents the kernel from incorrectly enabling discard support on affected cards during initial setup. [1] https://lore.kernel.org/all/20240820230631.GA436523@sony.com Fixes: 07d2872bf4c8 ("mmc: core: Add SD card quirk for broken discard") Signed-off-by: Avri Altman Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20250526114445.675548-1-avri.altman@sandisk.com Signed-off-by: Ulf Hansson Signed-off-by: Greg Kroah-Hartman --- drivers/mmc/core/quirks.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h index 7f893bafaa607..c417ed34c0576 100644 --- a/drivers/mmc/core/quirks.h +++ b/drivers/mmc/core/quirks.h @@ -44,6 +44,12 @@ static const struct mmc_fixup __maybe_unused mmc_sd_fixups[] = { 0, -1ull, SDIO_ANY_ID, SDIO_ANY_ID, add_quirk_sd, MMC_QUIRK_NO_UHS_DDR50_TUNING, EXT_CSD_REV_ANY), + /* + * Some SD cards reports discard support while they don't + */ + MMC_FIXUP(CID_NAME_ANY, CID_MANFID_SANDISK_SD, 0x5344, add_quirk_sd, + MMC_QUIRK_BROKEN_SD_DISCARD), + END_FIXUP }; @@ -147,12 +153,6 @@ static const struct mmc_fixup __maybe_unused mmc_blk_fixups[] = { MMC_FIXUP("M62704", CID_MANFID_KINGSTON, 0x0100, add_quirk_mmc, MMC_QUIRK_TRIM_BROKEN), - /* - * Some SD cards reports discard support while they don't - */ - MMC_FIXUP(CID_NAME_ANY, CID_MANFID_SANDISK_SD, 0x5344, add_quirk_sd, - MMC_QUIRK_BROKEN_SD_DISCARD), - END_FIXUP }; -- GitLab From 0698a2eb7d89b53c469826577a5a605a4a86a896 Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Fri, 27 Jun 2025 09:05:08 +0200 Subject: [PATCH 1870/2211] Bluetooth: HCI: Set extended advertising data synchronously commit 89fb8acc38852116d38d721ad394aad7f2871670 upstream. Currently, for controllers with extended advertising, the advertising data is set in the asynchronous response handler for extended adverstising params. As most advertising settings are performed in a synchronous context, the (asynchronous) setting of the advertising data is done too late (after enabling the advertising). Move setting of adverstising data from asynchronous response handler into synchronous context to fix ordering of HCI commands. Signed-off-by: Christian Eggers Fixes: a0fb3726ba55 ("Bluetooth: Use Set ext adv/scan rsp data if controller supports") Cc: stable@vger.kernel.org v2: https://lore.kernel.org/linux-bluetooth/20250626115209.17839-1-ceggers@arri.de/ Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Greg Kroah-Hartman --- net/bluetooth/hci_event.c | 36 ------- net/bluetooth/hci_sync.c | 207 ++++++++++++++++++++++++-------------- 2 files changed, 130 insertions(+), 113 deletions(-) diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 5c4c3d04d8b93..7fdf17351e4a2 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -2141,40 +2141,6 @@ static u8 hci_cc_set_adv_param(struct hci_dev *hdev, void *data, return rp->status; } -static u8 hci_cc_set_ext_adv_param(struct hci_dev *hdev, void *data, - struct sk_buff *skb) -{ - struct hci_rp_le_set_ext_adv_params *rp = data; - struct hci_cp_le_set_ext_adv_params *cp; - struct adv_info *adv_instance; - - bt_dev_dbg(hdev, "status 0x%2.2x", rp->status); - - if (rp->status) - return rp->status; - - cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS); - if (!cp) - return rp->status; - - hci_dev_lock(hdev); - hdev->adv_addr_type = cp->own_addr_type; - if (!cp->handle) { - /* Store in hdev for instance 0 */ - hdev->adv_tx_power = rp->tx_power; - } else { - adv_instance = hci_find_adv_instance(hdev, cp->handle); - if (adv_instance) - adv_instance->tx_power = rp->tx_power; - } - /* Update adv data as tx power is known now */ - hci_update_adv_data(hdev, cp->handle); - - hci_dev_unlock(hdev); - - return rp->status; -} - static u8 hci_cc_read_rssi(struct hci_dev *hdev, void *data, struct sk_buff *skb) { @@ -4155,8 +4121,6 @@ static const struct hci_cc { HCI_CC(HCI_OP_LE_READ_NUM_SUPPORTED_ADV_SETS, hci_cc_le_read_num_adv_sets, sizeof(struct hci_rp_le_read_num_supported_adv_sets)), - HCI_CC(HCI_OP_LE_SET_EXT_ADV_PARAMS, hci_cc_set_ext_adv_param, - sizeof(struct hci_rp_le_set_ext_adv_params)), HCI_CC_STATUS(HCI_OP_LE_SET_EXT_ADV_ENABLE, hci_cc_le_set_ext_adv_enable), HCI_CC_STATUS(HCI_OP_LE_SET_ADV_SET_RAND_ADDR, diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c index a00316d79dbf5..838c809976b21 100644 --- a/net/bluetooth/hci_sync.c +++ b/net/bluetooth/hci_sync.c @@ -1205,9 +1205,126 @@ static int hci_set_adv_set_random_addr_sync(struct hci_dev *hdev, u8 instance, sizeof(cp), &cp, HCI_CMD_TIMEOUT); } +static int +hci_set_ext_adv_params_sync(struct hci_dev *hdev, struct adv_info *adv, + const struct hci_cp_le_set_ext_adv_params *cp, + struct hci_rp_le_set_ext_adv_params *rp) +{ + struct sk_buff *skb; + + skb = __hci_cmd_sync(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS, sizeof(*cp), + cp, HCI_CMD_TIMEOUT); + + /* If command return a status event, skb will be set to -ENODATA */ + if (skb == ERR_PTR(-ENODATA)) + return 0; + + if (IS_ERR(skb)) { + bt_dev_err(hdev, "Opcode 0x%4.4x failed: %ld", + HCI_OP_LE_SET_EXT_ADV_PARAMS, PTR_ERR(skb)); + return PTR_ERR(skb); + } + + if (skb->len != sizeof(*rp)) { + bt_dev_err(hdev, "Invalid response length for 0x%4.4x: %u", + HCI_OP_LE_SET_EXT_ADV_PARAMS, skb->len); + kfree_skb(skb); + return -EIO; + } + + memcpy(rp, skb->data, sizeof(*rp)); + kfree_skb(skb); + + if (!rp->status) { + hdev->adv_addr_type = cp->own_addr_type; + if (!cp->handle) { + /* Store in hdev for instance 0 */ + hdev->adv_tx_power = rp->tx_power; + } else if (adv) { + adv->tx_power = rp->tx_power; + } + } + + return rp->status; +} + +static int hci_set_ext_adv_data_sync(struct hci_dev *hdev, u8 instance) +{ + DEFINE_FLEX(struct hci_cp_le_set_ext_adv_data, pdu, data, length, + HCI_MAX_EXT_AD_LENGTH); + u8 len; + struct adv_info *adv = NULL; + int err; + + if (instance) { + adv = hci_find_adv_instance(hdev, instance); + if (!adv || !adv->adv_data_changed) + return 0; + } + + len = eir_create_adv_data(hdev, instance, pdu->data, + HCI_MAX_EXT_AD_LENGTH); + + pdu->length = len; + pdu->handle = adv ? adv->handle : instance; + pdu->operation = LE_SET_ADV_DATA_OP_COMPLETE; + pdu->frag_pref = LE_SET_ADV_DATA_NO_FRAG; + + err = __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_ADV_DATA, + struct_size(pdu, data, len), pdu, + HCI_CMD_TIMEOUT); + if (err) + return err; + + /* Update data if the command succeed */ + if (adv) { + adv->adv_data_changed = false; + } else { + memcpy(hdev->adv_data, pdu->data, len); + hdev->adv_data_len = len; + } + + return 0; +} + +static int hci_set_adv_data_sync(struct hci_dev *hdev, u8 instance) +{ + struct hci_cp_le_set_adv_data cp; + u8 len; + + memset(&cp, 0, sizeof(cp)); + + len = eir_create_adv_data(hdev, instance, cp.data, sizeof(cp.data)); + + /* There's nothing to do if the data hasn't changed */ + if (hdev->adv_data_len == len && + memcmp(cp.data, hdev->adv_data, len) == 0) + return 0; + + memcpy(hdev->adv_data, cp.data, sizeof(cp.data)); + hdev->adv_data_len = len; + + cp.length = len; + + return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_DATA, + sizeof(cp), &cp, HCI_CMD_TIMEOUT); +} + +int hci_update_adv_data_sync(struct hci_dev *hdev, u8 instance) +{ + if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) + return 0; + + if (ext_adv_capable(hdev)) + return hci_set_ext_adv_data_sync(hdev, instance); + + return hci_set_adv_data_sync(hdev, instance); +} + int hci_setup_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance) { struct hci_cp_le_set_ext_adv_params cp; + struct hci_rp_le_set_ext_adv_params rp; bool connectable; u32 flags; bdaddr_t random_addr; @@ -1314,8 +1431,12 @@ int hci_setup_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance) cp.secondary_phy = HCI_ADV_PHY_1M; } - err = __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS, - sizeof(cp), &cp, HCI_CMD_TIMEOUT); + err = hci_set_ext_adv_params_sync(hdev, adv, &cp, &rp); + if (err) + return err; + + /* Update adv data as tx power is known now */ + err = hci_set_ext_adv_data_sync(hdev, cp.handle); if (err) return err; @@ -1832,79 +1953,6 @@ int hci_le_terminate_big_sync(struct hci_dev *hdev, u8 handle, u8 reason) sizeof(cp), &cp, HCI_CMD_TIMEOUT); } -static int hci_set_ext_adv_data_sync(struct hci_dev *hdev, u8 instance) -{ - DEFINE_FLEX(struct hci_cp_le_set_ext_adv_data, pdu, data, length, - HCI_MAX_EXT_AD_LENGTH); - u8 len; - struct adv_info *adv = NULL; - int err; - - if (instance) { - adv = hci_find_adv_instance(hdev, instance); - if (!adv || !adv->adv_data_changed) - return 0; - } - - len = eir_create_adv_data(hdev, instance, pdu->data, - HCI_MAX_EXT_AD_LENGTH); - - pdu->length = len; - pdu->handle = adv ? adv->handle : instance; - pdu->operation = LE_SET_ADV_DATA_OP_COMPLETE; - pdu->frag_pref = LE_SET_ADV_DATA_NO_FRAG; - - err = __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_ADV_DATA, - struct_size(pdu, data, len), pdu, - HCI_CMD_TIMEOUT); - if (err) - return err; - - /* Update data if the command succeed */ - if (adv) { - adv->adv_data_changed = false; - } else { - memcpy(hdev->adv_data, pdu->data, len); - hdev->adv_data_len = len; - } - - return 0; -} - -static int hci_set_adv_data_sync(struct hci_dev *hdev, u8 instance) -{ - struct hci_cp_le_set_adv_data cp; - u8 len; - - memset(&cp, 0, sizeof(cp)); - - len = eir_create_adv_data(hdev, instance, cp.data, sizeof(cp.data)); - - /* There's nothing to do if the data hasn't changed */ - if (hdev->adv_data_len == len && - memcmp(cp.data, hdev->adv_data, len) == 0) - return 0; - - memcpy(hdev->adv_data, cp.data, sizeof(cp.data)); - hdev->adv_data_len = len; - - cp.length = len; - - return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_DATA, - sizeof(cp), &cp, HCI_CMD_TIMEOUT); -} - -int hci_update_adv_data_sync(struct hci_dev *hdev, u8 instance) -{ - if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) - return 0; - - if (ext_adv_capable(hdev)) - return hci_set_ext_adv_data_sync(hdev, instance); - - return hci_set_adv_data_sync(hdev, instance); -} - int hci_schedule_adv_instance_sync(struct hci_dev *hdev, u8 instance, bool force) { @@ -6251,6 +6299,7 @@ static int hci_le_ext_directed_advertising_sync(struct hci_dev *hdev, struct hci_conn *conn) { struct hci_cp_le_set_ext_adv_params cp; + struct hci_rp_le_set_ext_adv_params rp; int err; bdaddr_t random_addr; u8 own_addr_type; @@ -6292,8 +6341,12 @@ static int hci_le_ext_directed_advertising_sync(struct hci_dev *hdev, if (err) return err; - err = __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS, - sizeof(cp), &cp, HCI_CMD_TIMEOUT); + err = hci_set_ext_adv_params_sync(hdev, NULL, &cp, &rp); + if (err) + return err; + + /* Update adv data as tx power is known now */ + err = hci_set_ext_adv_data_sync(hdev, cp.handle); if (err) return err; -- GitLab From 3672fe9d1ed699406fabc15a61c0ee073698ee76 Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Wed, 25 Jun 2025 15:09:29 +0200 Subject: [PATCH 1871/2211] Bluetooth: hci_sync: revert some mesh modifications commit 46c0d947b64ac8efcf89dd754213dab5d1bd00aa upstream. This reverts minor parts of the changes made in commit b338d91703fa ("Bluetooth: Implement support for Mesh"). It looks like these changes were only made for development purposes but shouldn't have been part of the commit. Fixes: b338d91703fa ("Bluetooth: Implement support for Mesh") Cc: stable@vger.kernel.org Signed-off-by: Christian Eggers Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Greg Kroah-Hartman --- net/bluetooth/hci_sync.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c index 838c809976b21..50cc60ac6242e 100644 --- a/net/bluetooth/hci_sync.c +++ b/net/bluetooth/hci_sync.c @@ -2028,13 +2028,10 @@ static int hci_clear_adv_sets_sync(struct hci_dev *hdev, struct sock *sk) static int hci_clear_adv_sync(struct hci_dev *hdev, struct sock *sk, bool force) { struct adv_info *adv, *n; - int err = 0; if (ext_adv_capable(hdev)) /* Remove all existing sets */ - err = hci_clear_adv_sets_sync(hdev, sk); - if (ext_adv_capable(hdev)) - return err; + return hci_clear_adv_sets_sync(hdev, sk); /* This is safe as long as there is no command send while the lock is * held. @@ -2062,13 +2059,11 @@ static int hci_clear_adv_sync(struct hci_dev *hdev, struct sock *sk, bool force) static int hci_remove_adv_sync(struct hci_dev *hdev, u8 instance, struct sock *sk) { - int err = 0; + int err; /* If we use extended advertising, instance has to be removed first. */ if (ext_adv_capable(hdev)) - err = hci_remove_ext_adv_instance_sync(hdev, instance, sk); - if (ext_adv_capable(hdev)) - return err; + return hci_remove_ext_adv_instance_sync(hdev, instance, sk); /* This is safe as long as there is no command send while the lock is * held. @@ -2167,16 +2162,13 @@ int hci_read_tx_power_sync(struct hci_dev *hdev, __le16 handle, u8 type) int hci_disable_advertising_sync(struct hci_dev *hdev) { u8 enable = 0x00; - int err = 0; /* If controller is not advertising we are done. */ if (!hci_dev_test_flag(hdev, HCI_LE_ADV)) return 0; if (ext_adv_capable(hdev)) - err = hci_disable_ext_adv_instance_sync(hdev, 0x00); - if (ext_adv_capable(hdev)) - return err; + return hci_disable_ext_adv_instance_sync(hdev, 0x00); return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable, HCI_CMD_TIMEOUT); -- GitLab From 44bb1e13b454ebba3cb0ca1eb570dda55696683a Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Wed, 25 Jun 2025 15:09:30 +0200 Subject: [PATCH 1872/2211] Bluetooth: MGMT: set_mesh: update LE scan interval and window commit e5af67a870f738bb8a4594b6c60c2caf4c87a3c9 upstream. According to the message of commit b338d91703fa ("Bluetooth: Implement support for Mesh"), MGMT_OP_SET_MESH_RECEIVER should set the passive scan parameters. Currently the scan interval and window parameters are silently ignored, although user space (bluetooth-meshd) expects that they can be used [1] [1] https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/mesh/mesh-io-mgmt.c#n344 Fixes: b338d91703fa ("Bluetooth: Implement support for Mesh") Cc: stable@vger.kernel.org Signed-off-by: Christian Eggers Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Greg Kroah-Hartman --- net/bluetooth/mgmt.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 7664e7ba372ce..f313901224dcb 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c @@ -2146,6 +2146,9 @@ static int set_mesh_sync(struct hci_dev *hdev, void *data) else hci_dev_clear_flag(hdev, HCI_MESH); + hdev->le_scan_interval = __le16_to_cpu(cp->period); + hdev->le_scan_window = __le16_to_cpu(cp->window); + len -= sizeof(*cp); /* If filters don't fit, forward all adv pkts */ @@ -2160,6 +2163,7 @@ static int set_mesh(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) { struct mgmt_cp_set_mesh *cp = data; struct mgmt_pending_cmd *cmd; + __u16 period, window; int err = 0; bt_dev_dbg(hdev, "sock %p", sk); @@ -2173,6 +2177,23 @@ static int set_mesh(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, MGMT_STATUS_INVALID_PARAMS); + /* Keep allowed ranges in sync with set_scan_params() */ + period = __le16_to_cpu(cp->period); + + if (period < 0x0004 || period > 0x4000) + return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, + MGMT_STATUS_INVALID_PARAMS); + + window = __le16_to_cpu(cp->window); + + if (window < 0x0004 || window > 0x4000) + return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, + MGMT_STATUS_INVALID_PARAMS); + + if (window > period) + return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, + MGMT_STATUS_INVALID_PARAMS); + hci_dev_lock(hdev); cmd = mgmt_pending_add(sk, MGMT_OP_SET_MESH_RECEIVER, hdev, data, len); @@ -6536,6 +6557,7 @@ static int set_scan_params(struct sock *sk, struct hci_dev *hdev, return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, MGMT_STATUS_NOT_SUPPORTED); + /* Keep allowed ranges in sync with set_mesh() */ interval = __le16_to_cpu(cp->interval); if (interval < 0x0004 || interval > 0x4000) -- GitLab From a99f80c88a97257979cb3dd650aeddeec95526b5 Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Wed, 25 Jun 2025 15:09:31 +0200 Subject: [PATCH 1873/2211] Bluetooth: MGMT: mesh_send: check instances prior disabling advertising commit f3cb5676e5c11c896ba647ee309a993e73531588 upstream. The unconditional call of hci_disable_advertising_sync() in mesh_send_done_sync() also disables other LE advertisings (non mesh related). I am not sure whether this call is required at all, but checking the adv_instances list (like done at other places) seems to solve the problem. Fixes: b338d91703fa ("Bluetooth: Implement support for Mesh") Cc: stable@vger.kernel.org Signed-off-by: Christian Eggers Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Greg Kroah-Hartman --- net/bluetooth/mgmt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index f313901224dcb..ade93532db34b 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c @@ -1073,7 +1073,8 @@ static int mesh_send_done_sync(struct hci_dev *hdev, void *data) struct mgmt_mesh_tx *mesh_tx; hci_dev_clear_flag(hdev, HCI_MESH_SENDING); - hci_disable_advertising_sync(hdev); + if (list_empty(&hdev->adv_instances)) + hci_disable_advertising_sync(hdev); mesh_tx = mgmt_mesh_next(hdev, NULL); if (mesh_tx) -- GitLab From dae12bc688b8087b3e2cc01973d97dac2d1d2dae Mon Sep 17 00:00:00 2001 From: Nicolin Chen Date: Tue, 24 Jun 2025 11:00:45 -0700 Subject: [PATCH 1874/2211] iommufd/selftest: Fix iommufd_dirty_tracking with large hugepage sizes commit 818625570558cd91082c9bafd6f2b59b73241a69 upstream. The hugepage test cases of iommufd_dirty_tracking have the 64MB and 128MB coverages. Both of them are smaller than the default hugepage size 512MB, when CONFIG_PAGE_SIZE_64KB=y. However, these test cases have a variant of using huge pages, which would mmap(MAP_HUGETLB) using these smaller sizes than the system hugepag size. This results in the kernel aligning up the smaller size to 512MB. If a memory was located between the upper 64/128MB size boundary and the hugepage 512MB boundary, it would get wiped out: https://lore.kernel.org/all/aEoUhPYIAizTLADq@nvidia.com/ Given that this aligning up behavior is well documented, we have no choice but to allocate a hugepage aligned size to avoid this unintended wipe out. Instead of relying on the kernel's internal force alignment, pass the same size to posix_memalign() and map(). Also, fix the FIXTURE_TEARDOWN() misusing munmap() to free the memory from posix_memalign(), as munmap() doesn't destroy the allocator meta data. So, call free() instead. Fixes: a9af47e382a4 ("iommufd/selftest: Test IOMMU_HWPT_GET_DIRTY_BITMAP") Link: https://patch.msgid.link/r/1ea8609ae6d523fdd4d8efb179ddee79c8582cb6.1750787928.git.nicolinc@nvidia.com Cc: stable@vger.kernel.org Suggested-by: Jason Gunthorpe Signed-off-by: Nicolin Chen Signed-off-by: Jason Gunthorpe Signed-off-by: Greg Kroah-Hartman --- tools/testing/selftests/iommu/iommufd.c | 30 +++++++++++++++++-------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/tools/testing/selftests/iommu/iommufd.c b/tools/testing/selftests/iommu/iommufd.c index 06f252733660a..a81c22d520070 100644 --- a/tools/testing/selftests/iommu/iommufd.c +++ b/tools/testing/selftests/iommu/iommufd.c @@ -1748,6 +1748,7 @@ FIXTURE_VARIANT(iommufd_dirty_tracking) FIXTURE_SETUP(iommufd_dirty_tracking) { + size_t mmap_buffer_size; unsigned long size; int mmap_flags; void *vrc; @@ -1762,22 +1763,33 @@ FIXTURE_SETUP(iommufd_dirty_tracking) self->fd = open("/dev/iommu", O_RDWR); ASSERT_NE(-1, self->fd); - rc = posix_memalign(&self->buffer, HUGEPAGE_SIZE, variant->buffer_size); - if (rc || !self->buffer) { - SKIP(return, "Skipping buffer_size=%lu due to errno=%d", - variant->buffer_size, rc); - } - mmap_flags = MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED; + mmap_buffer_size = variant->buffer_size; if (variant->hugepages) { /* * MAP_POPULATE will cause the kernel to fail mmap if THPs are * not available. */ mmap_flags |= MAP_HUGETLB | MAP_POPULATE; + + /* + * Allocation must be aligned to the HUGEPAGE_SIZE, because the + * following mmap() will automatically align the length to be a + * multiple of the underlying huge page size. Failing to do the + * same at this allocation will result in a memory overwrite by + * the mmap(). + */ + if (mmap_buffer_size < HUGEPAGE_SIZE) + mmap_buffer_size = HUGEPAGE_SIZE; + } + + rc = posix_memalign(&self->buffer, HUGEPAGE_SIZE, mmap_buffer_size); + if (rc || !self->buffer) { + SKIP(return, "Skipping buffer_size=%lu due to errno=%d", + mmap_buffer_size, rc); } assert((uintptr_t)self->buffer % HUGEPAGE_SIZE == 0); - vrc = mmap(self->buffer, variant->buffer_size, PROT_READ | PROT_WRITE, + vrc = mmap(self->buffer, mmap_buffer_size, PROT_READ | PROT_WRITE, mmap_flags, -1, 0); assert(vrc == self->buffer); @@ -1806,8 +1818,8 @@ FIXTURE_SETUP(iommufd_dirty_tracking) FIXTURE_TEARDOWN(iommufd_dirty_tracking) { - munmap(self->buffer, variant->buffer_size); - munmap(self->bitmap, DIV_ROUND_UP(self->bitmap_size, BITS_PER_BYTE)); + free(self->buffer); + free(self->bitmap); teardown_iommufd(self->fd, _metadata); } -- GitLab From e4d19e5d71b217940e33f2ef6c6962b7b68c5606 Mon Sep 17 00:00:00 2001 From: Manivannan Sadhasivam Date: Thu, 3 Jul 2025 16:05:49 +0530 Subject: [PATCH 1875/2211] regulator: gpio: Fix the out-of-bounds access to drvdata::gpiods commit c9764fd88bc744592b0604ccb6b6fc1a5f76b4e3 upstream. drvdata::gpiods is supposed to hold an array of 'gpio_desc' pointers. But the memory is allocated for only one pointer. This will lead to out-of-bounds access later in the code if 'config::ngpios' is > 1. So fix the code to allocate enough memory to hold 'config::ngpios' of GPIO descriptors. While at it, also move the check for memory allocation failure to be below the allocation to make it more readable. Cc: stable@vger.kernel.org # 5.0 Fixes: d6cd33ad7102 ("regulator: gpio: Convert to use descriptors") Signed-off-by: Manivannan Sadhasivam Link: https://patch.msgid.link/20250703103549.16558-1-mani@kernel.org Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- drivers/regulator/gpio-regulator.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c index 65927fa2ef161..1bdd494cf8821 100644 --- a/drivers/regulator/gpio-regulator.c +++ b/drivers/regulator/gpio-regulator.c @@ -260,8 +260,10 @@ static int gpio_regulator_probe(struct platform_device *pdev) return -ENOMEM; } - drvdata->gpiods = devm_kzalloc(dev, sizeof(struct gpio_desc *), - GFP_KERNEL); + drvdata->gpiods = devm_kcalloc(dev, config->ngpios, + sizeof(struct gpio_desc *), GFP_KERNEL); + if (!drvdata->gpiods) + return -ENOMEM; if (config->input_supply) { drvdata->desc.supply_name = devm_kstrdup(&pdev->dev, @@ -274,8 +276,6 @@ static int gpio_regulator_probe(struct platform_device *pdev) } } - if (!drvdata->gpiods) - return -ENOMEM; for (i = 0; i < config->ngpios; i++) { drvdata->gpiods[i] = devm_gpiod_get_index(dev, NULL, -- GitLab From ea20568895c1122f15b6fc9e8d02c6cbe22964f8 Mon Sep 17 00:00:00 2001 From: Yunshui Jiang Date: Thu, 3 Jul 2025 21:56:02 -0700 Subject: [PATCH 1876/2211] Input: cs40l50-vibra - fix potential NULL dereference in cs40l50_upload_owt() commit 4cf65845fdd09d711fc7546d60c9abe010956922 upstream. The cs40l50_upload_owt() function allocates memory via kmalloc() without checking for allocation failure, which could lead to a NULL pointer dereference. Return -ENOMEM in case allocation fails. Signed-off-by: Yunshui Jiang Fixes: c38fe1bb5d21 ("Input: cs40l50 - Add support for the CS40L50 haptic driver") Link: https://lore.kernel.org/r/20250704024010.2353841-1-jiangyunshui@kylinos.cn Cc: stable@vger.kernel.org Signed-off-by: Dmitry Torokhov Signed-off-by: Greg Kroah-Hartman --- drivers/input/misc/cs40l50-vibra.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/input/misc/cs40l50-vibra.c b/drivers/input/misc/cs40l50-vibra.c index dce3b0ec8cf36..330f091236318 100644 --- a/drivers/input/misc/cs40l50-vibra.c +++ b/drivers/input/misc/cs40l50-vibra.c @@ -238,6 +238,8 @@ static int cs40l50_upload_owt(struct cs40l50_work *work_data) header.data_words = len / sizeof(u32); new_owt_effect_data = kmalloc(sizeof(header) + len, GFP_KERNEL); + if (!new_owt_effect_data) + return -ENOMEM; memcpy(new_owt_effect_data, &header, sizeof(header)); memcpy(new_owt_effect_data + sizeof(header), work_data->custom_data, len); -- GitLab From 5581e694d3a1c2f32c5a51d745c55b107644e1f8 Mon Sep 17 00:00:00 2001 From: RD Babiera Date: Wed, 18 Jun 2025 22:49:42 +0000 Subject: [PATCH 1877/2211] usb: typec: altmodes/displayport: do not index invalid pin_assignments commit af4db5a35a4ef7a68046883bfd12468007db38f1 upstream. A poorly implemented DisplayPort Alt Mode port partner can indicate that its pin assignment capabilities are greater than the maximum value, DP_PIN_ASSIGN_F. In this case, calls to pin_assignment_show will cause a BRK exception due to an out of bounds array access. Prevent for loop in pin_assignment_show from accessing invalid values in pin_assignments by adding DP_PIN_ASSIGN_MAX value in typec_dp.h and using i < DP_PIN_ASSIGN_MAX as a loop condition. Fixes: 0e3bb7d6894d ("usb: typec: Add driver for DisplayPort alternate mode") Cc: stable Signed-off-by: RD Babiera Reviewed-by: Badhri Jagan Sridharan Reviewed-by: Heikki Krogerus Link: https://lore.kernel.org/r/20250618224943.3263103-2-rdbabiera@google.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Greg Kroah-Hartman --- drivers/usb/typec/altmodes/displayport.c | 2 +- include/linux/usb/typec_dp.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c index 4976a7238b287..2dcf7ac3ea318 100644 --- a/drivers/usb/typec/altmodes/displayport.c +++ b/drivers/usb/typec/altmodes/displayport.c @@ -677,7 +677,7 @@ static ssize_t pin_assignment_show(struct device *dev, assignments = get_current_pin_assignments(dp); - for (i = 0; assignments; assignments >>= 1, i++) { + for (i = 0; assignments && i < DP_PIN_ASSIGN_MAX; assignments >>= 1, i++) { if (assignments & 1) { if (i == cur) len += sprintf(buf + len, "[%s] ", diff --git a/include/linux/usb/typec_dp.h b/include/linux/usb/typec_dp.h index f2da264d9c140..acb0ad03bdacb 100644 --- a/include/linux/usb/typec_dp.h +++ b/include/linux/usb/typec_dp.h @@ -57,6 +57,7 @@ enum { DP_PIN_ASSIGN_D, DP_PIN_ASSIGN_E, DP_PIN_ASSIGN_F, /* Not supported after v1.0b */ + DP_PIN_ASSIGN_MAX, }; /* DisplayPort alt mode specific commands */ -- GitLab From cfbdcabab2fb5a274aba0c3426a6a71014344ad5 Mon Sep 17 00:00:00 2001 From: "Masami Hiramatsu (Google)" Date: Thu, 5 Jun 2025 10:07:38 +0900 Subject: [PATCH 1878/2211] mtk-sd: Fix a pagefault in dma_unmap_sg() for not prepared data commit 539d80575b810c7a5987c7ac8915e3bc99c03695 upstream. When swiotlb buffer is full, the dma_map_sg() returns 0 to msdc_prepare_data(), but it does not check it and sets the MSDC_PREPARE_FLAG. swiotlb_tbl_map_single() /* prints "swiotlb buffer is full" */ <-swiotlb_map() <-dma_direct_map_page() <-dma_direct_map_sg() <-__dma_map_sg_attrs() <-dma_map_sg_attrs() <-dma_map_sg() /* returns 0 (pages mapped) */ <-msdc_prepare_data() Then, the msdc_unprepare_data() checks MSDC_PREPARE_FLAG and calls dma_unmap_sg() with unmapped pages. It causes a page fault. To fix this problem, Do not set MSDC_PREPARE_FLAG if dma_map_sg() fails because this is not prepared. Fixes: 208489032bdd ("mmc: mediatek: Add Mediatek MMC driver") Signed-off-by: Masami Hiramatsu (Google) Tested-by: Sergey Senozhatsky Reviewed-by: AngeloGioacchino Del Regno Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/174908565814.4056588.769599127120955383.stgit@mhiramat.tok.corp.google.com Signed-off-by: Ulf Hansson Signed-off-by: Greg Kroah-Hartman --- drivers/mmc/host/mtk-sd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index d5d868cb4edc7..c8c4f9de30c78 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -776,9 +776,10 @@ static inline void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, static void msdc_prepare_data(struct msdc_host *host, struct mmc_data *data) { if (!(data->host_cookie & MSDC_PREPARE_FLAG)) { - data->host_cookie |= MSDC_PREPARE_FLAG; data->sg_count = dma_map_sg(host->dev, data->sg, data->sg_len, mmc_get_dma_dir(data)); + if (data->sg_count) + data->host_cookie |= MSDC_PREPARE_FLAG; } } -- GitLab From 3419bc6a7b65cbbb91417bb9970208478e034c79 Mon Sep 17 00:00:00 2001 From: "Masami Hiramatsu (Google)" Date: Thu, 12 Jun 2025 20:26:10 +0900 Subject: [PATCH 1879/2211] mtk-sd: Prevent memory corruption from DMA map failure commit f5de469990f19569627ea0dd56536ff5a13beaa3 upstream. If msdc_prepare_data() fails to map the DMA region, the request is not prepared for data receiving, but msdc_start_data() proceeds the DMA with previous setting. Since this will lead a memory corruption, we have to stop the request operation soon after the msdc_prepare_data() fails to prepare it. Signed-off-by: Masami Hiramatsu (Google) Fixes: 208489032bdd ("mmc: mediatek: Add Mediatek MMC driver") Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/174972756982.3337526.6755001617701603082.stgit@mhiramat.tok.corp.google.com Signed-off-by: Ulf Hansson Signed-off-by: Greg Kroah-Hartman --- drivers/mmc/host/mtk-sd.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index c8c4f9de30c78..7e5dda65b72fb 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -783,6 +783,11 @@ static void msdc_prepare_data(struct msdc_host *host, struct mmc_data *data) } } +static bool msdc_data_prepared(struct mmc_data *data) +{ + return data->host_cookie & MSDC_PREPARE_FLAG; +} + static void msdc_unprepare_data(struct msdc_host *host, struct mmc_data *data) { if (data->host_cookie & MSDC_ASYNC_FLAG) @@ -1346,8 +1351,18 @@ static void msdc_ops_request(struct mmc_host *mmc, struct mmc_request *mrq) WARN_ON(host->mrq); host->mrq = mrq; - if (mrq->data) + if (mrq->data) { msdc_prepare_data(host, mrq->data); + if (!msdc_data_prepared(mrq->data)) { + /* + * Failed to prepare DMA area, fail fast before + * starting any commands. + */ + mrq->cmd->error = -ENOSPC; + mmc_request_done(mmc_from_priv(host), mrq); + return; + } + } /* if SBC is required, we have HW option and SW option. * if HW option is enabled, and SBC does not have "special" flags, -- GitLab From ca40e57b22a0d27d644d0df6bab3b4363dc8b1e0 Mon Sep 17 00:00:00 2001 From: Sergey Senozhatsky Date: Wed, 25 Jun 2025 14:20:37 +0900 Subject: [PATCH 1880/2211] mtk-sd: reset host->mrq on prepare_data() error commit ec54c0a20709ed6e56f40a8d59eee725c31a916b upstream. Do not leave host with dangling ->mrq pointer if we hit the msdc_prepare_data() error out path. Signed-off-by: Sergey Senozhatsky Reviewed-by: Masami Hiramatsu (Google) Fixes: f5de469990f1 ("mtk-sd: Prevent memory corruption from DMA map failure") Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20250625052106.584905-1-senozhatsky@chromium.org Signed-off-by: Ulf Hansson Signed-off-by: Greg Kroah-Hartman --- drivers/mmc/host/mtk-sd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index 7e5dda65b72fb..be9954f5bc0a6 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -1354,6 +1354,7 @@ static void msdc_ops_request(struct mmc_host *mmc, struct mmc_request *mrq) if (mrq->data) { msdc_prepare_data(host, mrq->data); if (!msdc_data_prepared(mrq->data)) { + host->mrq = NULL; /* * Failed to prepare DMA area, fail fast before * starting any commands. -- GitLab From 9ff95ed0371aec4d9617e478e9c69cde86cd7c38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ADra=20Canal?= Date: Sat, 28 Jun 2025 19:42:42 -0300 Subject: [PATCH 1881/2211] drm/v3d: Disable interrupts before resetting the GPU MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 226862f50a7a88e4e4de9abbf36c64d19acd6fd0 upstream. Currently, an interrupt can be triggered during a GPU reset, which can lead to GPU hangs and NULL pointer dereference in an interrupt context as shown in the following trace: [ 314.035040] Unable to handle kernel NULL pointer dereference at virtual address 00000000000000c0 [ 314.043822] Mem abort info: [ 314.046606] ESR = 0x0000000096000005 [ 314.050347] EC = 0x25: DABT (current EL), IL = 32 bits [ 314.055651] SET = 0, FnV = 0 [ 314.058695] EA = 0, S1PTW = 0 [ 314.061826] FSC = 0x05: level 1 translation fault [ 314.066694] Data abort info: [ 314.069564] ISV = 0, ISS = 0x00000005, ISS2 = 0x00000000 [ 314.075039] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 [ 314.080080] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 [ 314.085382] user pgtable: 4k pages, 39-bit VAs, pgdp=0000000102728000 [ 314.091814] [00000000000000c0] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000 [ 314.100511] Internal error: Oops: 0000000096000005 [#1] PREEMPT SMP [ 314.106770] Modules linked in: v3d i2c_brcmstb vc4 snd_soc_hdmi_codec gpu_sched drm_shmem_helper drm_display_helper cec drm_dma_helper drm_kms_helper drm drm_panel_orientation_quirks snd_soc_core snd_compress snd_pcm_dmaengine snd_pcm snd_timer snd backlight [ 314.129654] CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 6.12.25+rpt-rpi-v8 #1 Debian 1:6.12.25-1+rpt1 [ 314.139388] Hardware name: Raspberry Pi 4 Model B Rev 1.4 (DT) [ 314.145211] pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 314.152165] pc : v3d_irq+0xec/0x2e0 [v3d] [ 314.156187] lr : v3d_irq+0xe0/0x2e0 [v3d] [ 314.160198] sp : ffffffc080003ea0 [ 314.163502] x29: ffffffc080003ea0 x28: ffffffec1f184980 x27: 021202b000000000 [ 314.170633] x26: ffffffec1f17f630 x25: ffffff8101372000 x24: ffffffec1f17d9f0 [ 314.177764] x23: 000000000000002a x22: 000000000000002a x21: ffffff8103252000 [ 314.184895] x20: 0000000000000001 x19: 00000000deadbeef x18: 0000000000000000 [ 314.192026] x17: ffffff94e51d2000 x16: ffffffec1dac3cb0 x15: c306000000000000 [ 314.199156] x14: 0000000000000000 x13: b2fc982e03cc5168 x12: 0000000000000001 [ 314.206286] x11: ffffff8103f8bcc0 x10: ffffffec1f196868 x9 : ffffffec1dac3874 [ 314.213416] x8 : 0000000000000000 x7 : 0000000000042a3a x6 : ffffff810017a180 [ 314.220547] x5 : ffffffec1ebad400 x4 : ffffffec1ebad320 x3 : 00000000000bebeb [ 314.227677] x2 : 0000000000000000 x1 : 0000000000000000 x0 : 0000000000000000 [ 314.234807] Call trace: [ 314.237243] v3d_irq+0xec/0x2e0 [v3d] [ 314.240906] __handle_irq_event_percpu+0x58/0x218 [ 314.245609] handle_irq_event+0x54/0xb8 [ 314.249439] handle_fasteoi_irq+0xac/0x240 [ 314.253527] handle_irq_desc+0x48/0x68 [ 314.257269] generic_handle_domain_irq+0x24/0x38 [ 314.261879] gic_handle_irq+0x48/0xd8 [ 314.265533] call_on_irq_stack+0x24/0x58 [ 314.269448] do_interrupt_handler+0x88/0x98 [ 314.273624] el1_interrupt+0x34/0x68 [ 314.277193] el1h_64_irq_handler+0x18/0x28 [ 314.281281] el1h_64_irq+0x64/0x68 [ 314.284673] default_idle_call+0x3c/0x168 [ 314.288675] do_idle+0x1fc/0x230 [ 314.291895] cpu_startup_entry+0x3c/0x50 [ 314.295810] rest_init+0xe4/0xf0 [ 314.299030] start_kernel+0x5e8/0x790 [ 314.302684] __primary_switched+0x80/0x90 [ 314.306691] Code: 940029eb 360ffc13 f9442ea0 52800001 (f9406017) [ 314.312775] ---[ end trace 0000000000000000 ]--- [ 314.317384] Kernel panic - not syncing: Oops: Fatal exception in interrupt [ 314.324249] SMP: stopping secondary CPUs [ 314.328167] Kernel Offset: 0x2b9da00000 from 0xffffffc080000000 [ 314.334076] PHYS_OFFSET: 0x0 [ 314.336946] CPU features: 0x08,00002013,c0200000,0200421b [ 314.342337] Memory Limit: none [ 314.345382] ---[ end Kernel panic - not syncing: Oops: Fatal exception in interrupt ]--- Before resetting the GPU, it's necessary to disable all interrupts and deal with any interrupt handler still in-flight. Otherwise, the GPU might reset with jobs still running, or yet, an interrupt could be handled during the reset. Cc: stable@vger.kernel.org Fixes: 57692c94dcbe ("drm/v3d: Introduce a new DRM driver for Broadcom V3D V3.x+") Reviewed-by: Juan A. Suarez Reviewed-by: Iago Toral Quiroga Link: https://lore.kernel.org/r/20250628224243.47599-1-mcanal@igalia.com Signed-off-by: Maíra Canal Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/v3d/v3d_drv.h | 8 ++++++++ drivers/gpu/drm/v3d/v3d_gem.c | 2 ++ drivers/gpu/drm/v3d/v3d_irq.c | 37 +++++++++++++++++++++++++---------- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h index 75b4725d49c7e..d4b0549205c29 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.h +++ b/drivers/gpu/drm/v3d/v3d_drv.h @@ -95,6 +95,12 @@ struct v3d_perfmon { u64 values[] __counted_by(ncounters); }; +enum v3d_irq { + V3D_CORE_IRQ, + V3D_HUB_IRQ, + V3D_MAX_IRQS, +}; + struct v3d_dev { struct drm_device drm; @@ -106,6 +112,8 @@ struct v3d_dev { bool single_irq_line; + int irq[V3D_MAX_IRQS]; + struct v3d_perfmon_info perfmon_info; void __iomem *hub_regs; diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c index da8faf3b90116..6b6ba7a68fcb4 100644 --- a/drivers/gpu/drm/v3d/v3d_gem.c +++ b/drivers/gpu/drm/v3d/v3d_gem.c @@ -118,6 +118,8 @@ v3d_reset(struct v3d_dev *v3d) if (false) v3d_idle_axi(v3d, 0); + v3d_irq_disable(v3d); + v3d_idle_gca(v3d); v3d_reset_v3d(v3d); diff --git a/drivers/gpu/drm/v3d/v3d_irq.c b/drivers/gpu/drm/v3d/v3d_irq.c index 72b6a119412fa..b98e1a4b33c71 100644 --- a/drivers/gpu/drm/v3d/v3d_irq.c +++ b/drivers/gpu/drm/v3d/v3d_irq.c @@ -228,7 +228,7 @@ v3d_hub_irq(int irq, void *arg) int v3d_irq_init(struct v3d_dev *v3d) { - int irq1, ret, core; + int irq, ret, core; INIT_WORK(&v3d->overflow_mem_work, v3d_overflow_mem_work); @@ -239,17 +239,24 @@ v3d_irq_init(struct v3d_dev *v3d) V3D_CORE_WRITE(core, V3D_CTL_INT_CLR, V3D_CORE_IRQS(v3d->ver)); V3D_WRITE(V3D_HUB_INT_CLR, V3D_HUB_IRQS(v3d->ver)); - irq1 = platform_get_irq_optional(v3d_to_pdev(v3d), 1); - if (irq1 == -EPROBE_DEFER) - return irq1; - if (irq1 > 0) { - ret = devm_request_irq(v3d->drm.dev, irq1, + irq = platform_get_irq_optional(v3d_to_pdev(v3d), 1); + if (irq == -EPROBE_DEFER) + return irq; + if (irq > 0) { + v3d->irq[V3D_CORE_IRQ] = irq; + + ret = devm_request_irq(v3d->drm.dev, v3d->irq[V3D_CORE_IRQ], v3d_irq, IRQF_SHARED, "v3d_core0", v3d); if (ret) goto fail; - ret = devm_request_irq(v3d->drm.dev, - platform_get_irq(v3d_to_pdev(v3d), 0), + + irq = platform_get_irq(v3d_to_pdev(v3d), 0); + if (irq < 0) + return irq; + v3d->irq[V3D_HUB_IRQ] = irq; + + ret = devm_request_irq(v3d->drm.dev, v3d->irq[V3D_HUB_IRQ], v3d_hub_irq, IRQF_SHARED, "v3d_hub", v3d); if (ret) @@ -257,8 +264,12 @@ v3d_irq_init(struct v3d_dev *v3d) } else { v3d->single_irq_line = true; - ret = devm_request_irq(v3d->drm.dev, - platform_get_irq(v3d_to_pdev(v3d), 0), + irq = platform_get_irq(v3d_to_pdev(v3d), 0); + if (irq < 0) + return irq; + v3d->irq[V3D_CORE_IRQ] = irq; + + ret = devm_request_irq(v3d->drm.dev, v3d->irq[V3D_CORE_IRQ], v3d_irq, IRQF_SHARED, "v3d", v3d); if (ret) @@ -299,6 +310,12 @@ v3d_irq_disable(struct v3d_dev *v3d) V3D_CORE_WRITE(core, V3D_CTL_INT_MSK_SET, ~0); V3D_WRITE(V3D_HUB_INT_MSK_SET, ~0); + /* Finish any interrupt handler still in flight. */ + for (int i = 0; i < V3D_MAX_IRQS; i++) { + if (v3d->irq[i]) + synchronize_irq(v3d->irq[i]); + } + /* Clear any pending interrupts we might have left. */ for (core = 0; core < v3d->cores; core++) V3D_CORE_WRITE(core, V3D_CTL_INT_CLR, V3D_CORE_IRQS(v3d->ver)); -- GitLab From 076fa20b4f5737c34921dbb152f9efceaee571b2 Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Wed, 28 May 2025 09:49:41 +0100 Subject: [PATCH 1882/2211] firmware: arm_ffa: Fix memory leak by freeing notifier callback node [ Upstream commit a833d31ad867103ba72a0b73f3606f4ab8601719 ] Commit e0573444edbf ("firmware: arm_ffa: Add interfaces to request notification callbacks") adds support for notifier callbacks by allocating and inserting a callback node into a hashtable during registration of notifiers. However, during unregistration, the code only removes the node from the hashtable without freeing the associated memory, resulting in a memory leak. Resolve the memory leak issue by ensuring the allocated notifier callback node is properly freed after it is removed from the hashtable entry. Fixes: e0573444edbf ("firmware: arm_ffa: Add interfaces to request notification callbacks") Message-Id: <20250528-ffa_notif_fix-v1-1-5ed7bc7f8437@arm.com> Reviewed-by: Jens Wiklander Signed-off-by: Sudeep Holla Signed-off-by: Sasha Levin --- drivers/firmware/arm_ffa/driver.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index 47751b2c057ae..c0f3b7cdb6edb 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -1166,6 +1166,7 @@ update_notifier_cb(int notify_id, enum notify_type type, ffa_notifier_cb cb, hash_add(drv_info->notifier_hash, &cb_info->hnode, notify_id); } else { hash_del(&cb_info->hnode); + kfree(cb_info); } return 0; -- GitLab From 2c07fd0eada8465e156c4a0a876e1b9ee442a212 Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Wed, 28 May 2025 09:49:42 +0100 Subject: [PATCH 1883/2211] firmware: arm_ffa: Move memory allocation outside the mutex locking commit 27e850c88df0e25474a8caeb2903e2e90b62c1dc upstream. The notifier callback node allocation is currently done while holding the notify_lock mutex. While this is safe even if memory allocation may sleep, we need to move the allocation outside the locked region in preparation to move from using muxtes to rwlocks. Move the memory allocation to avoid potential sleeping in atomic context once the locks are moved from mutex to rwlocks. Fixes: e0573444edbf ("firmware: arm_ffa: Add interfaces to request notification callbacks") Message-Id: <20250528-ffa_notif_fix-v1-2-5ed7bc7f8437@arm.com> Reviewed-by: Jens Wiklander Signed-off-by: Sudeep Holla Signed-off-by: Greg Kroah-Hartman --- drivers/firmware/arm_ffa/driver.c | 40 ++++++++++++++++--------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index c0f3b7cdb6edb..b0d92f411334e 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -1141,12 +1141,11 @@ notifier_hash_node_get(u16 notify_id, enum notify_type type) return NULL; } -static int -update_notifier_cb(int notify_id, enum notify_type type, ffa_notifier_cb cb, - void *cb_data, bool is_registration) +static int update_notifier_cb(int notify_id, enum notify_type type, + struct notifier_cb_info *cb) { struct notifier_cb_info *cb_info = NULL; - bool cb_found; + bool cb_found, is_registration = !!cb; cb_info = notifier_hash_node_get(notify_id, type); cb_found = !!cb_info; @@ -1155,15 +1154,7 @@ update_notifier_cb(int notify_id, enum notify_type type, ffa_notifier_cb cb, return -EINVAL; if (is_registration) { - cb_info = kzalloc(sizeof(*cb_info), GFP_KERNEL); - if (!cb_info) - return -ENOMEM; - - cb_info->type = type; - cb_info->cb = cb; - cb_info->cb_data = cb_data; - - hash_add(drv_info->notifier_hash, &cb_info->hnode, notify_id); + hash_add(drv_info->notifier_hash, &cb->hnode, notify_id); } else { hash_del(&cb_info->hnode); kfree(cb_info); @@ -1193,7 +1184,7 @@ static int ffa_notify_relinquish(struct ffa_device *dev, int notify_id) mutex_lock(&drv_info->notify_lock); - rc = update_notifier_cb(notify_id, type, NULL, NULL, false); + rc = update_notifier_cb(notify_id, type, NULL); if (rc) { pr_err("Could not unregister notification callback\n"); mutex_unlock(&drv_info->notify_lock); @@ -1212,6 +1203,7 @@ static int ffa_notify_request(struct ffa_device *dev, bool is_per_vcpu, { int rc; u32 flags = 0; + struct notifier_cb_info *cb_info = NULL; enum notify_type type = ffa_notify_type_get(dev->vm_id); if (ffa_notifications_disabled()) @@ -1220,24 +1212,34 @@ static int ffa_notify_request(struct ffa_device *dev, bool is_per_vcpu, if (notify_id >= FFA_MAX_NOTIFICATIONS) return -EINVAL; + cb_info = kzalloc(sizeof(*cb_info), GFP_KERNEL); + if (!cb_info) + return -ENOMEM; + + cb_info->type = type; + cb_info->cb_data = cb_data; + cb_info->cb = cb; + mutex_lock(&drv_info->notify_lock); if (is_per_vcpu) flags = PER_VCPU_NOTIFICATION_FLAG; rc = ffa_notification_bind(dev->vm_id, BIT(notify_id), flags); - if (rc) { - mutex_unlock(&drv_info->notify_lock); - return rc; - } + if (rc) + goto out_unlock_free; - rc = update_notifier_cb(notify_id, type, cb, cb_data, true); + rc = update_notifier_cb(notify_id, type, cb_info); if (rc) { pr_err("Failed to register callback for %d - %d\n", notify_id, rc); ffa_notification_unbind(dev->vm_id, BIT(notify_id)); } + +out_unlock_free: mutex_unlock(&drv_info->notify_lock); + if (rc) + kfree(cb_info); return rc; } -- GitLab From 31405510a48dcf054abfa5b7b8d70ce1b27d1f13 Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Wed, 28 May 2025 09:49:43 +0100 Subject: [PATCH 1884/2211] firmware: arm_ffa: Replace mutex with rwlock to avoid sleep in atomic context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 9ca7a421229bbdfbe2e1e628cff5cfa782720a10 upstream. The current use of a mutex to protect the notifier hashtable accesses can lead to issues in the atomic context. It results in the below kernel warnings: | BUG: sleeping function called from invalid context at kernel/locking/mutex.c:258 | in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 9, name: kworker/0:0 | preempt_count: 1, expected: 0 | RCU nest depth: 0, expected: 0 | CPU: 0 UID: 0 PID: 9 Comm: kworker/0:0 Not tainted 6.14.0 #4 | Workqueue: ffa_pcpu_irq_notification notif_pcpu_irq_work_fn | Call trace: | show_stack+0x18/0x24 (C) | dump_stack_lvl+0x78/0x90 | dump_stack+0x18/0x24 | __might_resched+0x114/0x170 | __might_sleep+0x48/0x98 | mutex_lock+0x24/0x80 | handle_notif_callbacks+0x54/0xe0 | notif_get_and_handle+0x40/0x88 | generic_exec_single+0x80/0xc0 | smp_call_function_single+0xfc/0x1a0 | notif_pcpu_irq_work_fn+0x2c/0x38 | process_one_work+0x14c/0x2b4 | worker_thread+0x2e4/0x3e0 | kthread+0x13c/0x210 | ret_from_fork+0x10/0x20 To address this, replace the mutex with an rwlock to protect the notifier hashtable accesses. This ensures that read-side locking does not sleep and multiple readers can acquire the lock concurrently, avoiding unnecessary contention and potential deadlocks. Writer access remains exclusive, preserving correctness. This change resolves warnings from lockdep about potential sleep in atomic context. Cc: Jens Wiklander Reported-by: Jérôme Forissier Closes: https://github.com/OP-TEE/optee_os/issues/7394 Fixes: e0573444edbf ("firmware: arm_ffa: Add interfaces to request notification callbacks") Message-Id: <20250528-ffa_notif_fix-v1-3-5ed7bc7f8437@arm.com> Reviewed-by: Jens Wiklander Tested-by: Jens Wiklander Signed-off-by: Sudeep Holla Signed-off-by: Greg Kroah-Hartman --- drivers/firmware/arm_ffa/driver.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index b0d92f411334e..83dad9c2da064 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -110,7 +110,7 @@ struct ffa_drv_info { struct work_struct sched_recv_irq_work; struct xarray partition_info; DECLARE_HASHTABLE(notifier_hash, ilog2(FFA_MAX_NOTIFICATIONS)); - struct mutex notify_lock; /* lock to protect notifier hashtable */ + rwlock_t notify_lock; /* lock to protect notifier hashtable */ }; static struct ffa_drv_info *drv_info; @@ -1182,18 +1182,18 @@ static int ffa_notify_relinquish(struct ffa_device *dev, int notify_id) if (notify_id >= FFA_MAX_NOTIFICATIONS) return -EINVAL; - mutex_lock(&drv_info->notify_lock); + write_lock(&drv_info->notify_lock); rc = update_notifier_cb(notify_id, type, NULL); if (rc) { pr_err("Could not unregister notification callback\n"); - mutex_unlock(&drv_info->notify_lock); + write_unlock(&drv_info->notify_lock); return rc; } rc = ffa_notification_unbind(dev->vm_id, BIT(notify_id)); - mutex_unlock(&drv_info->notify_lock); + write_unlock(&drv_info->notify_lock); return rc; } @@ -1220,7 +1220,7 @@ static int ffa_notify_request(struct ffa_device *dev, bool is_per_vcpu, cb_info->cb_data = cb_data; cb_info->cb = cb; - mutex_lock(&drv_info->notify_lock); + write_lock(&drv_info->notify_lock); if (is_per_vcpu) flags = PER_VCPU_NOTIFICATION_FLAG; @@ -1237,7 +1237,7 @@ static int ffa_notify_request(struct ffa_device *dev, bool is_per_vcpu, } out_unlock_free: - mutex_unlock(&drv_info->notify_lock); + write_unlock(&drv_info->notify_lock); if (rc) kfree(cb_info); @@ -1269,9 +1269,9 @@ static void handle_notif_callbacks(u64 bitmap, enum notify_type type) if (!(bitmap & 1)) continue; - mutex_lock(&drv_info->notify_lock); + read_lock(&drv_info->notify_lock); cb_info = notifier_hash_node_get(notify_id, type); - mutex_unlock(&drv_info->notify_lock); + read_unlock(&drv_info->notify_lock); if (cb_info && cb_info->cb) cb_info->cb(notify_id, cb_info->cb_data); @@ -1721,7 +1721,7 @@ static void ffa_notifications_setup(void) goto cleanup; hash_init(drv_info->notifier_hash); - mutex_init(&drv_info->notify_lock); + rwlock_init(&drv_info->notify_lock); drv_info->notif_enabled = true; return; -- GitLab From 896e0d9337b5d21101a399efe927841753d47f39 Mon Sep 17 00:00:00 2001 From: Janne Grunau Date: Wed, 11 Jun 2025 22:30:31 +0200 Subject: [PATCH 1885/2211] arm64: dts: apple: t8103: Fix PCIe BCM4377 nodename [ Upstream commit ac1daa91e9370e3b88ef7826a73d62a4d09e2717 ] Fix the following `make dtbs_check` warnings for all t8103 based devices: arch/arm64/boot/dts/apple/t8103-j274.dtb: network@0,0: $nodename:0: 'network@0,0' does not match '^wifi(@.*)?$' from schema $id: http://devicetree.org/schemas/net/wireless/brcm,bcm4329-fmac.yaml# arch/arm64/boot/dts/apple/t8103-j274.dtb: network@0,0: Unevaluated properties are not allowed ('local-mac-address' was unexpected) from schema $id: http://devicetree.org/schemas/net/wireless/brcm,bcm4329-fmac.yaml# Fixes: bf2c05b619ff ("arm64: dts: apple: t8103: Expose PCI node for the WiFi MAC address") Signed-off-by: Janne Grunau Reviewed-by: Sven Peter Link: https://lore.kernel.org/r/20250611-arm64_dts_apple_wifi-v1-1-fb959d8e1eb4@jannau.net Signed-off-by: Sven Peter Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/apple/t8103-jxxx.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi index 5988a4eb6efaa..cb78ce7af0b38 100644 --- a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi +++ b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi @@ -71,7 +71,7 @@ */ &port00 { bus-range = <1 1>; - wifi0: network@0,0 { + wifi0: wifi@0,0 { compatible = "pci14e4,4425"; reg = <0x10000 0x0 0x0 0x0 0x0>; /* To be filled by the loader */ -- GitLab From f5fe78cfcba1c11e82a882094de873d57480c2d5 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Fri, 13 Jun 2025 21:46:08 +0000 Subject: [PATCH 1886/2211] platform/mellanox: mlxbf-tmfifo: fix vring_desc.len assignment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 109f4d29dade8ae5b4ac6325af9d1bc24b4230f8 ] Fix warnings reported by sparse, related to incorrect type: drivers/platform/mellanox/mlxbf-tmfifo.c:284:38: warning: incorrect type in assignment (different base types) drivers/platform/mellanox/mlxbf-tmfifo.c:284:38: expected restricted __virtio32 [usertype] len drivers/platform/mellanox/mlxbf-tmfifo.c:284:38: got unsigned long Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202404040339.S7CUIgf3-lkp@intel.com/ Fixes: 78034cbece79 ("platform/mellanox: mlxbf-tmfifo: Drop the Rx packet if no more descriptors") Signed-off-by: David Thompson Link: https://lore.kernel.org/r/20250613214608.2250130-1-davthompson@nvidia.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/mellanox/mlxbf-tmfifo.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c index 6c834e39352d6..d2c27cc0733bb 100644 --- a/drivers/platform/mellanox/mlxbf-tmfifo.c +++ b/drivers/platform/mellanox/mlxbf-tmfifo.c @@ -281,7 +281,8 @@ static int mlxbf_tmfifo_alloc_vrings(struct mlxbf_tmfifo *fifo, vring->align = SMP_CACHE_BYTES; vring->index = i; vring->vdev_id = tm_vdev->vdev.id.device; - vring->drop_desc.len = VRING_DROP_DESC_MAX_LEN; + vring->drop_desc.len = cpu_to_virtio32(&tm_vdev->vdev, + VRING_DROP_DESC_MAX_LEN); dev = &tm_vdev->vdev.dev; size = vring_size(vring->num, vring->align); -- GitLab From 9d2ef890e49963b768d4fe5a33029aacd9f6b93f Mon Sep 17 00:00:00 2001 From: Or Har-Toov Date: Mon, 16 Jun 2025 11:17:01 +0300 Subject: [PATCH 1887/2211] RDMA/mlx5: Fix unsafe xarray access in implicit ODP handling [ Upstream commit 2c6b640ea08bff1a192bf87fa45246ff1e40767c ] __xa_store() and __xa_erase() were used without holding the proper lock, which led to a lockdep warning due to unsafe RCU usage. This patch replaces them with xa_store() and xa_erase(), which perform the necessary locking internally. ============================= WARNING: suspicious RCPU usage 6.14.0-rc7_for_upstream_debug_2025_03_18_15_01 #1 Not tainted ----------------------------- ./include/linux/xarray.h:1211 suspicious rcu_dereference_protected() usage! other info that might help us debug this: rcu_scheduler_active = 2, debug_locks = 1 3 locks held by kworker/u136:0/219: at: process_one_work+0xbe4/0x15f0 process_one_work+0x75c/0x15f0 pagefault_mr+0x9a5/0x1390 [mlx5_ib] stack backtrace: CPU: 14 UID: 0 PID: 219 Comm: kworker/u136:0 Not tainted 6.14.0-rc7_for_upstream_debug_2025_03_18_15_01 #1 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014 Workqueue: mlx5_ib_page_fault mlx5_ib_eqe_pf_action [mlx5_ib] Call Trace: dump_stack_lvl+0xa8/0xc0 lockdep_rcu_suspicious+0x1e6/0x260 xas_create+0xb8a/0xee0 xas_store+0x73/0x14c0 __xa_store+0x13c/0x220 ? xa_store_range+0x390/0x390 ? spin_bug+0x1d0/0x1d0 pagefault_mr+0xcb5/0x1390 [mlx5_ib] ? _raw_spin_unlock+0x1f/0x30 mlx5_ib_eqe_pf_action+0x3be/0x2620 [mlx5_ib] ? lockdep_hardirqs_on_prepare+0x400/0x400 ? mlx5_ib_invalidate_range+0xcb0/0xcb0 [mlx5_ib] process_one_work+0x7db/0x15f0 ? pwq_dec_nr_in_flight+0xda0/0xda0 ? assign_work+0x168/0x240 worker_thread+0x57d/0xcd0 ? rescuer_thread+0xc40/0xc40 kthread+0x3b3/0x800 ? kthread_is_per_cpu+0xb0/0xb0 ? lock_downgrade+0x680/0x680 ? do_raw_spin_lock+0x12d/0x270 ? spin_bug+0x1d0/0x1d0 ? finish_task_switch.isra.0+0x284/0x9e0 ? lockdep_hardirqs_on_prepare+0x284/0x400 ? kthread_is_per_cpu+0xb0/0xb0 ret_from_fork+0x2d/0x70 ? kthread_is_per_cpu+0xb0/0xb0 ret_from_fork_asm+0x11/0x20 Fixes: d3d930411ce3 ("RDMA/mlx5: Fix implicit ODP use after free") Link: https://patch.msgid.link/r/a85ddd16f45c8cb2bc0a188c2b0fcedfce975eb8.1750061791.git.leon@kernel.org Signed-off-by: Or Har-Toov Reviewed-by: Patrisious Haddad Signed-off-by: Leon Romanovsky Signed-off-by: Jason Gunthorpe Signed-off-by: Sasha Levin --- drivers/infiniband/hw/mlx5/odp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/odp.c b/drivers/infiniband/hw/mlx5/odp.c index e158d5b1ab17b..98a76c9db7aba 100644 --- a/drivers/infiniband/hw/mlx5/odp.c +++ b/drivers/infiniband/hw/mlx5/odp.c @@ -247,8 +247,8 @@ static void destroy_unused_implicit_child_mr(struct mlx5_ib_mr *mr) } if (MLX5_CAP_ODP(mr_to_mdev(mr)->mdev, mem_page_fault)) - __xa_erase(&mr_to_mdev(mr)->odp_mkeys, - mlx5_base_mkey(mr->mmkey.key)); + xa_erase(&mr_to_mdev(mr)->odp_mkeys, + mlx5_base_mkey(mr->mmkey.key)); xa_unlock(&imr->implicit_children); /* Freeing a MR is a sleeping operation, so bounce to a work queue */ @@ -521,8 +521,8 @@ static struct mlx5_ib_mr *implicit_get_child_mr(struct mlx5_ib_mr *imr, } if (MLX5_CAP_ODP(dev->mdev, mem_page_fault)) { - ret = __xa_store(&dev->odp_mkeys, mlx5_base_mkey(mr->mmkey.key), - &mr->mmkey, GFP_KERNEL); + ret = xa_store(&dev->odp_mkeys, mlx5_base_mkey(mr->mmkey.key), + &mr->mmkey, GFP_KERNEL); if (xa_is_err(ret)) { ret = ERR_PTR(xa_err(ret)); __xa_erase(&imr->implicit_children, idx); -- GitLab From 93fccfa71c66a4003b3d2fef3a38de7307e14a4e Mon Sep 17 00:00:00 2001 From: Mark Zhang Date: Tue, 17 Jun 2025 11:13:55 +0300 Subject: [PATCH 1888/2211] RDMA/mlx5: Initialize obj_event->obj_sub_list before xa_insert [ Upstream commit 8edab8a72d67742f87e9dc2e2b0cdfddda5dc29a ] The obj_event may be loaded immediately after inserted, then if the list_head is not initialized then we may get a poisonous pointer. This fixes the crash below: mlx5_core 0000:03:00.0: MLX5E: StrdRq(1) RqSz(8) StrdSz(2048) RxCqeCmprss(0 enhanced) mlx5_core.sf mlx5_core.sf.4: firmware version: 32.38.3056 mlx5_core 0000:03:00.0 en3f0pf0sf2002: renamed from eth0 mlx5_core.sf mlx5_core.sf.4: Rate limit: 127 rates are supported, range: 0Mbps to 195312Mbps IPv6: ADDRCONF(NETDEV_CHANGE): en3f0pf0sf2002: link becomes ready Unable to handle kernel NULL pointer dereference at virtual address 0000000000000060 Mem abort info: ESR = 0x96000006 EC = 0x25: DABT (current EL), IL = 32 bits SET = 0, FnV = 0 EA = 0, S1PTW = 0 Data abort info: ISV = 0, ISS = 0x00000006 CM = 0, WnR = 0 user pgtable: 4k pages, 48-bit VAs, pgdp=00000007760fb000 [0000000000000060] pgd=000000076f6d7003, p4d=000000076f6d7003, pud=0000000777841003, pmd=0000000000000000 Internal error: Oops: 96000006 [#1] SMP Modules linked in: ipmb_host(OE) act_mirred(E) cls_flower(E) sch_ingress(E) mptcp_diag(E) udp_diag(E) raw_diag(E) unix_diag(E) tcp_diag(E) inet_diag(E) binfmt_misc(E) bonding(OE) rdma_ucm(OE) rdma_cm(OE) iw_cm(OE) ib_ipoib(OE) ib_cm(OE) isofs(E) cdrom(E) mst_pciconf(OE) ib_umad(OE) mlx5_ib(OE) ipmb_dev_int(OE) mlx5_core(OE) kpatch_15237886(OEK) mlxdevm(OE) auxiliary(OE) ib_uverbs(OE) ib_core(OE) psample(E) mlxfw(OE) tls(E) sunrpc(E) vfat(E) fat(E) crct10dif_ce(E) ghash_ce(E) sha1_ce(E) sbsa_gwdt(E) virtio_console(E) ext4(E) mbcache(E) jbd2(E) xfs(E) libcrc32c(E) mmc_block(E) virtio_net(E) net_failover(E) failover(E) sha2_ce(E) sha256_arm64(E) nvme(OE) nvme_core(OE) gpio_mlxbf3(OE) mlx_compat(OE) mlxbf_pmc(OE) i2c_mlxbf(OE) sdhci_of_dwcmshc(OE) pinctrl_mlxbf3(OE) mlxbf_pka(OE) gpio_generic(E) i2c_core(E) mmc_core(E) mlxbf_gige(OE) vitesse(E) pwr_mlxbf(OE) mlxbf_tmfifo(OE) micrel(E) mlxbf_bootctl(OE) virtio_ring(E) virtio(E) ipmi_devintf(E) ipmi_msghandler(E) [last unloaded: mst_pci] CPU: 11 PID: 20913 Comm: rte-worker-11 Kdump: loaded Tainted: G OE K 5.10.134-13.1.an8.aarch64 #1 Hardware name: https://www.mellanox.com BlueField-3 SmartNIC Main Card/BlueField-3 SmartNIC Main Card, BIOS 4.2.2.12968 Oct 26 2023 pstate: a0400089 (NzCv daIf +PAN -UAO -TCO BTYPE=--) pc : dispatch_event_fd+0x68/0x300 [mlx5_ib] lr : devx_event_notifier+0xcc/0x228 [mlx5_ib] sp : ffff80001005bcf0 x29: ffff80001005bcf0 x28: 0000000000000001 x27: ffff244e0740a1d8 x26: ffff244e0740a1d0 x25: ffffda56beff5ae0 x24: ffffda56bf911618 x23: ffff244e0596a480 x22: ffff244e0596a480 x21: ffff244d8312ad90 x20: ffff244e0596a480 x19: fffffffffffffff0 x18: 0000000000000000 x17: 0000000000000000 x16: ffffda56be66d620 x15: 0000000000000000 x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 x11: 0000000000000040 x10: ffffda56bfcafb50 x9 : ffffda5655c25f2c x8 : 0000000000000010 x7 : 0000000000000000 x6 : ffff24545a2e24b8 x5 : 0000000000000003 x4 : ffff80001005bd28 x3 : 0000000000000000 x2 : 0000000000000000 x1 : ffff244e0596a480 x0 : ffff244d8312ad90 Call trace: dispatch_event_fd+0x68/0x300 [mlx5_ib] devx_event_notifier+0xcc/0x228 [mlx5_ib] atomic_notifier_call_chain+0x58/0x80 mlx5_eq_async_int+0x148/0x2b0 [mlx5_core] atomic_notifier_call_chain+0x58/0x80 irq_int_handler+0x20/0x30 [mlx5_core] __handle_irq_event_percpu+0x60/0x220 handle_irq_event_percpu+0x3c/0x90 handle_irq_event+0x58/0x158 handle_fasteoi_irq+0xfc/0x188 generic_handle_irq+0x34/0x48 ... Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX") Link: https://patch.msgid.link/r/3ce7f20e0d1a03dc7de6e57494ec4b8eaf1f05c2.1750147949.git.leon@kernel.org Signed-off-by: Mark Zhang Signed-off-by: Leon Romanovsky Signed-off-by: Jason Gunthorpe Signed-off-by: Sasha Levin --- drivers/infiniband/hw/mlx5/devx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c index 69999d8d24f37..f49f78b69ab9c 100644 --- a/drivers/infiniband/hw/mlx5/devx.c +++ b/drivers/infiniband/hw/mlx5/devx.c @@ -1914,6 +1914,7 @@ subscribe_event_xa_alloc(struct mlx5_devx_event_table *devx_event_table, /* Level1 is valid for future use, no need to free */ return -ENOMEM; + INIT_LIST_HEAD(&obj_event->obj_sub_list); err = xa_insert(&event->object_ids, key_level2, obj_event, @@ -1922,7 +1923,6 @@ subscribe_event_xa_alloc(struct mlx5_devx_event_table *devx_event_table, kfree(obj_event); return err; } - INIT_LIST_HEAD(&obj_event->obj_sub_list); } return 0; -- GitLab From 3c94212b57bedec3a386ef3da1ef00602f5c3d1d Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Thu, 12 Jun 2025 14:52:50 -0700 Subject: [PATCH 1889/2211] nfs: Clean up /proc/net/rpc/nfs when nfs_fs_proc_net_init() fails. [ Upstream commit e8d6f3ab59468e230f3253efe5cb63efa35289f7 ] syzbot reported a warning below [1] following a fault injection in nfs_fs_proc_net_init(). [0] When nfs_fs_proc_net_init() fails, /proc/net/rpc/nfs is not removed. Later, rpc_proc_exit() tries to remove /proc/net/rpc, and the warning is logged as the directory is not empty. Let's handle the error of nfs_fs_proc_net_init() properly. [0]: FAULT_INJECTION: forcing a failure. name failslab, interval 1, probability 0, space 0, times 0 CPU: 1 UID: 0 PID: 6120 Comm: syz.2.27 Not tainted 6.16.0-rc1-syzkaller-00010-g2c4a1f3fe03e #0 PREEMPT(full) Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/07/2025 Call Trace: dump_stack_lvl (lib/dump_stack.c:123) should_fail_ex (lib/fault-inject.c:73 lib/fault-inject.c:174) should_failslab (mm/failslab.c:46) kmem_cache_alloc_noprof (mm/slub.c:4178 mm/slub.c:4204) __proc_create (fs/proc/generic.c:427) proc_create_reg (fs/proc/generic.c:554) proc_create_net_data (fs/proc/proc_net.c:120) nfs_fs_proc_net_init (fs/nfs/client.c:1409) nfs_net_init (fs/nfs/inode.c:2600) ops_init (net/core/net_namespace.c:138) setup_net (net/core/net_namespace.c:443) copy_net_ns (net/core/net_namespace.c:576) create_new_namespaces (kernel/nsproxy.c:110) unshare_nsproxy_namespaces (kernel/nsproxy.c:218 (discriminator 4)) ksys_unshare (kernel/fork.c:3123) __x64_sys_unshare (kernel/fork.c:3190) do_syscall_64 (arch/x86/entry/syscall_64.c:63 arch/x86/entry/syscall_64.c:94) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) [1]: remove_proc_entry: removing non-empty directory 'net/rpc', leaking at least 'nfs' WARNING: CPU: 1 PID: 6120 at fs/proc/generic.c:727 remove_proc_entry+0x45e/0x530 fs/proc/generic.c:727 Modules linked in: CPU: 1 UID: 0 PID: 6120 Comm: syz.2.27 Not tainted 6.16.0-rc1-syzkaller-00010-g2c4a1f3fe03e #0 PREEMPT(full) Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/07/2025 RIP: 0010:remove_proc_entry+0x45e/0x530 fs/proc/generic.c:727 Code: 3c 02 00 0f 85 85 00 00 00 48 8b 93 d8 00 00 00 4d 89 f0 4c 89 e9 48 c7 c6 40 ba a2 8b 48 c7 c7 60 b9 a2 8b e8 33 81 1d ff 90 <0f> 0b 90 90 e9 5f fe ff ff e8 04 69 5e ff 90 48 b8 00 00 00 00 00 RSP: 0018:ffffc90003637b08 EFLAGS: 00010282 RAX: 0000000000000000 RBX: ffff88805f534140 RCX: ffffffff817a92c8 RDX: ffff88807da99e00 RSI: ffffffff817a92d5 RDI: 0000000000000001 RBP: ffff888033431ac0 R08: 0000000000000001 R09: 0000000000000000 R10: 0000000000000001 R11: 0000000000000001 R12: ffff888033431a00 R13: ffff888033431ae4 R14: ffff888033184724 R15: dffffc0000000000 FS: 0000555580328500(0000) GS:ffff888124a62000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f71733743e0 CR3: 000000007f618000 CR4: 00000000003526f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: sunrpc_exit_net+0x46/0x90 net/sunrpc/sunrpc_syms.c:76 ops_exit_list net/core/net_namespace.c:200 [inline] ops_undo_list+0x2eb/0xab0 net/core/net_namespace.c:253 setup_net+0x2e1/0x510 net/core/net_namespace.c:457 copy_net_ns+0x2a6/0x5f0 net/core/net_namespace.c:574 create_new_namespaces+0x3ea/0xa90 kernel/nsproxy.c:110 unshare_nsproxy_namespaces+0xc0/0x1f0 kernel/nsproxy.c:218 ksys_unshare+0x45b/0xa40 kernel/fork.c:3121 __do_sys_unshare kernel/fork.c:3192 [inline] __se_sys_unshare kernel/fork.c:3190 [inline] __x64_sys_unshare+0x31/0x40 kernel/fork.c:3190 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xcd/0x490 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7fa1a6b8e929 Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 a8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007fff3a090368 EFLAGS: 00000246 ORIG_RAX: 0000000000000110 RAX: ffffffffffffffda RBX: 00007fa1a6db5fa0 RCX: 00007fa1a6b8e929 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000040000080 RBP: 00007fa1a6c10b39 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 R13: 00007fa1a6db5fa0 R14: 00007fa1a6db5fa0 R15: 0000000000000001 Fixes: d47151b79e32 ("nfs: expose /proc/net/sunrpc/nfs in net namespaces") Reported-by: syzbot+a4cc4ac22daa4a71b87c@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=a4cc4ac22daa4a71b87c Tested-by: syzbot+a4cc4ac22daa4a71b87c@syzkaller.appspotmail.com Signed-off-by: Kuniyuki Iwashima Signed-off-by: Anna Schumaker Signed-off-by: Sasha Levin --- fs/nfs/inode.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 16607b24ab9c1..8827cb00f86d5 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -2586,15 +2586,26 @@ EXPORT_SYMBOL_GPL(nfs_net_id); static int nfs_net_init(struct net *net) { struct nfs_net *nn = net_generic(net, nfs_net_id); + int err; nfs_clients_init(net); if (!rpc_proc_register(net, &nn->rpcstats)) { - nfs_clients_exit(net); - return -ENOMEM; + err = -ENOMEM; + goto err_proc_rpc; } - return nfs_fs_proc_net_init(net); + err = nfs_fs_proc_net_init(net); + if (err) + goto err_proc_nfs; + + return 0; + +err_proc_nfs: + rpc_proc_unregister(net, "nfs"); +err_proc_rpc: + nfs_clients_exit(net); + return err; } static void nfs_net_exit(struct net *net) -- GitLab From 864a54c1243ed3ca60baa4bc492dede1361f4c83 Mon Sep 17 00:00:00 2001 From: Benjamin Coddington Date: Thu, 19 Jun 2025 11:02:21 -0400 Subject: [PATCH 1890/2211] NFSv4/pNFS: Fix a race to wake on NFS_LAYOUT_DRAIN [ Upstream commit c01776287414ca43412d1319d2877cbad65444ac ] We found a few different systems hung up in writeback waiting on the same page lock, and one task waiting on the NFS_LAYOUT_DRAIN bit in pnfs_update_layout(), however the pnfs_layout_hdr's plh_outstanding count was zero. It seems most likely that this is another race between the waiter and waker similar to commit ed0172af5d6f ("SUNRPC: Fix a race to wake a sync task"). Fix it up by applying the advised barrier. Fixes: 880265c77ac4 ("pNFS: Avoid a live lock condition in pnfs_update_layout()") Signed-off-by: Benjamin Coddington Signed-off-by: Anna Schumaker Signed-off-by: Sasha Levin --- fs/nfs/pnfs.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 683e09be25adf..6b888e9ff394a 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -2051,8 +2051,10 @@ static void nfs_layoutget_begin(struct pnfs_layout_hdr *lo) static void nfs_layoutget_end(struct pnfs_layout_hdr *lo) { if (atomic_dec_and_test(&lo->plh_outstanding) && - test_and_clear_bit(NFS_LAYOUT_DRAIN, &lo->plh_flags)) + test_and_clear_bit(NFS_LAYOUT_DRAIN, &lo->plh_flags)) { + smp_mb__after_atomic(); wake_up_bit(&lo->plh_flags, NFS_LAYOUT_DRAIN); + } } static bool pnfs_is_first_layoutget(struct pnfs_layout_hdr *lo) -- GitLab From 350dae778b637da0bb2cb6356a5cbbe44f986b0f Mon Sep 17 00:00:00 2001 From: Thomas Fourier Date: Tue, 17 Jun 2025 18:11:11 +0200 Subject: [PATCH 1891/2211] scsi: qla2xxx: Fix DMA mapping test in qla24xx_get_port_database() [ Upstream commit c3b214719a87735d4f67333a8ef3c0e31a34837c ] dma_map_XXX() functions return as error values DMA_MAPPING_ERROR which is often ~0. The error value should be tested with dma_mapping_error() like it was done in qla26xx_dport_diagnostics(). Fixes: 818c7f87a177 ("scsi: qla2xxx: Add changes in preparation for vendor extended FDMI/RDP") Signed-off-by: Thomas Fourier Link: https://lore.kernel.org/r/20250617161115.39888-2-fourier.thomas@gmail.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/qla2xxx/qla_mbx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 0cd6f3e148824..13b6cb1b93acd 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c @@ -2147,7 +2147,7 @@ qla24xx_get_port_database(scsi_qla_host_t *vha, u16 nport_handle, pdb_dma = dma_map_single(&vha->hw->pdev->dev, pdb, sizeof(*pdb), DMA_FROM_DEVICE); - if (!pdb_dma) { + if (dma_mapping_error(&vha->hw->pdev->dev, pdb_dma)) { ql_log(ql_log_warn, vha, 0x1116, "Failed to map dma buffer.\n"); return QLA_MEMORY_ALLOC_FAILED; } -- GitLab From 218ae6bfe2535f0dcdc1890d8fc3ea705fcb1205 Mon Sep 17 00:00:00 2001 From: Thomas Fourier Date: Wed, 18 Jun 2025 09:17:37 +0200 Subject: [PATCH 1892/2211] scsi: qla4xxx: Fix missing DMA mapping error in qla4xxx_alloc_pdu() [ Upstream commit 00f452a1b084efbe8dcb60a29860527944a002a1 ] dma_map_XXX() can fail and should be tested for errors with dma_mapping_error(). Fixes: b3a271a94d00 ("[SCSI] qla4xxx: support iscsiadm session mgmt") Signed-off-by: Thomas Fourier Link: https://lore.kernel.org/r/20250618071742.21822-2-fourier.thomas@gmail.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/qla4xxx/ql4_os.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index d91f54a6e752f..97e9ca5a2a02c 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c @@ -3420,6 +3420,8 @@ static int qla4xxx_alloc_pdu(struct iscsi_task *task, uint8_t opcode) task_data->data_dma = dma_map_single(&ha->pdev->dev, task->data, task->data_count, DMA_TO_DEVICE); + if (dma_mapping_error(&ha->pdev->dev, task_data->data_dma)) + return -ENOMEM; } DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n", -- GitLab From b1abc5ab47d63418ebf08a9890c59f142f779635 Mon Sep 17 00:00:00 2001 From: jackysliu <1972843537@qq.com> Date: Thu, 19 Jun 2025 12:03:02 +0800 Subject: [PATCH 1893/2211] scsi: sd: Fix VPD page 0xb7 length check [ Upstream commit 8889676cd62161896f1d861ce294adc29c4f2cb5 ] sd_read_block_limits_ext() currently assumes that vpd->len excludes the size of the page header. However, vpd->len describes the size of the entire VPD page, therefore the sanity check is incorrect. In practice this is not really a problem since we don't attach VPD pages unless they actually report data trailing the header. But fix the length check regardless. This issue was identified by Wukong-Agent (formerly Tencent Woodpecker), a code security AI agent, through static code analysis. [mkp: rewrote patch description] Signed-off-by: jackysliu <1972843537@qq.com> Link: https://lore.kernel.org/r/tencent_ADA5210D1317EEB6CD7F3DE9FE9DA4591D05@qq.com Fixes: 96b171d6dba6 ("scsi: core: Query the Block Limits Extension VPD page") Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/sd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 8947dab132d78..86dde3e7debba 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -3388,7 +3388,7 @@ static void sd_read_block_limits_ext(struct scsi_disk *sdkp) rcu_read_lock(); vpd = rcu_dereference(sdkp->device->vpd_pgb7); - if (vpd && vpd->len >= 2) + if (vpd && vpd->len >= 6) sdkp->rscs = vpd->data[5] & 1; rcu_read_unlock(); } -- GitLab From e4ff9dedeb56762450ac8379a1c27be7f3e1796d Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Tue, 24 Jun 2025 11:16:44 -0700 Subject: [PATCH 1894/2211] scsi: ufs: core: Fix spelling of a sysfs attribute name [ Upstream commit 021f243627ead17eb6500170256d3d9be787dad8 ] Change "resourse" into "resource" in the name of a sysfs attribute. Fixes: d829fc8a1058 ("scsi: ufs: sysfs: unit descriptor") Signed-off-by: Bart Van Assche Link: https://lore.kernel.org/r/20250624181658.336035-1-bvanassche@acm.org Reviewed-by: Avri Altman Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- Documentation/ABI/testing/sysfs-driver-ufs | 2 +- drivers/ufs/core/ufs-sysfs.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-driver-ufs b/Documentation/ABI/testing/sysfs-driver-ufs index 5fa6655aee840..16f17e91ee496 100644 --- a/Documentation/ABI/testing/sysfs-driver-ufs +++ b/Documentation/ABI/testing/sysfs-driver-ufs @@ -711,7 +711,7 @@ Description: This file shows the thin provisioning type. This is one of The file is read only. -What: /sys/class/scsi_device/*/device/unit_descriptor/physical_memory_resourse_count +What: /sys/class/scsi_device/*/device/unit_descriptor/physical_memory_resource_count Date: February 2018 Contact: Stanislav Nijnikov Description: This file shows the total physical memory resources. This is diff --git a/drivers/ufs/core/ufs-sysfs.c b/drivers/ufs/core/ufs-sysfs.c index 796e37a1d859f..f8397ef3cf8df 100644 --- a/drivers/ufs/core/ufs-sysfs.c +++ b/drivers/ufs/core/ufs-sysfs.c @@ -1608,7 +1608,7 @@ UFS_UNIT_DESC_PARAM(logical_block_size, _LOGICAL_BLK_SIZE, 1); UFS_UNIT_DESC_PARAM(logical_block_count, _LOGICAL_BLK_COUNT, 8); UFS_UNIT_DESC_PARAM(erase_block_size, _ERASE_BLK_SIZE, 4); UFS_UNIT_DESC_PARAM(provisioning_type, _PROVISIONING_TYPE, 1); -UFS_UNIT_DESC_PARAM(physical_memory_resourse_count, _PHY_MEM_RSRC_CNT, 8); +UFS_UNIT_DESC_PARAM(physical_memory_resource_count, _PHY_MEM_RSRC_CNT, 8); UFS_UNIT_DESC_PARAM(context_capabilities, _CTX_CAPABILITIES, 2); UFS_UNIT_DESC_PARAM(large_unit_granularity, _LARGE_UNIT_SIZE_M1, 1); UFS_UNIT_DESC_PARAM(wb_buf_alloc_units, _WB_BUF_ALLOC_UNITS, 4); @@ -1625,7 +1625,7 @@ static struct attribute *ufs_sysfs_unit_descriptor[] = { &dev_attr_logical_block_count.attr, &dev_attr_erase_block_size.attr, &dev_attr_provisioning_type.attr, - &dev_attr_physical_memory_resourse_count.attr, + &dev_attr_physical_memory_resource_count.attr, &dev_attr_context_capabilities.attr, &dev_attr_large_unit_granularity.attr, &dev_attr_wb_buf_alloc_units.attr, -- GitLab From a33a0c15b7621b8ec3fc9e550a2c907584cba6ed Mon Sep 17 00:00:00 2001 From: Patrisious Haddad Date: Mon, 16 Jun 2025 12:14:52 +0300 Subject: [PATCH 1895/2211] RDMA/mlx5: Fix HW counters query for non-representor devices [ Upstream commit 3cc1dbfddf88dc5ecce0a75185061403b1f7352d ] To get the device HW counters, a non-representor switchdev device should use the mlx5_ib_query_q_counters() function and query all of the available counters. While a representor device in switchdev mode should use the mlx5_ib_query_q_counters_vport() function and query only the Q_Counters without the PPCNT counters and congestion control counters, since they aren't relevant for a representor device. Currently a non-representor switchdev device skips querying the PPCNT counters and congestion control counters, leaving them unupdated. Fix that by properly querying those counters for non-representor devices. Fixes: d22467a71ebe ("RDMA/mlx5: Expand switchdev Q-counters to expose representor statistics") Signed-off-by: Patrisious Haddad Reviewed-by: Maher Sanalla Link: https://patch.msgid.link/56bf8af4ca8c58e3fb9f7e47b1dca2009eeeed81.1750064969.git.leon@kernel.org Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/infiniband/hw/mlx5/counters.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/infiniband/hw/mlx5/counters.c b/drivers/infiniband/hw/mlx5/counters.c index 81cfa74147a18..fbabc5ac9ef27 100644 --- a/drivers/infiniband/hw/mlx5/counters.c +++ b/drivers/infiniband/hw/mlx5/counters.c @@ -391,7 +391,7 @@ static int do_get_hw_stats(struct ib_device *ibdev, return ret; /* We don't expose device counters over Vports */ - if (is_mdev_switchdev_mode(dev->mdev) && port_num != 0) + if (is_mdev_switchdev_mode(dev->mdev) && dev->is_rep && port_num != 0) goto done; if (MLX5_CAP_PCAM_FEATURE(dev->mdev, rx_icrc_encapsulated_counter)) { -- GitLab From 3d8d401d3333e218c8fd6a06df9d15566e17016c Mon Sep 17 00:00:00 2001 From: Patrisious Haddad Date: Mon, 16 Jun 2025 12:14:53 +0300 Subject: [PATCH 1896/2211] RDMA/mlx5: Fix CC counters query for MPV [ Upstream commit acd245b1e33fc4b9d0f2e3372021d632f7ee0652 ] In case, CC counters are querying for the second port use the correct core device for the query instead of always using the master core device. Fixes: aac4492ef23a ("IB/mlx5: Update counter implementation for dual port RoCE") Signed-off-by: Patrisious Haddad Reviewed-by: Michael Guralnik Link: https://patch.msgid.link/9cace74dcf106116118bebfa9146d40d4166c6b0.1750064969.git.leon@kernel.org Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/infiniband/hw/mlx5/counters.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/infiniband/hw/mlx5/counters.c b/drivers/infiniband/hw/mlx5/counters.c index fbabc5ac9ef27..ad6c195d077bb 100644 --- a/drivers/infiniband/hw/mlx5/counters.c +++ b/drivers/infiniband/hw/mlx5/counters.c @@ -411,7 +411,7 @@ static int do_get_hw_stats(struct ib_device *ibdev, */ goto done; } - ret = mlx5_lag_query_cong_counters(dev->mdev, + ret = mlx5_lag_query_cong_counters(mdev, stats->value + cnts->num_q_counters, cnts->num_cong_counters, -- GitLab From bd69049f981d2b174800e99ff1a7e9e2745319ea Mon Sep 17 00:00:00 2001 From: Patrisious Haddad Date: Mon, 16 Jun 2025 12:14:54 +0300 Subject: [PATCH 1897/2211] RDMA/mlx5: Fix vport loopback for MPV device [ Upstream commit a9a9e68954f29b1e197663f76289db4879fd51bb ] Always enable vport loopback for both MPV devices on driver start. Previously in some cases related to MPV RoCE, packets weren't correctly executing loopback check at vport in FW, since it was disabled. Due to complexity of identifying such cases for MPV always enable vport loopback for both GVMIs when binding the slave to the master port. Fixes: 0042f9e458a5 ("RDMA/mlx5: Enable vport loopback when user context or QP mandate") Signed-off-by: Patrisious Haddad Reviewed-by: Mark Bloch Link: https://patch.msgid.link/d4298f5ebb2197459e9e7221c51ecd6a34699847.1750064969.git.leon@kernel.org Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/infiniband/hw/mlx5/main.c | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 8c47cb4edd0a0..435c456a4fd5b 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -1766,6 +1766,33 @@ static void deallocate_uars(struct mlx5_ib_dev *dev, context->devx_uid); } +static int mlx5_ib_enable_lb_mp(struct mlx5_core_dev *master, + struct mlx5_core_dev *slave) +{ + int err; + + err = mlx5_nic_vport_update_local_lb(master, true); + if (err) + return err; + + err = mlx5_nic_vport_update_local_lb(slave, true); + if (err) + goto out; + + return 0; + +out: + mlx5_nic_vport_update_local_lb(master, false); + return err; +} + +static void mlx5_ib_disable_lb_mp(struct mlx5_core_dev *master, + struct mlx5_core_dev *slave) +{ + mlx5_nic_vport_update_local_lb(slave, false); + mlx5_nic_vport_update_local_lb(master, false); +} + int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev, bool td, bool qp) { int err = 0; @@ -3448,6 +3475,8 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev, lockdep_assert_held(&mlx5_ib_multiport_mutex); + mlx5_ib_disable_lb_mp(ibdev->mdev, mpi->mdev); + mlx5_core_mp_event_replay(ibdev->mdev, MLX5_DRIVER_EVENT_AFFILIATION_REMOVED, NULL); @@ -3543,6 +3572,10 @@ static bool mlx5_ib_bind_slave_port(struct mlx5_ib_dev *ibdev, MLX5_DRIVER_EVENT_AFFILIATION_DONE, &key); + err = mlx5_ib_enable_lb_mp(ibdev->mdev, mpi->mdev); + if (err) + goto unbind; + return true; unbind: -- GitLab From 4bbdb8dd35b4c4f769c3aded61c9bfa97fc693c6 Mon Sep 17 00:00:00 2001 From: Alok Tiwari Date: Wed, 18 Jun 2025 23:05:00 -0700 Subject: [PATCH 1898/2211] platform/mellanox: mlxbf-pmc: Fix duplicate event ID for CACHE_DATA1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 173bbec6693f3f3f00dac144f3aa0cd62fb60d33 ] same ID (103) was assigned to both GDC_BANK0_G_RSE_PIPE_CACHE_DATA0 and GDC_BANK0_G_RSE_PIPE_CACHE_DATA1. This could lead to incorrect event mapping. Updated the ID to 104 to ensure uniqueness. Fixes: 423c3361855c ("platform/mellanox: mlxbf-pmc: Add support for BlueField-3") Signed-off-by: Alok Tiwari Reviewed-by: David Thompson Link: https://lore.kernel.org/r/20250619060502.3594350-1-alok.a.tiwari@oracle.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/mellanox/mlxbf-pmc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/platform/mellanox/mlxbf-pmc.c b/drivers/platform/mellanox/mlxbf-pmc.c index 9ff7b487dc489..fbb8128d19de4 100644 --- a/drivers/platform/mellanox/mlxbf-pmc.c +++ b/drivers/platform/mellanox/mlxbf-pmc.c @@ -710,7 +710,7 @@ static const struct mlxbf_pmc_events mlxbf_pmc_llt_events[] = { {101, "GDC_BANK0_HIT_DCL_PARTIAL"}, {102, "GDC_BANK0_EVICT_DCL"}, {103, "GDC_BANK0_G_RSE_PIPE_CACHE_DATA0"}, - {103, "GDC_BANK0_G_RSE_PIPE_CACHE_DATA1"}, + {104, "GDC_BANK0_G_RSE_PIPE_CACHE_DATA1"}, {105, "GDC_BANK0_ARB_STRB"}, {106, "GDC_BANK0_ARB_WAIT"}, {107, "GDC_BANK0_GGA_STRB"}, -- GitLab From b611a5bf44e22286279d3297614a5ffb73e7724e Mon Sep 17 00:00:00 2001 From: Alok Tiwari Date: Sun, 22 Jun 2025 00:29:12 -0700 Subject: [PATCH 1899/2211] platform/mellanox: nvsw-sn2201: Fix bus number in adapter error message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit d07143b507c51c04c091081627c5a130e9d3c517 ] change error log to use correct bus number from main_mux_devs instead of cpld_devs. Fixes: 662f24826f95 ("platform/mellanox: Add support for new SN2201 system") Signed-off-by: Alok Tiwari Reviewed-by: Vadim Pasternak Link: https://lore.kernel.org/r/20250622072921.4111552-2-alok.a.tiwari@oracle.com Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/mellanox/nvsw-sn2201.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/platform/mellanox/nvsw-sn2201.c b/drivers/platform/mellanox/nvsw-sn2201.c index abe7be602f846..e708521e52740 100644 --- a/drivers/platform/mellanox/nvsw-sn2201.c +++ b/drivers/platform/mellanox/nvsw-sn2201.c @@ -1088,7 +1088,7 @@ static int nvsw_sn2201_i2c_completion_notify(void *handle, int id) if (!nvsw_sn2201->main_mux_devs->adapter) { err = -ENODEV; dev_err(nvsw_sn2201->dev, "Failed to get adapter for bus %d\n", - nvsw_sn2201->cpld_devs->nr); + nvsw_sn2201->main_mux_devs->nr); goto i2c_get_adapter_main_fail; } -- GitLab From 381c1c121979cc7bad6b110de700c62a0dc1832e Mon Sep 17 00:00:00 2001 From: Yang Li Date: Thu, 19 Jun 2025 11:01:07 +0800 Subject: [PATCH 1900/2211] Bluetooth: Prevent unintended pause by checking if advertising is active [ Upstream commit 1f029b4e30a602db33dedee5ac676e9236ad193c ] When PA Create Sync is enabled, advertising resumes unexpectedly. Therefore, it's necessary to check whether advertising is currently active before attempting to pause it. < HCI Command: LE Add Device To... (0x08|0x0011) plen 7 #1345 [hci0] 48.306205 Address type: Random (0x01) Address: 4F:84:84:5F:88:17 (Resolvable) Identity type: Random (0x01) Identity: FC:5B:8C:F7:5D:FB (Static) < HCI Command: LE Set Address Re.. (0x08|0x002d) plen 1 #1347 [hci0] 48.308023 Address resolution: Enabled (0x01) ... < HCI Command: LE Set Extended A.. (0x08|0x0039) plen 6 #1349 [hci0] 48.309650 Extended advertising: Enabled (0x01) Number of sets: 1 (0x01) Entry 0 Handle: 0x01 Duration: 0 ms (0x00) Max ext adv events: 0 ... < HCI Command: LE Periodic Adve.. (0x08|0x0044) plen 14 #1355 [hci0] 48.314575 Options: 0x0000 Use advertising SID, Advertiser Address Type and address Reporting initially enabled SID: 0x02 Adv address type: Random (0x01) Adv address: 4F:84:84:5F:88:17 (Resolvable) Identity type: Random (0x01) Identity: FC:5B:8C:F7:5D:FB (Static) Skip: 0x0000 Sync timeout: 20000 msec (0x07d0) Sync CTE type: 0x0000 Fixes: ad383c2c65a5 ("Bluetooth: hci_sync: Enable advertising when LL privacy is enabled") Signed-off-by: Yang Li Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- net/bluetooth/hci_sync.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c index 50cc60ac6242e..79d1a6ed08b29 100644 --- a/net/bluetooth/hci_sync.c +++ b/net/bluetooth/hci_sync.c @@ -2531,6 +2531,10 @@ static int hci_pause_advertising_sync(struct hci_dev *hdev) int err; int old_state; + /* If controller is not advertising we are done. */ + if (!hci_dev_test_flag(hdev, HCI_LE_ADV)) + return 0; + /* If already been paused there is nothing to do. */ if (hdev->advertising_paused) return 0; -- GitLab From e4c3176acecf0541d0bb50ace85ff050868b0817 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Wed, 18 Jun 2025 16:57:07 +0100 Subject: [PATCH 1901/2211] btrfs: fix missing error handling when searching for inode refs during log replay [ Upstream commit 6561a40ceced9082f50c374a22d5966cf9fc5f5c ] During log replay, at __add_inode_ref(), when we are searching for inode ref keys we totally ignore if btrfs_search_slot() returns an error. This may make a log replay succeed when there was an actual error and leave some metadata inconsistency in a subvolume tree. Fix this by checking if an error was returned from btrfs_search_slot() and if so, return it to the caller. Fixes: e02119d5a7b4 ("Btrfs: Add a write ahead tree log to optimize synchronous operations") Reviewed-by: Johannes Thumshirn Reviewed-by: Qu Wenruo Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/tree-log.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 9637c7cdc0cf9..40acf9ccccfe7 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -1087,7 +1087,9 @@ again: search_key.type = BTRFS_INODE_REF_KEY; search_key.offset = parent_objectid; ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0); - if (ret == 0) { + if (ret < 0) { + return ret; + } else if (ret == 0) { struct btrfs_inode_ref *victim_ref; unsigned long ptr; unsigned long ptr_end; -- GitLab From 7ac790dc2ba00499a8d671d4a24de4d4ad27e234 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Mon, 23 Jun 2025 12:11:58 +0100 Subject: [PATCH 1902/2211] btrfs: fix iteration of extrefs during log replay [ Upstream commit 54a7081ed168b72a8a2d6ef4ba3a1259705a2926 ] At __inode_add_ref() when processing extrefs, if we jump into the next label we have an undefined value of victim_name.len, since we haven't initialized it before we did the goto. This results in an invalid memory access in the next iteration of the loop since victim_name.len was not initialized to the length of the name of the current extref. Fix this by initializing victim_name.len with the current extref's name length. Fixes: e43eec81c516 ("btrfs: use struct qstr instead of name and namelen pairs") Reviewed-by: Johannes Thumshirn Reviewed-by: Qu Wenruo Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/tree-log.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 40acf9ccccfe7..3ecab032907e7 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -1162,13 +1162,13 @@ again: struct fscrypt_str victim_name; extref = (struct btrfs_inode_extref *)(base + cur_offset); + victim_name.len = btrfs_inode_extref_name_len(leaf, extref); if (btrfs_inode_extref_parent(leaf, extref) != parent_objectid) goto next; ret = read_alloc_one_name(leaf, &extref->name, - btrfs_inode_extref_name_len(leaf, extref), - &victim_name); + victim_name.len, &victim_name); if (ret) return ret; -- GitLab From 56e9882ba22f29d7e76bd832c1a71efb4f89abb4 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Thu, 6 Mar 2025 16:42:28 +0000 Subject: [PATCH 1903/2211] btrfs: return a btrfs_inode from btrfs_iget_logging() [ Upstream commit a488d8ac2c4d96ecc7da59bb35a573277204ac6b ] All callers of btrfs_iget_logging() are interested in the btrfs_inode structure rather than the VFS inode, so make btrfs_iget_logging() return the btrfs_inode instead, avoiding lots of BTRFS_I() calls. Signed-off-by: Filipe Manana Reviewed-by: David Sterba Signed-off-by: David Sterba Stable-dep-of: 5f61b961599a ("btrfs: fix inode lookup error handling during log replay") Signed-off-by: Sasha Levin --- fs/btrfs/tree-log.c | 94 ++++++++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 49 deletions(-) diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 3ecab032907e7..262523cd80476 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -138,7 +138,7 @@ static void wait_log_commit(struct btrfs_root *root, int transid); * and once to do all the other items. */ -static struct inode *btrfs_iget_logging(u64 objectid, struct btrfs_root *root) +static struct btrfs_inode *btrfs_iget_logging(u64 objectid, struct btrfs_root *root) { unsigned int nofs_flag; struct inode *inode; @@ -154,7 +154,10 @@ static struct inode *btrfs_iget_logging(u64 objectid, struct btrfs_root *root) inode = btrfs_iget(objectid, root); memalloc_nofs_restore(nofs_flag); - return inode; + if (IS_ERR(inode)) + return ERR_CAST(inode); + + return BTRFS_I(inode); } /* @@ -617,12 +620,12 @@ static int read_alloc_one_name(struct extent_buffer *eb, void *start, int len, static noinline struct inode *read_one_inode(struct btrfs_root *root, u64 objectid) { - struct inode *inode; + struct btrfs_inode *inode; inode = btrfs_iget_logging(objectid, root); if (IS_ERR(inode)) - inode = NULL; - return inode; + return NULL; + return &inode->vfs_inode; } /* replays a single extent in 'eb' at 'slot' with 'key' into the @@ -5487,7 +5490,6 @@ static int log_new_dir_dentries(struct btrfs_trans_handle *trans, ihold(&curr_inode->vfs_inode); while (true) { - struct inode *vfs_inode; struct btrfs_key key; struct btrfs_key found_key; u64 next_index; @@ -5503,7 +5505,7 @@ again: struct extent_buffer *leaf = path->nodes[0]; struct btrfs_dir_item *di; struct btrfs_key di_key; - struct inode *di_inode; + struct btrfs_inode *di_inode; int log_mode = LOG_INODE_EXISTS; int type; @@ -5530,17 +5532,16 @@ again: goto out; } - if (!need_log_inode(trans, BTRFS_I(di_inode))) { - btrfs_add_delayed_iput(BTRFS_I(di_inode)); + if (!need_log_inode(trans, di_inode)) { + btrfs_add_delayed_iput(di_inode); break; } ctx->log_new_dentries = false; if (type == BTRFS_FT_DIR) log_mode = LOG_INODE_ALL; - ret = btrfs_log_inode(trans, BTRFS_I(di_inode), - log_mode, ctx); - btrfs_add_delayed_iput(BTRFS_I(di_inode)); + ret = btrfs_log_inode(trans, di_inode, log_mode, ctx); + btrfs_add_delayed_iput(di_inode); if (ret) goto out; if (ctx->log_new_dentries) { @@ -5582,14 +5583,13 @@ again: kfree(dir_elem); btrfs_add_delayed_iput(curr_inode); - curr_inode = NULL; - vfs_inode = btrfs_iget_logging(ino, root); - if (IS_ERR(vfs_inode)) { - ret = PTR_ERR(vfs_inode); + curr_inode = btrfs_iget_logging(ino, root); + if (IS_ERR(curr_inode)) { + ret = PTR_ERR(curr_inode); + curr_inode = NULL; break; } - curr_inode = BTRFS_I(vfs_inode); } out: btrfs_free_path(path); @@ -5667,7 +5667,7 @@ static int add_conflicting_inode(struct btrfs_trans_handle *trans, struct btrfs_log_ctx *ctx) { struct btrfs_ino_list *ino_elem; - struct inode *inode; + struct btrfs_inode *inode; /* * It's rare to have a lot of conflicting inodes, in practice it is not @@ -5758,12 +5758,12 @@ static int add_conflicting_inode(struct btrfs_trans_handle *trans, * inode in LOG_INODE_EXISTS mode and rename operations update the log, * so that the log ends up with the new name and without the old name. */ - if (!need_log_inode(trans, BTRFS_I(inode))) { - btrfs_add_delayed_iput(BTRFS_I(inode)); + if (!need_log_inode(trans, inode)) { + btrfs_add_delayed_iput(inode); return 0; } - btrfs_add_delayed_iput(BTRFS_I(inode)); + btrfs_add_delayed_iput(inode); ino_elem = kmalloc(sizeof(*ino_elem), GFP_NOFS); if (!ino_elem) @@ -5799,7 +5799,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, */ while (!list_empty(&ctx->conflict_inodes)) { struct btrfs_ino_list *curr; - struct inode *inode; + struct btrfs_inode *inode; u64 ino; u64 parent; @@ -5835,9 +5835,8 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, * dir index key range logged for the directory. So we * must make sure the deletion is recorded. */ - ret = btrfs_log_inode(trans, BTRFS_I(inode), - LOG_INODE_ALL, ctx); - btrfs_add_delayed_iput(BTRFS_I(inode)); + ret = btrfs_log_inode(trans, inode, LOG_INODE_ALL, ctx); + btrfs_add_delayed_iput(inode); if (ret) break; continue; @@ -5853,8 +5852,8 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, * it again because if some other task logged the inode after * that, we can avoid doing it again. */ - if (!need_log_inode(trans, BTRFS_I(inode))) { - btrfs_add_delayed_iput(BTRFS_I(inode)); + if (!need_log_inode(trans, inode)) { + btrfs_add_delayed_iput(inode); continue; } @@ -5865,8 +5864,8 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, * well because during a rename we pin the log and update the * log with the new name before we unpin it. */ - ret = btrfs_log_inode(trans, BTRFS_I(inode), LOG_INODE_EXISTS, ctx); - btrfs_add_delayed_iput(BTRFS_I(inode)); + ret = btrfs_log_inode(trans, inode, LOG_INODE_EXISTS, ctx); + btrfs_add_delayed_iput(inode); if (ret) break; } @@ -6358,7 +6357,7 @@ static int log_new_delayed_dentries(struct btrfs_trans_handle *trans, list_for_each_entry(item, delayed_ins_list, log_list) { struct btrfs_dir_item *dir_item; - struct inode *di_inode; + struct btrfs_inode *di_inode; struct btrfs_key key; int log_mode = LOG_INODE_EXISTS; @@ -6374,8 +6373,8 @@ static int log_new_delayed_dentries(struct btrfs_trans_handle *trans, break; } - if (!need_log_inode(trans, BTRFS_I(di_inode))) { - btrfs_add_delayed_iput(BTRFS_I(di_inode)); + if (!need_log_inode(trans, di_inode)) { + btrfs_add_delayed_iput(di_inode); continue; } @@ -6383,12 +6382,12 @@ static int log_new_delayed_dentries(struct btrfs_trans_handle *trans, log_mode = LOG_INODE_ALL; ctx->log_new_dentries = false; - ret = btrfs_log_inode(trans, BTRFS_I(di_inode), log_mode, ctx); + ret = btrfs_log_inode(trans, di_inode, log_mode, ctx); if (!ret && ctx->log_new_dentries) - ret = log_new_dir_dentries(trans, BTRFS_I(di_inode), ctx); + ret = log_new_dir_dentries(trans, di_inode, ctx); - btrfs_add_delayed_iput(BTRFS_I(di_inode)); + btrfs_add_delayed_iput(di_inode); if (ret) break; @@ -6796,7 +6795,7 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans, ptr = btrfs_item_ptr_offset(leaf, slot); while (cur_offset < item_size) { struct btrfs_key inode_key; - struct inode *dir_inode; + struct btrfs_inode *dir_inode; inode_key.type = BTRFS_INODE_ITEM_KEY; inode_key.offset = 0; @@ -6845,18 +6844,16 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans, goto out; } - if (!need_log_inode(trans, BTRFS_I(dir_inode))) { - btrfs_add_delayed_iput(BTRFS_I(dir_inode)); + if (!need_log_inode(trans, dir_inode)) { + btrfs_add_delayed_iput(dir_inode); continue; } ctx->log_new_dentries = false; - ret = btrfs_log_inode(trans, BTRFS_I(dir_inode), - LOG_INODE_ALL, ctx); + ret = btrfs_log_inode(trans, dir_inode, LOG_INODE_ALL, ctx); if (!ret && ctx->log_new_dentries) - ret = log_new_dir_dentries(trans, - BTRFS_I(dir_inode), ctx); - btrfs_add_delayed_iput(BTRFS_I(dir_inode)); + ret = log_new_dir_dentries(trans, dir_inode, ctx); + btrfs_add_delayed_iput(dir_inode); if (ret) goto out; } @@ -6881,7 +6878,7 @@ static int log_new_ancestors(struct btrfs_trans_handle *trans, struct extent_buffer *leaf; int slot; struct btrfs_key search_key; - struct inode *inode; + struct btrfs_inode *inode; u64 ino; int ret = 0; @@ -6896,11 +6893,10 @@ static int log_new_ancestors(struct btrfs_trans_handle *trans, if (IS_ERR(inode)) return PTR_ERR(inode); - if (BTRFS_I(inode)->generation >= trans->transid && - need_log_inode(trans, BTRFS_I(inode))) - ret = btrfs_log_inode(trans, BTRFS_I(inode), - LOG_INODE_EXISTS, ctx); - btrfs_add_delayed_iput(BTRFS_I(inode)); + if (inode->generation >= trans->transid && + need_log_inode(trans, inode)) + ret = btrfs_log_inode(trans, inode, LOG_INODE_EXISTS, ctx); + btrfs_add_delayed_iput(inode); if (ret) return ret; -- GitLab From 0502d1127436a69b8c2e7cf309ae0ebff3332668 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Thu, 6 Mar 2025 17:11:00 +0000 Subject: [PATCH 1904/2211] btrfs: return a btrfs_inode from read_one_inode() [ Upstream commit b4c50cbb01a1b6901d2b94469636dd80fa93de81 ] All callers of read_one_inode() are mostly interested in the btrfs_inode structure rather than the VFS inode, so make read_one_inode() return the btrfs_inode instead, avoiding lots of BTRFS_I() calls. Signed-off-by: Filipe Manana Reviewed-by: David Sterba Signed-off-by: David Sterba Stable-dep-of: 5f61b961599a ("btrfs: fix inode lookup error handling during log replay") Signed-off-by: Sasha Levin --- fs/btrfs/tree-log.c | 152 +++++++++++++++++++++----------------------- 1 file changed, 73 insertions(+), 79 deletions(-) diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 262523cd80476..7a1c7070287b2 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -617,15 +617,15 @@ static int read_alloc_one_name(struct extent_buffer *eb, void *start, int len, * simple helper to read an inode off the disk from a given root * This can only be called for subvolume roots and not for the log */ -static noinline struct inode *read_one_inode(struct btrfs_root *root, - u64 objectid) +static noinline struct btrfs_inode *read_one_inode(struct btrfs_root *root, + u64 objectid) { struct btrfs_inode *inode; inode = btrfs_iget_logging(objectid, root); if (IS_ERR(inode)) return NULL; - return &inode->vfs_inode; + return inode; } /* replays a single extent in 'eb' at 'slot' with 'key' into the @@ -653,7 +653,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, u64 start = key->offset; u64 nbytes = 0; struct btrfs_file_extent_item *item; - struct inode *inode = NULL; + struct btrfs_inode *inode = NULL; unsigned long size; int ret = 0; @@ -692,8 +692,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, * file. This must be done before the btrfs_drop_extents run * so we don't try to drop this extent. */ - ret = btrfs_lookup_file_extent(trans, root, path, - btrfs_ino(BTRFS_I(inode)), start, 0); + ret = btrfs_lookup_file_extent(trans, root, path, btrfs_ino(inode), start, 0); if (ret == 0 && (found_type == BTRFS_FILE_EXTENT_REG || @@ -727,7 +726,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, drop_args.start = start; drop_args.end = extent_end; drop_args.drop_cache = true; - ret = btrfs_drop_extents(trans, root, BTRFS_I(inode), &drop_args); + ret = btrfs_drop_extents(trans, root, inode, &drop_args); if (ret) goto out; @@ -905,16 +904,15 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, goto out; } - ret = btrfs_inode_set_file_extent_range(BTRFS_I(inode), start, - extent_end - start); + ret = btrfs_inode_set_file_extent_range(inode, start, extent_end - start); if (ret) goto out; update_inode: - btrfs_update_inode_bytes(BTRFS_I(inode), nbytes, drop_args.bytes_found); - ret = btrfs_update_inode(trans, BTRFS_I(inode)); + btrfs_update_inode_bytes(inode, nbytes, drop_args.bytes_found); + ret = btrfs_update_inode(trans, inode); out: - iput(inode); + iput(&inode->vfs_inode); return ret; } @@ -951,7 +949,7 @@ static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans, struct btrfs_dir_item *di) { struct btrfs_root *root = dir->root; - struct inode *inode; + struct btrfs_inode *inode; struct fscrypt_str name; struct extent_buffer *leaf; struct btrfs_key location; @@ -976,10 +974,10 @@ static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans, if (ret) goto out; - ret = unlink_inode_for_log_replay(trans, dir, BTRFS_I(inode), &name); + ret = unlink_inode_for_log_replay(trans, dir, inode, &name); out: kfree(name.name); - iput(inode); + iput(&inode->vfs_inode); return ret; } @@ -1154,7 +1152,7 @@ again: u32 item_size; u32 cur_offset = 0; unsigned long base; - struct inode *victim_parent; + struct btrfs_inode *victim_parent; leaf = path->nodes[0]; @@ -1194,10 +1192,10 @@ again: btrfs_release_path(path); ret = unlink_inode_for_log_replay(trans, - BTRFS_I(victim_parent), + victim_parent, inode, &victim_name); } - iput(victim_parent); + iput(&victim_parent->vfs_inode); kfree(victim_name.name); if (ret) return ret; @@ -1331,7 +1329,7 @@ again: ret = !!btrfs_find_name_in_backref(log_eb, log_slot, &name); if (!ret) { - struct inode *dir; + struct btrfs_inode *dir; btrfs_release_path(path); dir = read_one_inode(root, parent_id); @@ -1340,10 +1338,9 @@ again: kfree(name.name); goto out; } - ret = unlink_inode_for_log_replay(trans, BTRFS_I(dir), - inode, &name); + ret = unlink_inode_for_log_replay(trans, dir, inode, &name); kfree(name.name); - iput(dir); + iput(&dir->vfs_inode); if (ret) goto out; goto again; @@ -1375,8 +1372,8 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, struct extent_buffer *eb, int slot, struct btrfs_key *key) { - struct inode *dir = NULL; - struct inode *inode = NULL; + struct btrfs_inode *dir = NULL; + struct btrfs_inode *inode = NULL; unsigned long ref_ptr; unsigned long ref_end; struct fscrypt_str name = { 0 }; @@ -1441,8 +1438,8 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, if (ret) goto out; - ret = inode_in_dir(root, path, btrfs_ino(BTRFS_I(dir)), - btrfs_ino(BTRFS_I(inode)), ref_index, &name); + ret = inode_in_dir(root, path, btrfs_ino(dir), btrfs_ino(inode), + ref_index, &name); if (ret < 0) { goto out; } else if (ret == 0) { @@ -1453,8 +1450,7 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, * overwrite any existing back reference, and we don't * want to create dangling pointers in the directory. */ - ret = __add_inode_ref(trans, root, path, log, - BTRFS_I(dir), BTRFS_I(inode), + ret = __add_inode_ref(trans, root, path, log, dir, inode, inode_objectid, parent_objectid, ref_index, &name); if (ret) { @@ -1464,12 +1460,11 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, } /* insert our name */ - ret = btrfs_add_link(trans, BTRFS_I(dir), BTRFS_I(inode), - &name, 0, ref_index); + ret = btrfs_add_link(trans, dir, inode, &name, 0, ref_index); if (ret) goto out; - ret = btrfs_update_inode(trans, BTRFS_I(inode)); + ret = btrfs_update_inode(trans, inode); if (ret) goto out; } @@ -1479,7 +1474,7 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, kfree(name.name); name.name = NULL; if (log_ref_ver) { - iput(dir); + iput(&dir->vfs_inode); dir = NULL; } } @@ -1492,8 +1487,7 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, * dir index entries exist for a name but there is no inode reference * item with the same name. */ - ret = unlink_old_inode_refs(trans, root, path, BTRFS_I(inode), eb, slot, - key); + ret = unlink_old_inode_refs(trans, root, path, inode, eb, slot, key); if (ret) goto out; @@ -1502,8 +1496,10 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, out: btrfs_release_path(path); kfree(name.name); - iput(dir); - iput(inode); + if (dir) + iput(&dir->vfs_inode); + if (inode) + iput(&inode->vfs_inode); return ret; } @@ -1675,12 +1671,13 @@ static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans, { int ret; struct btrfs_key key; - struct inode *inode; key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID; key.type = BTRFS_ORPHAN_ITEM_KEY; key.offset = (u64)-1; while (1) { + struct btrfs_inode *inode; + ret = btrfs_search_slot(trans, root, &key, path, -1, 1); if (ret < 0) break; @@ -1708,8 +1705,8 @@ static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans, break; } - ret = fixup_inode_link_count(trans, inode); - iput(inode); + ret = fixup_inode_link_count(trans, &inode->vfs_inode); + iput(&inode->vfs_inode); if (ret) break; @@ -1737,12 +1734,14 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans, { struct btrfs_key key; int ret = 0; - struct inode *inode; + struct btrfs_inode *inode; + struct inode *vfs_inode; inode = read_one_inode(root, objectid); if (!inode) return -EIO; + vfs_inode = &inode->vfs_inode; key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID; key.type = BTRFS_ORPHAN_ITEM_KEY; key.offset = objectid; @@ -1751,15 +1750,15 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans, btrfs_release_path(path); if (ret == 0) { - if (!inode->i_nlink) - set_nlink(inode, 1); + if (!vfs_inode->i_nlink) + set_nlink(vfs_inode, 1); else - inc_nlink(inode); - ret = btrfs_update_inode(trans, BTRFS_I(inode)); + inc_nlink(vfs_inode); + ret = btrfs_update_inode(trans, inode); } else if (ret == -EEXIST) { ret = 0; } - iput(inode); + iput(vfs_inode); return ret; } @@ -1775,8 +1774,8 @@ static noinline int insert_one_name(struct btrfs_trans_handle *trans, const struct fscrypt_str *name, struct btrfs_key *location) { - struct inode *inode; - struct inode *dir; + struct btrfs_inode *inode; + struct btrfs_inode *dir; int ret; inode = read_one_inode(root, location->objectid); @@ -1785,17 +1784,16 @@ static noinline int insert_one_name(struct btrfs_trans_handle *trans, dir = read_one_inode(root, dirid); if (!dir) { - iput(inode); + iput(&inode->vfs_inode); return -EIO; } - ret = btrfs_add_link(trans, BTRFS_I(dir), BTRFS_I(inode), name, - 1, index); + ret = btrfs_add_link(trans, dir, inode, name, 1, index); /* FIXME, put inode into FIXUP list */ - iput(inode); - iput(dir); + iput(&inode->vfs_inode); + iput(&dir->vfs_inode); return ret; } @@ -1857,7 +1855,7 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans, bool index_dst_matches = false; struct btrfs_key log_key; struct btrfs_key search_key; - struct inode *dir; + struct btrfs_inode *dir; u8 log_flags; bool exists; int ret; @@ -1887,9 +1885,8 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans, ret = PTR_ERR(dir_dst_di); goto out; } else if (dir_dst_di) { - ret = delete_conflicting_dir_entry(trans, BTRFS_I(dir), path, - dir_dst_di, &log_key, - log_flags, exists); + ret = delete_conflicting_dir_entry(trans, dir, path, dir_dst_di, + &log_key, log_flags, exists); if (ret < 0) goto out; dir_dst_matches = (ret == 1); @@ -1904,9 +1901,8 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans, ret = PTR_ERR(index_dst_di); goto out; } else if (index_dst_di) { - ret = delete_conflicting_dir_entry(trans, BTRFS_I(dir), path, - index_dst_di, &log_key, - log_flags, exists); + ret = delete_conflicting_dir_entry(trans, dir, path, index_dst_di, + &log_key, log_flags, exists); if (ret < 0) goto out; index_dst_matches = (ret == 1); @@ -1961,11 +1957,11 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans, out: if (!ret && update_size) { - btrfs_i_size_write(BTRFS_I(dir), dir->i_size + name.len * 2); - ret = btrfs_update_inode(trans, BTRFS_I(dir)); + btrfs_i_size_write(dir, dir->vfs_inode.i_size + name.len * 2); + ret = btrfs_update_inode(trans, dir); } kfree(name.name); - iput(dir); + iput(&dir->vfs_inode); if (!ret && name_added) ret = 1; return ret; @@ -2122,16 +2118,16 @@ static noinline int check_item_in_log(struct btrfs_trans_handle *trans, struct btrfs_root *log, struct btrfs_path *path, struct btrfs_path *log_path, - struct inode *dir, + struct btrfs_inode *dir, struct btrfs_key *dir_key) { - struct btrfs_root *root = BTRFS_I(dir)->root; + struct btrfs_root *root = dir->root; int ret; struct extent_buffer *eb; int slot; struct btrfs_dir_item *di; struct fscrypt_str name = { 0 }; - struct inode *inode = NULL; + struct btrfs_inode *inode = NULL; struct btrfs_key location; /* @@ -2178,9 +2174,8 @@ static noinline int check_item_in_log(struct btrfs_trans_handle *trans, if (ret) goto out; - inc_nlink(inode); - ret = unlink_inode_for_log_replay(trans, BTRFS_I(dir), BTRFS_I(inode), - &name); + inc_nlink(&inode->vfs_inode); + ret = unlink_inode_for_log_replay(trans, dir, inode, &name); /* * Unlike dir item keys, dir index keys can only have one name (entry) in * them, as there are no key collisions since each key has a unique offset @@ -2190,7 +2185,8 @@ out: btrfs_release_path(path); btrfs_release_path(log_path); kfree(name.name); - iput(inode); + if (inode) + iput(&inode->vfs_inode); return ret; } @@ -2314,7 +2310,7 @@ static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans, struct btrfs_key dir_key; struct btrfs_key found_key; struct btrfs_path *log_path; - struct inode *dir; + struct btrfs_inode *dir; dir_key.objectid = dirid; dir_key.type = BTRFS_DIR_INDEX_KEY; @@ -2391,7 +2387,7 @@ static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans, out: btrfs_release_path(path); btrfs_free_path(log_path); - iput(dir); + iput(&dir->vfs_inode); return ret; } @@ -2485,7 +2481,7 @@ static int replay_one_buffer(struct btrfs_root *log, struct extent_buffer *eb, */ if (S_ISREG(mode)) { struct btrfs_drop_extents_args drop_args = { 0 }; - struct inode *inode; + struct btrfs_inode *inode; u64 from; inode = read_one_inode(root, key.objectid); @@ -2493,22 +2489,20 @@ static int replay_one_buffer(struct btrfs_root *log, struct extent_buffer *eb, ret = -EIO; break; } - from = ALIGN(i_size_read(inode), + from = ALIGN(i_size_read(&inode->vfs_inode), root->fs_info->sectorsize); drop_args.start = from; drop_args.end = (u64)-1; drop_args.drop_cache = true; - ret = btrfs_drop_extents(wc->trans, root, - BTRFS_I(inode), + ret = btrfs_drop_extents(wc->trans, root, inode, &drop_args); if (!ret) { - inode_sub_bytes(inode, + inode_sub_bytes(&inode->vfs_inode, drop_args.bytes_found); /* Update the inode's nbytes. */ - ret = btrfs_update_inode(wc->trans, - BTRFS_I(inode)); + ret = btrfs_update_inode(wc->trans, inode); } - iput(inode); + iput(&inode->vfs_inode); if (ret) break; } -- GitLab From 401d098f92ea69d8a75f8b845daf343e511681ba Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Tue, 3 Jun 2025 19:29:01 +0100 Subject: [PATCH 1905/2211] btrfs: fix invalid inode pointer dereferences during log replay [ Upstream commit 2dcf838cf5c2f0f4501edaa1680fcad03618d760 ] In a few places where we call read_one_inode(), if we get a NULL pointer we end up jumping into an error path, or fallthrough in case of __add_inode_ref(), where we then do something like this: iput(&inode->vfs_inode); which results in an invalid inode pointer that triggers an invalid memory access, resulting in a crash. Fix this by making sure we don't do such dereferences. Fixes: b4c50cbb01a1 ("btrfs: return a btrfs_inode from read_one_inode()") CC: stable@vger.kernel.org # 6.15+ Signed-off-by: Filipe Manana Reviewed-by: David Sterba Signed-off-by: David Sterba Stable-dep-of: 5f61b961599a ("btrfs: fix inode lookup error handling during log replay") Signed-off-by: Sasha Levin --- fs/btrfs/tree-log.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 7a1c7070287b2..f4317fce569b7 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -677,15 +677,12 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, extent_end = ALIGN(start + size, fs_info->sectorsize); } else { - ret = 0; - goto out; + return 0; } inode = read_one_inode(root, key->objectid); - if (!inode) { - ret = -EIO; - goto out; - } + if (!inode) + return -EIO; /* * first check to see if we already have this extent in the @@ -977,7 +974,8 @@ static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans, ret = unlink_inode_for_log_replay(trans, dir, inode, &name); out: kfree(name.name); - iput(&inode->vfs_inode); + if (inode) + iput(&inode->vfs_inode); return ret; } @@ -1194,8 +1192,8 @@ again: ret = unlink_inode_for_log_replay(trans, victim_parent, inode, &victim_name); + iput(&victim_parent->vfs_inode); } - iput(&victim_parent->vfs_inode); kfree(victim_name.name); if (ret) return ret; -- GitLab From d6d806004605a02880d1bdcb07c92876ad9b0e6a Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Wed, 18 Jun 2025 15:58:31 +0100 Subject: [PATCH 1906/2211] btrfs: fix inode lookup error handling during log replay [ Upstream commit 5f61b961599acbd2bed028d3089105a1f7d224b8 ] When replaying log trees we use read_one_inode() to get an inode, which is just a wrapper around btrfs_iget_logging(), which in turn is a wrapper for btrfs_iget(). But read_one_inode() always returns NULL for any error that btrfs_iget_logging() / btrfs_iget() may return and this is a problem because: 1) In many callers of read_one_inode() we convert the NULL into -EIO, which is not accurate since btrfs_iget() may return -ENOMEM and -ENOENT for example, besides -EIO and other errors. So during log replay we may end up reporting a false -EIO, which is confusing since we may not have had any IO error at all; 2) When replaying directory deletes, at replay_dir_deletes(), we assume the NULL returned from read_one_inode() means that the inode doesn't exist and then proceed as if no error had happened. This is wrong because unless btrfs_iget() returned ERR_PTR(-ENOENT), we had an actual error and the target inode may exist in the target subvolume root - this may later result in the log replay code failing at a later stage (if we are "lucky") or succeed but leaving some inconsistency in the filesystem. So fix this by not ignoring errors from btrfs_iget_logging() and as a consequence remove the read_one_inode() wrapper and just use btrfs_iget_logging() directly. Also since btrfs_iget_logging() is supposed to be called only against subvolume roots, just like read_one_inode() which had a comment about it, add an assertion to btrfs_iget_logging() to check that the target root corresponds to a subvolume root. Fixes: 5d4f98a28c7d ("Btrfs: Mixed back reference (FORWARD ROLLING FORMAT CHANGE)") Reviewed-by: Johannes Thumshirn Reviewed-by: Qu Wenruo Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/tree-log.c | 127 +++++++++++++++++++++----------------------- 1 file changed, 62 insertions(+), 65 deletions(-) diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index f4317fce569b7..97c5dc0ebd9d6 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -143,6 +143,9 @@ static struct btrfs_inode *btrfs_iget_logging(u64 objectid, struct btrfs_root *r unsigned int nofs_flag; struct inode *inode; + /* Only meant to be called for subvolume roots and not for log roots. */ + ASSERT(is_fstree(btrfs_root_id(root))); + /* * We're holding a transaction handle whether we are logging or * replaying a log tree, so we must make sure NOFS semantics apply @@ -613,21 +616,6 @@ static int read_alloc_one_name(struct extent_buffer *eb, void *start, int len, return 0; } -/* - * simple helper to read an inode off the disk from a given root - * This can only be called for subvolume roots and not for the log - */ -static noinline struct btrfs_inode *read_one_inode(struct btrfs_root *root, - u64 objectid) -{ - struct btrfs_inode *inode; - - inode = btrfs_iget_logging(objectid, root); - if (IS_ERR(inode)) - return NULL; - return inode; -} - /* replays a single extent in 'eb' at 'slot' with 'key' into the * subvolume 'root'. path is released on entry and should be released * on exit. @@ -680,9 +668,9 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, return 0; } - inode = read_one_inode(root, key->objectid); - if (!inode) - return -EIO; + inode = btrfs_iget_logging(key->objectid, root); + if (IS_ERR(inode)) + return PTR_ERR(inode); /* * first check to see if we already have this extent in the @@ -961,9 +949,10 @@ static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans, btrfs_release_path(path); - inode = read_one_inode(root, location.objectid); - if (!inode) { - ret = -EIO; + inode = btrfs_iget_logging(location.objectid, root); + if (IS_ERR(inode)) { + ret = PTR_ERR(inode); + inode = NULL; goto out; } @@ -1182,10 +1171,10 @@ again: kfree(victim_name.name); return ret; } else if (!ret) { - ret = -ENOENT; - victim_parent = read_one_inode(root, - parent_objectid); - if (victim_parent) { + victim_parent = btrfs_iget_logging(parent_objectid, root); + if (IS_ERR(victim_parent)) { + ret = PTR_ERR(victim_parent); + } else { inc_nlink(&inode->vfs_inode); btrfs_release_path(path); @@ -1330,9 +1319,9 @@ again: struct btrfs_inode *dir; btrfs_release_path(path); - dir = read_one_inode(root, parent_id); - if (!dir) { - ret = -ENOENT; + dir = btrfs_iget_logging(parent_id, root); + if (IS_ERR(dir)) { + ret = PTR_ERR(dir); kfree(name.name); goto out; } @@ -1404,15 +1393,17 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, * copy the back ref in. The link count fixup code will take * care of the rest */ - dir = read_one_inode(root, parent_objectid); - if (!dir) { - ret = -ENOENT; + dir = btrfs_iget_logging(parent_objectid, root); + if (IS_ERR(dir)) { + ret = PTR_ERR(dir); + dir = NULL; goto out; } - inode = read_one_inode(root, inode_objectid); - if (!inode) { - ret = -EIO; + inode = btrfs_iget_logging(inode_objectid, root); + if (IS_ERR(inode)) { + ret = PTR_ERR(inode); + inode = NULL; goto out; } @@ -1424,11 +1415,13 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, * parent object can change from one array * item to another. */ - if (!dir) - dir = read_one_inode(root, parent_objectid); if (!dir) { - ret = -ENOENT; - goto out; + dir = btrfs_iget_logging(parent_objectid, root); + if (IS_ERR(dir)) { + ret = PTR_ERR(dir); + dir = NULL; + goto out; + } } } else { ret = ref_get_fields(eb, ref_ptr, &name, &ref_index); @@ -1697,9 +1690,9 @@ static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans, break; btrfs_release_path(path); - inode = read_one_inode(root, key.offset); - if (!inode) { - ret = -EIO; + inode = btrfs_iget_logging(key.offset, root); + if (IS_ERR(inode)) { + ret = PTR_ERR(inode); break; } @@ -1735,9 +1728,9 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans, struct btrfs_inode *inode; struct inode *vfs_inode; - inode = read_one_inode(root, objectid); - if (!inode) - return -EIO; + inode = btrfs_iget_logging(objectid, root); + if (IS_ERR(inode)) + return PTR_ERR(inode); vfs_inode = &inode->vfs_inode; key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID; @@ -1776,14 +1769,14 @@ static noinline int insert_one_name(struct btrfs_trans_handle *trans, struct btrfs_inode *dir; int ret; - inode = read_one_inode(root, location->objectid); - if (!inode) - return -ENOENT; + inode = btrfs_iget_logging(location->objectid, root); + if (IS_ERR(inode)) + return PTR_ERR(inode); - dir = read_one_inode(root, dirid); - if (!dir) { + dir = btrfs_iget_logging(dirid, root); + if (IS_ERR(dir)) { iput(&inode->vfs_inode); - return -EIO; + return PTR_ERR(dir); } ret = btrfs_add_link(trans, dir, inode, name, 1, index); @@ -1860,9 +1853,9 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans, bool update_size = true; bool name_added = false; - dir = read_one_inode(root, key->objectid); - if (!dir) - return -EIO; + dir = btrfs_iget_logging(key->objectid, root); + if (IS_ERR(dir)) + return PTR_ERR(dir); ret = read_alloc_one_name(eb, di + 1, btrfs_dir_name_len(eb, di), &name); if (ret) @@ -2162,9 +2155,10 @@ static noinline int check_item_in_log(struct btrfs_trans_handle *trans, btrfs_dir_item_key_to_cpu(eb, di, &location); btrfs_release_path(path); btrfs_release_path(log_path); - inode = read_one_inode(root, location.objectid); - if (!inode) { - ret = -EIO; + inode = btrfs_iget_logging(location.objectid, root); + if (IS_ERR(inode)) { + ret = PTR_ERR(inode); + inode = NULL; goto out; } @@ -2316,14 +2310,17 @@ static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans, if (!log_path) return -ENOMEM; - dir = read_one_inode(root, dirid); - /* it isn't an error if the inode isn't there, that can happen - * because we replay the deletes before we copy in the inode item - * from the log + dir = btrfs_iget_logging(dirid, root); + /* + * It isn't an error if the inode isn't there, that can happen because + * we replay the deletes before we copy in the inode item from the log. */ - if (!dir) { + if (IS_ERR(dir)) { btrfs_free_path(log_path); - return 0; + ret = PTR_ERR(dir); + if (ret == -ENOENT) + ret = 0; + return ret; } range_start = 0; @@ -2482,9 +2479,9 @@ static int replay_one_buffer(struct btrfs_root *log, struct extent_buffer *eb, struct btrfs_inode *inode; u64 from; - inode = read_one_inode(root, key.objectid); - if (!inode) { - ret = -EIO; + inode = btrfs_iget_logging(key.objectid, root); + if (IS_ERR(inode)) { + ret = PTR_ERR(inode); break; } from = ALIGN(i_size_read(&inode->vfs_inode), -- GitLab From 1728fef7ca37e690fca58cb7b83b8ed01dc524b8 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Thu, 19 Jun 2025 13:13:38 +0100 Subject: [PATCH 1907/2211] btrfs: record new subvolume in parent dir earlier to avoid dir logging races [ Upstream commit bf5bcf9a6fa070ec8a725b08db63fb1318f77366 ] Instead of recording that a new subvolume was created in a directory after we add the entry do the directory, record it before adding the entry. This is to avoid races where after creating the entry and before recording the new subvolume in the directory (the call to btrfs_record_new_subvolume()), another task logs the directory, so we end up with a log tree where we logged a directory that has an entry pointing to a root that was not yet committed, resulting in an invalid entry if the log is persisted and replayed later due to a power failure or crash. Also state this requirement in the function comment for btrfs_record_new_subvolume(), similar to what we do for the btrfs_record_unlink_dir() and btrfs_record_snapshot_destroy(). Fixes: 45c4102f0d82 ("btrfs: avoid transaction commit on any fsync after subvolume creation") Reviewed-by: Johannes Thumshirn Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/ioctl.c | 4 ++-- fs/btrfs/tree-log.c | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 3e3722a732393..1706f6d9b12e6 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -758,14 +758,14 @@ static noinline int create_subvol(struct mnt_idmap *idmap, goto out; } + btrfs_record_new_subvolume(trans, BTRFS_I(dir)); + ret = btrfs_create_new_inode(trans, &new_inode_args); if (ret) { btrfs_abort_transaction(trans, ret); goto out; } - btrfs_record_new_subvolume(trans, BTRFS_I(dir)); - d_instantiate_new(dentry, new_inode_args.inode); new_inode_args.inode = NULL; diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 97c5dc0ebd9d6..16b4474ded4bc 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -7463,6 +7463,8 @@ void btrfs_record_snapshot_destroy(struct btrfs_trans_handle *trans, * full log sync. * Also we don't need to worry with renames, since btrfs_rename() marks the log * for full commit when renaming a subvolume. + * + * Must be called before creating the subvolume entry in its parent directory. */ void btrfs_record_new_subvolume(const struct btrfs_trans_handle *trans, struct btrfs_inode *dir) -- GitLab From bfd5c9e83d89f2306665674e97dd01aeb5a56c27 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Fri, 20 Jun 2025 15:54:05 +0100 Subject: [PATCH 1908/2211] btrfs: propagate last_unlink_trans earlier when doing a rmdir [ Upstream commit c466e33e729a0ee017d10d919cba18f503853c60 ] In case the removed directory had a snapshot that was deleted, we are propagating its inode's last_unlink_trans to the parent directory after we removed the entry from the parent directory. This leaves a small race window where someone can log the parent directory after we removed the entry and before we updated last_unlink_trans, and as a result if we ever try to replay such a log tree, we will fail since we will attempt to remove a snapshot during log replay, which is currently not possible and results in the log replay (and mount) to fail. This is the type of failure described in commit 1ec9a1ae1e30 ("Btrfs: fix unreplayable log after snapshot delete + parent dir fsync"). So fix this by propagating the last_unlink_trans to the parent directory before we remove the entry from it. Fixes: 44f714dae50a ("Btrfs: improve performance on fsync against new inode after rename/unlink") Reviewed-by: Johannes Thumshirn Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/inode.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 921ec3802648b..345e86fd844df 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4734,7 +4734,6 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; int ret = 0; struct btrfs_trans_handle *trans; - u64 last_unlink_trans; struct fscrypt_name fname; if (inode->i_size > BTRFS_EMPTY_DIR_SIZE) @@ -4760,6 +4759,23 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) goto out_notrans; } + /* + * Propagate the last_unlink_trans value of the deleted dir to its + * parent directory. This is to prevent an unrecoverable log tree in the + * case we do something like this: + * 1) create dir foo + * 2) create snapshot under dir foo + * 3) delete the snapshot + * 4) rmdir foo + * 5) mkdir foo + * 6) fsync foo or some file inside foo + * + * This is because we can't unlink other roots when replaying the dir + * deletes for directory foo. + */ + if (BTRFS_I(inode)->last_unlink_trans >= trans->transid) + BTRFS_I(dir)->last_unlink_trans = BTRFS_I(inode)->last_unlink_trans; + if (unlikely(btrfs_ino(BTRFS_I(inode)) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { ret = btrfs_unlink_subvol(trans, BTRFS_I(dir), dentry); goto out; @@ -4769,27 +4785,11 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) if (ret) goto out; - last_unlink_trans = BTRFS_I(inode)->last_unlink_trans; - /* now the directory is empty */ ret = btrfs_unlink_inode(trans, BTRFS_I(dir), BTRFS_I(d_inode(dentry)), &fname.disk_name); - if (!ret) { + if (!ret) btrfs_i_size_write(BTRFS_I(inode), 0); - /* - * Propagate the last_unlink_trans value of the deleted dir to - * its parent directory. This is to prevent an unrecoverable - * log tree in the case we do something like this: - * 1) create dir foo - * 2) create snapshot under dir foo - * 3) delete the snapshot - * 4) rmdir foo - * 5) mkdir foo - * 6) fsync foo or some file inside foo - */ - if (last_unlink_trans >= trans->transid) - BTRFS_I(dir)->last_unlink_trans = last_unlink_trans; - } out: btrfs_end_transaction(trans); out_notrans: -- GitLab From 735ac80fa913114203a731d7dc6bd08354f835ad Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Fri, 20 Jun 2025 16:37:01 +0100 Subject: [PATCH 1909/2211] btrfs: use btrfs_record_snapshot_destroy() during rmdir [ Upstream commit 157501b0469969fc1ba53add5049575aadd79d80 ] We are setting the parent directory's last_unlink_trans directly which may result in a concurrent task starting to log the directory not see the update and therefore can log the directory after we removed a child directory which had a snapshot within instead of falling back to a transaction commit. Replaying such a log tree would result in a mount failure since we can't currently delete snapshots (and subvolumes) during log replay. This is the type of failure described in commit 1ec9a1ae1e30 ("Btrfs: fix unreplayable log after snapshot delete + parent dir fsync"). Fix this by using btrfs_record_snapshot_destroy() which updates the last_unlink_trans field while holding the inode's log_mutex lock. Fixes: 44f714dae50a ("Btrfs: improve performance on fsync against new inode after rename/unlink") Reviewed-by: Johannes Thumshirn Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 345e86fd844df..f84e3f9fad84a 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4774,7 +4774,7 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) * deletes for directory foo. */ if (BTRFS_I(inode)->last_unlink_trans >= trans->transid) - BTRFS_I(dir)->last_unlink_trans = BTRFS_I(inode)->last_unlink_trans; + btrfs_record_snapshot_destroy(trans, BTRFS_I(dir)); if (unlikely(btrfs_ino(BTRFS_I(inode)) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { ret = btrfs_unlink_subvol(trans, BTRFS_I(dir), dentry); -- GitLab From 91a6b86d584576601cb8596bacb057b99d612871 Mon Sep 17 00:00:00 2001 From: Thomas Fourier Date: Wed, 25 Jun 2025 16:16:24 +0200 Subject: [PATCH 1910/2211] ethernet: atl1: Add missing DMA mapping error checks and count errors [ Upstream commit d72411d20905180cdc452c553be17481b24463d2 ] The `dma_map_XXX()` functions can fail and must be checked using `dma_mapping_error()`. This patch adds proper error handling for all DMA mapping calls. In `atl1_alloc_rx_buffers()`, if DMA mapping fails, the buffer is deallocated and marked accordingly. In `atl1_tx_map()`, previously mapped buffers are unmapped and the packet is dropped on failure. If `atl1_xmit_frame()` drops the packet, increment the tx_error counter. Fixes: f3cc28c79760 ("Add Attansic L1 ethernet driver.") Signed-off-by: Thomas Fourier Link: https://patch.msgid.link/20250625141629.114984-2-fourier.thomas@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/atheros/atlx/atl1.c | 79 +++++++++++++++++------- 1 file changed, 57 insertions(+), 22 deletions(-) diff --git a/drivers/net/ethernet/atheros/atlx/atl1.c b/drivers/net/ethernet/atheros/atlx/atl1.c index 3afd3627ce485..9c5d619909045 100644 --- a/drivers/net/ethernet/atheros/atlx/atl1.c +++ b/drivers/net/ethernet/atheros/atlx/atl1.c @@ -1861,14 +1861,21 @@ static u16 atl1_alloc_rx_buffers(struct atl1_adapter *adapter) break; } - buffer_info->alloced = 1; - buffer_info->skb = skb; - buffer_info->length = (u16) adapter->rx_buffer_len; page = virt_to_page(skb->data); offset = offset_in_page(skb->data); buffer_info->dma = dma_map_page(&pdev->dev, page, offset, adapter->rx_buffer_len, DMA_FROM_DEVICE); + if (dma_mapping_error(&pdev->dev, buffer_info->dma)) { + kfree_skb(skb); + adapter->soft_stats.rx_dropped++; + break; + } + + buffer_info->alloced = 1; + buffer_info->skb = skb; + buffer_info->length = (u16)adapter->rx_buffer_len; + rfd_desc->buffer_addr = cpu_to_le64(buffer_info->dma); rfd_desc->buf_len = cpu_to_le16(adapter->rx_buffer_len); rfd_desc->coalese = 0; @@ -2183,8 +2190,8 @@ static int atl1_tx_csum(struct atl1_adapter *adapter, struct sk_buff *skb, return 0; } -static void atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, - struct tx_packet_desc *ptpd) +static bool atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, + struct tx_packet_desc *ptpd) { struct atl1_tpd_ring *tpd_ring = &adapter->tpd_ring; struct atl1_buffer *buffer_info; @@ -2194,6 +2201,7 @@ static void atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, unsigned int nr_frags; unsigned int f; int retval; + u16 first_mapped; u16 next_to_use; u16 data_len; u8 hdr_len; @@ -2201,6 +2209,7 @@ static void atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, buf_len -= skb->data_len; nr_frags = skb_shinfo(skb)->nr_frags; next_to_use = atomic_read(&tpd_ring->next_to_use); + first_mapped = next_to_use; buffer_info = &tpd_ring->buffer_info[next_to_use]; BUG_ON(buffer_info->skb); /* put skb in last TPD */ @@ -2216,6 +2225,8 @@ static void atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, buffer_info->dma = dma_map_page(&adapter->pdev->dev, page, offset, hdr_len, DMA_TO_DEVICE); + if (dma_mapping_error(&adapter->pdev->dev, buffer_info->dma)) + goto dma_err; if (++next_to_use == tpd_ring->count) next_to_use = 0; @@ -2242,6 +2253,9 @@ static void atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, page, offset, buffer_info->length, DMA_TO_DEVICE); + if (dma_mapping_error(&adapter->pdev->dev, + buffer_info->dma)) + goto dma_err; if (++next_to_use == tpd_ring->count) next_to_use = 0; } @@ -2254,6 +2268,8 @@ static void atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, buffer_info->dma = dma_map_page(&adapter->pdev->dev, page, offset, buf_len, DMA_TO_DEVICE); + if (dma_mapping_error(&adapter->pdev->dev, buffer_info->dma)) + goto dma_err; if (++next_to_use == tpd_ring->count) next_to_use = 0; } @@ -2277,6 +2293,9 @@ static void atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, buffer_info->dma = skb_frag_dma_map(&adapter->pdev->dev, frag, i * ATL1_MAX_TX_BUF_LEN, buffer_info->length, DMA_TO_DEVICE); + if (dma_mapping_error(&adapter->pdev->dev, + buffer_info->dma)) + goto dma_err; if (++next_to_use == tpd_ring->count) next_to_use = 0; @@ -2285,6 +2304,22 @@ static void atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb, /* last tpd's buffer-info */ buffer_info->skb = skb; + + return true; + + dma_err: + while (first_mapped != next_to_use) { + buffer_info = &tpd_ring->buffer_info[first_mapped]; + dma_unmap_page(&adapter->pdev->dev, + buffer_info->dma, + buffer_info->length, + DMA_TO_DEVICE); + buffer_info->dma = 0; + + if (++first_mapped == tpd_ring->count) + first_mapped = 0; + } + return false; } static void atl1_tx_queue(struct atl1_adapter *adapter, u16 count, @@ -2355,10 +2390,8 @@ static netdev_tx_t atl1_xmit_frame(struct sk_buff *skb, len = skb_headlen(skb); - if (unlikely(skb->len <= 0)) { - dev_kfree_skb_any(skb); - return NETDEV_TX_OK; - } + if (unlikely(skb->len <= 0)) + goto drop_packet; nr_frags = skb_shinfo(skb)->nr_frags; for (f = 0; f < nr_frags; f++) { @@ -2371,10 +2404,9 @@ static netdev_tx_t atl1_xmit_frame(struct sk_buff *skb, if (mss) { if (skb->protocol == htons(ETH_P_IP)) { proto_hdr_len = skb_tcp_all_headers(skb); - if (unlikely(proto_hdr_len > len)) { - dev_kfree_skb_any(skb); - return NETDEV_TX_OK; - } + if (unlikely(proto_hdr_len > len)) + goto drop_packet; + /* need additional TPD ? */ if (proto_hdr_len != len) count += (len - proto_hdr_len + @@ -2406,23 +2438,26 @@ static netdev_tx_t atl1_xmit_frame(struct sk_buff *skb, } tso = atl1_tso(adapter, skb, ptpd); - if (tso < 0) { - dev_kfree_skb_any(skb); - return NETDEV_TX_OK; - } + if (tso < 0) + goto drop_packet; if (!tso) { ret_val = atl1_tx_csum(adapter, skb, ptpd); - if (ret_val < 0) { - dev_kfree_skb_any(skb); - return NETDEV_TX_OK; - } + if (ret_val < 0) + goto drop_packet; } - atl1_tx_map(adapter, skb, ptpd); + if (!atl1_tx_map(adapter, skb, ptpd)) + goto drop_packet; + atl1_tx_queue(adapter, count, ptpd); atl1_update_mailbox(adapter); return NETDEV_TX_OK; + +drop_packet: + adapter->soft_stats.tx_errors++; + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; } static int atl1_rings_clean(struct napi_struct *napi, int budget) -- GitLab From dbd187e8c18c8a76153ab1ff51b64f3c0c78df87 Mon Sep 17 00:00:00 2001 From: Fushuai Wang Date: Thu, 26 Jun 2025 21:30:03 +0800 Subject: [PATCH 1911/2211] dpaa2-eth: fix xdp_rxq_info leak [ Upstream commit 2def09ead4ad5907988b655d1e1454003aaf8297 ] The driver registered xdp_rxq_info structures via xdp_rxq_info_reg() but failed to properly unregister them in error paths and during removal. Fixes: d678be1dc1ec ("dpaa2-eth: add XDP_REDIRECT support") Signed-off-by: Fushuai Wang Reviewed-by: Simon Horman Reviewed-by: Ioana Ciornei Link: https://patch.msgid.link/20250626133003.80136-1-wangfushuai@baidu.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- .../net/ethernet/freescale/dpaa2/dpaa2-eth.c | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c index 29886a8ba73f3..efd0048acd3b2 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c @@ -3928,6 +3928,7 @@ static int dpaa2_eth_setup_rx_flow(struct dpaa2_eth_priv *priv, MEM_TYPE_PAGE_ORDER0, NULL); if (err) { dev_err(dev, "xdp_rxq_info_reg_mem_model failed\n"); + xdp_rxq_info_unreg(&fq->channel->xdp_rxq); return err; } @@ -4421,17 +4422,25 @@ static int dpaa2_eth_bind_dpni(struct dpaa2_eth_priv *priv) return -EINVAL; } if (err) - return err; + goto out; } err = dpni_get_qdid(priv->mc_io, 0, priv->mc_token, DPNI_QUEUE_TX, &priv->tx_qdid); if (err) { dev_err(dev, "dpni_get_qdid() failed\n"); - return err; + goto out; } return 0; + +out: + while (i--) { + if (priv->fq[i].type == DPAA2_RX_FQ && + xdp_rxq_info_is_reg(&priv->fq[i].channel->xdp_rxq)) + xdp_rxq_info_unreg(&priv->fq[i].channel->xdp_rxq); + } + return err; } /* Allocate rings for storing incoming frame descriptors */ @@ -4814,6 +4823,17 @@ static void dpaa2_eth_del_ch_napi(struct dpaa2_eth_priv *priv) } } +static void dpaa2_eth_free_rx_xdp_rxq(struct dpaa2_eth_priv *priv) +{ + int i; + + for (i = 0; i < priv->num_fqs; i++) { + if (priv->fq[i].type == DPAA2_RX_FQ && + xdp_rxq_info_is_reg(&priv->fq[i].channel->xdp_rxq)) + xdp_rxq_info_unreg(&priv->fq[i].channel->xdp_rxq); + } +} + static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev) { struct device *dev; @@ -5017,6 +5037,7 @@ err_alloc_percpu_extras: free_percpu(priv->percpu_stats); err_alloc_percpu_stats: dpaa2_eth_del_ch_napi(priv); + dpaa2_eth_free_rx_xdp_rxq(priv); err_bind: dpaa2_eth_free_dpbps(priv); err_dpbp_setup: @@ -5069,6 +5090,7 @@ static void dpaa2_eth_remove(struct fsl_mc_device *ls_dev) free_percpu(priv->percpu_extras); dpaa2_eth_del_ch_napi(priv); + dpaa2_eth_free_rx_xdp_rxq(priv); dpaa2_eth_free_dpbps(priv); dpaa2_eth_free_dpio(priv); dpaa2_eth_free_dpni(priv); -- GitLab From 0a38b183689442d903110c5a94f7995c83d384d8 Mon Sep 17 00:00:00 2001 From: Marek Szyprowski Date: Wed, 18 Jun 2025 14:06:26 +0200 Subject: [PATCH 1912/2211] drm/exynos: fimd: Guard display clock control with runtime PM calls [ Upstream commit 5d91394f236167ac624b823820faf4aa928b889e ] Commit c9b1150a68d9 ("drm/atomic-helper: Re-order bridge chain pre-enable and post-disable") changed the call sequence to the CRTC enable/disable and bridge pre_enable/post_disable methods, so those bridge methods are now called when CRTC is not yet enabled. This causes a lockup observed on Samsung Peach-Pit/Pi Chromebooks. The source of this lockup is a call to fimd_dp_clock_enable() function, when FIMD device is not yet runtime resumed. It worked before the mentioned commit only because the CRTC implemented by the FIMD driver was always enabled what guaranteed the FIMD device to be runtime resumed. This patch adds runtime PM guards to the fimd_dp_clock_enable() function to enable its proper operation also when the CRTC implemented by FIMD is not yet enabled. Fixes: 196e059a8a6a ("drm/exynos: convert clock_enable crtc callback to pipeline clock") Signed-off-by: Marek Szyprowski Reviewed-by: Tomi Valkeinen Signed-off-by: Inki Dae Signed-off-by: Sasha Levin --- drivers/gpu/drm/exynos/exynos_drm_fimd.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index f57df8c481391..05e4a5a63f5d8 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -187,6 +187,7 @@ struct fimd_context { u32 i80ifcon; bool i80_if; bool suspended; + bool dp_clk_enabled; wait_queue_head_t wait_vsync_queue; atomic_t wait_vsync_event; atomic_t win_updated; @@ -1047,7 +1048,18 @@ static void fimd_dp_clock_enable(struct exynos_drm_clk *clk, bool enable) struct fimd_context *ctx = container_of(clk, struct fimd_context, dp_clk); u32 val = enable ? DP_MIE_CLK_DP_ENABLE : DP_MIE_CLK_DISABLE; + + if (enable == ctx->dp_clk_enabled) + return; + + if (enable) + pm_runtime_resume_and_get(ctx->dev); + + ctx->dp_clk_enabled = enable; writel(val, ctx->regs + DP_MIE_CLKCON); + + if (!enable) + pm_runtime_put(ctx->dev); } static const struct exynos_drm_crtc_ops fimd_crtc_ops = { -- GitLab From 3832ddc2fae84dbcb1162fcf2fabe7ce07db30af Mon Sep 17 00:00:00 2001 From: James Clark Date: Fri, 27 Jun 2025 11:21:37 +0100 Subject: [PATCH 1913/2211] spi: spi-fsl-dspi: Clear completion counter before initiating transfer [ Upstream commit fa60c094c19b97e103d653f528f8d9c178b6a5f5 ] In target mode, extra interrupts can be received between the end of a transfer and halting the module if the host continues sending more data. If the interrupt from this occurs after the reinit_completion() then the completion counter is left at a non-zero value. The next unrelated transfer initiated by userspace will then complete immediately without waiting for the interrupt or writing to the RX buffer. Fix it by resetting the counter before the transfer so that lingering values are cleared. This is done after clearing the FIFOs and the status register but before the transfer is initiated, so no interrupts should be received at this point resulting in other race conditions. Fixes: 4f5ee75ea171 ("spi: spi-fsl-dspi: Replace interruptible wait queue with a simple completion") Signed-off-by: James Clark Reviewed-by: Frank Li Link: https://patch.msgid.link/20250627-james-nxp-spi-dma-v4-1-178dba20c120@linaro.org Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-fsl-dspi.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 7c43df252328d..e26363ae74890 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c @@ -983,11 +983,20 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr, if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) { status = dspi_dma_xfer(dspi); } else { + /* + * Reinitialize the completion before transferring data + * to avoid the case where it might remain in the done + * state due to a spurious interrupt from a previous + * transfer. This could falsely signal that the current + * transfer has completed. + */ + if (dspi->irq) + reinit_completion(&dspi->xfer_done); + dspi_fifo_write(dspi); if (dspi->irq) { wait_for_completion(&dspi->xfer_done); - reinit_completion(&dspi->xfer_done); } else { do { status = dspi_poll(dspi); -- GitLab From 9d4064787d8d11f69b01fd9d08bb7fd248041a56 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Wed, 25 Jun 2025 10:21:58 -0500 Subject: [PATCH 1914/2211] drm/i915/selftests: Change mock_request() to return error pointers [ Upstream commit caa7c7a76b78ce41d347003f84975125383e6b59 ] There was an error pointer vs NULL bug in __igt_breadcrumbs_smoketest(). The __mock_request_alloc() function implements the smoketest->request_alloc() function pointer. It was supposed to return error pointers, but it propogates the NULL return from mock_request() so in the event of a failure, it would lead to a NULL pointer dereference. To fix this, change the mock_request() function to return error pointers and update all the callers to expect that. Fixes: 52c0fdb25c7c ("drm/i915: Replace global breadcrumbs with per-context interrupt tracking") Signed-off-by: Dan Carpenter Reviewed-by: Rodrigo Vivi Link: https://lore.kernel.org/r/685c1417.050a0220.696f5.5c05@mx.google.com Signed-off-by: Rodrigo Vivi (cherry picked from commit 778fa8ad5f0f23397d045c7ebca048ce8def1c43) Signed-off-by: Joonas Lahtinen Signed-off-by: Sasha Levin --- drivers/gpu/drm/i915/selftests/i915_request.c | 20 +++++++++---------- drivers/gpu/drm/i915/selftests/mock_request.c | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/drm/i915/selftests/i915_request.c index acae30a04a947..0122719ee9218 100644 --- a/drivers/gpu/drm/i915/selftests/i915_request.c +++ b/drivers/gpu/drm/i915/selftests/i915_request.c @@ -73,8 +73,8 @@ static int igt_add_request(void *arg) /* Basic preliminary test to create a request and let it loose! */ request = mock_request(rcs0(i915)->kernel_context, HZ / 10); - if (!request) - return -ENOMEM; + if (IS_ERR(request)) + return PTR_ERR(request); i915_request_add(request); @@ -91,8 +91,8 @@ static int igt_wait_request(void *arg) /* Submit a request, then wait upon it */ request = mock_request(rcs0(i915)->kernel_context, T); - if (!request) - return -ENOMEM; + if (IS_ERR(request)) + return PTR_ERR(request); i915_request_get(request); @@ -160,8 +160,8 @@ static int igt_fence_wait(void *arg) /* Submit a request, treat it as a fence and wait upon it */ request = mock_request(rcs0(i915)->kernel_context, T); - if (!request) - return -ENOMEM; + if (IS_ERR(request)) + return PTR_ERR(request); if (dma_fence_wait_timeout(&request->fence, false, T) != -ETIME) { pr_err("fence wait success before submit (expected timeout)!\n"); @@ -219,8 +219,8 @@ static int igt_request_rewind(void *arg) GEM_BUG_ON(IS_ERR(ce)); request = mock_request(ce, 2 * HZ); intel_context_put(ce); - if (!request) { - err = -ENOMEM; + if (IS_ERR(request)) { + err = PTR_ERR(request); goto err_context_0; } @@ -237,8 +237,8 @@ static int igt_request_rewind(void *arg) GEM_BUG_ON(IS_ERR(ce)); vip = mock_request(ce, 0); intel_context_put(ce); - if (!vip) { - err = -ENOMEM; + if (IS_ERR(vip)) { + err = PTR_ERR(vip); goto err_context_1; } diff --git a/drivers/gpu/drm/i915/selftests/mock_request.c b/drivers/gpu/drm/i915/selftests/mock_request.c index 09f747228dff5..1b0cf073e9643 100644 --- a/drivers/gpu/drm/i915/selftests/mock_request.c +++ b/drivers/gpu/drm/i915/selftests/mock_request.c @@ -35,7 +35,7 @@ mock_request(struct intel_context *ce, unsigned long delay) /* NB the i915->requests slab cache is enlarged to fit mock_request */ request = intel_context_create_request(ce); if (IS_ERR(request)) - return NULL; + return request; request->mock.delay = delay; return request; -- GitLab From f0fee863a7cb6f9b4277562d5310193758308e1b Mon Sep 17 00:00:00 2001 From: Alok Tiwari Date: Sat, 28 Jun 2025 11:12:32 -0700 Subject: [PATCH 1915/2211] nvme: Fix incorrect cdw15 value in passthru error logging [ Upstream commit 2e96d2d8c2a7a6c2cef45593c028d9c5ef180316 ] Fix an error in nvme_log_err_passthru() where cdw14 was incorrectly printed twice instead of cdw15. This fix ensures accurate logging of the full passthrough command payload. Fixes: 9f079dda1433 ("nvme: allow passthru cmd error logging") Signed-off-by: Alok Tiwari Reviewed-by: Martin K. Petersen Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/host/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index eca764fede48f..abd42598fc78b 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -380,7 +380,7 @@ static void nvme_log_err_passthru(struct request *req) nr->cmd->common.cdw12, nr->cmd->common.cdw13, nr->cmd->common.cdw14, - nr->cmd->common.cdw14); + nr->cmd->common.cdw15); } enum nvme_disposition { -- GitLab From 431e58d56fcb5ff1f9eb630724a922e0d2a941df Mon Sep 17 00:00:00 2001 From: Dmitry Bogdanov Date: Wed, 25 Jun 2025 14:45:33 +0300 Subject: [PATCH 1916/2211] nvmet: fix memory leak of bio integrity [ Upstream commit 190f4c2c863af7cc5bb354b70e0805f06419c038 ] If nvmet receives commands with metadata there is a continuous memory leak of kmalloc-128 slab or more precisely bio->bi_integrity. Since commit bf4c89fc8797 ("block: don't call bio_uninit from bio_endio") each user of bio_init has to use bio_uninit as well. Otherwise the bio integrity is not getting free. Nvmet uses bio_init for inline bios. Uninit the inline bio to complete deallocation of integrity in bio. Fixes: bf4c89fc8797 ("block: don't call bio_uninit from bio_endio") Signed-off-by: Dmitry Bogdanov Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/target/nvmet.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h index 190f55e6d7532..3062562c096a1 100644 --- a/drivers/nvme/target/nvmet.h +++ b/drivers/nvme/target/nvmet.h @@ -714,6 +714,8 @@ static inline void nvmet_req_bio_put(struct nvmet_req *req, struct bio *bio) { if (bio != &req->b.inline_bio) bio_put(bio); + else + bio_uninit(bio); } #ifdef CONFIG_NVME_TARGET_AUTH -- GitLab From 5df3b870bc389a1767c72448a3ce1c576ef4deab Mon Sep 17 00:00:00 2001 From: Kurt Borja Date: Mon, 30 Jun 2025 00:43:12 -0300 Subject: [PATCH 1917/2211] platform/x86: dell-wmi-sysman: Fix WMI data block retrieval in sysfs callbacks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit eb617dd25ca176f3fee24f873f0fd60010773d67 ] After retrieving WMI data blocks in sysfs callbacks, check for the validity of them before dereferencing their content. Reported-by: Jan Graczyk Closes: https://lore.kernel.org/r/CAHk-=wgMiSKXf7SvQrfEnxVtmT=QVQPjJdNjfm3aXS7wc=rzTw@mail.gmail.com/ Fixes: e8a60aa7404b ("platform/x86: Introduce support for Systems Management Driver over WMI for Dell Systems") Suggested-by: Linus Torvalds Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja Link: https://lore.kernel.org/r/20250630-sysman-fix-v2-1-d185674d0a30@gmail.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- .../platform/x86/dell/dell-wmi-sysman/dell-wmi-sysman.h | 5 +++++ .../platform/x86/dell/dell-wmi-sysman/enum-attributes.c | 5 +++-- .../platform/x86/dell/dell-wmi-sysman/int-attributes.c | 5 +++-- .../x86/dell/dell-wmi-sysman/passobj-attributes.c | 5 +++-- .../platform/x86/dell/dell-wmi-sysman/string-attributes.c | 5 +++-- drivers/platform/x86/dell/dell-wmi-sysman/sysman.c | 8 ++++---- 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/dell-wmi-sysman.h b/drivers/platform/x86/dell/dell-wmi-sysman/dell-wmi-sysman.h index 3ad33a094588c..817ee7ba07ca0 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/dell-wmi-sysman.h +++ b/drivers/platform/x86/dell/dell-wmi-sysman/dell-wmi-sysman.h @@ -89,6 +89,11 @@ extern struct wmi_sysman_priv wmi_priv; enum { ENUM, INT, STR, PO }; +#define ENUM_MIN_ELEMENTS 8 +#define INT_MIN_ELEMENTS 9 +#define STR_MIN_ELEMENTS 8 +#define PO_MIN_ELEMENTS 4 + enum { ATTR_NAME, DISPL_NAME_LANG_CODE, diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/enum-attributes.c b/drivers/platform/x86/dell/dell-wmi-sysman/enum-attributes.c index 8cc212c852668..fc2f58b4cbc6e 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/enum-attributes.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/enum-attributes.c @@ -23,9 +23,10 @@ static ssize_t current_value_show(struct kobject *kobj, struct kobj_attribute *a obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_ENUMERATION_ATTRIBUTE_GUID); if (!obj) return -EIO; - if (obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) { + if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < ENUM_MIN_ELEMENTS || + obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) { kfree(obj); - return -EINVAL; + return -EIO; } ret = snprintf(buf, PAGE_SIZE, "%s\n", obj->package.elements[CURRENT_VAL].string.pointer); kfree(obj); diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/int-attributes.c b/drivers/platform/x86/dell/dell-wmi-sysman/int-attributes.c index 951e75b538fad..7352480642391 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/int-attributes.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/int-attributes.c @@ -25,9 +25,10 @@ static ssize_t current_value_show(struct kobject *kobj, struct kobj_attribute *a obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_INTEGER_ATTRIBUTE_GUID); if (!obj) return -EIO; - if (obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_INTEGER) { + if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < INT_MIN_ELEMENTS || + obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_INTEGER) { kfree(obj); - return -EINVAL; + return -EIO; } ret = snprintf(buf, PAGE_SIZE, "%lld\n", obj->package.elements[CURRENT_VAL].integer.value); kfree(obj); diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c b/drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c index d8f1bf5e58a0f..3167e06d416ed 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c @@ -26,9 +26,10 @@ static ssize_t is_enabled_show(struct kobject *kobj, struct kobj_attribute *attr obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_PASSOBJ_ATTRIBUTE_GUID); if (!obj) return -EIO; - if (obj->package.elements[IS_PASS_SET].type != ACPI_TYPE_INTEGER) { + if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < PO_MIN_ELEMENTS || + obj->package.elements[IS_PASS_SET].type != ACPI_TYPE_INTEGER) { kfree(obj); - return -EINVAL; + return -EIO; } ret = snprintf(buf, PAGE_SIZE, "%lld\n", obj->package.elements[IS_PASS_SET].integer.value); kfree(obj); diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/string-attributes.c b/drivers/platform/x86/dell/dell-wmi-sysman/string-attributes.c index c392f0ecf8b55..0d2c74f8d1aad 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/string-attributes.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/string-attributes.c @@ -25,9 +25,10 @@ static ssize_t current_value_show(struct kobject *kobj, struct kobj_attribute *a obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_STRING_ATTRIBUTE_GUID); if (!obj) return -EIO; - if (obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) { + if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < STR_MIN_ELEMENTS || + obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) { kfree(obj); - return -EINVAL; + return -EIO; } ret = snprintf(buf, PAGE_SIZE, "%s\n", obj->package.elements[CURRENT_VAL].string.pointer); kfree(obj); diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c b/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c index 40ddc6eb75624..decb3b997d86a 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c @@ -408,10 +408,10 @@ static int init_bios_attributes(int attr_type, const char *guid) return retval; switch (attr_type) { - case ENUM: min_elements = 8; break; - case INT: min_elements = 9; break; - case STR: min_elements = 8; break; - case PO: min_elements = 4; break; + case ENUM: min_elements = ENUM_MIN_ELEMENTS; break; + case INT: min_elements = INT_MIN_ELEMENTS; break; + case STR: min_elements = STR_MIN_ELEMENTS; break; + case PO: min_elements = PO_MIN_ELEMENTS; break; default: pr_err("Error: Unknown attr_type: %d\n", attr_type); return -EINVAL; -- GitLab From 0386a68f959a4563078fab0ffa332fb24a5a9088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Sat, 4 Jan 2025 00:05:12 +0100 Subject: [PATCH 1918/2211] platform/x86: hp-bioscfg: Directly use firmware_attributes_class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 63f8c058036057644f095123a35895cd11639b88 ] The usage of the lifecycle functions is not necessary anymore. Signed-off-by: Thomas Weißschuh Reviewed-by: Armin Wolf Reviewed-by: Mario Limonciello Reviewed-by: Mark Pearson Tested-by: Mark Pearson Link: https://lore.kernel.org/r/20250104-firmware-attributes-simplify-v1-4-949f9709e405@weissschuh.net Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Stable-dep-of: 11cba4793b95 ("platform/x86: hp-bioscfg: Fix class device unregistration") Signed-off-by: Sasha Levin --- drivers/platform/x86/hp/hp-bioscfg/bioscfg.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c b/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c index 2dc50152158a3..0b277b7e37dd6 100644 --- a/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c +++ b/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c @@ -24,8 +24,6 @@ struct bioscfg_priv bioscfg_drv = { .mutex = __MUTEX_INITIALIZER(bioscfg_drv.mutex), }; -static const struct class *fw_attr_class; - ssize_t display_name_language_code_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) @@ -972,11 +970,7 @@ static int __init hp_init(void) if (ret) return ret; - ret = fw_attributes_class_get(&fw_attr_class); - if (ret) - goto err_unregister_class; - - bioscfg_drv.class_dev = device_create(fw_attr_class, NULL, MKDEV(0, 0), + bioscfg_drv.class_dev = device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), NULL, "%s", DRIVER_NAME); if (IS_ERR(bioscfg_drv.class_dev)) { ret = PTR_ERR(bioscfg_drv.class_dev); @@ -1043,10 +1037,9 @@ err_release_attributes_data: release_attributes_data(); err_destroy_classdev: - device_destroy(fw_attr_class, MKDEV(0, 0)); + device_destroy(&firmware_attributes_class, MKDEV(0, 0)); err_unregister_class: - fw_attributes_class_put(); hp_exit_attr_set_interface(); return ret; @@ -1055,9 +1048,8 @@ err_unregister_class: static void __exit hp_exit(void) { release_attributes_data(); - device_destroy(fw_attr_class, MKDEV(0, 0)); + device_destroy(&firmware_attributes_class, MKDEV(0, 0)); - fw_attributes_class_put(); hp_exit_attr_set_interface(); } -- GitLab From 1958bccfa47aefabbabcfff08294fe2f6308c8d1 Mon Sep 17 00:00:00 2001 From: Kurt Borja Date: Wed, 25 Jun 2025 22:17:35 -0300 Subject: [PATCH 1919/2211] platform/x86: hp-bioscfg: Fix class device unregistration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 11cba4793b95df3bc192149a6eb044f69aa0b99e ] Devices under the firmware_attributes_class do not have unique a dev_t. Therefore, device_unregister() should be used instead of device_destroy(), since the latter may match any device with a given dev_t. Fixes: a34fc329b189 ("platform/x86: hp-bioscfg: bioscfg") Signed-off-by: Kurt Borja Link: https://lore.kernel.org/r/20250625-dest-fix-v1-1-3a0f342312bb@gmail.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/hp/hp-bioscfg/bioscfg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c b/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c index 0b277b7e37dd6..00b04adb4f191 100644 --- a/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c +++ b/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c @@ -1037,7 +1037,7 @@ err_release_attributes_data: release_attributes_data(); err_destroy_classdev: - device_destroy(&firmware_attributes_class, MKDEV(0, 0)); + device_unregister(bioscfg_drv.class_dev); err_unregister_class: hp_exit_attr_set_interface(); @@ -1048,7 +1048,7 @@ err_unregister_class: static void __exit hp_exit(void) { release_attributes_data(); - device_destroy(&firmware_attributes_class, MKDEV(0, 0)); + device_unregister(bioscfg_drv.class_dev); hp_exit_attr_set_interface(); } -- GitLab From b5c180ec1fbc72b349c9974c4dd433bc0b1fcf52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Sat, 4 Jan 2025 00:05:09 +0100 Subject: [PATCH 1920/2211] platform/x86: firmware_attributes_class: Move include linux/device/class.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit d0eee1be379204d2ee6cdb09bd98b3fd0165b6d3 ] The header firmware_attributes_class.h uses 'struct class'. It should also include the necessary dependency header. Signed-off-by: Thomas Weißschuh Reviewed-by: Armin Wolf Reviewed-by: Mario Limonciello Reviewed-by: Mark Pearson Tested-by: Mark Pearson Link: https://lore.kernel.org/r/20250104-firmware-attributes-simplify-v1-1-949f9709e405@weissschuh.net Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Stable-dep-of: 5ff1fbb30597 ("platform/x86: think-lmi: Fix class device unregistration") Signed-off-by: Sasha Levin --- drivers/platform/x86/firmware_attributes_class.c | 1 - drivers/platform/x86/firmware_attributes_class.h | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/firmware_attributes_class.c b/drivers/platform/x86/firmware_attributes_class.c index 182a07d8ae3df..cbc56e5db5928 100644 --- a/drivers/platform/x86/firmware_attributes_class.c +++ b/drivers/platform/x86/firmware_attributes_class.c @@ -3,7 +3,6 @@ /* Firmware attributes class helper module */ #include -#include #include #include "firmware_attributes_class.h" diff --git a/drivers/platform/x86/firmware_attributes_class.h b/drivers/platform/x86/firmware_attributes_class.h index 363c75f1ac1b8..8e0f47cfdf92e 100644 --- a/drivers/platform/x86/firmware_attributes_class.h +++ b/drivers/platform/x86/firmware_attributes_class.h @@ -5,6 +5,8 @@ #ifndef FW_ATTR_CLASS_H #define FW_ATTR_CLASS_H +#include + int fw_attributes_class_get(const struct class **fw_attr_class); int fw_attributes_class_put(void); -- GitLab From b36faa83285fbca97dce0ae7ba48675270343052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Sat, 4 Jan 2025 00:05:10 +0100 Subject: [PATCH 1921/2211] platform/x86: firmware_attributes_class: Simplify API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit d03cfde56f5cf9ec50b4cf099a42bf056fc80ddd ] The module core already guarantees that a module can only be unloaded after all other modules using its symbols have been unloaded. As it's already the responsibility of the drivers using firmware_attributes_class to clean up their devices before unloading, the lifetime of the firmware_attributes_class can be bound to the lifetime of the module. This enables the direct usage of firmware_attributes_class from the drivers, without having to go through the lifecycle functions, leading to simplifications for both the subsystem and its users. Signed-off-by: Thomas Weißschuh Reviewed-by: Armin Wolf Reviewed-by: Mario Limonciello Reviewed-by: Mark Pearson Tested-by: Mark Pearson Link: https://lore.kernel.org/r/20250104-firmware-attributes-simplify-v1-2-949f9709e405@weissschuh.net Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Stable-dep-of: 5ff1fbb30597 ("platform/x86: think-lmi: Fix class device unregistration") Signed-off-by: Sasha Levin --- .../platform/x86/firmware_attributes_class.c | 40 +++++++------------ .../platform/x86/firmware_attributes_class.h | 1 + 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/drivers/platform/x86/firmware_attributes_class.c b/drivers/platform/x86/firmware_attributes_class.c index cbc56e5db5928..87672c49e86ae 100644 --- a/drivers/platform/x86/firmware_attributes_class.c +++ b/drivers/platform/x86/firmware_attributes_class.c @@ -2,47 +2,35 @@ /* Firmware attributes class helper module */ -#include #include #include "firmware_attributes_class.h" -static DEFINE_MUTEX(fw_attr_lock); -static int fw_attr_inuse; - -static const struct class firmware_attributes_class = { +const struct class firmware_attributes_class = { .name = "firmware-attributes", }; +EXPORT_SYMBOL_GPL(firmware_attributes_class); + +static __init int fw_attributes_class_init(void) +{ + return class_register(&firmware_attributes_class); +} +module_init(fw_attributes_class_init); + +static __exit void fw_attributes_class_exit(void) +{ + class_unregister(&firmware_attributes_class); +} +module_exit(fw_attributes_class_exit); int fw_attributes_class_get(const struct class **fw_attr_class) { - int err; - - mutex_lock(&fw_attr_lock); - if (!fw_attr_inuse) { /*first time class is being used*/ - err = class_register(&firmware_attributes_class); - if (err) { - mutex_unlock(&fw_attr_lock); - return err; - } - } - fw_attr_inuse++; *fw_attr_class = &firmware_attributes_class; - mutex_unlock(&fw_attr_lock); return 0; } EXPORT_SYMBOL_GPL(fw_attributes_class_get); int fw_attributes_class_put(void) { - mutex_lock(&fw_attr_lock); - if (!fw_attr_inuse) { - mutex_unlock(&fw_attr_lock); - return -EINVAL; - } - fw_attr_inuse--; - if (!fw_attr_inuse) /* No more consumers */ - class_unregister(&firmware_attributes_class); - mutex_unlock(&fw_attr_lock); return 0; } EXPORT_SYMBOL_GPL(fw_attributes_class_put); diff --git a/drivers/platform/x86/firmware_attributes_class.h b/drivers/platform/x86/firmware_attributes_class.h index 8e0f47cfdf92e..ef6c3764a8349 100644 --- a/drivers/platform/x86/firmware_attributes_class.h +++ b/drivers/platform/x86/firmware_attributes_class.h @@ -7,6 +7,7 @@ #include +extern const struct class firmware_attributes_class; int fw_attributes_class_get(const struct class **fw_attr_class); int fw_attributes_class_put(void); -- GitLab From 1cef9e9e009014a8f87251310e4b71950a431cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Sat, 4 Jan 2025 00:05:11 +0100 Subject: [PATCH 1922/2211] platform/x86: think-lmi: Directly use firmware_attributes_class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 55922403807a12d4f96c67ba01a920edfb6f2633 ] The usage of the lifecycle functions is not necessary anymore. Signed-off-by: Thomas Weißschuh Reviewed-by: Armin Wolf Reviewed-by: Mario Limonciello Reviewed-by: Mark Pearson Tested-by: Mark Pearson Link: https://lore.kernel.org/r/20250104-firmware-attributes-simplify-v1-3-949f9709e405@weissschuh.net Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Stable-dep-of: 5ff1fbb30597 ("platform/x86: think-lmi: Fix class device unregistration") Signed-off-by: Sasha Levin --- drivers/platform/x86/think-lmi.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/drivers/platform/x86/think-lmi.c b/drivers/platform/x86/think-lmi.c index 1abd8378f158d..a7c3285323d6b 100644 --- a/drivers/platform/x86/think-lmi.c +++ b/drivers/platform/x86/think-lmi.c @@ -192,7 +192,6 @@ static const char * const level_options[] = { [TLMI_LEVEL_MASTER] = "master", }; static struct think_lmi tlmi_priv; -static const struct class *fw_attr_class; static DEFINE_MUTEX(tlmi_mutex); static inline struct tlmi_pwd_setting *to_tlmi_pwd_setting(struct kobject *kobj) @@ -1375,11 +1374,7 @@ static int tlmi_sysfs_init(void) { int i, ret; - ret = fw_attributes_class_get(&fw_attr_class); - if (ret) - return ret; - - tlmi_priv.class_dev = device_create(fw_attr_class, NULL, MKDEV(0, 0), + tlmi_priv.class_dev = device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), NULL, "%s", "thinklmi"); if (IS_ERR(tlmi_priv.class_dev)) { ret = PTR_ERR(tlmi_priv.class_dev); @@ -1492,9 +1487,8 @@ static int tlmi_sysfs_init(void) fail_create_attr: tlmi_release_attr(); fail_device_created: - device_destroy(fw_attr_class, MKDEV(0, 0)); + device_destroy(&firmware_attributes_class, MKDEV(0, 0)); fail_class_created: - fw_attributes_class_put(); return ret; } @@ -1717,8 +1711,7 @@ fail_clear_attr: static void tlmi_remove(struct wmi_device *wdev) { tlmi_release_attr(); - device_destroy(fw_attr_class, MKDEV(0, 0)); - fw_attributes_class_put(); + device_destroy(&firmware_attributes_class, MKDEV(0, 0)); } static int tlmi_probe(struct wmi_device *wdev, const void *context) -- GitLab From 48edcece52e03f68c8b493c356bed24a1900cb2b Mon Sep 17 00:00:00 2001 From: Kurt Borja Date: Wed, 25 Jun 2025 22:17:36 -0300 Subject: [PATCH 1923/2211] platform/x86: think-lmi: Fix class device unregistration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 5ff1fbb3059730700b4823f43999fc1315984632 ] Devices under the firmware_attributes_class do not have unique a dev_t. Therefore, device_unregister() should be used instead of device_destroy(), since the latter may match any device with a given dev_t. Fixes: a40cd7ef22fb ("platform/x86: think-lmi: Add WMI interface support on Lenovo platforms") Signed-off-by: Kurt Borja Link: https://lore.kernel.org/r/20250625-dest-fix-v1-2-3a0f342312bb@gmail.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/think-lmi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/think-lmi.c b/drivers/platform/x86/think-lmi.c index a7c3285323d6b..3a8e84589518a 100644 --- a/drivers/platform/x86/think-lmi.c +++ b/drivers/platform/x86/think-lmi.c @@ -1487,7 +1487,7 @@ static int tlmi_sysfs_init(void) fail_create_attr: tlmi_release_attr(); fail_device_created: - device_destroy(&firmware_attributes_class, MKDEV(0, 0)); + device_unregister(tlmi_priv.class_dev); fail_class_created: return ret; } @@ -1711,7 +1711,7 @@ fail_clear_attr: static void tlmi_remove(struct wmi_device *wdev) { tlmi_release_attr(); - device_destroy(&firmware_attributes_class, MKDEV(0, 0)); + device_unregister(tlmi_priv.class_dev); } static int tlmi_probe(struct wmi_device *wdev, const void *context) -- GitLab From 8d6b2f704f6eba196bfc12a74326ebdae59cfe21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Sat, 4 Jan 2025 00:05:13 +0100 Subject: [PATCH 1924/2211] platform/x86: dell-sysman: Directly use firmware_attributes_class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 501d2f0e78951b9a933bbff73404b25aec45f389 ] The usage of the lifecycle functions is not necessary anymore. Signed-off-by: Thomas Weißschuh Reviewed-by: Armin Wolf Reviewed-by: Mario Limonciello Reviewed-by: Mark Pearson Tested-by: Mark Pearson Link: https://lore.kernel.org/r/20250104-firmware-attributes-simplify-v1-5-949f9709e405@weissschuh.net Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Stable-dep-of: 314e5ad4782d ("platform/x86: dell-wmi-sysman: Fix class device unregistration") Signed-off-by: Sasha Levin --- .../platform/x86/dell/dell-wmi-sysman/sysman.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c b/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c index decb3b997d86a..3c74d5e8350a4 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c @@ -25,7 +25,6 @@ struct wmi_sysman_priv wmi_priv = { /* reset bios to defaults */ static const char * const reset_types[] = {"builtinsafe", "lastknowngood", "factory", "custom"}; static int reset_option = -1; -static const struct class *fw_attr_class; /** @@ -541,15 +540,11 @@ static int __init sysman_init(void) goto err_exit_bios_attr_pass_interface; } - ret = fw_attributes_class_get(&fw_attr_class); - if (ret) - goto err_exit_bios_attr_pass_interface; - - wmi_priv.class_dev = device_create(fw_attr_class, NULL, MKDEV(0, 0), + wmi_priv.class_dev = device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), NULL, "%s", DRIVER_NAME); if (IS_ERR(wmi_priv.class_dev)) { ret = PTR_ERR(wmi_priv.class_dev); - goto err_unregister_class; + goto err_exit_bios_attr_pass_interface; } wmi_priv.main_dir_kset = kset_create_and_add("attributes", NULL, @@ -602,10 +597,7 @@ err_release_attributes_data: release_attributes_data(); err_destroy_classdev: - device_destroy(fw_attr_class, MKDEV(0, 0)); - -err_unregister_class: - fw_attributes_class_put(); + device_destroy(&firmware_attributes_class, MKDEV(0, 0)); err_exit_bios_attr_pass_interface: exit_bios_attr_pass_interface(); @@ -619,8 +611,7 @@ err_exit_bios_attr_set_interface: static void __exit sysman_exit(void) { release_attributes_data(); - device_destroy(fw_attr_class, MKDEV(0, 0)); - fw_attributes_class_put(); + device_destroy(&firmware_attributes_class, MKDEV(0, 0)); exit_bios_attr_set_interface(); exit_bios_attr_pass_interface(); } -- GitLab From 206e2dca0ee53bcd367fd79bb6834b37f9fd5460 Mon Sep 17 00:00:00 2001 From: Kurt Borja Date: Wed, 25 Jun 2025 22:17:37 -0300 Subject: [PATCH 1925/2211] platform/x86: dell-wmi-sysman: Fix class device unregistration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 314e5ad4782d08858b3abc325c0487bd2abc23a1 ] Devices under the firmware_attributes_class do not have unique a dev_t. Therefore, device_unregister() should be used instead of device_destroy(), since the latter may match any device with a given dev_t. Fixes: e8a60aa7404b ("platform/x86: Introduce support for Systems Management Driver over WMI for Dell Systems") Signed-off-by: Kurt Borja Link: https://lore.kernel.org/r/20250625-dest-fix-v1-3-3a0f342312bb@gmail.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/dell/dell-wmi-sysman/sysman.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c b/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c index 3c74d5e8350a4..f5402b7146572 100644 --- a/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c +++ b/drivers/platform/x86/dell/dell-wmi-sysman/sysman.c @@ -597,7 +597,7 @@ err_release_attributes_data: release_attributes_data(); err_destroy_classdev: - device_destroy(&firmware_attributes_class, MKDEV(0, 0)); + device_unregister(wmi_priv.class_dev); err_exit_bios_attr_pass_interface: exit_bios_attr_pass_interface(); @@ -611,7 +611,7 @@ err_exit_bios_attr_set_interface: static void __exit sysman_exit(void) { release_attributes_data(); - device_destroy(&firmware_attributes_class, MKDEV(0, 0)); + device_unregister(wmi_priv.class_dev); exit_bios_attr_set_interface(); exit_bios_attr_pass_interface(); } -- GitLab From 800a6bde38f901dab86a7d694687bc6960667973 Mon Sep 17 00:00:00 2001 From: Alok Tiwari Date: Mon, 30 Jun 2025 03:58:08 -0700 Subject: [PATCH 1926/2211] platform/mellanox: mlxreg-lc: Fix logic error in power state check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 644bec18e705ca41d444053407419a21832fcb2f ] Fixes a logic issue in mlxreg_lc_completion_notify() where the intention was to check if MLXREG_LC_POWERED flag is not set before powering on the device. The original code used "state & ~MLXREG_LC_POWERED" to check for the absence of the POWERED bit. However this condition evaluates to true even when other bits are set, leading to potentially incorrect behavior. Corrected the logic to explicitly check for the absence of MLXREG_LC_POWERED using !(state & MLXREG_LC_POWERED). Fixes: 62f9529b8d5c ("platform/mellanox: mlxreg-lc: Add initial support for Nvidia line card devices") Suggested-by: Vadim Pasternak Signed-off-by: Alok Tiwari Link: https://lore.kernel.org/r/20250630105812.601014-1-alok.a.tiwari@oracle.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/mellanox/mlxreg-lc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/platform/mellanox/mlxreg-lc.c b/drivers/platform/mellanox/mlxreg-lc.c index 43d119e3a4734..99152676dbd28 100644 --- a/drivers/platform/mellanox/mlxreg-lc.c +++ b/drivers/platform/mellanox/mlxreg-lc.c @@ -688,7 +688,7 @@ static int mlxreg_lc_completion_notify(void *handle, struct i2c_adapter *parent, if (regval & mlxreg_lc->data->mask) { mlxreg_lc->state |= MLXREG_LC_SYNCED; mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_SYNCED, 1); - if (mlxreg_lc->state & ~MLXREG_LC_POWERED) { + if (!(mlxreg_lc->state & MLXREG_LC_POWERED)) { err = mlxreg_lc_power_on_off(mlxreg_lc, 1); if (err) goto mlxreg_lc_regmap_power_on_off_fail; -- GitLab From 6a5348dbd745109abe0b5d611b947770a1140318 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Sun, 8 Jun 2025 18:52:04 +0300 Subject: [PATCH 1927/2211] drm/bridge: aux-hpd-bridge: fix assignment of the of_node [ Upstream commit e8537cad824065b0425fb0429e762e14a08067c2 ] Perform fix similar to the one in the commit 85e444a68126 ("drm/bridge: Fix assignment of the of_node of the parent to aux bridge"). The assignment of the of_node to the aux HPD bridge needs to mark the of_node as reused, otherwise driver core will attempt to bind resources like pinctrl, which is going to fail as corresponding pins are already marked as used by the parent device. Fix that by using the device_set_of_node_from_dev() helper instead of assigning it directly. Fixes: e560518a6c2e ("drm/bridge: implement generic DP HPD bridge") Signed-off-by: Dmitry Baryshkov Reviewed-by: Neil Armstrong Signed-off-by: Neil Armstrong Link: https://lore.kernel.org/r/20250608-fix-aud-hpd-bridge-v1-1-4641a6f8e381@oss.qualcomm.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/bridge/aux-hpd-bridge.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/aux-hpd-bridge.c b/drivers/gpu/drm/bridge/aux-hpd-bridge.c index 6886db2d9e00c..8e889a38fad00 100644 --- a/drivers/gpu/drm/bridge/aux-hpd-bridge.c +++ b/drivers/gpu/drm/bridge/aux-hpd-bridge.c @@ -64,10 +64,11 @@ struct auxiliary_device *devm_drm_dp_hpd_bridge_alloc(struct device *parent, str adev->id = ret; adev->name = "dp_hpd_bridge"; adev->dev.parent = parent; - adev->dev.of_node = of_node_get(parent->of_node); adev->dev.release = drm_aux_hpd_bridge_release; adev->dev.platform_data = of_node_get(np); + device_set_of_node_from_dev(&adev->dev, parent); + ret = auxiliary_device_init(adev); if (ret) { of_node_put(adev->dev.platform_data); -- GitLab From 3f6932ef25378794894c3c1024092ad14da2d330 Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Wed, 25 Jun 2025 00:00:17 -0300 Subject: [PATCH 1928/2211] smb: client: fix warning when reconnecting channel [ Upstream commit 3bbe46716092d8ef6b0df4b956f585c5cd0fc78e ] When reconnecting a channel in smb2_reconnect_server(), a dummy tcon is passed down to smb2_reconnect() with ->query_interface uninitialized, so we can't call queue_delayed_work() on it. Fix the following warning by ensuring that we're queueing the delayed worker from correct tcon. WARNING: CPU: 4 PID: 1126 at kernel/workqueue.c:2498 __queue_delayed_work+0x1d2/0x200 Modules linked in: cifs cifs_arc4 nls_ucs2_utils cifs_md4 [last unloaded: cifs] CPU: 4 UID: 0 PID: 1126 Comm: kworker/4:0 Not tainted 6.16.0-rc3 #5 PREEMPT(voluntary) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-4.fc42 04/01/2014 Workqueue: cifsiod smb2_reconnect_server [cifs] RIP: 0010:__queue_delayed_work+0x1d2/0x200 Code: 41 5e 41 5f e9 7f ee ff ff 90 0f 0b 90 e9 5d ff ff ff bf 02 00 00 00 e8 6c f3 07 00 89 c3 eb bd 90 0f 0b 90 e9 57 f> 0b 90 e9 65 fe ff ff 90 0f 0b 90 e9 72 fe ff ff 90 0f 0b 90 e9 RSP: 0018:ffffc900014afad8 EFLAGS: 00010003 RAX: 0000000000000000 RBX: ffff888124d99988 RCX: ffffffff81399cc1 RDX: dffffc0000000000 RSI: ffff888114326e00 RDI: ffff888124d999f0 RBP: 000000000000ea60 R08: 0000000000000001 R09: ffffed10249b3331 R10: ffff888124d9998f R11: 0000000000000004 R12: 0000000000000040 R13: ffff888114326e00 R14: ffff888124d999d8 R15: ffff888114939020 FS: 0000000000000000(0000) GS:ffff88829f7fe000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007ffe7a2b4038 CR3: 0000000120a6f000 CR4: 0000000000750ef0 PKRU: 55555554 Call Trace: queue_delayed_work_on+0xb4/0xc0 smb2_reconnect+0xb22/0xf50 [cifs] smb2_reconnect_server+0x413/0xd40 [cifs] ? __pfx_smb2_reconnect_server+0x10/0x10 [cifs] ? local_clock_noinstr+0xd/0xd0 ? local_clock+0x15/0x30 ? lock_release+0x29b/0x390 process_one_work+0x4c5/0xa10 ? __pfx_process_one_work+0x10/0x10 ? __list_add_valid_or_report+0x37/0x120 worker_thread+0x2f1/0x5a0 ? __kthread_parkme+0xde/0x100 ? __pfx_worker_thread+0x10/0x10 kthread+0x1fe/0x380 ? kthread+0x10f/0x380 ? __pfx_kthread+0x10/0x10 ? local_clock_noinstr+0xd/0xd0 ? ret_from_fork+0x1b/0x1f0 ? local_clock+0x15/0x30 ? lock_release+0x29b/0x390 ? rcu_is_watching+0x20/0x50 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x15b/0x1f0 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 irq event stamp: 1116206 hardirqs last enabled at (1116205): [] __up_console_sem+0x52/0x60 hardirqs last disabled at (1116206): [] queue_delayed_work_on+0x6e/0xc0 softirqs last enabled at (1116138): [] __smb_send_rqst+0x42d/0x950 [cifs] softirqs last disabled at (1116136): [] release_sock+0x21/0xf0 Cc: linux-cifs@vger.kernel.org Reported-by: David Howells Fixes: 42ca547b13a2 ("cifs: do not disable interface polling on failure") Reviewed-by: David Howells Tested-by: David Howells Reviewed-by: Shyam Prasad N Signed-off-by: Paulo Alcantara (Red Hat) Signed-off-by: David Howells Tested-by: Steve French Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/cifsglob.h | 1 + fs/smb/client/smb2pdu.c | 10 ++++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index c66655adecb2c..e77c0b3e49624 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -1275,6 +1275,7 @@ struct cifs_tcon { bool use_persistent:1; /* use persistent instead of durable handles */ bool no_lease:1; /* Do not request leases on files or directories */ bool use_witness:1; /* use witness protocol */ + bool dummy:1; /* dummy tcon used for reconnecting channels */ __le32 capabilities; __u32 share_flags; __u32 maximal_access; diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index c6ae395a46925..3e501da62880c 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -440,9 +440,9 @@ skip_sess_setup: free_xid(xid); ses->flags &= ~CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES; - /* regardless of rc value, setup polling */ - queue_delayed_work(cifsiod_wq, &tcon->query_interfaces, - (SMB_INTERFACE_POLL_INTERVAL * HZ)); + if (!tcon->ipc && !tcon->dummy) + queue_delayed_work(cifsiod_wq, &tcon->query_interfaces, + (SMB_INTERFACE_POLL_INTERVAL * HZ)); mutex_unlock(&ses->session_mutex); @@ -4234,10 +4234,8 @@ void smb2_reconnect_server(struct work_struct *work) } goto done; } - tcon->status = TID_GOOD; - tcon->retry = false; - tcon->need_reconnect = false; + tcon->dummy = true; /* now reconnect sessions for necessary channels */ list_for_each_entry_safe(ses, ses2, &tmp_ses_list, rlist) { -- GitLab From 510a6095d754df9d727f644ec5076b7929d6c9ea Mon Sep 17 00:00:00 2001 From: Oleksij Rempel Date: Fri, 27 Jun 2025 07:13:46 +0200 Subject: [PATCH 1929/2211] net: usb: lan78xx: fix WARN in __netif_napi_del_locked on disconnect [ Upstream commit 6c7ffc9af7186ed79403a3ffee9a1e5199fc7450 ] Remove redundant netif_napi_del() call from disconnect path. A WARN may be triggered in __netif_napi_del_locked() during USB device disconnect: WARNING: CPU: 0 PID: 11 at net/core/dev.c:7417 __netif_napi_del_locked+0x2b4/0x350 This happens because netif_napi_del() is called in the disconnect path while NAPI is still enabled. However, it is not necessary to call netif_napi_del() explicitly, since unregister_netdev() will handle NAPI teardown automatically and safely. Removing the redundant call avoids triggering the warning. Full trace: lan78xx 1-1:1.0 enu1: Failed to read register index 0x000000c4. ret = -ENODEV lan78xx 1-1:1.0 enu1: Failed to set MAC down with error -ENODEV lan78xx 1-1:1.0 enu1: Link is Down lan78xx 1-1:1.0 enu1: Failed to read register index 0x00000120. ret = -ENODEV ------------[ cut here ]------------ WARNING: CPU: 0 PID: 11 at net/core/dev.c:7417 __netif_napi_del_locked+0x2b4/0x350 Modules linked in: flexcan can_dev fuse CPU: 0 UID: 0 PID: 11 Comm: kworker/0:1 Not tainted 6.16.0-rc2-00624-ge926949dab03 #9 PREEMPT Hardware name: SKOV IMX8MP CPU revC - bd500 (DT) Workqueue: usb_hub_wq hub_event pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : __netif_napi_del_locked+0x2b4/0x350 lr : __netif_napi_del_locked+0x7c/0x350 sp : ffffffc085b673c0 x29: ffffffc085b673c0 x28: ffffff800b7f2000 x27: ffffff800b7f20d8 x26: ffffff80110bcf58 x25: ffffff80110bd978 x24: 1ffffff0022179eb x23: ffffff80110bc000 x22: ffffff800b7f5000 x21: ffffff80110bc000 x20: ffffff80110bcf38 x19: ffffff80110bcf28 x18: dfffffc000000000 x17: ffffffc081578940 x16: ffffffc08284cee0 x15: 0000000000000028 x14: 0000000000000006 x13: 0000000000040000 x12: ffffffb0022179e8 x11: 1ffffff0022179e7 x10: ffffffb0022179e7 x9 : dfffffc000000000 x8 : 0000004ffdde8619 x7 : ffffff80110bcf3f x6 : 0000000000000001 x5 : ffffff80110bcf38 x4 : ffffff80110bcf38 x3 : 0000000000000000 x2 : 0000000000000000 x1 : 1ffffff0022179e7 x0 : 0000000000000000 Call trace: __netif_napi_del_locked+0x2b4/0x350 (P) lan78xx_disconnect+0xf4/0x360 usb_unbind_interface+0x158/0x718 device_remove+0x100/0x150 device_release_driver_internal+0x308/0x478 device_release_driver+0x1c/0x30 bus_remove_device+0x1a8/0x368 device_del+0x2e0/0x7b0 usb_disable_device+0x244/0x540 usb_disconnect+0x220/0x758 hub_event+0x105c/0x35e0 process_one_work+0x760/0x17b0 worker_thread+0x768/0xce8 kthread+0x3bc/0x690 ret_from_fork+0x10/0x20 irq event stamp: 211604 hardirqs last enabled at (211603): [] _raw_spin_unlock_irqrestore+0x84/0x98 hardirqs last disabled at (211604): [] el1_dbg+0x24/0x80 softirqs last enabled at (211296): [] handle_softirqs+0x820/0xbc8 softirqs last disabled at (210993): [] __do_softirq+0x18/0x20 ---[ end trace 0000000000000000 ]--- lan78xx 1-1:1.0 enu1: failed to kill vid 0081/0 Fixes: ec4c7e12396b ("lan78xx: Introduce NAPI polling support") Suggested-by: Jakub Kicinski Signed-off-by: Oleksij Rempel Link: https://patch.msgid.link/20250627051346.276029-1-o.rempel@pengutronix.de Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/usb/lan78xx.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index 531b1b6a37d19..2f8637224b69e 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@ -4229,8 +4229,6 @@ static void lan78xx_disconnect(struct usb_interface *intf) if (!dev) return; - netif_napi_del(&dev->napi); - udev = interface_to_usbdev(intf); net = dev->net; -- GitLab From 5a7ae7bebdc4c2ecd48a2c061319956f65c09473 Mon Sep 17 00:00:00 2001 From: Janusz Krzysztofik Date: Wed, 11 Jun 2025 12:42:13 +0200 Subject: [PATCH 1930/2211] drm/i915/gt: Fix timeline left held on VMA alloc error [ Upstream commit a5aa7bc1fca78c7fa127d9e33aa94a0c9066c1d6 ] The following error has been reported sporadically by CI when a test unbinds the i915 driver on a ring submission platform: <4> [239.330153] ------------[ cut here ]------------ <4> [239.330166] i915 0000:00:02.0: [drm] drm_WARN_ON(dev_priv->mm.shrink_count) <4> [239.330196] WARNING: CPU: 1 PID: 18570 at drivers/gpu/drm/i915/i915_gem.c:1309 i915_gem_cleanup_early+0x13e/0x150 [i915] ... <4> [239.330640] RIP: 0010:i915_gem_cleanup_early+0x13e/0x150 [i915] ... <4> [239.330942] Call Trace: <4> [239.330944] <4> [239.330949] i915_driver_late_release+0x2b/0xa0 [i915] <4> [239.331202] i915_driver_release+0x86/0xa0 [i915] <4> [239.331482] devm_drm_dev_init_release+0x61/0x90 <4> [239.331494] devm_action_release+0x15/0x30 <4> [239.331504] release_nodes+0x3d/0x120 <4> [239.331517] devres_release_all+0x96/0xd0 <4> [239.331533] device_unbind_cleanup+0x12/0x80 <4> [239.331543] device_release_driver_internal+0x23a/0x280 <4> [239.331550] ? bus_find_device+0xa5/0xe0 <4> [239.331563] device_driver_detach+0x14/0x20 ... <4> [357.719679] ---[ end trace 0000000000000000 ]--- If the test also unloads the i915 module then that's followed with: <3> [357.787478] ============================================================================= <3> [357.788006] BUG i915_vma (Tainted: G U W N ): Objects remaining on __kmem_cache_shutdown() <3> [357.788031] ----------------------------------------------------------------------------- <3> [357.788204] Object 0xffff888109e7f480 @offset=29824 <3> [357.788670] Allocated in i915_vma_instance+0xee/0xc10 [i915] age=292729 cpu=4 pid=2244 <4> [357.788994] i915_vma_instance+0xee/0xc10 [i915] <4> [357.789290] init_status_page+0x7b/0x420 [i915] <4> [357.789532] intel_engines_init+0x1d8/0x980 [i915] <4> [357.789772] intel_gt_init+0x175/0x450 [i915] <4> [357.790014] i915_gem_init+0x113/0x340 [i915] <4> [357.790281] i915_driver_probe+0x847/0xed0 [i915] <4> [357.790504] i915_pci_probe+0xe6/0x220 [i915] ... Closer analysis of CI results history has revealed a dependency of the error on a few IGT tests, namely: - igt@api_intel_allocator@fork-simple-stress-signal, - igt@api_intel_allocator@two-level-inception-interruptible, - igt@gem_linear_blits@interruptible, - igt@prime_mmap_coherency@ioctl-errors, which invisibly trigger the issue, then exhibited with first driver unbind attempt. All of the above tests perform actions which are actively interrupted with signals. Further debugging has allowed to narrow that scope down to DRM_IOCTL_I915_GEM_EXECBUFFER2, and ring_context_alloc(), specific to ring submission, in particular. If successful then that function, or its execlists or GuC submission equivalent, is supposed to be called only once per GEM context engine, followed by raise of a flag that prevents the function from being called again. The function is expected to unwind its internal errors itself, so it may be safely called once more after it returns an error. In case of ring submission, the function first gets a reference to the engine's legacy timeline and then allocates a VMA. If the VMA allocation fails, e.g. when i915_vma_instance() called from inside is interrupted with a signal, then ring_context_alloc() fails, leaving the timeline held referenced. On next I915_GEM_EXECBUFFER2 IOCTL, another reference to the timeline is got, and only that last one is put on successful completion. As a consequence, the legacy timeline, with its underlying engine status page's VMA object, is still held and not released on driver unbind. Get the legacy timeline only after successful allocation of the context engine's VMA. v2: Add a note on other submission methods (Krzysztof Karas): Both execlists and GuC submission use lrc_alloc() which seems free from a similar issue. Fixes: 75d0a7f31eec ("drm/i915: Lift timeline into intel_context") Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061 Cc: Chris Wilson Cc: Matthew Auld Cc: Krzysztof Karas Reviewed-by: Sebastian Brzezinka Reviewed-by: Krzysztof Niemiec Signed-off-by: Janusz Krzysztofik Reviewed-by: Nitin Gote Reviewed-by: Andi Shyti Signed-off-by: Andi Shyti Link: https://lore.kernel.org/r/20250611104352.1014011-2-janusz.krzysztofik@linux.intel.com (cherry picked from commit cc43422b3cc79eacff4c5a8ba0d224688ca9dd4f) Signed-off-by: Joonas Lahtinen Signed-off-by: Sasha Levin --- drivers/gpu/drm/i915/gt/intel_ring_submission.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/gt/intel_ring_submission.c b/drivers/gpu/drm/i915/gt/intel_ring_submission.c index 72277bc8322e8..f84fa09cdb339 100644 --- a/drivers/gpu/drm/i915/gt/intel_ring_submission.c +++ b/drivers/gpu/drm/i915/gt/intel_ring_submission.c @@ -575,7 +575,6 @@ static int ring_context_alloc(struct intel_context *ce) /* One ringbuffer to rule them all */ GEM_BUG_ON(!engine->legacy.ring); ce->ring = engine->legacy.ring; - ce->timeline = intel_timeline_get(engine->legacy.timeline); GEM_BUG_ON(ce->state); if (engine->context_size) { @@ -588,6 +587,8 @@ static int ring_context_alloc(struct intel_context *ce) ce->state = vma; } + ce->timeline = intel_timeline_get(engine->legacy.timeline); + return 0; } -- GitLab From 6a17e0d27fbe0dd6f3061aa627e61b4ac7afbb95 Mon Sep 17 00:00:00 2001 From: Junxiao Chang Date: Fri, 25 Apr 2025 23:11:07 +0800 Subject: [PATCH 1931/2211] drm/i915/gsc: mei interrupt top half should be in irq disabled context [ Upstream commit 8cadce97bf264ed478669c6f32d5603b34608335 ] MEI GSC interrupt comes from i915. It has top half and bottom half. Top half is called from i915 interrupt handler. It should be in irq disabled context. With RT kernel, by default i915 IRQ handler is in threaded IRQ. MEI GSC top half might be in threaded IRQ context. generic_handle_irq_safe API could be called from either IRQ or process context, it disables local IRQ then calls MEI GSC interrupt top half. This change fixes A380/A770 GPU boot hang issue with RT kernel. Fixes: 1e3dc1d8622b ("drm/i915/gsc: add gsc as a mei auxiliary device") Tested-by: Furong Zhou Suggested-by: Sebastian Andrzej Siewior Acked-by: Sebastian Andrzej Siewior Signed-off-by: Junxiao Chang Link: https://lore.kernel.org/r/20250425151108.643649-1-junxiao.chang@intel.com Reviewed-by: Rodrigo Vivi Signed-off-by: Rodrigo Vivi (cherry picked from commit dccf655f69002d496a527ba441b4f008aa5bebbf) Signed-off-by: Joonas Lahtinen Signed-off-by: Sasha Levin --- drivers/gpu/drm/i915/gt/intel_gsc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/gt/intel_gsc.c b/drivers/gpu/drm/i915/gt/intel_gsc.c index 1e925c75fb080..c43febc862dc3 100644 --- a/drivers/gpu/drm/i915/gt/intel_gsc.c +++ b/drivers/gpu/drm/i915/gt/intel_gsc.c @@ -284,7 +284,7 @@ static void gsc_irq_handler(struct intel_gt *gt, unsigned int intf_id) if (gt->gsc.intf[intf_id].irq < 0) return; - ret = generic_handle_irq(gt->gsc.intf[intf_id].irq); + ret = generic_handle_irq_safe(gt->gsc.intf[intf_id].irq); if (ret) gt_err_ratelimited(gt, "error handling GSC irq: %d\n", ret); } -- GitLab From 018ff57fd79c38be989b8b3248bbe69bcfb77160 Mon Sep 17 00:00:00 2001 From: Michal Swiatkowski Date: Thu, 22 May 2025 10:52:06 +0200 Subject: [PATCH 1932/2211] idpf: return 0 size for RSS key if not supported [ Upstream commit f77bf1ebf8ff6301ccdbc346f7b52db928f9cbf8 ] Returning -EOPNOTSUPP from function returning u32 is leading to cast and invalid size value as a result. -EOPNOTSUPP as a size probably will lead to allocation fail. Command: ethtool -x eth0 It is visible on all devices that don't have RSS caps set. [ 136.615917] Call Trace: [ 136.615921] [ 136.615927] ? __warn+0x89/0x130 [ 136.615942] ? __alloc_frozen_pages_noprof+0x322/0x330 [ 136.615953] ? report_bug+0x164/0x190 [ 136.615968] ? handle_bug+0x58/0x90 [ 136.615979] ? exc_invalid_op+0x17/0x70 [ 136.615987] ? asm_exc_invalid_op+0x1a/0x20 [ 136.616001] ? rss_prepare_get.constprop.0+0xb9/0x170 [ 136.616016] ? __alloc_frozen_pages_noprof+0x322/0x330 [ 136.616028] __alloc_pages_noprof+0xe/0x20 [ 136.616038] ___kmalloc_large_node+0x80/0x110 [ 136.616072] __kmalloc_large_node_noprof+0x1d/0xa0 [ 136.616081] __kmalloc_noprof+0x32c/0x4c0 [ 136.616098] ? rss_prepare_get.constprop.0+0xb9/0x170 [ 136.616105] rss_prepare_get.constprop.0+0xb9/0x170 [ 136.616114] ethnl_default_doit+0x107/0x3d0 [ 136.616131] genl_family_rcv_msg_doit+0x100/0x160 [ 136.616147] genl_rcv_msg+0x1b8/0x2c0 [ 136.616156] ? __pfx_ethnl_default_doit+0x10/0x10 [ 136.616168] ? __pfx_genl_rcv_msg+0x10/0x10 [ 136.616176] netlink_rcv_skb+0x58/0x110 [ 136.616186] genl_rcv+0x28/0x40 [ 136.616195] netlink_unicast+0x19b/0x290 [ 136.616206] netlink_sendmsg+0x222/0x490 [ 136.616215] __sys_sendto+0x1fd/0x210 [ 136.616233] __x64_sys_sendto+0x24/0x30 [ 136.616242] do_syscall_64+0x82/0x160 [ 136.616252] ? __sys_recvmsg+0x83/0xe0 [ 136.616265] ? syscall_exit_to_user_mode+0x10/0x210 [ 136.616275] ? do_syscall_64+0x8e/0x160 [ 136.616282] ? __count_memcg_events+0xa1/0x130 [ 136.616295] ? count_memcg_events.constprop.0+0x1a/0x30 [ 136.616306] ? handle_mm_fault+0xae/0x2d0 [ 136.616319] ? do_user_addr_fault+0x379/0x670 [ 136.616328] ? clear_bhb_loop+0x45/0xa0 [ 136.616340] ? clear_bhb_loop+0x45/0xa0 [ 136.616349] ? clear_bhb_loop+0x45/0xa0 [ 136.616359] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 136.616369] RIP: 0033:0x7fd30ba7b047 [ 136.616376] Code: 0c 00 f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b8 0f 1f 00 f3 0f 1e fa 80 3d bd d5 0c 00 00 41 89 ca 74 10 b8 2c 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 71 c3 55 48 83 ec 30 44 89 4c 24 2c 4c 89 44 [ 136.616381] RSP: 002b:00007ffde1796d68 EFLAGS: 00000202 ORIG_RAX: 000000000000002c [ 136.616388] RAX: ffffffffffffffda RBX: 000055d7bd89f2a0 RCX: 00007fd30ba7b047 [ 136.616392] RDX: 0000000000000028 RSI: 000055d7bd89f3b0 RDI: 0000000000000003 [ 136.616396] RBP: 00007ffde1796e10 R08: 00007fd30bb4e200 R09: 000000000000000c [ 136.616399] R10: 0000000000000000 R11: 0000000000000202 R12: 000055d7bd89f340 [ 136.616403] R13: 000055d7bd89f3b0 R14: 000055d78943f200 R15: 0000000000000000 Fixes: 02cbfba1add5 ("idpf: add ethtool callbacks") Reviewed-by: Ahmed Zaki Signed-off-by: Michal Swiatkowski Reviewed-by: Simon Horman Tested-by: Samuel Salin Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/idpf/idpf_ethtool.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/intel/idpf/idpf_ethtool.c b/drivers/net/ethernet/intel/idpf/idpf_ethtool.c index 59b1a1a099967..f72420cf68216 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_ethtool.c +++ b/drivers/net/ethernet/intel/idpf/idpf_ethtool.c @@ -46,7 +46,7 @@ static u32 idpf_get_rxfh_key_size(struct net_device *netdev) struct idpf_vport_user_config_data *user_config; if (!idpf_is_cap_ena_all(np->adapter, IDPF_RSS_CAPS, IDPF_CAP_RSS)) - return -EOPNOTSUPP; + return 0; user_config = &np->adapter->vport_config[np->vport_idx]->user_config; @@ -65,7 +65,7 @@ static u32 idpf_get_rxfh_indir_size(struct net_device *netdev) struct idpf_vport_user_config_data *user_config; if (!idpf_is_cap_ena_all(np->adapter, IDPF_RSS_CAPS, IDPF_CAP_RSS)) - return -EOPNOTSUPP; + return 0; user_config = &np->adapter->vport_config[np->vport_idx]->user_config; -- GitLab From 9a36715cd6bc6a6f16230e19a7f947bab34b3fe5 Mon Sep 17 00:00:00 2001 From: Ahmed Zaki Date: Fri, 23 May 2025 14:55:37 -0600 Subject: [PATCH 1933/2211] idpf: convert control queue mutex to a spinlock [ Upstream commit b2beb5bb2cd90d7939e470ed4da468683f41baa3 ] With VIRTCHNL2_CAP_MACFILTER enabled, the following warning is generated on module load: [ 324.701677] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:578 [ 324.701684] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1582, name: NetworkManager [ 324.701689] preempt_count: 201, expected: 0 [ 324.701693] RCU nest depth: 0, expected: 0 [ 324.701697] 2 locks held by NetworkManager/1582: [ 324.701702] #0: ffffffff9f7be770 (rtnl_mutex){....}-{3:3}, at: rtnl_newlink+0x791/0x21e0 [ 324.701730] #1: ff1100216c380368 (_xmit_ETHER){....}-{2:2}, at: __dev_open+0x3f0/0x870 [ 324.701749] Preemption disabled at: [ 324.701752] [] __dev_open+0x3dd/0x870 [ 324.701765] CPU: 30 UID: 0 PID: 1582 Comm: NetworkManager Not tainted 6.15.0-rc5+ #2 PREEMPT(voluntary) [ 324.701771] Hardware name: Intel Corporation M50FCP2SBSTD/M50FCP2SBSTD, BIOS SE5C741.86B.01.01.0001.2211140926 11/14/2022 [ 324.701774] Call Trace: [ 324.701777] [ 324.701779] dump_stack_lvl+0x5d/0x80 [ 324.701788] ? __dev_open+0x3dd/0x870 [ 324.701793] __might_resched.cold+0x1ef/0x23d <..> [ 324.701818] __mutex_lock+0x113/0x1b80 <..> [ 324.701917] idpf_ctlq_clean_sq+0xad/0x4b0 [idpf] [ 324.701935] ? kasan_save_track+0x14/0x30 [ 324.701941] idpf_mb_clean+0x143/0x380 [idpf] <..> [ 324.701991] idpf_send_mb_msg+0x111/0x720 [idpf] [ 324.702009] idpf_vc_xn_exec+0x4cc/0x990 [idpf] [ 324.702021] ? rcu_is_watching+0x12/0xc0 [ 324.702035] idpf_add_del_mac_filters+0x3ed/0xb50 [idpf] <..> [ 324.702122] __hw_addr_sync_dev+0x1cf/0x300 [ 324.702126] ? find_held_lock+0x32/0x90 [ 324.702134] idpf_set_rx_mode+0x317/0x390 [idpf] [ 324.702152] __dev_open+0x3f8/0x870 [ 324.702159] ? __pfx___dev_open+0x10/0x10 [ 324.702174] __dev_change_flags+0x443/0x650 <..> [ 324.702208] netif_change_flags+0x80/0x160 [ 324.702218] do_setlink.isra.0+0x16a0/0x3960 <..> [ 324.702349] rtnl_newlink+0x12fd/0x21e0 The sequence is as follows: rtnl_newlink()-> __dev_change_flags()-> __dev_open()-> dev_set_rx_mode() - > # disables BH and grabs "dev->addr_list_lock" idpf_set_rx_mode() -> # proceed only if VIRTCHNL2_CAP_MACFILTER is ON __dev_uc_sync() -> idpf_add_mac_filter -> idpf_add_del_mac_filters -> idpf_send_mb_msg() -> idpf_mb_clean() -> idpf_ctlq_clean_sq() # mutex_lock(cq_lock) Fix by converting cq_lock to a spinlock. All operations under the new lock are safe except freeing the DMA memory, which may use vunmap(). Fix by requesting a contiguous physical memory for the DMA mapping. Fixes: a251eee62133 ("idpf: add SRIOV support and other ndo_ops") Reviewed-by: Aleksandr Loktionov Signed-off-by: Ahmed Zaki Reviewed-by: Simon Horman Tested-by: Samuel Salin Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- .../net/ethernet/intel/idpf/idpf_controlq.c | 23 +++++++++---------- .../ethernet/intel/idpf/idpf_controlq_api.h | 2 +- drivers/net/ethernet/intel/idpf/idpf_lib.c | 12 ++++++---- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/drivers/net/ethernet/intel/idpf/idpf_controlq.c b/drivers/net/ethernet/intel/idpf/idpf_controlq.c index b28991dd18703..48b8e184f3db6 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_controlq.c +++ b/drivers/net/ethernet/intel/idpf/idpf_controlq.c @@ -96,7 +96,7 @@ static void idpf_ctlq_init_rxq_bufs(struct idpf_ctlq_info *cq) */ static void idpf_ctlq_shutdown(struct idpf_hw *hw, struct idpf_ctlq_info *cq) { - mutex_lock(&cq->cq_lock); + spin_lock(&cq->cq_lock); /* free ring buffers and the ring itself */ idpf_ctlq_dealloc_ring_res(hw, cq); @@ -104,8 +104,7 @@ static void idpf_ctlq_shutdown(struct idpf_hw *hw, struct idpf_ctlq_info *cq) /* Set ring_size to 0 to indicate uninitialized queue */ cq->ring_size = 0; - mutex_unlock(&cq->cq_lock); - mutex_destroy(&cq->cq_lock); + spin_unlock(&cq->cq_lock); } /** @@ -173,7 +172,7 @@ int idpf_ctlq_add(struct idpf_hw *hw, idpf_ctlq_init_regs(hw, cq, is_rxq); - mutex_init(&cq->cq_lock); + spin_lock_init(&cq->cq_lock); list_add(&cq->cq_list, &hw->cq_list_head); @@ -272,7 +271,7 @@ int idpf_ctlq_send(struct idpf_hw *hw, struct idpf_ctlq_info *cq, int err = 0; int i; - mutex_lock(&cq->cq_lock); + spin_lock(&cq->cq_lock); /* Ensure there are enough descriptors to send all messages */ num_desc_avail = IDPF_CTLQ_DESC_UNUSED(cq); @@ -332,7 +331,7 @@ int idpf_ctlq_send(struct idpf_hw *hw, struct idpf_ctlq_info *cq, wr32(hw, cq->reg.tail, cq->next_to_use); err_unlock: - mutex_unlock(&cq->cq_lock); + spin_unlock(&cq->cq_lock); return err; } @@ -364,7 +363,7 @@ int idpf_ctlq_clean_sq(struct idpf_ctlq_info *cq, u16 *clean_count, if (*clean_count > cq->ring_size) return -EBADR; - mutex_lock(&cq->cq_lock); + spin_lock(&cq->cq_lock); ntc = cq->next_to_clean; @@ -397,7 +396,7 @@ int idpf_ctlq_clean_sq(struct idpf_ctlq_info *cq, u16 *clean_count, cq->next_to_clean = ntc; - mutex_unlock(&cq->cq_lock); + spin_unlock(&cq->cq_lock); /* Return number of descriptors actually cleaned */ *clean_count = i; @@ -435,7 +434,7 @@ int idpf_ctlq_post_rx_buffs(struct idpf_hw *hw, struct idpf_ctlq_info *cq, if (*buff_count > 0) buffs_avail = true; - mutex_lock(&cq->cq_lock); + spin_lock(&cq->cq_lock); if (tbp >= cq->ring_size) tbp = 0; @@ -524,7 +523,7 @@ post_buffs_out: wr32(hw, cq->reg.tail, cq->next_to_post); } - mutex_unlock(&cq->cq_lock); + spin_unlock(&cq->cq_lock); /* return the number of buffers that were not posted */ *buff_count = *buff_count - i; @@ -552,7 +551,7 @@ int idpf_ctlq_recv(struct idpf_ctlq_info *cq, u16 *num_q_msg, u16 i; /* take the lock before we start messing with the ring */ - mutex_lock(&cq->cq_lock); + spin_lock(&cq->cq_lock); ntc = cq->next_to_clean; @@ -614,7 +613,7 @@ int idpf_ctlq_recv(struct idpf_ctlq_info *cq, u16 *num_q_msg, cq->next_to_clean = ntc; - mutex_unlock(&cq->cq_lock); + spin_unlock(&cq->cq_lock); *num_q_msg = i; if (*num_q_msg == 0) diff --git a/drivers/net/ethernet/intel/idpf/idpf_controlq_api.h b/drivers/net/ethernet/intel/idpf/idpf_controlq_api.h index e8e046ef2f0d7..5890d8adca4a8 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_controlq_api.h +++ b/drivers/net/ethernet/intel/idpf/idpf_controlq_api.h @@ -99,7 +99,7 @@ struct idpf_ctlq_info { enum idpf_ctlq_type cq_type; int q_id; - struct mutex cq_lock; /* control queue lock */ + spinlock_t cq_lock; /* control queue lock */ /* used for interrupt processing */ u16 next_to_use; u16 next_to_clean; diff --git a/drivers/net/ethernet/intel/idpf/idpf_lib.c b/drivers/net/ethernet/intel/idpf/idpf_lib.c index ba645ab22d394..746b655337275 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_lib.c +++ b/drivers/net/ethernet/intel/idpf/idpf_lib.c @@ -2315,8 +2315,12 @@ void *idpf_alloc_dma_mem(struct idpf_hw *hw, struct idpf_dma_mem *mem, u64 size) struct idpf_adapter *adapter = hw->back; size_t sz = ALIGN(size, 4096); - mem->va = dma_alloc_coherent(&adapter->pdev->dev, sz, - &mem->pa, GFP_KERNEL); + /* The control queue resources are freed under a spinlock, contiguous + * pages will avoid IOMMU remapping and the use vmap (and vunmap in + * dma_free_*() path. + */ + mem->va = dma_alloc_attrs(&adapter->pdev->dev, sz, &mem->pa, + GFP_KERNEL, DMA_ATTR_FORCE_CONTIGUOUS); mem->size = sz; return mem->va; @@ -2331,8 +2335,8 @@ void idpf_free_dma_mem(struct idpf_hw *hw, struct idpf_dma_mem *mem) { struct idpf_adapter *adapter = hw->back; - dma_free_coherent(&adapter->pdev->dev, mem->size, - mem->va, mem->pa); + dma_free_attrs(&adapter->pdev->dev, mem->size, + mem->va, mem->pa, DMA_ATTR_FORCE_CONTIGUOUS); mem->size = 0; mem->va = NULL; mem->pa = 0; -- GitLab From 3eb39038dca3f2a0cbd030a47cba20e249119ff0 Mon Sep 17 00:00:00 2001 From: Vitaly Lifshits Date: Wed, 11 Jun 2025 15:52:54 +0300 Subject: [PATCH 1934/2211] igc: disable L1.2 PCI-E link substate to avoid performance issue [ Upstream commit 0325143b59c6c6d79987afc57d2456e7a20d13b7 ] I226 devices advertise support for the PCI-E link L1.2 substate. However, due to a hardware limitation, the exit latency from this low-power state is longer than the packet buffer can tolerate under high traffic conditions. This can lead to packet loss and degraded performance. To mitigate this, disable the L1.2 substate. The increased power draw between L1.1 and L1.2 is insignificant. Fixes: 43546211738e ("igc: Add new device ID's") Link: https://lore.kernel.org/intel-wired-lan/15248b4f-3271-42dd-8e35-02bfc92b25e1@intel.com Signed-off-by: Vitaly Lifshits Reviewed-by: Aleksandr Loktionov Tested-by: Mor Bar-Gabay Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/igc/igc_main.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 082b0baf5d37c..2a0c5a343e472 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -6987,6 +6987,10 @@ static int igc_probe(struct pci_dev *pdev, adapter->port_num = hw->bus.func; adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE); + /* Disable ASPM L1.2 on I226 devices to avoid packet loss */ + if (igc_is_device_id_i226(hw)) + pci_disable_link_state(pdev, PCIE_LINK_STATE_L1_2); + err = pci_save_state(pdev); if (err) goto err_ioremap; @@ -7368,6 +7372,9 @@ static int igc_resume(struct device *dev) pci_enable_wake(pdev, PCI_D3hot, 0); pci_enable_wake(pdev, PCI_D3cold, 0); + if (igc_is_device_id_i226(hw)) + pci_disable_link_state(pdev, PCIE_LINK_STATE_L1_2); + if (igc_init_interrupt_scheme(adapter, true)) { netdev_err(netdev, "Unable to allocate memory for queues\n"); return -ENOMEM; @@ -7480,6 +7487,9 @@ static pci_ers_result_t igc_io_slot_reset(struct pci_dev *pdev) pci_enable_wake(pdev, PCI_D3hot, 0); pci_enable_wake(pdev, PCI_D3cold, 0); + if (igc_is_device_id_i226(hw)) + pci_disable_link_state_locked(pdev, PCIE_LINK_STATE_L1_2); + /* In case of PCI error, adapter loses its HW address * so we should re-assign it here. */ -- GitLab From cd8c8c20de3b4c18f10c4720de62a2e7bd54c10e Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Tue, 1 Jul 2025 17:38:41 +0100 Subject: [PATCH 1935/2211] smb: client: set missing retry flag in smb2_writev_callback() [ Upstream commit e67e75edeb88022c04f8e0a173e1ff6dc688f155 ] Set NETFS_SREQ_NEED_RETRY flag to tell netfslib that the subreq needs to be retried. Fixes: ee4cdf7ba857 ("netfs: Speed up buffered reading") Signed-off-by: Paulo Alcantara (Red Hat) Signed-off-by: David Howells Link: https://lore.kernel.org/20250701163852.2171681-7-dhowells@redhat.com Tested-by: Steve French Cc: linux-cifs@vger.kernel.org Cc: netfs@lists.linux.dev Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/smb/client/smb2pdu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index 3e501da62880c..d514f95deb7e7 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -4869,6 +4869,7 @@ smb2_writev_callback(struct mid_q_entry *mid) break; case MID_REQUEST_SUBMITTED: case MID_RETRY_NEEDED: + __set_bit(NETFS_SREQ_NEED_RETRY, &wdata->subreq.flags); result = -EAGAIN; break; case MID_RESPONSE_MALFORMED: -- GitLab From 590eb25749297f1414e81bccd049c5430795aeda Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Tue, 1 Jul 2025 17:38:42 +0100 Subject: [PATCH 1936/2211] smb: client: set missing retry flag in cifs_readv_callback() [ Upstream commit 0e60bae24ad28ab06a485698077d3c626f1e54ab ] Set NETFS_SREQ_NEED_RETRY flag to tell netfslib that the subreq needs to be retried. Fixes: ee4cdf7ba857 ("netfs: Speed up buffered reading") Signed-off-by: Paulo Alcantara (Red Hat) Signed-off-by: David Howells Link: https://lore.kernel.org/20250701163852.2171681-8-dhowells@redhat.com Tested-by: Steve French Cc: linux-cifs@vger.kernel.org Cc: netfs@lists.linux.dev Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/smb/client/cifssmb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index d6ba55d4720d2..449ac718a8beb 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -1310,6 +1310,7 @@ cifs_readv_callback(struct mid_q_entry *mid) break; case MID_REQUEST_SUBMITTED: case MID_RETRY_NEEDED: + __set_bit(NETFS_SREQ_NEED_RETRY, &rdata->subreq.flags); rdata->result = -EAGAIN; if (server->sign && rdata->got_bytes) /* reset bytes number since we can not check a sign */ -- GitLab From 9b55b7bdb0bbadee8fe0ca35ba80dd952919a117 Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Tue, 1 Jul 2025 17:38:43 +0100 Subject: [PATCH 1937/2211] smb: client: set missing retry flag in cifs_writev_callback() [ Upstream commit 74ee76bea4b445c023d04806e0bcd78a912fd30b ] Set NETFS_SREQ_NEED_RETRY flag to tell netfslib that the subreq needs to be retried. Fixes: ee4cdf7ba857 ("netfs: Speed up buffered reading") Signed-off-by: Paulo Alcantara (Red Hat) Signed-off-by: David Howells Link: https://lore.kernel.org/20250701163852.2171681-9-dhowells@redhat.com Tested-by: Steve French Cc: linux-cifs@vger.kernel.org Cc: netfs@lists.linux.dev Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/smb/client/cifssmb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index 449ac718a8beb..e3d9367eaec37 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -1682,6 +1682,7 @@ cifs_writev_callback(struct mid_q_entry *mid) break; case MID_REQUEST_SUBMITTED: case MID_RETRY_NEEDED: + __set_bit(NETFS_SREQ_NEED_RETRY, &wdata->subreq.flags); result = -EAGAIN; break; default: -- GitLab From 50c86c094533825edcebd925eb769b9578a615ed Mon Sep 17 00:00:00 2001 From: David Howells Date: Tue, 1 Jul 2025 17:38:45 +0100 Subject: [PATCH 1938/2211] netfs: Fix i_size updating [ Upstream commit 2e0658940d90a3dc130bb3b7f75bae9f4100e01f ] Fix the updating of i_size, particularly in regard to the completion of DIO writes and especially async DIO writes by using a lock. The bug is triggered occasionally by the generic/207 xfstest as it chucks a bunch of AIO DIO writes at the filesystem and then checks that fstat() returns a reasonable st_size as each completes. The problem is that netfs is trying to do "if new_size > inode->i_size, update inode->i_size" sort of thing but without a lock around it. This can be seen with cifs, but shouldn't be seen with kafs because kafs serialises modification ops on the client whereas cifs sends the requests to the server as they're generated and lets the server order them. Fixes: 153a9961b551 ("netfs: Implement unbuffered/DIO write support") Signed-off-by: David Howells Link: https://lore.kernel.org/20250701163852.2171681-11-dhowells@redhat.com Reviewed-by: Paulo Alcantara (Red Hat) cc: Steve French cc: Paulo Alcantara cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/netfs/buffered_write.c | 2 ++ fs/netfs/direct_write.c | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index b3910dfcb56d3..896d1d4219ed9 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -64,6 +64,7 @@ static void netfs_update_i_size(struct netfs_inode *ctx, struct inode *inode, return; } + spin_lock(&inode->i_lock); i_size_write(inode, pos); #if IS_ENABLED(CONFIG_FSCACHE) fscache_update_cookie(ctx->cache, NULL, &pos); @@ -77,6 +78,7 @@ static void netfs_update_i_size(struct netfs_inode *ctx, struct inode *inode, DIV_ROUND_UP(pos, SECTOR_SIZE), inode->i_blocks + add); } + spin_unlock(&inode->i_lock); } /** diff --git a/fs/netfs/direct_write.c b/fs/netfs/direct_write.c index 26cf9c94deebb..8fbfaf71c154c 100644 --- a/fs/netfs/direct_write.c +++ b/fs/netfs/direct_write.c @@ -14,13 +14,17 @@ static void netfs_cleanup_dio_write(struct netfs_io_request *wreq) struct inode *inode = wreq->inode; unsigned long long end = wreq->start + wreq->transferred; - if (!wreq->error && - i_size_read(inode) < end) { + if (wreq->error || end <= i_size_read(inode)) + return; + + spin_lock(&inode->i_lock); + if (end > i_size_read(inode)) { if (wreq->netfs_ops->update_i_size) wreq->netfs_ops->update_i_size(inode, end); else i_size_write(inode, end); } + spin_unlock(&inode->i_lock); } /* -- GitLab From f358d949cea22fc2deba770df4a8565cbcafa8bc Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Mon, 30 Jun 2025 14:36:40 -0500 Subject: [PATCH 1939/2211] lib: test_objagg: Set error message in check_expect_hints_stats() [ Upstream commit e6ed134a4ef592fe1fd0cafac9683813b3c8f3e8 ] Smatch complains that the error message isn't set in the caller: lib/test_objagg.c:923 test_hints_case2() error: uninitialized symbol 'errmsg'. This static checker warning only showed up after a recent refactoring but the bug dates back to when the code was originally added. This likely doesn't affect anything in real life. Reported-by: kernel test robot Closes: https://lore.kernel.org/r/202506281403.DsuyHFTZ-lkp@intel.com/ Fixes: 0a020d416d0a ("lib: introduce initial implementation of object aggregation manager") Signed-off-by: Dan Carpenter Reviewed-by: Ido Schimmel Reviewed-by: Simon Horman Link: https://patch.msgid.link/8548f423-2e3b-4bb7-b816-5041de2762aa@sabinyo.mountain Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- lib/test_objagg.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/test_objagg.c b/lib/test_objagg.c index d34df4306b874..222b39fc2629e 100644 --- a/lib/test_objagg.c +++ b/lib/test_objagg.c @@ -899,8 +899,10 @@ static int check_expect_hints_stats(struct objagg_hints *objagg_hints, int err; stats = objagg_hints_stats_get(objagg_hints); - if (IS_ERR(stats)) + if (IS_ERR(stats)) { + *errmsg = "objagg_hints_stats_get() failed."; return PTR_ERR(stats); + } err = __check_expect_stats(stats, expect_stats, errmsg); objagg_stats_put(stats); return err; -- GitLab From 6074bff08ac2243fc0f86bbbf888f2e21ccf03fc Mon Sep 17 00:00:00 2001 From: Raju Rangoju Date: Tue, 1 Jul 2025 00:56:36 +0530 Subject: [PATCH 1940/2211] amd-xgbe: align CL37 AN sequence as per databook [ Upstream commit 42fd432fe6d320323215ebdf4de4d0d7e56e6792 ] Update the Clause 37 Auto-Negotiation implementation to properly align with the PCS hardware specifications: - Fix incorrect bit settings in Link Status and Link Duplex fields - Implement missing sequence steps 2 and 7 These changes ensure CL37 auto-negotiation protocol follows the exact sequence patterns as specified in the hardware databook. Fixes: 1bf40ada6290 ("amd-xgbe: Add support for clause 37 auto-negotiation") Signed-off-by: Raju Rangoju Link: https://patch.msgid.link/20250630192636.3838291-1-Raju.Rangoju@amd.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/amd/xgbe/xgbe-common.h | 2 ++ drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 9 +++++++++ drivers/net/ethernet/amd/xgbe/xgbe.h | 4 ++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h index 3b70f67376331..aa25a8a0a106f 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h @@ -1373,6 +1373,8 @@ #define MDIO_VEND2_CTRL1_SS13 BIT(13) #endif +#define XGBE_VEND2_MAC_AUTO_SW BIT(9) + /* MDIO mask values */ #define XGBE_AN_CL73_INT_CMPLT BIT(0) #define XGBE_AN_CL73_INC_LINK BIT(1) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c index 07f4f3418d018..3316c719f9f8c 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c @@ -375,6 +375,10 @@ static void xgbe_an37_set(struct xgbe_prv_data *pdata, bool enable, reg |= MDIO_VEND2_CTRL1_AN_RESTART; XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_CTRL1, reg); + + reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_PCS_DIG_CTRL); + reg |= XGBE_VEND2_MAC_AUTO_SW; + XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_PCS_DIG_CTRL, reg); } static void xgbe_an37_restart(struct xgbe_prv_data *pdata) @@ -1003,6 +1007,11 @@ static void xgbe_an37_init(struct xgbe_prv_data *pdata) netif_dbg(pdata, link, pdata->netdev, "CL37 AN (%s) initialized\n", (pdata->an_mode == XGBE_AN_MODE_CL37) ? "BaseX" : "SGMII"); + + reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_CTRL1); + reg &= ~MDIO_AN_CTRL1_ENABLE; + XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_CTRL1, reg); + } static void xgbe_an73_init(struct xgbe_prv_data *pdata) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h index ed5d43c16d0e2..7526a0906b391 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h @@ -292,12 +292,12 @@ #define XGBE_LINK_TIMEOUT 5 #define XGBE_KR_TRAINING_WAIT_ITER 50 -#define XGBE_SGMII_AN_LINK_STATUS BIT(1) +#define XGBE_SGMII_AN_LINK_DUPLEX BIT(1) #define XGBE_SGMII_AN_LINK_SPEED (BIT(2) | BIT(3)) #define XGBE_SGMII_AN_LINK_SPEED_10 0x00 #define XGBE_SGMII_AN_LINK_SPEED_100 0x04 #define XGBE_SGMII_AN_LINK_SPEED_1000 0x08 -#define XGBE_SGMII_AN_LINK_DUPLEX BIT(4) +#define XGBE_SGMII_AN_LINK_STATUS BIT(4) /* ECC correctable error notification window (seconds) */ #define XGBE_ECC_LIMIT 60 -- GitLab From 16858ab7fd615a1448b8e18ea506a8f8c60c676e Mon Sep 17 00:00:00 2001 From: Alok Tiwari Date: Sat, 28 Jun 2025 07:56:05 -0700 Subject: [PATCH 1941/2211] enic: fix incorrect MTU comparison in enic_change_mtu() [ Upstream commit aaf2b2480375099c022a82023e1cd772bf1c6a5d ] The comparison in enic_change_mtu() incorrectly used the current netdev->mtu instead of the new new_mtu value when warning about an MTU exceeding the port MTU. This could suppress valid warnings or issue incorrect ones. Fix the condition and log to properly reflect the new_mtu. Fixes: ab123fe071c9 ("enic: handle mtu change for vf properly") Signed-off-by: Alok Tiwari Acked-by: John Daley Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250628145612.476096-1-alok.a.tiwari@oracle.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/cisco/enic/enic_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index ffed14b63d41d..a432783756d8c 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c @@ -2127,10 +2127,10 @@ static int enic_change_mtu(struct net_device *netdev, int new_mtu) if (enic_is_dynamic(enic) || enic_is_sriov_vf(enic)) return -EOPNOTSUPP; - if (netdev->mtu > enic->port_mtu) + if (new_mtu > enic->port_mtu) netdev_warn(netdev, "interface MTU (%d) set higher than port MTU (%d)\n", - netdev->mtu, enic->port_mtu); + new_mtu, enic->port_mtu); return _enic_change_mtu(netdev, new_mtu); } -- GitLab From 446ac00b86be1670838e513b643933d78837d8db Mon Sep 17 00:00:00 2001 From: Kohei Enju Date: Sun, 29 Jun 2025 12:06:31 +0900 Subject: [PATCH 1942/2211] rose: fix dangling neighbour pointers in rose_rt_device_down() [ Upstream commit 34a500caf48c47d5171f4aa1f237da39b07c6157 ] There are two bugs in rose_rt_device_down() that can cause use-after-free: 1. The loop bound `t->count` is modified within the loop, which can cause the loop to terminate early and miss some entries. 2. When removing an entry from the neighbour array, the subsequent entries are moved up to fill the gap, but the loop index `i` is still incremented, causing the next entry to be skipped. For example, if a node has three neighbours (A, A, B) with count=3 and A is being removed, the second A is not checked. i=0: (A, A, B) -> (A, B) with count=2 ^ checked i=1: (A, B) -> (A, B) with count=2 ^ checked (B, not A!) i=2: (doesn't occur because i < count is false) This leaves the second A in the array with count=2, but the rose_neigh structure has been freed. Code that accesses these entries assumes that the first `count` entries are valid pointers, causing a use-after-free when it accesses the dangling pointer. Fix both issues by iterating over the array in reverse order with a fixed loop bound. This ensures that all entries are examined and that the removal of an entry doesn't affect subsequent iterations. Reported-by: syzbot+e04e2c007ba2c80476cb@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=e04e2c007ba2c80476cb Tested-by: syzbot+e04e2c007ba2c80476cb@syzkaller.appspotmail.com Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Kohei Enju Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250629030833.6680-1-enjuk@amazon.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/rose/rose_route.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c index fee772b4637c8..a7054546f52df 100644 --- a/net/rose/rose_route.c +++ b/net/rose/rose_route.c @@ -497,22 +497,15 @@ void rose_rt_device_down(struct net_device *dev) t = rose_node; rose_node = rose_node->next; - for (i = 0; i < t->count; i++) { + for (i = t->count - 1; i >= 0; i--) { if (t->neighbour[i] != s) continue; t->count--; - switch (i) { - case 0: - t->neighbour[0] = t->neighbour[1]; - fallthrough; - case 1: - t->neighbour[1] = t->neighbour[2]; - break; - case 2: - break; - } + memmove(&t->neighbour[i], &t->neighbour[i + 1], + sizeof(t->neighbour[0]) * + (t->count - i)); } if (t->count <= 0) -- GitLab From 56aebaaa3adcc18e67ea9c2c8920c34efb6adf3c Mon Sep 17 00:00:00 2001 From: Thomas Fourier Date: Mon, 30 Jun 2025 10:36:43 +0200 Subject: [PATCH 1943/2211] nui: Fix dma_mapping_error() check [ Upstream commit 561aa0e22b70a5e7246b73d62a824b3aef3fc375 ] dma_map_XXX() functions return values DMA_MAPPING_ERROR as error values which is often ~0. The error value should be tested with dma_mapping_error(). This patch creates a new function in niu_ops to test if the mapping failed. The test is fixed in niu_rbr_add_page(), added in niu_start_xmit() and the successfully mapped pages are unmaped upon error. Fixes: ec2deec1f352 ("niu: Fix to check for dma mapping errors.") Signed-off-by: Thomas Fourier Reviewed-by: Simon Horman Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/sun/niu.c | 31 ++++++++++++++++++++++++++++++- drivers/net/ethernet/sun/niu.h | 4 ++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c index f5449b73b9a76..1e4cf89bd79ad 100644 --- a/drivers/net/ethernet/sun/niu.c +++ b/drivers/net/ethernet/sun/niu.c @@ -3336,7 +3336,7 @@ static int niu_rbr_add_page(struct niu *np, struct rx_ring_info *rp, addr = np->ops->map_page(np->device, page, 0, PAGE_SIZE, DMA_FROM_DEVICE); - if (!addr) { + if (np->ops->mapping_error(np->device, addr)) { __free_page(page); return -ENOMEM; } @@ -6672,6 +6672,8 @@ static netdev_tx_t niu_start_xmit(struct sk_buff *skb, len = skb_headlen(skb); mapping = np->ops->map_single(np->device, skb->data, len, DMA_TO_DEVICE); + if (np->ops->mapping_error(np->device, mapping)) + goto out_drop; prod = rp->prod; @@ -6713,6 +6715,8 @@ static netdev_tx_t niu_start_xmit(struct sk_buff *skb, mapping = np->ops->map_page(np->device, skb_frag_page(frag), skb_frag_off(frag), len, DMA_TO_DEVICE); + if (np->ops->mapping_error(np->device, mapping)) + goto out_unmap; rp->tx_buffs[prod].skb = NULL; rp->tx_buffs[prod].mapping = mapping; @@ -6737,6 +6741,19 @@ static netdev_tx_t niu_start_xmit(struct sk_buff *skb, out: return NETDEV_TX_OK; +out_unmap: + while (i--) { + const skb_frag_t *frag; + + prod = PREVIOUS_TX(rp, prod); + frag = &skb_shinfo(skb)->frags[i]; + np->ops->unmap_page(np->device, rp->tx_buffs[prod].mapping, + skb_frag_size(frag), DMA_TO_DEVICE); + } + + np->ops->unmap_single(np->device, rp->tx_buffs[rp->prod].mapping, + skb_headlen(skb), DMA_TO_DEVICE); + out_drop: rp->tx_errors++; kfree_skb(skb); @@ -9638,6 +9655,11 @@ static void niu_pci_unmap_single(struct device *dev, u64 dma_address, dma_unmap_single(dev, dma_address, size, direction); } +static int niu_pci_mapping_error(struct device *dev, u64 addr) +{ + return dma_mapping_error(dev, addr); +} + static const struct niu_ops niu_pci_ops = { .alloc_coherent = niu_pci_alloc_coherent, .free_coherent = niu_pci_free_coherent, @@ -9645,6 +9667,7 @@ static const struct niu_ops niu_pci_ops = { .unmap_page = niu_pci_unmap_page, .map_single = niu_pci_map_single, .unmap_single = niu_pci_unmap_single, + .mapping_error = niu_pci_mapping_error, }; static void niu_driver_version(void) @@ -10011,6 +10034,11 @@ static void niu_phys_unmap_single(struct device *dev, u64 dma_address, /* Nothing to do. */ } +static int niu_phys_mapping_error(struct device *dev, u64 dma_address) +{ + return false; +} + static const struct niu_ops niu_phys_ops = { .alloc_coherent = niu_phys_alloc_coherent, .free_coherent = niu_phys_free_coherent, @@ -10018,6 +10046,7 @@ static const struct niu_ops niu_phys_ops = { .unmap_page = niu_phys_unmap_page, .map_single = niu_phys_map_single, .unmap_single = niu_phys_unmap_single, + .mapping_error = niu_phys_mapping_error, }; static int niu_of_probe(struct platform_device *op) diff --git a/drivers/net/ethernet/sun/niu.h b/drivers/net/ethernet/sun/niu.h index 04c215f91fc08..0b169c08b0f2d 100644 --- a/drivers/net/ethernet/sun/niu.h +++ b/drivers/net/ethernet/sun/niu.h @@ -2879,6 +2879,9 @@ struct tx_ring_info { #define NEXT_TX(tp, index) \ (((index) + 1) < (tp)->pending ? ((index) + 1) : 0) +#define PREVIOUS_TX(tp, index) \ + (((index) - 1) >= 0 ? ((index) - 1) : (((tp)->pending) - 1)) + static inline u32 niu_tx_avail(struct tx_ring_info *tp) { return (tp->pending - @@ -3140,6 +3143,7 @@ struct niu_ops { enum dma_data_direction direction); void (*unmap_single)(struct device *dev, u64 dma_address, size_t size, enum dma_data_direction direction); + int (*mapping_error)(struct device *dev, u64 dma_address); }; struct niu_link_config { -- GitLab From a553afd91f55ff39b1e8a1c4989a29394c9e0472 Mon Sep 17 00:00:00 2001 From: Lion Ackermann Date: Mon, 30 Jun 2025 15:27:30 +0200 Subject: [PATCH 1944/2211] net/sched: Always pass notifications when child class becomes empty [ Upstream commit 103406b38c600fec1fe375a77b27d87e314aea09 ] Certain classful qdiscs may invoke their classes' dequeue handler on an enqueue operation. This may unexpectedly empty the child qdisc and thus make an in-flight class passive via qlen_notify(). Most qdiscs do not expect such behaviour at this point in time and may re-activate the class eventually anyways which will lead to a use-after-free. The referenced fix commit attempted to fix this behavior for the HFSC case by moving the backlog accounting around, though this turned out to be incomplete since the parent's parent may run into the issue too. The following reproducer demonstrates this use-after-free: tc qdisc add dev lo root handle 1: drr tc filter add dev lo parent 1: basic classid 1:1 tc class add dev lo parent 1: classid 1:1 drr tc qdisc add dev lo parent 1:1 handle 2: hfsc def 1 tc class add dev lo parent 2: classid 2:1 hfsc rt m1 8 d 1 m2 0 tc qdisc add dev lo parent 2:1 handle 3: netem tc qdisc add dev lo parent 3:1 handle 4: blackhole echo 1 | socat -u STDIN UDP4-DATAGRAM:127.0.0.1:8888 tc class delete dev lo classid 1:1 echo 1 | socat -u STDIN UDP4-DATAGRAM:127.0.0.1:8888 Since backlog accounting issues leading to a use-after-frees on stale class pointers is a recurring pattern at this point, this patch takes a different approach. Instead of trying to fix the accounting, the patch ensures that qdisc_tree_reduce_backlog always calls qlen_notify when the child qdisc is empty. This solves the problem because deletion of qdiscs always involves a call to qdisc_reset() and / or qdisc_purge_queue() which ultimately resets its qlen to 0 thus causing the following qdisc_tree_reduce_backlog() to report to the parent. Note that this may call qlen_notify on passive classes multiple times. This is not a problem after the recent patch series that made all the classful qdiscs qlen_notify() handlers idempotent. Fixes: 3f981138109f ("sch_hfsc: Fix qlen accounting bug when using peek in hfsc_enqueue()") Signed-off-by: Lion Ackermann Reviewed-by: Jamal Hadi Salim Acked-by: Cong Wang Acked-by: Jamal Hadi Salim Link: https://patch.msgid.link/d912cbd7-193b-4269-9857-525bee8bbb6a@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/sched/sch_api.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 518f52f65a49d..26378eac1bd08 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -779,15 +779,12 @@ static u32 qdisc_alloc_handle(struct net_device *dev) void qdisc_tree_reduce_backlog(struct Qdisc *sch, int n, int len) { - bool qdisc_is_offloaded = sch->flags & TCQ_F_OFFLOADED; const struct Qdisc_class_ops *cops; unsigned long cl; u32 parentid; bool notify; int drops; - if (n == 0 && len == 0) - return; drops = max_t(int, n, 0); rcu_read_lock(); while ((parentid = sch->parent)) { @@ -796,17 +793,8 @@ void qdisc_tree_reduce_backlog(struct Qdisc *sch, int n, int len) if (sch->flags & TCQ_F_NOPARENT) break; - /* Notify parent qdisc only if child qdisc becomes empty. - * - * If child was empty even before update then backlog - * counter is screwed and we skip notification because - * parent class is already passive. - * - * If the original child was offloaded then it is allowed - * to be seem as empty, so the parent is notified anyway. - */ - notify = !sch->q.qlen && !WARN_ON_ONCE(!n && - !qdisc_is_offloaded); + /* Notify parent qdisc only if child qdisc becomes empty. */ + notify = !sch->q.qlen; /* TODO: perform the search on a per txq basis */ sch = qdisc_lookup_rcu(qdisc_dev(sch), TC_H_MAJ(parentid)); if (sch == NULL) { @@ -815,6 +803,9 @@ void qdisc_tree_reduce_backlog(struct Qdisc *sch, int n, int len) } cops = sch->ops->cl_ops; if (notify && cops->qlen_notify) { + /* Note that qlen_notify must be idempotent as it may get called + * multiple times. + */ cl = cops->find(sch, parentid); cops->qlen_notify(sch, cl); } -- GitLab From 4db893a9bf9e620bf052709951f7fd2d463cbcc2 Mon Sep 17 00:00:00 2001 From: Raju Rangoju Date: Tue, 1 Jul 2025 12:20:16 +0530 Subject: [PATCH 1945/2211] amd-xgbe: do not double read link status [ Upstream commit 16ceda2ef683a50cd0783006c0504e1931cd8879 ] The link status is latched low so that momentary link drops can be detected. Always double-reading the status defeats this design feature. Only double read if link was already down This prevents unnecessary duplicate readings of the link status. Fixes: 4f3b20bfbb75 ("amd-xgbe: add support for rx-adaptation") Signed-off-by: Raju Rangoju Reviewed-by: Simon Horman Link: https://patch.msgid.link/20250701065016.4140707-1-Raju.Rangoju@amd.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 4 ++++ drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 24 +++++++++++++-------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c index 3316c719f9f8c..ed76a8df6ec6e 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c @@ -1413,6 +1413,10 @@ static void xgbe_phy_status(struct xgbe_prv_data *pdata) pdata->phy.link = pdata->phy_if.phy_impl.link_status(pdata, &an_restart); + /* bail out if the link status register read fails */ + if (pdata->phy.link < 0) + return; + if (an_restart) { xgbe_phy_config_aneg(pdata); goto adjust_link; diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c index 268399dfcf22f..32e633d113484 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c @@ -2855,8 +2855,7 @@ static bool xgbe_phy_valid_speed(struct xgbe_prv_data *pdata, int speed) static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart) { struct xgbe_phy_data *phy_data = pdata->phy_data; - unsigned int reg; - int ret; + int reg, ret; *an_restart = 0; @@ -2890,11 +2889,20 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart) return 0; } - /* Link status is latched low, so read once to clear - * and then read again to get current state - */ - reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1); reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1); + if (reg < 0) + return reg; + + /* Link status is latched low so that momentary link drops + * can be detected. If link was already down read again + * to get the latest state. + */ + + if (!pdata->phy.link && !(reg & MDIO_STAT1_LSTATUS)) { + reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1); + if (reg < 0) + return reg; + } if (pdata->en_rx_adap) { /* if the link is available and adaptation is done, @@ -2913,9 +2921,7 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart) xgbe_phy_set_mode(pdata, phy_data->cur_mode); } - /* check again for the link and adaptation status */ - reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1); - if ((reg & MDIO_STAT1_LSTATUS) && pdata->rx_adapt_done) + if (pdata->rx_adapt_done) return 1; } else if (reg & MDIO_STAT1_LSTATUS) return 1; -- GitLab From 2ba9db22d72a5c00052338dc7aadaaf528dd36fc Mon Sep 17 00:00:00 2001 From: Wang Zhaolong Date: Thu, 3 Jul 2025 21:29:52 +0800 Subject: [PATCH 1946/2211] smb: client: fix race condition in negotiate timeout by using more precise timing [ Upstream commit 266b5d02e14f3a0e07414e11f239397de0577a1d ] When the SMB server reboots and the client immediately accesses the mount point, a race condition can occur that causes operations to fail with "Host is down" error. Reproduction steps: # Mount SMB share mount -t cifs //192.168.245.109/TEST /mnt/ -o xxxx ls /mnt # Reboot server ssh root@192.168.245.109 reboot ssh root@192.168.245.109 /path/to/cifs_server_setup.sh ssh root@192.168.245.109 systemctl stop firewalld # Immediate access fails ls /mnt ls: cannot access '/mnt': Host is down # But works if there is a delay The issue is caused by a race condition between negotiate and reconnect. The 20-second negotiate timeout mechanism can interfere with the normal recovery process when both are triggered simultaneously. ls cifsd --------------------------------------------------- cifs_getattr cifs_revalidate_dentry cifs_get_inode_info cifs_get_fattr smb2_query_path_info smb2_compound_op SMB2_open_init smb2_reconnect cifs_negotiate_protocol smb2_negotiate cifs_send_recv smb_send_rqst wait_for_response cifs_demultiplex_thread cifs_read_from_socket cifs_readv_from_socket server_unresponsive cifs_reconnect __cifs_reconnect cifs_abort_connection mid->mid_state = MID_RETRY_NEEDED cifs_wake_up_task cifs_sync_mid_result // case MID_RETRY_NEEDED rc = -EAGAIN; // In smb2_negotiate() rc = -EHOSTDOWN; The server_unresponsive() timeout triggers cifs_reconnect(), which aborts ongoing mid requests and causes the ls command to receive -EAGAIN, leading to -EHOSTDOWN. Fix this by introducing a dedicated `neg_start` field to precisely tracks when the negotiate process begins. The timeout check now uses this accurate timestamp instead of `lstrp`, ensuring that: 1. Timeout is only triggered after negotiate has actually run for 20s 2. The mechanism doesn't interfere with concurrent recovery processes 3. Uninitialized timestamps (value 0) don't trigger false timeouts Fixes: 7ccc1465465d ("smb: client: fix hang in wait_for_response() for negproto") Signed-off-by: Wang Zhaolong Signed-off-by: Steve French Signed-off-by: Sasha Levin --- fs/smb/client/cifsglob.h | 1 + fs/smb/client/connect.c | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index e77c0b3e49624..b74637ae9085a 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -743,6 +743,7 @@ struct TCP_Server_Info { __le32 session_key_id; /* retrieved from negotiate response and send in session setup request */ struct session_key session_key; unsigned long lstrp; /* when we got last response from this server */ + unsigned long neg_start; /* when negotiate started (jiffies) */ struct cifs_secmech secmech; /* crypto sec mech functs, descriptors */ #define CIFS_NEGFLAVOR_UNENCAP 1 /* wct == 17, but no ext_sec */ #define CIFS_NEGFLAVOR_EXTENDED 2 /* wct == 17, ext_sec bit set */ diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index 9275e0d1e2f64..fc3f0b956f323 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -677,12 +677,12 @@ server_unresponsive(struct TCP_Server_Info *server) /* * If we're in the process of mounting a share or reconnecting a session * and the server abruptly shut down (e.g. socket wasn't closed, packet - * had been ACK'ed but no SMB response), don't wait longer than 20s to - * negotiate protocol. + * had been ACK'ed but no SMB response), don't wait longer than 20s from + * when negotiate actually started. */ spin_lock(&server->srv_lock); if (server->tcpStatus == CifsInNegotiate && - time_after(jiffies, server->lstrp + 20 * HZ)) { + time_after(jiffies, server->neg_start + 20 * HZ)) { spin_unlock(&server->srv_lock); cifs_reconnect(server, false); return true; @@ -4009,6 +4009,7 @@ retry: server->lstrp = jiffies; server->tcpStatus = CifsInNegotiate; + server->neg_start = jiffies; spin_unlock(&server->srv_lock); rc = server->ops->negotiate(xid, ses, server); -- GitLab From 3f4adfc5870059a5912fa9a87d83064895f05037 Mon Sep 17 00:00:00 2001 From: Lukasz Czechowski Date: Fri, 25 Apr 2025 17:18:08 +0200 Subject: [PATCH 1947/2211] arm64: dts: rockchip: fix internal USB hub instability on RK3399 Puma MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit d7cc532df95f7f159e40595440e4e4b99481457b ] Currently, the onboard Cypress CYUSB3304 USB hub is not defined in the device tree, and hub reset pin is provided as vcc5v0_host regulator to usb phy. This causes instability issues, as a result of improper reset duration. The fixed regulator device requests the GPIO during probe in its inactive state (except if regulator-boot-on property is set, in which case it is requested in the active state). Considering gpio is GPIO_ACTIVE_LOW for Puma, it means it’s driving it high. Then the regulator gets enabled (because regulator-always-on property), which drives it to its active state, meaning driving it low. The Cypress CYUSB3304 USB hub actually requires the reset to be asserted for at least 5 ms, which we cannot guarantee right now since there's no delay in the current config, meaning the hub may sometimes work or not. We could add delay as offered by fixed-regulator but let's rather fix this by using the proper way to model onboard USB hubs. Define hub_2_0 and hub_3_0 nodes, as the onboard Cypress hub consist of two 'logical' hubs, for USB2.0 and USB3.0. Use the 'reset-gpios' property of hub to assign reset pin instead of using regulator. Rename the vcc5v0_host regulator to cy3304_reset to be more meaningful. Pin is configured to output-high by default, which sets the hub in reset state during pin controller initialization. This allows to avoid double enumeration of devices in case the bootloader has setup the USB hub before the kernel. The vdd-supply and vdd2-supply properties in hub nodes are added to provide correct dt-bindings, although power supplies are always enabled based on HW design. Fixes: 2c66fc34e945 ("arm64: dts: rockchip: add RK3399-Q7 (Puma) SoM") Cc: stable@vger.kernel.org # 6.6 Cc: stable@vger.kernel.org # Backport of the patch in this series fixing product ID in onboard_dev_id_table in drivers/usb/misc/onboard_usb_dev.c driver Signed-off-by: Lukasz Czechowski Link: https://lore.kernel.org/r/20250425-onboard_usb_dev-v2-3-4a76a474a010@thaumatec.com Signed-off-by: Heiko Stuebner Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi | 42 ++++++++++++------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi index 257636d0d2cbb..0a73218ea37b3 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi @@ -59,17 +59,7 @@ vin-supply = <&vcc5v0_sys>; }; - vcc5v0_host: vcc5v0-host-regulator { - compatible = "regulator-fixed"; - gpio = <&gpio4 RK_PA3 GPIO_ACTIVE_LOW>; - pinctrl-names = "default"; - pinctrl-0 = <&vcc5v0_host_en>; - regulator-name = "vcc5v0_host"; - regulator-always-on; - vin-supply = <&vcc5v0_sys>; - }; - - vcc5v0_sys: vcc5v0-sys { + vcc5v0_sys: regulator-vcc5v0-sys { compatible = "regulator-fixed"; regulator-name = "vcc5v0_sys"; regulator-always-on; @@ -509,10 +499,10 @@ }; }; - usb2 { - vcc5v0_host_en: vcc5v0-host-en { + usb { + cy3304_reset: cy3304-reset { rockchip,pins = - <4 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>; + <4 RK_PA3 RK_FUNC_GPIO &pcfg_output_high>; }; }; @@ -579,7 +569,6 @@ }; u2phy1_host: host-port { - phy-supply = <&vcc5v0_host>; status = "okay"; }; }; @@ -591,6 +580,29 @@ &usbdrd_dwc3_1 { status = "okay"; dr_mode = "host"; + pinctrl-names = "default"; + pinctrl-0 = <&cy3304_reset>; + #address-cells = <1>; + #size-cells = <0>; + + hub_2_0: hub@1 { + compatible = "usb4b4,6502", "usb4b4,6506"; + reg = <1>; + peer-hub = <&hub_3_0>; + reset-gpios = <&gpio4 RK_PA3 GPIO_ACTIVE_HIGH>; + vdd-supply = <&vcc1v2_phy>; + vdd2-supply = <&vcc3v3_sys>; + + }; + + hub_3_0: hub@2 { + compatible = "usb4b4,6500", "usb4b4,6504"; + reg = <2>; + peer-hub = <&hub_2_0>; + reset-gpios = <&gpio4 RK_PA3 GPIO_ACTIVE_HIGH>; + vdd-supply = <&vcc1v2_phy>; + vdd2-supply = <&vcc3v3_sys>; + }; }; &usb_host1_ehci { -- GitLab From e23ac00266247ebe71cf14ea1e56e6400bdd3728 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Sat, 15 Mar 2025 18:30:24 +0800 Subject: [PATCH 1948/2211] crypto: iaa - Remove dst_null support [ Upstream commit 02c974294c740bfb747ec64933e12148eb3d99e1 ] Remove the unused dst_null support. Signed-off-by: Herbert Xu Stable-dep-of: cc98d8ce934b ("crypto: iaa - Do not clobber req->base.data") Signed-off-by: Sasha Levin --- drivers/crypto/intel/iaa/iaa_crypto_main.c | 136 +-------------------- 1 file changed, 6 insertions(+), 130 deletions(-) diff --git a/drivers/crypto/intel/iaa/iaa_crypto_main.c b/drivers/crypto/intel/iaa/iaa_crypto_main.c index e1f60f0f507c9..711c6e8914978 100644 --- a/drivers/crypto/intel/iaa/iaa_crypto_main.c +++ b/drivers/crypto/intel/iaa/iaa_crypto_main.c @@ -1126,8 +1126,7 @@ static int iaa_compress(struct crypto_tfm *tfm, struct acomp_req *req, struct idxd_wq *wq, dma_addr_t src_addr, unsigned int slen, dma_addr_t dst_addr, unsigned int *dlen, - u32 *compression_crc, - bool disable_async) + u32 *compression_crc) { struct iaa_device_compression_mode *active_compression_mode; struct iaa_compression_ctx *ctx = crypto_tfm_ctx(tfm); @@ -1170,7 +1169,7 @@ static int iaa_compress(struct crypto_tfm *tfm, struct acomp_req *req, desc->src2_size = sizeof(struct aecs_comp_table_record); desc->completion_addr = idxd_desc->compl_dma; - if (ctx->use_irq && !disable_async) { + if (ctx->use_irq) { desc->flags |= IDXD_OP_FLAG_RCI; idxd_desc->crypto.req = req; @@ -1183,7 +1182,7 @@ static int iaa_compress(struct crypto_tfm *tfm, struct acomp_req *req, " src_addr %llx, dst_addr %llx\n", __func__, active_compression_mode->name, src_addr, dst_addr); - } else if (ctx->async_mode && !disable_async) + } else if (ctx->async_mode) req->base.data = idxd_desc; dev_dbg(dev, "%s: compression mode %s," @@ -1204,7 +1203,7 @@ static int iaa_compress(struct crypto_tfm *tfm, struct acomp_req *req, update_total_comp_calls(); update_wq_comp_calls(wq); - if (ctx->async_mode && !disable_async) { + if (ctx->async_mode) { ret = -EINPROGRESS; dev_dbg(dev, "%s: returning -EINPROGRESS\n", __func__); goto out; @@ -1224,7 +1223,7 @@ static int iaa_compress(struct crypto_tfm *tfm, struct acomp_req *req, *compression_crc = idxd_desc->iax_completion->crc; - if (!ctx->async_mode || disable_async) + if (!ctx->async_mode) idxd_free_desc(wq, idxd_desc); out: return ret; @@ -1490,13 +1489,11 @@ static int iaa_comp_acompress(struct acomp_req *req) struct iaa_compression_ctx *compression_ctx; struct crypto_tfm *tfm = req->base.tfm; dma_addr_t src_addr, dst_addr; - bool disable_async = false; int nr_sgs, cpu, ret = 0; struct iaa_wq *iaa_wq; u32 compression_crc; struct idxd_wq *wq; struct device *dev; - int order = -1; compression_ctx = crypto_tfm_ctx(tfm); @@ -1526,21 +1523,6 @@ static int iaa_comp_acompress(struct acomp_req *req) iaa_wq = idxd_wq_get_private(wq); - if (!req->dst) { - gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL : GFP_ATOMIC; - - /* incompressible data will always be < 2 * slen */ - req->dlen = 2 * req->slen; - order = order_base_2(round_up(req->dlen, PAGE_SIZE) / PAGE_SIZE); - req->dst = sgl_alloc_order(req->dlen, order, false, flags, NULL); - if (!req->dst) { - ret = -ENOMEM; - order = -1; - goto out; - } - disable_async = true; - } - dev = &wq->idxd->pdev->dev; nr_sgs = dma_map_sg(dev, req->src, sg_nents(req->src), DMA_TO_DEVICE); @@ -1570,7 +1552,7 @@ static int iaa_comp_acompress(struct acomp_req *req) req->dst, req->dlen, sg_dma_len(req->dst)); ret = iaa_compress(tfm, req, wq, src_addr, req->slen, dst_addr, - &req->dlen, &compression_crc, disable_async); + &req->dlen, &compression_crc); if (ret == -EINPROGRESS) return ret; @@ -1601,100 +1583,6 @@ err_map_dst: out: iaa_wq_put(wq); - if (order >= 0) - sgl_free_order(req->dst, order); - - return ret; -} - -static int iaa_comp_adecompress_alloc_dest(struct acomp_req *req) -{ - gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ? - GFP_KERNEL : GFP_ATOMIC; - struct crypto_tfm *tfm = req->base.tfm; - dma_addr_t src_addr, dst_addr; - int nr_sgs, cpu, ret = 0; - struct iaa_wq *iaa_wq; - struct device *dev; - struct idxd_wq *wq; - int order = -1; - - cpu = get_cpu(); - wq = wq_table_next_wq(cpu); - put_cpu(); - if (!wq) { - pr_debug("no wq configured for cpu=%d\n", cpu); - return -ENODEV; - } - - ret = iaa_wq_get(wq); - if (ret) { - pr_debug("no wq available for cpu=%d\n", cpu); - return -ENODEV; - } - - iaa_wq = idxd_wq_get_private(wq); - - dev = &wq->idxd->pdev->dev; - - nr_sgs = dma_map_sg(dev, req->src, sg_nents(req->src), DMA_TO_DEVICE); - if (nr_sgs <= 0 || nr_sgs > 1) { - dev_dbg(dev, "couldn't map src sg for iaa device %d," - " wq %d: ret=%d\n", iaa_wq->iaa_device->idxd->id, - iaa_wq->wq->id, ret); - ret = -EIO; - goto out; - } - src_addr = sg_dma_address(req->src); - dev_dbg(dev, "dma_map_sg, src_addr %llx, nr_sgs %d, req->src %p," - " req->slen %d, sg_dma_len(sg) %d\n", src_addr, nr_sgs, - req->src, req->slen, sg_dma_len(req->src)); - - req->dlen = 4 * req->slen; /* start with ~avg comp rato */ -alloc_dest: - order = order_base_2(round_up(req->dlen, PAGE_SIZE) / PAGE_SIZE); - req->dst = sgl_alloc_order(req->dlen, order, false, flags, NULL); - if (!req->dst) { - ret = -ENOMEM; - order = -1; - goto out; - } - - nr_sgs = dma_map_sg(dev, req->dst, sg_nents(req->dst), DMA_FROM_DEVICE); - if (nr_sgs <= 0 || nr_sgs > 1) { - dev_dbg(dev, "couldn't map dst sg for iaa device %d," - " wq %d: ret=%d\n", iaa_wq->iaa_device->idxd->id, - iaa_wq->wq->id, ret); - ret = -EIO; - goto err_map_dst; - } - - dst_addr = sg_dma_address(req->dst); - dev_dbg(dev, "dma_map_sg, dst_addr %llx, nr_sgs %d, req->dst %p," - " req->dlen %d, sg_dma_len(sg) %d\n", dst_addr, nr_sgs, - req->dst, req->dlen, sg_dma_len(req->dst)); - ret = iaa_decompress(tfm, req, wq, src_addr, req->slen, - dst_addr, &req->dlen, true); - if (ret == -EOVERFLOW) { - dma_unmap_sg(dev, req->dst, sg_nents(req->dst), DMA_FROM_DEVICE); - req->dlen *= 2; - if (req->dlen > CRYPTO_ACOMP_DST_MAX) - goto err_map_dst; - goto alloc_dest; - } - - if (ret != 0) - dev_dbg(dev, "asynchronous decompress failed ret=%d\n", ret); - - dma_unmap_sg(dev, req->dst, sg_nents(req->dst), DMA_FROM_DEVICE); -err_map_dst: - dma_unmap_sg(dev, req->src, sg_nents(req->src), DMA_TO_DEVICE); -out: - iaa_wq_put(wq); - - if (order >= 0) - sgl_free_order(req->dst, order); - return ret; } @@ -1717,9 +1605,6 @@ static int iaa_comp_adecompress(struct acomp_req *req) return -EINVAL; } - if (!req->dst) - return iaa_comp_adecompress_alloc_dest(req); - cpu = get_cpu(); wq = wq_table_next_wq(cpu); put_cpu(); @@ -1800,19 +1685,10 @@ static int iaa_comp_init_fixed(struct crypto_acomp *acomp_tfm) return 0; } -static void dst_free(struct scatterlist *sgl) -{ - /* - * Called for req->dst = NULL cases but we free elsewhere - * using sgl_free_order(). - */ -} - static struct acomp_alg iaa_acomp_fixed_deflate = { .init = iaa_comp_init_fixed, .compress = iaa_comp_acompress, .decompress = iaa_comp_adecompress, - .dst_free = dst_free, .base = { .cra_name = "deflate", .cra_driver_name = "deflate-iaa", -- GitLab From 9a0b8ef2a91b46ae799fa80f18296b1bb05686da Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Mon, 24 Mar 2025 12:04:18 +0800 Subject: [PATCH 1949/2211] crypto: iaa - Do not clobber req->base.data [ Upstream commit cc98d8ce934b99789d30421957fd6a20fffb1c22 ] The req->base.data field is for the user and must not be touched by the driver, unless you save it first. The iaa driver doesn't seem to be using the req->base.data value so just remove the assignment. Fixes: 09646c98d0bf ("crypto: iaa - Add irq support for the crypto async interface") Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- drivers/crypto/intel/iaa/iaa_crypto_main.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/crypto/intel/iaa/iaa_crypto_main.c b/drivers/crypto/intel/iaa/iaa_crypto_main.c index 711c6e8914978..df2728cccf8b3 100644 --- a/drivers/crypto/intel/iaa/iaa_crypto_main.c +++ b/drivers/crypto/intel/iaa/iaa_crypto_main.c @@ -1182,8 +1182,7 @@ static int iaa_compress(struct crypto_tfm *tfm, struct acomp_req *req, " src_addr %llx, dst_addr %llx\n", __func__, active_compression_mode->name, src_addr, dst_addr); - } else if (ctx->async_mode) - req->base.data = idxd_desc; + } dev_dbg(dev, "%s: compression mode %s," " desc->src1_addr %llx, desc->src1_size %d," @@ -1420,8 +1419,7 @@ static int iaa_decompress(struct crypto_tfm *tfm, struct acomp_req *req, " src_addr %llx, dst_addr %llx\n", __func__, active_compression_mode->name, src_addr, dst_addr); - } else if (ctx->async_mode && !disable_async) - req->base.data = idxd_desc; + } dev_dbg(dev, "%s: decompression mode %s," " desc->src1_addr %llx, desc->src1_size %d," -- GitLab From d78f79a2c1ffc967a219bc0f84908bb7167dad69 Mon Sep 17 00:00:00 2001 From: Christian Marangi Date: Tue, 14 Jan 2025 13:36:34 +0100 Subject: [PATCH 1950/2211] spinlock: extend guard with spinlock_bh variants [ Upstream commit d6104733178293b40044525b06d6a26356934da3 ] Extend guard APIs with missing raw/spinlock_bh variants. Signed-off-by: Christian Marangi Acked-by: Peter Zijlstra (Intel) Signed-off-by: Herbert Xu Stable-dep-of: c7e68043620e ("crypto: zynqmp-sha - Add locking") Signed-off-by: Sasha Levin --- include/linux/spinlock.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h index 63dd8cf3c3c2b..d3561c4a080e2 100644 --- a/include/linux/spinlock.h +++ b/include/linux/spinlock.h @@ -548,6 +548,12 @@ DEFINE_LOCK_GUARD_1(raw_spinlock_irq, raw_spinlock_t, DEFINE_LOCK_GUARD_1_COND(raw_spinlock_irq, _try, raw_spin_trylock_irq(_T->lock)) +DEFINE_LOCK_GUARD_1(raw_spinlock_bh, raw_spinlock_t, + raw_spin_lock_bh(_T->lock), + raw_spin_unlock_bh(_T->lock)) + +DEFINE_LOCK_GUARD_1_COND(raw_spinlock_bh, _try, raw_spin_trylock_bh(_T->lock)) + DEFINE_LOCK_GUARD_1(raw_spinlock_irqsave, raw_spinlock_t, raw_spin_lock_irqsave(_T->lock, _T->flags), raw_spin_unlock_irqrestore(_T->lock, _T->flags), @@ -569,6 +575,13 @@ DEFINE_LOCK_GUARD_1(spinlock_irq, spinlock_t, DEFINE_LOCK_GUARD_1_COND(spinlock_irq, _try, spin_trylock_irq(_T->lock)) +DEFINE_LOCK_GUARD_1(spinlock_bh, spinlock_t, + spin_lock_bh(_T->lock), + spin_unlock_bh(_T->lock)) + +DEFINE_LOCK_GUARD_1_COND(spinlock_bh, _try, + spin_trylock_bh(_T->lock)) + DEFINE_LOCK_GUARD_1(spinlock_irqsave, spinlock_t, spin_lock_irqsave(_T->lock, _T->flags), spin_unlock_irqrestore(_T->lock, _T->flags), -- GitLab From 8a039506c0323175eb7e6fd554d59c4b3e03b355 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Sat, 12 Apr 2025 18:57:22 +0800 Subject: [PATCH 1951/2211] crypto: zynqmp-sha - Add locking [ Upstream commit c7e68043620e0d5f89a37e573c667beab72d2937 ] The hardwrae is only capable of one hash at a time, so add a lock to make sure that it isn't used concurrently. Fixes: 7ecc3e34474b ("crypto: xilinx - Add Xilinx SHA3 driver") Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- drivers/crypto/xilinx/zynqmp-sha.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/crypto/xilinx/zynqmp-sha.c b/drivers/crypto/xilinx/zynqmp-sha.c index 1bcec6f46c9c7..9b5345068604f 100644 --- a/drivers/crypto/xilinx/zynqmp-sha.c +++ b/drivers/crypto/xilinx/zynqmp-sha.c @@ -3,18 +3,19 @@ * Xilinx ZynqMP SHA Driver. * Copyright (c) 2022 Xilinx Inc. */ -#include #include #include #include -#include +#include +#include #include #include +#include #include -#include #include #include #include +#include #include #define ZYNQMP_DMA_BIT_MASK 32U @@ -43,6 +44,8 @@ struct zynqmp_sha_desc_ctx { static dma_addr_t update_dma_addr, final_dma_addr; static char *ubuf, *fbuf; +static DEFINE_SPINLOCK(zynqmp_sha_lock); + static int zynqmp_sha_init_tfm(struct crypto_shash *hash) { const char *fallback_driver_name = crypto_shash_alg_name(hash); @@ -124,7 +127,8 @@ static int zynqmp_sha_export(struct shash_desc *desc, void *out) return crypto_shash_export(&dctx->fbk_req, out); } -static int zynqmp_sha_digest(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) +static int __zynqmp_sha_digest(struct shash_desc *desc, const u8 *data, + unsigned int len, u8 *out) { unsigned int remaining_len = len; int update_size; @@ -159,6 +163,12 @@ static int zynqmp_sha_digest(struct shash_desc *desc, const u8 *data, unsigned i return ret; } +static int zynqmp_sha_digest(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) +{ + scoped_guard(spinlock_bh, &zynqmp_sha_lock) + return __zynqmp_sha_digest(desc, data, len, out); +} + static struct zynqmp_sha_drv_ctx sha3_drv_ctx = { .sha3_384 = { .init = zynqmp_sha_init, -- GitLab From a55f301e607c01d7f1f597b1b31b4683df27b899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Fri, 14 Feb 2025 14:27:05 +0100 Subject: [PATCH 1952/2211] kunit: qemu_configs: sparc: use Zilog console MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit e275f44e0a187b9d76830847976072f1c17b4b7b ] The driver for the 8250 console is not used, as no port is found. Instead the prom0 bootconsole is used the whole time. The prom driver translates '\n' to '\r\n' before handing of the message off to the firmware. The firmware performs the same translation again. In the final output produced by QEMU each line ends with '\r\r\n'. This breaks the kunit parser, which can only handle '\r\n' and '\n'. Use the Zilog console instead. It works correctly, is the one documented by the QEMU manual and also saves a bit of codesize: Before=4051011, After=4023326, chg -0.68% Observed on QEMU 9.2.0. Link: https://lore.kernel.org/r/20250214-kunit-qemu-sparc-console-v1-1-ba1dfdf8f0b1@linutronix.de Fixes: 87c9c1631788 ("kunit: tool: add support for QEMU") Signed-off-by: Thomas Weißschuh Reviewed-by: David Gow Signed-off-by: Shuah Khan Stable-dep-of: 1d31d536871f ("kunit: qemu_configs: Disable faulting tests on 32-bit SPARC") Signed-off-by: Sasha Levin --- tools/testing/kunit/qemu_configs/sparc.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/testing/kunit/qemu_configs/sparc.py b/tools/testing/kunit/qemu_configs/sparc.py index e975c4331a7c2..256d9573b4464 100644 --- a/tools/testing/kunit/qemu_configs/sparc.py +++ b/tools/testing/kunit/qemu_configs/sparc.py @@ -2,8 +2,9 @@ from ..qemu_config import QemuArchParams QEMU_ARCH = QemuArchParams(linux_arch='sparc', kconfig=''' -CONFIG_SERIAL_8250=y -CONFIG_SERIAL_8250_CONSOLE=y''', +CONFIG_SERIAL_SUNZILOG=y +CONFIG_SERIAL_SUNZILOG_CONSOLE=y +''', qemu_arch='sparc', kernel_path='arch/sparc/boot/zImage', kernel_command_line='console=ttyS0 mem=256M', -- GitLab From b70cda91569aab7f98e93a3ed5efb4ee1e22ed6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Tue, 15 Apr 2025 15:38:05 +0200 Subject: [PATCH 1953/2211] kunit: qemu_configs: sparc: Explicitly enable CONFIG_SPARC32=y MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit d16b3d0fb43cb0f9eb21b35c2d2c870b3f38ab1d ] The configuration generated by kunit ends up with a 32bit configuration. A new kunit configuration for 64bit is to be added. To make the difference clearer spell out the variant in the kunit reference config. Link: https://lore.kernel.org/r/20250415-kunit-qemu-sparc64-v1-1-253906f61102@linutronix.de Signed-off-by: Thomas Weißschuh Reviewed-by: David Gow Signed-off-by: Shuah Khan Stable-dep-of: 1d31d536871f ("kunit: qemu_configs: Disable faulting tests on 32-bit SPARC") Signed-off-by: Sasha Levin --- tools/testing/kunit/qemu_configs/sparc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/testing/kunit/qemu_configs/sparc.py b/tools/testing/kunit/qemu_configs/sparc.py index 256d9573b4464..3131dd299a6e3 100644 --- a/tools/testing/kunit/qemu_configs/sparc.py +++ b/tools/testing/kunit/qemu_configs/sparc.py @@ -2,6 +2,7 @@ from ..qemu_config import QemuArchParams QEMU_ARCH = QemuArchParams(linux_arch='sparc', kconfig=''' +CONFIG_SPARC32=y CONFIG_SERIAL_SUNZILOG=y CONFIG_SERIAL_SUNZILOG_CONSOLE=y ''', -- GitLab From 33b65fcec79e565721392cc1632d3f1601a070c4 Mon Sep 17 00:00:00 2001 From: David Gow Date: Wed, 16 Apr 2025 17:38:25 +0800 Subject: [PATCH 1954/2211] kunit: qemu_configs: Disable faulting tests on 32-bit SPARC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 1d31d536871fe8b16c8c0de58d201c78e21eb3a2 ] The 32-bit sparc configuration (--arch sparc) crashes on the kunit_fault_test. It's known that some architectures don't handle deliberate segfaults in kernel mode well, so there's a config switch to disable tests which rely upon it by default. Use this for the sparc config, making sure the default config for it passes. Link: https://lore.kernel.org/r/20250416093826.1550040-1-davidgow@google.com Fixes: 87c9c1631788 ("kunit: tool: add support for QEMU") Signed-off-by: David Gow Reviewed-by: Thomas Weißschuh Tested-by: Thomas Weißschuh Signed-off-by: Shuah Khan Signed-off-by: Sasha Levin --- tools/testing/kunit/qemu_configs/sparc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/testing/kunit/qemu_configs/sparc.py b/tools/testing/kunit/qemu_configs/sparc.py index 3131dd299a6e3..2019550a1b692 100644 --- a/tools/testing/kunit/qemu_configs/sparc.py +++ b/tools/testing/kunit/qemu_configs/sparc.py @@ -2,6 +2,7 @@ from ..qemu_config import QemuArchParams QEMU_ARCH = QemuArchParams(linux_arch='sparc', kconfig=''' +CONFIG_KUNIT_FAULT_TEST=n CONFIG_SPARC32=y CONFIG_SERIAL_SUNZILOG=y CONFIG_SERIAL_SUNZILOG_CONSOLE=y -- GitLab From 170af4314e4d413a36aefd6dc021db35a7ac8590 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Mon, 16 Sep 2024 15:42:57 +0200 Subject: [PATCH 1955/2211] gfs2: Initialize gl_no_formal_ino earlier [ Upstream commit 1072b3aa6863bc4d91006038b032bfb4dcc98dec ] Set gl_no_formal_ino of the iopen glock to the generation of the associated inode (ip->i_no_formal_ino) as soon as that value is known. This saves us from setting it later, possibly repeatedly, when queuing GLF_VERIFY_DELETE work. Signed-off-by: Andreas Gruenbacher Stable-dep-of: 2c63986dd35f ("gfs2: deallocate inodes in gfs2_create_inode") Signed-off-by: Sasha Levin --- fs/gfs2/glock.c | 1 - fs/gfs2/glops.c | 9 ++++++++- fs/gfs2/inode.c | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index aecce4bb5e1a9..ed699f2872f55 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -985,7 +985,6 @@ static bool gfs2_try_evict(struct gfs2_glock *gl) ip = NULL; spin_unlock(&gl->gl_lockref.lock); if (ip) { - gl->gl_no_formal_ino = ip->i_no_formal_ino; set_bit(GIF_DEFERRED_DELETE, &ip->i_flags); d_prune_aliases(&ip->i_inode); iput(&ip->i_inode); diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index 72a0601ce65e2..4b6b23c638e29 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c @@ -494,11 +494,18 @@ int gfs2_inode_refresh(struct gfs2_inode *ip) static int inode_go_instantiate(struct gfs2_glock *gl) { struct gfs2_inode *ip = gl->gl_object; + struct gfs2_glock *io_gl; + int error; if (!ip) /* no inode to populate - read it in later */ return 0; - return gfs2_inode_refresh(ip); + error = gfs2_inode_refresh(ip); + if (error) + return error; + io_gl = ip->i_iopen_gh.gh_gl; + io_gl->gl_no_formal_ino = ip->i_no_formal_ino; + return 0; } static int inode_go_held(struct gfs2_holder *gh) diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 3be24285ab01d..2d2f7646440f5 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -751,6 +751,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, if (error) goto fail_free_inode; gfs2_cancel_delete_work(io_gl); + io_gl->gl_no_formal_ino = ip->i_no_formal_ino; retry: error = insert_inode_locked4(inode, ip->i_no_addr, iget_test, &ip->i_no_addr); -- GitLab From 862ca0b49f1a4addf06311673bd96fa4f92d0efe Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Thu, 12 Sep 2024 22:22:12 +0200 Subject: [PATCH 1956/2211] gfs2: Rename GIF_{DEFERRED -> DEFER}_DELETE [ Upstream commit 9fb794aac6ddd08a9c4982372250f06137696e90 ] The GIF_DEFERRED_DELETE flag indicates an action that gfs2_evict_inode() should take, so rename the flag to GIF_DEFER_DELETE to clarify. Signed-off-by: Andreas Gruenbacher Stable-dep-of: 2c63986dd35f ("gfs2: deallocate inodes in gfs2_create_inode") Signed-off-by: Sasha Levin --- fs/gfs2/glock.c | 4 ++-- fs/gfs2/incore.h | 2 +- fs/gfs2/super.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index ed699f2872f55..9d72c5b8b7762 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -985,7 +985,7 @@ static bool gfs2_try_evict(struct gfs2_glock *gl) ip = NULL; spin_unlock(&gl->gl_lockref.lock); if (ip) { - set_bit(GIF_DEFERRED_DELETE, &ip->i_flags); + set_bit(GIF_DEFER_DELETE, &ip->i_flags); d_prune_aliases(&ip->i_inode); iput(&ip->i_inode); @@ -993,7 +993,7 @@ static bool gfs2_try_evict(struct gfs2_glock *gl) spin_lock(&gl->gl_lockref.lock); ip = gl->gl_object; if (ip) { - clear_bit(GIF_DEFERRED_DELETE, &ip->i_flags); + clear_bit(GIF_DEFER_DELETE, &ip->i_flags); if (!igrab(&ip->i_inode)) ip = NULL; } diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index e5535d7b46592..98a41c631ce10 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h @@ -376,7 +376,7 @@ enum { GIF_SW_PAGED = 3, GIF_FREE_VFS_INODE = 5, GIF_GLOP_PENDING = 6, - GIF_DEFERRED_DELETE = 7, + GIF_DEFER_DELETE = 7, }; struct gfs2_inode { diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 5ecb857cf74e3..6584fd5e0a5b7 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -1326,7 +1326,7 @@ static enum dinode_demise evict_should_delete(struct inode *inode, if (unlikely(test_bit(GIF_ALLOC_FAILED, &ip->i_flags))) goto should_delete; - if (test_bit(GIF_DEFERRED_DELETE, &ip->i_flags)) + if (test_bit(GIF_DEFER_DELETE, &ip->i_flags)) return SHOULD_DEFER_EVICTION; /* Deletes should never happen under memory pressure anymore. */ -- GitLab From af2ce45c2824e84926bd24996b8a87f0b041f1fc Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Sat, 14 Sep 2024 00:37:03 +0200 Subject: [PATCH 1957/2211] gfs2: Rename dinode_demise to evict_behavior [ Upstream commit c79ba4be351a06e0ac4c51143a83023bb37888d6 ] Rename enum dinode_demise to evict_behavior and its items SHOULD_DELETE_DINODE to EVICT_SHOULD_DELETE, SHOULD_NOT_DELETE_DINODE to EVICT_SHOULD_SKIP_DELETE, and SHOULD_DEFER_EVICTION to EVICT_SHOULD_DEFER_DELETE. In gfs2_evict_inode(), add a separate variable of type enum evict_behavior instead of implicitly casting to int. Signed-off-by: Andreas Gruenbacher Stable-dep-of: 2c63986dd35f ("gfs2: deallocate inodes in gfs2_create_inode") Signed-off-by: Sasha Levin --- fs/gfs2/super.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 6584fd5e0a5b7..6a0c0f3780b4c 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -44,10 +44,10 @@ #include "xattr.h" #include "lops.h" -enum dinode_demise { - SHOULD_DELETE_DINODE, - SHOULD_NOT_DELETE_DINODE, - SHOULD_DEFER_EVICTION, +enum evict_behavior { + EVICT_SHOULD_DELETE, + EVICT_SHOULD_SKIP_DELETE, + EVICT_SHOULD_DEFER_DELETE, }; /** @@ -1315,8 +1315,8 @@ static bool gfs2_upgrade_iopen_glock(struct inode *inode) * * Returns: the fate of the dinode */ -static enum dinode_demise evict_should_delete(struct inode *inode, - struct gfs2_holder *gh) +static enum evict_behavior evict_should_delete(struct inode *inode, + struct gfs2_holder *gh) { struct gfs2_inode *ip = GFS2_I(inode); struct super_block *sb = inode->i_sb; @@ -1327,11 +1327,11 @@ static enum dinode_demise evict_should_delete(struct inode *inode, goto should_delete; if (test_bit(GIF_DEFER_DELETE, &ip->i_flags)) - return SHOULD_DEFER_EVICTION; + return EVICT_SHOULD_DEFER_DELETE; /* Deletes should never happen under memory pressure anymore. */ if (WARN_ON_ONCE(current->flags & PF_MEMALLOC)) - return SHOULD_DEFER_EVICTION; + return EVICT_SHOULD_DEFER_DELETE; /* Must not read inode block until block type has been verified */ ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, gh); @@ -1339,34 +1339,34 @@ static enum dinode_demise evict_should_delete(struct inode *inode, glock_clear_object(ip->i_iopen_gh.gh_gl, ip); ip->i_iopen_gh.gh_flags |= GL_NOCACHE; gfs2_glock_dq_uninit(&ip->i_iopen_gh); - return SHOULD_DEFER_EVICTION; + return EVICT_SHOULD_DEFER_DELETE; } if (gfs2_inode_already_deleted(ip->i_gl, ip->i_no_formal_ino)) - return SHOULD_NOT_DELETE_DINODE; + return EVICT_SHOULD_SKIP_DELETE; ret = gfs2_check_blk_type(sdp, ip->i_no_addr, GFS2_BLKST_UNLINKED); if (ret) - return SHOULD_NOT_DELETE_DINODE; + return EVICT_SHOULD_SKIP_DELETE; ret = gfs2_instantiate(gh); if (ret) - return SHOULD_NOT_DELETE_DINODE; + return EVICT_SHOULD_SKIP_DELETE; /* * The inode may have been recreated in the meantime. */ if (inode->i_nlink) - return SHOULD_NOT_DELETE_DINODE; + return EVICT_SHOULD_SKIP_DELETE; should_delete: if (gfs2_holder_initialized(&ip->i_iopen_gh) && test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags)) { if (!gfs2_upgrade_iopen_glock(inode)) { gfs2_holder_uninit(&ip->i_iopen_gh); - return SHOULD_NOT_DELETE_DINODE; + return EVICT_SHOULD_SKIP_DELETE; } } - return SHOULD_DELETE_DINODE; + return EVICT_SHOULD_DELETE; } /** @@ -1477,6 +1477,7 @@ static void gfs2_evict_inode(struct inode *inode) struct gfs2_sbd *sdp = sb->s_fs_info; struct gfs2_inode *ip = GFS2_I(inode); struct gfs2_holder gh; + enum evict_behavior behavior; int ret; if (inode->i_nlink || sb_rdonly(sb) || !ip->i_no_addr) @@ -1491,10 +1492,10 @@ static void gfs2_evict_inode(struct inode *inode) goto out; gfs2_holder_mark_uninitialized(&gh); - ret = evict_should_delete(inode, &gh); - if (ret == SHOULD_DEFER_EVICTION) + behavior = evict_should_delete(inode, &gh); + if (behavior == EVICT_SHOULD_DEFER_DELETE) goto out; - if (ret == SHOULD_DELETE_DINODE) + if (behavior == EVICT_SHOULD_DELETE) ret = evict_unlinked_inode(inode); else ret = evict_linked_inode(inode); -- GitLab From 9649fec0f9c224da933a318d869bc24a0413dffd Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Tue, 19 Nov 2024 12:15:26 +0100 Subject: [PATCH 1958/2211] gfs2: Prevent inode creation race [ Upstream commit ffd1cf0443a208b80e40100ed02892d2ec74c7e9 ] When a request to evict an inode comes in over the network, we are trying to grab an inode reference via the iopen glock's gl_object pointer. There is a very small probability that by the time such a request comes in, inode creation hasn't completed and the I_NEW flag is still set. To deal with that, wait for the inode and then check if inode creation was successful. Signed-off-by: Andreas Gruenbacher Stable-dep-of: 2c63986dd35f ("gfs2: deallocate inodes in gfs2_create_inode") Signed-off-by: Sasha Levin --- fs/gfs2/glock.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 9d72c5b8b7762..3c70c383b9bdd 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -984,6 +984,13 @@ static bool gfs2_try_evict(struct gfs2_glock *gl) if (ip && !igrab(&ip->i_inode)) ip = NULL; spin_unlock(&gl->gl_lockref.lock); + if (ip) { + wait_on_inode(&ip->i_inode); + if (is_bad_inode(&ip->i_inode)) { + iput(&ip->i_inode); + ip = NULL; + } + } if (ip) { set_bit(GIF_DEFER_DELETE, &ip->i_flags); d_prune_aliases(&ip->i_inode); -- GitLab From fbb2d296d4adac40be2dec7d6f9d339a9adfc250 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Thu, 23 Jan 2025 19:50:19 +0100 Subject: [PATCH 1959/2211] gfs2: Decode missing glock flags in tracepoints [ Upstream commit 57882533923ce7842a21b8f5be14de861403dd26 ] Add a number of glock flags are currently not shown in the text form of glock tracepoints. Signed-off-by: Andreas Gruenbacher Stable-dep-of: 2c63986dd35f ("gfs2: deallocate inodes in gfs2_create_inode") Signed-off-by: Sasha Levin --- fs/gfs2/trace_gfs2.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fs/gfs2/trace_gfs2.h b/fs/gfs2/trace_gfs2.h index 8eae8d62a4132..ac8ca485c46fe 100644 --- a/fs/gfs2/trace_gfs2.h +++ b/fs/gfs2/trace_gfs2.h @@ -58,7 +58,12 @@ {(1UL << GLF_HAVE_FROZEN_REPLY), "F" }, \ {(1UL << GLF_LRU), "L" }, \ {(1UL << GLF_OBJECT), "o" }, \ - {(1UL << GLF_BLOCKING), "b" }) + {(1UL << GLF_BLOCKING), "b" }, \ + {(1UL << GLF_UNLOCKED), "x" }, \ + {(1UL << GLF_INSTANTIATE_NEEDED), "n" }, \ + {(1UL << GLF_INSTANTIATE_IN_PROG), "N" }, \ + {(1UL << GLF_TRY_TO_EVICT), "e" }, \ + {(1UL << GLF_VERIFY_DELETE), "E" }) #ifndef NUMPTY #define NUMPTY -- GitLab From 7df46e6f8847a22d70f22b5ef69d16f8b55dad33 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 24 Jan 2025 17:23:50 +0100 Subject: [PATCH 1960/2211] gfs2: Add GLF_PENDING_REPLY flag [ Upstream commit 8bbfde0875590b71f012bd8b0c9cb988c9a873b9 ] Introduce a new GLF_PENDING_REPLY flag to indicate that a reply from DLM is expected. Include that flag in glock dumps to show more clearly what's going on. (When the GLF_PENDING_REPLY flag is set, the GLF_LOCK flag will also be set but the GLF_LOCK flag alone isn't sufficient to tell that we are waiting for a DLM reply.) Signed-off-by: Andreas Gruenbacher Stable-dep-of: 2c63986dd35f ("gfs2: deallocate inodes in gfs2_create_inode") Signed-off-by: Sasha Levin --- fs/gfs2/glock.c | 5 +++++ fs/gfs2/incore.h | 1 + fs/gfs2/trace_gfs2.h | 1 + 3 files changed, 7 insertions(+) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 3c70c383b9bdd..ec043aa71de8c 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -807,6 +807,7 @@ skip_inval: } if (ls->ls_ops->lm_lock) { + set_bit(GLF_PENDING_REPLY, &gl->gl_flags); spin_unlock(&gl->gl_lockref.lock); ret = ls->ls_ops->lm_lock(gl, target, lck_flags); spin_lock(&gl->gl_lockref.lock); @@ -825,6 +826,7 @@ skip_inval: /* The operation will be completed asynchronously. */ return; } + clear_bit(GLF_PENDING_REPLY, &gl->gl_flags); } /* Complete the operation now. */ @@ -1960,6 +1962,7 @@ void gfs2_glock_complete(struct gfs2_glock *gl, int ret) struct lm_lockstruct *ls = &gl->gl_name.ln_sbd->sd_lockstruct; spin_lock(&gl->gl_lockref.lock); + clear_bit(GLF_PENDING_REPLY, &gl->gl_flags); gl->gl_reply = ret; if (unlikely(test_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags))) { @@ -2360,6 +2363,8 @@ static const char *gflags2str(char *buf, const struct gfs2_glock *gl) *p++ = 'f'; if (test_bit(GLF_INVALIDATE_IN_PROGRESS, gflags)) *p++ = 'i'; + if (test_bit(GLF_PENDING_REPLY, gflags)) + *p++ = 'R'; if (test_bit(GLF_HAVE_REPLY, gflags)) *p++ = 'r'; if (test_bit(GLF_INITIAL, gflags)) diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index 98a41c631ce10..f6aee2c9b9118 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h @@ -330,6 +330,7 @@ enum { GLF_UNLOCKED = 16, /* Wait for glock to be unlocked */ GLF_TRY_TO_EVICT = 17, /* iopen glocks only */ GLF_VERIFY_DELETE = 18, /* iopen glocks only */ + GLF_PENDING_REPLY = 19, }; struct gfs2_glock { diff --git a/fs/gfs2/trace_gfs2.h b/fs/gfs2/trace_gfs2.h index ac8ca485c46fe..09121c2c198ba 100644 --- a/fs/gfs2/trace_gfs2.h +++ b/fs/gfs2/trace_gfs2.h @@ -53,6 +53,7 @@ {(1UL << GLF_DIRTY), "y" }, \ {(1UL << GLF_LFLUSH), "f" }, \ {(1UL << GLF_INVALIDATE_IN_PROGRESS), "i" }, \ + {(1UL << GLF_PENDING_REPLY), "R" }, \ {(1UL << GLF_HAVE_REPLY), "r" }, \ {(1UL << GLF_INITIAL), "a" }, \ {(1UL << GLF_HAVE_FROZEN_REPLY), "F" }, \ -- GitLab From 4f66983aeb029697bf94608fe4c82dc00b4e040e Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Tue, 4 Feb 2025 17:35:13 +0100 Subject: [PATCH 1961/2211] gfs2: Replace GIF_DEFER_DELETE with GLF_DEFER_DELETE [ Upstream commit 3774f53d7f0b30a996eab4a1264611489b48f14c ] Having this flag attached to the iopen glock instead of the inode is much simpler; it eliminates a protential weird race in gfs2_try_evict(). Signed-off-by: Andreas Gruenbacher Stable-dep-of: 2c63986dd35f ("gfs2: deallocate inodes in gfs2_create_inode") Signed-off-by: Sasha Levin --- fs/gfs2/glock.c | 6 ++++-- fs/gfs2/incore.h | 2 +- fs/gfs2/super.c | 3 ++- fs/gfs2/trace_gfs2.h | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index ec043aa71de8c..161fc76ed5b0e 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -994,15 +994,15 @@ static bool gfs2_try_evict(struct gfs2_glock *gl) } } if (ip) { - set_bit(GIF_DEFER_DELETE, &ip->i_flags); + set_bit(GLF_DEFER_DELETE, &gl->gl_flags); d_prune_aliases(&ip->i_inode); iput(&ip->i_inode); + clear_bit(GLF_DEFER_DELETE, &gl->gl_flags); /* If the inode was evicted, gl->gl_object will now be NULL. */ spin_lock(&gl->gl_lockref.lock); ip = gl->gl_object; if (ip) { - clear_bit(GIF_DEFER_DELETE, &ip->i_flags); if (!igrab(&ip->i_inode)) ip = NULL; } @@ -2389,6 +2389,8 @@ static const char *gflags2str(char *buf, const struct gfs2_glock *gl) *p++ = 'e'; if (test_bit(GLF_VERIFY_DELETE, gflags)) *p++ = 'E'; + if (test_bit(GLF_DEFER_DELETE, gflags)) + *p++ = 's'; *p = 0; return buf; } diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index f6aee2c9b9118..142f61228d15e 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h @@ -331,6 +331,7 @@ enum { GLF_TRY_TO_EVICT = 17, /* iopen glocks only */ GLF_VERIFY_DELETE = 18, /* iopen glocks only */ GLF_PENDING_REPLY = 19, + GLF_DEFER_DELETE = 20, /* iopen glocks only */ }; struct gfs2_glock { @@ -377,7 +378,6 @@ enum { GIF_SW_PAGED = 3, GIF_FREE_VFS_INODE = 5, GIF_GLOP_PENDING = 6, - GIF_DEFER_DELETE = 7, }; struct gfs2_inode { diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 6a0c0f3780b4c..d982db129b2b4 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -1326,7 +1326,8 @@ static enum evict_behavior evict_should_delete(struct inode *inode, if (unlikely(test_bit(GIF_ALLOC_FAILED, &ip->i_flags))) goto should_delete; - if (test_bit(GIF_DEFER_DELETE, &ip->i_flags)) + if (gfs2_holder_initialized(&ip->i_iopen_gh) && + test_bit(GLF_DEFER_DELETE, &ip->i_iopen_gh.gh_gl->gl_flags)) return EVICT_SHOULD_DEFER_DELETE; /* Deletes should never happen under memory pressure anymore. */ diff --git a/fs/gfs2/trace_gfs2.h b/fs/gfs2/trace_gfs2.h index 09121c2c198ba..43de603ab347e 100644 --- a/fs/gfs2/trace_gfs2.h +++ b/fs/gfs2/trace_gfs2.h @@ -64,7 +64,8 @@ {(1UL << GLF_INSTANTIATE_NEEDED), "n" }, \ {(1UL << GLF_INSTANTIATE_IN_PROG), "N" }, \ {(1UL << GLF_TRY_TO_EVICT), "e" }, \ - {(1UL << GLF_VERIFY_DELETE), "E" }) + {(1UL << GLF_VERIFY_DELETE), "E" }, \ + {(1UL << GLF_DEFER_DELETE), "s" }) #ifndef NUMPTY #define NUMPTY -- GitLab From 24ae2de15bda3be589ce9e175bd6742786c24e07 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Thu, 17 Apr 2025 22:41:40 +0200 Subject: [PATCH 1962/2211] gfs2: Move gfs2_dinode_dealloc [ Upstream commit bcd18105fb34e27c097f222733dba9a3e79f191c ] Move gfs2_dinode_dealloc() and its helper gfs2_final_release_pages() from super.c to inode.c. Signed-off-by: Andreas Gruenbacher Stable-dep-of: 2c63986dd35f ("gfs2: deallocate inodes in gfs2_create_inode") Signed-off-by: Sasha Levin --- fs/gfs2/inode.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ fs/gfs2/inode.h | 1 + fs/gfs2/super.c | 68 ------------------------------------------------- 3 files changed, 69 insertions(+), 68 deletions(-) diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 2d2f7646440f5..e59fde1bae7b7 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -439,6 +439,74 @@ out: return error; } +static void gfs2_final_release_pages(struct gfs2_inode *ip) +{ + struct inode *inode = &ip->i_inode; + struct gfs2_glock *gl = ip->i_gl; + + if (unlikely(!gl)) { + /* This can only happen during incomplete inode creation. */ + BUG_ON(!test_bit(GIF_ALLOC_FAILED, &ip->i_flags)); + return; + } + + truncate_inode_pages(gfs2_glock2aspace(gl), 0); + truncate_inode_pages(&inode->i_data, 0); + + if (atomic_read(&gl->gl_revokes) == 0) { + clear_bit(GLF_LFLUSH, &gl->gl_flags); + clear_bit(GLF_DIRTY, &gl->gl_flags); + } +} + +int gfs2_dinode_dealloc(struct gfs2_inode *ip) +{ + struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); + struct gfs2_rgrpd *rgd; + struct gfs2_holder gh; + int error; + + if (gfs2_get_inode_blocks(&ip->i_inode) != 1) { + gfs2_consist_inode(ip); + return -EIO; + } + + gfs2_rindex_update(sdp); + + error = gfs2_quota_hold(ip, NO_UID_QUOTA_CHANGE, NO_GID_QUOTA_CHANGE); + if (error) + return error; + + rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr, 1); + if (!rgd) { + gfs2_consist_inode(ip); + error = -EIO; + goto out_qs; + } + + error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_EXCLUSIVE, + LM_FLAG_NODE_SCOPE, &gh); + if (error) + goto out_qs; + + error = gfs2_trans_begin(sdp, RES_RG_BIT + RES_STATFS + RES_QUOTA, + sdp->sd_jdesc->jd_blocks); + if (error) + goto out_rg_gunlock; + + gfs2_free_di(rgd, ip); + + gfs2_final_release_pages(ip); + + gfs2_trans_end(sdp); + +out_rg_gunlock: + gfs2_glock_dq_uninit(&gh); +out_qs: + gfs2_quota_unhold(ip); + return error; +} + static void gfs2_init_dir(struct buffer_head *dibh, const struct gfs2_inode *parent) { diff --git a/fs/gfs2/inode.h b/fs/gfs2/inode.h index fd15d1c6b6fb1..225b9d0038cd0 100644 --- a/fs/gfs2/inode.h +++ b/fs/gfs2/inode.h @@ -92,6 +92,7 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type, struct inode *gfs2_lookup_by_inum(struct gfs2_sbd *sdp, u64 no_addr, u64 no_formal_ino, unsigned int blktype); +int gfs2_dinode_dealloc(struct gfs2_inode *ip); int gfs2_inode_refresh(struct gfs2_inode *ip); diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index d982db129b2b4..aad6d5d2816e3 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -1175,74 +1175,6 @@ static int gfs2_show_options(struct seq_file *s, struct dentry *root) return 0; } -static void gfs2_final_release_pages(struct gfs2_inode *ip) -{ - struct inode *inode = &ip->i_inode; - struct gfs2_glock *gl = ip->i_gl; - - if (unlikely(!gl)) { - /* This can only happen during incomplete inode creation. */ - BUG_ON(!test_bit(GIF_ALLOC_FAILED, &ip->i_flags)); - return; - } - - truncate_inode_pages(gfs2_glock2aspace(gl), 0); - truncate_inode_pages(&inode->i_data, 0); - - if (atomic_read(&gl->gl_revokes) == 0) { - clear_bit(GLF_LFLUSH, &gl->gl_flags); - clear_bit(GLF_DIRTY, &gl->gl_flags); - } -} - -static int gfs2_dinode_dealloc(struct gfs2_inode *ip) -{ - struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); - struct gfs2_rgrpd *rgd; - struct gfs2_holder gh; - int error; - - if (gfs2_get_inode_blocks(&ip->i_inode) != 1) { - gfs2_consist_inode(ip); - return -EIO; - } - - gfs2_rindex_update(sdp); - - error = gfs2_quota_hold(ip, NO_UID_QUOTA_CHANGE, NO_GID_QUOTA_CHANGE); - if (error) - return error; - - rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr, 1); - if (!rgd) { - gfs2_consist_inode(ip); - error = -EIO; - goto out_qs; - } - - error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_EXCLUSIVE, - LM_FLAG_NODE_SCOPE, &gh); - if (error) - goto out_qs; - - error = gfs2_trans_begin(sdp, RES_RG_BIT + RES_STATFS + RES_QUOTA, - sdp->sd_jdesc->jd_blocks); - if (error) - goto out_rg_gunlock; - - gfs2_free_di(rgd, ip); - - gfs2_final_release_pages(ip); - - gfs2_trans_end(sdp); - -out_rg_gunlock: - gfs2_glock_dq_uninit(&gh); -out_qs: - gfs2_quota_unhold(ip); - return error; -} - /** * gfs2_glock_put_eventually * @gl: The glock to put -- GitLab From 8e753fc3d5fba836190a61cc1dec4169857accfa Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 18 Apr 2025 01:09:32 +0200 Subject: [PATCH 1963/2211] gfs2: Move GIF_ALLOC_FAILED check out of gfs2_ea_dealloc [ Upstream commit 0cc617a54dfe6b44624c9a03e2e11a24eb9bc720 ] Don't check for the GIF_ALLOC_FAILED flag in gfs2_ea_dealloc() and pass that information explicitly instead. This allows for a cleaner follow-up patch. Signed-off-by: Andreas Gruenbacher Stable-dep-of: 2c63986dd35f ("gfs2: deallocate inodes in gfs2_create_inode") Signed-off-by: Sasha Levin --- fs/gfs2/super.c | 2 +- fs/gfs2/xattr.c | 11 ++++++----- fs/gfs2/xattr.h | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index aad6d5d2816e3..694d554dba546 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -1319,7 +1319,7 @@ static int evict_unlinked_inode(struct inode *inode) } if (ip->i_eattr) { - ret = gfs2_ea_dealloc(ip); + ret = gfs2_ea_dealloc(ip, !test_bit(GIF_ALLOC_FAILED, &ip->i_flags)); if (ret) goto out; } diff --git a/fs/gfs2/xattr.c b/fs/gfs2/xattr.c index 17ae5070a90e6..df9c93de94c79 100644 --- a/fs/gfs2/xattr.c +++ b/fs/gfs2/xattr.c @@ -1383,7 +1383,7 @@ out: return error; } -static int ea_dealloc_block(struct gfs2_inode *ip) +static int ea_dealloc_block(struct gfs2_inode *ip, bool initialized) { struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); struct gfs2_rgrpd *rgd; @@ -1416,7 +1416,7 @@ static int ea_dealloc_block(struct gfs2_inode *ip) ip->i_eattr = 0; gfs2_add_inode_blocks(&ip->i_inode, -1); - if (likely(!test_bit(GIF_ALLOC_FAILED, &ip->i_flags))) { + if (initialized) { error = gfs2_meta_inode_buffer(ip, &dibh); if (!error) { gfs2_trans_add_meta(ip->i_gl, dibh); @@ -1435,11 +1435,12 @@ out_gunlock: /** * gfs2_ea_dealloc - deallocate the extended attribute fork * @ip: the inode + * @initialized: xattrs have been initialized * * Returns: errno */ -int gfs2_ea_dealloc(struct gfs2_inode *ip) +int gfs2_ea_dealloc(struct gfs2_inode *ip, bool initialized) { int error; @@ -1451,7 +1452,7 @@ int gfs2_ea_dealloc(struct gfs2_inode *ip) if (error) return error; - if (likely(!test_bit(GIF_ALLOC_FAILED, &ip->i_flags))) { + if (initialized) { error = ea_foreach(ip, ea_dealloc_unstuffed, NULL); if (error) goto out_quota; @@ -1463,7 +1464,7 @@ int gfs2_ea_dealloc(struct gfs2_inode *ip) } } - error = ea_dealloc_block(ip); + error = ea_dealloc_block(ip, initialized); out_quota: gfs2_quota_unhold(ip); diff --git a/fs/gfs2/xattr.h b/fs/gfs2/xattr.h index eb12eb7e37c19..3c9788e0e1375 100644 --- a/fs/gfs2/xattr.h +++ b/fs/gfs2/xattr.h @@ -54,7 +54,7 @@ int __gfs2_xattr_set(struct inode *inode, const char *name, const void *value, size_t size, int flags, int type); ssize_t gfs2_listxattr(struct dentry *dentry, char *buffer, size_t size); -int gfs2_ea_dealloc(struct gfs2_inode *ip); +int gfs2_ea_dealloc(struct gfs2_inode *ip, bool initialized); /* Exported to acl.c */ -- GitLab From cde7f94078846a9cf160a99b644a1b8971d99298 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 18 Apr 2025 16:41:52 +0200 Subject: [PATCH 1964/2211] gfs2: deallocate inodes in gfs2_create_inode [ Upstream commit 2c63986dd35fa9eb0d7d1530b5eb2244b7296e22 ] When creating and destroying inodes, we are relying on the inode hash table to make sure that for a given inode number, only a single inode will exist. We then link that inode to its inode and iopen glock and let those glocks point back at the inode. However, when iget_failed() is called, the inode is removed from the inode hash table before gfs_evict_inode() is called, and uniqueness is no longer guaranteed. Commit f1046a472b70 ("gfs2: gl_object races fix") was trying to work around that problem by detaching the inode glock from the inode before calling iget_failed(), but that broke the inode deallocation code in gfs_evict_inode(). To fix that, deallocate partially created inodes in gfs2_create_inode() instead of relying on gfs_evict_inode() for doing that. This means that gfs2_evict_inode() and its helper functions will no longer see partially created inodes, and so some simplifications are possible there. Fixes: 9ffa18884cce ("gfs2: gl_object races fix") Signed-off-by: Andreas Gruenbacher Signed-off-by: Sasha Levin --- fs/gfs2/inode.c | 27 +++++++++++++++++++-------- fs/gfs2/super.c | 6 +----- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index e59fde1bae7b7..0b546024f5ef7 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -697,10 +697,11 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, struct gfs2_inode *dip = GFS2_I(dir), *ip; struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode); struct gfs2_glock *io_gl; - int error; + int error, dealloc_error; u32 aflags = 0; unsigned blocks = 1; struct gfs2_diradd da = { .bh = NULL, .save_loc = 1, }; + bool xattr_initialized = false; if (!name->len || name->len > GFS2_FNAMESIZE) return -ENAMETOOLONG; @@ -813,11 +814,11 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, error = gfs2_glock_get(sdp, ip->i_no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl); if (error) - goto fail_free_inode; + goto fail_dealloc_inode; error = gfs2_glock_get(sdp, ip->i_no_addr, &gfs2_iopen_glops, CREATE, &io_gl); if (error) - goto fail_free_inode; + goto fail_dealloc_inode; gfs2_cancel_delete_work(io_gl); io_gl->gl_no_formal_ino = ip->i_no_formal_ino; @@ -841,8 +842,10 @@ retry: if (error) goto fail_gunlock3; - if (blocks > 1) + if (blocks > 1) { gfs2_init_xattr(ip); + xattr_initialized = true; + } init_dinode(dip, ip, symname); gfs2_trans_end(sdp); @@ -897,6 +900,18 @@ fail_gunlock3: gfs2_glock_dq_uninit(&ip->i_iopen_gh); fail_gunlock2: gfs2_glock_put(io_gl); +fail_dealloc_inode: + set_bit(GIF_ALLOC_FAILED, &ip->i_flags); + dealloc_error = 0; + if (ip->i_eattr) + dealloc_error = gfs2_ea_dealloc(ip, xattr_initialized); + clear_nlink(inode); + mark_inode_dirty(inode); + if (!dealloc_error) + dealloc_error = gfs2_dinode_dealloc(ip); + if (dealloc_error) + fs_warn(sdp, "%s: %d\n", __func__, dealloc_error); + ip->i_no_addr = 0; fail_free_inode: if (ip->i_gl) { gfs2_glock_put(ip->i_gl); @@ -911,10 +926,6 @@ fail_gunlock: gfs2_dir_no_add(&da); gfs2_glock_dq_uninit(&d_gh); if (!IS_ERR_OR_NULL(inode)) { - set_bit(GIF_ALLOC_FAILED, &ip->i_flags); - clear_nlink(inode); - if (ip->i_no_addr) - mark_inode_dirty(inode); if (inode->i_state & I_NEW) iget_failed(inode); else diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 694d554dba546..3b1303f97a3bc 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -1255,9 +1255,6 @@ static enum evict_behavior evict_should_delete(struct inode *inode, struct gfs2_sbd *sdp = sb->s_fs_info; int ret; - if (unlikely(test_bit(GIF_ALLOC_FAILED, &ip->i_flags))) - goto should_delete; - if (gfs2_holder_initialized(&ip->i_iopen_gh) && test_bit(GLF_DEFER_DELETE, &ip->i_iopen_gh.gh_gl->gl_flags)) return EVICT_SHOULD_DEFER_DELETE; @@ -1291,7 +1288,6 @@ static enum evict_behavior evict_should_delete(struct inode *inode, if (inode->i_nlink) return EVICT_SHOULD_SKIP_DELETE; -should_delete: if (gfs2_holder_initialized(&ip->i_iopen_gh) && test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags)) { if (!gfs2_upgrade_iopen_glock(inode)) { @@ -1319,7 +1315,7 @@ static int evict_unlinked_inode(struct inode *inode) } if (ip->i_eattr) { - ret = gfs2_ea_dealloc(ip, !test_bit(GIF_ALLOC_FAILED, &ip->i_flags)); + ret = gfs2_ea_dealloc(ip, true); if (ret) goto out; } -- GitLab From 5ff2ed0f0aca82e18f7768897c181f4e42a59042 Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Thu, 20 Feb 2025 19:52:26 +1030 Subject: [PATCH 1965/2211] btrfs: prepare btrfs_page_mkwrite() for large folios [ Upstream commit 49990d8fa27d75f8ecf4ad013b13de3c4b1ff433 ] This changes the assumption that the folio is always page sized. (Although the ASSERT() for folio order is still kept as-is). Just replace the PAGE_SIZE with folio_size(). Reviewed-by: Johannes Thumshirn Signed-off-by: Qu Wenruo Signed-off-by: David Sterba Stable-dep-of: 17a85f520469 ("btrfs: fix wrong start offset for delalloc space release during mmap write") Signed-off-by: Sasha Levin --- fs/btrfs/file.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index eaa991e698049..86e7150babd5c 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -1912,6 +1912,7 @@ static vm_fault_t btrfs_page_mkwrite(struct vm_fault *vmf) struct extent_changeset *data_reserved = NULL; unsigned long zero_start; loff_t size; + size_t fsize = folio_size(folio); vm_fault_t ret; int ret2; int reserved = 0; @@ -1922,7 +1923,7 @@ static vm_fault_t btrfs_page_mkwrite(struct vm_fault *vmf) ASSERT(folio_order(folio) == 0); - reserved_space = PAGE_SIZE; + reserved_space = fsize; sb_start_pagefault(inode->i_sb); page_start = folio_pos(folio); @@ -1976,7 +1977,7 @@ again: * We can't set the delalloc bits if there are pending ordered * extents. Drop our locks and wait for them to finish. */ - ordered = btrfs_lookup_ordered_range(BTRFS_I(inode), page_start, PAGE_SIZE); + ordered = btrfs_lookup_ordered_range(BTRFS_I(inode), page_start, fsize); if (ordered) { unlock_extent(io_tree, page_start, page_end, &cached_state); folio_unlock(folio); @@ -1988,11 +1989,11 @@ again: if (folio->index == ((size - 1) >> PAGE_SHIFT)) { reserved_space = round_up(size - page_start, fs_info->sectorsize); - if (reserved_space < PAGE_SIZE) { + if (reserved_space < fsize) { end = page_start + reserved_space - 1; btrfs_delalloc_release_space(BTRFS_I(inode), data_reserved, page_start, - PAGE_SIZE - reserved_space, true); + fsize - reserved_space, true); } } @@ -2019,12 +2020,12 @@ again: if (page_start + folio_size(folio) > size) zero_start = offset_in_folio(folio, size); else - zero_start = PAGE_SIZE; + zero_start = fsize; - if (zero_start != PAGE_SIZE) + if (zero_start != fsize) folio_zero_range(folio, zero_start, folio_size(folio) - zero_start); - btrfs_folio_clear_checked(fs_info, folio, page_start, PAGE_SIZE); + btrfs_folio_clear_checked(fs_info, folio, page_start, fsize); btrfs_folio_set_dirty(fs_info, folio, page_start, end + 1 - page_start); btrfs_folio_set_uptodate(fs_info, folio, page_start, end + 1 - page_start); @@ -2033,7 +2034,7 @@ again: unlock_extent(io_tree, page_start, page_end, &cached_state); up_read(&BTRFS_I(inode)->i_mmap_lock); - btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE); + btrfs_delalloc_release_extents(BTRFS_I(inode), fsize); sb_end_pagefault(inode->i_sb); extent_changeset_free(data_reserved); return VM_FAULT_LOCKED; @@ -2042,7 +2043,7 @@ out_unlock: folio_unlock(folio); up_read(&BTRFS_I(inode)->i_mmap_lock); out: - btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE); + btrfs_delalloc_release_extents(BTRFS_I(inode), fsize); btrfs_delalloc_release_space(BTRFS_I(inode), data_reserved, page_start, reserved_space, (ret != 0)); out_noreserve: -- GitLab From 2dc82f0d781b523f52bb790903ae55365711a421 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Wed, 14 May 2025 10:30:58 +0100 Subject: [PATCH 1966/2211] btrfs: fix wrong start offset for delalloc space release during mmap write [ Upstream commit 17a85f520469a1838379de8ad24f63e778f7c277 ] If we're doing a mmap write against a folio that has i_size somewhere in the middle and we have multiple sectors in the folio, we may have to release excess space previously reserved, for the range going from the rounded up (to sector size) i_size to the folio's end offset. We are calculating the right amount to release and passing it to btrfs_delalloc_release_space(), but we are passing the wrong start offset of that range - we're passing the folio's start offset instead of the end offset, plus 1, of the range for which we keep the reservation. This may result in releasing more space then we should and eventually trigger an underflow of the data space_info's bytes_may_use counter. So fix this by passing the start offset as 'end + 1' instead of 'page_start' to btrfs_delalloc_release_space(). Fixes: d0b7da88f640 ("Btrfs: btrfs_page_mkwrite: Reserve space in sectorsized units") Reviewed-by: Qu Wenruo Signed-off-by: Filipe Manana Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 86e7150babd5c..0e63603ac5c78 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -1992,7 +1992,7 @@ again: if (reserved_space < fsize) { end = page_start + reserved_space - 1; btrfs_delalloc_release_space(BTRFS_I(inode), - data_reserved, page_start, + data_reserved, end + 1, fsize - reserved_space, true); } } -- GitLab From 0cc4721a7182eec4f681439266aa526e6e4c83ad Mon Sep 17 00:00:00 2001 From: Vincent Guittot Date: Mon, 2 Dec 2024 18:45:58 +0100 Subject: [PATCH 1967/2211] sched/fair: Rename h_nr_running into h_nr_queued [ Upstream commit 7b8a702d943827130cc00ae36075eff5500f86f1 ] With delayed dequeued feature, a sleeping sched_entity remains queued in the rq until its lag has elapsed but can't run. Rename h_nr_running into h_nr_queued to reflect this new behavior. Signed-off-by: Vincent Guittot Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Dietmar Eggemann Link: https://lore.kernel.org/r/20241202174606.4074512-4-vincent.guittot@linaro.org Stable-dep-of: aa3ee4f0b754 ("sched/fair: Fixup wake_up_sync() vs DELAYED_DEQUEUE") Signed-off-by: Sasha Levin --- kernel/sched/core.c | 4 +- kernel/sched/debug.c | 6 +-- kernel/sched/fair.c | 88 ++++++++++++++++++++++---------------------- kernel/sched/pelt.c | 4 +- kernel/sched/sched.h | 4 +- 5 files changed, 53 insertions(+), 53 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index d4948a8629929..50531e462a4ba 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1303,7 +1303,7 @@ bool sched_can_stop_tick(struct rq *rq) if (scx_enabled() && !scx_can_stop_tick(rq)) return false; - if (rq->cfs.h_nr_running > 1) + if (rq->cfs.h_nr_queued > 1) return false; /* @@ -5976,7 +5976,7 @@ __pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) * opportunity to pull in more work from other CPUs. */ if (likely(!sched_class_above(prev->sched_class, &fair_sched_class) && - rq->nr_running == rq->cfs.h_nr_running)) { + rq->nr_running == rq->cfs.h_nr_queued)) { p = pick_next_task_fair(rq, prev, rf); if (unlikely(p == RETRY_TASK)) diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c index 1e3bc0774efd5..7cf0c138c78e5 100644 --- a/kernel/sched/debug.c +++ b/kernel/sched/debug.c @@ -378,7 +378,7 @@ static ssize_t sched_fair_server_write(struct file *filp, const char __user *ubu return -EINVAL; } - if (rq->cfs.h_nr_running) { + if (rq->cfs.h_nr_queued) { update_rq_clock(rq); dl_server_stop(&rq->fair_server); } @@ -391,7 +391,7 @@ static ssize_t sched_fair_server_write(struct file *filp, const char __user *ubu printk_deferred("Fair server disabled in CPU %d, system may crash due to starvation.\n", cpu_of(rq)); - if (rq->cfs.h_nr_running) + if (rq->cfs.h_nr_queued) dl_server_start(&rq->fair_server); } @@ -843,7 +843,7 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) spread = right_vruntime - left_vruntime; SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "spread", SPLIT_NS(spread)); SEQ_printf(m, " .%-30s: %d\n", "nr_running", cfs_rq->nr_running); - SEQ_printf(m, " .%-30s: %d\n", "h_nr_running", cfs_rq->h_nr_running); + SEQ_printf(m, " .%-30s: %d\n", "h_nr_queued", cfs_rq->h_nr_queued); SEQ_printf(m, " .%-30s: %d\n", "h_nr_delayed", cfs_rq->h_nr_delayed); SEQ_printf(m, " .%-30s: %d\n", "idle_nr_running", cfs_rq->idle_nr_running); diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 443f6a9ef3f8f..33438b6c35478 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -2147,7 +2147,7 @@ static void update_numa_stats(struct task_numa_env *env, ns->load += cpu_load(rq); ns->runnable += cpu_runnable(rq); ns->util += cpu_util_cfs(cpu); - ns->nr_running += rq->cfs.h_nr_running; + ns->nr_running += rq->cfs.h_nr_queued; ns->compute_capacity += capacity_of(cpu); if (find_idle && idle_core < 0 && !rq->nr_running && idle_cpu(cpu)) { @@ -5427,7 +5427,7 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags) * When enqueuing a sched_entity, we must: * - Update loads to have both entity and cfs_rq synced with now. * - For group_entity, update its runnable_weight to reflect the new - * h_nr_running of its group cfs_rq. + * h_nr_queued of its group cfs_rq. * - For group_entity, update its weight to reflect the new share of * its group cfs_rq * - Add its new weight to cfs_rq->load.weight @@ -5583,7 +5583,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags) * When dequeuing a sched_entity, we must: * - Update loads to have both entity and cfs_rq synced with now. * - For group_entity, update its runnable_weight to reflect the new - * h_nr_running of its group cfs_rq. + * h_nr_queued of its group cfs_rq. * - Subtract its previous weight from cfs_rq->load.weight. * - For group entity, update its weight to reflect the new share * of its group cfs_rq. @@ -5985,8 +5985,8 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) struct rq *rq = rq_of(cfs_rq); struct cfs_bandwidth *cfs_b = tg_cfs_bandwidth(cfs_rq->tg); struct sched_entity *se; - long task_delta, idle_task_delta, delayed_delta, dequeue = 1; - long rq_h_nr_running = rq->cfs.h_nr_running; + long queued_delta, idle_task_delta, delayed_delta, dequeue = 1; + long rq_h_nr_queued = rq->cfs.h_nr_queued; raw_spin_lock(&cfs_b->lock); /* This will start the period timer if necessary */ @@ -6016,7 +6016,7 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) walk_tg_tree_from(cfs_rq->tg, tg_throttle_down, tg_nop, (void *)rq); rcu_read_unlock(); - task_delta = cfs_rq->h_nr_running; + queued_delta = cfs_rq->h_nr_queued; idle_task_delta = cfs_rq->idle_h_nr_running; delayed_delta = cfs_rq->h_nr_delayed; for_each_sched_entity(se) { @@ -6038,9 +6038,9 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) dequeue_entity(qcfs_rq, se, flags); if (cfs_rq_is_idle(group_cfs_rq(se))) - idle_task_delta = cfs_rq->h_nr_running; + idle_task_delta = cfs_rq->h_nr_queued; - qcfs_rq->h_nr_running -= task_delta; + qcfs_rq->h_nr_queued -= queued_delta; qcfs_rq->idle_h_nr_running -= idle_task_delta; qcfs_rq->h_nr_delayed -= delayed_delta; @@ -6061,18 +6061,18 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) se_update_runnable(se); if (cfs_rq_is_idle(group_cfs_rq(se))) - idle_task_delta = cfs_rq->h_nr_running; + idle_task_delta = cfs_rq->h_nr_queued; - qcfs_rq->h_nr_running -= task_delta; + qcfs_rq->h_nr_queued -= queued_delta; qcfs_rq->idle_h_nr_running -= idle_task_delta; qcfs_rq->h_nr_delayed -= delayed_delta; } /* At this point se is NULL and we are at root level*/ - sub_nr_running(rq, task_delta); + sub_nr_running(rq, queued_delta); /* Stop the fair server if throttling resulted in no runnable tasks */ - if (rq_h_nr_running && !rq->cfs.h_nr_running) + if (rq_h_nr_queued && !rq->cfs.h_nr_queued) dl_server_stop(&rq->fair_server); done: /* @@ -6091,8 +6091,8 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) struct rq *rq = rq_of(cfs_rq); struct cfs_bandwidth *cfs_b = tg_cfs_bandwidth(cfs_rq->tg); struct sched_entity *se; - long task_delta, idle_task_delta, delayed_delta; - long rq_h_nr_running = rq->cfs.h_nr_running; + long queued_delta, idle_task_delta, delayed_delta; + long rq_h_nr_queued = rq->cfs.h_nr_queued; se = cfs_rq->tg->se[cpu_of(rq)]; @@ -6125,7 +6125,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) goto unthrottle_throttle; } - task_delta = cfs_rq->h_nr_running; + queued_delta = cfs_rq->h_nr_queued; idle_task_delta = cfs_rq->idle_h_nr_running; delayed_delta = cfs_rq->h_nr_delayed; for_each_sched_entity(se) { @@ -6141,9 +6141,9 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) enqueue_entity(qcfs_rq, se, ENQUEUE_WAKEUP); if (cfs_rq_is_idle(group_cfs_rq(se))) - idle_task_delta = cfs_rq->h_nr_running; + idle_task_delta = cfs_rq->h_nr_queued; - qcfs_rq->h_nr_running += task_delta; + qcfs_rq->h_nr_queued += queued_delta; qcfs_rq->idle_h_nr_running += idle_task_delta; qcfs_rq->h_nr_delayed += delayed_delta; @@ -6159,9 +6159,9 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) se_update_runnable(se); if (cfs_rq_is_idle(group_cfs_rq(se))) - idle_task_delta = cfs_rq->h_nr_running; + idle_task_delta = cfs_rq->h_nr_queued; - qcfs_rq->h_nr_running += task_delta; + qcfs_rq->h_nr_queued += queued_delta; qcfs_rq->idle_h_nr_running += idle_task_delta; qcfs_rq->h_nr_delayed += delayed_delta; @@ -6171,11 +6171,11 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) } /* Start the fair server if un-throttling resulted in new runnable tasks */ - if (!rq_h_nr_running && rq->cfs.h_nr_running) + if (!rq_h_nr_queued && rq->cfs.h_nr_queued) dl_server_start(&rq->fair_server); /* At this point se is NULL and we are at root level*/ - add_nr_running(rq, task_delta); + add_nr_running(rq, queued_delta); unthrottle_throttle: assert_list_leaf_cfs_rq(rq); @@ -6890,7 +6890,7 @@ static void hrtick_start_fair(struct rq *rq, struct task_struct *p) SCHED_WARN_ON(task_rq(p) != rq); - if (rq->cfs.h_nr_running > 1) { + if (rq->cfs.h_nr_queued > 1) { u64 ran = se->sum_exec_runtime - se->prev_sum_exec_runtime; u64 slice = se->slice; s64 delta = slice - ran; @@ -7033,7 +7033,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) int idle_h_nr_running = task_has_idle_policy(p); int h_nr_delayed = 0; int task_new = !(flags & ENQUEUE_WAKEUP); - int rq_h_nr_running = rq->cfs.h_nr_running; + int rq_h_nr_queued = rq->cfs.h_nr_queued; u64 slice = 0; /* @@ -7081,7 +7081,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) enqueue_entity(cfs_rq, se, flags); slice = cfs_rq_min_slice(cfs_rq); - cfs_rq->h_nr_running++; + cfs_rq->h_nr_queued++; cfs_rq->idle_h_nr_running += idle_h_nr_running; cfs_rq->h_nr_delayed += h_nr_delayed; @@ -7107,7 +7107,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) min_vruntime_cb_propagate(&se->run_node, NULL); slice = cfs_rq_min_slice(cfs_rq); - cfs_rq->h_nr_running++; + cfs_rq->h_nr_queued++; cfs_rq->idle_h_nr_running += idle_h_nr_running; cfs_rq->h_nr_delayed += h_nr_delayed; @@ -7119,7 +7119,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) goto enqueue_throttle; } - if (!rq_h_nr_running && rq->cfs.h_nr_running) { + if (!rq_h_nr_queued && rq->cfs.h_nr_queued) { /* Account for idle runtime */ if (!rq->nr_running) dl_server_update_idle_time(rq, rq->curr); @@ -7166,19 +7166,19 @@ static void set_next_buddy(struct sched_entity *se); static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags) { bool was_sched_idle = sched_idle_rq(rq); - int rq_h_nr_running = rq->cfs.h_nr_running; + int rq_h_nr_queued = rq->cfs.h_nr_queued; bool task_sleep = flags & DEQUEUE_SLEEP; bool task_delayed = flags & DEQUEUE_DELAYED; struct task_struct *p = NULL; int idle_h_nr_running = 0; - int h_nr_running = 0; + int h_nr_queued = 0; int h_nr_delayed = 0; struct cfs_rq *cfs_rq; u64 slice = 0; if (entity_is_task(se)) { p = task_of(se); - h_nr_running = 1; + h_nr_queued = 1; idle_h_nr_running = task_has_idle_policy(p); if (!task_sleep && !task_delayed) h_nr_delayed = !!se->sched_delayed; @@ -7195,12 +7195,12 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags) break; } - cfs_rq->h_nr_running -= h_nr_running; + cfs_rq->h_nr_queued -= h_nr_queued; cfs_rq->idle_h_nr_running -= idle_h_nr_running; cfs_rq->h_nr_delayed -= h_nr_delayed; if (cfs_rq_is_idle(cfs_rq)) - idle_h_nr_running = h_nr_running; + idle_h_nr_running = h_nr_queued; /* end evaluation on encountering a throttled cfs_rq */ if (cfs_rq_throttled(cfs_rq)) @@ -7236,21 +7236,21 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags) min_vruntime_cb_propagate(&se->run_node, NULL); slice = cfs_rq_min_slice(cfs_rq); - cfs_rq->h_nr_running -= h_nr_running; + cfs_rq->h_nr_queued -= h_nr_queued; cfs_rq->idle_h_nr_running -= idle_h_nr_running; cfs_rq->h_nr_delayed -= h_nr_delayed; if (cfs_rq_is_idle(cfs_rq)) - idle_h_nr_running = h_nr_running; + idle_h_nr_running = h_nr_queued; /* end evaluation on encountering a throttled cfs_rq */ if (cfs_rq_throttled(cfs_rq)) return 0; } - sub_nr_running(rq, h_nr_running); + sub_nr_running(rq, h_nr_queued); - if (rq_h_nr_running && !rq->cfs.h_nr_running) + if (rq_h_nr_queued && !rq->cfs.h_nr_queued) dl_server_stop(&rq->fair_server); /* balance early to pull high priority tasks */ @@ -10394,7 +10394,7 @@ sched_reduced_capacity(struct rq *rq, struct sched_domain *sd) * When there is more than 1 task, the group_overloaded case already * takes care of cpu with reduced capacity */ - if (rq->cfs.h_nr_running != 1) + if (rq->cfs.h_nr_queued != 1) return false; return check_cpu_capacity(rq, sd); @@ -10429,7 +10429,7 @@ static inline void update_sg_lb_stats(struct lb_env *env, sgs->group_load += load; sgs->group_util += cpu_util_cfs(i); sgs->group_runnable += cpu_runnable(rq); - sgs->sum_h_nr_running += rq->cfs.h_nr_running; + sgs->sum_h_nr_running += rq->cfs.h_nr_queued; nr_running = rq->nr_running; sgs->sum_nr_running += nr_running; @@ -10744,7 +10744,7 @@ static inline void update_sg_wakeup_stats(struct sched_domain *sd, sgs->group_util += cpu_util_without(i, p); sgs->group_runnable += cpu_runnable_without(rq, p); local = task_running_on_cpu(i, p); - sgs->sum_h_nr_running += rq->cfs.h_nr_running - local; + sgs->sum_h_nr_running += rq->cfs.h_nr_queued - local; nr_running = rq->nr_running - local; sgs->sum_nr_running += nr_running; @@ -11526,7 +11526,7 @@ static struct rq *sched_balance_find_src_rq(struct lb_env *env, if (rt > env->fbq_type) continue; - nr_running = rq->cfs.h_nr_running; + nr_running = rq->cfs.h_nr_queued; if (!nr_running) continue; @@ -11685,7 +11685,7 @@ static int need_active_balance(struct lb_env *env) * available on dst_cpu. */ if (env->idle && - (env->src_rq->cfs.h_nr_running == 1)) { + (env->src_rq->cfs.h_nr_queued == 1)) { if ((check_cpu_capacity(env->src_rq, sd)) && (capacity_of(env->src_cpu)*sd->imbalance_pct < capacity_of(env->dst_cpu)*100)) return 1; @@ -12428,7 +12428,7 @@ static void nohz_balancer_kick(struct rq *rq) * If there's a runnable CFS task and the current CPU has reduced * capacity, kick the ILB to see if there's a better CPU to run on: */ - if (rq->cfs.h_nr_running >= 1 && check_cpu_capacity(rq, sd)) { + if (rq->cfs.h_nr_queued >= 1 && check_cpu_capacity(rq, sd)) { flags = NOHZ_STATS_KICK | NOHZ_BALANCE_KICK; goto unlock; } @@ -12926,11 +12926,11 @@ static int sched_balance_newidle(struct rq *this_rq, struct rq_flags *rf) * have been enqueued in the meantime. Since we're not going idle, * pretend we pulled a task. */ - if (this_rq->cfs.h_nr_running && !pulled_task) + if (this_rq->cfs.h_nr_queued && !pulled_task) pulled_task = 1; /* Is there a task of a high priority class? */ - if (this_rq->nr_running != this_rq->cfs.h_nr_running) + if (this_rq->nr_running != this_rq->cfs.h_nr_queued) pulled_task = -1; out: @@ -13617,7 +13617,7 @@ int sched_group_set_idle(struct task_group *tg, long idle) parent_cfs_rq->idle_nr_running--; } - idle_task_delta = grp_cfs_rq->h_nr_running - + idle_task_delta = grp_cfs_rq->h_nr_queued - grp_cfs_rq->idle_h_nr_running; if (!cfs_rq_is_idle(grp_cfs_rq)) idle_task_delta *= -1; diff --git a/kernel/sched/pelt.c b/kernel/sched/pelt.c index 171a802420a10..8189a35e53fe1 100644 --- a/kernel/sched/pelt.c +++ b/kernel/sched/pelt.c @@ -275,7 +275,7 @@ ___update_load_avg(struct sched_avg *sa, unsigned long load) * * group: [ see update_cfs_group() ] * se_weight() = tg->weight * grq->load_avg / tg->load_avg - * se_runnable() = grq->h_nr_running + * se_runnable() = grq->h_nr_queued * * runnable_sum = se_runnable() * runnable = grq->runnable_sum * runnable_avg = runnable_sum @@ -321,7 +321,7 @@ int __update_load_avg_cfs_rq(u64 now, struct cfs_rq *cfs_rq) { if (___update_load_sum(now, &cfs_rq->avg, scale_load_down(cfs_rq->load.weight), - cfs_rq->h_nr_running - cfs_rq->h_nr_delayed, + cfs_rq->h_nr_queued - cfs_rq->h_nr_delayed, cfs_rq->curr != NULL)) { ___update_load_avg(&cfs_rq->avg, 1); diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index d79de755c1c26..dc338f4f911dd 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -651,7 +651,7 @@ struct balance_callback { struct cfs_rq { struct load_weight load; unsigned int nr_running; - unsigned int h_nr_running; /* SCHED_{NORMAL,BATCH,IDLE} */ + unsigned int h_nr_queued; /* SCHED_{NORMAL,BATCH,IDLE} */ unsigned int idle_nr_running; /* SCHED_IDLE */ unsigned int idle_h_nr_running; /* SCHED_IDLE */ unsigned int h_nr_delayed; @@ -907,7 +907,7 @@ static inline void se_update_runnable(struct sched_entity *se) if (!entity_is_task(se)) { struct cfs_rq *cfs_rq = se->my_q; - se->runnable_weight = cfs_rq->h_nr_running - cfs_rq->h_nr_delayed; + se->runnable_weight = cfs_rq->h_nr_queued - cfs_rq->h_nr_delayed; } } -- GitLab From 3edcabcfc253cc9365f32cda2f43ecad12ef09ce Mon Sep 17 00:00:00 2001 From: Vincent Guittot Date: Mon, 2 Dec 2024 18:45:59 +0100 Subject: [PATCH 1968/2211] sched/fair: Add new cfs_rq.h_nr_runnable [ Upstream commit c2a295bffeaf9461ecba76dc9e4780c898c94f03 ] With delayed dequeued feature, a sleeping sched_entity remains queued in the rq until its lag has elapsed. As a result, it stays also visible in the statistics that are used to balance the system and in particular the field cfs.h_nr_queued when the sched_entity is associated to a task. Create a new h_nr_runnable that tracks only queued and runnable tasks. Signed-off-by: Vincent Guittot Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Dietmar Eggemann Link: https://lore.kernel.org/r/20241202174606.4074512-5-vincent.guittot@linaro.org Stable-dep-of: aa3ee4f0b754 ("sched/fair: Fixup wake_up_sync() vs DELAYED_DEQUEUE") Signed-off-by: Sasha Levin --- kernel/sched/debug.c | 1 + kernel/sched/fair.c | 20 ++++++++++++++++++-- kernel/sched/sched.h | 1 + 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c index 7cf0c138c78e5..9815f9a0cd592 100644 --- a/kernel/sched/debug.c +++ b/kernel/sched/debug.c @@ -843,6 +843,7 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) spread = right_vruntime - left_vruntime; SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "spread", SPLIT_NS(spread)); SEQ_printf(m, " .%-30s: %d\n", "nr_running", cfs_rq->nr_running); + SEQ_printf(m, " .%-30s: %d\n", "h_nr_runnable", cfs_rq->h_nr_runnable); SEQ_printf(m, " .%-30s: %d\n", "h_nr_queued", cfs_rq->h_nr_queued); SEQ_printf(m, " .%-30s: %d\n", "h_nr_delayed", cfs_rq->h_nr_delayed); SEQ_printf(m, " .%-30s: %d\n", "idle_nr_running", diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 33438b6c35478..47ff4856561ea 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -5511,6 +5511,7 @@ static void set_delayed(struct sched_entity *se) for_each_sched_entity(se) { struct cfs_rq *cfs_rq = cfs_rq_of(se); + cfs_rq->h_nr_runnable--; cfs_rq->h_nr_delayed++; if (cfs_rq_throttled(cfs_rq)) break; @@ -5533,6 +5534,7 @@ static void clear_delayed(struct sched_entity *se) for_each_sched_entity(se) { struct cfs_rq *cfs_rq = cfs_rq_of(se); + cfs_rq->h_nr_runnable++; cfs_rq->h_nr_delayed--; if (cfs_rq_throttled(cfs_rq)) break; @@ -5985,7 +5987,7 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) struct rq *rq = rq_of(cfs_rq); struct cfs_bandwidth *cfs_b = tg_cfs_bandwidth(cfs_rq->tg); struct sched_entity *se; - long queued_delta, idle_task_delta, delayed_delta, dequeue = 1; + long queued_delta, runnable_delta, idle_task_delta, delayed_delta, dequeue = 1; long rq_h_nr_queued = rq->cfs.h_nr_queued; raw_spin_lock(&cfs_b->lock); @@ -6017,6 +6019,7 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) rcu_read_unlock(); queued_delta = cfs_rq->h_nr_queued; + runnable_delta = cfs_rq->h_nr_runnable; idle_task_delta = cfs_rq->idle_h_nr_running; delayed_delta = cfs_rq->h_nr_delayed; for_each_sched_entity(se) { @@ -6041,6 +6044,7 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) idle_task_delta = cfs_rq->h_nr_queued; qcfs_rq->h_nr_queued -= queued_delta; + qcfs_rq->h_nr_runnable -= runnable_delta; qcfs_rq->idle_h_nr_running -= idle_task_delta; qcfs_rq->h_nr_delayed -= delayed_delta; @@ -6064,6 +6068,7 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) idle_task_delta = cfs_rq->h_nr_queued; qcfs_rq->h_nr_queued -= queued_delta; + qcfs_rq->h_nr_runnable -= runnable_delta; qcfs_rq->idle_h_nr_running -= idle_task_delta; qcfs_rq->h_nr_delayed -= delayed_delta; } @@ -6091,7 +6096,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) struct rq *rq = rq_of(cfs_rq); struct cfs_bandwidth *cfs_b = tg_cfs_bandwidth(cfs_rq->tg); struct sched_entity *se; - long queued_delta, idle_task_delta, delayed_delta; + long queued_delta, runnable_delta, idle_task_delta, delayed_delta; long rq_h_nr_queued = rq->cfs.h_nr_queued; se = cfs_rq->tg->se[cpu_of(rq)]; @@ -6126,6 +6131,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) } queued_delta = cfs_rq->h_nr_queued; + runnable_delta = cfs_rq->h_nr_runnable; idle_task_delta = cfs_rq->idle_h_nr_running; delayed_delta = cfs_rq->h_nr_delayed; for_each_sched_entity(se) { @@ -6144,6 +6150,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) idle_task_delta = cfs_rq->h_nr_queued; qcfs_rq->h_nr_queued += queued_delta; + qcfs_rq->h_nr_runnable += runnable_delta; qcfs_rq->idle_h_nr_running += idle_task_delta; qcfs_rq->h_nr_delayed += delayed_delta; @@ -6162,6 +6169,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) idle_task_delta = cfs_rq->h_nr_queued; qcfs_rq->h_nr_queued += queued_delta; + qcfs_rq->h_nr_runnable += runnable_delta; qcfs_rq->idle_h_nr_running += idle_task_delta; qcfs_rq->h_nr_delayed += delayed_delta; @@ -7081,6 +7089,8 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) enqueue_entity(cfs_rq, se, flags); slice = cfs_rq_min_slice(cfs_rq); + if (!h_nr_delayed) + cfs_rq->h_nr_runnable++; cfs_rq->h_nr_queued++; cfs_rq->idle_h_nr_running += idle_h_nr_running; cfs_rq->h_nr_delayed += h_nr_delayed; @@ -7107,6 +7117,8 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) min_vruntime_cb_propagate(&se->run_node, NULL); slice = cfs_rq_min_slice(cfs_rq); + if (!h_nr_delayed) + cfs_rq->h_nr_runnable++; cfs_rq->h_nr_queued++; cfs_rq->idle_h_nr_running += idle_h_nr_running; cfs_rq->h_nr_delayed += h_nr_delayed; @@ -7195,6 +7207,8 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags) break; } + if (!h_nr_delayed) + cfs_rq->h_nr_runnable -= h_nr_queued; cfs_rq->h_nr_queued -= h_nr_queued; cfs_rq->idle_h_nr_running -= idle_h_nr_running; cfs_rq->h_nr_delayed -= h_nr_delayed; @@ -7236,6 +7250,8 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags) min_vruntime_cb_propagate(&se->run_node, NULL); slice = cfs_rq_min_slice(cfs_rq); + if (!h_nr_delayed) + cfs_rq->h_nr_runnable -= h_nr_queued; cfs_rq->h_nr_queued -= h_nr_queued; cfs_rq->idle_h_nr_running -= idle_h_nr_running; cfs_rq->h_nr_delayed -= h_nr_delayed; diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index dc338f4f911dd..e7f5ab21221c4 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -652,6 +652,7 @@ struct cfs_rq { struct load_weight load; unsigned int nr_running; unsigned int h_nr_queued; /* SCHED_{NORMAL,BATCH,IDLE} */ + unsigned int h_nr_runnable; /* SCHED_{NORMAL,BATCH,IDLE} */ unsigned int idle_nr_running; /* SCHED_IDLE */ unsigned int idle_h_nr_running; /* SCHED_IDLE */ unsigned int h_nr_delayed; -- GitLab From a2562bdd35e972dac77af39d08b8e51c45e80a8c Mon Sep 17 00:00:00 2001 From: Xuewen Yan Date: Mon, 3 Mar 2025 18:52:39 +0800 Subject: [PATCH 1969/2211] sched/fair: Fixup wake_up_sync() vs DELAYED_DEQUEUE [ Upstream commit aa3ee4f0b7541382c9f6f43f7408d73a5d4f4042 ] Delayed dequeued feature keeps a sleeping task enqueued until its lag has elapsed. As a result, it stays also visible in rq->nr_running. So when in wake_affine_idle(), we should use the real running-tasks in rq to check whether we should place the wake-up task to current cpu. On the other hand, add a helper function to return the nr-delayed. Fixes: 152e11f6df29 ("sched/fair: Implement delayed dequeue") Signed-off-by: Xuewen Yan Reviewed-and-tested-by: Tianchen Ding Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Vincent Guittot Link: https://lore.kernel.org/r/20250303105241.17251-2-xuewen.yan@unisoc.com Signed-off-by: Sasha Levin --- kernel/sched/fair.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 47ff4856561ea..7280ed04c96ce 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -7313,6 +7313,11 @@ static bool dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags) return true; } +static inline unsigned int cfs_h_nr_delayed(struct rq *rq) +{ + return (rq->cfs.h_nr_queued - rq->cfs.h_nr_runnable); +} + #ifdef CONFIG_SMP /* Working cpumask for: sched_balance_rq(), sched_balance_newidle(). */ @@ -7474,8 +7479,12 @@ wake_affine_idle(int this_cpu, int prev_cpu, int sync) if (available_idle_cpu(this_cpu) && cpus_share_cache(this_cpu, prev_cpu)) return available_idle_cpu(prev_cpu) ? prev_cpu : this_cpu; - if (sync && cpu_rq(this_cpu)->nr_running == 1) - return this_cpu; + if (sync) { + struct rq *rq = cpu_rq(this_cpu); + + if ((rq->nr_running - cfs_h_nr_delayed(rq)) == 1) + return this_cpu; + } if (available_idle_cpu(prev_cpu)) return prev_cpu; -- GitLab From 519aed5bdab7f41a256b7eeafb8fb7a430afc889 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Wed, 26 Mar 2025 22:21:08 +0100 Subject: [PATCH 1970/2211] gfs2: Move gfs2_trans_add_databufs [ Upstream commit d50a64e3c55e59e45e415c65531b0d76ad4cea36 ] Move gfs2_trans_add_databufs() to trans.c. Pass in a glock instead of a gfs2_inode. Signed-off-by: Andreas Gruenbacher Stable-dep-of: 5a90f8d49922 ("gfs2: Don't start unnecessary transactions during log flush") Signed-off-by: Sasha Levin --- fs/gfs2/aops.c | 23 +---------------------- fs/gfs2/aops.h | 2 -- fs/gfs2/bmap.c | 3 ++- fs/gfs2/trans.c | 21 +++++++++++++++++++++ fs/gfs2/trans.h | 2 ++ 5 files changed, 26 insertions(+), 25 deletions(-) diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index 68fc8af14700d..ed2c708a215a4 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -37,27 +37,6 @@ #include "aops.h" -void gfs2_trans_add_databufs(struct gfs2_inode *ip, struct folio *folio, - size_t from, size_t len) -{ - struct buffer_head *head = folio_buffers(folio); - unsigned int bsize = head->b_size; - struct buffer_head *bh; - size_t to = from + len; - size_t start, end; - - for (bh = head, start = 0; bh != head || !start; - bh = bh->b_this_page, start = end) { - end = start + bsize; - if (end <= from) - continue; - if (start >= to) - break; - set_buffer_uptodate(bh); - gfs2_trans_add_data(ip->i_gl, bh); - } -} - /** * gfs2_get_block_noalloc - Fills in a buffer head with details about a block * @inode: The inode @@ -133,7 +112,7 @@ static int __gfs2_jdata_write_folio(struct folio *folio, inode->i_sb->s_blocksize, BIT(BH_Dirty)|BIT(BH_Uptodate)); } - gfs2_trans_add_databufs(ip, folio, 0, folio_size(folio)); + gfs2_trans_add_databufs(ip->i_gl, folio, 0, folio_size(folio)); } return gfs2_write_jdata_folio(folio, wbc); } diff --git a/fs/gfs2/aops.h b/fs/gfs2/aops.h index a10c4334d2489..f9fa41aaeaf41 100644 --- a/fs/gfs2/aops.h +++ b/fs/gfs2/aops.h @@ -9,7 +9,5 @@ #include "incore.h" void adjust_fs_space(struct inode *inode); -void gfs2_trans_add_databufs(struct gfs2_inode *ip, struct folio *folio, - size_t from, size_t len); #endif /* __AOPS_DOT_H__ */ diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 1795c4e8dbf66..28ad07b003484 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -988,7 +988,8 @@ static void gfs2_iomap_put_folio(struct inode *inode, loff_t pos, struct gfs2_sbd *sdp = GFS2_SB(inode); if (!gfs2_is_stuffed(ip)) - gfs2_trans_add_databufs(ip, folio, offset_in_folio(folio, pos), + gfs2_trans_add_databufs(ip->i_gl, folio, + offset_in_folio(folio, pos), copied); folio_unlock(folio); diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c index 192213c7359af..42cf8c5204db4 100644 --- a/fs/gfs2/trans.c +++ b/fs/gfs2/trans.c @@ -226,6 +226,27 @@ out: unlock_buffer(bh); } +void gfs2_trans_add_databufs(struct gfs2_glock *gl, struct folio *folio, + size_t from, size_t len) +{ + struct buffer_head *head = folio_buffers(folio); + unsigned int bsize = head->b_size; + struct buffer_head *bh; + size_t to = from + len; + size_t start, end; + + for (bh = head, start = 0; bh != head || !start; + bh = bh->b_this_page, start = end) { + end = start + bsize; + if (end <= from) + continue; + if (start >= to) + break; + set_buffer_uptodate(bh); + gfs2_trans_add_data(gl, bh); + } +} + void gfs2_trans_add_meta(struct gfs2_glock *gl, struct buffer_head *bh) { diff --git a/fs/gfs2/trans.h b/fs/gfs2/trans.h index f8ce5302280d3..790c55f59e612 100644 --- a/fs/gfs2/trans.h +++ b/fs/gfs2/trans.h @@ -42,6 +42,8 @@ int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks, void gfs2_trans_end(struct gfs2_sbd *sdp); void gfs2_trans_add_data(struct gfs2_glock *gl, struct buffer_head *bh); +void gfs2_trans_add_databufs(struct gfs2_glock *gl, struct folio *folio, + size_t from, size_t len); void gfs2_trans_add_meta(struct gfs2_glock *gl, struct buffer_head *bh); void gfs2_trans_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd); void gfs2_trans_remove_revoke(struct gfs2_sbd *sdp, u64 blkno, unsigned int len); -- GitLab From 9468bcd92d6411763a1b484fd498465db8425ff7 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 28 Mar 2025 22:47:02 +0100 Subject: [PATCH 1971/2211] gfs2: Don't start unnecessary transactions during log flush [ Upstream commit 5a90f8d499225512a385585ffe3e28f687263d47 ] Commit 8d391972ae2d ("gfs2: Remove __gfs2_writepage()") changed the log flush code in gfs2_ail1_start_one() to call aops->writepages() instead of aops->writepage(). For jdata inodes, this means that we will now try to reserve log space and start a transaction before we can determine that the pages in question have already been journaled. When this happens in the context of gfs2_logd(), it can now appear that not enough log space is available for freeing up log space, and we will lock up. Fix that by issuing journal writes directly instead of going through aops->writepages() in the log flush code. Fixes: 8d391972ae2d ("gfs2: Remove __gfs2_writepage()") Signed-off-by: Andreas Gruenbacher Signed-off-by: Sasha Levin --- fs/gfs2/aops.c | 31 +++++++++++++++++++++++++++++++ fs/gfs2/aops.h | 1 + fs/gfs2/log.c | 7 ++++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index ed2c708a215a4..eb4270e82ef8e 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -117,6 +117,37 @@ static int __gfs2_jdata_write_folio(struct folio *folio, return gfs2_write_jdata_folio(folio, wbc); } +/** + * gfs2_jdata_writeback - Write jdata folios to the log + * @mapping: The mapping to write + * @wbc: The writeback control + * + * Returns: errno + */ +int gfs2_jdata_writeback(struct address_space *mapping, struct writeback_control *wbc) +{ + struct inode *inode = mapping->host; + struct gfs2_inode *ip = GFS2_I(inode); + struct gfs2_sbd *sdp = GFS2_SB(mapping->host); + struct folio *folio = NULL; + int error; + + BUG_ON(current->journal_info); + if (gfs2_assert_withdraw(sdp, ip->i_gl->gl_state == LM_ST_EXCLUSIVE)) + return 0; + + while ((folio = writeback_iter(mapping, wbc, folio, &error))) { + if (folio_test_checked(folio)) { + folio_redirty_for_writepage(wbc, folio); + folio_unlock(folio); + continue; + } + error = __gfs2_jdata_write_folio(folio, wbc); + } + + return error; +} + /** * gfs2_writepages - Write a bunch of dirty pages back to disk * @mapping: The mapping to write diff --git a/fs/gfs2/aops.h b/fs/gfs2/aops.h index f9fa41aaeaf41..bf002522a7822 100644 --- a/fs/gfs2/aops.h +++ b/fs/gfs2/aops.h @@ -9,5 +9,6 @@ #include "incore.h" void adjust_fs_space(struct inode *inode); +int gfs2_jdata_writeback(struct address_space *mapping, struct writeback_control *wbc); #endif /* __AOPS_DOT_H__ */ diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c index f9c5089783d24..115c4ac457e90 100644 --- a/fs/gfs2/log.c +++ b/fs/gfs2/log.c @@ -31,6 +31,7 @@ #include "dir.h" #include "trace_gfs2.h" #include "trans.h" +#include "aops.h" static void gfs2_log_shutdown(struct gfs2_sbd *sdp); @@ -131,7 +132,11 @@ __acquires(&sdp->sd_ail_lock) if (!mapping) continue; spin_unlock(&sdp->sd_ail_lock); - ret = mapping->a_ops->writepages(mapping, wbc); + BUG_ON(GFS2_SB(mapping->host) != sdp); + if (gfs2_is_jdata(GFS2_I(mapping->host))) + ret = gfs2_jdata_writeback(mapping, wbc); + else + ret = mapping->a_ops->writepages(mapping, wbc); if (need_resched()) { blk_finish_plug(plug); cond_resched(); -- GitLab From d1f8358c5d359c0563d5cf788265a617d338cb26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Povi=C5=A1er?= Date: Thu, 27 Feb 2025 22:07:30 +1000 Subject: [PATCH 1972/2211] ASoC: tas2764: Extend driver to SN012776 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit ad18392962df46a858432839cc6bcaf2ede7cc86 ] SN012776 is a speaker amp chip found in Apple's 2021 laptops. It appears similar and more-or-less compatible to TAS2764. Extend the TAS2764 driver with some SN012776 specifics and configure the chip assuming it's in one of the Apple machines. Reviewed-by: Neal Gompa Signed-off-by: Martin Povišer Signed-off-by: James Calligeros Link: https://patch.msgid.link/20250227-apple-codec-changes-v3-3-cbb130030acf@gmail.com Signed-off-by: Mark Brown Stable-dep-of: 592ab3936b09 ("ASoC: tas2764: Reinit cache on part reset") Signed-off-by: Sasha Levin --- sound/soc/codecs/tas2764.c | 43 +++++++++++++++++++++++++++++++++++--- sound/soc/codecs/tas2764.h | 3 +++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c index 4326555aac032..fb34d029f7a6d 100644 --- a/sound/soc/codecs/tas2764.c +++ b/sound/soc/codecs/tas2764.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -23,6 +24,11 @@ #include "tas2764.h" +enum tas2764_devid { + DEVID_TAS2764 = 0, + DEVID_SN012776 = 1 +}; + struct tas2764_priv { struct snd_soc_component *component; struct gpio_desc *reset_gpio; @@ -30,7 +36,8 @@ struct tas2764_priv { struct regmap *regmap; struct device *dev; int irq; - + enum tas2764_devid devid; + int v_sense_slot; int i_sense_slot; @@ -525,10 +532,16 @@ static struct snd_soc_dai_driver tas2764_dai_driver[] = { }, }; +static uint8_t sn012776_bop_presets[] = { + 0x01, 0x32, 0x02, 0x22, 0x83, 0x2d, 0x80, 0x02, 0x06, + 0x32, 0x46, 0x30, 0x02, 0x06, 0x38, 0x40, 0x30, 0x02, + 0x06, 0x3e, 0x37, 0x30, 0xff, 0xe6 +}; + static int tas2764_codec_probe(struct snd_soc_component *component) { struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(component); - int ret; + int ret, i; tas2764->component = component; @@ -577,6 +590,27 @@ static int tas2764_codec_probe(struct snd_soc_component *component) if (ret < 0) return ret; + switch (tas2764->devid) { + case DEVID_SN012776: + ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL, + TAS2764_PWR_CTRL_BOP_SRC, + TAS2764_PWR_CTRL_BOP_SRC); + if (ret < 0) + return ret; + + for (i = 0; i < ARRAY_SIZE(sn012776_bop_presets); i++) { + ret = snd_soc_component_write(component, + TAS2764_BOP_CFG0 + i, + sn012776_bop_presets[i]); + + if (ret < 0) + return ret; + } + break; + default: + break; + } + return 0; } @@ -708,6 +742,8 @@ static int tas2764_i2c_probe(struct i2c_client *client) if (!tas2764) return -ENOMEM; + tas2764->devid = (enum tas2764_devid)of_device_get_match_data(&client->dev); + tas2764->dev = &client->dev; tas2764->irq = client->irq; i2c_set_clientdata(client, tas2764); @@ -744,7 +780,8 @@ MODULE_DEVICE_TABLE(i2c, tas2764_i2c_id); #if defined(CONFIG_OF) static const struct of_device_id tas2764_of_match[] = { - { .compatible = "ti,tas2764" }, + { .compatible = "ti,tas2764", .data = (void *)DEVID_TAS2764 }, + { .compatible = "ti,sn012776", .data = (void *)DEVID_SN012776 }, {}, }; MODULE_DEVICE_TABLE(of, tas2764_of_match); diff --git a/sound/soc/codecs/tas2764.h b/sound/soc/codecs/tas2764.h index 9490f2686e389..69c0f91cb4239 100644 --- a/sound/soc/codecs/tas2764.h +++ b/sound/soc/codecs/tas2764.h @@ -29,6 +29,7 @@ #define TAS2764_PWR_CTRL_ACTIVE 0x0 #define TAS2764_PWR_CTRL_MUTE BIT(0) #define TAS2764_PWR_CTRL_SHUTDOWN BIT(1) +#define TAS2764_PWR_CTRL_BOP_SRC BIT(7) #define TAS2764_VSENSE_POWER_EN 3 #define TAS2764_ISENSE_POWER_EN 4 @@ -116,4 +117,6 @@ #define TAS2764_INT_CLK_CFG TAS2764_REG(0x0, 0x5c) #define TAS2764_INT_CLK_CFG_IRQZ_CLR BIT(2) +#define TAS2764_BOP_CFG0 TAS2764_REG(0X0, 0x1d) + #endif /* __TAS2764__ */ -- GitLab From da45b381aafa8223fdb0b13e76e1dbf71f7d7c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Povi=C5=A1er?= Date: Sun, 6 Apr 2025 09:15:07 +1000 Subject: [PATCH 1973/2211] ASoC: tas2764: Reinit cache on part reset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 592ab3936b096da5deb64d4c906edbeb989174d6 ] When the part is reset in component_probe, do not forget to reinit the regcache, otherwise the cache can get out of sync with the part's actual state. This fix is similar to commit 0a0342ede303 ("ASoC: tas2770: Reinit regcache on reset") which concerned the tas2770 driver. Fixes: 827ed8a0fa50 ("ASoC: tas2764: Add the driver for the TAS2764") Reviewed-by: Neal Gompa Signed-off-by: Martin Povišer Signed-off-by: James Calligeros Link: https://patch.msgid.link/20250406-apple-codec-changes-v5-3-50a00ec850a3@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/codecs/tas2764.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c index fb34d029f7a6d..e8fbe8a399f6d 100644 --- a/sound/soc/codecs/tas2764.c +++ b/sound/soc/codecs/tas2764.c @@ -538,6 +538,8 @@ static uint8_t sn012776_bop_presets[] = { 0x06, 0x3e, 0x37, 0x30, 0xff, 0xe6 }; +static const struct regmap_config tas2764_i2c_regmap; + static int tas2764_codec_probe(struct snd_soc_component *component) { struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(component); @@ -551,6 +553,7 @@ static int tas2764_codec_probe(struct snd_soc_component *component) } tas2764_reset(tas2764); + regmap_reinit_cache(tas2764->regmap, &tas2764_i2c_regmap); if (tas2764->irq) { ret = snd_soc_component_write(tas2764->component, TAS2764_INT_MASK0, 0x00); -- GitLab From 0c44a409580323775df96fc6b37ee1a9d9ec3898 Mon Sep 17 00:00:00 2001 From: xueqin Luo Date: Sat, 8 Feb 2025 09:33:35 +0800 Subject: [PATCH 1974/2211] ACPI: thermal: Fix stale comment regarding trip points [ Upstream commit 01ca2846338d314cdcd3da1aca7f290ec380542c ] Update the comment next to acpi_thermal_get_trip_points() call site in acpi_thermal_add() to reflect what the code does. It has diverged from the code after changes that removed the _CRT evaluation from acpi_thermal_get_trip_points() among other things. Signed-off-by: xueqin Luo Link: https://patch.msgid.link/20250208013335.126343-1-luoxueqin@kylinos.cn [ rjw: Subject and changelog edits ] Signed-off-by: Rafael J. Wysocki Stable-dep-of: 3f7cd28ae3d1 ("ACPI: thermal: Execute _SCP before reading trip points") Signed-off-by: Sasha Levin --- drivers/acpi/thermal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 78db38c7076e4..dbc371ac2fa66 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c @@ -803,7 +803,7 @@ static int acpi_thermal_add(struct acpi_device *device) acpi_thermal_aml_dependency_fix(tz); - /* Get trip points [_CRT, _PSV, etc.] (required). */ + /* Get trip points [_ACi, _PSV, etc.] (required). */ acpi_thermal_get_trip_points(tz); crit_temp = acpi_thermal_get_critical_trip(tz); -- GitLab From b24c3c5b421eff974e40c136816623e0b52e9c8b Mon Sep 17 00:00:00 2001 From: Armin Wolf Date: Thu, 10 Apr 2025 18:54:55 +0200 Subject: [PATCH 1975/2211] ACPI: thermal: Execute _SCP before reading trip points [ Upstream commit 3f7cd28ae3d1a1d6f151178469cfaef1b07fdbcc ] As specified in section 11.4.13 of the ACPI specification the operating system is required to evaluate the _ACx and _PSV objects after executing the _SCP control method. Move the execution of the _SCP control method before the invocation of acpi_thermal_get_trip_points() to avoid missing updates to the _ACx and _PSV objects. Fixes: b09872a652d3 ("ACPI: thermal: Fold acpi_thermal_get_info() into its caller") Signed-off-by: Armin Wolf Link: https://patch.msgid.link/20250410165456.4173-3-W_Armin@gmx.de Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/thermal.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index dbc371ac2fa66..125d7df8f30ae 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c @@ -803,6 +803,12 @@ static int acpi_thermal_add(struct acpi_device *device) acpi_thermal_aml_dependency_fix(tz); + /* + * Set the cooling mode [_SCP] to active cooling. This needs to happen before + * we retrieve the trip point values. + */ + acpi_execute_simple_method(tz->device->handle, "_SCP", ACPI_THERMAL_MODE_ACTIVE); + /* Get trip points [_ACi, _PSV, etc.] (required). */ acpi_thermal_get_trip_points(tz); @@ -814,10 +820,6 @@ static int acpi_thermal_add(struct acpi_device *device) if (result) goto free_memory; - /* Set the cooling mode [_SCP] to active cooling. */ - acpi_execute_simple_method(tz->device->handle, "_SCP", - ACPI_THERMAL_MODE_ACTIVE); - /* Determine the default polling frequency [_TZP]. */ if (tzp) tz->polling_frequency = tzp; -- GitLab From b77a5ecb3d3baac85fcbf841b27b5ef7024a533f Mon Sep 17 00:00:00 2001 From: Cosmin Ratiu Date: Fri, 11 Apr 2025 10:49:57 +0300 Subject: [PATCH 1976/2211] bonding: Mark active offloaded xfrm_states [ Upstream commit fd4e41ebf66cb8b43de2f640b97314c4ee3b4499 ] When the active link is changed for a bond device, the existing xfrm states need to be migrated over to the new link. This is done with: - bond_ipsec_del_sa_all() goes through the offloaded states list and removes all of them from hw. - bond_ipsec_add_sa_all() re-offloads all states to the new device. But because the offload status of xfrm states isn't marked in any way, there can be bugs. When all bond links are down, bond_ipsec_del_sa_all() unoffloads everything from the previous active link. If the same link then comes back up, nothing gets reoffloaded by bond_ipsec_add_sa_all(). This results in a stack trace like this a bit later when user space removes the offloaded rules, because mlx5e_xfrm_del_state() is asked to remove a rule that's no longer offloaded: [] Call Trace: [] [] ? __warn+0x7d/0x110 [] ? mlx5e_xfrm_del_state+0x90/0xa0 [mlx5_core] [] ? report_bug+0x16d/0x180 [] ? handle_bug+0x4f/0x90 [] ? exc_invalid_op+0x14/0x70 [] ? asm_exc_invalid_op+0x16/0x20 [] ? mlx5e_xfrm_del_state+0x73/0xa0 [mlx5_core] [] ? mlx5e_xfrm_del_state+0x90/0xa0 [mlx5_core] [] bond_ipsec_del_sa+0x1ab/0x200 [bonding] [] xfrm_dev_state_delete+0x1f/0x60 [] __xfrm_state_delete+0x196/0x200 [] xfrm_state_delete+0x21/0x40 [] xfrm_del_sa+0x69/0x110 [] xfrm_user_rcv_msg+0x11d/0x300 [] ? release_pages+0xca/0x140 [] ? copy_to_user_tmpl.part.0+0x110/0x110 [] netlink_rcv_skb+0x54/0x100 [] xfrm_netlink_rcv+0x31/0x40 [] netlink_unicast+0x1fc/0x2d0 [] netlink_sendmsg+0x1e4/0x410 [] __sock_sendmsg+0x38/0x60 [] sock_write_iter+0x94/0xf0 [] vfs_write+0x338/0x3f0 [] ksys_write+0xba/0xd0 [] do_syscall_64+0x4c/0x100 [] entry_SYSCALL_64_after_hwframe+0x4b/0x53 There's also another theoretical bug: Calling bond_ipsec_del_sa_all() multiple times can result in corruption in the driver implementation if the double-free isn't tolerated. This isn't nice. Before the "Fixes" commit, xs->xso.real_dev was set to NULL when an xfrm state was unoffloaded from a device, but a race with netdevsim's .xdo_dev_offload_ok() accessing real_dev was considered a sufficient reason to not set real_dev to NULL anymore. This unfortunately introduced the new bugs. Since .xdo_dev_offload_ok() was significantly refactored by [1] and there are no more users in the stack of xso.real_dev, that race is now gone and xs->xso.real_dev can now once again be used to represent which device (if any) currently holds the offloaded rule. Go one step further and set real_dev after add/before delete calls, to catch any future driver misuses of real_dev. [1] https://lore.kernel.org/netdev/cover.1739972570.git.leon@kernel.org/ Fixes: f8cde9805981 ("bonding: fix xfrm real_dev null pointer dereference") Signed-off-by: Cosmin Ratiu Reviewed-by: Leon Romanovsky Reviewed-by: Nikolay Aleksandrov Reviewed-by: Hangbin Liu Tested-by: Hangbin Liu Signed-off-by: Steffen Klassert Signed-off-by: Sasha Levin --- drivers/net/bonding/bond_main.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 2a513dbbd9756..52ff0f9e04e07 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -497,9 +497,9 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs, goto out; } - xs->xso.real_dev = real_dev; err = real_dev->xfrmdev_ops->xdo_dev_state_add(xs, extack); if (!err) { + xs->xso.real_dev = real_dev; ipsec->xs = xs; INIT_LIST_HEAD(&ipsec->list); mutex_lock(&bond->ipsec_lock); @@ -541,11 +541,11 @@ static void bond_ipsec_add_sa_all(struct bonding *bond) if (ipsec->xs->xso.real_dev == real_dev) continue; - ipsec->xs->xso.real_dev = real_dev; if (real_dev->xfrmdev_ops->xdo_dev_state_add(ipsec->xs, NULL)) { slave_warn(bond_dev, real_dev, "%s: failed to add SA\n", __func__); - ipsec->xs->xso.real_dev = NULL; + continue; } + ipsec->xs->xso.real_dev = real_dev; } out: mutex_unlock(&bond->ipsec_lock); @@ -627,6 +627,7 @@ static void bond_ipsec_del_sa_all(struct bonding *bond) "%s: no slave xdo_dev_state_delete\n", __func__); } else { + ipsec->xs->xso.real_dev = NULL; real_dev->xfrmdev_ops->xdo_dev_state_delete(ipsec->xs); if (real_dev->xfrmdev_ops->xdo_dev_state_free) real_dev->xfrmdev_ops->xdo_dev_state_free(ipsec->xs); @@ -661,6 +662,7 @@ static void bond_ipsec_free_sa(struct xfrm_state *xs) WARN_ON(xs->xso.real_dev != real_dev); + xs->xso.real_dev = NULL; if (real_dev && real_dev->xfrmdev_ops && real_dev->xfrmdev_ops->xdo_dev_state_free) real_dev->xfrmdev_ops->xdo_dev_state_free(xs); -- GitLab From 316060297e20efdb5b296a1d460a9f403e0d8f36 Mon Sep 17 00:00:00 2001 From: Nicolas Escande Date: Wed, 22 Jan 2025 17:01:12 +0100 Subject: [PATCH 1977/2211] wifi: ath12k: fix skb_ext_desc leak in ath12k_dp_tx() error path [ Upstream commit 28a9972e0f0693cd4d08f431c992fa6be39c788c ] When vlan support was added, we missed that when ath12k_dp_prepare_htt_metadata() returns an error we also need to free the skb holding the metadata before going on with the cleanup process. Compile tested only. Fixes: 26dd8ccdba4d ("wifi: ath12k: dynamic VLAN support") Signed-off-by: Nicolas Escande Reviewed-by: Aditya Kumar Singh Link: https://patch.msgid.link/20250122160112.3234558-1-nico.escande@gmail.com Signed-off-by: Jeff Johnson Stable-dep-of: 37a068fc9dc4 ("wifi: ath12k: Handle error cases during extended skb allocation") Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/dp_tx.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/wireless/ath/ath12k/dp_tx.c b/drivers/net/wireless/ath/ath12k/dp_tx.c index 734e3da4cbf19..9e63d2d97c095 100644 --- a/drivers/net/wireless/ath/ath12k/dp_tx.c +++ b/drivers/net/wireless/ath/ath12k/dp_tx.c @@ -397,6 +397,7 @@ map: if (ret < 0) { ath12k_dbg(ab, ATH12K_DBG_DP_TX, "Failed to add HTT meta data, dropping packet\n"); + kfree_skb(skb_ext_desc); goto fail_unmap_dma; } } -- GitLab From 3fffbb8d33de8cb3f33454ff93efb5ee32b98ec8 Mon Sep 17 00:00:00 2001 From: P Praneesh Date: Fri, 11 Apr 2025 11:31:51 +0530 Subject: [PATCH 1978/2211] wifi: ath12k: Handle error cases during extended skb allocation [ Upstream commit 37a068fc9dc4feb8d76e8896bb33883d06c11a6b ] Currently, in the case of extended skb allocation, the buffer is freed before the DMA unmap operation. This premature deletion can result in skb->data corruption, as the memory region could be re-allocated for other purposes. Fix this issue by reordering the failure cases by calling dma_unmap_single() first, then followed by the corresponding kfree_skb(). This helps avoid data corruption in case of failures in dp_tx(). Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices") Signed-off-by: P Praneesh Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250411060154.1388159-2-praneesh.p@oss.qualcomm.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/dp_tx.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/dp_tx.c b/drivers/net/wireless/ath/ath12k/dp_tx.c index 9e63d2d97c095..21e07b5cee570 100644 --- a/drivers/net/wireless/ath/ath12k/dp_tx.c +++ b/drivers/net/wireless/ath/ath12k/dp_tx.c @@ -227,7 +227,7 @@ int ath12k_dp_tx(struct ath12k *ar, struct ath12k_vif *arvif, struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb); struct hal_tcl_data_cmd *hal_tcl_desc; struct hal_tx_msdu_ext_desc *msg; - struct sk_buff *skb_ext_desc; + struct sk_buff *skb_ext_desc = NULL; struct hal_srng *tcl_ring; struct ieee80211_hdr *hdr = (void *)skb->data; struct dp_tx_ring *tx_ring; @@ -397,18 +397,15 @@ map: if (ret < 0) { ath12k_dbg(ab, ATH12K_DBG_DP_TX, "Failed to add HTT meta data, dropping packet\n"); - kfree_skb(skb_ext_desc); - goto fail_unmap_dma; + goto fail_free_ext_skb; } } ti.paddr = dma_map_single(ab->dev, skb_ext_desc->data, skb_ext_desc->len, DMA_TO_DEVICE); ret = dma_mapping_error(ab->dev, ti.paddr); - if (ret) { - kfree_skb(skb_ext_desc); - goto fail_unmap_dma; - } + if (ret) + goto fail_free_ext_skb; ti.data_len = skb_ext_desc->len; ti.type = HAL_TCL_DESC_TYPE_EXT_DESC; @@ -444,7 +441,7 @@ map: ring_selector++; } - goto fail_unmap_dma; + goto fail_unmap_dma_ext; } ath12k_hal_tx_cmd_desc_setup(ab, hal_tcl_desc, &ti); @@ -460,13 +457,16 @@ map: return 0; -fail_unmap_dma: - dma_unmap_single(ab->dev, ti.paddr, ti.data_len, DMA_TO_DEVICE); - +fail_unmap_dma_ext: if (skb_cb->paddr_ext_desc) dma_unmap_single(ab->dev, skb_cb->paddr_ext_desc, sizeof(struct hal_tx_msdu_ext_desc), DMA_TO_DEVICE); +fail_free_ext_skb: + kfree_skb(skb_ext_desc); + +fail_unmap_dma: + dma_unmap_single(ab->dev, ti.paddr, ti.data_len, DMA_TO_DEVICE); fail_remove_tx_buf: ath12k_dp_tx_release_txbuf(dp, tx_desc, pool_id); -- GitLab From 7e48e3ddf9e33c2c1198c3e8ccd9a946fb2f0013 Mon Sep 17 00:00:00 2001 From: Rameshkumar Sundaram Date: Sat, 5 Jul 2025 13:56:09 -0400 Subject: [PATCH 1979/2211] wifi: ath12k: fix wrong handling of CCMP256 and GCMP ciphers [ Upstream commit f5d6b15d9503263d9425dcde9cc2fd401a32b0f2 ] Currently for CCMP256, GCMP128 and GCMP256 ciphers, in ath12k_install_key() IEEE80211_KEY_FLAG_GENERATE_IV_MGMT is not set and in ath12k_mac_mgmt_tx_wmi() a length of IEEE80211_CCMP_MIC_LEN is reserved for all ciphers. This results in unexpected drop of protected management frames in case either of above 3 ciphers is used. The reason is, without IEEE80211_KEY_FLAG_GENERATE_IV_MGMT set, mac80211 will not generate CCMP/GCMP headers in TX frame for ath12k. Also MIC length reserved is wrong and such frames are dropped by hardware. Fix this by setting IEEE80211_KEY_FLAG_GENERATE_IV_MGMT flag for above ciphers and by reserving proper MIC length for those ciphers. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices") Signed-off-by: Rameshkumar Sundaram Reviewed-by: Vasanthakumar Thiagarajan Link: https://patch.msgid.link/20250415195812.2633923-2-rameshkumar.sundaram@oss.qualcomm.com Signed-off-by: Jeff Johnson Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath12k/dp_rx.c | 3 +-- drivers/net/wireless/ath/ath12k/dp_rx.h | 3 +++ drivers/net/wireless/ath/ath12k/mac.c | 16 ++++++++++------ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c index 1623298ba2c47..eebdcc16e8fc4 100644 --- a/drivers/net/wireless/ath/ath12k/dp_rx.c +++ b/drivers/net/wireless/ath/ath12k/dp_rx.c @@ -1868,8 +1868,7 @@ static void ath12k_dp_rx_h_csum_offload(struct ath12k *ar, struct sk_buff *msdu) CHECKSUM_NONE : CHECKSUM_UNNECESSARY; } -static int ath12k_dp_rx_crypto_mic_len(struct ath12k *ar, - enum hal_encrypt_type enctype) +int ath12k_dp_rx_crypto_mic_len(struct ath12k *ar, enum hal_encrypt_type enctype) { switch (enctype) { case HAL_ENCRYPT_TYPE_OPEN: diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.h b/drivers/net/wireless/ath/ath12k/dp_rx.h index eb1f92559179b..4232091d9e328 100644 --- a/drivers/net/wireless/ath/ath12k/dp_rx.h +++ b/drivers/net/wireless/ath/ath12k/dp_rx.h @@ -143,4 +143,7 @@ int ath12k_dp_htt_tlv_iter(struct ath12k_base *ab, const void *ptr, size_t len, int (*iter)(struct ath12k_base *ar, u16 tag, u16 len, const void *ptr, void *data), void *data); + +int ath12k_dp_rx_crypto_mic_len(struct ath12k *ar, enum hal_encrypt_type enctype); + #endif /* ATH12K_DP_RX_H */ diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c index fbf5d57283576..4ca684278c367 100644 --- a/drivers/net/wireless/ath/ath12k/mac.c +++ b/drivers/net/wireless/ath/ath12k/mac.c @@ -3864,8 +3864,8 @@ static int ath12k_install_key(struct ath12k_vif *arvif, switch (key->cipher) { case WLAN_CIPHER_SUITE_CCMP: + case WLAN_CIPHER_SUITE_CCMP_256: arg.key_cipher = WMI_CIPHER_AES_CCM; - /* TODO: Re-check if flag is valid */ key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; break; case WLAN_CIPHER_SUITE_TKIP: @@ -3873,12 +3873,10 @@ static int ath12k_install_key(struct ath12k_vif *arvif, arg.key_txmic_len = 8; arg.key_rxmic_len = 8; break; - case WLAN_CIPHER_SUITE_CCMP_256: - arg.key_cipher = WMI_CIPHER_AES_CCM; - break; case WLAN_CIPHER_SUITE_GCMP: case WLAN_CIPHER_SUITE_GCMP_256: arg.key_cipher = WMI_CIPHER_AES_GCM; + key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; break; default: ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); @@ -5725,6 +5723,8 @@ static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_vif *arvif, struct ath12k_base *ab = ar->ab; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; struct ieee80211_tx_info *info; + enum hal_encrypt_type enctype; + unsigned int mic_len; dma_addr_t paddr; int buf_id; int ret; @@ -5738,12 +5738,16 @@ static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_vif *arvif, return -ENOSPC; info = IEEE80211_SKB_CB(skb); - if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { + if ((ATH12K_SKB_CB(skb)->flags & ATH12K_SKB_CIPHER_SET) && + !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) { if ((ieee80211_is_action(hdr->frame_control) || ieee80211_is_deauth(hdr->frame_control) || ieee80211_is_disassoc(hdr->frame_control)) && ieee80211_has_protected(hdr->frame_control)) { - skb_put(skb, IEEE80211_CCMP_MIC_LEN); + enctype = + ath12k_dp_tx_get_encrypt_type(ATH12K_SKB_CB(skb)->cipher); + mic_len = ath12k_dp_rx_crypto_mic_len(ar, enctype); + skb_put(skb, mic_len); } } -- GitLab From 7d151bf9bd2bc0526018ab9fec55d7ec362facfe Mon Sep 17 00:00:00 2001 From: Zhu Yanjun Date: Sat, 5 Jul 2025 14:19:39 -0400 Subject: [PATCH 1980/2211] RDMA/rxe: Fix "trying to register non-static key in rxe_qp_do_cleanup" bug [ Upstream commit 1c7eec4d5f3b39cdea2153abaebf1b7229a47072 ] Call Trace: __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120 assign_lock_key kernel/locking/lockdep.c:986 [inline] register_lock_class+0x4a3/0x4c0 kernel/locking/lockdep.c:1300 __lock_acquire+0x99/0x1ba0 kernel/locking/lockdep.c:5110 lock_acquire kernel/locking/lockdep.c:5866 [inline] lock_acquire+0x179/0x350 kernel/locking/lockdep.c:5823 __timer_delete_sync+0x152/0x1b0 kernel/time/timer.c:1644 rxe_qp_do_cleanup+0x5c3/0x7e0 drivers/infiniband/sw/rxe/rxe_qp.c:815 execute_in_process_context+0x3a/0x160 kernel/workqueue.c:4596 __rxe_cleanup+0x267/0x3c0 drivers/infiniband/sw/rxe/rxe_pool.c:232 rxe_create_qp+0x3f7/0x5f0 drivers/infiniband/sw/rxe/rxe_verbs.c:604 create_qp+0x62d/0xa80 drivers/infiniband/core/verbs.c:1250 ib_create_qp_kernel+0x9f/0x310 drivers/infiniband/core/verbs.c:1361 ib_create_qp include/rdma/ib_verbs.h:3803 [inline] rdma_create_qp+0x10c/0x340 drivers/infiniband/core/cma.c:1144 rds_ib_setup_qp+0xc86/0x19a0 net/rds/ib_cm.c:600 rds_ib_cm_initiate_connect+0x1e8/0x3d0 net/rds/ib_cm.c:944 rds_rdma_cm_event_handler_cmn+0x61f/0x8c0 net/rds/rdma_transport.c:109 cma_cm_event_handler+0x94/0x300 drivers/infiniband/core/cma.c:2184 cma_work_handler+0x15b/0x230 drivers/infiniband/core/cma.c:3042 process_one_work+0x9cc/0x1b70 kernel/workqueue.c:3238 process_scheduled_works kernel/workqueue.c:3319 [inline] worker_thread+0x6c8/0xf10 kernel/workqueue.c:3400 kthread+0x3c2/0x780 kernel/kthread.c:464 ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:153 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245 The root cause is as below: In the function rxe_create_qp, the function rxe_qp_from_init is called to create qp, if this function rxe_qp_from_init fails, rxe_cleanup will be called to handle all the allocated resources, including the timers: retrans_timer and rnr_nak_timer. The function rxe_qp_from_init calls the function rxe_qp_init_req to initialize the timers: retrans_timer and rnr_nak_timer. But these timers are initialized in the end of rxe_qp_init_req. If some errors occur before the initialization of these timers, this problem will occur. The solution is to check whether these timers are initialized or not. If these timers are not initialized, ignore these timers. Fixes: 8700e3e7c485 ("Soft RoCE driver") Reported-by: syzbot+4edb496c3cad6e953a31@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=4edb496c3cad6e953a31 Signed-off-by: Zhu Yanjun Link: https://patch.msgid.link/20250419080741.1515231-1-yanjun.zhu@linux.dev Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/infiniband/sw/rxe/rxe_qp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c index 91d329e903083..8b805b16136e5 100644 --- a/drivers/infiniband/sw/rxe/rxe_qp.c +++ b/drivers/infiniband/sw/rxe/rxe_qp.c @@ -811,7 +811,12 @@ static void rxe_qp_do_cleanup(struct work_struct *work) spin_unlock_irqrestore(&qp->state_lock, flags); qp->qp_timeout_jiffies = 0; - if (qp_type(qp) == IB_QPT_RC) { + /* In the function timer_setup, .function is initialized. If .function + * is NULL, it indicates the function timer_setup is not called, the + * timer is not initialized. Or else, the timer is initialized. + */ + if (qp_type(qp) == IB_QPT_RC && qp->retrans_timer.function && + qp->rnr_nak_timer.function) { del_timer_sync(&qp->retrans_timer); del_timer_sync(&qp->rnr_nak_timer); } -- GitLab From 81fdecac3f2c0ef1884a5798a00bdc1d722b858e Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Sat, 5 Jul 2025 14:42:43 -0400 Subject: [PATCH 1981/2211] iommu: ipmmu-vmsa: avoid Wformat-security warning [ Upstream commit 33647d0be323f9e2f27cd1e86de5cfd965cec654 ] iommu_device_sysfs_add() requires a constant format string, otherwise a W=1 build produces a warning: drivers/iommu/ipmmu-vmsa.c:1093:62: error: format string is not a string literal (potentially insecure) [-Werror,-Wformat-security] 1093 | ret = iommu_device_sysfs_add(&mmu->iommu, &pdev->dev, NULL, dev_name(&pdev->dev)); | ^~~~~~~~~~~~~~~~~~~~ drivers/iommu/ipmmu-vmsa.c:1093:62: note: treat the string as an argument to avoid this 1093 | ret = iommu_device_sysfs_add(&mmu->iommu, &pdev->dev, NULL, dev_name(&pdev->dev)); | ^ | "%s", This was an old bug but I saw it now because the code was changed as part of commit d9d3cede4167 ("iommu/ipmmu-vmsa: Register in a sensible order"). Fixes: 7af9a5fdb9e0 ("iommu/ipmmu-vmsa: Use iommu_device_sysfs_add()/remove()") Signed-off-by: Arnd Bergmann Reviewed-by: Geert Uytterhoeven Reviewed-by: Jason Gunthorpe Link: https://lore.kernel.org/r/20250423164006.2661372-1-arnd@kernel.org Signed-off-by: Joerg Roedel Signed-off-by: Sasha Levin --- drivers/iommu/ipmmu-vmsa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c index ff55b8c307126..ae69691471e9f 100644 --- a/drivers/iommu/ipmmu-vmsa.c +++ b/drivers/iommu/ipmmu-vmsa.c @@ -1087,7 +1087,7 @@ static int ipmmu_probe(struct platform_device *pdev) * - R-Car Gen3 IPMMU (leaf devices only - skip root IPMMU-MM device) */ if (!mmu->features->has_cache_leaf_nodes || !ipmmu_is_root(mmu)) { - ret = iommu_device_sysfs_add(&mmu->iommu, &pdev->dev, NULL, + ret = iommu_device_sysfs_add(&mmu->iommu, &pdev->dev, NULL, "%s", dev_name(&pdev->dev)); if (ret) return ret; -- GitLab From 58330262213aa3fb6b0ec807f6329572902f91ef Mon Sep 17 00:00:00 2001 From: Daeho Jeong Date: Tue, 15 Oct 2024 09:54:27 -0700 Subject: [PATCH 1982/2211] f2fs: decrease spare area for pinned files for zoned devices [ Upstream commit fa08972bcb7baaf5f1f4fdf251dc08bdd3ab1cf0 ] Now we reclaim too much space before allocating pinned space for zoned devices. Signed-off-by: Daeho Jeong Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim Stable-dep-of: dc6d9ef57fcf ("f2fs: zone: fix to calculate first_zoned_segno correctly") Signed-off-by: Sasha Levin --- fs/f2fs/file.c | 3 ++- fs/f2fs/gc.h | 1 + fs/f2fs/segment.c | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 02f438cd6bfaf..d9037e74631c0 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -1828,7 +1828,8 @@ static int f2fs_expand_inode_data(struct inode *inode, loff_t offset, map.m_len = sec_blks; next_alloc: - if (has_not_enough_free_secs(sbi, 0, + if (has_not_enough_free_secs(sbi, 0, f2fs_sb_has_blkzoned(sbi) ? + ZONED_PIN_SEC_REQUIRED_COUNT : GET_SEC_FROM_SEG(sbi, overprovision_segments(sbi)))) { f2fs_down_write(&sbi->gc_lock); stat_inc_gc_call_count(sbi, FOREGROUND); diff --git a/fs/f2fs/gc.h b/fs/f2fs/gc.h index 2914b678bf8fb..5c1eaf55e1277 100644 --- a/fs/f2fs/gc.h +++ b/fs/f2fs/gc.h @@ -35,6 +35,7 @@ #define LIMIT_BOOST_ZONED_GC 25 /* percentage over total user space of boosted gc for zoned devices */ #define DEF_MIGRATION_WINDOW_GRANULARITY_ZONED 3 #define BOOST_GC_MULTIPLE 5 +#define ZONED_PIN_SEC_REQUIRED_COUNT 1 #define DEF_GC_FAILED_PINNED_FILES 2048 #define MAX_GC_FAILED_PINNED_FILES USHRT_MAX diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 449c0acbfabc0..3db89becdbfcd 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -3250,7 +3250,8 @@ retry: if (f2fs_sb_has_blkzoned(sbi) && err == -EAGAIN && gc_required) { f2fs_down_write(&sbi->gc_lock); - err = f2fs_gc_range(sbi, 0, GET_SEGNO(sbi, FDEV(0).end_blk), true, 1); + err = f2fs_gc_range(sbi, 0, GET_SEGNO(sbi, FDEV(0).end_blk), + true, ZONED_PIN_SEC_REQUIRED_COUNT); f2fs_up_write(&sbi->gc_lock); gc_required = false; -- GitLab From ffbbe11577b7eec86d70a32f3ff0eb42f99f09ea Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Fri, 18 Oct 2024 14:26:36 +0800 Subject: [PATCH 1983/2211] f2fs: zone: introduce first_zoned_segno in f2fs_sb_info [ Upstream commit 5bc5aae843128aefb1c55d769d057c92dd8a32c9 ] first_zoned_segno() returns a fixed value, let's cache it in structure f2fs_sb_info to avoid redundant calculation. Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Stable-dep-of: dc6d9ef57fcf ("f2fs: zone: fix to calculate first_zoned_segno correctly") Signed-off-by: Sasha Levin --- fs/f2fs/f2fs.h | 1 + fs/f2fs/segment.c | 4 ++-- fs/f2fs/segment.h | 10 ---------- fs/f2fs/super.c | 13 +++++++++++++ 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 61b715cc2e231..08b0f35be76bc 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1762,6 +1762,7 @@ struct f2fs_sb_info { unsigned int dirty_device; /* for checkpoint data flush */ spinlock_t dev_lock; /* protect dirty_device */ bool aligned_blksize; /* all devices has the same logical blksize */ + unsigned int first_zoned_segno; /* first zoned segno */ /* For write statistics */ u64 sectors_written_start; diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 3db89becdbfcd..c7919b9cebcd0 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -2719,7 +2719,7 @@ static int get_new_segment(struct f2fs_sb_info *sbi, if (sbi->blkzone_alloc_policy == BLKZONE_ALLOC_PRIOR_CONV || pinning) segno = 0; else - segno = max(first_zoned_segno(sbi), *newseg); + segno = max(sbi->first_zoned_segno, *newseg); hint = GET_SEC_FROM_SEG(sbi, segno); } #endif @@ -2731,7 +2731,7 @@ find_other_zone: if (secno >= MAIN_SECS(sbi) && f2fs_sb_has_blkzoned(sbi)) { /* Write only to sequential zones */ if (sbi->blkzone_alloc_policy == BLKZONE_ALLOC_ONLY_SEQ) { - hint = GET_SEC_FROM_SEG(sbi, first_zoned_segno(sbi)); + hint = GET_SEC_FROM_SEG(sbi, sbi->first_zoned_segno); secno = find_next_zero_bit(free_i->free_secmap, MAIN_SECS(sbi), hint); } else secno = find_first_zero_bit(free_i->free_secmap, diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h index 05a342933f98f..52bb1a2819357 100644 --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h @@ -992,13 +992,3 @@ wake_up: dcc->discard_wake = true; wake_up_interruptible_all(&dcc->discard_wait_queue); } - -static inline unsigned int first_zoned_segno(struct f2fs_sb_info *sbi) -{ - int devi; - - for (devi = 0; devi < sbi->s_ndevs; devi++) - if (bdev_is_zoned(FDEV(devi).bdev)) - return GET_SEGNO(sbi, FDEV(devi).start_blk); - return 0; -} diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index f0e83ea56e38c..0508527ebe115 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -4260,6 +4260,16 @@ static void f2fs_record_error_work(struct work_struct *work) f2fs_record_stop_reason(sbi); } +static inline unsigned int get_first_zoned_segno(struct f2fs_sb_info *sbi) +{ + int devi; + + for (devi = 0; devi < sbi->s_ndevs; devi++) + if (bdev_is_zoned(FDEV(devi).bdev)) + return GET_SEGNO(sbi, FDEV(devi).start_blk); + return 0; +} + static int f2fs_scan_devices(struct f2fs_sb_info *sbi) { struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); @@ -4660,6 +4670,9 @@ try_onemore: /* For write statistics */ sbi->sectors_written_start = f2fs_get_sectors_written(sbi); + /* get segno of first zoned block device */ + sbi->first_zoned_segno = get_first_zoned_segno(sbi); + /* Read accumulated write IO statistics if exists */ seg_i = CURSEG_I(sbi, CURSEG_HOT_NODE); if (__exist_node_summaries(sbi)) -- GitLab From 8912b139a8d4b89c39ff1134338fed8f55a0c5a1 Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Thu, 10 Apr 2025 11:10:19 +0800 Subject: [PATCH 1984/2211] f2fs: zone: fix to calculate first_zoned_segno correctly [ Upstream commit dc6d9ef57fcf42fac1b3be4bff5ac5b3f1e8f9f3 ] A zoned device can has both conventional zones and sequential zones, so we should not treat first segment of zoned device as first_zoned_segno, instead, we need to check zone type for each zone during traversing zoned device to find first_zoned_segno. Otherwise, for below case, first_zoned_segno will be 0, which could be wrong. create_null_blk 512 2 1024 1024 mkfs.f2fs -m /dev/nullb0 Testcase: export SCRIPTS_PATH=/share/git/scripts test multiple devices w/ zoned device for ((i=0;i<8;i++)) do { zonesize=$((2<<$i)) conzone=$((4096/$zonesize)) seqzone=$((4096/$zonesize)) $SCRIPTS_PATH/nullblk_create.sh 512 $zonesize $conzone $seqzone mkfs.f2fs -f -m /dev/vdb -c /dev/nullb0 mount /dev/vdb /mnt/f2fs touch /mnt/f2fs/file f2fs_io pinfile set /mnt/f2fs/file $((8589934592*2)) stat /mnt/f2fs/file df cat /proc/fs/f2fs/vdb/segment_info umount /mnt/f2fs $SCRIPTS_PATH/nullblk_remove.sh 0 } done test single zoned device for ((i=0;i<8;i++)) do { zonesize=$((2<<$i)) conzone=$((4096/$zonesize)) seqzone=$((4096/$zonesize)) $SCRIPTS_PATH/nullblk_create.sh 512 $zonesize $conzone $seqzone mkfs.f2fs -f -m /dev/nullb0 mount /dev/nullb0 /mnt/f2fs touch /mnt/f2fs/file f2fs_io pinfile set /mnt/f2fs/file $((8589934592*2)) stat /mnt/f2fs/file df cat /proc/fs/f2fs/nullb0/segment_info umount /mnt/f2fs $SCRIPTS_PATH/nullblk_remove.sh 0 } done Fixes: 9703d69d9d15 ("f2fs: support file pinning for zoned devices") Cc: Daeho Jeong Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin --- fs/f2fs/data.c | 2 +- fs/f2fs/f2fs.h | 36 ++++++++++++++++++++++++++++-------- fs/f2fs/segment.c | 10 +++++----- fs/f2fs/super.c | 41 +++++++++++++++++++++++++++++++++++------ 4 files changed, 69 insertions(+), 20 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 62c7fd1168a15..654f672639b3c 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -3986,7 +3986,7 @@ retry: if ((pblock - SM_I(sbi)->main_blkaddr) % blks_per_sec || nr_pblocks % blks_per_sec || - !f2fs_valid_pinned_area(sbi, pblock)) { + f2fs_is_sequential_zone_area(sbi, pblock)) { bool last_extent = false; not_aligned++; diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 08b0f35be76bc..a435550b2839b 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1762,7 +1762,7 @@ struct f2fs_sb_info { unsigned int dirty_device; /* for checkpoint data flush */ spinlock_t dev_lock; /* protect dirty_device */ bool aligned_blksize; /* all devices has the same logical blksize */ - unsigned int first_zoned_segno; /* first zoned segno */ + unsigned int first_seq_zone_segno; /* first segno in sequential zone */ /* For write statistics */ u64 sectors_written_start; @@ -4557,12 +4557,16 @@ F2FS_FEATURE_FUNCS(compression, COMPRESSION); F2FS_FEATURE_FUNCS(readonly, RO); #ifdef CONFIG_BLK_DEV_ZONED -static inline bool f2fs_blkz_is_seq(struct f2fs_sb_info *sbi, int devi, - block_t blkaddr) +static inline bool f2fs_zone_is_seq(struct f2fs_sb_info *sbi, int devi, + unsigned int zone) { - unsigned int zno = blkaddr / sbi->blocks_per_blkz; + return test_bit(zone, FDEV(devi).blkz_seq); +} - return test_bit(zno, FDEV(devi).blkz_seq); +static inline bool f2fs_blkz_is_seq(struct f2fs_sb_info *sbi, int devi, + block_t blkaddr) +{ + return f2fs_zone_is_seq(sbi, devi, blkaddr / sbi->blocks_per_blkz); } #endif @@ -4634,15 +4638,31 @@ static inline bool f2fs_lfs_mode(struct f2fs_sb_info *sbi) return F2FS_OPTION(sbi).fs_mode == FS_MODE_LFS; } -static inline bool f2fs_valid_pinned_area(struct f2fs_sb_info *sbi, +static inline bool f2fs_is_sequential_zone_area(struct f2fs_sb_info *sbi, block_t blkaddr) { if (f2fs_sb_has_blkzoned(sbi)) { +#ifdef CONFIG_BLK_DEV_ZONED int devi = f2fs_target_device_index(sbi, blkaddr); - return !bdev_is_zoned(FDEV(devi).bdev); + if (!bdev_is_zoned(FDEV(devi).bdev)) + return false; + + if (f2fs_is_multi_device(sbi)) { + if (blkaddr < FDEV(devi).start_blk || + blkaddr > FDEV(devi).end_blk) { + f2fs_err(sbi, "Invalid block %x", blkaddr); + return false; + } + blkaddr -= FDEV(devi).start_blk; + } + + return f2fs_blkz_is_seq(sbi, devi, blkaddr); +#else + return false; +#endif } - return true; + return false; } static inline bool f2fs_low_mem_mode(struct f2fs_sb_info *sbi) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index c7919b9cebcd0..e48b5e2efea28 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -2719,7 +2719,7 @@ static int get_new_segment(struct f2fs_sb_info *sbi, if (sbi->blkzone_alloc_policy == BLKZONE_ALLOC_PRIOR_CONV || pinning) segno = 0; else - segno = max(sbi->first_zoned_segno, *newseg); + segno = max(sbi->first_seq_zone_segno, *newseg); hint = GET_SEC_FROM_SEG(sbi, segno); } #endif @@ -2731,7 +2731,7 @@ find_other_zone: if (secno >= MAIN_SECS(sbi) && f2fs_sb_has_blkzoned(sbi)) { /* Write only to sequential zones */ if (sbi->blkzone_alloc_policy == BLKZONE_ALLOC_ONLY_SEQ) { - hint = GET_SEC_FROM_SEG(sbi, sbi->first_zoned_segno); + hint = GET_SEC_FROM_SEG(sbi, sbi->first_seq_zone_segno); secno = find_next_zero_bit(free_i->free_secmap, MAIN_SECS(sbi), hint); } else secno = find_first_zero_bit(free_i->free_secmap, @@ -2784,9 +2784,9 @@ got_it: goto out_unlock; } - /* no free section in conventional zone */ + /* no free section in conventional device or conventional zone */ if (new_sec && pinning && - !f2fs_valid_pinned_area(sbi, START_BLOCK(sbi, segno))) { + f2fs_is_sequential_zone_area(sbi, START_BLOCK(sbi, segno))) { ret = -EAGAIN; goto out_unlock; } @@ -3250,7 +3250,7 @@ retry: if (f2fs_sb_has_blkzoned(sbi) && err == -EAGAIN && gc_required) { f2fs_down_write(&sbi->gc_lock); - err = f2fs_gc_range(sbi, 0, GET_SEGNO(sbi, FDEV(0).end_blk), + err = f2fs_gc_range(sbi, 0, sbi->first_seq_zone_segno - 1, true, ZONED_PIN_SEC_REQUIRED_COUNT); f2fs_up_write(&sbi->gc_lock); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 0508527ebe115..3f2c6fa3623ba 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -4260,14 +4260,35 @@ static void f2fs_record_error_work(struct work_struct *work) f2fs_record_stop_reason(sbi); } -static inline unsigned int get_first_zoned_segno(struct f2fs_sb_info *sbi) +static inline unsigned int get_first_seq_zone_segno(struct f2fs_sb_info *sbi) { +#ifdef CONFIG_BLK_DEV_ZONED + unsigned int zoneno, total_zones; int devi; - for (devi = 0; devi < sbi->s_ndevs; devi++) - if (bdev_is_zoned(FDEV(devi).bdev)) - return GET_SEGNO(sbi, FDEV(devi).start_blk); - return 0; + if (!f2fs_sb_has_blkzoned(sbi)) + return NULL_SEGNO; + + for (devi = 0; devi < sbi->s_ndevs; devi++) { + if (!bdev_is_zoned(FDEV(devi).bdev)) + continue; + + total_zones = GET_ZONE_FROM_SEG(sbi, FDEV(devi).total_segments); + + for (zoneno = 0; zoneno < total_zones; zoneno++) { + unsigned int segs, blks; + + if (!f2fs_zone_is_seq(sbi, devi, zoneno)) + continue; + + segs = GET_SEG_FROM_SEC(sbi, + zoneno * sbi->secs_per_zone); + blks = SEGS_TO_BLKS(sbi, segs); + return GET_SEGNO(sbi, FDEV(devi).start_blk + blks); + } + } +#endif + return NULL_SEGNO; } static int f2fs_scan_devices(struct f2fs_sb_info *sbi) @@ -4304,6 +4325,14 @@ static int f2fs_scan_devices(struct f2fs_sb_info *sbi) #endif for (i = 0; i < max_devices; i++) { + if (max_devices == 1) { + FDEV(i).total_segments = + le32_to_cpu(raw_super->segment_count_main); + FDEV(i).start_blk = 0; + FDEV(i).end_blk = FDEV(i).total_segments * + BLKS_PER_SEG(sbi); + } + if (i == 0) FDEV(0).bdev_file = sbi->sb->s_bdev_file; else if (!RDEV(i).path[0]) @@ -4671,7 +4700,7 @@ try_onemore: sbi->sectors_written_start = f2fs_get_sectors_written(sbi); /* get segno of first zoned block device */ - sbi->first_zoned_segno = get_first_zoned_segno(sbi); + sbi->first_seq_zone_segno = get_first_seq_zone_segno(sbi); /* Read accumulated write IO statistics if exists */ seg_i = CURSEG_I(sbi, CURSEG_HOT_NODE); -- GitLab From ae082dbcef5b5a6e4cd66022f2d4d0fbcf95b92d Mon Sep 17 00:00:00 2001 From: Justin Tee Date: Thu, 31 Oct 2024 15:32:16 -0700 Subject: [PATCH 1985/2211] scsi: lpfc: Remove NLP_RELEASE_RPI flag from nodelist structure [ Upstream commit 32566a6f1ae558d0e79fed6e17a75c253367a57f ] An RPI is tightly bound to an NDLP structure and is freed only upon release of an NDLP object. As such, there should be no logic that frees an RPI outside of the lpfc_nlp_release() routine. In order to reinforce the original design usage of RPIs, remove the NLP_RELEASE_RPI flag and related logic. Signed-off-by: Justin Tee Link: https://lore.kernel.org/r/20241031223219.152342-9-justintee8345@gmail.com Signed-off-by: Martin K. Petersen Stable-dep-of: b5162bb6aa1e ("scsi: lpfc: Avoid potential ndlp use-after-free in dev_loss_tmo_callbk") Signed-off-by: Sasha Levin --- drivers/scsi/lpfc/lpfc_crtn.h | 2 +- drivers/scsi/lpfc/lpfc_disc.h | 1 - drivers/scsi/lpfc/lpfc_els.c | 32 +++----------------- drivers/scsi/lpfc/lpfc_hbadisc.c | 52 +++++++------------------------- drivers/scsi/lpfc/lpfc_init.c | 36 +++++++--------------- drivers/scsi/lpfc/lpfc_sli.c | 48 +++++++++++------------------ 6 files changed, 44 insertions(+), 127 deletions(-) diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h index d4e46a08f94da..36470bd716173 100644 --- a/drivers/scsi/lpfc/lpfc_crtn.h +++ b/drivers/scsi/lpfc/lpfc_crtn.h @@ -571,7 +571,7 @@ int lpfc_issue_reg_vfi(struct lpfc_vport *); int lpfc_issue_unreg_vfi(struct lpfc_vport *); int lpfc_selective_reset(struct lpfc_hba *); int lpfc_sli4_read_config(struct lpfc_hba *); -void lpfc_sli4_node_prep(struct lpfc_hba *); +void lpfc_sli4_node_rpi_restore(struct lpfc_hba *phba); int lpfc_sli4_els_sgl_update(struct lpfc_hba *phba); int lpfc_sli4_nvmet_sgl_update(struct lpfc_hba *phba); int lpfc_io_buf_flush(struct lpfc_hba *phba, struct list_head *sglist); diff --git a/drivers/scsi/lpfc/lpfc_disc.h b/drivers/scsi/lpfc/lpfc_disc.h index f5ae8cc158205..5d6eabaeb094e 100644 --- a/drivers/scsi/lpfc/lpfc_disc.h +++ b/drivers/scsi/lpfc/lpfc_disc.h @@ -185,7 +185,6 @@ struct lpfc_node_rrq { /* Defines for nlp_flag (uint32) */ #define NLP_IGNR_REG_CMPL 0x00000001 /* Rcvd rscn before we cmpl reg login */ #define NLP_REG_LOGIN_SEND 0x00000002 /* sent reglogin to adapter */ -#define NLP_RELEASE_RPI 0x00000004 /* Release RPI to free pool */ #define NLP_SUPPRESS_RSP 0x00000010 /* Remote NPort supports suppress rsp */ #define NLP_PLOGI_SND 0x00000020 /* sent PLOGI request for this entry */ #define NLP_PRLI_SND 0x00000040 /* sent PRLI request for this entry */ diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index d737b897ddd82..4e049783fc94e 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c @@ -3063,8 +3063,6 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, */ if (ndlp->nlp_flag & NLP_TARGET_REMOVE) { spin_lock_irq(&ndlp->lock); - if (phba->sli_rev == LPFC_SLI_REV4) - ndlp->nlp_flag |= NLP_RELEASE_RPI; ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; spin_unlock_irq(&ndlp->lock); lpfc_disc_state_machine(vport, ndlp, cmdiocb, @@ -5456,24 +5454,14 @@ out: } /* An SLI4 NPIV instance wants to drop the node at this point under - * these conditions and release the RPI. + * these conditions because it doesn't need the login. */ if (phba->sli_rev == LPFC_SLI_REV4 && vport && vport->port_type == LPFC_NPIV_PORT && !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) { - if (ndlp->nlp_flag & NLP_RELEASE_RPI) { - if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE && - ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) { - lpfc_sli4_free_rpi(phba, ndlp->nlp_rpi); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; - ndlp->nlp_flag &= ~NLP_RELEASE_RPI; - spin_unlock_irq(&ndlp->lock); - } - lpfc_drop_node(vport, ndlp); - } else if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE && - ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE && - ndlp->nlp_state != NLP_STE_PRLI_ISSUE) { + if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE && + ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE && + ndlp->nlp_state != NLP_STE_PRLI_ISSUE) { /* Drop ndlp if there is no planned or outstanding * issued PRLI. * @@ -5852,18 +5840,6 @@ lpfc_els_rsp_reject(struct lpfc_vport *vport, uint32_t rejectError, return 1; } - /* The NPIV instance is rejecting this unsolicited ELS. Make sure the - * node's assigned RPI gets released provided this node is not already - * registered with the transport. - */ - if (phba->sli_rev == LPFC_SLI_REV4 && - vport->port_type == LPFC_NPIV_PORT && - !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_RELEASE_RPI; - spin_unlock_irq(&ndlp->lock); - } - rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0); if (rc == IOCB_ERROR) { lpfc_els_free_iocb(phba, elsiocb); diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 34f77b250387c..ff559b28738cf 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -5212,14 +5212,6 @@ lpfc_nlp_logo_unreg(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING; lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); } else { - /* NLP_RELEASE_RPI is only set for SLI4 ports. */ - if (ndlp->nlp_flag & NLP_RELEASE_RPI) { - lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_RELEASE_RPI; - ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; - spin_unlock_irq(&ndlp->lock); - } spin_lock_irq(&ndlp->lock); ndlp->nlp_flag &= ~NLP_UNREG_INP; spin_unlock_irq(&ndlp->lock); @@ -5242,8 +5234,6 @@ static void lpfc_set_unreg_login_mbx_cmpl(struct lpfc_hba *phba, struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, LPFC_MBOXQ_t *mbox) { - unsigned long iflags; - /* Driver always gets a reference on the mailbox job * in support of async jobs. */ @@ -5261,13 +5251,6 @@ lpfc_set_unreg_login_mbx_cmpl(struct lpfc_hba *phba, struct lpfc_vport *vport, (kref_read(&ndlp->kref) > 0)) { mbox->mbox_cmpl = lpfc_sli4_unreg_rpi_cmpl_clr; } else { - if (test_bit(FC_UNLOADING, &vport->load_flag)) { - if (phba->sli_rev == LPFC_SLI_REV4) { - spin_lock_irqsave(&ndlp->lock, iflags); - ndlp->nlp_flag |= NLP_RELEASE_RPI; - spin_unlock_irqrestore(&ndlp->lock, iflags); - } - } mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; } } @@ -5330,14 +5313,11 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) return 1; } + /* Accept PLOGIs after unreg_rpi_cmpl. */ if (mbox->mbox_cmpl == lpfc_sli4_unreg_rpi_cmpl_clr) - /* - * accept PLOGIs after unreg_rpi_cmpl - */ acc_plogi = 0; - if (((ndlp->nlp_DID & Fabric_DID_MASK) != - Fabric_DID_MASK) && - (!test_bit(FC_OFFLINE_MODE, &vport->fc_flag))) + + if (!test_bit(FC_OFFLINE_MODE, &vport->fc_flag)) ndlp->nlp_flag |= NLP_UNREG_INP; lpfc_printf_vlog(vport, KERN_INFO, @@ -5561,10 +5541,6 @@ lpfc_cleanup_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) list_del_init(&ndlp->dev_loss_evt.evt_listp); list_del_init(&ndlp->recovery_evt.evt_listp); lpfc_cleanup_vports_rrqs(vport, ndlp); - - if (phba->sli_rev == LPFC_SLI_REV4) - ndlp->nlp_flag |= NLP_RELEASE_RPI; - return 0; } @@ -6580,8 +6556,9 @@ lpfc_nlp_init(struct lpfc_vport *vport, uint32_t did) INIT_LIST_HEAD(&ndlp->nlp_listp); if (vport->phba->sli_rev == LPFC_SLI_REV4) { ndlp->nlp_rpi = rpi; - lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE | LOG_DISCOVERY, - "0007 Init New ndlp x%px, rpi:x%x DID:%x " + lpfc_printf_vlog(vport, KERN_INFO, + LOG_ELS | LOG_NODE | LOG_DISCOVERY, + "0007 Init New ndlp x%px, rpi:x%x DID:x%x " "flg:x%x refcnt:%d\n", ndlp, ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); @@ -6626,19 +6603,12 @@ lpfc_nlp_release(struct kref *kref) lpfc_cancel_retry_delay_tmo(vport, ndlp); lpfc_cleanup_node(vport, ndlp); - /* Not all ELS transactions have registered the RPI with the port. - * In these cases the rpi usage is temporary and the node is - * released when the WQE is completed. Catch this case to free the - * RPI to the pool. Because this node is in the release path, a lock - * is unnecessary. All references are gone and the node has been - * dequeued. + /* All nodes are initialized with an RPI that needs to be released + * now. All references are gone and the node has been dequeued. */ - if (ndlp->nlp_flag & NLP_RELEASE_RPI) { - if (ndlp->nlp_rpi != LPFC_RPI_ALLOC_ERROR && - !(ndlp->nlp_flag & (NLP_RPI_REGISTERED | NLP_UNREG_INP))) { - lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi); - ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; - } + if (vport->phba->sli_rev == LPFC_SLI_REV4) { + lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi); + ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; } /* The node is not freed back to memory, it is released to a pool so diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 50c761991191f..986e2898b10b8 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -3379,7 +3379,7 @@ lpfc_block_mgmt_io(struct lpfc_hba *phba, int mbx_action) } /** - * lpfc_sli4_node_prep - Assign RPIs for active nodes. + * lpfc_sli4_node_rpi_restore - Recover assigned RPIs for active nodes. * @phba: pointer to lpfc hba data structure. * * Allocate RPIs for all active remote nodes. This is needed whenever @@ -3387,7 +3387,7 @@ lpfc_block_mgmt_io(struct lpfc_hba *phba, int mbx_action) * is to fixup the temporary rpi assignments. **/ void -lpfc_sli4_node_prep(struct lpfc_hba *phba) +lpfc_sli4_node_rpi_restore(struct lpfc_hba *phba) { struct lpfc_nodelist *ndlp, *next_ndlp; struct lpfc_vport **vports; @@ -3397,10 +3397,10 @@ lpfc_sli4_node_prep(struct lpfc_hba *phba) return; vports = lpfc_create_vport_work_array(phba); - if (vports == NULL) + if (!vports) return; - for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { + for (i = 0; i <= phba->max_vports && vports[i]; i++) { if (test_bit(FC_UNLOADING, &vports[i]->load_flag)) continue; @@ -3409,7 +3409,13 @@ lpfc_sli4_node_prep(struct lpfc_hba *phba) nlp_listp) { rpi = lpfc_sli4_alloc_rpi(phba); if (rpi == LPFC_RPI_ALLOC_ERROR) { - /* TODO print log? */ + lpfc_printf_vlog(ndlp->vport, KERN_INFO, + LOG_NODE | LOG_DISCOVERY, + "0099 RPI alloc error for " + "ndlp x%px DID:x%06x " + "flg:x%x\n", + ndlp, ndlp->nlp_DID, + ndlp->nlp_flag); continue; } ndlp->nlp_rpi = rpi; @@ -3829,26 +3835,6 @@ lpfc_offline_prep(struct lpfc_hba *phba, int mbx_action) ndlp->nlp_flag &= ~(NLP_UNREG_INP | NLP_RPI_REGISTERED); spin_unlock_irq(&ndlp->lock); - if (phba->sli_rev == LPFC_SLI_REV4) - lpfc_sli_rpi_release(vports[i], - ndlp); - } else { - lpfc_unreg_rpi(vports[i], ndlp); - } - /* - * Whenever an SLI4 port goes offline, free the - * RPI. Get a new RPI when the adapter port - * comes back online. - */ - if (phba->sli_rev == LPFC_SLI_REV4) { - lpfc_printf_vlog(vports[i], KERN_INFO, - LOG_NODE | LOG_DISCOVERY, - "0011 Free RPI x%x on " - "ndlp: x%px did x%x\n", - ndlp->nlp_rpi, ndlp, - ndlp->nlp_DID); - lpfc_sli4_free_rpi(phba, ndlp->nlp_rpi); - ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; } if (ndlp->nlp_type & NLP_FABRIC) { diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 4dccbaeb63283..17ecb2625eb84 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -2842,27 +2842,6 @@ lpfc_sli_wake_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq) return; } -static void -__lpfc_sli_rpi_release(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) -{ - unsigned long iflags; - - if (ndlp->nlp_flag & NLP_RELEASE_RPI) { - lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi); - spin_lock_irqsave(&ndlp->lock, iflags); - ndlp->nlp_flag &= ~NLP_RELEASE_RPI; - ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; - spin_unlock_irqrestore(&ndlp->lock, iflags); - } - ndlp->nlp_flag &= ~NLP_UNREG_INP; -} - -void -lpfc_sli_rpi_release(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) -{ - __lpfc_sli_rpi_release(vport, ndlp); -} - /** * lpfc_sli_def_mbox_cmpl - Default mailbox completion handler * @phba: Pointer to HBA context object. @@ -2942,8 +2921,6 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) ndlp->nlp_flag &= ~NLP_UNREG_INP; ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING; lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); - } else { - __lpfc_sli_rpi_release(vport, ndlp); } /* The unreg_login mailbox is complete and had a @@ -2991,6 +2968,7 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) { struct lpfc_vport *vport = pmb->vport; struct lpfc_nodelist *ndlp; + u32 unreg_inp; ndlp = pmb->ctx_ndlp; if (pmb->u.mb.mbxCommand == MBX_UNREG_LOGIN) { @@ -3009,14 +2987,22 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) ndlp->nlp_DID, ndlp->nlp_defer_did, ndlp->nlp_flag, ndlp); - ndlp->nlp_flag &= ~NLP_LOGO_ACC; + + /* Cleanup the nlp_flag now that the UNREG RPI + * has completed. + */ + spin_lock_irq(&ndlp->lock); + unreg_inp = ndlp->nlp_flag & NLP_UNREG_INP; + ndlp->nlp_flag &= + ~(NLP_UNREG_INP | NLP_LOGO_ACC); + spin_unlock_irq(&ndlp->lock); /* Check to see if there are any deferred * events to process */ - if ((ndlp->nlp_flag & NLP_UNREG_INP) && - (ndlp->nlp_defer_did != - NLP_EVT_NOTHING_PENDING)) { + if (unreg_inp && + ndlp->nlp_defer_did != + NLP_EVT_NOTHING_PENDING) { lpfc_printf_vlog( vport, KERN_INFO, LOG_MBOX | LOG_SLI | LOG_NODE, @@ -3025,14 +3011,12 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) "NPort x%x Data: x%x x%px\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_defer_did, ndlp); - ndlp->nlp_flag &= ~NLP_UNREG_INP; ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING; lpfc_issue_els_plogi( vport, ndlp->nlp_DID, 0); - } else { - __lpfc_sli_rpi_release(vport, ndlp); } + lpfc_nlp_put(ndlp); } } @@ -8750,6 +8734,7 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) lpfc_sli_config_mbox_opcode_get( phba, mboxq), rc, dd); + /* * Allocate all resources (xri,rpi,vpi,vfi) now. Subsequent * calls depends on these resources to complete port setup. @@ -8762,6 +8747,8 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) goto out_free_mbox; } + lpfc_sli4_node_rpi_restore(phba); + lpfc_set_host_data(phba, mboxq); rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL); @@ -8949,7 +8936,6 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) rc = -ENODEV; goto out_free_iocblist; } - lpfc_sli4_node_prep(phba); if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag)) { if ((phba->nvmet_support == 0) || (phba->cfg_nvmet_mrq == 1)) { -- GitLab From 6857cbf0e4b38f15a15ed887dbbed663f8e22887 Mon Sep 17 00:00:00 2001 From: Justin Tee Date: Thu, 31 Oct 2024 15:32:17 -0700 Subject: [PATCH 1986/2211] scsi: lpfc: Change lpfc_nodelist nlp_flag member into a bitmask [ Upstream commit 92b99f1a73b7951f05590fd01640dcafdbc82c21 ] In attempt to reduce the amount of unnecessary ndlp->lock acquisitions in the lpfc driver, change nlpa_flag into an unsigned long bitmask and use clear_bit/test_bit bitwise atomic APIs instead of reliance on ndlp->lock for synchronization. Signed-off-by: Justin Tee Link: https://lore.kernel.org/r/20241031223219.152342-10-justintee8345@gmail.com Signed-off-by: Martin K. Petersen Stable-dep-of: b5162bb6aa1e ("scsi: lpfc: Avoid potential ndlp use-after-free in dev_loss_tmo_callbk") Signed-off-by: Sasha Levin --- drivers/scsi/lpfc/lpfc_bsg.c | 6 +- drivers/scsi/lpfc/lpfc_ct.c | 18 +- drivers/scsi/lpfc/lpfc_debugfs.c | 4 +- drivers/scsi/lpfc/lpfc_disc.h | 59 ++--- drivers/scsi/lpfc/lpfc_els.c | 405 ++++++++++++----------------- drivers/scsi/lpfc/lpfc_hbadisc.c | 225 +++++++--------- drivers/scsi/lpfc/lpfc_init.c | 24 +- drivers/scsi/lpfc/lpfc_nportdisc.c | 329 ++++++++++------------- drivers/scsi/lpfc/lpfc_nvme.c | 9 +- drivers/scsi/lpfc/lpfc_nvmet.c | 2 +- drivers/scsi/lpfc/lpfc_scsi.c | 8 +- drivers/scsi/lpfc/lpfc_sli.c | 42 ++- drivers/scsi/lpfc/lpfc_vport.c | 6 +- 13 files changed, 476 insertions(+), 661 deletions(-) diff --git a/drivers/scsi/lpfc/lpfc_bsg.c b/drivers/scsi/lpfc/lpfc_bsg.c index 85059b83ea6b4..1c6b024160da7 100644 --- a/drivers/scsi/lpfc/lpfc_bsg.c +++ b/drivers/scsi/lpfc/lpfc_bsg.c @@ -398,7 +398,11 @@ lpfc_bsg_send_mgmt_cmd(struct bsg_job *job) /* in case no data is transferred */ bsg_reply->reply_payload_rcv_len = 0; - if (ndlp->nlp_flag & NLP_ELS_SND_MASK) + if (test_bit(NLP_PLOGI_SND, &ndlp->nlp_flag) || + test_bit(NLP_PRLI_SND, &ndlp->nlp_flag) || + test_bit(NLP_ADISC_SND, &ndlp->nlp_flag) || + test_bit(NLP_LOGO_SND, &ndlp->nlp_flag) || + test_bit(NLP_RNID_SND, &ndlp->nlp_flag)) return -ENODEV; /* allocate our bsg tracking structure */ diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c index ce3a1f42713dd..30891ad17e2a4 100644 --- a/drivers/scsi/lpfc/lpfc_ct.c +++ b/drivers/scsi/lpfc/lpfc_ct.c @@ -735,7 +735,7 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "0238 Process x%06x NameServer Rsp " - "Data: x%x x%x x%x x%lx x%x\n", Did, + "Data: x%lx x%x x%x x%lx x%x\n", Did, ndlp->nlp_flag, ndlp->nlp_fc4_type, ndlp->nlp_state, vport->fc_flag, vport->fc_rscn_id_cnt); @@ -744,7 +744,7 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type) * state of ndlp hit devloss, change state to * allow rediscovery. */ - if (ndlp->nlp_flag & NLP_NPR_2B_DISC && + if (test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag) && ndlp->nlp_state == NLP_STE_UNUSED_NODE) { lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); @@ -832,12 +832,10 @@ lpfc_ns_rsp_audit_did(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type) if (ndlp->nlp_type != NLP_NVME_INITIATOR || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) continue; - spin_lock_irq(&ndlp->lock); if (ndlp->nlp_DID == Did) - ndlp->nlp_flag &= ~NLP_NVMET_RECOV; + clear_bit(NLP_NVMET_RECOV, &ndlp->nlp_flag); else - ndlp->nlp_flag |= NLP_NVMET_RECOV; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_NVMET_RECOV, &ndlp->nlp_flag); } } } @@ -894,13 +892,11 @@ lpfc_ns_rsp(struct lpfc_vport *vport, struct lpfc_dmabuf *mp, uint8_t fc4_type, */ if (vport->phba->nvmet_support) { list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { - if (!(ndlp->nlp_flag & NLP_NVMET_RECOV)) + if (!test_bit(NLP_NVMET_RECOV, &ndlp->nlp_flag)) continue; lpfc_disc_state_machine(vport, ndlp, NULL, NLP_EVT_DEVICE_RECOVERY); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_NVMET_RECOV; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NVMET_RECOV, &ndlp->nlp_flag); } } @@ -1440,7 +1436,7 @@ lpfc_cmpl_ct_cmd_gff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, if (ndlp) { lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "0242 Process x%x GFF " - "NameServer Rsp Data: x%x x%lx x%x\n", + "NameServer Rsp Data: x%lx x%lx x%x\n", did, ndlp->nlp_flag, vport->fc_flag, vport->fc_rscn_id_cnt); } else { diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index a2d2b02b34187..3fd1aa5cc78cc 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c @@ -870,8 +870,8 @@ lpfc_debugfs_nodelist_data(struct lpfc_vport *vport, char *buf, int size) wwn_to_u64(ndlp->nlp_nodename.u.wwn)); len += scnprintf(buf+len, size-len, "RPI:x%04x ", ndlp->nlp_rpi); - len += scnprintf(buf+len, size-len, "flag:x%08x ", - ndlp->nlp_flag); + len += scnprintf(buf+len, size-len, "flag:x%08lx ", + ndlp->nlp_flag); if (!ndlp->nlp_type) len += scnprintf(buf+len, size-len, "UNKNOWN_TYPE "); if (ndlp->nlp_type & NLP_FC_NODE) diff --git a/drivers/scsi/lpfc/lpfc_disc.h b/drivers/scsi/lpfc/lpfc_disc.h index 5d6eabaeb094e..af5d5bd75642c 100644 --- a/drivers/scsi/lpfc/lpfc_disc.h +++ b/drivers/scsi/lpfc/lpfc_disc.h @@ -102,7 +102,7 @@ struct lpfc_nodelist { spinlock_t lock; /* Node management lock */ - uint32_t nlp_flag; /* entry flags */ + unsigned long nlp_flag; /* entry flags */ uint32_t nlp_DID; /* FC D_ID of entry */ uint32_t nlp_last_elscmd; /* Last ELS cmd sent */ uint16_t nlp_type; @@ -182,36 +182,37 @@ struct lpfc_node_rrq { #define lpfc_ndlp_check_qdepth(phba, ndlp) \ (ndlp->cmd_qdepth < phba->sli4_hba.max_cfg_param.max_xri) -/* Defines for nlp_flag (uint32) */ -#define NLP_IGNR_REG_CMPL 0x00000001 /* Rcvd rscn before we cmpl reg login */ -#define NLP_REG_LOGIN_SEND 0x00000002 /* sent reglogin to adapter */ -#define NLP_SUPPRESS_RSP 0x00000010 /* Remote NPort supports suppress rsp */ -#define NLP_PLOGI_SND 0x00000020 /* sent PLOGI request for this entry */ -#define NLP_PRLI_SND 0x00000040 /* sent PRLI request for this entry */ -#define NLP_ADISC_SND 0x00000080 /* sent ADISC request for this entry */ -#define NLP_LOGO_SND 0x00000100 /* sent LOGO request for this entry */ -#define NLP_RNID_SND 0x00000400 /* sent RNID request for this entry */ -#define NLP_ELS_SND_MASK 0x000007e0 /* sent ELS request for this entry */ -#define NLP_NVMET_RECOV 0x00001000 /* NVMET auditing node for recovery. */ -#define NLP_UNREG_INP 0x00008000 /* UNREG_RPI cmd is in progress */ -#define NLP_DROPPED 0x00010000 /* Init ref count has been dropped */ -#define NLP_DELAY_TMO 0x00020000 /* delay timeout is running for node */ -#define NLP_NPR_2B_DISC 0x00040000 /* node is included in num_disc_nodes */ -#define NLP_RCV_PLOGI 0x00080000 /* Rcv'ed PLOGI from remote system */ -#define NLP_LOGO_ACC 0x00100000 /* Process LOGO after ACC completes */ -#define NLP_TGT_NO_SCSIID 0x00200000 /* good PRLI but no binding for scsid */ -#define NLP_ISSUE_LOGO 0x00400000 /* waiting to issue a LOGO */ -#define NLP_IN_DEV_LOSS 0x00800000 /* devloss in progress */ -#define NLP_ACC_REGLOGIN 0x01000000 /* Issue Reg Login after successful +/* nlp_flag mask bits */ +enum lpfc_nlp_flag { + NLP_IGNR_REG_CMPL = 0, /* Rcvd rscn before we cmpl reg login */ + NLP_REG_LOGIN_SEND = 1, /* sent reglogin to adapter */ + NLP_SUPPRESS_RSP = 4, /* Remote NPort supports suppress rsp */ + NLP_PLOGI_SND = 5, /* sent PLOGI request for this entry */ + NLP_PRLI_SND = 6, /* sent PRLI request for this entry */ + NLP_ADISC_SND = 7, /* sent ADISC request for this entry */ + NLP_LOGO_SND = 8, /* sent LOGO request for this entry */ + NLP_RNID_SND = 10, /* sent RNID request for this entry */ + NLP_NVMET_RECOV = 12, /* NVMET auditing node for recovery. */ + NLP_UNREG_INP = 15, /* UNREG_RPI cmd is in progress */ + NLP_DROPPED = 16, /* Init ref count has been dropped */ + NLP_DELAY_TMO = 17, /* delay timeout is running for node */ + NLP_NPR_2B_DISC = 18, /* node is included in num_disc_nodes */ + NLP_RCV_PLOGI = 19, /* Rcv'ed PLOGI from remote system */ + NLP_LOGO_ACC = 20, /* Process LOGO after ACC completes */ + NLP_TGT_NO_SCSIID = 21, /* good PRLI but no binding for scsid */ + NLP_ISSUE_LOGO = 22, /* waiting to issue a LOGO */ + NLP_IN_DEV_LOSS = 23, /* devloss in progress */ + NLP_ACC_REGLOGIN = 24, /* Issue Reg Login after successful ACC */ -#define NLP_NPR_ADISC 0x02000000 /* Issue ADISC when dq'ed from + NLP_NPR_ADISC = 25, /* Issue ADISC when dq'ed from NPR list */ -#define NLP_RM_DFLT_RPI 0x04000000 /* need to remove leftover dflt RPI */ -#define NLP_NODEV_REMOVE 0x08000000 /* Defer removal till discovery ends */ -#define NLP_TARGET_REMOVE 0x10000000 /* Target remove in process */ -#define NLP_SC_REQ 0x20000000 /* Target requires authentication */ -#define NLP_FIRSTBURST 0x40000000 /* Target supports FirstBurst */ -#define NLP_RPI_REGISTERED 0x80000000 /* nlp_rpi is valid */ + NLP_RM_DFLT_RPI = 26, /* need to remove leftover dflt RPI */ + NLP_NODEV_REMOVE = 27, /* Defer removal till discovery ends */ + NLP_TARGET_REMOVE = 28, /* Target remove in process */ + NLP_SC_REQ = 29, /* Target requires authentication */ + NLP_FIRSTBURST = 30, /* Target supports FirstBurst */ + NLP_RPI_REGISTERED = 31 /* nlp_rpi is valid */ +}; /* There are 4 different double linked lists nodelist entries can reside on. * The Port Login (PLOGI) list and Address Discovery (ADISC) list are used diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 4e049783fc94e..b5fa5054e952e 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c @@ -725,11 +725,9 @@ lpfc_cmpl_els_flogi_fabric(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, list_for_each_entry_safe(np, next_np, &vport->fc_nodes, nlp_listp) { if ((np->nlp_state != NLP_STE_NPR_NODE) || - !(np->nlp_flag & NLP_NPR_ADISC)) + !test_bit(NLP_NPR_ADISC, &np->nlp_flag)) continue; - spin_lock_irq(&np->lock); - np->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(&np->lock); + clear_bit(NLP_NPR_ADISC, &np->nlp_flag); lpfc_unreg_rpi(vport, np); } lpfc_cleanup_pending_mbox(vport); @@ -864,9 +862,7 @@ lpfc_cmpl_els_flogi_nport(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, sizeof(struct lpfc_name)); /* Set state will put ndlp onto node list if not already done */ lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); if (!mbox) @@ -1018,7 +1014,7 @@ stop_rr_fcf_flogi: * registered with the SCSI transport, remove the initial * reference to trigger node release. */ - if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS) && + if (!test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag) && !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) lpfc_nlp_put(ndlp); @@ -1548,7 +1544,7 @@ lpfc_initial_flogi(struct lpfc_vport *vport) * Otherwise, decrement node reference to trigger release. */ if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) && - !(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) + !test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) lpfc_nlp_put(ndlp); return 0; } @@ -1597,7 +1593,7 @@ lpfc_initial_fdisc(struct lpfc_vport *vport) * Otherwise, decrement node reference to trigger release. */ if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) && - !(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) + !test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) lpfc_nlp_put(ndlp); return 0; } @@ -1675,9 +1671,9 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, struct lpfc_nodelist *new_ndlp; struct serv_parm *sp; uint8_t name[sizeof(struct lpfc_name)]; - uint32_t keepDID = 0, keep_nlp_flag = 0; + uint32_t keepDID = 0; int rc; - uint32_t keep_new_nlp_flag = 0; + unsigned long keep_nlp_flag = 0, keep_new_nlp_flag = 0; uint16_t keep_nlp_state; u32 keep_nlp_fc4_type = 0; struct lpfc_nvme_rport *keep_nrport = NULL; @@ -1704,8 +1700,8 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, } lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE, - "3178 PLOGI confirm: ndlp x%x x%x x%x: " - "new_ndlp x%x x%x x%x\n", + "3178 PLOGI confirm: ndlp x%x x%lx x%x: " + "new_ndlp x%x x%lx x%x\n", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_fc4_type, (new_ndlp ? new_ndlp->nlp_DID : 0), (new_ndlp ? new_ndlp->nlp_flag : 0), @@ -1769,48 +1765,48 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, new_ndlp->nlp_flag = ndlp->nlp_flag; /* if new_ndlp had NLP_UNREG_INP set, keep it */ - if (keep_new_nlp_flag & NLP_UNREG_INP) - new_ndlp->nlp_flag |= NLP_UNREG_INP; + if (test_bit(NLP_UNREG_INP, &keep_new_nlp_flag)) + set_bit(NLP_UNREG_INP, &new_ndlp->nlp_flag); else - new_ndlp->nlp_flag &= ~NLP_UNREG_INP; + clear_bit(NLP_UNREG_INP, &new_ndlp->nlp_flag); /* if new_ndlp had NLP_RPI_REGISTERED set, keep it */ - if (keep_new_nlp_flag & NLP_RPI_REGISTERED) - new_ndlp->nlp_flag |= NLP_RPI_REGISTERED; + if (test_bit(NLP_RPI_REGISTERED, &keep_new_nlp_flag)) + set_bit(NLP_RPI_REGISTERED, &new_ndlp->nlp_flag); else - new_ndlp->nlp_flag &= ~NLP_RPI_REGISTERED; + clear_bit(NLP_RPI_REGISTERED, &new_ndlp->nlp_flag); /* * Retain the DROPPED flag. This will take care of the init * refcount when affecting the state change */ - if (keep_new_nlp_flag & NLP_DROPPED) - new_ndlp->nlp_flag |= NLP_DROPPED; + if (test_bit(NLP_DROPPED, &keep_new_nlp_flag)) + set_bit(NLP_DROPPED, &new_ndlp->nlp_flag); else - new_ndlp->nlp_flag &= ~NLP_DROPPED; + clear_bit(NLP_DROPPED, &new_ndlp->nlp_flag); ndlp->nlp_flag = keep_new_nlp_flag; /* if ndlp had NLP_UNREG_INP set, keep it */ - if (keep_nlp_flag & NLP_UNREG_INP) - ndlp->nlp_flag |= NLP_UNREG_INP; + if (test_bit(NLP_UNREG_INP, &keep_nlp_flag)) + set_bit(NLP_UNREG_INP, &ndlp->nlp_flag); else - ndlp->nlp_flag &= ~NLP_UNREG_INP; + clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); /* if ndlp had NLP_RPI_REGISTERED set, keep it */ - if (keep_nlp_flag & NLP_RPI_REGISTERED) - ndlp->nlp_flag |= NLP_RPI_REGISTERED; + if (test_bit(NLP_RPI_REGISTERED, &keep_nlp_flag)) + set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); else - ndlp->nlp_flag &= ~NLP_RPI_REGISTERED; + clear_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); /* * Retain the DROPPED flag. This will take care of the init * refcount when affecting the state change */ - if (keep_nlp_flag & NLP_DROPPED) - ndlp->nlp_flag |= NLP_DROPPED; + if (test_bit(NLP_DROPPED, &keep_nlp_flag)) + set_bit(NLP_DROPPED, &ndlp->nlp_flag); else - ndlp->nlp_flag &= ~NLP_DROPPED; + clear_bit(NLP_DROPPED, &ndlp->nlp_flag); spin_unlock_irq(&new_ndlp->lock); spin_unlock_irq(&ndlp->lock); @@ -1888,7 +1884,7 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, phba->active_rrq_pool); lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE, - "3173 PLOGI confirm exit: new_ndlp x%x x%x x%x\n", + "3173 PLOGI confirm exit: new_ndlp x%x x%lx x%x\n", new_ndlp->nlp_DID, new_ndlp->nlp_flag, new_ndlp->nlp_fc4_type); @@ -2009,7 +2005,7 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, IOCB_t *irsp; struct lpfc_nodelist *ndlp, *free_ndlp; struct lpfc_dmabuf *prsp; - int disc; + bool disc; struct serv_parm *sp = NULL; u32 ulp_status, ulp_word4, did, iotag; bool release_node = false; @@ -2044,10 +2040,7 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* Since ndlp can be freed in the disc state machine, note if this node * is being used during discovery. */ - spin_lock_irq(&ndlp->lock); - disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC); - ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + disc = test_and_clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); /* PLOGI completes to NPort */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, @@ -2060,9 +2053,7 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* Check to see if link went down during discovery */ if (lpfc_els_chk_latt(vport)) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); goto out; } @@ -2070,11 +2061,8 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* Check for retry */ if (lpfc_els_retry(phba, cmdiocb, rspiocb)) { /* ELS command is being retried */ - if (disc) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); - } + if (disc) + set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); goto out; } /* Warn PLOGI status Don't print the vport to vport rjts */ @@ -2097,7 +2085,8 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, * with the reglogin process. */ spin_lock_irq(&ndlp->lock); - if ((ndlp->nlp_flag & (NLP_ACC_REGLOGIN | NLP_RCV_PLOGI)) && + if ((test_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag) || + test_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag)) && ndlp->nlp_state == NLP_STE_REG_LOGIN_ISSUE) { spin_unlock_irq(&ndlp->lock); goto out; @@ -2108,8 +2097,8 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, * start the device remove process. */ if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { - ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; - if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); + if (!test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) release_node = true; } spin_unlock_irq(&ndlp->lock); @@ -2212,12 +2201,13 @@ lpfc_issue_els_plogi(struct lpfc_vport *vport, uint32_t did, uint8_t retry) * outstanding UNREG_RPI mbox command completes, unless we * are going offline. This logic does not apply for Fabric DIDs */ - if ((ndlp->nlp_flag & (NLP_IGNR_REG_CMPL | NLP_UNREG_INP)) && + if ((test_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag) || + test_bit(NLP_UNREG_INP, &ndlp->nlp_flag)) && ((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) && !test_bit(FC_OFFLINE_MODE, &vport->fc_flag)) { lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "4110 Issue PLOGI x%x deferred " - "on NPort x%x rpi x%x flg x%x Data:" + "on NPort x%x rpi x%x flg x%lx Data:" " x%px\n", ndlp->nlp_defer_did, ndlp->nlp_DID, ndlp->nlp_rpi, ndlp->nlp_flag, ndlp); @@ -2335,10 +2325,10 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ulp_status = get_job_ulpstatus(phba, rspiocb); ulp_word4 = get_job_word4(phba, rspiocb); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_PRLI_SND; + clear_bit(NLP_PRLI_SND, &ndlp->nlp_flag); /* Driver supports multiple FC4 types. Counters matter. */ + spin_lock_irq(&ndlp->lock); vport->fc_prli_sent--; ndlp->fc4_prli_sent--; spin_unlock_irq(&ndlp->lock); @@ -2379,7 +2369,7 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* Warn PRLI status */ lpfc_printf_vlog(vport, mode, LOG_ELS, "2754 PRLI DID:%06X Status:x%x/x%x, " - "data: x%x x%x x%x\n", + "data: x%x x%x x%lx\n", ndlp->nlp_DID, ulp_status, ulp_word4, ndlp->nlp_state, ndlp->fc4_prli_sent, ndlp->nlp_flag); @@ -2396,10 +2386,10 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, if ((ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) || (ndlp->nlp_state == NLP_STE_NPR_NODE && - ndlp->nlp_flag & NLP_DELAY_TMO)) { - lpfc_printf_vlog(vport, KERN_WARNING, LOG_NODE, + test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag))) { + lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE, "2784 PRLI cmpl: Allow Node recovery " - "DID x%06x nstate x%x nflag x%x\n", + "DID x%06x nstate x%x nflag x%lx\n", ndlp->nlp_DID, ndlp->nlp_state, ndlp->nlp_flag); goto out; @@ -2420,8 +2410,8 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, spin_lock_irq(&ndlp->lock); if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) && !ndlp->fc4_prli_sent) { - ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; - if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); + if (!test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) release_node = true; } spin_unlock_irq(&ndlp->lock); @@ -2496,7 +2486,8 @@ lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ndlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR); ndlp->nlp_type &= ~(NLP_NVME_TARGET | NLP_NVME_INITIATOR); ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; - ndlp->nlp_flag &= ~(NLP_FIRSTBURST | NLP_NPR_2B_DISC); + clear_bit(NLP_FIRSTBURST, &ndlp->nlp_flag); + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); ndlp->nvme_fb_size = 0; send_next_prli: @@ -2627,8 +2618,8 @@ lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, * the ndlp is used to track outstanding PRLIs for different * FC4 types. */ + set_bit(NLP_PRLI_SND, &ndlp->nlp_flag); spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_PRLI_SND; vport->fc_prli_sent++; ndlp->fc4_prli_sent++; spin_unlock_irq(&ndlp->lock); @@ -2789,7 +2780,7 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, struct lpfc_vport *vport = cmdiocb->vport; IOCB_t *irsp; struct lpfc_nodelist *ndlp; - int disc; + bool disc; u32 ulp_status, ulp_word4, tmo, iotag; bool release_node = false; @@ -2818,10 +2809,8 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* Since ndlp can be freed in the disc state machine, note if this node * is being used during discovery. */ - spin_lock_irq(&ndlp->lock); - disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC); - ndlp->nlp_flag &= ~(NLP_ADISC_SND | NLP_NPR_2B_DISC); - spin_unlock_irq(&ndlp->lock); + disc = test_and_clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); + clear_bit(NLP_ADISC_SND, &ndlp->nlp_flag); /* ADISC completes to NPort */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0104 ADISC completes to NPort x%x " @@ -2832,9 +2821,7 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* Check to see if link went down during discovery */ if (lpfc_els_chk_latt(vport)) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); goto out; } @@ -2843,9 +2830,7 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, if (lpfc_els_retry(phba, cmdiocb, rspiocb)) { /* ELS command is being retried */ if (disc) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); lpfc_set_disctmo(vport); } goto out; @@ -2864,8 +2849,8 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, */ spin_lock_irq(&ndlp->lock); if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { - ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; - if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); + if (!test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) release_node = true; } spin_unlock_irq(&ndlp->lock); @@ -2938,9 +2923,7 @@ lpfc_issue_els_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, phba->fc_stat.elsXmitADISC++; elsiocb->cmd_cmpl = lpfc_cmpl_els_adisc; - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_ADISC_SND; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_ADISC_SND, &ndlp->nlp_flag); elsiocb->ndlp = lpfc_nlp_get(ndlp); if (!elsiocb->ndlp) { lpfc_els_free_iocb(phba, elsiocb); @@ -2961,9 +2944,7 @@ lpfc_issue_els_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, return 0; err: - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_ADISC_SND; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_ADISC_SND, &ndlp->nlp_flag); return 1; } @@ -2985,7 +2966,6 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, struct lpfc_nodelist *ndlp = cmdiocb->ndlp; struct lpfc_vport *vport = ndlp->vport; IOCB_t *irsp; - unsigned long flags; uint32_t skip_recovery = 0; int wake_up_waiter = 0; u32 ulp_status; @@ -3007,8 +2987,8 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, iotag = irsp->ulpIoTag; } + clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag); spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_LOGO_SND; if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) { wake_up_waiter = 1; ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO; @@ -3023,7 +3003,7 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* LOGO completes to NPort */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0105 LOGO completes to NPort x%x " - "IoTag x%x refcnt %d nflags x%x xflags x%x " + "IoTag x%x refcnt %d nflags x%lx xflags x%x " "Data: x%x x%x x%x x%x\n", ndlp->nlp_DID, iotag, kref_read(&ndlp->kref), ndlp->nlp_flag, @@ -3061,10 +3041,8 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* The driver sets this flag for an NPIV instance that doesn't want to * log into the remote port. */ - if (ndlp->nlp_flag & NLP_TARGET_REMOVE) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + if (test_bit(NLP_TARGET_REMOVE, &ndlp->nlp_flag)) { + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); lpfc_disc_state_machine(vport, ndlp, cmdiocb, NLP_EVT_DEVICE_RM); goto out_rsrc_free; @@ -3087,9 +3065,7 @@ out: if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET) && skip_recovery == 0) { lpfc_cancel_retry_delay_tmo(vport, ndlp); - spin_lock_irqsave(&ndlp->lock, flags); - ndlp->nlp_flag |= NLP_NPR_2B_DISC; - spin_unlock_irqrestore(&ndlp->lock, flags); + set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "3187 LOGO completes to NPort x%x: Start " @@ -3111,9 +3087,7 @@ out: * register with the transport. */ if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); lpfc_disc_state_machine(vport, ndlp, cmdiocb, NLP_EVT_DEVICE_RM); } @@ -3154,12 +3128,8 @@ lpfc_issue_els_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, uint16_t cmdsize; int rc; - spin_lock_irq(&ndlp->lock); - if (ndlp->nlp_flag & NLP_LOGO_SND) { - spin_unlock_irq(&ndlp->lock); + if (test_bit(NLP_LOGO_SND, &ndlp->nlp_flag)) return 0; - } - spin_unlock_irq(&ndlp->lock); cmdsize = (2 * sizeof(uint32_t)) + sizeof(struct lpfc_name); elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, @@ -3178,10 +3148,8 @@ lpfc_issue_els_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, phba->fc_stat.elsXmitLOGO++; elsiocb->cmd_cmpl = lpfc_cmpl_els_logo; - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_LOGO_SND; - ndlp->nlp_flag &= ~NLP_ISSUE_LOGO; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_LOGO_SND, &ndlp->nlp_flag); + clear_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag); elsiocb->ndlp = lpfc_nlp_get(ndlp); if (!elsiocb->ndlp) { lpfc_els_free_iocb(phba, elsiocb); @@ -3206,9 +3174,7 @@ lpfc_issue_els_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, return 0; err: - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_LOGO_SND; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag); return 1; } @@ -3284,13 +3250,13 @@ lpfc_cmpl_els_cmd(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, static int lpfc_reg_fab_ctrl_node(struct lpfc_vport *vport, struct lpfc_nodelist *fc_ndlp) { - int rc = 0; + int rc; struct lpfc_hba *phba = vport->phba; struct lpfc_nodelist *ns_ndlp; LPFC_MBOXQ_t *mbox; - if (fc_ndlp->nlp_flag & NLP_RPI_REGISTERED) - return rc; + if (test_bit(NLP_RPI_REGISTERED, &fc_ndlp->nlp_flag)) + return 0; ns_ndlp = lpfc_findnode_did(vport, NameServer_DID); if (!ns_ndlp) @@ -3307,7 +3273,7 @@ lpfc_reg_fab_ctrl_node(struct lpfc_vport *vport, struct lpfc_nodelist *fc_ndlp) if (!mbox) { lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE, "0936 %s: no memory for reg_login " - "Data: x%x x%x x%x x%x\n", __func__, + "Data: x%x x%x x%lx x%x\n", __func__, fc_ndlp->nlp_DID, fc_ndlp->nlp_state, fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi); return -ENOMEM; @@ -3319,7 +3285,7 @@ lpfc_reg_fab_ctrl_node(struct lpfc_vport *vport, struct lpfc_nodelist *fc_ndlp) goto out; } - fc_ndlp->nlp_flag |= NLP_REG_LOGIN_SEND; + set_bit(NLP_REG_LOGIN_SEND, &fc_ndlp->nlp_flag); mbox->mbox_cmpl = lpfc_mbx_cmpl_fc_reg_login; mbox->ctx_ndlp = lpfc_nlp_get(fc_ndlp); if (!mbox->ctx_ndlp) { @@ -3343,7 +3309,7 @@ lpfc_reg_fab_ctrl_node(struct lpfc_vport *vport, struct lpfc_nodelist *fc_ndlp) lpfc_mbox_rsrc_cleanup(phba, mbox, MBOX_THD_UNLOCKED); lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE, "0938 %s: failed to format reg_login " - "Data: x%x x%x x%x x%x\n", __func__, + "Data: x%x x%x x%lx x%x\n", __func__, fc_ndlp->nlp_DID, fc_ndlp->nlp_state, fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi); return rc; @@ -4382,11 +4348,8 @@ lpfc_cancel_retry_delay_tmo(struct lpfc_vport *vport, struct lpfc_nodelist *nlp) { struct lpfc_work_evt *evtp; - if (!(nlp->nlp_flag & NLP_DELAY_TMO)) + if (!test_and_clear_bit(NLP_DELAY_TMO, &nlp->nlp_flag)) return; - spin_lock_irq(&nlp->lock); - nlp->nlp_flag &= ~NLP_DELAY_TMO; - spin_unlock_irq(&nlp->lock); del_timer_sync(&nlp->nlp_delayfunc); nlp->nlp_last_elscmd = 0; if (!list_empty(&nlp->els_retry_evt.evt_listp)) { @@ -4395,10 +4358,7 @@ lpfc_cancel_retry_delay_tmo(struct lpfc_vport *vport, struct lpfc_nodelist *nlp) evtp = &nlp->els_retry_evt; lpfc_nlp_put((struct lpfc_nodelist *)evtp->evt_arg1); } - if (nlp->nlp_flag & NLP_NPR_2B_DISC) { - spin_lock_irq(&nlp->lock); - nlp->nlp_flag &= ~NLP_NPR_2B_DISC; - spin_unlock_irq(&nlp->lock); + if (test_and_clear_bit(NLP_NPR_2B_DISC, &nlp->nlp_flag)) { if (vport->num_disc_nodes) { if (vport->port_state < LPFC_VPORT_READY) { /* Check if there are more ADISCs to be sent */ @@ -4478,14 +4438,11 @@ lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp) spin_lock_irq(&ndlp->lock); cmd = ndlp->nlp_last_elscmd; ndlp->nlp_last_elscmd = 0; + spin_unlock_irq(&ndlp->lock); - if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) { - spin_unlock_irq(&ndlp->lock); + if (!test_and_clear_bit(NLP_DELAY_TMO, &ndlp->nlp_flag)) return; - } - ndlp->nlp_flag &= ~NLP_DELAY_TMO; - spin_unlock_irq(&ndlp->lock); /* * If a discovery event readded nlp_delayfunc after timer * firing and before processing the timer, cancel the @@ -5008,9 +4965,7 @@ out_retry: /* delay is specified in milliseconds */ mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(delay)); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_DELAY_TMO; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); ndlp->nlp_prev_state = ndlp->nlp_state; if ((cmd == ELS_CMD_PRLI) || @@ -5070,7 +5025,7 @@ out_retry: lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0108 No retry ELS command x%x to remote " "NPORT x%x Retried:%d Error:x%x/%x " - "IoTag x%x nflags x%x\n", + "IoTag x%x nflags x%lx\n", cmd, did, cmdiocb->retry, ulp_status, ulp_word4, cmdiocb->iotag, (ndlp ? ndlp->nlp_flag : 0)); @@ -5237,7 +5192,7 @@ lpfc_cmpl_els_logo_acc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* ACC to LOGO completes to NPort */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0109 ACC to LOGO completes to NPort x%x refcnt %d " - "last els x%x Data: x%x x%x x%x\n", + "last els x%x Data: x%lx x%x x%x\n", ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp->nlp_last_elscmd, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); @@ -5252,16 +5207,14 @@ lpfc_cmpl_els_logo_acc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, goto out; if (ndlp->nlp_state == NLP_STE_NPR_NODE) { - if (ndlp->nlp_flag & NLP_RPI_REGISTERED) + if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) lpfc_unreg_rpi(vport, ndlp); /* If came from PRLO, then PRLO_ACC is done. * Start rediscovery now. */ if (ndlp->nlp_last_elscmd == ELS_CMD_PRLO) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); ndlp->nlp_prev_state = ndlp->nlp_state; lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE); lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); @@ -5298,7 +5251,7 @@ lpfc_mbx_cmpl_dflt_rpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) if (ndlp) { lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, - "0006 rpi x%x DID:%x flg:%x %d x%px " + "0006 rpi x%x DID:%x flg:%lx %d x%px " "mbx_cmd x%x mbx_flag x%x x%px\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref), ndlp, mbx_cmd, @@ -5309,11 +5262,9 @@ lpfc_mbx_cmpl_dflt_rpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) * first on an UNREG_LOGIN and then release the final * references. */ - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; + clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); if (mbx_cmd == MBX_UNREG_LOGIN) - ndlp->nlp_flag &= ~NLP_UNREG_INP; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); lpfc_nlp_put(ndlp); lpfc_drop_node(ndlp->vport, ndlp); } @@ -5379,23 +5330,23 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* ELS response tag completes */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0110 ELS response tag x%x completes " - "Data: x%x x%x x%x x%x x%x x%x x%x x%x %p %p\n", + "Data: x%x x%x x%x x%x x%lx x%x x%x x%x %p %p\n", iotag, ulp_status, ulp_word4, tmo, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi, kref_read(&ndlp->kref), mbox, ndlp); if (mbox) { - if (ulp_status == 0 - && (ndlp->nlp_flag & NLP_ACC_REGLOGIN)) { + if (ulp_status == 0 && + test_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag)) { if (!lpfc_unreg_rpi(vport, ndlp) && !test_bit(FC_PT2PT, &vport->fc_flag)) { - if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || + if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || ndlp->nlp_state == NLP_STE_REG_LOGIN_ISSUE) { lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "0314 PLOGI recov " "DID x%x " - "Data: x%x x%x x%x\n", + "Data: x%x x%x x%lx\n", ndlp->nlp_DID, ndlp->nlp_state, ndlp->nlp_rpi, @@ -5412,18 +5363,17 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, goto out_free_mbox; mbox->vport = vport; - if (ndlp->nlp_flag & NLP_RM_DFLT_RPI) { + if (test_bit(NLP_RM_DFLT_RPI, &ndlp->nlp_flag)) { mbox->mbox_flag |= LPFC_MBX_IMED_UNREG; mbox->mbox_cmpl = lpfc_mbx_cmpl_dflt_rpi; - } - else { + } else { mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login; ndlp->nlp_prev_state = ndlp->nlp_state; lpfc_nlp_set_state(vport, ndlp, NLP_STE_REG_LOGIN_ISSUE); } - ndlp->nlp_flag |= NLP_REG_LOGIN_SEND; + set_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT) != MBX_NOT_FINISHED) goto out; @@ -5432,12 +5382,12 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, * set for this failed mailbox command. */ lpfc_nlp_put(ndlp); - ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; + clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); /* ELS rsp: Cannot issue reg_login for */ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, "0138 ELS rsp: Cannot issue reg_login for x%x " - "Data: x%x x%x x%x\n", + "Data: x%lx x%x x%x\n", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); } @@ -5446,11 +5396,9 @@ out_free_mbox: } out: if (ndlp && shost) { - spin_lock_irq(&ndlp->lock); if (mbox) - ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN; - ndlp->nlp_flag &= ~NLP_RM_DFLT_RPI; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag); + clear_bit(NLP_RM_DFLT_RPI, &ndlp->nlp_flag); } /* An SLI4 NPIV instance wants to drop the node at this point under @@ -5528,9 +5476,7 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, ndlp->nlp_DID, ELS_CMD_ACC); if (!elsiocb) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_LOGO_ACC; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); return 1; } @@ -5558,7 +5504,7 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, pcmd += sizeof(uint32_t); lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP, - "Issue ACC: did:x%x flg:x%x", + "Issue ACC: did:x%x flg:x%lx", ndlp->nlp_DID, ndlp->nlp_flag, 0); break; case ELS_CMD_FLOGI: @@ -5637,7 +5583,7 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, } lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP, - "Issue ACC FLOGI/PLOGI: did:x%x flg:x%x", + "Issue ACC FLOGI/PLOGI: did:x%x flg:x%lx", ndlp->nlp_DID, ndlp->nlp_flag, 0); break; case ELS_CMD_PRLO: @@ -5675,7 +5621,7 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, els_pkt_ptr->un.prlo.acceptRspCode = PRLO_REQ_EXECUTED; lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP, - "Issue ACC PRLO: did:x%x flg:x%x", + "Issue ACC PRLO: did:x%x flg:x%lx", ndlp->nlp_DID, ndlp->nlp_flag, 0); break; case ELS_CMD_RDF: @@ -5720,12 +5666,10 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, default: return 1; } - if (ndlp->nlp_flag & NLP_LOGO_ACC) { - spin_lock_irq(&ndlp->lock); - if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED || - ndlp->nlp_flag & NLP_REG_LOGIN_SEND)) - ndlp->nlp_flag &= ~NLP_LOGO_ACC; - spin_unlock_irq(&ndlp->lock); + if (test_bit(NLP_LOGO_ACC, &ndlp->nlp_flag)) { + if (!test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag) && + !test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) + clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); elsiocb->cmd_cmpl = lpfc_cmpl_els_logo_acc; } else { elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; @@ -5748,7 +5692,7 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, /* Xmit ELS ACC response tag */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0128 Xmit ELS ACC response Status: x%x, IoTag: x%x, " - "XRI: x%x, DID: x%x, nlp_flag: x%x nlp_state: x%x " + "XRI: x%x, DID: x%x, nlp_flag: x%lx nlp_state: x%x " "RPI: x%x, fc_flag x%lx refcnt %d\n", rc, elsiocb->iotag, elsiocb->sli4_xritag, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, @@ -5823,13 +5767,13 @@ lpfc_els_rsp_reject(struct lpfc_vport *vport, uint32_t rejectError, /* Xmit ELS RJT response tag */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0129 Xmit ELS RJT x%x response tag x%x " - "xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, " + "xri x%x, did x%x, nlp_flag x%lx, nlp_state x%x, " "rpi x%x\n", rejectError, elsiocb->iotag, get_job_ulpcontext(phba, elsiocb), ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP, - "Issue LS_RJT: did:x%x flg:x%x err:x%x", + "Issue LS_RJT: did:x%x flg:x%lx err:x%x", ndlp->nlp_DID, ndlp->nlp_flag, rejectError); phba->fc_stat.elsXmitLSRJT++; @@ -5920,7 +5864,7 @@ lpfc_issue_els_edc_rsp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb, lpfc_format_edc_lft_desc(phba, tlv); lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP, - "Issue EDC ACC: did:x%x flg:x%x refcnt %d", + "Issue EDC ACC: did:x%x flg:x%lx refcnt %d", ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; @@ -5942,7 +5886,7 @@ lpfc_issue_els_edc_rsp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb, /* Xmit ELS ACC response tag */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0152 Xmit EDC ACC response Status: x%x, IoTag: x%x, " - "XRI: x%x, DID: x%x, nlp_flag: x%x nlp_state: x%x " + "XRI: x%x, DID: x%x, nlp_flag: x%lx nlp_state: x%x " "RPI: x%x, fc_flag x%lx\n", rc, elsiocb->iotag, elsiocb->sli4_xritag, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, @@ -6011,7 +5955,7 @@ lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb, /* Xmit ADISC ACC response tag */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0130 Xmit ADISC ACC response iotag x%x xri: " - "x%x, did x%x, nlp_flag x%x, nlp_state x%x rpi x%x\n", + "x%x, did x%x, nlp_flag x%lx, nlp_state x%x rpi x%x\n", elsiocb->iotag, ulp_context, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); @@ -6027,7 +5971,7 @@ lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb, ap->DID = be32_to_cpu(vport->fc_myDID); lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP, - "Issue ACC ADISC: did:x%x flg:x%x refcnt %d", + "Issue ACC ADISC: did:x%x flg:x%lx refcnt %d", ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); phba->fc_stat.elsXmitACC++; @@ -6133,7 +6077,7 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb, /* Xmit PRLI ACC response tag */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0131 Xmit PRLI ACC response tag x%x xri x%x, " - "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n", + "did x%x, nlp_flag x%lx, nlp_state x%x, rpi x%x\n", elsiocb->iotag, ulp_context, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); @@ -6204,7 +6148,7 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb, lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME_DISC, "6015 NVME issue PRLI ACC word1 x%08x " - "word4 x%08x word5 x%08x flag x%x, " + "word4 x%08x word5 x%08x flag x%lx, " "fcp_info x%x nlp_type x%x\n", npr_nvme->word1, npr_nvme->word4, npr_nvme->word5, ndlp->nlp_flag, @@ -6219,7 +6163,7 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb, ndlp->nlp_DID); lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP, - "Issue ACC PRLI: did:x%x flg:x%x", + "Issue ACC PRLI: did:x%x flg:x%lx", ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); phba->fc_stat.elsXmitACC++; @@ -6333,7 +6277,7 @@ lpfc_els_rsp_rnid_acc(struct lpfc_vport *vport, uint8_t format, } lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP, - "Issue ACC RNID: did:x%x flg:x%x refcnt %d", + "Issue ACC RNID: did:x%x flg:x%lx refcnt %d", ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); phba->fc_stat.elsXmitACC++; @@ -6390,7 +6334,7 @@ lpfc_els_clear_rrq(struct lpfc_vport *vport, get_job_ulpcontext(phba, iocb)); lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP, - "Clear RRQ: did:x%x flg:x%x exchg:x%.08x", + "Clear RRQ: did:x%x flg:x%lx exchg:x%.08x", ndlp->nlp_DID, ndlp->nlp_flag, rrq->rrq_exchg); if (vport->fc_myDID == be32_to_cpu(bf_get(rrq_did, rrq))) xri = bf_get(rrq_oxid, rrq); @@ -6467,7 +6411,7 @@ lpfc_els_rsp_echo_acc(struct lpfc_vport *vport, uint8_t *data, memcpy(pcmd, data, cmdsize - sizeof(uint32_t)); lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP, - "Issue ACC ECHO: did:x%x flg:x%x refcnt %d", + "Issue ACC ECHO: did:x%x flg:x%lx refcnt %d", ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); phba->fc_stat.elsXmitACC++; @@ -6517,14 +6461,12 @@ lpfc_els_disc_adisc(struct lpfc_vport *vport) list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { if (ndlp->nlp_state != NLP_STE_NPR_NODE || - !(ndlp->nlp_flag & NLP_NPR_ADISC)) + !test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) continue; - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); - if (!(ndlp->nlp_flag & NLP_NPR_2B_DISC)) { + if (!test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) { /* This node was marked for ADISC but was not picked * for discovery. This is possible if the node was * missing in gidft response. @@ -6582,9 +6524,9 @@ lpfc_els_disc_plogi(struct lpfc_vport *vport) /* go thru NPR nodes and issue any remaining ELS PLOGIs */ list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { if (ndlp->nlp_state == NLP_STE_NPR_NODE && - (ndlp->nlp_flag & NLP_NPR_2B_DISC) != 0 && - (ndlp->nlp_flag & NLP_DELAY_TMO) == 0 && - (ndlp->nlp_flag & NLP_NPR_ADISC) == 0) { + test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag) && + !test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag) && + !test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) { ndlp->nlp_prev_state = ndlp->nlp_state; lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE); lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); @@ -7080,7 +7022,7 @@ lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context, lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "2171 Xmit RDP response tag x%x xri x%x, " - "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x", + "did x%x, nlp_flag x%lx, nlp_state x%x, rpi x%x", elsiocb->iotag, ulp_context, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); @@ -8054,7 +7996,7 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb, */ if (vport->port_state <= LPFC_NS_QRY) { lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV RSCN ignore: did:x%x/ste:x%x flg:x%x", + "RCV RSCN ignore: did:x%x/ste:x%x flg:x%lx", ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL); @@ -8084,7 +8026,7 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb, vport->fc_flag, payload_len, *lp, vport->fc_rscn_id_cnt); lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV RSCN vport: did:x%x/ste:x%x flg:x%x", + "RCV RSCN vport: did:x%x/ste:x%x flg:x%lx", ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); @@ -8121,7 +8063,7 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb, if (test_bit(FC_RSCN_MODE, &vport->fc_flag) || test_bit(FC_NDISC_ACTIVE, &vport->fc_flag)) { lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV RSCN defer: did:x%x/ste:x%x flg:x%x", + "RCV RSCN defer: did:x%x/ste:x%x flg:x%lx", ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); set_bit(FC_RSCN_DEFERRED, &vport->fc_flag); @@ -8177,7 +8119,7 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb, return 0; } lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV RSCN: did:x%x/ste:x%x flg:x%x", + "RCV RSCN: did:x%x/ste:x%x flg:x%lx", ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); set_bit(FC_RSCN_MODE, &vport->fc_flag); @@ -8683,7 +8625,7 @@ lpfc_els_rsp_rls_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) /* Xmit ELS RLS ACC response tag */ lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS, "2874 Xmit ELS RLS ACC response tag x%x xri x%x, " - "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n", + "did x%x, nlp_flag x%lx, nlp_state x%x, rpi x%x\n", elsiocb->iotag, ulp_context, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); @@ -8845,7 +8787,7 @@ lpfc_els_rcv_rtv(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb, /* Xmit ELS RLS ACC response tag */ lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS, "2875 Xmit ELS RTV ACC response tag x%x xri x%x, " - "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x, " + "did x%x, nlp_flag x%lx, nlp_state x%x, rpi x%x, " "Data: x%x x%x x%x\n", elsiocb->iotag, ulp_context, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, @@ -9042,7 +8984,7 @@ lpfc_els_rsp_rpl_acc(struct lpfc_vport *vport, uint16_t cmdsize, /* Xmit ELS RPL ACC response tag */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0120 Xmit ELS RPL ACC response tag x%x " - "xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, " + "xri x%x, did x%x, nlp_flag x%lx, nlp_state x%x, " "rpi x%x\n", elsiocb->iotag, ulp_context, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, @@ -10387,14 +10329,11 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, * Do not process any unsolicited ELS commands * if the ndlp is in DEV_LOSS */ - spin_lock_irq(&ndlp->lock); - if (ndlp->nlp_flag & NLP_IN_DEV_LOSS) { - spin_unlock_irq(&ndlp->lock); + if (test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) { if (newnode) lpfc_nlp_put(ndlp); goto dropit; } - spin_unlock_irq(&ndlp->lock); elsiocb->ndlp = lpfc_nlp_get(ndlp); if (!elsiocb->ndlp) @@ -10423,7 +10362,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, switch (cmd) { case ELS_CMD_PLOGI: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV PLOGI: did:x%x/ste:x%x flg:x%x", + "RCV PLOGI: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvPLOGI++; @@ -10462,9 +10401,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, } } - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_TARGET_REMOVE; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_TARGET_REMOVE, &ndlp->nlp_flag); lpfc_disc_state_machine(vport, ndlp, elsiocb, NLP_EVT_RCV_PLOGI); @@ -10472,7 +10409,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_FLOGI: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV FLOGI: did:x%x/ste:x%x flg:x%x", + "RCV FLOGI: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvFLOGI++; @@ -10499,7 +10436,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_LOGO: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV LOGO: did:x%x/ste:x%x flg:x%x", + "RCV LOGO: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvLOGO++; @@ -10516,7 +10453,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_PRLO: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV PRLO: did:x%x/ste:x%x flg:x%x", + "RCV PRLO: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvPRLO++; @@ -10545,7 +10482,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_ADISC: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV ADISC: did:x%x/ste:x%x flg:x%x", + "RCV ADISC: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); lpfc_send_els_event(vport, ndlp, payload); @@ -10560,7 +10497,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_PDISC: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV PDISC: did:x%x/ste:x%x flg:x%x", + "RCV PDISC: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvPDISC++; @@ -10574,7 +10511,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_FARPR: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV FARPR: did:x%x/ste:x%x flg:x%x", + "RCV FARPR: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvFARPR++; @@ -10582,7 +10519,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_FARP: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV FARP: did:x%x/ste:x%x flg:x%x", + "RCV FARP: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvFARP++; @@ -10590,7 +10527,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_FAN: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV FAN: did:x%x/ste:x%x flg:x%x", + "RCV FAN: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvFAN++; @@ -10599,7 +10536,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, case ELS_CMD_PRLI: case ELS_CMD_NVMEPRLI: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV PRLI: did:x%x/ste:x%x flg:x%x", + "RCV PRLI: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvPRLI++; @@ -10613,7 +10550,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_LIRR: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV LIRR: did:x%x/ste:x%x flg:x%x", + "RCV LIRR: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvLIRR++; @@ -10624,7 +10561,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_RLS: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV RLS: did:x%x/ste:x%x flg:x%x", + "RCV RLS: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvRLS++; @@ -10635,7 +10572,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_RPL: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV RPL: did:x%x/ste:x%x flg:x%x", + "RCV RPL: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvRPL++; @@ -10646,7 +10583,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_RNID: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV RNID: did:x%x/ste:x%x flg:x%x", + "RCV RNID: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvRNID++; @@ -10657,7 +10594,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_RTV: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV RTV: did:x%x/ste:x%x flg:x%x", + "RCV RTV: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvRTV++; lpfc_els_rcv_rtv(vport, elsiocb, ndlp); @@ -10667,7 +10604,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_RRQ: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV RRQ: did:x%x/ste:x%x flg:x%x", + "RCV RRQ: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvRRQ++; @@ -10678,7 +10615,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_ECHO: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV ECHO: did:x%x/ste:x%x flg:x%x", + "RCV ECHO: did:x%x/ste:x%x flg:x%lx", did, vport->port_state, ndlp->nlp_flag); phba->fc_stat.elsRcvECHO++; @@ -10694,7 +10631,8 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, break; case ELS_CMD_FPIN: lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, - "RCV FPIN: did:x%x/ste:x%x flg:x%x", + "RCV FPIN: did:x%x/ste:x%x " + "flg:x%lx", did, vport->port_state, ndlp->nlp_flag); lpfc_els_rcv_fpin(vport, (struct fc_els_fpin *)payload, @@ -11202,9 +11140,7 @@ lpfc_retry_pport_discovery(struct lpfc_hba *phba) return; mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000)); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_DELAY_TMO; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); ndlp->nlp_last_elscmd = ELS_CMD_FLOGI; phba->pport->port_state = LPFC_FLOGI; return; @@ -11335,11 +11271,9 @@ lpfc_cmpl_els_fdisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, list_for_each_entry_safe(np, next_np, &vport->fc_nodes, nlp_listp) { if ((np->nlp_state != NLP_STE_NPR_NODE) || - !(np->nlp_flag & NLP_NPR_ADISC)) + !test_bit(NLP_NPR_ADISC, &np->nlp_flag)) continue; - spin_lock_irq(&ndlp->lock); - np->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NPR_ADISC, &np->nlp_flag); lpfc_unreg_rpi(vport, np); } lpfc_cleanup_pending_mbox(vport); @@ -11542,7 +11476,7 @@ lpfc_cmpl_els_npiv_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* NPIV LOGO completes to NPort */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "2928 NPIV LOGO completes to NPort x%x " - "Data: x%x x%x x%x x%x x%x x%x x%x\n", + "Data: x%x x%x x%x x%x x%x x%lx x%x\n", ndlp->nlp_DID, ulp_status, ulp_word4, tmo, vport->num_disc_nodes, kref_read(&ndlp->kref), ndlp->nlp_flag, @@ -11558,8 +11492,9 @@ lpfc_cmpl_els_npiv_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* Wake up lpfc_vport_delete if waiting...*/ if (ndlp->logo_waitq) wake_up(ndlp->logo_waitq); + clear_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag); + clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag); spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~(NLP_ISSUE_LOGO | NLP_LOGO_SND); ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO; spin_unlock_irq(&ndlp->lock); } @@ -11609,13 +11544,11 @@ lpfc_issue_els_npiv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name)); lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD, - "Issue LOGO npiv did:x%x flg:x%x", + "Issue LOGO npiv did:x%x flg:x%lx", ndlp->nlp_DID, ndlp->nlp_flag, 0); elsiocb->cmd_cmpl = lpfc_cmpl_els_npiv_logo; - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_LOGO_SND; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_LOGO_SND, &ndlp->nlp_flag); elsiocb->ndlp = lpfc_nlp_get(ndlp); if (!elsiocb->ndlp) { lpfc_els_free_iocb(phba, elsiocb); @@ -11631,9 +11564,7 @@ lpfc_issue_els_npiv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) return 0; err: - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_LOGO_SND; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag); return 1; } @@ -12114,7 +12045,7 @@ lpfc_sli_abts_recover_port(struct lpfc_vport *vport, lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT, "3094 Start rport recovery on shost id 0x%x " "fc_id 0x%06x vpi 0x%x rpi 0x%x state 0x%x " - "flags 0x%x\n", + "flag 0x%lx\n", shost->host_no, ndlp->nlp_DID, vport->vpi, ndlp->nlp_rpi, ndlp->nlp_state, ndlp->nlp_flag); @@ -12124,8 +12055,8 @@ lpfc_sli_abts_recover_port(struct lpfc_vport *vport, */ spin_lock_irqsave(&ndlp->lock, flags); ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; - ndlp->nlp_flag |= NLP_ISSUE_LOGO; spin_unlock_irqrestore(&ndlp->lock, flags); + set_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag); lpfc_unreg_rpi(vport, ndlp); } diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index ff559b28738cf..5297122f89fc8 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -137,7 +137,7 @@ lpfc_terminate_rport_io(struct fc_rport *rport) ndlp = rdata->pnode; vport = ndlp->vport; lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_RPORT, - "rport terminate: sid:x%x did:x%x flg:x%x", + "rport terminate: sid:x%x did:x%x flg:x%lx", ndlp->nlp_sid, ndlp->nlp_DID, ndlp->nlp_flag); if (ndlp->nlp_sid != NLP_NO_SID) @@ -165,11 +165,11 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport) phba = vport->phba; lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_RPORT, - "rport devlosscb: sid:x%x did:x%x flg:x%x", + "rport devlosscb: sid:x%x did:x%x flg:x%lx", ndlp->nlp_sid, ndlp->nlp_DID, ndlp->nlp_flag); lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, - "3181 dev_loss_callbk x%06x, rport x%px flg x%x " + "3181 dev_loss_callbk x%06x, rport x%px flg x%lx " "load_flag x%lx refcnt %u state %d xpt x%x\n", ndlp->nlp_DID, ndlp->rport, ndlp->nlp_flag, vport->load_flag, kref_read(&ndlp->kref), @@ -208,18 +208,13 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport) spin_unlock_irqrestore(&ndlp->lock, iflags); } - spin_lock_irqsave(&ndlp->lock, iflags); - /* Only 1 thread can drop the initial node reference. If * another thread has set NLP_DROPPED, this thread is done. */ - if (nvme_reg || (ndlp->nlp_flag & NLP_DROPPED)) { - spin_unlock_irqrestore(&ndlp->lock, iflags); + if (nvme_reg || test_bit(NLP_DROPPED, &ndlp->nlp_flag)) return; - } - ndlp->nlp_flag |= NLP_DROPPED; - spin_unlock_irqrestore(&ndlp->lock, iflags); + set_bit(NLP_DROPPED, &ndlp->nlp_flag); lpfc_nlp_put(ndlp); return; } @@ -253,14 +248,14 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport) return; } - spin_lock_irqsave(&ndlp->lock, iflags); - ndlp->nlp_flag |= NLP_IN_DEV_LOSS; + set_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); + spin_lock_irqsave(&ndlp->lock, iflags); /* If there is a PLOGI in progress, and we are in a * NLP_NPR_2B_DISC state, don't turn off the flag. */ if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE) - ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); /* * The backend does not expect any more calls associated with this @@ -289,15 +284,13 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport) } else { lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, "3188 worker thread is stopped %s x%06x, " - " rport x%px flg x%x load_flag x%lx refcnt " + " rport x%px flg x%lx load_flag x%lx refcnt " "%d\n", __func__, ndlp->nlp_DID, ndlp->rport, ndlp->nlp_flag, vport->load_flag, kref_read(&ndlp->kref)); if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD)) { - spin_lock_irqsave(&ndlp->lock, iflags); /* Node is in dev loss. No further transaction. */ - ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS; - spin_unlock_irqrestore(&ndlp->lock, iflags); + clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); lpfc_disc_state_machine(vport, ndlp, NULL, NLP_EVT_DEVICE_RM); } @@ -430,7 +423,7 @@ lpfc_check_nlp_post_devloss(struct lpfc_vport *vport, lpfc_nlp_get(ndlp); lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY | LOG_NODE, "8438 Devloss timeout reversed on DID x%x " - "refcnt %d ndlp %p flag x%x " + "refcnt %d ndlp %p flag x%lx " "port_state = x%x\n", ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp, ndlp->nlp_flag, vport->port_state); @@ -473,7 +466,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp) ndlp->nlp_DID, ndlp->nlp_type, ndlp->nlp_sid); lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, - "3182 %s x%06x, nflag x%x xflags x%x refcnt %d\n", + "3182 %s x%06x, nflag x%lx xflags x%x refcnt %d\n", __func__, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->fc4_xpt_flags, kref_read(&ndlp->kref)); @@ -487,9 +480,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp) *(name+4), *(name+5), *(name+6), *(name+7), ndlp->nlp_DID); - spin_lock_irqsave(&ndlp->lock, iflags); - ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS; - spin_unlock_irqrestore(&ndlp->lock, iflags); + clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); return fcf_inuse; } @@ -517,7 +508,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp) } break; case Fabric_Cntl_DID: - if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND) + if (test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) recovering = true; break; case FDMI_DID: @@ -545,15 +536,13 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp) * the following lpfc_nlp_put is necessary after fabric node is * recovered. */ - spin_lock_irqsave(&ndlp->lock, iflags); - ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS; - spin_unlock_irqrestore(&ndlp->lock, iflags); + clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); if (recovering) { lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY | LOG_NODE, "8436 Devloss timeout marked on " "DID x%x refcnt %d ndlp %p " - "flag x%x port_state = x%x\n", + "flag x%lx port_state = x%x\n", ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp, ndlp->nlp_flag, vport->port_state); @@ -570,7 +559,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp) LOG_DISCOVERY | LOG_NODE, "8437 Devloss timeout ignored on " "DID x%x refcnt %d ndlp %p " - "flag x%x port_state = x%x\n", + "flag x%lx port_state = x%x\n", ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp, ndlp->nlp_flag, vport->port_state); @@ -590,7 +579,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp) lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, "0203 Devloss timeout on " "WWPN %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x " - "NPort x%06x Data: x%x x%x x%x refcnt %d\n", + "NPort x%06x Data: x%lx x%x x%x refcnt %d\n", *name, *(name+1), *(name+2), *(name+3), *(name+4), *(name+5), *(name+6), *(name+7), ndlp->nlp_DID, ndlp->nlp_flag, @@ -600,15 +589,13 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp) lpfc_printf_vlog(vport, KERN_INFO, LOG_TRACE_EVENT, "0204 Devloss timeout on " "WWPN %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x " - "NPort x%06x Data: x%x x%x x%x\n", + "NPort x%06x Data: x%lx x%x x%x\n", *name, *(name+1), *(name+2), *(name+3), *(name+4), *(name+5), *(name+6), *(name+7), ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); } - spin_lock_irqsave(&ndlp->lock, iflags); - ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS; - spin_unlock_irqrestore(&ndlp->lock, iflags); + clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); /* If we are devloss, but we are in the process of rediscovering the * ndlp, don't issue a NLP_EVT_DEVICE_RM event. @@ -1373,7 +1360,7 @@ lpfc_linkup_cleanup_nodes(struct lpfc_vport *vport) if (ndlp->nlp_DID != Fabric_DID) lpfc_unreg_rpi(vport, ndlp); lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); - } else if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) { + } else if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) { /* Fail outstanding IO now since device is * marked for PLOGI. */ @@ -3882,14 +3869,13 @@ lpfc_mbx_cmpl_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) pmb->ctx_ndlp = NULL; lpfc_printf_vlog(vport, KERN_INFO, LOG_SLI | LOG_NODE | LOG_DISCOVERY, - "0002 rpi:%x DID:%x flg:%x %d x%px\n", + "0002 rpi:%x DID:%x flg:%lx %d x%px\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref), ndlp); - if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND) - ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; + clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); - if (ndlp->nlp_flag & NLP_IGNR_REG_CMPL || + if (test_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag) || ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) { /* We rcvd a rscn after issuing this * mbox reg login, we may have cycled @@ -3899,16 +3885,14 @@ lpfc_mbx_cmpl_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) * there is another reg login in * process. */ - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag); /* * We cannot leave the RPI registered because * if we go thru discovery again for this ndlp * a subsequent REG_RPI will fail. */ - ndlp->nlp_flag |= NLP_RPI_REGISTERED; + set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); lpfc_unreg_rpi(vport, ndlp); } @@ -4221,7 +4205,7 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) if (phba->sli_rev < LPFC_SLI_REV4) ndlp->nlp_rpi = mb->un.varWords[0]; - ndlp->nlp_flag |= NLP_RPI_REGISTERED; + set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); ndlp->nlp_type |= NLP_FABRIC; lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE); @@ -4352,9 +4336,7 @@ out: * reference. */ if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); lpfc_nlp_put(ndlp); } @@ -4375,11 +4357,11 @@ out: if (phba->sli_rev < LPFC_SLI_REV4) ndlp->nlp_rpi = mb->un.varWords[0]; - ndlp->nlp_flag |= NLP_RPI_REGISTERED; + set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); ndlp->nlp_type |= NLP_FABRIC; lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE); lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE | LOG_DISCOVERY, - "0003 rpi:%x DID:%x flg:%x %d x%px\n", + "0003 rpi:%x DID:%x flg:%lx %d x%px\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref), ndlp); @@ -4471,8 +4453,8 @@ lpfc_mbx_cmpl_fc_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) __func__, ndlp->nlp_DID, ndlp->nlp_rpi, ndlp->nlp_state); - ndlp->nlp_flag |= NLP_RPI_REGISTERED; - ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; + set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); + clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); ndlp->nlp_type |= NLP_FABRIC; lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE); @@ -4506,7 +4488,7 @@ lpfc_register_remote_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_RPORT, - "rport add: did:x%x flg:x%x type x%x", + "rport add: did:x%x flg:x%lx type x%x", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type); /* Don't add the remote port if unloading. */ @@ -4574,7 +4556,7 @@ lpfc_unregister_remote_port(struct lpfc_nodelist *ndlp) return; lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_RPORT, - "rport delete: did:x%x flg:x%x type x%x", + "rport delete: did:x%x flg:x%lx type x%x", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type); lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE, @@ -4690,7 +4672,7 @@ lpfc_nlp_unreg_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE | LOG_DISCOVERY, "0999 %s Not regd: ndlp x%px rport x%px DID " - "x%x FLG x%x XPT x%x\n", + "x%x FLG x%lx XPT x%x\n", __func__, ndlp, ndlp->rport, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->fc4_xpt_flags); return; @@ -4706,7 +4688,7 @@ lpfc_nlp_unreg_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) } else if (!ndlp->rport) { lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE | LOG_DISCOVERY, - "1999 %s NDLP in devloss x%px DID x%x FLG x%x" + "1999 %s NDLP in devloss x%px DID x%x FLG x%lx" " XPT x%x refcnt %u\n", __func__, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->fc4_xpt_flags, @@ -4751,7 +4733,7 @@ lpfc_handle_adisc_state(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ndlp->nlp_type |= NLP_FC_NODE; fallthrough; case NLP_STE_MAPPED_NODE: - ndlp->nlp_flag &= ~NLP_NODEV_REMOVE; + clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); lpfc_nlp_reg_node(vport, ndlp); break; @@ -4762,7 +4744,7 @@ lpfc_handle_adisc_state(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, * backend, attempt it now */ case NLP_STE_NPR_NODE: - ndlp->nlp_flag &= ~NLP_RCV_PLOGI; + clear_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag); fallthrough; default: lpfc_nlp_unreg_node(vport, ndlp); @@ -4783,13 +4765,13 @@ lpfc_nlp_state_cleanup(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, } if (new_state == NLP_STE_UNMAPPED_NODE) { - ndlp->nlp_flag &= ~NLP_NODEV_REMOVE; + clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); ndlp->nlp_type |= NLP_FC_NODE; } if (new_state == NLP_STE_MAPPED_NODE) - ndlp->nlp_flag &= ~NLP_NODEV_REMOVE; + clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); if (new_state == NLP_STE_NPR_NODE) - ndlp->nlp_flag &= ~NLP_RCV_PLOGI; + clear_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag); /* Reg/Unreg for FCP and NVME Transport interface */ if ((old_state == NLP_STE_MAPPED_NODE || @@ -4797,7 +4779,7 @@ lpfc_nlp_state_cleanup(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, /* For nodes marked for ADISC, Handle unreg in ADISC cmpl * if linkup. In linkdown do unreg_node */ - if (!(ndlp->nlp_flag & NLP_NPR_ADISC) || + if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag) || !lpfc_is_link_up(vport->phba)) lpfc_nlp_unreg_node(vport, ndlp); } @@ -4817,9 +4799,7 @@ lpfc_nlp_state_cleanup(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, (!ndlp->rport || ndlp->rport->scsi_target_id == -1 || ndlp->rport->scsi_target_id >= LPFC_MAX_TARGET)) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_TGT_NO_SCSIID; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_TGT_NO_SCSIID, &ndlp->nlp_flag); lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE); } } @@ -4851,7 +4831,7 @@ lpfc_nlp_set_state(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, int state) { int old_state = ndlp->nlp_state; - int node_dropped = ndlp->nlp_flag & NLP_DROPPED; + bool node_dropped = test_bit(NLP_DROPPED, &ndlp->nlp_flag); char name1[16], name2[16]; unsigned long iflags; @@ -4867,7 +4847,7 @@ lpfc_nlp_set_state(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, if (node_dropped && old_state == NLP_STE_UNUSED_NODE && state != NLP_STE_UNUSED_NODE) { - ndlp->nlp_flag &= ~NLP_DROPPED; + clear_bit(NLP_DROPPED, &ndlp->nlp_flag); lpfc_nlp_get(ndlp); } @@ -4875,7 +4855,7 @@ lpfc_nlp_set_state(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, state != NLP_STE_NPR_NODE) lpfc_cancel_retry_delay_tmo(vport, ndlp); if (old_state == NLP_STE_UNMAPPED_NODE) { - ndlp->nlp_flag &= ~NLP_TGT_NO_SCSIID; + clear_bit(NLP_TGT_NO_SCSIID, &ndlp->nlp_flag); ndlp->nlp_type &= ~NLP_FC_NODE; } @@ -4972,14 +4952,8 @@ lpfc_drop_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) * reference from lpfc_nlp_init. If set, don't drop it again and * introduce an imbalance. */ - spin_lock_irq(&ndlp->lock); - if (!(ndlp->nlp_flag & NLP_DROPPED)) { - ndlp->nlp_flag |= NLP_DROPPED; - spin_unlock_irq(&ndlp->lock); + if (!test_and_set_bit(NLP_DROPPED, &ndlp->nlp_flag)) lpfc_nlp_put(ndlp); - return; - } - spin_unlock_irq(&ndlp->lock); } /* @@ -5094,9 +5068,9 @@ lpfc_check_sli_ndlp(struct lpfc_hba *phba, } else if (pring->ringno == LPFC_FCP_RING) { /* Skip match check if waiting to relogin to FCP target */ if ((ndlp->nlp_type & NLP_FCP_TARGET) && - (ndlp->nlp_flag & NLP_DELAY_TMO)) { + test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag)) return 0; - } + if (ulp_context == ndlp->nlp_rpi) return 1; } @@ -5166,7 +5140,7 @@ lpfc_no_rpi(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) * Everything that matches on txcmplq will be returned * by firmware with a no rpi error. */ - if (ndlp->nlp_flag & NLP_RPI_REGISTERED) { + if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) { if (phba->sli_rev != LPFC_SLI_REV4) lpfc_sli3_dequeue_nport_iocbs(phba, ndlp, &completions); else @@ -5200,21 +5174,19 @@ lpfc_nlp_logo_unreg(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) lpfc_issue_els_logo(vport, ndlp, 0); /* Check to see if there are any deferred events to process */ - if ((ndlp->nlp_flag & NLP_UNREG_INP) && - (ndlp->nlp_defer_did != NLP_EVT_NOTHING_PENDING)) { + if (test_bit(NLP_UNREG_INP, &ndlp->nlp_flag) && + ndlp->nlp_defer_did != NLP_EVT_NOTHING_PENDING) { lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "1434 UNREG cmpl deferred logo x%x " "on NPort x%x Data: x%x x%px\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_defer_did, ndlp); - ndlp->nlp_flag &= ~NLP_UNREG_INP; + clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING; lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); } else { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_UNREG_INP; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); } /* The node has an outstanding reference for the unreg. Now @@ -5241,9 +5213,8 @@ lpfc_set_unreg_login_mbx_cmpl(struct lpfc_hba *phba, struct lpfc_vport *vport, if (!mbox->ctx_ndlp) return; - if (ndlp->nlp_flag & NLP_ISSUE_LOGO) { + if (test_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag)) { mbox->mbox_cmpl = lpfc_nlp_logo_unreg; - } else if (phba->sli_rev == LPFC_SLI_REV4 && !test_bit(FC_UNLOADING, &vport->load_flag) && (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) >= @@ -5272,13 +5243,13 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) int rc, acc_plogi = 1; uint16_t rpi; - if (ndlp->nlp_flag & NLP_RPI_REGISTERED || - ndlp->nlp_flag & NLP_REG_LOGIN_SEND) { - if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND) + if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag) || + test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) { + if (test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE | LOG_DISCOVERY, "3366 RPI x%x needs to be " - "unregistered nlp_flag x%x " + "unregistered nlp_flag x%lx " "did x%x\n", ndlp->nlp_rpi, ndlp->nlp_flag, ndlp->nlp_DID); @@ -5286,11 +5257,11 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) /* If there is already an UNREG in progress for this ndlp, * no need to queue up another one. */ - if (ndlp->nlp_flag & NLP_UNREG_INP) { + if (test_bit(NLP_UNREG_INP, &ndlp->nlp_flag)) { lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE | LOG_DISCOVERY, "1436 unreg_rpi SKIP UNREG x%x on " - "NPort x%x deferred x%x flg x%x " + "NPort x%x deferred x%x flg x%lx " "Data: x%px\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_defer_did, @@ -5318,19 +5289,19 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) acc_plogi = 0; if (!test_bit(FC_OFFLINE_MODE, &vport->fc_flag)) - ndlp->nlp_flag |= NLP_UNREG_INP; + set_bit(NLP_UNREG_INP, &ndlp->nlp_flag); lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE | LOG_DISCOVERY, "1433 unreg_rpi UNREG x%x on " - "NPort x%x deferred flg x%x " + "NPort x%x deferred flg x%lx " "Data:x%px\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, ndlp); rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT); if (rc == MBX_NOT_FINISHED) { - ndlp->nlp_flag &= ~NLP_UNREG_INP; + clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); mempool_free(mbox, phba->mbox_mem_pool); acc_plogi = 1; lpfc_nlp_put(ndlp); @@ -5340,7 +5311,7 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) LOG_NODE | LOG_DISCOVERY, "1444 Failed to allocate mempool " "unreg_rpi UNREG x%x, " - "DID x%x, flag x%x, " + "DID x%x, flag x%lx, " "ndlp x%px\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, ndlp); @@ -5350,7 +5321,7 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) * not unloading. */ if (!test_bit(FC_UNLOADING, &vport->load_flag)) { - ndlp->nlp_flag &= ~NLP_UNREG_INP; + clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); lpfc_issue_els_logo(vport, ndlp, 0); ndlp->nlp_prev_state = ndlp->nlp_state; lpfc_nlp_set_state(vport, ndlp, @@ -5363,13 +5334,13 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) out: if (phba->sli_rev != LPFC_SLI_REV4) ndlp->nlp_rpi = 0; - ndlp->nlp_flag &= ~NLP_RPI_REGISTERED; - ndlp->nlp_flag &= ~NLP_NPR_ADISC; + clear_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); + clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); if (acc_plogi) - ndlp->nlp_flag &= ~NLP_LOGO_ACC; + clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); return 1; } - ndlp->nlp_flag &= ~NLP_LOGO_ACC; + clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); return 0; } @@ -5397,7 +5368,7 @@ lpfc_unreg_hba_rpis(struct lpfc_hba *phba) for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { spin_lock_irqsave(&vports[i]->fc_nodes_list_lock, iflags); list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { - if (ndlp->nlp_flag & NLP_RPI_REGISTERED) { + if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) { /* The mempool_alloc might sleep */ spin_unlock_irqrestore(&vports[i]->fc_nodes_list_lock, iflags); @@ -5485,7 +5456,7 @@ lpfc_cleanup_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) /* Cleanup node for NPort */ lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE, "0900 Cleanup node for NPort x%x " - "Data: x%x x%x x%x\n", + "Data: x%lx x%x x%x\n", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); lpfc_dequeue_node(vport, ndlp); @@ -5530,9 +5501,7 @@ lpfc_cleanup_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) lpfc_els_abort(phba, ndlp); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_DELAY_TMO; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); ndlp->nlp_last_elscmd = 0; del_timer_sync(&ndlp->nlp_delayfunc); @@ -5615,7 +5584,7 @@ __lpfc_findnode_did(struct lpfc_vport *vport, uint32_t did) ); lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE_VERBOSE, "0929 FIND node DID " - "Data: x%px x%x x%x x%x x%x x%px\n", + "Data: x%px x%x x%lx x%x x%x x%px\n", ndlp, ndlp->nlp_DID, ndlp->nlp_flag, data1, ndlp->nlp_rpi, ndlp->active_rrqs_xri_bitmap); @@ -5668,7 +5637,7 @@ lpfc_findnode_mapped(struct lpfc_vport *vport) iflags); lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE_VERBOSE, "2025 FIND node DID MAPPED " - "Data: x%px x%x x%x x%x x%px\n", + "Data: x%px x%x x%lx x%x x%px\n", ndlp, ndlp->nlp_DID, ndlp->nlp_flag, data1, ndlp->active_rrqs_xri_bitmap); @@ -5702,13 +5671,11 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "6453 Setup New Node 2B_DISC x%x " - "Data:x%x x%x x%lx\n", + "Data:x%lx x%x x%lx\n", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, vport->fc_flag); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); return ndlp; } @@ -5727,7 +5694,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did) lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "6455 Setup RSCN Node 2B_DISC x%x " - "Data:x%x x%x x%lx\n", + "Data:x%lx x%x x%lx\n", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, vport->fc_flag); @@ -5745,13 +5712,11 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did) NLP_EVT_DEVICE_RECOVERY); } - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); } else { lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "6456 Skip Setup RSCN Node x%x " - "Data:x%x x%x x%lx\n", + "Data:x%lx x%x x%lx\n", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, vport->fc_flag); ndlp = NULL; @@ -5759,7 +5724,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did) } else { lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "6457 Setup Active Node 2B_DISC x%x " - "Data:x%x x%x x%lx\n", + "Data:x%lx x%x x%lx\n", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, vport->fc_flag); @@ -5770,7 +5735,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did) if (ndlp->nlp_state == NLP_STE_ADISC_ISSUE || ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || (!vport->phba->nvmet_support && - ndlp->nlp_flag & NLP_RCV_PLOGI)) + test_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag))) return NULL; if (vport->phba->nvmet_support) @@ -5780,10 +5745,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did) * allows for rediscovery */ lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); - - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); } return ndlp; } @@ -6154,7 +6116,7 @@ lpfc_disc_timeout_handler(struct lpfc_vport *vport) /* Clean up the ndlp on Fabric connections */ lpfc_drop_node(vport, ndlp); - } else if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) { + } else if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) { /* Fail outstanding IO now since device * is marked for PLOGI. */ @@ -6367,11 +6329,11 @@ lpfc_mbx_cmpl_fdmi_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) if (phba->sli_rev < LPFC_SLI_REV4) ndlp->nlp_rpi = mb->un.varWords[0]; - ndlp->nlp_flag |= NLP_RPI_REGISTERED; + set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); ndlp->nlp_type |= NLP_FABRIC; lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE); lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE | LOG_DISCOVERY, - "0004 rpi:%x DID:%x flg:%x %d x%px\n", + "0004 rpi:%x DID:%x flg:%lx %d x%px\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref), ndlp); @@ -6421,7 +6383,7 @@ __lpfc_find_node(struct lpfc_vport *vport, node_filter filter, void *param) if (filter(ndlp, param)) { lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE_VERBOSE, "3185 FIND node filter %ps DID " - "ndlp x%px did x%x flg x%x st x%x " + "ndlp x%px did x%x flg x%lx st x%x " "xri x%x type x%x rpi x%x\n", filter, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, @@ -6559,7 +6521,7 @@ lpfc_nlp_init(struct lpfc_vport *vport, uint32_t did) lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE | LOG_DISCOVERY, "0007 Init New ndlp x%px, rpi:x%x DID:x%x " - "flg:x%x refcnt:%d\n", + "flg:x%lx refcnt:%d\n", ndlp, ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); @@ -6591,7 +6553,7 @@ lpfc_nlp_release(struct kref *kref) struct lpfc_vport *vport = ndlp->vport; lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE, - "node release: did:x%x flg:x%x type:x%x", + "node release: did:x%x flg:x%lx type:x%x", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type); lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE, @@ -6637,7 +6599,7 @@ lpfc_nlp_get(struct lpfc_nodelist *ndlp) if (ndlp) { lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE, - "node get: did:x%x flg:x%x refcnt:x%x", + "node get: did:x%x flg:x%lx refcnt:x%x", ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); @@ -6669,7 +6631,7 @@ lpfc_nlp_put(struct lpfc_nodelist *ndlp) { if (ndlp) { lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE, - "node put: did:x%x flg:x%x refcnt:x%x", + "node put: did:x%x flg:x%lx refcnt:x%x", ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); } else { @@ -6722,11 +6684,12 @@ lpfc_fcf_inuse(struct lpfc_hba *phba) spin_unlock_irqrestore(&vports[i]->fc_nodes_list_lock, iflags); goto out; - } else if (ndlp->nlp_flag & NLP_RPI_REGISTERED) { + } else if (test_bit(NLP_RPI_REGISTERED, + &ndlp->nlp_flag)) { ret = 1; lpfc_printf_log(phba, KERN_INFO, LOG_NODE | LOG_DISCOVERY, - "2624 RPI %x DID %x flag %x " + "2624 RPI %x DID %x flag %lx " "still logged in\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag); diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 986e2898b10b8..3ddcaa864f075 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -3092,7 +3092,8 @@ lpfc_cleanup(struct lpfc_vport *vport) lpfc_printf_vlog(ndlp->vport, KERN_ERR, LOG_DISCOVERY, "0282 did:x%x ndlp:x%px " - "refcnt:%d xflags x%x nflag x%x\n", + "refcnt:%d xflags x%x " + "nflag x%lx\n", ndlp->nlp_DID, (void *)ndlp, kref_read(&ndlp->kref), ndlp->fc4_xpt_flags, @@ -3413,7 +3414,7 @@ lpfc_sli4_node_rpi_restore(struct lpfc_hba *phba) LOG_NODE | LOG_DISCOVERY, "0099 RPI alloc error for " "ndlp x%px DID:x%06x " - "flg:x%x\n", + "flg:x%lx\n", ndlp, ndlp->nlp_DID, ndlp->nlp_flag); continue; @@ -3422,7 +3423,7 @@ lpfc_sli4_node_rpi_restore(struct lpfc_hba *phba) lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE | LOG_DISCOVERY, "0009 Assign RPI x%x to ndlp x%px " - "DID:x%06x flg:x%x\n", + "DID:x%06x flg:x%lx\n", ndlp->nlp_rpi, ndlp, ndlp->nlp_DID, ndlp->nlp_flag); } @@ -3826,15 +3827,12 @@ lpfc_offline_prep(struct lpfc_hba *phba, int mbx_action) &vports[i]->fc_nodes, nlp_listp) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(&ndlp->lock); - + clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); if (offline || hba_pci_err) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~(NLP_UNREG_INP | - NLP_RPI_REGISTERED); - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_UNREG_INP, + &ndlp->nlp_flag); + clear_bit(NLP_RPI_REGISTERED, + &ndlp->nlp_flag); } if (ndlp->nlp_type & NLP_FABRIC) { @@ -6911,9 +6909,7 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba, */ mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000)); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_DELAY_TMO; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); ndlp->nlp_last_elscmd = ELS_CMD_FDISC; vport->port_state = LPFC_FDISC; } else { diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c index 4574716c8764f..4d88cfe71caed 100644 --- a/drivers/scsi/lpfc/lpfc_nportdisc.c +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c @@ -65,7 +65,7 @@ lpfc_check_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, struct lpfc_name *nn, struct lpfc_name *pn) { /* First, we MUST have a RPI registered */ - if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED)) + if (!test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) return 0; /* Compare the ADISC rsp WWNN / WWPN matches our internal node @@ -239,7 +239,7 @@ lpfc_els_abort(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) /* Abort outstanding I/O on NPort */ lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_DISCOVERY, "2819 Abort outstanding I/O on NPort x%x " - "Data: x%x x%x x%x\n", + "Data: x%lx x%x x%x\n", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); /* Clean up all fabric IOs first.*/ @@ -340,7 +340,7 @@ lpfc_defer_plogi_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *login_mbox) /* Now process the REG_RPI cmpl */ lpfc_mbx_cmpl_reg_login(phba, login_mbox); - ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN; + clear_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag); kfree(save_iocb); } @@ -404,7 +404,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, /* PLOGI chkparm OK */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, - "0114 PLOGI chkparm OK Data: x%x x%x x%x " + "0114 PLOGI chkparm OK Data: x%x x%x x%lx " "x%x x%x x%lx\n", ndlp->nlp_DID, ndlp->nlp_state, ndlp->nlp_flag, ndlp->nlp_rpi, vport->port_state, @@ -429,7 +429,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, /* if already logged in, do implicit logout */ switch (ndlp->nlp_state) { case NLP_STE_NPR_NODE: - if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) + if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) break; fallthrough; case NLP_STE_REG_LOGIN_ISSUE: @@ -449,7 +449,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ndlp->nlp_type &= ~(NLP_NVME_TARGET | NLP_NVME_INITIATOR); ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; ndlp->nlp_nvme_info &= ~NLP_NVME_NSLER; - ndlp->nlp_flag &= ~NLP_FIRSTBURST; + clear_bit(NLP_FIRSTBURST, &ndlp->nlp_flag); lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb, ndlp, NULL); @@ -480,7 +480,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ndlp->nlp_type &= ~(NLP_NVME_TARGET | NLP_NVME_INITIATOR); ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; ndlp->nlp_nvme_info &= ~NLP_NVME_NSLER; - ndlp->nlp_flag &= ~NLP_FIRSTBURST; + clear_bit(NLP_FIRSTBURST, &ndlp->nlp_flag); login_mbox = NULL; link_mbox = NULL; @@ -552,13 +552,13 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, lpfc_can_disctmo(vport); } - ndlp->nlp_flag &= ~NLP_SUPPRESS_RSP; + clear_bit(NLP_SUPPRESS_RSP, &ndlp->nlp_flag); if ((phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) && sp->cmn.valid_vendor_ver_level) { vid = be32_to_cpu(sp->un.vv.vid); flag = be32_to_cpu(sp->un.vv.flags); if ((vid == LPFC_VV_EMLX_ID) && (flag & LPFC_VV_SUPPRESS_RSP)) - ndlp->nlp_flag |= NLP_SUPPRESS_RSP; + set_bit(NLP_SUPPRESS_RSP, &ndlp->nlp_flag); } login_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); @@ -627,10 +627,9 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, * this ELS request. The only way to do this is * to register, then unregister the RPI. */ - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= (NLP_RM_DFLT_RPI | NLP_ACC_REGLOGIN | - NLP_RCV_PLOGI); - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_RM_DFLT_RPI, &ndlp->nlp_flag); + set_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag); + set_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag); } stat.un.b.lsRjtRsnCode = LSRJT_INVALID_CMD; @@ -665,9 +664,8 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, login_mbox->ctx_u.save_iocb = save_iocb; /* For PLOGI ACC */ - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= (NLP_ACC_REGLOGIN | NLP_RCV_PLOGI); - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag); + set_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag); /* Start the ball rolling by issuing REG_LOGIN here */ rc = lpfc_sli_issue_mbox(phba, login_mbox, MBX_NOWAIT); @@ -797,7 +795,7 @@ out: */ if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET)) { if ((ndlp->nlp_state != NLP_STE_MAPPED_NODE) && - !(ndlp->nlp_flag & NLP_NPR_ADISC)) + !test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) lpfc_nlp_set_state(vport, ndlp, NLP_STE_MAPPED_NODE); } @@ -814,9 +812,7 @@ out: /* 1 sec timeout */ mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000)); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_DELAY_TMO; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); ndlp->nlp_last_elscmd = ELS_CMD_PLOGI; ndlp->nlp_prev_state = ndlp->nlp_state; lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); @@ -835,9 +831,7 @@ lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, /* Only call LOGO ACC for first LOGO, this avoids sending unnecessary * PLOGIs during LOGO storms from a device. */ - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_LOGO_ACC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); if (els_cmd == ELS_CMD_PRLO) lpfc_els_rsp_acc(vport, ELS_CMD_PRLO, cmdiocb, ndlp, NULL); else @@ -890,9 +884,7 @@ lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, */ mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000)); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_DELAY_TMO; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); ndlp->nlp_last_elscmd = ELS_CMD_FDISC; vport->port_state = LPFC_FDISC; } else { @@ -915,14 +907,12 @@ lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ndlp->nlp_state <= NLP_STE_PRLI_ISSUE)) { mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000 * 1)); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_DELAY_TMO; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); ndlp->nlp_last_elscmd = ELS_CMD_PLOGI; lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE | LOG_ELS | LOG_DISCOVERY, "3204 Start nlpdelay on DID x%06x " - "nflag x%x lastels x%x ref cnt %u", + "nflag x%lx lastels x%x ref cnt %u", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_last_elscmd, kref_read(&ndlp->kref)); @@ -935,9 +925,7 @@ out: ndlp->nlp_prev_state = ndlp->nlp_state; lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); /* The driver has to wait until the ACC completes before it continues * processing the LOGO. The action will resume in * lpfc_cmpl_els_logo_acc routine. Since part of processing includes an @@ -978,7 +966,7 @@ lpfc_rcv_prli_support_check(struct lpfc_vport *vport, out: lpfc_printf_vlog(vport, KERN_WARNING, LOG_DISCOVERY, "6115 Rcv PRLI (%x) check failed: ndlp rpi %d " - "state x%x flags x%x port_type: x%x " + "state x%x flags x%lx port_type: x%x " "npr->initfcn: x%x npr->tgtfcn: x%x\n", cmd, ndlp->nlp_rpi, ndlp->nlp_state, ndlp->nlp_flag, vport->port_type, @@ -1020,7 +1008,7 @@ lpfc_rcv_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, if (npr->prliType == PRLI_NVME_TYPE) ndlp->nlp_type |= NLP_NVME_TARGET; if (npr->writeXferRdyDis) - ndlp->nlp_flag |= NLP_FIRSTBURST; + set_bit(NLP_FIRSTBURST, &ndlp->nlp_flag); } if (npr->Retry && ndlp->nlp_type & (NLP_FCP_INITIATOR | NLP_FCP_TARGET)) @@ -1057,7 +1045,7 @@ lpfc_rcv_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, roles |= FC_RPORT_ROLE_FCP_TARGET; lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_RPORT, - "rport rolechg: role:x%x did:x%x flg:x%x", + "rport rolechg: role:x%x did:x%x flg:x%lx", roles, ndlp->nlp_DID, ndlp->nlp_flag); if (vport->cfg_enable_fc4_type != LPFC_ENABLE_NVME) @@ -1068,10 +1056,8 @@ lpfc_rcv_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, static uint32_t lpfc_disc_set_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) { - if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED)) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(&ndlp->lock); + if (!test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) { + clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); return 0; } @@ -1081,16 +1067,12 @@ lpfc_disc_set_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) (test_bit(FC_RSCN_MODE, &vport->fc_flag) || ((ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE) && (ndlp->nlp_type & NLP_FCP_TARGET)))) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NPR_ADISC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); return 1; } } - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); lpfc_unreg_rpi(vport, ndlp); return 0; } @@ -1115,10 +1097,10 @@ lpfc_release_rpi(struct lpfc_hba *phba, struct lpfc_vport *vport, /* If there is already an UNREG in progress for this ndlp, * no need to queue up another one. */ - if (ndlp->nlp_flag & NLP_UNREG_INP) { + if (test_bit(NLP_UNREG_INP, &ndlp->nlp_flag)) { lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "1435 release_rpi SKIP UNREG x%x on " - "NPort x%x deferred x%x flg x%x " + "NPort x%x deferred x%x flg x%lx " "Data: x%px\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_defer_did, @@ -1143,11 +1125,11 @@ lpfc_release_rpi(struct lpfc_hba *phba, struct lpfc_vport *vport, if (((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) && (!test_bit(FC_OFFLINE_MODE, &vport->fc_flag))) - ndlp->nlp_flag |= NLP_UNREG_INP; + set_bit(NLP_UNREG_INP, &ndlp->nlp_flag); lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "1437 release_rpi UNREG x%x " - "on NPort x%x flg x%x\n", + "on NPort x%x flg x%lx\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag); rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT); @@ -1175,7 +1157,7 @@ lpfc_disc_illegal(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, } lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, "0271 Illegal State Transition: node x%x " - "event x%x, state x%x Data: x%x x%x\n", + "event x%x, state x%x Data: x%x x%lx\n", ndlp->nlp_DID, evt, ndlp->nlp_state, ndlp->nlp_rpi, ndlp->nlp_flag); return ndlp->nlp_state; @@ -1190,13 +1172,12 @@ lpfc_cmpl_plogi_illegal(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, * working on the same NPortID, do nothing for this thread * to stop it. */ - if (!(ndlp->nlp_flag & NLP_RCV_PLOGI)) { + if (!test_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag)) lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, "0272 Illegal State Transition: node x%x " - "event x%x, state x%x Data: x%x x%x\n", + "event x%x, state x%x Data: x%x x%lx\n", ndlp->nlp_DID, evt, ndlp->nlp_state, ndlp->nlp_rpi, ndlp->nlp_flag); - } return ndlp->nlp_state; } @@ -1230,9 +1211,7 @@ lpfc_rcv_logo_unused_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, { struct lpfc_iocbq *cmdiocb = (struct lpfc_iocbq *) arg; - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_LOGO_ACC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL); return ndlp->nlp_state; @@ -1290,11 +1269,9 @@ lpfc_rcv_plogi_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, NULL); } else { if (lpfc_rcv_plogi(vport, ndlp, cmdiocb) && - (ndlp->nlp_flag & NLP_NPR_2B_DISC) && - (vport->num_disc_nodes)) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag) && + vport->num_disc_nodes) { + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); /* Check if there are more PLOGIs to be sent */ lpfc_more_plogi(vport); if (vport->num_disc_nodes == 0) { @@ -1356,9 +1333,7 @@ lpfc_rcv_els_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, /* Put ndlp in npr state set plogi timer for 1 sec */ mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000 * 1)); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_DELAY_TMO; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); ndlp->nlp_last_elscmd = ELS_CMD_PLOGI; ndlp->nlp_prev_state = NLP_STE_PLOGI_ISSUE; lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); @@ -1389,7 +1364,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, ulp_status = get_job_ulpstatus(phba, rspiocb); - if (ndlp->nlp_flag & NLP_ACC_REGLOGIN) { + if (test_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag)) { /* Recovery from PLOGI collision logic */ return ndlp->nlp_state; } @@ -1418,7 +1393,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, goto out; /* PLOGI chkparm OK */ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, - "0121 PLOGI chkparm OK Data: x%x x%x x%x x%x\n", + "0121 PLOGI chkparm OK Data: x%x x%x x%lx x%x\n", ndlp->nlp_DID, ndlp->nlp_state, ndlp->nlp_flag, ndlp->nlp_rpi); if (vport->cfg_fcp_class == 2 && (sp->cls2.classValid)) @@ -1446,14 +1421,14 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, ed_tov = (phba->fc_edtov + 999999) / 1000000; } - ndlp->nlp_flag &= ~NLP_SUPPRESS_RSP; + clear_bit(NLP_SUPPRESS_RSP, &ndlp->nlp_flag); if ((phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) && sp->cmn.valid_vendor_ver_level) { vid = be32_to_cpu(sp->un.vv.vid); flag = be32_to_cpu(sp->un.vv.flags); if ((vid == LPFC_VV_EMLX_ID) && (flag & LPFC_VV_SUPPRESS_RSP)) - ndlp->nlp_flag |= NLP_SUPPRESS_RSP; + set_bit(NLP_SUPPRESS_RSP, &ndlp->nlp_flag); } /* @@ -1476,7 +1451,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, LOG_TRACE_EVENT, "0133 PLOGI: no memory " "for config_link " - "Data: x%x x%x x%x x%x\n", + "Data: x%x x%x x%lx x%x\n", ndlp->nlp_DID, ndlp->nlp_state, ndlp->nlp_flag, ndlp->nlp_rpi); goto out; @@ -1500,7 +1475,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, if (!mbox) { lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, "0018 PLOGI: no memory for reg_login " - "Data: x%x x%x x%x x%x\n", + "Data: x%x x%x x%lx x%x\n", ndlp->nlp_DID, ndlp->nlp_state, ndlp->nlp_flag, ndlp->nlp_rpi); goto out; @@ -1520,7 +1495,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, mbox->mbox_cmpl = lpfc_mbx_cmpl_fdmi_reg_login; break; default: - ndlp->nlp_flag |= NLP_REG_LOGIN_SEND; + set_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login; } @@ -1535,8 +1510,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, NLP_STE_REG_LOGIN_ISSUE); return ndlp->nlp_state; } - if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND) - ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; + clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); /* decrement node reference count to the failed mbox * command */ @@ -1544,7 +1518,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, lpfc_mbox_rsrc_cleanup(phba, mbox, MBOX_THD_UNLOCKED); lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, "0134 PLOGI: cannot issue reg_login " - "Data: x%x x%x x%x x%x\n", + "Data: x%x x%x x%lx x%x\n", ndlp->nlp_DID, ndlp->nlp_state, ndlp->nlp_flag, ndlp->nlp_rpi); } else { @@ -1552,7 +1526,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, "0135 PLOGI: cannot format reg_login " - "Data: x%x x%x x%x x%x\n", + "Data: x%x x%x x%lx x%x\n", ndlp->nlp_DID, ndlp->nlp_state, ndlp->nlp_flag, ndlp->nlp_rpi); } @@ -1605,18 +1579,15 @@ static uint32_t lpfc_device_rm_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, void *arg, uint32_t evt) { - if (ndlp->nlp_flag & NLP_NPR_2B_DISC) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NODEV_REMOVE; - spin_unlock_irq(&ndlp->lock); + if (test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) { + set_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); return ndlp->nlp_state; - } else { - /* software abort outstanding PLOGI */ - lpfc_els_abort(vport->phba, ndlp); - - lpfc_drop_node(vport, ndlp); - return NLP_STE_FREED_NODE; } + /* software abort outstanding PLOGI */ + lpfc_els_abort(vport->phba, ndlp); + + lpfc_drop_node(vport, ndlp); + return NLP_STE_FREED_NODE; } static uint32_t @@ -1636,9 +1607,8 @@ lpfc_device_recov_plogi_issue(struct lpfc_vport *vport, ndlp->nlp_prev_state = NLP_STE_PLOGI_ISSUE; lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); return ndlp->nlp_state; } @@ -1656,10 +1626,7 @@ lpfc_rcv_plogi_adisc_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, cmdiocb = (struct lpfc_iocbq *) arg; if (lpfc_rcv_plogi(vport, ndlp, cmdiocb)) { - if (ndlp->nlp_flag & NLP_NPR_2B_DISC) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; - spin_unlock_irq(&ndlp->lock); + if (test_and_clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) { if (vport->num_disc_nodes) lpfc_more_adisc(vport); } @@ -1748,9 +1715,7 @@ lpfc_cmpl_adisc_adisc_issue(struct lpfc_vport *vport, /* 1 sec timeout */ mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000)); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_DELAY_TMO; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); ndlp->nlp_last_elscmd = ELS_CMD_PLOGI; ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE; @@ -1789,18 +1754,15 @@ static uint32_t lpfc_device_rm_adisc_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, void *arg, uint32_t evt) { - if (ndlp->nlp_flag & NLP_NPR_2B_DISC) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NODEV_REMOVE; - spin_unlock_irq(&ndlp->lock); + if (test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) { + set_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); return ndlp->nlp_state; - } else { - /* software abort outstanding ADISC */ - lpfc_els_abort(vport->phba, ndlp); - - lpfc_drop_node(vport, ndlp); - return NLP_STE_FREED_NODE; } + /* software abort outstanding ADISC */ + lpfc_els_abort(vport->phba, ndlp); + + lpfc_drop_node(vport, ndlp); + return NLP_STE_FREED_NODE; } static uint32_t @@ -1820,9 +1782,8 @@ lpfc_device_recov_adisc_issue(struct lpfc_vport *vport, ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE; lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); lpfc_disc_set_adisc(vport, ndlp); return ndlp->nlp_state; } @@ -1856,7 +1817,7 @@ lpfc_rcv_prli_reglogin_issue(struct lpfc_vport *vport, * transition to UNMAPPED provided the RPI has completed * registration. */ - if (ndlp->nlp_flag & NLP_RPI_REGISTERED) { + if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) { lpfc_rcv_prli(vport, ndlp, cmdiocb); lpfc_els_rsp_prli_acc(vport, cmdiocb, ndlp); } else { @@ -1895,7 +1856,7 @@ lpfc_rcv_logo_reglogin_issue(struct lpfc_vport *vport, if ((mb = phba->sli.mbox_active)) { if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) && (ndlp == mb->ctx_ndlp)) { - ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; + clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); lpfc_nlp_put(ndlp); mb->ctx_ndlp = NULL; mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; @@ -1906,7 +1867,7 @@ lpfc_rcv_logo_reglogin_issue(struct lpfc_vport *vport, list_for_each_entry_safe(mb, nextmb, &phba->sli.mboxq, list) { if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) && (ndlp == mb->ctx_ndlp)) { - ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; + clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); lpfc_nlp_put(ndlp); list_del(&mb->list); phba->sli.mboxq_cnt--; @@ -1976,9 +1937,7 @@ lpfc_cmpl_reglogin_reglogin_issue(struct lpfc_vport *vport, /* Put ndlp in npr state set plogi timer for 1 sec */ mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000 * 1)); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_DELAY_TMO; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); ndlp->nlp_last_elscmd = ELS_CMD_PLOGI; lpfc_issue_els_logo(vport, ndlp, 0); @@ -1989,7 +1948,7 @@ lpfc_cmpl_reglogin_reglogin_issue(struct lpfc_vport *vport, if (phba->sli_rev < LPFC_SLI_REV4) ndlp->nlp_rpi = mb->un.varWords[0]; - ndlp->nlp_flag |= NLP_RPI_REGISTERED; + set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); /* Only if we are not a fabric nport do we issue PRLI */ lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, @@ -2061,15 +2020,12 @@ lpfc_device_rm_reglogin_issue(struct lpfc_vport *vport, void *arg, uint32_t evt) { - if (ndlp->nlp_flag & NLP_NPR_2B_DISC) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NODEV_REMOVE; - spin_unlock_irq(&ndlp->lock); + if (test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) { + set_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); return ndlp->nlp_state; - } else { - lpfc_drop_node(vport, ndlp); - return NLP_STE_FREED_NODE; } + lpfc_drop_node(vport, ndlp); + return NLP_STE_FREED_NODE; } static uint32_t @@ -2084,17 +2040,16 @@ lpfc_device_recov_reglogin_issue(struct lpfc_vport *vport, ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE; lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); - spin_lock_irq(&ndlp->lock); /* If we are a target we won't immediately transition into PRLI, * so if REG_LOGIN already completed we don't need to ignore it. */ - if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED) || + if (!test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag) || !vport->phba->nvmet_support) - ndlp->nlp_flag |= NLP_IGNR_REG_CMPL; + set_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); lpfc_disc_set_adisc(vport, ndlp); return ndlp->nlp_state; } @@ -2228,7 +2183,8 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, if (npr->targetFunc) { ndlp->nlp_type |= NLP_FCP_TARGET; if (npr->writeXferRdyDis) - ndlp->nlp_flag |= NLP_FIRSTBURST; + set_bit(NLP_FIRSTBURST, + &ndlp->nlp_flag); } if (npr->Retry) ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE; @@ -2272,7 +2228,7 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, /* Both sides support FB. The target's first * burst size is a 512 byte encoded value. */ - ndlp->nlp_flag |= NLP_FIRSTBURST; + set_bit(NLP_FIRSTBURST, &ndlp->nlp_flag); ndlp->nvme_fb_size = bf_get_be32(prli_fb_sz, nvpr); @@ -2287,7 +2243,7 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME_DISC, "6029 NVME PRLI Cmpl w1 x%08x " - "w4 x%08x w5 x%08x flag x%x, " + "w4 x%08x w5 x%08x flag x%lx, " "fcp_info x%x nlp_type x%x\n", be32_to_cpu(nvpr->word1), be32_to_cpu(nvpr->word4), @@ -2299,9 +2255,7 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, (vport->port_type == LPFC_NPIV_PORT) && vport->cfg_restrict_login) { out: - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_TARGET_REMOVE; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_TARGET_REMOVE, &ndlp->nlp_flag); lpfc_issue_els_logo(vport, ndlp, 0); ndlp->nlp_prev_state = NLP_STE_PRLI_ISSUE; @@ -2353,18 +2307,15 @@ static uint32_t lpfc_device_rm_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, void *arg, uint32_t evt) { - if (ndlp->nlp_flag & NLP_NPR_2B_DISC) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NODEV_REMOVE; - spin_unlock_irq(&ndlp->lock); + if (test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) { + set_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); return ndlp->nlp_state; - } else { - /* software abort outstanding PLOGI */ - lpfc_els_abort(vport->phba, ndlp); - - lpfc_drop_node(vport, ndlp); - return NLP_STE_FREED_NODE; } + /* software abort outstanding PLOGI */ + lpfc_els_abort(vport->phba, ndlp); + + lpfc_drop_node(vport, ndlp); + return NLP_STE_FREED_NODE; } @@ -2401,9 +2352,8 @@ lpfc_device_recov_prli_issue(struct lpfc_vport *vport, ndlp->nlp_prev_state = NLP_STE_PRLI_ISSUE; lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); lpfc_disc_set_adisc(vport, ndlp); return ndlp->nlp_state; } @@ -2442,9 +2392,7 @@ lpfc_rcv_logo_logo_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, { struct lpfc_iocbq *cmdiocb = (struct lpfc_iocbq *)arg; - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_LOGO_ACC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL); return ndlp->nlp_state; } @@ -2483,9 +2431,8 @@ lpfc_cmpl_logo_logo_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, { ndlp->nlp_prev_state = NLP_STE_LOGO_ISSUE; lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); lpfc_disc_set_adisc(vport, ndlp); return ndlp->nlp_state; } @@ -2591,8 +2538,9 @@ lpfc_device_recov_unmap_node(struct lpfc_vport *vport, { ndlp->nlp_prev_state = NLP_STE_UNMAPPED_NODE; lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); + clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); spin_unlock_irq(&ndlp->lock); lpfc_disc_set_adisc(vport, ndlp); @@ -2653,9 +2601,7 @@ lpfc_rcv_prlo_mapped_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, lpfc_sli_abort_iocb(vport, ndlp->nlp_sid, 0, LPFC_CTX_TGT); /* Send PRLO_ACC */ - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_LOGO_ACC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); lpfc_els_rsp_acc(vport, ELS_CMD_PRLO, cmdiocb, ndlp, NULL); /* Save ELS_CMD_PRLO as the last elscmd and then set to NPR. @@ -2665,7 +2611,7 @@ lpfc_rcv_prlo_mapped_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ndlp->nlp_prev_state = ndlp->nlp_state; lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE | LOG_ELS | LOG_DISCOVERY, - "3422 DID x%06x nflag x%x lastels x%x ref cnt %u\n", + "3422 DID x%06x nflag x%lx lastels x%x ref cnt %u\n", ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_last_elscmd, kref_read(&ndlp->kref)); @@ -2685,8 +2631,9 @@ lpfc_device_recov_mapped_node(struct lpfc_vport *vport, ndlp->nlp_prev_state = NLP_STE_MAPPED_NODE; lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); + clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); spin_unlock_irq(&ndlp->lock); return ndlp->nlp_state; @@ -2699,16 +2646,16 @@ lpfc_rcv_plogi_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, struct lpfc_iocbq *cmdiocb = (struct lpfc_iocbq *) arg; /* Ignore PLOGI if we have an outstanding LOGO */ - if (ndlp->nlp_flag & (NLP_LOGO_SND | NLP_LOGO_ACC)) + if (test_bit(NLP_LOGO_SND, &ndlp->nlp_flag) || + test_bit(NLP_LOGO_ACC, &ndlp->nlp_flag)) return ndlp->nlp_state; if (lpfc_rcv_plogi(vport, ndlp, cmdiocb)) { lpfc_cancel_retry_delay_tmo(vport, ndlp); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~(NLP_NPR_ADISC | NLP_NPR_2B_DISC); - spin_unlock_irq(&ndlp->lock); - } else if (!(ndlp->nlp_flag & NLP_NPR_2B_DISC)) { + clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); + } else if (!test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) { /* send PLOGI immediately, move to PLOGI issue state */ - if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) { + if (!test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag)) { ndlp->nlp_prev_state = NLP_STE_NPR_NODE; lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE); lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); @@ -2729,14 +2676,14 @@ lpfc_rcv_prli_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, stat.un.b.lsRjtRsnCodeExp = LSEXP_NOTHING_MORE; lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL); - if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) { + if (!test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag)) { /* * ADISC nodes will be handled in regular discovery path after * receiving response from NS. * * For other nodes, Send PLOGI to trigger an implicit LOGO. */ - if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) { + if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) { ndlp->nlp_prev_state = NLP_STE_NPR_NODE; lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE); lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); @@ -2767,15 +2714,15 @@ lpfc_rcv_padisc_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, * or discovery in progress for this node. Starting discovery * here will affect the counting of discovery threads. */ - if (!(ndlp->nlp_flag & NLP_DELAY_TMO) && - !(ndlp->nlp_flag & NLP_NPR_2B_DISC)) { + if (!test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag) && + !test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) { /* * ADISC nodes will be handled in regular discovery path after * receiving response from NS. * * For other nodes, Send PLOGI to trigger an implicit LOGO. */ - if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) { + if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) { ndlp->nlp_prev_state = NLP_STE_NPR_NODE; lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE); lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); @@ -2790,24 +2737,18 @@ lpfc_rcv_prlo_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, { struct lpfc_iocbq *cmdiocb = (struct lpfc_iocbq *) arg; - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_LOGO_ACC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL); - if ((ndlp->nlp_flag & NLP_DELAY_TMO) == 0) { + if (!test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag)) { mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000 * 1)); - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_DELAY_TMO; - ndlp->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(&ndlp->lock); + set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); + clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); ndlp->nlp_last_elscmd = ELS_CMD_PLOGI; } else { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_NPR_ADISC; - spin_unlock_irq(&ndlp->lock); + clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); } return ndlp->nlp_state; } @@ -2844,7 +2785,7 @@ lpfc_cmpl_prli_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ulp_status = get_job_ulpstatus(phba, rspiocb); - if (ulp_status && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) { + if (ulp_status && test_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag)) { lpfc_drop_node(vport, ndlp); return NLP_STE_FREED_NODE; } @@ -2877,7 +2818,7 @@ lpfc_cmpl_adisc_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ulp_status = get_job_ulpstatus(phba, rspiocb); - if (ulp_status && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) { + if (ulp_status && test_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag)) { lpfc_drop_node(vport, ndlp); return NLP_STE_FREED_NODE; } @@ -2896,12 +2837,11 @@ lpfc_cmpl_reglogin_npr_node(struct lpfc_vport *vport, /* SLI4 ports have preallocated logical rpis. */ if (vport->phba->sli_rev < LPFC_SLI_REV4) ndlp->nlp_rpi = mb->un.varWords[0]; - ndlp->nlp_flag |= NLP_RPI_REGISTERED; - if (ndlp->nlp_flag & NLP_LOGO_ACC) { + set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); + if (test_bit(NLP_LOGO_ACC, &ndlp->nlp_flag)) lpfc_unreg_rpi(vport, ndlp); - } } else { - if (ndlp->nlp_flag & NLP_NODEV_REMOVE) { + if (test_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag)) { lpfc_drop_node(vport, ndlp); return NLP_STE_FREED_NODE; } @@ -2913,10 +2853,8 @@ static uint32_t lpfc_device_rm_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, void *arg, uint32_t evt) { - if (ndlp->nlp_flag & NLP_NPR_2B_DISC) { - spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag |= NLP_NODEV_REMOVE; - spin_unlock_irq(&ndlp->lock); + if (test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) { + set_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); return ndlp->nlp_state; } lpfc_drop_node(vport, ndlp); @@ -2932,8 +2870,9 @@ lpfc_device_recov_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, return ndlp->nlp_state; lpfc_cancel_retry_delay_tmo(vport, ndlp); + clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); + clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); spin_unlock_irq(&ndlp->lock); return ndlp->nlp_state; @@ -3146,7 +3085,7 @@ lpfc_disc_state_machine(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, /* DSM in event on NPort in state */ lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "0211 DSM in event x%x on NPort x%x in " - "state %d rpi x%x Data: x%x x%x\n", + "state %d rpi x%x Data: x%lx x%x\n", evt, ndlp->nlp_DID, cur_state, ndlp->nlp_rpi, ndlp->nlp_flag, data1); @@ -3163,12 +3102,12 @@ lpfc_disc_state_machine(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ((uint32_t)ndlp->nlp_type)); lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, "0212 DSM out state %d on NPort x%x " - "rpi x%x Data: x%x x%x\n", + "rpi x%x Data: x%lx x%x\n", rc, ndlp->nlp_DID, ndlp->nlp_rpi, ndlp->nlp_flag, data1); lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_DSM, - "DSM out: ste:%d did:x%x flg:x%x", + "DSM out: ste:%d did:x%x flg:x%lx", rc, ndlp->nlp_DID, ndlp->nlp_flag); /* Decrement the ndlp reference count held for this function */ lpfc_nlp_put(ndlp); diff --git a/drivers/scsi/lpfc/lpfc_nvme.c b/drivers/scsi/lpfc/lpfc_nvme.c index fec23c7237304..e9d9884830f30 100644 --- a/drivers/scsi/lpfc/lpfc_nvme.c +++ b/drivers/scsi/lpfc/lpfc_nvme.c @@ -1232,7 +1232,7 @@ lpfc_nvme_prep_io_cmd(struct lpfc_vport *vport, /* Word 5 */ if ((phba->cfg_nvme_enable_fb) && - (pnode->nlp_flag & NLP_FIRSTBURST)) { + test_bit(NLP_FIRSTBURST, &pnode->nlp_flag)) { req_len = lpfc_ncmd->nvmeCmd->payload_length; if (req_len < pnode->nvme_fb_size) wqe->fcp_iwrite.initial_xfer_len = @@ -2644,14 +2644,11 @@ lpfc_nvme_unregister_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) * reference. Check if another thread has set * NLP_DROPPED. */ - spin_lock_irq(&ndlp->lock); - if (!(ndlp->nlp_flag & NLP_DROPPED)) { - ndlp->nlp_flag |= NLP_DROPPED; - spin_unlock_irq(&ndlp->lock); + if (!test_and_set_bit(NLP_DROPPED, + &ndlp->nlp_flag)) { lpfc_nlp_put(ndlp); return; } - spin_unlock_irq(&ndlp->lock); } } } diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c index 55c3e2c2bf8f7..e6c9112a88627 100644 --- a/drivers/scsi/lpfc/lpfc_nvmet.c +++ b/drivers/scsi/lpfc/lpfc_nvmet.c @@ -2854,7 +2854,7 @@ lpfc_nvmet_prep_fcp_wqe(struct lpfc_hba *phba, /* In template ar=1 wqes=0 sup=0 irsp=0 irsplen=0 */ if (rsp->rsplen == LPFC_NVMET_SUCCESS_LEN) { - if (ndlp->nlp_flag & NLP_SUPPRESS_RSP) + if (test_bit(NLP_SUPPRESS_RSP, &ndlp->nlp_flag)) bf_set(wqe_sup, &wqe->fcp_tsend.wqe_com, 1); } else { diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 11c974bffa720..905026a4782cf 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c @@ -4629,7 +4629,7 @@ static int lpfc_scsi_prep_cmnd_buf_s3(struct lpfc_vport *vport, iocb_cmd->ulpCommand = CMD_FCP_IWRITE64_CR; iocb_cmd->ulpPU = PARM_READ_CHECK; if (vport->cfg_first_burst_size && - (pnode->nlp_flag & NLP_FIRSTBURST)) { + test_bit(NLP_FIRSTBURST, &pnode->nlp_flag)) { u32 xrdy_len; fcpdl = scsi_bufflen(scsi_cmnd); @@ -5829,7 +5829,7 @@ lpfc_send_taskmgmt(struct lpfc_vport *vport, struct fc_rport *rport, lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP, "0702 Issue %s to TGT %d LUN %llu " - "rpi x%x nlp_flag x%x Data: x%x x%x\n", + "rpi x%x nlp_flag x%lx Data: x%x x%x\n", lpfc_taskmgmt_name(task_mgmt_cmd), tgt_id, lun_id, pnode->nlp_rpi, pnode->nlp_flag, iocbq->sli4_xritag, iocbq->cmd_flag); @@ -6094,8 +6094,8 @@ lpfc_target_reset_handler(struct scsi_cmnd *cmnd) lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, "0722 Target Reset rport failure: rdata x%px\n", rdata); if (pnode) { + clear_bit(NLP_NPR_ADISC, &pnode->nlp_flag); spin_lock_irqsave(&pnode->lock, flags); - pnode->nlp_flag &= ~NLP_NPR_ADISC; pnode->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; spin_unlock_irqrestore(&pnode->lock, flags); } @@ -6124,7 +6124,7 @@ lpfc_target_reset_handler(struct scsi_cmnd *cmnd) !pnode->logo_waitq) { pnode->logo_waitq = &waitq; pnode->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; - pnode->nlp_flag |= NLP_ISSUE_LOGO; + set_bit(NLP_ISSUE_LOGO, &pnode->nlp_flag); pnode->save_flags |= NLP_WAIT_FOR_LOGO; spin_unlock_irqrestore(&pnode->lock, flags); lpfc_unreg_rpi(vport, pnode); diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 17ecb2625eb84..80c3c84c23914 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -2911,14 +2911,14 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) vport, KERN_INFO, LOG_MBOX | LOG_DISCOVERY, "1438 UNREG cmpl deferred mbox x%x " - "on NPort x%x Data: x%x x%x x%px x%lx x%x\n", + "on NPort x%x Data: x%lx x%x x%px x%lx x%x\n", ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_defer_did, ndlp, vport->load_flag, kref_read(&ndlp->kref)); - if ((ndlp->nlp_flag & NLP_UNREG_INP) && - (ndlp->nlp_defer_did != NLP_EVT_NOTHING_PENDING)) { - ndlp->nlp_flag &= ~NLP_UNREG_INP; + if (test_bit(NLP_UNREG_INP, &ndlp->nlp_flag) && + ndlp->nlp_defer_did != NLP_EVT_NOTHING_PENDING) { + clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING; lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); } @@ -2968,7 +2968,7 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) { struct lpfc_vport *vport = pmb->vport; struct lpfc_nodelist *ndlp; - u32 unreg_inp; + bool unreg_inp; ndlp = pmb->ctx_ndlp; if (pmb->u.mb.mbxCommand == MBX_UNREG_LOGIN) { @@ -2981,7 +2981,7 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) vport, KERN_INFO, LOG_MBOX | LOG_SLI | LOG_NODE, "0010 UNREG_LOGIN vpi:x%x " - "rpi:%x DID:%x defer x%x flg x%x " + "rpi:%x DID:%x defer x%x flg x%lx " "x%px\n", vport->vpi, ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_defer_did, @@ -2991,11 +2991,9 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) /* Cleanup the nlp_flag now that the UNREG RPI * has completed. */ - spin_lock_irq(&ndlp->lock); - unreg_inp = ndlp->nlp_flag & NLP_UNREG_INP; - ndlp->nlp_flag &= - ~(NLP_UNREG_INP | NLP_LOGO_ACC); - spin_unlock_irq(&ndlp->lock); + unreg_inp = test_and_clear_bit(NLP_UNREG_INP, + &ndlp->nlp_flag); + clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); /* Check to see if there are any deferred * events to process @@ -14340,9 +14338,7 @@ lpfc_sli4_sp_handle_mbox_event(struct lpfc_hba *phba, struct lpfc_mcqe *mcqe) * an unsolicited PLOGI from the same NPortId from * starting another mailbox transaction. */ - spin_lock_irqsave(&ndlp->lock, iflags); - ndlp->nlp_flag |= NLP_UNREG_INP; - spin_unlock_irqrestore(&ndlp->lock, iflags); + set_bit(NLP_UNREG_INP, &ndlp->nlp_flag); lpfc_unreg_login(phba, vport->vpi, pmbox->un.varWords[0], pmb); pmb->mbox_cmpl = lpfc_mbx_cmpl_dflt_rpi; @@ -19091,9 +19087,9 @@ lpfc_sli4_seq_abort_rsp(struct lpfc_vport *vport, * to free ndlp when transmit completes */ if (ndlp->nlp_state == NLP_STE_UNUSED_NODE && - !(ndlp->nlp_flag & NLP_DROPPED) && + !test_bit(NLP_DROPPED, &ndlp->nlp_flag) && !(ndlp->fc4_xpt_flags & (NVME_XPT_REGD | SCSI_XPT_REGD))) { - ndlp->nlp_flag |= NLP_DROPPED; + set_bit(NLP_DROPPED, &ndlp->nlp_flag); lpfc_nlp_put(ndlp); } } @@ -21111,11 +21107,7 @@ lpfc_cleanup_pending_mbox(struct lpfc_vport *vport) /* Unregister the RPI when mailbox complete */ mb->mbox_flag |= LPFC_MBX_IMED_UNREG; restart_loop = 1; - spin_unlock_irq(&phba->hbalock); - spin_lock(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL; - spin_unlock(&ndlp->lock); - spin_lock_irq(&phba->hbalock); + clear_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag); break; } } @@ -21130,9 +21122,7 @@ lpfc_cleanup_pending_mbox(struct lpfc_vport *vport) ndlp = mb->ctx_ndlp; mb->ctx_ndlp = NULL; if (ndlp) { - spin_lock(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL; - spin_unlock(&ndlp->lock); + clear_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag); lpfc_nlp_put(ndlp); } } @@ -21141,9 +21131,7 @@ lpfc_cleanup_pending_mbox(struct lpfc_vport *vport) /* Release the ndlp with the cleaned-up active mailbox command */ if (act_mbx_ndlp) { - spin_lock(&act_mbx_ndlp->lock); - act_mbx_ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL; - spin_unlock(&act_mbx_ndlp->lock); + clear_bit(NLP_IGNR_REG_CMPL, &act_mbx_ndlp->nlp_flag); lpfc_nlp_put(act_mbx_ndlp); } } diff --git a/drivers/scsi/lpfc/lpfc_vport.c b/drivers/scsi/lpfc/lpfc_vport.c index 7a4d4d8e2ad55..9e0e357633779 100644 --- a/drivers/scsi/lpfc/lpfc_vport.c +++ b/drivers/scsi/lpfc/lpfc_vport.c @@ -496,7 +496,7 @@ lpfc_send_npiv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) !ndlp->logo_waitq) { ndlp->logo_waitq = &waitq; ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; - ndlp->nlp_flag |= NLP_ISSUE_LOGO; + set_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag); ndlp->save_flags |= NLP_WAIT_FOR_LOGO; } spin_unlock_irq(&ndlp->lock); @@ -515,8 +515,8 @@ lpfc_send_npiv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) } /* Error - clean up node flags. */ + clear_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag); spin_lock_irq(&ndlp->lock); - ndlp->nlp_flag &= ~NLP_ISSUE_LOGO; ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO; spin_unlock_irq(&ndlp->lock); @@ -708,7 +708,7 @@ lpfc_vport_delete(struct fc_vport *fc_vport) lpfc_printf_vlog(vport, KERN_INFO, LOG_VPORT | LOG_ELS, "1829 DA_ID issue status %d. " - "SFlag x%x NState x%x, NFlag x%x " + "SFlag x%x NState x%x, NFlag x%lx " "Rpi x%x\n", rc, ndlp->save_flags, ndlp->nlp_state, ndlp->nlp_flag, ndlp->nlp_rpi); -- GitLab From ea405fb4144985d5c60f49c2abd9ba47ea44fdb4 Mon Sep 17 00:00:00 2001 From: Justin Tee Date: Fri, 25 Apr 2025 12:48:03 -0700 Subject: [PATCH 1987/2211] scsi: lpfc: Avoid potential ndlp use-after-free in dev_loss_tmo_callbk [ Upstream commit b5162bb6aa1ec04dff4509b025883524b6d7e7ca ] Smatch detected a potential use-after-free of an ndlp oject in dev_loss_tmo_callbk during driver unload or fatal error handling. Fix by reordering code to avoid potential use-after-free if initial nodelist reference has been previously removed. Fixes: 4281f44ea8bf ("scsi: lpfc: Prevent NDLP reference count underflow in dev_loss_tmo callback") Reported-by: Dan Carpenter Closes: https://lore.kernel.org/linux-scsi/41c1d855-9eb5-416f-ac12-8b61929201a3@stanley.mountain/ Signed-off-by: Justin Tee Link: https://lore.kernel.org/r/20250425194806.3585-6-justintee8345@gmail.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/lpfc/lpfc_hbadisc.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 5297122f89fc8..b5dd17eecf82d 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -155,7 +155,7 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport) struct lpfc_hba *phba; struct lpfc_work_evt *evtp; unsigned long iflags; - bool nvme_reg = false; + bool drop_initial_node_ref = false; ndlp = ((struct lpfc_rport_data *)rport->dd_data)->pnode; if (!ndlp) @@ -182,8 +182,13 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport) spin_lock_irqsave(&ndlp->lock, iflags); ndlp->rport = NULL; - if (ndlp->fc4_xpt_flags & NVME_XPT_REGD) - nvme_reg = true; + /* Only 1 thread can drop the initial node reference. + * If not registered for NVME and NLP_DROPPED flag is + * clear, remove the initial reference. + */ + if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD)) + if (!test_and_set_bit(NLP_DROPPED, &ndlp->nlp_flag)) + drop_initial_node_ref = true; /* The scsi_transport is done with the rport so lpfc cannot * call to unregister. @@ -194,13 +199,16 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport) /* If NLP_XPT_REGD was cleared in lpfc_nlp_unreg_node, * unregister calls were made to the scsi and nvme * transports and refcnt was already decremented. Clear - * the NLP_XPT_REGD flag only if the NVME Rport is + * the NLP_XPT_REGD flag only if the NVME nrport is * confirmed unregistered. */ - if (!nvme_reg && ndlp->fc4_xpt_flags & NLP_XPT_REGD) { - ndlp->fc4_xpt_flags &= ~NLP_XPT_REGD; + if (ndlp->fc4_xpt_flags & NLP_XPT_REGD) { + if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD)) + ndlp->fc4_xpt_flags &= ~NLP_XPT_REGD; spin_unlock_irqrestore(&ndlp->lock, iflags); - lpfc_nlp_put(ndlp); /* may free ndlp */ + + /* Release scsi transport reference */ + lpfc_nlp_put(ndlp); } else { spin_unlock_irqrestore(&ndlp->lock, iflags); } @@ -208,14 +216,8 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport) spin_unlock_irqrestore(&ndlp->lock, iflags); } - /* Only 1 thread can drop the initial node reference. If - * another thread has set NLP_DROPPED, this thread is done. - */ - if (nvme_reg || test_bit(NLP_DROPPED, &ndlp->nlp_flag)) - return; - - set_bit(NLP_DROPPED, &ndlp->nlp_flag); - lpfc_nlp_put(ndlp); + if (drop_initial_node_ref) + lpfc_nlp_put(ndlp); return; } -- GitLab From bac4641756c2ade6a4d6048e776f125a4e7f4c0c Mon Sep 17 00:00:00 2001 From: Longfang Liu Date: Sat, 10 May 2025 16:11:52 +0800 Subject: [PATCH 1988/2211] hisi_acc_vfio_pci: bugfix cache write-back issue [ Upstream commit e63c466398731bb7867f42f44b76fa984de59db2 ] At present, cache write-back is placed in the device data copy stage after stopping the device operation. Writing back to the cache at this stage will cause the data obtained by the cache to be written back to be empty. In order to ensure that the cache data is written back successfully, the data needs to be written back into the stop device stage. Fixes: b0eed085903e ("hisi_acc_vfio_pci: Add support for VFIO live migration") Signed-off-by: Longfang Liu Reviewed-by: Shameer Kolothum Link: https://lore.kernel.org/r/20250510081155.55840-4-liulongfang@huawei.com Signed-off-by: Alex Williamson Signed-off-by: Sasha Levin --- drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c index 68300fcd3c41b..e37699fc03707 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c @@ -554,12 +554,6 @@ static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev, vf_data->vf_qm_state = QM_READY; hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state; - ret = vf_qm_cache_wb(vf_qm); - if (ret) { - dev_err(dev, "failed to writeback QM Cache!\n"); - return ret; - } - ret = qm_get_regs(vf_qm, vf_data); if (ret) return -EINVAL; @@ -985,6 +979,13 @@ static int hisi_acc_vf_stop_device(struct hisi_acc_vf_core_device *hisi_acc_vdev dev_err(dev, "failed to check QM INT state!\n"); return ret; } + + ret = vf_qm_cache_wb(vf_qm); + if (ret) { + dev_err(dev, "failed to writeback QM cache!\n"); + return ret; + } + return 0; } -- GitLab From be1e0287ac78841983d249a942dee03151483cc9 Mon Sep 17 00:00:00 2001 From: Longfang Liu Date: Sat, 5 Jul 2025 21:45:06 -0400 Subject: [PATCH 1989/2211] hisi_acc_vfio_pci: bugfix the problem of uninstalling driver [ Upstream commit db6525a8573957faea28850392f4744e5f8f7a53 ] In a live migration scenario. If the number of VFs at the destination is greater than the source, the recovery operation will fail and qemu will not be able to complete the process and exit after shutting down the device FD. This will cause the driver to be unable to be unloaded normally due to abnormal reference counting of the live migration driver caused by the abnormal closing operation of fd. Therefore, make sure the migration file descriptor references are always released when the device is closed. Fixes: b0eed085903e ("hisi_acc_vfio_pci: Add support for VFIO live migration") Signed-off-by: Longfang Liu Reviewed-by: Shameer Kolothum Link: https://lore.kernel.org/r/20250510081155.55840-5-liulongfang@huawei.com Signed-off-by: Alex Williamson Signed-off-by: Sasha Levin --- drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c index e37699fc03707..dda8cb3262e0b 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c @@ -1359,6 +1359,7 @@ static void hisi_acc_vfio_pci_close_device(struct vfio_device *core_vdev) struct hisi_acc_vf_core_device, core_device.vdev); struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm; + hisi_acc_vf_disable_fds(hisi_acc_vdev); iounmap(vf_qm->io_base); vfio_pci_core_close_device(core_vdev); } -- GitLab From c5474a7b04ccfec20e945df0a53b92db2dc3a191 Mon Sep 17 00:00:00 2001 From: Andrii Nakryiko Date: Thu, 14 Nov 2024 16:13:03 -0800 Subject: [PATCH 1990/2211] bpf: use common instruction history across all states [ Upstream commit 96a30e469ca1d2b8cc7811b40911f8614b558241 ] Instead of allocating and copying instruction history each time we enqueue child verifier state, switch to a model where we use one common dynamically sized array of instruction history entries across all states. The key observation for proving this is correct is that instruction history is only relevant while state is active, which means it either is a current state (and thus we are actively modifying instruction history and no other state can interfere with us) or we are checkpointed state with some children still active (either enqueued or being current). In the latter case our portion of instruction history is finalized and won't change or grow, so as long as we keep it immutable until the state is finalized, we are good. Now, when state is finalized and is put into state hash for potentially future pruning lookups, instruction history is not used anymore. This is because instruction history is only used by precision marking logic, and we never modify precision markings for finalized states. So, instead of each state having its own small instruction history, we keep a global dynamically-sized instruction history, where each state in current DFS path from root to active state remembers its portion of instruction history. Current state can append to this history, but cannot modify any of its parent histories. Async callback state enqueueing, while logically detached from parent state, still is part of verification backtracking tree, so has to follow the same schema as normal state checkpoints. Because the insn_hist array can be grown through realloc, states don't keep pointers, they instead maintain two indices, [start, end), into global instruction history array. End is exclusive index, so `start == end` means there is no relevant instruction history. This eliminates a lot of allocations and minimizes overall memory usage. For instance, running a worst-case test from [0] (but without the heuristics-based fix [1]), it took 12.5 minutes until we get -ENOMEM. With the changes in this patch the whole test succeeds in 10 minutes (very slow, so heuristics from [1] is important, of course). To further validate correctness, veristat-based comparison was performed for Meta production BPF objects and BPF selftests objects. In both cases there were no differences *at all* in terms of verdict or instruction and state counts, providing a good confidence in the change. Having this low-memory-overhead solution of keeping dynamic per-instruction history cheaply opens up some new possibilities, like keeping extra information for literally every single validated instruction. This will be used for simplifying precision backpropagation logic in follow up patches. [0] https://lore.kernel.org/bpf/20241029172641.1042523-2-eddyz87@gmail.com/ [1] https://lore.kernel.org/bpf/20241029172641.1042523-1-eddyz87@gmail.com/ Acked-by: Eduard Zingerman Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/r/20241115001303.277272-1-andrii@kernel.org Signed-off-by: Alexei Starovoitov Stable-dep-of: e2d2115e56c4 ("bpf: Do not include stack ptr register in precision backtracking bookkeeping") Signed-off-by: Sasha Levin --- include/linux/bpf_verifier.h | 19 ++++--- kernel/bpf/verifier.c | 107 +++++++++++++++++------------------ 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index 50eeb5b86ed70..b82ff91916e42 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -349,7 +349,7 @@ struct bpf_func_state { #define MAX_CALL_FRAMES 8 -/* instruction history flags, used in bpf_jmp_history_entry.flags field */ +/* instruction history flags, used in bpf_insn_hist_entry.flags field */ enum { /* instruction references stack slot through PTR_TO_STACK register; * we also store stack's frame number in lower 3 bits (MAX_CALL_FRAMES is 8) @@ -367,7 +367,7 @@ enum { static_assert(INSN_F_FRAMENO_MASK + 1 >= MAX_CALL_FRAMES); static_assert(INSN_F_SPI_MASK + 1 >= MAX_BPF_STACK / 8); -struct bpf_jmp_history_entry { +struct bpf_insn_hist_entry { u32 idx; /* insn idx can't be bigger than 1 million */ u32 prev_idx : 22; @@ -458,13 +458,14 @@ struct bpf_verifier_state { * See get_loop_entry() for more information. */ struct bpf_verifier_state *loop_entry; - /* jmp history recorded from first to last. - * backtracking is using it to go from last to first. - * For most states jmp_history_cnt is [0-3]. + /* Sub-range of env->insn_hist[] corresponding to this state's + * instruction history. + * Backtracking is using it to go from last to first. + * For most states instruction history is short, 0-3 instructions. * For loops can go up to ~40. */ - struct bpf_jmp_history_entry *jmp_history; - u32 jmp_history_cnt; + u32 insn_hist_start; + u32 insn_hist_end; u32 dfs_depth; u32 callback_unroll_depth; u32 may_goto_depth; @@ -748,7 +749,9 @@ struct bpf_verifier_env { int cur_stack; } cfg; struct backtrack_state bt; - struct bpf_jmp_history_entry *cur_hist_ent; + struct bpf_insn_hist_entry *insn_hist; + struct bpf_insn_hist_entry *cur_hist_ent; + u32 insn_hist_cap; u32 pass_cnt; /* number of times do_check() was called */ u32 subprog_cnt; /* number of instructions analyzed by the verifier */ diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 39a3d750f2ff9..7f00dc993041b 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -1376,13 +1376,6 @@ static void free_func_state(struct bpf_func_state *state) kfree(state); } -static void clear_jmp_history(struct bpf_verifier_state *state) -{ - kfree(state->jmp_history); - state->jmp_history = NULL; - state->jmp_history_cnt = 0; -} - static void free_verifier_state(struct bpf_verifier_state *state, bool free_self) { @@ -1392,7 +1385,6 @@ static void free_verifier_state(struct bpf_verifier_state *state, free_func_state(state->frame[i]); state->frame[i] = NULL; } - clear_jmp_history(state); if (free_self) kfree(state); } @@ -1418,13 +1410,6 @@ static int copy_verifier_state(struct bpf_verifier_state *dst_state, struct bpf_func_state *dst; int i, err; - dst_state->jmp_history = copy_array(dst_state->jmp_history, src->jmp_history, - src->jmp_history_cnt, sizeof(*dst_state->jmp_history), - GFP_USER); - if (!dst_state->jmp_history) - return -ENOMEM; - dst_state->jmp_history_cnt = src->jmp_history_cnt; - /* if dst has more stack frames then src frame, free them, this is also * necessary in case of exceptional exits using bpf_throw. */ @@ -1443,6 +1428,8 @@ static int copy_verifier_state(struct bpf_verifier_state *dst_state, dst_state->parent = src->parent; dst_state->first_insn_idx = src->first_insn_idx; dst_state->last_insn_idx = src->last_insn_idx; + dst_state->insn_hist_start = src->insn_hist_start; + dst_state->insn_hist_end = src->insn_hist_end; dst_state->dfs_depth = src->dfs_depth; dst_state->callback_unroll_depth = src->callback_unroll_depth; dst_state->used_as_loop_entry = src->used_as_loop_entry; @@ -2496,9 +2483,14 @@ static struct bpf_verifier_state *push_async_cb(struct bpf_verifier_env *env, * The caller state doesn't matter. * This is async callback. It starts in a fresh stack. * Initialize it similar to do_check_common(). + * But we do need to make sure to not clobber insn_hist, so we keep + * chaining insn_hist_start/insn_hist_end indices as for a normal + * child state. */ elem->st.branches = 1; elem->st.in_sleepable = is_sleepable; + elem->st.insn_hist_start = env->cur_state->insn_hist_end; + elem->st.insn_hist_end = elem->st.insn_hist_start; frame = kzalloc(sizeof(*frame), GFP_KERNEL); if (!frame) goto err; @@ -3513,11 +3505,10 @@ static void linked_regs_unpack(u64 val, struct linked_regs *s) } /* for any branch, call, exit record the history of jmps in the given state */ -static int push_jmp_history(struct bpf_verifier_env *env, struct bpf_verifier_state *cur, - int insn_flags, u64 linked_regs) +static int push_insn_history(struct bpf_verifier_env *env, struct bpf_verifier_state *cur, + int insn_flags, u64 linked_regs) { - u32 cnt = cur->jmp_history_cnt; - struct bpf_jmp_history_entry *p; + struct bpf_insn_hist_entry *p; size_t alloc_size; /* combine instruction flags if we already recorded this instruction */ @@ -3537,29 +3528,32 @@ static int push_jmp_history(struct bpf_verifier_env *env, struct bpf_verifier_st return 0; } - cnt++; - alloc_size = kmalloc_size_roundup(size_mul(cnt, sizeof(*p))); - p = krealloc(cur->jmp_history, alloc_size, GFP_USER); - if (!p) - return -ENOMEM; - cur->jmp_history = p; + if (cur->insn_hist_end + 1 > env->insn_hist_cap) { + alloc_size = size_mul(cur->insn_hist_end + 1, sizeof(*p)); + p = kvrealloc(env->insn_hist, alloc_size, GFP_USER); + if (!p) + return -ENOMEM; + env->insn_hist = p; + env->insn_hist_cap = alloc_size / sizeof(*p); + } - p = &cur->jmp_history[cnt - 1]; + p = &env->insn_hist[cur->insn_hist_end]; p->idx = env->insn_idx; p->prev_idx = env->prev_insn_idx; p->flags = insn_flags; p->linked_regs = linked_regs; - cur->jmp_history_cnt = cnt; + + cur->insn_hist_end++; env->cur_hist_ent = p; return 0; } -static struct bpf_jmp_history_entry *get_jmp_hist_entry(struct bpf_verifier_state *st, - u32 hist_end, int insn_idx) +static struct bpf_insn_hist_entry *get_insn_hist_entry(struct bpf_verifier_env *env, + u32 hist_start, u32 hist_end, int insn_idx) { - if (hist_end > 0 && st->jmp_history[hist_end - 1].idx == insn_idx) - return &st->jmp_history[hist_end - 1]; + if (hist_end > hist_start && env->insn_hist[hist_end - 1].idx == insn_idx) + return &env->insn_hist[hist_end - 1]; return NULL; } @@ -3576,25 +3570,26 @@ static struct bpf_jmp_history_entry *get_jmp_hist_entry(struct bpf_verifier_stat * history entry recording a jump from last instruction of parent state and * first instruction of given state. */ -static int get_prev_insn_idx(struct bpf_verifier_state *st, int i, - u32 *history) +static int get_prev_insn_idx(const struct bpf_verifier_env *env, + struct bpf_verifier_state *st, + int insn_idx, u32 hist_start, u32 *hist_endp) { - u32 cnt = *history; + u32 hist_end = *hist_endp; + u32 cnt = hist_end - hist_start; - if (i == st->first_insn_idx) { + if (insn_idx == st->first_insn_idx) { if (cnt == 0) return -ENOENT; - if (cnt == 1 && st->jmp_history[0].idx == i) + if (cnt == 1 && env->insn_hist[hist_start].idx == insn_idx) return -ENOENT; } - if (cnt && st->jmp_history[cnt - 1].idx == i) { - i = st->jmp_history[cnt - 1].prev_idx; - (*history)--; + if (cnt && env->insn_hist[hist_end - 1].idx == insn_idx) { + (*hist_endp)--; + return env->insn_hist[hist_end - 1].prev_idx; } else { - i--; + return insn_idx - 1; } - return i; } static const char *disasm_kfunc_name(void *data, const struct bpf_insn *insn) @@ -3766,7 +3761,7 @@ static void fmt_stack_mask(char *buf, ssize_t buf_sz, u64 stack_mask) /* If any register R in hist->linked_regs is marked as precise in bt, * do bt_set_frame_{reg,slot}(bt, R) for all registers in hist->linked_regs. */ -static void bt_sync_linked_regs(struct backtrack_state *bt, struct bpf_jmp_history_entry *hist) +static void bt_sync_linked_regs(struct backtrack_state *bt, struct bpf_insn_hist_entry *hist) { struct linked_regs linked_regs; bool some_precise = false; @@ -3811,7 +3806,7 @@ static bool calls_callback(struct bpf_verifier_env *env, int insn_idx); * - *was* processed previously during backtracking. */ static int backtrack_insn(struct bpf_verifier_env *env, int idx, int subseq_idx, - struct bpf_jmp_history_entry *hist, struct backtrack_state *bt) + struct bpf_insn_hist_entry *hist, struct backtrack_state *bt) { const struct bpf_insn_cbs cbs = { .cb_call = disasm_kfunc_name, @@ -4230,7 +4225,7 @@ static void mark_all_scalars_imprecise(struct bpf_verifier_env *env, struct bpf_ * SCALARS, as well as any other registers and slots that contribute to * a tracked state of given registers/stack slots, depending on specific BPF * assembly instructions (see backtrack_insns() for exact instruction handling - * logic). This backtracking relies on recorded jmp_history and is able to + * logic). This backtracking relies on recorded insn_hist and is able to * traverse entire chain of parent states. This process ends only when all the * necessary registers/slots and their transitive dependencies are marked as * precise. @@ -4347,8 +4342,9 @@ static int __mark_chain_precision(struct bpf_verifier_env *env, int regno) for (;;) { DECLARE_BITMAP(mask, 64); - u32 history = st->jmp_history_cnt; - struct bpf_jmp_history_entry *hist; + u32 hist_start = st->insn_hist_start; + u32 hist_end = st->insn_hist_end; + struct bpf_insn_hist_entry *hist; if (env->log.level & BPF_LOG_LEVEL2) { verbose(env, "mark_precise: frame%d: last_idx %d first_idx %d subseq_idx %d \n", @@ -4387,7 +4383,7 @@ static int __mark_chain_precision(struct bpf_verifier_env *env, int regno) err = 0; skip_first = false; } else { - hist = get_jmp_hist_entry(st, history, i); + hist = get_insn_hist_entry(env, hist_start, hist_end, i); err = backtrack_insn(env, i, subseq_idx, hist, bt); } if (err == -ENOTSUPP) { @@ -4404,7 +4400,7 @@ static int __mark_chain_precision(struct bpf_verifier_env *env, int regno) */ return 0; subseq_idx = i; - i = get_prev_insn_idx(st, i, &history); + i = get_prev_insn_idx(env, st, i, hist_start, &hist_end); if (i == -ENOENT) break; if (i >= env->prog->len) { @@ -4771,7 +4767,7 @@ static int check_stack_write_fixed_off(struct bpf_verifier_env *env, } if (insn_flags) - return push_jmp_history(env, env->cur_state, insn_flags, 0); + return push_insn_history(env, env->cur_state, insn_flags, 0); return 0; } @@ -5078,7 +5074,7 @@ static int check_stack_read_fixed_off(struct bpf_verifier_env *env, insn_flags = 0; /* we are not restoring spilled register */ } if (insn_flags) - return push_jmp_history(env, env->cur_state, insn_flags, 0); + return push_insn_history(env, env->cur_state, insn_flags, 0); return 0; } @@ -15542,7 +15538,7 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, if (dst_reg->type == SCALAR_VALUE && dst_reg->id) collect_linked_regs(this_branch, dst_reg->id, &linked_regs); if (linked_regs.cnt > 1) { - err = push_jmp_history(env, this_branch, 0, linked_regs_pack(&linked_regs)); + err = push_insn_history(env, this_branch, 0, linked_regs_pack(&linked_regs)); if (err) return err; } @@ -17984,7 +17980,7 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx) force_new_state = env->test_state_freq || is_force_checkpoint(env, insn_idx) || /* Avoid accumulating infinitely long jmp history */ - cur->jmp_history_cnt > 40; + cur->insn_hist_end - cur->insn_hist_start > 40; /* bpf progs typically have pruning point every 4 instructions * http://vger.kernel.org/bpfconf2019.html#session-1 @@ -18182,7 +18178,7 @@ hit: * the current state. */ if (is_jmp_point(env, env->insn_idx)) - err = err ? : push_jmp_history(env, cur, 0, 0); + err = err ? : push_insn_history(env, cur, 0, 0); err = err ? : propagate_precision(env, &sl->state); if (err) return err; @@ -18281,8 +18277,8 @@ next: cur->parent = new; cur->first_insn_idx = insn_idx; + cur->insn_hist_start = cur->insn_hist_end; cur->dfs_depth = new->dfs_depth + 1; - clear_jmp_history(cur); new_sl->next = *explored_state(env, insn_idx); *explored_state(env, insn_idx) = new_sl; /* connect new state to parentage chain. Current frame needs all @@ -18450,7 +18446,7 @@ static int do_check(struct bpf_verifier_env *env) } if (is_jmp_point(env, env->insn_idx)) { - err = push_jmp_history(env, state, 0, 0); + err = push_insn_history(env, state, 0, 0); if (err) return err; } @@ -22716,6 +22712,7 @@ err_unlock: if (!is_priv) mutex_unlock(&bpf_verifier_lock); vfree(env->insn_aux_data); + kvfree(env->insn_hist); err_free_env: kvfree(env); return ret; -- GitLab From 4265682c29c92f52c0da6fad5a79b5801462c8de Mon Sep 17 00:00:00 2001 From: Yonghong Song Date: Fri, 23 May 2025 21:13:35 -0700 Subject: [PATCH 1991/2211] bpf: Do not include stack ptr register in precision backtracking bookkeeping [ Upstream commit e2d2115e56c4a02377189bfc3a9a7933552a7b0f ] Yi Lai reported an issue ([1]) where the following warning appears in kernel dmesg: [ 60.643604] verifier backtracking bug [ 60.643635] WARNING: CPU: 10 PID: 2315 at kernel/bpf/verifier.c:4302 __mark_chain_precision+0x3a6c/0x3e10 [ 60.648428] Modules linked in: bpf_testmod(OE) [ 60.650471] CPU: 10 UID: 0 PID: 2315 Comm: test_progs Tainted: G OE 6.15.0-rc4-gef11287f8289-dirty #327 PREEMPT(full) [ 60.654385] Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE [ 60.656682] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org 04/01/2014 [ 60.660475] RIP: 0010:__mark_chain_precision+0x3a6c/0x3e10 [ 60.662814] Code: 5a 30 84 89 ea e8 c4 d9 01 00 80 3d 3e 7d d8 04 00 0f 85 60 fa ff ff c6 05 31 7d d8 04 01 48 c7 c7 00 58 30 84 e8 c4 06 a5 ff <0f> 0b e9 46 fa ff ff 48 ... [ 60.668720] RSP: 0018:ffff888116cc7298 EFLAGS: 00010246 [ 60.671075] RAX: 54d70e82dfd31900 RBX: ffff888115b65e20 RCX: 0000000000000000 [ 60.673659] RDX: 0000000000000001 RSI: 0000000000000004 RDI: 00000000ffffffff [ 60.676241] RBP: 0000000000000400 R08: ffff8881f6f23bd3 R09: 1ffff1103ede477a [ 60.678787] R10: dffffc0000000000 R11: ffffed103ede477b R12: ffff888115b60ae8 [ 60.681420] R13: 1ffff11022b6cbc4 R14: 00000000fffffff2 R15: 0000000000000001 [ 60.684030] FS: 00007fc2aedd80c0(0000) GS:ffff88826fa8a000(0000) knlGS:0000000000000000 [ 60.686837] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 60.689027] CR2: 000056325369e000 CR3: 000000011088b002 CR4: 0000000000370ef0 [ 60.691623] Call Trace: [ 60.692821] [ 60.693960] ? __pfx_verbose+0x10/0x10 [ 60.695656] ? __pfx_disasm_kfunc_name+0x10/0x10 [ 60.697495] check_cond_jmp_op+0x16f7/0x39b0 [ 60.699237] do_check+0x58fa/0xab10 ... Further analysis shows the warning is at line 4302 as below: 4294 /* static subprog call instruction, which 4295 * means that we are exiting current subprog, 4296 * so only r1-r5 could be still requested as 4297 * precise, r0 and r6-r10 or any stack slot in 4298 * the current frame should be zero by now 4299 */ 4300 if (bt_reg_mask(bt) & ~BPF_REGMASK_ARGS) { 4301 verbose(env, "BUG regs %x\n", bt_reg_mask(bt)); 4302 WARN_ONCE(1, "verifier backtracking bug"); 4303 return -EFAULT; 4304 } With the below test (also in the next patch): __used __naked static void __bpf_jmp_r10(void) { asm volatile ( "r2 = 2314885393468386424 ll;" "goto +0;" "if r2 <= r10 goto +3;" "if r1 >= -1835016 goto +0;" "if r2 <= 8 goto +0;" "if r3 <= 0 goto +0;" "exit;" ::: __clobber_all); } SEC("?raw_tp") __naked void bpf_jmp_r10(void) { asm volatile ( "r3 = 0 ll;" "call __bpf_jmp_r10;" "r0 = 0;" "exit;" ::: __clobber_all); } The following is the verifier failure log: 0: (18) r3 = 0x0 ; R3_w=0 2: (85) call pc+2 caller: R10=fp0 callee: frame1: R1=ctx() R3_w=0 R10=fp0 5: frame1: R1=ctx() R3_w=0 R10=fp0 ; asm volatile (" \ @ verifier_precision.c:184 5: (18) r2 = 0x20202000256c6c78 ; frame1: R2_w=0x20202000256c6c78 7: (05) goto pc+0 8: (bd) if r2 <= r10 goto pc+3 ; frame1: R2_w=0x20202000256c6c78 R10=fp0 9: (35) if r1 >= 0xffe3fff8 goto pc+0 ; frame1: R1=ctx() 10: (b5) if r2 <= 0x8 goto pc+0 mark_precise: frame1: last_idx 10 first_idx 0 subseq_idx -1 mark_precise: frame1: regs=r2 stack= before 9: (35) if r1 >= 0xffe3fff8 goto pc+0 mark_precise: frame1: regs=r2 stack= before 8: (bd) if r2 <= r10 goto pc+3 mark_precise: frame1: regs=r2,r10 stack= before 7: (05) goto pc+0 mark_precise: frame1: regs=r2,r10 stack= before 5: (18) r2 = 0x20202000256c6c78 mark_precise: frame1: regs=r10 stack= before 2: (85) call pc+2 BUG regs 400 The main failure reason is due to r10 in precision backtracking bookkeeping. Actually r10 is always precise and there is no need to add it for the precision backtracking bookkeeping. One way to fix the issue is to prevent bt_set_reg() if any src/dst reg is r10. Andrii suggested to go with push_insn_history() approach to avoid explicitly checking r10 in backtrack_insn(). This patch added push_insn_history() support for cond_jmp like 'rX rY' operations. In check_cond_jmp_op(), if any of rX or rY is a stack pointer, push_insn_history() will record such information, and later backtrack_insn() will do bt_set_reg() properly for those register(s). [1] https://lore.kernel.org/bpf/Z%2F8q3xzpU59CIYQE@ly-workstation/ Reported by: Yi Lai Fixes: 407958a0e980 ("bpf: encapsulate precision backtracking bookkeeping") Signed-off-by: Yonghong Song Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20250524041335.4046126-1-yonghong.song@linux.dev Signed-off-by: Sasha Levin --- include/linux/bpf_verifier.h | 12 ++++++++---- kernel/bpf/verifier.c | 18 ++++++++++++++++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index b82ff91916e42..fb33458f2fc77 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -361,7 +361,11 @@ enum { INSN_F_SPI_MASK = 0x3f, /* 6 bits */ INSN_F_SPI_SHIFT = 3, /* shifted 3 bits to the left */ - INSN_F_STACK_ACCESS = BIT(9), /* we need 10 bits total */ + INSN_F_STACK_ACCESS = BIT(9), + + INSN_F_DST_REG_STACK = BIT(10), /* dst_reg is PTR_TO_STACK */ + INSN_F_SRC_REG_STACK = BIT(11), /* src_reg is PTR_TO_STACK */ + /* total 12 bits are used now. */ }; static_assert(INSN_F_FRAMENO_MASK + 1 >= MAX_CALL_FRAMES); @@ -370,9 +374,9 @@ static_assert(INSN_F_SPI_MASK + 1 >= MAX_BPF_STACK / 8); struct bpf_insn_hist_entry { u32 idx; /* insn idx can't be bigger than 1 million */ - u32 prev_idx : 22; - /* special flags, e.g., whether insn is doing register stack spill/load */ - u32 flags : 10; + u32 prev_idx : 20; + /* special INSN_F_xxx flags */ + u32 flags : 12; /* additional registers that need precision tracking when this * jump is backtracked, vector of six 10-bit records */ diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 7f00dc993041b..f01477cecf393 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -4066,8 +4066,10 @@ static int backtrack_insn(struct bpf_verifier_env *env, int idx, int subseq_idx, * before it would be equally necessary to * propagate it to dreg. */ - bt_set_reg(bt, dreg); - bt_set_reg(bt, sreg); + if (!hist || !(hist->flags & INSN_F_SRC_REG_STACK)) + bt_set_reg(bt, sreg); + if (!hist || !(hist->flags & INSN_F_DST_REG_STACK)) + bt_set_reg(bt, dreg); } else if (BPF_SRC(insn->code) == BPF_K) { /* dreg K * Only dreg still needs precision before @@ -15415,6 +15417,7 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, struct bpf_reg_state *eq_branch_regs; struct linked_regs linked_regs = {}; u8 opcode = BPF_OP(insn->code); + int insn_flags = 0; bool is_jmp32; int pred = -1; int err; @@ -15474,6 +15477,9 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, insn->src_reg); return -EACCES; } + + if (src_reg->type == PTR_TO_STACK) + insn_flags |= INSN_F_SRC_REG_STACK; } else { if (insn->src_reg != BPF_REG_0) { verbose(env, "BPF_JMP/JMP32 uses reserved fields\n"); @@ -15485,6 +15491,14 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, __mark_reg_known(src_reg, insn->imm); } + if (dst_reg->type == PTR_TO_STACK) + insn_flags |= INSN_F_DST_REG_STACK; + if (insn_flags) { + err = push_insn_history(env, this_branch, insn_flags, 0); + if (err) + return err; + } + is_jmp32 = BPF_CLASS(insn->code) == BPF_JMP32; pred = is_branch_taken(dst_reg, src_reg, opcode, is_jmp32); if (pred >= 0) { -- GitLab From 67b3bb57fa17b8adbedcc20c8ebf11a2971b7f34 Mon Sep 17 00:00:00 2001 From: Krzysztof Kozlowski Date: Tue, 22 Oct 2024 17:47:39 +0200 Subject: [PATCH 1992/2211] arm64: dts: qcom: sm8650: change labels to lower-case [ Upstream commit 20eb2057b3e46feb0c2b517bcff3acfbba28320f ] DTS coding style expects labels to be lowercase. No functional impact. Verified with comparing decompiled DTB (dtx_diff and fdtdump+diff). Reviewed-by: Neil Armstrong Signed-off-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/20241022-dts-qcom-label-v3-14-0505bc7d2c56@linaro.org Signed-off-by: Bjorn Andersson Stable-dep-of: 9bb5ca464100 ("arm64: dts: qcom: sm8650: Fix domain-idle-state for CPU2") Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sm8650.dtsi | 156 +++++++++++++-------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/sm8650.dtsi b/arch/arm64/boot/dts/qcom/sm8650.dtsi index edde21972f5ac..3a7daeb2c12e3 100644 --- a/arch/arm64/boot/dts/qcom/sm8650.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8650.dtsi @@ -68,18 +68,18 @@ #address-cells = <2>; #size-cells = <0>; - CPU0: cpu@0 { + cpu0: cpu@0 { device_type = "cpu"; compatible = "arm,cortex-a520"; reg = <0 0>; clocks = <&cpufreq_hw 0>; - power-domains = <&CPU_PD0>; + power-domains = <&cpu_pd0>; power-domain-names = "psci"; enable-method = "psci"; - next-level-cache = <&L2_0>; + next-level-cache = <&l2_0>; capacity-dmips-mhz = <1024>; dynamic-power-coefficient = <100>; @@ -87,13 +87,13 @@ #cooling-cells = <2>; - L2_0: l2-cache { + l2_0: l2-cache { compatible = "cache"; cache-level = <2>; cache-unified; - next-level-cache = <&L3_0>; + next-level-cache = <&l3_0>; - L3_0: l3-cache { + l3_0: l3-cache { compatible = "cache"; cache-level = <3>; cache-unified; @@ -101,18 +101,18 @@ }; }; - CPU1: cpu@100 { + cpu1: cpu@100 { device_type = "cpu"; compatible = "arm,cortex-a520"; reg = <0 0x100>; clocks = <&cpufreq_hw 0>; - power-domains = <&CPU_PD1>; + power-domains = <&cpu_pd1>; power-domain-names = "psci"; enable-method = "psci"; - next-level-cache = <&L2_0>; + next-level-cache = <&l2_0>; capacity-dmips-mhz = <1024>; dynamic-power-coefficient = <100>; @@ -121,18 +121,18 @@ #cooling-cells = <2>; }; - CPU2: cpu@200 { + cpu2: cpu@200 { device_type = "cpu"; compatible = "arm,cortex-a720"; reg = <0 0x200>; clocks = <&cpufreq_hw 3>; - power-domains = <&CPU_PD2>; + power-domains = <&cpu_pd2>; power-domain-names = "psci"; enable-method = "psci"; - next-level-cache = <&L2_200>; + next-level-cache = <&l2_200>; capacity-dmips-mhz = <1792>; dynamic-power-coefficient = <238>; @@ -140,26 +140,26 @@ #cooling-cells = <2>; - L2_200: l2-cache { + l2_200: l2-cache { compatible = "cache"; cache-level = <2>; cache-unified; - next-level-cache = <&L3_0>; + next-level-cache = <&l3_0>; }; }; - CPU3: cpu@300 { + cpu3: cpu@300 { device_type = "cpu"; compatible = "arm,cortex-a720"; reg = <0 0x300>; clocks = <&cpufreq_hw 3>; - power-domains = <&CPU_PD3>; + power-domains = <&cpu_pd3>; power-domain-names = "psci"; enable-method = "psci"; - next-level-cache = <&L2_200>; + next-level-cache = <&l2_200>; capacity-dmips-mhz = <1792>; dynamic-power-coefficient = <238>; @@ -168,18 +168,18 @@ #cooling-cells = <2>; }; - CPU4: cpu@400 { + cpu4: cpu@400 { device_type = "cpu"; compatible = "arm,cortex-a720"; reg = <0 0x400>; clocks = <&cpufreq_hw 3>; - power-domains = <&CPU_PD4>; + power-domains = <&cpu_pd4>; power-domain-names = "psci"; enable-method = "psci"; - next-level-cache = <&L2_400>; + next-level-cache = <&l2_400>; capacity-dmips-mhz = <1792>; dynamic-power-coefficient = <238>; @@ -187,26 +187,26 @@ #cooling-cells = <2>; - L2_400: l2-cache { + l2_400: l2-cache { compatible = "cache"; cache-level = <2>; cache-unified; - next-level-cache = <&L3_0>; + next-level-cache = <&l3_0>; }; }; - CPU5: cpu@500 { + cpu5: cpu@500 { device_type = "cpu"; compatible = "arm,cortex-a720"; reg = <0 0x500>; clocks = <&cpufreq_hw 1>; - power-domains = <&CPU_PD5>; + power-domains = <&cpu_pd5>; power-domain-names = "psci"; enable-method = "psci"; - next-level-cache = <&L2_500>; + next-level-cache = <&l2_500>; capacity-dmips-mhz = <1792>; dynamic-power-coefficient = <238>; @@ -214,26 +214,26 @@ #cooling-cells = <2>; - L2_500: l2-cache { + l2_500: l2-cache { compatible = "cache"; cache-level = <2>; cache-unified; - next-level-cache = <&L3_0>; + next-level-cache = <&l3_0>; }; }; - CPU6: cpu@600 { + cpu6: cpu@600 { device_type = "cpu"; compatible = "arm,cortex-a720"; reg = <0 0x600>; clocks = <&cpufreq_hw 1>; - power-domains = <&CPU_PD6>; + power-domains = <&cpu_pd6>; power-domain-names = "psci"; enable-method = "psci"; - next-level-cache = <&L2_600>; + next-level-cache = <&l2_600>; capacity-dmips-mhz = <1792>; dynamic-power-coefficient = <238>; @@ -241,26 +241,26 @@ #cooling-cells = <2>; - L2_600: l2-cache { + l2_600: l2-cache { compatible = "cache"; cache-level = <2>; cache-unified; - next-level-cache = <&L3_0>; + next-level-cache = <&l3_0>; }; }; - CPU7: cpu@700 { + cpu7: cpu@700 { device_type = "cpu"; compatible = "arm,cortex-x4"; reg = <0 0x700>; clocks = <&cpufreq_hw 2>; - power-domains = <&CPU_PD7>; + power-domains = <&cpu_pd7>; power-domain-names = "psci"; enable-method = "psci"; - next-level-cache = <&L2_700>; + next-level-cache = <&l2_700>; capacity-dmips-mhz = <1894>; dynamic-power-coefficient = <588>; @@ -268,46 +268,46 @@ #cooling-cells = <2>; - L2_700: l2-cache { + l2_700: l2-cache { compatible = "cache"; cache-level = <2>; cache-unified; - next-level-cache = <&L3_0>; + next-level-cache = <&l3_0>; }; }; cpu-map { cluster0 { core0 { - cpu = <&CPU0>; + cpu = <&cpu0>; }; core1 { - cpu = <&CPU1>; + cpu = <&cpu1>; }; core2 { - cpu = <&CPU2>; + cpu = <&cpu2>; }; core3 { - cpu = <&CPU3>; + cpu = <&cpu3>; }; core4 { - cpu = <&CPU4>; + cpu = <&cpu4>; }; core5 { - cpu = <&CPU5>; + cpu = <&cpu5>; }; core6 { - cpu = <&CPU6>; + cpu = <&cpu6>; }; core7 { - cpu = <&CPU7>; + cpu = <&cpu7>; }; }; }; @@ -315,7 +315,7 @@ idle-states { entry-method = "psci"; - SILVER_CPU_SLEEP_0: cpu-sleep-0-0 { + silver_cpu_sleep_0: cpu-sleep-0-0 { compatible = "arm,idle-state"; idle-state-name = "silver-rail-power-collapse"; arm,psci-suspend-param = <0x40000004>; @@ -325,7 +325,7 @@ local-timer-stop; }; - GOLD_CPU_SLEEP_0: cpu-sleep-1-0 { + gold_cpu_sleep_0: cpu-sleep-1-0 { compatible = "arm,idle-state"; idle-state-name = "gold-rail-power-collapse"; arm,psci-suspend-param = <0x40000004>; @@ -335,7 +335,7 @@ local-timer-stop; }; - GOLD_PLUS_CPU_SLEEP_0: cpu-sleep-2-0 { + gold_plus_cpu_sleep_0: cpu-sleep-2-0 { compatible = "arm,idle-state"; idle-state-name = "gold-plus-rail-power-collapse"; arm,psci-suspend-param = <0x40000004>; @@ -347,7 +347,7 @@ }; domain-idle-states { - CLUSTER_SLEEP_0: cluster-sleep-0 { + cluster_sleep_0: cluster-sleep-0 { compatible = "domain-idle-state"; arm,psci-suspend-param = <0x41000044>; entry-latency-us = <750>; @@ -355,7 +355,7 @@ min-residency-us = <9144>; }; - CLUSTER_SLEEP_1: cluster-sleep-1 { + cluster_sleep_1: cluster-sleep-1 { compatible = "domain-idle-state"; arm,psci-suspend-param = <0x4100c344>; entry-latency-us = <2800>; @@ -411,58 +411,58 @@ compatible = "arm,psci-1.0"; method = "smc"; - CPU_PD0: power-domain-cpu0 { + cpu_pd0: power-domain-cpu0 { #power-domain-cells = <0>; - power-domains = <&CLUSTER_PD>; - domain-idle-states = <&SILVER_CPU_SLEEP_0>; + power-domains = <&cluster_pd>; + domain-idle-states = <&silver_cpu_sleep_0>; }; - CPU_PD1: power-domain-cpu1 { + cpu_pd1: power-domain-cpu1 { #power-domain-cells = <0>; - power-domains = <&CLUSTER_PD>; - domain-idle-states = <&SILVER_CPU_SLEEP_0>; + power-domains = <&cluster_pd>; + domain-idle-states = <&silver_cpu_sleep_0>; }; - CPU_PD2: power-domain-cpu2 { + cpu_pd2: power-domain-cpu2 { #power-domain-cells = <0>; - power-domains = <&CLUSTER_PD>; - domain-idle-states = <&SILVER_CPU_SLEEP_0>; + power-domains = <&cluster_pd>; + domain-idle-states = <&silver_cpu_sleep_0>; }; - CPU_PD3: power-domain-cpu3 { + cpu_pd3: power-domain-cpu3 { #power-domain-cells = <0>; - power-domains = <&CLUSTER_PD>; - domain-idle-states = <&GOLD_CPU_SLEEP_0>; + power-domains = <&cluster_pd>; + domain-idle-states = <&gold_cpu_sleep_0>; }; - CPU_PD4: power-domain-cpu4 { + cpu_pd4: power-domain-cpu4 { #power-domain-cells = <0>; - power-domains = <&CLUSTER_PD>; - domain-idle-states = <&GOLD_CPU_SLEEP_0>; + power-domains = <&cluster_pd>; + domain-idle-states = <&gold_cpu_sleep_0>; }; - CPU_PD5: power-domain-cpu5 { + cpu_pd5: power-domain-cpu5 { #power-domain-cells = <0>; - power-domains = <&CLUSTER_PD>; - domain-idle-states = <&GOLD_CPU_SLEEP_0>; + power-domains = <&cluster_pd>; + domain-idle-states = <&gold_cpu_sleep_0>; }; - CPU_PD6: power-domain-cpu6 { + cpu_pd6: power-domain-cpu6 { #power-domain-cells = <0>; - power-domains = <&CLUSTER_PD>; - domain-idle-states = <&GOLD_CPU_SLEEP_0>; + power-domains = <&cluster_pd>; + domain-idle-states = <&gold_cpu_sleep_0>; }; - CPU_PD7: power-domain-cpu7 { + cpu_pd7: power-domain-cpu7 { #power-domain-cells = <0>; - power-domains = <&CLUSTER_PD>; - domain-idle-states = <&GOLD_PLUS_CPU_SLEEP_0>; + power-domains = <&cluster_pd>; + domain-idle-states = <&gold_plus_cpu_sleep_0>; }; - CLUSTER_PD: power-domain-cluster { + cluster_pd: power-domain-cluster { #power-domain-cells = <0>; - domain-idle-states = <&CLUSTER_SLEEP_0>, - <&CLUSTER_SLEEP_1>; + domain-idle-states = <&cluster_sleep_0>, + <&cluster_sleep_1>; }; }; @@ -5233,7 +5233,7 @@ , ; - power-domains = <&CLUSTER_PD>; + power-domains = <&cluster_pd>; qcom,tcs-offset = <0xd00>; qcom,drv-id = <2>; -- GitLab From d8b92a122aed9e57e22b73d42d226bea5818d413 Mon Sep 17 00:00:00 2001 From: Luca Weiss Date: Fri, 14 Mar 2025 09:21:16 +0100 Subject: [PATCH 1993/2211] arm64: dts: qcom: sm8650: Fix domain-idle-state for CPU2 [ Upstream commit 9bb5ca464100e7c8f2d740148088f60e04fed8ed ] On SM8650 the CPUs 0-1 are "silver" (Cortex-A520), CPU 2-6 are "gold" (Cortex-A720) and CPU 7 is "gold-plus" (Cortex-X4). So reference the correct "gold" idle-state for CPU core 2. Fixes: d2350377997f ("arm64: dts: qcom: add initial SM8650 dtsi") Signed-off-by: Luca Weiss Reviewed-by: Konrad Dybcio Link: https://lore.kernel.org/r/20250314-sm8650-cpu2-sleep-v1-1-31d5c7c87a5d@fairphone.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sm8650.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/qcom/sm8650.dtsi b/arch/arm64/boot/dts/qcom/sm8650.dtsi index 3a7daeb2c12e3..72e3dcd495c3b 100644 --- a/arch/arm64/boot/dts/qcom/sm8650.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8650.dtsi @@ -426,7 +426,7 @@ cpu_pd2: power-domain-cpu2 { #power-domain-cells = <0>; power-domains = <&cluster_pd>; - domain-idle-states = <&silver_cpu_sleep_0>; + domain-idle-states = <&gold_cpu_sleep_0>; }; cpu_pd3: power-domain-cpu3 { -- GitLab From b9baad894b27dc795f066fd3ddec0e68f595cc21 Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Fri, 4 Oct 2024 14:52:54 +0200 Subject: [PATCH 1994/2211] arm64: dts: renesas: Use interrupts-extended for Ethernet PHYs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit ba4d843a2ac646abc034b013c0722630f6ea1c90 ] Use the more concise interrupts-extended property to fully describe the interrupts. Signed-off-by: Geert Uytterhoeven Reviewed-by: Niklas Söderlund Reviewed-by: Lad Prabhakar Tested-by: Lad Prabhakar # G2L family and G3S Link: https://lore.kernel.org/e9db8758d275ec63b0d6ce086ac3d0ea62966865.1728045620.git.geert+renesas@glider.be Stable-dep-of: 8ffec7d62c69 ("arm64: dts: renesas: white-hawk-single: Improve Ethernet TSN description") Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi | 3 +-- arch/arm64/boot/dts/renesas/cat875.dtsi | 3 +-- arch/arm64/boot/dts/renesas/condor-common.dtsi | 3 +-- arch/arm64/boot/dts/renesas/draak.dtsi | 3 +-- arch/arm64/boot/dts/renesas/ebisu.dtsi | 3 +-- arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi | 3 +-- arch/arm64/boot/dts/renesas/r8a77970-eagle.dts | 3 +-- arch/arm64/boot/dts/renesas/r8a77970-v3msk.dts | 3 +-- arch/arm64/boot/dts/renesas/r8a77980-v3hsk.dts | 3 +-- arch/arm64/boot/dts/renesas/r8a779a0-falcon.dts | 3 +-- .../arm64/boot/dts/renesas/r8a779f0-spider-ethernet.dtsi | 9 +++------ arch/arm64/boot/dts/renesas/r8a779f4-s4sk.dts | 6 ++---- .../boot/dts/renesas/r8a779g2-white-hawk-single.dts | 3 +-- .../arm64/boot/dts/renesas/r8a779h0-gray-hawk-single.dts | 3 +-- arch/arm64/boot/dts/renesas/rzg2l-smarc-som.dtsi | 6 ++---- arch/arm64/boot/dts/renesas/rzg2lc-smarc-som.dtsi | 3 +-- arch/arm64/boot/dts/renesas/rzg2ul-smarc-som.dtsi | 6 ++---- arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi | 6 ++---- arch/arm64/boot/dts/renesas/salvator-common.dtsi | 3 +-- arch/arm64/boot/dts/renesas/ulcb.dtsi | 3 +-- arch/arm64/boot/dts/renesas/white-hawk-cpu-common.dtsi | 3 +-- arch/arm64/boot/dts/renesas/white-hawk-ethernet.dtsi | 6 ++---- 22 files changed, 29 insertions(+), 58 deletions(-) diff --git a/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi b/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi index 68b04e56ae562..5a15a956702a6 100644 --- a/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi +++ b/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi @@ -62,8 +62,7 @@ compatible = "ethernet-phy-id0022.1640", "ethernet-phy-ieee802.3-c22"; reg = <0>; - interrupt-parent = <&gpio2>; - interrupts = <11 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio2 11 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>; }; }; diff --git a/arch/arm64/boot/dts/renesas/cat875.dtsi b/arch/arm64/boot/dts/renesas/cat875.dtsi index 8c9da8b4bd60b..191b051ecfd45 100644 --- a/arch/arm64/boot/dts/renesas/cat875.dtsi +++ b/arch/arm64/boot/dts/renesas/cat875.dtsi @@ -25,8 +25,7 @@ compatible = "ethernet-phy-id001c.c915", "ethernet-phy-ieee802.3-c22"; reg = <0>; - interrupt-parent = <&gpio2>; - interrupts = <21 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio2 21 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio1 20 GPIO_ACTIVE_LOW>; }; }; diff --git a/arch/arm64/boot/dts/renesas/condor-common.dtsi b/arch/arm64/boot/dts/renesas/condor-common.dtsi index 8b7c0c34eadce..b2d99dfaa0cdf 100644 --- a/arch/arm64/boot/dts/renesas/condor-common.dtsi +++ b/arch/arm64/boot/dts/renesas/condor-common.dtsi @@ -166,8 +166,7 @@ "ethernet-phy-ieee802.3-c22"; rxc-skew-ps = <1500>; reg = <0>; - interrupt-parent = <&gpio4>; - interrupts = <23 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio4 23 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio4 22 GPIO_ACTIVE_LOW>; }; }; diff --git a/arch/arm64/boot/dts/renesas/draak.dtsi b/arch/arm64/boot/dts/renesas/draak.dtsi index 6f133f54ded54..402112a37d75a 100644 --- a/arch/arm64/boot/dts/renesas/draak.dtsi +++ b/arch/arm64/boot/dts/renesas/draak.dtsi @@ -247,8 +247,7 @@ "ethernet-phy-ieee802.3-c22"; rxc-skew-ps = <1500>; reg = <0>; - interrupt-parent = <&gpio5>; - interrupts = <19 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio5 19 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio5 18 GPIO_ACTIVE_LOW>; /* * TX clock internal delay mode is required for reliable diff --git a/arch/arm64/boot/dts/renesas/ebisu.dtsi b/arch/arm64/boot/dts/renesas/ebisu.dtsi index cba2fde9dd368..1aedd093fb41b 100644 --- a/arch/arm64/boot/dts/renesas/ebisu.dtsi +++ b/arch/arm64/boot/dts/renesas/ebisu.dtsi @@ -314,8 +314,7 @@ "ethernet-phy-ieee802.3-c22"; rxc-skew-ps = <1500>; reg = <0>; - interrupt-parent = <&gpio2>; - interrupts = <21 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio2 21 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio1 20 GPIO_ACTIVE_LOW>; /* * TX clock internal delay mode is required for reliable diff --git a/arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi b/arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi index ad898c6db4e62..4113710d55226 100644 --- a/arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi +++ b/arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi @@ -27,8 +27,7 @@ compatible = "ethernet-phy-id001c.c915", "ethernet-phy-ieee802.3-c22"; reg = <0>; - interrupt-parent = <&gpio2>; - interrupts = <11 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio2 11 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>; }; }; diff --git a/arch/arm64/boot/dts/renesas/r8a77970-eagle.dts b/arch/arm64/boot/dts/renesas/r8a77970-eagle.dts index 0608dce92e405..7dd9e13cf0074 100644 --- a/arch/arm64/boot/dts/renesas/r8a77970-eagle.dts +++ b/arch/arm64/boot/dts/renesas/r8a77970-eagle.dts @@ -111,8 +111,7 @@ "ethernet-phy-ieee802.3-c22"; rxc-skew-ps = <1500>; reg = <0>; - interrupt-parent = <&gpio1>; - interrupts = <17 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio1 17 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio1 16 GPIO_ACTIVE_LOW>; }; }; diff --git a/arch/arm64/boot/dts/renesas/r8a77970-v3msk.dts b/arch/arm64/boot/dts/renesas/r8a77970-v3msk.dts index e36999e91af53..0a103f93b14d7 100644 --- a/arch/arm64/boot/dts/renesas/r8a77970-v3msk.dts +++ b/arch/arm64/boot/dts/renesas/r8a77970-v3msk.dts @@ -117,8 +117,7 @@ "ethernet-phy-ieee802.3-c22"; rxc-skew-ps = <1500>; reg = <0>; - interrupt-parent = <&gpio1>; - interrupts = <17 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio1 17 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio1 16 GPIO_ACTIVE_LOW>; }; }; diff --git a/arch/arm64/boot/dts/renesas/r8a77980-v3hsk.dts b/arch/arm64/boot/dts/renesas/r8a77980-v3hsk.dts index 77d22df25fffa..a8a20c748ffcd 100644 --- a/arch/arm64/boot/dts/renesas/r8a77980-v3hsk.dts +++ b/arch/arm64/boot/dts/renesas/r8a77980-v3hsk.dts @@ -124,8 +124,7 @@ "ethernet-phy-ieee802.3-c22"; rxc-skew-ps = <1500>; reg = <0>; - interrupt-parent = <&gpio4>; - interrupts = <23 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio4 23 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio4 22 GPIO_ACTIVE_LOW>; }; }; diff --git a/arch/arm64/boot/dts/renesas/r8a779a0-falcon.dts b/arch/arm64/boot/dts/renesas/r8a779a0-falcon.dts index 63db822e5f466..6bd580737f25d 100644 --- a/arch/arm64/boot/dts/renesas/r8a779a0-falcon.dts +++ b/arch/arm64/boot/dts/renesas/r8a779a0-falcon.dts @@ -31,8 +31,7 @@ "ethernet-phy-ieee802.3-c22"; rxc-skew-ps = <1500>; reg = <0>; - interrupt-parent = <&gpio4>; - interrupts = <16 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio4 16 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio4 15 GPIO_ACTIVE_LOW>; }; }; diff --git a/arch/arm64/boot/dts/renesas/r8a779f0-spider-ethernet.dtsi b/arch/arm64/boot/dts/renesas/r8a779f0-spider-ethernet.dtsi index 33c1015e9ab38..5d38669ed1ec3 100644 --- a/arch/arm64/boot/dts/renesas/r8a779f0-spider-ethernet.dtsi +++ b/arch/arm64/boot/dts/renesas/r8a779f0-spider-ethernet.dtsi @@ -60,8 +60,7 @@ u101: ethernet-phy@1 { reg = <1>; compatible = "ethernet-phy-ieee802.3-c45"; - interrupt-parent = <&gpio3>; - interrupts = <10 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio3 10 IRQ_TYPE_LEVEL_LOW>; }; }; }; @@ -78,8 +77,7 @@ u201: ethernet-phy@2 { reg = <2>; compatible = "ethernet-phy-ieee802.3-c45"; - interrupt-parent = <&gpio3>; - interrupts = <11 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio3 11 IRQ_TYPE_LEVEL_LOW>; }; }; }; @@ -96,8 +94,7 @@ u301: ethernet-phy@3 { reg = <3>; compatible = "ethernet-phy-ieee802.3-c45"; - interrupt-parent = <&gpio3>; - interrupts = <9 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio3 9 IRQ_TYPE_LEVEL_LOW>; }; }; }; diff --git a/arch/arm64/boot/dts/renesas/r8a779f4-s4sk.dts b/arch/arm64/boot/dts/renesas/r8a779f4-s4sk.dts index fa910b85859e9..5d71d52f9c654 100644 --- a/arch/arm64/boot/dts/renesas/r8a779f4-s4sk.dts +++ b/arch/arm64/boot/dts/renesas/r8a779f4-s4sk.dts @@ -197,8 +197,7 @@ ic99: ethernet-phy@1 { reg = <1>; compatible = "ethernet-phy-ieee802.3-c45"; - interrupt-parent = <&gpio3>; - interrupts = <10 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio3 10 IRQ_TYPE_LEVEL_LOW>; }; }; }; @@ -216,8 +215,7 @@ ic102: ethernet-phy@2 { reg = <2>; compatible = "ethernet-phy-ieee802.3-c45"; - interrupt-parent = <&gpio3>; - interrupts = <11 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio3 11 IRQ_TYPE_LEVEL_LOW>; }; }; }; diff --git a/arch/arm64/boot/dts/renesas/r8a779g2-white-hawk-single.dts b/arch/arm64/boot/dts/renesas/r8a779g2-white-hawk-single.dts index 50a428572d9bd..0062362b0ba06 100644 --- a/arch/arm64/boot/dts/renesas/r8a779g2-white-hawk-single.dts +++ b/arch/arm64/boot/dts/renesas/r8a779g2-white-hawk-single.dts @@ -70,8 +70,7 @@ compatible = "ethernet-phy-id002b.0980", "ethernet-phy-ieee802.3-c22"; reg = <0>; - interrupt-parent = <&gpio4>; - interrupts = <3 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio4 3 IRQ_TYPE_LEVEL_LOW>; }; }; }; diff --git a/arch/arm64/boot/dts/renesas/r8a779h0-gray-hawk-single.dts b/arch/arm64/boot/dts/renesas/r8a779h0-gray-hawk-single.dts index 9a1917b87f613..f4d721a7f505c 100644 --- a/arch/arm64/boot/dts/renesas/r8a779h0-gray-hawk-single.dts +++ b/arch/arm64/boot/dts/renesas/r8a779h0-gray-hawk-single.dts @@ -175,8 +175,7 @@ "ethernet-phy-ieee802.3-c22"; rxc-skew-ps = <1500>; reg = <0>; - interrupt-parent = <&gpio7>; - interrupts = <5 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio7 5 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio7 10 GPIO_ACTIVE_LOW>; }; }; diff --git a/arch/arm64/boot/dts/renesas/rzg2l-smarc-som.dtsi b/arch/arm64/boot/dts/renesas/rzg2l-smarc-som.dtsi index 83f5642d0d35c..502d9f17bf16d 100644 --- a/arch/arm64/boot/dts/renesas/rzg2l-smarc-som.dtsi +++ b/arch/arm64/boot/dts/renesas/rzg2l-smarc-som.dtsi @@ -102,8 +102,7 @@ compatible = "ethernet-phy-id0022.1640", "ethernet-phy-ieee802.3-c22"; reg = <7>; - interrupt-parent = <&irqc>; - interrupts = ; + interrupts-extended = <&irqc RZG2L_IRQ2 IRQ_TYPE_LEVEL_LOW>; rxc-skew-psec = <2400>; txc-skew-psec = <2400>; rxdv-skew-psec = <0>; @@ -130,8 +129,7 @@ compatible = "ethernet-phy-id0022.1640", "ethernet-phy-ieee802.3-c22"; reg = <7>; - interrupt-parent = <&irqc>; - interrupts = ; + interrupts-extended = <&irqc RZG2L_IRQ3 IRQ_TYPE_LEVEL_LOW>; rxc-skew-psec = <2400>; txc-skew-psec = <2400>; rxdv-skew-psec = <0>; diff --git a/arch/arm64/boot/dts/renesas/rzg2lc-smarc-som.dtsi b/arch/arm64/boot/dts/renesas/rzg2lc-smarc-som.dtsi index b4ef5ea8a9e34..de39311a77dc2 100644 --- a/arch/arm64/boot/dts/renesas/rzg2lc-smarc-som.dtsi +++ b/arch/arm64/boot/dts/renesas/rzg2lc-smarc-som.dtsi @@ -82,8 +82,7 @@ compatible = "ethernet-phy-id0022.1640", "ethernet-phy-ieee802.3-c22"; reg = <7>; - interrupt-parent = <&irqc>; - interrupts = ; + interrupts-extended = <&irqc RZG2L_IRQ0 IRQ_TYPE_LEVEL_LOW>; rxc-skew-psec = <2400>; txc-skew-psec = <2400>; rxdv-skew-psec = <0>; diff --git a/arch/arm64/boot/dts/renesas/rzg2ul-smarc-som.dtsi b/arch/arm64/boot/dts/renesas/rzg2ul-smarc-som.dtsi index 79443fb3f5810..1a6fd58bd3682 100644 --- a/arch/arm64/boot/dts/renesas/rzg2ul-smarc-som.dtsi +++ b/arch/arm64/boot/dts/renesas/rzg2ul-smarc-som.dtsi @@ -78,8 +78,7 @@ compatible = "ethernet-phy-id0022.1640", "ethernet-phy-ieee802.3-c22"; reg = <7>; - interrupt-parent = <&irqc>; - interrupts = ; + interrupts-extended = <&irqc RZG2L_IRQ2 IRQ_TYPE_LEVEL_LOW>; rxc-skew-psec = <2400>; txc-skew-psec = <2400>; rxdv-skew-psec = <0>; @@ -107,8 +106,7 @@ compatible = "ethernet-phy-id0022.1640", "ethernet-phy-ieee802.3-c22"; reg = <7>; - interrupt-parent = <&irqc>; - interrupts = ; + interrupts-extended = <&irqc RZG2L_IRQ7 IRQ_TYPE_LEVEL_LOW>; rxc-skew-psec = <2400>; txc-skew-psec = <2400>; rxdv-skew-psec = <0>; diff --git a/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi b/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi index 612cdc7efabbc..d2d367c09abd4 100644 --- a/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi +++ b/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi @@ -98,8 +98,7 @@ phy0: ethernet-phy@7 { reg = <7>; - interrupt-parent = <&pinctrl>; - interrupts = ; + interrupts-extended = <&pinctrl RZG2L_GPIO(12, 0) IRQ_TYPE_EDGE_FALLING>; rxc-skew-psec = <0>; txc-skew-psec = <0>; rxdv-skew-psec = <0>; @@ -124,8 +123,7 @@ phy1: ethernet-phy@7 { reg = <7>; - interrupt-parent = <&pinctrl>; - interrupts = ; + interrupts-extended = <&pinctrl RZG2L_GPIO(12, 1) IRQ_TYPE_EDGE_FALLING>; rxc-skew-psec = <0>; txc-skew-psec = <0>; rxdv-skew-psec = <0>; diff --git a/arch/arm64/boot/dts/renesas/salvator-common.dtsi b/arch/arm64/boot/dts/renesas/salvator-common.dtsi index 1eb4883b32197..c5035232956a8 100644 --- a/arch/arm64/boot/dts/renesas/salvator-common.dtsi +++ b/arch/arm64/boot/dts/renesas/salvator-common.dtsi @@ -353,8 +353,7 @@ "ethernet-phy-ieee802.3-c22"; rxc-skew-ps = <1500>; reg = <0>; - interrupt-parent = <&gpio2>; - interrupts = <11 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio2 11 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>; }; }; diff --git a/arch/arm64/boot/dts/renesas/ulcb.dtsi b/arch/arm64/boot/dts/renesas/ulcb.dtsi index a2f66f9160484..4cf141a701c06 100644 --- a/arch/arm64/boot/dts/renesas/ulcb.dtsi +++ b/arch/arm64/boot/dts/renesas/ulcb.dtsi @@ -150,8 +150,7 @@ "ethernet-phy-ieee802.3-c22"; rxc-skew-ps = <1500>; reg = <0>; - interrupt-parent = <&gpio2>; - interrupts = <11 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio2 11 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>; }; }; diff --git a/arch/arm64/boot/dts/renesas/white-hawk-cpu-common.dtsi b/arch/arm64/boot/dts/renesas/white-hawk-cpu-common.dtsi index 3845b413bd24c..69e4fddebd4e4 100644 --- a/arch/arm64/boot/dts/renesas/white-hawk-cpu-common.dtsi +++ b/arch/arm64/boot/dts/renesas/white-hawk-cpu-common.dtsi @@ -167,8 +167,7 @@ "ethernet-phy-ieee802.3-c22"; rxc-skew-ps = <1500>; reg = <0>; - interrupt-parent = <&gpio7>; - interrupts = <5 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio7 5 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio7 10 GPIO_ACTIVE_LOW>; }; }; diff --git a/arch/arm64/boot/dts/renesas/white-hawk-ethernet.dtsi b/arch/arm64/boot/dts/renesas/white-hawk-ethernet.dtsi index 595ec4ff4cdd0..ad94bf3f5e6c4 100644 --- a/arch/arm64/boot/dts/renesas/white-hawk-ethernet.dtsi +++ b/arch/arm64/boot/dts/renesas/white-hawk-ethernet.dtsi @@ -29,8 +29,7 @@ avb1_phy: ethernet-phy@0 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <0>; - interrupt-parent = <&gpio6>; - interrupts = <3 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio6 3 IRQ_TYPE_LEVEL_LOW>; }; }; }; @@ -51,8 +50,7 @@ avb2_phy: ethernet-phy@0 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <0>; - interrupt-parent = <&gpio5>; - interrupts = <4 IRQ_TYPE_LEVEL_LOW>; + interrupts-extended = <&gpio5 4 IRQ_TYPE_LEVEL_LOW>; }; }; }; -- GitLab From 7f0e933241225f51778d31a5373e699d241b245c Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Mon, 2 Dec 2024 17:30:09 +0100 Subject: [PATCH 1995/2211] arm64: dts: renesas: Factor out White Hawk Single board support [ Upstream commit d43c077cb88d800d0c2a372d70d5af75c6a16356 ] Move the common parts for the Renesas White Hawk Single board to white-hawk-single.dtsi, to enable future reuse. Signed-off-by: Geert Uytterhoeven Reviewed-by: Kuninori Morimoto Link: https://lore.kernel.org/1661743b18a9ff9fac716f98a663b39fc8488d7e.1733156661.git.geert+renesas@glider.be Stable-dep-of: 8ffec7d62c69 ("arm64: dts: renesas: white-hawk-single: Improve Ethernet TSN description") Signed-off-by: Sasha Levin --- .../renesas/r8a779g2-white-hawk-single.dts | 62 +--------------- .../boot/dts/renesas/white-hawk-single.dtsi | 73 +++++++++++++++++++ 2 files changed, 74 insertions(+), 61 deletions(-) create mode 100644 arch/arm64/boot/dts/renesas/white-hawk-single.dtsi diff --git a/arch/arm64/boot/dts/renesas/r8a779g2-white-hawk-single.dts b/arch/arm64/boot/dts/renesas/r8a779g2-white-hawk-single.dts index 0062362b0ba06..48befde389376 100644 --- a/arch/arm64/boot/dts/renesas/r8a779g2-white-hawk-single.dts +++ b/arch/arm64/boot/dts/renesas/r8a779g2-white-hawk-single.dts @@ -7,70 +7,10 @@ /dts-v1/; #include "r8a779g2.dtsi" -#include "white-hawk-cpu-common.dtsi" -#include "white-hawk-common.dtsi" +#include "white-hawk-single.dtsi" / { model = "Renesas White Hawk Single board based on r8a779g2"; compatible = "renesas,white-hawk-single", "renesas,r8a779g2", "renesas,r8a779g0"; }; - -&hscif0 { - uart-has-rtscts; -}; - -&hscif0_pins { - groups = "hscif0_data", "hscif0_ctrl"; - function = "hscif0"; -}; - -&pfc { - tsn0_pins: tsn0 { - mux { - groups = "tsn0_link", "tsn0_mdio", "tsn0_rgmii", - "tsn0_txcrefclk"; - function = "tsn0"; - }; - - link { - groups = "tsn0_link"; - bias-disable; - }; - - mdio { - groups = "tsn0_mdio"; - drive-strength = <24>; - bias-disable; - }; - - rgmii { - groups = "tsn0_rgmii"; - drive-strength = <24>; - bias-disable; - }; - }; -}; - -&tsn0 { - pinctrl-0 = <&tsn0_pins>; - pinctrl-names = "default"; - phy-mode = "rgmii"; - phy-handle = <&phy3>; - status = "okay"; - - mdio { - #address-cells = <1>; - #size-cells = <0>; - - reset-gpios = <&gpio1 23 GPIO_ACTIVE_LOW>; - reset-post-delay-us = <4000>; - - phy3: ethernet-phy@0 { - compatible = "ethernet-phy-id002b.0980", - "ethernet-phy-ieee802.3-c22"; - reg = <0>; - interrupts-extended = <&gpio4 3 IRQ_TYPE_LEVEL_LOW>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/renesas/white-hawk-single.dtsi b/arch/arm64/boot/dts/renesas/white-hawk-single.dtsi new file mode 100644 index 0000000000000..20e8232f2f323 --- /dev/null +++ b/arch/arm64/boot/dts/renesas/white-hawk-single.dtsi @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* + * Device Tree Source for the White Hawk Single board + * + * Copyright (C) 2023-2024 Glider bv + */ + +#include "white-hawk-cpu-common.dtsi" +#include "white-hawk-common.dtsi" + +/ { + model = "Renesas White Hawk Single board"; + compatible = "renesas,white-hawk-single"; +}; + +&hscif0 { + uart-has-rtscts; +}; + +&hscif0_pins { + groups = "hscif0_data", "hscif0_ctrl"; + function = "hscif0"; +}; + +&pfc { + tsn0_pins: tsn0 { + mux { + groups = "tsn0_link", "tsn0_mdio", "tsn0_rgmii", + "tsn0_txcrefclk"; + function = "tsn0"; + }; + + link { + groups = "tsn0_link"; + bias-disable; + }; + + mdio { + groups = "tsn0_mdio"; + drive-strength = <24>; + bias-disable; + }; + + rgmii { + groups = "tsn0_rgmii"; + drive-strength = <24>; + bias-disable; + }; + }; +}; + +&tsn0 { + pinctrl-0 = <&tsn0_pins>; + pinctrl-names = "default"; + phy-mode = "rgmii"; + phy-handle = <&phy3>; + status = "okay"; + + mdio { + #address-cells = <1>; + #size-cells = <0>; + + reset-gpios = <&gpio1 23 GPIO_ACTIVE_LOW>; + reset-post-delay-us = <4000>; + + phy3: ethernet-phy@0 { + compatible = "ethernet-phy-id002b.0980", + "ethernet-phy-ieee802.3-c22"; + reg = <0>; + interrupts-extended = <&gpio4 3 IRQ_TYPE_LEVEL_LOW>; + }; + }; +}; -- GitLab From 5a867d09f533eaaa3e633012170651c3b23ad40a Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Wed, 7 May 2025 15:31:55 +0200 Subject: [PATCH 1996/2211] arm64: dts: renesas: white-hawk-single: Improve Ethernet TSN description MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 8ffec7d62c6956199f442dac3b2d5d02231c3977 ] - Add the missing "ethernet3" alias for the Ethernet TSN port, so U-Boot will fill its local-mac-address property based on the "eth3addr" environment variable (if set), avoiding a random MAC address being assigned by the OS, - Rename the numerical Ethernet PHY label to "tsn0_phy", to avoid future conflicts, and for consistency with the "avbN_phy" labels. Fixes: 3d8e475bd7a724a9 ("arm64: dts: renesas: white-hawk-single: Wire-up Ethernet TSN") Signed-off-by: Geert Uytterhoeven Reviewed-by: Niklas Söderlund Link: https://lore.kernel.org/367f10a18aa196ff1c96734dd9bd5634b312c421.1746624368.git.geert+renesas@glider.be Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/renesas/white-hawk-single.dtsi | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/renesas/white-hawk-single.dtsi b/arch/arm64/boot/dts/renesas/white-hawk-single.dtsi index 20e8232f2f323..976a3ab44e5a5 100644 --- a/arch/arm64/boot/dts/renesas/white-hawk-single.dtsi +++ b/arch/arm64/boot/dts/renesas/white-hawk-single.dtsi @@ -11,6 +11,10 @@ / { model = "Renesas White Hawk Single board"; compatible = "renesas,white-hawk-single"; + + aliases { + ethernet3 = &tsn0; + }; }; &hscif0 { @@ -53,7 +57,7 @@ pinctrl-0 = <&tsn0_pins>; pinctrl-names = "default"; phy-mode = "rgmii"; - phy-handle = <&phy3>; + phy-handle = <&tsn0_phy>; status = "okay"; mdio { @@ -63,7 +67,7 @@ reset-gpios = <&gpio1 23 GPIO_ACTIVE_LOW>; reset-post-delay-us = <4000>; - phy3: ethernet-phy@0 { + tsn0_phy: ethernet-phy@0 { compatible = "ethernet-phy-id002b.0980", "ethernet-phy-ieee802.3-c22"; reg = <0>; -- GitLab From f3a472b914087a8346540c06ddd82bf7feca44ea Mon Sep 17 00:00:00 2001 From: Pengyu Luo Date: Sat, 5 Apr 2025 18:55:28 +0800 Subject: [PATCH 1997/2211] arm64: dts: qcom: sm8650: add the missing l2 cache node [ Upstream commit 4becd72352b6861de0c24074a8502ca85080fd63 ] Only two little a520s share the same L2, every a720 has their own L2 cache. Fixes: d2350377997f ("arm64: dts: qcom: add initial SM8650 dtsi") Signed-off-by: Pengyu Luo Reviewed-by: Konrad Dybcio Reviewed-by: Neil Armstrong Link: https://lore.kernel.org/r/20250405105529.309711-1-mitltlatltl@gmail.com Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/sm8650.dtsi | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/qcom/sm8650.dtsi b/arch/arm64/boot/dts/qcom/sm8650.dtsi index 72e3dcd495c3b..bd91624bd3bfc 100644 --- a/arch/arm64/boot/dts/qcom/sm8650.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8650.dtsi @@ -159,13 +159,20 @@ power-domain-names = "psci"; enable-method = "psci"; - next-level-cache = <&l2_200>; + next-level-cache = <&l2_300>; capacity-dmips-mhz = <1792>; dynamic-power-coefficient = <238>; qcom,freq-domain = <&cpufreq_hw 3>; #cooling-cells = <2>; + + l2_300: l2-cache { + compatible = "cache"; + cache-level = <2>; + cache-unified; + next-level-cache = <&l3_0>; + }; }; cpu4: cpu@400 { -- GitLab From 5b6eb04c0552d5b235d0f1912b496c1a9b5608e0 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Wed, 28 May 2025 11:26:22 -0700 Subject: [PATCH 1998/2211] ubsan: integer-overflow: depend on BROKEN to keep this out of CI [ Upstream commit d6a0e0bfecccdcecb08defe75a137c7262352102 ] Depending on !COMPILE_TEST isn't sufficient to keep this feature out of CI because we can't stop it from being included in randconfig builds. This feature is still highly experimental, and is developed in lock-step with Clang's Overflow Behavior Types[1]. Depend on BROKEN to keep it from being enabled by anyone not expecting it. Link: https://discourse.llvm.org/t/rfc-v2-clang-introduce-overflowbehaviortypes-for-wrapping-and-non-wrapping-arithmetic/86507 [1] Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-lkp/202505281024.f42beaa7-lkp@intel.com Fixes: 557f8c582a9b ("ubsan: Reintroduce signed overflow sanitizer") Acked-by: Eric Biggers Link: https://lore.kernel.org/r/20250528182616.work.296-kees@kernel.org Reviewed-by: Nathan Chancellor Acked-by: Marco Elver Signed-off-by: Kees Cook Signed-off-by: Sasha Levin --- lib/Kconfig.ubsan | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/Kconfig.ubsan b/lib/Kconfig.ubsan index 37655f58b8554..4e4dc430614a4 100644 --- a/lib/Kconfig.ubsan +++ b/lib/Kconfig.ubsan @@ -118,6 +118,8 @@ config UBSAN_UNREACHABLE config UBSAN_SIGNED_WRAP bool "Perform checking for signed arithmetic wrap-around" + # This is very experimental so drop the next line if you really want it + depends on BROKEN depends on !COMPILE_TEST # The no_sanitize attribute was introduced in GCC with version 8. depends on !CC_IS_GCC || GCC_VERSION >= 80000 -- GitLab From 5eec92eb4fe7f516b74d18affd1b1ea84f216825 Mon Sep 17 00:00:00 2001 From: Markus Elfring Date: Tue, 24 Sep 2024 14:28:35 +0200 Subject: [PATCH 1999/2211] remoteproc: k3: Call of_node_put(rmem_np) only once in three functions [ Upstream commit a36d9f96d1cf7c0308bf091e810bec06ce492c3d ] An of_node_put(rmem_np) call was immediately used after a pointer check for a of_reserved_mem_lookup() call in three function implementations. Thus call such a function only once instead directly before the checks. This issue was transformed by using the Coccinelle software. Signed-off-by: Markus Elfring Link: https://lore.kernel.org/r/c46b06f9-72b1-420b-9dce-a392b982140e@web.de Signed-off-by: Mathieu Poirier Stable-dep-of: 701177511abd ("remoteproc: k3-r5: Refactor sequential core power up/down operations") Signed-off-by: Sasha Levin --- drivers/remoteproc/ti_k3_dsp_remoteproc.c | 6 ++---- drivers/remoteproc/ti_k3_m4_remoteproc.c | 6 ++---- drivers/remoteproc/ti_k3_r5_remoteproc.c | 3 +-- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/drivers/remoteproc/ti_k3_dsp_remoteproc.c b/drivers/remoteproc/ti_k3_dsp_remoteproc.c index 2ae0655ddf1d2..73be3d2167914 100644 --- a/drivers/remoteproc/ti_k3_dsp_remoteproc.c +++ b/drivers/remoteproc/ti_k3_dsp_remoteproc.c @@ -568,11 +568,9 @@ static int k3_dsp_reserved_mem_init(struct k3_dsp_rproc *kproc) return -EINVAL; rmem = of_reserved_mem_lookup(rmem_np); - if (!rmem) { - of_node_put(rmem_np); - return -EINVAL; - } of_node_put(rmem_np); + if (!rmem) + return -EINVAL; kproc->rmem[i].bus_addr = rmem->base; /* 64-bit address regions currently not supported */ diff --git a/drivers/remoteproc/ti_k3_m4_remoteproc.c b/drivers/remoteproc/ti_k3_m4_remoteproc.c index fba6e393635e3..6cd50b16a8e82 100644 --- a/drivers/remoteproc/ti_k3_m4_remoteproc.c +++ b/drivers/remoteproc/ti_k3_m4_remoteproc.c @@ -433,11 +433,9 @@ static int k3_m4_reserved_mem_init(struct k3_m4_rproc *kproc) return -EINVAL; rmem = of_reserved_mem_lookup(rmem_np); - if (!rmem) { - of_node_put(rmem_np); - return -EINVAL; - } of_node_put(rmem_np); + if (!rmem) + return -EINVAL; kproc->rmem[i].bus_addr = rmem->base; /* 64-bit address regions currently not supported */ diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/ti_k3_r5_remoteproc.c index 4894461aa65f3..6cbe74486ebd4 100644 --- a/drivers/remoteproc/ti_k3_r5_remoteproc.c +++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c @@ -993,12 +993,11 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rproc *kproc) } rmem = of_reserved_mem_lookup(rmem_np); + of_node_put(rmem_np); if (!rmem) { - of_node_put(rmem_np); ret = -EINVAL; goto unmap_rmem; } - of_node_put(rmem_np); kproc->rmem[i].bus_addr = rmem->base; /* -- GitLab From f802fb717dfd516268fb90de16e1c1a3890db393 Mon Sep 17 00:00:00 2001 From: Beleswar Padhi Date: Thu, 19 Dec 2024 16:35:41 +0530 Subject: [PATCH 2000/2211] remoteproc: k3-r5: Add devm action to release reserved memory [ Upstream commit 972361e397797320a624d1a5b457520c10ab4a28 ] Use a device lifecycle managed action to release reserved memory. This helps prevent mistakes like releasing out of order in cleanup functions and forgetting to release on error paths. Signed-off-by: Beleswar Padhi Reviewed-by: Andrew Davis Link: https://lore.kernel.org/r/20241219110545.1898883-2-b-padhi@ti.com Signed-off-by: Mathieu Poirier Stable-dep-of: 701177511abd ("remoteproc: k3-r5: Refactor sequential core power up/down operations") Signed-off-by: Sasha Levin --- drivers/remoteproc/ti_k3_r5_remoteproc.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/ti_k3_r5_remoteproc.c index 6cbe74486ebd4..a9ec65c12fb93 100644 --- a/drivers/remoteproc/ti_k3_r5_remoteproc.c +++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c @@ -947,6 +947,13 @@ out: return ret; } +static void k3_r5_mem_release(void *data) +{ + struct device *dev = data; + + of_reserved_mem_device_release(dev); +} + static int k3_r5_reserved_mem_init(struct k3_r5_rproc *kproc) { struct device *dev = kproc->dev; @@ -977,12 +984,14 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rproc *kproc) return ret; } + ret = devm_add_action_or_reset(dev, k3_r5_mem_release, dev); + if (ret) + return ret; + num_rmems--; kproc->rmem = kcalloc(num_rmems, sizeof(*kproc->rmem), GFP_KERNEL); - if (!kproc->rmem) { - ret = -ENOMEM; - goto release_rmem; - } + if (!kproc->rmem) + return -ENOMEM; /* use remaining reserved memory regions for static carveouts */ for (i = 0; i < num_rmems; i++) { @@ -1033,8 +1042,6 @@ unmap_rmem: for (i--; i >= 0; i--) iounmap(kproc->rmem[i].cpu_addr); kfree(kproc->rmem); -release_rmem: - of_reserved_mem_device_release(dev); return ret; } @@ -1045,8 +1052,6 @@ static void k3_r5_reserved_mem_exit(struct k3_r5_rproc *kproc) for (i = 0; i < kproc->num_rmems; i++) iounmap(kproc->rmem[i].cpu_addr); kfree(kproc->rmem); - - of_reserved_mem_device_release(kproc->dev); } /* -- GitLab From e392148f7fa0f91715d79a391e5e9e51985b9cb0 Mon Sep 17 00:00:00 2001 From: Beleswar Padhi Date: Thu, 19 Dec 2024 16:35:42 +0530 Subject: [PATCH 2001/2211] remoteproc: k3-r5: Use devm_kcalloc() helper [ Upstream commit f2e3d0d70986b1f135963dc28462fce4e65c0fc4 ] Use a device lifecycle managed action to free memory. This helps prevent mistakes like freeing out of order in cleanup functions and forgetting to free on error paths. Signed-off-by: Beleswar Padhi Reviewed-by: Andrew Davis Link: https://lore.kernel.org/r/20241219110545.1898883-3-b-padhi@ti.com Signed-off-by: Mathieu Poirier Stable-dep-of: 701177511abd ("remoteproc: k3-r5: Refactor sequential core power up/down operations") Signed-off-by: Sasha Levin --- drivers/remoteproc/ti_k3_r5_remoteproc.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/ti_k3_r5_remoteproc.c index a9ec65c12fb93..c730ba09b92c7 100644 --- a/drivers/remoteproc/ti_k3_r5_remoteproc.c +++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c @@ -989,7 +989,7 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rproc *kproc) return ret; num_rmems--; - kproc->rmem = kcalloc(num_rmems, sizeof(*kproc->rmem), GFP_KERNEL); + kproc->rmem = devm_kcalloc(dev, num_rmems, sizeof(*kproc->rmem), GFP_KERNEL); if (!kproc->rmem) return -ENOMEM; @@ -1041,7 +1041,6 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rproc *kproc) unmap_rmem: for (i--; i >= 0; i--) iounmap(kproc->rmem[i].cpu_addr); - kfree(kproc->rmem); return ret; } @@ -1051,7 +1050,6 @@ static void k3_r5_reserved_mem_exit(struct k3_r5_rproc *kproc) for (i = 0; i < kproc->num_rmems; i++) iounmap(kproc->rmem[i].cpu_addr); - kfree(kproc->rmem); } /* -- GitLab From 0ea3572c15adc8b216b857d3392841b78b158191 Mon Sep 17 00:00:00 2001 From: Beleswar Padhi Date: Thu, 19 Dec 2024 16:35:43 +0530 Subject: [PATCH 2002/2211] remoteproc: k3-r5: Use devm_ioremap_wc() helper [ Upstream commit a572439f7143db5ea8446b7d755a16dfb12da7c7 ] Use a device lifecycle managed ioremap helper function. This helps prevent mistakes like unmapping out of order in cleanup functions and forgetting to unmap on all error paths. Signed-off-by: Beleswar Padhi Reviewed-by: Andrew Davis Link: https://lore.kernel.org/r/20241219110545.1898883-4-b-padhi@ti.com Signed-off-by: Mathieu Poirier Stable-dep-of: 701177511abd ("remoteproc: k3-r5: Refactor sequential core power up/down operations") Signed-off-by: Sasha Levin --- drivers/remoteproc/ti_k3_r5_remoteproc.c | 38 +++++------------------- 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/ti_k3_r5_remoteproc.c index c730ba09b92c7..c38b76b4943d5 100644 --- a/drivers/remoteproc/ti_k3_r5_remoteproc.c +++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c @@ -996,17 +996,13 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rproc *kproc) /* use remaining reserved memory regions for static carveouts */ for (i = 0; i < num_rmems; i++) { rmem_np = of_parse_phandle(np, "memory-region", i + 1); - if (!rmem_np) { - ret = -EINVAL; - goto unmap_rmem; - } + if (!rmem_np) + return -EINVAL; rmem = of_reserved_mem_lookup(rmem_np); of_node_put(rmem_np); - if (!rmem) { - ret = -EINVAL; - goto unmap_rmem; - } + if (!rmem) + return -EINVAL; kproc->rmem[i].bus_addr = rmem->base; /* @@ -1021,12 +1017,11 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rproc *kproc) */ kproc->rmem[i].dev_addr = (u32)rmem->base; kproc->rmem[i].size = rmem->size; - kproc->rmem[i].cpu_addr = ioremap_wc(rmem->base, rmem->size); + kproc->rmem[i].cpu_addr = devm_ioremap_wc(dev, rmem->base, rmem->size); if (!kproc->rmem[i].cpu_addr) { dev_err(dev, "failed to map reserved memory#%d at %pa of size %pa\n", i + 1, &rmem->base, &rmem->size); - ret = -ENOMEM; - goto unmap_rmem; + return -ENOMEM; } dev_dbg(dev, "reserved memory%d: bus addr %pa size 0x%zx va %pK da 0x%x\n", @@ -1037,19 +1032,6 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rproc *kproc) kproc->num_rmems = num_rmems; return 0; - -unmap_rmem: - for (i--; i >= 0; i--) - iounmap(kproc->rmem[i].cpu_addr); - return ret; -} - -static void k3_r5_reserved_mem_exit(struct k3_r5_rproc *kproc) -{ - int i; - - for (i = 0; i < kproc->num_rmems; i++) - iounmap(kproc->rmem[i].cpu_addr); } /* @@ -1278,8 +1260,8 @@ init_rmem: ret = rproc_add(rproc); if (ret) { - dev_err(dev, "rproc_add failed, ret = %d\n", ret); - goto err_add; + dev_err_probe(dev, ret, "rproc_add failed\n"); + goto out; } /* create only one rproc in lockstep, single-cpu or @@ -1325,8 +1307,6 @@ err_split: err_powerup: rproc_del(rproc); -err_add: - k3_r5_reserved_mem_exit(kproc); out: /* undo core0 upon any failures on core1 in split-mode */ if (cluster->mode == CLUSTER_MODE_SPLIT && core == core1) { @@ -1371,8 +1351,6 @@ static void k3_r5_cluster_rproc_exit(void *data) mbox_free_channel(kproc->mbox); rproc_del(rproc); - - k3_r5_reserved_mem_exit(kproc); } } -- GitLab From b14a64c1a97fc183fccbab9294111dd66bf0ab27 Mon Sep 17 00:00:00 2001 From: Beleswar Padhi Date: Thu, 19 Dec 2024 16:35:44 +0530 Subject: [PATCH 2003/2211] remoteproc: k3-r5: Use devm_rproc_add() helper [ Upstream commit de182d2f5ca0801425919f38ec955033c09c601d ] Use device lifecycle managed devm_rproc_add() helper function. This helps prevent mistakes like deleting out of order in cleanup functions and forgetting to delete on all error paths. Signed-off-by: Beleswar Padhi Reviewed-by: Andrew Davis Link: https://lore.kernel.org/r/20241219110545.1898883-5-b-padhi@ti.com Signed-off-by: Mathieu Poirier Stable-dep-of: 701177511abd ("remoteproc: k3-r5: Refactor sequential core power up/down operations") Signed-off-by: Sasha Levin --- drivers/remoteproc/ti_k3_r5_remoteproc.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/ti_k3_r5_remoteproc.c index c38b76b4943d5..055bdd36ef865 100644 --- a/drivers/remoteproc/ti_k3_r5_remoteproc.c +++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c @@ -1258,7 +1258,7 @@ init_rmem: goto out; } - ret = rproc_add(rproc); + ret = devm_rproc_add(dev, rproc); if (ret) { dev_err_probe(dev, ret, "rproc_add failed\n"); goto out; @@ -1289,7 +1289,7 @@ init_rmem: dev_err(dev, "Timed out waiting for %s core to power up!\n", rproc->name); - goto err_powerup; + goto out; } } @@ -1305,8 +1305,6 @@ err_split: } } -err_powerup: - rproc_del(rproc); out: /* undo core0 upon any failures on core1 in split-mode */ if (cluster->mode == CLUSTER_MODE_SPLIT && core == core1) { @@ -1349,8 +1347,6 @@ static void k3_r5_cluster_rproc_exit(void *data) } mbox_free_channel(kproc->mbox); - - rproc_del(rproc); } } -- GitLab From c2a952fb41cc5575b5b9fa22b9642b3b5070c6a3 Mon Sep 17 00:00:00 2001 From: Beleswar Padhi Date: Tue, 13 May 2025 11:14:37 +0530 Subject: [PATCH 2004/2211] remoteproc: k3-r5: Refactor sequential core power up/down operations [ Upstream commit 701177511abd295e0fc2499796e466d8ff12165c ] The existing implementation of the waiting mechanism in "k3_r5_cluster_rproc_init()" waits for the "released_from_reset" flag to be set as part of the firmware boot process in "k3_r5_rproc_start()". The "k3_r5_cluster_rproc_init()" function is invoked in the probe routine which causes unexpected failures in cases where the firmware is unavailable at boot time, resulting in probe failure and removal of the remoteproc handles in the sysfs paths. To address this, the waiting mechanism is refactored out of the probe routine into the appropriate "k3_r5_rproc_{prepare/unprepare}()" functions. This allows the probe routine to complete without depending on firmware booting, while still maintaining the required power-synchronization between cores. Further, this wait mechanism is dropped from "k3_r5_rproc_{start/stop}()" functions as they deal with Core Run/Halt operations, and as such, there is no constraint in Running or Halting the cores of a cluster in order. Fixes: 61f6f68447ab ("remoteproc: k3-r5: Wait for core0 power-up before powering up core1") Signed-off-by: Beleswar Padhi Tested-by: Judith Mendez Reviewed-by: Andrew Davis Link: https://lore.kernel.org/r/20250513054510.3439842-4-b-padhi@ti.com Signed-off-by: Mathieu Poirier Signed-off-by: Sasha Levin --- drivers/remoteproc/ti_k3_r5_remoteproc.c | 110 +++++++++++++---------- 1 file changed, 63 insertions(+), 47 deletions(-) diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/ti_k3_r5_remoteproc.c index 055bdd36ef865..941bb130c85c4 100644 --- a/drivers/remoteproc/ti_k3_r5_remoteproc.c +++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c @@ -440,13 +440,36 @@ static int k3_r5_rproc_prepare(struct rproc *rproc) { struct k3_r5_rproc *kproc = rproc->priv; struct k3_r5_cluster *cluster = kproc->cluster; - struct k3_r5_core *core = kproc->core; + struct k3_r5_core *core = kproc->core, *core0, *core1; struct device *dev = kproc->dev; u32 ctrl = 0, cfg = 0, stat = 0; u64 boot_vec = 0; bool mem_init_dis; int ret; + /* + * R5 cores require to be powered on sequentially, core0 should be in + * higher power state than core1 in a cluster. So, wait for core0 to + * power up before proceeding to core1 and put timeout of 2sec. This + * waiting mechanism is necessary because rproc_auto_boot_callback() for + * core1 can be called before core0 due to thread execution order. + * + * By placing the wait mechanism here in .prepare() ops, this condition + * is enforced for rproc boot requests from sysfs as well. + */ + core0 = list_first_entry(&cluster->cores, struct k3_r5_core, elem); + core1 = list_last_entry(&cluster->cores, struct k3_r5_core, elem); + if (cluster->mode == CLUSTER_MODE_SPLIT && core == core1 && + !core0->released_from_reset) { + ret = wait_event_interruptible_timeout(cluster->core_transition, + core0->released_from_reset, + msecs_to_jiffies(2000)); + if (ret <= 0) { + dev_err(dev, "can not power up core1 before core0"); + return -EPERM; + } + } + ret = ti_sci_proc_get_status(core->tsp, &boot_vec, &cfg, &ctrl, &stat); if (ret < 0) return ret; @@ -462,6 +485,14 @@ static int k3_r5_rproc_prepare(struct rproc *rproc) return ret; } + /* + * Notify all threads in the wait queue when core0 state has changed so + * that threads waiting for this condition can be executed. + */ + core->released_from_reset = true; + if (core == core0) + wake_up_interruptible(&cluster->core_transition); + /* * Newer IP revisions like on J7200 SoCs support h/w auto-initialization * of TCMs, so there is no need to perform the s/w memzero. This bit is @@ -507,10 +538,30 @@ static int k3_r5_rproc_unprepare(struct rproc *rproc) { struct k3_r5_rproc *kproc = rproc->priv; struct k3_r5_cluster *cluster = kproc->cluster; - struct k3_r5_core *core = kproc->core; + struct k3_r5_core *core = kproc->core, *core0, *core1; struct device *dev = kproc->dev; int ret; + /* + * Ensure power-down of cores is sequential in split mode. Core1 must + * power down before Core0 to maintain the expected state. By placing + * the wait mechanism here in .unprepare() ops, this condition is + * enforced for rproc stop or shutdown requests from sysfs and device + * removal as well. + */ + core0 = list_first_entry(&cluster->cores, struct k3_r5_core, elem); + core1 = list_last_entry(&cluster->cores, struct k3_r5_core, elem); + if (cluster->mode == CLUSTER_MODE_SPLIT && core == core0 && + core1->released_from_reset) { + ret = wait_event_interruptible_timeout(cluster->core_transition, + !core1->released_from_reset, + msecs_to_jiffies(2000)); + if (ret <= 0) { + dev_err(dev, "can not power down core0 before core1"); + return -EPERM; + } + } + /* Re-use LockStep-mode reset logic for Single-CPU mode */ ret = (cluster->mode == CLUSTER_MODE_LOCKSTEP || cluster->mode == CLUSTER_MODE_SINGLECPU) ? @@ -518,6 +569,14 @@ static int k3_r5_rproc_unprepare(struct rproc *rproc) if (ret) dev_err(dev, "unable to disable cores, ret = %d\n", ret); + /* + * Notify all threads in the wait queue when core1 state has changed so + * that threads waiting for this condition can be executed. + */ + core->released_from_reset = false; + if (core == core1) + wake_up_interruptible(&cluster->core_transition); + return ret; } @@ -543,7 +602,7 @@ static int k3_r5_rproc_start(struct rproc *rproc) struct k3_r5_rproc *kproc = rproc->priv; struct k3_r5_cluster *cluster = kproc->cluster; struct device *dev = kproc->dev; - struct k3_r5_core *core0, *core; + struct k3_r5_core *core; u32 boot_addr; int ret; @@ -565,21 +624,9 @@ static int k3_r5_rproc_start(struct rproc *rproc) goto unroll_core_run; } } else { - /* do not allow core 1 to start before core 0 */ - core0 = list_first_entry(&cluster->cores, struct k3_r5_core, - elem); - if (core != core0 && core0->rproc->state == RPROC_OFFLINE) { - dev_err(dev, "%s: can not start core 1 before core 0\n", - __func__); - return -EPERM; - } - ret = k3_r5_core_run(core); if (ret) return ret; - - core->released_from_reset = true; - wake_up_interruptible(&cluster->core_transition); } return 0; @@ -620,8 +667,7 @@ static int k3_r5_rproc_stop(struct rproc *rproc) { struct k3_r5_rproc *kproc = rproc->priv; struct k3_r5_cluster *cluster = kproc->cluster; - struct device *dev = kproc->dev; - struct k3_r5_core *core1, *core = kproc->core; + struct k3_r5_core *core = kproc->core; int ret; /* halt all applicable cores */ @@ -634,16 +680,6 @@ static int k3_r5_rproc_stop(struct rproc *rproc) } } } else { - /* do not allow core 0 to stop before core 1 */ - core1 = list_last_entry(&cluster->cores, struct k3_r5_core, - elem); - if (core != core1 && core1->rproc->state != RPROC_OFFLINE) { - dev_err(dev, "%s: can not stop core 0 before core 1\n", - __func__); - ret = -EPERM; - goto out; - } - ret = k3_r5_core_halt(core); if (ret) goto out; @@ -1271,26 +1307,6 @@ init_rmem: cluster->mode == CLUSTER_MODE_SINGLECPU || cluster->mode == CLUSTER_MODE_SINGLECORE) break; - - /* - * R5 cores require to be powered on sequentially, core0 - * should be in higher power state than core1 in a cluster - * So, wait for current core to power up before proceeding - * to next core and put timeout of 2sec for each core. - * - * This waiting mechanism is necessary because - * rproc_auto_boot_callback() for core1 can be called before - * core0 due to thread execution order. - */ - ret = wait_event_interruptible_timeout(cluster->core_transition, - core->released_from_reset, - msecs_to_jiffies(2000)); - if (ret <= 0) { - dev_err(dev, - "Timed out waiting for %s core to power up!\n", - rproc->name); - goto out; - } } return 0; -- GitLab From e0fefe9bc07e6101fdc57abda3644f296c114e31 Mon Sep 17 00:00:00 2001 From: David Howells Date: Sat, 5 Jul 2025 18:25:56 -0400 Subject: [PATCH 2005/2211] netfs: Fix oops in write-retry from mis-resetting the subreq iterator [ Upstream commit 4481f7f2b3df123ec77e828c849138f75cff2bf2 ] Fix the resetting of the subrequest iterator in netfs_retry_write_stream() to use the iterator-reset function as the iterator may have been shortened by a previous retry. In such a case, the amount of data to be written by the subrequest is not "subreq->len" but "subreq->len - subreq->transferred". Without this, KASAN may see an error in iov_iter_revert(): BUG: KASAN: slab-out-of-bounds in iov_iter_revert lib/iov_iter.c:633 [inline] BUG: KASAN: slab-out-of-bounds in iov_iter_revert+0x443/0x5a0 lib/iov_iter.c:611 Read of size 4 at addr ffff88802912a0b8 by task kworker/u32:7/1147 CPU: 1 UID: 0 PID: 1147 Comm: kworker/u32:7 Not tainted 6.15.0-rc6-syzkaller-00052-g9f35e33144ae #0 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 Workqueue: events_unbound netfs_write_collection_worker Call Trace: __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:408 [inline] print_report+0xc3/0x670 mm/kasan/report.c:521 kasan_report+0xe0/0x110 mm/kasan/report.c:634 iov_iter_revert lib/iov_iter.c:633 [inline] iov_iter_revert+0x443/0x5a0 lib/iov_iter.c:611 netfs_retry_write_stream fs/netfs/write_retry.c:44 [inline] netfs_retry_writes+0x166d/0x1a50 fs/netfs/write_retry.c:231 netfs_collect_write_results fs/netfs/write_collect.c:352 [inline] netfs_write_collection_worker+0x23fd/0x3830 fs/netfs/write_collect.c:374 process_one_work+0x9cf/0x1b70 kernel/workqueue.c:3238 process_scheduled_works kernel/workqueue.c:3319 [inline] worker_thread+0x6c8/0xf10 kernel/workqueue.c:3400 kthread+0x3c2/0x780 kernel/kthread.c:464 ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:153 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245 Fixes: cd0277ed0c18 ("netfs: Use new folio_queue data type and iterator instead of xarray iter") Reported-by: syzbot+25b83a6f2c702075fcbc@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=25b83a6f2c702075fcbc Signed-off-by: David Howells Link: https://lore.kernel.org/20250519090707.2848510-2-dhowells@redhat.com Tested-by: syzbot+25b83a6f2c702075fcbc@syzkaller.appspotmail.com cc: Paulo Alcantara cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/netfs/write_collect.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/netfs/write_collect.c b/fs/netfs/write_collect.c index 412d4da742270..7cb21da40a0a4 100644 --- a/fs/netfs/write_collect.c +++ b/fs/netfs/write_collect.c @@ -176,9 +176,10 @@ static void netfs_retry_write_stream(struct netfs_io_request *wreq, if (test_bit(NETFS_SREQ_FAILED, &subreq->flags)) break; if (__test_and_clear_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags)) { - struct iov_iter source = subreq->io_iter; + struct iov_iter source; - iov_iter_revert(&source, subreq->len - source.count); + netfs_reset_iter(subreq); + source = subreq->io_iter; __set_bit(NETFS_SREQ_RETRYING, &subreq->flags); netfs_get_subrequest(subreq, netfs_sreq_trace_get_resubmit); netfs_reissue_write(stream, subreq, &source); -- GitLab From 61628111e74f0d3253a7051b8b0e7757a7d62cff Mon Sep 17 00:00:00 2001 From: Christophe JAILLET Date: Sat, 5 Jul 2025 21:48:54 -0400 Subject: [PATCH 2006/2211] mfd: exynos-lpass: Fix another error handling path in exynos_lpass_probe() [ Upstream commit f41cc37f4bc0e8cd424697bf6e26586cadcf4b9b ] If devm_of_platform_populate() fails, some clean-up needs to be done, as already done in the remove function. Add a new devm_add_action_or_reset() to fix the leak in the probe and remove the need of a remove function. Fixes: c695abab2429 ("mfd: Add Samsung Exynos Low Power Audio Subsystem driver") Signed-off-by: Christophe JAILLET Reviewed-by: Krzysztof Kozlowski Link: https://lore.kernel.org/r/69471e839efc0249a504492a8de3497fcdb6a009.1745247209.git.christophe.jaillet@wanadoo.fr Signed-off-by: Lee Jones Signed-off-by: Sasha Levin --- drivers/mfd/exynos-lpass.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/drivers/mfd/exynos-lpass.c b/drivers/mfd/exynos-lpass.c index e36805f07282e..8b5fed4760394 100644 --- a/drivers/mfd/exynos-lpass.c +++ b/drivers/mfd/exynos-lpass.c @@ -104,11 +104,22 @@ static const struct regmap_config exynos_lpass_reg_conf = { .fast_io = true, }; +static void exynos_lpass_disable_lpass(void *data) +{ + struct platform_device *pdev = data; + struct exynos_lpass *lpass = platform_get_drvdata(pdev); + + pm_runtime_disable(&pdev->dev); + if (!pm_runtime_status_suspended(&pdev->dev)) + exynos_lpass_disable(lpass); +} + static int exynos_lpass_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct exynos_lpass *lpass; void __iomem *base_top; + int ret; lpass = devm_kzalloc(dev, sizeof(*lpass), GFP_KERNEL); if (!lpass) @@ -134,16 +145,11 @@ static int exynos_lpass_probe(struct platform_device *pdev) pm_runtime_enable(dev); exynos_lpass_enable(lpass); - return devm_of_platform_populate(dev); -} - -static void exynos_lpass_remove(struct platform_device *pdev) -{ - struct exynos_lpass *lpass = platform_get_drvdata(pdev); + ret = devm_add_action_or_reset(dev, exynos_lpass_disable_lpass, pdev); + if (ret) + return ret; - pm_runtime_disable(&pdev->dev); - if (!pm_runtime_status_suspended(&pdev->dev)) - exynos_lpass_disable(lpass); + return devm_of_platform_populate(dev); } static int __maybe_unused exynos_lpass_suspend(struct device *dev) @@ -183,7 +189,6 @@ static struct platform_driver exynos_lpass_driver = { .of_match_table = exynos_lpass_of_match, }, .probe = exynos_lpass_probe, - .remove_new = exynos_lpass_remove, }; module_platform_driver(exynos_lpass_driver); -- GitLab From e5f01b2b6771d40fb8ec3f0d83fc5c087101fd85 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Fri, 13 Sep 2024 13:47:53 +0200 Subject: [PATCH 2007/2211] drm/xe: Fix DSB buffer coherency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 71a3161e9d7d2229cb4eefd4c49effb97caf3db3 ] Add the scanout flag to force WC caching, and add the memory barrier where needed. Reviewed-by: Matthew Auld Reviewed-by: Ville Syrjälä Link: https://patchwork.freedesktop.org/patch/msgid/20240913114754.7956-2-maarten.lankhorst@linux.intel.com Signed-off-by: Maarten Lankhorst Stable-dep-of: a4b1b51ae132 ("drm/xe: Move DSB l2 flush to a more sensible place") Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/display/xe_dsb_buffer.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/xe/display/xe_dsb_buffer.c b/drivers/gpu/drm/xe/display/xe_dsb_buffer.c index f99d901a3214f..f95375451e2fa 100644 --- a/drivers/gpu/drm/xe/display/xe_dsb_buffer.c +++ b/drivers/gpu/drm/xe/display/xe_dsb_buffer.c @@ -48,11 +48,12 @@ bool intel_dsb_buffer_create(struct intel_crtc *crtc, struct intel_dsb_buffer *d if (!vma) return false; + /* Set scanout flag for WC mapping */ obj = xe_bo_create_pin_map(xe, xe_device_get_root_tile(xe), NULL, PAGE_ALIGN(size), ttm_bo_type_kernel, XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | - XE_BO_FLAG_GGTT); + XE_BO_FLAG_SCANOUT | XE_BO_FLAG_GGTT); if (IS_ERR(obj)) { kfree(vma); return false; @@ -73,5 +74,9 @@ void intel_dsb_buffer_cleanup(struct intel_dsb_buffer *dsb_buf) void intel_dsb_buffer_flush_map(struct intel_dsb_buffer *dsb_buf) { - /* TODO: add xe specific flush_map() for dsb buffer object. */ + /* + * The memory barrier here is to ensure coherency of DSB vs MMIO, + * both for weak ordering archs and discrete cards. + */ + xe_device_wmb(dsb_buf->vma->bo->tile->xe); } -- GitLab From 98e5c71e7e7415c2223a069ebb4f38d8ffc0773f Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Fri, 6 Jun 2025 11:45:47 +0100 Subject: [PATCH 2008/2211] drm/xe: Move DSB l2 flush to a more sensible place MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit a4b1b51ae132ac199412028a2df7b6c267888190 ] Flushing l2 is only needed after all data has been written. Fixes: 01570b446939 ("drm/xe/bmg: implement Wa_16023588340") Signed-off-by: Maarten Lankhorst Cc: Matthew Auld Cc: stable@vger.kernel.org # v6.12+ Reviewed-by: Matthew Auld Signed-off-by: Matthew Auld Reviewed-by: Lucas De Marchi Reviewed-by: Ville Syrjälä Link: https://lore.kernel.org/r/20250606104546.1996818-3-matthew.auld@intel.com Signed-off-by: Lucas De Marchi (cherry picked from commit 0dd2dd0182bc444a62652e89d08c7f0e4fde15ba) Signed-off-by: Thomas Hellström Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/display/xe_dsb_buffer.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/xe/display/xe_dsb_buffer.c b/drivers/gpu/drm/xe/display/xe_dsb_buffer.c index f95375451e2fa..9f941fc2e36bb 100644 --- a/drivers/gpu/drm/xe/display/xe_dsb_buffer.c +++ b/drivers/gpu/drm/xe/display/xe_dsb_buffer.c @@ -17,10 +17,7 @@ u32 intel_dsb_buffer_ggtt_offset(struct intel_dsb_buffer *dsb_buf) void intel_dsb_buffer_write(struct intel_dsb_buffer *dsb_buf, u32 idx, u32 val) { - struct xe_device *xe = dsb_buf->vma->bo->tile->xe; - iosys_map_wr(&dsb_buf->vma->bo->vmap, idx * 4, u32, val); - xe_device_l2_flush(xe); } u32 intel_dsb_buffer_read(struct intel_dsb_buffer *dsb_buf, u32 idx) @@ -30,12 +27,9 @@ u32 intel_dsb_buffer_read(struct intel_dsb_buffer *dsb_buf, u32 idx) void intel_dsb_buffer_memset(struct intel_dsb_buffer *dsb_buf, u32 idx, u32 val, size_t size) { - struct xe_device *xe = dsb_buf->vma->bo->tile->xe; - WARN_ON(idx > (dsb_buf->buf_size - size) / sizeof(*dsb_buf->cmd_buf)); iosys_map_memset(&dsb_buf->vma->bo->vmap, idx * 4, val, size); - xe_device_l2_flush(xe); } bool intel_dsb_buffer_create(struct intel_crtc *crtc, struct intel_dsb_buffer *dsb_buf, size_t size) @@ -74,9 +68,12 @@ void intel_dsb_buffer_cleanup(struct intel_dsb_buffer *dsb_buf) void intel_dsb_buffer_flush_map(struct intel_dsb_buffer *dsb_buf) { + struct xe_device *xe = dsb_buf->vma->bo->tile->xe; + /* * The memory barrier here is to ensure coherency of DSB vs MMIO, * both for weak ordering archs and discrete cards. */ - xe_device_wmb(dsb_buf->vma->bo->tile->xe); + xe_device_wmb(xe); + xe_device_l2_flush(xe); } -- GitLab From ce1ef3b64ef75298e69c90eed9b26fdff3e5e363 Mon Sep 17 00:00:00 2001 From: Juha-Pekka Heikkila Date: Wed, 9 Oct 2024 18:19:46 +0300 Subject: [PATCH 2009/2211] drm/xe: add interface to request physical alignment for buffer objects [ Upstream commit 3ad86ae1da97d0091f673f08846848714f6dd745 ] Add xe_bo_create_pin_map_at_aligned() which augment xe_bo_create_pin_map_at() with alignment parameter allowing to pass required alignemnt if it differ from default. Signed-off-by: Juha-Pekka Heikkila Reviewed-by: Jonathan Cavitt Signed-off-by: Mika Kahola Link: https://patchwork.freedesktop.org/patch/msgid/20241009151947.2240099-2-juhapekka.heikkila@gmail.com Stable-dep-of: f16873f42a06 ("drm/xe: move DPT l2 flush to a more sensible place") Signed-off-by: Sasha Levin --- .../compat-i915-headers/gem/i915_gem_stolen.h | 2 +- drivers/gpu/drm/xe/xe_bo.c | 29 +++++++++++++++---- drivers/gpu/drm/xe/xe_bo.h | 8 ++++- drivers/gpu/drm/xe/xe_bo_types.h | 5 ++++ drivers/gpu/drm/xe/xe_ggtt.c | 2 +- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h b/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h index cb6c7598824be..9c4cf050059ac 100644 --- a/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h +++ b/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h @@ -29,7 +29,7 @@ static inline int i915_gem_stolen_insert_node_in_range(struct xe_device *xe, bo = xe_bo_create_locked_range(xe, xe_device_get_root_tile(xe), NULL, size, start, end, - ttm_bo_type_kernel, flags); + ttm_bo_type_kernel, flags, 0); if (IS_ERR(bo)) { err = PTR_ERR(bo); bo = NULL; diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c index 8acc4640f0a28..c92953c08d682 100644 --- a/drivers/gpu/drm/xe/xe_bo.c +++ b/drivers/gpu/drm/xe/xe_bo.c @@ -1454,7 +1454,8 @@ static struct xe_bo * __xe_bo_create_locked(struct xe_device *xe, struct xe_tile *tile, struct xe_vm *vm, size_t size, u64 start, u64 end, - u16 cpu_caching, enum ttm_bo_type type, u32 flags) + u16 cpu_caching, enum ttm_bo_type type, u32 flags, + u64 alignment) { struct xe_bo *bo = NULL; int err; @@ -1483,6 +1484,8 @@ __xe_bo_create_locked(struct xe_device *xe, if (IS_ERR(bo)) return bo; + bo->min_align = alignment; + /* * Note that instead of taking a reference no the drm_gpuvm_resv_bo(), * to ensure the shared resv doesn't disappear under the bo, the bo @@ -1523,16 +1526,18 @@ struct xe_bo * xe_bo_create_locked_range(struct xe_device *xe, struct xe_tile *tile, struct xe_vm *vm, size_t size, u64 start, u64 end, - enum ttm_bo_type type, u32 flags) + enum ttm_bo_type type, u32 flags, u64 alignment) { - return __xe_bo_create_locked(xe, tile, vm, size, start, end, 0, type, flags); + return __xe_bo_create_locked(xe, tile, vm, size, start, end, 0, type, + flags, alignment); } struct xe_bo *xe_bo_create_locked(struct xe_device *xe, struct xe_tile *tile, struct xe_vm *vm, size_t size, enum ttm_bo_type type, u32 flags) { - return __xe_bo_create_locked(xe, tile, vm, size, 0, ~0ULL, 0, type, flags); + return __xe_bo_create_locked(xe, tile, vm, size, 0, ~0ULL, 0, type, + flags, 0); } struct xe_bo *xe_bo_create_user(struct xe_device *xe, struct xe_tile *tile, @@ -1542,7 +1547,7 @@ struct xe_bo *xe_bo_create_user(struct xe_device *xe, struct xe_tile *tile, { struct xe_bo *bo = __xe_bo_create_locked(xe, tile, vm, size, 0, ~0ULL, cpu_caching, ttm_bo_type_device, - flags | XE_BO_FLAG_USER); + flags | XE_BO_FLAG_USER, 0); if (!IS_ERR(bo)) xe_bo_unlock_vm_held(bo); @@ -1565,6 +1570,17 @@ struct xe_bo *xe_bo_create_pin_map_at(struct xe_device *xe, struct xe_tile *tile struct xe_vm *vm, size_t size, u64 offset, enum ttm_bo_type type, u32 flags) +{ + return xe_bo_create_pin_map_at_aligned(xe, tile, vm, size, offset, + type, flags, 0); +} + +struct xe_bo *xe_bo_create_pin_map_at_aligned(struct xe_device *xe, + struct xe_tile *tile, + struct xe_vm *vm, + size_t size, u64 offset, + enum ttm_bo_type type, u32 flags, + u64 alignment) { struct xe_bo *bo; int err; @@ -1576,7 +1592,8 @@ struct xe_bo *xe_bo_create_pin_map_at(struct xe_device *xe, struct xe_tile *tile flags |= XE_BO_FLAG_GGTT; bo = xe_bo_create_locked_range(xe, tile, vm, size, start, end, type, - flags | XE_BO_FLAG_NEEDS_CPU_ACCESS); + flags | XE_BO_FLAG_NEEDS_CPU_ACCESS, + alignment); if (IS_ERR(bo)) return bo; diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h index d22269a230aa1..704f5068d0d0a 100644 --- a/drivers/gpu/drm/xe/xe_bo.h +++ b/drivers/gpu/drm/xe/xe_bo.h @@ -77,7 +77,7 @@ struct xe_bo * xe_bo_create_locked_range(struct xe_device *xe, struct xe_tile *tile, struct xe_vm *vm, size_t size, u64 start, u64 end, - enum ttm_bo_type type, u32 flags); + enum ttm_bo_type type, u32 flags, u64 alignment); struct xe_bo *xe_bo_create_locked(struct xe_device *xe, struct xe_tile *tile, struct xe_vm *vm, size_t size, enum ttm_bo_type type, u32 flags); @@ -94,6 +94,12 @@ struct xe_bo *xe_bo_create_pin_map(struct xe_device *xe, struct xe_tile *tile, struct xe_bo *xe_bo_create_pin_map_at(struct xe_device *xe, struct xe_tile *tile, struct xe_vm *vm, size_t size, u64 offset, enum ttm_bo_type type, u32 flags); +struct xe_bo *xe_bo_create_pin_map_at_aligned(struct xe_device *xe, + struct xe_tile *tile, + struct xe_vm *vm, + size_t size, u64 offset, + enum ttm_bo_type type, u32 flags, + u64 alignment); struct xe_bo *xe_bo_create_from_data(struct xe_device *xe, struct xe_tile *tile, const void *data, size_t size, enum ttm_bo_type type, u32 flags); diff --git a/drivers/gpu/drm/xe/xe_bo_types.h b/drivers/gpu/drm/xe/xe_bo_types.h index 2ed558ac2264a..35372c46edfa5 100644 --- a/drivers/gpu/drm/xe/xe_bo_types.h +++ b/drivers/gpu/drm/xe/xe_bo_types.h @@ -76,6 +76,11 @@ struct xe_bo { /** @vram_userfault_link: Link into @mem_access.vram_userfault.list */ struct list_head vram_userfault_link; + + /** @min_align: minimum alignment needed for this BO if different + * from default + */ + u64 min_align; }; #define intel_bo_to_drm_bo(bo) (&(bo)->ttm.base) diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c index e9820126feb96..9cb5760006a1c 100644 --- a/drivers/gpu/drm/xe/xe_ggtt.c +++ b/drivers/gpu/drm/xe/xe_ggtt.c @@ -620,7 +620,7 @@ static int __xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo, u64 start, u64 end) { int err; - u64 alignment = XE_PAGE_SIZE; + u64 alignment = bo->min_align > 0 ? bo->min_align : XE_PAGE_SIZE; if (xe_bo_is_vram(bo) && ggtt->flags & XE_GGTT_FLAGS_64K) alignment = SZ_64K; -- GitLab From 1883a83695fe87d88524eae04cf32f73a471106b Mon Sep 17 00:00:00 2001 From: Niranjana Vishwanathapura Date: Tue, 19 Nov 2024 16:02:21 -0800 Subject: [PATCH 2010/2211] drm/xe: Allow bo mapping on multiple ggtts [ Upstream commit 5a3b0df25d6a78098d548213384665eeead608c9 ] Make bo->ggtt an array to support bo mapping on multiple ggtts. Add XE_BO_FLAG_GGTTx flags to map the bo on ggtt of tile 'x'. Signed-off-by: Niranjana Vishwanathapura Reviewed-by: Matthew Brost Signed-off-by: John Harrison Link: https://patchwork.freedesktop.org/patch/msgid/20241120000222.204095-2-John.C.Harrison@Intel.com Stable-dep-of: f16873f42a06 ("drm/xe: move DPT l2 flush to a more sensible place") Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/display/xe_fb_pin.c | 12 ++++--- drivers/gpu/drm/xe/xe_bo.c | 49 ++++++++++++++++++-------- drivers/gpu/drm/xe/xe_bo.h | 32 ++++++++++++++--- drivers/gpu/drm/xe/xe_bo_evict.c | 14 +++++--- drivers/gpu/drm/xe/xe_bo_types.h | 5 +-- drivers/gpu/drm/xe/xe_ggtt.c | 35 +++++++++--------- 6 files changed, 101 insertions(+), 46 deletions(-) diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c index b58fc4ba2aacb..972b7db52f785 100644 --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c @@ -153,7 +153,7 @@ static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb, } vma->dpt = dpt; - vma->node = dpt->ggtt_node; + vma->node = dpt->ggtt_node[tile0->id]; return 0; } @@ -203,8 +203,8 @@ static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb, if (xe_bo_is_vram(bo) && ggtt->flags & XE_GGTT_FLAGS_64K) align = max_t(u32, align, SZ_64K); - if (bo->ggtt_node && view->type == I915_GTT_VIEW_NORMAL) { - vma->node = bo->ggtt_node; + if (bo->ggtt_node[ggtt->tile->id] && view->type == I915_GTT_VIEW_NORMAL) { + vma->node = bo->ggtt_node[ggtt->tile->id]; } else if (view->type == I915_GTT_VIEW_NORMAL) { u32 x, size = bo->ttm.base.size; @@ -333,10 +333,12 @@ err: static void __xe_unpin_fb_vma(struct i915_vma *vma) { + u8 tile_id = vma->node->ggtt->tile->id; + if (vma->dpt) xe_bo_unpin_map_no_vm(vma->dpt); - else if (!xe_ggtt_node_allocated(vma->bo->ggtt_node) || - vma->bo->ggtt_node->base.start != vma->node->base.start) + else if (!xe_ggtt_node_allocated(vma->bo->ggtt_node[tile_id]) || + vma->bo->ggtt_node[tile_id]->base.start != vma->node->base.start) xe_ggtt_node_remove(vma->node, false); ttm_bo_reserve(&vma->bo->ttm, false, false, NULL); diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c index c92953c08d682..5f745d9ed6cc2 100644 --- a/drivers/gpu/drm/xe/xe_bo.c +++ b/drivers/gpu/drm/xe/xe_bo.c @@ -1130,6 +1130,8 @@ static void xe_ttm_bo_destroy(struct ttm_buffer_object *ttm_bo) { struct xe_bo *bo = ttm_to_xe_bo(ttm_bo); struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev); + struct xe_tile *tile; + u8 id; if (bo->ttm.base.import_attach) drm_prime_gem_destroy(&bo->ttm.base, NULL); @@ -1137,8 +1139,9 @@ static void xe_ttm_bo_destroy(struct ttm_buffer_object *ttm_bo) xe_assert(xe, list_empty(&ttm_bo->base.gpuva.list)); - if (bo->ggtt_node && bo->ggtt_node->base.size) - xe_ggtt_remove_bo(bo->tile->mem.ggtt, bo); + for_each_tile(tile, xe, id) + if (bo->ggtt_node[id] && bo->ggtt_node[id]->base.size) + xe_ggtt_remove_bo(tile->mem.ggtt, bo); #ifdef CONFIG_PROC_FS if (bo->client) @@ -1308,6 +1311,10 @@ struct xe_bo *___xe_bo_create_locked(struct xe_device *xe, struct xe_bo *bo, return ERR_PTR(-EINVAL); } + /* XE_BO_FLAG_GGTTx requires XE_BO_FLAG_GGTT also be set */ + if ((flags & XE_BO_FLAG_GGTT_ALL) && !(flags & XE_BO_FLAG_GGTT)) + return ERR_PTR(-EINVAL); + if (flags & (XE_BO_FLAG_VRAM_MASK | XE_BO_FLAG_STOLEN) && !(flags & XE_BO_FLAG_IGNORE_MIN_PAGE_SIZE) && ((xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K) || @@ -1498,19 +1505,29 @@ __xe_bo_create_locked(struct xe_device *xe, bo->vm = vm; if (bo->flags & XE_BO_FLAG_GGTT) { - if (!tile && flags & XE_BO_FLAG_STOLEN) - tile = xe_device_get_root_tile(xe); + struct xe_tile *t; + u8 id; - xe_assert(xe, tile); + if (!(bo->flags & XE_BO_FLAG_GGTT_ALL)) { + if (!tile && flags & XE_BO_FLAG_STOLEN) + tile = xe_device_get_root_tile(xe); - if (flags & XE_BO_FLAG_FIXED_PLACEMENT) { - err = xe_ggtt_insert_bo_at(tile->mem.ggtt, bo, - start + bo->size, U64_MAX); - } else { - err = xe_ggtt_insert_bo(tile->mem.ggtt, bo); + xe_assert(xe, tile); + } + + for_each_tile(t, xe, id) { + if (t != tile && !(bo->flags & XE_BO_FLAG_GGTTx(t))) + continue; + + if (flags & XE_BO_FLAG_FIXED_PLACEMENT) { + err = xe_ggtt_insert_bo_at(t->mem.ggtt, bo, + start + bo->size, U64_MAX); + } else { + err = xe_ggtt_insert_bo(t->mem.ggtt, bo); + } + if (err) + goto err_unlock_put_bo; } - if (err) - goto err_unlock_put_bo; } return bo; @@ -2372,14 +2389,18 @@ void xe_bo_put_commit(struct llist_head *deferred) void xe_bo_put(struct xe_bo *bo) { + struct xe_tile *tile; + u8 id; + might_sleep(); if (bo) { #ifdef CONFIG_PROC_FS if (bo->client) might_lock(&bo->client->bos_lock); #endif - if (bo->ggtt_node && bo->ggtt_node->ggtt) - might_lock(&bo->ggtt_node->ggtt->lock); + for_each_tile(tile, xe_bo_device(bo), id) + if (bo->ggtt_node[id] && bo->ggtt_node[id]->ggtt) + might_lock(&bo->ggtt_node[id]->ggtt->lock); drm_gem_object_put(&bo->ttm.base); } } diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h index 704f5068d0d0a..d04159c598465 100644 --- a/drivers/gpu/drm/xe/xe_bo.h +++ b/drivers/gpu/drm/xe/xe_bo.h @@ -39,10 +39,22 @@ #define XE_BO_FLAG_NEEDS_64K BIT(15) #define XE_BO_FLAG_NEEDS_2M BIT(16) #define XE_BO_FLAG_GGTT_INVALIDATE BIT(17) +#define XE_BO_FLAG_GGTT0 BIT(18) +#define XE_BO_FLAG_GGTT1 BIT(19) +#define XE_BO_FLAG_GGTT2 BIT(20) +#define XE_BO_FLAG_GGTT3 BIT(21) +#define XE_BO_FLAG_GGTT_ALL (XE_BO_FLAG_GGTT0 | \ + XE_BO_FLAG_GGTT1 | \ + XE_BO_FLAG_GGTT2 | \ + XE_BO_FLAG_GGTT3) + /* this one is trigger internally only */ #define XE_BO_FLAG_INTERNAL_TEST BIT(30) #define XE_BO_FLAG_INTERNAL_64K BIT(31) +#define XE_BO_FLAG_GGTTx(tile) \ + (XE_BO_FLAG_GGTT0 << (tile)->id) + #define XE_PTE_SHIFT 12 #define XE_PAGE_SIZE (1 << XE_PTE_SHIFT) #define XE_PTE_MASK (XE_PAGE_SIZE - 1) @@ -194,14 +206,24 @@ xe_bo_main_addr(struct xe_bo *bo, size_t page_size) } static inline u32 -xe_bo_ggtt_addr(struct xe_bo *bo) +__xe_bo_ggtt_addr(struct xe_bo *bo, u8 tile_id) { - if (XE_WARN_ON(!bo->ggtt_node)) + struct xe_ggtt_node *ggtt_node = bo->ggtt_node[tile_id]; + + if (XE_WARN_ON(!ggtt_node)) return 0; - XE_WARN_ON(bo->ggtt_node->base.size > bo->size); - XE_WARN_ON(bo->ggtt_node->base.start + bo->ggtt_node->base.size > (1ull << 32)); - return bo->ggtt_node->base.start; + XE_WARN_ON(ggtt_node->base.size > bo->size); + XE_WARN_ON(ggtt_node->base.start + ggtt_node->base.size > (1ull << 32)); + return ggtt_node->base.start; +} + +static inline u32 +xe_bo_ggtt_addr(struct xe_bo *bo) +{ + xe_assert(xe_bo_device(bo), bo->tile); + + return __xe_bo_ggtt_addr(bo, bo->tile->id); } int xe_bo_vmap(struct xe_bo *bo); diff --git a/drivers/gpu/drm/xe/xe_bo_evict.c b/drivers/gpu/drm/xe/xe_bo_evict.c index 8fb2be0610035..6a40eedd9db10 100644 --- a/drivers/gpu/drm/xe/xe_bo_evict.c +++ b/drivers/gpu/drm/xe/xe_bo_evict.c @@ -152,11 +152,17 @@ int xe_bo_restore_kernel(struct xe_device *xe) } if (bo->flags & XE_BO_FLAG_GGTT) { - struct xe_tile *tile = bo->tile; + struct xe_tile *tile; + u8 id; - mutex_lock(&tile->mem.ggtt->lock); - xe_ggtt_map_bo(tile->mem.ggtt, bo); - mutex_unlock(&tile->mem.ggtt->lock); + for_each_tile(tile, xe, id) { + if (tile != bo->tile && !(bo->flags & XE_BO_FLAG_GGTTx(tile))) + continue; + + mutex_lock(&tile->mem.ggtt->lock); + xe_ggtt_map_bo(tile->mem.ggtt, bo); + mutex_unlock(&tile->mem.ggtt->lock); + } } /* diff --git a/drivers/gpu/drm/xe/xe_bo_types.h b/drivers/gpu/drm/xe/xe_bo_types.h index 35372c46edfa5..aa298d33c2508 100644 --- a/drivers/gpu/drm/xe/xe_bo_types.h +++ b/drivers/gpu/drm/xe/xe_bo_types.h @@ -13,6 +13,7 @@ #include #include +#include "xe_device_types.h" #include "xe_ggtt_types.h" struct xe_device; @@ -39,8 +40,8 @@ struct xe_bo { struct ttm_place placements[XE_BO_MAX_PLACEMENTS]; /** @placement: current placement for this BO */ struct ttm_placement placement; - /** @ggtt_node: GGTT node if this BO is mapped in the GGTT */ - struct xe_ggtt_node *ggtt_node; + /** @ggtt_node: Array of GGTT nodes if this BO is mapped in the GGTTs */ + struct xe_ggtt_node *ggtt_node[XE_MAX_TILES_PER_DEVICE]; /** @vmap: iosys map of this buffer */ struct iosys_map vmap; /** @ttm_kmap: TTM bo kmap object for internal use only. Keep off. */ diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c index 9cb5760006a1c..76e1092f51d92 100644 --- a/drivers/gpu/drm/xe/xe_ggtt.c +++ b/drivers/gpu/drm/xe/xe_ggtt.c @@ -605,10 +605,10 @@ void xe_ggtt_map_bo(struct xe_ggtt *ggtt, struct xe_bo *bo) u64 start; u64 offset, pte; - if (XE_WARN_ON(!bo->ggtt_node)) + if (XE_WARN_ON(!bo->ggtt_node[ggtt->tile->id])) return; - start = bo->ggtt_node->base.start; + start = bo->ggtt_node[ggtt->tile->id]->base.start; for (offset = 0; offset < bo->size; offset += XE_PAGE_SIZE) { pte = ggtt->pt_ops->pte_encode_bo(bo, offset, pat_index); @@ -619,15 +619,16 @@ void xe_ggtt_map_bo(struct xe_ggtt *ggtt, struct xe_bo *bo) static int __xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo, u64 start, u64 end) { - int err; u64 alignment = bo->min_align > 0 ? bo->min_align : XE_PAGE_SIZE; + u8 tile_id = ggtt->tile->id; + int err; if (xe_bo_is_vram(bo) && ggtt->flags & XE_GGTT_FLAGS_64K) alignment = SZ_64K; - if (XE_WARN_ON(bo->ggtt_node)) { + if (XE_WARN_ON(bo->ggtt_node[tile_id])) { /* Someone's already inserted this BO in the GGTT */ - xe_tile_assert(ggtt->tile, bo->ggtt_node->base.size == bo->size); + xe_tile_assert(ggtt->tile, bo->ggtt_node[tile_id]->base.size == bo->size); return 0; } @@ -637,19 +638,19 @@ static int __xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo, xe_pm_runtime_get_noresume(tile_to_xe(ggtt->tile)); - bo->ggtt_node = xe_ggtt_node_init(ggtt); - if (IS_ERR(bo->ggtt_node)) { - err = PTR_ERR(bo->ggtt_node); - bo->ggtt_node = NULL; + bo->ggtt_node[tile_id] = xe_ggtt_node_init(ggtt); + if (IS_ERR(bo->ggtt_node[tile_id])) { + err = PTR_ERR(bo->ggtt_node[tile_id]); + bo->ggtt_node[tile_id] = NULL; goto out; } mutex_lock(&ggtt->lock); - err = drm_mm_insert_node_in_range(&ggtt->mm, &bo->ggtt_node->base, bo->size, - alignment, 0, start, end, 0); + err = drm_mm_insert_node_in_range(&ggtt->mm, &bo->ggtt_node[tile_id]->base, + bo->size, alignment, 0, start, end, 0); if (err) { - xe_ggtt_node_fini(bo->ggtt_node); - bo->ggtt_node = NULL; + xe_ggtt_node_fini(bo->ggtt_node[tile_id]); + bo->ggtt_node[tile_id] = NULL; } else { xe_ggtt_map_bo(ggtt, bo); } @@ -698,13 +699,15 @@ int xe_ggtt_insert_bo(struct xe_ggtt *ggtt, struct xe_bo *bo) */ void xe_ggtt_remove_bo(struct xe_ggtt *ggtt, struct xe_bo *bo) { - if (XE_WARN_ON(!bo->ggtt_node)) + u8 tile_id = ggtt->tile->id; + + if (XE_WARN_ON(!bo->ggtt_node[tile_id])) return; /* This BO is not currently in the GGTT */ - xe_tile_assert(ggtt->tile, bo->ggtt_node->base.size == bo->size); + xe_tile_assert(ggtt->tile, bo->ggtt_node[tile_id]->base.size == bo->size); - xe_ggtt_node_remove(bo->ggtt_node, + xe_ggtt_node_remove(bo->ggtt_node[tile_id], bo->flags & XE_BO_FLAG_GGTT_INVALIDATE); } -- GitLab From 0dadcd17e2121791a79f2be7d6bdd173af4d4a8c Mon Sep 17 00:00:00 2001 From: Matthew Auld Date: Fri, 6 Jun 2025 11:45:48 +0100 Subject: [PATCH 2011/2211] drm/xe: move DPT l2 flush to a more sensible place MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit f16873f42a06b620669d48a4b5c3f888cb3653a1 ] Only need the flush for DPT host updates here. Normal GGTT updates don't need special flush. Fixes: 01570b446939 ("drm/xe/bmg: implement Wa_16023588340") Signed-off-by: Matthew Auld Cc: Maarten Lankhorst Cc: stable@vger.kernel.org # v6.12+ Reviewed-by: Ville Syrjälä Reviewed-by: Lucas De Marchi Link: https://lore.kernel.org/r/20250606104546.1996818-4-matthew.auld@intel.com Signed-off-by: Lucas De Marchi (cherry picked from commit 35db1da40c8cfd7511dc42f342a133601eb45449) Signed-off-by: Thomas Hellström Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/display/xe_fb_pin.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c index 972b7db52f785..0558b106f8b60 100644 --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c @@ -154,6 +154,9 @@ static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb, vma->dpt = dpt; vma->node = dpt->ggtt_node[tile0->id]; + + /* Ensure DPT writes are flushed */ + xe_device_l2_flush(xe); return 0; } @@ -318,8 +321,6 @@ static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb, if (ret) goto err_unpin; - /* Ensure DPT writes are flushed */ - xe_device_l2_flush(xe); return vma; err_unpin: -- GitLab From e595433c63995cb91cb715596eb4110de45432eb Mon Sep 17 00:00:00 2001 From: Nitin Gote Date: Fri, 23 Aug 2024 13:36:43 +0530 Subject: [PATCH 2012/2211] drm/xe: Replace double space with single space after comma [ Upstream commit cd89de14bbacce1fc060fdfab75bacf95b1c5d40 ] Avoid using double space, ", " in function or macro parameters where it's not required by any alignment purpose. Replace it with a single space, ", ". Signed-off-by: Nitin Gote Reviewed-by: Andi Shyti Link: https://patchwork.freedesktop.org/patch/msgid/20240823080643.2461992-1-nitin.r.gote@intel.com Signed-off-by: Nirmoy Das Stable-dep-of: ad40098da5c3 ("drm/xe/guc: Explicitly exit CT safe mode on unwind") Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/regs/xe_reg_defs.h | 2 +- drivers/gpu/drm/xe/xe_guc.c | 2 +- drivers/gpu/drm/xe/xe_guc_ct.c | 4 ++-- drivers/gpu/drm/xe/xe_irq.c | 4 ++-- drivers/gpu/drm/xe/xe_trace_bo.h | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/xe/regs/xe_reg_defs.h b/drivers/gpu/drm/xe/regs/xe_reg_defs.h index 23f7dc5bbe995..51fd40ffafcb9 100644 --- a/drivers/gpu/drm/xe/regs/xe_reg_defs.h +++ b/drivers/gpu/drm/xe/regs/xe_reg_defs.h @@ -128,7 +128,7 @@ struct xe_reg_mcr { * options. */ #define XE_REG_MCR(r_, ...) ((const struct xe_reg_mcr){ \ - .__reg = XE_REG_INITIALIZER(r_, ##__VA_ARGS__, .mcr = 1) \ + .__reg = XE_REG_INITIALIZER(r_, ##__VA_ARGS__, .mcr = 1) \ }) static inline bool xe_reg_is_valid(struct xe_reg r) diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c index 52df28032a6ff..c67d4807f37df 100644 --- a/drivers/gpu/drm/xe/xe_guc.c +++ b/drivers/gpu/drm/xe/xe_guc.c @@ -985,7 +985,7 @@ timeout: BUILD_BUG_ON(FIELD_MAX(GUC_HXG_MSG_0_TYPE) != GUC_HXG_TYPE_RESPONSE_SUCCESS); BUILD_BUG_ON((GUC_HXG_TYPE_RESPONSE_SUCCESS ^ GUC_HXG_TYPE_RESPONSE_FAILURE) != 1); - ret = xe_mmio_wait32(gt, reply_reg, resp_mask, resp_mask, + ret = xe_mmio_wait32(gt, reply_reg, resp_mask, resp_mask, 1000000, &header, false); if (unlikely(FIELD_GET(GUC_HXG_MSG_0_ORIGIN, header) != diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c index 1f74f6bd50f31..483c2b521a2d1 100644 --- a/drivers/gpu/drm/xe/xe_guc_ct.c +++ b/drivers/gpu/drm/xe/xe_guc_ct.c @@ -182,7 +182,7 @@ int xe_guc_ct_init(struct xe_guc_ct *ct) spin_lock_init(&ct->fast_lock); xa_init(&ct->fence_lookup); INIT_WORK(&ct->g2h_worker, g2h_worker_func); - INIT_DELAYED_WORK(&ct->safe_mode_worker, safe_mode_worker_func); + INIT_DELAYED_WORK(&ct->safe_mode_worker, safe_mode_worker_func); init_waitqueue_head(&ct->wq); init_waitqueue_head(&ct->g2h_fence_wq); @@ -851,7 +851,7 @@ static bool retry_failure(struct xe_guc_ct *ct, int ret) #define ct_alive(ct) \ (xe_guc_ct_enabled(ct) && !ct->ctbs.h2g.info.broken && \ !ct->ctbs.g2h.info.broken) - if (!wait_event_interruptible_timeout(ct->wq, ct_alive(ct), HZ * 5)) + if (!wait_event_interruptible_timeout(ct->wq, ct_alive(ct), HZ * 5)) return false; #undef ct_alive diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c index 5f2c368c35adb..14c3a476597a7 100644 --- a/drivers/gpu/drm/xe/xe_irq.c +++ b/drivers/gpu/drm/xe/xe_irq.c @@ -173,7 +173,7 @@ void xe_irq_enable_hwe(struct xe_gt *gt) if (ccs_mask & (BIT(0)|BIT(1))) xe_mmio_write32(gt, CCS0_CCS1_INTR_MASK, ~dmask); if (ccs_mask & (BIT(2)|BIT(3))) - xe_mmio_write32(gt, CCS2_CCS3_INTR_MASK, ~dmask); + xe_mmio_write32(gt, CCS2_CCS3_INTR_MASK, ~dmask); } if (xe_gt_is_media_type(gt) || MEDIA_VER(xe) < 13) { @@ -504,7 +504,7 @@ static void gt_irq_reset(struct xe_tile *tile) if (ccs_mask & (BIT(0)|BIT(1))) xe_mmio_write32(mmio, CCS0_CCS1_INTR_MASK, ~0); if (ccs_mask & (BIT(2)|BIT(3))) - xe_mmio_write32(mmio, CCS2_CCS3_INTR_MASK, ~0); + xe_mmio_write32(mmio, CCS2_CCS3_INTR_MASK, ~0); if ((tile->media_gt && xe_hw_engine_mask_per_class(tile->media_gt, XE_ENGINE_CLASS_OTHER)) || diff --git a/drivers/gpu/drm/xe/xe_trace_bo.h b/drivers/gpu/drm/xe/xe_trace_bo.h index ba0f61e7d2d6b..4ff023b5d040d 100644 --- a/drivers/gpu/drm/xe/xe_trace_bo.h +++ b/drivers/gpu/drm/xe/xe_trace_bo.h @@ -189,7 +189,7 @@ DECLARE_EVENT_CLASS(xe_vm, ), TP_printk("dev=%s, vm=%p, asid=0x%05x", __get_str(dev), - __entry->vm, __entry->asid) + __entry->vm, __entry->asid) ); DEFINE_EVENT(xe_vm, xe_vm_kill, -- GitLab From ff6482fb458953e111a82b7c537363d9aacf04bf Mon Sep 17 00:00:00 2001 From: John Harrison Date: Wed, 2 Oct 2024 17:46:08 -0700 Subject: [PATCH 2013/2211] drm/xe/guc: Dead CT helper [ Upstream commit d2c5a5a926f43b2e42c5c955f917bad8ad6dd68c ] Add a worker function helper for asynchronously dumping state when an internal/fatal error is detected in CT processing. Being asynchronous is required to avoid deadlocks and scheduling-while-atomic or process-stalled-for-too-long issues. Also check for a bunch more error conditions and improve the handling of some existing checks. v2: Use compile time CONFIG check for new (but not directly CT_DEAD related) checks and use unsigned int for a bitmask, rename CT_DEAD_RESET to CT_DEAD_REARM and add some explaining comments, rename 'hxg' macro parameter to 'ctb' - review feedback from Michal W. Drop CT_DEAD_ALIVE as no need for a bitfield define to just set the entire mask to zero. v3: Fix kerneldoc v4: Nullify some floating pointers after free. v5: Add section headings and device info to make the state dump look more like a devcoredump to allow parsing by the same tools (eventual aim is to just call the devcoredump code itself, but that currently requires an xe_sched_job, which is not available in the CT code). v6: Fix potential for leaking snapshots with concurrent error conditions (review feedback from Julia F). v7: Don't complain about unexpected G2H messages yet because there is a known issue causing them. Fix bit shift bug with v6 change. Add GT id to fake coredump headers and use puts instead of printf. v8: Disable the head mis-match check in g2h_read because it is failing on various discrete platforms due to unknown reasons. Signed-off-by: John Harrison Reviewed-by: Julia Filipchuk Link: https://patchwork.freedesktop.org/patch/msgid/20241003004611.2323493-9-John.C.Harrison@Intel.com Stable-dep-of: ad40098da5c3 ("drm/xe/guc: Explicitly exit CT safe mode on unwind") Signed-off-by: Sasha Levin --- .../drm/xe/abi/guc_communication_ctb_abi.h | 1 + drivers/gpu/drm/xe/xe_guc.c | 2 +- drivers/gpu/drm/xe/xe_guc_ct.c | 336 ++++++++++++++++-- drivers/gpu/drm/xe/xe_guc_ct.h | 2 +- drivers/gpu/drm/xe/xe_guc_ct_types.h | 23 ++ 5 files changed, 335 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/drm/xe/abi/guc_communication_ctb_abi.h b/drivers/gpu/drm/xe/abi/guc_communication_ctb_abi.h index 8f86a16dc5777..f58198cf2cf63 100644 --- a/drivers/gpu/drm/xe/abi/guc_communication_ctb_abi.h +++ b/drivers/gpu/drm/xe/abi/guc_communication_ctb_abi.h @@ -52,6 +52,7 @@ struct guc_ct_buffer_desc { #define GUC_CTB_STATUS_OVERFLOW (1 << 0) #define GUC_CTB_STATUS_UNDERFLOW (1 << 1) #define GUC_CTB_STATUS_MISMATCH (1 << 2) +#define GUC_CTB_STATUS_DISABLED (1 << 3) u32 reserved[13]; } __packed; static_assert(sizeof(struct guc_ct_buffer_desc) == 64); diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c index c67d4807f37df..96373cdb366be 100644 --- a/drivers/gpu/drm/xe/xe_guc.c +++ b/drivers/gpu/drm/xe/xe_guc.c @@ -1175,7 +1175,7 @@ void xe_guc_print_info(struct xe_guc *guc, struct drm_printer *p) xe_force_wake_put(gt_to_fw(gt), XE_FW_GT); - xe_guc_ct_print(&guc->ct, p, false); + xe_guc_ct_print(&guc->ct, p); xe_guc_submit_print(guc, p); } diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c index 483c2b521a2d1..32d55be93ef30 100644 --- a/drivers/gpu/drm/xe/xe_guc_ct.c +++ b/drivers/gpu/drm/xe/xe_guc_ct.c @@ -25,12 +25,48 @@ #include "xe_gt_sriov_pf_monitor.h" #include "xe_gt_tlb_invalidation.h" #include "xe_guc.h" +#include "xe_guc_log.h" #include "xe_guc_relay.h" #include "xe_guc_submit.h" #include "xe_map.h" #include "xe_pm.h" #include "xe_trace_guc.h" +#if IS_ENABLED(CONFIG_DRM_XE_DEBUG) +enum { + /* Internal states, not error conditions */ + CT_DEAD_STATE_REARM, /* 0x0001 */ + CT_DEAD_STATE_CAPTURE, /* 0x0002 */ + + /* Error conditions */ + CT_DEAD_SETUP, /* 0x0004 */ + CT_DEAD_H2G_WRITE, /* 0x0008 */ + CT_DEAD_H2G_HAS_ROOM, /* 0x0010 */ + CT_DEAD_G2H_READ, /* 0x0020 */ + CT_DEAD_G2H_RECV, /* 0x0040 */ + CT_DEAD_G2H_RELEASE, /* 0x0080 */ + CT_DEAD_DEADLOCK, /* 0x0100 */ + CT_DEAD_PROCESS_FAILED, /* 0x0200 */ + CT_DEAD_FAST_G2H, /* 0x0400 */ + CT_DEAD_PARSE_G2H_RESPONSE, /* 0x0800 */ + CT_DEAD_PARSE_G2H_UNKNOWN, /* 0x1000 */ + CT_DEAD_PARSE_G2H_ORIGIN, /* 0x2000 */ + CT_DEAD_PARSE_G2H_TYPE, /* 0x4000 */ +}; + +static void ct_dead_worker_func(struct work_struct *w); +static void ct_dead_capture(struct xe_guc_ct *ct, struct guc_ctb *ctb, u32 reason_code); + +#define CT_DEAD(ct, ctb, reason_code) ct_dead_capture((ct), (ctb), CT_DEAD_##reason_code) +#else +#define CT_DEAD(ct, ctb, reason) \ + do { \ + struct guc_ctb *_ctb = (ctb); \ + if (_ctb) \ + _ctb->info.broken = true; \ + } while (0) +#endif + /* Used when a CT send wants to block and / or receive data */ struct g2h_fence { u32 *response_buffer; @@ -183,6 +219,10 @@ int xe_guc_ct_init(struct xe_guc_ct *ct) xa_init(&ct->fence_lookup); INIT_WORK(&ct->g2h_worker, g2h_worker_func); INIT_DELAYED_WORK(&ct->safe_mode_worker, safe_mode_worker_func); +#if IS_ENABLED(CONFIG_DRM_XE_DEBUG) + spin_lock_init(&ct->dead.lock); + INIT_WORK(&ct->dead.worker, ct_dead_worker_func); +#endif init_waitqueue_head(&ct->wq); init_waitqueue_head(&ct->g2h_fence_wq); @@ -419,10 +459,22 @@ int xe_guc_ct_enable(struct xe_guc_ct *ct) if (ct_needs_safe_mode(ct)) ct_enter_safe_mode(ct); +#if IS_ENABLED(CONFIG_DRM_XE_DEBUG) + /* + * The CT has now been reset so the dumper can be re-armed + * after any existing dead state has been dumped. + */ + spin_lock_irq(&ct->dead.lock); + if (ct->dead.reason) + ct->dead.reason |= (1 << CT_DEAD_STATE_REARM); + spin_unlock_irq(&ct->dead.lock); +#endif + return 0; err_out: xe_gt_err(gt, "Failed to enable GuC CT (%pe)\n", ERR_PTR(err)); + CT_DEAD(ct, NULL, SETUP); return err; } @@ -469,6 +521,19 @@ static bool h2g_has_room(struct xe_guc_ct *ct, u32 cmd_len) if (cmd_len > h2g->info.space) { h2g->info.head = desc_read(ct_to_xe(ct), h2g, head); + + if (h2g->info.head > h2g->info.size) { + struct xe_device *xe = ct_to_xe(ct); + u32 desc_status = desc_read(xe, h2g, status); + + desc_write(xe, h2g, status, desc_status | GUC_CTB_STATUS_OVERFLOW); + + xe_gt_err(ct_to_gt(ct), "CT: invalid head offset %u >= %u)\n", + h2g->info.head, h2g->info.size); + CT_DEAD(ct, h2g, H2G_HAS_ROOM); + return false; + } + h2g->info.space = CIRC_SPACE(h2g->info.tail, h2g->info.head, h2g->info.size) - h2g->info.resv_space; @@ -524,10 +589,24 @@ static void __g2h_reserve_space(struct xe_guc_ct *ct, u32 g2h_len, u32 num_g2h) static void __g2h_release_space(struct xe_guc_ct *ct, u32 g2h_len) { + bool bad = false; + lockdep_assert_held(&ct->fast_lock); - xe_gt_assert(ct_to_gt(ct), ct->ctbs.g2h.info.space + g2h_len <= - ct->ctbs.g2h.info.size - ct->ctbs.g2h.info.resv_space); - xe_gt_assert(ct_to_gt(ct), ct->g2h_outstanding); + + bad = ct->ctbs.g2h.info.space + g2h_len > + ct->ctbs.g2h.info.size - ct->ctbs.g2h.info.resv_space; + bad |= !ct->g2h_outstanding; + + if (bad) { + xe_gt_err(ct_to_gt(ct), "Invalid G2H release: %d + %d vs %d - %d -> %d vs %d, outstanding = %d!\n", + ct->ctbs.g2h.info.space, g2h_len, + ct->ctbs.g2h.info.size, ct->ctbs.g2h.info.resv_space, + ct->ctbs.g2h.info.space + g2h_len, + ct->ctbs.g2h.info.size - ct->ctbs.g2h.info.resv_space, + ct->g2h_outstanding); + CT_DEAD(ct, &ct->ctbs.g2h, G2H_RELEASE); + return; + } ct->ctbs.g2h.info.space += g2h_len; if (!--ct->g2h_outstanding) @@ -554,12 +633,43 @@ static int h2g_write(struct xe_guc_ct *ct, const u32 *action, u32 len, u32 full_len; struct iosys_map map = IOSYS_MAP_INIT_OFFSET(&h2g->cmds, tail * sizeof(u32)); + u32 desc_status; full_len = len + GUC_CTB_HDR_LEN; lockdep_assert_held(&ct->lock); xe_gt_assert(gt, full_len <= GUC_CTB_MSG_MAX_LEN); - xe_gt_assert(gt, tail <= h2g->info.size); + + desc_status = desc_read(xe, h2g, status); + if (desc_status) { + xe_gt_err(gt, "CT write: non-zero status: %u\n", desc_status); + goto corrupted; + } + + if (IS_ENABLED(CONFIG_DRM_XE_DEBUG)) { + u32 desc_tail = desc_read(xe, h2g, tail); + u32 desc_head = desc_read(xe, h2g, head); + + if (tail != desc_tail) { + desc_write(xe, h2g, status, desc_status | GUC_CTB_STATUS_MISMATCH); + xe_gt_err(gt, "CT write: tail was modified %u != %u\n", desc_tail, tail); + goto corrupted; + } + + if (tail > h2g->info.size) { + desc_write(xe, h2g, status, desc_status | GUC_CTB_STATUS_OVERFLOW); + xe_gt_err(gt, "CT write: tail out of range: %u vs %u\n", + tail, h2g->info.size); + goto corrupted; + } + + if (desc_head >= h2g->info.size) { + desc_write(xe, h2g, status, desc_status | GUC_CTB_STATUS_OVERFLOW); + xe_gt_err(gt, "CT write: invalid head offset %u >= %u)\n", + desc_head, h2g->info.size); + goto corrupted; + } + } /* Command will wrap, zero fill (NOPs), return and check credits again */ if (tail + full_len > h2g->info.size) { @@ -612,6 +722,10 @@ static int h2g_write(struct xe_guc_ct *ct, const u32 *action, u32 len, desc_read(xe, h2g, head), h2g->info.tail); return 0; + +corrupted: + CT_DEAD(ct, &ct->ctbs.h2g, H2G_WRITE); + return -EPIPE; } /* @@ -719,7 +833,6 @@ static int guc_ct_send_locked(struct xe_guc_ct *ct, const u32 *action, u32 len, { struct xe_device *xe = ct_to_xe(ct); struct xe_gt *gt = ct_to_gt(ct); - struct drm_printer p = xe_gt_info_printer(gt); unsigned int sleep_period_ms = 1; int ret; @@ -772,8 +885,13 @@ try_again: goto broken; #undef g2h_avail - if (dequeue_one_g2h(ct) < 0) + ret = dequeue_one_g2h(ct); + if (ret < 0) { + if (ret != -ECANCELED) + xe_gt_err(ct_to_gt(ct), "CTB receive failed (%pe)", + ERR_PTR(ret)); goto broken; + } goto try_again; } @@ -782,8 +900,7 @@ try_again: broken: xe_gt_err(gt, "No forward process on H2G, reset required\n"); - xe_guc_ct_print(ct, &p, true); - ct->ctbs.h2g.info.broken = true; + CT_DEAD(ct, &ct->ctbs.h2g, DEADLOCK); return -EDEADLK; } @@ -1049,6 +1166,7 @@ static int parse_g2h_response(struct xe_guc_ct *ct, u32 *msg, u32 len) else xe_gt_err(gt, "unexpected response %u for FAST_REQ H2G fence 0x%x!\n", type, fence); + CT_DEAD(ct, NULL, PARSE_G2H_RESPONSE); return -EPROTO; } @@ -1056,6 +1174,7 @@ static int parse_g2h_response(struct xe_guc_ct *ct, u32 *msg, u32 len) g2h_fence = xa_erase(&ct->fence_lookup, fence); if (unlikely(!g2h_fence)) { /* Don't tear down channel, as send could've timed out */ + /* CT_DEAD(ct, NULL, PARSE_G2H_UNKNOWN); */ xe_gt_warn(gt, "G2H fence (%u) not found!\n", fence); g2h_release_space(ct, GUC_CTB_HXG_MSG_MAX_LEN); return 0; @@ -1100,7 +1219,7 @@ static int parse_g2h_msg(struct xe_guc_ct *ct, u32 *msg, u32 len) if (unlikely(origin != GUC_HXG_ORIGIN_GUC)) { xe_gt_err(gt, "G2H channel broken on read, origin=%u, reset required\n", origin); - ct->ctbs.g2h.info.broken = true; + CT_DEAD(ct, &ct->ctbs.g2h, PARSE_G2H_ORIGIN); return -EPROTO; } @@ -1118,7 +1237,7 @@ static int parse_g2h_msg(struct xe_guc_ct *ct, u32 *msg, u32 len) default: xe_gt_err(gt, "G2H channel broken on read, type=%u, reset required\n", type); - ct->ctbs.g2h.info.broken = true; + CT_DEAD(ct, &ct->ctbs.g2h, PARSE_G2H_TYPE); ret = -EOPNOTSUPP; } @@ -1195,9 +1314,11 @@ static int process_g2h_msg(struct xe_guc_ct *ct, u32 *msg, u32 len) xe_gt_err(gt, "unexpected G2H action 0x%04x\n", action); } - if (ret) + if (ret) { xe_gt_err(gt, "G2H action 0x%04x failed (%pe)\n", action, ERR_PTR(ret)); + CT_DEAD(ct, NULL, PROCESS_FAILED); + } return 0; } @@ -1207,7 +1328,7 @@ static int g2h_read(struct xe_guc_ct *ct, u32 *msg, bool fast_path) struct xe_device *xe = ct_to_xe(ct); struct xe_gt *gt = ct_to_gt(ct); struct guc_ctb *g2h = &ct->ctbs.g2h; - u32 tail, head, len; + u32 tail, head, len, desc_status; s32 avail; u32 action; u32 *hxg; @@ -1226,6 +1347,63 @@ static int g2h_read(struct xe_guc_ct *ct, u32 *msg, bool fast_path) xe_gt_assert(gt, xe_guc_ct_enabled(ct)); + desc_status = desc_read(xe, g2h, status); + if (desc_status) { + if (desc_status & GUC_CTB_STATUS_DISABLED) { + /* + * Potentially valid if a CLIENT_RESET request resulted in + * contexts/engines being reset. But should never happen as + * no contexts should be active when CLIENT_RESET is sent. + */ + xe_gt_err(gt, "CT read: unexpected G2H after GuC has stopped!\n"); + desc_status &= ~GUC_CTB_STATUS_DISABLED; + } + + if (desc_status) { + xe_gt_err(gt, "CT read: non-zero status: %u\n", desc_status); + goto corrupted; + } + } + + if (IS_ENABLED(CONFIG_DRM_XE_DEBUG)) { + u32 desc_tail = desc_read(xe, g2h, tail); + /* + u32 desc_head = desc_read(xe, g2h, head); + + * info.head and desc_head are updated back-to-back at the end of + * this function and nowhere else. Hence, they cannot be different + * unless two g2h_read calls are running concurrently. Which is not + * possible because it is guarded by ct->fast_lock. And yet, some + * discrete platforms are reguarly hitting this error :(. + * + * desc_head rolling backwards shouldn't cause any noticeable + * problems - just a delay in GuC being allowed to proceed past that + * point in the queue. So for now, just disable the error until it + * can be root caused. + * + if (g2h->info.head != desc_head) { + desc_write(xe, g2h, status, desc_status | GUC_CTB_STATUS_MISMATCH); + xe_gt_err(gt, "CT read: head was modified %u != %u\n", + desc_head, g2h->info.head); + goto corrupted; + } + */ + + if (g2h->info.head > g2h->info.size) { + desc_write(xe, g2h, status, desc_status | GUC_CTB_STATUS_OVERFLOW); + xe_gt_err(gt, "CT read: head out of range: %u vs %u\n", + g2h->info.head, g2h->info.size); + goto corrupted; + } + + if (desc_tail >= g2h->info.size) { + desc_write(xe, g2h, status, desc_status | GUC_CTB_STATUS_OVERFLOW); + xe_gt_err(gt, "CT read: invalid tail offset %u >= %u)\n", + desc_tail, g2h->info.size); + goto corrupted; + } + } + /* Calculate DW available to read */ tail = desc_read(xe, g2h, tail); avail = tail - g2h->info.head; @@ -1242,9 +1420,7 @@ static int g2h_read(struct xe_guc_ct *ct, u32 *msg, bool fast_path) if (len > avail) { xe_gt_err(gt, "G2H channel broken on read, avail=%d, len=%d, reset required\n", avail, len); - g2h->info.broken = true; - - return -EPROTO; + goto corrupted; } head = (g2h->info.head + 1) % g2h->info.size; @@ -1290,6 +1466,10 @@ static int g2h_read(struct xe_guc_ct *ct, u32 *msg, bool fast_path) action, len, g2h->info.head, tail); return len; + +corrupted: + CT_DEAD(ct, &ct->ctbs.g2h, G2H_READ); + return -EPROTO; } static void g2h_fast_path(struct xe_guc_ct *ct, u32 *msg, u32 len) @@ -1316,9 +1496,11 @@ static void g2h_fast_path(struct xe_guc_ct *ct, u32 *msg, u32 len) xe_gt_warn(gt, "NOT_POSSIBLE"); } - if (ret) + if (ret) { xe_gt_err(gt, "G2H action 0x%04x failed (%pe)\n", action, ERR_PTR(ret)); + CT_DEAD(ct, NULL, FAST_G2H); + } } /** @@ -1378,7 +1560,6 @@ static int dequeue_one_g2h(struct xe_guc_ct *ct) static void receive_g2h(struct xe_guc_ct *ct) { - struct xe_gt *gt = ct_to_gt(ct); bool ongoing; int ret; @@ -1415,9 +1596,8 @@ static void receive_g2h(struct xe_guc_ct *ct) mutex_unlock(&ct->lock); if (unlikely(ret == -EPROTO || ret == -EOPNOTSUPP)) { - struct drm_printer p = xe_gt_info_printer(gt); - - xe_guc_ct_print(ct, &p, false); + xe_gt_err(ct_to_gt(ct), "CT dequeue failed: %d", ret); + CT_DEAD(ct, NULL, G2H_RECV); kick_reset(ct); } } while (ret == 1); @@ -1445,9 +1625,8 @@ static void guc_ctb_snapshot_capture(struct xe_device *xe, struct guc_ctb *ctb, snapshot->cmds = kmalloc_array(ctb->info.size, sizeof(u32), atomic ? GFP_ATOMIC : GFP_KERNEL); - if (!snapshot->cmds) { - drm_err(&xe->drm, "Skipping CTB commands snapshot. Only CTB info will be available.\n"); + drm_err(&xe->drm, "Skipping CTB commands snapshot. Only CT info will be available.\n"); return; } @@ -1528,7 +1707,7 @@ struct xe_guc_ct_snapshot *xe_guc_ct_snapshot_capture(struct xe_guc_ct *ct, atomic ? GFP_ATOMIC : GFP_KERNEL); if (!snapshot) { - drm_err(&xe->drm, "Skipping CTB snapshot entirely.\n"); + xe_gt_err(ct_to_gt(ct), "Skipping CTB snapshot entirely.\n"); return NULL; } @@ -1592,16 +1771,119 @@ void xe_guc_ct_snapshot_free(struct xe_guc_ct_snapshot *snapshot) * xe_guc_ct_print - GuC CT Print. * @ct: GuC CT. * @p: drm_printer where it will be printed out. - * @atomic: Boolean to indicate if this is called from atomic context like - * reset or CTB handler or from some regular path like debugfs. * * This function quickly capture a snapshot and immediately print it out. */ -void xe_guc_ct_print(struct xe_guc_ct *ct, struct drm_printer *p, bool atomic) +void xe_guc_ct_print(struct xe_guc_ct *ct, struct drm_printer *p) { struct xe_guc_ct_snapshot *snapshot; - snapshot = xe_guc_ct_snapshot_capture(ct, atomic); + snapshot = xe_guc_ct_snapshot_capture(ct, false); xe_guc_ct_snapshot_print(snapshot, p); xe_guc_ct_snapshot_free(snapshot); } + +#if IS_ENABLED(CONFIG_DRM_XE_DEBUG) +static void ct_dead_capture(struct xe_guc_ct *ct, struct guc_ctb *ctb, u32 reason_code) +{ + struct xe_guc_log_snapshot *snapshot_log; + struct xe_guc_ct_snapshot *snapshot_ct; + struct xe_guc *guc = ct_to_guc(ct); + unsigned long flags; + bool have_capture; + + if (ctb) + ctb->info.broken = true; + + /* Ignore further errors after the first dump until a reset */ + if (ct->dead.reported) + return; + + spin_lock_irqsave(&ct->dead.lock, flags); + + /* And only capture one dump at a time */ + have_capture = ct->dead.reason & (1 << CT_DEAD_STATE_CAPTURE); + ct->dead.reason |= (1 << reason_code) | + (1 << CT_DEAD_STATE_CAPTURE); + + spin_unlock_irqrestore(&ct->dead.lock, flags); + + if (have_capture) + return; + + snapshot_log = xe_guc_log_snapshot_capture(&guc->log, true); + snapshot_ct = xe_guc_ct_snapshot_capture((ct), true); + + spin_lock_irqsave(&ct->dead.lock, flags); + + if (ct->dead.snapshot_log || ct->dead.snapshot_ct) { + xe_gt_err(ct_to_gt(ct), "Got unexpected dead CT capture!\n"); + xe_guc_log_snapshot_free(snapshot_log); + xe_guc_ct_snapshot_free(snapshot_ct); + } else { + ct->dead.snapshot_log = snapshot_log; + ct->dead.snapshot_ct = snapshot_ct; + } + + spin_unlock_irqrestore(&ct->dead.lock, flags); + + queue_work(system_unbound_wq, &(ct)->dead.worker); +} + +static void ct_dead_print(struct xe_dead_ct *dead) +{ + struct xe_guc_ct *ct = container_of(dead, struct xe_guc_ct, dead); + struct xe_device *xe = ct_to_xe(ct); + struct xe_gt *gt = ct_to_gt(ct); + static int g_count; + struct drm_printer ip = xe_gt_info_printer(gt); + struct drm_printer lp = drm_line_printer(&ip, "Capture", ++g_count); + + if (!dead->reason) { + xe_gt_err(gt, "CTB is dead for no reason!?\n"); + return; + } + + drm_printf(&lp, "CTB is dead - reason=0x%X\n", dead->reason); + + /* Can't generate a genuine core dump at this point, so just do the good bits */ + drm_puts(&lp, "**** Xe Device Coredump ****\n"); + xe_device_snapshot_print(xe, &lp); + + drm_printf(&lp, "**** GT #%d ****\n", gt->info.id); + drm_printf(&lp, "\tTile: %d\n", gt->tile->id); + + drm_puts(&lp, "**** GuC Log ****\n"); + xe_guc_log_snapshot_print(dead->snapshot_log, &lp); + + drm_puts(&lp, "**** GuC CT ****\n"); + xe_guc_ct_snapshot_print(dead->snapshot_ct, &lp); + + drm_puts(&lp, "Done.\n"); +} + +static void ct_dead_worker_func(struct work_struct *w) +{ + struct xe_guc_ct *ct = container_of(w, struct xe_guc_ct, dead.worker); + + if (!ct->dead.reported) { + ct->dead.reported = true; + ct_dead_print(&ct->dead); + } + + spin_lock_irq(&ct->dead.lock); + + xe_guc_log_snapshot_free(ct->dead.snapshot_log); + ct->dead.snapshot_log = NULL; + xe_guc_ct_snapshot_free(ct->dead.snapshot_ct); + ct->dead.snapshot_ct = NULL; + + if (ct->dead.reason & (1 << CT_DEAD_STATE_REARM)) { + /* A reset has occurred so re-arm the error reporting */ + ct->dead.reason = 0; + ct->dead.reported = false; + } + + spin_unlock_irq(&ct->dead.lock); +} +#endif diff --git a/drivers/gpu/drm/xe/xe_guc_ct.h b/drivers/gpu/drm/xe/xe_guc_ct.h index 13e316668e901..c7ac9407b861e 100644 --- a/drivers/gpu/drm/xe/xe_guc_ct.h +++ b/drivers/gpu/drm/xe/xe_guc_ct.h @@ -21,7 +21,7 @@ xe_guc_ct_snapshot_capture(struct xe_guc_ct *ct, bool atomic); void xe_guc_ct_snapshot_print(struct xe_guc_ct_snapshot *snapshot, struct drm_printer *p); void xe_guc_ct_snapshot_free(struct xe_guc_ct_snapshot *snapshot); -void xe_guc_ct_print(struct xe_guc_ct *ct, struct drm_printer *p, bool atomic); +void xe_guc_ct_print(struct xe_guc_ct *ct, struct drm_printer *p); static inline bool xe_guc_ct_initialized(struct xe_guc_ct *ct) { diff --git a/drivers/gpu/drm/xe/xe_guc_ct_types.h b/drivers/gpu/drm/xe/xe_guc_ct_types.h index 761cb90312984..85e127ec91d7a 100644 --- a/drivers/gpu/drm/xe/xe_guc_ct_types.h +++ b/drivers/gpu/drm/xe/xe_guc_ct_types.h @@ -86,6 +86,24 @@ enum xe_guc_ct_state { XE_GUC_CT_STATE_ENABLED, }; +#if IS_ENABLED(CONFIG_DRM_XE_DEBUG) +/** struct xe_dead_ct - Information for debugging a dead CT */ +struct xe_dead_ct { + /** @lock: protects memory allocation/free operations, and @reason updates */ + spinlock_t lock; + /** @reason: bit mask of CT_DEAD_* reason codes */ + unsigned int reason; + /** @reported: for preventing multiple dumps per error sequence */ + bool reported; + /** @worker: worker thread to get out of interrupt context before dumping */ + struct work_struct worker; + /** snapshot_ct: copy of CT state and CTB content at point of error */ + struct xe_guc_ct_snapshot *snapshot_ct; + /** snapshot_log: copy of GuC log at point of error */ + struct xe_guc_log_snapshot *snapshot_log; +}; +#endif + /** * struct xe_guc_ct - GuC command transport (CT) layer * @@ -128,6 +146,11 @@ struct xe_guc_ct { u32 msg[GUC_CTB_MSG_MAX_LEN]; /** @fast_msg: Message buffer */ u32 fast_msg[GUC_CTB_MSG_MAX_LEN]; + +#if IS_ENABLED(CONFIG_DRM_XE_DEBUG) + /** @dead: information for debugging dead CTs */ + struct xe_dead_ct dead; +#endif }; #endif -- GitLab From 6d0b588614c43d6334b2d7a70a99f31f7b14ecc0 Mon Sep 17 00:00:00 2001 From: Michal Wajdeczko Date: Fri, 13 Jun 2025 00:09:37 +0200 Subject: [PATCH 2014/2211] drm/xe/guc: Explicitly exit CT safe mode on unwind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit ad40098da5c3b43114d860a5b5740e7204158534 ] During driver probe we might be briefly using CT safe mode, which is based on a delayed work, but usually we are able to stop this once we have IRQ fully operational. However, if we abort the probe quite early then during unwind we might try to destroy the workqueue while there is still a pending delayed work that attempts to restart itself which triggers a WARN. This was recently observed during unsuccessful VF initialization: [ ] xe 0000:00:02.1: probe with driver xe failed with error -62 [ ] ------------[ cut here ]------------ [ ] workqueue: cannot queue safe_mode_worker_func [xe] on wq xe-g2h-wq [ ] WARNING: CPU: 9 PID: 0 at kernel/workqueue.c:2257 __queue_work+0x287/0x710 [ ] RIP: 0010:__queue_work+0x287/0x710 [ ] Call Trace: [ ] delayed_work_timer_fn+0x19/0x30 [ ] call_timer_fn+0xa1/0x2a0 Exit the CT safe mode on unwind to avoid that warning. Fixes: 09b286950f29 ("drm/xe/guc: Allow CTB G2H processing without G2H IRQ") Signed-off-by: Michal Wajdeczko Cc: Matthew Brost Reviewed-by: Matthew Brost Link: https://lore.kernel.org/r/20250612220937.857-3-michal.wajdeczko@intel.com (cherry picked from commit 2ddbb73ec20b98e70a5200cb85deade22ccea2ec) Signed-off-by: Thomas Hellström Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_guc_ct.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c index 32d55be93ef30..f1ce4e14dcb5f 100644 --- a/drivers/gpu/drm/xe/xe_guc_ct.c +++ b/drivers/gpu/drm/xe/xe_guc_ct.c @@ -32,6 +32,11 @@ #include "xe_pm.h" #include "xe_trace_guc.h" +static void receive_g2h(struct xe_guc_ct *ct); +static void g2h_worker_func(struct work_struct *w); +static void safe_mode_worker_func(struct work_struct *w); +static void ct_exit_safe_mode(struct xe_guc_ct *ct); + #if IS_ENABLED(CONFIG_DRM_XE_DEBUG) enum { /* Internal states, not error conditions */ @@ -183,14 +188,11 @@ static void guc_ct_fini(struct drm_device *drm, void *arg) { struct xe_guc_ct *ct = arg; + ct_exit_safe_mode(ct); destroy_workqueue(ct->g2h_wq); xa_destroy(&ct->fence_lookup); } -static void receive_g2h(struct xe_guc_ct *ct); -static void g2h_worker_func(struct work_struct *w); -static void safe_mode_worker_func(struct work_struct *w); - static void primelockdep(struct xe_guc_ct *ct) { if (!IS_ENABLED(CONFIG_LOCKDEP)) -- GitLab From acf9ab15ec978188b8ebc1f14b0c281d11d52ed9 Mon Sep 17 00:00:00 2001 From: Stephen Smalley Date: Tue, 10 Jun 2025 15:48:27 -0400 Subject: [PATCH 2015/2211] selinux: change security_compute_sid to return the ssid or tsid on match [ Upstream commit fde46f60f6c5138ee422087addbc5bf5b4968bf1 ] If the end result of a security_compute_sid() computation matches the ssid or tsid, return that SID rather than looking it up again. This avoids the problem of multiple initial SIDs that map to the same context. Cc: stable@vger.kernel.org Reported-by: Guido Trentalancia Fixes: ae254858ce07 ("selinux: introduce an initial SID for early boot processes") Signed-off-by: Stephen Smalley Tested-by: Guido Trentalancia Signed-off-by: Paul Moore Signed-off-by: Sasha Levin --- security/selinux/ss/services.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index 88850405ded92..f36332e64c4d1 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c @@ -1884,11 +1884,17 @@ retry: goto out_unlock; } /* Obtain the sid for the context. */ - rc = sidtab_context_to_sid(sidtab, &newcontext, out_sid); - if (rc == -ESTALE) { - rcu_read_unlock(); - context_destroy(&newcontext); - goto retry; + if (context_cmp(scontext, &newcontext)) + *out_sid = ssid; + else if (context_cmp(tcontext, &newcontext)) + *out_sid = tsid; + else { + rc = sidtab_context_to_sid(sidtab, &newcontext, out_sid); + if (rc == -ESTALE) { + rcu_read_unlock(); + context_destroy(&newcontext); + goto retry; + } } out_unlock: rcu_read_unlock(); -- GitLab From 4f77d8f8a93e1b173ce8e78988740661c394b91f Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Mon, 7 Apr 2025 15:47:24 +0200 Subject: [PATCH 2016/2211] drm/simpledrm: Do not upcast in release helpers [ Upstream commit d231cde7c84359fb18fb268cf6cff03b5bce48ff ] The res pointer passed to simpledrm_device_release_clocks() and simpledrm_device_release_regulators() points to an instance of struct simpledrm_device. No need to upcast from struct drm_device. The upcast is harmless, as DRM device is the first field in struct simpledrm_device. Signed-off-by: Thomas Zimmermann Fixes: 11e8f5fd223b ("drm: Add simpledrm driver") Cc: # v5.14+ Reviewed-by: Javier Martinez Canillas Reviewed-by: Jocelyn Falempe Link: https://lore.kernel.org/r/20250407134753.985925-2-tzimmermann@suse.de Signed-off-by: Sasha Levin --- drivers/gpu/drm/tiny/simpledrm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c index d19e102894282..07abaf27315f7 100644 --- a/drivers/gpu/drm/tiny/simpledrm.c +++ b/drivers/gpu/drm/tiny/simpledrm.c @@ -284,7 +284,7 @@ static struct simpledrm_device *simpledrm_device_of_dev(struct drm_device *dev) static void simpledrm_device_release_clocks(void *res) { - struct simpledrm_device *sdev = simpledrm_device_of_dev(res); + struct simpledrm_device *sdev = res; unsigned int i; for (i = 0; i < sdev->clk_count; ++i) { @@ -382,7 +382,7 @@ static int simpledrm_device_init_clocks(struct simpledrm_device *sdev) static void simpledrm_device_release_regulators(void *res) { - struct simpledrm_device *sdev = simpledrm_device_of_dev(res); + struct simpledrm_device *sdev = res; unsigned int i; for (i = 0; i < sdev->regulator_count; ++i) { -- GitLab From b47a1f9323c2085940599fb292902f27cf2247a1 Mon Sep 17 00:00:00 2001 From: Sonny Jiang Date: Thu, 12 Jun 2025 11:01:08 -0400 Subject: [PATCH 2017/2211] drm/amdgpu: VCN v5_0_1 to prevent FW checking RB during DPG pause [ Upstream commit 46e15197b513e60786a44107759d6ca293d6288c ] Add a protection to ensure programming are all complete prior VCPU starting. This is a WA for an unintended VCPU running. Signed-off-by: Sonny Jiang Acked-by: Leo Liu Reviewed-by: Ruijing Dong Signed-off-by: Alex Deucher (cherry picked from commit c29521b529fa5e225feaf709d863a636ca0cbbfa) Cc: stable@vger.kernel.org Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c | 1624 +++++++++++++++++++++++ 1 file changed, 1624 insertions(+) create mode 100644 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c new file mode 100644 index 0000000000000..cdefd7fcb0da6 --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c @@ -0,0 +1,1624 @@ +/* + * Copyright 2024 Advanced Micro Devices, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include +#include "amdgpu.h" +#include "amdgpu_vcn.h" +#include "amdgpu_pm.h" +#include "soc15.h" +#include "soc15d.h" +#include "soc15_hw_ip.h" +#include "vcn_v2_0.h" +#include "vcn_v4_0_3.h" +#include "mmsch_v5_0.h" + +#include "vcn/vcn_5_0_0_offset.h" +#include "vcn/vcn_5_0_0_sh_mask.h" +#include "ivsrcid/vcn/irqsrcs_vcn_5_0.h" +#include "vcn_v5_0_0.h" +#include "vcn_v5_0_1.h" + +#include + +static int vcn_v5_0_1_start_sriov(struct amdgpu_device *adev); +static void vcn_v5_0_1_set_unified_ring_funcs(struct amdgpu_device *adev); +static void vcn_v5_0_1_set_irq_funcs(struct amdgpu_device *adev); +static int vcn_v5_0_1_set_pg_state(struct amdgpu_vcn_inst *vinst, + enum amd_powergating_state state); +static void vcn_v5_0_1_unified_ring_set_wptr(struct amdgpu_ring *ring); +static void vcn_v5_0_1_set_ras_funcs(struct amdgpu_device *adev); +/** + * vcn_v5_0_1_early_init - set function pointers and load microcode + * + * @ip_block: Pointer to the amdgpu_ip_block for this hw instance. + * + * Set ring and irq function pointers + * Load microcode from filesystem + */ +static int vcn_v5_0_1_early_init(struct amdgpu_ip_block *ip_block) +{ + struct amdgpu_device *adev = ip_block->adev; + int i, r; + + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) + /* re-use enc ring as unified ring */ + adev->vcn.inst[i].num_enc_rings = 1; + + vcn_v5_0_1_set_unified_ring_funcs(adev); + vcn_v5_0_1_set_irq_funcs(adev); + vcn_v5_0_1_set_ras_funcs(adev); + + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { + adev->vcn.inst[i].set_pg_state = vcn_v5_0_1_set_pg_state; + + r = amdgpu_vcn_early_init(adev, i); + if (r) + return r; + } + + return 0; +} + +static void vcn_v5_0_1_fw_shared_init(struct amdgpu_device *adev, int inst_idx) +{ + struct amdgpu_vcn5_fw_shared *fw_shared; + + fw_shared = adev->vcn.inst[inst_idx].fw_shared.cpu_addr; + + if (fw_shared->sq.is_enabled) + return; + fw_shared->present_flag_0 = + cpu_to_le32(AMDGPU_FW_SHARED_FLAG_0_UNIFIED_QUEUE); + fw_shared->sq.is_enabled = 1; + + if (amdgpu_vcnfw_log) + amdgpu_vcn_fwlog_init(&adev->vcn.inst[inst_idx]); +} + +/** + * vcn_v5_0_1_sw_init - sw init for VCN block + * + * @ip_block: Pointer to the amdgpu_ip_block for this hw instance. + * + * Load firmware and sw initialization + */ +static int vcn_v5_0_1_sw_init(struct amdgpu_ip_block *ip_block) +{ + struct amdgpu_device *adev = ip_block->adev; + struct amdgpu_ring *ring; + int i, r, vcn_inst; + + /* VCN UNIFIED TRAP */ + r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, + VCN_5_0__SRCID__UVD_ENC_GENERAL_PURPOSE, &adev->vcn.inst->irq); + if (r) + return r; + + /* VCN POISON TRAP */ + r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, + VCN_5_0__SRCID_UVD_POISON, &adev->vcn.inst->ras_poison_irq); + + for (i = 0; i < adev->vcn.num_vcn_inst; i++) { + vcn_inst = GET_INST(VCN, i); + + r = amdgpu_vcn_sw_init(adev, i); + if (r) + return r; + + amdgpu_vcn_setup_ucode(adev, i); + + r = amdgpu_vcn_resume(adev, i); + if (r) + return r; + + ring = &adev->vcn.inst[i].ring_enc[0]; + ring->use_doorbell = true; + if (!amdgpu_sriov_vf(adev)) + ring->doorbell_index = + (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + + 11 * vcn_inst; + else + ring->doorbell_index = + (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + + 32 * vcn_inst; + + ring->vm_hub = AMDGPU_MMHUB0(adev->vcn.inst[i].aid_id); + sprintf(ring->name, "vcn_unified_%d", adev->vcn.inst[i].aid_id); + + r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[i].irq, 0, + AMDGPU_RING_PRIO_DEFAULT, &adev->vcn.inst[i].sched_score); + if (r) + return r; + + vcn_v5_0_1_fw_shared_init(adev, i); + } + + /* TODO: Add queue reset mask when FW fully supports it */ + adev->vcn.supported_reset = + amdgpu_get_soft_full_reset_mask(&adev->vcn.inst[0].ring_enc[0]); + + if (amdgpu_sriov_vf(adev)) { + r = amdgpu_virt_alloc_mm_table(adev); + if (r) + return r; + } + + vcn_v5_0_0_alloc_ip_dump(adev); + + return amdgpu_vcn_sysfs_reset_mask_init(adev); +} + +/** + * vcn_v5_0_1_sw_fini - sw fini for VCN block + * + * @ip_block: Pointer to the amdgpu_ip_block for this hw instance. + * + * VCN suspend and free up sw allocation + */ +static int vcn_v5_0_1_sw_fini(struct amdgpu_ip_block *ip_block) +{ + struct amdgpu_device *adev = ip_block->adev; + int i, r, idx; + + if (drm_dev_enter(adev_to_drm(adev), &idx)) { + for (i = 0; i < adev->vcn.num_vcn_inst; i++) { + volatile struct amdgpu_vcn5_fw_shared *fw_shared; + + fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr; + fw_shared->present_flag_0 = 0; + fw_shared->sq.is_enabled = 0; + } + + drm_dev_exit(idx); + } + + if (amdgpu_sriov_vf(adev)) + amdgpu_virt_free_mm_table(adev); + + for (i = 0; i < adev->vcn.num_vcn_inst; i++) { + r = amdgpu_vcn_suspend(adev, i); + if (r) + return r; + } + + for (i = 0; i < adev->vcn.num_vcn_inst; i++) { + r = amdgpu_vcn_sw_fini(adev, i); + if (r) + return r; + } + + amdgpu_vcn_sysfs_reset_mask_fini(adev); + + kfree(adev->vcn.ip_dump); + + return 0; +} + +/** + * vcn_v5_0_1_hw_init - start and test VCN block + * + * @ip_block: Pointer to the amdgpu_ip_block for this hw instance. + * + * Initialize the hardware, boot up the VCPU and do some testing + */ +static int vcn_v5_0_1_hw_init(struct amdgpu_ip_block *ip_block) +{ + struct amdgpu_device *adev = ip_block->adev; + struct amdgpu_ring *ring; + int i, r, vcn_inst; + + if (amdgpu_sriov_vf(adev)) { + r = vcn_v5_0_1_start_sriov(adev); + if (r) + return r; + + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { + ring = &adev->vcn.inst[i].ring_enc[0]; + ring->wptr = 0; + ring->wptr_old = 0; + vcn_v5_0_1_unified_ring_set_wptr(ring); + ring->sched.ready = true; + } + } else { + if (RREG32_SOC15(VCN, GET_INST(VCN, 0), regVCN_RRMT_CNTL) & 0x100) + adev->vcn.caps |= AMDGPU_VCN_CAPS(RRMT_ENABLED); + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { + vcn_inst = GET_INST(VCN, i); + ring = &adev->vcn.inst[i].ring_enc[0]; + + if (ring->use_doorbell) + adev->nbio.funcs->vcn_doorbell_range(adev, ring->use_doorbell, + ((adev->doorbell_index.vcn.vcn_ring0_1 << 1) + + 11 * vcn_inst), + adev->vcn.inst[i].aid_id); + + /* Re-init fw_shared, if required */ + vcn_v5_0_1_fw_shared_init(adev, i); + + r = amdgpu_ring_test_helper(ring); + if (r) + return r; + } + } + + return 0; +} + +/** + * vcn_v5_0_1_hw_fini - stop the hardware block + * + * @ip_block: Pointer to the amdgpu_ip_block for this hw instance. + * + * Stop the VCN block, mark ring as not ready any more + */ +static int vcn_v5_0_1_hw_fini(struct amdgpu_ip_block *ip_block) +{ + struct amdgpu_device *adev = ip_block->adev; + int i; + + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { + struct amdgpu_vcn_inst *vinst = &adev->vcn.inst[i]; + + cancel_delayed_work_sync(&adev->vcn.inst[i].idle_work); + if (vinst->cur_state != AMD_PG_STATE_GATE) + vinst->set_pg_state(vinst, AMD_PG_STATE_GATE); + } + + if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__VCN)) + amdgpu_irq_put(adev, &adev->vcn.inst->ras_poison_irq, 0); + + return 0; +} + +/** + * vcn_v5_0_1_suspend - suspend VCN block + * + * @ip_block: Pointer to the amdgpu_ip_block for this hw instance. + * + * HW fini and suspend VCN block + */ +static int vcn_v5_0_1_suspend(struct amdgpu_ip_block *ip_block) +{ + struct amdgpu_device *adev = ip_block->adev; + int r, i; + + r = vcn_v5_0_1_hw_fini(ip_block); + if (r) + return r; + + for (i = 0; i < adev->vcn.num_vcn_inst; i++) { + r = amdgpu_vcn_suspend(ip_block->adev, i); + if (r) + return r; + } + + return r; +} + +/** + * vcn_v5_0_1_resume - resume VCN block + * + * @ip_block: Pointer to the amdgpu_ip_block for this hw instance. + * + * Resume firmware and hw init VCN block + */ +static int vcn_v5_0_1_resume(struct amdgpu_ip_block *ip_block) +{ + struct amdgpu_device *adev = ip_block->adev; + int r, i; + + for (i = 0; i < adev->vcn.num_vcn_inst; i++) { + struct amdgpu_vcn_inst *vinst = &adev->vcn.inst[i]; + + if (amdgpu_in_reset(adev)) + vinst->cur_state = AMD_PG_STATE_GATE; + + r = amdgpu_vcn_resume(ip_block->adev, i); + if (r) + return r; + } + + r = vcn_v5_0_1_hw_init(ip_block); + + return r; +} + +/** + * vcn_v5_0_1_mc_resume - memory controller programming + * + * @vinst: VCN instance + * + * Let the VCN memory controller know it's offsets + */ +static void vcn_v5_0_1_mc_resume(struct amdgpu_vcn_inst *vinst) +{ + struct amdgpu_device *adev = vinst->adev; + int inst = vinst->inst; + uint32_t offset, size, vcn_inst; + const struct common_firmware_header *hdr; + + hdr = (const struct common_firmware_header *)adev->vcn.inst[inst].fw->data; + size = AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8); + + vcn_inst = GET_INST(VCN, inst); + /* cache window 0: fw */ + if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { + WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, + (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + inst].tmr_mc_addr_lo)); + WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, + (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + inst].tmr_mc_addr_hi)); + WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_OFFSET0, 0); + offset = 0; + } else { + WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, + lower_32_bits(adev->vcn.inst[inst].gpu_addr)); + WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, + upper_32_bits(adev->vcn.inst[inst].gpu_addr)); + offset = size; + WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_OFFSET0, + AMDGPU_UVD_FIRMWARE_OFFSET >> 3); + } + WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_SIZE0, size); + + /* cache window 1: stack */ + WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW, + lower_32_bits(adev->vcn.inst[inst].gpu_addr + offset)); + WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH, + upper_32_bits(adev->vcn.inst[inst].gpu_addr + offset)); + WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_OFFSET1, 0); + WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_STACK_SIZE); + + /* cache window 2: context */ + WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW, + lower_32_bits(adev->vcn.inst[inst].gpu_addr + offset + AMDGPU_VCN_STACK_SIZE)); + WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH, + upper_32_bits(adev->vcn.inst[inst].gpu_addr + offset + AMDGPU_VCN_STACK_SIZE)); + WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_OFFSET2, 0); + WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE); + + /* non-cache window */ + WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_NC0_64BIT_BAR_LOW, + lower_32_bits(adev->vcn.inst[inst].fw_shared.gpu_addr)); + WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH, + upper_32_bits(adev->vcn.inst[inst].fw_shared.gpu_addr)); + WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_NONCACHE_OFFSET0, 0); + WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_NONCACHE_SIZE0, + AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_vcn5_fw_shared))); +} + +/** + * vcn_v5_0_1_mc_resume_dpg_mode - memory controller programming for dpg mode + * + * @vinst: VCN instance + * @indirect: indirectly write sram + * + * Let the VCN memory controller know it's offsets with dpg mode + */ +static void vcn_v5_0_1_mc_resume_dpg_mode(struct amdgpu_vcn_inst *vinst, + bool indirect) +{ + struct amdgpu_device *adev = vinst->adev; + int inst_idx = vinst->inst; + uint32_t offset, size; + const struct common_firmware_header *hdr; + + hdr = (const struct common_firmware_header *)adev->vcn.inst[inst_idx].fw->data; + size = AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8); + + /* cache window 0: fw */ + if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { + if (!indirect) { + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), + (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + + inst_idx].tmr_mc_addr_lo), 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), + (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + + inst_idx].tmr_mc_addr_hi), 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_CACHE_OFFSET0), 0, 0, indirect); + } else { + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), 0, 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), 0, 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_CACHE_OFFSET0), 0, 0, indirect); + } + offset = 0; + } else { + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), + lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr), 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), + upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr), 0, indirect); + offset = size; + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_CACHE_OFFSET0), + AMDGPU_UVD_FIRMWARE_OFFSET >> 3, 0, indirect); + } + + if (!indirect) + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_CACHE_SIZE0), size, 0, indirect); + else + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_CACHE_SIZE0), 0, 0, indirect); + + /* cache window 1: stack */ + if (!indirect) { + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW), + lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset), 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH), + upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset), 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect); + } else { + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW), 0, 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH), 0, 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect); + } + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_CACHE_SIZE1), AMDGPU_VCN_STACK_SIZE, 0, indirect); + + /* cache window 2: context */ + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW), + lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset + + AMDGPU_VCN_STACK_SIZE), 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH), + upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset + + AMDGPU_VCN_STACK_SIZE), 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_CACHE_OFFSET2), 0, 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_CACHE_SIZE2), AMDGPU_VCN_CONTEXT_SIZE, 0, indirect); + + /* non-cache window */ + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_NC0_64BIT_BAR_LOW), + lower_32_bits(adev->vcn.inst[inst_idx].fw_shared.gpu_addr), 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH), + upper_32_bits(adev->vcn.inst[inst_idx].fw_shared.gpu_addr), 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_NONCACHE_OFFSET0), 0, 0, indirect); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_NONCACHE_SIZE0), + AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_vcn5_fw_shared)), 0, indirect); + + /* VCN global tiling registers */ + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_GFX10_ADDR_CONFIG), adev->gfx.config.gb_addr_config, 0, indirect); +} + +/** + * vcn_v5_0_1_disable_clock_gating - disable VCN clock gating + * + * @vinst: VCN instance + * + * Disable clock gating for VCN block + */ +static void vcn_v5_0_1_disable_clock_gating(struct amdgpu_vcn_inst *vinst) +{ +} + +/** + * vcn_v5_0_1_enable_clock_gating - enable VCN clock gating + * + * @vinst: VCN instance + * + * Enable clock gating for VCN block + */ +static void vcn_v5_0_1_enable_clock_gating(struct amdgpu_vcn_inst *vinst) +{ +} + +/** + * vcn_v5_0_1_pause_dpg_mode - VCN pause with dpg mode + * + * @vinst: VCN instance + * @new_state: pause state + * + * Pause dpg mode for VCN block + */ +static int vcn_v5_0_1_pause_dpg_mode(struct amdgpu_vcn_inst *vinst, + struct dpg_pause_state *new_state) +{ + struct amdgpu_device *adev = vinst->adev; + uint32_t reg_data = 0; + int vcn_inst; + + vcn_inst = GET_INST(VCN, vinst->inst); + + /* pause/unpause if state is changed */ + if (vinst->pause_state.fw_based != new_state->fw_based) { + DRM_DEV_DEBUG(adev->dev, "dpg pause state changed %d -> %d %s\n", + vinst->pause_state.fw_based, new_state->fw_based, + new_state->fw_based ? "VCN_DPG_STATE__PAUSE" : "VCN_DPG_STATE__UNPAUSE"); + reg_data = RREG32_SOC15(VCN, vcn_inst, regUVD_DPG_PAUSE) & + (~UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK); + + if (new_state->fw_based == VCN_DPG_STATE__PAUSE) { + /* pause DPG */ + reg_data |= UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK; + WREG32_SOC15(VCN, vcn_inst, regUVD_DPG_PAUSE, reg_data); + + /* wait for ACK */ + SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_DPG_PAUSE, + UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK, + UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK); + } else { + /* unpause DPG, no need to wait */ + reg_data &= ~UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK; + WREG32_SOC15(VCN, vcn_inst, regUVD_DPG_PAUSE, reg_data); + } + vinst->pause_state.fw_based = new_state->fw_based; + } + + return 0; +} + + +/** + * vcn_v5_0_1_start_dpg_mode - VCN start with dpg mode + * + * @vinst: VCN instance + * @indirect: indirectly write sram + * + * Start VCN block with dpg mode + */ +static int vcn_v5_0_1_start_dpg_mode(struct amdgpu_vcn_inst *vinst, + bool indirect) +{ + struct amdgpu_device *adev = vinst->adev; + int inst_idx = vinst->inst; + volatile struct amdgpu_vcn5_fw_shared *fw_shared = + adev->vcn.inst[inst_idx].fw_shared.cpu_addr; + struct amdgpu_ring *ring; + struct dpg_pause_state state = {.fw_based = VCN_DPG_STATE__PAUSE}; + int vcn_inst; + uint32_t tmp; + + vcn_inst = GET_INST(VCN, inst_idx); + + /* disable register anti-hang mechanism */ + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_POWER_STATUS), 1, + ~UVD_POWER_STATUS__UVD_POWER_STATUS_MASK); + + /* enable dynamic power gating mode */ + tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_POWER_STATUS); + tmp |= UVD_POWER_STATUS__UVD_PG_MODE_MASK; + WREG32_SOC15(VCN, vcn_inst, regUVD_POWER_STATUS, tmp); + + if (indirect) { + adev->vcn.inst[inst_idx].dpg_sram_curr_addr = + (uint32_t *)adev->vcn.inst[inst_idx].dpg_sram_cpu_addr; + /* Use dummy register 0xDEADBEEF passing AID selection to PSP FW */ + WREG32_SOC24_DPG_MODE(inst_idx, 0xDEADBEEF, + adev->vcn.inst[inst_idx].aid_id, 0, true); + } + + /* enable VCPU clock */ + tmp = (0xFF << UVD_VCPU_CNTL__PRB_TIMEOUT_VAL__SHIFT); + tmp |= UVD_VCPU_CNTL__CLK_EN_MASK | UVD_VCPU_CNTL__BLK_RST_MASK; + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_CNTL), tmp, 0, indirect); + + /* disable master interrupt */ + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_MASTINT_EN), 0, 0, indirect); + + /* setup regUVD_LMI_CTRL */ + tmp = (UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | + UVD_LMI_CTRL__REQ_MODE_MASK | + UVD_LMI_CTRL__CRC_RESET_MASK | + UVD_LMI_CTRL__MASK_MC_URGENT_MASK | + UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK | + UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK | + (8 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) | + 0x00100000L); + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_CTRL), tmp, 0, indirect); + + vcn_v5_0_1_mc_resume_dpg_mode(vinst, indirect); + + tmp = (0xFF << UVD_VCPU_CNTL__PRB_TIMEOUT_VAL__SHIFT); + tmp |= UVD_VCPU_CNTL__CLK_EN_MASK; + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_VCPU_CNTL), tmp, 0, indirect); + + /* enable LMI MC and UMC channels */ + tmp = 0x1f << UVD_LMI_CTRL2__RE_OFLD_MIF_WR_REQ_NUM__SHIFT; + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_LMI_CTRL2), tmp, 0, indirect); + + /* enable master interrupt */ + WREG32_SOC24_DPG_MODE(inst_idx, SOC24_DPG_MODE_OFFSET( + VCN, 0, regUVD_MASTINT_EN), + UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect); + + if (indirect) + amdgpu_vcn_psp_update_sram(adev, inst_idx, AMDGPU_UCODE_ID_VCN0_RAM); + + /* resetting ring, fw should not check RB ring */ + fw_shared->sq.queue_mode |= FW_QUEUE_RING_RESET; + + /* Pause dpg */ + vcn_v5_0_1_pause_dpg_mode(vinst, &state); + + ring = &adev->vcn.inst[inst_idx].ring_enc[0]; + + WREG32_SOC15(VCN, vcn_inst, regUVD_RB_BASE_LO, lower_32_bits(ring->gpu_addr)); + WREG32_SOC15(VCN, vcn_inst, regUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr)); + WREG32_SOC15(VCN, vcn_inst, regUVD_RB_SIZE, ring->ring_size / sizeof(uint32_t)); + + tmp = RREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE); + tmp &= ~(VCN_RB_ENABLE__RB1_EN_MASK); + WREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE, tmp); + + WREG32_SOC15(VCN, vcn_inst, regUVD_RB_RPTR, 0); + WREG32_SOC15(VCN, vcn_inst, regUVD_RB_WPTR, 0); + + tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_RB_RPTR); + WREG32_SOC15(VCN, vcn_inst, regUVD_RB_WPTR, tmp); + ring->wptr = RREG32_SOC15(VCN, vcn_inst, regUVD_RB_WPTR); + + tmp = RREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE); + tmp |= VCN_RB_ENABLE__RB1_EN_MASK; + WREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE, tmp); + /* resetting done, fw can check RB ring */ + fw_shared->sq.queue_mode &= ~(FW_QUEUE_RING_RESET | FW_QUEUE_DPG_HOLD_OFF); + + WREG32_SOC15(VCN, vcn_inst, regVCN_RB1_DB_CTRL, + ring->doorbell_index << VCN_RB1_DB_CTRL__OFFSET__SHIFT | + VCN_RB1_DB_CTRL__EN_MASK); + /* Read DB_CTRL to flush the write DB_CTRL command. */ + RREG32_SOC15(VCN, vcn_inst, regVCN_RB1_DB_CTRL); + + return 0; +} + +static int vcn_v5_0_1_start_sriov(struct amdgpu_device *adev) +{ + int i, vcn_inst; + struct amdgpu_ring *ring_enc; + uint64_t cache_addr; + uint64_t rb_enc_addr; + uint64_t ctx_addr; + uint32_t param, resp, expected; + uint32_t offset, cache_size; + uint32_t tmp, timeout; + + struct amdgpu_mm_table *table = &adev->virt.mm_table; + uint32_t *table_loc; + uint32_t table_size; + uint32_t size, size_dw; + uint32_t init_status; + uint32_t enabled_vcn; + + struct mmsch_v5_0_cmd_direct_write + direct_wt = { {0} }; + struct mmsch_v5_0_cmd_direct_read_modify_write + direct_rd_mod_wt = { {0} }; + struct mmsch_v5_0_cmd_end end = { {0} }; + struct mmsch_v5_0_init_header header; + + volatile struct amdgpu_vcn5_fw_shared *fw_shared; + volatile struct amdgpu_fw_shared_rb_setup *rb_setup; + + direct_wt.cmd_header.command_type = + MMSCH_COMMAND__DIRECT_REG_WRITE; + direct_rd_mod_wt.cmd_header.command_type = + MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE; + end.cmd_header.command_type = MMSCH_COMMAND__END; + + for (i = 0; i < adev->vcn.num_vcn_inst; i++) { + vcn_inst = GET_INST(VCN, i); + + vcn_v5_0_1_fw_shared_init(adev, vcn_inst); + + memset(&header, 0, sizeof(struct mmsch_v5_0_init_header)); + header.version = MMSCH_VERSION; + header.total_size = sizeof(struct mmsch_v5_0_init_header) >> 2; + + table_loc = (uint32_t *)table->cpu_addr; + table_loc += header.total_size; + + table_size = 0; + + MMSCH_V5_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCN, 0, regUVD_STATUS), + ~UVD_STATUS__UVD_BUSY, UVD_STATUS__UVD_BUSY); + + cache_size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.inst[i].fw->size + 4); + + if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), + adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + i].tmr_mc_addr_lo); + + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), + adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + i].tmr_mc_addr_hi); + + offset = 0; + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_VCPU_CACHE_OFFSET0), 0); + } else { + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), + lower_32_bits(adev->vcn.inst[i].gpu_addr)); + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), + upper_32_bits(adev->vcn.inst[i].gpu_addr)); + offset = cache_size; + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_VCPU_CACHE_OFFSET0), + AMDGPU_UVD_FIRMWARE_OFFSET >> 3); + } + + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_VCPU_CACHE_SIZE0), + cache_size); + + cache_addr = adev->vcn.inst[vcn_inst].gpu_addr + offset; + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW), lower_32_bits(cache_addr)); + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH), upper_32_bits(cache_addr)); + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_VCPU_CACHE_OFFSET1), 0); + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_VCPU_CACHE_SIZE1), AMDGPU_VCN_STACK_SIZE); + + cache_addr = adev->vcn.inst[vcn_inst].gpu_addr + offset + + AMDGPU_VCN_STACK_SIZE; + + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW), lower_32_bits(cache_addr)); + + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH), upper_32_bits(cache_addr)); + + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_VCPU_CACHE_OFFSET2), 0); + + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_VCPU_CACHE_SIZE2), AMDGPU_VCN_CONTEXT_SIZE); + + fw_shared = adev->vcn.inst[vcn_inst].fw_shared.cpu_addr; + rb_setup = &fw_shared->rb_setup; + + ring_enc = &adev->vcn.inst[vcn_inst].ring_enc[0]; + ring_enc->wptr = 0; + rb_enc_addr = ring_enc->gpu_addr; + + rb_setup->is_rb_enabled_flags |= RB_ENABLED; + rb_setup->rb_addr_lo = lower_32_bits(rb_enc_addr); + rb_setup->rb_addr_hi = upper_32_bits(rb_enc_addr); + rb_setup->rb_size = ring_enc->ring_size / 4; + fw_shared->present_flag_0 |= cpu_to_le32(AMDGPU_VCN_VF_RB_SETUP_FLAG); + + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_LMI_VCPU_NC0_64BIT_BAR_LOW), + lower_32_bits(adev->vcn.inst[vcn_inst].fw_shared.gpu_addr)); + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH), + upper_32_bits(adev->vcn.inst[vcn_inst].fw_shared.gpu_addr)); + MMSCH_V5_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCN, 0, + regUVD_VCPU_NONCACHE_SIZE0), + AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_vcn4_fw_shared))); + MMSCH_V5_0_INSERT_END(); + + header.vcn0.init_status = 0; + header.vcn0.table_offset = header.total_size; + header.vcn0.table_size = table_size; + header.total_size += table_size; + + /* Send init table to mmsch */ + size = sizeof(struct mmsch_v5_0_init_header); + table_loc = (uint32_t *)table->cpu_addr; + memcpy((void *)table_loc, &header, size); + + ctx_addr = table->gpu_addr; + WREG32_SOC15(VCN, vcn_inst, regMMSCH_VF_CTX_ADDR_LO, lower_32_bits(ctx_addr)); + WREG32_SOC15(VCN, vcn_inst, regMMSCH_VF_CTX_ADDR_HI, upper_32_bits(ctx_addr)); + + tmp = RREG32_SOC15(VCN, vcn_inst, regMMSCH_VF_VMID); + tmp &= ~MMSCH_VF_VMID__VF_CTX_VMID_MASK; + tmp |= (0 << MMSCH_VF_VMID__VF_CTX_VMID__SHIFT); + WREG32_SOC15(VCN, vcn_inst, regMMSCH_VF_VMID, tmp); + + size = header.total_size; + WREG32_SOC15(VCN, vcn_inst, regMMSCH_VF_CTX_SIZE, size); + + WREG32_SOC15(VCN, vcn_inst, regMMSCH_VF_MAILBOX_RESP, 0); + + param = 0x00000001; + WREG32_SOC15(VCN, vcn_inst, regMMSCH_VF_MAILBOX_HOST, param); + tmp = 0; + timeout = 1000; + resp = 0; + expected = MMSCH_VF_MAILBOX_RESP__OK; + while (resp != expected) { + resp = RREG32_SOC15(VCN, vcn_inst, regMMSCH_VF_MAILBOX_RESP); + if (resp != 0) + break; + + udelay(10); + tmp = tmp + 10; + if (tmp >= timeout) { + DRM_ERROR("failed to init MMSCH. TIME-OUT after %d usec"\ + " waiting for regMMSCH_VF_MAILBOX_RESP "\ + "(expected=0x%08x, readback=0x%08x)\n", + tmp, expected, resp); + return -EBUSY; + } + } + + enabled_vcn = amdgpu_vcn_is_disabled_vcn(adev, VCN_DECODE_RING, 0) ? 1 : 0; + init_status = ((struct mmsch_v5_0_init_header *)(table_loc))->vcn0.init_status; + if (resp != expected && resp != MMSCH_VF_MAILBOX_RESP__INCOMPLETE + && init_status != MMSCH_VF_ENGINE_STATUS__PASS) { + DRM_ERROR("MMSCH init status is incorrect! readback=0x%08x, header init "\ + "status for VCN%x: 0x%x\n", resp, enabled_vcn, init_status); + } + } + + return 0; +} + +/** + * vcn_v5_0_1_start - VCN start + * + * @vinst: VCN instance + * + * Start VCN block + */ +static int vcn_v5_0_1_start(struct amdgpu_vcn_inst *vinst) +{ + struct amdgpu_device *adev = vinst->adev; + int i = vinst->inst; + volatile struct amdgpu_vcn5_fw_shared *fw_shared; + struct amdgpu_ring *ring; + uint32_t tmp; + int j, k, r, vcn_inst; + + fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr; + + if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) + return vcn_v5_0_1_start_dpg_mode(vinst, adev->vcn.inst[i].indirect_sram); + + vcn_inst = GET_INST(VCN, i); + + /* set VCN status busy */ + tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_STATUS) | UVD_STATUS__UVD_BUSY; + WREG32_SOC15(VCN, vcn_inst, regUVD_STATUS, tmp); + + /* enable VCPU clock */ + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_VCPU_CNTL), + UVD_VCPU_CNTL__CLK_EN_MASK, ~UVD_VCPU_CNTL__CLK_EN_MASK); + + /* disable master interrupt */ + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_MASTINT_EN), 0, + ~UVD_MASTINT_EN__VCPU_EN_MASK); + + /* enable LMI MC and UMC channels */ + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_LMI_CTRL2), 0, + ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK); + + tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_SOFT_RESET); + tmp &= ~UVD_SOFT_RESET__LMI_SOFT_RESET_MASK; + tmp &= ~UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK; + WREG32_SOC15(VCN, vcn_inst, regUVD_SOFT_RESET, tmp); + + /* setup regUVD_LMI_CTRL */ + tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_LMI_CTRL); + WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_CTRL, tmp | + UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | + UVD_LMI_CTRL__MASK_MC_URGENT_MASK | + UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK | + UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK); + + vcn_v5_0_1_mc_resume(vinst); + + /* VCN global tiling registers */ + WREG32_SOC15(VCN, vcn_inst, regUVD_GFX10_ADDR_CONFIG, + adev->gfx.config.gb_addr_config); + + /* unblock VCPU register access */ + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_RB_ARB_CTRL), 0, + ~UVD_RB_ARB_CTRL__VCPU_DIS_MASK); + + /* release VCPU reset to boot */ + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_VCPU_CNTL), 0, + ~UVD_VCPU_CNTL__BLK_RST_MASK); + + for (j = 0; j < 10; ++j) { + uint32_t status; + + for (k = 0; k < 100; ++k) { + status = RREG32_SOC15(VCN, vcn_inst, regUVD_STATUS); + if (status & 2) + break; + mdelay(100); + if (amdgpu_emu_mode == 1) + msleep(20); + } + + if (amdgpu_emu_mode == 1) { + r = -1; + if (status & 2) { + r = 0; + break; + } + } else { + r = 0; + if (status & 2) + break; + + dev_err(adev->dev, + "VCN[%d] is not responding, trying to reset the VCPU!!!\n", i); + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_VCPU_CNTL), + UVD_VCPU_CNTL__BLK_RST_MASK, + ~UVD_VCPU_CNTL__BLK_RST_MASK); + mdelay(10); + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_VCPU_CNTL), 0, + ~UVD_VCPU_CNTL__BLK_RST_MASK); + + mdelay(10); + r = -1; + } + } + + if (r) { + dev_err(adev->dev, "VCN[%d] is not responding, giving up!!!\n", i); + return r; + } + + /* enable master interrupt */ + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_MASTINT_EN), + UVD_MASTINT_EN__VCPU_EN_MASK, + ~UVD_MASTINT_EN__VCPU_EN_MASK); + + /* clear the busy bit of VCN_STATUS */ + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_STATUS), 0, + ~(2 << UVD_STATUS__VCPU_REPORT__SHIFT)); + + ring = &adev->vcn.inst[i].ring_enc[0]; + + WREG32_SOC15(VCN, vcn_inst, regVCN_RB1_DB_CTRL, + ring->doorbell_index << VCN_RB1_DB_CTRL__OFFSET__SHIFT | + VCN_RB1_DB_CTRL__EN_MASK); + + /* Read DB_CTRL to flush the write DB_CTRL command. */ + RREG32_SOC15(VCN, vcn_inst, regVCN_RB1_DB_CTRL); + + WREG32_SOC15(VCN, vcn_inst, regUVD_RB_BASE_LO, ring->gpu_addr); + WREG32_SOC15(VCN, vcn_inst, regUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr)); + WREG32_SOC15(VCN, vcn_inst, regUVD_RB_SIZE, ring->ring_size / 4); + + tmp = RREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE); + tmp &= ~(VCN_RB_ENABLE__RB1_EN_MASK); + WREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE, tmp); + fw_shared->sq.queue_mode |= FW_QUEUE_RING_RESET; + WREG32_SOC15(VCN, vcn_inst, regUVD_RB_RPTR, 0); + WREG32_SOC15(VCN, vcn_inst, regUVD_RB_WPTR, 0); + + tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_RB_RPTR); + WREG32_SOC15(VCN, vcn_inst, regUVD_RB_WPTR, tmp); + ring->wptr = RREG32_SOC15(VCN, vcn_inst, regUVD_RB_WPTR); + + tmp = RREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE); + tmp |= VCN_RB_ENABLE__RB1_EN_MASK; + WREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE, tmp); + fw_shared->sq.queue_mode &= ~(FW_QUEUE_RING_RESET | FW_QUEUE_DPG_HOLD_OFF); + + /* Keeping one read-back to ensure all register writes are done, + * otherwise it may introduce race conditions. + */ + RREG32_SOC15(VCN, vcn_inst, regUVD_STATUS); + + return 0; +} + +/** + * vcn_v5_0_1_stop_dpg_mode - VCN stop with dpg mode + * + * @vinst: VCN instance + * + * Stop VCN block with dpg mode + */ +static void vcn_v5_0_1_stop_dpg_mode(struct amdgpu_vcn_inst *vinst) +{ + struct amdgpu_device *adev = vinst->adev; + int inst_idx = vinst->inst; + uint32_t tmp; + int vcn_inst; + struct dpg_pause_state state = {.fw_based = VCN_DPG_STATE__UNPAUSE}; + + vcn_inst = GET_INST(VCN, inst_idx); + + /* Unpause dpg */ + vcn_v5_0_1_pause_dpg_mode(vinst, &state); + + /* Wait for power status to be 1 */ + SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_POWER_STATUS, 1, + UVD_POWER_STATUS__UVD_POWER_STATUS_MASK); + + /* wait for read ptr to be equal to write ptr */ + tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_RB_WPTR); + SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_RB_RPTR, tmp, 0xFFFFFFFF); + + /* disable dynamic power gating mode */ + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_POWER_STATUS), 0, + ~UVD_POWER_STATUS__UVD_PG_MODE_MASK); + + /* Keeping one read-back to ensure all register writes are done, + * otherwise it may introduce race conditions. + */ + RREG32_SOC15(VCN, vcn_inst, regUVD_STATUS); +} + +/** + * vcn_v5_0_1_stop - VCN stop + * + * @vinst: VCN instance + * + * Stop VCN block + */ +static int vcn_v5_0_1_stop(struct amdgpu_vcn_inst *vinst) +{ + struct amdgpu_device *adev = vinst->adev; + int i = vinst->inst; + volatile struct amdgpu_vcn5_fw_shared *fw_shared; + uint32_t tmp; + int r = 0, vcn_inst; + + vcn_inst = GET_INST(VCN, i); + + fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr; + fw_shared->sq.queue_mode |= FW_QUEUE_DPG_HOLD_OFF; + + if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) { + vcn_v5_0_1_stop_dpg_mode(vinst); + return 0; + } + + /* wait for vcn idle */ + r = SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_STATUS, UVD_STATUS__IDLE, 0x7); + if (r) + return r; + + tmp = UVD_LMI_STATUS__VCPU_LMI_WRITE_CLEAN_MASK | + UVD_LMI_STATUS__READ_CLEAN_MASK | + UVD_LMI_STATUS__WRITE_CLEAN_MASK | + UVD_LMI_STATUS__WRITE_CLEAN_RAW_MASK; + r = SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_LMI_STATUS, tmp, tmp); + if (r) + return r; + + /* disable LMI UMC channel */ + tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_LMI_CTRL2); + tmp |= UVD_LMI_CTRL2__STALL_ARB_UMC_MASK; + WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_CTRL2, tmp); + tmp = UVD_LMI_STATUS__UMC_READ_CLEAN_RAW_MASK | + UVD_LMI_STATUS__UMC_WRITE_CLEAN_RAW_MASK; + r = SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_LMI_STATUS, tmp, tmp); + if (r) + return r; + + /* block VCPU register access */ + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_RB_ARB_CTRL), + UVD_RB_ARB_CTRL__VCPU_DIS_MASK, + ~UVD_RB_ARB_CTRL__VCPU_DIS_MASK); + + /* reset VCPU */ + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_VCPU_CNTL), + UVD_VCPU_CNTL__BLK_RST_MASK, + ~UVD_VCPU_CNTL__BLK_RST_MASK); + + /* disable VCPU clock */ + WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_VCPU_CNTL), 0, + ~(UVD_VCPU_CNTL__CLK_EN_MASK)); + + /* apply soft reset */ + tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_SOFT_RESET); + tmp |= UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK; + WREG32_SOC15(VCN, vcn_inst, regUVD_SOFT_RESET, tmp); + tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_SOFT_RESET); + tmp |= UVD_SOFT_RESET__LMI_SOFT_RESET_MASK; + WREG32_SOC15(VCN, vcn_inst, regUVD_SOFT_RESET, tmp); + + /* clear status */ + WREG32_SOC15(VCN, vcn_inst, regUVD_STATUS, 0); + + /* Keeping one read-back to ensure all register writes are done, + * otherwise it may introduce race conditions. + */ + RREG32_SOC15(VCN, vcn_inst, regUVD_STATUS); + + return 0; +} + +/** + * vcn_v5_0_1_unified_ring_get_rptr - get unified read pointer + * + * @ring: amdgpu_ring pointer + * + * Returns the current hardware unified read pointer + */ +static uint64_t vcn_v5_0_1_unified_ring_get_rptr(struct amdgpu_ring *ring) +{ + struct amdgpu_device *adev = ring->adev; + + if (ring != &adev->vcn.inst[ring->me].ring_enc[0]) + DRM_ERROR("wrong ring id is identified in %s", __func__); + + return RREG32_SOC15(VCN, GET_INST(VCN, ring->me), regUVD_RB_RPTR); +} + +/** + * vcn_v5_0_1_unified_ring_get_wptr - get unified write pointer + * + * @ring: amdgpu_ring pointer + * + * Returns the current hardware unified write pointer + */ +static uint64_t vcn_v5_0_1_unified_ring_get_wptr(struct amdgpu_ring *ring) +{ + struct amdgpu_device *adev = ring->adev; + + if (ring != &adev->vcn.inst[ring->me].ring_enc[0]) + DRM_ERROR("wrong ring id is identified in %s", __func__); + + if (ring->use_doorbell) + return *ring->wptr_cpu_addr; + else + return RREG32_SOC15(VCN, GET_INST(VCN, ring->me), regUVD_RB_WPTR); +} + +/** + * vcn_v5_0_1_unified_ring_set_wptr - set enc write pointer + * + * @ring: amdgpu_ring pointer + * + * Commits the enc write pointer to the hardware + */ +static void vcn_v5_0_1_unified_ring_set_wptr(struct amdgpu_ring *ring) +{ + struct amdgpu_device *adev = ring->adev; + + if (ring != &adev->vcn.inst[ring->me].ring_enc[0]) + DRM_ERROR("wrong ring id is identified in %s", __func__); + + if (ring->use_doorbell) { + *ring->wptr_cpu_addr = lower_32_bits(ring->wptr); + WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr)); + } else { + WREG32_SOC15(VCN, GET_INST(VCN, ring->me), regUVD_RB_WPTR, + lower_32_bits(ring->wptr)); + } +} + +static const struct amdgpu_ring_funcs vcn_v5_0_1_unified_ring_vm_funcs = { + .type = AMDGPU_RING_TYPE_VCN_ENC, + .align_mask = 0x3f, + .nop = VCN_ENC_CMD_NO_OP, + .get_rptr = vcn_v5_0_1_unified_ring_get_rptr, + .get_wptr = vcn_v5_0_1_unified_ring_get_wptr, + .set_wptr = vcn_v5_0_1_unified_ring_set_wptr, + .emit_frame_size = SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 + + SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 4 + + 4 + /* vcn_v2_0_enc_ring_emit_vm_flush */ + 5 + + 5 + /* vcn_v2_0_enc_ring_emit_fence x2 vm fence */ + 1, /* vcn_v2_0_enc_ring_insert_end */ + .emit_ib_size = 5, /* vcn_v2_0_enc_ring_emit_ib */ + .emit_ib = vcn_v2_0_enc_ring_emit_ib, + .emit_fence = vcn_v2_0_enc_ring_emit_fence, + .emit_vm_flush = vcn_v4_0_3_enc_ring_emit_vm_flush, + .emit_hdp_flush = vcn_v4_0_3_ring_emit_hdp_flush, + .test_ring = amdgpu_vcn_enc_ring_test_ring, + .test_ib = amdgpu_vcn_unified_ring_test_ib, + .insert_nop = amdgpu_ring_insert_nop, + .insert_end = vcn_v2_0_enc_ring_insert_end, + .pad_ib = amdgpu_ring_generic_pad_ib, + .begin_use = amdgpu_vcn_ring_begin_use, + .end_use = amdgpu_vcn_ring_end_use, + .emit_wreg = vcn_v4_0_3_enc_ring_emit_wreg, + .emit_reg_wait = vcn_v4_0_3_enc_ring_emit_reg_wait, + .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper, +}; + +/** + * vcn_v5_0_1_set_unified_ring_funcs - set unified ring functions + * + * @adev: amdgpu_device pointer + * + * Set unified ring functions + */ +static void vcn_v5_0_1_set_unified_ring_funcs(struct amdgpu_device *adev) +{ + int i, vcn_inst; + + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { + adev->vcn.inst[i].ring_enc[0].funcs = &vcn_v5_0_1_unified_ring_vm_funcs; + adev->vcn.inst[i].ring_enc[0].me = i; + vcn_inst = GET_INST(VCN, i); + adev->vcn.inst[i].aid_id = vcn_inst / adev->vcn.num_inst_per_aid; + } +} + +/** + * vcn_v5_0_1_is_idle - check VCN block is idle + * + * @ip_block: Pointer to the amdgpu_ip_block structure + * + * Check whether VCN block is idle + */ +static bool vcn_v5_0_1_is_idle(struct amdgpu_ip_block *ip_block) +{ + struct amdgpu_device *adev = ip_block->adev; + int i, ret = 1; + + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) + ret &= (RREG32_SOC15(VCN, GET_INST(VCN, i), regUVD_STATUS) == UVD_STATUS__IDLE); + + return ret; +} + +/** + * vcn_v5_0_1_wait_for_idle - wait for VCN block idle + * + * @ip_block: Pointer to the amdgpu_ip_block for this hw instance. + * + * Wait for VCN block idle + */ +static int vcn_v5_0_1_wait_for_idle(struct amdgpu_ip_block *ip_block) +{ + struct amdgpu_device *adev = ip_block->adev; + int i, ret = 0; + + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { + ret = SOC15_WAIT_ON_RREG(VCN, GET_INST(VCN, i), regUVD_STATUS, UVD_STATUS__IDLE, + UVD_STATUS__IDLE); + if (ret) + return ret; + } + + return ret; +} + +/** + * vcn_v5_0_1_set_clockgating_state - set VCN block clockgating state + * + * @ip_block: Pointer to the amdgpu_ip_block for this hw instance. + * @state: clock gating state + * + * Set VCN block clockgating state + */ +static int vcn_v5_0_1_set_clockgating_state(struct amdgpu_ip_block *ip_block, + enum amd_clockgating_state state) +{ + struct amdgpu_device *adev = ip_block->adev; + bool enable = state == AMD_CG_STATE_GATE; + int i; + + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { + struct amdgpu_vcn_inst *vinst = &adev->vcn.inst[i]; + + if (enable) { + if (RREG32_SOC15(VCN, GET_INST(VCN, i), regUVD_STATUS) != UVD_STATUS__IDLE) + return -EBUSY; + vcn_v5_0_1_enable_clock_gating(vinst); + } else { + vcn_v5_0_1_disable_clock_gating(vinst); + } + } + + return 0; +} + +static int vcn_v5_0_1_set_pg_state(struct amdgpu_vcn_inst *vinst, + enum amd_powergating_state state) +{ + struct amdgpu_device *adev = vinst->adev; + int ret = 0; + + /* for SRIOV, guest should not control VCN Power-gating + * MMSCH FW should control Power-gating and clock-gating + * guest should avoid touching CGC and PG + */ + if (amdgpu_sriov_vf(adev)) { + vinst->cur_state = AMD_PG_STATE_UNGATE; + return 0; + } + + if (state == vinst->cur_state) + return 0; + + if (state == AMD_PG_STATE_GATE) + ret = vcn_v5_0_1_stop(vinst); + else + ret = vcn_v5_0_1_start(vinst); + + if (!ret) + vinst->cur_state = state; + + return ret; +} + +/** + * vcn_v5_0_1_process_interrupt - process VCN block interrupt + * + * @adev: amdgpu_device pointer + * @source: interrupt sources + * @entry: interrupt entry from clients and sources + * + * Process VCN block interrupt + */ +static int vcn_v5_0_1_process_interrupt(struct amdgpu_device *adev, struct amdgpu_irq_src *source, + struct amdgpu_iv_entry *entry) +{ + uint32_t i, inst; + + i = node_id_to_phys_map[entry->node_id]; + + DRM_DEV_DEBUG(adev->dev, "IH: VCN TRAP\n"); + + for (inst = 0; inst < adev->vcn.num_vcn_inst; ++inst) + if (adev->vcn.inst[inst].aid_id == i) + break; + if (inst >= adev->vcn.num_vcn_inst) { + dev_WARN_ONCE(adev->dev, 1, + "Interrupt received for unknown VCN instance %d", + entry->node_id); + return 0; + } + + switch (entry->src_id) { + case VCN_5_0__SRCID__UVD_ENC_GENERAL_PURPOSE: + amdgpu_fence_process(&adev->vcn.inst[inst].ring_enc[0]); + break; + default: + DRM_DEV_ERROR(adev->dev, "Unhandled interrupt: %d %d\n", + entry->src_id, entry->src_data[0]); + break; + } + + return 0; +} + +static int vcn_v5_0_1_set_ras_interrupt_state(struct amdgpu_device *adev, + struct amdgpu_irq_src *source, + unsigned int type, + enum amdgpu_interrupt_state state) +{ + return 0; +} + +static const struct amdgpu_irq_src_funcs vcn_v5_0_1_irq_funcs = { + .process = vcn_v5_0_1_process_interrupt, +}; + +static const struct amdgpu_irq_src_funcs vcn_v5_0_1_ras_irq_funcs = { + .set = vcn_v5_0_1_set_ras_interrupt_state, + .process = amdgpu_vcn_process_poison_irq, +}; + + +/** + * vcn_v5_0_1_set_irq_funcs - set VCN block interrupt irq functions + * + * @adev: amdgpu_device pointer + * + * Set VCN block interrupt irq functions + */ +static void vcn_v5_0_1_set_irq_funcs(struct amdgpu_device *adev) +{ + int i; + + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) + adev->vcn.inst->irq.num_types++; + + adev->vcn.inst->irq.funcs = &vcn_v5_0_1_irq_funcs; + + adev->vcn.inst->ras_poison_irq.num_types = 1; + adev->vcn.inst->ras_poison_irq.funcs = &vcn_v5_0_1_ras_irq_funcs; + +} + +static const struct amd_ip_funcs vcn_v5_0_1_ip_funcs = { + .name = "vcn_v5_0_1", + .early_init = vcn_v5_0_1_early_init, + .late_init = NULL, + .sw_init = vcn_v5_0_1_sw_init, + .sw_fini = vcn_v5_0_1_sw_fini, + .hw_init = vcn_v5_0_1_hw_init, + .hw_fini = vcn_v5_0_1_hw_fini, + .suspend = vcn_v5_0_1_suspend, + .resume = vcn_v5_0_1_resume, + .is_idle = vcn_v5_0_1_is_idle, + .wait_for_idle = vcn_v5_0_1_wait_for_idle, + .check_soft_reset = NULL, + .pre_soft_reset = NULL, + .soft_reset = NULL, + .post_soft_reset = NULL, + .set_clockgating_state = vcn_v5_0_1_set_clockgating_state, + .set_powergating_state = vcn_set_powergating_state, + .dump_ip_state = vcn_v5_0_0_dump_ip_state, + .print_ip_state = vcn_v5_0_0_print_ip_state, +}; + +const struct amdgpu_ip_block_version vcn_v5_0_1_ip_block = { + .type = AMD_IP_BLOCK_TYPE_VCN, + .major = 5, + .minor = 0, + .rev = 1, + .funcs = &vcn_v5_0_1_ip_funcs, +}; + +static uint32_t vcn_v5_0_1_query_poison_by_instance(struct amdgpu_device *adev, + uint32_t instance, uint32_t sub_block) +{ + uint32_t poison_stat = 0, reg_value = 0; + + switch (sub_block) { + case AMDGPU_VCN_V5_0_1_VCPU_VCODEC: + reg_value = RREG32_SOC15(VCN, instance, regUVD_RAS_VCPU_VCODEC_STATUS); + poison_stat = REG_GET_FIELD(reg_value, UVD_RAS_VCPU_VCODEC_STATUS, POISONED_PF); + break; + default: + break; + } + + if (poison_stat) + dev_info(adev->dev, "Poison detected in VCN%d, sub_block%d\n", + instance, sub_block); + + return poison_stat; +} + +static bool vcn_v5_0_1_query_poison_status(struct amdgpu_device *adev) +{ + uint32_t inst, sub; + uint32_t poison_stat = 0; + + for (inst = 0; inst < adev->vcn.num_vcn_inst; inst++) + for (sub = 0; sub < AMDGPU_VCN_V5_0_1_MAX_SUB_BLOCK; sub++) + poison_stat += + vcn_v5_0_1_query_poison_by_instance(adev, inst, sub); + + return !!poison_stat; +} + +static const struct amdgpu_ras_block_hw_ops vcn_v5_0_1_ras_hw_ops = { + .query_poison_status = vcn_v5_0_1_query_poison_status, +}; + +static int vcn_v5_0_1_aca_bank_parser(struct aca_handle *handle, struct aca_bank *bank, + enum aca_smu_type type, void *data) +{ + struct aca_bank_info info; + u64 misc0; + int ret; + + ret = aca_bank_info_decode(bank, &info); + if (ret) + return ret; + + misc0 = bank->regs[ACA_REG_IDX_MISC0]; + switch (type) { + case ACA_SMU_TYPE_UE: + bank->aca_err_type = ACA_ERROR_TYPE_UE; + ret = aca_error_cache_log_bank_error(handle, &info, ACA_ERROR_TYPE_UE, + 1ULL); + break; + case ACA_SMU_TYPE_CE: + bank->aca_err_type = ACA_ERROR_TYPE_CE; + ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type, + ACA_REG__MISC0__ERRCNT(misc0)); + break; + default: + return -EINVAL; + } + + return ret; +} + +/* reference to smu driver if header file */ +static int vcn_v5_0_1_err_codes[] = { + 14, 15, /* VCN */ +}; + +static bool vcn_v5_0_1_aca_bank_is_valid(struct aca_handle *handle, struct aca_bank *bank, + enum aca_smu_type type, void *data) +{ + u32 instlo; + + instlo = ACA_REG__IPID__INSTANCEIDLO(bank->regs[ACA_REG_IDX_IPID]); + instlo &= GENMASK(31, 1); + + if (instlo != mmSMNAID_AID0_MCA_SMU) + return false; + + if (aca_bank_check_error_codes(handle->adev, bank, + vcn_v5_0_1_err_codes, + ARRAY_SIZE(vcn_v5_0_1_err_codes))) + return false; + + return true; +} + +static const struct aca_bank_ops vcn_v5_0_1_aca_bank_ops = { + .aca_bank_parser = vcn_v5_0_1_aca_bank_parser, + .aca_bank_is_valid = vcn_v5_0_1_aca_bank_is_valid, +}; + +static const struct aca_info vcn_v5_0_1_aca_info = { + .hwip = ACA_HWIP_TYPE_SMU, + .mask = ACA_ERROR_UE_MASK, + .bank_ops = &vcn_v5_0_1_aca_bank_ops, +}; + +static int vcn_v5_0_1_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *ras_block) +{ + int r; + + r = amdgpu_ras_block_late_init(adev, ras_block); + if (r) + return r; + + r = amdgpu_ras_bind_aca(adev, AMDGPU_RAS_BLOCK__VCN, + &vcn_v5_0_1_aca_info, NULL); + if (r) + goto late_fini; + + return 0; + +late_fini: + amdgpu_ras_block_late_fini(adev, ras_block); + + return r; +} + +static struct amdgpu_vcn_ras vcn_v5_0_1_ras = { + .ras_block = { + .hw_ops = &vcn_v5_0_1_ras_hw_ops, + .ras_late_init = vcn_v5_0_1_ras_late_init, + }, +}; + +static void vcn_v5_0_1_set_ras_funcs(struct amdgpu_device *adev) +{ + adev->vcn.ras = &vcn_v5_0_1_ras; +} -- GitLab From 710deaff6aebd5c23e307f03e62bb02e23989ab7 Mon Sep 17 00:00:00 2001 From: Imre Deak Date: Mon, 19 May 2025 16:34:17 +0300 Subject: [PATCH 2018/2211] drm/i915/dp_mst: Work around Thunderbolt sink disconnect after SINK_COUNT_ESI read [ Upstream commit 9cb15478916e849d62a6ec44b10c593b9663328c ] Due to a problem in the iTBT DP-in adapter's firmware the sink on a TBT link may get disconnected inadvertently if the SINK_COUNT_ESI and the DP_LINK_SERVICE_IRQ_VECTOR_ESI0 registers are read in a single AUX transaction. Work around the issue by reading these registers in separate transactions. The issue affects MTL+ platforms and will be fixed in the DP-in adapter firmware, however releasing that firmware fix may take some time and is not guaranteed to be available for all systems. Based on this apply the workaround on affected platforms. See HSD #13013007775. v2: Cc'ing Mika Westerberg. Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13760 Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14147 Cc: Mika Westerberg Cc: stable@vger.kernel.org Reviewed-by: Mika Westerberg Signed-off-by: Imre Deak Link: https://lore.kernel.org/r/20250519133417.1469181-1-imre.deak@intel.com (cherry picked from commit c3a48363cf1f76147088b1adb518136ac5df86a0) Signed-off-by: Joonas Lahtinen Signed-off-by: Sasha Levin --- drivers/gpu/drm/i915/display/intel_dp.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 45cca965c11b4..ca9e0c730013d 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -4300,6 +4300,24 @@ intel_dp_mst_disconnect(struct intel_dp *intel_dp) static bool intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *esi) { + struct intel_display *display = to_intel_display(intel_dp); + struct drm_i915_private *i915 = dp_to_i915(intel_dp); + + /* + * Display WA for HSD #13013007775: mtl/arl/lnl + * Read the sink count and link service IRQ registers in separate + * transactions to prevent disconnecting the sink on a TBT link + * inadvertently. + */ + if (IS_DISPLAY_VER(display, 14, 20) && !IS_BATTLEMAGE(i915)) { + if (drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_COUNT_ESI, esi, 3) != 3) + return false; + + /* DP_SINK_COUNT_ESI + 3 == DP_LINK_SERVICE_IRQ_VECTOR_ESI0 */ + return drm_dp_dpcd_readb(&intel_dp->aux, DP_LINK_SERVICE_IRQ_VECTOR_ESI0, + &esi[3]) == 1; + } + return drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_COUNT_ESI, esi, 4) == 4; } -- GitLab From 81ebb8d755d9781ffba0c0a4dbdcfac31d421c23 Mon Sep 17 00:00:00 2001 From: Frank Min Date: Sun, 6 Jul 2025 00:52:10 -0400 Subject: [PATCH 2019/2211] drm/amdgpu: add kicker fws loading for gfx11/smu13/psp13 [ Upstream commit 854171405e7f093532b33d8ed0875b9e34fc55b4 ] 1. Add kicker firmwares loading for gfx11/smu13/psp13 2. Register additional MODULE_FIRMWARE entries for kicker fws - gc_11_0_0_rlc_kicker.bin - gc_11_0_0_imu_kicker.bin - psp_13_0_0_sos_kicker.bin - psp_13_0_0_ta_kicker.bin - smu_13_0_0_kicker.bin Signed-off-by: Frank Min Reviewed-by: Hawking Zhang Signed-off-by: Alex Deucher (cherry picked from commit fb5ec2174d70a8989bc207d257db90ffeca3b163) Cc: stable@vger.kernel.org Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 10 ++++++++-- drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 4 ++++ drivers/gpu/drm/amd/amdgpu/imu_v11_0.c | 6 +++++- drivers/gpu/drm/amd/amdgpu/psp_v13_0.c | 2 ++ drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 8 ++++++-- 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index 48e30e5f83389..3d42f6c3308ed 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c @@ -3430,7 +3430,10 @@ int psp_init_sos_microcode(struct psp_context *psp, const char *chip_name) uint8_t *ucode_array_start_addr; int err = 0; - err = amdgpu_ucode_request(adev, &adev->psp.sos_fw, "amdgpu/%s_sos.bin", chip_name); + if (amdgpu_is_kicker_fw(adev)) + err = amdgpu_ucode_request(adev, &adev->psp.sos_fw, "amdgpu/%s_sos_kicker.bin", chip_name); + else + err = amdgpu_ucode_request(adev, &adev->psp.sos_fw, "amdgpu/%s_sos.bin", chip_name); if (err) goto out; @@ -3672,7 +3675,10 @@ int psp_init_ta_microcode(struct psp_context *psp, const char *chip_name) struct amdgpu_device *adev = psp->adev; int err; - err = amdgpu_ucode_request(adev, &adev->psp.ta_fw, "amdgpu/%s_ta.bin", chip_name); + if (amdgpu_is_kicker_fw(adev)) + err = amdgpu_ucode_request(adev, &adev->psp.ta_fw, "amdgpu/%s_ta_kicker.bin", chip_name); + else + err = amdgpu_ucode_request(adev, &adev->psp.ta_fw, "amdgpu/%s_ta.bin", chip_name); if (err) return err; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c index 1f06b22dbe7c6..96e5c520af316 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c @@ -84,6 +84,7 @@ MODULE_FIRMWARE("amdgpu/gc_11_0_0_pfp.bin"); MODULE_FIRMWARE("amdgpu/gc_11_0_0_me.bin"); MODULE_FIRMWARE("amdgpu/gc_11_0_0_mec.bin"); MODULE_FIRMWARE("amdgpu/gc_11_0_0_rlc.bin"); +MODULE_FIRMWARE("amdgpu/gc_11_0_0_rlc_kicker.bin"); MODULE_FIRMWARE("amdgpu/gc_11_0_0_rlc_1.bin"); MODULE_FIRMWARE("amdgpu/gc_11_0_0_toc.bin"); MODULE_FIRMWARE("amdgpu/gc_11_0_1_pfp.bin"); @@ -734,6 +735,9 @@ static int gfx_v11_0_init_microcode(struct amdgpu_device *adev) adev->pdev->revision == 0xCE) err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw, "amdgpu/gc_11_0_0_rlc_1.bin"); + else if (amdgpu_is_kicker_fw(adev)) + err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw, + "amdgpu/%s_rlc_kicker.bin", ucode_prefix); else err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw, "amdgpu/%s_rlc.bin", ucode_prefix); diff --git a/drivers/gpu/drm/amd/amdgpu/imu_v11_0.c b/drivers/gpu/drm/amd/amdgpu/imu_v11_0.c index d4f72e47ae9e2..c4f5cbf1ecd7d 100644 --- a/drivers/gpu/drm/amd/amdgpu/imu_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/imu_v11_0.c @@ -32,6 +32,7 @@ #include "gc/gc_11_0_0_sh_mask.h" MODULE_FIRMWARE("amdgpu/gc_11_0_0_imu.bin"); +MODULE_FIRMWARE("amdgpu/gc_11_0_0_imu_kicker.bin"); MODULE_FIRMWARE("amdgpu/gc_11_0_1_imu.bin"); MODULE_FIRMWARE("amdgpu/gc_11_0_2_imu.bin"); MODULE_FIRMWARE("amdgpu/gc_11_0_3_imu.bin"); @@ -50,7 +51,10 @@ static int imu_v11_0_init_microcode(struct amdgpu_device *adev) DRM_DEBUG("\n"); amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix, sizeof(ucode_prefix)); - err = amdgpu_ucode_request(adev, &adev->gfx.imu_fw, "amdgpu/%s_imu.bin", ucode_prefix); + if (amdgpu_is_kicker_fw(adev)) + err = amdgpu_ucode_request(adev, &adev->gfx.imu_fw, "amdgpu/%s_imu_kicker.bin", ucode_prefix); + else + err = amdgpu_ucode_request(adev, &adev->gfx.imu_fw, "amdgpu/%s_imu.bin", ucode_prefix); if (err) goto out; diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c index bf00de763acb0..124f74e862d7f 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c @@ -42,7 +42,9 @@ MODULE_FIRMWARE("amdgpu/psp_13_0_5_ta.bin"); MODULE_FIRMWARE("amdgpu/psp_13_0_8_toc.bin"); MODULE_FIRMWARE("amdgpu/psp_13_0_8_ta.bin"); MODULE_FIRMWARE("amdgpu/psp_13_0_0_sos.bin"); +MODULE_FIRMWARE("amdgpu/psp_13_0_0_sos_kicker.bin"); MODULE_FIRMWARE("amdgpu/psp_13_0_0_ta.bin"); +MODULE_FIRMWARE("amdgpu/psp_13_0_0_ta_kicker.bin"); MODULE_FIRMWARE("amdgpu/psp_13_0_7_sos.bin"); MODULE_FIRMWARE("amdgpu/psp_13_0_7_ta.bin"); MODULE_FIRMWARE("amdgpu/psp_13_0_10_sos.bin"); diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c index 4f78c84da780c..c5bca3019de07 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c @@ -58,6 +58,7 @@ MODULE_FIRMWARE("amdgpu/aldebaran_smc.bin"); MODULE_FIRMWARE("amdgpu/smu_13_0_0.bin"); +MODULE_FIRMWARE("amdgpu/smu_13_0_0_kicker.bin"); MODULE_FIRMWARE("amdgpu/smu_13_0_7.bin"); MODULE_FIRMWARE("amdgpu/smu_13_0_10.bin"); @@ -92,7 +93,7 @@ const int pmfw_decoded_link_width[7] = {0, 1, 2, 4, 8, 12, 16}; int smu_v13_0_init_microcode(struct smu_context *smu) { struct amdgpu_device *adev = smu->adev; - char ucode_prefix[15]; + char ucode_prefix[30]; int err = 0; const struct smc_firmware_header_v1_0 *hdr; const struct common_firmware_header *header; @@ -103,7 +104,10 @@ int smu_v13_0_init_microcode(struct smu_context *smu) return 0; amdgpu_ucode_ip_version_decode(adev, MP1_HWIP, ucode_prefix, sizeof(ucode_prefix)); - err = amdgpu_ucode_request(adev, &adev->pm.fw, "amdgpu/%s.bin", ucode_prefix); + if (amdgpu_is_kicker_fw(adev)) + err = amdgpu_ucode_request(adev, &adev->pm.fw, "amdgpu/%s_kicker.bin", ucode_prefix); + else + err = amdgpu_ucode_request(adev, &adev->pm.fw, "amdgpu/%s.bin", ucode_prefix); if (err) goto out; -- GitLab From 646442758910d13f9afc57f38bc0a537c3575390 Mon Sep 17 00:00:00 2001 From: Nicholas Kazlauskas Date: Wed, 21 May 2025 16:40:25 -0400 Subject: [PATCH 2020/2211] drm/amd/display: Add more checks for DSC / HUBP ONO guarantees [ Upstream commit 0d57dd1765d311111d9885346108c4deeae1deb4 ] [WHY] For non-zero DSC instances it's possible that the HUBP domain required to drive it for sequential ONO ASICs isn't met, potentially causing the logic to the tile to enter an undefined state leading to a system hang. [HOW] Add more checks to ensure that the HUBP domain matching the DSC instance is appropriately powered. Cc: Mario Limonciello Cc: Alex Deucher Reviewed-by: Duncan Ma Signed-off-by: Nicholas Kazlauskas Signed-off-by: Alex Hung Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher (cherry picked from commit da63df07112e5a9857a8d2aaa04255c4206754ec) Cc: stable@vger.kernel.org Signed-off-by: Sasha Levin --- .../amd/display/dc/hwss/dcn35/dcn35_hwseq.c | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c index ca446e08f6a27..21aff7fa6375d 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c @@ -1019,8 +1019,22 @@ void dcn35_calc_blocks_to_gate(struct dc *dc, struct dc_state *context, if (pipe_ctx->plane_res.dpp || pipe_ctx->stream_res.opp) update_state->pg_pipe_res_update[PG_MPCC][pipe_ctx->plane_res.mpcc_inst] = false; - if (pipe_ctx->stream_res.dsc) + if (pipe_ctx->stream_res.dsc) { update_state->pg_pipe_res_update[PG_DSC][pipe_ctx->stream_res.dsc->inst] = false; + if (dc->caps.sequential_ono) { + update_state->pg_pipe_res_update[PG_HUBP][pipe_ctx->stream_res.dsc->inst] = false; + update_state->pg_pipe_res_update[PG_DPP][pipe_ctx->stream_res.dsc->inst] = false; + + /* All HUBP/DPP instances must be powered if the DSC inst != HUBP inst */ + if (!pipe_ctx->top_pipe && pipe_ctx->plane_res.hubp && + pipe_ctx->plane_res.hubp->inst != pipe_ctx->stream_res.dsc->inst) { + for (j = 0; j < dc->res_pool->pipe_count; ++j) { + update_state->pg_pipe_res_update[PG_HUBP][j] = false; + update_state->pg_pipe_res_update[PG_DPP][j] = false; + } + } + } + } if (pipe_ctx->stream_res.opp) update_state->pg_pipe_res_update[PG_OPP][pipe_ctx->stream_res.opp->inst] = false; @@ -1165,6 +1179,25 @@ void dcn35_calc_blocks_to_ungate(struct dc *dc, struct dc_state *context, update_state->pg_pipe_res_update[PG_HDMISTREAM][0] = true; if (dc->caps.sequential_ono) { + for (i = 0; i < dc->res_pool->pipe_count; i++) { + struct pipe_ctx *new_pipe = &context->res_ctx.pipe_ctx[i]; + + if (new_pipe->stream_res.dsc && !new_pipe->top_pipe && + update_state->pg_pipe_res_update[PG_DSC][new_pipe->stream_res.dsc->inst]) { + update_state->pg_pipe_res_update[PG_HUBP][new_pipe->stream_res.dsc->inst] = true; + update_state->pg_pipe_res_update[PG_DPP][new_pipe->stream_res.dsc->inst] = true; + + /* All HUBP/DPP instances must be powered if the DSC inst != HUBP inst */ + if (new_pipe->plane_res.hubp && + new_pipe->plane_res.hubp->inst != new_pipe->stream_res.dsc->inst) { + for (j = 0; j < dc->res_pool->pipe_count; ++j) { + update_state->pg_pipe_res_update[PG_HUBP][j] = true; + update_state->pg_pipe_res_update[PG_DPP][j] = true; + } + } + } + } + for (i = dc->res_pool->pipe_count - 1; i >= 0; i--) { if (update_state->pg_pipe_res_update[PG_HUBP][i] && update_state->pg_pipe_res_update[PG_DPP][i]) { -- GitLab From 238a218d422e3da8a18aee86115232d57a5ed221 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Fri, 14 Mar 2025 15:54:33 +0100 Subject: [PATCH 2021/2211] arm64: dts: qcom: x1e80100-crd: mark l12b and l15b always-on [ Upstream commit abf89bc4bb09c16a53d693b09ea85225cf57ff39 ] The l12b and l15b supplies are used by components that are not (fully) described (and some never will be) and must never be disabled. Mark the regulators as always-on to prevent them from being disabled, for example, when consumers probe defer or suspend. Fixes: bd50b1f5b6f3 ("arm64: dts: qcom: x1e80100: Add Compute Reference Device") Cc: stable@vger.kernel.org # 6.8 Cc: Abel Vesa Cc: Rajendra Nayak Cc: Sibi Sankar Reviewed-by: Konrad Dybcio Signed-off-by: Johan Hovold Link: https://lore.kernel.org/r/20250314145440.11371-2-johan+linaro@kernel.org Signed-off-by: Bjorn Andersson Signed-off-by: Sasha Levin --- arch/arm64/boot/dts/qcom/x1e80100-crd.dts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/x1e80100-crd.dts b/arch/arm64/boot/dts/qcom/x1e80100-crd.dts index 044a2f1432fe3..2a504a449b0bb 100644 --- a/arch/arm64/boot/dts/qcom/x1e80100-crd.dts +++ b/arch/arm64/boot/dts/qcom/x1e80100-crd.dts @@ -419,6 +419,7 @@ regulator-min-microvolt = <1200000>; regulator-max-microvolt = <1200000>; regulator-initial-mode = ; + regulator-always-on; }; vreg_l13b_3p0: ldo13 { @@ -440,6 +441,7 @@ regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-initial-mode = ; + regulator-always-on; }; vreg_l16b_2p9: ldo16 { -- GitLab From 7ccaa5fa5d25d53c66fb740964b23d9f98f72d32 Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Mon, 19 May 2025 15:46:25 -0400 Subject: [PATCH 2022/2211] drm/amdgpu/mes: add missing locking in helper functions [ Upstream commit 40f970ba7a4ab77be2ffe6d50a70416c8876496a ] We need to take the MES lock. Reviewed-by: Michael Chen Signed-off-by: Alex Deucher Cc: stable@vger.kernel.org Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c index 7d4b540340e02..41b88e0ea98b8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c @@ -860,7 +860,9 @@ int amdgpu_mes_map_legacy_queue(struct amdgpu_device *adev, queue_input.mqd_addr = amdgpu_bo_gpu_offset(ring->mqd_obj); queue_input.wptr_addr = ring->wptr_gpu_addr; + amdgpu_mes_lock(&adev->mes); r = adev->mes.funcs->map_legacy_queue(&adev->mes, &queue_input); + amdgpu_mes_unlock(&adev->mes); if (r) DRM_ERROR("failed to map legacy queue\n"); @@ -883,7 +885,9 @@ int amdgpu_mes_unmap_legacy_queue(struct amdgpu_device *adev, queue_input.trail_fence_addr = gpu_addr; queue_input.trail_fence_data = seq; + amdgpu_mes_lock(&adev->mes); r = adev->mes.funcs->unmap_legacy_queue(&adev->mes, &queue_input); + amdgpu_mes_unlock(&adev->mes); if (r) DRM_ERROR("failed to unmap legacy queue\n"); @@ -910,7 +914,9 @@ int amdgpu_mes_reset_legacy_queue(struct amdgpu_device *adev, queue_input.vmid = vmid; queue_input.use_mmio = use_mmio; + amdgpu_mes_lock(&adev->mes); r = adev->mes.funcs->reset_legacy_queue(&adev->mes, &queue_input); + amdgpu_mes_unlock(&adev->mes); if (r) DRM_ERROR("failed to reset legacy queue\n"); @@ -931,7 +937,9 @@ uint32_t amdgpu_mes_rreg(struct amdgpu_device *adev, uint32_t reg) goto error; } + amdgpu_mes_lock(&adev->mes); r = adev->mes.funcs->misc_op(&adev->mes, &op_input); + amdgpu_mes_unlock(&adev->mes); if (r) DRM_ERROR("failed to read reg (0x%x)\n", reg); else @@ -957,7 +965,9 @@ int amdgpu_mes_wreg(struct amdgpu_device *adev, goto error; } + amdgpu_mes_lock(&adev->mes); r = adev->mes.funcs->misc_op(&adev->mes, &op_input); + amdgpu_mes_unlock(&adev->mes); if (r) DRM_ERROR("failed to write reg (0x%x)\n", reg); @@ -984,7 +994,9 @@ int amdgpu_mes_reg_write_reg_wait(struct amdgpu_device *adev, goto error; } + amdgpu_mes_lock(&adev->mes); r = adev->mes.funcs->misc_op(&adev->mes, &op_input); + amdgpu_mes_unlock(&adev->mes); if (r) DRM_ERROR("failed to reg_write_reg_wait\n"); @@ -1009,7 +1021,9 @@ int amdgpu_mes_reg_wait(struct amdgpu_device *adev, uint32_t reg, goto error; } + amdgpu_mes_lock(&adev->mes); r = adev->mes.funcs->misc_op(&adev->mes, &op_input); + amdgpu_mes_unlock(&adev->mes); if (r) DRM_ERROR("failed to reg_write_reg_wait\n"); -- GitLab From 790ce73721abebf98f72555c9be9f0855e54a45c Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Sun, 6 Jul 2025 02:42:09 -0400 Subject: [PATCH 2023/2211] sched_ext: Make scx_group_set_weight() always update tg->scx.weight [ Upstream commit c50784e99f0e7199cdb12dbddf02229b102744ef ] Otherwise, tg->scx.weight can go out of sync while scx_cgroup is not enabled and ops.cgroup_init() may be called with a stale weight value. Signed-off-by: Tejun Heo Fixes: 819513666966 ("sched_ext: Add cgroup support") Cc: stable@vger.kernel.org # v6.12+ Signed-off-by: Sasha Levin --- kernel/sched/ext.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c index ddd4fa785264e..c801dd20c63d9 100644 --- a/kernel/sched/ext.c +++ b/kernel/sched/ext.c @@ -4058,12 +4058,12 @@ void scx_group_set_weight(struct task_group *tg, unsigned long weight) { percpu_down_read(&scx_cgroup_rwsem); - if (scx_cgroup_enabled && tg->scx_weight != weight) { - if (SCX_HAS_OP(cgroup_set_weight)) - SCX_CALL_OP(SCX_KF_UNLOCKED, cgroup_set_weight, - tg_cgrp(tg), weight); - tg->scx_weight = weight; - } + if (scx_cgroup_enabled && SCX_HAS_OP(cgroup_set_weight) && + tg->scx_weight != weight) + SCX_CALL_OP(SCX_KF_UNLOCKED, cgroup_set_weight, + tg_cgrp(tg), weight); + + tg->scx_weight = weight; percpu_up_read(&scx_cgroup_rwsem); } -- GitLab From c0527f7534c050b68cc13b2cf8847488c9e101f7 Mon Sep 17 00:00:00 2001 From: "Ewan D. Milne" Date: Mon, 17 Mar 2025 12:37:31 -0400 Subject: [PATCH 2024/2211] scsi: lpfc: Restore clearing of NLP_UNREG_INP in ndlp->nlp_flag [ Upstream commit 040492ac2578b66d3ff4dcefb4f56811634de53d ] Commit 32566a6f1ae5 ("scsi: lpfc: Remove NLP_RELEASE_RPI flag from nodelist structure") introduced a regression with SLI-3 adapters (e.g. LPe12000 8Gb) where a Link Down / Link Up such as caused by disabling an host FC switch port would result in the devices remaining in the transport-offline state and multipath reporting them as failed. This problem was not seen with newer SLI-4 adapters. The problem was caused by portions of the patch which removed the functions __lpfc_sli_rpi_release() and lpfc_sli_rpi_release() and all their callers. This was presumably because with the removal of the NLP_RELEASE_RPI flag there was no need to free the rpi. However, __lpfc_sli_rpi_release() and lpfc_sli_rpi_release() which calls it reset the NLP_UNREG_INP flag. And, lpfc_sli_def_mbox_cmpl() has a path where __lpfc_sli_rpi_release() was called in a particular case where NLP_UNREG_INP was not otherwise cleared because of other conditions. Restoring the else clause of this conditional and simply clearing the NLP_UNREG_INP flag appears to resolve the problem with SLI-3 adapters. It should be noted that the code path in question is not specific to SLI-3, but there are other SLI-4 code paths which may have masked the issue. Fixes: 32566a6f1ae5 ("scsi: lpfc: Remove NLP_RELEASE_RPI flag from nodelist structure") Cc: stable@vger.kernel.org Tested-by: Marco Patalano Signed-off-by: Ewan D. Milne Link: https://lore.kernel.org/r/20250317163731.356873-1-emilne@redhat.com Reviewed-by: Justin Tee Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/lpfc/lpfc_sli.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 80c3c84c23914..c4acf594286e5 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -2921,6 +2921,8 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING; lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); + } else { + clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); } /* The unreg_login mailbox is complete and had a -- GitLab From 0eaa495b3d5710e5ba72051d2e01bb28292c625c Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 14 May 2025 09:33:32 -0700 Subject: [PATCH 2025/2211] drm/msm: Fix a fence leak in submit error path [ Upstream commit 5d319f75ccf7f0927425a7545aa1a22b3eedc189 ] In error paths, we could unref the submit without calling drm_sched_entity_push_job(), so msm_job_free() will never get called. Since drm_sched_job_cleanup() will NULL out the s_fence, we can use that to detect this case. Signed-off-by: Rob Clark Patchwork: https://patchwork.freedesktop.org/patch/653584/ Signed-off-by: Rob Clark Signed-off-by: Sasha Levin --- drivers/gpu/drm/msm/msm_gem_submit.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index f775638d239a5..937c1f5d88cbb 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -85,6 +85,15 @@ void __msm_gem_submit_destroy(struct kref *kref) container_of(kref, struct msm_gem_submit, ref); unsigned i; + /* + * In error paths, we could unref the submit without calling + * drm_sched_entity_push_job(), so msm_job_free() will never + * get called. Since drm_sched_job_cleanup() will NULL out + * s_fence, we can use that to detect this case. + */ + if (submit->base.s_fence) + drm_sched_job_cleanup(&submit->base); + if (submit->fence_id) { spin_lock(&submit->queue->idr_lock); idr_remove(&submit->queue->fence_idr, submit->fence_id); -- GitLab From 3f6ce8433a9035b0aa810e1f5b708e9dc1c367b0 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 14 May 2025 09:33:33 -0700 Subject: [PATCH 2026/2211] drm/msm: Fix another leak in the submit error path [ Upstream commit f681c2aa8676a890eacc84044717ab0fd26e058f ] put_unused_fd() doesn't free the installed file, if we've already done fd_install(). So we need to also free the sync_file. Signed-off-by: Rob Clark Patchwork: https://patchwork.freedesktop.org/patch/653583/ Signed-off-by: Rob Clark Signed-off-by: Sasha Levin --- drivers/gpu/drm/msm/msm_gem_submit.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index 937c1f5d88cbb..4b3a8ee8e278f 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -667,6 +667,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, struct msm_ringbuffer *ring; struct msm_submit_post_dep *post_deps = NULL; struct drm_syncobj **syncobjs_to_reset = NULL; + struct sync_file *sync_file = NULL; int out_fence_fd = -1; unsigned i; int ret; @@ -877,7 +878,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, } if (ret == 0 && args->flags & MSM_SUBMIT_FENCE_FD_OUT) { - struct sync_file *sync_file = sync_file_create(submit->user_fence); + sync_file = sync_file_create(submit->user_fence); if (!sync_file) { ret = -ENOMEM; } else { @@ -911,8 +912,11 @@ out: out_unlock: mutex_unlock(&queue->lock); out_post_unlock: - if (ret && (out_fence_fd >= 0)) + if (ret && (out_fence_fd >= 0)) { put_unused_fd(out_fence_fd); + if (sync_file) + fput(sync_file->file); + } if (!IS_ERR_OR_NULL(submit)) { msm_gem_submit_put(submit); -- GitLab From c5e0af68c8994da0f4fe40094180c74898f1aec8 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Tue, 10 Jun 2025 08:43:19 +0200 Subject: [PATCH 2027/2211] ALSA: sb: Don't allow changing the DMA mode during operations [ Upstream commit ed29e073ba93f2d52832804cabdd831d5d357d33 ] When a PCM stream is already running, one shouldn't change the DMA mode via kcontrol, which may screw up the hardware. Return -EBUSY instead. Link: https://bugzilla.kernel.org/show_bug.cgi?id=218185 Link: https://patch.msgid.link/20250610064322.26787-1-tiwai@suse.de Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/isa/sb/sb16_main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sound/isa/sb/sb16_main.c b/sound/isa/sb/sb16_main.c index 74db115250030..c4930efd44e3a 100644 --- a/sound/isa/sb/sb16_main.c +++ b/sound/isa/sb/sb16_main.c @@ -703,6 +703,9 @@ static int snd_sb16_dma_control_put(struct snd_kcontrol *kcontrol, struct snd_ct unsigned char nval, oval; int change; + if (chip->mode & (SB_MODE_PLAYBACK | SB_MODE_CAPTURE)) + return -EBUSY; + nval = ucontrol->value.enumerated.item[0]; if (nval > 2) return -EINVAL; -- GitLab From f42b8e5753954ff2d55cc97e6eea2b5ebe1a5438 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Tue, 10 Jun 2025 08:43:20 +0200 Subject: [PATCH 2028/2211] ALSA: sb: Force to disable DMAs once when DMA mode is changed [ Upstream commit 4c267ae2ef349639b4d9ebf00dd28586a82fdbe6 ] When the DMA mode is changed on the (still real!) SB AWE32 after playing a stream and closing, the previous DMA setup was still silently kept, and it can confuse the hardware, resulting in the unexpected noises. As a workaround, enforce the disablement of DMA setups when the DMA setup is changed by the kcontrol. https://bugzilla.kernel.org/show_bug.cgi?id=218185 Link: https://patch.msgid.link/20250610064322.26787-2-tiwai@suse.de Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/isa/sb/sb16_main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sound/isa/sb/sb16_main.c b/sound/isa/sb/sb16_main.c index c4930efd44e3a..5a083eecaa6b9 100644 --- a/sound/isa/sb/sb16_main.c +++ b/sound/isa/sb/sb16_main.c @@ -714,6 +714,10 @@ static int snd_sb16_dma_control_put(struct snd_kcontrol *kcontrol, struct snd_ct change = nval != oval; snd_sb16_set_dma_mode(chip, nval); spin_unlock_irqrestore(&chip->reg_lock, flags); + if (change) { + snd_dma_disable(chip->dma8); + snd_dma_disable(chip->dma16); + } return change; } -- GitLab From 3ce57d493dd81ecc27033c7a918cc0d0ddaa8edc Mon Sep 17 00:00:00 2001 From: Tasos Sahanidis Date: Mon, 19 May 2025 11:56:55 +0300 Subject: [PATCH 2029/2211] ata: libata-acpi: Do not assume 40 wire cable if no devices are enabled [ Upstream commit 33877220b8641b4cde474a4229ea92c0e3637883 ] On at least an ASRock 990FX Extreme 4 with a VIA VT6330, the devices have not yet been enabled by the first time ata_acpi_cbl_80wire() is called. This means that the ata_for_each_dev loop is never entered, and a 40 wire cable is assumed. The VIA controller on this board does not report the cable in the PCI config space, thus having to fall back to ACPI even though no SATA bridge is present. The _GTM values are correctly reported by the firmware through ACPI, which has already set up faster transfer modes, but due to the above the controller is forced down to a maximum of UDMA/33. Resolve this by modifying ata_acpi_cbl_80wire() to directly return the cable type. First, an unknown cable is assumed which preserves the mode set by the firmware, and then on subsequent calls when the devices have been enabled, an 80 wire cable is correctly detected. Since the function now directly returns the cable type, it is renamed to ata_acpi_cbl_pata_type(). Signed-off-by: Tasos Sahanidis Link: https://lore.kernel.org/r/20250519085945.1399466-1-tasos@tasossah.com Signed-off-by: Niklas Cassel Signed-off-by: Sasha Levin --- drivers/ata/libata-acpi.c | 24 ++++++++++++++++-------- drivers/ata/pata_via.c | 6 ++---- include/linux/libata.h | 7 +++---- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index d36e71f475abd..39a350755a1ba 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c @@ -514,15 +514,19 @@ unsigned int ata_acpi_gtm_xfermask(struct ata_device *dev, EXPORT_SYMBOL_GPL(ata_acpi_gtm_xfermask); /** - * ata_acpi_cbl_80wire - Check for 80 wire cable + * ata_acpi_cbl_pata_type - Return PATA cable type * @ap: Port to check - * @gtm: GTM data to use * - * Return 1 if the @gtm indicates the BIOS selected an 80wire mode. + * Return ATA_CBL_PATA* according to the transfer mode selected by BIOS */ -int ata_acpi_cbl_80wire(struct ata_port *ap, const struct ata_acpi_gtm *gtm) +int ata_acpi_cbl_pata_type(struct ata_port *ap) { struct ata_device *dev; + int ret = ATA_CBL_PATA_UNK; + const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap); + + if (!gtm) + return ATA_CBL_PATA40; ata_for_each_dev(dev, &ap->link, ENABLED) { unsigned int xfer_mask, udma_mask; @@ -530,13 +534,17 @@ int ata_acpi_cbl_80wire(struct ata_port *ap, const struct ata_acpi_gtm *gtm) xfer_mask = ata_acpi_gtm_xfermask(dev, gtm); ata_unpack_xfermask(xfer_mask, NULL, NULL, &udma_mask); - if (udma_mask & ~ATA_UDMA_MASK_40C) - return 1; + ret = ATA_CBL_PATA40; + + if (udma_mask & ~ATA_UDMA_MASK_40C) { + ret = ATA_CBL_PATA80; + break; + } } - return 0; + return ret; } -EXPORT_SYMBOL_GPL(ata_acpi_cbl_80wire); +EXPORT_SYMBOL_GPL(ata_acpi_cbl_pata_type); static void ata_acpi_gtf_to_tf(struct ata_device *dev, const struct ata_acpi_gtf *gtf, diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c index d82728a01832b..bb80e7800dcbe 100644 --- a/drivers/ata/pata_via.c +++ b/drivers/ata/pata_via.c @@ -201,11 +201,9 @@ static int via_cable_detect(struct ata_port *ap) { two drives */ if (ata66 & (0x10100000 >> (16 * ap->port_no))) return ATA_CBL_PATA80; + /* Check with ACPI so we can spot BIOS reported SATA bridges */ - if (ata_acpi_init_gtm(ap) && - ata_acpi_cbl_80wire(ap, ata_acpi_init_gtm(ap))) - return ATA_CBL_PATA80; - return ATA_CBL_PATA40; + return ata_acpi_cbl_pata_type(ap); } static int via_pre_reset(struct ata_link *link, unsigned long deadline) diff --git a/include/linux/libata.h b/include/linux/libata.h index 79974a99265fc..2d3bfec568ebe 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -1366,7 +1366,7 @@ int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm); int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *stm); unsigned int ata_acpi_gtm_xfermask(struct ata_device *dev, const struct ata_acpi_gtm *gtm); -int ata_acpi_cbl_80wire(struct ata_port *ap, const struct ata_acpi_gtm *gtm); +int ata_acpi_cbl_pata_type(struct ata_port *ap); #else static inline const struct ata_acpi_gtm *ata_acpi_init_gtm(struct ata_port *ap) { @@ -1391,10 +1391,9 @@ static inline unsigned int ata_acpi_gtm_xfermask(struct ata_device *dev, return 0; } -static inline int ata_acpi_cbl_80wire(struct ata_port *ap, - const struct ata_acpi_gtm *gtm) +static inline int ata_acpi_cbl_pata_type(struct ata_port *ap) { - return 0; + return ATA_CBL_PATA40; } #endif -- GitLab From c24c06bd14f284458e5855614fb5575fca881365 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Fri, 6 Jun 2025 11:01:11 +0200 Subject: [PATCH 2030/2211] ata: pata_cs5536: fix build on 32-bit UML [ Upstream commit fe5b391fc56f77cf3c22a9dd4f0ce20db0e3533f ] On 32-bit ARCH=um, CONFIG_X86_32 is still defined, so it doesn't indicate building on real X86 machines. There's no MSR on UML though, so add a check for CONFIG_X86. Reported-by: Arnd Bergmann Signed-off-by: Johannes Berg Link: https://lore.kernel.org/r/20250606090110.15784-2-johannes@sipsolutions.net Signed-off-by: Niklas Cassel Signed-off-by: Sasha Levin --- drivers/ata/pata_cs5536.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ata/pata_cs5536.c b/drivers/ata/pata_cs5536.c index b811efd2cc346..73e81e160c91f 100644 --- a/drivers/ata/pata_cs5536.c +++ b/drivers/ata/pata_cs5536.c @@ -27,7 +27,7 @@ #include #include -#ifdef CONFIG_X86_32 +#if defined(CONFIG_X86) && defined(CONFIG_X86_32) #include static int use_msr; module_param_named(msr, use_msr, int, 0644); -- GitLab From f8155ee19ddcab6e0cd530bdb198b74aa3c85cd6 Mon Sep 17 00:00:00 2001 From: Gabriel Santese Date: Fri, 30 May 2025 02:52:32 +0200 Subject: [PATCH 2031/2211] ASoC: amd: yc: Add quirk for MSI Bravo 17 D7VF internal mic [ Upstream commit ba06528ad5a31923efc24324706116ccd17e12d8 ] MSI Bravo 17 (D7VF), like other laptops from the family, has broken ACPI tables and needs a quirk for internal mic to work properly. Signed-off-by: Gabriel Santese Link: https://patch.msgid.link/20250530005444.23398-1-santesegabriel@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/amd/yc/acp6x-mach.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sound/soc/amd/yc/acp6x-mach.c b/sound/soc/amd/yc/acp6x-mach.c index b27966f82c8b6..4f8481c6802b1 100644 --- a/sound/soc/amd/yc/acp6x-mach.c +++ b/sound/soc/amd/yc/acp6x-mach.c @@ -451,6 +451,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "Bravo 17 D7VEK"), } }, + { + .driver_data = &acp6x_card, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "Micro-Star International Co., Ltd."), + DMI_MATCH(DMI_PRODUCT_NAME, "Bravo 17 D7VF"), + } + }, { .driver_data = &acp6x_card, .matches = { -- GitLab From c584b9b62c0cfdb064b91395e96c6ba78f955dae Mon Sep 17 00:00:00 2001 From: Mario Limonciello Date: Wed, 11 Jun 2025 15:33:40 -0500 Subject: [PATCH 2032/2211] platform/x86/amd/pmc: Add PCSpecialist Lafite Pro V 14M to 8042 quirks list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 9ba75ccad85708c5a484637dccc1fc59295b0a83 ] Every other s2idle cycle fails to reach hardware sleep when keyboard wakeup is enabled. This appears to be an EC bug, but the vendor refuses to fix it. It was confirmed that turning off i8042 wakeup avoids ths issue (albeit keyboard wakeup is disabled). Take the lesser of two evils and add it to the i8042 quirk list. Reported-by: Raoul Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220116 Tested-by: Raoul Signed-off-by: Mario Limonciello Link: https://lore.kernel.org/r/20250611203341.3733478-1-superm1@kernel.org Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen Signed-off-by: Sasha Levin --- drivers/platform/x86/amd/pmc/pmc-quirks.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/platform/x86/amd/pmc/pmc-quirks.c b/drivers/platform/x86/amd/pmc/pmc-quirks.c index 2e3f6fc67c568..7ed12c1d3b34c 100644 --- a/drivers/platform/x86/amd/pmc/pmc-quirks.c +++ b/drivers/platform/x86/amd/pmc/pmc-quirks.c @@ -224,6 +224,15 @@ static const struct dmi_system_id fwbug_list[] = { DMI_MATCH(DMI_BOARD_NAME, "WUJIE14-GX4HRXL"), } }, + /* https://bugzilla.kernel.org/show_bug.cgi?id=220116 */ + { + .ident = "PCSpecialist Lafite Pro V 14M", + .driver_data = &quirk_spurious_8042, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "PCSpecialist"), + DMI_MATCH(DMI_PRODUCT_NAME, "Lafite Pro V 14M"), + } + }, {} }; -- GitLab From 19bd7597858dd15802c1d99fcc38e528f469080a Mon Sep 17 00:00:00 2001 From: Gyeyoung Baek Date: Thu, 12 Jun 2025 21:48:27 +0900 Subject: [PATCH 2033/2211] genirq/irq_sim: Initialize work context pointers properly [ Upstream commit 8a2277a3c9e4cc5398f80821afe7ecbe9bdf2819 ] Initialize `ops` member's pointers properly by using kzalloc() instead of kmalloc() when allocating the simulation work context. Otherwise the pointers contain random content leading to invalid dereferencing. Signed-off-by: Gyeyoung Baek Signed-off-by: Thomas Gleixner Link: https://lore.kernel.org/all/20250612124827.63259-1-gye976@gmail.com Signed-off-by: Sasha Levin --- kernel/irq/irq_sim.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/irq/irq_sim.c b/kernel/irq/irq_sim.c index 1a3d483548e2f..ae4c9cbd1b4b9 100644 --- a/kernel/irq/irq_sim.c +++ b/kernel/irq/irq_sim.c @@ -202,7 +202,7 @@ struct irq_domain *irq_domain_create_sim_full(struct fwnode_handle *fwnode, void *data) { struct irq_sim_work_ctx *work_ctx __free(kfree) = - kmalloc(sizeof(*work_ctx), GFP_KERNEL); + kzalloc(sizeof(*work_ctx), GFP_KERNEL); if (!work_ctx) return ERR_PTR(-ENOMEM); -- GitLab From 39e36a744ec3c221902d0f59f74ddc6bbaf2d217 Mon Sep 17 00:00:00 2001 From: Madhavan Srinivasan Date: Sat, 17 May 2025 19:52:37 +0530 Subject: [PATCH 2034/2211] powerpc: Fix struct termio related ioctl macros [ Upstream commit ab107276607af90b13a5994997e19b7b9731e251 ] Since termio interface is now obsolete, include/uapi/asm/ioctls.h has some constant macros referring to "struct termio", this caused build failure at userspace. In file included from /usr/include/asm/ioctl.h:12, from /usr/include/asm/ioctls.h:5, from tst-ioctls.c:3: tst-ioctls.c: In function 'get_TCGETA': tst-ioctls.c:12:10: error: invalid application of 'sizeof' to incomplete type 'struct termio' 12 | return TCGETA; | ^~~~~~ Even though termios.h provides "struct termio", trying to juggle definitions around to make it compile could introduce regressions. So better to open code it. Reported-by: Tulio Magno Suggested-by: Nicholas Piggin Tested-by: Justin M. Forbes Reviewed-by: Michael Ellerman Closes: https://lore.kernel.org/linuxppc-dev/8734dji5wl.fsf@ascii.art.br/ Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/20250517142237.156665-1-maddy@linux.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/include/uapi/asm/ioctls.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/powerpc/include/uapi/asm/ioctls.h b/arch/powerpc/include/uapi/asm/ioctls.h index 2c145da3b774a..b5211e413829a 100644 --- a/arch/powerpc/include/uapi/asm/ioctls.h +++ b/arch/powerpc/include/uapi/asm/ioctls.h @@ -23,10 +23,10 @@ #define TCSETSW _IOW('t', 21, struct termios) #define TCSETSF _IOW('t', 22, struct termios) -#define TCGETA _IOR('t', 23, struct termio) -#define TCSETA _IOW('t', 24, struct termio) -#define TCSETAW _IOW('t', 25, struct termio) -#define TCSETAF _IOW('t', 28, struct termio) +#define TCGETA 0x40147417 /* _IOR('t', 23, struct termio) */ +#define TCSETA 0x80147418 /* _IOW('t', 24, struct termio) */ +#define TCSETAW 0x80147419 /* _IOW('t', 25, struct termio) */ +#define TCSETAF 0x8014741c /* _IOW('t', 28, struct termio) */ #define TCSBRK _IO('t', 29) #define TCXONC _IO('t', 30) -- GitLab From 2ec1cc322a013bcc067d4844c2d6e8a11ff5b627 Mon Sep 17 00:00:00 2001 From: Raven Black Date: Fri, 13 Jun 2025 07:51:25 -0400 Subject: [PATCH 2035/2211] ASoC: amd: yc: update quirk data for HP Victus [ Upstream commit 13b86ea92ebf0fa587fbadfb8a60ca2e9993203f ] Make the internal microphone work on HP Victus laptops. Signed-off-by: Raven Black Link: https://patch.msgid.link/20250613-support-hp-victus-microphone-v1-1-bebc4c3a2041@gmail.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/amd/yc/acp6x-mach.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sound/soc/amd/yc/acp6x-mach.c b/sound/soc/amd/yc/acp6x-mach.c index 4f8481c6802b1..723cb7bc12851 100644 --- a/sound/soc/amd/yc/acp6x-mach.c +++ b/sound/soc/amd/yc/acp6x-mach.c @@ -521,6 +521,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "OMEN by HP Gaming Laptop 16z-n000"), } }, + { + .driver_data = &acp6x_card, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "HP"), + DMI_MATCH(DMI_PRODUCT_NAME, "Victus by HP Gaming Laptop 15-fb2xxx"), + } + }, { .driver_data = &acp6x_card, .matches = { -- GitLab From 3d546c8b1070036d69b7f35ddf885bacab2a605a Mon Sep 17 00:00:00 2001 From: Heiko Stuebner Date: Fri, 6 Jun 2025 21:04:18 +0200 Subject: [PATCH 2036/2211] regulator: fan53555: add enable_time support and soft-start times [ Upstream commit 8acfb165a492251a08a22a4fa6497a131e8c2609 ] The datasheets for all the fan53555 variants (and clones using the same interface) define so called soft start times, from enabling the regulator until at least some percentage of the output (i.e. 92% for the rk860x types) are available. The regulator framework supports this with the enable_time property but currently the fan53555 driver does not define enable_times for any variant. I ran into a problem with this while testing the new driver for the Rockchip NPUs (rocket), which does runtime-pm including disabling and enabling a rk8602 as needed. When reenabling the regulator while running a load, fatal hangs could be observed while enabling the associated power-domain, which the regulator supplies. Experimentally setting the regulator to always-on, made the issue disappear, leading to the missing delay to let power stabilize. And as expected, setting the enable-time to a non-zero value according to the datasheet also resolved the regulator-issue. The datasheets in nearly all cases only specify "typical" values, except for the fan53555 type 08. There both a typical and maximum value are listed - 40uS apart. For all typical values I've added 100uS to be on the safe side. Individual details for the relevant regulators below: - fan53526: The datasheet for all variants lists a typical value of 150uS, so make that 250uS with safety margin. - fan53555: types 08 and 18 (unsupported) are given a typical enable time of 135uS but also a maximum of 175uS so use that value. All the other types only have a typical time in the datasheet of 300uS, so give a bit margin by setting it to 400uS. - rk8600 + rk8602: Datasheet reports a typical value of 260us, so use 360uS to be safe. - syr82x + syr83x: All datasheets report typical soft-start values of 300uS for these regulators, so use 400uS. - tcs452x: Datasheet sadly does not report a soft-start time, so I've not set an enable-time Signed-off-by: Heiko Stuebner Link: https://patch.msgid.link/20250606190418.478633-1-heiko@sntech.de Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/regulator/fan53555.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/regulator/fan53555.c b/drivers/regulator/fan53555.c index bd9447dac5967..c282236959b18 100644 --- a/drivers/regulator/fan53555.c +++ b/drivers/regulator/fan53555.c @@ -147,6 +147,7 @@ struct fan53555_device_info { unsigned int slew_mask; const unsigned int *ramp_delay_table; unsigned int n_ramp_values; + unsigned int enable_time; unsigned int slew_rate; }; @@ -282,6 +283,7 @@ static int fan53526_voltages_setup_fairchild(struct fan53555_device_info *di) di->slew_mask = CTL_SLEW_MASK; di->ramp_delay_table = slew_rates; di->n_ramp_values = ARRAY_SIZE(slew_rates); + di->enable_time = 250; di->vsel_count = FAN53526_NVOLTAGES; return 0; @@ -296,10 +298,12 @@ static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di) case FAN53555_CHIP_REV_00: di->vsel_min = 600000; di->vsel_step = 10000; + di->enable_time = 400; break; case FAN53555_CHIP_REV_13: di->vsel_min = 800000; di->vsel_step = 10000; + di->enable_time = 400; break; default: dev_err(di->dev, @@ -311,13 +315,19 @@ static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di) case FAN53555_CHIP_ID_01: case FAN53555_CHIP_ID_03: case FAN53555_CHIP_ID_05: + di->vsel_min = 600000; + di->vsel_step = 10000; + di->enable_time = 400; + break; case FAN53555_CHIP_ID_08: di->vsel_min = 600000; di->vsel_step = 10000; + di->enable_time = 175; break; case FAN53555_CHIP_ID_04: di->vsel_min = 603000; di->vsel_step = 12826; + di->enable_time = 400; break; default: dev_err(di->dev, @@ -350,6 +360,7 @@ static int fan53555_voltages_setup_rockchip(struct fan53555_device_info *di) di->slew_mask = CTL_SLEW_MASK; di->ramp_delay_table = slew_rates; di->n_ramp_values = ARRAY_SIZE(slew_rates); + di->enable_time = 360; di->vsel_count = FAN53555_NVOLTAGES; return 0; @@ -372,6 +383,7 @@ static int rk8602_voltages_setup_rockchip(struct fan53555_device_info *di) di->slew_mask = CTL_SLEW_MASK; di->ramp_delay_table = slew_rates; di->n_ramp_values = ARRAY_SIZE(slew_rates); + di->enable_time = 360; di->vsel_count = RK8602_NVOLTAGES; return 0; @@ -395,6 +407,7 @@ static int fan53555_voltages_setup_silergy(struct fan53555_device_info *di) di->slew_mask = CTL_SLEW_MASK; di->ramp_delay_table = slew_rates; di->n_ramp_values = ARRAY_SIZE(slew_rates); + di->enable_time = 400; di->vsel_count = FAN53555_NVOLTAGES; return 0; @@ -594,6 +607,7 @@ static int fan53555_regulator_register(struct fan53555_device_info *di, rdesc->ramp_mask = di->slew_mask; rdesc->ramp_delay_table = di->ramp_delay_table; rdesc->n_ramp_values = di->n_ramp_values; + rdesc->enable_time = di->enable_time; rdesc->owner = THIS_MODULE; rdev = devm_regulator_register(di->dev, &di->desc, config); -- GitLab From 7296c938df2445f342be456a6ff0b3931d97f4e5 Mon Sep 17 00:00:00 2001 From: Maurizio Lombardi Date: Thu, 12 Jun 2025 12:15:56 +0200 Subject: [PATCH 2037/2211] scsi: target: Fix NULL pointer dereference in core_scsi3_decode_spec_i_port() [ Upstream commit d8ab68bdb294b09a761e967dad374f2965e1913f ] The function core_scsi3_decode_spec_i_port(), in its error code path, unconditionally calls core_scsi3_lunacl_undepend_item() passing the dest_se_deve pointer, which may be NULL. This can lead to a NULL pointer dereference if dest_se_deve remains unset. SPC-3 PR SPEC_I_PT: Unable to locate dest_tpg Unable to handle kernel paging request at virtual address dfff800000000012 Call trace: core_scsi3_lunacl_undepend_item+0x2c/0xf0 [target_core_mod] (P) core_scsi3_decode_spec_i_port+0x120c/0x1c30 [target_core_mod] core_scsi3_emulate_pro_register+0x6b8/0xcd8 [target_core_mod] target_scsi3_emulate_pr_out+0x56c/0x840 [target_core_mod] Fix this by adding a NULL check before calling core_scsi3_lunacl_undepend_item() Signed-off-by: Maurizio Lombardi Link: https://lore.kernel.org/r/20250612101556.24829-1-mlombard@redhat.com Reviewed-by: Mike Christie Reviewed-by: John Meneghini Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/target/target_core_pr.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index 4f4ad6af416c8..47fe50b80c229 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c @@ -1842,7 +1842,9 @@ out: } kmem_cache_free(t10_pr_reg_cache, dest_pr_reg); - core_scsi3_lunacl_undepend_item(dest_se_deve); + + if (dest_se_deve) + core_scsi3_lunacl_undepend_item(dest_se_deve); if (is_local) continue; -- GitLab From 3e554f115374a17ffde62de76450c3ad8380f16b Mon Sep 17 00:00:00 2001 From: Justin Sanders Date: Tue, 10 Jun 2025 17:06:00 +0000 Subject: [PATCH 2038/2211] aoe: defer rexmit timer downdev work to workqueue [ Upstream commit cffc873d68ab09a0432b8212008c5613f8a70a2c ] When aoe's rexmit_timer() notices that an aoe target fails to respond to commands for more than aoe_deadsecs, it calls aoedev_downdev() which cleans the outstanding aoe and block queues. This can involve sleeping, such as in blk_mq_freeze_queue(), which should not occur in irq context. This patch defers that aoedev_downdev() call to the aoe device's workqueue. Link: https://bugzilla.kernel.org/show_bug.cgi?id=212665 Signed-off-by: Justin Sanders Link: https://lore.kernel.org/r/20250610170600.869-2-jsanders.devel@gmail.com Tested-By: Valentin Kleibel Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/block/aoe/aoe.h | 1 + drivers/block/aoe/aoecmd.c | 8 ++++++-- drivers/block/aoe/aoedev.c | 5 ++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/block/aoe/aoe.h b/drivers/block/aoe/aoe.h index 749ae1246f4cf..d35caa3c69e15 100644 --- a/drivers/block/aoe/aoe.h +++ b/drivers/block/aoe/aoe.h @@ -80,6 +80,7 @@ enum { DEVFL_NEWSIZE = (1<<6), /* need to update dev size in block layer */ DEVFL_FREEING = (1<<7), /* set when device is being cleaned up */ DEVFL_FREED = (1<<8), /* device has been cleaned up */ + DEVFL_DEAD = (1<<9), /* device has timed out of aoe_deadsecs */ }; enum { diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index 92b06d1de4cc7..6c94cfd1c480e 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c @@ -754,7 +754,7 @@ rexmit_timer(struct timer_list *timer) utgts = count_targets(d, NULL); - if (d->flags & DEVFL_TKILL) { + if (d->flags & (DEVFL_TKILL | DEVFL_DEAD)) { spin_unlock_irqrestore(&d->lock, flags); return; } @@ -786,7 +786,8 @@ rexmit_timer(struct timer_list *timer) * to clean up. */ list_splice(&flist, &d->factive[0]); - aoedev_downdev(d); + d->flags |= DEVFL_DEAD; + queue_work(aoe_wq, &d->work); goto out; } @@ -898,6 +899,9 @@ aoecmd_sleepwork(struct work_struct *work) { struct aoedev *d = container_of(work, struct aoedev, work); + if (d->flags & DEVFL_DEAD) + aoedev_downdev(d); + if (d->flags & DEVFL_GDALLOC) aoeblk_gdalloc(d); diff --git a/drivers/block/aoe/aoedev.c b/drivers/block/aoe/aoedev.c index 280679bde3a50..4240e11adfb76 100644 --- a/drivers/block/aoe/aoedev.c +++ b/drivers/block/aoe/aoedev.c @@ -200,8 +200,11 @@ aoedev_downdev(struct aoedev *d) struct list_head *head, *pos, *nx; struct request *rq, *rqnext; int i; + unsigned long flags; - d->flags &= ~DEVFL_UP; + spin_lock_irqsave(&d->lock, flags); + d->flags &= ~(DEVFL_UP | DEVFL_DEAD); + spin_unlock_irqrestore(&d->lock, flags); /* clean out active and to-be-retransmitted buffers */ for (i = 0; i < NFACTIVE; i++) { -- GitLab From 1b10265639995208d244e02ea54d942c552687ea Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Mon, 16 Jun 2025 17:18:38 +0200 Subject: [PATCH 2039/2211] wifi: mac80211: drop invalid source address OCB frames [ Upstream commit d1b1a5eb27c4948e8811cf4dbb05aaf3eb10700c ] In OCB, don't accept frames from invalid source addresses (and in particular don't try to create stations for them), drop the frames instead. Reported-by: syzbot+8b512026a7ec10dcbdd9@syzkaller.appspotmail.com Closes: https://lore.kernel.org/r/6788d2d9.050a0220.20d369.0028.GAE@google.com/ Signed-off-by: Johannes Berg Tested-by: syzbot+8b512026a7ec10dcbdd9@syzkaller.appspotmail.com Link: https://patch.msgid.link/20250616171838.7433379cab5d.I47444d63c72a0bd58d2e2b67bb99e1fea37eec6f@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- net/mac80211/rx.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 8e1fbdd3bff10..8e1d00efa62e5 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -4481,6 +4481,10 @@ static bool ieee80211_accept_frame(struct ieee80211_rx_data *rx) if (!multicast && !ether_addr_equal(sdata->dev->dev_addr, hdr->addr1)) return false; + /* reject invalid/our STA address */ + if (!is_valid_ether_addr(hdr->addr2) || + ether_addr_equal(sdata->dev->dev_addr, hdr->addr2)) + return false; if (!rx->sta) { int rate_idx; if (status->encoding != RX_ENC_LEGACY) -- GitLab From 327997afbb5e62532c28c1861ab5534c01969c9a Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Tue, 17 Jun 2025 11:45:29 +0200 Subject: [PATCH 2040/2211] wifi: ath6kl: remove WARN on bad firmware input [ Upstream commit e7417421d89358da071fd2930f91e67c7128fbff ] If the firmware gives bad input, that's nothing to do with the driver's stack at this point etc., so the WARN_ON() doesn't add any value. Additionally, this is one of the top syzbot reports now. Just print a message, and as an added bonus, print the sizes too. Reported-by: syzbot+92c6dd14aaa230be6855@syzkaller.appspotmail.com Tested-by: syzbot+92c6dd14aaa230be6855@syzkaller.appspotmail.com Acked-by: Jeff Johnson Link: https://patch.msgid.link/20250617114529.031a677a348e.I58bf1eb4ac16a82c546725ff010f3f0d2b0cca49@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath6kl/bmi.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath6kl/bmi.c b/drivers/net/wireless/ath/ath6kl/bmi.c index af98e871199d3..5a9e93fd1ef42 100644 --- a/drivers/net/wireless/ath/ath6kl/bmi.c +++ b/drivers/net/wireless/ath/ath6kl/bmi.c @@ -87,7 +87,9 @@ int ath6kl_bmi_get_target_info(struct ath6kl *ar, * We need to do some backwards compatibility to make this work. */ if (le32_to_cpu(targ_info->byte_count) != sizeof(*targ_info)) { - WARN_ON(1); + ath6kl_err("mismatched byte count %d vs. expected %zd\n", + le32_to_cpu(targ_info->byte_count), + sizeof(*targ_info)); return -EINVAL; } -- GitLab From 18ff4ed6a33a7e3f2097710eacc96bea7696e803 Mon Sep 17 00:00:00 2001 From: "Rafael J. Wysocki" Date: Wed, 18 Jun 2025 14:17:45 +0200 Subject: [PATCH 2041/2211] ACPICA: Refuse to evaluate a method if arguments are missing [ Upstream commit 6fcab2791543924d438e7fa49276d0998b0a069f ] As reported in [1], a platform firmware update that increased the number of method parameters and forgot to update a least one of its callers, caused ACPICA to crash due to use-after-free. Since this a result of a clear AML issue that arguably cannot be fixed up by the interpreter (it cannot produce missing data out of thin air), address it by making ACPICA refuse to evaluate a method if the caller attempts to pass fewer arguments than expected to it. Closes: https://github.com/acpica/acpica/issues/1027 [1] Reported-by: Peter Williams Signed-off-by: Rafael J. Wysocki Reviewed-by: Hans de Goede Tested-by: Hans de Goede # Dell XPS 9640 with BIOS 1.12.0 Link: https://patch.msgid.link/5909446.DvuYhMxLoT@rjwysocki.net Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/acpica/dsmethod.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/acpi/acpica/dsmethod.c b/drivers/acpi/acpica/dsmethod.c index e809c2aed78ae..a232746d150a7 100644 --- a/drivers/acpi/acpica/dsmethod.c +++ b/drivers/acpi/acpica/dsmethod.c @@ -483,6 +483,13 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, return_ACPI_STATUS(AE_NULL_OBJECT); } + if (this_walk_state->num_operands < obj_desc->method.param_count) { + ACPI_ERROR((AE_INFO, "Missing argument for method [%4.4s]", + acpi_ut_get_node_name(method_node))); + + return_ACPI_STATUS(AE_AML_UNINITIALIZED_ARG); + } + /* Init for new method, possibly wait on method mutex */ status = -- GitLab From c40b207cafd006c610832ba52a81cedee77adcb9 Mon Sep 17 00:00:00 2001 From: Pablo Martin-Gomez Date: Wed, 18 Jun 2025 13:35:16 +0200 Subject: [PATCH 2042/2211] mtd: spinand: fix memory leak of ECC engine conf [ Upstream commit 6463cbe08b0cbf9bba8763306764f5fd643023e1 ] Memory allocated for the ECC engine conf is not released during spinand cleanup. Below kmemleak trace is seen for this memory leak: unreferenced object 0xffffff80064f00e0 (size 8): comm "swapper/0", pid 1, jiffies 4294937458 hex dump (first 8 bytes): 00 00 00 00 00 00 00 00 ........ backtrace (crc 0): kmemleak_alloc+0x30/0x40 __kmalloc_cache_noprof+0x208/0x3c0 spinand_ondie_ecc_init_ctx+0x114/0x200 nand_ecc_init_ctx+0x70/0xa8 nanddev_ecc_engine_init+0xec/0x27c spinand_probe+0xa2c/0x1620 spi_mem_probe+0x130/0x21c spi_probe+0xf0/0x170 really_probe+0x17c/0x6e8 __driver_probe_device+0x17c/0x21c driver_probe_device+0x58/0x180 __device_attach_driver+0x15c/0x1f8 bus_for_each_drv+0xec/0x150 __device_attach+0x188/0x24c device_initial_probe+0x10/0x20 bus_probe_device+0x11c/0x160 Fix the leak by calling nanddev_ecc_engine_cleanup() inside spinand_cleanup(). Signed-off-by: Pablo Martin-Gomez Signed-off-by: Miquel Raynal Signed-off-by: Sasha Levin --- drivers/mtd/nand/spi/core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index 4d76f9f71a0e9..241f6a4df16c1 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -1496,6 +1496,7 @@ static void spinand_cleanup(struct spinand_device *spinand) { struct nand_device *nand = spinand_to_nand(spinand); + nanddev_ecc_engine_cleanup(nand); nanddev_cleanup(nand); spinand_manufacturer_cleanup(spinand); kfree(spinand->databuf); -- GitLab From 42c5a4b47d4a1959d564f4ad1fea59bbb28eae1d Mon Sep 17 00:00:00 2001 From: "Uladzislau Rezki (Sony)" Date: Tue, 10 Jun 2025 19:34:48 +0200 Subject: [PATCH 2043/2211] rcu: Return early if callback is not specified [ Upstream commit 33b6a1f155d627f5bd80c7485c598ce45428f74f ] Currently the call_rcu() API does not check whether a callback pointer is NULL. If NULL is passed, rcu_core() will try to invoke it, resulting in NULL pointer dereference and a kernel crash. To prevent this and improve debuggability, this patch adds a check for NULL and emits a kernel stack trace to help identify a faulty caller. Signed-off-by: Uladzislau Rezki (Sony) Reviewed-by: Joel Fernandes Signed-off-by: Joel Fernandes Signed-off-by: Sasha Levin --- kernel/rcu/tree.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index cefa831c8cb32..552464dcffe27 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -3076,6 +3076,10 @@ __call_rcu_common(struct rcu_head *head, rcu_callback_t func, bool lazy_in) /* Misaligned rcu_head! */ WARN_ON_ONCE((unsigned long)head & (sizeof(void *) - 1)); + /* Avoid NULL dereference if callback is NULL. */ + if (WARN_ON_ONCE(!func)) + return; + if (debug_rcu_head_queue(head)) { /* * Probable double call_rcu(), so leak the callback. -- GitLab From e036efbe5822dd679e475432743c32dbe4bd63a6 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 23 Jan 2025 22:51:04 -0500 Subject: [PATCH 2044/2211] add a string-to-qstr constructor [ Upstream commit c1feab95e0b2e9fce7e4f4b2739baf40d84543af ] Quite a few places want to build a struct qstr by given string; it would be convenient to have a primitive doing that, rather than open-coding it via QSTR_INIT(). The closest approximation was in bcachefs, but that expands to initializer list - {.len = strlen(string), .name = string}. It would be more useful to have it as compound literal - (struct qstr){.len = strlen(string), .name = string}. Unlike initializer list it's a valid expression. What's more, it's a valid lvalue - it's an equivalent of anonymous local variable with such initializer, so the things like path->dentry = d_alloc_pseudo(mnt->mnt_sb, &QSTR(name)); are valid. It can also be used as initializer, with identical effect - struct qstr x = (struct qstr){.name = s, .len = strlen(s)}; is equivalent to struct qstr anon_variable = {.name = s, .len = strlen(s)}; struct qstr x = anon_variable; // anon_variable is never used after that point and any even remotely sane compiler will manage to collapse that into struct qstr x = {.name = s, .len = strlen(s)}; What compound literals can't be used for is initialization of global variables, but those are covered by QSTR_INIT(). This commit lifts definition(s) of QSTR() into linux/dcache.h, converts it to compound literal (all bcachefs users are fine with that) and converts assorted open-coded instances to using that. Signed-off-by: Al Viro Stable-dep-of: cbe4134ea4bc ("fs: export anon_inode_make_secure_inode() and fix secretmem LSM bypass") Signed-off-by: Sasha Levin --- fs/anon_inodes.c | 4 ++-- fs/bcachefs/fsck.c | 2 +- fs/bcachefs/recovery.c | 2 -- fs/bcachefs/util.h | 2 -- fs/erofs/xattr.c | 2 +- fs/file_table.c | 4 +--- fs/kernfs/file.c | 2 +- include/linux/dcache.h | 1 + mm/secretmem.c | 3 +-- net/sunrpc/rpc_pipe.c | 14 +++++--------- 10 files changed, 13 insertions(+), 23 deletions(-) diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index 42bd1cb7c9cdd..583ac81669c24 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c @@ -60,14 +60,14 @@ static struct inode *anon_inode_make_secure_inode( const struct inode *context_inode) { struct inode *inode; - const struct qstr qname = QSTR_INIT(name, strlen(name)); int error; inode = alloc_anon_inode(anon_inode_mnt->mnt_sb); if (IS_ERR(inode)) return inode; inode->i_flags &= ~S_PRIVATE; - error = security_inode_init_security_anon(inode, &qname, context_inode); + error = security_inode_init_security_anon(inode, &QSTR(name), + context_inode); if (error) { iput(inode); return ERR_PTR(error); diff --git a/fs/bcachefs/fsck.c b/fs/bcachefs/fsck.c index 75c8a97a6954c..7b3b63ed747cf 100644 --- a/fs/bcachefs/fsck.c +++ b/fs/bcachefs/fsck.c @@ -405,7 +405,7 @@ static int reattach_inode(struct btree_trans *trans, struct bch_inode_unpacked * return ret; struct bch_hash_info dir_hash = bch2_hash_info_init(c, &lostfound); - struct qstr name = (struct qstr) QSTR(name_buf); + struct qstr name = QSTR(name_buf); inode->bi_dir = lostfound.bi_inum; diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c index 3c7f941dde39a..ebabba2968821 100644 --- a/fs/bcachefs/recovery.c +++ b/fs/bcachefs/recovery.c @@ -32,8 +32,6 @@ #include #include -#define QSTR(n) { { { .len = strlen(n) } }, .name = n } - void bch2_btree_lost_data(struct bch_fs *c, enum btree_id btree) { if (btree >= BTREE_ID_NR_MAX) diff --git a/fs/bcachefs/util.h b/fs/bcachefs/util.h index fb02c1c360044..a27f4b84fe775 100644 --- a/fs/bcachefs/util.h +++ b/fs/bcachefs/util.h @@ -647,8 +647,6 @@ static inline int cmp_le32(__le32 l, __le32 r) #include -#define QSTR(n) { { { .len = strlen(n) } }, .name = n } - static inline bool qstr_eq(const struct qstr l, const struct qstr r) { return l.len == r.len && !memcmp(l.name, r.name, l.len); diff --git a/fs/erofs/xattr.c b/fs/erofs/xattr.c index a90d7d6497390..60d2cf26e837e 100644 --- a/fs/erofs/xattr.c +++ b/fs/erofs/xattr.c @@ -407,7 +407,7 @@ int erofs_getxattr(struct inode *inode, int index, const char *name, } it.index = index; - it.name = (struct qstr)QSTR_INIT(name, strlen(name)); + it.name = QSTR(name); if (it.name.len > EROFS_NAME_LEN) return -ERANGE; diff --git a/fs/file_table.c b/fs/file_table.c index 18735dc8269a1..cf3422edf737c 100644 --- a/fs/file_table.c +++ b/fs/file_table.c @@ -332,9 +332,7 @@ static struct file *alloc_file(const struct path *path, int flags, static inline int alloc_path_pseudo(const char *name, struct inode *inode, struct vfsmount *mnt, struct path *path) { - struct qstr this = QSTR_INIT(name, strlen(name)); - - path->dentry = d_alloc_pseudo(mnt->mnt_sb, &this); + path->dentry = d_alloc_pseudo(mnt->mnt_sb, &QSTR(name)); if (!path->dentry) return -ENOMEM; path->mnt = mntget(mnt); diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c index 1943c8bd479bf..2d9d5dfa19b87 100644 --- a/fs/kernfs/file.c +++ b/fs/kernfs/file.c @@ -928,7 +928,7 @@ repeat: if (!inode) continue; - name = (struct qstr)QSTR_INIT(kn->name, strlen(kn->name)); + name = QSTR(kn->name); parent = kernfs_get_parent(kn); if (parent) { p_inode = ilookup(info->sb, kernfs_ino(parent)); diff --git a/include/linux/dcache.h b/include/linux/dcache.h index bff956f7b2b98..3d53a60145911 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -57,6 +57,7 @@ struct qstr { }; #define QSTR_INIT(n,l) { { { .len = l } }, .name = n } +#define QSTR(n) (struct qstr)QSTR_INIT(n, strlen(n)) extern const struct qstr empty_name; extern const struct qstr slash_name; diff --git a/mm/secretmem.c b/mm/secretmem.c index 399552814fd0f..1b0a214ee5580 100644 --- a/mm/secretmem.c +++ b/mm/secretmem.c @@ -195,14 +195,13 @@ static struct file *secretmem_file_create(unsigned long flags) struct file *file; struct inode *inode; const char *anon_name = "[secretmem]"; - const struct qstr qname = QSTR_INIT(anon_name, strlen(anon_name)); int err; inode = alloc_anon_inode(secretmem_mnt->mnt_sb); if (IS_ERR(inode)) return ERR_CAST(inode); - err = security_inode_init_security_anon(inode, &qname, NULL); + err = security_inode_init_security_anon(inode, &QSTR(anon_name), NULL); if (err) { file = ERR_PTR(err); goto err_free_inode; diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 7ce3721c06ca5..eadc00410ebc5 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c @@ -630,7 +630,7 @@ static int __rpc_rmpipe(struct inode *dir, struct dentry *dentry) static struct dentry *__rpc_lookup_create_exclusive(struct dentry *parent, const char *name) { - struct qstr q = QSTR_INIT(name, strlen(name)); + struct qstr q = QSTR(name); struct dentry *dentry = d_hash_and_lookup(parent, &q); if (!dentry) { dentry = d_alloc(parent, &q); @@ -1190,8 +1190,7 @@ static const struct rpc_filelist files[] = { struct dentry *rpc_d_lookup_sb(const struct super_block *sb, const unsigned char *dir_name) { - struct qstr dir = QSTR_INIT(dir_name, strlen(dir_name)); - return d_hash_and_lookup(sb->s_root, &dir); + return d_hash_and_lookup(sb->s_root, &QSTR(dir_name)); } EXPORT_SYMBOL_GPL(rpc_d_lookup_sb); @@ -1300,11 +1299,9 @@ rpc_gssd_dummy_populate(struct dentry *root, struct rpc_pipe *pipe_data) struct dentry *gssd_dentry; struct dentry *clnt_dentry = NULL; struct dentry *pipe_dentry = NULL; - struct qstr q = QSTR_INIT(files[RPCAUTH_gssd].name, - strlen(files[RPCAUTH_gssd].name)); /* We should never get this far if "gssd" doesn't exist */ - gssd_dentry = d_hash_and_lookup(root, &q); + gssd_dentry = d_hash_and_lookup(root, &QSTR(files[RPCAUTH_gssd].name)); if (!gssd_dentry) return ERR_PTR(-ENOENT); @@ -1314,9 +1311,8 @@ rpc_gssd_dummy_populate(struct dentry *root, struct rpc_pipe *pipe_data) goto out; } - q.name = gssd_dummy_clnt_dir[0].name; - q.len = strlen(gssd_dummy_clnt_dir[0].name); - clnt_dentry = d_hash_and_lookup(gssd_dentry, &q); + clnt_dentry = d_hash_and_lookup(gssd_dentry, + &QSTR(gssd_dummy_clnt_dir[0].name)); if (!clnt_dentry) { __rpc_depopulate(gssd_dentry, gssd_dummy_clnt_dir, 0, 1); pipe_dentry = ERR_PTR(-ENOENT); -- GitLab From cdd9862252a0dd54a0f8e78ea63a9ace3c137db1 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Fri, 2 May 2025 16:12:09 +0200 Subject: [PATCH 2045/2211] module: Provide EXPORT_SYMBOL_GPL_FOR_MODULES() helper [ Upstream commit 707f853d7fa3ce323a6875487890c213e34d81a0 ] Helper macro to more easily limit the export of a symbol to a given list of modules. Eg: EXPORT_SYMBOL_GPL_FOR_MODULES(preempt_notifier_inc, "kvm"); will limit the use of said function to kvm.ko, any other module trying to use this symbol will refure to load (and get modpost build failures). Requested-by: Masahiro Yamada Requested-by: Christoph Hellwig Signed-off-by: Peter Zijlstra Reviewed-by: Petr Pavlu Signed-off-by: Masahiro Yamada Stable-dep-of: cbe4134ea4bc ("fs: export anon_inode_make_secure_inode() and fix secretmem LSM bypass") Signed-off-by: Sasha Levin --- Documentation/core-api/symbol-namespaces.rst | 22 ++++++++++++++++++++ include/linux/export.h | 12 +++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/Documentation/core-api/symbol-namespaces.rst b/Documentation/core-api/symbol-namespaces.rst index d1154eb438101..cca94469fa414 100644 --- a/Documentation/core-api/symbol-namespaces.rst +++ b/Documentation/core-api/symbol-namespaces.rst @@ -28,6 +28,9 @@ kernel. As of today, modules that make use of symbols exported into namespaces, are required to import the namespace. Otherwise the kernel will, depending on its configuration, reject loading the module or warn about a missing import. +Additionally, it is possible to put symbols into a module namespace, strictly +limiting which modules are allowed to use these symbols. + 2. How to define Symbol Namespaces ================================== @@ -84,6 +87,22 @@ unit as preprocessor statement. The above example would then read:: within the corresponding compilation unit before any EXPORT_SYMBOL macro is used. +2.3 Using the EXPORT_SYMBOL_GPL_FOR_MODULES() macro +=================================================== + +Symbols exported using this macro are put into a module namespace. This +namespace cannot be imported. + +The macro takes a comma separated list of module names, allowing only those +modules to access this symbol. Simple tail-globs are supported. + +For example: + + EXPORT_SYMBOL_GPL_FOR_MODULES(preempt_notifier_inc, "kvm,kvm-*") + +will limit usage of this symbol to modules whoes name matches the given +patterns. + 3. How to use Symbols exported in Namespaces ============================================ @@ -155,3 +174,6 @@ in-tree modules:: You can also run nsdeps for external module builds. A typical usage is:: $ make -C M=$PWD nsdeps + +Note: it will happily generate an import statement for the module namespace; +which will not work and generates build and runtime failures. diff --git a/include/linux/export.h b/include/linux/export.h index 1e04dbc675c2f..b40ae79b767da 100644 --- a/include/linux/export.h +++ b/include/linux/export.h @@ -24,11 +24,17 @@ .long sym #endif -#define ___EXPORT_SYMBOL(sym, license, ns) \ +/* + * LLVM integrated assembler cam merge adjacent string literals (like + * C and GNU-as) passed to '.ascii', but not to '.asciz' and chokes on: + * + * .asciz "MODULE_" "kvm" ; + */ +#define ___EXPORT_SYMBOL(sym, license, ns...) \ .section ".export_symbol","a" ASM_NL \ __export_symbol_##sym: ASM_NL \ .asciz license ASM_NL \ - .asciz ns ASM_NL \ + .ascii ns "\0" ASM_NL \ __EXPORT_SYMBOL_REF(sym) ASM_NL \ .previous @@ -70,4 +76,6 @@ #define EXPORT_SYMBOL_NS(sym, ns) __EXPORT_SYMBOL(sym, "", __stringify(ns)) #define EXPORT_SYMBOL_NS_GPL(sym, ns) __EXPORT_SYMBOL(sym, "GPL", __stringify(ns)) +#define EXPORT_SYMBOL_GPL_FOR_MODULES(sym, mods) __EXPORT_SYMBOL(sym, "GPL", "module:" mods) + #endif /* _LINUX_EXPORT_H */ -- GitLab From f94c422157f3e43dd31990567b3e5d54b3e5b32b Mon Sep 17 00:00:00 2001 From: Shivank Garg Date: Fri, 20 Jun 2025 07:03:30 +0000 Subject: [PATCH 2046/2211] fs: export anon_inode_make_secure_inode() and fix secretmem LSM bypass [ Upstream commit cbe4134ea4bc493239786220bd69cb8a13493190 ] Export anon_inode_make_secure_inode() to allow KVM guest_memfd to create anonymous inodes with proper security context. This replaces the current pattern of calling alloc_anon_inode() followed by inode_init_security_anon() for creating security context manually. This change also fixes a security regression in secretmem where the S_PRIVATE flag was not cleared after alloc_anon_inode(), causing LSM/SELinux checks to be bypassed for secretmem file descriptors. As guest_memfd currently resides in the KVM module, we need to export this symbol for use outside the core kernel. In the future, guest_memfd might be moved to core-mm, at which point the symbols no longer would have to be exported. When/if that happens is still unclear. Fixes: 2bfe15c52612 ("mm: create security context for memfd_secret inodes") Suggested-by: David Hildenbrand Suggested-by: Mike Rapoport Signed-off-by: Shivank Garg Link: https://lore.kernel.org/20250620070328.803704-3-shivankg@amd.com Acked-by: "Mike Rapoport (Microsoft)" Signed-off-by: Christian Brauner Signed-off-by: Sasha Levin --- fs/anon_inodes.c | 23 ++++++++++++++++++----- include/linux/fs.h | 2 ++ mm/secretmem.c | 9 +-------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index 583ac81669c24..35f765610802a 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c @@ -55,14 +55,25 @@ static struct file_system_type anon_inode_fs_type = { .kill_sb = kill_anon_super, }; -static struct inode *anon_inode_make_secure_inode( - const char *name, - const struct inode *context_inode) +/** + * anon_inode_make_secure_inode - allocate an anonymous inode with security context + * @sb: [in] Superblock to allocate from + * @name: [in] Name of the class of the newfile (e.g., "secretmem") + * @context_inode: + * [in] Optional parent inode for security inheritance + * + * The function ensures proper security initialization through the LSM hook + * security_inode_init_security_anon(). + * + * Return: Pointer to new inode on success, ERR_PTR on failure. + */ +struct inode *anon_inode_make_secure_inode(struct super_block *sb, const char *name, + const struct inode *context_inode) { struct inode *inode; int error; - inode = alloc_anon_inode(anon_inode_mnt->mnt_sb); + inode = alloc_anon_inode(sb); if (IS_ERR(inode)) return inode; inode->i_flags &= ~S_PRIVATE; @@ -74,6 +85,7 @@ static struct inode *anon_inode_make_secure_inode( } return inode; } +EXPORT_SYMBOL_GPL_FOR_MODULES(anon_inode_make_secure_inode, "kvm"); static struct file *__anon_inode_getfile(const char *name, const struct file_operations *fops, @@ -88,7 +100,8 @@ static struct file *__anon_inode_getfile(const char *name, return ERR_PTR(-ENOENT); if (make_inode) { - inode = anon_inode_make_secure_inode(name, context_inode); + inode = anon_inode_make_secure_inode(anon_inode_mnt->mnt_sb, + name, context_inode); if (IS_ERR(inode)) { file = ERR_CAST(inode); goto err; diff --git a/include/linux/fs.h b/include/linux/fs.h index b98f128c9afa7..a6de8d93838d1 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3407,6 +3407,8 @@ extern int simple_write_begin(struct file *file, struct address_space *mapping, extern const struct address_space_operations ram_aops; extern int always_delete_dentry(const struct dentry *); extern struct inode *alloc_anon_inode(struct super_block *); +struct inode *anon_inode_make_secure_inode(struct super_block *sb, const char *name, + const struct inode *context_inode); extern int simple_nosetlease(struct file *, int, struct file_lease **, void **); extern const struct dentry_operations simple_dentry_operations; diff --git a/mm/secretmem.c b/mm/secretmem.c index 1b0a214ee5580..4662f2510ae5f 100644 --- a/mm/secretmem.c +++ b/mm/secretmem.c @@ -195,18 +195,11 @@ static struct file *secretmem_file_create(unsigned long flags) struct file *file; struct inode *inode; const char *anon_name = "[secretmem]"; - int err; - inode = alloc_anon_inode(secretmem_mnt->mnt_sb); + inode = anon_inode_make_secure_inode(secretmem_mnt->mnt_sb, anon_name, NULL); if (IS_ERR(inode)) return ERR_CAST(inode); - err = security_inode_init_security_anon(inode, &QSTR(anon_name), NULL); - if (err) { - file = ERR_PTR(err); - goto err_free_inode; - } - file = alloc_file_pseudo(inode, secretmem_mnt, "secretmem", O_RDWR, &secretmem_fops); if (IS_ERR(file)) -- GitLab From f6588557023efa10463c1ca77010f0ee6c895a81 Mon Sep 17 00:00:00 2001 From: Michael Guralnik Date: Thu, 13 Mar 2025 16:29:49 +0200 Subject: [PATCH 2047/2211] RDMA/mlx5: Fix cache entry update on dereg error [ Upstream commit 24d693cf6c89d216a68634d44fa93e4400775d94 ] Fix double decrement of 'in_use' counter on push_mkey_locked() failure while deregistering an MR. If we fail to return an mkey to the cache in cache_ent_find_and_store() it'll update the 'in_use' counter. Its caller, revoke_mr(), also updates it, thus having double decrement. Wrong value of 'in_use' counter will be exposed through debugfs and can also cause wrong resizing of the cache when users try to set cache entry size using the 'size' debugfs. To address this issue, the 'in_use' counter is now decremented within mlx5_revoke_mr() also after a successful call to cache_ent_find_and_store() and not within cache_ent_find_and_store(). Other success or failure flows remains unchanged where it was also decremented. Fixes: 8c1185fef68c ("RDMA/mlx5: Change check for cacheable mkeys") Signed-off-by: Michael Guralnik Reviewed-by: Yishai Hadas Link: https://patch.msgid.link/97e979dff636f232ff4c83ce709c17c727da1fdb.1741875692.git.leon@kernel.org Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/infiniband/hw/mlx5/mr.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c index 068eac3bdb50b..830a15b66c120 100644 --- a/drivers/infiniband/hw/mlx5/mr.c +++ b/drivers/infiniband/hw/mlx5/mr.c @@ -1968,7 +1968,6 @@ static int cache_ent_find_and_store(struct mlx5_ib_dev *dev, if (mr->mmkey.cache_ent) { spin_lock_irq(&mr->mmkey.cache_ent->mkeys_queue.lock); - mr->mmkey.cache_ent->in_use--; goto end; } @@ -2036,6 +2035,7 @@ static int mlx5_revoke_mr(struct mlx5_ib_mr *mr) bool is_odp = is_odp_mr(mr); bool is_odp_dma_buf = is_dmabuf_mr(mr) && !to_ib_umem_dmabuf(mr->umem)->pinned; + bool from_cache = !!ent; int ret = 0; if (is_odp) @@ -2048,6 +2048,8 @@ static int mlx5_revoke_mr(struct mlx5_ib_mr *mr) ent = mr->mmkey.cache_ent; /* upon storing to a clean temp entry - schedule its cleanup */ spin_lock_irq(&ent->mkeys_queue.lock); + if (from_cache) + ent->in_use--; if (ent->is_tmp && !ent->tmp_cleanup_scheduled) { mod_delayed_work(ent->dev->cache.wq, &ent->dwork, msecs_to_jiffies(30 * 1000)); -- GitLab From beb89ada5715e7bd1518c58863eedce89ec051a7 Mon Sep 17 00:00:00 2001 From: Or Har-Toov Date: Mon, 16 Jun 2025 11:14:09 +0300 Subject: [PATCH 2048/2211] IB/mlx5: Fix potential deadlock in MR deregistration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit 2ed25aa7f7711f508b6120e336f05cd9d49943c0 ] The issue arises when kzalloc() is invoked while holding umem_mutex or any other lock acquired under umem_mutex. This is problematic because kzalloc() can trigger fs_reclaim_aqcuire(), which may, in turn, invoke mmu_notifier_invalidate_range_start(). This function can lead to mlx5_ib_invalidate_range(), which attempts to acquire umem_mutex again, resulting in a deadlock. The problematic flow: CPU0 | CPU1 ---------------------------------------|------------------------------------------------ mlx5_ib_dereg_mr() | → revoke_mr() | → mutex_lock(&umem_odp->umem_mutex) | | mlx5_mkey_cache_init() | → mutex_lock(&dev->cache.rb_lock) | → mlx5r_cache_create_ent_locked() | → kzalloc(GFP_KERNEL) | → fs_reclaim() | → mmu_notifier_invalidate_range_start() | → mlx5_ib_invalidate_range() | → mutex_lock(&umem_odp->umem_mutex) → cache_ent_find_and_store() | → mutex_lock(&dev->cache.rb_lock) | Additionally, when kzalloc() is called from within cache_ent_find_and_store(), we encounter the same deadlock due to re-acquisition of umem_mutex. Solve by releasing umem_mutex in dereg_mr() after umr_revoke_mr() and before acquiring rb_lock. This ensures that we don't hold umem_mutex while performing memory allocations that could trigger the reclaim path. This change prevents the deadlock by ensuring proper lock ordering and avoiding holding locks during memory allocation operations that could trigger the reclaim path. The following lockdep warning demonstrates the deadlock: python3/20557 is trying to acquire lock: ffff888387542128 (&umem_odp->umem_mutex){+.+.}-{4:4}, at: mlx5_ib_invalidate_range+0x5b/0x550 [mlx5_ib] but task is already holding lock: ffffffff82f6b840 (mmu_notifier_invalidate_range_start){+.+.}-{0:0}, at: unmap_vmas+0x7b/0x1a0 which lock already depends on the new lock. the existing dependency chain (in reverse order) is: -> #3 (mmu_notifier_invalidate_range_start){+.+.}-{0:0}: fs_reclaim_acquire+0x60/0xd0 mem_cgroup_css_alloc+0x6f/0x9b0 cgroup_init_subsys+0xa4/0x240 cgroup_init+0x1c8/0x510 start_kernel+0x747/0x760 x86_64_start_reservations+0x25/0x30 x86_64_start_kernel+0x73/0x80 common_startup_64+0x129/0x138 -> #2 (fs_reclaim){+.+.}-{0:0}: fs_reclaim_acquire+0x91/0xd0 __kmalloc_cache_noprof+0x4d/0x4c0 mlx5r_cache_create_ent_locked+0x75/0x620 [mlx5_ib] mlx5_mkey_cache_init+0x186/0x360 [mlx5_ib] mlx5_ib_stage_post_ib_reg_umr_init+0x3c/0x60 [mlx5_ib] __mlx5_ib_add+0x4b/0x190 [mlx5_ib] mlx5r_probe+0xd9/0x320 [mlx5_ib] auxiliary_bus_probe+0x42/0x70 really_probe+0xdb/0x360 __driver_probe_device+0x8f/0x130 driver_probe_device+0x1f/0xb0 __driver_attach+0xd4/0x1f0 bus_for_each_dev+0x79/0xd0 bus_add_driver+0xf0/0x200 driver_register+0x6e/0xc0 __auxiliary_driver_register+0x6a/0xc0 do_one_initcall+0x5e/0x390 do_init_module+0x88/0x240 init_module_from_file+0x85/0xc0 idempotent_init_module+0x104/0x300 __x64_sys_finit_module+0x68/0xc0 do_syscall_64+0x6d/0x140 entry_SYSCALL_64_after_hwframe+0x4b/0x53 -> #1 (&dev->cache.rb_lock){+.+.}-{4:4}: __mutex_lock+0x98/0xf10 __mlx5_ib_dereg_mr+0x6f2/0x890 [mlx5_ib] mlx5_ib_dereg_mr+0x21/0x110 [mlx5_ib] ib_dereg_mr_user+0x85/0x1f0 [ib_core] uverbs_free_mr+0x19/0x30 [ib_uverbs] destroy_hw_idr_uobject+0x21/0x80 [ib_uverbs] uverbs_destroy_uobject+0x60/0x3d0 [ib_uverbs] uobj_destroy+0x57/0xa0 [ib_uverbs] ib_uverbs_cmd_verbs+0x4d5/0x1210 [ib_uverbs] ib_uverbs_ioctl+0x129/0x230 [ib_uverbs] __x64_sys_ioctl+0x596/0xaa0 do_syscall_64+0x6d/0x140 entry_SYSCALL_64_after_hwframe+0x4b/0x53 -> #0 (&umem_odp->umem_mutex){+.+.}-{4:4}: __lock_acquire+0x1826/0x2f00 lock_acquire+0xd3/0x2e0 __mutex_lock+0x98/0xf10 mlx5_ib_invalidate_range+0x5b/0x550 [mlx5_ib] __mmu_notifier_invalidate_range_start+0x18e/0x1f0 unmap_vmas+0x182/0x1a0 exit_mmap+0xf3/0x4a0 mmput+0x3a/0x100 do_exit+0x2b9/0xa90 do_group_exit+0x32/0xa0 get_signal+0xc32/0xcb0 arch_do_signal_or_restart+0x29/0x1d0 syscall_exit_to_user_mode+0x105/0x1d0 do_syscall_64+0x79/0x140 entry_SYSCALL_64_after_hwframe+0x4b/0x53 Chain exists of: &dev->cache.rb_lock --> mmu_notifier_invalidate_range_start --> &umem_odp->umem_mutex Possible unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&umem_odp->umem_mutex); lock(mmu_notifier_invalidate_range_start); lock(&umem_odp->umem_mutex); lock(&dev->cache.rb_lock); *** DEADLOCK *** Fixes: abb604a1a9c8 ("RDMA/mlx5: Fix a race for an ODP MR which leads to CQE with error") Signed-off-by: Or Har-Toov Reviewed-by: Michael Guralnik Link: https://patch.msgid.link/3c8f225a8a9fade647d19b014df1172544643e4a.1750061612.git.leon@kernel.org Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/infiniband/hw/mlx5/mr.c | 61 +++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c index 830a15b66c120..726b81b6330c6 100644 --- a/drivers/infiniband/hw/mlx5/mr.c +++ b/drivers/infiniband/hw/mlx5/mr.c @@ -2028,23 +2028,50 @@ void mlx5_ib_revoke_data_direct_mrs(struct mlx5_ib_dev *dev) } } -static int mlx5_revoke_mr(struct mlx5_ib_mr *mr) +static int mlx5_umr_revoke_mr_with_lock(struct mlx5_ib_mr *mr) { - struct mlx5_ib_dev *dev = to_mdev(mr->ibmr.device); - struct mlx5_cache_ent *ent = mr->mmkey.cache_ent; - bool is_odp = is_odp_mr(mr); bool is_odp_dma_buf = is_dmabuf_mr(mr) && - !to_ib_umem_dmabuf(mr->umem)->pinned; - bool from_cache = !!ent; - int ret = 0; + !to_ib_umem_dmabuf(mr->umem)->pinned; + bool is_odp = is_odp_mr(mr); + int ret; if (is_odp) mutex_lock(&to_ib_umem_odp(mr->umem)->umem_mutex); if (is_odp_dma_buf) - dma_resv_lock(to_ib_umem_dmabuf(mr->umem)->attach->dmabuf->resv, NULL); + dma_resv_lock(to_ib_umem_dmabuf(mr->umem)->attach->dmabuf->resv, + NULL); + + ret = mlx5r_umr_revoke_mr(mr); + + if (is_odp) { + if (!ret) + to_ib_umem_odp(mr->umem)->private = NULL; + mutex_unlock(&to_ib_umem_odp(mr->umem)->umem_mutex); + } + + if (is_odp_dma_buf) { + if (!ret) + to_ib_umem_dmabuf(mr->umem)->private = NULL; + dma_resv_unlock( + to_ib_umem_dmabuf(mr->umem)->attach->dmabuf->resv); + } - if (mr->mmkey.cacheable && !mlx5r_umr_revoke_mr(mr) && !cache_ent_find_and_store(dev, mr)) { + return ret; +} + +static int mlx5r_handle_mkey_cleanup(struct mlx5_ib_mr *mr) +{ + bool is_odp_dma_buf = is_dmabuf_mr(mr) && + !to_ib_umem_dmabuf(mr->umem)->pinned; + struct mlx5_ib_dev *dev = to_mdev(mr->ibmr.device); + struct mlx5_cache_ent *ent = mr->mmkey.cache_ent; + bool is_odp = is_odp_mr(mr); + bool from_cache = !!ent; + int ret; + + if (mr->mmkey.cacheable && !mlx5_umr_revoke_mr_with_lock(mr) && + !cache_ent_find_and_store(dev, mr)) { ent = mr->mmkey.cache_ent; /* upon storing to a clean temp entry - schedule its cleanup */ spin_lock_irq(&ent->mkeys_queue.lock); @@ -2056,7 +2083,7 @@ static int mlx5_revoke_mr(struct mlx5_ib_mr *mr) ent->tmp_cleanup_scheduled = true; } spin_unlock_irq(&ent->mkeys_queue.lock); - goto out; + return 0; } if (ent) { @@ -2065,8 +2092,14 @@ static int mlx5_revoke_mr(struct mlx5_ib_mr *mr) mr->mmkey.cache_ent = NULL; spin_unlock_irq(&ent->mkeys_queue.lock); } + + if (is_odp) + mutex_lock(&to_ib_umem_odp(mr->umem)->umem_mutex); + + if (is_odp_dma_buf) + dma_resv_lock(to_ib_umem_dmabuf(mr->umem)->attach->dmabuf->resv, + NULL); ret = destroy_mkey(dev, mr); -out: if (is_odp) { if (!ret) to_ib_umem_odp(mr->umem)->private = NULL; @@ -2076,9 +2109,9 @@ out: if (is_odp_dma_buf) { if (!ret) to_ib_umem_dmabuf(mr->umem)->private = NULL; - dma_resv_unlock(to_ib_umem_dmabuf(mr->umem)->attach->dmabuf->resv); + dma_resv_unlock( + to_ib_umem_dmabuf(mr->umem)->attach->dmabuf->resv); } - return ret; } @@ -2127,7 +2160,7 @@ static int __mlx5_ib_dereg_mr(struct ib_mr *ibmr) } /* Stop DMA */ - rc = mlx5_revoke_mr(mr); + rc = mlx5r_handle_mkey_cleanup(mr); if (rc) return rc; -- GitLab From 994b0bc2a0e8fd3fd335eff4046ce2f7be66cd63 Mon Sep 17 00:00:00 2001 From: Vinay Belgaumkar Date: Wed, 18 Jun 2025 11:50:01 -0700 Subject: [PATCH 2049/2211] drm/xe/bmg: Update Wa_22019338487 [ Upstream commit 84c0b4a00610afbde650fdb8ad6db0424f7b2cc3 ] Limit GT max frequency to 2600MHz and wait for frequency to reduce before proceeding with a transient flush. This is really only needed for the transient flush: if L2 flush is needed due to 16023588340 then there's no need to do this additional wait since we are already using the bigger hammer. v2: Use generic names, ensure user set max frequency requests wait for flush to complete (Rodrigo) v3: - User requests wait via wait_var_event_timeout (Lucas) - Close races on flush + user requests (Lucas) - Fix xe_guc_pc_remove_flush_freq_limit() being called on last gt rather than root gt (Lucas) v4: - Only apply the freq reducing part if a TDF is needed: L2 flush trumps the need for waiting a lower frequency Fixes: aaa08078e725 ("drm/xe/bmg: Apply Wa_22019338487") Reviewed-by: Rodrigo Vivi Signed-off-by: Vinay Belgaumkar Link: https://lore.kernel.org/r/20250618-wa-22019338487-v5-4-b888388477f2@intel.com Signed-off-by: Lucas De Marchi (cherry picked from commit deea6a7d6d803d6bb874a3e6f1b312e560e6c6df) Signed-off-by: Lucas De Marchi Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/xe_device.c | 55 +++++----- drivers/gpu/drm/xe/xe_guc_pc.c | 144 +++++++++++++++++++++++++++ drivers/gpu/drm/xe/xe_guc_pc.h | 2 + drivers/gpu/drm/xe/xe_guc_pc_types.h | 2 + 4 files changed, 179 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c index 0c3db53b93d8a..82da51a6616a1 100644 --- a/drivers/gpu/drm/xe/xe_device.c +++ b/drivers/gpu/drm/xe/xe_device.c @@ -37,6 +37,7 @@ #include "xe_gt_printk.h" #include "xe_gt_sriov_vf.h" #include "xe_guc.h" +#include "xe_guc_pc.h" #include "xe_hw_engine_group.h" #include "xe_hwmon.h" #include "xe_irq.h" @@ -871,31 +872,37 @@ void xe_device_td_flush(struct xe_device *xe) if (!IS_DGFX(xe) || GRAPHICS_VER(xe) < 20) return; - if (XE_WA(xe_root_mmio_gt(xe), 16023588340)) { + gt = xe_root_mmio_gt(xe); + if (XE_WA(gt, 16023588340)) { + /* A transient flush is not sufficient: flush the L2 */ xe_device_l2_flush(xe); - return; - } - - for_each_gt(gt, xe, id) { - if (xe_gt_is_media_type(gt)) - continue; - - if (xe_force_wake_get(gt_to_fw(gt), XE_FW_GT)) - return; - - xe_mmio_write32(gt, XE2_TDF_CTRL, TRANSIENT_FLUSH_REQUEST); - /* - * FIXME: We can likely do better here with our choice of - * timeout. Currently we just assume the worst case, i.e. 150us, - * which is believed to be sufficient to cover the worst case - * scenario on current platforms if all cache entries are - * transient and need to be flushed.. - */ - if (xe_mmio_wait32(gt, XE2_TDF_CTRL, TRANSIENT_FLUSH_REQUEST, 0, - 150, NULL, false)) - xe_gt_err_once(gt, "TD flush timeout\n"); - - xe_force_wake_put(gt_to_fw(gt), XE_FW_GT); + } else { + xe_guc_pc_apply_flush_freq_limit(>->uc.guc.pc); + + /* Execute TDF flush on all graphics GTs */ + for_each_gt(gt, xe, id) { + if (xe_gt_is_media_type(gt)) + continue; + + if (xe_force_wake_get(gt_to_fw(gt), XE_FW_GT)) + return; + + xe_mmio_write32(gt, XE2_TDF_CTRL, TRANSIENT_FLUSH_REQUEST); + /* + * FIXME: We can likely do better here with our choice of + * timeout. Currently we just assume the worst case, i.e. 150us, + * which is believed to be sufficient to cover the worst case + * scenario on current platforms if all cache entries are + * transient and need to be flushed.. + */ + if (xe_mmio_wait32(gt, XE2_TDF_CTRL, TRANSIENT_FLUSH_REQUEST, 0, + 150, NULL, false)) + xe_gt_err_once(gt, "TD flush timeout\n"); + + xe_force_wake_put(gt_to_fw(gt), XE_FW_GT); + } + + xe_guc_pc_remove_flush_freq_limit(&xe_root_mmio_gt(xe)->uc.guc.pc); } } diff --git a/drivers/gpu/drm/xe/xe_guc_pc.c b/drivers/gpu/drm/xe/xe_guc_pc.c index f978da8be35c2..af02803c145bf 100644 --- a/drivers/gpu/drm/xe/xe_guc_pc.c +++ b/drivers/gpu/drm/xe/xe_guc_pc.c @@ -6,6 +6,9 @@ #include "xe_guc_pc.h" #include +#include +#include +#include #include #include @@ -47,6 +50,12 @@ #define LNL_MERT_FREQ_CAP 800 #define BMG_MERT_FREQ_CAP 2133 +#define BMG_MIN_FREQ 1200 +#define BMG_MERT_FLUSH_FREQ_CAP 2600 + +#define SLPC_RESET_TIMEOUT_MS 5 /* roughly 5ms, but no need for precision */ +#define SLPC_RESET_EXTENDED_TIMEOUT_MS 1000 /* To be used only at pc_start */ +#define SLPC_ACT_FREQ_TIMEOUT_MS 100 /** * DOC: GuC Power Conservation (PC) @@ -133,6 +142,36 @@ static int wait_for_pc_state(struct xe_guc_pc *pc, return -ETIMEDOUT; } +static int wait_for_flush_complete(struct xe_guc_pc *pc) +{ + const unsigned long timeout = msecs_to_jiffies(30); + + if (!wait_var_event_timeout(&pc->flush_freq_limit, + !atomic_read(&pc->flush_freq_limit), + timeout)) + return -ETIMEDOUT; + + return 0; +} + +static int wait_for_act_freq_limit(struct xe_guc_pc *pc, u32 freq) +{ + int timeout_us = SLPC_ACT_FREQ_TIMEOUT_MS * USEC_PER_MSEC; + int slept, wait = 10; + + for (slept = 0; slept < timeout_us;) { + if (xe_guc_pc_get_act_freq(pc) <= freq) + return 0; + + usleep_range(wait, wait << 1); + slept += wait; + wait <<= 1; + if (slept + wait > timeout_us) + wait = timeout_us - slept; + } + + return -ETIMEDOUT; +} static int pc_action_reset(struct xe_guc_pc *pc) { struct xe_guc_ct *ct = pc_to_ct(pc); @@ -584,6 +623,11 @@ int xe_guc_pc_set_max_freq(struct xe_guc_pc *pc, u32 freq) { int ret; + if (XE_WA(pc_to_gt(pc), 22019338487)) { + if (wait_for_flush_complete(pc) != 0) + return -EAGAIN; + } + mutex_lock(&pc->freq_lock); if (!pc->freq_ready) { /* Might be in the middle of a gt reset */ @@ -793,6 +837,106 @@ static int pc_adjust_requested_freq(struct xe_guc_pc *pc) return ret; } +static bool needs_flush_freq_limit(struct xe_guc_pc *pc) +{ + struct xe_gt *gt = pc_to_gt(pc); + + return XE_WA(gt, 22019338487) && + pc->rp0_freq > BMG_MERT_FLUSH_FREQ_CAP; +} + +/** + * xe_guc_pc_apply_flush_freq_limit() - Limit max GT freq during L2 flush + * @pc: the xe_guc_pc object + * + * As per the WA, reduce max GT frequency during L2 cache flush + */ +void xe_guc_pc_apply_flush_freq_limit(struct xe_guc_pc *pc) +{ + struct xe_gt *gt = pc_to_gt(pc); + u32 max_freq; + int ret; + + if (!needs_flush_freq_limit(pc)) + return; + + mutex_lock(&pc->freq_lock); + + if (!pc->freq_ready) { + mutex_unlock(&pc->freq_lock); + return; + } + + ret = pc_action_query_task_state(pc); + if (ret) { + mutex_unlock(&pc->freq_lock); + return; + } + + max_freq = pc_get_max_freq(pc); + if (max_freq > BMG_MERT_FLUSH_FREQ_CAP) { + ret = pc_set_max_freq(pc, BMG_MERT_FLUSH_FREQ_CAP); + if (ret) { + xe_gt_err_once(gt, "Failed to cap max freq on flush to %u, %pe\n", + BMG_MERT_FLUSH_FREQ_CAP, ERR_PTR(ret)); + mutex_unlock(&pc->freq_lock); + return; + } + + atomic_set(&pc->flush_freq_limit, 1); + + /* + * If user has previously changed max freq, stash that value to + * restore later, otherwise use the current max. New user + * requests wait on flush. + */ + if (pc->user_requested_max != 0) + pc->stashed_max_freq = pc->user_requested_max; + else + pc->stashed_max_freq = max_freq; + } + + mutex_unlock(&pc->freq_lock); + + /* + * Wait for actual freq to go below the flush cap: even if the previous + * max was below cap, the current one might still be above it + */ + ret = wait_for_act_freq_limit(pc, BMG_MERT_FLUSH_FREQ_CAP); + if (ret) + xe_gt_err_once(gt, "Actual freq did not reduce to %u, %pe\n", + BMG_MERT_FLUSH_FREQ_CAP, ERR_PTR(ret)); +} + +/** + * xe_guc_pc_remove_flush_freq_limit() - Remove max GT freq limit after L2 flush completes. + * @pc: the xe_guc_pc object + * + * Retrieve the previous GT max frequency value. + */ +void xe_guc_pc_remove_flush_freq_limit(struct xe_guc_pc *pc) +{ + struct xe_gt *gt = pc_to_gt(pc); + int ret = 0; + + if (!needs_flush_freq_limit(pc)) + return; + + if (!atomic_read(&pc->flush_freq_limit)) + return; + + mutex_lock(&pc->freq_lock); + + ret = pc_set_max_freq(>->uc.guc.pc, pc->stashed_max_freq); + if (ret) + xe_gt_err_once(gt, "Failed to restore max freq %u:%d", + pc->stashed_max_freq, ret); + + atomic_set(&pc->flush_freq_limit, 0); + mutex_unlock(&pc->freq_lock); + wake_up_var(&pc->flush_freq_limit); +} + static int pc_set_mert_freq_cap(struct xe_guc_pc *pc) { int ret = 0; diff --git a/drivers/gpu/drm/xe/xe_guc_pc.h b/drivers/gpu/drm/xe/xe_guc_pc.h index efda432fadfc8..7154b3aab0d84 100644 --- a/drivers/gpu/drm/xe/xe_guc_pc.h +++ b/drivers/gpu/drm/xe/xe_guc_pc.h @@ -34,5 +34,7 @@ u64 xe_guc_pc_mc6_residency(struct xe_guc_pc *pc); void xe_guc_pc_init_early(struct xe_guc_pc *pc); int xe_guc_pc_restore_stashed_freq(struct xe_guc_pc *pc); void xe_guc_pc_raise_unslice(struct xe_guc_pc *pc); +void xe_guc_pc_apply_flush_freq_limit(struct xe_guc_pc *pc); +void xe_guc_pc_remove_flush_freq_limit(struct xe_guc_pc *pc); #endif /* _XE_GUC_PC_H_ */ diff --git a/drivers/gpu/drm/xe/xe_guc_pc_types.h b/drivers/gpu/drm/xe/xe_guc_pc_types.h index 13810be015db5..5b86d91296cb9 100644 --- a/drivers/gpu/drm/xe/xe_guc_pc_types.h +++ b/drivers/gpu/drm/xe/xe_guc_pc_types.h @@ -15,6 +15,8 @@ struct xe_guc_pc { /** @bo: GGTT buffer object that is shared with GuC PC */ struct xe_bo *bo; + /** @flush_freq_limit: 1 when max freq changes are limited by driver */ + atomic_t flush_freq_limit; /** @rp0_freq: HW RP0 frequency - The Maximum one */ u32 rp0_freq; /** @rpe_freq: HW RPe frequency - The Efficient one */ -- GitLab From 5e110e867941bdd2d91a30d90cb5035e41b89f8c Mon Sep 17 00:00:00 2001 From: Harry Austen Date: Mon, 7 Jul 2025 02:14:17 -0400 Subject: [PATCH 2050/2211] drm/xe: Allow dropping kunit dependency as built-in MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit aa18d5769fcafe645a3ba01a9a69dde4f8dc8cc3 ] Fix Kconfig symbol dependency on KUNIT, which isn't actually required for XE to be built-in. However, if KUNIT is enabled, it must be built-in too. Fixes: 08987a8b6820 ("drm/xe: Fix build with KUNIT=m") Cc: Lucas De Marchi Cc: Thomas Hellström Cc: Jani Nikula Cc: Maarten Lankhorst Signed-off-by: Harry Austen Reviewed-by: Lucas De Marchi Acked-by: Randy Dunlap Tested-by: Randy Dunlap Link: https://lore.kernel.org/r/20250627-xe-kunit-v2-2-756fe5cd56cf@intel.com Signed-off-by: Lucas De Marchi (cherry picked from commit a559434880b320b83733d739733250815aecf1b0) Signed-off-by: Lucas De Marchi Signed-off-by: Sasha Levin --- drivers/gpu/drm/xe/Kconfig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/xe/Kconfig b/drivers/gpu/drm/xe/Kconfig index 7bbe46a98ff1f..93e742c1f21e7 100644 --- a/drivers/gpu/drm/xe/Kconfig +++ b/drivers/gpu/drm/xe/Kconfig @@ -1,7 +1,8 @@ # SPDX-License-Identifier: GPL-2.0-only config DRM_XE tristate "Intel Xe Graphics" - depends on DRM && PCI && MMU && (m || (y && KUNIT=y)) + depends on DRM && PCI && MMU + depends on KUNIT || !KUNIT select INTERVAL_TREE # we need shmfs for the swappable backing store, and in particular # the shmem_readpage() which depends upon tmpfs -- GitLab From 1a81dfc9d10ae97adc7c91b6328fc1aa8f4b3ce7 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Thu, 19 Jun 2025 15:16:11 -0400 Subject: [PATCH 2051/2211] NFSv4/flexfiles: Fix handling of NFS level errors in I/O [ Upstream commit 38074de35b015df5623f524d6f2b49a0cd395c40 ] Allow the flexfiles error handling to recognise NFS level errors (as opposed to RPC level errors) and handle them separately. The main motivator is the NFSERR_PERM errors that get returned if the NFS client connects to the data server through a port number that is lower than 1024. In that case, the client should disconnect and retry a READ on a different data server, or it should retry a WRITE after reconnecting. Reviewed-by: Tigran Mkrtchyan Fixes: d67ae825a59d ("pnfs/flexfiles: Add the FlexFile Layout Driver") Signed-off-by: Trond Myklebust Signed-off-by: Anna Schumaker Signed-off-by: Sasha Levin --- fs/nfs/flexfilelayout/flexfilelayout.c | 121 ++++++++++++++++++------- 1 file changed, 87 insertions(+), 34 deletions(-) diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index 8f7ea4076653d..bf96f7a8900c1 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c @@ -1104,6 +1104,7 @@ static void ff_layout_reset_read(struct nfs_pgio_header *hdr) } static int ff_layout_async_handle_error_v4(struct rpc_task *task, + u32 op_status, struct nfs4_state *state, struct nfs_client *clp, struct pnfs_layout_segment *lseg, @@ -1114,32 +1115,42 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task, struct nfs4_deviceid_node *devid = FF_LAYOUT_DEVID_NODE(lseg, idx); struct nfs4_slot_table *tbl = &clp->cl_session->fc_slot_table; - switch (task->tk_status) { - case -NFS4ERR_BADSESSION: - case -NFS4ERR_BADSLOT: - case -NFS4ERR_BAD_HIGH_SLOT: - case -NFS4ERR_DEADSESSION: - case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: - case -NFS4ERR_SEQ_FALSE_RETRY: - case -NFS4ERR_SEQ_MISORDERED: + switch (op_status) { + case NFS4_OK: + case NFS4ERR_NXIO: + break; + case NFSERR_PERM: + if (!task->tk_xprt) + break; + xprt_force_disconnect(task->tk_xprt); + goto out_retry; + case NFS4ERR_BADSESSION: + case NFS4ERR_BADSLOT: + case NFS4ERR_BAD_HIGH_SLOT: + case NFS4ERR_DEADSESSION: + case NFS4ERR_CONN_NOT_BOUND_TO_SESSION: + case NFS4ERR_SEQ_FALSE_RETRY: + case NFS4ERR_SEQ_MISORDERED: dprintk("%s ERROR %d, Reset session. Exchangeid " "flags 0x%x\n", __func__, task->tk_status, clp->cl_exchange_flags); nfs4_schedule_session_recovery(clp->cl_session, task->tk_status); - break; - case -NFS4ERR_DELAY: - case -NFS4ERR_GRACE: + goto out_retry; + case NFS4ERR_DELAY: + nfs_inc_stats(lseg->pls_layout->plh_inode, NFSIOS_DELAY); + fallthrough; + case NFS4ERR_GRACE: rpc_delay(task, FF_LAYOUT_POLL_RETRY_MAX); - break; - case -NFS4ERR_RETRY_UNCACHED_REP: - break; + goto out_retry; + case NFS4ERR_RETRY_UNCACHED_REP: + goto out_retry; /* Invalidate Layout errors */ - case -NFS4ERR_PNFS_NO_LAYOUT: - case -ESTALE: /* mapped NFS4ERR_STALE */ - case -EBADHANDLE: /* mapped NFS4ERR_BADHANDLE */ - case -EISDIR: /* mapped NFS4ERR_ISDIR */ - case -NFS4ERR_FHEXPIRED: - case -NFS4ERR_WRONG_TYPE: + case NFS4ERR_PNFS_NO_LAYOUT: + case NFS4ERR_STALE: + case NFS4ERR_BADHANDLE: + case NFS4ERR_ISDIR: + case NFS4ERR_FHEXPIRED: + case NFS4ERR_WRONG_TYPE: dprintk("%s Invalid layout error %d\n", __func__, task->tk_status); /* @@ -1152,6 +1163,11 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task, pnfs_destroy_layout(NFS_I(inode)); rpc_wake_up(&tbl->slot_tbl_waitq); goto reset; + default: + break; + } + + switch (task->tk_status) { /* RPC connection errors */ case -ECONNREFUSED: case -EHOSTDOWN: @@ -1167,26 +1183,56 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task, nfs4_delete_deviceid(devid->ld, devid->nfs_client, &devid->deviceid); rpc_wake_up(&tbl->slot_tbl_waitq); - fallthrough; + break; default: - if (ff_layout_avoid_mds_available_ds(lseg)) - return -NFS4ERR_RESET_TO_PNFS; -reset: - dprintk("%s Retry through MDS. Error %d\n", __func__, - task->tk_status); - return -NFS4ERR_RESET_TO_MDS; + break; } + + if (ff_layout_avoid_mds_available_ds(lseg)) + return -NFS4ERR_RESET_TO_PNFS; +reset: + dprintk("%s Retry through MDS. Error %d\n", __func__, + task->tk_status); + return -NFS4ERR_RESET_TO_MDS; + +out_retry: task->tk_status = 0; return -EAGAIN; } /* Retry all errors through either pNFS or MDS except for -EJUKEBOX */ static int ff_layout_async_handle_error_v3(struct rpc_task *task, + u32 op_status, + struct nfs_client *clp, struct pnfs_layout_segment *lseg, u32 idx) { struct nfs4_deviceid_node *devid = FF_LAYOUT_DEVID_NODE(lseg, idx); + switch (op_status) { + case NFS_OK: + case NFSERR_NXIO: + break; + case NFSERR_PERM: + if (!task->tk_xprt) + break; + xprt_force_disconnect(task->tk_xprt); + goto out_retry; + case NFSERR_ACCES: + case NFSERR_BADHANDLE: + case NFSERR_FBIG: + case NFSERR_IO: + case NFSERR_NOSPC: + case NFSERR_ROFS: + case NFSERR_STALE: + goto out_reset_to_pnfs; + case NFSERR_JUKEBOX: + nfs_inc_stats(lseg->pls_layout->plh_inode, NFSIOS_DELAY); + goto out_retry; + default: + break; + } + switch (task->tk_status) { /* File access problems. Don't mark the device as unavailable */ case -EACCES: @@ -1205,6 +1251,7 @@ static int ff_layout_async_handle_error_v3(struct rpc_task *task, nfs4_delete_deviceid(devid->ld, devid->nfs_client, &devid->deviceid); } +out_reset_to_pnfs: /* FIXME: Need to prevent infinite looping here. */ return -NFS4ERR_RESET_TO_PNFS; out_retry: @@ -1215,6 +1262,7 @@ out_retry: } static int ff_layout_async_handle_error(struct rpc_task *task, + u32 op_status, struct nfs4_state *state, struct nfs_client *clp, struct pnfs_layout_segment *lseg, @@ -1233,10 +1281,11 @@ static int ff_layout_async_handle_error(struct rpc_task *task, switch (vers) { case 3: - return ff_layout_async_handle_error_v3(task, lseg, idx); - case 4: - return ff_layout_async_handle_error_v4(task, state, clp, + return ff_layout_async_handle_error_v3(task, op_status, clp, lseg, idx); + case 4: + return ff_layout_async_handle_error_v4(task, op_status, state, + clp, lseg, idx); default: /* should never happen */ WARN_ON_ONCE(1); @@ -1289,6 +1338,7 @@ static void ff_layout_io_track_ds_error(struct pnfs_layout_segment *lseg, switch (status) { case NFS4ERR_DELAY: case NFS4ERR_GRACE: + case NFS4ERR_PERM: break; case NFS4ERR_NXIO: ff_layout_mark_ds_unreachable(lseg, idx); @@ -1321,7 +1371,8 @@ static int ff_layout_read_done_cb(struct rpc_task *task, trace_ff_layout_read_error(hdr); } - err = ff_layout_async_handle_error(task, hdr->args.context->state, + err = ff_layout_async_handle_error(task, hdr->res.op_status, + hdr->args.context->state, hdr->ds_clp, hdr->lseg, hdr->pgio_mirror_idx); @@ -1491,7 +1542,8 @@ static int ff_layout_write_done_cb(struct rpc_task *task, trace_ff_layout_write_error(hdr); } - err = ff_layout_async_handle_error(task, hdr->args.context->state, + err = ff_layout_async_handle_error(task, hdr->res.op_status, + hdr->args.context->state, hdr->ds_clp, hdr->lseg, hdr->pgio_mirror_idx); @@ -1537,8 +1589,9 @@ static int ff_layout_commit_done_cb(struct rpc_task *task, trace_ff_layout_commit_error(data); } - err = ff_layout_async_handle_error(task, NULL, data->ds_clp, - data->lseg, data->ds_commit_index); + err = ff_layout_async_handle_error(task, data->res.op_status, + NULL, data->ds_clp, data->lseg, + data->ds_commit_index); trace_nfs4_pnfs_commit_ds(data, err); switch (err) { -- GitLab From 8caccd2eac33725ea2d9015ec44fff8f55d31920 Mon Sep 17 00:00:00 2001 From: Roy Luo Date: Thu, 22 May 2025 19:09:11 +0000 Subject: [PATCH 2052/2211] usb: xhci: Skip xhci_reset in xhci_resume if xhci is being removed commit 3eff494f6e17abf932699483f133a708ac0355dc upstream. xhci_reset() currently returns -ENODEV if XHCI_STATE_REMOVING is set, without completing the xhci handshake, unless the reset completes exceptionally quickly. This behavior causes a regression on Synopsys DWC3 USB controllers with dual-role capabilities. Specifically, when a DWC3 controller exits host mode and removes xhci while a reset is still in progress, and then attempts to configure its hardware for device mode, the ongoing, incomplete reset leads to critical register access issues. All register reads return zero, not just within the xHCI register space (which might be expected during a reset), but across the entire DWC3 IP block. This patch addresses the issue by preventing xhci_reset() from being called in xhci_resume() and bailing out early in the reinit flow when XHCI_STATE_REMOVING is set. Cc: stable Fixes: 6ccb83d6c497 ("usb: xhci: Implement xhci_handshake_check_state() helper") Suggested-by: Mathias Nyman Signed-off-by: Roy Luo Link: https://lore.kernel.org/r/20250522190912.457583-2-royluo@google.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/host/xhci.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 799941b6ad6c6..434bed36557a3 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -1094,7 +1094,10 @@ int xhci_resume(struct xhci_hcd *xhci, pm_message_t msg) xhci_dbg(xhci, "Stop HCD\n"); xhci_halt(xhci); xhci_zero_64b_regs(xhci); - retval = xhci_reset(xhci, XHCI_RESET_LONG_USEC); + if (xhci->xhc_state & XHCI_STATE_REMOVING) + retval = -ENODEV; + else + retval = xhci_reset(xhci, XHCI_RESET_LONG_USEC); spin_unlock_irq(&xhci->lock); if (retval) return retval; -- GitLab From 9f758931892828199fdb1d7c6e8c0ccaed40f3f3 Mon Sep 17 00:00:00 2001 From: Roy Luo Date: Thu, 22 May 2025 19:09:12 +0000 Subject: [PATCH 2053/2211] Revert "usb: xhci: Implement xhci_handshake_check_state() helper" commit 7aed15379db9c6ec67999cdaf5c443b7be06ea73 upstream. This reverts commit 6ccb83d6c4972ebe6ae49de5eba051de3638362c. Commit 6ccb83d6c497 ("usb: xhci: Implement xhci_handshake_check_state() helper") was introduced to workaround watchdog timeout issues on some platforms, allowing xhci_reset() to bail out early without waiting for the reset to complete. Skipping the xhci handshake during a reset is a dangerous move. The xhci specification explicitly states that certain registers cannot be accessed during reset in section 5.4.1 USB Command Register (USBCMD), Host Controller Reset (HCRST) field: "This bit is cleared to '0' by the Host Controller when the reset process is complete. Software cannot terminate the reset process early by writinga '0' to this bit and shall not write any xHC Operational or Runtime registers until while HCRST is '1'." This behavior causes a regression on SNPS DWC3 USB controller with dual-role capability. When the DWC3 controller exits host mode and removes xhci while a reset is still in progress, and then tries to configure its hardware for device mode, the ongoing reset leads to register access issues; specifically, all register reads returns 0. These issues extend beyond the xhci register space (which is expected during a reset) and affect the entire DWC3 IP block, causing the DWC3 device mode to malfunction. Cc: stable Fixes: 6ccb83d6c497 ("usb: xhci: Implement xhci_handshake_check_state() helper") Signed-off-by: Roy Luo Link: https://lore.kernel.org/r/20250522190912.457583-3-royluo@google.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/host/xhci-ring.c | 5 ++--- drivers/usb/host/xhci.c | 26 +------------------------- drivers/usb/host/xhci.h | 2 -- 3 files changed, 3 insertions(+), 30 deletions(-) diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index fbc8419a54730..2ff8787f753c9 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -461,9 +461,8 @@ static int xhci_abort_cmd_ring(struct xhci_hcd *xhci, unsigned long flags) * In the future we should distinguish between -ENODEV and -ETIMEDOUT * and try to recover a -ETIMEDOUT with a host controller reset. */ - ret = xhci_handshake_check_state(xhci, &xhci->op_regs->cmd_ring, - CMD_RING_RUNNING, 0, 5 * 1000 * 1000, - XHCI_STATE_REMOVING); + ret = xhci_handshake(&xhci->op_regs->cmd_ring, + CMD_RING_RUNNING, 0, 5 * 1000 * 1000); if (ret < 0) { xhci_err(xhci, "Abort failed to stop command ring: %d\n", ret); xhci_halt(xhci); diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 434bed36557a3..09a5a66049620 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -82,29 +82,6 @@ int xhci_handshake(void __iomem *ptr, u32 mask, u32 done, u64 timeout_us) return ret; } -/* - * xhci_handshake_check_state - same as xhci_handshake but takes an additional - * exit_state parameter, and bails out with an error immediately when xhc_state - * has exit_state flag set. - */ -int xhci_handshake_check_state(struct xhci_hcd *xhci, void __iomem *ptr, - u32 mask, u32 done, int usec, unsigned int exit_state) -{ - u32 result; - int ret; - - ret = readl_poll_timeout_atomic(ptr, result, - (result & mask) == done || - result == U32_MAX || - xhci->xhc_state & exit_state, - 1, usec); - - if (result == U32_MAX || xhci->xhc_state & exit_state) - return -ENODEV; - - return ret; -} - /* * Disable interrupts and begin the xHCI halting process. */ @@ -225,8 +202,7 @@ int xhci_reset(struct xhci_hcd *xhci, u64 timeout_us) if (xhci->quirks & XHCI_INTEL_HOST) udelay(1000); - ret = xhci_handshake_check_state(xhci, &xhci->op_regs->command, - CMD_RESET, 0, timeout_us, XHCI_STATE_REMOVING); + ret = xhci_handshake(&xhci->op_regs->command, CMD_RESET, 0, timeout_us); if (ret) return ret; diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index c4d5b90ef90a8..a8b4c7b893ddd 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1846,8 +1846,6 @@ void xhci_remove_secondary_interrupter(struct usb_hcd /* xHCI host controller glue */ typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *); int xhci_handshake(void __iomem *ptr, u32 mask, u32 done, u64 timeout_us); -int xhci_handshake_check_state(struct xhci_hcd *xhci, void __iomem *ptr, - u32 mask, u32 done, int usec, unsigned int exit_state); void xhci_quiesce(struct xhci_hcd *xhci); int xhci_halt(struct xhci_hcd *xhci); int xhci_start(struct xhci_hcd *xhci); -- GitLab From fbebc2254af8dd98b3ef6b2b696a20e2b81fdd34 Mon Sep 17 00:00:00 2001 From: Raju Rangoju Date: Fri, 27 Jun 2025 17:41:19 +0300 Subject: [PATCH 2054/2211] usb: xhci: quirk for data loss in ISOC transfers commit cbc889ab0122366f6cdbe3c28d477c683ebcebc2 upstream. During the High-Speed Isochronous Audio transfers, xHCI controller on certain AMD platforms experiences momentary data loss. This results in Missed Service Errors (MSE) being generated by the xHCI. The root cause of the MSE is attributed to the ISOC OUT endpoint being omitted from scheduling. This can happen when an IN endpoint with a 64ms service interval either is pre-scheduled prior to the ISOC OUT endpoint or the interval of the ISOC OUT endpoint is shorter than that of the IN endpoint. Consequently, the OUT service is neglected when an IN endpoint with a service interval exceeding 32ms is scheduled concurrently (every 64ms in this scenario). This issue is particularly seen on certain older AMD platforms. To mitigate this problem, it is recommended to adjust the service interval of the IN endpoint to not exceed 32ms (interval 8). This adjustment ensures that the OUT endpoint will not be bypassed, even if a smaller interval value is utilized. Cc: stable Signed-off-by: Raju Rangoju Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20250627144127.3889714-2-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/host/xhci-mem.c | 4 ++++ drivers/usb/host/xhci-pci.c | 25 +++++++++++++++++++++++++ drivers/usb/host/xhci.h | 1 + 3 files changed, 30 insertions(+) diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index f9c51e0f2e37c..91178b8dbbf08 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -1426,6 +1426,10 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, /* Periodic endpoint bInterval limit quirk */ if (usb_endpoint_xfer_int(&ep->desc) || usb_endpoint_xfer_isoc(&ep->desc)) { + if ((xhci->quirks & XHCI_LIMIT_ENDPOINT_INTERVAL_9) && + interval >= 9) { + interval = 8; + } if ((xhci->quirks & XHCI_LIMIT_ENDPOINT_INTERVAL_7) && udev->speed >= USB_SPEED_HIGH && interval >= 7) { diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 1b033c8ce188e..234efb9731b2c 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -71,12 +71,22 @@ #define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_XHCI 0x15ec #define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_XHCI 0x15f0 +#define PCI_DEVICE_ID_AMD_ARIEL_TYPEC_XHCI 0x13ed +#define PCI_DEVICE_ID_AMD_ARIEL_TYPEA_XHCI 0x13ee +#define PCI_DEVICE_ID_AMD_STARSHIP_XHCI 0x148c +#define PCI_DEVICE_ID_AMD_FIREFLIGHT_15D4_XHCI 0x15d4 +#define PCI_DEVICE_ID_AMD_FIREFLIGHT_15D5_XHCI 0x15d5 +#define PCI_DEVICE_ID_AMD_RAVEN_15E0_XHCI 0x15e0 +#define PCI_DEVICE_ID_AMD_RAVEN_15E1_XHCI 0x15e1 +#define PCI_DEVICE_ID_AMD_RAVEN2_XHCI 0x15e5 #define PCI_DEVICE_ID_AMD_RENOIR_XHCI 0x1639 #define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9 #define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba #define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb #define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc +#define PCI_DEVICE_ID_ATI_NAVI10_7316_XHCI 0x7316 + #define PCI_DEVICE_ID_ASMEDIA_1042_XHCI 0x1042 #define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142 #define PCI_DEVICE_ID_ASMEDIA_1142_XHCI 0x1242 @@ -286,6 +296,21 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) if (pdev->vendor == PCI_VENDOR_ID_NEC) xhci->quirks |= XHCI_NEC_HOST; + if (pdev->vendor == PCI_VENDOR_ID_AMD && + (pdev->device == PCI_DEVICE_ID_AMD_ARIEL_TYPEC_XHCI || + pdev->device == PCI_DEVICE_ID_AMD_ARIEL_TYPEA_XHCI || + pdev->device == PCI_DEVICE_ID_AMD_STARSHIP_XHCI || + pdev->device == PCI_DEVICE_ID_AMD_FIREFLIGHT_15D4_XHCI || + pdev->device == PCI_DEVICE_ID_AMD_FIREFLIGHT_15D5_XHCI || + pdev->device == PCI_DEVICE_ID_AMD_RAVEN_15E0_XHCI || + pdev->device == PCI_DEVICE_ID_AMD_RAVEN_15E1_XHCI || + pdev->device == PCI_DEVICE_ID_AMD_RAVEN2_XHCI)) + xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_9; + + if (pdev->vendor == PCI_VENDOR_ID_ATI && + pdev->device == PCI_DEVICE_ID_ATI_NAVI10_7316_XHCI) + xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_9; + if (pdev->vendor == PCI_VENDOR_ID_AMD && xhci->hci_version == 0x96) xhci->quirks |= XHCI_AMD_0x96_HOST; diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index a8b4c7b893ddd..11580495e09c1 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1626,6 +1626,7 @@ struct xhci_hcd { #define XHCI_WRITE_64_HI_LO BIT_ULL(47) #define XHCI_CDNS_SCTX_QUIRK BIT_ULL(48) #define XHCI_ETRON_HOST BIT_ULL(49) +#define XHCI_LIMIT_ENDPOINT_INTERVAL_9 BIT_ULL(50) unsigned int num_active_eps; unsigned int limit_active_eps; -- GitLab From 9f3b2e497debf3843fde794488920861c4e3a921 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Bartosik?= Date: Fri, 27 Jun 2025 17:41:21 +0300 Subject: [PATCH 2055/2211] xhci: dbctty: disable ECHO flag by default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 2b857d69a5e116150639a0c6c39c86cc329939ee upstream. When /dev/ttyDBC0 device is created then by default ECHO flag is set for the terminal device. However if data arrives from a peer before application using /dev/ttyDBC0 applies its set of terminal flags then the arriving data will be echoed which might not be desired behavior. Fixes: 4521f1613940 ("xhci: dbctty: split dbc tty driver registration and unregistration functions.") Cc: stable Signed-off-by: Łukasz Bartosik Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/stable/20250610111802.18742-1-ukaszb%40chromium.org Link: https://lore.kernel.org/r/20250627144127.3889714-4-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/host/xhci-dbgtty.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/usb/host/xhci-dbgtty.c b/drivers/usb/host/xhci-dbgtty.c index d719c16ea30b5..2b8558005cbb0 100644 --- a/drivers/usb/host/xhci-dbgtty.c +++ b/drivers/usb/host/xhci-dbgtty.c @@ -585,6 +585,7 @@ int dbc_tty_init(void) dbc_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; dbc_tty_driver->subtype = SERIAL_TYPE_NORMAL; dbc_tty_driver->init_termios = tty_std_termios; + dbc_tty_driver->init_termios.c_lflag &= ~ECHO; dbc_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; dbc_tty_driver->init_termios.c_ispeed = 9600; -- GitLab From 8bfd11dae3fb3c202c831183d1849df0e8af4632 Mon Sep 17 00:00:00 2001 From: Mathias Nyman Date: Fri, 27 Jun 2025 17:41:22 +0300 Subject: [PATCH 2056/2211] xhci: dbc: Flush queued requests before stopping dbc commit efe3e3ae5a66cb38ef29c909e951b4039044bae9 upstream. Flush dbc requests when dbc is stopped and transfer rings are freed. Failure to flush them lead to leaking memory and dbc completing odd requests after resuming from suspend, leading to error messages such as: [ 95.344392] xhci_hcd 0000:00:0d.0: no matched request Cc: stable Fixes: dfba2174dc42 ("usb: xhci: Add DbC support in xHCI driver") Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20250627144127.3889714-5-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/host/xhci-dbgcap.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/usb/host/xhci-dbgcap.c b/drivers/usb/host/xhci-dbgcap.c index d35f3a18dd13b..bdc664ad6a934 100644 --- a/drivers/usb/host/xhci-dbgcap.c +++ b/drivers/usb/host/xhci-dbgcap.c @@ -651,6 +651,10 @@ static void xhci_dbc_stop(struct xhci_dbc *dbc) case DS_DISABLED: return; case DS_CONFIGURED: + spin_lock(&dbc->lock); + xhci_dbc_flush_requests(dbc); + spin_unlock(&dbc->lock); + if (dbc->driver->disconnect) dbc->driver->disconnect(dbc); break; -- GitLab From 195597e0beb3dc8803b91e3751f0111533b7f2f9 Mon Sep 17 00:00:00 2001 From: Hongyu Xie Date: Fri, 27 Jun 2025 17:41:20 +0300 Subject: [PATCH 2057/2211] xhci: Disable stream for xHC controller with XHCI_BROKEN_STREAMS commit cd65ee81240e8bc3c3119b46db7f60c80864b90b upstream. Disable stream for platform xHC controller with broken stream. Fixes: 14aec589327a6 ("storage: accept some UAS devices if streams are unavailable") Cc: stable Signed-off-by: Hongyu Xie Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20250627144127.3889714-3-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/host/xhci-plat.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 2379a67e34e12..3a9bdf9167556 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -326,7 +326,8 @@ int xhci_plat_probe(struct platform_device *pdev, struct device *sysdev, const s } usb3_hcd = xhci_get_usb3_hcd(xhci); - if (usb3_hcd && HCC_MAX_PSA(xhci->hcc_params) >= 4) + if (usb3_hcd && HCC_MAX_PSA(xhci->hcc_params) >= 4 && + !(xhci->quirks & XHCI_BROKEN_STREAMS)) usb3_hcd->can_do_streams = 1; if (xhci->shared_hcd) { -- GitLab From dbdd2a2320196e9478929f9cae67ada92f48755a Mon Sep 17 00:00:00 2001 From: Nilton Perim Neto Date: Fri, 27 Jun 2025 16:29:40 -0700 Subject: [PATCH 2058/2211] Input: xpad - support Acer NGR 200 Controller commit 22c69d786ef8fb789c61ca75492a272774221324 upstream. Add the NGR 200 Xbox 360 to the list of recognized controllers. Signed-off-by: Nilton Perim Neto Link: https://lore.kernel.org/r/20250608060517.14967-1-niltonperimneto@gmail.com Cc: stable@vger.kernel.org Signed-off-by: Dmitry Torokhov Signed-off-by: Greg Kroah-Hartman --- drivers/input/joystick/xpad.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index da5b14602a761..6d679e235af6c 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c @@ -174,6 +174,7 @@ static const struct xpad_device { { 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", 0, XTYPE_XBOX }, { 0x05fe, 0x3030, "Chic Controller", 0, XTYPE_XBOX }, { 0x05fe, 0x3031, "Chic Controller", 0, XTYPE_XBOX }, + { 0x0502, 0x1305, "Acer NGR200", 0, XTYPE_XBOX }, { 0x062a, 0x0020, "Logic3 Xbox GamePad", 0, XTYPE_XBOX }, { 0x062a, 0x0033, "Competition Pro Steering Wheel", 0, XTYPE_XBOX }, { 0x06a3, 0x0200, "Saitek Racing Wheel", 0, XTYPE_XBOX }, @@ -515,6 +516,7 @@ static const struct usb_device_id xpad_table[] = { XPAD_XBOX360_VENDOR(0x045e), /* Microsoft Xbox 360 controllers */ XPAD_XBOXONE_VENDOR(0x045e), /* Microsoft Xbox One controllers */ XPAD_XBOX360_VENDOR(0x046d), /* Logitech Xbox 360-style controllers */ + XPAD_XBOX360_VENDOR(0x0502), /* Acer Inc. Xbox 360 style controllers */ XPAD_XBOX360_VENDOR(0x056e), /* Elecom JC-U3613M */ XPAD_XBOX360_VENDOR(0x06a3), /* Saitek P3600 */ XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz Xbox 360 controllers */ -- GitLab From 46f75892815695ccb1436fddfb161d5a3e147ee5 Mon Sep 17 00:00:00 2001 From: Jeff LaBundy Date: Sun, 29 Jun 2025 18:33:30 -0700 Subject: [PATCH 2059/2211] Input: iqs7222 - explicitly define number of external channels commit 63f4970a1219b5256e8ea952096c86dab666d312 upstream. The number of external channels is assumed to be a multiple of 10, but this is not the case for IQS7222D. As a result, some CRx pins are wrongly prevented from being assigned to some channels. Address this problem by explicitly defining the number of external channels for cases in which the number of external channels is not equal to the total number of available channels. Fixes: dd24e202ac72 ("Input: iqs7222 - add support for Azoteq IQS7222D") Signed-off-by: Jeff LaBundy Link: https://lore.kernel.org/r/aGHVf6HkyFZrzTPy@nixie71 Cc: stable@vger.kernel.org Signed-off-by: Dmitry Torokhov Signed-off-by: Greg Kroah-Hartman --- drivers/input/misc/iqs7222.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/input/misc/iqs7222.c b/drivers/input/misc/iqs7222.c index 01c4009fd53e7..846aac9a5c9df 100644 --- a/drivers/input/misc/iqs7222.c +++ b/drivers/input/misc/iqs7222.c @@ -301,6 +301,7 @@ struct iqs7222_dev_desc { int allow_offset; int event_offset; int comms_offset; + int ext_chan; bool legacy_gesture; struct iqs7222_reg_grp_desc reg_grps[IQS7222_NUM_REG_GRPS]; }; @@ -315,6 +316,7 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = { .allow_offset = 9, .event_offset = 10, .comms_offset = 12, + .ext_chan = 10, .reg_grps = { [IQS7222_REG_GRP_STAT] = { .base = IQS7222_SYS_STATUS, @@ -373,6 +375,7 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = { .allow_offset = 9, .event_offset = 10, .comms_offset = 12, + .ext_chan = 10, .legacy_gesture = true, .reg_grps = { [IQS7222_REG_GRP_STAT] = { @@ -2244,7 +2247,7 @@ static int iqs7222_parse_chan(struct iqs7222_private *iqs7222, const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc; struct i2c_client *client = iqs7222->client; int num_chan = dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_row; - int ext_chan = rounddown(num_chan, 10); + int ext_chan = dev_desc->ext_chan ? : num_chan; int error, i; u16 *chan_setup = iqs7222->chan_setup[chan_index]; u16 *sys_setup = iqs7222->sys_setup; @@ -2448,7 +2451,7 @@ static int iqs7222_parse_sldr(struct iqs7222_private *iqs7222, const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc; struct i2c_client *client = iqs7222->client; int num_chan = dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_row; - int ext_chan = rounddown(num_chan, 10); + int ext_chan = dev_desc->ext_chan ? : num_chan; int count, error, reg_offset, i; u16 *event_mask = &iqs7222->sys_setup[dev_desc->event_offset]; u16 *sldr_setup = iqs7222->sldr_setup[sldr_index]; -- GitLab From b68e355a613260127c77c9ffd762ac7acbbcee77 Mon Sep 17 00:00:00 2001 From: Peter Chen Date: Thu, 19 Jun 2025 09:34:13 +0800 Subject: [PATCH 2060/2211] usb: cdnsp: do not disable slot for disabled slot commit 7e2c421ef88e9da9c39e01496b7f5b0b354b42bc upstream. It doesn't need to do it, and the related command event returns 'Slot Not Enabled Error' status. Fixes: 3d82904559f4 ("usb: cdnsp: cdns3 Add main part of Cadence USBSSP DRD Driver") Cc: stable Suggested-by: Hongliang Yang Reviewed-by: Fugang Duan Signed-off-by: Peter Chen Link: https://lore.kernel.org/r/20250619013413.35817-1-peter.chen@cixtech.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/cdns3/cdnsp-ring.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/usb/cdns3/cdnsp-ring.c b/drivers/usb/cdns3/cdnsp-ring.c index fd06cb85c4ea8..757fdd918286d 100644 --- a/drivers/usb/cdns3/cdnsp-ring.c +++ b/drivers/usb/cdns3/cdnsp-ring.c @@ -772,7 +772,9 @@ static int cdnsp_update_port_id(struct cdnsp_device *pdev, u32 port_id) } if (port_id != old_port) { - cdnsp_disable_slot(pdev); + if (pdev->slot_id) + cdnsp_disable_slot(pdev); + pdev->active_port = port; cdnsp_enable_slot(pdev); } -- GitLab From 27199ab79079b8f1970835819d14ff4eda16d1df Mon Sep 17 00:00:00 2001 From: Pawel Laszczak Date: Fri, 20 Jun 2025 08:23:12 +0000 Subject: [PATCH 2061/2211] usb: cdnsp: Fix issue with CV Bad Descriptor test commit 2831a81077f5162f104ba5a97a7d886eb371c21c upstream. The SSP2 controller has extra endpoint state preserve bit (ESP) which setting causes that endpoint state will be preserved during Halt Endpoint command. It is used only for EP0. Without this bit the Command Verifier "TD 9.10 Bad Descriptor Test" failed. Setting this bit doesn't have any impact for SSP controller. Fixes: 3d82904559f4 ("usb: cdnsp: cdns3 Add main part of Cadence USBSSP DRD Driver") Cc: stable Signed-off-by: Pawel Laszczak Acked-by: Peter Chen Link: https://lore.kernel.org/r/PH7PR07MB95382CCD50549DABAEFD6156DD7CA@PH7PR07MB9538.namprd07.prod.outlook.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/cdns3/cdnsp-debug.h | 5 +++-- drivers/usb/cdns3/cdnsp-ep0.c | 18 +++++++++++++++--- drivers/usb/cdns3/cdnsp-gadget.h | 6 ++++++ drivers/usb/cdns3/cdnsp-ring.c | 3 ++- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/drivers/usb/cdns3/cdnsp-debug.h b/drivers/usb/cdns3/cdnsp-debug.h index cd138acdcce16..86860686d8363 100644 --- a/drivers/usb/cdns3/cdnsp-debug.h +++ b/drivers/usb/cdns3/cdnsp-debug.h @@ -327,12 +327,13 @@ static inline const char *cdnsp_decode_trb(char *str, size_t size, u32 field0, case TRB_RESET_EP: case TRB_HALT_ENDPOINT: ret = scnprintf(str, size, - "%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c", + "%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c %c", cdnsp_trb_type_string(type), ep_num, ep_id % 2 ? "out" : "in", TRB_TO_EP_INDEX(field3), field1, field0, TRB_TO_SLOT_ID(field3), - field3 & TRB_CYCLE ? 'C' : 'c'); + field3 & TRB_CYCLE ? 'C' : 'c', + field3 & TRB_ESP ? 'P' : 'p'); break; case TRB_STOP_RING: ret = scnprintf(str, size, diff --git a/drivers/usb/cdns3/cdnsp-ep0.c b/drivers/usb/cdns3/cdnsp-ep0.c index f317d3c847810..5cd9b898ce971 100644 --- a/drivers/usb/cdns3/cdnsp-ep0.c +++ b/drivers/usb/cdns3/cdnsp-ep0.c @@ -414,6 +414,7 @@ static int cdnsp_ep0_std_request(struct cdnsp_device *pdev, void cdnsp_setup_analyze(struct cdnsp_device *pdev) { struct usb_ctrlrequest *ctrl = &pdev->setup; + struct cdnsp_ep *pep; int ret = -EINVAL; u16 len; @@ -427,10 +428,21 @@ void cdnsp_setup_analyze(struct cdnsp_device *pdev) goto out; } + pep = &pdev->eps[0]; + /* Restore the ep0 to Stopped/Running state. */ - if (pdev->eps[0].ep_state & EP_HALTED) { - trace_cdnsp_ep0_halted("Restore to normal state"); - cdnsp_halt_endpoint(pdev, &pdev->eps[0], 0); + if (pep->ep_state & EP_HALTED) { + if (GET_EP_CTX_STATE(pep->out_ctx) == EP_STATE_HALTED) + cdnsp_halt_endpoint(pdev, pep, 0); + + /* + * Halt Endpoint Command for SSP2 for ep0 preserve current + * endpoint state and driver has to synchronize the + * software endpoint state with endpoint output context + * state. + */ + pep->ep_state &= ~EP_HALTED; + pep->ep_state |= EP_STOPPED; } /* diff --git a/drivers/usb/cdns3/cdnsp-gadget.h b/drivers/usb/cdns3/cdnsp-gadget.h index 2afa3e558f85c..a91cca509db08 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.h +++ b/drivers/usb/cdns3/cdnsp-gadget.h @@ -987,6 +987,12 @@ enum cdnsp_setup_dev { #define STREAM_ID_FOR_TRB(p) ((((p)) << 16) & GENMASK(31, 16)) #define SCT_FOR_TRB(p) (((p) << 1) & 0x7) +/* + * Halt Endpoint Command TRB field. + * The ESP bit only exists in the SSP2 controller. + */ +#define TRB_ESP BIT(9) + /* Link TRB specific fields. */ #define TRB_TC BIT(1) diff --git a/drivers/usb/cdns3/cdnsp-ring.c b/drivers/usb/cdns3/cdnsp-ring.c index 757fdd918286d..0758f171f73ec 100644 --- a/drivers/usb/cdns3/cdnsp-ring.c +++ b/drivers/usb/cdns3/cdnsp-ring.c @@ -2485,7 +2485,8 @@ void cdnsp_queue_halt_endpoint(struct cdnsp_device *pdev, unsigned int ep_index) { cdnsp_queue_command(pdev, 0, 0, 0, TRB_TYPE(TRB_HALT_ENDPOINT) | SLOT_ID_FOR_TRB(pdev->slot_id) | - EP_ID_FOR_TRB(ep_index)); + EP_ID_FOR_TRB(ep_index) | + (!ep_index ? TRB_ESP : 0)); } void cdnsp_force_header_wakeup(struct cdnsp_device *pdev, int intf_num) -- GitLab From 3b1407caac17260d450f471d5c62792d8d0b17a5 Mon Sep 17 00:00:00 2001 From: Kuen-Han Tsai Date: Wed, 28 May 2025 18:03:11 +0800 Subject: [PATCH 2062/2211] usb: dwc3: Abort suspend on soft disconnect failure commit 630a1dec3b0eba2a695b9063f1c205d585cbfec9 upstream. When dwc3_gadget_soft_disconnect() fails, dwc3_suspend_common() keeps going with the suspend, resulting in a period where the power domain is off, but the gadget driver remains connected. Within this time frame, invoking vbus_event_work() will cause an error as it attempts to access DWC3 registers for endpoint disabling after the power domain has been completely shut down. Abort the suspend sequence when dwc3_gadget_suspend() cannot halt the controller and proceeds with a soft connect. Fixes: 9f8a67b65a49 ("usb: dwc3: gadget: fix gadget suspend/resume") Cc: stable Acked-by: Thinh Nguyen Signed-off-by: Kuen-Han Tsai Link: https://lore.kernel.org/r/20250528100315.2162699-1-khtsai@google.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/dwc3/core.c | 9 +++++++-- drivers/usb/dwc3/gadget.c | 22 +++++++++------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 7820d6815bedd..f4209726f8ecf 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -2364,6 +2364,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) { u32 reg; int i; + int ret; if (!pm_runtime_suspended(dwc->dev) && !PMSG_IS_AUTO(msg)) { dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) & @@ -2382,7 +2383,9 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) case DWC3_GCTL_PRTCAP_DEVICE: if (pm_runtime_suspended(dwc->dev)) break; - dwc3_gadget_suspend(dwc); + ret = dwc3_gadget_suspend(dwc); + if (ret) + return ret; synchronize_irq(dwc->irq_gadget); dwc3_core_exit(dwc); break; @@ -2417,7 +2420,9 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) break; if (dwc->current_otg_role == DWC3_OTG_ROLE_DEVICE) { - dwc3_gadget_suspend(dwc); + ret = dwc3_gadget_suspend(dwc); + if (ret) + return ret; synchronize_irq(dwc->irq_gadget); } diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 76e6000c65c78..37ae1dd3345d0 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -4788,26 +4788,22 @@ int dwc3_gadget_suspend(struct dwc3 *dwc) int ret; ret = dwc3_gadget_soft_disconnect(dwc); - if (ret) - goto err; - - spin_lock_irqsave(&dwc->lock, flags); - if (dwc->gadget_driver) - dwc3_disconnect_gadget(dwc); - spin_unlock_irqrestore(&dwc->lock, flags); - - return 0; - -err: /* * Attempt to reset the controller's state. Likely no * communication can be established until the host * performs a port reset. */ - if (dwc->softconnect) + if (ret && dwc->softconnect) { dwc3_gadget_soft_connect(dwc); + return -EAGAIN; + } - return ret; + spin_lock_irqsave(&dwc->lock, flags); + if (dwc->gadget_driver) + dwc3_disconnect_gadget(dwc); + spin_unlock_irqrestore(&dwc->lock, flags); + + return 0; } int dwc3_gadget_resume(struct dwc3 *dwc) -- GitLab From c68a27bbebbdb4e0ccd45d4f0df7111a09ddac24 Mon Sep 17 00:00:00 2001 From: Xu Yang Date: Sat, 14 Jun 2025 20:49:14 +0800 Subject: [PATCH 2063/2211] usb: chipidea: udc: disconnect/reconnect from host when do suspend/resume commit 31a6afbe86e8e9deba9ab53876ec49eafc7fd901 upstream. Shawn and John reported a hang issue during system suspend as below: - USB gadget is enabled as Ethernet - There is data transfer over USB Ethernet (scp a big file between host and device) - Device is going in/out suspend (echo mem > /sys/power/state) The root cause is the USB device controller is suspended but the USB bus is still active which caused the USB host continues to transfer data with device and the device continues to queue USB requests (in this case, a delayed TCP ACK packet trigger the issue) after controller is suspended, however the USB controller clock is already gated off. Then if udc driver access registers after that point, the system will hang. The correct way to avoid such issue is to disconnect device from host when the USB bus is not at suspend state. Then the host will receive disconnect event and stop data transfer in time. To continue make USB gadget device work after system resume, this will reconnect device automatically. To make usb wakeup work if USB bus is already at suspend state, this will keep connection for it only when USB device controller has enabled wakeup capability. Reported-by: Shawn Guo Reported-by: John Ernberg Closes: https://lore.kernel.org/linux-usb/aEZxmlHmjeWcXiF3@dragon/ Tested-by: John Ernberg # iMX8QXP Fixes: 235ffc17d014 ("usb: chipidea: udc: add suspend/resume support for device controller") Cc: stable Reviewed-by: Jun Li Signed-off-by: Xu Yang Acked-by: Peter Chen Link: https://lore.kernel.org/r/20250614124914.207540-1-xu.yang_2@nxp.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/chipidea/udc.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index fd6032874bf33..8f73bd5057a64 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c @@ -2362,6 +2362,10 @@ static void udc_suspend(struct ci_hdrc *ci) */ if (hw_read(ci, OP_ENDPTLISTADDR, ~0) == 0) hw_write(ci, OP_ENDPTLISTADDR, ~0, ~0); + + if (ci->gadget.connected && + (!ci->suspended || !device_may_wakeup(ci->dev))) + usb_gadget_disconnect(&ci->gadget); } static void udc_resume(struct ci_hdrc *ci, bool power_lost) @@ -2372,6 +2376,9 @@ static void udc_resume(struct ci_hdrc *ci, bool power_lost) OTGSC_BSVIS | OTGSC_BSVIE); if (ci->vbus_active) usb_gadget_vbus_disconnect(&ci->gadget); + } else if (ci->vbus_active && ci->driver && + !ci->gadget.connected) { + usb_gadget_connect(&ci->gadget); } /* Restore value 0 if it was set for power lost check */ -- GitLab From 7cb875016032317dabf65d83a24505386b8022c2 Mon Sep 17 00:00:00 2001 From: Heikki Krogerus Date: Wed, 11 Jun 2025 14:14:15 +0300 Subject: [PATCH 2064/2211] usb: acpi: fix device link removal commit 3b18405763c1ebb1efc15feef5563c9cdb2cc3a7 upstream. The device link to the USB4 host interface has to be removed manually since it's no longer auto removed. Fixes: 623dae3e7084 ("usb: acpi: fix boot hang due to early incorrect 'tunneled' USB3 device links") Cc: stable Signed-off-by: Heikki Krogerus Reviewed-by: Mika Westerberg Link: https://lore.kernel.org/r/20250611111415.2707865-1-heikki.krogerus@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/core/hub.c | 3 +++ drivers/usb/core/usb-acpi.c | 4 +++- include/linux/usb.h | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index da3d0e525b64e..da6da5ec42372 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -2336,6 +2336,9 @@ void usb_disconnect(struct usb_device **pdev) usb_remove_ep_devs(&udev->ep0); usb_unlock_device(udev); + if (udev->usb4_link) + device_link_del(udev->usb4_link); + /* Unregister the device. The device driver is responsible * for de-configuring the device and invoking the remove-device * notifier chain (used by usbfs and possibly others). diff --git a/drivers/usb/core/usb-acpi.c b/drivers/usb/core/usb-acpi.c index 494e21a11cd26..3bc68534dbcd3 100644 --- a/drivers/usb/core/usb-acpi.c +++ b/drivers/usb/core/usb-acpi.c @@ -157,7 +157,7 @@ EXPORT_SYMBOL_GPL(usb_acpi_set_power_state); */ static int usb_acpi_add_usb4_devlink(struct usb_device *udev) { - const struct device_link *link; + struct device_link *link; struct usb_port *port_dev; struct usb_hub *hub; @@ -188,6 +188,8 @@ static int usb_acpi_add_usb4_devlink(struct usb_device *udev) dev_dbg(&port_dev->dev, "Created device link from %s to %s\n", dev_name(&port_dev->child->dev), dev_name(nhi_fwnode->dev)); + udev->usb4_link = link; + return 0; } diff --git a/include/linux/usb.h b/include/linux/usb.h index 672d8fc2abdb0..e76e3515a1da0 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -612,6 +612,7 @@ struct usb3_lpm_parameters { * FIXME -- complete doc * @authenticated: Crypto authentication passed * @tunnel_mode: Connection native or tunneled over USB4 + * @usb4_link: device link to the USB4 host interface * @lpm_capable: device supports LPM * @lpm_devinit_allow: Allow USB3 device initiated LPM, exit latency is in range * @usb2_hw_lpm_capable: device can perform USB2 hardware LPM @@ -722,6 +723,7 @@ struct usb_device { unsigned reset_resume:1; unsigned port_is_suspended:1; enum usb_link_tunnel_mode tunnel_mode; + struct device_link *usb4_link; int slot_id; struct usb2_lpm_parameters l1_params; -- GitLab From 7b02e09fc0ba8f0f7505add0a4ccea19ce0fe271 Mon Sep 17 00:00:00 2001 From: Philipp Kerling Date: Sun, 29 Jun 2025 19:05:05 +0200 Subject: [PATCH 2065/2211] smb: client: fix readdir returning wrong type with POSIX extensions commit b8f89cb723b9e66f5dbd7199e4036fee34fb0de0 upstream. When SMB 3.1.1 POSIX Extensions are negotiated, userspace applications using readdir() or getdents() calls without stat() on each individual file (such as a simple "ls" or "find") would misidentify file types and exhibit strange behavior such as not descending into directories. The reason for this behavior is an oversight in the cifs_posix_to_fattr conversion function. Instead of extracting the entry type for cf_dtype from the properly converted cf_mode field, it tries to extract the type from the PDU. While the wire representation of the entry mode is similar in structure to POSIX stat(), the assignments of the entry types are different. Applying the S_DT macro to cf_mode instead yields the correct result. This is also what the equivalent function smb311_posix_info_to_fattr in inode.c already does for stat() etc.; which is why "ls -l" would give the correct file type but "ls" would not (as identified by the colors). Cc: stable@vger.kernel.org Signed-off-by: Philipp Kerling Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/readdir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/smb/client/readdir.c b/fs/smb/client/readdir.c index c3feb26fcfd03..7bf3214117a91 100644 --- a/fs/smb/client/readdir.c +++ b/fs/smb/client/readdir.c @@ -263,7 +263,7 @@ cifs_posix_to_fattr(struct cifs_fattr *fattr, struct smb2_posix_info *info, /* The Mode field in the response can now include the file type as well */ fattr->cf_mode = wire_mode_to_posix(le32_to_cpu(info->Mode), fattr->cf_cifsattrs & ATTR_DIRECTORY); - fattr->cf_dtype = S_DT(le32_to_cpu(info->Mode)); + fattr->cf_dtype = S_DT(fattr->cf_mode); switch (fattr->cf_mode & S_IFMT) { case S_IFLNK: -- GitLab From 631f9de9a7f439f09f2671db616242e0044b57f1 Mon Sep 17 00:00:00 2001 From: Shyam Prasad N Date: Mon, 30 Jun 2025 23:09:34 +0530 Subject: [PATCH 2066/2211] cifs: all initializations for tcon should happen in tcon_info_alloc commit 74ebd02163fde05baa23129e06dde4b8f0f2377a upstream. Today, a few work structs inside tcon are initialized inside cifs_get_tcon and not in tcon_info_alloc. As a result, if a tcon is obtained from tcon_info_alloc, but not called as a part of cifs_get_tcon, we may trip over. Cc: Signed-off-by: Shyam Prasad N Reviewed-by: Paulo Alcantara (Red Hat) Signed-off-by: Steve French Signed-off-by: Greg Kroah-Hartman --- fs/smb/client/cifsproto.h | 1 + fs/smb/client/connect.c | 8 +------- fs/smb/client/misc.c | 6 ++++++ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index 6e938b17875f5..fee7bc9848a36 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -136,6 +136,7 @@ extern int SendReceiveBlockingLock(const unsigned int xid, struct smb_hdr *out_buf, int *bytes_returned); +void smb2_query_server_interfaces(struct work_struct *work); void cifs_signal_cifsd_for_reconnect(struct TCP_Server_Info *server, bool all_channels); diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index fc3f0b956f323..ebc380b18da73 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -113,7 +113,7 @@ static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server) return rc; } -static void smb2_query_server_interfaces(struct work_struct *work) +void smb2_query_server_interfaces(struct work_struct *work) { int rc; int xid; @@ -2819,20 +2819,14 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx) tcon->max_cached_dirs = ctx->max_cached_dirs; tcon->nodelete = ctx->nodelete; tcon->local_lease = ctx->local_lease; - INIT_LIST_HEAD(&tcon->pending_opens); tcon->status = TID_GOOD; - INIT_DELAYED_WORK(&tcon->query_interfaces, - smb2_query_server_interfaces); if (ses->server->dialect >= SMB30_PROT_ID && (ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) { /* schedule query interfaces poll */ queue_delayed_work(cifsiod_wq, &tcon->query_interfaces, (SMB_INTERFACE_POLL_INTERVAL * HZ)); } -#ifdef CONFIG_CIFS_DFS_UPCALL - INIT_DELAYED_WORK(&tcon->dfs_cache_work, dfs_cache_refresh); -#endif spin_lock(&cifs_tcp_ses_lock); list_add(&tcon->tcon_list, &ses->tcon_list); spin_unlock(&cifs_tcp_ses_lock); diff --git a/fs/smb/client/misc.c b/fs/smb/client/misc.c index 5122f3895dfc2..57b6b191293ee 100644 --- a/fs/smb/client/misc.c +++ b/fs/smb/client/misc.c @@ -148,6 +148,12 @@ tcon_info_alloc(bool dir_leases_enabled, enum smb3_tcon_ref_trace trace) #ifdef CONFIG_CIFS_DFS_UPCALL INIT_LIST_HEAD(&ret_buf->dfs_ses_list); #endif + INIT_LIST_HEAD(&ret_buf->pending_opens); + INIT_DELAYED_WORK(&ret_buf->query_interfaces, + smb2_query_server_interfaces); +#ifdef CONFIG_CIFS_DFS_UPCALL + INIT_DELAYED_WORK(&ret_buf->dfs_cache_work, dfs_cache_refresh); +#endif return ret_buf; } -- GitLab From c745744a823189cf9f004b49e16365e43e94aeab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=B6nig?= Date: Tue, 28 Jan 2025 10:47:48 +0100 Subject: [PATCH 2067/2211] dma-buf: fix timeout handling in dma_resv_wait_timeout v2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 2b95a7db6e0f75587bffddbb490399cbb87e4985 upstream. Even the kerneldoc says that with a zero timeout the function should not wait for anything, but still return 1 to indicate that the fences are signaled now. Unfortunately that isn't what was implemented, instead of only returning 1 we also waited for at least one jiffies. Fix that by adjusting the handling to what the function is actually documented to do. v2: improve code readability Reported-by: Marek Olšák Reported-by: Lucas Stach Signed-off-by: Christian König Reviewed-by: Lucas Stach Cc: Link: https://lore.kernel.org/r/20250129105841.1806-1-christian.koenig@amd.com Signed-off-by: Greg Kroah-Hartman --- drivers/dma-buf/dma-resv.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c index b1ef4546346d4..bea3e9858aca5 100644 --- a/drivers/dma-buf/dma-resv.c +++ b/drivers/dma-buf/dma-resv.c @@ -685,11 +685,13 @@ long dma_resv_wait_timeout(struct dma_resv *obj, enum dma_resv_usage usage, dma_resv_iter_begin(&cursor, obj, usage); dma_resv_for_each_fence_unlocked(&cursor, fence) { - ret = dma_fence_wait_timeout(fence, intr, ret); - if (ret <= 0) { - dma_resv_iter_end(&cursor); - return ret; - } + ret = dma_fence_wait_timeout(fence, intr, timeout); + if (ret <= 0) + break; + + /* Even for zero timeout the return value is 1 */ + if (timeout) + timeout = ret; } dma_resv_iter_end(&cursor); -- GitLab From 4c37963d67fb945a59faf53bebe048ca201e44df Mon Sep 17 00:00:00 2001 From: "Michael J. Ruhl" Date: Fri, 27 Jun 2025 10:35:11 -0400 Subject: [PATCH 2068/2211] i2c/designware: Fix an initialization issue commit 3d30048958e0d43425f6d4e76565e6249fa71050 upstream. The i2c_dw_xfer_init() function requires msgs and msg_write_idx from the dev context to be initialized. amd_i2c_dw_xfer_quirk() inits msgs and msgs_num, but not msg_write_idx. This could allow an out of bounds access (of msgs). Initialize msg_write_idx before calling i2c_dw_xfer_init(). Reviewed-by: Andy Shevchenko Fixes: 17631e8ca2d3 ("i2c: designware: Add driver support for AMD NAVI GPU") Cc: # v5.13+ Signed-off-by: Michael J. Ruhl Signed-off-by: Andi Shyti Link: https://lore.kernel.org/r/20250627143511.489570-1-michael.j.ruhl@intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/i2c/busses/i2c-designware-master.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c index 28188c6d0555e..52dc666c3ef42 100644 --- a/drivers/i2c/busses/i2c-designware-master.c +++ b/drivers/i2c/busses/i2c-designware-master.c @@ -346,6 +346,7 @@ static int amd_i2c_dw_xfer_quirk(struct i2c_adapter *adap, struct i2c_msg *msgs, dev->msgs = msgs; dev->msgs_num = num_msgs; + dev->msg_write_idx = 0; i2c_dw_xfer_init(dev); /* Initiate messages read/write transaction */ -- GitLab From ccdc472b4df64135d1717f473c2df84103f8c8e1 Mon Sep 17 00:00:00 2001 From: Oliver Neukum Date: Thu, 5 Jun 2025 14:28:45 +0200 Subject: [PATCH 2069/2211] Logitech C-270 even more broken commit cee4392a57e14a799fbdee193bc4c0de65b29521 upstream. Some varieties of this device don't work with RESET_RESUME alone. Signed-off-by: Oliver Neukum Cc: stable Link: https://lore.kernel.org/r/20250605122852.1440382-1-oneukum@suse.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/core/quirks.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index c979ecd0169a2..46db600fdd824 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c @@ -227,7 +227,8 @@ static const struct usb_device_id usb_quirk_list[] = { { USB_DEVICE(0x046a, 0x0023), .driver_info = USB_QUIRK_RESET_RESUME }, /* Logitech HD Webcam C270 */ - { USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME }, + { USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME | + USB_QUIRK_NO_LPM}, /* Logitech HD Pro Webcams C920, C920-C, C922, C925e and C930e */ { USB_DEVICE(0x046d, 0x082d), .driver_info = USB_QUIRK_DELAY_INIT }, -- GitLab From 5f28563f0c6862c99eb115c918421d9b73f137ad Mon Sep 17 00:00:00 2001 From: Jens Wiklander Date: Mon, 2 Jun 2025 14:04:35 +0200 Subject: [PATCH 2070/2211] optee: ffa: fix sleep in atomic context commit 312d02adb959ea199372f375ada06e0186f651e4 upstream. The OP-TEE driver registers the function notif_callback() for FF-A notifications. However, this function is called in an atomic context leading to errors like this when processing asynchronous notifications: | BUG: sleeping function called from invalid context at kernel/locking/mutex.c:258 | in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 9, name: kworker/0:0 | preempt_count: 1, expected: 0 | RCU nest depth: 0, expected: 0 | CPU: 0 UID: 0 PID: 9 Comm: kworker/0:0 Not tainted 6.14.0-00019-g657536ebe0aa #13 | Hardware name: linux,dummy-virt (DT) | Workqueue: ffa_pcpu_irq_notification notif_pcpu_irq_work_fn | Call trace: | show_stack+0x18/0x24 (C) | dump_stack_lvl+0x78/0x90 | dump_stack+0x18/0x24 | __might_resched+0x114/0x170 | __might_sleep+0x48/0x98 | mutex_lock+0x24/0x80 | optee_get_msg_arg+0x7c/0x21c | simple_call_with_arg+0x50/0xc0 | optee_do_bottom_half+0x14/0x20 | notif_callback+0x3c/0x48 | handle_notif_callbacks+0x9c/0xe0 | notif_get_and_handle+0x40/0x88 | generic_exec_single+0x80/0xc0 | smp_call_function_single+0xfc/0x1a0 | notif_pcpu_irq_work_fn+0x2c/0x38 | process_one_work+0x14c/0x2b4 | worker_thread+0x2e4/0x3e0 | kthread+0x13c/0x210 | ret_from_fork+0x10/0x20 Fix this by adding work queue to process the notification in a non-atomic context. Fixes: d0476a59de06 ("optee: ffa_abi: add asynchronous notifications") Cc: stable@vger.kernel.org Reviewed-by: Sumit Garg Tested-by: Sudeep Holla Link: https://lore.kernel.org/r/20250602120452.2507084-1-jens.wiklander@linaro.org Signed-off-by: Jens Wiklander Signed-off-by: Greg Kroah-Hartman --- drivers/tee/optee/ffa_abi.c | 41 ++++++++++++++++++++++++------- drivers/tee/optee/optee_private.h | 2 ++ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c index f3af5666bb118..f9ef7d94cebd7 100644 --- a/drivers/tee/optee/ffa_abi.c +++ b/drivers/tee/optee/ffa_abi.c @@ -728,12 +728,21 @@ static bool optee_ffa_exchange_caps(struct ffa_device *ffa_dev, return true; } +static void notif_work_fn(struct work_struct *work) +{ + struct optee_ffa *optee_ffa = container_of(work, struct optee_ffa, + notif_work); + struct optee *optee = container_of(optee_ffa, struct optee, ffa); + + optee_do_bottom_half(optee->ctx); +} + static void notif_callback(int notify_id, void *cb_data) { struct optee *optee = cb_data; if (notify_id == optee->ffa.bottom_half_value) - optee_do_bottom_half(optee->ctx); + queue_work(optee->ffa.notif_wq, &optee->ffa.notif_work); else optee_notif_send(optee, notify_id); } @@ -817,9 +826,11 @@ static void optee_ffa_remove(struct ffa_device *ffa_dev) struct optee *optee = ffa_dev_get_drvdata(ffa_dev); u32 bottom_half_id = optee->ffa.bottom_half_value; - if (bottom_half_id != U32_MAX) + if (bottom_half_id != U32_MAX) { ffa_dev->ops->notifier_ops->notify_relinquish(ffa_dev, bottom_half_id); + destroy_workqueue(optee->ffa.notif_wq); + } optee_remove_common(optee); mutex_destroy(&optee->ffa.mutex); @@ -835,6 +846,13 @@ static int optee_ffa_async_notif_init(struct ffa_device *ffa_dev, u32 notif_id = 0; int rc; + INIT_WORK(&optee->ffa.notif_work, notif_work_fn); + optee->ffa.notif_wq = create_workqueue("optee_notification"); + if (!optee->ffa.notif_wq) { + rc = -EINVAL; + goto err; + } + while (true) { rc = ffa_dev->ops->notifier_ops->notify_request(ffa_dev, is_per_vcpu, @@ -851,19 +869,24 @@ static int optee_ffa_async_notif_init(struct ffa_device *ffa_dev, * notifications in that case. */ if (rc != -EACCES) - return rc; + goto err_wq; notif_id++; if (notif_id >= OPTEE_FFA_MAX_ASYNC_NOTIF_VALUE) - return rc; + goto err_wq; } optee->ffa.bottom_half_value = notif_id; rc = enable_async_notif(optee); - if (rc < 0) { - ffa_dev->ops->notifier_ops->notify_relinquish(ffa_dev, - notif_id); - optee->ffa.bottom_half_value = U32_MAX; - } + if (rc < 0) + goto err_rel; + + return 0; +err_rel: + ffa_dev->ops->notifier_ops->notify_relinquish(ffa_dev, notif_id); +err_wq: + destroy_workqueue(optee->ffa.notif_wq); +err: + optee->ffa.bottom_half_value = U32_MAX; return rc; } diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h index dc0f355ef72aa..9526087f0e680 100644 --- a/drivers/tee/optee/optee_private.h +++ b/drivers/tee/optee/optee_private.h @@ -165,6 +165,8 @@ struct optee_ffa { /* Serializes access to @global_ids */ struct mutex mutex; struct rhashtable global_ids; + struct workqueue_struct *notif_wq; + struct work_struct notif_work; }; struct optee; -- GitLab From 53892dc6869388d0378c36ad31c9c3d8320d3f80 Mon Sep 17 00:00:00 2001 From: Simon Xue Date: Mon, 23 Jun 2025 10:00:18 +0800 Subject: [PATCH 2071/2211] iommu/rockchip: prevent iommus dead loop when two masters share one IOMMU commit 62e062a29ad5133f67c20b333ba0a952a99161ae upstream. When two masters share an IOMMU, calling ops->of_xlate during the second master's driver init may overwrite iommu->domain set by the first. This causes the check if (iommu->domain == domain) in rk_iommu_attach_device() to fail, resulting in the same iommu->node being added twice to &rk_domain->iommus, which can lead to an infinite loop in subsequent &rk_domain->iommus operations. Cc: Fixes: 25c2325575cc ("iommu/rockchip: Add missing set_platform_dma_ops callback") Signed-off-by: Simon Xue Reviewed-by: Robin Murphy Link: https://lore.kernel.org/r/20250623020018.584802-1-xxm@rock-chips.com Signed-off-by: Joerg Roedel Signed-off-by: Greg Kroah-Hartman --- drivers/iommu/rockchip-iommu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index 4b369419b32ce..4c7f470a4752f 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c @@ -1154,7 +1154,6 @@ static int rk_iommu_of_xlate(struct device *dev, iommu_dev = of_find_device_by_node(args->np); data->iommu = platform_get_drvdata(iommu_dev); - data->iommu->domain = &rk_identity_domain; dev_iommu_priv_set(dev, data); platform_device_put(iommu_dev); @@ -1192,6 +1191,8 @@ static int rk_iommu_probe(struct platform_device *pdev) if (!iommu) return -ENOMEM; + iommu->domain = &rk_identity_domain; + platform_set_drvdata(pdev, iommu); iommu->dev = dev; iommu->num_mmu = 0; -- GitLab From d8ca2036f30db22238b677a853dee0849bab7df6 Mon Sep 17 00:00:00 2001 From: Zhang Rui Date: Thu, 19 Jun 2025 15:13:40 +0800 Subject: [PATCH 2072/2211] powercap: intel_rapl: Do not change CLAMPING bit if ENABLE bit cannot be changed commit 964209202ebe1569c858337441e87ef0f9d71416 upstream. PL1 cannot be disabled on some platforms. The ENABLE bit is still set after software clears it. This behavior leads to a scenario where, upon user request to disable the Power Limit through the powercap sysfs, the ENABLE bit remains set while the CLAMPING bit is inadvertently cleared. According to the Intel Software Developer's Manual, the CLAMPING bit, "When set, allows the processor to go below the OS requested P states in order to maintain the power below specified Platform Power Limit value." Thus this means the system may operate at higher power levels than intended on such platforms. Enhance the code to check ENABLE bit after writing to it, and stop further processing if ENABLE bit cannot be changed. Reported-by: Srinivas Pandruvada Fixes: 2d281d8196e3 ("PowerCap: Introduce Intel RAPL power capping driver") Cc: All applicable Signed-off-by: Zhang Rui Link: https://patch.msgid.link/20250619071340.384782-1-rui.zhang@intel.com [ rjw: Use str_enabled_disabled() instead of open-coded equivalent ] Signed-off-by: Rafael J. Wysocki Signed-off-by: Greg Kroah-Hartman --- drivers/powercap/intel_rapl_common.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_rapl_common.c index 5e793b80fd6b6..c3de52e78e016 100644 --- a/drivers/powercap/intel_rapl_common.c +++ b/drivers/powercap/intel_rapl_common.c @@ -340,12 +340,28 @@ static int set_domain_enable(struct powercap_zone *power_zone, bool mode) { struct rapl_domain *rd = power_zone_to_rapl_domain(power_zone); struct rapl_defaults *defaults = get_defaults(rd->rp); + u64 val; int ret; cpus_read_lock(); ret = rapl_write_pl_data(rd, POWER_LIMIT1, PL_ENABLE, mode); - if (!ret && defaults->set_floor_freq) + if (ret) + goto end; + + ret = rapl_read_pl_data(rd, POWER_LIMIT1, PL_ENABLE, false, &val); + if (ret) + goto end; + + if (mode != val) { + pr_debug("%s cannot be %s\n", power_zone->name, + str_enabled_disabled(mode)); + goto end; + } + + if (defaults->set_floor_freq) defaults->set_floor_freq(rd, mode); + +end: cpus_read_unlock(); return ret; -- GitLab From f5fe094f35a37adea40b2fd52c99bb1333be9b07 Mon Sep 17 00:00:00 2001 From: Vivian Wang Date: Tue, 24 Jun 2025 16:04:46 +0800 Subject: [PATCH 2073/2211] riscv: cpu_ops_sbi: Use static array for boot_data commit 2b29be967ae456fc09c320d91d52278cf721be1e upstream. Since commit 6b9f29b81b15 ("riscv: Enable pcpu page first chunk allocator"), if NUMA is enabled, the page percpu allocator may be used on very sparse configurations, or when requested on boot with percpu_alloc=page. In that case, percpu data gets put in the vmalloc area. However, sbi_hsm_hart_start() needs the physical address of a sbi_hart_boot_data, and simply assumes that __pa() would work. This causes the just started hart to immediately access an invalid address and hang. Fortunately, struct sbi_hart_boot_data is not too large, so we can simply allocate an array for boot_data statically, putting it in the kernel image. This fixes NUMA=y SMP boot on Sophgo SG2042. To reproduce on QEMU: Set CONFIG_NUMA=y and CONFIG_DEBUG_VIRTUAL=y, then run with: qemu-system-riscv64 -M virt -smp 2 -nographic \ -kernel arch/riscv/boot/Image \ -append "percpu_alloc=page" Kernel output: [ 0.000000] Booting Linux on hartid 0 [ 0.000000] Linux version 6.16.0-rc1 (dram@sakuya) (riscv64-unknown-linux-gnu-gcc (GCC) 14.2.1 20250322, GNU ld (GNU Binutils) 2.44) #11 SMP Tue Jun 24 14:56:22 CST 2025 ... [ 0.000000] percpu: 28 4K pages/cpu s85784 r8192 d20712 ... [ 0.083192] smp: Bringing up secondary CPUs ... [ 0.086722] ------------[ cut here ]------------ [ 0.086849] virt_to_phys used for non-linear address: (____ptrval____) (0xff2000000001d080) [ 0.088001] WARNING: CPU: 0 PID: 1 at arch/riscv/mm/physaddr.c:14 __virt_to_phys+0xae/0xe8 [ 0.088376] Modules linked in: [ 0.088656] CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.16.0-rc1 #11 NONE [ 0.088833] Hardware name: riscv-virtio,qemu (DT) [ 0.088948] epc : __virt_to_phys+0xae/0xe8 [ 0.089001] ra : __virt_to_phys+0xae/0xe8 [ 0.089037] epc : ffffffff80021eaa ra : ffffffff80021eaa sp : ff2000000004bbc0 [ 0.089057] gp : ffffffff817f49c0 tp : ff60000001d60000 t0 : 5f6f745f74726976 [ 0.089076] t1 : 0000000000000076 t2 : 705f6f745f747269 s0 : ff2000000004bbe0 [ 0.089095] s1 : ff2000000001d080 a0 : 0000000000000000 a1 : 0000000000000000 [ 0.089113] a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000 [ 0.089131] a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000000000 [ 0.089155] s2 : ffffffff8130dc00 s3 : 0000000000000001 s4 : 0000000000000001 [ 0.089174] s5 : ffffffff8185eff8 s6 : ff2000007f1eb000 s7 : ffffffff8002a2ec [ 0.089193] s8 : 0000000000000001 s9 : 0000000000000001 s10: 0000000000000000 [ 0.089211] s11: 0000000000000000 t3 : ffffffff8180a9f7 t4 : ffffffff8180a9f7 [ 0.089960] t5 : ffffffff8180a9f8 t6 : ff2000000004b9d8 [ 0.089984] status: 0000000200000120 badaddr: ffffffff80021eaa cause: 0000000000000003 [ 0.090101] [] __virt_to_phys+0xae/0xe8 [ 0.090228] [] sbi_cpu_start+0x6e/0xe8 [ 0.090247] [] __cpu_up+0x1e/0x8c [ 0.090260] [] bringup_cpu+0x42/0x258 [ 0.090277] [] cpuhp_invoke_callback+0xe0/0x40c [ 0.090292] [] __cpuhp_invoke_callback_range+0x68/0xfc [ 0.090320] [] _cpu_up+0x11a/0x244 [ 0.090334] [] cpu_up+0x52/0x90 [ 0.090384] [] bringup_nonboot_cpus+0x78/0x118 [ 0.090411] [] smp_init+0x34/0xb8 [ 0.090425] [] kernel_init_freeable+0x148/0x2e4 [ 0.090442] [] kernel_init+0x1e/0x14c [ 0.090455] [] ret_from_fork_kernel+0xe/0xf0 [ 0.090471] [] ret_from_fork_kernel_asm+0x16/0x18 [ 0.090560] ---[ end trace 0000000000000000 ]--- [ 1.179875] CPU1: failed to come online [ 1.190324] smp: Brought up 1 node, 1 CPU Cc: stable@vger.kernel.org Reported-by: Han Gao Fixes: 6b9f29b81b15 ("riscv: Enable pcpu page first chunk allocator") Reviewed-by: Alexandre Ghiti Tested-by: Alexandre Ghiti Signed-off-by: Vivian Wang Link: https://lore.kernel.org/r/20250624-riscv-hsm-boot-data-array-v1-1-50b5eeafbe61@iscas.ac.cn Signed-off-by: Alexandre Ghiti Signed-off-by: Greg Kroah-Hartman --- arch/riscv/kernel/cpu_ops_sbi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/riscv/kernel/cpu_ops_sbi.c b/arch/riscv/kernel/cpu_ops_sbi.c index e6fbaaf549562..87d6559448039 100644 --- a/arch/riscv/kernel/cpu_ops_sbi.c +++ b/arch/riscv/kernel/cpu_ops_sbi.c @@ -18,10 +18,10 @@ const struct cpu_operations cpu_ops_sbi; /* * Ordered booting via HSM brings one cpu at a time. However, cpu hotplug can - * be invoked from multiple threads in parallel. Define a per cpu data + * be invoked from multiple threads in parallel. Define an array of boot data * to handle that. */ -static DEFINE_PER_CPU(struct sbi_hart_boot_data, boot_data); +static struct sbi_hart_boot_data boot_data[NR_CPUS]; static int sbi_hsm_hart_start(unsigned long hartid, unsigned long saddr, unsigned long priv) @@ -67,7 +67,7 @@ static int sbi_cpu_start(unsigned int cpuid, struct task_struct *tidle) unsigned long boot_addr = __pa_symbol(secondary_start_sbi); unsigned long hartid = cpuid_to_hartid_map(cpuid); unsigned long hsm_data; - struct sbi_hart_boot_data *bdata = &per_cpu(boot_data, cpuid); + struct sbi_hart_boot_data *bdata = &boot_data[cpuid]; /* Make sure tidle is updated */ smp_mb(); -- GitLab From b11397bf9ade076873605f8ce903afa9e9650548 Mon Sep 17 00:00:00 2001 From: Kurt Borja Date: Mon, 30 Jun 2025 14:31:19 -0300 Subject: [PATCH 2074/2211] platform/x86: think-lmi: Create ksets consecutively MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 8dab34ca77293b409c3223636dde915a22656748 upstream. Avoid entering tlmi_release_attr() in error paths if both ksets are not yet created. This is accomplished by initializing them side by side. Reviewed-by: Mark Pearson Reviewed-by: Ilpo Järvinen Cc: stable@vger.kernel.org Signed-off-by: Kurt Borja Link: https://lore.kernel.org/r/20250630-lmi-fix-v3-1-ce4f81c9c481@gmail.com Signed-off-by: Ilpo Järvinen Signed-off-by: Greg Kroah-Hartman --- drivers/platform/x86/think-lmi.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/platform/x86/think-lmi.c b/drivers/platform/x86/think-lmi.c index 3a8e84589518a..34b991ef1506d 100644 --- a/drivers/platform/x86/think-lmi.c +++ b/drivers/platform/x86/think-lmi.c @@ -1388,6 +1388,14 @@ static int tlmi_sysfs_init(void) goto fail_device_created; } + tlmi_priv.authentication_kset = kset_create_and_add("authentication", NULL, + &tlmi_priv.class_dev->kobj); + if (!tlmi_priv.authentication_kset) { + kset_unregister(tlmi_priv.attribute_kset); + ret = -ENOMEM; + goto fail_device_created; + } + for (i = 0; i < TLMI_SETTINGS_COUNT; i++) { /* Check if index is a valid setting - skip if it isn't */ if (!tlmi_priv.setting[i]) @@ -1429,12 +1437,6 @@ static int tlmi_sysfs_init(void) } /* Create authentication entries */ - tlmi_priv.authentication_kset = kset_create_and_add("authentication", NULL, - &tlmi_priv.class_dev->kobj); - if (!tlmi_priv.authentication_kset) { - ret = -ENOMEM; - goto fail_create_attr; - } tlmi_priv.pwd_admin->kobj.kset = tlmi_priv.authentication_kset; ret = kobject_add(&tlmi_priv.pwd_admin->kobj, NULL, "%s", "Admin"); if (ret) -- GitLab From 5805edbea588b51b7092e85ebc52107257251aeb Mon Sep 17 00:00:00 2001 From: Kurt Borja Date: Mon, 30 Jun 2025 14:31:20 -0300 Subject: [PATCH 2075/2211] platform/x86: think-lmi: Fix kobject cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 9110056fe10b0519529bdbbac37311a5037ea0c2 upstream. In tlmi_analyze(), allocated structs with an embedded kobject are freed in error paths after the they were already initialized. Fix this by first by avoiding the initialization of kobjects in tlmi_analyze() and then by correctly cleaning them up in tlmi_release_attr() using their kset's kobject list. Fixes: a40cd7ef22fb ("platform/x86: think-lmi: Add WMI interface support on Lenovo platforms") Fixes: 30e78435d3bf ("platform/x86: think-lmi: Split kobject_init() and kobject_add() calls") Cc: stable@vger.kernel.org Reviewed-by: Mark Pearson Reviewed-by: Ilpo Järvinen Signed-off-by: Kurt Borja Link: https://lore.kernel.org/r/20250630-lmi-fix-v3-2-ce4f81c9c481@gmail.com Signed-off-by: Ilpo Järvinen Signed-off-by: Greg Kroah-Hartman --- drivers/platform/x86/think-lmi.c | 35 +++++++++++++++++--------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/drivers/platform/x86/think-lmi.c b/drivers/platform/x86/think-lmi.c index 34b991ef1506d..8f72cde75377b 100644 --- a/drivers/platform/x86/think-lmi.c +++ b/drivers/platform/x86/think-lmi.c @@ -1313,13 +1313,13 @@ static struct kobj_attribute debug_cmd = __ATTR_WO(debug_cmd); /* ---- Initialisation --------------------------------------------------------- */ static void tlmi_release_attr(void) { + struct kobject *pos, *n; int i; /* Attribute structures */ for (i = 0; i < TLMI_SETTINGS_COUNT; i++) { if (tlmi_priv.setting[i]) { sysfs_remove_group(&tlmi_priv.setting[i]->kobj, &tlmi_attr_group); - kobject_put(&tlmi_priv.setting[i]->kobj); } } sysfs_remove_file(&tlmi_priv.attribute_kset->kobj, &pending_reboot.attr); @@ -1328,6 +1328,9 @@ static void tlmi_release_attr(void) if (tlmi_priv.can_debug_cmd && debug_support) sysfs_remove_file(&tlmi_priv.attribute_kset->kobj, &debug_cmd.attr); + list_for_each_entry_safe(pos, n, &tlmi_priv.attribute_kset->list, entry) + kobject_put(pos); + kset_unregister(tlmi_priv.attribute_kset); /* Free up any saved signatures */ @@ -1336,19 +1339,17 @@ static void tlmi_release_attr(void) /* Authentication structures */ sysfs_remove_group(&tlmi_priv.pwd_admin->kobj, &auth_attr_group); - kobject_put(&tlmi_priv.pwd_admin->kobj); sysfs_remove_group(&tlmi_priv.pwd_power->kobj, &auth_attr_group); - kobject_put(&tlmi_priv.pwd_power->kobj); if (tlmi_priv.opcode_support) { sysfs_remove_group(&tlmi_priv.pwd_system->kobj, &auth_attr_group); - kobject_put(&tlmi_priv.pwd_system->kobj); sysfs_remove_group(&tlmi_priv.pwd_hdd->kobj, &auth_attr_group); - kobject_put(&tlmi_priv.pwd_hdd->kobj); sysfs_remove_group(&tlmi_priv.pwd_nvme->kobj, &auth_attr_group); - kobject_put(&tlmi_priv.pwd_nvme->kobj); } + list_for_each_entry_safe(pos, n, &tlmi_priv.authentication_kset->list, entry) + kobject_put(pos); + kset_unregister(tlmi_priv.authentication_kset); } @@ -1412,8 +1413,8 @@ static int tlmi_sysfs_init(void) /* Build attribute */ tlmi_priv.setting[i]->kobj.kset = tlmi_priv.attribute_kset; - ret = kobject_add(&tlmi_priv.setting[i]->kobj, NULL, - "%s", tlmi_priv.setting[i]->display_name); + ret = kobject_init_and_add(&tlmi_priv.setting[i]->kobj, &tlmi_attr_setting_ktype, + NULL, "%s", tlmi_priv.setting[i]->display_name); if (ret) goto fail_create_attr; @@ -1438,7 +1439,8 @@ static int tlmi_sysfs_init(void) /* Create authentication entries */ tlmi_priv.pwd_admin->kobj.kset = tlmi_priv.authentication_kset; - ret = kobject_add(&tlmi_priv.pwd_admin->kobj, NULL, "%s", "Admin"); + ret = kobject_init_and_add(&tlmi_priv.pwd_admin->kobj, &tlmi_pwd_setting_ktype, + NULL, "%s", "Admin"); if (ret) goto fail_create_attr; @@ -1447,7 +1449,8 @@ static int tlmi_sysfs_init(void) goto fail_create_attr; tlmi_priv.pwd_power->kobj.kset = tlmi_priv.authentication_kset; - ret = kobject_add(&tlmi_priv.pwd_power->kobj, NULL, "%s", "Power-on"); + ret = kobject_init_and_add(&tlmi_priv.pwd_power->kobj, &tlmi_pwd_setting_ktype, + NULL, "%s", "Power-on"); if (ret) goto fail_create_attr; @@ -1457,7 +1460,8 @@ static int tlmi_sysfs_init(void) if (tlmi_priv.opcode_support) { tlmi_priv.pwd_system->kobj.kset = tlmi_priv.authentication_kset; - ret = kobject_add(&tlmi_priv.pwd_system->kobj, NULL, "%s", "System"); + ret = kobject_init_and_add(&tlmi_priv.pwd_system->kobj, &tlmi_pwd_setting_ktype, + NULL, "%s", "System"); if (ret) goto fail_create_attr; @@ -1466,7 +1470,8 @@ static int tlmi_sysfs_init(void) goto fail_create_attr; tlmi_priv.pwd_hdd->kobj.kset = tlmi_priv.authentication_kset; - ret = kobject_add(&tlmi_priv.pwd_hdd->kobj, NULL, "%s", "HDD"); + ret = kobject_init_and_add(&tlmi_priv.pwd_hdd->kobj, &tlmi_pwd_setting_ktype, + NULL, "%s", "HDD"); if (ret) goto fail_create_attr; @@ -1475,7 +1480,8 @@ static int tlmi_sysfs_init(void) goto fail_create_attr; tlmi_priv.pwd_nvme->kobj.kset = tlmi_priv.authentication_kset; - ret = kobject_add(&tlmi_priv.pwd_nvme->kobj, NULL, "%s", "NVMe"); + ret = kobject_init_and_add(&tlmi_priv.pwd_nvme->kobj, &tlmi_pwd_setting_ktype, + NULL, "%s", "NVMe"); if (ret) goto fail_create_attr; @@ -1512,8 +1518,6 @@ static struct tlmi_pwd_setting *tlmi_create_auth(const char *pwd_type, new_pwd->maxlen = tlmi_priv.pwdcfg.core.max_length; new_pwd->index = 0; - kobject_init(&new_pwd->kobj, &tlmi_pwd_setting_ktype); - return new_pwd; } @@ -1617,7 +1621,6 @@ static int tlmi_analyze(void) if (setting->possible_values) strreplace(setting->possible_values, ',', ';'); - kobject_init(&setting->kobj, &tlmi_attr_setting_ktype); tlmi_priv.setting[i] = setting; kfree(item); } -- GitLab From f65ad436e4bce0e8fb7c9204305cbea43304a2fd Mon Sep 17 00:00:00 2001 From: Kurt Borja Date: Mon, 30 Jun 2025 14:31:21 -0300 Subject: [PATCH 2076/2211] platform/x86: think-lmi: Fix sysfs group cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 4f30f946f27b7f044cf8f3f1f353dee1dcd3517a upstream. Many error paths in tlmi_sysfs_init() lead to sysfs groups being removed when they were not even created. Fix this by letting the kobject core manage these groups through their kobj_type's defult_groups. Fixes: a40cd7ef22fb ("platform/x86: think-lmi: Add WMI interface support on Lenovo platforms") Cc: stable@vger.kernel.org Reviewed-by: Mark Pearson Reviewed-by: Ilpo Järvinen Signed-off-by: Kurt Borja Link: https://lore.kernel.org/r/20250630-lmi-fix-v3-3-ce4f81c9c481@gmail.com Signed-off-by: Ilpo Järvinen Signed-off-by: Greg Kroah-Hartman --- drivers/platform/x86/think-lmi.c | 43 +++----------------------------- 1 file changed, 4 insertions(+), 39 deletions(-) diff --git a/drivers/platform/x86/think-lmi.c b/drivers/platform/x86/think-lmi.c index 8f72cde75377b..6ad2af46248b9 100644 --- a/drivers/platform/x86/think-lmi.c +++ b/drivers/platform/x86/think-lmi.c @@ -906,6 +906,7 @@ static const struct attribute_group auth_attr_group = { .is_visible = auth_attr_is_visible, .attrs = auth_attrs, }; +__ATTRIBUTE_GROUPS(auth_attr); /* ---- Attributes sysfs --------------------------------------------------------- */ static ssize_t display_name_show(struct kobject *kobj, struct kobj_attribute *attr, @@ -1121,6 +1122,7 @@ static const struct attribute_group tlmi_attr_group = { .is_visible = attr_is_visible, .attrs = tlmi_attrs, }; +__ATTRIBUTE_GROUPS(tlmi_attr); static void tlmi_attr_setting_release(struct kobject *kobj) { @@ -1140,11 +1142,13 @@ static void tlmi_pwd_setting_release(struct kobject *kobj) static const struct kobj_type tlmi_attr_setting_ktype = { .release = &tlmi_attr_setting_release, .sysfs_ops = &kobj_sysfs_ops, + .default_groups = tlmi_attr_groups, }; static const struct kobj_type tlmi_pwd_setting_ktype = { .release = &tlmi_pwd_setting_release, .sysfs_ops = &kobj_sysfs_ops, + .default_groups = auth_attr_groups, }; static ssize_t pending_reboot_show(struct kobject *kobj, struct kobj_attribute *attr, @@ -1314,14 +1318,8 @@ static struct kobj_attribute debug_cmd = __ATTR_WO(debug_cmd); static void tlmi_release_attr(void) { struct kobject *pos, *n; - int i; /* Attribute structures */ - for (i = 0; i < TLMI_SETTINGS_COUNT; i++) { - if (tlmi_priv.setting[i]) { - sysfs_remove_group(&tlmi_priv.setting[i]->kobj, &tlmi_attr_group); - } - } sysfs_remove_file(&tlmi_priv.attribute_kset->kobj, &pending_reboot.attr); sysfs_remove_file(&tlmi_priv.attribute_kset->kobj, &save_settings.attr); @@ -1338,15 +1336,6 @@ static void tlmi_release_attr(void) kfree(tlmi_priv.pwd_admin->save_signature); /* Authentication structures */ - sysfs_remove_group(&tlmi_priv.pwd_admin->kobj, &auth_attr_group); - sysfs_remove_group(&tlmi_priv.pwd_power->kobj, &auth_attr_group); - - if (tlmi_priv.opcode_support) { - sysfs_remove_group(&tlmi_priv.pwd_system->kobj, &auth_attr_group); - sysfs_remove_group(&tlmi_priv.pwd_hdd->kobj, &auth_attr_group); - sysfs_remove_group(&tlmi_priv.pwd_nvme->kobj, &auth_attr_group); - } - list_for_each_entry_safe(pos, n, &tlmi_priv.authentication_kset->list, entry) kobject_put(pos); @@ -1417,10 +1406,6 @@ static int tlmi_sysfs_init(void) NULL, "%s", tlmi_priv.setting[i]->display_name); if (ret) goto fail_create_attr; - - ret = sysfs_create_group(&tlmi_priv.setting[i]->kobj, &tlmi_attr_group); - if (ret) - goto fail_create_attr; } ret = sysfs_create_file(&tlmi_priv.attribute_kset->kobj, &pending_reboot.attr); @@ -1444,20 +1429,12 @@ static int tlmi_sysfs_init(void) if (ret) goto fail_create_attr; - ret = sysfs_create_group(&tlmi_priv.pwd_admin->kobj, &auth_attr_group); - if (ret) - goto fail_create_attr; - tlmi_priv.pwd_power->kobj.kset = tlmi_priv.authentication_kset; ret = kobject_init_and_add(&tlmi_priv.pwd_power->kobj, &tlmi_pwd_setting_ktype, NULL, "%s", "Power-on"); if (ret) goto fail_create_attr; - ret = sysfs_create_group(&tlmi_priv.pwd_power->kobj, &auth_attr_group); - if (ret) - goto fail_create_attr; - if (tlmi_priv.opcode_support) { tlmi_priv.pwd_system->kobj.kset = tlmi_priv.authentication_kset; ret = kobject_init_and_add(&tlmi_priv.pwd_system->kobj, &tlmi_pwd_setting_ktype, @@ -1465,29 +1442,17 @@ static int tlmi_sysfs_init(void) if (ret) goto fail_create_attr; - ret = sysfs_create_group(&tlmi_priv.pwd_system->kobj, &auth_attr_group); - if (ret) - goto fail_create_attr; - tlmi_priv.pwd_hdd->kobj.kset = tlmi_priv.authentication_kset; ret = kobject_init_and_add(&tlmi_priv.pwd_hdd->kobj, &tlmi_pwd_setting_ktype, NULL, "%s", "HDD"); if (ret) goto fail_create_attr; - ret = sysfs_create_group(&tlmi_priv.pwd_hdd->kobj, &auth_attr_group); - if (ret) - goto fail_create_attr; - tlmi_priv.pwd_nvme->kobj.kset = tlmi_priv.authentication_kset; ret = kobject_init_and_add(&tlmi_priv.pwd_nvme->kobj, &tlmi_pwd_setting_ktype, NULL, "%s", "NVMe"); if (ret) goto fail_create_attr; - - ret = sysfs_create_group(&tlmi_priv.pwd_nvme->kobj, &auth_attr_group); - if (ret) - goto fail_create_attr; } return ret; -- GitLab From c782f98eef14197affa8a7b91e6981420f109ea9 Mon Sep 17 00:00:00 2001 From: Andrei Kuchynski Date: Tue, 24 Jun 2025 13:32:46 +0000 Subject: [PATCH 2077/2211] usb: typec: displayport: Fix potential deadlock commit 099cf1fbb8afc3771f408109f62bdec66f85160e upstream. The deadlock can occur due to a recursive lock acquisition of `cros_typec_altmode_data::mutex`. The call chain is as follows: 1. cros_typec_altmode_work() acquires the mutex 2. typec_altmode_vdm() -> dp_altmode_vdm() -> 3. typec_altmode_exit() -> cros_typec_altmode_exit() 4. cros_typec_altmode_exit() attempts to acquire the mutex again To prevent this, defer the `typec_altmode_exit()` call by scheduling it rather than calling it directly from within the mutex-protected context. Cc: stable Fixes: b4b38ffb38c9 ("usb: typec: displayport: Receive DP Status Update NAK request exit dp altmode") Signed-off-by: Andrei Kuchynski Reviewed-by: Heikki Krogerus Link: https://lore.kernel.org/r/20250624133246.3936737-1-akuchynski@chromium.org Signed-off-by: Greg Kroah-Hartman --- drivers/usb/typec/altmodes/displayport.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c index 2dcf7ac3ea318..6964f403a2d53 100644 --- a/drivers/usb/typec/altmodes/displayport.c +++ b/drivers/usb/typec/altmodes/displayport.c @@ -394,8 +394,7 @@ static int dp_altmode_vdm(struct typec_altmode *alt, case CMDT_RSP_NAK: switch (cmd) { case DP_CMD_STATUS_UPDATE: - if (typec_altmode_exit(alt)) - dev_err(&dp->alt->dev, "Exit Mode Failed!\n"); + dp->state = DP_STATE_EXIT; break; case DP_CMD_CONFIGURE: dp->data.conf = 0; -- GitLab From 679bf9a0ccb88b164364798a15814d384cb82e85 Mon Sep 17 00:00:00 2001 From: Madhavan Srinivasan Date: Sun, 11 May 2025 09:41:11 +0530 Subject: [PATCH 2078/2211] powerpc/kernel: Fix ppc_save_regs inclusion in build commit 93bd4a80efeb521314485a06d8c21157240497bb upstream. Recent patch fixed an old commit 'fc2a5a6161a2 ("powerpc/64s: ppc_save_regs is now needed for all 64s builds")' which is to include building of ppc_save_reg.c only when XMON and KEXEC_CORE and PPC_BOOK3S are enabled. This was valid, since ppc_save_regs was called only in replay_system_reset() of old irq.c which was under BOOK3S. But there has been multiple refactoring of irq.c and have added call to ppc_save_regs() from __replay_soft_interrupts -> replay_soft_interrupts which is part of irq_64.c included under CONFIG_PPC64. And since ppc_save_regs is called in CRASH_DUMP path as part of crash_setup_regs in kexec.h, CONFIG_PPC32 also needs it. So with this recent patch which enabled the building of ppc_save_regs.c caused a build break when none of these (XMON, KEXEC_CORE, BOOK3S) where enabled as part of config. Patch to enable building of ppc_save_regs.c by defaults. Signed-off-by: Madhavan Srinivasan Link: https://patch.msgid.link/20250511041111.841158-1-maddy@linux.ibm.com Cc: Guenter Roeck Signed-off-by: Greg Kroah-Hartman --- arch/powerpc/kernel/Makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index b4006a4a11216..04d6a1e8ff9a2 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile @@ -162,9 +162,7 @@ endif obj64-$(CONFIG_PPC_TRANSACTIONAL_MEM) += tm.o -ifneq ($(CONFIG_XMON)$(CONFIG_KEXEC_CORE)$(CONFIG_PPC_BOOK3S),) obj-y += ppc_save_regs.o -endif obj-$(CONFIG_EPAPR_PARAVIRT) += epapr_paravirt.o epapr_hcalls.o obj-$(CONFIG_KVM_GUEST) += kvm.o kvm_emul.o -- GitLab From ead91de35d9cd5c4f80ec51e6020f342079170af Mon Sep 17 00:00:00 2001 From: Jeongjun Park Date: Fri, 9 May 2025 01:56:20 +0900 Subject: [PATCH 2079/2211] mm/vmalloc: fix data race in show_numa_info() commit 5c5f0468d172ddec2e333d738d2a1f85402cf0bc upstream. The following data-race was found in show_numa_info(): ================================================================== BUG: KCSAN: data-race in vmalloc_info_show / vmalloc_info_show read to 0xffff88800971fe30 of 4 bytes by task 8289 on cpu 0: show_numa_info mm/vmalloc.c:4936 [inline] vmalloc_info_show+0x5a8/0x7e0 mm/vmalloc.c:5016 seq_read_iter+0x373/0xb40 fs/seq_file.c:230 proc_reg_read_iter+0x11e/0x170 fs/proc/inode.c:299 .... write to 0xffff88800971fe30 of 4 bytes by task 8287 on cpu 1: show_numa_info mm/vmalloc.c:4934 [inline] vmalloc_info_show+0x38f/0x7e0 mm/vmalloc.c:5016 seq_read_iter+0x373/0xb40 fs/seq_file.c:230 proc_reg_read_iter+0x11e/0x170 fs/proc/inode.c:299 .... value changed: 0x0000008f -> 0x00000000 ================================================================== According to this report,there is a read/write data-race because m->private is accessible to multiple CPUs. To fix this, instead of allocating the heap in proc_vmalloc_init() and passing the heap address to m->private, vmalloc_info_show() should allocate the heap. Link: https://lkml.kernel.org/r/20250508165620.15321-1-aha310510@gmail.com Fixes: 8e1d743f2c26 ("mm: vmalloc: support multiple nodes in vmallocinfo") Signed-off-by: Jeongjun Park Suggested-by: Eric Dumazet Suggested-by: Andrew Morton Reviewed-by: "Uladzislau Rezki (Sony)" Signed-off-by: Andrew Morton Signed-off-by: Greg Kroah-Hartman --- mm/vmalloc.c | 63 +++++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index cc04e501b1c53..7888600b6a795 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3095,7 +3095,7 @@ static void clear_vm_uninitialized_flag(struct vm_struct *vm) /* * Before removing VM_UNINITIALIZED, * we should make sure that vm has proper values. - * Pair with smp_rmb() in show_numa_info(). + * Pair with smp_rmb() in vread_iter() and vmalloc_info_show(). */ smp_wmb(); vm->flags &= ~VM_UNINITIALIZED; @@ -4938,28 +4938,29 @@ bool vmalloc_dump_obj(void *object) #endif #ifdef CONFIG_PROC_FS -static void show_numa_info(struct seq_file *m, struct vm_struct *v) -{ - if (IS_ENABLED(CONFIG_NUMA)) { - unsigned int nr, *counters = m->private; - unsigned int step = 1U << vm_area_page_order(v); - if (!counters) - return; +/* + * Print number of pages allocated on each memory node. + * + * This function can only be called if CONFIG_NUMA is enabled + * and VM_UNINITIALIZED bit in v->flags is disabled. + */ +static void show_numa_info(struct seq_file *m, struct vm_struct *v, + unsigned int *counters) +{ + unsigned int nr; + unsigned int step = 1U << vm_area_page_order(v); - if (v->flags & VM_UNINITIALIZED) - return; - /* Pair with smp_wmb() in clear_vm_uninitialized_flag() */ - smp_rmb(); + if (!counters) + return; - memset(counters, 0, nr_node_ids * sizeof(unsigned int)); + memset(counters, 0, nr_node_ids * sizeof(unsigned int)); - for (nr = 0; nr < v->nr_pages; nr += step) - counters[page_to_nid(v->pages[nr])] += step; - for_each_node_state(nr, N_HIGH_MEMORY) - if (counters[nr]) - seq_printf(m, " N%u=%u", nr, counters[nr]); - } + for (nr = 0; nr < v->nr_pages; nr += step) + counters[page_to_nid(v->pages[nr])] += step; + for_each_node_state(nr, N_HIGH_MEMORY) + if (counters[nr]) + seq_printf(m, " N%u=%u", nr, counters[nr]); } static void show_purge_info(struct seq_file *m) @@ -4987,6 +4988,10 @@ static int vmalloc_info_show(struct seq_file *m, void *p) struct vmap_area *va; struct vm_struct *v; int i; + unsigned int *counters; + + if (IS_ENABLED(CONFIG_NUMA)) + counters = kmalloc(nr_node_ids * sizeof(unsigned int), GFP_KERNEL); for (i = 0; i < nr_vmap_nodes; i++) { vn = &vmap_nodes[i]; @@ -5003,6 +5008,11 @@ static int vmalloc_info_show(struct seq_file *m, void *p) } v = va->vm; + if (v->flags & VM_UNINITIALIZED) + continue; + + /* Pair with smp_wmb() in clear_vm_uninitialized_flag() */ + smp_rmb(); seq_printf(m, "0x%pK-0x%pK %7ld", v->addr, v->addr + v->size, v->size); @@ -5037,7 +5047,9 @@ static int vmalloc_info_show(struct seq_file *m, void *p) if (is_vmalloc_addr(v->pages)) seq_puts(m, " vpages"); - show_numa_info(m, v); + if (IS_ENABLED(CONFIG_NUMA)) + show_numa_info(m, v, counters); + seq_putc(m, '\n'); } spin_unlock(&vn->busy.lock); @@ -5047,19 +5059,14 @@ static int vmalloc_info_show(struct seq_file *m, void *p) * As a final step, dump "unpurged" areas. */ show_purge_info(m); + if (IS_ENABLED(CONFIG_NUMA)) + kfree(counters); return 0; } static int __init proc_vmalloc_init(void) { - void *priv_data = NULL; - - if (IS_ENABLED(CONFIG_NUMA)) - priv_data = kmalloc(nr_node_ids * sizeof(unsigned int), GFP_KERNEL); - - proc_create_single_data("vmallocinfo", - 0400, NULL, vmalloc_info_show, priv_data); - + proc_create_single("vmallocinfo", 0400, NULL, vmalloc_info_show); return 0; } module_init(proc_vmalloc_init); -- GitLab From 4c443046d8c9ed8724a4f4c3c2457d3ac8814b2f Mon Sep 17 00:00:00 2001 From: Kairui Song Date: Wed, 4 Jun 2025 23:10:38 +0800 Subject: [PATCH 2080/2211] mm: userfaultfd: fix race of userfaultfd_move and swap cache commit 0ea148a799198518d8ebab63ddd0bb6114a103bc upstream. This commit fixes two kinds of races, they may have different results: Barry reported a BUG_ON in commit c50f8e6053b0, we may see the same BUG_ON if the filemap lookup returned NULL and folio is added to swap cache after that. If another kind of race is triggered (folio changed after lookup) we may see RSS counter is corrupted: [ 406.893936] BUG: Bad rss-counter state mm:ffff0000c5a9ddc0 type:MM_ANONPAGES val:-1 [ 406.894071] BUG: Bad rss-counter state mm:ffff0000c5a9ddc0 type:MM_SHMEMPAGES val:1 Because the folio is being accounted to the wrong VMA. I'm not sure if there will be any data corruption though, seems no. The issues above are critical already. On seeing a swap entry PTE, userfaultfd_move does a lockless swap cache lookup, and tries to move the found folio to the faulting vma. Currently, it relies on checking the PTE value to ensure that the moved folio still belongs to the src swap entry and that no new folio has been added to the swap cache, which turns out to be unreliable. While working and reviewing the swap table series with Barry, following existing races are observed and reproduced [1]: In the example below, move_pages_pte is moving src_pte to dst_pte, where src_pte is a swap entry PTE holding swap entry S1, and S1 is not in the swap cache: CPU1 CPU2 userfaultfd_move move_pages_pte() entry = pte_to_swp_entry(orig_src_pte); // Here it got entry = S1 ... < interrupted> ... // folio A is a new allocated folio // and get installed into src_pte // src_pte now points to folio A, S1 // has swap count == 0, it can be freed // by folio_swap_swap or swap // allocator's reclaim. // folio B is a folio in another VMA. // S1 is freed, folio B can use it // for swap out with no problem. ... folio = filemap_get_folio(S1) // Got folio B here !!! ... < interrupted again> ... // Now S1 is free to be used again. // Now src_pte is a swap entry PTE // holding S1 again. folio_trylock(folio) move_swap_pte double_pt_lock is_pte_pages_stable // Check passed because src_pte == S1 folio_move_anon_rmap(...) // Moved invalid folio B here !!! The race window is very short and requires multiple collisions of multiple rare events, so it's very unlikely to happen, but with a deliberately constructed reproducer and increased time window, it can be reproduced easily. This can be fixed by checking if the folio returned by filemap is the valid swap cache folio after acquiring the folio lock. Another similar race is possible: filemap_get_folio may return NULL, but folio (A) could be swapped in and then swapped out again using the same swap entry after the lookup. In such a case, folio (A) may remain in the swap cache, so it must be moved too: CPU1 CPU2 userfaultfd_move move_pages_pte() entry = pte_to_swp_entry(orig_src_pte); // Here it got entry = S1, and S1 is not in swap cache folio = filemap_get_folio(S1) // Got NULL ... < interrupted again> ... move_swap_pte double_pt_lock is_pte_pages_stable // Check passed because src_pte == S1 folio_move_anon_rmap(...) // folio A is ignored !!! Fix this by checking the swap cache again after acquiring the src_pte lock. And to avoid the filemap overhead, we check swap_map directly [2]. The SWP_SYNCHRONOUS_IO path does make the problem more complex, but so far we don't need to worry about that, since folios can only be exposed to the swap cache in the swap out path, and this is covered in this patch by checking the swap cache again after acquiring the src_pte lock. Testing with a simple C program that allocates and moves several GB of memory did not show any observable performance change. Link: https://lkml.kernel.org/r/20250604151038.21968-1-ryncsn@gmail.com Fixes: adef440691ba ("userfaultfd: UFFDIO_MOVE uABI") Signed-off-by: Kairui Song Closes: https://lore.kernel.org/linux-mm/CAMgjq7B1K=6OOrK2OUZ0-tqCzi+EJt+2_K97TPGoSt=9+JwP7Q@mail.gmail.com/ [1] Link: https://lore.kernel.org/all/CAGsJ_4yJhJBo16XhiC-nUzSheyX-V3-nFE+tAi=8Y560K8eT=A@mail.gmail.com/ [2] Reviewed-by: Lokesh Gidra Acked-by: Peter Xu Reviewed-by: Suren Baghdasaryan Reviewed-by: Barry Song Reviewed-by: Chris Li Cc: Andrea Arcangeli Cc: David Hildenbrand Cc: Kairui Song Cc: Signed-off-by: Andrew Morton (cherry picked from commit 0ea148a799198518d8ebab63ddd0bb6114a103bc) [ lokeshgidra: resolved merged conflict caused by the difference in move_swap_pte() arguments ] Signed-off-by: Lokesh Gidra Signed-off-by: Greg Kroah-Hartman --- mm/userfaultfd.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c index e06e3d2709610..2646b75163d5f 100644 --- a/mm/userfaultfd.c +++ b/mm/userfaultfd.c @@ -1078,8 +1078,18 @@ static int move_swap_pte(struct mm_struct *mm, struct vm_area_struct *dst_vma, pte_t *dst_pte, pte_t *src_pte, pte_t orig_dst_pte, pte_t orig_src_pte, spinlock_t *dst_ptl, spinlock_t *src_ptl, - struct folio *src_folio) + struct folio *src_folio, + struct swap_info_struct *si, swp_entry_t entry) { + /* + * Check if the folio still belongs to the target swap entry after + * acquiring the lock. Folio can be freed in the swap cache while + * not locked. + */ + if (src_folio && unlikely(!folio_test_swapcache(src_folio) || + entry.val != src_folio->swap.val)) + return -EAGAIN; + double_pt_lock(dst_ptl, src_ptl); if (!pte_same(ptep_get(src_pte), orig_src_pte) || @@ -1096,6 +1106,25 @@ static int move_swap_pte(struct mm_struct *mm, struct vm_area_struct *dst_vma, if (src_folio) { folio_move_anon_rmap(src_folio, dst_vma); src_folio->index = linear_page_index(dst_vma, dst_addr); + } else { + /* + * Check if the swap entry is cached after acquiring the src_pte + * lock. Otherwise, we might miss a newly loaded swap cache folio. + * + * Check swap_map directly to minimize overhead, READ_ONCE is sufficient. + * We are trying to catch newly added swap cache, the only possible case is + * when a folio is swapped in and out again staying in swap cache, using the + * same entry before the PTE check above. The PTL is acquired and released + * twice, each time after updating the swap_map's flag. So holding + * the PTL here ensures we see the updated value. False positive is possible, + * e.g. SWP_SYNCHRONOUS_IO swapin may set the flag without touching the + * cache, or during the tiny synchronization window between swap cache and + * swap_map, but it will be gone very quickly, worst result is retry jitters. + */ + if (READ_ONCE(si->swap_map[swp_offset(entry)]) & SWAP_HAS_CACHE) { + double_pt_unlock(dst_ptl, src_ptl); + return -EAGAIN; + } } orig_src_pte = ptep_get_and_clear(mm, src_addr, src_pte); @@ -1391,7 +1420,7 @@ retry: } err = move_swap_pte(mm, dst_vma, dst_addr, src_addr, dst_pte, src_pte, orig_dst_pte, orig_src_pte, - dst_ptl, src_ptl, src_folio); + dst_ptl, src_ptl, src_folio, si, entry); } out: -- GitLab From 0720e436e594d330bc10851889d90f6b48a2b32d Mon Sep 17 00:00:00 2001 From: "Borislav Petkov (AMD)" Date: Wed, 11 Sep 2024 05:13:46 +0200 Subject: [PATCH 2081/2211] x86/bugs: Rename MDS machinery to something more generic Commit f9af88a3d384c8b55beb5dc5483e5da0135fadbd upstream. It will be used by other x86 mitigations. No functional changes. Signed-off-by: Borislav Petkov (AMD) Reviewed-by: Pawan Gupta Signed-off-by: Greg Kroah-Hartman --- .../hw-vuln/processor_mmio_stale_data.rst | 4 +-- Documentation/arch/x86/mds.rst | 8 ++--- arch/x86/entry/entry.S | 8 ++--- arch/x86/include/asm/irqflags.h | 4 +-- arch/x86/include/asm/mwait.h | 5 ++-- arch/x86/include/asm/nospec-branch.h | 29 ++++++++++--------- arch/x86/kernel/cpu/bugs.c | 12 ++++---- arch/x86/kvm/vmx/vmx.c | 2 +- 8 files changed, 36 insertions(+), 36 deletions(-) diff --git a/Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst b/Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst index 1302fd1b55e83..6dba18dbb9abc 100644 --- a/Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst +++ b/Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst @@ -157,9 +157,7 @@ This is achieved by using the otherwise unused and obsolete VERW instruction in combination with a microcode update. The microcode clears the affected CPU buffers when the VERW instruction is executed. -Kernel reuses the MDS function to invoke the buffer clearing: - - mds_clear_cpu_buffers() +Kernel does the buffer clearing with x86_clear_cpu_buffers(). On MDS affected CPUs, the kernel already invokes CPU buffer clear on kernel/userspace, hypervisor/guest and C-state (idle) transitions. No diff --git a/Documentation/arch/x86/mds.rst b/Documentation/arch/x86/mds.rst index 5a2e6c0ef04a5..3518671e1a850 100644 --- a/Documentation/arch/x86/mds.rst +++ b/Documentation/arch/x86/mds.rst @@ -93,7 +93,7 @@ enters a C-state. The kernel provides a function to invoke the buffer clearing: - mds_clear_cpu_buffers() + x86_clear_cpu_buffers() Also macro CLEAR_CPU_BUFFERS can be used in ASM late in exit-to-user path. Other than CFLAGS.ZF, this macro doesn't clobber any registers. @@ -185,9 +185,9 @@ Mitigation points idle clearing would be a window dressing exercise and is therefore not activated. - The invocation is controlled by the static key mds_idle_clear which is - switched depending on the chosen mitigation mode and the SMT state of - the system. + The invocation is controlled by the static key cpu_buf_idle_clear which is + switched depending on the chosen mitigation mode and the SMT state of the + system. The buffer clear is only invoked before entering the C-State to prevent that stale data from the idling CPU from spilling to the Hyper-Thread diff --git a/arch/x86/entry/entry.S b/arch/x86/entry/entry.S index 5b96249734ada..b0d5ab951231c 100644 --- a/arch/x86/entry/entry.S +++ b/arch/x86/entry/entry.S @@ -33,20 +33,20 @@ EXPORT_SYMBOL_GPL(entry_ibpb); /* * Define the VERW operand that is disguised as entry code so that - * it can be referenced with KPTI enabled. This ensure VERW can be + * it can be referenced with KPTI enabled. This ensures VERW can be * used late in exit-to-user path after page tables are switched. */ .pushsection .entry.text, "ax" .align L1_CACHE_BYTES, 0xcc -SYM_CODE_START_NOALIGN(mds_verw_sel) +SYM_CODE_START_NOALIGN(x86_verw_sel) UNWIND_HINT_UNDEFINED ANNOTATE_NOENDBR .word __KERNEL_DS .align L1_CACHE_BYTES, 0xcc -SYM_CODE_END(mds_verw_sel); +SYM_CODE_END(x86_verw_sel); /* For KVM */ -EXPORT_SYMBOL_GPL(mds_verw_sel); +EXPORT_SYMBOL_GPL(x86_verw_sel); .popsection diff --git a/arch/x86/include/asm/irqflags.h b/arch/x86/include/asm/irqflags.h index 1c2db11a2c3cb..2b75fe80fcb20 100644 --- a/arch/x86/include/asm/irqflags.h +++ b/arch/x86/include/asm/irqflags.h @@ -44,13 +44,13 @@ static __always_inline void native_irq_enable(void) static __always_inline void native_safe_halt(void) { - mds_idle_clear_cpu_buffers(); + x86_idle_clear_cpu_buffers(); asm volatile("sti; hlt": : :"memory"); } static __always_inline void native_halt(void) { - mds_idle_clear_cpu_buffers(); + x86_idle_clear_cpu_buffers(); asm volatile("hlt": : :"memory"); } diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h index 3e4e85f71a6ad..26755a3bbd55e 100644 --- a/arch/x86/include/asm/mwait.h +++ b/arch/x86/include/asm/mwait.h @@ -44,7 +44,7 @@ static __always_inline void __monitorx(const void *eax, unsigned long ecx, static __always_inline void __mwait(unsigned long eax, unsigned long ecx) { - mds_idle_clear_cpu_buffers(); + x86_idle_clear_cpu_buffers(); /* "mwait %eax, %ecx;" */ asm volatile(".byte 0x0f, 0x01, 0xc9;" @@ -98,7 +98,8 @@ static __always_inline void __mwaitx(unsigned long eax, unsigned long ebx, */ static __always_inline void __sti_mwait(unsigned long eax, unsigned long ecx) { - mds_idle_clear_cpu_buffers(); + x86_idle_clear_cpu_buffers(); + /* "mwait %eax, %ecx;" */ asm volatile("sti; .byte 0x0f, 0x01, 0xc9;" :: "a" (eax), "c" (ecx)); diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h index f7bb0016d7d9e..c953844dd9bdf 100644 --- a/arch/x86/include/asm/nospec-branch.h +++ b/arch/x86/include/asm/nospec-branch.h @@ -315,22 +315,22 @@ .endm /* - * Macro to execute VERW instruction that mitigate transient data sampling - * attacks such as MDS. On affected systems a microcode update overloaded VERW - * instruction to also clear the CPU buffers. VERW clobbers CFLAGS.ZF. - * + * Macro to execute VERW insns that mitigate transient data sampling + * attacks such as MDS or TSA. On affected systems a microcode update + * overloaded VERW insns to also clear the CPU buffers. VERW clobbers + * CFLAGS.ZF. * Note: Only the memory operand variant of VERW clears the CPU buffers. */ .macro CLEAR_CPU_BUFFERS #ifdef CONFIG_X86_64 - ALTERNATIVE "", "verw mds_verw_sel(%rip)", X86_FEATURE_CLEAR_CPU_BUF + ALTERNATIVE "", "verw x86_verw_sel(%rip)", X86_FEATURE_CLEAR_CPU_BUF #else /* * In 32bit mode, the memory operand must be a %cs reference. The data * segments may not be usable (vm86 mode), and the stack segment may not * be flat (ESPFIX32). */ - ALTERNATIVE "", "verw %cs:mds_verw_sel", X86_FEATURE_CLEAR_CPU_BUF + ALTERNATIVE "", "verw %cs:x86_verw_sel", X86_FEATURE_CLEAR_CPU_BUF #endif .endm @@ -582,24 +582,24 @@ DECLARE_STATIC_KEY_FALSE(switch_to_cond_stibp); DECLARE_STATIC_KEY_FALSE(switch_mm_cond_ibpb); DECLARE_STATIC_KEY_FALSE(switch_mm_always_ibpb); -DECLARE_STATIC_KEY_FALSE(mds_idle_clear); +DECLARE_STATIC_KEY_FALSE(cpu_buf_idle_clear); DECLARE_STATIC_KEY_FALSE(switch_mm_cond_l1d_flush); DECLARE_STATIC_KEY_FALSE(mmio_stale_data_clear); -extern u16 mds_verw_sel; +extern u16 x86_verw_sel; #include /** - * mds_clear_cpu_buffers - Mitigation for MDS and TAA vulnerability + * x86_clear_cpu_buffers - Buffer clearing support for different x86 CPU vulns * * This uses the otherwise unused and obsolete VERW instruction in * combination with microcode which triggers a CPU buffer flush when the * instruction is executed. */ -static __always_inline void mds_clear_cpu_buffers(void) +static __always_inline void x86_clear_cpu_buffers(void) { static const u16 ds = __KERNEL_DS; @@ -616,14 +616,15 @@ static __always_inline void mds_clear_cpu_buffers(void) } /** - * mds_idle_clear_cpu_buffers - Mitigation for MDS vulnerability + * x86_idle_clear_cpu_buffers - Buffer clearing support in idle for the MDS + * vulnerability * * Clear CPU buffers if the corresponding static key is enabled */ -static __always_inline void mds_idle_clear_cpu_buffers(void) +static __always_inline void x86_idle_clear_cpu_buffers(void) { - if (static_branch_likely(&mds_idle_clear)) - mds_clear_cpu_buffers(); + if (static_branch_likely(&cpu_buf_idle_clear)) + x86_clear_cpu_buffers(); } #endif /* __ASSEMBLY__ */ diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index 0e9ab0b9a4942..e021dd4ad3fe4 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c @@ -122,9 +122,9 @@ DEFINE_STATIC_KEY_FALSE(switch_mm_cond_ibpb); /* Control unconditional IBPB in switch_mm() */ DEFINE_STATIC_KEY_FALSE(switch_mm_always_ibpb); -/* Control MDS CPU buffer clear before idling (halt, mwait) */ -DEFINE_STATIC_KEY_FALSE(mds_idle_clear); -EXPORT_SYMBOL_GPL(mds_idle_clear); +/* Control CPU buffer clear before idling (halt, mwait) */ +DEFINE_STATIC_KEY_FALSE(cpu_buf_idle_clear); +EXPORT_SYMBOL_GPL(cpu_buf_idle_clear); /* * Controls whether l1d flush based mitigations are enabled, @@ -448,7 +448,7 @@ static void __init mmio_select_mitigation(void) * is required irrespective of SMT state. */ if (!(x86_arch_cap_msr & ARCH_CAP_FBSDP_NO)) - static_branch_enable(&mds_idle_clear); + static_branch_enable(&cpu_buf_idle_clear); /* * Check if the system has the right microcode. @@ -2092,10 +2092,10 @@ static void update_mds_branch_idle(void) return; if (sched_smt_active()) { - static_branch_enable(&mds_idle_clear); + static_branch_enable(&cpu_buf_idle_clear); } else if (mmio_mitigation == MMIO_MITIGATION_OFF || (x86_arch_cap_msr & ARCH_CAP_FBSDP_NO)) { - static_branch_disable(&mds_idle_clear); + static_branch_disable(&cpu_buf_idle_clear); } } diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index bcbedddacc480..029fbf3791f17 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -7313,7 +7313,7 @@ static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu, vmx_l1d_flush(vcpu); else if (static_branch_unlikely(&mmio_stale_data_clear) && kvm_arch_has_assigned_device(vcpu->kvm)) - mds_clear_cpu_buffers(); + x86_clear_cpu_buffers(); vmx_disable_fb_clear(vmx); -- GitLab From 7a0395f6607a5d01e2b2a86355596b3f1224acbd Mon Sep 17 00:00:00 2001 From: "Borislav Petkov (AMD)" Date: Wed, 11 Sep 2024 10:53:08 +0200 Subject: [PATCH 2082/2211] x86/bugs: Add a Transient Scheduler Attacks mitigation Commit d8010d4ba43e9f790925375a7de100604a5e2dba upstream. Add the required features detection glue to bugs.c et all in order to support the TSA mitigation. Co-developed-by: Kim Phillips Signed-off-by: Kim Phillips Signed-off-by: Borislav Petkov (AMD) Reviewed-by: Pawan Gupta Signed-off-by: Greg Kroah-Hartman --- .../ABI/testing/sysfs-devices-system-cpu | 1 + .../admin-guide/kernel-parameters.txt | 13 ++ arch/x86/Kconfig | 9 ++ arch/x86/include/asm/cpu.h | 12 ++ arch/x86/include/asm/cpufeatures.h | 6 + arch/x86/include/asm/mwait.h | 2 +- arch/x86/include/asm/nospec-branch.h | 14 +- arch/x86/kernel/cpu/amd.c | 60 +++++++++ arch/x86/kernel/cpu/bugs.c | 121 ++++++++++++++++++ arch/x86/kernel/cpu/common.c | 14 +- arch/x86/kernel/cpu/microcode/amd.c | 12 -- arch/x86/kernel/cpu/scattered.c | 2 + arch/x86/kvm/svm/vmenter.S | 6 + drivers/base/cpu.c | 3 + include/linux/cpu.h | 1 + 15 files changed, 258 insertions(+), 18 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu index 6a1acabb29d85..53755b2021ed0 100644 --- a/Documentation/ABI/testing/sysfs-devices-system-cpu +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu @@ -523,6 +523,7 @@ What: /sys/devices/system/cpu/vulnerabilities /sys/devices/system/cpu/vulnerabilities/spectre_v1 /sys/devices/system/cpu/vulnerabilities/spectre_v2 /sys/devices/system/cpu/vulnerabilities/srbds + /sys/devices/system/cpu/vulnerabilities/tsa /sys/devices/system/cpu/vulnerabilities/tsx_async_abort Date: January 2018 Contact: Linux kernel mailing list diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index b5cb361485541..f402bbaccc8aa 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -6993,6 +6993,19 @@ having this key zero'ed is acceptable. E.g. in testing scenarios. + tsa= [X86] Control mitigation for Transient Scheduler + Attacks on AMD CPUs. Search the following in your + favourite search engine for more details: + + "Technical guidance for mitigating transient scheduler + attacks". + + off - disable the mitigation + on - enable the mitigation (default) + user - mitigate only user/kernel transitions + vm - mitigate only guest/host transitions + + tsc= Disable clocksource stability checks for TSC. Format: [x86] reliable: mark tsc clocksource as reliable, this diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 15425c9bdc2bc..dfa334e3d1a03 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2760,6 +2760,15 @@ config MITIGATION_ITS disabled, mitigation cannot be enabled via cmdline. See +config MITIGATION_TSA + bool "Mitigate Transient Scheduler Attacks" + depends on CPU_SUP_AMD + default y + help + Enable mitigation for Transient Scheduler Attacks. TSA is a hardware + security vulnerability on AMD CPUs which can lead to forwarding of + invalid info to subsequent instructions and thus can affect their + timing and thereby cause a leakage. endif config ARCH_HAS_ADD_PAGES diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h index aa30fd8cad7f5..b6099456477cd 100644 --- a/arch/x86/include/asm/cpu.h +++ b/arch/x86/include/asm/cpu.h @@ -69,4 +69,16 @@ int intel_microcode_sanity_check(void *mc, bool print_err, int hdr_type); extern struct cpumask cpus_stop_mask; +union zen_patch_rev { + struct { + __u32 rev : 8, + stepping : 4, + model : 4, + __reserved : 4, + ext_model : 4, + ext_fam : 8; + }; + __u32 ucode_rev; +}; + #endif /* _ASM_X86_CPU_H */ diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h index 308e7d97135cf..ef5749a0d8c24 100644 --- a/arch/x86/include/asm/cpufeatures.h +++ b/arch/x86/include/asm/cpufeatures.h @@ -455,6 +455,7 @@ #define X86_FEATURE_NO_NESTED_DATA_BP (20*32+ 0) /* No Nested Data Breakpoints */ #define X86_FEATURE_WRMSR_XX_BASE_NS (20*32+ 1) /* WRMSR to {FS,GS,KERNEL_GS}_BASE is non-serializing */ #define X86_FEATURE_LFENCE_RDTSC (20*32+ 2) /* LFENCE always serializing / synchronizes RDTSC */ +#define X86_FEATURE_VERW_CLEAR (20*32+ 5) /* The memory form of VERW mitigates TSA */ #define X86_FEATURE_NULL_SEL_CLR_BASE (20*32+ 6) /* Null Selector Clears Base */ #define X86_FEATURE_AUTOIBRS (20*32+ 8) /* Automatic IBRS */ #define X86_FEATURE_NO_SMM_CTL_MSR (20*32+ 9) /* SMM_CTL MSR is not present */ @@ -477,6 +478,10 @@ #define X86_FEATURE_FAST_CPPC (21*32 + 5) /* AMD Fast CPPC */ #define X86_FEATURE_INDIRECT_THUNK_ITS (21*32 + 6) /* Use thunk for indirect branches in lower half of cacheline */ +#define X86_FEATURE_TSA_SQ_NO (21*32+11) /* AMD CPU not vulnerable to TSA-SQ */ +#define X86_FEATURE_TSA_L1_NO (21*32+12) /* AMD CPU not vulnerable to TSA-L1 */ +#define X86_FEATURE_CLEAR_CPU_BUF_VM (21*32+13) /* Clear CPU buffers using VERW before VMRUN */ + /* * BUG word(s) */ @@ -529,4 +534,5 @@ #define X86_BUG_IBPB_NO_RET X86_BUG(1*32 + 4) /* "ibpb_no_ret" IBPB omits return target predictions */ #define X86_BUG_ITS X86_BUG(1*32 + 5) /* "its" CPU is affected by Indirect Target Selection */ #define X86_BUG_ITS_NATIVE_ONLY X86_BUG(1*32 + 6) /* "its_native_only" CPU is affected by ITS, VMX is not affected */ +#define X86_BUG_TSA X86_BUG( 1*32+ 9) /* "tsa" CPU is affected by Transient Scheduler Attacks */ #endif /* _ASM_X86_CPUFEATURES_H */ diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h index 26755a3bbd55e..b409579f5261e 100644 --- a/arch/x86/include/asm/mwait.h +++ b/arch/x86/include/asm/mwait.h @@ -80,7 +80,7 @@ static __always_inline void __mwait(unsigned long eax, unsigned long ecx) static __always_inline void __mwaitx(unsigned long eax, unsigned long ebx, unsigned long ecx) { - /* No MDS buffer clear as this is AMD/HYGON only */ + /* No need for TSA buffer clearing on AMD */ /* "mwaitx %eax, %ebx, %ecx;" */ asm volatile(".byte 0x0f, 0x01, 0xfb;" diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h index c953844dd9bdf..331f6a05535d4 100644 --- a/arch/x86/include/asm/nospec-branch.h +++ b/arch/x86/include/asm/nospec-branch.h @@ -321,19 +321,25 @@ * CFLAGS.ZF. * Note: Only the memory operand variant of VERW clears the CPU buffers. */ -.macro CLEAR_CPU_BUFFERS +.macro __CLEAR_CPU_BUFFERS feature #ifdef CONFIG_X86_64 - ALTERNATIVE "", "verw x86_verw_sel(%rip)", X86_FEATURE_CLEAR_CPU_BUF + ALTERNATIVE "", "verw x86_verw_sel(%rip)", \feature #else /* * In 32bit mode, the memory operand must be a %cs reference. The data * segments may not be usable (vm86 mode), and the stack segment may not * be flat (ESPFIX32). */ - ALTERNATIVE "", "verw %cs:x86_verw_sel", X86_FEATURE_CLEAR_CPU_BUF + ALTERNATIVE "", "verw %cs:x86_verw_sel", \feature #endif .endm +#define CLEAR_CPU_BUFFERS \ + __CLEAR_CPU_BUFFERS X86_FEATURE_CLEAR_CPU_BUF + +#define VM_CLEAR_CPU_BUFFERS \ + __CLEAR_CPU_BUFFERS X86_FEATURE_CLEAR_CPU_BUF_VM + #ifdef CONFIG_X86_64 .macro CLEAR_BRANCH_HISTORY ALTERNATIVE "", "call clear_bhb_loop", X86_FEATURE_CLEAR_BHB_LOOP @@ -617,7 +623,7 @@ static __always_inline void x86_clear_cpu_buffers(void) /** * x86_idle_clear_cpu_buffers - Buffer clearing support in idle for the MDS - * vulnerability + * and TSA vulnerabilities. * * Clear CPU buffers if the corresponding static key is enabled */ diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index e432910859cb1..8a740e92e483e 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -368,6 +368,63 @@ static void bsp_determine_snp(struct cpuinfo_x86 *c) #endif } +static bool amd_check_tsa_microcode(void) +{ + struct cpuinfo_x86 *c = &boot_cpu_data; + union zen_patch_rev p; + u32 min_rev = 0; + + p.ext_fam = c->x86 - 0xf; + p.model = c->x86_model; + p.stepping = c->x86_stepping; + + if (cpu_has(c, X86_FEATURE_ZEN3) || + cpu_has(c, X86_FEATURE_ZEN4)) { + switch (p.ucode_rev >> 8) { + case 0xa0011: min_rev = 0x0a0011d7; break; + case 0xa0012: min_rev = 0x0a00123b; break; + case 0xa0082: min_rev = 0x0a00820d; break; + case 0xa1011: min_rev = 0x0a10114c; break; + case 0xa1012: min_rev = 0x0a10124c; break; + case 0xa1081: min_rev = 0x0a108109; break; + case 0xa2010: min_rev = 0x0a20102e; break; + case 0xa2012: min_rev = 0x0a201211; break; + case 0xa4041: min_rev = 0x0a404108; break; + case 0xa5000: min_rev = 0x0a500012; break; + case 0xa6012: min_rev = 0x0a60120a; break; + case 0xa7041: min_rev = 0x0a704108; break; + case 0xa7052: min_rev = 0x0a705208; break; + case 0xa7080: min_rev = 0x0a708008; break; + case 0xa70c0: min_rev = 0x0a70c008; break; + case 0xaa002: min_rev = 0x0aa00216; break; + default: + pr_debug("%s: ucode_rev: 0x%x, current revision: 0x%x\n", + __func__, p.ucode_rev, c->microcode); + return false; + } + } + + if (!min_rev) + return false; + + return c->microcode >= min_rev; +} + +static void tsa_init(struct cpuinfo_x86 *c) +{ + if (cpu_has(c, X86_FEATURE_HYPERVISOR)) + return; + + if (cpu_has(c, X86_FEATURE_ZEN3) || + cpu_has(c, X86_FEATURE_ZEN4)) { + if (amd_check_tsa_microcode()) + setup_force_cpu_cap(X86_FEATURE_VERW_CLEAR); + } else { + setup_force_cpu_cap(X86_FEATURE_TSA_SQ_NO); + setup_force_cpu_cap(X86_FEATURE_TSA_L1_NO); + } +} + static void bsp_init_amd(struct cpuinfo_x86 *c) { if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) { @@ -475,6 +532,9 @@ static void bsp_init_amd(struct cpuinfo_x86 *c) } bsp_determine_snp(c); + + tsa_init(c); + return; warn: diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index e021dd4ad3fe4..c2c7b76d953f7 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c @@ -50,6 +50,7 @@ static void __init l1d_flush_select_mitigation(void); static void __init srso_select_mitigation(void); static void __init gds_select_mitigation(void); static void __init its_select_mitigation(void); +static void __init tsa_select_mitigation(void); /* The base value of the SPEC_CTRL MSR without task-specific bits set */ u64 x86_spec_ctrl_base; @@ -185,6 +186,7 @@ void __init cpu_select_mitigations(void) srso_select_mitigation(); gds_select_mitigation(); its_select_mitigation(); + tsa_select_mitigation(); } /* @@ -2103,6 +2105,94 @@ static void update_mds_branch_idle(void) #define TAA_MSG_SMT "TAA CPU bug present and SMT on, data leak possible. See https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/tsx_async_abort.html for more details.\n" #define MMIO_MSG_SMT "MMIO Stale Data CPU bug present and SMT on, data leak possible. See https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/processor_mmio_stale_data.html for more details.\n" +#undef pr_fmt +#define pr_fmt(fmt) "Transient Scheduler Attacks: " fmt + +enum tsa_mitigations { + TSA_MITIGATION_NONE, + TSA_MITIGATION_UCODE_NEEDED, + TSA_MITIGATION_USER_KERNEL, + TSA_MITIGATION_VM, + TSA_MITIGATION_FULL, +}; + +static const char * const tsa_strings[] = { + [TSA_MITIGATION_NONE] = "Vulnerable", + [TSA_MITIGATION_UCODE_NEEDED] = "Vulnerable: Clear CPU buffers attempted, no microcode", + [TSA_MITIGATION_USER_KERNEL] = "Mitigation: Clear CPU buffers: user/kernel boundary", + [TSA_MITIGATION_VM] = "Mitigation: Clear CPU buffers: VM", + [TSA_MITIGATION_FULL] = "Mitigation: Clear CPU buffers", +}; + +static enum tsa_mitigations tsa_mitigation __ro_after_init = + IS_ENABLED(CONFIG_MITIGATION_TSA) ? TSA_MITIGATION_FULL : TSA_MITIGATION_NONE; + +static int __init tsa_parse_cmdline(char *str) +{ + if (!str) + return -EINVAL; + + if (!strcmp(str, "off")) + tsa_mitigation = TSA_MITIGATION_NONE; + else if (!strcmp(str, "on")) + tsa_mitigation = TSA_MITIGATION_FULL; + else if (!strcmp(str, "user")) + tsa_mitigation = TSA_MITIGATION_USER_KERNEL; + else if (!strcmp(str, "vm")) + tsa_mitigation = TSA_MITIGATION_VM; + else + pr_err("Ignoring unknown tsa=%s option.\n", str); + + return 0; +} +early_param("tsa", tsa_parse_cmdline); + +static void __init tsa_select_mitigation(void) +{ + if (tsa_mitigation == TSA_MITIGATION_NONE) + return; + + if (cpu_mitigations_off() || !boot_cpu_has_bug(X86_BUG_TSA)) { + tsa_mitigation = TSA_MITIGATION_NONE; + return; + } + + if (!boot_cpu_has(X86_FEATURE_VERW_CLEAR)) + tsa_mitigation = TSA_MITIGATION_UCODE_NEEDED; + + switch (tsa_mitigation) { + case TSA_MITIGATION_USER_KERNEL: + setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF); + break; + + case TSA_MITIGATION_VM: + setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM); + break; + + case TSA_MITIGATION_UCODE_NEEDED: + if (!boot_cpu_has(X86_FEATURE_HYPERVISOR)) + goto out; + + pr_notice("Forcing mitigation on in a VM\n"); + + /* + * On the off-chance that microcode has been updated + * on the host, enable the mitigation in the guest just + * in case. + */ + fallthrough; + case TSA_MITIGATION_FULL: + setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF); + setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM); + break; + default: + break; + } + +out: + pr_info("%s\n", tsa_strings[tsa_mitigation]); +} + void cpu_bugs_smt_update(void) { mutex_lock(&spec_ctrl_mutex); @@ -2156,6 +2246,24 @@ void cpu_bugs_smt_update(void) break; } + switch (tsa_mitigation) { + case TSA_MITIGATION_USER_KERNEL: + case TSA_MITIGATION_VM: + case TSA_MITIGATION_FULL: + case TSA_MITIGATION_UCODE_NEEDED: + /* + * TSA-SQ can potentially lead to info leakage between + * SMT threads. + */ + if (sched_smt_active()) + static_branch_enable(&cpu_buf_idle_clear); + else + static_branch_disable(&cpu_buf_idle_clear); + break; + case TSA_MITIGATION_NONE: + break; + } + mutex_unlock(&spec_ctrl_mutex); } @@ -3084,6 +3192,11 @@ static ssize_t gds_show_state(char *buf) return sysfs_emit(buf, "%s\n", gds_strings[gds_mitigation]); } +static ssize_t tsa_show_state(char *buf) +{ + return sysfs_emit(buf, "%s\n", tsa_strings[tsa_mitigation]); +} + static ssize_t cpu_show_common(struct device *dev, struct device_attribute *attr, char *buf, unsigned int bug) { @@ -3145,6 +3258,9 @@ static ssize_t cpu_show_common(struct device *dev, struct device_attribute *attr case X86_BUG_ITS: return its_show_state(buf); + case X86_BUG_TSA: + return tsa_show_state(buf); + default: break; } @@ -3229,6 +3345,11 @@ ssize_t cpu_show_indirect_target_selection(struct device *dev, struct device_att { return cpu_show_common(dev, attr, buf, X86_BUG_ITS); } + +ssize_t cpu_show_tsa(struct device *dev, struct device_attribute *attr, char *buf) +{ + return cpu_show_common(dev, attr, buf, X86_BUG_TSA); +} #endif void __warn_thunk(void) diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index a11c61fd7d52c..ed072b126111c 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -1233,6 +1233,8 @@ static const __initconst struct x86_cpu_id cpu_vuln_whitelist[] = { #define ITS BIT(8) /* CPU is affected by Indirect Target Selection, but guest-host isolation is not affected */ #define ITS_NATIVE_ONLY BIT(9) +/* CPU is affected by Transient Scheduler Attacks */ +#define TSA BIT(10) static const struct x86_cpu_id cpu_vuln_blacklist[] __initconst = { VULNBL_INTEL_STEPPINGS(INTEL_IVYBRIDGE, X86_STEPPING_ANY, SRBDS), @@ -1280,7 +1282,7 @@ static const struct x86_cpu_id cpu_vuln_blacklist[] __initconst = { VULNBL_AMD(0x16, RETBLEED), VULNBL_AMD(0x17, RETBLEED | SMT_RSB | SRSO), VULNBL_HYGON(0x18, RETBLEED | SMT_RSB | SRSO), - VULNBL_AMD(0x19, SRSO), + VULNBL_AMD(0x19, SRSO | TSA), {} }; @@ -1490,6 +1492,16 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c) setup_force_cpu_bug(X86_BUG_ITS_NATIVE_ONLY); } + if (c->x86_vendor == X86_VENDOR_AMD) { + if (!cpu_has(c, X86_FEATURE_TSA_SQ_NO) || + !cpu_has(c, X86_FEATURE_TSA_L1_NO)) { + if (cpu_matches(cpu_vuln_blacklist, TSA) || + /* Enable bug on Zen guests to allow for live migration. */ + (cpu_has(c, X86_FEATURE_HYPERVISOR) && cpu_has(c, X86_FEATURE_ZEN))) + setup_force_cpu_bug(X86_BUG_TSA); + } + } + if (cpu_matches(cpu_vuln_whitelist, NO_MELTDOWN)) return; diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c index 2f84164b20e01..765b4646648f7 100644 --- a/arch/x86/kernel/cpu/microcode/amd.c +++ b/arch/x86/kernel/cpu/microcode/amd.c @@ -94,18 +94,6 @@ static struct equiv_cpu_table { struct equiv_cpu_entry *entry; } equiv_table; -union zen_patch_rev { - struct { - __u32 rev : 8, - stepping : 4, - model : 4, - __reserved : 4, - ext_model : 4, - ext_fam : 8; - }; - __u32 ucode_rev; -}; - union cpuid_1_eax { struct { __u32 stepping : 4, diff --git a/arch/x86/kernel/cpu/scattered.c b/arch/x86/kernel/cpu/scattered.c index c84c30188fdf2..bc4993aa41edf 100644 --- a/arch/x86/kernel/cpu/scattered.c +++ b/arch/x86/kernel/cpu/scattered.c @@ -49,6 +49,8 @@ static const struct cpuid_bit cpuid_bits[] = { { X86_FEATURE_MBA, CPUID_EBX, 6, 0x80000008, 0 }, { X86_FEATURE_SMBA, CPUID_EBX, 2, 0x80000020, 0 }, { X86_FEATURE_BMEC, CPUID_EBX, 3, 0x80000020, 0 }, + { X86_FEATURE_TSA_SQ_NO, CPUID_ECX, 1, 0x80000021, 0 }, + { X86_FEATURE_TSA_L1_NO, CPUID_ECX, 2, 0x80000021, 0 }, { X86_FEATURE_PERFMON_V2, CPUID_EAX, 0, 0x80000022, 0 }, { X86_FEATURE_AMD_LBR_V2, CPUID_EAX, 1, 0x80000022, 0 }, { X86_FEATURE_AMD_LBR_PMC_FREEZE, CPUID_EAX, 2, 0x80000022, 0 }, diff --git a/arch/x86/kvm/svm/vmenter.S b/arch/x86/kvm/svm/vmenter.S index 0c61153b275f6..235c4af6b692a 100644 --- a/arch/x86/kvm/svm/vmenter.S +++ b/arch/x86/kvm/svm/vmenter.S @@ -169,6 +169,9 @@ SYM_FUNC_START(__svm_vcpu_run) #endif mov VCPU_RDI(%_ASM_DI), %_ASM_DI + /* Clobbers EFLAGS.ZF */ + VM_CLEAR_CPU_BUFFERS + /* Enter guest mode */ 3: vmrun %_ASM_AX 4: @@ -335,6 +338,9 @@ SYM_FUNC_START(__svm_sev_es_vcpu_run) mov SVM_current_vmcb(%rdi), %rax mov KVM_VMCB_pa(%rax), %rax + /* Clobbers EFLAGS.ZF */ + VM_CLEAR_CPU_BUFFERS + /* Enter guest mode */ 1: vmrun %rax 2: diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index d88f721cf68cd..02870e70ed595 100644 --- a/drivers/base/cpu.c +++ b/drivers/base/cpu.c @@ -600,6 +600,7 @@ CPU_SHOW_VULN_FALLBACK(spec_rstack_overflow); CPU_SHOW_VULN_FALLBACK(gds); CPU_SHOW_VULN_FALLBACK(reg_file_data_sampling); CPU_SHOW_VULN_FALLBACK(indirect_target_selection); +CPU_SHOW_VULN_FALLBACK(tsa); static DEVICE_ATTR(meltdown, 0444, cpu_show_meltdown, NULL); static DEVICE_ATTR(spectre_v1, 0444, cpu_show_spectre_v1, NULL); @@ -616,6 +617,7 @@ static DEVICE_ATTR(spec_rstack_overflow, 0444, cpu_show_spec_rstack_overflow, NU static DEVICE_ATTR(gather_data_sampling, 0444, cpu_show_gds, NULL); static DEVICE_ATTR(reg_file_data_sampling, 0444, cpu_show_reg_file_data_sampling, NULL); static DEVICE_ATTR(indirect_target_selection, 0444, cpu_show_indirect_target_selection, NULL); +static DEVICE_ATTR(tsa, 0444, cpu_show_tsa, NULL); static struct attribute *cpu_root_vulnerabilities_attrs[] = { &dev_attr_meltdown.attr, @@ -633,6 +635,7 @@ static struct attribute *cpu_root_vulnerabilities_attrs[] = { &dev_attr_gather_data_sampling.attr, &dev_attr_reg_file_data_sampling.attr, &dev_attr_indirect_target_selection.attr, + &dev_attr_tsa.attr, NULL }; diff --git a/include/linux/cpu.h b/include/linux/cpu.h index cc668a054d096..4342b56949095 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h @@ -79,6 +79,7 @@ extern ssize_t cpu_show_reg_file_data_sampling(struct device *dev, struct device_attribute *attr, char *buf); extern ssize_t cpu_show_indirect_target_selection(struct device *dev, struct device_attribute *attr, char *buf); +extern ssize_t cpu_show_tsa(struct device *dev, struct device_attribute *attr, char *buf); extern __printf(4, 5) struct device *cpu_device_create(struct device *parent, void *drvdata, -- GitLab From d5d66e31fd9a9b8217f59b4247b9f5c923b14597 Mon Sep 17 00:00:00 2001 From: "Borislav Petkov (AMD)" Date: Wed, 11 Sep 2024 11:00:50 +0200 Subject: [PATCH 2083/2211] KVM: SVM: Advertise TSA CPUID bits to guests Commit 31272abd5974b38ba312e9cf2ec2f09f9dd7dcba upstream. Synthesize the TSA CPUID feature bits for guests. Set TSA_{SQ,L1}_NO on unaffected machines. Signed-off-by: Borislav Petkov (AMD) Signed-off-by: Greg Kroah-Hartman --- arch/x86/kvm/cpuid.c | 8 +++++++- arch/x86/kvm/reverse_cpuid.h | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index c92e43f2d0c4e..02196db26a084 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -814,6 +814,7 @@ void kvm_set_cpu_caps(void) kvm_cpu_cap_mask(CPUID_8000_0021_EAX, F(NO_NESTED_DATA_BP) | F(LFENCE_RDTSC) | 0 /* SmmPgCfgLock */ | + F(VERW_CLEAR) | F(NULL_SEL_CLR_BASE) | F(AUTOIBRS) | 0 /* PrefetchCtlMsr */ | F(WRMSR_XX_BASE_NS) ); @@ -826,6 +827,10 @@ void kvm_set_cpu_caps(void) F(PERFMON_V2) ); + kvm_cpu_cap_init_kvm_defined(CPUID_8000_0021_ECX, + F(TSA_SQ_NO) | F(TSA_L1_NO) + ); + /* * Synthesize "LFENCE is serializing" into the AMD-defined entry in * KVM's supported CPUID if the feature is reported as supported by the @@ -1376,8 +1381,9 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function) entry->eax = entry->ebx = entry->ecx = entry->edx = 0; break; case 0x80000021: - entry->ebx = entry->ecx = entry->edx = 0; + entry->ebx = entry->edx = 0; cpuid_entry_override(entry, CPUID_8000_0021_EAX); + cpuid_entry_override(entry, CPUID_8000_0021_ECX); break; /* AMD Extended Performance Monitoring and Debug */ case 0x80000022: { diff --git a/arch/x86/kvm/reverse_cpuid.h b/arch/x86/kvm/reverse_cpuid.h index 0d17d6b706396..0ea847b823541 100644 --- a/arch/x86/kvm/reverse_cpuid.h +++ b/arch/x86/kvm/reverse_cpuid.h @@ -18,6 +18,7 @@ enum kvm_only_cpuid_leafs { CPUID_8000_0022_EAX, CPUID_7_2_EDX, CPUID_24_0_EBX, + CPUID_8000_0021_ECX, NR_KVM_CPU_CAPS, NKVMCAPINTS = NR_KVM_CPU_CAPS - NCAPINTS, @@ -68,6 +69,10 @@ enum kvm_only_cpuid_leafs { /* CPUID level 0x80000022 (EAX) */ #define KVM_X86_FEATURE_PERFMON_V2 KVM_X86_FEATURE(CPUID_8000_0022_EAX, 0) +/* CPUID level 0x80000021 (ECX) */ +#define KVM_X86_FEATURE_TSA_SQ_NO KVM_X86_FEATURE(CPUID_8000_0021_ECX, 1) +#define KVM_X86_FEATURE_TSA_L1_NO KVM_X86_FEATURE(CPUID_8000_0021_ECX, 2) + struct cpuid_reg { u32 function; u32 index; @@ -98,6 +103,7 @@ static const struct cpuid_reg reverse_cpuid[] = { [CPUID_8000_0022_EAX] = {0x80000022, 0, CPUID_EAX}, [CPUID_7_2_EDX] = { 7, 2, CPUID_EDX}, [CPUID_24_0_EBX] = { 0x24, 0, CPUID_EBX}, + [CPUID_8000_0021_ECX] = {0x80000021, 0, CPUID_ECX}, }; /* @@ -137,6 +143,8 @@ static __always_inline u32 __feature_translate(int x86_feature) KVM_X86_TRANSLATE_FEATURE(PERFMON_V2); KVM_X86_TRANSLATE_FEATURE(RRSBA_CTRL); KVM_X86_TRANSLATE_FEATURE(BHI_CTRL); + KVM_X86_TRANSLATE_FEATURE(TSA_SQ_NO); + KVM_X86_TRANSLATE_FEATURE(TSA_L1_NO); default: return x86_feature; } -- GitLab From 331cfdd27429ed7a64923123b2482e85238979fa Mon Sep 17 00:00:00 2001 From: "Borislav Petkov (AMD)" Date: Thu, 27 Mar 2025 12:23:55 +0100 Subject: [PATCH 2084/2211] x86/microcode/AMD: Add TSA microcode SHAs Commit 2329f250e04d3b8e78b36a68b9880ca7750a07ef upstream. Signed-off-by: Borislav Petkov (AMD) Signed-off-by: Greg Kroah-Hartman --- arch/x86/kernel/cpu/microcode/amd_shas.c | 112 +++++++++++++++++++++++ 1 file changed, 112 insertions(+) diff --git a/arch/x86/kernel/cpu/microcode/amd_shas.c b/arch/x86/kernel/cpu/microcode/amd_shas.c index 2a1655b1fdd88..1fd349cfc8024 100644 --- a/arch/x86/kernel/cpu/microcode/amd_shas.c +++ b/arch/x86/kernel/cpu/microcode/amd_shas.c @@ -231,6 +231,13 @@ static const struct patch_digest phashes[] = { 0x0d,0x5b,0x65,0x34,0x69,0xb2,0x62,0x21, } }, + { 0xa0011d7, { + 0x35,0x07,0xcd,0x40,0x94,0xbc,0x81,0x6b, + 0xfc,0x61,0x56,0x1a,0xe2,0xdb,0x96,0x12, + 0x1c,0x1c,0x31,0xb1,0x02,0x6f,0xe5,0xd2, + 0xfe,0x1b,0x04,0x03,0x2c,0x8f,0x4c,0x36, + } + }, { 0xa001223, { 0xfb,0x32,0x5f,0xc6,0x83,0x4f,0x8c,0xb8, 0xa4,0x05,0xf9,0x71,0x53,0x01,0x16,0xc4, @@ -294,6 +301,13 @@ static const struct patch_digest phashes[] = { 0xc0,0xcd,0x33,0xf2,0x8d,0xf9,0xef,0x59, } }, + { 0xa00123b, { + 0xef,0xa1,0x1e,0x71,0xf1,0xc3,0x2c,0xe2, + 0xc3,0xef,0x69,0x41,0x7a,0x54,0xca,0xc3, + 0x8f,0x62,0x84,0xee,0xc2,0x39,0xd9,0x28, + 0x95,0xa7,0x12,0x49,0x1e,0x30,0x71,0x72, + } + }, { 0xa00820c, { 0xa8,0x0c,0x81,0xc0,0xa6,0x00,0xe7,0xf3, 0x5f,0x65,0xd3,0xb9,0x6f,0xea,0x93,0x63, @@ -301,6 +315,13 @@ static const struct patch_digest phashes[] = { 0xe1,0x3b,0x8d,0xb2,0xf8,0x22,0x03,0xe2, } }, + { 0xa00820d, { + 0xf9,0x2a,0xc0,0xf4,0x9e,0xa4,0x87,0xa4, + 0x7d,0x87,0x00,0xfd,0xab,0xda,0x19,0xca, + 0x26,0x51,0x32,0xc1,0x57,0x91,0xdf,0xc1, + 0x05,0xeb,0x01,0x7c,0x5a,0x95,0x21,0xb7, + } + }, { 0xa10113e, { 0x05,0x3c,0x66,0xd7,0xa9,0x5a,0x33,0x10, 0x1b,0xf8,0x9c,0x8f,0xed,0xfc,0xa7,0xa0, @@ -322,6 +343,13 @@ static const struct patch_digest phashes[] = { 0xf1,0x5e,0xb0,0xde,0xb4,0x98,0xae,0xc4, } }, + { 0xa10114c, { + 0x9e,0xb6,0xa2,0xd9,0x87,0x38,0xc5,0x64, + 0xd8,0x88,0xfa,0x78,0x98,0xf9,0x6f,0x74, + 0x39,0x90,0x1b,0xa5,0xcf,0x5e,0xb4,0x2a, + 0x02,0xff,0xd4,0x8c,0x71,0x8b,0xe2,0xc0, + } + }, { 0xa10123e, { 0x03,0xb9,0x2c,0x76,0x48,0x93,0xc9,0x18, 0xfb,0x56,0xfd,0xf7,0xe2,0x1d,0xca,0x4d, @@ -343,6 +371,13 @@ static const struct patch_digest phashes[] = { 0x1b,0x7d,0x64,0x9d,0x4b,0x53,0x13,0x75, } }, + { 0xa10124c, { + 0x29,0xea,0xf1,0x2c,0xb2,0xe4,0xef,0x90, + 0xa4,0xcd,0x1d,0x86,0x97,0x17,0x61,0x46, + 0xfc,0x22,0xcb,0x57,0x75,0x19,0xc8,0xcc, + 0x0c,0xf5,0xbc,0xac,0x81,0x9d,0x9a,0xd2, + } + }, { 0xa108108, { 0xed,0xc2,0xec,0xa1,0x15,0xc6,0x65,0xe9, 0xd0,0xef,0x39,0xaa,0x7f,0x55,0x06,0xc6, @@ -350,6 +385,13 @@ static const struct patch_digest phashes[] = { 0x28,0x1e,0x9c,0x59,0x69,0x99,0x4d,0x16, } }, + { 0xa108109, { + 0x85,0xb4,0xbd,0x7c,0x49,0xa7,0xbd,0xfa, + 0x49,0x36,0x80,0x81,0xc5,0xb7,0x39,0x1b, + 0x9a,0xaa,0x50,0xde,0x9b,0xe9,0x32,0x35, + 0x42,0x7e,0x51,0x4f,0x52,0x2c,0x28,0x59, + } + }, { 0xa20102d, { 0xf9,0x6e,0xf2,0x32,0xd3,0x0f,0x5f,0x11, 0x59,0xa1,0xfe,0xcc,0xcd,0x9b,0x42,0x89, @@ -357,6 +399,13 @@ static const struct patch_digest phashes[] = { 0x8c,0xe9,0x19,0x3e,0xcc,0x3f,0x7b,0xb4, } }, + { 0xa20102e, { + 0xbe,0x1f,0x32,0x04,0x0d,0x3c,0x9c,0xdd, + 0xe1,0xa4,0xbf,0x76,0x3a,0xec,0xc2,0xf6, + 0x11,0x00,0xa7,0xaf,0x0f,0xe5,0x02,0xc5, + 0x54,0x3a,0x1f,0x8c,0x16,0xb5,0xff,0xbe, + } + }, { 0xa201210, { 0xe8,0x6d,0x51,0x6a,0x8e,0x72,0xf3,0xfe, 0x6e,0x16,0xbc,0x62,0x59,0x40,0x17,0xe9, @@ -364,6 +413,13 @@ static const struct patch_digest phashes[] = { 0xf7,0x55,0xf0,0x13,0xbb,0x22,0xf6,0x41, } }, + { 0xa201211, { + 0x69,0xa1,0x17,0xec,0xd0,0xf6,0x6c,0x95, + 0xe2,0x1e,0xc5,0x59,0x1a,0x52,0x0a,0x27, + 0xc4,0xed,0xd5,0x59,0x1f,0xbf,0x00,0xff, + 0x08,0x88,0xb5,0xe1,0x12,0xb6,0xcc,0x27, + } + }, { 0xa404107, { 0xbb,0x04,0x4e,0x47,0xdd,0x5e,0x26,0x45, 0x1a,0xc9,0x56,0x24,0xa4,0x4c,0x82,0xb0, @@ -371,6 +427,13 @@ static const struct patch_digest phashes[] = { 0x13,0xbc,0xc5,0x25,0xe4,0xc5,0xc3,0x99, } }, + { 0xa404108, { + 0x69,0x67,0x43,0x06,0xf8,0x0c,0x62,0xdc, + 0xa4,0x21,0x30,0x4f,0x0f,0x21,0x2c,0xcb, + 0xcc,0x37,0xf1,0x1c,0xc3,0xf8,0x2f,0x19, + 0xdf,0x53,0x53,0x46,0xb1,0x15,0xea,0x00, + } + }, { 0xa500011, { 0x23,0x3d,0x70,0x7d,0x03,0xc3,0xc4,0xf4, 0x2b,0x82,0xc6,0x05,0xda,0x80,0x0a,0xf1, @@ -378,6 +441,13 @@ static const struct patch_digest phashes[] = { 0x11,0x5e,0x96,0x7e,0x71,0xe9,0xfc,0x74, } }, + { 0xa500012, { + 0xeb,0x74,0x0d,0x47,0xa1,0x8e,0x09,0xe4, + 0x93,0x4c,0xad,0x03,0x32,0x4c,0x38,0x16, + 0x10,0x39,0xdd,0x06,0xaa,0xce,0xd6,0x0f, + 0x62,0x83,0x9d,0x8e,0x64,0x55,0xbe,0x63, + } + }, { 0xa601209, { 0x66,0x48,0xd4,0x09,0x05,0xcb,0x29,0x32, 0x66,0xb7,0x9a,0x76,0xcd,0x11,0xf3,0x30, @@ -385,6 +455,13 @@ static const struct patch_digest phashes[] = { 0xe8,0x73,0xe2,0xd6,0xdb,0xd2,0x77,0x1d, } }, + { 0xa60120a, { + 0x0c,0x8b,0x3d,0xfd,0x52,0x52,0x85,0x7d, + 0x20,0x3a,0xe1,0x7e,0xa4,0x21,0x3b,0x7b, + 0x17,0x86,0xae,0xac,0x13,0xb8,0x63,0x9d, + 0x06,0x01,0xd0,0xa0,0x51,0x9a,0x91,0x2c, + } + }, { 0xa704107, { 0xf3,0xc6,0x58,0x26,0xee,0xac,0x3f,0xd6, 0xce,0xa1,0x72,0x47,0x3b,0xba,0x2b,0x93, @@ -392,6 +469,13 @@ static const struct patch_digest phashes[] = { 0x64,0x39,0x71,0x8c,0xce,0xe7,0x41,0x39, } }, + { 0xa704108, { + 0xd7,0x55,0x15,0x2b,0xfe,0xc4,0xbc,0x93, + 0xec,0x91,0xa0,0xae,0x45,0xb7,0xc3,0x98, + 0x4e,0xff,0x61,0x77,0x88,0xc2,0x70,0x49, + 0xe0,0x3a,0x1d,0x84,0x38,0x52,0xbf,0x5a, + } + }, { 0xa705206, { 0x8d,0xc0,0x76,0xbd,0x58,0x9f,0x8f,0xa4, 0x12,0x9d,0x21,0xfb,0x48,0x21,0xbc,0xe7, @@ -399,6 +483,13 @@ static const struct patch_digest phashes[] = { 0x03,0x35,0xe9,0xbe,0xfb,0x06,0xdf,0xfc, } }, + { 0xa705208, { + 0x30,0x1d,0x55,0x24,0xbc,0x6b,0x5a,0x19, + 0x0c,0x7d,0x1d,0x74,0xaa,0xd1,0xeb,0xd2, + 0x16,0x62,0xf7,0x5b,0xe1,0x1f,0x18,0x11, + 0x5c,0xf0,0x94,0x90,0x26,0xec,0x69,0xff, + } + }, { 0xa708007, { 0x6b,0x76,0xcc,0x78,0xc5,0x8a,0xa3,0xe3, 0x32,0x2d,0x79,0xe4,0xc3,0x80,0xdb,0xb2, @@ -406,6 +497,13 @@ static const struct patch_digest phashes[] = { 0xdf,0x92,0x73,0x84,0x87,0x3c,0x73,0x93, } }, + { 0xa708008, { + 0x08,0x6e,0xf0,0x22,0x4b,0x8e,0xc4,0x46, + 0x58,0x34,0xe6,0x47,0xa2,0x28,0xfd,0xab, + 0x22,0x3d,0xdd,0xd8,0x52,0x9e,0x1d,0x16, + 0xfa,0x01,0x68,0x14,0x79,0x3e,0xe8,0x6b, + } + }, { 0xa70c005, { 0x88,0x5d,0xfb,0x79,0x64,0xd8,0x46,0x3b, 0x4a,0x83,0x8e,0x77,0x7e,0xcf,0xb3,0x0f, @@ -413,6 +511,13 @@ static const struct patch_digest phashes[] = { 0xee,0x49,0xac,0xe1,0x8b,0x13,0xc5,0x13, } }, + { 0xa70c008, { + 0x0f,0xdb,0x37,0xa1,0x10,0xaf,0xd4,0x21, + 0x94,0x0d,0xa4,0xa2,0xe9,0x86,0x6c,0x0e, + 0x85,0x7c,0x36,0x30,0xa3,0x3a,0x78,0x66, + 0x18,0x10,0x60,0x0d,0x78,0x3d,0x44,0xd0, + } + }, { 0xaa00116, { 0xe8,0x4c,0x2c,0x88,0xa1,0xac,0x24,0x63, 0x65,0xe5,0xaa,0x2d,0x16,0xa9,0xc3,0xf5, @@ -441,4 +546,11 @@ static const struct patch_digest phashes[] = { 0x68,0x2f,0x46,0xee,0xfe,0xc6,0x6d,0xef, } }, + { 0xaa00216, { + 0x79,0xfb,0x5b,0x9f,0xb6,0xe6,0xa8,0xf5, + 0x4e,0x7c,0x4f,0x8e,0x1d,0xad,0xd0,0x08, + 0xc2,0x43,0x7c,0x8b,0xe6,0xdb,0xd0,0xd2, + 0xe8,0x39,0x26,0xc1,0xe5,0x5a,0x48,0xf1, + } + }, }; -- GitLab From 0029b3c1320bb9cf6ce1e9bf93dadd909ca06fa1 Mon Sep 17 00:00:00 2001 From: "Borislav Petkov (AMD)" Date: Mon, 14 Apr 2025 15:33:19 +0200 Subject: [PATCH 2085/2211] x86/process: Move the buffer clearing before MONITOR Commit 8e786a85c0a3c0fffae6244733fb576eeabd9dec upstream. Move the VERW clearing before the MONITOR so that VERW doesn't disarm it and the machine never enters C1. Original idea by Kim Phillips . Suggested-by: Andrew Cooper Signed-off-by: Borislav Petkov (AMD) Signed-off-by: Greg Kroah-Hartman --- arch/x86/include/asm/mwait.h | 25 +++++++++++++++---------- arch/x86/kernel/process.c | 16 ++++++++++++---- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h index b409579f5261e..7f9a97c572fe2 100644 --- a/arch/x86/include/asm/mwait.h +++ b/arch/x86/include/asm/mwait.h @@ -44,8 +44,6 @@ static __always_inline void __monitorx(const void *eax, unsigned long ecx, static __always_inline void __mwait(unsigned long eax, unsigned long ecx) { - x86_idle_clear_cpu_buffers(); - /* "mwait %eax, %ecx;" */ asm volatile(".byte 0x0f, 0x01, 0xc9;" :: "a" (eax), "c" (ecx)); @@ -98,7 +96,6 @@ static __always_inline void __mwaitx(unsigned long eax, unsigned long ebx, */ static __always_inline void __sti_mwait(unsigned long eax, unsigned long ecx) { - x86_idle_clear_cpu_buffers(); /* "mwait %eax, %ecx;" */ asm volatile("sti; .byte 0x0f, 0x01, 0xc9;" @@ -117,21 +114,29 @@ static __always_inline void __sti_mwait(unsigned long eax, unsigned long ecx) */ static __always_inline void mwait_idle_with_hints(unsigned long eax, unsigned long ecx) { + if (need_resched()) + return; + + x86_idle_clear_cpu_buffers(); + if (static_cpu_has_bug(X86_BUG_MONITOR) || !current_set_polling_and_test()) { const void *addr = ¤t_thread_info()->flags; alternative_input("", "clflush (%[addr])", X86_BUG_CLFLUSH_MONITOR, [addr] "a" (addr)); __monitor(addr, 0, 0); - if (!need_resched()) { - if (ecx & 1) { - __mwait(eax, ecx); - } else { - __sti_mwait(eax, ecx); - raw_local_irq_disable(); - } + if (need_resched()) + goto out; + + if (ecx & 1) { + __mwait(eax, ecx); + } else { + __sti_mwait(eax, ecx); + raw_local_irq_disable(); } } + +out: current_clr_polling(); } diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 1dbd7a34645c2..4c9c98c5deabd 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -911,16 +911,24 @@ static __init bool prefer_mwait_c1_over_halt(void) */ static __cpuidle void mwait_idle(void) { + if (need_resched()) + return; + + x86_idle_clear_cpu_buffers(); + if (!current_set_polling_and_test()) { const void *addr = ¤t_thread_info()->flags; alternative_input("", "clflush (%[addr])", X86_BUG_CLFLUSH_MONITOR, [addr] "a" (addr)); __monitor(addr, 0, 0); - if (!need_resched()) { - __sti_mwait(0, 0); - raw_local_irq_disable(); - } + if (need_resched()) + goto out; + + __sti_mwait(0, 0); + raw_local_irq_disable(); } + +out: __current_clr_polling(); } -- GitLab From fbad404f04d758c52bae79ca20d0e7fe5fef91d3 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 10 Jul 2025 16:05:15 +0200 Subject: [PATCH 2086/2211] Linux 6.12.37 Link: https://lore.kernel.org/r/20250708162241.426806072@linuxfoundation.org Tested-by: Salvatore Bonaccorso Tested-by: Mark Brown Tested-by: Harshit Mogalapalli Tested-by: Ron Economos Tested-by: Jon Hunter Tested-by: Miguel Ojeda Tested-by: Linux Kernel Functional Testing Tested-by: Shuah Khan Signed-off-by: Greg Kroah-Hartman --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7012820523fff..ca3225cbf130a 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 12 -SUBLEVEL = 36 +SUBLEVEL = 37 EXTRAVERSION = NAME = Baby Opossum Posse -- GitLab From 1105189acad16c2b633e834c58cabfd93066b1f6 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 10 Jul 2025 18:41:52 +0000 Subject: [PATCH 2087/2211] Revert "tcp: add receive queue awareness in tcp_rcv_space_adjust()" This reverts commit 84c156a351459d9b0711d99131dcad714e31921b which is commit ea33537d82921e71f852ea2ed985acc562125efe upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I438e7a8dcf78ccb7c402de534598663642cb2fc3 Signed-off-by: Greg Kroah-Hartman --- include/linux/tcp.h | 2 +- net/ipv4/tcp_input.c | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 3bbf355f97670..842785347dd1c 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -337,7 +337,7 @@ struct tcp_sock { } rcv_rtt_est; /* Receiver queue space */ struct { - int space; + u32 space; u32 seq; u64 time; } rcvq_space; diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 6560e9e029be0..01eac4b869790 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -752,7 +752,8 @@ static inline void tcp_rcv_rtt_measure_ts(struct sock *sk, void tcp_rcv_space_adjust(struct sock *sk) { struct tcp_sock *tp = tcp_sk(sk); - int time, inq, copied; + u32 copied; + int time; trace_tcp_rcv_space_adjust(sk); @@ -763,9 +764,6 @@ void tcp_rcv_space_adjust(struct sock *sk) /* Number of bytes copied to user in last RTT */ copied = tp->copied_seq - tp->rcvq_space.seq; - /* Number of bytes in receive queue. */ - inq = tp->rcv_nxt - tp->copied_seq; - copied -= inq; if (copied <= tp->rcvq_space.space) goto new_measure; -- GitLab From 67767146c7df7ceb3499a151ae1e21f0b6cfd9d3 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 10 Jul 2025 18:45:42 +0000 Subject: [PATCH 2088/2211] Revert "Bluetooth: hci_core: Fix use-after-free in vhci_flush()" This reverts commit ce23b73f0f27e2dbeb81734a79db710f05aa33c6 which is commit 1d6123102e9fbedc8d25bf4731da6d513173e49e upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: Id61431c9decd8e97b69d0a3871b2658242c092ee Signed-off-by: Greg Kroah-Hartman --- include/net/bluetooth/hci_core.h | 2 -- net/bluetooth/hci_core.c | 34 ++++---------------------------- 2 files changed, 4 insertions(+), 32 deletions(-) diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 0f621d12d927e..4dd08ba13aa67 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -29,7 +29,6 @@ #include #include #include -#include #include #include @@ -341,7 +340,6 @@ struct adv_monitor { struct hci_dev { struct list_head list; - struct srcu_struct srcu; struct mutex lock; struct ida unset_handle_ida; diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index afdfe14eb7387..fa6c00ad2dca7 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -64,7 +64,7 @@ static DEFINE_IDA(hci_index_ida); /* Get HCI device by index. * Device is held on return. */ -static struct hci_dev *__hci_dev_get(int index, int *srcu_index) +struct hci_dev *hci_dev_get(int index) { struct hci_dev *hdev = NULL, *d; @@ -77,8 +77,6 @@ static struct hci_dev *__hci_dev_get(int index, int *srcu_index) list_for_each_entry(d, &hci_dev_list, list) { if (d->id == index) { hdev = hci_dev_hold(d); - if (srcu_index) - *srcu_index = srcu_read_lock(&d->srcu); break; } } @@ -86,22 +84,6 @@ static struct hci_dev *__hci_dev_get(int index, int *srcu_index) return hdev; } -struct hci_dev *hci_dev_get(int index) -{ - return __hci_dev_get(index, NULL); -} - -static struct hci_dev *hci_dev_get_srcu(int index, int *srcu_index) -{ - return __hci_dev_get(index, srcu_index); -} - -static void hci_dev_put_srcu(struct hci_dev *hdev, int srcu_index) -{ - srcu_read_unlock(&hdev->srcu, srcu_index); - hci_dev_put(hdev); -} - /* ---- Inquiry support ---- */ bool hci_discovery_active(struct hci_dev *hdev) @@ -586,9 +568,9 @@ static int hci_dev_do_reset(struct hci_dev *hdev) int hci_dev_reset(__u16 dev) { struct hci_dev *hdev; - int err, srcu_index; + int err; - hdev = hci_dev_get_srcu(dev, &srcu_index); + hdev = hci_dev_get(dev); if (!hdev) return -ENODEV; @@ -610,7 +592,7 @@ int hci_dev_reset(__u16 dev) err = hci_dev_do_reset(hdev); done: - hci_dev_put_srcu(hdev, srcu_index); + hci_dev_put(hdev); return err; } @@ -2457,11 +2439,6 @@ struct hci_dev *hci_alloc_dev_priv(int sizeof_priv) if (!hdev) return NULL; - if (init_srcu_struct(&hdev->srcu)) { - kfree(hdev); - return NULL; - } - hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1); hdev->esco_type = (ESCO_HV1); hdev->link_mode = (HCI_LM_ACCEPT); @@ -2706,9 +2683,6 @@ void hci_unregister_dev(struct hci_dev *hdev) list_del(&hdev->list); write_unlock(&hci_dev_list_lock); - synchronize_srcu(&hdev->srcu); - cleanup_srcu_struct(&hdev->srcu); - disable_work_sync(&hdev->rx_work); disable_work_sync(&hdev->cmd_work); disable_work_sync(&hdev->tx_work); -- GitLab From b0291e9adee64088b02548ae76481e9f1016bffc Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 10 Jul 2025 18:47:22 +0000 Subject: [PATCH 2089/2211] ANDROID: GKI: add devm_regulator_bulk_get_enable to db845c symbol list In commit a8795f3cd289 ("ASoC: codecs: wcd9335: Fix missing free of regulator supplies"), the wcd9335 driver adds a use of devm_regulator_bulk_get_enable. Add this symbol to the db845c symbol list as it now requires it to build properly. Fixes: a8795f3cd289 ("ASoC: codecs: wcd9335: Fix missing free of regulator supplies") Change-Id: I371b04a656e8a61f64ca0fc770efe85b04f97d91 Signed-off-by: Greg Kroah-Hartman --- gki/aarch64/symbols/db845c | 1 + 1 file changed, 1 insertion(+) diff --git a/gki/aarch64/symbols/db845c b/gki/aarch64/symbols/db845c index cabbc303a028a..e527ba9193a0a 100644 --- a/gki/aarch64/symbols/db845c +++ b/gki/aarch64/symbols/db845c @@ -181,6 +181,7 @@ __devm_regmap_init_mmio_clk devm_regulator_bulk_get devm_regulator_bulk_get_const + devm_regulator_bulk_get_enable devm_regulator_get devm_regulator_get_optional devm_regulator_register -- GitLab From 50d296188b7c4d9c6a0e08d33ac090cd3f4fb056 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 13 Jul 2025 12:26:39 +0000 Subject: [PATCH 2090/2211] Revert "usb: acpi: fix device link removal" This reverts commit 7cb875016032317dabf65d83a24505386b8022c2 which is commit 3b18405763c1ebb1efc15feef5563c9cdb2cc3a7 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: Id0ef7b3e63d5293160808ade4eb705d2b9e44b5e Signed-off-by: Greg Kroah-Hartman --- drivers/usb/core/hub.c | 3 --- drivers/usb/core/usb-acpi.c | 4 +--- include/linux/usb.h | 2 -- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index da6da5ec42372..da3d0e525b64e 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -2336,9 +2336,6 @@ void usb_disconnect(struct usb_device **pdev) usb_remove_ep_devs(&udev->ep0); usb_unlock_device(udev); - if (udev->usb4_link) - device_link_del(udev->usb4_link); - /* Unregister the device. The device driver is responsible * for de-configuring the device and invoking the remove-device * notifier chain (used by usbfs and possibly others). diff --git a/drivers/usb/core/usb-acpi.c b/drivers/usb/core/usb-acpi.c index 3bc68534dbcd3..494e21a11cd26 100644 --- a/drivers/usb/core/usb-acpi.c +++ b/drivers/usb/core/usb-acpi.c @@ -157,7 +157,7 @@ EXPORT_SYMBOL_GPL(usb_acpi_set_power_state); */ static int usb_acpi_add_usb4_devlink(struct usb_device *udev) { - struct device_link *link; + const struct device_link *link; struct usb_port *port_dev; struct usb_hub *hub; @@ -188,8 +188,6 @@ static int usb_acpi_add_usb4_devlink(struct usb_device *udev) dev_dbg(&port_dev->dev, "Created device link from %s to %s\n", dev_name(&port_dev->child->dev), dev_name(nhi_fwnode->dev)); - udev->usb4_link = link; - return 0; } diff --git a/include/linux/usb.h b/include/linux/usb.h index 71edb08cc464f..5766b7856d9c2 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -628,7 +628,6 @@ struct usb3_lpm_parameters { * FIXME -- complete doc * @authenticated: Crypto authentication passed * @tunnel_mode: Connection native or tunneled over USB4 - * @usb4_link: device link to the USB4 host interface * @lpm_capable: device supports LPM * @lpm_devinit_allow: Allow USB3 device initiated LPM, exit latency is in range * @usb2_hw_lpm_capable: device can perform USB2 hardware LPM @@ -739,7 +738,6 @@ struct usb_device { unsigned reset_resume:1; unsigned port_is_suspended:1; enum usb_link_tunnel_mode tunnel_mode; - struct device_link *usb4_link; int slot_id; struct usb2_lpm_parameters l1_params; -- GitLab From 797d4c3533567ef88cba2bc66dc038cb746aa6cb Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 13 Jul 2025 12:28:15 +0000 Subject: [PATCH 2091/2211] Revert "sched/fair: Fixup wake_up_sync() vs DELAYED_DEQUEUE" This reverts commit a2562bdd35e972dac77af39d08b8e51c45e80a8c which is commit aa3ee4f0b7541382c9f6f43f7408d73a5d4f4042 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I4f679ae99a3ad252f2ff1965c02b26799254911d Signed-off-by: Greg Kroah-Hartman --- kernel/sched/fair.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 2b2593f089897..970e6cd72690c 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -7421,11 +7421,6 @@ static bool dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags) return true; } -static inline unsigned int cfs_h_nr_delayed(struct rq *rq) -{ - return (rq->cfs.h_nr_queued - rq->cfs.h_nr_runnable); -} - #ifdef CONFIG_SMP /* Working cpumask for: sched_balance_rq(), sched_balance_newidle(). */ @@ -7587,12 +7582,8 @@ wake_affine_idle(int this_cpu, int prev_cpu, int sync) if (available_idle_cpu(this_cpu) && cpus_share_cache(this_cpu, prev_cpu)) return available_idle_cpu(prev_cpu) ? prev_cpu : this_cpu; - if (sync) { - struct rq *rq = cpu_rq(this_cpu); - - if ((rq->nr_running - cfs_h_nr_delayed(rq)) == 1) - return this_cpu; - } + if (sync && cpu_rq(this_cpu)->nr_running == 1) + return this_cpu; if (available_idle_cpu(prev_cpu)) return prev_cpu; -- GitLab From 05101597e0da9e640c15a4f24349f097774313dd Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 13 Jul 2025 12:28:25 +0000 Subject: [PATCH 2092/2211] Revert "sched/fair: Add new cfs_rq.h_nr_runnable" This reverts commit 3edcabcfc253cc9365f32cda2f43ecad12ef09ce which is commit c2a295bffeaf9461ecba76dc9e4780c898c94f03 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I4766fa12fb97adfee94fa31a9130bfa6dadf0080 Signed-off-by: Greg Kroah-Hartman --- kernel/sched/debug.c | 1 - kernel/sched/fair.c | 20 ++------------------ kernel/sched/sched.h | 1 - 3 files changed, 2 insertions(+), 20 deletions(-) diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c index 3fa8c8c0d6945..a4eff9cc2acde 100644 --- a/kernel/sched/debug.c +++ b/kernel/sched/debug.c @@ -845,7 +845,6 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) spread = right_vruntime - left_vruntime; SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "spread", SPLIT_NS(spread)); SEQ_printf(m, " .%-30s: %d\n", "nr_running", cfs_rq->nr_running); - SEQ_printf(m, " .%-30s: %d\n", "h_nr_runnable", cfs_rq->h_nr_runnable); SEQ_printf(m, " .%-30s: %d\n", "h_nr_queued", cfs_rq->h_nr_queued); SEQ_printf(m, " .%-30s: %d\n", "h_nr_delayed", cfs_rq->h_nr_delayed); SEQ_printf(m, " .%-30s: %d\n", "idle_nr_running", diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 970e6cd72690c..ff95749e0a70b 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -5607,7 +5607,6 @@ static void set_delayed(struct sched_entity *se) for_each_sched_entity(se) { struct cfs_rq *cfs_rq = cfs_rq_of(se); - cfs_rq->h_nr_runnable--; cfs_rq->h_nr_delayed++; if (cfs_rq_throttled(cfs_rq)) break; @@ -5630,7 +5629,6 @@ static void clear_delayed(struct sched_entity *se) for_each_sched_entity(se) { struct cfs_rq *cfs_rq = cfs_rq_of(se); - cfs_rq->h_nr_runnable++; cfs_rq->h_nr_delayed--; if (cfs_rq_throttled(cfs_rq)) break; @@ -6085,7 +6083,7 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) struct rq *rq = rq_of(cfs_rq); struct cfs_bandwidth *cfs_b = tg_cfs_bandwidth(cfs_rq->tg); struct sched_entity *se; - long queued_delta, runnable_delta, idle_task_delta, delayed_delta, dequeue = 1; + long queued_delta, idle_task_delta, delayed_delta, dequeue = 1; long rq_h_nr_queued = rq->cfs.h_nr_queued; raw_spin_lock(&cfs_b->lock); @@ -6117,7 +6115,6 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) rcu_read_unlock(); queued_delta = cfs_rq->h_nr_queued; - runnable_delta = cfs_rq->h_nr_runnable; idle_task_delta = cfs_rq->idle_h_nr_running; delayed_delta = cfs_rq->h_nr_delayed; for_each_sched_entity(se) { @@ -6142,7 +6139,6 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) idle_task_delta = cfs_rq->h_nr_queued; qcfs_rq->h_nr_queued -= queued_delta; - qcfs_rq->h_nr_runnable -= runnable_delta; qcfs_rq->idle_h_nr_running -= idle_task_delta; qcfs_rq->h_nr_delayed -= delayed_delta; @@ -6166,7 +6162,6 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) idle_task_delta = cfs_rq->h_nr_queued; qcfs_rq->h_nr_queued -= queued_delta; - qcfs_rq->h_nr_runnable -= runnable_delta; qcfs_rq->idle_h_nr_running -= idle_task_delta; qcfs_rq->h_nr_delayed -= delayed_delta; } @@ -6194,7 +6189,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) struct rq *rq = rq_of(cfs_rq); struct cfs_bandwidth *cfs_b = tg_cfs_bandwidth(cfs_rq->tg); struct sched_entity *se; - long queued_delta, runnable_delta, idle_task_delta, delayed_delta; + long queued_delta, idle_task_delta, delayed_delta; long rq_h_nr_queued = rq->cfs.h_nr_queued; se = cfs_rq->tg->se[cpu_of(rq)]; @@ -6229,7 +6224,6 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) } queued_delta = cfs_rq->h_nr_queued; - runnable_delta = cfs_rq->h_nr_runnable; idle_task_delta = cfs_rq->idle_h_nr_running; delayed_delta = cfs_rq->h_nr_delayed; for_each_sched_entity(se) { @@ -6248,7 +6242,6 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) idle_task_delta = cfs_rq->h_nr_queued; qcfs_rq->h_nr_queued += queued_delta; - qcfs_rq->h_nr_runnable += runnable_delta; qcfs_rq->idle_h_nr_running += idle_task_delta; qcfs_rq->h_nr_delayed += delayed_delta; @@ -6267,7 +6260,6 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) idle_task_delta = cfs_rq->h_nr_queued; qcfs_rq->h_nr_queued += queued_delta; - qcfs_rq->h_nr_runnable += runnable_delta; qcfs_rq->idle_h_nr_running += idle_task_delta; qcfs_rq->h_nr_delayed += delayed_delta; @@ -7195,8 +7187,6 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) enqueue_entity(cfs_rq, se, flags); slice = cfs_rq_min_slice(cfs_rq); - if (!h_nr_delayed) - cfs_rq->h_nr_runnable++; cfs_rq->h_nr_queued++; cfs_rq->idle_h_nr_running += idle_h_nr_running; cfs_rq->h_nr_delayed += h_nr_delayed; @@ -7224,8 +7214,6 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) min_vruntime_cb_propagate(&se->run_node, NULL); slice = cfs_rq_min_slice(cfs_rq); - if (!h_nr_delayed) - cfs_rq->h_nr_runnable++; cfs_rq->h_nr_queued++; cfs_rq->idle_h_nr_running += idle_h_nr_running; cfs_rq->h_nr_delayed += h_nr_delayed; @@ -7314,8 +7302,6 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags) break; } - if (!h_nr_delayed) - cfs_rq->h_nr_runnable -= h_nr_queued; cfs_rq->h_nr_queued -= h_nr_queued; cfs_rq->idle_h_nr_running -= idle_h_nr_running; cfs_rq->h_nr_delayed -= h_nr_delayed; @@ -7358,8 +7344,6 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags) min_vruntime_cb_propagate(&se->run_node, NULL); slice = cfs_rq_min_slice(cfs_rq); - if (!h_nr_delayed) - cfs_rq->h_nr_runnable -= h_nr_queued; cfs_rq->h_nr_queued -= h_nr_queued; cfs_rq->idle_h_nr_running -= idle_h_nr_running; cfs_rq->h_nr_delayed -= h_nr_delayed; diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 36c939723229e..e753e80ff7e24 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -665,7 +665,6 @@ struct cfs_rq { struct load_weight load; unsigned int nr_running; unsigned int h_nr_queued; /* SCHED_{NORMAL,BATCH,IDLE} */ - unsigned int h_nr_runnable; /* SCHED_{NORMAL,BATCH,IDLE} */ unsigned int idle_nr_running; /* SCHED_IDLE */ unsigned int idle_h_nr_running; /* SCHED_IDLE */ unsigned int h_nr_delayed; -- GitLab From e9c183823c6057766e8a41ef3915129f75e11bba Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 13 Jul 2025 12:28:34 +0000 Subject: [PATCH 2093/2211] Revert "sched/fair: Rename h_nr_running into h_nr_queued" This reverts commit 0cc4721a7182eec4f681439266aa526e6e4c83ad which is commit 7b8a702d943827130cc00ae36075eff5500f86f1 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: Iadcab6682d9c0ec46c1fecf988d75104045eefb8 Signed-off-by: Greg Kroah-Hartman --- kernel/sched/core.c | 4 +- kernel/sched/debug.c | 6 +-- kernel/sched/fair.c | 88 ++++++++++++++++++++++---------------------- kernel/sched/pelt.c | 4 +- kernel/sched/sched.h | 4 +- 5 files changed, 53 insertions(+), 53 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 967d94340b697..47501dbdf73f4 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1367,7 +1367,7 @@ bool sched_can_stop_tick(struct rq *rq) if (scx_enabled() && !scx_can_stop_tick(rq)) return false; - if (rq->cfs.h_nr_queued > 1) + if (rq->cfs.h_nr_running > 1) return false; /* @@ -6602,7 +6602,7 @@ __pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) * opportunity to pull in more work from other CPUs. */ if (likely(!sched_class_above(prev->sched_class, &fair_sched_class) && - rq->nr_running == rq->cfs.h_nr_queued)) { + rq->nr_running == rq->cfs.h_nr_running)) { p = pick_next_task_fair(rq, prev, rf); if (unlikely(p == RETRY_TASK)) diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c index a4eff9cc2acde..acda4cfa33e19 100644 --- a/kernel/sched/debug.c +++ b/kernel/sched/debug.c @@ -380,7 +380,7 @@ static ssize_t sched_fair_server_write(struct file *filp, const char __user *ubu return -EINVAL; } - if (rq->cfs.h_nr_queued) { + if (rq->cfs.h_nr_running) { update_rq_clock(rq); dl_server_stop(&rq->fair_server); } @@ -393,7 +393,7 @@ static ssize_t sched_fair_server_write(struct file *filp, const char __user *ubu printk_deferred("Fair server disabled in CPU %d, system may crash due to starvation.\n", cpu_of(rq)); - if (rq->cfs.h_nr_queued) + if (rq->cfs.h_nr_running) dl_server_start(&rq->fair_server); } @@ -845,7 +845,7 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) spread = right_vruntime - left_vruntime; SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "spread", SPLIT_NS(spread)); SEQ_printf(m, " .%-30s: %d\n", "nr_running", cfs_rq->nr_running); - SEQ_printf(m, " .%-30s: %d\n", "h_nr_queued", cfs_rq->h_nr_queued); + SEQ_printf(m, " .%-30s: %d\n", "h_nr_running", cfs_rq->h_nr_running); SEQ_printf(m, " .%-30s: %d\n", "h_nr_delayed", cfs_rq->h_nr_delayed); SEQ_printf(m, " .%-30s: %d\n", "idle_nr_running", cfs_rq->idle_nr_running); diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index ff95749e0a70b..79c3eac9d72a0 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -2200,7 +2200,7 @@ static void update_numa_stats(struct task_numa_env *env, ns->load += cpu_load(rq); ns->runnable += cpu_runnable(rq); ns->util += cpu_util_cfs(cpu); - ns->nr_running += rq->cfs.h_nr_queued; + ns->nr_running += rq->cfs.h_nr_running; ns->compute_capacity += capacity_of(cpu); if (find_idle && idle_core < 0 && !rq->nr_running && idle_cpu(cpu)) { @@ -5523,7 +5523,7 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags) * When enqueuing a sched_entity, we must: * - Update loads to have both entity and cfs_rq synced with now. * - For group_entity, update its runnable_weight to reflect the new - * h_nr_queued of its group cfs_rq. + * h_nr_running of its group cfs_rq. * - For group_entity, update its weight to reflect the new share of * its group cfs_rq * - Add its new weight to cfs_rq->load.weight @@ -5680,7 +5680,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags) * When dequeuing a sched_entity, we must: * - Update loads to have both entity and cfs_rq synced with now. * - For group_entity, update its runnable_weight to reflect the new - * h_nr_queued of its group cfs_rq. + * h_nr_running of its group cfs_rq. * - Subtract its previous weight from cfs_rq->load.weight. * - For group entity, update its weight to reflect the new share * of its group cfs_rq. @@ -6083,8 +6083,8 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) struct rq *rq = rq_of(cfs_rq); struct cfs_bandwidth *cfs_b = tg_cfs_bandwidth(cfs_rq->tg); struct sched_entity *se; - long queued_delta, idle_task_delta, delayed_delta, dequeue = 1; - long rq_h_nr_queued = rq->cfs.h_nr_queued; + long task_delta, idle_task_delta, delayed_delta, dequeue = 1; + long rq_h_nr_running = rq->cfs.h_nr_running; raw_spin_lock(&cfs_b->lock); /* This will start the period timer if necessary */ @@ -6114,7 +6114,7 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) walk_tg_tree_from(cfs_rq->tg, tg_throttle_down, tg_nop, (void *)rq); rcu_read_unlock(); - queued_delta = cfs_rq->h_nr_queued; + task_delta = cfs_rq->h_nr_running; idle_task_delta = cfs_rq->idle_h_nr_running; delayed_delta = cfs_rq->h_nr_delayed; for_each_sched_entity(se) { @@ -6136,9 +6136,9 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) dequeue_entity(qcfs_rq, se, flags); if (cfs_rq_is_idle(group_cfs_rq(se))) - idle_task_delta = cfs_rq->h_nr_queued; + idle_task_delta = cfs_rq->h_nr_running; - qcfs_rq->h_nr_queued -= queued_delta; + qcfs_rq->h_nr_running -= task_delta; qcfs_rq->idle_h_nr_running -= idle_task_delta; qcfs_rq->h_nr_delayed -= delayed_delta; @@ -6159,18 +6159,18 @@ static bool throttle_cfs_rq(struct cfs_rq *cfs_rq) se_update_runnable(se); if (cfs_rq_is_idle(group_cfs_rq(se))) - idle_task_delta = cfs_rq->h_nr_queued; + idle_task_delta = cfs_rq->h_nr_running; - qcfs_rq->h_nr_queued -= queued_delta; + qcfs_rq->h_nr_running -= task_delta; qcfs_rq->idle_h_nr_running -= idle_task_delta; qcfs_rq->h_nr_delayed -= delayed_delta; } /* At this point se is NULL and we are at root level*/ - sub_nr_running(rq, queued_delta); + sub_nr_running(rq, task_delta); /* Stop the fair server if throttling resulted in no runnable tasks */ - if (rq_h_nr_queued && !rq->cfs.h_nr_queued) + if (rq_h_nr_running && !rq->cfs.h_nr_running) dl_server_stop(&rq->fair_server); done: /* @@ -6189,8 +6189,8 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) struct rq *rq = rq_of(cfs_rq); struct cfs_bandwidth *cfs_b = tg_cfs_bandwidth(cfs_rq->tg); struct sched_entity *se; - long queued_delta, idle_task_delta, delayed_delta; - long rq_h_nr_queued = rq->cfs.h_nr_queued; + long task_delta, idle_task_delta, delayed_delta; + long rq_h_nr_running = rq->cfs.h_nr_running; se = cfs_rq->tg->se[cpu_of(rq)]; @@ -6223,7 +6223,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) goto unthrottle_throttle; } - queued_delta = cfs_rq->h_nr_queued; + task_delta = cfs_rq->h_nr_running; idle_task_delta = cfs_rq->idle_h_nr_running; delayed_delta = cfs_rq->h_nr_delayed; for_each_sched_entity(se) { @@ -6239,9 +6239,9 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) enqueue_entity(qcfs_rq, se, ENQUEUE_WAKEUP); if (cfs_rq_is_idle(group_cfs_rq(se))) - idle_task_delta = cfs_rq->h_nr_queued; + idle_task_delta = cfs_rq->h_nr_running; - qcfs_rq->h_nr_queued += queued_delta; + qcfs_rq->h_nr_running += task_delta; qcfs_rq->idle_h_nr_running += idle_task_delta; qcfs_rq->h_nr_delayed += delayed_delta; @@ -6257,9 +6257,9 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) se_update_runnable(se); if (cfs_rq_is_idle(group_cfs_rq(se))) - idle_task_delta = cfs_rq->h_nr_queued; + idle_task_delta = cfs_rq->h_nr_running; - qcfs_rq->h_nr_queued += queued_delta; + qcfs_rq->h_nr_running += task_delta; qcfs_rq->idle_h_nr_running += idle_task_delta; qcfs_rq->h_nr_delayed += delayed_delta; @@ -6269,11 +6269,11 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) } /* Start the fair server if un-throttling resulted in new runnable tasks */ - if (!rq_h_nr_queued && rq->cfs.h_nr_queued) + if (!rq_h_nr_running && rq->cfs.h_nr_running) dl_server_start(&rq->fair_server); /* At this point se is NULL and we are at root level*/ - add_nr_running(rq, queued_delta); + add_nr_running(rq, task_delta); unthrottle_throttle: assert_list_leaf_cfs_rq(rq); @@ -6988,7 +6988,7 @@ static void hrtick_start_fair(struct rq *rq, struct task_struct *p) SCHED_WARN_ON(task_rq(p) != rq); - if (rq->cfs.h_nr_queued > 1) { + if (rq->cfs.h_nr_running > 1) { u64 ran = se->sum_exec_runtime - se->prev_sum_exec_runtime; u64 slice = se->slice; s64 delta = slice - ran; @@ -7136,7 +7136,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) int idle_h_nr_running = task_has_idle_policy(p); int h_nr_delayed = 0; int task_new = !(flags & ENQUEUE_WAKEUP); - int rq_h_nr_queued = rq->cfs.h_nr_queued; + int rq_h_nr_running = rq->cfs.h_nr_running; u64 slice = 0; int should_iowait_boost; @@ -7187,7 +7187,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) enqueue_entity(cfs_rq, se, flags); slice = cfs_rq_min_slice(cfs_rq); - cfs_rq->h_nr_queued++; + cfs_rq->h_nr_running++; cfs_rq->idle_h_nr_running += idle_h_nr_running; cfs_rq->h_nr_delayed += h_nr_delayed; @@ -7214,7 +7214,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) min_vruntime_cb_propagate(&se->run_node, NULL); slice = cfs_rq_min_slice(cfs_rq); - cfs_rq->h_nr_queued++; + cfs_rq->h_nr_running++; cfs_rq->idle_h_nr_running += idle_h_nr_running; cfs_rq->h_nr_delayed += h_nr_delayed; @@ -7226,7 +7226,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) goto enqueue_throttle; } - if (!rq_h_nr_queued && rq->cfs.h_nr_queued) { + if (!rq_h_nr_running && rq->cfs.h_nr_running) { /* Account for idle runtime */ if (!rq->nr_running) dl_server_update_idle_time(rq, rq->curr); @@ -7273,19 +7273,19 @@ static void set_next_buddy(struct sched_entity *se); static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags) { bool was_sched_idle = sched_idle_rq(rq); - int rq_h_nr_queued = rq->cfs.h_nr_queued; + int rq_h_nr_running = rq->cfs.h_nr_running; bool task_sleep = flags & DEQUEUE_SLEEP; bool task_delayed = flags & DEQUEUE_DELAYED; struct task_struct *p = NULL; int idle_h_nr_running = 0; - int h_nr_queued = 0; + int h_nr_running = 0; int h_nr_delayed = 0; struct cfs_rq *cfs_rq; u64 slice = 0; if (entity_is_task(se)) { p = task_of(se); - h_nr_queued = 1; + h_nr_running = 1; idle_h_nr_running = task_has_idle_policy(p); if (!task_sleep && !task_delayed) h_nr_delayed = !!se->sched_delayed; @@ -7302,12 +7302,12 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags) break; } - cfs_rq->h_nr_queued -= h_nr_queued; + cfs_rq->h_nr_running -= h_nr_running; cfs_rq->idle_h_nr_running -= idle_h_nr_running; cfs_rq->h_nr_delayed -= h_nr_delayed; if (cfs_rq_is_idle(cfs_rq)) - idle_h_nr_running = h_nr_queued; + idle_h_nr_running = h_nr_running; /* end evaluation on encountering a throttled cfs_rq */ if (cfs_rq_throttled(cfs_rq)) @@ -7344,21 +7344,21 @@ static int dequeue_entities(struct rq *rq, struct sched_entity *se, int flags) min_vruntime_cb_propagate(&se->run_node, NULL); slice = cfs_rq_min_slice(cfs_rq); - cfs_rq->h_nr_queued -= h_nr_queued; + cfs_rq->h_nr_running -= h_nr_running; cfs_rq->idle_h_nr_running -= idle_h_nr_running; cfs_rq->h_nr_delayed -= h_nr_delayed; if (cfs_rq_is_idle(cfs_rq)) - idle_h_nr_running = h_nr_queued; + idle_h_nr_running = h_nr_running; /* end evaluation on encountering a throttled cfs_rq */ if (cfs_rq_throttled(cfs_rq)) return 0; } - sub_nr_running(rq, h_nr_queued); + sub_nr_running(rq, h_nr_running); - if (rq_h_nr_queued && !rq->cfs.h_nr_queued) + if (rq_h_nr_running && !rq->cfs.h_nr_running) dl_server_stop(&rq->fair_server); /* balance early to pull high priority tasks */ @@ -10577,7 +10577,7 @@ sched_reduced_capacity(struct rq *rq, struct sched_domain *sd) * When there is more than 1 task, the group_overloaded case already * takes care of cpu with reduced capacity */ - if (rq->cfs.h_nr_queued != 1) + if (rq->cfs.h_nr_running != 1) return false; return check_cpu_capacity(rq, sd); @@ -10612,7 +10612,7 @@ static inline void update_sg_lb_stats(struct lb_env *env, sgs->group_load += load; sgs->group_util += cpu_util_cfs(i); sgs->group_runnable += cpu_runnable(rq); - sgs->sum_h_nr_running += rq->cfs.h_nr_queued; + sgs->sum_h_nr_running += rq->cfs.h_nr_running; nr_running = rq->nr_running; sgs->sum_nr_running += nr_running; @@ -10930,7 +10930,7 @@ static inline void update_sg_wakeup_stats(struct sched_domain *sd, sgs->group_util += cpu_util_without(i, p); sgs->group_runnable += cpu_runnable_without(rq, p); local = task_running_on_cpu(i, p); - sgs->sum_h_nr_running += rq->cfs.h_nr_queued - local; + sgs->sum_h_nr_running += rq->cfs.h_nr_running - local; nr_running = rq->nr_running - local; sgs->sum_nr_running += nr_running; @@ -11726,7 +11726,7 @@ static struct rq *sched_balance_find_src_rq(struct lb_env *env, if (rt > env->fbq_type) continue; - nr_running = rq->cfs.h_nr_queued; + nr_running = rq->cfs.h_nr_running; if (!nr_running) continue; @@ -11886,7 +11886,7 @@ static int need_active_balance(struct lb_env *env) * available on dst_cpu. */ if (env->idle && - (env->src_rq->cfs.h_nr_queued == 1)) { + (env->src_rq->cfs.h_nr_running == 1)) { if ((check_cpu_capacity(env->src_rq, sd)) && (capacity_of(env->src_cpu)*sd->imbalance_pct < capacity_of(env->dst_cpu)*100)) return 1; @@ -12645,7 +12645,7 @@ static void nohz_balancer_kick(struct rq *rq) * If there's a runnable CFS task and the current CPU has reduced * capacity, kick the ILB to see if there's a better CPU to run on: */ - if (rq->cfs.h_nr_queued >= 1 && check_cpu_capacity(rq, sd)) { + if (rq->cfs.h_nr_running >= 1 && check_cpu_capacity(rq, sd)) { flags = NOHZ_STATS_KICK | NOHZ_BALANCE_KICK; goto unlock; } @@ -13148,11 +13148,11 @@ static int sched_balance_newidle(struct rq *this_rq, struct rq_flags *rf) * have been enqueued in the meantime. Since we're not going idle, * pretend we pulled a task. */ - if (this_rq->cfs.h_nr_queued && !pulled_task) + if (this_rq->cfs.h_nr_running && !pulled_task) pulled_task = 1; /* Is there a task of a high priority class? */ - if (this_rq->nr_running != this_rq->cfs.h_nr_queued) + if (this_rq->nr_running != this_rq->cfs.h_nr_running) pulled_task = -1; out: @@ -13839,7 +13839,7 @@ int sched_group_set_idle(struct task_group *tg, long idle) parent_cfs_rq->idle_nr_running--; } - idle_task_delta = grp_cfs_rq->h_nr_queued - + idle_task_delta = grp_cfs_rq->h_nr_running - grp_cfs_rq->idle_h_nr_running; if (!cfs_rq_is_idle(grp_cfs_rq)) idle_task_delta *= -1; diff --git a/kernel/sched/pelt.c b/kernel/sched/pelt.c index ab2e7e7a72404..037a7962e5b05 100644 --- a/kernel/sched/pelt.c +++ b/kernel/sched/pelt.c @@ -276,7 +276,7 @@ ___update_load_avg(struct sched_avg *sa, unsigned long load) * * group: [ see update_cfs_group() ] * se_weight() = tg->weight * grq->load_avg / tg->load_avg - * se_runnable() = grq->h_nr_queued + * se_runnable() = grq->h_nr_running * * runnable_sum = se_runnable() * runnable = grq->runnable_sum * runnable_avg = runnable_sum @@ -341,7 +341,7 @@ int __update_load_avg_cfs_rq(u64 now, struct cfs_rq *cfs_rq) if (___update_load_sum(now, &cfs_rq->avg, scale_load_down(cfs_rq->load.weight), - cfs_rq->h_nr_queued - cfs_rq->h_nr_delayed, + cfs_rq->h_nr_running - cfs_rq->h_nr_delayed, cfs_rq->curr != NULL)) { ___update_load_avg(&cfs_rq->avg, 1); diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index e753e80ff7e24..ea33dc8e1bf45 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -664,7 +664,7 @@ struct balance_callback { struct cfs_rq { struct load_weight load; unsigned int nr_running; - unsigned int h_nr_queued; /* SCHED_{NORMAL,BATCH,IDLE} */ + unsigned int h_nr_running; /* SCHED_{NORMAL,BATCH,IDLE} */ unsigned int idle_nr_running; /* SCHED_IDLE */ unsigned int idle_h_nr_running; /* SCHED_IDLE */ unsigned int h_nr_delayed; @@ -920,7 +920,7 @@ static inline void se_update_runnable(struct sched_entity *se) if (!entity_is_task(se)) { struct cfs_rq *cfs_rq = se->my_q; - se->runnable_weight = cfs_rq->h_nr_queued - cfs_rq->h_nr_delayed; + se->runnable_weight = cfs_rq->h_nr_running - cfs_rq->h_nr_delayed; } } -- GitLab From 2e1a9faec5c172969996a3acfbde8fd469856032 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 13 Jul 2025 12:30:19 +0000 Subject: [PATCH 2094/2211] Revert "bpf: Do not include stack ptr register in precision backtracking bookkeeping" This reverts commit 4265682c29c92f52c0da6fad5a79b5801462c8de which is commit e2d2115e56c4a02377189bfc3a9a7933552a7b0f upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I1a833012ae4ccf639e468eedc82f6c1b93db87bc Signed-off-by: Greg Kroah-Hartman --- include/linux/bpf_verifier.h | 12 ++++-------- kernel/bpf/verifier.c | 18 ++---------------- 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index 8ac67d4aa97f9..5261e2efabdbc 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -362,11 +362,7 @@ enum { INSN_F_SPI_MASK = 0x3f, /* 6 bits */ INSN_F_SPI_SHIFT = 3, /* shifted 3 bits to the left */ - INSN_F_STACK_ACCESS = BIT(9), - - INSN_F_DST_REG_STACK = BIT(10), /* dst_reg is PTR_TO_STACK */ - INSN_F_SRC_REG_STACK = BIT(11), /* src_reg is PTR_TO_STACK */ - /* total 12 bits are used now. */ + INSN_F_STACK_ACCESS = BIT(9), /* we need 10 bits total */ }; static_assert(INSN_F_FRAMENO_MASK + 1 >= MAX_CALL_FRAMES); @@ -375,9 +371,9 @@ static_assert(INSN_F_SPI_MASK + 1 >= MAX_BPF_STACK / 8); struct bpf_insn_hist_entry { u32 idx; /* insn idx can't be bigger than 1 million */ - u32 prev_idx : 20; - /* special INSN_F_xxx flags */ - u32 flags : 12; + u32 prev_idx : 22; + /* special flags, e.g., whether insn is doing register stack spill/load */ + u32 flags : 10; /* additional registers that need precision tracking when this * jump is backtracked, vector of six 10-bit records */ diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 484e746c2e9c7..7e735cdf2013b 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -4066,10 +4066,8 @@ static int backtrack_insn(struct bpf_verifier_env *env, int idx, int subseq_idx, * before it would be equally necessary to * propagate it to dreg. */ - if (!hist || !(hist->flags & INSN_F_SRC_REG_STACK)) - bt_set_reg(bt, sreg); - if (!hist || !(hist->flags & INSN_F_DST_REG_STACK)) - bt_set_reg(bt, dreg); + bt_set_reg(bt, dreg); + bt_set_reg(bt, sreg); } else if (BPF_SRC(insn->code) == BPF_K) { /* dreg K * Only dreg still needs precision before @@ -15415,7 +15413,6 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, struct bpf_reg_state *eq_branch_regs; struct linked_regs linked_regs = {}; u8 opcode = BPF_OP(insn->code); - int insn_flags = 0; bool is_jmp32; int pred = -1; int err; @@ -15475,9 +15472,6 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, insn->src_reg); return -EACCES; } - - if (src_reg->type == PTR_TO_STACK) - insn_flags |= INSN_F_SRC_REG_STACK; } else { if (insn->src_reg != BPF_REG_0) { verbose(env, "BPF_JMP/JMP32 uses reserved fields\n"); @@ -15489,14 +15483,6 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, __mark_reg_known(src_reg, insn->imm); } - if (dst_reg->type == PTR_TO_STACK) - insn_flags |= INSN_F_DST_REG_STACK; - if (insn_flags) { - err = push_insn_history(env, this_branch, insn_flags, 0); - if (err) - return err; - } - is_jmp32 = BPF_CLASS(insn->code) == BPF_JMP32; pred = is_branch_taken(dst_reg, src_reg, opcode, is_jmp32); if (pred >= 0) { -- GitLab From 9647bfd68fbac40e65fa514a84154b6ce818846a Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 13 Jul 2025 12:30:39 +0000 Subject: [PATCH 2095/2211] Revert "bpf: use common instruction history across all states" This reverts commit c5474a7b04ccfec20e945df0a53b92db2dc3a191 which is commit 96a30e469ca1d2b8cc7811b40911f8614b558241 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I78f61af9b03cf393e287972cf3c2e092614e8014 Signed-off-by: Greg Kroah-Hartman --- include/linux/bpf_verifier.h | 19 +++---- kernel/bpf/verifier.c | 107 ++++++++++++++++++----------------- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index 5261e2efabdbc..b178d684b5980 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -350,7 +350,7 @@ struct bpf_func_state { #define MAX_CALL_FRAMES 8 -/* instruction history flags, used in bpf_insn_hist_entry.flags field */ +/* instruction history flags, used in bpf_jmp_history_entry.flags field */ enum { /* instruction references stack slot through PTR_TO_STACK register; * we also store stack's frame number in lower 3 bits (MAX_CALL_FRAMES is 8) @@ -368,7 +368,7 @@ enum { static_assert(INSN_F_FRAMENO_MASK + 1 >= MAX_CALL_FRAMES); static_assert(INSN_F_SPI_MASK + 1 >= MAX_BPF_STACK / 8); -struct bpf_insn_hist_entry { +struct bpf_jmp_history_entry { u32 idx; /* insn idx can't be bigger than 1 million */ u32 prev_idx : 22; @@ -459,14 +459,13 @@ struct bpf_verifier_state { * See get_loop_entry() for more information. */ struct bpf_verifier_state *loop_entry; - /* Sub-range of env->insn_hist[] corresponding to this state's - * instruction history. - * Backtracking is using it to go from last to first. - * For most states instruction history is short, 0-3 instructions. + /* jmp history recorded from first to last. + * backtracking is using it to go from last to first. + * For most states jmp_history_cnt is [0-3]. * For loops can go up to ~40. */ - u32 insn_hist_start; - u32 insn_hist_end; + struct bpf_jmp_history_entry *jmp_history; + u32 jmp_history_cnt; u32 dfs_depth; u32 callback_unroll_depth; u32 may_goto_depth; @@ -751,9 +750,7 @@ struct bpf_verifier_env { int cur_stack; } cfg; struct backtrack_state bt; - struct bpf_insn_hist_entry *insn_hist; - struct bpf_insn_hist_entry *cur_hist_ent; - u32 insn_hist_cap; + struct bpf_jmp_history_entry *cur_hist_ent; u32 pass_cnt; /* number of times do_check() was called */ u32 subprog_cnt; /* number of instructions analyzed by the verifier */ diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 7e735cdf2013b..7108f4cfd9ab2 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -1376,6 +1376,13 @@ static void free_func_state(struct bpf_func_state *state) kfree(state); } +static void clear_jmp_history(struct bpf_verifier_state *state) +{ + kfree(state->jmp_history); + state->jmp_history = NULL; + state->jmp_history_cnt = 0; +} + static void free_verifier_state(struct bpf_verifier_state *state, bool free_self) { @@ -1385,6 +1392,7 @@ static void free_verifier_state(struct bpf_verifier_state *state, free_func_state(state->frame[i]); state->frame[i] = NULL; } + clear_jmp_history(state); if (free_self) kfree(state); } @@ -1410,6 +1418,13 @@ static int copy_verifier_state(struct bpf_verifier_state *dst_state, struct bpf_func_state *dst; int i, err; + dst_state->jmp_history = copy_array(dst_state->jmp_history, src->jmp_history, + src->jmp_history_cnt, sizeof(*dst_state->jmp_history), + GFP_USER); + if (!dst_state->jmp_history) + return -ENOMEM; + dst_state->jmp_history_cnt = src->jmp_history_cnt; + /* if dst has more stack frames then src frame, free them, this is also * necessary in case of exceptional exits using bpf_throw. */ @@ -1428,8 +1443,6 @@ static int copy_verifier_state(struct bpf_verifier_state *dst_state, dst_state->parent = src->parent; dst_state->first_insn_idx = src->first_insn_idx; dst_state->last_insn_idx = src->last_insn_idx; - dst_state->insn_hist_start = src->insn_hist_start; - dst_state->insn_hist_end = src->insn_hist_end; dst_state->dfs_depth = src->dfs_depth; dst_state->callback_unroll_depth = src->callback_unroll_depth; dst_state->used_as_loop_entry = src->used_as_loop_entry; @@ -2483,14 +2496,9 @@ static struct bpf_verifier_state *push_async_cb(struct bpf_verifier_env *env, * The caller state doesn't matter. * This is async callback. It starts in a fresh stack. * Initialize it similar to do_check_common(). - * But we do need to make sure to not clobber insn_hist, so we keep - * chaining insn_hist_start/insn_hist_end indices as for a normal - * child state. */ elem->st.branches = 1; elem->st.in_sleepable = is_sleepable; - elem->st.insn_hist_start = env->cur_state->insn_hist_end; - elem->st.insn_hist_end = elem->st.insn_hist_start; frame = kzalloc(sizeof(*frame), GFP_KERNEL); if (!frame) goto err; @@ -3505,10 +3513,11 @@ static void linked_regs_unpack(u64 val, struct linked_regs *s) } /* for any branch, call, exit record the history of jmps in the given state */ -static int push_insn_history(struct bpf_verifier_env *env, struct bpf_verifier_state *cur, - int insn_flags, u64 linked_regs) +static int push_jmp_history(struct bpf_verifier_env *env, struct bpf_verifier_state *cur, + int insn_flags, u64 linked_regs) { - struct bpf_insn_hist_entry *p; + u32 cnt = cur->jmp_history_cnt; + struct bpf_jmp_history_entry *p; size_t alloc_size; /* combine instruction flags if we already recorded this instruction */ @@ -3528,32 +3537,29 @@ static int push_insn_history(struct bpf_verifier_env *env, struct bpf_verifier_s return 0; } - if (cur->insn_hist_end + 1 > env->insn_hist_cap) { - alloc_size = size_mul(cur->insn_hist_end + 1, sizeof(*p)); - p = kvrealloc(env->insn_hist, alloc_size, GFP_USER); - if (!p) - return -ENOMEM; - env->insn_hist = p; - env->insn_hist_cap = alloc_size / sizeof(*p); - } + cnt++; + alloc_size = kmalloc_size_roundup(size_mul(cnt, sizeof(*p))); + p = krealloc(cur->jmp_history, alloc_size, GFP_USER); + if (!p) + return -ENOMEM; + cur->jmp_history = p; - p = &env->insn_hist[cur->insn_hist_end]; + p = &cur->jmp_history[cnt - 1]; p->idx = env->insn_idx; p->prev_idx = env->prev_insn_idx; p->flags = insn_flags; p->linked_regs = linked_regs; - - cur->insn_hist_end++; + cur->jmp_history_cnt = cnt; env->cur_hist_ent = p; return 0; } -static struct bpf_insn_hist_entry *get_insn_hist_entry(struct bpf_verifier_env *env, - u32 hist_start, u32 hist_end, int insn_idx) +static struct bpf_jmp_history_entry *get_jmp_hist_entry(struct bpf_verifier_state *st, + u32 hist_end, int insn_idx) { - if (hist_end > hist_start && env->insn_hist[hist_end - 1].idx == insn_idx) - return &env->insn_hist[hist_end - 1]; + if (hist_end > 0 && st->jmp_history[hist_end - 1].idx == insn_idx) + return &st->jmp_history[hist_end - 1]; return NULL; } @@ -3570,26 +3576,25 @@ static struct bpf_insn_hist_entry *get_insn_hist_entry(struct bpf_verifier_env * * history entry recording a jump from last instruction of parent state and * first instruction of given state. */ -static int get_prev_insn_idx(const struct bpf_verifier_env *env, - struct bpf_verifier_state *st, - int insn_idx, u32 hist_start, u32 *hist_endp) +static int get_prev_insn_idx(struct bpf_verifier_state *st, int i, + u32 *history) { - u32 hist_end = *hist_endp; - u32 cnt = hist_end - hist_start; + u32 cnt = *history; - if (insn_idx == st->first_insn_idx) { + if (i == st->first_insn_idx) { if (cnt == 0) return -ENOENT; - if (cnt == 1 && env->insn_hist[hist_start].idx == insn_idx) + if (cnt == 1 && st->jmp_history[0].idx == i) return -ENOENT; } - if (cnt && env->insn_hist[hist_end - 1].idx == insn_idx) { - (*hist_endp)--; - return env->insn_hist[hist_end - 1].prev_idx; + if (cnt && st->jmp_history[cnt - 1].idx == i) { + i = st->jmp_history[cnt - 1].prev_idx; + (*history)--; } else { - return insn_idx - 1; + i--; } + return i; } static const char *disasm_kfunc_name(void *data, const struct bpf_insn *insn) @@ -3761,7 +3766,7 @@ static void fmt_stack_mask(char *buf, ssize_t buf_sz, u64 stack_mask) /* If any register R in hist->linked_regs is marked as precise in bt, * do bt_set_frame_{reg,slot}(bt, R) for all registers in hist->linked_regs. */ -static void bt_sync_linked_regs(struct backtrack_state *bt, struct bpf_insn_hist_entry *hist) +static void bt_sync_linked_regs(struct backtrack_state *bt, struct bpf_jmp_history_entry *hist) { struct linked_regs linked_regs; bool some_precise = false; @@ -3806,7 +3811,7 @@ static bool calls_callback(struct bpf_verifier_env *env, int insn_idx); * - *was* processed previously during backtracking. */ static int backtrack_insn(struct bpf_verifier_env *env, int idx, int subseq_idx, - struct bpf_insn_hist_entry *hist, struct backtrack_state *bt) + struct bpf_jmp_history_entry *hist, struct backtrack_state *bt) { const struct bpf_insn_cbs cbs = { .cb_call = disasm_kfunc_name, @@ -4225,7 +4230,7 @@ static void mark_all_scalars_imprecise(struct bpf_verifier_env *env, struct bpf_ * SCALARS, as well as any other registers and slots that contribute to * a tracked state of given registers/stack slots, depending on specific BPF * assembly instructions (see backtrack_insns() for exact instruction handling - * logic). This backtracking relies on recorded insn_hist and is able to + * logic). This backtracking relies on recorded jmp_history and is able to * traverse entire chain of parent states. This process ends only when all the * necessary registers/slots and their transitive dependencies are marked as * precise. @@ -4342,9 +4347,8 @@ static int __mark_chain_precision(struct bpf_verifier_env *env, int regno) for (;;) { DECLARE_BITMAP(mask, 64); - u32 hist_start = st->insn_hist_start; - u32 hist_end = st->insn_hist_end; - struct bpf_insn_hist_entry *hist; + u32 history = st->jmp_history_cnt; + struct bpf_jmp_history_entry *hist; if (env->log.level & BPF_LOG_LEVEL2) { verbose(env, "mark_precise: frame%d: last_idx %d first_idx %d subseq_idx %d \n", @@ -4383,7 +4387,7 @@ static int __mark_chain_precision(struct bpf_verifier_env *env, int regno) err = 0; skip_first = false; } else { - hist = get_insn_hist_entry(env, hist_start, hist_end, i); + hist = get_jmp_hist_entry(st, history, i); err = backtrack_insn(env, i, subseq_idx, hist, bt); } if (err == -ENOTSUPP) { @@ -4400,7 +4404,7 @@ static int __mark_chain_precision(struct bpf_verifier_env *env, int regno) */ return 0; subseq_idx = i; - i = get_prev_insn_idx(env, st, i, hist_start, &hist_end); + i = get_prev_insn_idx(st, i, &history); if (i == -ENOENT) break; if (i >= env->prog->len) { @@ -4767,7 +4771,7 @@ static int check_stack_write_fixed_off(struct bpf_verifier_env *env, } if (insn_flags) - return push_insn_history(env, env->cur_state, insn_flags, 0); + return push_jmp_history(env, env->cur_state, insn_flags, 0); return 0; } @@ -5074,7 +5078,7 @@ static int check_stack_read_fixed_off(struct bpf_verifier_env *env, insn_flags = 0; /* we are not restoring spilled register */ } if (insn_flags) - return push_insn_history(env, env->cur_state, insn_flags, 0); + return push_jmp_history(env, env->cur_state, insn_flags, 0); return 0; } @@ -15536,7 +15540,7 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, if (dst_reg->type == SCALAR_VALUE && dst_reg->id) collect_linked_regs(this_branch, dst_reg->id, &linked_regs); if (linked_regs.cnt > 1) { - err = push_insn_history(env, this_branch, 0, linked_regs_pack(&linked_regs)); + err = push_jmp_history(env, this_branch, 0, linked_regs_pack(&linked_regs)); if (err) return err; } @@ -17949,7 +17953,7 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx) force_new_state = env->test_state_freq || is_force_checkpoint(env, insn_idx) || /* Avoid accumulating infinitely long jmp history */ - cur->insn_hist_end - cur->insn_hist_start > 40; + cur->jmp_history_cnt > 40; /* bpf progs typically have pruning point every 4 instructions * http://vger.kernel.org/bpfconf2019.html#session-1 @@ -18147,7 +18151,7 @@ hit: * the current state. */ if (is_jmp_point(env, env->insn_idx)) - err = err ? : push_insn_history(env, cur, 0, 0); + err = err ? : push_jmp_history(env, cur, 0, 0); err = err ? : propagate_precision(env, &sl->state); if (err) return err; @@ -18246,8 +18250,8 @@ next: cur->parent = new; cur->first_insn_idx = insn_idx; - cur->insn_hist_start = cur->insn_hist_end; cur->dfs_depth = new->dfs_depth + 1; + clear_jmp_history(cur); new_sl->next = *explored_state(env, insn_idx); *explored_state(env, insn_idx) = new_sl; /* connect new state to parentage chain. Current frame needs all @@ -18415,7 +18419,7 @@ static int do_check(struct bpf_verifier_env *env) } if (is_jmp_point(env, env->insn_idx)) { - err = push_insn_history(env, state, 0, 0); + err = push_jmp_history(env, state, 0, 0); if (err) return err; } @@ -22671,7 +22675,6 @@ err_unlock: if (!is_priv) mutex_unlock(&bpf_verifier_lock); vfree(env->insn_aux_data); - kvfree(env->insn_hist); err_free_env: kvfree(env); return ret; -- GitLab From 8776085e78fdb72ba231127ea2ba4cc7b32cd1d5 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 13 Jul 2025 13:28:06 +0000 Subject: [PATCH 2096/2211] ANDROID: GKI: add fput() to db854c symbol list In commit 3f6ce8433a90 ("drm/msm: Fix another leak in the submit error path"), the msm drm module adds a call to fput(). Add that symbol to the db845c build target to fix the build issue. Fixes: 3f6ce8433a90 ("drm/msm: Fix another leak in the submit error path") Change-Id: I0495084d45cc4d1325e8504ab2b422ec59a4e1b8 Signed-off-by: Greg Kroah-Hartman --- gki/aarch64/symbols/db845c | 1 + 1 file changed, 1 insertion(+) diff --git a/gki/aarch64/symbols/db845c b/gki/aarch64/symbols/db845c index e527ba9193a0a..95f133fdc6b25 100644 --- a/gki/aarch64/symbols/db845c +++ b/gki/aarch64/symbols/db845c @@ -302,6 +302,7 @@ firmware_request_nowarn flush_work __flush_workqueue + fput __fortify_panic free_io_pgtable_ops free_irq -- GitLab From faac2abe895d200615a91acb63a709feb3dac1c2 Mon Sep 17 00:00:00 2001 From: "Borislav Petkov (AMD)" Date: Fri, 11 Jul 2025 21:18:44 +0200 Subject: [PATCH 2097/2211] x86/CPU/AMD: Properly check the TSA microcode In order to simplify backports, I resorted to an older version of the microcode revision checking which didn't pull in the whole struct x86_cpu_id matching machinery. My simpler method, however, forgot to add the extended CPU model to the patch revision, which lead to mismatches when determining whether TSA mitigation support is present. So add that forgotten extended model. This is a stable-only fix and the preference is to do it this way because it is a lot simpler. Also, the Fixes: tag below points to the respective stable patch. Fixes: 7a0395f6607a ("x86/bugs: Add a Transient Scheduler Attacks mitigation") Reported-by: Thomas Voegtle Signed-off-by: Borislav Petkov (AMD) Tested-by: Thomas Voegtle Message-ID: <04ea0a8e-edb0-c59e-ce21-5f3d5d167af3@lio96.de> Signed-off-by: Greg Kroah-Hartman --- arch/x86/kernel/cpu/amd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 8a740e92e483e..b42307200e98f 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -376,6 +376,7 @@ static bool amd_check_tsa_microcode(void) p.ext_fam = c->x86 - 0xf; p.model = c->x86_model; + p.ext_model = c->x86_model >> 4; p.stepping = c->x86_stepping; if (cpu_has(c, X86_FEATURE_ZEN3) || -- GitLab From 259f4977409c87a980fa2227b7c76a2fe3fb8c2f Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 14 Jul 2025 16:02:59 +0200 Subject: [PATCH 2098/2211] Linux 6.12.38 Signed-off-by: Greg Kroah-Hartman --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ca3225cbf130a..28c9acdd9b358 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 12 -SUBLEVEL = 37 +SUBLEVEL = 38 EXTRAVERSION = NAME = Baby Opossum Posse -- GitLab From 2e58e85c038fd3323b6433c76799031bd51a7fdb Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Wed, 16 Jul 2025 22:31:19 +0000 Subject: [PATCH 2099/2211] ANDROID: Remove GKI ABI related padding from structures for microdroid One of the cornerstones of GKI is that it preserves a stable ABI between the kernel and vendor modules after the ABI is frozen. This ensures that the kernel can be updated independently of the vendor modules. To do this, space is reserved in certain data structures to account for future changes that may require changes to the size of the structure and break the ABI. Microdroid kernels do not need to make this guarantee, so remove said padding. Bug: 432329937 Signed-off-by: Isaac J. Manjarres (cherry picked from https://android-review.googlesource.com/q/commit:9dd9191daeda4eba6cceaf5329c712b7ba5df221) Merged-In: Iec4afd7c748fe64c8dbd7770a333cbf4c6699f0e Change-Id: Iec4afd7c748fe64c8dbd7770a333cbf4c6699f0e --- arch/arm64/configs/microdroid_defconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index 09b28f4aa912e..f50396c249c28 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -131,6 +131,8 @@ CONFIG_VIRTIO_BALLOON=y CONFIG_STAGING=y CONFIG_HWSPINLOCK=y # CONFIG_IOMMU_SUPPORT is not set +# CONFIG_ANDROID_KABI_RESERVE is not set +# CONFIG_ANDROID_VENDOR_OEM_DATA is not set CONFIG_EXT4_FS=y # CONFIG_EXT4_USE_FOR_EXT2 is not set CONFIG_EXT4_FS_POSIX_ACL=y -- GitLab From 89fbfb9b191c7841091cc14e7c18078e0c40ac89 Mon Sep 17 00:00:00 2001 From: liuyb20 Date: Thu, 17 Jul 2025 18:00:25 +0800 Subject: [PATCH 2100/2211] ANDROID: GKI: Add symbol list for lenovo 42 function symbol(s) added 'int __traceiter_android_vh_cpufreq_online(void*, struct cpufreq_policy*)' 'void blk_freeze_queue_start(struct request_queue*)' 'void blk_mark_disk_dead(struct gendisk*)' 'struct request* blk_mq_alloc_request_hctx(struct request_queue*, blk_opf_t, blk_mq_req_flags_t, unsigned int)' 'void blk_mq_delay_kick_requeue_list(struct request_queue*, unsigned long)' 'void blk_mq_freeze_queue_wait(struct request_queue*)' 'int blk_mq_freeze_queue_wait_timeout(struct request_queue*, unsigned long)' 'void blk_mq_pci_map_queues(struct blk_mq_queue_map*, struct pci_dev*, int)' 'void blk_mq_tagset_wait_completed_request(struct blk_mq_tag_set*)' 'void blk_mq_update_nr_hw_queues(struct blk_mq_tag_set*, int)' 'void blk_sync_queue(struct request_queue*)' 'int blkdev_compat_ptr_ioctl(struct block_device*, blk_mode_t, unsigned int, unsigned long)' 'u64 clockevent_delta2ns(unsigned long, struct clock_event_device*)' 'void clockevents_register_device(struct clock_event_device*)' 'int dev_pm_qos_expose_latency_tolerance(struct device*)' 'void dev_pm_qos_hide_latency_tolerance(struct device*)' 'int dev_pm_qos_update_user_latency_tolerance(struct device*, s32)' 'bool device_remove_file_self(struct device*, const struct device_attribute*)' 'void devm_release_resource(struct device*, struct resource*)' 'void* fwnode_connection_find_match(const struct fwnode_handle*, const char*, void*, devcon_match_fn_t)' 'int fwnode_property_read_u16_array(const struct fwnode_handle*, const char*, u16*, size_t)' 'const char* i2c_freq_mode_string(u32)' 'void irq_domain_associate_many(struct irq_domain*, unsigned int, irq_hw_number_t, int)' 'void mfd_remove_devices_late(struct device*)' 'int mmc_app_cmd(struct mmc_host*, struct mmc_card*)' 'void pcibios_resource_to_bus(struct pci_bus*, struct pci_bus_region*, struct resource*)' 'bool pcie_aspm_enabled(struct pci_dev*)' 'int perf_allow_kernel(struct perf_event_attr*)' 'int pinctrl_register_mappings(const struct pinctrl_map*, unsigned int)' 'void pinctrl_unregister_mappings(const struct pinctrl_map*)' 'int pvclock_gtod_unregister_notifier(struct notifier_block*)' 'unsigned int sdhci_pltfm_clk_get_max_clock(struct sdhci_host*)' 'void serial8250_clear_and_reinit_fifos(struct uart_8250_port*)' 'void serial8250_do_set_divisor(struct uart_port*, unsigned int, unsigned int)' 'void serial8250_do_set_ldisc(struct uart_port*, struct ktermios*)' 'int serial8250_em485_config(struct uart_port*, struct ktermios*, struct serial_rs485*)' 'void serial8250_em485_start_tx(struct uart_8250_port*)' 'void serial8250_em485_stop_tx(struct uart_8250_port*)' 'int serial8250_handle_irq(struct uart_port*, unsigned int)' 'void serial8250_update_uartclk(struct uart_port*, unsigned int)' 'int snd_soc_component_test_bits(struct snd_soc_component*, unsigned int, unsigned int, unsigned int)' 'int uart_read_port_properties(struct uart_port*)' 4 variable symbol(s) added 'struct tracepoint __tracepoint_android_vh_cpufreq_online' 'unsigned int pm_suspend_global_flags' 'const struct dev_pm_ops sdhci_pltfm_pmops' 'struct serial_rs485 serial8250_em485_supported' Bug: 432397870 Change-Id: I8f39f83113468ce3162ea0566b970e790d505350 Signed-off-by: liuyb20 --- BUILD.bazel | 1 + gki/aarch64/abi.stg | 628 +++++++++++ gki/aarch64/symbols/lenovo | 2183 ++++++++++++++++++++++++++++++++++++ 3 files changed, 2812 insertions(+) create mode 100644 gki/aarch64/symbols/lenovo diff --git a/BUILD.bazel b/BUILD.bazel index 1bfb05ea9658e..1ea48116232bc 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -193,6 +193,7 @@ filegroup( "gki/aarch64/symbols/galaxy", "gki/aarch64/symbols/honor", "gki/aarch64/symbols/imx", + "gki/aarch64/symbols/lenovo", "gki/aarch64/symbols/mtk", "gki/aarch64/symbols/mtktv", "gki/aarch64/symbols/oplus", diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 0ecc40865e0aa..b5ee8ab0afd88 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -13983,6 +13983,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x59ddc5eb } +pointer_reference { + id: 0x1ceb489f + kind: POINTER + pointee_type_id: 0x59edc4e1 +} pointer_reference { id: 0x1cee95be kind: POINTER @@ -29103,6 +29108,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0xedb84b9b } +pointer_reference { + id: 0x3206a113 + kind: POINTER + pointee_type_id: 0xe25a62d2 +} pointer_reference { id: 0x320871e3 kind: POINTER @@ -35313,6 +35323,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0xdc6576c2 } +pointer_reference { + id: 0x3d8adbff + kind: POINTER + pointee_type_id: 0xdc6b8961 +} pointer_reference { id: 0x3d8b1920 kind: POINTER @@ -37608,6 +37623,11 @@ typedef { name: "dev_t" referred_type_id: 0xe83041c0 } +typedef { + id: 0xa78168a6 + name: "devcon_match_fn_t" + referred_type_id: 0x1ceb489f +} typedef { id: 0x806e162f name: "device_match_t" @@ -38503,6 +38523,11 @@ typedef { name: "p4d_t" referred_type_id: 0x148546d4 } +typedef { + id: 0x327f0318 + name: "pci_bus_addr_t" + referred_type_id: 0x92233392 +} typedef { id: 0x8ef19fe7 name: "pci_bus_flags_t" @@ -41733,6 +41758,11 @@ qualified { qualifier: CONST qualified_type_id: 0xf865cc2f } +qualified { + id: 0xe25a62d2 + qualifier: CONST + qualified_type_id: 0xf92e3dc3 +} qualified { id: 0xe28bb7e5 qualifier: CONST @@ -105722,6 +105752,12 @@ member { type_id: 0x33b32811 offset: 192 } +member { + id: 0x823d209e + name: "end" + type_id: 0x327f0318 + offset: 64 +} member { id: 0x824ad321 name: "end" @@ -228137,6 +228173,11 @@ member { type_id: 0x33756485 offset: 192 } +member { + id: 0x46294c53 + name: "start" + type_id: 0x327f0318 +} member { id: 0x462b6471 name: "start" @@ -322743,6 +322784,16 @@ struct_union { member_id: 0x0499344c } } +struct_union { + id: 0xdc6b8961 + kind: STRUCT + name: "pci_bus_region" + definition { + bytesize: 16 + member_id: 0x46294c53 + member_id: 0x823d209e + } +} struct_union { id: 0x2278532c kind: STRUCT @@ -373253,6 +373304,12 @@ function { parameter_id: 0x019e2530 parameter_id: 0x07c58d49 } +function { + id: 0x10e35c48 + return_type_id: 0x48b5725f + parameter_id: 0x0258f96e + parameter_id: 0x3b4ce03a +} function { id: 0x10e42ea8 return_type_id: 0x48b5725f @@ -374261,6 +374318,12 @@ function { parameter_id: 0x0beab59b parameter_id: 0x18bd6530 } +function { + id: 0x12051b11 + return_type_id: 0x48b5725f + parameter_id: 0x09427c40 + parameter_id: 0x33756485 +} function { id: 0x1207e43b return_type_id: 0x48b5725f @@ -376561,6 +376624,13 @@ function { parameter_id: 0x1f1ed9b1 parameter_id: 0x92233392 } +function { + id: 0x151c4c85 + return_type_id: 0x48b5725f + parameter_id: 0x17693cee + parameter_id: 0x11e6864c + parameter_id: 0x6720d32f +} function { id: 0x152401b7 return_type_id: 0x33756485 @@ -378796,6 +378866,14 @@ function { parameter_id: 0x1d44326e parameter_id: 0x198099dc } +function { + id: 0x17afca88 + return_type_id: 0x48b5725f + parameter_id: 0x18a2fb63 + parameter_id: 0x4585663f + parameter_id: 0x22b36393 + parameter_id: 0x6720d32f +} function { id: 0x17b07c1e return_type_id: 0x48b5725f @@ -379501,6 +379579,13 @@ function { parameter_id: 0x92233392 parameter_id: 0x92233392 } +function { + id: 0x18a2c28b + return_type_id: 0x48b5725f + parameter_id: 0x2309ad3e + parameter_id: 0x3d8adbff + parameter_id: 0x3b4ce03a +} function { id: 0x18a3b8d2 return_type_id: 0x48b5725f @@ -380322,6 +380407,12 @@ function { return_type_id: 0x48b5725f parameter_id: 0x2aa0b9bb } +function { + id: 0x1a34ef81 + return_type_id: 0x48b5725f + parameter_id: 0x2cc0f57b + parameter_id: 0x6720d32f +} function { id: 0x1a3b16dd return_type_id: 0x48b5725f @@ -381633,6 +381724,11 @@ function { parameter_id: 0x315b7e01 parameter_id: 0x358ff5b7 } +function { + id: 0x1c19f9d7 + return_type_id: 0x48b5725f + parameter_id: 0x3206a113 +} function { id: 0x1c1a4deb return_type_id: 0x48b5725f @@ -389273,6 +389369,21 @@ function { parameter_id: 0x11c404ba parameter_id: 0x11c404ba } +function { + id: 0x59edc4e1 + return_type_id: 0x18bd6530 + parameter_id: 0x3e146274 + parameter_id: 0x3e10b518 + parameter_id: 0x18bd6530 +} +function { + id: 0x59ef5ae4 + return_type_id: 0x18bd6530 + parameter_id: 0x3e146274 + parameter_id: 0x3e10b518 + parameter_id: 0x18bd6530 + parameter_id: 0xa78168a6 +} function { id: 0x59f18b0b return_type_id: 0x1d5bae2a @@ -389410,6 +389521,12 @@ function { return_type_id: 0x391f15ea parameter_id: 0x33a9d455 } +function { + id: 0x5b4a4767 + return_type_id: 0x92233392 + parameter_id: 0x33756485 + parameter_id: 0x1333434c +} function { id: 0x5b4eac6a return_type_id: 0x18bd6530 @@ -393702,6 +393819,12 @@ function { parameter_id: 0x3e10b518 parameter_id: 0xa52a0930 } +function { + id: 0x90175ef3 + return_type_id: 0x6720d32f + parameter_id: 0x3206a113 + parameter_id: 0x4585663f +} function { id: 0x9017f3f4 return_type_id: 0x6720d32f @@ -398627,6 +398750,14 @@ function { parameter_id: 0x3c01aef6 parameter_id: 0x1d63cfed } +function { + id: 0x92f5d966 + return_type_id: 0x6720d32f + parameter_id: 0x3e146274 + parameter_id: 0x3e10b518 + parameter_id: 0x2ec35650 + parameter_id: 0xf435685e +} function { id: 0x92f5ef8e return_type_id: 0x6720d32f @@ -400608,6 +400739,11 @@ function { parameter_id: 0x25ffeea5 parameter_id: 0x19671b46 } +function { + id: 0x949bd78e + return_type_id: 0x6720d32f + parameter_id: 0x246cd286 +} function { id: 0x949fa126 return_type_id: 0x6720d32f @@ -414450,6 +414586,12 @@ function { parameter_id: 0x0d107c2b parameter_id: 0xc9082b19 } +function { + id: 0x9cbb13a8 + return_type_id: 0x6720d32f + parameter_id: 0x00b7947f + parameter_id: 0x4585663f +} function { id: 0x9cbbbdfe return_type_id: 0x6720d32f @@ -417618,6 +417760,12 @@ function { parameter_id: 0x452ab998 parameter_id: 0x6720d32f } +function { + id: 0x9e46a756 + return_type_id: 0x6720d32f + parameter_id: 0x0258f96e + parameter_id: 0xd41e888f +} function { id: 0x9e46dca9 return_type_id: 0x6720d32f @@ -418839,6 +418987,12 @@ function { parameter_id: 0x09a83f1c parameter_id: 0x3df7e337 } +function { + id: 0x9f1da9ad + return_type_id: 0x6720d32f + parameter_id: 0x09427c40 + parameter_id: 0x33756485 +} function { id: 0x9f1e1311 return_type_id: 0x6720d32f @@ -423378,6 +423532,14 @@ function { return_type_id: 0x3ee7bddd parameter_id: 0x05d6a478 } +function { + id: 0xdde86a2e + return_type_id: 0x1e820193 + parameter_id: 0x09427c40 + parameter_id: 0x7b64642a + parameter_id: 0x499ec4e1 + parameter_id: 0x4585663f +} function { id: 0xdde97c3b return_type_id: 0x1e820193 @@ -426033,6 +426195,12 @@ function { parameter_id: 0x03942c7a parameter_id: 0x3fd547b8 } +function { + id: 0xfec047b0 + return_type_id: 0x6d7f5ff6 + parameter_id: 0x0258f96e + parameter_id: 0x3c88bbfa +} function { id: 0xfec3d248 return_type_id: 0x6d7f5ff6 @@ -432455,6 +432623,15 @@ elf_symbol { type_id: 0x9bae28ba full_name: "__traceiter_android_vh_cpufreq_fast_switch" } +elf_symbol { + id: 0x164177e9 + name: "__traceiter_android_vh_cpufreq_online" + is_defined: true + symbol_type: FUNCTION + crc: 0x1cc6a50d + type_id: 0x9ba9c2f7 + full_name: "__traceiter_android_vh_cpufreq_online" +} elf_symbol { id: 0x5c9fa956 name: "__traceiter_android_vh_cpufreq_resolve_freq" @@ -438719,6 +438896,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_cpufreq_fast_switch" } +elf_symbol { + id: 0x1d19a937 + name: "__tracepoint_android_vh_cpufreq_online" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_cpufreq_online" +} elf_symbol { id: 0x463f3244 name: "__tracepoint_android_vh_cpufreq_resolve_freq" @@ -445053,6 +445239,15 @@ elf_symbol { type_id: 0x1eabf44d full_name: "blk_finish_plug" } +elf_symbol { + id: 0x0057f771 + name: "blk_freeze_queue_start" + is_defined: true + symbol_type: FUNCTION + crc: 0xa7fad0bd + type_id: 0x12c8ce83 + full_name: "blk_freeze_queue_start" +} elf_symbol { id: 0x230262f2 name: "blk_get_queue" @@ -445062,6 +445257,15 @@ elf_symbol { type_id: 0xfcf4c414 full_name: "blk_get_queue" } +elf_symbol { + id: 0xdfa8144b + name: "blk_mark_disk_dead" + is_defined: true + symbol_type: FUNCTION + crc: 0x75cb3c66 + type_id: 0x18d41dd9 + full_name: "blk_mark_disk_dead" +} elf_symbol { id: 0x23e83656 name: "blk_mq_alloc_queue" @@ -445080,6 +445284,15 @@ elf_symbol { type_id: 0xdde97c3b full_name: "blk_mq_alloc_request" } +elf_symbol { + id: 0x62c35f4e + name: "blk_mq_alloc_request_hctx" + is_defined: true + symbol_type: FUNCTION + crc: 0x535e5436 + type_id: 0xdde86a2e + full_name: "blk_mq_alloc_request_hctx" +} elf_symbol { id: 0x0d1fc920 name: "blk_mq_alloc_sq_tag_set" @@ -445125,6 +445338,15 @@ elf_symbol { type_id: 0x9c7b6f16 full_name: "blk_mq_debugfs_rq_show" } +elf_symbol { + id: 0xaa37044b + name: "blk_mq_delay_kick_requeue_list" + is_defined: true + symbol_type: FUNCTION + crc: 0xb801b1af + type_id: 0x12051b11 + full_name: "blk_mq_delay_kick_requeue_list" +} elf_symbol { id: 0x6458d26a name: "blk_mq_destroy_queue" @@ -445179,6 +445401,24 @@ elf_symbol { type_id: 0x12c8ce83 full_name: "blk_mq_freeze_queue" } +elf_symbol { + id: 0xc6734527 + name: "blk_mq_freeze_queue_wait" + is_defined: true + symbol_type: FUNCTION + crc: 0xa7fad0bd + type_id: 0x12c8ce83 + full_name: "blk_mq_freeze_queue_wait" +} +elf_symbol { + id: 0x15018e34 + name: "blk_mq_freeze_queue_wait_timeout" + is_defined: true + symbol_type: FUNCTION + crc: 0xba90c7a4 + type_id: 0x9f1da9ad + full_name: "blk_mq_freeze_queue_wait_timeout" +} elf_symbol { id: 0x16569be2 name: "blk_mq_map_queues" @@ -445188,6 +445428,15 @@ elf_symbol { type_id: 0x15421ea8 full_name: "blk_mq_map_queues" } +elf_symbol { + id: 0x43a3424f + name: "blk_mq_pci_map_queues" + is_defined: true + symbol_type: FUNCTION + crc: 0x41ef163c + type_id: 0x151c4c85 + full_name: "blk_mq_pci_map_queues" +} elf_symbol { id: 0x1f81c0c0 name: "blk_mq_quiesce_queue" @@ -445314,6 +445563,15 @@ elf_symbol { type_id: 0x1b939af9 full_name: "blk_mq_tagset_busy_iter" } +elf_symbol { + id: 0x9c9435eb + name: "blk_mq_tagset_wait_completed_request" + is_defined: true + symbol_type: FUNCTION + crc: 0x2e9a4cd4 + type_id: 0x1ba86ccd + full_name: "blk_mq_tagset_wait_completed_request" +} elf_symbol { id: 0x95bdba0c name: "blk_mq_unfreeze_queue" @@ -445350,6 +445608,15 @@ elf_symbol { type_id: 0x1ba86ccd full_name: "blk_mq_unquiesce_tagset" } +elf_symbol { + id: 0x5e358f2a + name: "blk_mq_update_nr_hw_queues" + is_defined: true + symbol_type: FUNCTION + crc: 0x34951374 + type_id: 0x1a34ef81 + full_name: "blk_mq_update_nr_hw_queues" +} elf_symbol { id: 0xa36916c0 name: "blk_mq_virtio_map_queues" @@ -445494,6 +445761,15 @@ elf_symbol { type_id: 0x837ae337 full_name: "blk_status_to_errno" } +elf_symbol { + id: 0xbfbff337 + name: "blk_sync_queue" + is_defined: true + symbol_type: FUNCTION + crc: 0x6eb41a37 + type_id: 0x12c8ce83 + full_name: "blk_sync_queue" +} elf_symbol { id: 0xf40ec9b3 name: "blk_update_request" @@ -445521,6 +445797,15 @@ elf_symbol { type_id: 0x130705ac full_name: "blkcg_policy_unregister" } +elf_symbol { + id: 0x72078827 + name: "blkdev_compat_ptr_ioctl" + is_defined: true + symbol_type: FUNCTION + crc: 0x35081b5e + type_id: 0x9d7e1c82 + full_name: "blkdev_compat_ptr_ioctl" +} elf_symbol { id: 0x4d722bb5 name: "blkdev_issue_discard" @@ -447920,6 +448205,15 @@ elf_symbol { type_id: 0x118f363d full_name: "clk_unregister_gate" } +elf_symbol { + id: 0xa72e6674 + name: "clockevent_delta2ns" + is_defined: true + symbol_type: FUNCTION + crc: 0x32884404 + type_id: 0x5b4a4767 + full_name: "clockevent_delta2ns" +} elf_symbol { id: 0x430bfeda name: "clockevents_config_and_register" @@ -447929,6 +448223,15 @@ elf_symbol { type_id: 0x177cb160 full_name: "clockevents_config_and_register" } +elf_symbol { + id: 0xf06c3226 + name: "clockevents_register_device" + is_defined: true + symbol_type: FUNCTION + crc: 0x89530dea + type_id: 0x14548140 + full_name: "clockevents_register_device" +} elf_symbol { id: 0x0522e13b name: "clocks_calc_mult_shift" @@ -451836,6 +452139,24 @@ elf_symbol { type_id: 0x9d40265c full_name: "dev_pm_qos_add_request" } +elf_symbol { + id: 0xf9527ac4 + name: "dev_pm_qos_expose_latency_tolerance" + is_defined: true + symbol_type: FUNCTION + crc: 0x23247866 + type_id: 0x9d16dd74 + full_name: "dev_pm_qos_expose_latency_tolerance" +} +elf_symbol { + id: 0xa7424f84 + name: "dev_pm_qos_hide_latency_tolerance" + is_defined: true + symbol_type: FUNCTION + crc: 0xe6b9d97d + type_id: 0x100e6fc8 + full_name: "dev_pm_qos_hide_latency_tolerance" +} elf_symbol { id: 0x0343af6f name: "dev_pm_qos_read_value" @@ -451872,6 +452193,15 @@ elf_symbol { type_id: 0x9b50173a full_name: "dev_pm_qos_update_request" } +elf_symbol { + id: 0xdac3ff34 + name: "dev_pm_qos_update_user_latency_tolerance" + is_defined: true + symbol_type: FUNCTION + crc: 0xb74c37ac + type_id: 0x9e46a756 + full_name: "dev_pm_qos_update_user_latency_tolerance" +} elf_symbol { id: 0xcbc295b7 name: "dev_pm_set_dedicated_wake_irq_reverse" @@ -452655,6 +452985,15 @@ elf_symbol { type_id: 0x10fc4d27 full_name: "device_remove_file" } +elf_symbol { + id: 0x22e51db4 + name: "device_remove_file_self" + is_defined: true + symbol_type: FUNCTION + crc: 0xe42afdb1 + type_id: 0xfec047b0 + full_name: "device_remove_file_self" +} elf_symbol { id: 0x5a62c5df name: "device_remove_groups" @@ -454269,6 +454608,15 @@ elf_symbol { type_id: 0x109d0c8e full_name: "devm_regulator_unregister_notifier" } +elf_symbol { + id: 0x0662c08a + name: "devm_release_resource" + is_defined: true + symbol_type: FUNCTION + crc: 0x8da80ed5 + type_id: 0x10e35c48 + full_name: "devm_release_resource" +} elf_symbol { id: 0xd32940e1 name: "devm_remove_action" @@ -463157,6 +463505,15 @@ elf_symbol { type_id: 0x11bc7f41 full_name: "fw_devlink_purge_absent_suppliers" } +elf_symbol { + id: 0x5df140db + name: "fwnode_connection_find_match" + is_defined: true + symbol_type: FUNCTION + crc: 0x91b52c8d + type_id: 0x59ef5ae4 + full_name: "fwnode_connection_find_match" +} elf_symbol { id: 0xc35e482b name: "fwnode_create_software_node" @@ -463364,6 +463721,15 @@ elf_symbol { type_id: 0x92fcfc63 full_name: "fwnode_property_read_string" } +elf_symbol { + id: 0xd47b06e5 + name: "fwnode_property_read_u16_array" + is_defined: true + symbol_type: FUNCTION + crc: 0x94704f7a + type_id: 0x92f5d966 + full_name: "fwnode_property_read_u16_array" +} elf_symbol { id: 0x806b0d54 name: "fwnode_property_read_u32_array" @@ -466752,6 +467118,15 @@ elf_symbol { type_id: 0x9b188ead full_name: "i2c_for_each_dev" } +elf_symbol { + id: 0xec176fbf + name: "i2c_freq_mode_string" + is_defined: true + symbol_type: FUNCTION + crc: 0xea8d05e4 + type_id: 0xa0061d65 + full_name: "i2c_freq_mode_string" +} elf_symbol { id: 0x830ea684 name: "i2c_generic_scl_recovery" @@ -470313,6 +470688,15 @@ elf_symbol { type_id: 0x9aaf4bc3 full_name: "irq_domain_alloc_irqs_parent" } +elf_symbol { + id: 0x857cda02 + name: "irq_domain_associate_many" + is_defined: true + symbol_type: FUNCTION + crc: 0xb6f4426d + type_id: 0x17afca88 + full_name: "irq_domain_associate_many" +} elf_symbol { id: 0x135db1d2 name: "irq_domain_create_hierarchy" @@ -474721,6 +475105,15 @@ elf_symbol { type_id: 0x100e6fc8 full_name: "mfd_remove_devices" } +elf_symbol { + id: 0x1c9ded63 + name: "mfd_remove_devices_late" + is_defined: true + symbol_type: FUNCTION + crc: 0x40c78540 + type_id: 0x100e6fc8 + full_name: "mfd_remove_devices_late" +} elf_symbol { id: 0x99c9c9c0 name: "migrate_folio" @@ -475190,6 +475583,15 @@ elf_symbol { type_id: 0x83a3929f full_name: "mmc_alloc_host" } +elf_symbol { + id: 0x6d94d2a1 + name: "mmc_app_cmd" + is_defined: true + symbol_type: FUNCTION + crc: 0x18111887 + type_id: 0x900f25b4 + full_name: "mmc_app_cmd" +} elf_symbol { id: 0xd2482cd8 name: "mmc_can_gpio_cd" @@ -481003,6 +481405,24 @@ elf_symbol { type_id: 0x92ea4841 full_name: "pci_write_config_word" } +elf_symbol { + id: 0xfda7b705 + name: "pcibios_resource_to_bus" + is_defined: true + symbol_type: FUNCTION + crc: 0x6bf4def2 + type_id: 0x18a2c28b + full_name: "pcibios_resource_to_bus" +} +elf_symbol { + id: 0xefd6d09b + name: "pcie_aspm_enabled" + is_defined: true + symbol_type: FUNCTION + crc: 0x586b0ab8 + type_id: 0xfaddfa97 + full_name: "pcie_aspm_enabled" +} elf_symbol { id: 0xb0cf8b54 name: "pcie_capability_clear_and_set_word_locked" @@ -481237,6 +481657,15 @@ elf_symbol { type_id: 0x14f50ddf full_name: "percpu_up_write" } +elf_symbol { + id: 0xd2981ed5 + name: "perf_allow_kernel" + is_defined: true + symbol_type: FUNCTION + crc: 0x04b3a3aa + type_id: 0x949bd78e + full_name: "perf_allow_kernel" +} elf_symbol { id: 0xf9e83d36 name: "perf_aux_output_begin" @@ -483019,6 +483448,15 @@ elf_symbol { type_id: 0x929b7b33 full_name: "pinctrl_register_and_init" } +elf_symbol { + id: 0xa425fc80 + name: "pinctrl_register_mappings" + is_defined: true + symbol_type: FUNCTION + crc: 0x8defe209 + type_id: 0x90175ef3 + full_name: "pinctrl_register_mappings" +} elf_symbol { id: 0xba770aa5 name: "pinctrl_remove_gpio_range" @@ -483055,6 +483493,15 @@ elf_symbol { type_id: 0x164d3baf full_name: "pinctrl_unregister" } +elf_symbol { + id: 0xcb959a8a + name: "pinctrl_unregister_mappings" + is_defined: true + symbol_type: FUNCTION + crc: 0x6e4f7743 + type_id: 0x1c19f9d7 + full_name: "pinctrl_unregister_mappings" +} elf_symbol { id: 0x8370f127 name: "pinctrl_utils_add_map_configs" @@ -483721,6 +484168,15 @@ elf_symbol { type_id: 0xfea45b04 full_name: "pm_suspend_default_s2idle" } +elf_symbol { + id: 0x7ee02b97 + name: "pm_suspend_global_flags" + is_defined: true + symbol_type: OBJECT + crc: 0xf296206e + type_id: 0x4585663f + full_name: "pm_suspend_global_flags" +} elf_symbol { id: 0x2e13b831 name: "pm_suspend_target_state" @@ -484937,6 +485393,15 @@ elf_symbol { type_id: 0x9b6d4a33 full_name: "pvclock_gtod_register_notifier" } +elf_symbol { + id: 0x6d6f722d + name: "pvclock_gtod_unregister_notifier" + is_defined: true + symbol_type: FUNCTION + crc: 0x0a227d4d + type_id: 0x9b6d4a33 + full_name: "pvclock_gtod_unregister_notifier" +} elf_symbol { id: 0x5ae13553 name: "pwm_adjust_config" @@ -489723,6 +490188,15 @@ elf_symbol { type_id: 0x1f55a7e6 full_name: "sdhci_get_property" } +elf_symbol { + id: 0x15f1b772 + name: "sdhci_pltfm_clk_get_max_clock" + is_defined: true + symbol_type: FUNCTION + crc: 0x4d1aaa9b + type_id: 0xc0843ed1 + full_name: "sdhci_pltfm_clk_get_max_clock" +} elf_symbol { id: 0x38940a34 name: "sdhci_pltfm_free" @@ -489741,6 +490215,15 @@ elf_symbol { type_id: 0xb019e307 full_name: "sdhci_pltfm_init" } +elf_symbol { + id: 0x9f7a91d4 + name: "sdhci_pltfm_pmops" + is_defined: true + symbol_type: OBJECT + crc: 0x707f040d + type_id: 0xc44f560e + full_name: "sdhci_pltfm_pmops" +} elf_symbol { id: 0xb2ca9495 name: "sdhci_pltfm_remove" @@ -490578,6 +491061,15 @@ elf_symbol { type_id: 0x1e70c9ff full_name: "serdev_device_write_flush" } +elf_symbol { + id: 0x0746da0a + name: "serial8250_clear_and_reinit_fifos" + is_defined: true + symbol_type: FUNCTION + crc: 0xb2071017 + type_id: 0x17abf19b + full_name: "serial8250_clear_and_reinit_fifos" +} elf_symbol { id: 0x98b882af name: "serial8250_do_pm" @@ -490587,6 +491079,24 @@ elf_symbol { type_id: 0x11b2c04d full_name: "serial8250_do_pm" } +elf_symbol { + id: 0x45ffec2b + name: "serial8250_do_set_divisor" + is_defined: true + symbol_type: FUNCTION + crc: 0x71c68571 + type_id: 0x11b2c04d + full_name: "serial8250_do_set_divisor" +} +elf_symbol { + id: 0x5b9376b0 + name: "serial8250_do_set_ldisc" + is_defined: true + symbol_type: FUNCTION + crc: 0x0c9d28d8 + type_id: 0x1043ff6b + full_name: "serial8250_do_set_ldisc" +} elf_symbol { id: 0x2bb7ad6a name: "serial8250_do_set_termios" @@ -490614,6 +491124,42 @@ elf_symbol { type_id: 0x9dad0630 full_name: "serial8250_do_startup" } +elf_symbol { + id: 0xec4fe037 + name: "serial8250_em485_config" + is_defined: true + symbol_type: FUNCTION + crc: 0x3701785b + type_id: 0x9d5ada98 + full_name: "serial8250_em485_config" +} +elf_symbol { + id: 0xb90d3326 + name: "serial8250_em485_start_tx" + is_defined: true + symbol_type: FUNCTION + crc: 0x43027e86 + type_id: 0x17abf19b + full_name: "serial8250_em485_start_tx" +} +elf_symbol { + id: 0xb09b6acb + name: "serial8250_em485_stop_tx" + is_defined: true + symbol_type: FUNCTION + crc: 0xb2071017 + type_id: 0x17abf19b + full_name: "serial8250_em485_stop_tx" +} +elf_symbol { + id: 0xcc28e994 + name: "serial8250_em485_supported" + is_defined: true + symbol_type: OBJECT + crc: 0x46bd3437 + type_id: 0x33341885 + full_name: "serial8250_em485_supported" +} elf_symbol { id: 0x3e462ca5 name: "serial8250_get_port" @@ -490623,6 +491169,15 @@ elf_symbol { type_id: 0x56706cd5 full_name: "serial8250_get_port" } +elf_symbol { + id: 0x53281d0f + name: "serial8250_handle_irq" + is_defined: true + symbol_type: FUNCTION + crc: 0x168cee97 + type_id: 0x9cbb13a8 + full_name: "serial8250_handle_irq" +} elf_symbol { id: 0x358696a1 name: "serial8250_modem_status" @@ -490713,6 +491268,15 @@ elf_symbol { type_id: 0x09506558 full_name: "serial8250_unregister_port" } +elf_symbol { + id: 0xfa4a7632 + name: "serial8250_update_uartclk" + is_defined: true + symbol_type: FUNCTION + crc: 0x68320fed + type_id: 0x11a3a114 + full_name: "serial8250_update_uartclk" +} elf_symbol { id: 0x4e412a59 name: "serio_close" @@ -493459,6 +494023,15 @@ elf_symbol { type_id: 0x985d46f1 full_name: "snd_soc_component_set_sysclk" } +elf_symbol { + id: 0xee601558 + name: "snd_soc_component_test_bits" + is_defined: true + symbol_type: FUNCTION + crc: 0xa30a1e82 + type_id: 0x98df6080 + full_name: "snd_soc_component_test_bits" +} elf_symbol { id: 0x690f235d name: "snd_soc_component_update_bits" @@ -499672,6 +500245,15 @@ elf_symbol { type_id: 0x1f558355 full_name: "uart_parse_options" } +elf_symbol { + id: 0xb56e6dcc + name: "uart_read_port_properties" + is_defined: true + symbol_type: FUNCTION + crc: 0xf3eccf34 + type_id: 0x9dad0630 + full_name: "uart_read_port_properties" +} elf_symbol { id: 0x321abf21 name: "uart_register_driver" @@ -508775,6 +509357,7 @@ interface { symbol_id: 0xfd04e27a symbol_id: 0xa124d3e0 symbol_id: 0x9c5d1bdd + symbol_id: 0x164177e9 symbol_id: 0x5c9fa956 symbol_id: 0xca50936b symbol_id: 0x431c5bf5 @@ -509471,6 +510054,7 @@ interface { symbol_id: 0x4ade2774 symbol_id: 0x704b9aae symbol_id: 0x4a3c01db + symbol_id: 0x1d19a937 symbol_id: 0x463f3244 symbol_id: 0x750e1421 symbol_id: 0x66a766d7 @@ -510175,21 +510759,28 @@ interface { symbol_id: 0xd76a9123 symbol_id: 0x9eda4f26 symbol_id: 0xc0d4821a + symbol_id: 0x0057f771 symbol_id: 0x230262f2 + symbol_id: 0xdfa8144b symbol_id: 0x23e83656 symbol_id: 0xaea1564a + symbol_id: 0x62c35f4e symbol_id: 0x0d1fc920 symbol_id: 0xd34c6466 symbol_id: 0x51c471d6 symbol_id: 0x68305665 symbol_id: 0x0467bac1 + symbol_id: 0xaa37044b symbol_id: 0x6458d26a symbol_id: 0x2e876bee symbol_id: 0x1996f188 symbol_id: 0xbc2fc882 symbol_id: 0x70bd48bd symbol_id: 0x5e553962 + symbol_id: 0xc6734527 + symbol_id: 0x15018e34 symbol_id: 0x16569be2 + symbol_id: 0x43a3424f symbol_id: 0x1f81c0c0 symbol_id: 0x9d72c022 symbol_id: 0xf017d544 @@ -510204,10 +510795,12 @@ interface { symbol_id: 0x1162870c symbol_id: 0x310e729f symbol_id: 0x37d3a115 + symbol_id: 0x9c9435eb symbol_id: 0x95bdba0c symbol_id: 0xd2c9c20b symbol_id: 0x86bec7f5 symbol_id: 0x962d53ec + symbol_id: 0x5e358f2a symbol_id: 0xa36916c0 symbol_id: 0xd2d09a22 symbol_id: 0x76783663 @@ -510224,9 +510817,11 @@ interface { symbol_id: 0x163b934e symbol_id: 0xb78983c5 symbol_id: 0xe6192860 + symbol_id: 0xbfbff337 symbol_id: 0xf40ec9b3 symbol_id: 0xa304d3f1 symbol_id: 0xcd31ef47 + symbol_id: 0x72078827 symbol_id: 0x4d722bb5 symbol_id: 0x2a322266 symbol_id: 0x8c705d8e @@ -510494,7 +511089,9 @@ interface { symbol_id: 0x68c84c24 symbol_id: 0x40da6f1f symbol_id: 0x9d70bb80 + symbol_id: 0xa72e6674 symbol_id: 0x430bfeda + symbol_id: 0xf06c3226 symbol_id: 0x0522e13b symbol_id: 0x961eb280 symbol_id: 0xfa04a306 @@ -510929,10 +511526,13 @@ interface { symbol_id: 0xe3ab91c3 symbol_id: 0x72797495 symbol_id: 0x8b918cf2 + symbol_id: 0xf9527ac4 + symbol_id: 0xa7424f84 symbol_id: 0x0343af6f symbol_id: 0x92e87d67 symbol_id: 0x9134577e symbol_id: 0xb6e3e4d8 + symbol_id: 0xdac3ff34 symbol_id: 0xcbc295b7 symbol_id: 0x52122b68 symbol_id: 0xd084c59b @@ -511020,6 +511620,7 @@ interface { symbol_id: 0x589e892d symbol_id: 0x25bf4477 symbol_id: 0x5b8e8574 + symbol_id: 0x22e51db4 symbol_id: 0x5a62c5df symbol_id: 0xde65677d symbol_id: 0x20c43211 @@ -511199,6 +511800,7 @@ interface { symbol_id: 0x6b6744b7 symbol_id: 0x92b1bbf5 symbol_id: 0xfc0bc82d + symbol_id: 0x0662c08a symbol_id: 0xd32940e1 symbol_id: 0x299f6192 symbol_id: 0xb7d7707e @@ -512184,6 +512786,7 @@ interface { symbol_id: 0x613adcb1 symbol_id: 0x370e6f08 symbol_id: 0x16ccff22 + symbol_id: 0x5df140db symbol_id: 0xc35e482b symbol_id: 0x53816b02 symbol_id: 0xc9ddb79e @@ -512207,6 +512810,7 @@ interface { symbol_id: 0xe48f6d7e symbol_id: 0xff19753b symbol_id: 0x2f1a3bf8 + symbol_id: 0xd47b06e5 symbol_id: 0x806b0d54 symbol_id: 0x11f02a55 symbol_id: 0x9f69bdd5 @@ -512583,6 +513187,7 @@ interface { symbol_id: 0x67625ec0 symbol_id: 0x9f91dd00 symbol_id: 0x6d03f920 + symbol_id: 0xec176fbf symbol_id: 0x830ea684 symbol_id: 0x7b53e605 symbol_id: 0xe8aefbc9 @@ -512978,6 +513583,7 @@ interface { symbol_id: 0x22a9a9c1 symbol_id: 0x9f4df92b symbol_id: 0x5e13f2f1 + symbol_id: 0x857cda02 symbol_id: 0x135db1d2 symbol_id: 0xe67fe9f7 symbol_id: 0xba41ecd4 @@ -513468,6 +514074,7 @@ interface { symbol_id: 0x266bd73a symbol_id: 0x78495fd8 symbol_id: 0xa208d2dc + symbol_id: 0x1c9ded63 symbol_id: 0x99c9c9c0 symbol_id: 0x89c6398f symbol_id: 0xbad16ab3 @@ -513520,6 +514127,7 @@ interface { symbol_id: 0x5b9fb8b8 symbol_id: 0xd328c906 symbol_id: 0x9a282ce3 + symbol_id: 0x6d94d2a1 symbol_id: 0xd2482cd8 symbol_id: 0x84e8d074 symbol_id: 0x3c9f12f3 @@ -514165,6 +514773,8 @@ interface { symbol_id: 0x35548641 symbol_id: 0x6d6403f6 symbol_id: 0x52200b18 + symbol_id: 0xfda7b705 + symbol_id: 0xefd6d09b symbol_id: 0xb0cf8b54 symbol_id: 0x5092d9d9 symbol_id: 0xf1513a2c @@ -514191,6 +514801,7 @@ interface { symbol_id: 0xae849ea8 symbol_id: 0x9370fc1e symbol_id: 0xe4bc7703 + symbol_id: 0xd2981ed5 symbol_id: 0xf9e83d36 symbol_id: 0x80bebca0 symbol_id: 0xe207c73b @@ -514389,10 +515000,12 @@ interface { symbol_id: 0x689f5b8d symbol_id: 0x287a4dba symbol_id: 0xb2ceea74 + symbol_id: 0xa425fc80 symbol_id: 0xba770aa5 symbol_id: 0x7c38f5dc symbol_id: 0x0c39a57f symbol_id: 0x6c300812 + symbol_id: 0xcb959a8a symbol_id: 0x8370f127 symbol_id: 0xe59b51ac symbol_id: 0x82feb89e @@ -514467,6 +515080,7 @@ interface { symbol_id: 0x59caaeac symbol_id: 0xb6d3c009 symbol_id: 0x64f92138 + symbol_id: 0x7ee02b97 symbol_id: 0x2e13b831 symbol_id: 0x57ba6430 symbol_id: 0x131272a2 @@ -514602,6 +515216,7 @@ interface { symbol_id: 0xde695e5a symbol_id: 0x4e730977 symbol_id: 0x8dafa617 + symbol_id: 0x6d6f722d symbol_id: 0x5ae13553 symbol_id: 0x5fbe7443 symbol_id: 0xcd51319b @@ -515133,8 +515748,10 @@ interface { symbol_id: 0x5ab300fb symbol_id: 0x33d40ef0 symbol_id: 0xeb6692c0 + symbol_id: 0x15f1b772 symbol_id: 0x38940a34 symbol_id: 0x322ca1cc + symbol_id: 0x9f7a91d4 symbol_id: 0xb2ca9495 symbol_id: 0x33cb4e8f symbol_id: 0x558963b2 @@ -515228,11 +515845,19 @@ interface { symbol_id: 0x3c71822d symbol_id: 0x6e10178a symbol_id: 0x5d6a93ff + symbol_id: 0x0746da0a symbol_id: 0x98b882af + symbol_id: 0x45ffec2b + symbol_id: 0x5b9376b0 symbol_id: 0x2bb7ad6a symbol_id: 0x4bb58367 symbol_id: 0x63762e51 + symbol_id: 0xec4fe037 + symbol_id: 0xb90d3326 + symbol_id: 0xb09b6acb + symbol_id: 0xcc28e994 symbol_id: 0x3e462ca5 + symbol_id: 0x53281d0f symbol_id: 0x358696a1 symbol_id: 0x970aca32 symbol_id: 0x7e56f1cb @@ -515243,6 +515868,7 @@ interface { symbol_id: 0x89ed643c symbol_id: 0xb00e1c68 symbol_id: 0x620f0859 + symbol_id: 0xfa4a7632 symbol_id: 0x4e412a59 symbol_id: 0xaf2bd97c symbol_id: 0x5b1dd2cc @@ -515548,6 +516174,7 @@ interface { symbol_id: 0x047e7c15 symbol_id: 0x3fb7a184 symbol_id: 0xd1f293b0 + symbol_id: 0xee601558 symbol_id: 0x690f235d symbol_id: 0xe278d2b9 symbol_id: 0x84e7b6d6 @@ -516239,6 +516866,7 @@ interface { symbol_id: 0x3714b6e5 symbol_id: 0x637e9bac symbol_id: 0xffeb078f + symbol_id: 0xb56e6dcc symbol_id: 0x321abf21 symbol_id: 0x92b41cef symbol_id: 0x7d9e83f8 diff --git a/gki/aarch64/symbols/lenovo b/gki/aarch64/symbols/lenovo new file mode 100644 index 0000000000000..07c2eb002679d --- /dev/null +++ b/gki/aarch64/symbols/lenovo @@ -0,0 +1,2183 @@ +[abi_symbol_list] + add_timer + add_uevent_var + alarm_cancel + alarm_init + alarm_start_relative + alloc_chrdev_region + __alloc_skb + alloc_workqueue + alt_cb_patch_nops + android_rvh_probe_register + __arch_copy_from_user + __arch_copy_to_user + arch_timer_read_counter + arm64_use_ng_mappings + __arm_smccc_smc + atomic_notifier_chain_register + atomic_notifier_chain_unregister + bcmp + __bitmap_clear + bitmap_find_next_zero_area_off + bitmap_free + bitmap_from_arr32 + bitmap_parselist + bitmap_print_to_pagebuf + __bitmap_set + bitmap_zalloc + blocking_notifier_call_chain + bpf_trace_run1 + bpf_trace_run2 + bpf_trace_run3 + bpf_trace_run4 + bpf_trace_run5 + bpf_trace_run6 + bpf_trace_run7 + bpf_trace_run8 + bus_find_device + bus_for_each_dev + bus_register + bus_unregister + cancel_delayed_work + cancel_delayed_work_sync + cancel_work_sync + capable + cdev_add + cdev_del + cdev_init + __check_object_size + class_create + class_create_file_ns + class_destroy + class_find_device + class_register + class_unregister + clk_disable + clk_enable + __clk_get_name + clk_get_parent + clk_get_rate + clk_hw_register + clk_hw_unregister + __clk_is_enabled + clk_notifier_register + clk_notifier_unregister + clk_prepare + clk_put + clk_round_rate + clk_set_parent + clk_set_rate + clk_unprepare + cma_alloc + cma_get_name + cma_release + complete + complete_all + completion_done + component_add + component_del + __const_udelay + consume_skb + __copy_overflow + cpu_bit_bitmap + cpufreq_cpu_get_raw + __cpuhp_remove_state + __cpuhp_setup_state + __cpuhp_state_add_instance + __cpuhp_state_remove_instance + __cpu_online_mask + cpu_pm_register_notifier + cpu_pm_unregister_notifier + __cpu_possible_mask + __cpu_present_mask + cpu_topology + crc32_le + csum_partial + _ctype + debugfs_create_bool + debugfs_create_dir + debugfs_create_file + debugfs_create_regset32 + debugfs_create_u32 + debugfs_create_x32 + debugfs_remove + default_llseek + delayed_work_timer_fn + destroy_workqueue + dev_addr_mod + dev_close + _dev_crit + dev_driver_string + _dev_emerg + _dev_err + dev_err_probe + devfreq_add_governor + devfreq_cooling_unregister + devfreq_recommended_opp + devfreq_remove_governor + __dev_fwnode + device_add + device_add_groups + device_create + device_create_file + device_del + device_destroy + device_get_match_data + device_get_named_child_node + device_initialize + device_property_present + device_property_read_u32_array + device_property_read_u8_array + device_register + device_remove_file + device_remove_groups + device_set_wakeup_capable + device_unregister + device_wakeup_disable + device_wakeup_enable + _dev_info + dev_kfree_skb_any_reason + __devm_add_action + devm_clk_get + devm_clk_get_optional + devm_clk_hw_register + devm_clk_put + devm_devfreq_add_device + devm_extcon_dev_allocate + devm_extcon_dev_register + devm_free_irq + devm_fwnode_gpiod_get_index + devm_gpiochip_add_data_with_key + devm_gpiod_get + devm_gpiod_get_index + devm_gpiod_get_optional + devm_gpio_request + devm_gpio_request_one + devm_input_allocate_device + devm_ioremap + devm_ioremap_resource + devm_iounmap + devm_kasprintf + devm_kfree + devm_kmalloc + devm_kstrdup + devm_mbox_controller_register + devm_of_clk_add_hw_provider + devm_of_iomap + __devm_of_phy_provider_register + devm_phy_create + devm_phy_get + devm_pinctrl_get + devm_pinctrl_put + devm_platform_get_and_ioremap_resource + devm_platform_ioremap_resource + devm_platform_ioremap_resource_byname + devm_regmap_field_alloc + __devm_regmap_init + __devm_regmap_init_i2c + devm_regulator_bulk_get + devm_regulator_get + devm_regulator_put + devm_regulator_register + __devm_request_region + devm_request_threaded_irq + __devm_reset_control_get + devm_snd_soc_register_component + devm_thermal_of_zone_register + _dev_notice + dev_pm_opp_add_dynamic + dev_pm_opp_find_freq_ceil + dev_pm_opp_get_freq_indexed + dev_pm_opp_get_opp_count + dev_pm_opp_get_voltage + dev_pm_opp_of_add_table + dev_pm_opp_of_remove_table + dev_pm_opp_put + dev_pm_opp_remove + dev_pm_opp_set_config + dev_set_name + _dev_warn + disable_irq + disable_irq_nosync + dma_alloc_attrs + dma_async_device_register + dma_async_device_unregister + dma_async_tx_descriptor_init + dma_buf_attach + dma_buf_detach + dma_buf_export + dma_buf_fd + dma_buf_get + dma_buf_map_attachment + dma_buf_put + dma_buf_unmap_attachment + dma_buf_vmap + dma_buf_vunmap + dma_contiguous_default_area + dma_fence_release + dma_free_attrs + dma_get_sgtable_attrs + dma_get_slave_channel + dma_heap_add + dma_heap_get_dev + dma_heap_get_drvdata + dma_heap_get_name + dma_heap_put + dmam_alloc_attrs + dma_map_page_attrs + dma_map_sgtable + dmam_free_coherent + dma_mmap_attrs + dma_set_coherent_mask + dma_set_mask + dma_unmap_page_attrs + dma_unmap_sg_attrs + down + down_interruptible + down_read + down_write + driver_register + driver_unregister + drm_atomic_helper_connector_duplicate_state + drm_atomic_helper_connector_reset + drm_connector_attach_encoder + drm_connector_cleanup + drm_connector_init + drm_connector_unregister + drm_connector_update_edid_property + drm_encoder_cleanup + drm_encoder_init + __drm_err + drm_helper_hpd_irq_event + drm_helper_probe_single_connector_modes + drm_mode_copy + drm_mode_duplicate + drm_mode_equal + drm_mode_probed_add + drm_mode_vrefresh + drm_of_find_possible_crtcs + drm_panel_enable + drm_panel_prepare + dump_stack + enable_irq + eth_type_trans + extcon_get_state + extcon_set_state_sync + _find_first_bit + _find_first_zero_bit + _find_next_bit + find_task_by_vpid + find_vpid + finish_wait + flush_delayed_work + flush_work + __flush_workqueue + free_irq + free_netdev + __free_pages + free_pages + free_pages_exact + free_percpu + fwnode_property_present + fwnode_property_read_u16_array + fwnode_property_read_u32_array + gcd + generic_access_phys + generic_file_llseek + generic_handle_domain_irq + gen_pool_add_owner + gen_pool_alloc_algo_owner + gen_pool_create + gen_pool_destroy + gen_pool_free_owner + get_cpu_device + get_device + get_random_bytes + gpiochip_generic_config + gpiochip_generic_free + gpiochip_generic_request + gpiochip_get_data + gpiod_direction_input + gpiod_direction_output + gpiod_direction_output_raw + gpiod_get_raw_value_cansleep + gpiod_get_value + gpiod_get_value_cansleep + gpiod_set_raw_value_cansleep + gpiod_set_value + gpiod_set_value_cansleep + gpiod_to_irq + gpio_free + gpio_request_one + gpio_to_desc + handle_edge_irq + handle_simple_irq + hrtimer_cancel + hrtimer_forward + hrtimer_init + hrtimer_start_range_ns + i2c_del_driver + i2c_register_driver + i2c_smbus_read_byte_data + i2c_smbus_read_i2c_block_data + i2c_smbus_read_word_data + i2c_smbus_write_byte_data + i2c_smbus_write_i2c_block_data + i2c_transfer + i2c_transfer_buffer_flags + ida_alloc_range + ida_destroy + ida_free + idr_alloc + idr_destroy + idr_find + idr_remove + init_net + __init_rwsem + __init_swait_queue_head + init_task + init_timer_key + init_uts_ns + init_wait_entry + __init_waitqueue_head + input_allocate_device + input_event + input_free_device + input_register_device + input_set_capability + input_unregister_device + iomem_resource + iommu_get_domain_for_dev + iommu_iova_to_phys + iommu_map + ioremap_prot + iounmap + irq_dispose_mapping + irq_force_affinity + irq_get_irq_data + irq_of_parse_and_map + __irq_resolve_mapping + irq_set_affinity + irq_set_irq_wake + irq_to_desc + is_vmalloc_addr + jiffies + jiffies_to_msecs + kasan_flag_enabled + kasprintf + kernel_kobj + __kfifo_free + __kfifo_in + __kfifo_init + __kfifo_out + kfree + kfree_sensitive + kimage_voffset + kmalloc_caches + kmem_cache_destroy + kmem_cache_free + kobject_add + kobject_create_and_add + kobject_init + kobject_init_and_add + kobject_put + kobject_uevent + kobject_uevent_env + kobj_sysfs_ops + kstrdup + kstrtobool + kstrtoint + kstrtoint_from_user + kstrtoll + kstrtou16 + kstrtou8 + kstrtouint + kstrtoull + kthread_bind + kthread_bind_mask + kthread_create_on_node + kthread_queue_work + kthread_should_stop + kthread_stop + ktime_get + ktime_get_boot_fast_ns + ktime_get_mono_fast_ns + ktime_get_real_ts64 + ktime_get_with_offset + kvfree + kvfree_call_rcu + __list_add_valid_or_report + __list_del_entry_valid_or_report + __local_bh_enable_ip + log_post_read_mmio + log_post_write_mmio + log_read_mmio + log_write_mmio + match_string + mbox_chan_received_data + mbox_client_txdone + mbox_free_channel + mbox_request_channel + mbox_request_channel_byname + mbox_send_message + memcmp + memcpy + __memcpy_fromio + __memcpy_toio + memdup_user + memmove + memset + memstart_addr + mipi_dsi_dcs_set_display_on + misc_deregister + misc_register + mod_delayed_work_on + mod_timer + module_layout + module_put + __msecs_to_jiffies + msi_domain_get_virq + msleep + __mutex_init + mutex_is_locked + mutex_lock + mutex_lock_interruptible + mutex_trylock + mutex_unlock + napi_gro_receive + __ndelay + __netdev_alloc_skb + netif_carrier_off + netif_carrier_on + netif_receive_skb + netif_rx + netif_tx_wake_queue + __netlink_kernel_create + netlink_kernel_release + netlink_unicast + nla_put + nla_reserve + __nlmsg_put + nonseekable_open + nr_cpu_ids + nr_irqs + ns_to_timespec64 + of_address_to_resource + of_clk_add_hw_provider + of_clk_del_provider + of_clk_get_by_name + of_clk_hw_onecell_get + of_cpu_device_node_get + of_device_get_match_data + of_device_is_available + of_device_is_compatible + of_dma_controller_free + of_dma_controller_register + of_dma_is_coherent + of_drm_find_panel + of_find_compatible_node + of_find_device_by_node + of_find_matching_node_and_match + of_find_node_by_name + of_find_node_opts_by_path + of_find_property + of_fwnode_ops + of_get_child_by_name + of_get_named_gpio + of_get_next_available_child + of_get_next_child + of_get_property + of_get_regulator_init_data + of_iomap + of_irq_get + of_irq_get_byname + of_match_node + of_node_name_eq + __of_parse_phandle_with_args + of_phy_simple_xlate + of_platform_depopulate + of_property_count_elems_of_size + of_property_match_string + of_property_read_string + of_property_read_string_helper + of_property_read_u32_index + of_property_read_u64 + of_property_read_variable_u32_array + of_property_read_variable_u64_array + of_property_read_variable_u8_array + of_prop_next_u32 + of_reserved_mem_device_release + of_reserved_mem_lookup + __of_reset_control_get + panic + panic_notifier_list + param_ops_bool + param_ops_charp + param_ops_int + param_ops_string + param_ops_uint + param_ops_ulong + pci_find_capability + pci_find_ext_capability + pci_get_device + pci_read_config_dword + pci_write_config_dword + __per_cpu_offset + perf_event_update_userpage + perf_pmu_migrate_context + perf_pmu_register + perf_pmu_unregister + perf_trace_buf_alloc + perf_trace_run_bpf_submit + pfn_is_map_memory + phy_exit + phy_get + phy_init + phy_power_off + phy_power_on + phy_put + phy_set_mode_ext + pid_task + pinctrl_dev_get_drvdata + pinctrl_lookup_state + pinctrl_pm_select_default_state + pinctrl_select_state + platform_bus_type + platform_device_register + platform_device_register_full + platform_device_unregister + __platform_driver_register + platform_driver_unregister + platform_get_irq + platform_get_irq_byname + platform_get_irq_byname_optional + platform_get_resource + platform_get_resource_byname + __platform_register_drivers + platform_unregister_drivers + pm_power_off + __pm_relax + pm_relax + __pm_runtime_disable + pm_runtime_enable + __pm_runtime_idle + __pm_runtime_resume + pm_runtime_set_autosuspend_delay + __pm_runtime_set_status + __pm_runtime_suspend + __pm_runtime_use_autosuspend + __pm_stay_awake + pm_stay_awake + pm_wakeup_ws_event + power_supply_changed + power_supply_get_by_name + power_supply_get_drvdata + power_supply_get_property + power_supply_register + preempt_schedule + preempt_schedule_notrace + prepare_to_wait_event + _printk + proc_create + proc_create_data + proc_mkdir + pskb_expand_head + __pskb_pull_tail + put_device + __put_task_struct + queue_delayed_work_on + queue_work_on + ___ratelimit + _raw_read_lock + _raw_read_unlock + _raw_spin_lock + _raw_spin_lock_bh + _raw_spin_lock_irq + _raw_spin_lock_irqsave + _raw_spin_unlock + _raw_spin_unlock_bh + _raw_spin_unlock_irq + _raw_spin_unlock_irqrestore + _raw_write_lock + _raw_write_unlock + rb_erase + rb_insert_color + __rcu_read_lock + __rcu_read_unlock + refcount_warn_saturate + regcache_cache_only + __register_chrdev + register_chrdev_region + register_inet6addr_notifier + register_inetaddr_notifier + register_netdevice_notifier + register_pm_notifier + register_syscore_ops + regmap_async_complete + regmap_bulk_read + regmap_bulk_write + regmap_irq_get_virq + regmap_multi_reg_write + regmap_raw_read + regmap_raw_write + regmap_raw_write_async + regmap_read + regmap_register_patch + regmap_update_bits_base + regmap_write + regulator_bulk_disable + regulator_bulk_enable + regulator_disable + regulator_enable + regulator_get + regulator_get_bypass_regmap + regulator_get_voltage + regulator_get_voltage_sel_regmap + regulator_is_enabled + regulator_list_voltage_linear_range + regulator_map_voltage_linear_range + regulator_put + regulator_set_bypass_regmap + regulator_set_voltage + regulator_set_voltage_sel_regmap + release_firmware + __release_region + remap_pfn_range + remove_proc_entry + request_firmware + request_firmware_nowait + __request_region + request_threaded_irq + reset_control_assert + reset_control_deassert + reset_control_put + rfkill_alloc + rfkill_destroy + rfkill_register + rfkill_unregister + rtnl_is_locked + rtnl_lock + rtnl_unlock + runqueues + sched_clock + sched_set_fifo + sched_setscheduler + sched_setscheduler_nocheck + schedule + schedule_timeout + scnprintf + seq_lseek + seq_open + seq_printf + seq_read + seq_release + set_cpus_allowed_ptr + sg_alloc_table + sg_alloc_table_from_pages_segment + sg_free_table + sg_init_table + sg_next + __sg_page_iter_next + __sg_page_iter_start + simple_attr_open + simple_attr_read + simple_attr_release + simple_attr_write + simple_open + simple_read_from_buffer + simple_strtol + single_open + single_open_size + single_release + skb_clone + skb_copy + skb_copy_bits + skb_dequeue + skb_pull + skb_push + skb_put + skb_queue_purge_reason + skb_queue_tail + skb_trim + smp_call_function_single + snd_compr_stop_error + snd_ctl_add + snd_ctl_new1 + snd_ctl_notify + snd_pcm_format_physical_width + snd_pcm_format_width + snd_soc_add_component_controls + snd_soc_bytes_put + snd_soc_bytes_tlv_callback + snd_soc_card_get_kcontrol + snd_soc_component_disable_pin + snd_soc_component_force_enable_pin + snd_soc_component_test_bits + snd_soc_dapm_add_routes + snd_soc_dapm_del_routes + snd_soc_dapm_get_enum_double + snd_soc_dapm_get_volsw + snd_soc_dapm_kcontrol_dapm + snd_soc_dapm_mux_update_power + snd_soc_dapm_new_controls + snd_soc_dapm_put_enum_double + snd_soc_dapm_put_volsw + snd_soc_dapm_sync + snd_soc_get_enum_double + snd_soc_get_volsw + snd_soc_get_volsw_range + snd_soc_info_enum_double + snd_soc_info_volsw + snd_soc_info_volsw_range + snd_soc_new_compress + snd_soc_put_enum_double + snd_soc_put_volsw + snd_soc_put_volsw_range + snd_soc_unregister_component + snprintf + sort + __spi_register_driver + sprintf + srcu_init_notifier_head + srcu_notifier_call_chain + srcu_notifier_chain_register + srcu_notifier_chain_unregister + sscanf + __stack_chk_fail + strchr + strcmp + strcpy + strcspn + strim + strlen + strncmp + strncpy + strnlen + strsep + strstr + __sw_hweight16 + __sw_hweight32 + __sw_hweight64 + __sw_hweight8 + synchronize_net + synchronize_rcu + syscon_node_to_regmap + syscon_regmap_lookup_by_phandle + sysfs_create_file_ns + sysfs_create_group + sysfs_create_groups + sysfs_create_link + sysfs_emit + sysfs_emit_at + __sysfs_match_string + sysfs_notify + sysfs_remove_file_ns + sysfs_remove_group + sysfs_remove_groups + sysfs_remove_link + sysfs_streq + system_cpucaps + system_highpri_wq + system_long_wq + system_power_efficient_wq + system_unbound_wq + system_wq + tasklet_kill + __tasklet_schedule + tasklet_setup + thermal_zone_device_priv + thermal_zone_get_temp + thermal_zone_get_zone_by_name + timer_delete + timer_delete_sync + __trace_bprintk + trace_event_buffer_commit + trace_event_buffer_reserve + trace_event_printf + trace_event_raw_init + trace_event_reg + trace_handle_return + tracepoint_probe_register + tracepoint_probe_unregister + trace_print_array_seq + trace_raw_output_prep + __trace_trigger_soft_disabled + try_module_get + __udelay + __unregister_chrdev + unregister_chrdev_region + unregister_inet6addr_notifier + unregister_inetaddr_notifier + unregister_netdevice_notifier + unregister_pm_notifier + up + update_devfreq + up_read + up_write + usb_debug_root + __usecs_to_jiffies + usleep_range_state + utf8_data_table + vchan_dma_desc_free_list + vchan_find_desc + vchan_init + vchan_tx_desc_free + vchan_tx_submit + vfree + vmalloc_to_page + vmap + vm_iomap_memory + vscnprintf + vunmap + wait_for_completion + wait_for_completion_interruptible + wait_for_completion_interruptible_timeout + wait_for_completion_timeout + __wake_up + wake_up_process + wakeup_source_register + wakeup_source_unregister + __warn_printk + work_busy + + serial8250_clear_and_reinit_fifos + serial8250_do_pm + serial8250_do_set_divisor + serial8250_do_set_ldisc + serial8250_do_set_termios + serial8250_em485_config + serial8250_em485_start_tx + serial8250_em485_stop_tx + serial8250_em485_supported + serial8250_get_port + serial8250_handle_irq + serial8250_register_8250_port + serial8250_resume_port + serial8250_suspend_port + serial8250_unregister_port + serial8250_update_uartclk + tty_termios_baud_rate + uart_read_port_properties + + devm_get_clk_from_child + + copy_from_kernel_nofault + high_memory + + gpiod_get_optional + gpiod_put + rdev_get_regmap + regulator_list_voltage_linear + regulator_map_voltage_linear + + rdev_get_drvdata + regulator_disable_regmap + regulator_enable_regmap + regulator_is_enabled_regmap + + of_count_phandle_with_args + of_cpu_node_to_id + + alloc_io_pgtable_ops + device_match_fwnode + devm_bitmap_zalloc + driver_find_device + free_io_pgtable_ops + generic_device_group + iommu_alloc_resv_region + iommu_device_register + iommu_device_sysfs_add + iommu_device_sysfs_remove + iommu_device_unregister + iommu_dma_get_resv_regions + iommu_fwspec_add_ids + kobject_get + memdup_user_nul + of_find_node_with_property + of_prop_next_string + pci_ats_supported + pci_bus_type + pci_device_group + pci_disable_ats + pci_enable_ats + __xa_alloc + xa_erase + + platform_get_irq_optional + + cpu_latency_qos_add_request + cpu_latency_qos_remove_request + cpu_latency_qos_update_request + device_property_read_string + devm_register_sys_off_handler + extcon_get_extcon_dev + pm_wakeup_dev_event + + alloc_etherdev_mqs + bitmap_parse + get_random_u32 + kthread_complete_and_exit + napi_complete_done + napi_disable + napi_enable + __napi_schedule + napi_schedule_prep + netdev_update_features + netif_napi_add_weight + __netif_napi_del + nla_append + nla_put_nohdr + pci_alloc_irq_vectors + pci_disable_device + pci_enable_device + pci_enable_wake + pci_free_irq_vectors + pci_load_and_free_saved_state + pci_load_saved_state + __pci_register_driver + pci_restore_state + pci_save_state + pci_set_master + pci_set_power_state + pci_store_saved_state + pci_unregister_driver + _raw_read_lock_bh + _raw_read_unlock_bh + register_reboot_notifier + request_firmware_direct + rtc_time64_to_tm + sched_set_fifo_low + sched_set_normal + schedule_timeout_interruptible + simple_strtoul + sock_wfree + sprint_symbol + strcasecmp + strncasecmp + strrchr + strspn + system_state + sys_tz + tasklet_init + unregister_reboot_notifier + vsnprintf + + bpf_trace_run11 + debugfs_rename + __dev_change_net_namespace + __dev_get_by_index + dev_get_by_index + device_rename + do_trace_netlink_extack + genlmsg_multicast_allns + genlmsg_put + genl_register_family + genl_unregister_family + get_net_ns_by_fd + get_net_ns_by_pid + inet_csk_get_port + key_put + keyring_alloc + ktime_get_coarse_with_offset + netdev_err + netlink_broadcast + netlink_register_notifier + netlink_unregister_notifier + net_ns_type_operations + nla_find + nla_memcpy + __nla_parse + nla_put_64bit + __nla_validate + __put_net + register_netdevice + register_pernet_device + rfkill_blocked + rfkill_resume_polling + rfkill_set_hw_state_reason + __sock_create + sock_release + unregister_netdevice_queue + unregister_pernet_device + verify_pkcs7_signature + wireless_nlevent_flush + x509_load_certificate_list + + dapm_regulator_event + snd_soc_bytes_get + snd_soc_bytes_info + snd_soc_component_init_regmap + + regmap_add_irq_chip + regmap_del_irq_chip + + devm_clk_bulk_get_optional + i2c_client_get_device_id + mfd_add_devices + mfd_remove_devices + mfd_remove_devices_late + regcache_mark_dirty + regcache_sync + + _dev_alert + regmap_get_val_bytes + snd_pcm_hw_constraint_list + snd_soc_component_read + snd_soc_component_update_bits + snd_soc_component_write + snd_soc_dai_active + snd_soc_params_to_bclk + + devm_pinctrl_register_and_init + pinconf_generic_dt_node_to_map + pinctrl_enable + pinctrl_register_mappings + pinctrl_unregister_mappings + pinctrl_utils_free_map + + vmf_insert_pfn + + debugfs_create_u8 + drm_add_edid_modes + drm_atomic_get_crtc_state + drm_connector_atomic_hdr_metadata_equal + drm_connector_attach_hdr_output_metadata_property + drm_detect_monitor_audio + drm_edid_is_valid + drm_kms_helper_hotplug_event + phy_configure + + component_bind_all + component_master_del + component_unbind_all + drm_add_modes_noedid + drm_atomic_helper_async_commit + drm_atomic_helper_check + drm_atomic_helper_cleanup_planes + drm_atomic_helper_commit_cleanup_done + drm_atomic_helper_commit_hw_done + drm_atomic_helper_commit_modeset_disables + drm_atomic_helper_commit_modeset_enables + drm_atomic_helper_commit_planes + drm_atomic_helper_commit_tail + __drm_atomic_helper_crtc_duplicate_state + __drm_atomic_helper_crtc_reset + drm_atomic_helper_disable_plane + drm_atomic_helper_page_flip + __drm_atomic_helper_plane_destroy_state + __drm_atomic_helper_plane_duplicate_state + __drm_atomic_helper_plane_reset + drm_atomic_helper_prepare_planes + drm_atomic_helper_set_config + drm_atomic_helper_setup_commit + drm_atomic_helper_shutdown + drm_atomic_helper_swap_state + drm_atomic_helper_update_plane + drm_atomic_helper_wait_for_dependencies + drm_atomic_helper_wait_for_fences + __drm_atomic_state_free + drm_compat_ioctl + drm_crtc_cleanup + __drm_crtc_commit_free + drm_crtc_handle_vblank + drm_crtc_init_with_planes + drm_crtc_send_vblank_event + drm_crtc_vblank_off + drm_crtc_vblank_on + drm_dev_alloc + drm_dev_put + drm_dev_register + drm_dev_unregister + drm_display_mode_to_videomode + drm_format_info + drm_gem_fb_create + drm_gem_handle_create + drm_gem_mmap + drm_gem_object_free + drm_gem_object_init + drm_gem_object_release + drm_gem_plane_helper_prepare_fb + drm_gem_prime_fd_to_handle + drm_gem_prime_handle_to_fd + drm_gem_vm_close + drm_gem_vm_open + drm_ioctl + drm_kms_helper_poll_fini + drm_kms_helper_poll_init + drmm_mode_config_init + drm_mode_config_cleanup + drm_mode_config_reset + drm_mode_crtc_set_gamma_size + drm_mode_object_put + drm_object_attach_property + drm_of_component_probe + drm_open + drm_plane_cleanup + drm_plane_create_alpha_property + drm_plane_create_blend_mode_property + drm_plane_create_color_properties + drm_plane_create_rotation_property + drm_plane_create_zpos_immutable_property + drm_poll + drm_prime_pages_to_sg + drm_property_blob_get + drm_property_blob_put + drm_property_create + drm_property_create_range + drm_property_lookup_blob + drm_property_replace_blob + drm_read + drm_release + drm_universal_plane_init + drm_vblank_init + drm_writeback_cleanup_job + drm_writeback_connector_init + drm_writeback_queue_job + drm_writeback_signal_completion + jiffies_to_usecs + of_graph_get_endpoint_by_regs + of_graph_get_remote_port_parent + reset_control_release + sched_setattr + set_normalized_timespec64 + ww_mutex_lock + ww_mutex_unlock + + drm_event_reserve_init + drm_panel_disable + drm_panel_get_modes + drm_panel_unprepare + drm_send_event + mipi_dsi_create_packet + mipi_dsi_host_register + mipi_dsi_host_unregister + mipi_dsi_packet_format_is_long + send_sig_info + + irq_modify_status + of_get_compatible_child + of_platform_populate + pm_runtime_allow + usb_speed_string + + regulator_allow_bypass + + arm_smccc_1_2_smc + device_match_any + disable_percpu_irq + enable_percpu_irq + free_percpu_irq + irq_create_of_mapping + __request_percpu_irq + sg_nents + uuid_null + uuid_parse + xa_destroy + xa_extract + xa_load + xa_store + + input_mt_init_slots + input_mt_report_slot_state + input_set_abs_params + pinctrl_pm_select_sleep_state + spi_setup + spi_sync + strncat + vsprintf + + gpiochip_add_pin_range + + gpiochip_disable_irq + gpiochip_enable_irq + handle_nested_irq + + handle_bad_irq + handle_level_irq + + irq_set_irq_type + + find_vma + of_dma_configure_id + __pte_offset_map_lock + + i2c_add_numbered_adapter + i2c_generic_scl_recovery + i2c_recover_bus + + dev_get_regmap + i2c_del_adapter + i2c_parse_fw_timings + + bus_register_notifier + bus_unregister_notifier + cdev_device_add + cdev_device_del + device_for_each_child + i2c_adapter_type + i2c_bus_type + i2c_for_each_dev + i2c_get_adapter + i2c_put_adapter + i2c_smbus_xfer + i2c_verify_client + + gpiod_set_raw_value + regulator_get_linear_step + + blocking_notifier_chain_register + blocking_notifier_chain_unregister + + down_trylock + gen_pool_best_fit + gen_pool_set_algo + gen_pool_virt_to_phys + kernel_sigaction + ktime_get_coarse_real_ts64 + platform_device_add + platform_device_add_data + platform_device_alloc + platform_device_del + platform_device_put + send_sig + + device_get_child_node_count + device_get_next_child_node + devm_led_classdev_register_ext + gpiod_cansleep + gpiod_set_consumer_name + led_init_default_state_get + + filp_close + filp_open_block + + alloc_netdev_mqs + arc4_crypt + arc4_setkey + call_rcu + crc32_be + crypto_aead_decrypt + crypto_aead_encrypt + crypto_aead_setauthsize + crypto_aead_setkey + crypto_alloc_aead + crypto_alloc_shash + crypto_alloc_skcipher + crypto_destroy_tfm + __crypto_memneq + crypto_shash_digest + crypto_shash_finup + crypto_shash_setkey + crypto_shash_update + crypto_skcipher_decrypt + crypto_skcipher_encrypt + crypto_skcipher_setkey + __crypto_xor + dev_alloc_name + dev_fetch_sw_netstats + _dev_printk + __dev_queue_xmit + drop_reasons_register_subsys + drop_reasons_unregister_subsys + ether_setup + eth_mac_addr + ethtool_op_get_link + get_random_u16 + __hw_addr_init + __hw_addr_sync + __hw_addr_unsync + idr_for_each + idr_get_next + kernel_param_lock + kernel_param_unlock + kfree_skb_list_reason + ktime_get_seconds + netdev_info + netdev_set_default_ethtool_ops + netif_receive_skb_list + net_ratelimit + ___pskb_trim + rcu_barrier + rhashtable_free_and_destroy + rhashtable_insert_slow + __rht_bucket_nested + rht_bucket_nested + rht_bucket_nested_insert + round_jiffies + round_jiffies_relative + round_jiffies_up + sg_init_one + skb_clone_sk + skb_complete_wifi_ack + skb_copy_expand + skb_csum_hwoffload_help + skb_ensure_writable + __skb_gso_segment + skb_queue_head + system_freezable_wq + tasklet_unlock_wait + + add_wait_queue + debugfs_initialized + default_wake_function + fasync_helper + kill_fasync + remove_wait_queue + + anon_inode_getfd + __bitmap_andnot + __bitmap_equal + __bitmap_or + __bitmap_weight + cache_line_size + clear_page + __ClearPageMovable + debugfs_attr_read + debugfs_attr_write + devfreq_add_device + devfreq_register_opp_notifier + devfreq_remove_device + devfreq_resume_device + devfreq_suspend_device + devfreq_unregister_opp_notifier + dev_pm_opp_clear_config + dev_pm_opp_find_freq_exact + dev_pm_opp_find_freq_floor + dma_buf_map_attachment_unlocked + dma_buf_mmap + dma_buf_unmap_attachment_unlocked + dma_fence_add_callback + dma_fence_context_alloc + dma_fence_default_wait + dma_fence_get_status + dma_fence_init + dma_fence_remove_callback + dma_fence_signal + downgrade_write + down_read_trylock + fd_install + _find_next_zero_bit + find_vma_intersection + __folio_lock + __folio_put + fput + get_unused_fd_flags + get_user_pages + hrtimer_active + __kfifo_alloc + __kfifo_out_peek + kobject_del + kstrndup + kstrtobool_from_user + kstrtouint_from_user + ktime_get_raw + ktime_get_raw_ts64 + memchr + __mmdrop + msleep_interruptible + of_clk_get + of_devfreq_cooling_register_power + of_machine_compatible_match + page_pinner_inited + __page_pinner_put_page + param_array_ops + param_get_int + param_ops_byte + percpu_counter_add_batch + percpu_counter_batch + pin_user_pages_remote + __put_cred + put_pid + _raw_spin_trylock + rb_first + rb_next + rb_prev + rb_replace_node + register_oom_notifier + regulator_get_optional + remap_vmalloc_range + seq_putc + seq_write + set_page_dirty_lock + __SetPageMovable + shmem_file_setup + static_key_slow_inc + sync_file_create + sync_file_get_fence + synchronize_irq + _totalram_pages + __traceiter_gpu_mem_total + trace_output_call + __tracepoint_gpu_mem_total + trace_print_flags_seq + trace_print_symbols_seq + unlock_page + unmap_mapping_range + unpin_user_page + unregister_oom_notifier + vmf_insert_pfn_prot + vm_unmapped_area + + bitmap_alloc + on_each_cpu_cond_mask + __traceiter_android_rvh_sched_fork + __traceiter_android_vh_dup_task_struct + __traceiter_android_vh_mpam_set + __tracepoint_android_rvh_sched_fork + __tracepoint_android_vh_dup_task_struct + __tracepoint_android_vh_mpam_set + + register_kprobe + unregister_kprobe + + iommu_group_get + iommu_group_put + of_devfreq_cooling_register + of_reserved_mem_device_init_by_idx + regulator_set_voltage_time + + devm_backlight_device_register + devm_thermal_of_cooling_device_register + drm_connector_set_panel_orientation + drm_mode_set_name + drm_panel_add + drm_panel_init + drm_panel_remove + mipi_dsi_attach + mipi_dsi_dcs_enter_sleep_mode + mipi_dsi_dcs_exit_sleep_mode + mipi_dsi_dcs_read + mipi_dsi_dcs_set_display_off + mipi_dsi_dcs_write_buffer + mipi_dsi_detach + mipi_dsi_driver_register_full + mipi_dsi_driver_unregister + mipi_dsi_generic_write + mipi_dsi_picture_parameter_set + of_drm_get_panel_orientation + thermal_cooling_device_unregister + + clk_bulk_disable + clk_bulk_enable + clk_bulk_prepare + clk_bulk_unprepare + device_release_driver + devm_clk_bulk_get_all + devm_pci_alloc_host_bridge + devm_pci_remap_cfg_resource + devm_release_resource + generic_handle_irq + __irq_alloc_descs + irq_chip_ack_parent + irq_chip_mask_parent + irq_chip_unmask_parent + irq_domain_associate_many + irq_domain_get_irq_data + irq_domain_remove + irq_domain_set_info + irq_domain_update_bus_token + irq_set_chained_handler_and_data + irq_set_chip_and_handler_name + irq_set_chip_data + of_match_device + of_pci_get_max_link_speed + of_reserved_mem_device_init_by_name + pci_aer_clear_nonfatal_status + pcie_capability_clear_and_set_word_unlocked + pcie_capability_read_word + pcie_link_speed + pci_find_next_bus + pci_generic_config_read + pci_generic_config_write + pci_host_probe + pci_lock_rescan_remove + pci_msi_create_irq_domain + pci_msi_enabled + pci_msi_mask_irq + pci_msi_unmask_irq + pci_pio_to_address + pci_read_config_word + pci_remove_root_bus + pci_rescan_bus + pci_stop_and_remove_bus_device_locked + pci_stop_root_bus + pci_unlock_rescan_remove + simple_write_to_buffer + + devm_pinctrl_register + of_find_node_by_phandle + of_get_parent + pinconf_generic_parse_dt_config + pin_get_name + + devm_of_platform_populate + extcon_set_state + strchrnul + usb_get_role_switch_default_mode + usb_role_switch_get_drvdata + usb_role_switch_register + usb_role_switch_unregister + + iommu_map_sg + iommu_unmap + + reset_controller_register + + devm_rtc_allocate_device + __devm_rtc_register_device + rtc_tm_to_time64 + rtc_update_irq + + bus_for_each_drv + devm_ioremap_wc + devm_memremap + devm_regulator_get_exclusive + dma_heap_find + glob_match + + snd_info_create_card_entry + snd_jack_set_key + snd_soc_add_dai_controls + snd_soc_bytes_info_ext + snd_soc_card_jack_new + snd_soc_component_set_jack + snd_soc_component_set_pll + snd_soc_component_set_sysclk + snd_soc_daifmt_clock_provider_from_bitmap + snd_soc_daifmt_parse_clock_provider_raw + snd_soc_daifmt_parse_format + snd_soc_dai_set_pll + snd_soc_dai_set_sysclk + snd_soc_dai_set_tdm_slot + snd_soc_of_get_dai_link_codecs + snd_soc_of_get_dai_name + snd_soc_of_parse_audio_routing + snd_soc_of_parse_card_name + snd_soc_register_card + snd_soc_runtime_set_dai_fmt + snd_soc_unregister_card + + print_hex_dump + snd_ctl_enum_info + snd_pcm_lib_free_pages + snd_pcm_lib_ioctl + snd_pcm_lib_malloc_pages + snd_pcm_lib_preallocate_pages + snd_pcm_period_elapsed + snd_soc_dapm_ignore_suspend + snd_soc_dapm_kcontrol_widget + snd_soc_dapm_mixer_update_power + + raw_notifier_call_chain + raw_notifier_chain_register + raw_notifier_chain_unregister + + mmc_of_parse + sdhci_add_host + sdhci_get_property + sdhci_pltfm_clk_get_max_clock + sdhci_pltfm_free + sdhci_pltfm_init + sdhci_pltfm_pmops + sdhci_remove_host + sdhci_set_bus_width + + devm_iio_device_alloc + __devm_iio_device_register + + cpufreq_generic_attr + cpufreq_generic_frequency_table_verify + cpufreq_register_driver + cpufreq_unregister_driver + dev_pm_opp_free_cpufreq_table + dev_pm_opp_init_cpufreq_table + dev_pm_opp_of_get_sharing_cpus + dev_pm_opp_of_register_em + dev_pm_opp_remove_all_dynamic + dev_pm_opp_set_sharing_cpus + em_dev_register_perf_domain + __traceiter_android_vh_cpufreq_online + __tracepoint_android_vh_cpufreq_online + + of_property_read_u64_index + sysfs_create_files + + device_match_name + hdmi_audio_infoframe_init + snd_pcm_add_chmap_ctls + snd_pcm_hw_constraint_eld + snd_soc_jack_report + + remove_cpu + + register_restart_handler + unregister_restart_handler + + regulator_unregister + + rfkill_init_sw_state + + for_each_kernel_tracepoint + __task_pid_nr_ns + + i2c_smbus_write_word_data + + thermal_cooling_device_register + + clk_fixed_factor_ops + clk_hw_get_flags + clk_hw_get_parent + clk_hw_get_rate + clk_hw_round_rate + divider_recalc_rate + + devm_hwspin_lock_register + + __kfifo_to_user + pvclock_gtod_register_notifier + pvclock_gtod_unregister_notifier + vm_map_pages + wait_for_completion_killable + + cpuidle_governor_latency_req + cpuidle_register_governor + tick_nohz_get_sleep_length + + of_property_read_variable_u16_array + + regmap_field_read + regmap_field_update_bits_base + + activate_task + arch_freq_scale + available_idle_cpu + balance_push_callback + bpf_trace_run10 + bpf_trace_run12 + bpf_trace_run9 + cgroup_add_legacy_cftypes + cgroup_taskset_first + cgroup_taskset_next + __cpu_active_mask + cpufreq_add_update_util_hook + cpufreq_disable_fast_switch + cpufreq_driver_fast_switch + cpufreq_driver_resolve_freq + __cpufreq_driver_target + cpufreq_enable_fast_switch + cpufreq_policy_transition_delay_us + cpufreq_quick_get + cpufreq_register_governor + cpufreq_register_notifier + cpufreq_remove_update_util_hook + cpufreq_this_cpu_can_update + cpu_irqtime + cpupri_find_fitness + cpu_scale + css_next_child + css_task_iter_end + css_task_iter_next + css_task_iter_start + deactivate_task + double_rq_lock + get_cpu_idle_time + get_governor_parent_kobj + get_pid_task + gov_attr_set_init + governor_sysfs_ops + irq_work_queue + irq_work_queue_on + irq_work_sync + ksoftirqd + kthread_cancel_work_sync + kthread_flush_worker + __kthread_init_worker + kthread_worker_fn + migrate_swap + pick_highest_pushable_task + _printk_deferred + proc_dointvec + proc_dointvec_minmax + proc_dostring + raw_spin_rq_lock_nested + raw_spin_rq_unlock + _raw_write_lock_irqsave + _raw_write_unlock_irqrestore + register_sysctl_sz + resched_curr + root_task_group + sched_feat_keys + sched_feat_names + sched_setattr_nocheck + sched_uclamp_used + set_next_entity + set_task_cpu + static_key_disable + stop_machine + stop_one_cpu_nowait + strpbrk + sysctl_sched_features + sysctl_vals + tasklist_lock + __task_rq_lock + tick_nohz_get_idle_calls_cpu + topology_update_done + __traceiter_android_rvh_account_irq + __traceiter_android_rvh_after_dequeue_task + __traceiter_android_rvh_after_enqueue_task + __traceiter_android_rvh_build_perf_domains + __traceiter_android_rvh_can_migrate_task + __traceiter_android_rvh_cpu_cgroup_attach + __traceiter_android_rvh_cpu_cgroup_online + __traceiter_android_rvh_dequeue_task + __traceiter_android_rvh_enqueue_task + __traceiter_android_rvh_find_busiest_queue + __traceiter_android_rvh_find_lowest_rq + __traceiter_android_rvh_flush_task + __traceiter_android_rvh_migrate_queued_task + __traceiter_android_rvh_new_task_stats + __traceiter_android_rvh_replace_next_task_fair + __traceiter_android_rvh_sched_balance_rt + __traceiter_android_rvh_sched_cpu_dying + __traceiter_android_rvh_sched_cpu_starting + __traceiter_android_rvh_sched_exec + __traceiter_android_rvh_sched_fork_init + __traceiter_android_rvh_sched_newidle_balance + __traceiter_android_rvh_sched_nohz_balancer_kick + __traceiter_android_rvh_schedule + __traceiter_android_rvh_select_task_rq_fair + __traceiter_android_rvh_select_task_rq_rt + __traceiter_android_rvh_set_task_cpu + __traceiter_android_rvh_tick_entry + __traceiter_android_rvh_try_to_wake_up + __traceiter_android_rvh_try_to_wake_up_success + __traceiter_android_rvh_ttwu_cond + __traceiter_android_rvh_update_cpu_capacity + __traceiter_android_rvh_update_misfit_status + __traceiter_android_rvh_wake_up_new_task + __traceiter_android_vh_dump_throttled_rt_tasks + __traceiter_android_vh_scheduler_tick + __traceiter_android_vh_update_topology_flags_workfn + __traceiter_android_vh_use_amu_fie + __traceiter_binder_transaction_received + __traceiter_cpu_frequency + __traceiter_cpu_frequency_limits + __tracepoint_android_rvh_account_irq + __tracepoint_android_rvh_after_dequeue_task + __tracepoint_android_rvh_after_enqueue_task + __tracepoint_android_rvh_build_perf_domains + __tracepoint_android_rvh_can_migrate_task + __tracepoint_android_rvh_cpu_cgroup_attach + __tracepoint_android_rvh_cpu_cgroup_online + __tracepoint_android_rvh_dequeue_task + __tracepoint_android_rvh_enqueue_task + __tracepoint_android_rvh_find_busiest_queue + __tracepoint_android_rvh_find_lowest_rq + __tracepoint_android_rvh_flush_task + __tracepoint_android_rvh_migrate_queued_task + __tracepoint_android_rvh_new_task_stats + __tracepoint_android_rvh_replace_next_task_fair + __tracepoint_android_rvh_sched_balance_rt + __tracepoint_android_rvh_sched_cpu_dying + __tracepoint_android_rvh_sched_cpu_starting + __tracepoint_android_rvh_sched_exec + __tracepoint_android_rvh_sched_fork_init + __tracepoint_android_rvh_sched_newidle_balance + __tracepoint_android_rvh_sched_nohz_balancer_kick + __tracepoint_android_rvh_schedule + __tracepoint_android_rvh_select_task_rq_fair + __tracepoint_android_rvh_select_task_rq_rt + __tracepoint_android_rvh_set_task_cpu + __tracepoint_android_rvh_tick_entry + __tracepoint_android_rvh_try_to_wake_up + __tracepoint_android_rvh_try_to_wake_up_success + __tracepoint_android_rvh_ttwu_cond + __tracepoint_android_rvh_update_cpu_capacity + __tracepoint_android_rvh_update_misfit_status + __tracepoint_android_rvh_wake_up_new_task + __tracepoint_android_vh_dump_throttled_rt_tasks + __tracepoint_android_vh_scheduler_tick + __tracepoint_android_vh_update_topology_flags_workfn + __tracepoint_android_vh_use_amu_fie + __tracepoint_binder_transaction_received + __tracepoint_cpu_frequency + __tracepoint_cpu_frequency_limits + trace_seq_printf + trace_seq_putc + uclamp_eff_value + update_rq_clock + wake_up_if_idle + + thermal_zone_device_disable + thermal_zone_device_update + + clockevents_config_and_register + clocks_calc_mult_shift + __clocksource_register_scale + __platform_driver_probe + + irq_set_irqchip_state + of_irq_parse_one + watchdog_init_timeout + watchdog_register_device + watchdog_set_restart_priority + watchdog_unregister_device + + class_remove_file_ns + snd_soc_register_component + + __devm_regmap_init_spi + + devm_regmap_add_irq_chip + regcache_drop_region + snd_soc_component_enable_pin + snd_soc_component_get_pin_status + snd_soc_get_volsw_sx + snd_soc_info_volsw_sx + snd_soc_lookup_component + snd_soc_put_volsw_sx + + syscon_regmap_lookup_by_compatible + + device_set_node + __spi_alloc_controller + spi_controller_resume + spi_controller_suspend + spi_delay_exec + spi_finalize_current_transfer + spi_mem_default_supports_op + spi_register_controller + spi_unregister_controller + + console_suspend_enabled + contig_page_data + emergency_restart + input_close_device + input_open_device + input_register_handle + input_register_handler + input_unregister_handle + input_unregister_handler + ktime_get_real_seconds + mem_section + node_states + __num_online_cpus + of_find_all_nodes + oops_in_progress + register_die_notifier + __traceiter_android_rvh_arm64_serror_panic + __traceiter_android_vh_ipi_stop + __traceiter_android_vh_printk_caller + __traceiter_android_vh_printk_caller_id + __traceiter_android_vh_printk_ext_header + __tracepoint_android_rvh_arm64_serror_panic + __tracepoint_android_vh_ipi_stop + __tracepoint_android_vh_printk_caller + __tracepoint_android_vh_printk_caller_id + __tracepoint_android_vh_printk_ext_header + unregister_die_notifier + + fw_devlink_purge_absent_suppliers + fwnode_property_read_string + fwnode_property_read_u8_array + kthread_create_worker + kthread_destroy_worker + usb_role_switch_get + usb_role_switch_put + usb_role_switch_set_role + + devm_iio_channel_get + iio_get_channel_type + iio_read_channel_processed + + device_find_child + fwnode_connection_find_match + fwnode_get_name + fwnode_get_next_child_node + sysfs_update_group + + scsi_test_unit_ready + ufshcd_dme_configure_adapt + ufshcd_dme_set_attr + ufshcd_hba_stop + ufshcd_is_hba_active + ufshcd_pltfrm_init + ufshcd_remove + ufshcd_resume_complete + ufshcd_runtime_resume + ufshcd_runtime_suspend + ufshcd_suspend_prepare + ufshcd_system_resume + ufshcd_system_suspend + + config_ep_by_speed + config_group_init_type_name + dev_get_stats + gether_cleanup + gether_connect + gether_disconnect + gether_get_dev_addr + gether_get_host_addr + gether_get_host_addr_u8 + gether_get_ifname + gether_get_qmult + gether_register_netdev + gether_set_dev_addr + gether_set_gadget + gether_set_host_addr + gether_set_ifname + gether_set_qmult + gether_setup_name_default + skb_realloc_headroom + usb_assign_descriptors + usb_ep_alloc_request + usb_ep_autoconfig + usb_ep_disable + usb_ep_enable + usb_ep_free_request + usb_ep_queue + usb_free_all_descriptors + usb_function_register + usb_function_unregister + usb_gstrings_attach + usb_interface_id + usb_os_desc_prepare_interf_dir + usb_put_function_instance + + pm_runtime_force_resume + pm_runtime_force_suspend + + param_ops_ushort + + remove_proc_subtree + + adjust_managed_page_count + amba_bustype + amba_driver_unregister + __arch_clear_user + arm_smccc_1_1_get_conduit + arm_smccc_1_2_hvc + arm_smccc_get_version + async_schedule_node + autoremove_wake_function + bio_associate_blkg + __bitmap_xor + blkdev_compat_ptr_ioctl + blk_execute_rq + blk_execute_rq_nowait + blk_freeze_queue_start + blk_get_queue + blk_mark_disk_dead + __blk_mq_alloc_disk + blk_mq_alloc_request + blk_mq_alloc_request_hctx + blk_mq_alloc_sq_tag_set + blk_mq_alloc_tag_set + blk_mq_complete_request + blk_mq_complete_request_remote + blk_mq_delay_kick_requeue_list + blk_mq_end_request + blk_mq_free_request + blk_mq_free_tag_set + blk_mq_freeze_queue + blk_mq_freeze_queue_wait + blk_mq_freeze_queue_wait_timeout + blk_mq_map_queues + blk_mq_pci_map_queues + blk_mq_quiesce_queue + blk_mq_requeue_request + blk_mq_start_request + blk_mq_tagset_busy_iter + blk_mq_tagset_wait_completed_request + blk_mq_unfreeze_queue + blk_mq_unquiesce_queue + blk_mq_update_nr_hw_queues + blk_put_queue + blk_queue_flag_clear + blk_queue_flag_set + blk_revalidate_disk_zones + blk_rq_map_kern + __blk_rq_map_sg + blk_rq_map_user + blk_rq_unmap_user + blk_status_to_errno + blk_sync_queue + cleanup_srcu_struct + clockevent_delta2ns + clockevents_register_device + compat_ptr_ioctl + component_master_add_with_match + configfs_register_group + configfs_register_subsystem + configfs_unregister_subsystem + config_group_init + config_item_get + config_item_put + config_item_set_name + cpufreq_table_index_unsorted + __cpuhp_setup_state_cpuslocked + cpus_read_lock + cpus_read_unlock + del_gendisk + device_add_disk + device_remove_file_self + dev_pm_qos_expose_latency_tolerance + dev_pm_qos_hide_latency_tolerance + dev_pm_qos_update_user_latency_tolerance + dma_alloc_pages + dma_free_pages + dma_map_sg_attrs + dma_max_mapping_size + dma_pool_alloc + dma_pool_create + dma_pool_destroy + dma_pool_free + __do_once_done + __do_once_start + drm_atomic_helper_commit + drm_atomic_helper_connector_destroy_state + __drm_atomic_helper_crtc_destroy_state + drm_atomic_helper_wait_for_flip_done + drm_atomic_helper_wait_for_vblanks + drm_dev_printk + drm_gem_prime_mmap + drm_of_component_match_add + drm_panel_of_backlight + drm_prime_gem_destroy + drm_property_create_enum + event_triggers_call + find_get_pid + fwnode_find_reference + fwnode_handle_get + __get_task_comm + get_user_pages_fast + hashlen_string + hdmi_drm_infoframe_pack_only + hdmi_infoframe_pack + i2c_freq_mode_string + init_pid_ns + init_srcu_struct + iommu_fwspec_free + ipi_desc_get + iput + irq_check_status_bit + irq_get_percpu_devid_partition + irq_work_run + iwe_stream_add_event + iwe_stream_add_point + iwe_stream_add_value + __kfence_pool + kfree_const + kobject_set_name + kstrtoull_from_user + mbox_controller_register + mbox_controller_unregister + __memcat_p + memchr_inv + mempool_destroy + mempool_free + mempool_kfree + mempool_kmalloc + mmc_app_cmd + netdev_state_change + of_get_cpu_node + of_get_drm_display_mode + of_get_next_parent + of_graph_get_next_endpoint + of_graph_get_port_parent + of_graph_get_remote_endpoint + of_graph_is_present + of_graph_parse_endpoint + param_get_uint + param_ops_long + param_set_uint + param_set_uint_minmax + pci_alloc_irq_vectors_affinity + pcibios_resource_to_bus + pci_device_is_present + pcie_aspm_enabled + pci_enable_device_mem + pci_free_irq + pci_irq_vector + pci_release_selected_regions + pci_request_irq + pci_request_selected_regions + pci_select_bars + pci_sriov_configure_simple + perf_allow_kernel + perf_aux_output_begin + perf_aux_output_end + perf_aux_output_flag + perf_aux_output_skip + perf_event_addr_filters_sync + perf_get_aux + pinctrl_unregister + pin_user_pages + pm_runtime_forbid + pm_runtime_no_callbacks + pm_suspend_global_flags + prepare_to_wait + put_disk + rebuild_sched_domains + __register_blkdev + register_kretprobe + register_netdev + sdhci_calc_clk + sdhci_enable_clk + sdhci_execute_tuning + sdhci_pltfm_suspend + sdhci_set_clock + __seq_open_private + seq_release_private + set_capacity + set_capacity_and_notify + set_disk_ro + show_regs + smp_call_function_any + snd_card_ref + snd_card_register + snd_card_rw_proc_new + snd_ctl_boolean_mono_info + snd_devm_card_new + snd_ecards_limit + snd_info_get_line + snd_interval_refine + snd_pcm_format_set_silence + snd_pcm_hw_constraint_integer + snd_pcm_hw_rule_add + snd_pcm_new + snd_pcm_set_managed_buffer_all + snd_pcm_set_ops + snd_pcm_stop + snd_pcm_stop_xrun + snd_timer_close + snd_timer_instance_free + snd_timer_instance_new + snd_timer_open + snd_timer_start + snd_timer_stop + __srcu_read_lock + __srcu_read_unlock + stpcpy + strcat + synchronize_srcu + sysfs_add_file_to_group + sysfs_add_link_to_group + sysfs_remove_file_from_group + sysfs_remove_link_from_group + task_active_pid_ns + this_cpu_has_cap + trace_event_ignore_this_pid + __traceiter_android_rvh_sched_setaffinity + __tracepoint_android_rvh_sched_setaffinity + tracing_off + unregister_blkdev + unregister_kretprobe + unregister_netdev + vm_map_ram + vm_unmap_ram + vprintk + wait_for_completion_io_timeout + wireless_send_event + xa_find + xa_find_after -- GitLab From b2a2ed8dce8f82b9c9ba702872e8157418729c7d Mon Sep 17 00:00:00 2001 From: Frode Isaksen Date: Thu, 3 Apr 2025 09:28:03 +0200 Subject: [PATCH 2101/2211] UPSTREAM: usb: dwc3: gadget: check that event count does not exceed event buffer length commit 63ccd26cd1f6600421795f6ca3e625076be06c9f upstream. The event count is read from register DWC3_GEVNTCOUNT. There is a check for the count being zero, but not for exceeding the event buffer length. Check that event count does not exceed event buffer length, avoiding an out-of-bounds access when memcpy'ing the event. Crash log: Unable to handle kernel paging request at virtual address ffffffc0129be000 pc : __memcpy+0x114/0x180 lr : dwc3_check_event_buf+0xec/0x348 x3 : 0000000000000030 x2 : 000000000000dfc4 x1 : ffffffc0129be000 x0 : ffffff87aad60080 Call trace: __memcpy+0x114/0x180 dwc3_interrupt+0x24/0x34 Bug: 426103040 Change-Id: I1de2ce53124a9df00fa29423f343003fd8c917e2 Signed-off-by: Frode Isaksen Fixes: 72246da40f37 ("usb: Introduce DesignWare USB3 DRD Driver") Cc: stable Acked-by: Thinh Nguyen Link: https://lore.kernel.org/r/20250403072907.448524-1-fisaksen@baylibre.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Muhammed Ali -- GitLab From 354fa5d5bf9035d7c426482bd29e0f831ec11e37 Mon Sep 17 00:00:00 2001 From: Peng Yang Date: Tue, 15 Jul 2025 23:49:43 -0700 Subject: [PATCH 2102/2211] ANDROID: gunyah: GKI: Avoid release the CMA memory when it's in use One process boots up SVM, the CMA memory is allocated and used by SVM. If another process try to boot up VM again, will allocate fail and release this CMA memory region. It will cause kernel panic when one process allocates memory from this CMA memory region due to not do relciam parcel for this memory. Fix this issue by return a error in gunyah_cma_create_mem_fd to avoid gunyah_cma_release is called when the CMA memory region is already allocated by other process. Bug: 432359620 Change-Id: Iee2d20d455e80d992db45c875488fd9cb631f8fd Signed-off-by: Peng Yang --- drivers/virt/gunyah/vm_mgr_cma_mem.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/virt/gunyah/vm_mgr_cma_mem.c b/drivers/virt/gunyah/vm_mgr_cma_mem.c index 07ffe49c62871..c5f91852fc52f 100644 --- a/drivers/virt/gunyah/vm_mgr_cma_mem.c +++ b/drivers/virt/gunyah/vm_mgr_cma_mem.c @@ -257,6 +257,9 @@ static long gunyah_cma_create_mem_fd(struct gunyah_cma *cma) struct file *file; int fd, err; + if (cma->page) + return -EBUSY; + flags |= O_CLOEXEC; fd = get_unused_fd_flags(flags); if (fd < 0) -- GitLab From 3503e439a98180e12e413c20d2e682392e87e237 Mon Sep 17 00:00:00 2001 From: Sooyong Suk Date: Wed, 9 Jul 2025 09:37:22 +0900 Subject: [PATCH 2103/2211] ANDROID: mm: add vendor hook to bypass gcma cleancache put page Cleancache put page operation is slower than just dropping file pages. So, I'd like to restrict gcma store page on some conditions. For example, direct reclaim contexts can bypass cleancache operation for better reclaim performance. Bug: 410432482 Change-Id: Ifc38b9b2912d1832dac5d2003ebd042683f78a1f Signed-off-by: Sooyong Suk --- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/mm.h | 3 +++ mm/gcma.c | 5 +++++ 3 files changed, 9 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index bbe3981ed0321..590fc921b89f6 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -578,6 +578,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shrink_node); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpuset_fork); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_uid); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_user); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gcma_cc_store_page_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gzvm_vcpu_exit_reason); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gzvm_handle_demand_page_pre); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gzvm_handle_demand_page_post); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 86dfd82b26611..4cc08294d9b0b 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -537,6 +537,9 @@ DECLARE_HOOK(android_vh_filemap_add_folio, TP_PROTO(struct address_space *mapping, struct folio *folio, pgoff_t index), TP_ARGS(mapping, folio, index)); +DECLARE_HOOK(android_vh_gcma_cc_store_page_bypass, + TP_PROTO(bool *bypass), + TP_ARGS(bypass)); #endif /* _TRACE_HOOK_MM_H */ /* This part must be outside protection */ diff --git a/mm/gcma.c b/mm/gcma.c index 503be698c8445..6fc98f3e9c2d8 100644 --- a/mm/gcma.c +++ b/mm/gcma.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "gcma_sysfs.h" /* @@ -747,7 +748,11 @@ static void gcma_cc_store_page(int hash_id, struct cleancache_filekey key, void *src, *dst; bool is_new = false; bool workingset = PageWorkingset(page); + bool bypass = false; + trace_android_vh_gcma_cc_store_page_bypass(&bypass); + if (bypass) + return; /* * This cleancache function is called under irq disabled so every * locks in this function should take of the irq if they are -- GitLab From 1707d0207517720f7318ed1f818638d8ebcfb1cd Mon Sep 17 00:00:00 2001 From: Sooyong Suk Date: Wed, 9 Jul 2025 10:22:24 +0900 Subject: [PATCH 2104/2211] ANDROID: GKI: update symbol list for galaxy 1 function symbol(s) added 'int __traceiter_android_vh_gcma_cc_store_page_bypass(void*, bool*)' 1 variable symbol(s) added 'struct tracepoint __tracepoint_android_vh_gcma_cc_store_page_bypass' Bug: 410432482 Change-Id: I76a66991a886a47892e102a3faa015d67c37cbfa Signed-off-by: Sooyong Suk --- gki/aarch64/abi.stg | 20 ++++++++++++++++++++ gki/aarch64/symbols/galaxy | 2 ++ 2 files changed, 22 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index b5ee8ab0afd88..5c3b8bbfe6ea8 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -433298,6 +433298,15 @@ elf_symbol { type_id: 0x9a2af11b full_name: "__traceiter_android_vh_futex_wake_up_q_finish" } +elf_symbol { + id: 0x8eab4d2c + name: "__traceiter_android_vh_gcma_cc_store_page_bypass" + is_defined: true + symbol_type: FUNCTION + crc: 0x0ef1f836 + type_id: 0x9be885da + full_name: "__traceiter_android_vh_gcma_cc_store_page_bypass" +} elf_symbol { id: 0x83b45f32 name: "__traceiter_android_vh_get_page_wmark" @@ -439571,6 +439580,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_futex_wake_up_q_finish" } +elf_symbol { + id: 0xf4cbea52 + name: "__tracepoint_android_vh_gcma_cc_store_page_bypass" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_gcma_cc_store_page_bypass" +} elf_symbol { id: 0x4756cfec name: "__tracepoint_android_vh_get_page_wmark" @@ -509432,6 +509450,7 @@ interface { symbol_id: 0xff623c2f symbol_id: 0x7fef736f symbol_id: 0x9fe60f0c + symbol_id: 0x8eab4d2c symbol_id: 0x83b45f32 symbol_id: 0x88586647 symbol_id: 0x0c91a472 @@ -510129,6 +510148,7 @@ interface { symbol_id: 0x0c310ebd symbol_id: 0x9b384a49 symbol_id: 0x828646be + symbol_id: 0xf4cbea52 symbol_id: 0x4756cfec symbol_id: 0xf18e312d symbol_id: 0xbc4cf318 diff --git a/gki/aarch64/symbols/galaxy b/gki/aarch64/symbols/galaxy index 0a279a59f60fa..37b5107ebd48f 100644 --- a/gki/aarch64/symbols/galaxy +++ b/gki/aarch64/symbols/galaxy @@ -53,6 +53,7 @@ __traceiter_android_vh_filemap_read __traceiter_android_vh_free_pages_ok_bypass __traceiter_android_vh_free_pages_prepare_bypass + __traceiter_android_vh_gcma_cc_store_page_bypass __traceiter_android_vh_is_fpsimd_save __traceiter_android_vh_logbuf __traceiter_android_vh_logbuf_pr_cont @@ -99,6 +100,7 @@ __tracepoint_android_vh_filemap_read __tracepoint_android_vh_free_pages_ok_bypass __tracepoint_android_vh_free_pages_prepare_bypass + __tracepoint_android_vh_gcma_cc_store_page_bypass __tracepoint_android_vh_is_fpsimd_save __tracepoint_android_vh_logbuf __tracepoint_android_vh_logbuf_pr_cont -- GitLab From d6034d0269cb83e3b64d9d824d21ec85a141b11b Mon Sep 17 00:00:00 2001 From: Sooyong Suk Date: Tue, 8 Jul 2025 17:40:01 +0900 Subject: [PATCH 2105/2211] ANDROID: mm: introduce gcma_stat_get function Introduce helper function to get gcma stats and move enum gcma_stat_type to include/linux/gcma.h. For debugging purposes, I'd like to print usage status of gcma area into kernel log via show_mem vendor hook and add gcma stats in /proc/meminfo via meminfo vendor hook. So let's export this helper function. Bug: 410432482 Change-Id: I1e4fd209c8a3037fba69ab2ed190f4c308477835 Signed-off-by: Sooyong Suk --- include/linux/gcma.h | 15 +++++++++++++++ mm/gcma_sysfs.c | 7 +++++++ mm/gcma_sysfs.h | 9 --------- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/include/linux/gcma.h b/include/linux/gcma.h index f61edd466d236..831180cd14836 100644 --- a/include/linux/gcma.h +++ b/include/linux/gcma.h @@ -5,6 +5,21 @@ #include #ifdef CONFIG_GCMA +enum gcma_stat_type { + STORED_PAGE, + LOADED_PAGE, + EVICTED_PAGE, + CACHED_PAGE, + DISCARDED_PAGE, + NUM_OF_GCMA_STAT, +}; + +#ifdef CONFIG_GCMA_SYSFS +u64 gcma_stat_get(enum gcma_stat_type type); +#else +static inline u64 gcma_stat_get(enum gcma_stat_type type) { return 0; } +#endif + extern void gcma_alloc_range(unsigned long start_pfn, unsigned long end_pfn); extern void gcma_free_range(unsigned long start_pfn, unsigned long end_pfn); extern int register_gcma_area(const char *name, phys_addr_t base, diff --git a/mm/gcma_sysfs.c b/mm/gcma_sysfs.c index a2a83c2c26611..c1eaabbb6fdb8 100644 --- a/mm/gcma_sysfs.c +++ b/mm/gcma_sysfs.c @@ -1,5 +1,6 @@ #include #include +#include #include "gcma_sysfs.h" extern struct kobject *vendor_mm_kobj; @@ -22,6 +23,12 @@ void gcma_stat_add(enum gcma_stat_type type, unsigned long delta) atomic64_add(delta, &gcma_stats[type]); } +u64 gcma_stat_get(enum gcma_stat_type type) +{ + return (u64)atomic64_read(&gcma_stats[type]); +} +EXPORT_SYMBOL_GPL(gcma_stat_get); + /* * This all compiles without CONFIG_SYSFS, but is a waste of space. */ diff --git a/mm/gcma_sysfs.h b/mm/gcma_sysfs.h index 161baac9341d5..cf93302b7e4f6 100644 --- a/mm/gcma_sysfs.h +++ b/mm/gcma_sysfs.h @@ -2,15 +2,6 @@ #ifndef __GCMA_SYSFS_H__ #define __GCMA_SYSFS_H__ -enum gcma_stat_type { - STORED_PAGE, - LOADED_PAGE, - EVICTED_PAGE, - CACHED_PAGE, - DISCARDED_PAGE, - NUM_OF_GCMA_STAT, -}; - #ifdef CONFIG_GCMA_SYSFS void gcma_stat_inc(enum gcma_stat_type type); void gcma_stat_dec(enum gcma_stat_type type); -- GitLab From 5f47bdeb07b884cc8be2cc98557fe44b4b73c955 Mon Sep 17 00:00:00 2001 From: Sooyong Suk Date: Tue, 8 Jul 2025 17:47:33 +0900 Subject: [PATCH 2106/2211] ANDROID: mm: add allocated and total pages for GCMA areas For statistical support, let's add allocated and total size of GCMA areas into gcma stats. Bug: 410432482 Change-Id: Ifcae950fb96d11af560a95c85376fcf5156cd35c Signed-off-by: Sooyong Suk --- include/linux/gcma.h | 2 ++ mm/gcma.c | 3 +++ mm/gcma_sysfs.c | 21 +++++++++++++++++++++ mm/gcma_sysfs.h | 3 +++ 4 files changed, 29 insertions(+) diff --git a/include/linux/gcma.h b/include/linux/gcma.h index 831180cd14836..a8aaf158f3829 100644 --- a/include/linux/gcma.h +++ b/include/linux/gcma.h @@ -6,11 +6,13 @@ #ifdef CONFIG_GCMA enum gcma_stat_type { + ALLOCATED_PAGE, STORED_PAGE, LOADED_PAGE, EVICTED_PAGE, CACHED_PAGE, DISCARDED_PAGE, + TOTAL_PAGE, NUM_OF_GCMA_STAT, }; diff --git a/mm/gcma.c b/mm/gcma.c index 6fc98f3e9c2d8..6a2eef774f80f 100644 --- a/mm/gcma.c +++ b/mm/gcma.c @@ -307,6 +307,7 @@ int register_gcma_area(const char *name, phys_addr_t base, phys_addr_t size) INIT_LIST_HEAD(&area->free_pages); spin_lock_init(&area->free_pages_lock); + gcma_stat_add(TOTAL_PAGE, page_count); for (i = 0; i < page_count; i++) { page = pfn_to_page(pfn + i); set_area_id(page, area_id); @@ -621,6 +622,7 @@ void gcma_alloc_range(unsigned long start_pfn, unsigned long end_pfn) __gcma_discard_range(area, s_pfn, e_pfn); } + gcma_stat_add(ALLOCATED_PAGE, end_pfn - start_pfn + 1); } EXPORT_SYMBOL_GPL(gcma_alloc_range); @@ -659,6 +661,7 @@ void gcma_free_range(unsigned long start_pfn, unsigned long end_pfn) } local_irq_enable(); + gcma_stat_sub(ALLOCATED_PAGE, end_pfn - start_pfn + 1); } EXPORT_SYMBOL_GPL(gcma_free_range); diff --git a/mm/gcma_sysfs.c b/mm/gcma_sysfs.c index c1eaabbb6fdb8..981cfa9b84aa9 100644 --- a/mm/gcma_sysfs.c +++ b/mm/gcma_sysfs.c @@ -23,6 +23,11 @@ void gcma_stat_add(enum gcma_stat_type type, unsigned long delta) atomic64_add(delta, &gcma_stats[type]); } +void gcma_stat_sub(enum gcma_stat_type type, unsigned long delta) +{ + atomic64_sub(delta, &gcma_stats[type]); +} + u64 gcma_stat_get(enum gcma_stat_type type) { return (u64)atomic64_read(&gcma_stats[type]); @@ -36,6 +41,13 @@ EXPORT_SYMBOL_GPL(gcma_stat_get); #define GCMA_ATTR_RO(_name) \ static struct kobj_attribute _name##_attr = __ATTR_RO(_name) +static ssize_t allocated_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return sysfs_emit(buf, "%llu\n", (u64)atomic64_read(&gcma_stats[ALLOCATED_PAGE])); +} +GCMA_ATTR_RO(allocated); + static ssize_t stored_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { @@ -71,12 +83,21 @@ static ssize_t discarded_show(struct kobject *kobj, } GCMA_ATTR_RO(discarded); +static ssize_t total_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return sysfs_emit(buf, "%llu\n", (u64)atomic64_read(&gcma_stats[TOTAL_PAGE])); +} +GCMA_ATTR_RO(total); + static struct attribute *gcma_attrs[] = { + &allocated_attr.attr, &stored_attr.attr, &loaded_attr.attr, &evicted_attr.attr, &cached_attr.attr, &discarded_attr.attr, + &total_attr.attr, NULL, }; ATTRIBUTE_GROUPS(gcma); diff --git a/mm/gcma_sysfs.h b/mm/gcma_sysfs.h index cf93302b7e4f6..b1dedf5804d88 100644 --- a/mm/gcma_sysfs.h +++ b/mm/gcma_sysfs.h @@ -6,11 +6,14 @@ void gcma_stat_inc(enum gcma_stat_type type); void gcma_stat_dec(enum gcma_stat_type type); void gcma_stat_add(enum gcma_stat_type type, unsigned long delta); +void gcma_stat_sub(enum gcma_stat_type type, unsigned long delta); #else /* CONFIG_GCMA_SYSFS */ static inline void gcma_stat_inc(enum gcma_stat_type type) {} static inline void gcma_stat_dec(enum gcma_stat_type type) {} static inline void gcma_stat_add(enum gcma_stat_type type, unsigned long delta) {} +static inline void gcma_stat_sub(enum gcma_stat_type type, + unsigned long delta) {} #endif /* CONFIG_GCMA_SYSFS */ #endif -- GitLab From 73009db42b370b0b3b36fc8714b603a8c0a6933f Mon Sep 17 00:00:00 2001 From: Sooyong Suk Date: Tue, 8 Jul 2025 18:35:29 +0900 Subject: [PATCH 2107/2211] ANDROID: GKI: update symbol list for galaxy 1 function symbol(s) added 'u64 gcma_stat_get(enum gcma_stat_type)' Bug: 410432482 Change-Id: If0d9a4a1e6d66dc541fcc209a8dd0b2ac0dfbe43 Signed-off-by: Sooyong Suk --- gki/aarch64/abi.stg | 53 ++++++++++++++++++++++++++++++++++++++ gki/aarch64/symbols/galaxy | 1 + 2 files changed, 54 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 5c3b8bbfe6ea8..7fbf007b57096 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -356821,6 +356821,44 @@ enumeration { } } } +enumeration { + id: 0x168da7aa + name: "gcma_stat_type" + definition { + underlying_type_id: 0x4585663f + enumerator { + name: "ALLOCATED_PAGE" + } + enumerator { + name: "STORED_PAGE" + value: 1 + } + enumerator { + name: "LOADED_PAGE" + value: 2 + } + enumerator { + name: "EVICTED_PAGE" + value: 3 + } + enumerator { + name: "CACHED_PAGE" + value: 4 + } + enumerator { + name: "DISCARDED_PAGE" + value: 5 + } + enumerator { + name: "TOTAL_PAGE" + value: 6 + } + enumerator { + name: "NUM_OF_GCMA_STAT" + value: 7 + } + } +} enumeration { id: 0x42ebe6bd name: "geni_se_xfer_mode" @@ -388568,6 +388606,11 @@ function { parameter_id: 0x6720d32f parameter_id: 0x4585663f } +function { + id: 0x5278baa1 + return_type_id: 0x92233392 + parameter_id: 0x168da7aa +} function { id: 0x5281433c return_type_id: 0x92233392 @@ -463838,6 +463881,15 @@ elf_symbol { type_id: 0x1c88dd20 full_name: "gcma_free_range" } +elf_symbol { + id: 0xc60a070d + name: "gcma_stat_get" + is_defined: true + symbol_type: FUNCTION + crc: 0x3ee65e01 + type_id: 0x5278baa1 + full_name: "gcma_stat_get" +} elf_symbol { id: 0xc3be8e53 name: "gen_pool_add_owner" @@ -512841,6 +512893,7 @@ interface { symbol_id: 0x4e154d27 symbol_id: 0xd338db76 symbol_id: 0x2e290469 + symbol_id: 0xc60a070d symbol_id: 0xc3be8e53 symbol_id: 0xc0d67a7b symbol_id: 0x838e302b diff --git a/gki/aarch64/symbols/galaxy b/gki/aarch64/symbols/galaxy index 37b5107ebd48f..0270d25119e14 100644 --- a/gki/aarch64/symbols/galaxy +++ b/gki/aarch64/symbols/galaxy @@ -13,6 +13,7 @@ free_hpage gcma_alloc_range gcma_free_range + gcma_stat_get generic_file_read_iter generic_perform_write get_pfnblock_flags_mask -- GitLab From abfec73c016d22fb26cd24a64c66ab86bf9496ef Mon Sep 17 00:00:00 2001 From: Ben Fennema Date: Sun, 20 Jul 2025 03:11:58 -0700 Subject: [PATCH 2108/2211] ANDROID: GKI: Update symbol list for Pixel Watch Bug: 433017856 Change-Id: I2636bfc0e0cf7d3b83458d724d3f463f81a6ba0b Signed-off-by: Ben Fennema --- BUILD.bazel | 1 + gki/aarch64/symbols/pixel_watch | 2356 +++++++++++++++++++++++++++++++ 2 files changed, 2357 insertions(+) create mode 100644 gki/aarch64/symbols/pixel_watch diff --git a/BUILD.bazel b/BUILD.bazel index 1ea48116232bc..ec7863ea9a192 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -198,6 +198,7 @@ filegroup( "gki/aarch64/symbols/mtktv", "gki/aarch64/symbols/oplus", "gki/aarch64/symbols/pixel", + "gki/aarch64/symbols/pixel_watch", "gki/aarch64/symbols/qcom", "gki/aarch64/symbols/rtkstb", "gki/aarch64/symbols/rtktv", diff --git a/gki/aarch64/symbols/pixel_watch b/gki/aarch64/symbols/pixel_watch new file mode 100644 index 0000000000000..a46d849cda7f2 --- /dev/null +++ b/gki/aarch64/symbols/pixel_watch @@ -0,0 +1,2356 @@ +[abi_symbol_list] + activate_task + add_cpu + add_device_randomness + add_timer + add_uevent_var + add_wait_queue + aes_encrypt + aes_expandkey + alloc_chrdev_region + alloc_etherdev_mqs + alloc_io_pgtable_ops + alloc_netdev_mqs + alloc_pages_exact_noprof + __alloc_pages_noprof + __alloc_skb + alloc_skb_with_frags + alloc_workqueue + alt_cb_patch_nops + amba_bustype + __amba_driver_register + amba_driver_unregister + android_rvh_probe_register + anon_inode_getfile + __arch_copy_from_user + __arch_copy_to_user + arch_freq_scale + arch_stack_walk + arch_timer_read_counter + argv_free + argv_split + arm64_use_ng_mappings + __arm_smccc_smc + atomic_notifier_call_chain + atomic_notifier_chain_register + atomic_notifier_chain_unregister + autoremove_wake_function + __auxiliary_device_add + auxiliary_device_init + __auxiliary_driver_register + auxiliary_driver_unregister + available_idle_cpu + backlight_device_get_by_type + backlight_device_register + backlight_device_set_brightness + backlight_device_unregister + __balance_callbacks + balance_push_callback + bcmp + __bitmap_andnot + __bitmap_clear + bitmap_find_next_zero_area_off + __bitmap_or + bitmap_print_to_pagebuf + __bitmap_set + __bitmap_weight + blocking_notifier_call_chain + blocking_notifier_chain_register + blocking_notifier_chain_unregister + bpf_trace_run1 + bpf_trace_run10 + bpf_trace_run11 + bpf_trace_run12 + bpf_trace_run2 + bpf_trace_run3 + bpf_trace_run4 + bpf_trace_run5 + bpf_trace_run6 + bpf_trace_run7 + bpf_trace_run8 + bpf_trace_run9 + build_skb + bus_find_device + bus_for_each_dev + bus_get_dev_root + bus_register + bus_unregister + call_rcu + cancel_delayed_work + cancel_delayed_work_sync + cancel_work_sync + capable + cdev_add + cdev_alloc + cdev_del + cdev_device_add + cdev_device_del + cdev_init + cgroup_taskset_first + cgroup_taskset_next + __check_object_size + check_zeroed_user + class_create + class_destroy + class_find_device + class_for_each_device + class_register + class_unregister + cleanup_srcu_struct + clear_page + clk_bulk_disable + clk_bulk_enable + clk_bulk_prepare + clk_bulk_put_all + clk_bulk_unprepare + __clk_determine_rate + clk_disable + clk_enable + clk_fixed_factor_ops + clk_fixed_rate_ops + clk_get + __clk_get_hw + __clk_get_name + clk_get_parent + clk_get_rate + clk_hw_determine_rate_no_reparent + clk_hw_get_flags + clk_hw_get_name + clk_hw_get_num_parents + clk_hw_get_parent + clk_hw_get_parent_by_index + clk_hw_get_rate + clk_hw_get_rate_range + clk_hw_is_enabled + clk_hw_is_prepared + clk_hw_register + clk_hw_round_rate + clk_hw_unregister + __clk_is_enabled + __clk_mux_determine_rate_closest + clk_prepare + clk_put + clk_restore_context + clk_round_rate + clk_set_parent + clk_set_rate + clk_sync_state + clk_unprepare + cma_alloc + cma_release + compat_ptr_ioctl + complete + complete_all + completion_done + component_add + component_bind_all + component_del + component_master_add_with_match + component_master_del + component_match_add_release + component_unbind_all + config_ep_by_speed + configfs_register_group + configfs_register_subsystem + configfs_unregister_group + configfs_unregister_subsystem + config_group_init + config_group_init_type_name + config_item_get + config_item_put + config_item_set_name + console_stop + console_suspend_enabled + __const_udelay + consume_skb + contig_page_data + copy_from_kernel_nofault + __copy_overflow + __cpu_active_mask + cpu_all_bits + cpu_bit_bitmap + __cpu_dying_mask + cpufreq_cpu_get + cpufreq_cpu_get_raw + cpufreq_cpu_put + cpufreq_disable_fast_switch + cpufreq_driver_fast_switch + cpufreq_driver_resolve_freq + __cpufreq_driver_target + cpufreq_enable_boost_support + cpufreq_enable_fast_switch + cpufreq_freq_attr_scaling_available_freqs + cpufreq_freq_attr_scaling_boost_freqs + cpufreq_generic_frequency_table_verify + cpufreq_get_driver_data + cpufreq_quick_get + cpufreq_register_driver + cpufreq_register_governor + cpufreq_unregister_driver + __cpuhp_remove_state + __cpuhp_setup_state + __cpuhp_setup_state_cpuslocked + cpuidle_governor_latency_req + cpuidle_register_governor + cpu_irqtime + cpu_latency_qos_add_request + cpu_latency_qos_remove_request + cpu_latency_qos_update_request + cpumask_any_and_distribute + __cpu_online_mask + cpu_pm_register_notifier + cpu_pm_unregister_notifier + __cpu_possible_mask + __cpu_present_mask + cpupri_find_fitness + cpu_scale + cpus_read_lock + cpus_read_unlock + cpu_subsys + cpu_topology + crc32_le + crypto_aead_encrypt + crypto_aead_setauthsize + crypto_aead_setkey + crypto_ahash_digest + crypto_ahash_setkey + crypto_alloc_aead + crypto_alloc_ahash + crypto_alloc_shash + crypto_alloc_skcipher + crypto_alloc_sync_skcipher + crypto_dequeue_request + crypto_destroy_tfm + crypto_enqueue_request + crypto_init_queue + crypto_register_aead + crypto_register_ahash + crypto_register_rng + crypto_register_rngs + crypto_register_skcipher + crypto_shash_final + crypto_shash_setkey + crypto_shash_update + crypto_skcipher_decrypt + crypto_skcipher_encrypt + crypto_skcipher_setkey + crypto_unregister_aead + crypto_unregister_ahash + crypto_unregister_rng + crypto_unregister_rngs + crypto_unregister_skcipher + css_next_child + csum_ipv6_magic + csum_partial + csum_tcpudp_nofold + _ctype + datagram_poll + deactivate_task + debugfs_attr_read + debugfs_attr_write + debugfs_create_atomic_t + debugfs_create_blob + debugfs_create_bool + debugfs_create_dir + debugfs_create_file + debugfs_create_file_unsafe + debugfs_create_u16 + debugfs_create_u32 + debugfs_create_u64 + debugfs_create_u8 + debugfs_create_ulong + debugfs_create_x32 + debugfs_create_x64 + debugfs_create_x8 + debugfs_file_get + debugfs_file_put + debugfs_lookup + debugfs_lookup_and_remove + debugfs_remove + debugfs_rename + dec_node_page_state + default_llseek + delayed_work_timer_fn + destroy_workqueue + dev_addr_mod + dev_alloc_name + __dev_change_net_namespace + dev_close + dev_coredumpm_timeout + dev_coredumpv + _dev_crit + dev_driver_string + _dev_err + dev_err_probe + devfreq_add_device + devfreq_add_governor + devfreq_remove_device + devfreq_remove_governor + devfreq_resume_device + devfreq_suspend_device + __dev_fwnode + __dev_get_by_index + dev_get_by_index + dev_get_by_name + dev_get_by_name_rcu + dev_get_regmap + dev_get_stats + device_add + device_add_groups + device_create + device_create_file + device_create_with_groups + device_del + device_destroy + device_find_child + device_for_each_child + device_get_child_node_count + device_get_dma_attr + device_get_match_data + device_get_next_child_node + device_initialize + device_link_add + device_match_fwnode + device_match_name + device_property_read_string + device_property_read_u16_array + device_property_read_u32_array + device_register + device_remove_file + device_rename + device_set_wakeup_capable + device_set_wakeup_enable + device_show_int + device_store_int + device_unregister + device_wakeup_disable + device_wakeup_enable + _dev_info + dev_iommu_priv_set + dev_kfree_skb_any_reason + __devm_add_action + __devm_alloc_percpu + devm_bitmap_zalloc + devm_blk_crypto_profile_init + devm_clk_bulk_get + devm_clk_bulk_get_all + devm_clk_get + devm_clk_get_enabled + devm_clk_get_optional + devm_clk_get_optional_enabled + devm_clk_hw_get_clk + devm_clk_hw_register + devm_clk_register + devm_extcon_dev_allocate + devm_extcon_dev_register + devm_extcon_dev_unregister + devm_free_irq + devm_gen_pool_create + devm_gpiod_get_optional + devm_gpio_request_one + devm_hwrng_register + devm_hwspin_lock_register + devm_iio_channel_get + devm_iio_device_alloc + __devm_iio_device_register + devm_input_allocate_device + devm_ioremap + devm_ioremap_resource + devm_ioremap_wc + devm_iounmap + devm_kasprintf + devm_kfree + devm_kmalloc + devm_kmemdup + devm_krealloc + devm_kstrdup + devm_kstrdup_const + devm_mbox_controller_register + devm_nvmem_cell_get + devm_nvmem_device_get + devm_nvmem_register + devm_of_clk_add_hw_provider + devm_of_icc_get + devm_of_iomap + devm_of_phy_get + devm_of_platform_populate + devm_phy_optional_get + devm_pinctrl_get + devm_pinctrl_put + devm_pinctrl_register + devm_platform_get_and_ioremap_resource + devm_platform_ioremap_resource + devm_platform_ioremap_resource_byname + devm_pm_runtime_enable + devm_power_supply_register + devm_pwm_get + devm_qcom_smem_state_get + devm_regmap_add_irq_chip + devm_regmap_del_irq_chip + devm_regmap_field_alloc + __devm_regmap_init + __devm_regmap_init_mmio_clk + __devm_regmap_init_spmi_ext + devm_regulator_bulk_get + devm_regulator_get + devm_regulator_get_exclusive + devm_regulator_get_optional + devm_regulator_put + devm_regulator_register + devm_regulator_register_notifier + devm_request_any_context_irq + __devm_request_region + devm_request_threaded_irq + __devm_reset_control_get + devm_reset_controller_register + devm_rproc_alloc + devm_rtc_allocate_device + __devm_rtc_register_device + devm_snd_soc_register_card + devm_spmi_controller_add + devm_spmi_controller_alloc + devm_thermal_of_cooling_device_register + devm_thermal_of_zone_register + devm_usb_get_phy_by_node + _dev_notice + dev_pm_clear_wake_irq + dev_pm_domain_attach_by_id + dev_pm_domain_attach_by_name + dev_pm_domain_detach + dev_pm_genpd_add_notifier + dev_pm_genpd_get_next_hrtimer + dev_pm_genpd_remove_notifier + dev_pm_genpd_set_hwmode + dev_pm_genpd_set_next_wakeup + dev_pm_genpd_set_performance_state + dev_pm_opp_add_dynamic + dev_pm_opp_adjust_voltage + dev_pm_opp_clear_config + dev_pm_opp_disable + dev_pm_opp_enable + dev_pm_opp_find_freq_ceil + dev_pm_opp_find_freq_exact + dev_pm_opp_find_freq_floor + dev_pm_opp_get_opp_count + dev_pm_opp_get_voltage + dev_pm_opp_of_add_table + dev_pm_opp_of_cpumask_remove_table + dev_pm_opp_of_find_icc_paths + dev_pm_opp_of_register_em + dev_pm_opp_of_remove_table + dev_pm_opp_put + dev_pm_opp_remove_all_dynamic + dev_pm_opp_set_config + dev_pm_opp_set_opp + dev_pm_opp_set_rate + dev_pm_opp_set_sharing_cpus + dev_pm_qos_add_notifier + dev_pm_qos_add_request + dev_pm_qos_remove_notifier + dev_pm_qos_remove_request + dev_pm_qos_update_request + dev_pm_set_wake_irq + __dev_queue_xmit + devres_add + __devres_alloc_node + devres_free + devres_release + dev_set_name + _dev_warn + disable_irq + disable_irq_nosync + disable_percpu_irq + divider_get_val + divider_recalc_rate + divider_ro_round_rate_parent + divider_round_rate_parent + dma_alloc_attrs + dma_alloc_pages + dma_async_device_register + dma_async_device_unregister + dma_async_tx_descriptor_init + dma_buf_attach + dma_buf_begin_cpu_access + dma_buf_begin_cpu_access_partial + dma_buf_detach + dma_buf_end_cpu_access + dma_buf_end_cpu_access_partial + dma_buf_export + dma_buf_fd + dma_buf_get + dma_buf_map_attachment_unlocked + dma_buf_put + dma_buf_unmap_attachment_unlocked + dma_buf_vmap_unlocked + dma_buf_vunmap_unlocked + dma_fence_add_callback + dma_fence_array_create + dma_fence_array_ops + dma_fence_chain_init + dma_fence_context_alloc + dma_fence_default_wait + dma_fence_enable_sw_signaling + dma_fence_free + dma_fence_get_status + dma_fence_init + dma_fence_release + dma_fence_remove_callback + dma_fence_signal + dma_fence_signal_locked + dma_fence_signal_timestamp_locked + dma_fence_wait_timeout + dma_free_attrs + dma_free_pages + dma_get_sgtable_attrs + dma_get_slave_channel + dma_heap_add + dma_heap_buffer_alloc + dma_heap_buffer_free + dma_heap_find + dma_heap_get_dev + dma_heap_get_drvdata + dma_heap_get_name + dmam_alloc_attrs + dma_map_page_attrs + dma_map_resource + dma_map_sg_attrs + dma_map_sgtable + dmam_free_coherent + dma_mmap_attrs + dma_release_channel + dma_request_chan + dma_resv_fini + dma_resv_get_singleton + dma_resv_init + dma_resv_wait_timeout + dma_set_coherent_mask + dma_set_mask + __dma_sync_sg_for_cpu + __dma_sync_sg_for_device + __dma_sync_single_for_cpu + __dma_sync_single_for_device + dma_unmap_page_attrs + dma_unmap_sg_attrs + do_trace_netlink_extack + double_rq_lock + do_wait_intr + down + down_interruptible + down_read + down_write + d_path + dput + drain_workqueue + driver_find_device + driver_register + driver_unregister + drm_add_edid_modes + drm_atomic_bridge_chain_disable + drm_atomic_bridge_chain_enable + drm_atomic_bridge_chain_post_disable + drm_atomic_bridge_chain_pre_enable + drm_atomic_commit + drm_atomic_get_connector_state + drm_atomic_get_crtc_state + drm_atomic_get_plane_state + drm_atomic_helper_check + drm_atomic_helper_cleanup_planes + drm_atomic_helper_commit_duplicated_state + drm_atomic_helper_commit_hw_done + drm_atomic_helper_commit_modeset_disables + drm_atomic_helper_commit_modeset_enables + drm_atomic_helper_commit_planes + __drm_atomic_helper_connector_destroy_state + __drm_atomic_helper_connector_duplicate_state + __drm_atomic_helper_connector_reset + __drm_atomic_helper_crtc_destroy_state + __drm_atomic_helper_crtc_duplicate_state + drm_atomic_helper_dirtyfb + drm_atomic_helper_disable_plane + drm_atomic_helper_duplicate_state + drm_atomic_helper_page_flip + __drm_atomic_helper_plane_duplicate_state + drm_atomic_helper_prepare_planes + drm_atomic_helper_set_config + drm_atomic_helper_shutdown + drm_atomic_helper_swap_state + drm_atomic_helper_update_legacy_modeset_state + drm_atomic_helper_update_plane + drm_atomic_helper_wait_for_fences + drm_atomic_helper_wait_for_vblanks + drm_atomic_set_crtc_for_connector + drm_atomic_set_crtc_for_plane + drm_atomic_set_fb_for_plane + drm_atomic_set_mode_for_crtc + drm_atomic_state_alloc + drm_atomic_state_clear + drm_atomic_state_default_clear + drm_atomic_state_default_release + __drm_atomic_state_free + drm_atomic_state_init + drm_bridge_attach + drm_bridge_chain_mode_set + drm_client_init + drm_client_modeset_commit_locked + drm_client_register + drm_compat_ioctl + drm_connector_attach_encoder + drm_connector_cleanup + drm_connector_init + drm_connector_list_iter_begin + drm_connector_list_iter_end + drm_connector_list_iter_next + drm_connector_unregister + drm_connector_update_edid_property + drm_crtc_cleanup + drm_crtc_handle_vblank + drm_crtc_init_with_planes + drm_crtc_send_vblank_event + drm_crtc_set_max_vblank_count + drm_crtc_vblank_get + drm_crtc_vblank_off + drm_crtc_vblank_on + drm_crtc_vblank_put + drm_crtc_vblank_reset + drm_crtc_wait_one_vblank + __drm_debug + drm_detect_hdmi_monitor + drm_dev_alloc + __drm_dev_dbg + drm_dev_printk + drm_dev_put + drm_dev_register + drm_dev_unregister + drm_encoder_cleanup + drm_encoder_init + __drm_err + drm_event_reserve_init_locked + drm_format_info + drm_framebuffer_init + drm_framebuffer_lookup + drm_gem_create_mmap_offset + drm_gem_fb_create_handle + drm_gem_fb_destroy + drm_gem_fb_get_obj + drm_gem_get_pages + drm_gem_handle_create + drm_gem_mmap + drm_gem_mmap_obj + drm_gem_object_free + drm_gem_object_init + drm_gem_object_lookup + drm_gem_object_release + drm_gem_private_object_init + drm_gem_put_pages + drm_gem_vm_close + drm_gem_vm_open + drm_get_edid + drm_get_format_info + drm_helper_mode_fill_fb_struct + drm_helper_probe_single_connector_modes + drm_ioctl + drm_is_current_master + drm_kms_helper_poll_disable + drm_kms_helper_poll_enable + drm_kms_helper_poll_fini + drm_kms_helper_poll_init + drm_mm_init + drm_mm_insert_node_in_range + drmm_mode_config_init + drm_mm_remove_node + drm_mm_takedown + drm_mode_config_cleanup + drm_mode_config_reset + drm_mode_copy + drm_mode_debug_printmodeline + drm_mode_duplicate + drm_mode_equal + drm_mode_match + drm_mode_object_find + drm_mode_object_get + drm_mode_object_put + drm_mode_probed_add + drm_modeset_acquire_fini + drm_modeset_acquire_init + drm_modeset_backoff + drm_mode_set_crtcinfo + drm_modeset_drop_locks + drm_modeset_lock + drm_modeset_lock_all_ctx + drm_mode_vrefresh + drm_object_attach_property + drm_object_property_set_value + drm_of_component_match_add + drm_open + drm_panel_add + drm_panel_init + drm_panel_remove + drm_plane_cleanup + drm_plane_create_rotation_property + drm_poll + drm_prime_gem_destroy + drm_prime_pages_to_sg + drm_printf + __drm_printfn_coredump + drm_property_blob_get + drm_property_blob_put + drm_property_create + drm_property_create_bitmask + drm_property_create_blob + drm_property_create_enum + drm_property_create_range + drm_property_lookup_blob + __drm_puts_coredump + drm_read + drm_release + drm_rotation_simplify + drm_send_event_locked + drm_set_preferred_mode + drm_universal_plane_init + drm_vblank_init + dst_release + dump_stack + edac_device_add_device + edac_device_alloc_ctl_info + edac_device_alloc_index + edac_device_del_device + edac_device_free_ctl_info + edac_device_handle_ce_count + edac_device_handle_ue_count + edac_op_state + enable_irq + enable_percpu_irq + ether_setup + eth_mac_addr + eth_type_trans + extcon_get_edev_by_phandle + extcon_get_edev_name + extcon_get_property + extcon_get_state + extcon_register_notifier + extcon_set_state + extcon_set_state_sync + fd_install + fget + _find_first_bit + _find_first_zero_bit + _find_next_bit + _find_next_zero_bit + find_vma + find_vma_intersection + find_vpid + finish_wait + firmware_request_nowarn + flush_delayed_work + flush_work + __flush_workqueue + __folio_put + __fortify_panic + fput + free_io_pgtable_ops + free_irq + free_netdev + __free_pages + free_pages + free_pages_exact + free_percpu + free_percpu_irq + free_reserved_page + freq_qos_add_request + freq_qos_remove_request + freq_qos_update_request + fwnode_find_reference + fwnode_get_name + fwnode_get_next_child_node + fwnode_handle_get + fwnode_irq_get + fwnode_property_present + fwnode_property_read_string + fwnode_property_read_u32_array + fwnode_typec_switch_get + gcd + generic_device_group + generic_handle_domain_irq + generic_handle_irq + geni_icc_disable + geni_icc_enable + geni_icc_get + geni_icc_set_bw + geni_se_clk_freq_match + geni_se_config_packing + geni_se_get_qup_hw_version + geni_se_init + geni_se_resources_off + geni_se_resources_on + geni_se_rx_dma_prep + geni_se_rx_dma_unprep + geni_se_select_mode + geni_se_tx_dma_prep + geni_se_tx_dma_unprep + genlmsg_multicast_allns + genlmsg_put + genl_register_family + genl_unregister_family + gen_pool_add_owner + gen_pool_alloc_algo_owner + gen_pool_avail + gen_pool_best_fit + gen_pool_create + gen_pool_destroy + gen_pool_first_fit_order_align + gen_pool_free_owner + gen_pool_has_addr + gen_pool_set_algo + gen_pool_size + gen_pool_virt_to_phys + getboottime64 + get_cpu_device + get_device + get_free_pages_noprof + get_governor_parent_kobj + get_net_ns_by_fd + get_net_ns_by_pid + get_pid_task + get_random_bytes + get_random_u32 + __get_task_comm + get_task_mm + get_task_pid + __get_unmapped_area + get_unused_fd_flags + get_user_ifreq + get_user_pages + get_zeroed_page_noprof + glob_match + gov_attr_set_init + gov_attr_set_put + governor_sysfs_ops + gpiochip_add_data_with_key + gpiochip_add_pin_range + gpiochip_disable_irq + gpiochip_enable_irq + gpiochip_generic_free + gpiochip_generic_request + gpiochip_get_data + gpiochip_irq_relres + gpiochip_irq_reqres + gpiochip_line_is_valid + gpiochip_lock_as_irq + gpiochip_populate_parent_fwspec_fourcell + gpiochip_remove + gpiochip_unlock_as_irq + gpiod_direction_input + gpiod_direction_output + gpiod_direction_output_raw + gpiod_get_optional + gpiod_get_raw_value + gpiod_get_raw_value_cansleep + gpiod_get_value + gpiod_set_raw_value + gpiod_set_value_cansleep + gpiod_to_irq + gpio_free + gpio_request + gpio_request_one + gpio_to_desc + gro_cells_destroy + gro_cells_init + gro_cells_receive + handle_bad_irq + handle_edge_irq + handle_fasteoi_ack_irq + handle_fasteoi_irq + handle_level_irq + handle_nested_irq + handle_simple_irq + handle_sysrq + hashlen_string + hex2bin + hex_dump_to_buffer + hex_to_bin + housekeeping_cpumask + housekeeping_overridden + housekeeping_test_cpu + hrtimer_active + hrtimer_cancel + hrtimer_forward + __hrtimer_get_remaining + hrtimer_init + hrtimer_start_range_ns + hrtimer_try_to_cancel + hw_pressure + hwrng_register + hwrng_unregister + hwspin_lock_bust + hwspin_lock_free + hwspin_lock_request_specific + __hwspin_lock_timeout + __hwspin_unlock + i2c_add_adapter + i2c_del_adapter + i2c_get_dma_safe_msg_buf + i2c_put_dma_safe_msg_buf + i2c_transfer + icc_link_create + icc_node_add + icc_node_create + icc_nodes_remove + icc_provider_deregister + icc_provider_init + icc_provider_register + icc_put + icc_set_bw + icc_set_tag + icc_std_aggregate + icc_sync_state + ida_alloc_range + ida_destroy + ida_free + idr_alloc + idr_alloc_cyclic + idr_alloc_u32 + idr_destroy + idr_find + idr_for_each + idr_get_next + idr_preload + idr_remove + idr_replace + iio_read_channel_processed + in4_pton + in6_pton + inc_node_page_state + in_egroup_p + inet_csk_get_port + init_dummy_netdev + init_iova_domain + init_net + __init_rwsem + init_srcu_struct + __init_swait_queue_head + init_task + init_timer_key + init_uts_ns + init_wait_entry + __init_waitqueue_head + input_close_device + input_event + input_open_device + input_register_device + input_register_handle + input_register_handler + input_set_capability + input_unregister_handle + input_unregister_handler + interval_tree_insert + interval_tree_iter_first + interval_tree_iter_next + interval_tree_remove + int_sqrt + iomem_resource + iommu_alloc_resv_region + iommu_attach_device + iommu_detach_device + iommu_device_register + iommu_device_sysfs_add + iommu_device_sysfs_remove + iommu_device_unregister + iommu_dma_get_resv_regions + iommu_domain_alloc + iommu_domain_free + iommu_fwspec_add_ids + iommu_fwspec_free + iommu_get_domain_for_dev + iommu_get_msi_cookie + iommu_group_for_each_dev + iommu_group_get + iommu_group_get_iommudata + iommu_group_put + iommu_group_ref_get + iommu_group_set_iommudata + iommu_iova_to_phys + iommu_map + iommu_map_sg + iommu_present + iommu_put_resv_regions + iommu_set_fault_handler + iommu_set_pgtable_quirks + iommu_unmap + ioremap_prot + iounmap + __iowrite32_copy_full + ip_compute_csum + ip_route_output_flow + __ipv6_addr_type + ipv6_ext_hdr + ipv6_skip_exthdr + ipv6_stub + __irq_apply_affinity_hint + irq_check_status_bit + irq_chip_ack_parent + irq_chip_disable_parent + irq_chip_enable_parent + irq_chip_eoi_parent + irq_chip_get_parent_state + irq_chip_mask_parent + irq_chip_retrigger_hierarchy + irq_chip_set_affinity_parent + irq_chip_set_parent_state + irq_chip_set_type_parent + irq_chip_set_vcpu_affinity_parent + irq_chip_set_wake_parent + irq_chip_unmask_parent + irq_create_fwspec_mapping + irq_create_mapping_affinity + irq_dispose_mapping + irq_domain_alloc_irqs_parent + irq_domain_create_hierarchy + irq_domain_disconnect_hierarchy + irq_domain_free_irqs_common + irq_domain_instantiate + irq_domain_remove + irq_domain_set_hwirq_and_chip + irq_domain_set_info + irq_domain_translate_twocell + irq_domain_update_bus_token + irq_domain_xlate_onecell + irq_domain_xlate_twocell + irq_do_set_affinity + irq_find_matching_fwspec + irq_get_irqchip_state + irq_get_irq_data + irq_modify_status + irq_of_parse_and_map + __irq_resolve_mapping + irq_set_affinity_notifier + irq_set_chained_handler_and_data + irq_set_chip_and_handler_name + irq_set_chip_data + irq_set_irqchip_state + irq_set_irq_type + irq_set_irq_wake + irq_set_parent + irq_to_desc + irq_work_queue + irq_work_queue_on + irq_work_sync + is_vmalloc_addr + jiffies + jiffies_to_msecs + jiffies_to_usecs + kasan_flag_enabled + kasprintf + kernel_bind + kernel_connect + kernel_getsockname + kernel_kobj + kernel_power_off + kernel_recvmsg + kernel_sendmsg + kernfs_find_and_get_ns + kernfs_notify + kernfs_put + key_put + keyring_alloc + __kfifo_out + __kfifo_out_linear + kfree + kfree_const + kfree_sensitive + kimage_voffset + __kmalloc_cache_node_noprof + __kmalloc_cache_noprof + kmalloc_caches + __kmalloc_large_noprof + __kmalloc_noprof + kmem_cache_alloc_noprof + __kmem_cache_create_args + kmem_cache_destroy + kmem_cache_free + kmemdup_array + kmemdup_noprof + kmsg_dump_get_buffer + kmsg_dump_get_line + kmsg_dump_rewind + kobject_add + kobject_create_and_add + kobject_del + kobject_init + kobject_init_and_add + kobject_put + kobject_set_name + kobject_uevent + kobject_uevent_env + kobj_sysfs_ops + krealloc_noprof + kset_create_and_add + kset_find_obj + kset_unregister + ksize + ksoftirqd + kstat_irqs_usr + kstrdup + kstrdup_const + kstrdup_quotable_cmdline + kstrndup + kstrtobool + kstrtobool_from_user + kstrtoint + kstrtoint_from_user + kstrtoll + kstrtos8 + kstrtos8_from_user + kstrtou16 + kstrtou16_from_user + kstrtou8 + kstrtou8_from_user + kstrtouint + kstrtouint_from_user + kstrtoull + kstrtoull_from_user + kthread_bind_mask + kthread_cancel_delayed_work_sync + kthread_cancel_work_sync + kthread_complete_and_exit + kthread_create_on_node + kthread_create_worker + kthread_delayed_work_timer_fn + kthread_destroy_worker + kthread_flush_work + kthread_flush_worker + __kthread_init_worker + kthread_mod_delayed_work + kthread_queue_delayed_work + kthread_queue_work + kthread_should_stop + kthread_stop + kthread_worker_fn + ktime_get + ktime_get_coarse_with_offset + ktime_get_mono_fast_ns + ktime_get_raw + ktime_get_real_seconds + ktime_get_real_ts64 + ktime_get_with_offset + kvasprintf_const + kvfree + kvfree_call_rcu + __kvmalloc_node_noprof + __list_add_valid_or_report + __list_del_entry_valid_or_report + list_sort + llist_add_batch + llist_reverse_order + __local_bh_enable_ip + lock_sock_nested + log_post_read_mmio + log_post_write_mmio + log_read_mmio + log_write_mmio + loops_per_jiffy + __lruvec_stat_mod_folio + mac_pton + mas_find + match_string + mbox_chan_received_data + mbox_chan_txdone + mbox_client_txdone + mbox_controller_register + mbox_controller_unregister + mbox_free_channel + mbox_request_channel + mbox_send_message + mem_alloc_profiling_key + __memcat_p + memchr + memcmp + memcpy + memcpy_and_pad + __memcpy_fromio + __memcpy_toio + memdup_user + memdup_user_nul + memmove + memory_read_from_buffer + memparse + mempool_alloc_noprof + mempool_alloc_slab + mempool_create_node_noprof + mempool_destroy + mempool_free + mempool_free_slab + memremap + mem_section + memset + __memset_io + memstart_addr + memunmap + migrate_swap + __migrate_task + mipi_dsi_create_packet + mipi_dsi_dcs_set_display_brightness + mipi_dsi_dcs_set_tear_off + mipi_dsi_dcs_write + mipi_dsi_host_register + mipi_dsi_host_unregister + misc_deregister + misc_register + __mmap_lock_do_trace_acquire_returned + __mmap_lock_do_trace_released + __mmap_lock_do_trace_start_locking + mmc_add_host + mmc_cqe_request_done + mmc_detect_change + mmc_of_parse + mmc_regulator_get_supply + mmc_regulator_set_ocr + mmc_regulator_set_vqmmc + mmc_remove_host + mmc_send_tuning + mmc_set_data_timeout + mmc_wait_for_cmd + mmc_wait_for_req + mm_get_unmapped_area + mmput + mod_delayed_work_on + mod_node_page_state + mod_timer + __module_get + module_layout + module_put + __msecs_to_jiffies + msi_domain_get_virq + msleep + msleep_interruptible + mtree_load + __mutex_init + mutex_is_locked + mutex_lock + mutex_lock_interruptible + mutex_trylock + mutex_unlock + napi_complete_done + napi_disable + napi_enable + napi_gro_flush + __napi_schedule + napi_schedule_prep + neigh_destroy + neigh_resolve_output + __netdev_alloc_skb + netdev_core_stats_inc + netdev_err + netdev_rx_handler_register + netdev_rx_handler_unregister + netdev_update_features + netif_carrier_off + netif_carrier_on + netif_device_attach + netif_device_detach + netif_napi_add_weight + __netif_napi_del + netif_receive_skb + netif_receive_skb_list + __netif_rx + netif_rx + netif_tx_lock + netif_tx_stop_all_queues + netif_tx_unlock + netif_tx_wake_queue + netlink_broadcast + netlink_broadcast_filtered + __netlink_kernel_create + netlink_kernel_release + netlink_register_notifier + netlink_unicast + netlink_unregister_notifier + net_ns_type_operations + nla_find + nla_memcpy + __nla_parse + nla_put + nla_put_64bit + nla_reserve + __nla_validate + __nlmsg_put + nonseekable_open + noop_llseek + nr_cpu_ids + nr_ipi_get + nr_irqs + ns_capable + nsecs_to_jiffies + ns_to_timespec64 + __num_online_cpus + nvmem_cell_get + nvmem_cell_put + nvmem_cell_read + nvmem_cell_read_u32 + nvmem_cell_read_u8 + nvmem_cell_read_variable_le_u32 + nvmem_cell_write + nvmem_device_read + of_address_to_resource + of_alias_from_compatible + of_alias_get_id + of_clk_add_hw_provider + of_clk_add_provider + of_clk_del_provider + of_clk_hw_simple_get + of_clk_src_onecell_get + of_clk_src_simple_get + of_count_phandle_with_args + of_cpu_device_node_get + of_cpu_node_to_id + of_device_get_match_data + of_device_is_available + of_device_is_compatible + of_device_uevent_modalias + of_dma_configure_id + of_dma_controller_free + of_dma_controller_register + of_dma_is_coherent + of_drm_find_bridge + of_drm_find_panel + of_find_compatible_node + of_find_device_by_node + of_find_matching_node_and_match + of_find_node_by_name + of_find_node_by_phandle + of_find_node_opts_by_path + of_find_node_with_property + of_find_property + of_fwnode_ops + of_genpd_add_provider_onecell + of_genpd_add_provider_simple + of_genpd_del_provider + __of_get_address + of_get_child_by_name + of_get_cpu_node + of_get_named_gpio + of_get_next_available_child + of_get_next_child + of_get_next_parent + of_get_parent + of_get_property + of_get_regulator_init_data + of_get_required_opp_performance_state + of_graph_get_next_endpoint + of_graph_get_port_parent + of_graph_get_remote_endpoint + of_graph_get_remote_node + of_graph_get_remote_port_parent + of_graph_is_present + of_graph_parse_endpoint + of_hwspin_lock_get_id + of_icc_get + of_icc_xlate_onecell + of_iomap + of_irq_find_parent + of_irq_get + of_irq_get_byname + of_match_device + of_match_node + of_n_addr_cells + of_node_name_eq + of_n_size_cells + __of_parse_phandle_with_args + of_phandle_iterator_init + of_phandle_iterator_next + of_platform_depopulate + of_platform_device_create + of_platform_device_destroy + of_platform_populate + of_property_count_elems_of_size + of_property_match_string + of_property_read_reg + of_property_read_string + of_property_read_string_helper + of_property_read_u32_index + of_property_read_u64 + of_property_read_variable_u16_array + of_property_read_variable_u32_array + of_property_read_variable_u64_array + of_property_read_variable_u8_array + of_prop_next_string + of_prop_next_u32 + of_reserved_mem_device_init_by_idx + of_reserved_mem_device_release + of_reserved_mem_lookup + on_each_cpu_cond_mask + page_pinner_inited + __page_pinner_put_page + panic + panic_notifier_list + panic_timeout + param_array_ops + param_get_int + param_get_string + param_ops_bool + param_ops_charp + param_ops_int + param_ops_string + param_ops_uint + param_ops_ullong + param_set_copystring + param_set_int + pci_bus_type + pci_clear_master + pci_device_group + pci_disable_device + pci_enable_device + pci_read_config_dword + pci_read_config_word + pci_release_region + pci_request_region + pci_set_master + pci_write_config_dword + pci_write_config_word + pcpu_alloc_noprof + __per_cpu_offset + per_cpu_ptr_to_phys + perf_aux_output_begin + perf_aux_output_end + perf_aux_output_flag + perf_event_create_kernel_counter + perf_event_enable + perf_event_read_local + perf_event_read_value + perf_event_release_kernel + perf_get_aux + perf_pmu_register + perf_pmu_unregister + perf_report_aux_output_id + perf_trace_buf_alloc + perf_trace_run_bpf_submit + phy_exit + phy_init + phy_power_off + phy_power_on + phy_set_mode_ext + pick_highest_pushable_task + pick_task + pinconf_generic_dt_node_to_map + pinctrl_dev_get_drvdata + pinctrl_force_default + pinctrl_force_sleep + pinctrl_lookup_state + pinctrl_pm_select_default_state + pinctrl_pm_select_sleep_state + pinctrl_select_state + pinctrl_utils_free_map + platform_bus_type + platform_device_add + platform_device_add_data + platform_device_alloc + platform_device_msi_free_irqs_all + platform_device_msi_init_and_alloc_irqs + platform_device_put + platform_device_register_full + platform_device_unregister + __platform_driver_register + platform_driver_unregister + platform_get_irq + platform_get_irq_byname + platform_get_irq_byname_optional + platform_get_irq_optional + platform_get_resource + platform_get_resource_byname + platform_irqchip_probe + platform_irq_count + pm_clk_add + pm_clk_create + pm_clk_destroy + pm_clk_resume + pm_clk_suspend + pm_generic_resume + pm_generic_suspend + pm_genpd_add_device + pm_genpd_add_subdomain + pm_genpd_init + pm_genpd_remove + pm_genpd_remove_device + pm_genpd_remove_subdomain + pm_power_off + __pm_relax + pm_relax + pm_runtime_allow + pm_runtime_autosuspend_expiration + pm_runtime_barrier + __pm_runtime_disable + pm_runtime_enable + pm_runtime_forbid + pm_runtime_force_resume + pm_runtime_force_suspend + __pm_runtime_idle + pm_runtime_irq_safe + pm_runtime_no_callbacks + __pm_runtime_resume + pm_runtime_set_autosuspend_delay + __pm_runtime_set_status + __pm_runtime_suspend + __pm_runtime_use_autosuspend + __pm_stay_awake + pm_stay_awake + pm_suspend_target_state + pm_system_wakeup + pm_wakeup_dev_event + pm_wakeup_ws_event + policy_has_boost_freq + power_supply_changed + power_supply_get_by_name + power_supply_get_drvdata + power_supply_get_property + power_supply_put + power_supply_reg_notifier + power_supply_set_property + power_supply_unreg_notifier + preempt_schedule + preempt_schedule_notrace + prepare_to_wait_event + print_hex_dump + _printk + _printk_deferred + proc_create_data + proc_dointvec + proc_dointvec_minmax + proc_dostring + proc_douintvec_minmax + proc_mkdir + proc_remove + proto_register + proto_unregister + __pskb_copy_fclone + pskb_expand_head + __pskb_pull_tail + ___pskb_trim + put_device + put_iova_domain + __put_net + put_pid + __put_task_struct + put_unused_fd + put_user_ifreq + pwm_apply_might_sleep + qcom_icc_xlate_extended + qcom_smem_state_get + qcom_smem_state_register + qcom_smem_state_unregister + qcom_smem_state_update_bits + queue_delayed_work_on + queue_work_on + radix_tree_delete_item + radix_tree_insert + radix_tree_iter_delete + radix_tree_lookup + radix_tree_next_chunk + ___ratelimit + rational_best_approximation + raw_notifier_call_chain + raw_notifier_chain_register + raw_notifier_chain_unregister + _raw_read_lock + _raw_read_lock_bh + _raw_read_lock_irq + _raw_read_lock_irqsave + _raw_read_unlock + _raw_read_unlock_bh + _raw_read_unlock_irq + _raw_read_unlock_irqrestore + _raw_spin_lock + _raw_spin_lock_bh + _raw_spin_lock_irq + _raw_spin_lock_irqsave + raw_spin_rq_lock_nested + raw_spin_rq_unlock + _raw_spin_trylock + _raw_spin_trylock_bh + _raw_spin_unlock + _raw_spin_unlock_bh + _raw_spin_unlock_irq + _raw_spin_unlock_irqrestore + _raw_write_lock + _raw_write_lock_bh + _raw_write_lock_irq + _raw_write_lock_irqsave + _raw_write_unlock + _raw_write_unlock_bh + _raw_write_unlock_irq + _raw_write_unlock_irqrestore + rb_erase + rb_first + rb_insert_color + rb_last + rb_next + rb_prev + __rcu_read_lock + __rcu_read_unlock + rdev_get_drvdata + reboot_mode + rebuild_sched_domains + refcount_dec_and_mutex_lock + refcount_dec_not_one + refcount_warn_saturate + regcache_cache_bypass + regcache_cache_only + regcache_mark_dirty + regcache_sync + regcache_sync_region + __register_chrdev + register_console + register_die_notifier + register_ftrace_export + register_inet6addr_notifier + register_inetaddr_notifier + register_kretprobe + register_module_notifier + register_netdev + register_netdevice + register_netdevice_notifier + register_netevent_notifier + register_pernet_device + register_pm_notifier + register_reboot_notifier + register_restart_handler + __register_rpmsg_driver + register_syscore_ops + register_sysctl_sz + regmap_bulk_read + regmap_bulk_write + regmap_field_read + regmap_field_update_bits_base + __regmap_init + regmap_irq_get_virq + regmap_mmio_detach_clk + regmap_read + regmap_update_bits_base + regmap_write + regulator_allow_bypass + regulator_bulk_disable + regulator_count_voltages + regulator_disable + regulator_enable + regulator_force_disable + regulator_get + regulator_get_mode + regulator_get_optional + regulator_get_voltage + regulator_get_voltage_rdev + regulator_is_enabled + regulator_is_supported_voltage + regulator_list_voltage_linear + regulator_notifier_call_chain + regulator_put + regulator_register_notifier + regulator_set_load + regulator_set_mode + regulator_set_voltage + regulator_unregister_notifier + release_firmware + release_sock + remap_pfn_range + remove_cpu + remove_proc_entry + remove_proc_subtree + remove_wait_queue + report_iommu_fault + request_firmware + request_firmware_into_buf + request_firmware_nowait + __request_percpu_irq + request_threaded_irq + resched_curr + reset_control_assert + reset_control_deassert + reset_control_reset + return_address + rfkill_alloc + rfkill_blocked + rfkill_destroy + rfkill_register + rfkill_resume_polling + rfkill_set_hw_state_reason + rfkill_unregister + root_task_group + rpmsg_poll + rpmsg_register_device + rpmsg_register_device_override + rpmsg_send + rpmsg_trysend + rpmsg_unregister_device + rproc_add + rproc_add_subdev + rproc_boot + rproc_coredump + rproc_coredump_add_custom_segment + rproc_coredump_add_segment + rproc_coredump_cleanup + rproc_coredump_set_elf_info + rproc_del + rproc_get_by_child + rproc_get_by_phandle + rproc_put + rproc_remove_subdev + rproc_report_crash + rproc_set_firmware + rproc_shutdown + rtc_time64_to_tm + rtc_tm_to_time64 + rtc_update_irq + rtnl_is_locked + rtnl_link_register + rtnl_link_unregister + rtnl_lock + rtnl_trylock + rtnl_unicast + rtnl_unlock + runqueues + scatterwalk_ffwd + scatterwalk_map_and_copy + sched_clock + sched_feat_keys + sched_feat_names + sched_setattr + sched_set_fifo + sched_set_fifo_low + sched_set_normal + sched_setscheduler + sched_setscheduler_nocheck + sched_uclamp_used + schedule + schedule_timeout + schedule_timeout_interruptible + scmi_driver_register + scmi_driver_unregister + scmi_protocol_register + scmi_protocol_unregister + scnprintf + __sdhci_add_host + sdhci_add_host + sdhci_cleanup_host + sdhci_cqe_disable + sdhci_cqe_enable + sdhci_cqe_irq + sdhci_enable_clk + sdhci_get_property + sdhci_pltfm_free + sdhci_pltfm_init + sdhci_remove_host + sdhci_reset + sdhci_set_bus_width + sdhci_set_power_noreg + __sdhci_set_timeout + sdhci_setup_host + sdio_claim_host + sdio_claim_irq + sdio_disable_func + sdio_enable_func + sdio_get_host_pm_caps + sdio_memcpy_toio + sdio_readb + sdio_readl + sdio_readsb + __sdio_register_driver + sdio_release_host + sdio_release_irq + sdio_set_block_size + sdio_set_host_pm_flags + sdio_unregister_driver + sdio_writeb + sdio_writel + sdio_writesb + select_fallback_rq + send_sig_info + seq_buf_printf + seq_hex_dump + seq_lseek + seq_open + seq_printf + seq_putc + __seq_puts + seq_read + seq_release + seq_vprintf + seq_write + set_cpus_allowed_ptr + set_normalized_timespec64 + set_page_dirty_lock + set_task_cpu + set_user_nice + sg_alloc_table + sg_alloc_table_from_pages_segment + sg_copy_from_buffer + sg_copy_to_buffer + sg_free_table + sg_init_one + sg_init_table + sg_miter_next + sg_miter_start + sg_miter_stop + sg_next + __sg_page_iter_dma_next + __sg_page_iter_next + __sg_page_iter_start + shmem_read_mapping_page_gfp + show_regs + shrinker_alloc + shrinker_free + shrinker_register + simple_attr_open + simple_attr_release + simple_open + simple_read_from_buffer + simple_write_to_buffer + single_open + single_release + sized_strscpy + sk_alloc + skb_add_rx_frag_netmem + skb_append_pagefrags + skb_checksum + skb_clone + skb_coalesce_rx_frag + skb_copy + skb_copy_bits + skb_copy_datagram_from_iter + skb_copy_datagram_iter + skb_copy_expand + skb_dequeue + skb_free_datagram + __skb_gso_segment + __skb_pad + skb_pull + skb_push + skb_put + skb_queue_head + skb_queue_purge_reason + skb_queue_tail + skb_recv_datagram + skb_set_owner_w + skb_store_bits + skb_trim + skb_unlink + sk_error_report + sk_free + skip_spaces + sk_skb_reason_drop + smp_call_function_single + smp_call_function_single_async + snd_info_create_card_entry + snd_info_create_module_entry + snd_info_free_entry + snd_info_register + snd_jack_set_key + snd_pcm_format_width + snd_soc_add_component_controls + snd_soc_card_get_kcontrol + snd_soc_card_jack_new + snd_soc_component_exit_regmap + snd_soc_component_init_regmap + snd_soc_component_read + snd_soc_component_update_bits + snd_soc_component_write + snd_soc_dai_get_channel_map + snd_soc_dapm_add_routes + snd_soc_dapm_disable_pin + snd_soc_dapm_force_enable_pin + snd_soc_dapm_get_enum_double + snd_soc_dapm_get_volsw + snd_soc_dapm_ignore_suspend + snd_soc_dapm_kcontrol_widget + snd_soc_dapm_mux_update_power + snd_soc_dapm_new_controls + snd_soc_dapm_new_widgets + snd_soc_dapm_put_enum_double + snd_soc_dapm_put_volsw + snd_soc_dapm_sync + snd_soc_get_pcm_runtime + snd_soc_get_volsw + snd_soc_info_enum_double + snd_soc_info_volsw + snd_soc_jack_report + snd_soc_lookup_component + snd_soc_of_parse_card_name + snd_soc_pm_ops + snd_soc_put_volsw + snd_soc_register_component + snd_soc_rtdcom_lookup + snd_soc_set_runtime_hwparams + snd_soc_unregister_card + snd_soc_unregister_component + snprintf + soc_device_register + soc_device_unregister + sock_alloc_send_pskb + __sock_create + sock_create_kern + sock_gettstamp + sock_init_data + sock_no_accept + sock_no_listen + sock_no_mmap + sock_no_socketpair + sock_queue_rcv_skb_reason + sock_register + sock_release + sock_setsockopt + sock_unregister + sort + __spi_alloc_controller + spi_register_controller + __spi_register_driver + spi_sync + spi_unregister_controller + spmi_controller_add + spmi_controller_alloc + spmi_controller_remove + __spmi_driver_register + spmi_find_device_by_of_node + sprintf + sprint_symbol + srcu_init_notifier_head + srcu_notifier_call_chain + srcu_notifier_chain_register + srcu_notifier_chain_unregister + __srcu_read_lock + __srcu_read_unlock + sscanf + __stack_chk_fail + static_key_disable + stop_machine + stop_one_cpu + stop_one_cpu_nowait + strcasecmp + strchr + strchrnul + strcmp + strcpy + strim + strlen + strncasecmp + strnchr + strncmp + strnlen + strnstr + strpbrk + strrchr + strsep + strstr + __sw_hweight16 + __sw_hweight32 + __sw_hweight64 + __sw_hweight8 + sync_file_create + sync_file_get_fence + synchronize_irq + synchronize_net + synchronize_rcu + synchronize_srcu + syscon_node_to_regmap + syscon_regmap_lookup_by_phandle + sysctl_sched_features + sysctl_vals + sysfs_add_file_to_group + sysfs_add_link_to_group + sysfs_create_bin_file + sysfs_create_file_ns + sysfs_create_files + sysfs_create_group + sysfs_create_link + sysfs_emit + sysfs_emit_at + sysfs_notify + sysfs_remove_bin_file + sysfs_remove_file_from_group + sysfs_remove_file_ns + sysfs_remove_files + sysfs_remove_group + sysfs_remove_groups + sysfs_remove_link + sysfs_remove_link_from_group + sysfs_streq + sysrq_mask + system_32bit_el0_cpumask + system_highpri_wq + system_power_efficient_wq + system_state + system_unbound_wq + system_wq + sys_tz + tasklet_init + tasklet_kill + __tasklet_schedule + tasklet_setup + tasklet_unlock_wait + tasklist_lock + __task_rq_lock + task_rq_lock + thermal_cdev_update + thermal_cooling_device_register + thermal_cooling_device_unregister + thermal_of_cooling_device_register + thermal_zone_device_enable + thermal_zone_device_priv + thermal_zone_device_unregister + thermal_zone_device_update + thermal_zone_for_each_trip + thermal_zone_get_crit_temp + thermal_zone_get_temp + thermal_zone_get_zone_by_name + tick_nohz_get_sleep_length + timer_delete + timer_delete_sync + topology_clear_scale_freq_source + topology_update_done + topology_update_hw_pressure + _totalram_pages + trace_array_put + trace_event_buffer_commit + trace_event_buffer_reserve + trace_event_printf + trace_event_raw_init + trace_event_reg + trace_handle_return + __traceiter_android_rvh_account_irq + __traceiter_android_rvh_before_do_sched_yield + __traceiter_android_rvh_build_perf_domains + __traceiter_android_rvh_can_migrate_task + __traceiter_android_rvh_check_preempt_wakeup_fair + __traceiter_android_rvh_cpu_capacity_show + __traceiter_android_rvh_cpu_cgroup_attach + __traceiter_android_rvh_cpu_cgroup_online + __traceiter_android_rvh_cpufreq_transition + __traceiter_android_rvh_dequeue_task + __traceiter_android_rvh_do_sched_yield + __traceiter_android_rvh_enqueue_task + __traceiter_android_rvh_find_busiest_queue + __traceiter_android_rvh_find_lowest_rq + __traceiter_android_rvh_find_new_ilb + __traceiter_android_rvh_flush_task + __traceiter_android_rvh_get_nohz_timer_target + __traceiter_android_rvh_gic_v3_set_affinity + __traceiter_android_rvh_iommu_alloc_insert_iova + __traceiter_android_rvh_iommu_iovad_init_alloc_algo + __traceiter_android_rvh_iommu_limit_align_shift + __traceiter_android_rvh_iommu_setup_dma_ops + __traceiter_android_rvh_is_cpu_allowed + __traceiter_android_rvh_new_task_stats + __traceiter_android_rvh_replace_next_task_fair + __traceiter_android_rvh_rto_next_cpu + __traceiter_android_rvh_sched_cpu_dying + __traceiter_android_rvh_sched_cpu_starting + __traceiter_android_rvh_sched_exec + __traceiter_android_rvh_sched_fork_init + __traceiter_android_rvh_sched_newidle_balance + __traceiter_android_rvh_sched_nohz_balancer_kick + __traceiter_android_rvh_schedule + __traceiter_android_rvh_select_task_rq_fair + __traceiter_android_rvh_select_task_rq_rt + __traceiter_android_rvh_set_cpus_allowed_by_task + __traceiter_android_rvh_set_task_cpu + __traceiter_android_rvh_show_max_freq + __traceiter_android_rvh_tick_entry + __traceiter_android_rvh_try_to_wake_up + __traceiter_android_rvh_ttwu_cond + __traceiter_android_rvh_update_cpu_capacity + __traceiter_android_rvh_update_misfit_status + __traceiter_android_rvh_update_thermal_stats + __traceiter_android_rvh_wake_up_new_task + __traceiter_android_vh_alter_mutex_list_add + __traceiter_android_vh_binder_restore_priority + __traceiter_android_vh_binder_set_priority + __traceiter_android_vh_cpu_idle_enter + __traceiter_android_vh_cpu_idle_exit + __traceiter_android_vh_cpuidle_psci_enter + __traceiter_android_vh_cpuidle_psci_exit + __traceiter_android_vh_dup_task_struct + __traceiter_android_vh_ipi_stop + __traceiter_android_vh_jiffies_update + __traceiter_android_vh_printk_hotplug + __traceiter_android_vh_rproc_recovery + __traceiter_android_vh_rproc_recovery_set + __traceiter_android_vh_scheduler_tick + __traceiter_android_vh_timer_calc_index + __traceiter_android_vh_update_topology_flags_workfn + __traceiter_cpu_frequency_limits + __traceiter_gpu_mem_total + __traceiter_ipi_entry + __traceiter_ipi_raise + __traceiter_irq_handler_entry + __traceiter_mmap_lock_acquire_returned + __traceiter_mmap_lock_released + __traceiter_mmap_lock_start_locking + __traceiter_sched_overutilized_tp + __traceiter_sched_switch + __traceiter_sk_data_ready + __traceiter_suspend_resume + __tracepoint_android_rvh_account_irq + __tracepoint_android_rvh_before_do_sched_yield + __tracepoint_android_rvh_build_perf_domains + __tracepoint_android_rvh_can_migrate_task + __tracepoint_android_rvh_check_preempt_wakeup_fair + __tracepoint_android_rvh_cpu_capacity_show + __tracepoint_android_rvh_cpu_cgroup_attach + __tracepoint_android_rvh_cpu_cgroup_online + __tracepoint_android_rvh_cpufreq_transition + __tracepoint_android_rvh_dequeue_task + __tracepoint_android_rvh_do_sched_yield + __tracepoint_android_rvh_enqueue_task + __tracepoint_android_rvh_find_busiest_queue + __tracepoint_android_rvh_find_lowest_rq + __tracepoint_android_rvh_find_new_ilb + __tracepoint_android_rvh_flush_task + __tracepoint_android_rvh_get_nohz_timer_target + __tracepoint_android_rvh_gic_v3_set_affinity + __tracepoint_android_rvh_iommu_alloc_insert_iova + __tracepoint_android_rvh_iommu_iovad_init_alloc_algo + __tracepoint_android_rvh_iommu_limit_align_shift + __tracepoint_android_rvh_iommu_setup_dma_ops + __tracepoint_android_rvh_is_cpu_allowed + __tracepoint_android_rvh_new_task_stats + __tracepoint_android_rvh_replace_next_task_fair + __tracepoint_android_rvh_rto_next_cpu + __tracepoint_android_rvh_sched_cpu_dying + __tracepoint_android_rvh_sched_cpu_starting + __tracepoint_android_rvh_sched_exec + __tracepoint_android_rvh_sched_fork_init + __tracepoint_android_rvh_sched_newidle_balance + __tracepoint_android_rvh_sched_nohz_balancer_kick + __tracepoint_android_rvh_schedule + __tracepoint_android_rvh_select_task_rq_fair + __tracepoint_android_rvh_select_task_rq_rt + __tracepoint_android_rvh_set_cpus_allowed_by_task + __tracepoint_android_rvh_set_task_cpu + __tracepoint_android_rvh_show_max_freq + __tracepoint_android_rvh_tick_entry + __tracepoint_android_rvh_try_to_wake_up + __tracepoint_android_rvh_ttwu_cond + __tracepoint_android_rvh_update_cpu_capacity + __tracepoint_android_rvh_update_misfit_status + __tracepoint_android_rvh_update_thermal_stats + __tracepoint_android_rvh_wake_up_new_task + __tracepoint_android_vh_alter_mutex_list_add + __tracepoint_android_vh_binder_restore_priority + __tracepoint_android_vh_binder_set_priority + __tracepoint_android_vh_cpu_idle_enter + __tracepoint_android_vh_cpu_idle_exit + __tracepoint_android_vh_cpuidle_psci_enter + __tracepoint_android_vh_cpuidle_psci_exit + __tracepoint_android_vh_dup_task_struct + __tracepoint_android_vh_ipi_stop + __tracepoint_android_vh_jiffies_update + __tracepoint_android_vh_printk_hotplug + __tracepoint_android_vh_rproc_recovery + __tracepoint_android_vh_rproc_recovery_set + __tracepoint_android_vh_scheduler_tick + __tracepoint_android_vh_timer_calc_index + __tracepoint_android_vh_update_topology_flags_workfn + __tracepoint_cpu_frequency_limits + __tracepoint_gpu_mem_total + __tracepoint_ipi_entry + __tracepoint_ipi_raise + __tracepoint_irq_handler_entry + __tracepoint_mmap_lock_acquire_returned + __tracepoint_mmap_lock_released + __tracepoint_mmap_lock_start_locking + tracepoint_probe_register + tracepoint_probe_register_prio + tracepoint_probe_unregister + __tracepoint_sched_overutilized_tp + __tracepoint_sched_switch + __tracepoint_sk_data_ready + __tracepoint_suspend_resume + trace_print_array_seq + trace_print_flags_seq + trace_print_symbols_seq + trace_raw_output_prep + trace_seq_printf + trace_seq_putc + __trace_trigger_soft_disabled + tracing_off + try_module_get + try_wait_for_completion + tty_flip_buffer_push + __tty_insert_flip_string_flags + typec_switch_put + typec_switch_set + uart_add_one_port + uart_get_baud_rate + uart_insert_char + uart_register_driver + uart_remove_one_port + uart_resume_port + uart_suspend_port + uart_try_toggle_sysrq + uart_unregister_driver + uart_update_timeout + uart_write_wakeup + uclamp_eff_value + ucsi_connector_change + ucsi_create + ucsi_destroy + ucsi_get_drvdata + ucsi_register + ucsi_set_drvdata + ucsi_unregister + __udelay + __uio_register_device + uio_unregister_device + __unregister_chrdev + unregister_chrdev_region + unregister_console + unregister_die_notifier + unregister_ftrace_export + unregister_inet6addr_notifier + unregister_inetaddr_notifier + unregister_kretprobe + unregister_netdev + unregister_netdevice_many + unregister_netdevice_notifier + unregister_netdevice_queue + unregister_netevent_notifier + unregister_pernet_device + unregister_pm_notifier + unregister_reboot_notifier + unregister_restart_handler + unregister_rpmsg_driver + unregister_syscore_ops + unregister_sysctl_table + up + update_devfreq + update_rq_clock + up_read + up_write + usb_add_phy_dev + usb_assign_descriptors + usb_composite_setup_continue + usb_decode_ctrl + usb_ep_alloc_request + usb_ep_autoconfig + usb_ep_dequeue + usb_ep_disable + usb_ep_enable + usb_ep_free_request + usb_ep_queue + usb_ep_set_halt + usb_free_all_descriptors + usb_function_register + usb_function_unregister + usb_gadget_wakeup + usb_hcd_is_primary_hcd + usb_interface_id + usb_phy_set_charger_current + usb_put_function_instance + usb_register_notify + usb_remove_phy + usb_role_switch_find_by_fwnode + usb_role_switch_get_drvdata + usb_role_switch_register + usb_role_switch_set_role + usb_role_switch_unregister + usb_speed_string + usb_string_id + usb_unregister_notify + __usecs_to_jiffies + usleep_range_state + utf8_data_table + v4l2_ctrl_find + v4l2_ctrl_handler_free + v4l2_ctrl_handler_init_class + v4l2_ctrl_new_custom + v4l2_ctrl_new_std + v4l2_ctrl_new_std_menu + v4l2_device_register + v4l2_device_unregister + v4l2_event_dequeue + v4l2_event_pending + v4l2_event_queue_fh + v4l2_event_subscribe + v4l2_event_unsubscribe + v4l2_fh_add + v4l2_fh_del + v4l2_fh_exit + v4l2_fh_init + v4l2_s_ctrl + vb2_buffer_done + vb2_dqbuf + vb2_qbuf + vb2_queue_init + vb2_queue_release + vb2_reqbufs + vb2_streamoff + vb2_streamon + vchan_dma_desc_free_list + vchan_find_desc + vchan_init + vchan_tx_desc_free + vchan_tx_submit + vendor_data_pad + verify_pkcs7_signature + vfree + video_devdata + video_ioctl2 + __video_register_device + video_unregister_device + virtqueue_add_inbuf + virtqueue_add_outbuf + virtqueue_detach_unused_buf + virtqueue_get_buf + virtqueue_get_vring + virtqueue_get_vring_size + virtqueue_kick + virtqueue_set_dma_premapped + vmalloc_noprof + vmalloc_to_page + vmalloc_to_pfn + vmap + __vma_start_write + vmemdup_user + vmf_insert_mixed + vmf_insert_pfn + vm_get_page_prot + vm_insert_page + vm_iomap_memory + vm_map_pages + vprintk + vring_del_virtqueue + vring_new_virtqueue + vscnprintf + vsnprintf + vunmap + vzalloc_noprof + wait_for_completion + wait_for_completion_interruptible + wait_for_completion_interruptible_timeout + wait_for_completion_killable + wait_for_completion_state + wait_for_completion_timeout + wait_for_device_probe + wait_woken + __wake_up + wake_up_if_idle + __wake_up_locked + wakeup_preempt + wake_up_process + wakeup_source_register + wakeup_source_unregister + __warn_printk + wireless_nlevent_flush + wireless_send_event + woken_wake_function + ww_mutex_lock + ww_mutex_trylock + ww_mutex_unlock + x509_load_certificate_list + __xa_alloc + __xa_alloc_cyclic + xa_destroy + xa_erase + xa_find + xa_find_after + __xa_insert + xa_load + xas_load + xa_store + xfrm_lookup + zap_vma_ptes -- GitLab From 25f19cb850213d10257ebb45f21931e50f6a9f19 Mon Sep 17 00:00:00 2001 From: Alice Ryhl Date: Wed, 16 Jul 2025 11:23:04 +0000 Subject: [PATCH 2109/2211] ANDROID: rust_binder: reorganize process cleanup This fixes some test failures in rustBinderTest caused by commit f06dd0cd3562 ("ANDROID: rust_binder: release threads before refs"). Honestly I'm not entirely sure why. Note that this reverses that commit, and fixes the resulting logspam by instead moving cleanup of allocated buffers to the end of process release. Bug: 431914626 Change-Id: I1f7faa486f86cef7fbe37ad87b720573a5e05ee5 Signed-off-by: Alice Ryhl --- drivers/android/binder/process.rs | 67 ++++++++++++++++--------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/drivers/android/binder/process.rs b/drivers/android/binder/process.rs index 240386e981cd3..23d0f2af426cc 100644 --- a/drivers/android/binder/process.rs +++ b/drivers/android/binder/process.rs @@ -931,7 +931,7 @@ impl Process { refs.by_node.remove(&id); } } else { - pr_warn!("{}: no such ref {handle}\n", kernel::current!().pid()); + pr_warn!("{}: no such ref {handle}\n", self.pid_in_current_ns()); } Ok(()) } @@ -1310,37 +1310,9 @@ impl Process { work.into_arc().cancel(); } - // Take all threads and release them. - let threads = take(&mut self.inner.lock().threads); - for thread in threads.values() { - thread.release(); - } - drop(threads); - - // Free any resources kept alive by allocated buffers. - let omapping = self.inner.lock().mapping.take(); - if let Some(mut mapping) = omapping { - let address = mapping.address; - mapping - .alloc - .take_for_each(|offset, size, debug_id, odata| { - let ptr = offset + address; - let mut alloc = - Allocation::new(self.clone(), debug_id, offset, size, ptr, false); - if let Some(data) = odata { - alloc.set_info(data); - } - drop(alloc) - }); - } - // Drop all references. We do this dance with `swap` to avoid destroying the references // while holding the lock. - let mut refs = self.node_refs.lock(); - let mut node_refs = take(&mut refs.by_handle); - let freeze_listeners = take(&mut refs.freeze_listeners); - drop(refs); - for info in node_refs.values_mut() { + for info in self.node_refs.lock().by_handle.values_mut() { // SAFETY: We are removing the `NodeRefInfo` from the right node. unsafe { info.node_ref2().node.remove_node_info(&info) }; @@ -1352,14 +1324,24 @@ impl Process { }; death.set_cleared(false); } - drop(node_refs); + let freeze_listeners = take(&mut self.node_refs.lock().freeze_listeners); for listener in freeze_listeners.values() { listener.on_process_exit(&self); } drop(freeze_listeners); + // Do similar dance for the state lock. + let mut inner = self.inner.lock(); + let threads = take(&mut inner.threads); + let nodes = take(&mut inner.nodes); + drop(inner); + + // Release all threads. + for thread in threads.values() { + thread.release(); + } + // Deliver death notifications. - let nodes = take(&mut self.inner.lock().nodes); for node in nodes.values() { loop { let death = { @@ -1373,6 +1355,27 @@ impl Process { death.set_dead(); } } + + // Free any resources kept alive by allocated buffers. + let omapping = self.inner.lock().mapping.take(); + if let Some(mut mapping) = omapping { + let address = mapping.address; + mapping + .alloc + .take_for_each(|offset, size, debug_id, odata| { + let ptr = offset + address; + pr_warn!( + "{}: removing orphan mapping {offset}:{size}\n", + self.pid_in_current_ns() + ); + let mut alloc = + Allocation::new(self.clone(), debug_id, offset, size, ptr, false); + if let Some(data) = odata { + alloc.set_info(data); + } + drop(alloc) + }); + } } pub(crate) fn drop_outstanding_txn(&self) { -- GitLab From 2199f5c4b59645e54c4c192811f1fd06d4fde7c5 Mon Sep 17 00:00:00 2001 From: zhujingpeng Date: Thu, 4 Jul 2024 22:08:43 +0800 Subject: [PATCH 2110/2211] ANDROID: GKI: Add initialization for rwsem's oem_data and vendor_data. Add initialization for rwsem's oem_data and vendor_data. The __init_rwsem() already contains a hook, but this function may be called before the rwsem_init hook is registered, causing some rwsem's oem_data to be uninitialized and causing unpredictable errors Bug: 351133539 Change-Id: I7bbb83894d200102bc7d84e91678f164529097a0 Signed-off-by: zhujingpeng --- kernel/locking/rwsem.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c index 067b6b08a3991..8efb11b8b6d2b 100644 --- a/kernel/locking/rwsem.c +++ b/kernel/locking/rwsem.c @@ -343,6 +343,8 @@ void __init_rwsem(struct rw_semaphore *sem, const char *name, #ifdef CONFIG_RWSEM_SPIN_ON_OWNER osq_lock_init(&sem->osq); #endif + android_init_vendor_data(sem, 1); + android_init_oem_data(sem, 1); trace_android_vh_rwsem_init(sem); } EXPORT_SYMBOL(__init_rwsem); -- GitLab From 8632d85be65a4b27bcad1a860d8de45aa2bb2e1b Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Mon, 21 Jul 2025 23:51:35 +0000 Subject: [PATCH 2111/2211] ANDROID: Have menuconfig sort microdroid defconfigs Menuconfig has its own way of sorting defconfig files, and it is the only tool that should be used for editing defconfig files. Use menuconfig on the microdroid files to avoid configs moving around when editing configs in the future. No functional change. Verified by comparing vmlinux binaries before and after this commit. Bug: 432329937 Change-Id: I57b71b4f446b4314b0d7388bdeffbad29f5e058f Signed-off-by: Isaac J. Manjarres --- arch/arm64/configs/microdroid_defconfig | 16 ++++++---------- arch/x86/configs/microdroid_defconfig | 7 ++----- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index f50396c249c28..512bbae47a68a 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -9,12 +9,12 @@ CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y +CONFIG_CGROUPS=y +CONFIG_MEMCG=y # CONFIG_UTS_NS is not set # CONFIG_TIME_NS is not set # CONFIG_PID_NS is not set # CONFIG_NET_NS is not set -CONFIG_CGROUPS=y -CONFIG_MEMCG=y # CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set @@ -23,11 +23,11 @@ CONFIG_MEMCG=y # CONFIG_RD_ZSTD is not set CONFIG_BOOT_CONFIG=y CONFIG_PROFILING=y +CONFIG_KEXEC_FILE=y CONFIG_ARM64_VA_BITS_39=y CONFIG_SCHED_MC=y CONFIG_NR_CPUS=32 CONFIG_PARAVIRT_TIME_ACCOUNTING=y -CONFIG_KEXEC_FILE=y CONFIG_ARM64_SW_TTBR0_PAN=y # CONFIG_ARM64_BTI_KERNEL is not set CONFIG_RANDOMIZE_BASE=y @@ -73,13 +73,12 @@ CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y CONFIG_PCI_IOV=y CONFIG_PCI_HOST_GENERIC=y -CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCIE_KIRIN=y +CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCI_ENDPOINT=y CONFIG_FW_LOADER_USER_HELPER=y # CONFIG_FW_CACHE is not set CONFIG_ARM_SCMI_PROTOCOL=y -# CONFIG_ARM_SCMI_POWER_DOMAIN is not set CONFIG_ZRAM=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 @@ -105,7 +104,6 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=0 CONFIG_SERIAL_OF_PLATFORM=y CONFIG_NULL_TTY=y CONFIG_VIRTIO_CONSOLE=y -CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM_CCTRNG=y # CONFIG_DEVMEM is not set # CONFIG_DEVPORT is not set @@ -131,6 +129,7 @@ CONFIG_VIRTIO_BALLOON=y CONFIG_STAGING=y CONFIG_HWSPINLOCK=y # CONFIG_IOMMU_SUPPORT is not set +# CONFIG_ARM_SCMI_POWER_DOMAIN is not set # CONFIG_ANDROID_KABI_RESERVE is not set # CONFIG_ANDROID_VENDOR_OEM_DATA is not set CONFIG_EXT4_FS=y @@ -151,6 +150,7 @@ CONFIG_STATIC_USERMODEHELPER=y CONFIG_STATIC_USERMODEHELPER_PATH="" CONFIG_SECURITY_SELINUX=y CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y +CONFIG_BUG_ON_DATA_CORRUPTION=y CONFIG_CRYPTO_HCTR2=y CONFIG_CRYPTO_LZO=y CONFIG_CRYPTO_SHA1_ARM64_CE=y @@ -170,8 +170,6 @@ CONFIG_HEADERS_INSTALL=y CONFIG_MAGIC_SYSRQ=y CONFIG_UBSAN=y CONFIG_UBSAN_TRAP=y -CONFIG_UBSAN_LOCAL_BOUNDS=y -# CONFIG_UBSAN_SHIFT is not set # CONFIG_UBSAN_BOOL is not set # CONFIG_UBSAN_ENUM is not set CONFIG_PAGE_OWNER=y @@ -183,8 +181,6 @@ CONFIG_PANIC_TIMEOUT=-1 CONFIG_SOFTLOCKUP_DETECTOR=y CONFIG_WQ_WATCHDOG=y CONFIG_SCHEDSTATS=y -# CONFIG_DEBUG_PREEMPT is not set -CONFIG_BUG_ON_DATA_CORRUPTION=y CONFIG_HIST_TRIGGERS=y CONFIG_PID_IN_CONTEXTIDR=y # CONFIG_RUNTIME_TESTING_MENU is not set diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index dbbc3a4b45c54..6761087f34152 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -25,6 +25,7 @@ CONFIG_MEMCG=y # CONFIG_RD_LZO is not set CONFIG_BOOT_CONFIG=y CONFIG_PROFILING=y +CONFIG_KEXEC_FILE=y CONFIG_SMP=y CONFIG_X86_X2APIC=y CONFIG_HYPERVISOR_GUEST=y @@ -33,7 +34,6 @@ CONFIG_PARAVIRT_TIME_ACCOUNTING=y CONFIG_NR_CPUS=32 # CONFIG_X86_MCE is not set CONFIG_EFI=y -CONFIG_KEXEC_FILE=y CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE="stack_depot_disable=on cgroup_disable=pressure ioremap_guard panic=-1 bootconfig acpi=noirq" CONFIG_PM_WAKELOCKS=y @@ -105,7 +105,6 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=0 CONFIG_SERIAL_OF_PLATFORM=y CONFIG_NULL_TTY=y CONFIG_VIRTIO_CONSOLE=y -CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM_VIRTIO=y # CONFIG_DEVMEM is not set # CONFIG_DEVPORT is not set @@ -203,6 +202,7 @@ CONFIG_STATIC_USERMODEHELPER=y CONFIG_STATIC_USERMODEHELPER_PATH="" CONFIG_SECURITY_SELINUX=y CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y +CONFIG_BUG_ON_DATA_CORRUPTION=y CONFIG_CRYPTO_HCTR2=y CONFIG_CRYPTO_LZO=y CONFIG_CRYPTO_AES_NI_INTEL=y @@ -220,8 +220,6 @@ CONFIG_HEADERS_INSTALL=y CONFIG_MAGIC_SYSRQ=y CONFIG_UBSAN=y CONFIG_UBSAN_TRAP=y -CONFIG_UBSAN_LOCAL_BOUNDS=y -# CONFIG_UBSAN_SHIFT is not set # CONFIG_UBSAN_BOOL is not set # CONFIG_UBSAN_ENUM is not set CONFIG_PAGE_OWNER=y @@ -234,6 +232,5 @@ CONFIG_PANIC_TIMEOUT=-1 CONFIG_SOFTLOCKUP_DETECTOR=y CONFIG_WQ_WATCHDOG=y CONFIG_SCHEDSTATS=y -CONFIG_BUG_ON_DATA_CORRUPTION=y CONFIG_HIST_TRIGGERS=y CONFIG_UNWINDER_FRAME_POINTER=y -- GitLab From 75f78624e41f7a5b84497d33cf9c740f24773a57 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Tue, 22 Jul 2025 00:00:46 +0000 Subject: [PATCH 2112/2211] ANDROID: Enable CONFIG_EXPERT on microdroid kernels CONFIG_EXPERT is useful for being able to control advanced kernel features. Enable it for microdroid kernels to allow the kernel to be optimized better for size. No functional change. Bug: 432329937 Change-Id: I24efaf5d6cca241b784e1e9d20538c7a84f2d3be Signed-off-by: Isaac J. Manjarres --- arch/arm64/configs/microdroid_defconfig | 4 +++- arch/x86/configs/microdroid_defconfig | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index 512bbae47a68a..89e33606bc3f8 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -11,6 +11,7 @@ CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_CGROUPS=y CONFIG_MEMCG=y +CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_TIME_NS is not set # CONFIG_PID_NS is not set @@ -22,6 +23,7 @@ CONFIG_MEMCG=y # CONFIG_RD_LZO is not set # CONFIG_RD_ZSTD is not set CONFIG_BOOT_CONFIG=y +CONFIG_EXPERT=y CONFIG_PROFILING=y CONFIG_KEXEC_FILE=y CONFIG_ARM64_VA_BITS_39=y @@ -162,7 +164,6 @@ CONFIG_DMA_RESTRICTED_POOL=y CONFIG_PRINTK_TIME=y CONFIG_PRINTK_CALLER=y CONFIG_DYNAMIC_DEBUG_CORE=y -CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_INFO_DWARF5=y CONFIG_DEBUG_INFO_REDUCED=y CONFIG_HEADERS_INSTALL=y @@ -174,6 +175,7 @@ CONFIG_UBSAN_TRAP=y # CONFIG_UBSAN_ENUM is not set CONFIG_PAGE_OWNER=y CONFIG_DEBUG_STACK_USAGE=y +CONFIG_DEBUG_MEMORY_INIT=y CONFIG_KASAN=y CONFIG_KASAN_HW_TAGS=y CONFIG_PANIC_ON_OOPS=y diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index 6761087f34152..09283c31e5183 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -15,6 +15,7 @@ CONFIG_UCLAMP_TASK=y CONFIG_UCLAMP_BUCKETS_COUNT=20 CONFIG_CGROUPS=y CONFIG_MEMCG=y +CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_TIME_NS is not set # CONFIG_PID_NS is not set @@ -24,6 +25,7 @@ CONFIG_MEMCG=y # CONFIG_RD_XZ is not set # CONFIG_RD_LZO is not set CONFIG_BOOT_CONFIG=y +CONFIG_EXPERT=y CONFIG_PROFILING=y CONFIG_KEXEC_FILE=y CONFIG_SMP=y @@ -212,7 +214,6 @@ CONFIG_CRYPTO_SHA256_SSSE3=y CONFIG_CRYPTO_SHA512_SSSE3=y CONFIG_PRINTK_TIME=y CONFIG_DYNAMIC_DEBUG_CORE=y -CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_INFO_DWARF5=y CONFIG_DEBUG_INFO_REDUCED=y CONFIG_HEADERS_INSTALL=y @@ -224,6 +225,7 @@ CONFIG_UBSAN_TRAP=y # CONFIG_UBSAN_ENUM is not set CONFIG_PAGE_OWNER=y CONFIG_DEBUG_STACK_USAGE=y +CONFIG_DEBUG_MEMORY_INIT=y CONFIG_KFENCE=y CONFIG_KFENCE_SAMPLE_INTERVAL=500 CONFIG_KFENCE_NUM_OBJECTS=63 -- GitLab From 291aed2347c5780dff8a075a6e0024cc366e881c Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Fri, 18 Jul 2025 23:53:05 +0000 Subject: [PATCH 2113/2211] ANDROID: Remove DMA-BUF support from microdroid Microdroid does not interface with peripherals and therefore does not need dma-buf support, so remove it. Bug: 432329937 Change-Id: Ie7adb18bbb796129f7d50eb17a6deba061547981 [isaacmanjarres: resolved contextual merge conflicts from forward porting from android15-6.6.] Signed-off-by: Isaac J. Manjarres --- arch/arm64/configs/microdroid_defconfig | 2 -- 1 file changed, 2 deletions(-) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index 89e33606bc3f8..b304a816248b5 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -120,8 +120,6 @@ CONFIG_RTC_CLASS=y # CONFIG_RTC_NVMEM is not set CONFIG_RTC_DRV_PL030=y CONFIG_RTC_DRV_PL031=y -CONFIG_DMABUF_HEAPS=y -CONFIG_DMABUF_SYSFS_STATS=y CONFIG_UIO=y CONFIG_VIRT_DRIVERS=y CONFIG_ARM_PKVM_GUEST=y -- GitLab From b8e0eec80ba3272f06ec0cc18936d663b753bc17 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Sat, 19 Jul 2025 00:23:36 +0000 Subject: [PATCH 2114/2211] ANDROID: Remove suspend and power management code for microdroid Microdroid does not suspend, so remove support for it. Bug: 432329937 Change-Id: I8cfcc0be8cb2f32131cb1bb202e2483577bc3216 Signed-off-by: Isaac J. Manjarres --- arch/arm64/configs/microdroid_defconfig | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index b304a816248b5..357d19091f30a 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -29,6 +29,7 @@ CONFIG_KEXEC_FILE=y CONFIG_ARM64_VA_BITS_39=y CONFIG_SCHED_MC=y CONFIG_NR_CPUS=32 +CONFIG_HOTPLUG_CPU=y CONFIG_PARAVIRT_TIME_ACCOUNTING=y CONFIG_ARM64_SW_TTBR0_PAN=y # CONFIG_ARM64_BTI_KERNEL is not set @@ -38,9 +39,7 @@ CONFIG_UNWIND_PATCH_PAC_INTO_SCS=y CONFIG_CMDLINE="stack_depot_disable=on kasan.stacktrace=off cgroup_disable=pressure ioremap_guard panic=-1 bootconfig" CONFIG_CMDLINE_EXTEND=y # CONFIG_EFI is not set -CONFIG_PM_WAKELOCKS=y -CONFIG_PM_WAKELOCKS_LIMIT=0 -# CONFIG_PM_WAKELOCKS_GC is not set +# CONFIG_SUSPEND is not set CONFIG_VIRTUALIZATION=y CONFIG_JUMP_LABEL=y CONFIG_SHADOW_CALL_STACK=y @@ -79,7 +78,6 @@ CONFIG_PCIE_KIRIN=y CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCI_ENDPOINT=y CONFIG_FW_LOADER_USER_HELPER=y -# CONFIG_FW_CACHE is not set CONFIG_ARM_SCMI_PROTOCOL=y CONFIG_ZRAM=y CONFIG_BLK_DEV_LOOP=y @@ -126,7 +124,7 @@ CONFIG_ARM_PKVM_GUEST=y CONFIG_GUNYAH_GUEST=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_BALLOON=y -CONFIG_STAGING=y +# CONFIG_SURFACE_PLATFORMS is not set CONFIG_HWSPINLOCK=y # CONFIG_IOMMU_SUPPORT is not set # CONFIG_ARM_SCMI_POWER_DOMAIN is not set -- GitLab From 3f182ff7454a489a19f497971a6d0395e4c2ae25 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Sat, 19 Jul 2025 00:44:12 +0000 Subject: [PATCH 2115/2211] ANDROID: Remove CPU hotplug support from microdroid Microdroid doesn't have a need to be able to hotplug CPUs, so remove support for it. Bug: 432329937 Change-Id: Iec229e80d60024612ce2f2fed091c51a2773782d Signed-off-by: Isaac J. Manjarres --- arch/arm64/configs/microdroid_defconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index 357d19091f30a..bfa1505b1f934 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -29,7 +29,6 @@ CONFIG_KEXEC_FILE=y CONFIG_ARM64_VA_BITS_39=y CONFIG_SCHED_MC=y CONFIG_NR_CPUS=32 -CONFIG_HOTPLUG_CPU=y CONFIG_PARAVIRT_TIME_ACCOUNTING=y CONFIG_ARM64_SW_TTBR0_PAN=y # CONFIG_ARM64_BTI_KERNEL is not set -- GitLab From 85d42eb292db9f2dd6bde055f8ccd313e47b66a3 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Sat, 19 Jul 2025 01:04:05 +0000 Subject: [PATCH 2116/2211] ANDROID: Remove support for ZONE_DMA and ZONE_DMA32 Microdroid doesn't interact with peripherals, and therefore doesn't have requirements for DMA'able memory. Therefore, place all memory in ZONE_NORMAL. This avoids scenarios where memory is allocated specifically for allocations that must be satisfied from ZONE_DMA, such as in the coherent atomic DMA pooling code. Bug: 432329937 Change-Id: Id29dec450edbb45d539bab2cc8e77defd8ba9ca9 Signed-off-by: Isaac J. Manjarres --- arch/arm64/configs/microdroid_defconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index bfa1505b1f934..6b58be8fbb5f1 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -59,6 +59,8 @@ CONFIG_MEMORY_HOTREMOVE=y CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y +# CONFIG_ZONE_DMA is not set +# CONFIG_ZONE_DMA32 is not set CONFIG_ANON_VMA_NAME=y CONFIG_USERFAULTFD=y CONFIG_LRU_GEN=y -- GitLab From 28e27474601cf8c6b9b1770141bf4677378d1582 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Mon, 21 Jul 2025 18:52:25 +0000 Subject: [PATCH 2117/2211] ANDROID: Disable transparent hugepage support on microdroid Microdroid does not need THP support, so remove it. Bug: 432329937 Change-Id: I69f32a963d36419a0b7ef7b71d316977c1c3fafc Signed-off-by: Isaac J. Manjarres --- arch/arm64/configs/microdroid_defconfig | 2 -- 1 file changed, 2 deletions(-) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index 6b58be8fbb5f1..d6065b4702cf5 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -57,8 +57,6 @@ CONFIG_SHUFFLE_PAGE_ALLOCATOR=y CONFIG_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTREMOVE=y CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 -CONFIG_TRANSPARENT_HUGEPAGE=y -CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # CONFIG_ZONE_DMA is not set # CONFIG_ZONE_DMA32 is not set CONFIG_ANON_VMA_NAME=y -- GitLab From 3c9afeb85ae407280d6ea103f77e2b612a8b6eb7 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Mon, 21 Jul 2025 19:34:45 +0000 Subject: [PATCH 2118/2211] ANDROID: Remove miscellaneous kernel support from microdroid Microdroid doesn't need to support firmware loading, so remove that. Also, it doesn't need human interaction devices, so remove support for that as well. Bug: 432329937 Change-Id: I657a28475234aaf4bb5bd9cef3e0d944b7bc7723 Signed-off-by: Isaac J. Manjarres --- arch/arm64/configs/microdroid_defconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index d6065b4702cf5..c8cab229b5319 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -76,7 +76,7 @@ CONFIG_PCI_HOST_GENERIC=y CONFIG_PCIE_KIRIN=y CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCI_ENDPOINT=y -CONFIG_FW_LOADER_USER_HELPER=y +# CONFIG_FW_LOADER is not set CONFIG_ARM_SCMI_PROTOCOL=y CONFIG_ZRAM=y CONFIG_BLK_DEV_LOOP=y @@ -110,7 +110,7 @@ CONFIG_POWER_RESET_SYSCON=y # CONFIG_HWMON is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y -# CONFIG_HID is not set +# CONFIG_HID_SUPPORT is not set # CONFIG_USB_SUPPORT is not set CONFIG_EDAC=y CONFIG_RTC_CLASS=y -- GitLab From e4768a8578b560bbee0c10b64fd6fcf1bd9548dd Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Mon, 21 Jul 2025 22:26:56 +0000 Subject: [PATCH 2119/2211] ANDROID: Align x86-64 microdroid kernel configs to aarch64 kernel configs x86-64 and aarch64 kernels should be at feature parity, so update the x86-64 kernel configs to match the aarch64 configs. Note, unline aarch64: - x86-64 requires ZONE_DMA32 to be enabled on 64-bit kernels, so that cannot be disabled. - CONFIG_HOTPLUG_CPU cannot be disabled on x86-64. Bug: 432329937 Change-Id: Id3d6d5ef5016f3984ecc0755788f4ff03e0311ad [isaacmanjarres: resolved merge conflicts from forward porting from android15-6.6.] Signed-off-by: Isaac J. Manjarres --- arch/x86/configs/microdroid_defconfig | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index 09283c31e5183..7958a074a20f8 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -38,9 +38,7 @@ CONFIG_NR_CPUS=32 CONFIG_EFI=y CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE="stack_depot_disable=on cgroup_disable=pressure ioremap_guard panic=-1 bootconfig acpi=noirq" -CONFIG_PM_WAKELOCKS=y -CONFIG_PM_WAKELOCKS_LIMIT=0 -# CONFIG_PM_WAKELOCKS_GC is not set +# CONFIG_SUSPEND is not set CONFIG_CPU_FREQ_STAT=y CONFIG_CPU_FREQ_TIMES=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y @@ -60,8 +58,7 @@ CONFIG_SHUFFLE_PAGE_ALLOCATOR=y CONFIG_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTREMOVE=y CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 -CONFIG_TRANSPARENT_HUGEPAGE=y -CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y +# CONFIG_ZONE_DMA is not set CONFIG_ANON_VMA_NAME=y CONFIG_USERFAULTFD=y CONFIG_LRU_GEN=y @@ -81,8 +78,7 @@ CONFIG_PCI_MSI=y CONFIG_PCI_IOV=y CONFIG_PCIE_DW_PLAT_EP=y CONFIG_PCI_ENDPOINT=y -CONFIG_FW_LOADER_USER_HELPER=y -# CONFIG_FW_CACHE is not set +# CONFIG_FW_LOADER is not set CONFIG_OF=y CONFIG_ZRAM=y CONFIG_BLK_DEV_LOOP=y @@ -128,12 +124,13 @@ CONFIG_MFD_SYSCON=y # CONFIG_USB_SUPPORT is not set CONFIG_EDAC=y CONFIG_RTC_CLASS=y -CONFIG_DMABUF_HEAPS=y -CONFIG_DMABUF_SYSFS_STATS=y CONFIG_UIO=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_BALLOON=y CONFIG_STAGING=y +# CONFIG_IOMMU_SUPPORT is not set +# CONFIG_ANDROID_KABI_RESERVE is not set +# CONFIG_ANDROID_VENDOR_OEM_DATA is not set CONFIG_LIBNVDIMM=y CONFIG_EXT4_FS=y # CONFIG_EXT4_USE_FOR_EXT2 is not set -- GitLab From 3c1295768ffa9512092f2924864fdf259900f0de Mon Sep 17 00:00:00 2001 From: Mathias Nyman Date: Mon, 23 Jun 2025 16:39:47 +0300 Subject: [PATCH 2120/2211] UPSTREAM: usb: hub: Don't try to recover devices lost during warm reset. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hub driver warm-resets ports in SS.Inactive or Compliance mode to recover a possible connected device. The port reset code correctly detects if a connection is lost during reset, but hub driver port_event() fails to take this into account in some cases. port_event() ends up using stale values and assumes there is a connected device, and will try all means to recover it, including power-cycling the port. Details: This case was triggered when xHC host was suspended with DbC (Debug Capability) enabled and connected. DbC turns one xHC port into a simple usb debug device, allowing debugging a system with an A-to-A USB debug cable. xhci DbC code disables DbC when xHC is system suspended to D3, and enables it back during resume. We essentially end up with two hosts connected to each other during suspend, and, for a short while during resume, until DbC is enabled back. The suspended xHC host notices some activity on the roothub port, but can't train the link due to being suspended, so xHC hardware sets a CAS (Cold Attach Status) flag for this port to inform xhci host driver that the port needs to be warm reset once xHC resumes. CAS is xHCI specific, and not part of USB specification, so xhci driver tells usb core that the port has a connection and link is in compliance mode. Recovery from complinace mode is similar to CAS recovery. xhci CAS driver support that fakes a compliance mode connection was added in commit 8bea2bd37df0 ("usb: Add support for root hub port status CAS") Once xHCI resumes and DbC is enabled back, all activity on the xHC roothub host side port disappears. The hub driver will anyway think port has a connection and link is in compliance mode, and hub driver will try to recover it. The port power-cycle during recovery seems to cause issues to the active DbC connection. Fix this by clearing connect_change flag if hub_port_reset() returns -ENOTCONN, thus avoiding the whole unnecessary port recovery and initialization attempt. Cc: stable@vger.kernel.org Fixes: 8bea2bd37df0 ("usb: Add support for root hub port status CAS") Tested-by: Łukasz Bartosik Signed-off-by: Mathias Nyman Acked-by: Alan Stern Link: https://lore.kernel.org/r/20250623133947.3144608-1-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman (cherry picked from commit 2521106fc732b0b75fd3555c689b1ed1d29d273c) Bug: 394279708 Test: For ~40 tries after device resumed DbC enumerated and didn't disconnect Change-Id: Ie849e104283fe1182b2fb8d5858b3524f73960ba Signed-off-by: Łukasz Bartosik --- drivers/usb/core/hub.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 145787c424e0c..19ea4ad1be1cc 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -5718,6 +5718,7 @@ static void port_event(struct usb_hub *hub, int port1) struct usb_device *hdev = hub->hdev; u16 portstatus, portchange; int i = 0; + int err; connect_change = test_bit(port1, hub->change_bits); clear_bit(port1, hub->event_bits); @@ -5814,8 +5815,11 @@ static void port_event(struct usb_hub *hub, int port1) } else if (!udev || !(portstatus & USB_PORT_STAT_CONNECTION) || udev->state == USB_STATE_NOTATTACHED) { dev_dbg(&port_dev->dev, "do warm reset, port only\n"); - if (hub_port_reset(hub, port1, NULL, - HUB_BH_RESET_TIME, true) < 0) + err = hub_port_reset(hub, port1, NULL, + HUB_BH_RESET_TIME, true); + if (!udev && err == -ENOTCONN) + connect_change = 0; + else if (err < 0) hub_port_disable(hub, port1, 1); } else { dev_dbg(&port_dev->dev, "do warm reset, full device\n"); -- GitLab From 88813c11dc6457cf0ee5af18a2d85cd3c1a418fb Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Wed, 18 Jun 2025 21:13:55 -0700 Subject: [PATCH 2121/2211] UPSTREAM: af_unix: Don't leave consecutive consumed OOB skbs. [ Upstream commit 32ca245464e1479bfea8592b9db227fdc1641705 ] Jann Horn reported a use-after-free in unix_stream_read_generic(). The following sequences reproduce the issue: $ python3 from socket import * s1, s2 = socketpair(AF_UNIX, SOCK_STREAM) s1.send(b'x', MSG_OOB) s2.recv(1, MSG_OOB) # leave a consumed OOB skb s1.send(b'y', MSG_OOB) s2.recv(1, MSG_OOB) # leave a consumed OOB skb s1.send(b'z', MSG_OOB) s2.recv(1) # recv 'z' illegally s2.recv(1, MSG_OOB) # access 'z' skb (use-after-free) Even though a user reads OOB data, the skb holding the data stays on the recv queue to mark the OOB boundary and break the next recv(). After the last send() in the scenario above, the sk2's recv queue has 2 leading consumed OOB skbs and 1 real OOB skb. Then, the following happens during the next recv() without MSG_OOB 1. unix_stream_read_generic() peeks the first consumed OOB skb 2. manage_oob() returns the next consumed OOB skb 3. unix_stream_read_generic() fetches the next not-yet-consumed OOB skb 4. unix_stream_read_generic() reads and frees the OOB skb , and the last recv(MSG_OOB) triggers KASAN splat. The 3. above occurs because of the SO_PEEK_OFF code, which does not expect unix_skb_len(skb) to be 0, but this is true for such consumed OOB skbs. while (skip >= unix_skb_len(skb)) { skip -= unix_skb_len(skb); skb = skb_peek_next(skb, &sk->sk_receive_queue); ... } In addition to this use-after-free, there is another issue that ioctl(SIOCATMARK) does not function properly with consecutive consumed OOB skbs. So, nothing good comes out of such a situation. Instead of complicating manage_oob(), ioctl() handling, and the next ECONNRESET fix by introducing a loop for consecutive consumed OOB skbs, let's not leave such consecutive OOB unnecessarily. Now, while receiving an OOB skb in unix_stream_recv_urg(), if its previous skb is a consumed OOB skb, it is freed. [0]: BUG: KASAN: slab-use-after-free in unix_stream_read_actor (net/unix/af_unix.c:3027) Read of size 4 at addr ffff888106ef2904 by task python3/315 CPU: 2 UID: 0 PID: 315 Comm: python3 Not tainted 6.16.0-rc1-00407-gec315832f6f9 #8 PREEMPT(voluntary) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-4.fc42 04/01/2014 Call Trace: dump_stack_lvl (lib/dump_stack.c:122) print_report (mm/kasan/report.c:409 mm/kasan/report.c:521) kasan_report (mm/kasan/report.c:636) unix_stream_read_actor (net/unix/af_unix.c:3027) unix_stream_read_generic (net/unix/af_unix.c:2708 net/unix/af_unix.c:2847) unix_stream_recvmsg (net/unix/af_unix.c:3048) sock_recvmsg (net/socket.c:1063 (discriminator 20) net/socket.c:1085 (discriminator 20)) __sys_recvfrom (net/socket.c:2278) __x64_sys_recvfrom (net/socket.c:2291 (discriminator 1) net/socket.c:2287 (discriminator 1) net/socket.c:2287 (discriminator 1)) do_syscall_64 (arch/x86/entry/syscall_64.c:63 (discriminator 1) arch/x86/entry/syscall_64.c:94 (discriminator 1)) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) RIP: 0033:0x7f8911fcea06 Code: 5d e8 41 8b 93 08 03 00 00 59 5e 48 83 f8 fc 75 19 83 e2 39 83 fa 08 75 11 e8 26 ff ff ff 66 0f 1f 44 00 00 48 8b 45 10 0f 05 <48> 8b 5d f8 c9 c3 0f 1f 40 00 f3 0f 1e fa 55 48 89 e5 48 83 ec 08 RSP: 002b:00007fffdb0dccb0 EFLAGS: 00000202 ORIG_RAX: 000000000000002d RAX: ffffffffffffffda RBX: 00007fffdb0dcdc8 RCX: 00007f8911fcea06 RDX: 0000000000000001 RSI: 00007f8911a5e060 RDI: 0000000000000006 RBP: 00007fffdb0dccd0 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000001 R11: 0000000000000202 R12: 00007f89119a7d20 R13: ffffffffc4653600 R14: 0000000000000000 R15: 0000000000000000 Allocated by task 315: kasan_save_stack (mm/kasan/common.c:48) kasan_save_track (mm/kasan/common.c:60 (discriminator 1) mm/kasan/common.c:69 (discriminator 1)) __kasan_slab_alloc (mm/kasan/common.c:348) kmem_cache_alloc_node_noprof (./include/linux/kasan.h:250 mm/slub.c:4148 mm/slub.c:4197 mm/slub.c:4249) __alloc_skb (net/core/skbuff.c:660 (discriminator 4)) alloc_skb_with_frags (./include/linux/skbuff.h:1336 net/core/skbuff.c:6668) sock_alloc_send_pskb (net/core/sock.c:2993) unix_stream_sendmsg (./include/net/sock.h:1847 net/unix/af_unix.c:2256 net/unix/af_unix.c:2418) __sys_sendto (net/socket.c:712 (discriminator 20) net/socket.c:727 (discriminator 20) net/socket.c:2226 (discriminator 20)) __x64_sys_sendto (net/socket.c:2233 (discriminator 1) net/socket.c:2229 (discriminator 1) net/socket.c:2229 (discriminator 1)) do_syscall_64 (arch/x86/entry/syscall_64.c:63 (discriminator 1) arch/x86/entry/syscall_64.c:94 (discriminator 1)) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) Freed by task 315: kasan_save_stack (mm/kasan/common.c:48) kasan_save_track (mm/kasan/common.c:60 (discriminator 1) mm/kasan/common.c:69 (discriminator 1)) kasan_save_free_info (mm/kasan/generic.c:579 (discriminator 1)) __kasan_slab_free (mm/kasan/common.c:271) kmem_cache_free (mm/slub.c:4643 (discriminator 3) mm/slub.c:4745 (discriminator 3)) unix_stream_read_generic (net/unix/af_unix.c:3010) unix_stream_recvmsg (net/unix/af_unix.c:3048) sock_recvmsg (net/socket.c:1063 (discriminator 20) net/socket.c:1085 (discriminator 20)) __sys_recvfrom (net/socket.c:2278) __x64_sys_recvfrom (net/socket.c:2291 (discriminator 1) net/socket.c:2287 (discriminator 1) net/socket.c:2287 (discriminator 1)) do_syscall_64 (arch/x86/entry/syscall_64.c:63 (discriminator 1) arch/x86/entry/syscall_64.c:94 (discriminator 1)) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) The buggy address belongs to the object at ffff888106ef28c0 which belongs to the cache skbuff_head_cache of size 224 The buggy address is located 68 bytes inside of freed 224-byte region [ffff888106ef28c0, ffff888106ef29a0) The buggy address belongs to the physical page: page: refcount:0 mapcount:0 mapping:0000000000000000 index:0xffff888106ef3cc0 pfn:0x106ef2 head: order:1 mapcount:0 entire_mapcount:0 nr_pages_mapped:0 pincount:0 flags: 0x200000000000040(head|node=0|zone=2) page_type: f5(slab) raw: 0200000000000040 ffff8881001d28c0 ffffea000422fe00 0000000000000004 raw: ffff888106ef3cc0 0000000080190010 00000000f5000000 0000000000000000 head: 0200000000000040 ffff8881001d28c0 ffffea000422fe00 0000000000000004 head: ffff888106ef3cc0 0000000080190010 00000000f5000000 0000000000000000 head: 0200000000000001 ffffea00041bbc81 00000000ffffffff 00000000ffffffff head: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000 page dumped because: kasan: bad access detected Memory state around the buggy address: ffff888106ef2800: 00 00 00 00 00 00 00 00 00 00 00 00 fc fc fc fc ffff888106ef2880: fc fc fc fc fc fc fc fc fa fb fb fb fb fb fb fb >ffff888106ef2900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ^ ffff888106ef2980: fb fb fb fb fc fc fc fc fc fc fc fc fc fc fc fc ffff888106ef2a00: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb Bug: 432753641 Fixes: 314001f0bf92 ("af_unix: Add OOB support") Reported-by: Jann Horn Signed-off-by: Kuniyuki Iwashima Reviewed-by: Jann Horn Link: https://patch.msgid.link/20250619041457.1132791-2-kuni1840@gmail.com Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin (cherry picked from commit 61a9ad7b69ce688697e5f63332f03e17725353bc) Signed-off-by: Lee Jones Change-Id: Ia34dec3a7c718542440d6906fa487acd1d90e930 --- net/unix/af_unix.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 6b17623004439..2dfd3b70a7178 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -2613,11 +2613,11 @@ struct unix_stream_read_state { #if IS_ENABLED(CONFIG_AF_UNIX_OOB) static int unix_stream_recv_urg(struct unix_stream_read_state *state) { + struct sk_buff *oob_skb, *read_skb = NULL; struct socket *sock = state->socket; struct sock *sk = sock->sk; struct unix_sock *u = unix_sk(sk); int chunk = 1; - struct sk_buff *oob_skb; mutex_lock(&u->iolock); unix_state_lock(sk); @@ -2632,9 +2632,16 @@ static int unix_stream_recv_urg(struct unix_stream_read_state *state) oob_skb = u->oob_skb; - if (!(state->flags & MSG_PEEK)) + if (!(state->flags & MSG_PEEK)) { WRITE_ONCE(u->oob_skb, NULL); + if (oob_skb->prev != (struct sk_buff *)&sk->sk_receive_queue && + !unix_skb_len(oob_skb->prev)) { + read_skb = oob_skb->prev; + __skb_unlink(read_skb, &sk->sk_receive_queue); + } + } + spin_unlock(&sk->sk_receive_queue.lock); unix_state_unlock(sk); @@ -2645,6 +2652,8 @@ static int unix_stream_recv_urg(struct unix_stream_read_state *state) mutex_unlock(&u->iolock); + consume_skb(read_skb); + if (chunk < 0) return -EFAULT; -- GitLab From 633de2adabf1ccd886416d1fdb4f57e90eded752 Mon Sep 17 00:00:00 2001 From: Matthias Maennich Date: Thu, 15 Jun 2023 09:46:34 +0100 Subject: [PATCH 2122/2211] ANDROID: Enable GKI Dr. No Enforcement This locks down OWNERS approval to a small group to guard against unintentional breakages. Bug: 341883495 Signed-off-by: Matthias Maennich (cherry picked from https://android-review.googlesource.com/q/commit:78af57d9b7fbfcc8ecfde3cf0cdb2739d084ebde) Merged-In: I58ca467b1e7786e1ad0f6ad67c7a7a5845a91ec6 Change-Id: I58ca467b1e7786e1ad0f6ad67c7a7a5845a91ec6 --- OWNERS | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/OWNERS b/OWNERS index a5ada4cbd8843..414594e3f646c 100644 --- a/OWNERS +++ b/OWNERS @@ -1,21 +1,12 @@ -# The full list of approvers is defined in -# https://android.googlesource.com/kernel/common/+/refs/meta/config/OWNERS +set noparent -# The following OWNERS are defined at the top level to improve the OWNERS -# suggestions through any user interface. Consider those people the ones that -# can help with finding the best person to review. -adelva@google.com -gregkh@google.com -joneslee@google.com -maennich@google.com -saravanak@google.com -surenb@google.com -tkjos@google.com -vmartensson@google.com -willdeacon@google.com +# GKI Dr. No Enforcement is active on this branch. Approval of one of the Dr. +# No reviewers is required following a regular CodeReview+2 vote of a code +# reviewer. +# +# See the GKI release documentation (go/gki-dr-no) for further details. +# +# The expanded list of reviewers can be found at: +# https://android.googlesource.com/kernel/common/+/android-mainline/OWNERS_DrNo -# Test mapping changes can be made by anyone -per-file */TEST_MAPPING = * - -# Test config xml can be made by anyone -per-file */*.xml = * +include kernel/common:android-mainline:/OWNERS_DrNo -- GitLab From 4d4a57c298f4d8df86123e7ef494565aa2c92d75 Mon Sep 17 00:00:00 2001 From: Matthias Maennich Date: Thu, 15 Jun 2023 09:46:45 +0100 Subject: [PATCH 2123/2211] ANDROID: Remove all but top-level OWNERS Now that the branch is used to create production GKI images, need to institute ACK DrNo for all commits. The DrNo approvers are in the android-mainline branch at /OWNERS_DrNo. Bug: 341883495 Signed-off-by: Matthias Maennich Change-Id: Id5bb83d7add5f314df6816c1c51b4bf2d8018e79 --- Documentation/ABI/testing/OWNERS | 1 - Documentation/filesystems/OWNERS | 1 - arch/arm/OWNERS | 1 - arch/arm64/OWNERS | 4 ---- arch/x86/OWNERS | 3 --- block/OWNERS | 2 -- crypto/OWNERS | 1 - drivers/OWNERS | 6 ------ fs/OWNERS | 1 - fs/f2fs/OWNERS | 1 - fs/incfs/OWNERS | 2 -- include/OWNERS | 1 - include/linux/OWNERS | 4 ---- include/trace/events/OWNERS | 1 - include/uapi/linux/OWNERS | 3 --- kernel/sched/OWNERS | 3 --- mm/OWNERS | 3 --- net/OWNERS | 2 -- tools/testing/OWNERS | 3 --- tools/testing/selftests/OWNERS | 4 ---- tools/testing/selftests/filesystems/fuse/OWNERS | 2 -- tools/testing/selftests/filesystems/incfs/OWNERS | 1 - 22 files changed, 50 deletions(-) delete mode 100644 Documentation/ABI/testing/OWNERS delete mode 100644 Documentation/filesystems/OWNERS delete mode 100644 arch/arm/OWNERS delete mode 100644 arch/arm64/OWNERS delete mode 100644 arch/x86/OWNERS delete mode 100644 block/OWNERS delete mode 100644 crypto/OWNERS delete mode 100644 drivers/OWNERS delete mode 100644 fs/OWNERS delete mode 100644 fs/f2fs/OWNERS delete mode 100644 fs/incfs/OWNERS delete mode 100644 include/OWNERS delete mode 100644 include/linux/OWNERS delete mode 100644 include/trace/events/OWNERS delete mode 100644 include/uapi/linux/OWNERS delete mode 100644 kernel/sched/OWNERS delete mode 100644 mm/OWNERS delete mode 100644 net/OWNERS delete mode 100644 tools/testing/OWNERS delete mode 100644 tools/testing/selftests/OWNERS delete mode 100644 tools/testing/selftests/filesystems/fuse/OWNERS delete mode 100644 tools/testing/selftests/filesystems/incfs/OWNERS diff --git a/Documentation/ABI/testing/OWNERS b/Documentation/ABI/testing/OWNERS deleted file mode 100644 index 3ab5dca46dbe8..0000000000000 --- a/Documentation/ABI/testing/OWNERS +++ /dev/null @@ -1 +0,0 @@ -per-file sysfs-fs-f2fs=file:/fs/f2fs/OWNERS diff --git a/Documentation/filesystems/OWNERS b/Documentation/filesystems/OWNERS deleted file mode 100644 index a63dbf4659f26..0000000000000 --- a/Documentation/filesystems/OWNERS +++ /dev/null @@ -1 +0,0 @@ -per-file f2fs**=file:/fs/f2fs/OWNERS diff --git a/arch/arm/OWNERS b/arch/arm/OWNERS deleted file mode 100644 index 54f66d6eb2ee2..0000000000000 --- a/arch/arm/OWNERS +++ /dev/null @@ -1 +0,0 @@ -include ../arm64/OWNERS diff --git a/arch/arm64/OWNERS b/arch/arm64/OWNERS deleted file mode 100644 index f362e24fd9cfd..0000000000000 --- a/arch/arm64/OWNERS +++ /dev/null @@ -1,4 +0,0 @@ -per-file crypto/**=file:/crypto/OWNERS -per-file {include,kernel,kvm,lib}/**=mzyngier@google.com,willdeacon@google.com -per-file mm/**=file:/mm/OWNERS -per-file net/**=file:/net/OWNERS diff --git a/arch/x86/OWNERS b/arch/x86/OWNERS deleted file mode 100644 index f59fa995b361f..0000000000000 --- a/arch/x86/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -per-file crypto/**=file:/crypto/OWNERS -per-file mm/**=file:/mm/OWNERS -per-file net/**=file:/net/OWNERS diff --git a/block/OWNERS b/block/OWNERS deleted file mode 100644 index 2641e066350bf..0000000000000 --- a/block/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -bvanassche@google.com -jaegeuk@google.com diff --git a/crypto/OWNERS b/crypto/OWNERS deleted file mode 100644 index 4ed35a0f46687..0000000000000 --- a/crypto/OWNERS +++ /dev/null @@ -1 +0,0 @@ -ardb@google.com diff --git a/drivers/OWNERS b/drivers/OWNERS deleted file mode 100644 index c13fa056367d8..0000000000000 --- a/drivers/OWNERS +++ /dev/null @@ -1,6 +0,0 @@ -per-file base/**=gregkh@google.com,saravanak@google.com -per-file block/**=akailash@google.com -per-file md/**=akailash@google.com,paullawrence@google.com -per-file net/**=file:/net/OWNERS -per-file scsi/**=bvanassche@google.com,jaegeuk@google.com -per-file {tty,usb}/**=gregkh@google.com diff --git a/fs/OWNERS b/fs/OWNERS deleted file mode 100644 index 7780f6be0335a..0000000000000 --- a/fs/OWNERS +++ /dev/null @@ -1 +0,0 @@ -per-file {crypto,verity}/**=ebiggers@google.com diff --git a/fs/f2fs/OWNERS b/fs/f2fs/OWNERS deleted file mode 100644 index 6a5c01163993e..0000000000000 --- a/fs/f2fs/OWNERS +++ /dev/null @@ -1 +0,0 @@ -jaegeuk@google.com diff --git a/fs/incfs/OWNERS b/fs/incfs/OWNERS deleted file mode 100644 index 1b97669c9b158..0000000000000 --- a/fs/incfs/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -akailash@google.com -paullawrence@google.com diff --git a/include/OWNERS b/include/OWNERS deleted file mode 100644 index 4b815c212f9d4..0000000000000 --- a/include/OWNERS +++ /dev/null @@ -1 +0,0 @@ -per-file net/**=file:/net/OWNERS diff --git a/include/linux/OWNERS b/include/linux/OWNERS deleted file mode 100644 index 68b6dedea64f3..0000000000000 --- a/include/linux/OWNERS +++ /dev/null @@ -1,4 +0,0 @@ -per-file bio.h=file:/block/OWNERS -per-file blk*.h=file:/block/OWNERS -per-file f2fs**=file:/fs/f2fs/OWNERS -per-file net**=file:/net/OWNERS diff --git a/include/trace/events/OWNERS b/include/trace/events/OWNERS deleted file mode 100644 index a63dbf4659f26..0000000000000 --- a/include/trace/events/OWNERS +++ /dev/null @@ -1 +0,0 @@ -per-file f2fs**=file:/fs/f2fs/OWNERS diff --git a/include/uapi/linux/OWNERS b/include/uapi/linux/OWNERS deleted file mode 100644 index 8aed640a46795..0000000000000 --- a/include/uapi/linux/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -per-file f2fs**=file:/fs/f2fs/OWNERS -per-file fuse**=file:/fs/fuse/OWNERS -per-file net**=file:/net/OWNERS diff --git a/kernel/sched/OWNERS b/kernel/sched/OWNERS deleted file mode 100644 index 17c812cdb74cf..0000000000000 --- a/kernel/sched/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -elavila@google.com -qperret@google.com -tkjos@google.com diff --git a/mm/OWNERS b/mm/OWNERS deleted file mode 100644 index 5f97cfd4bee5d..0000000000000 --- a/mm/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -kaleshsingh@google.com -surenb@google.com -minchan@google.com diff --git a/net/OWNERS b/net/OWNERS deleted file mode 100644 index cbbfa70f7d898..0000000000000 --- a/net/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -lorenzo@google.com -maze@google.com diff --git a/tools/testing/OWNERS b/tools/testing/OWNERS deleted file mode 100644 index fc8a402008c84..0000000000000 --- a/tools/testing/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -bettyzhou@google.com -edliaw@google.com -hwj@google.com \ No newline at end of file diff --git a/tools/testing/selftests/OWNERS b/tools/testing/selftests/OWNERS deleted file mode 100644 index fa7b94ba47cc1..0000000000000 --- a/tools/testing/selftests/OWNERS +++ /dev/null @@ -1,4 +0,0 @@ -bettyzhou@google.com -edliaw@google.com -hwj@google.com -joefradley@google.com diff --git a/tools/testing/selftests/filesystems/fuse/OWNERS b/tools/testing/selftests/filesystems/fuse/OWNERS deleted file mode 100644 index 5eb371e1a5a31..0000000000000 --- a/tools/testing/selftests/filesystems/fuse/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -# include OWNERS from the authoritative android-mainline branch -include kernel/common:android-mainline:/tools/testing/selftests/filesystems/incfs/OWNERS diff --git a/tools/testing/selftests/filesystems/incfs/OWNERS b/tools/testing/selftests/filesystems/incfs/OWNERS deleted file mode 100644 index f26e11cd57400..0000000000000 --- a/tools/testing/selftests/filesystems/incfs/OWNERS +++ /dev/null @@ -1 +0,0 @@ -file:/fs/incfs/OWNERS -- GitLab From 75ee043e200de788cff9d0ab04b108fcb77be9d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aaro=20M=C3=A4kinen?= Date: Tue, 22 Jul 2025 13:11:36 +0300 Subject: [PATCH 2124/2211] ANDROID: GKI: Update symbols to symbol list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This list covers symbols for file systems by Tuxera 5 function symbol(s) added 'int LZ4_compress_default(const char*, char*, int, int, void*)' 'unsigned int filemap_get_folios_contig(struct address_space*, unsigned long*, unsigned long, struct folio_batch*)' 'struct wait_queue_head* inode_bit_waitqueue(struct wait_bit_queue_entry*, struct inode*, u32)' 'void shrink_dcache_sb(struct super_block*)' 'int zlib_inflateEnd(z_streamp)' Bug: 433417229 Change-Id: Id120b8de7bdd05b9a4f53be433c506cbf27344cf Signed-off-by: Aaro Mäkinen --- gki/aarch64/abi.stg | 74 ++++++++++++++++++++++++++++++++++++++ gki/aarch64/symbols/tuxera | 5 +++ 2 files changed, 79 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 7fbf007b57096..c9c71b798b445 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -397400,6 +397400,15 @@ function { parameter_id: 0x6720d32f parameter_id: 0x18bd6530 } +function { + id: 0x920e936a + return_type_id: 0x6720d32f + parameter_id: 0x3e10b518 + parameter_id: 0x0483e6f8 + parameter_id: 0x6720d32f + parameter_id: 0x6720d32f + parameter_id: 0x18bd6530 +} function { id: 0x920e9545 return_type_id: 0x6720d32f @@ -422873,6 +422882,14 @@ function { parameter_id: 0x116785ed parameter_id: 0x4585663f } +function { + id: 0xcbaec654 + return_type_id: 0x4585663f + parameter_id: 0x1582ab06 + parameter_id: 0x064d6086 + parameter_id: 0x33756485 + parameter_id: 0x3ead5537 +} function { id: 0xcbafce8f return_type_id: 0x4585663f @@ -425968,6 +425985,13 @@ function { parameter_id: 0x4585663f parameter_id: 0x07dcdbe1 } +function { + id: 0xfc9027e1 + return_type_id: 0x172847a8 + parameter_id: 0x0e6c7d79 + parameter_id: 0x1b8590a8 + parameter_id: 0xc9082b19 +} function { id: 0xfc9ebae8 return_type_id: 0xa047635b @@ -426427,6 +426451,15 @@ elf_symbol { type_id: 0x2dfa71ba full_name: "I_BDEV" } +elf_symbol { + id: 0x6ea63025 + name: "LZ4_compress_default" + is_defined: true + symbol_type: FUNCTION + crc: 0xe04b6e87 + type_id: 0x920e936a + full_name: "LZ4_compress_default" +} elf_symbol { id: 0x7c322a62 name: "LZ4_compress_fast" @@ -462422,6 +462455,15 @@ elf_symbol { type_id: 0x98e049ee full_name: "filemap_flush" } +elf_symbol { + id: 0x667b7dc2 + name: "filemap_get_folios_contig" + is_defined: true + symbol_type: FUNCTION + crc: 0x73b53b1f + type_id: 0xcbaec654 + full_name: "filemap_get_folios_contig" +} elf_symbol { id: 0xb11f578f name: "filemap_get_folios_tag" @@ -469138,6 +469180,15 @@ elf_symbol { type_id: 0x16e7aaa1 full_name: "inode_add_bytes" } +elf_symbol { + id: 0x2669fc5e + name: "inode_bit_waitqueue" + is_defined: true + symbol_type: FUNCTION + crc: 0x14b174e5 + type_id: 0xfc9027e1 + full_name: "inode_bit_waitqueue" +} elf_symbol { id: 0x160359c2 name: "inode_dio_finished" @@ -491950,6 +492001,15 @@ elf_symbol { type_id: 0x10d0da4c full_name: "show_regs" } +elf_symbol { + id: 0x2912067f + name: "shrink_dcache_sb" + is_defined: true + symbol_type: FUNCTION + crc: 0x4985874c + type_id: 0x1923cb99 + full_name: "shrink_dcache_sb" +} elf_symbol { id: 0x59a21b13 name: "shrink_slab" @@ -508530,6 +508590,15 @@ elf_symbol { type_id: 0x80d705f2 full_name: "zlib_inflate" } +elf_symbol { + id: 0x84c3c252 + name: "zlib_inflateEnd" + is_defined: true + symbol_type: FUNCTION + crc: 0x43445be5 + type_id: 0x814b86be + full_name: "zlib_inflateEnd" +} elf_symbol { id: 0xf6eda681 name: "zlib_inflateIncomp" @@ -508733,6 +508802,7 @@ interface { symbol_id: 0x698a526c symbol_id: 0x4203f861 symbol_id: 0x2dddbe52 + symbol_id: 0x6ea63025 symbol_id: 0x7c322a62 symbol_id: 0x38116da8 symbol_id: 0x31a154b4 @@ -512731,6 +512801,7 @@ interface { symbol_id: 0x3289d59f symbol_id: 0x82b19820 symbol_id: 0x7c937fc2 + symbol_id: 0x667b7dc2 symbol_id: 0xb11f578f symbol_id: 0x226f5e58 symbol_id: 0x70cbb212 @@ -513476,6 +513547,7 @@ interface { symbol_id: 0x215b5641 symbol_id: 0xbf6470f2 symbol_id: 0x77f61a26 + symbol_id: 0x2669fc5e symbol_id: 0x160359c2 symbol_id: 0x7a805e08 symbol_id: 0x1fbe523f @@ -516009,6 +516081,7 @@ interface { symbol_id: 0x96bd64f2 symbol_id: 0x064eb0d1 symbol_id: 0xbf6056e5 + symbol_id: 0x2912067f symbol_id: 0x59a21b13 symbol_id: 0xe40fa478 symbol_id: 0xd3347f05 @@ -517851,6 +517924,7 @@ interface { symbol_id: 0xf158bd25 symbol_id: 0xee403ebb symbol_id: 0x52ed8956 + symbol_id: 0x84c3c252 symbol_id: 0xf6eda681 symbol_id: 0xd7745fba symbol_id: 0xd9789392 diff --git a/gki/aarch64/symbols/tuxera b/gki/aarch64/symbols/tuxera index 37ca36e90811a..934f0170632ad 100644 --- a/gki/aarch64/symbols/tuxera +++ b/gki/aarch64/symbols/tuxera @@ -16,6 +16,7 @@ file_check_and_advance_wb_err filemap_add_folio filemap_check_errors + filemap_get_folios_contig filemap_release_folio __folio_cancel_dirty folio_end_read @@ -26,10 +27,12 @@ iget_locked ilookup5 inode_add_bytes + inode_bit_waitqueue inode_maybe_inc_iversion inode_query_iversion __insert_inode_hash iov_iter_single_seg_count + LZ4_compress_default make_vfsgid make_vfsuid mark_buffer_write_io_error @@ -43,6 +46,7 @@ __remove_inode_hash sb_min_blocksize security_inode_init_security + shrink_dcache_sb __sync_dirty_buffer sysctl_hung_task_timeout_secs tag_pages_for_writeback @@ -51,3 +55,4 @@ utf32_to_utf8 wake_bit_function wrap_directory_iterator + zlib_inflateEnd -- GitLab From 572fd93b80fdb4f49ef8a048d4bd75df6f38f864 Mon Sep 17 00:00:00 2001 From: James Tai Date: Mon, 21 Jul 2025 15:59:57 +0800 Subject: [PATCH 2125/2211] ANDROID: GKI: Update RTK STB KMI symbol list 5 function symbol(s) added 'int dev_pm_opp_register_notifier(struct device*, struct notifier_block*)' 'int dev_pm_opp_unregister_notifier(struct device*, struct notifier_block*)' 'int of_i2c_get_board_info(struct device*, struct device_node*, struct i2c_board_info*)' 'int regulator_register_supply_alias(struct device*, const char*, struct device*, const char*)' 'void regulator_unregister_supply_alias(struct device*, const char*)' Bug: 433161360 Change-Id: Ic6ef60e79d108c70e617cae0b9ff35dafe8d399d Signed-off-by: James Tai --- gki/aarch64/abi.stg | 71 ++++++++++++++++++++++++++++++++++++++ gki/aarch64/symbols/rtkstb | 9 +++++ 2 files changed, 80 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index c9c71b798b445..0f45f7c84353e 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -373448,6 +373448,12 @@ function { return_type_id: 0x48b5725f parameter_id: 0x01b328b8 } +function { + id: 0x10f62d1c + return_type_id: 0x48b5725f + parameter_id: 0x0258f96e + parameter_id: 0x3e10b518 +} function { id: 0x10f7e72f return_type_id: 0x48b5725f @@ -416868,6 +416874,13 @@ function { return_type_id: 0x6720d32f parameter_id: 0x0130219f } +function { + id: 0x9dccf51d + return_type_id: 0x6720d32f + parameter_id: 0x0258f96e + parameter_id: 0x347303b4 + parameter_id: 0x2f919e03 +} function { id: 0x9dcd39d1 return_type_id: 0x6720d32f @@ -417326,6 +417339,14 @@ function { parameter_id: 0x3e10b518 parameter_id: 0x00c72527 } +function { + id: 0x9deef1dc + return_type_id: 0x6720d32f + parameter_id: 0x0258f96e + parameter_id: 0x3e10b518 + parameter_id: 0x0258f96e + parameter_id: 0x3e10b518 +} function { id: 0x9df11d57 return_type_id: 0x6720d32f @@ -452152,6 +452173,15 @@ elf_symbol { type_id: 0x196c5dcc full_name: "dev_pm_opp_put_opp_table" } +elf_symbol { + id: 0x1312b8f1 + name: "dev_pm_opp_register_notifier" + is_defined: true + symbol_type: FUNCTION + crc: 0xe76781fc + type_id: 0x9d7807e5 + full_name: "dev_pm_opp_register_notifier" +} elf_symbol { id: 0xe6f275cc name: "dev_pm_opp_remove" @@ -452215,6 +452245,15 @@ elf_symbol { type_id: 0x9dd2e674 full_name: "dev_pm_opp_set_sharing_cpus" } +elf_symbol { + id: 0x0e308173 + name: "dev_pm_opp_unregister_notifier" + is_defined: true + symbol_type: FUNCTION + crc: 0xe76781fc + type_id: 0x9d7807e5 + full_name: "dev_pm_opp_unregister_notifier" +} elf_symbol { id: 0x72797495 name: "dev_pm_qos_add_notifier" @@ -479252,6 +479291,15 @@ elf_symbol { type_id: 0x9100a08e full_name: "of_hwspin_lock_get_id" } +elf_symbol { + id: 0xf1e7ee30 + name: "of_i2c_get_board_info" + is_defined: true + symbol_type: FUNCTION + crc: 0x10b6feff + type_id: 0x9dccf51d + full_name: "of_i2c_get_board_info" +} elf_symbol { id: 0x453bec03 name: "of_icc_get" @@ -487716,6 +487764,15 @@ elf_symbol { type_id: 0x9d85be32 full_name: "regulator_register_notifier" } +elf_symbol { + id: 0x504d7dfe + name: "regulator_register_supply_alias" + is_defined: true + symbol_type: FUNCTION + crc: 0x7a382155 + type_id: 0x9deef1dc + full_name: "regulator_register_supply_alias" +} elf_symbol { id: 0x21d8367b name: "regulator_set_active_discharge_regmap" @@ -487878,6 +487935,15 @@ elf_symbol { type_id: 0x9d85be32 full_name: "regulator_unregister_notifier" } +elf_symbol { + id: 0xdecab267 + name: "regulator_unregister_supply_alias" + is_defined: true + symbol_type: FUNCTION + crc: 0xbc4a6dcc + type_id: 0x10f62d1c + full_name: "regulator_unregister_supply_alias" +} elf_symbol { id: 0xc0705cb4 name: "release_firmware" @@ -511659,6 +511725,7 @@ interface { symbol_id: 0x706732e6 symbol_id: 0x52c8a093 symbol_id: 0x4624f3d3 + symbol_id: 0x1312b8f1 symbol_id: 0xe6f275cc symbol_id: 0x90259097 symbol_id: 0xd0c0c222 @@ -511666,6 +511733,7 @@ interface { symbol_id: 0x9b2f909d symbol_id: 0xc927ca5d symbol_id: 0xe3ab91c3 + symbol_id: 0x0e308173 symbol_id: 0x72797495 symbol_id: 0x8b918cf2 symbol_id: 0xf9527ac4 @@ -514666,6 +514734,7 @@ interface { symbol_id: 0xe63f0c53 symbol_id: 0x8be0e5f9 symbol_id: 0xb3d357f8 + symbol_id: 0xf1e7ee30 symbol_id: 0x453bec03 symbol_id: 0xbd1c7f26 symbol_id: 0x21b8efef @@ -515605,6 +515674,7 @@ interface { symbol_id: 0xbf6a903f symbol_id: 0xfd977d86 symbol_id: 0xddb9ed35 + symbol_id: 0x504d7dfe symbol_id: 0x21d8367b symbol_id: 0xc9c5804a symbol_id: 0xce959ab5 @@ -515623,6 +515693,7 @@ interface { symbol_id: 0x21b06e02 symbol_id: 0x70f8b485 symbol_id: 0x3a44a497 + symbol_id: 0xdecab267 symbol_id: 0xc0705cb4 symbol_id: 0x5ebdf90f symbol_id: 0xe7e7ab1a diff --git a/gki/aarch64/symbols/rtkstb b/gki/aarch64/symbols/rtkstb index d8d56cfd393d9..5ec47c267ae75 100644 --- a/gki/aarch64/symbols/rtkstb +++ b/gki/aarch64/symbols/rtkstb @@ -875,6 +875,8 @@ dev_pm_opp_of_get_sharing_cpus dev_pm_opp_of_register_em dev_pm_opp_set_sharing_cpus + dev_pm_opp_register_notifier + dev_pm_opp_unregister_notifier policy_has_boost_freq # required by cqhci.ko @@ -1829,6 +1831,13 @@ unpin_user_pages uuid_null +# required by regulator_supply_alias.ko + regulator_register_supply_alias + regulator_unregister_supply_alias + +# required by selector.ko + of_i2c_get_board_info + # preserved by --additions-only cancel_work phy_start_aneg -- GitLab From f97c8e1021d8db35fedf2acadc0390d32a0f851a Mon Sep 17 00:00:00 2001 From: Jian-Hong Pan Date: Fri, 15 Nov 2024 15:22:02 +0800 Subject: [PATCH 2126/2211] UPSTREAM: PCI/ASPM: Save parent L1SS config in pci_save_aspm_l1ss_state() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After 17423360a27a ("PCI/ASPM: Save L1 PM Substates Capability for suspend/resume"), pci_save_aspm_l1ss_state(dev) saves the L1SS state for "dev", and pci_restore_aspm_l1ss_state(dev) restores the state for both "dev" and its parent. The problem is that unless pci_save_state() has been used in some other path and has already saved the parent L1SS state, we will restore junk to the parent, which means the L1 Substates likely won't work correctly. Save the L1SS config for both the device and its parent in pci_save_aspm_l1ss_state(). When restoring, we need both because L1SS must be enabled at the parent (the Downstream Port) before being enabled at the child (the Upstream Port). Bug: 367893204 Test: build with and without CONFIG_PCIEASPM Test: lspci -vvv / check L1 substate capabilities Link: https://lore.kernel.org/r/20241115072200.37509-3-jhp@endlessos.org Fixes: 17423360a27a ("PCI/ASPM: Save L1 PM Substates Capability for suspend/resume") Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218394 Suggested-by: Ilpo Järvinen Change-Id: I2639abacd417088fb315e35b9af053d0733117b9 Signed-off-by: Jian-Hong Pan [bhelgaas: parallel save/restore structure, simplify commit log, patch at https: //lore.kernel.org/r/20241212230340.GA3267194@bhelgaas] Signed-off-by: Bjorn Helgaas Tested-by: Jian-Hong Pan # Asus B1400CEAE (cherry picked from commit 1db806ec06b7c6e08e8af57088da067963ddf117) Signed-off-by: Brian Norris (cherry picked from commit 866b883aada6a80d4698530b540ffe8498790836) --- drivers/pci/pcie/aspm.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 62650a2f00ccc..bdc32eb5f23a7 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -81,24 +81,47 @@ void pci_configure_aspm_l1ss(struct pci_dev *pdev) void pci_save_aspm_l1ss_state(struct pci_dev *pdev) { + struct pci_dev *parent = pdev->bus->self; struct pci_cap_saved_state *save_state; - u16 l1ss = pdev->l1ss; u32 *cap; + /* + * If this is a Downstream Port, we never restore the L1SS state + * directly; we only restore it when we restore the state of the + * Upstream Port below it. + */ + if (pcie_downstream_port(pdev) || !parent) + return; + + if (!pdev->l1ss || !parent->l1ss) + return; + /* * Save L1 substate configuration. The ASPM L0s/L1 configuration * in PCI_EXP_LNKCTL_ASPMC is saved by pci_save_pcie_state(). */ - if (!l1ss) + save_state = pci_find_saved_ext_cap(pdev, PCI_EXT_CAP_ID_L1SS); + if (!save_state) return; - save_state = pci_find_saved_ext_cap(pdev, PCI_EXT_CAP_ID_L1SS); + cap = &save_state->cap.data[0]; + pci_read_config_dword(pdev, pdev->l1ss + PCI_L1SS_CTL2, cap++); + pci_read_config_dword(pdev, pdev->l1ss + PCI_L1SS_CTL1, cap++); + + if (parent->state_saved) + return; + + /* + * Save parent's L1 substate configuration so we have it for + * pci_restore_aspm_l1ss_state(pdev) to restore. + */ + save_state = pci_find_saved_ext_cap(parent, PCI_EXT_CAP_ID_L1SS); if (!save_state) return; cap = &save_state->cap.data[0]; - pci_read_config_dword(pdev, l1ss + PCI_L1SS_CTL2, cap++); - pci_read_config_dword(pdev, l1ss + PCI_L1SS_CTL1, cap++); + pci_read_config_dword(parent, parent->l1ss + PCI_L1SS_CTL2, cap++); + pci_read_config_dword(parent, parent->l1ss + PCI_L1SS_CTL1, cap++); } void pci_restore_aspm_l1ss_state(struct pci_dev *pdev) -- GitLab From b1b73a80a8ce108efc3977e3fd17d3e55ccd2092 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Tue, 22 Jul 2025 12:52:12 +0000 Subject: [PATCH 2127/2211] ANDROID: irqchip/gic-v3: Remove gic_v3_suspend() stub for !CONFIG_PM builds gic_v3_suspend() does not need to be defined when CONFIG_PM is not enabled. Doing so causes a build error when building with the -Werror,-Wunused-function flags as seen below: drivers/irqchip/irq-gic-v3.c:1586:12: error: unused function 'gic_v3_suspend' [-Werror,-Wunused-function] 1586 | static int gic_v3_suspend(void) { return 0; } | ^~~~~~~~~~~~~~ 1 error generated. Fix by removing gic_v3_suspend when CONFIG_PM is not defined. Bug: 433421153 Fixes: bca065e87652 ("ANDROID: irqchip/irq-gic-v3: Add vendor hook for gic suspend") Change-Id: I2b9262a68cd61f13bddb88a9f200a32d5aeb0f1f Signed-off-by: Isaac J. Manjarres --- drivers/irqchip/irq-gic-v3.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index 15cf996e37603..7daaac8ff87fe 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -1583,7 +1583,6 @@ static void gic_syscore_init(void) #else static inline void gic_syscore_init(void) { } -static int gic_v3_suspend(void) { return 0; } #endif /* CONFIG_PM */ static struct irq_chip gic_chip = { -- GitLab From dbbac76867d1844c09c3a008d2624246c2e73b21 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Thu, 17 Jul 2025 10:01:08 +0100 Subject: [PATCH 2128/2211] FROMGIT: vhost/vsock: Avoid allocating arbitrarily-sized SKBs vhost_vsock_alloc_skb() returns NULL for packets advertising a length larger than VIRTIO_VSOCK_MAX_PKT_BUF_SIZE in the packet header. However, this is only checked once the SKB has been allocated and, if the length in the packet header is zero, the SKB may not be freed immediately. Hoist the size check before the SKB allocation so that an iovec larger than VIRTIO_VSOCK_MAX_PKT_BUF_SIZE + the header size is rejected outright. The subsequent check on the length field in the header can then simply check that the allocated SKB is indeed large enough to hold the packet. Cc: Fixes: 71dc9ec9ac7d ("virtio/vsock: replace virtio_vsock_pkt with sk_buff") Reviewed-by: Stefano Garzarella Signed-off-by: Will Deacon Message-Id: <20250717090116.11987-2-will@kernel.org> Signed-off-by: Michael S. Tsirkin (cherry picked from commit c76f3c4364fe523cd2782269eab92529c86217aa git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git vhost) Bug: 421244320 Signed-off-by: Will Deacon Change-Id: Ie904fdc2790aadb12c9775e6ae3ca7a74fa0cc39 --- drivers/vhost/vsock.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c index 802153e230730..66a0f060770ef 100644 --- a/drivers/vhost/vsock.c +++ b/drivers/vhost/vsock.c @@ -344,6 +344,9 @@ vhost_vsock_alloc_skb(struct vhost_virtqueue *vq, len = iov_length(vq->iov, out); + if (len > VIRTIO_VSOCK_MAX_PKT_BUF_SIZE + VIRTIO_VSOCK_SKB_HEADROOM) + return NULL; + /* len contains both payload and hdr */ skb = virtio_vsock_alloc_skb(len, GFP_KERNEL); if (!skb) @@ -367,8 +370,7 @@ vhost_vsock_alloc_skb(struct vhost_virtqueue *vq, return skb; /* The pkt is too big or the length in the header is invalid */ - if (payload_len > VIRTIO_VSOCK_MAX_PKT_BUF_SIZE || - payload_len + sizeof(*hdr) > len) { + if (payload_len + sizeof(*hdr) > len) { kfree_skb(skb); return NULL; } -- GitLab From 8632e465a83d2e88b896bcdc9c44e6bb684fbae8 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Thu, 17 Jul 2025 10:01:09 +0100 Subject: [PATCH 2129/2211] FROMGIT: vsock/virtio: Validate length in packet header before skb_put() When receiving a vsock packet in the guest, only the virtqueue buffer size is validated prior to virtio_vsock_skb_rx_put(). Unfortunately, virtio_vsock_skb_rx_put() uses the length from the packet header as the length argument to skb_put(), potentially resulting in SKB overflow if the host has gone wonky. Validate the length as advertised by the packet header before calling virtio_vsock_skb_rx_put(). Cc: Fixes: 71dc9ec9ac7d ("virtio/vsock: replace virtio_vsock_pkt with sk_buff") Signed-off-by: Will Deacon Message-Id: <20250717090116.11987-3-will@kernel.org> Signed-off-by: Michael S. Tsirkin Reviewed-by: Stefano Garzarella (cherry picked from commit 774a14c4d15d0515f0ff88dfab7e08e22b07eb3e git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git vhost) Bug: 421244320 Signed-off-by: Will Deacon Change-Id: I2d6a8ce7d6284a262e24e5bec4a35796f018e64f --- net/vmw_vsock/virtio_transport.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c index f0e48e6911fc4..eb08a393413d4 100644 --- a/net/vmw_vsock/virtio_transport.c +++ b/net/vmw_vsock/virtio_transport.c @@ -624,8 +624,9 @@ static void virtio_transport_rx_work(struct work_struct *work) do { virtqueue_disable_cb(vq); for (;;) { + unsigned int len, payload_len; + struct virtio_vsock_hdr *hdr; struct sk_buff *skb; - unsigned int len; if (!virtio_transport_more_replies(vsock)) { /* Stop rx until the device processes already @@ -642,12 +643,19 @@ static void virtio_transport_rx_work(struct work_struct *work) vsock->rx_buf_nr--; /* Drop short/long packets */ - if (unlikely(len < sizeof(struct virtio_vsock_hdr) || + if (unlikely(len < sizeof(*hdr) || len > virtio_vsock_skb_len(skb))) { kfree_skb(skb); continue; } + hdr = virtio_vsock_hdr(skb); + payload_len = le32_to_cpu(hdr->len); + if (unlikely(payload_len > len - sizeof(*hdr))) { + kfree_skb(skb); + continue; + } + virtio_vsock_skb_rx_put(skb); virtio_transport_deliver_tap_pkt(skb); virtio_transport_recv_pkt(&virtio_transport, skb); -- GitLab From 89ff1bc0412be45aae99337b91f8ce4f462643d1 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Thu, 17 Jul 2025 10:01:10 +0100 Subject: [PATCH 2130/2211] FROMGIT: vsock/virtio: Move length check to callers of virtio_vsock_skb_rx_put() virtio_vsock_skb_rx_put() only calls skb_put() if the length in the packet header is not zero even though skb_put() handles this case gracefully. Remove the functionally redundant check from virtio_vsock_skb_rx_put() and, on the assumption that this is a worthwhile optimisation for handling credit messages, augment the existing length checks in virtio_transport_rx_work() to elide the call for zero-length payloads. Since the callers all have the length, extend virtio_vsock_skb_rx_put() to take it as an additional parameter rather than fish it back out of the packet header. Note that the vhost code already has similar logic in vhost_vsock_alloc_skb(). Reviewed-by: Stefano Garzarella Signed-off-by: Will Deacon Message-Id: <20250717090116.11987-4-will@kernel.org> Signed-off-by: Michael S. Tsirkin (cherry picked from commit e4b13dce25b41c63716ca51cbc33428245410592 git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git vhost) Bug: 421244320 Signed-off-by: Will Deacon Change-Id: I60ce676b0739ac7bcf8494dec9cb4672dd7b0159 --- drivers/vhost/vsock.c | 2 +- include/linux/virtio_vsock.h | 9 ++------- net/vmw_vsock/virtio_transport.c | 4 +++- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c index 66a0f060770ef..4c4a642945ebb 100644 --- a/drivers/vhost/vsock.c +++ b/drivers/vhost/vsock.c @@ -375,7 +375,7 @@ vhost_vsock_alloc_skb(struct vhost_virtqueue *vq, return NULL; } - virtio_vsock_skb_rx_put(skb); + virtio_vsock_skb_rx_put(skb, payload_len); nbytes = copy_from_iter(skb->data, payload_len, &iov_iter); if (nbytes != payload_len) { diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h index 296a8b629e9e9..fa40296c48d6e 100644 --- a/include/linux/virtio_vsock.h +++ b/include/linux/virtio_vsock.h @@ -47,14 +47,9 @@ static inline void virtio_vsock_skb_clear_tap_delivered(struct sk_buff *skb) VIRTIO_VSOCK_SKB_CB(skb)->tap_delivered = false; } -static inline void virtio_vsock_skb_rx_put(struct sk_buff *skb) +static inline void virtio_vsock_skb_rx_put(struct sk_buff *skb, u32 len) { - u32 len; - - len = le32_to_cpu(virtio_vsock_hdr(skb)->len); - - if (len > 0) - skb_put(skb, len); + skb_put(skb, len); } static inline struct sk_buff *virtio_vsock_alloc_skb(unsigned int size, gfp_t mask) diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c index eb08a393413d4..0166919f87056 100644 --- a/net/vmw_vsock/virtio_transport.c +++ b/net/vmw_vsock/virtio_transport.c @@ -656,7 +656,9 @@ static void virtio_transport_rx_work(struct work_struct *work) continue; } - virtio_vsock_skb_rx_put(skb); + if (payload_len) + virtio_vsock_skb_rx_put(skb, payload_len); + virtio_transport_deliver_tap_pkt(skb); virtio_transport_recv_pkt(&virtio_transport, skb); } -- GitLab From 00f97d95125720b37b3340288754e8c34282cd34 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Thu, 17 Jul 2025 10:01:11 +0100 Subject: [PATCH 2131/2211] FROMGIT: vsock/virtio: Resize receive buffers so that each SKB fits in a 4K page When allocating receive buffers for the vsock virtio RX virtqueue, an SKB is allocated with a 4140 data payload (the 44-byte packet header + VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE). Even when factoring in the SKB overhead, the resulting 8KiB allocation thanks to the rounding in kmalloc_reserve() is wasteful (~3700 unusable bytes) and results in a higher-order page allocation on systems with 4KiB pages just for the sake of a few hundred bytes of packet data. Limit the vsock virtio RX buffers to 4KiB per SKB, resulting in much better memory utilisation and removing the need to allocate higher-order pages entirely. Reviewed-by: Stefano Garzarella Signed-off-by: Will Deacon Message-Id: <20250717090116.11987-5-will@kernel.org> Signed-off-by: Michael S. Tsirkin (cherry picked from commit 5f96156100062d3efdc87ef8c469885675c68ad2 git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git vhost) Bug: 421244320 Signed-off-by: Will Deacon Change-Id: Idffe1209762d1380834ea62b276943ce9359d11a --- include/linux/virtio_vsock.h | 7 ++++++- net/vmw_vsock/virtio_transport.c | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h index fa40296c48d6e..4dab07f0f0a7f 100644 --- a/include/linux/virtio_vsock.h +++ b/include/linux/virtio_vsock.h @@ -106,7 +106,12 @@ static inline size_t virtio_vsock_skb_len(struct sk_buff *skb) return (size_t)(skb_end_pointer(skb) - skb->head); } -#define VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE (1024 * 4) +/* Dimension the RX SKB so that the entire thing fits exactly into + * a single 4KiB page. This avoids wasting memory due to alloc_skb() + * rounding up to the next page order and also means that we + * don't leave higher-order pages sitting around in the RX queue. + */ +#define VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE SKB_WITH_OVERHEAD(1024 * 4) #define VIRTIO_VSOCK_MAX_BUF_SIZE 0xFFFFFFFFUL #define VIRTIO_VSOCK_MAX_PKT_BUF_SIZE virtio_transport_max_vsock_pkt_buf_size extern uint virtio_transport_max_vsock_pkt_buf_size; diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c index 0166919f87056..39f346890f7f5 100644 --- a/net/vmw_vsock/virtio_transport.c +++ b/net/vmw_vsock/virtio_transport.c @@ -307,7 +307,7 @@ out_rcu: static void virtio_vsock_rx_fill(struct virtio_vsock *vsock) { - int total_len = VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE + VIRTIO_VSOCK_SKB_HEADROOM; + int total_len = VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE; struct scatterlist pkt, *p; struct virtqueue *vq; struct sk_buff *skb; -- GitLab From 4395f7d37ccd00efc4adfd806c8c26c574d422f5 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Thu, 17 Jul 2025 10:01:12 +0100 Subject: [PATCH 2132/2211] FROMGIT: vsock/virtio: Rename virtio_vsock_alloc_skb() In preparation for nonlinear allocations for large SKBs, rename virtio_vsock_alloc_skb() to virtio_vsock_alloc_linear_skb() to indicate that it returns linear SKBs unconditionally and switch all callers over to this new interface for now. No functional change. Reviewed-by: Stefano Garzarella Signed-off-by: Will Deacon Message-Id: <20250717090116.11987-6-will@kernel.org> Signed-off-by: Michael S. Tsirkin (cherry picked from commit a9d5b4a3ae3d72d8d8a74335aa06ff2e53082613 git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git vhost) Bug: 421244320 Signed-off-by: Will Deacon Change-Id: I1d0c1b18e7fd9dab855981a331ee0cb5f46de675 --- drivers/vhost/vsock.c | 2 +- include/linux/virtio_vsock.h | 3 ++- net/vmw_vsock/virtio_transport.c | 2 +- net/vmw_vsock/virtio_transport_common.c | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c index 4c4a642945ebb..1ad96613680ef 100644 --- a/drivers/vhost/vsock.c +++ b/drivers/vhost/vsock.c @@ -348,7 +348,7 @@ vhost_vsock_alloc_skb(struct vhost_virtqueue *vq, return NULL; /* len contains both payload and hdr */ - skb = virtio_vsock_alloc_skb(len, GFP_KERNEL); + skb = virtio_vsock_alloc_linear_skb(len, GFP_KERNEL); if (!skb) return NULL; diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h index 4dab07f0f0a7f..1a132177f4215 100644 --- a/include/linux/virtio_vsock.h +++ b/include/linux/virtio_vsock.h @@ -52,7 +52,8 @@ static inline void virtio_vsock_skb_rx_put(struct sk_buff *skb, u32 len) skb_put(skb, len); } -static inline struct sk_buff *virtio_vsock_alloc_skb(unsigned int size, gfp_t mask) +static inline struct sk_buff * +virtio_vsock_alloc_linear_skb(unsigned int size, gfp_t mask) { struct sk_buff *skb; diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c index 39f346890f7f5..80dcf6ac1e720 100644 --- a/net/vmw_vsock/virtio_transport.c +++ b/net/vmw_vsock/virtio_transport.c @@ -316,7 +316,7 @@ static void virtio_vsock_rx_fill(struct virtio_vsock *vsock) vq = vsock->vqs[VSOCK_VQ_RX]; do { - skb = virtio_vsock_alloc_skb(total_len, GFP_KERNEL); + skb = virtio_vsock_alloc_linear_skb(total_len, GFP_KERNEL); if (!skb) break; diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index 2a16a40ef5b2f..4e08d3016cdce 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -266,7 +266,7 @@ static struct sk_buff *virtio_transport_alloc_skb(struct virtio_vsock_pkt_info * if (!zcopy) skb_len += payload_len; - skb = virtio_vsock_alloc_skb(skb_len, GFP_KERNEL); + skb = virtio_vsock_alloc_linear_skb(skb_len, GFP_KERNEL); if (!skb) return NULL; -- GitLab From e6c6f40330c2e59f6b1755ab85b93086b6a3adac Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Thu, 17 Jul 2025 10:01:13 +0100 Subject: [PATCH 2133/2211] FROMGIT: vsock/virtio: Move SKB allocation lower-bound check to callers virtio_vsock_alloc_linear_skb() checks that the requested size is at least big enough for the packet header (VIRTIO_VSOCK_SKB_HEADROOM). Of the three callers of virtio_vsock_alloc_linear_skb(), only vhost_vsock_alloc_skb() can potentially pass a packet smaller than the header size and, as it already has a check against the maximum packet size, extend its bounds checking to consider the minimum packet size and remove the check from virtio_vsock_alloc_linear_skb(). Reviewed-by: Stefano Garzarella Signed-off-by: Will Deacon Message-Id: <20250717090116.11987-7-will@kernel.org> Signed-off-by: Michael S. Tsirkin (cherry picked from commit 1b21842062ebff3ee56ddde87b204391c8786705 git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git vhost) Bug: 421244320 Signed-off-by: Will Deacon Change-Id: I496896bd59f57375f7ba954161c3f0f77e62619b --- drivers/vhost/vsock.c | 3 ++- include/linux/virtio_vsock.h | 3 --- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c index 1ad96613680ef..24b7547b05a6c 100644 --- a/drivers/vhost/vsock.c +++ b/drivers/vhost/vsock.c @@ -344,7 +344,8 @@ vhost_vsock_alloc_skb(struct vhost_virtqueue *vq, len = iov_length(vq->iov, out); - if (len > VIRTIO_VSOCK_MAX_PKT_BUF_SIZE + VIRTIO_VSOCK_SKB_HEADROOM) + if (len < VIRTIO_VSOCK_SKB_HEADROOM || + len > VIRTIO_VSOCK_MAX_PKT_BUF_SIZE + VIRTIO_VSOCK_SKB_HEADROOM) return NULL; /* len contains both payload and hdr */ diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h index 1a132177f4215..4b240a4d6fe60 100644 --- a/include/linux/virtio_vsock.h +++ b/include/linux/virtio_vsock.h @@ -57,9 +57,6 @@ virtio_vsock_alloc_linear_skb(unsigned int size, gfp_t mask) { struct sk_buff *skb; - if (size < VIRTIO_VSOCK_SKB_HEADROOM) - return NULL; - skb = alloc_skb(size, mask); if (!skb) return NULL; -- GitLab From 0d9c31742c92574ca9f389cd6fbbb80a34c2fe79 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Thu, 17 Jul 2025 10:01:14 +0100 Subject: [PATCH 2134/2211] FROMGIT: vhost/vsock: Allocate nonlinear SKBs for handling large receive buffers When receiving a packet from a guest, vhost_vsock_handle_tx_kick() calls vhost_vsock_alloc_linear_skb() to allocate and fill an SKB with the receive data. Unfortunately, these are always linear allocations and can therefore result in significant pressure on kmalloc() considering that the maximum packet size (VIRTIO_VSOCK_MAX_PKT_BUF_SIZE + VIRTIO_VSOCK_SKB_HEADROOM) is a little over 64KiB, resulting in a 128KiB allocation for each packet. Rework the vsock SKB allocation so that, for sizes with page order greater than PAGE_ALLOC_COSTLY_ORDER, a nonlinear SKB is allocated instead with the packet header in the SKB and the receive data in the fragments. Finally, add a debug warning if virtio_vsock_skb_rx_put() is ever called on an SKB with a non-zero length, as this would be destructive for the nonlinear case. Reviewed-by: Stefano Garzarella Signed-off-by: Will Deacon Message-Id: <20250717090116.11987-8-will@kernel.org> Signed-off-by: Michael S. Tsirkin (cherry picked from commit 4243469b093ac35f54c3a0414812a5b97313e149 git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git vhost) Bug: 421244320 Signed-off-by: Will Deacon Change-Id: I4212a8daf9f19b5bbffc06ce93338c823de7bb19 --- drivers/vhost/vsock.c | 8 +++----- include/linux/virtio_vsock.h | 32 +++++++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c index 24b7547b05a6c..0679a706ebc07 100644 --- a/drivers/vhost/vsock.c +++ b/drivers/vhost/vsock.c @@ -349,7 +349,7 @@ vhost_vsock_alloc_skb(struct vhost_virtqueue *vq, return NULL; /* len contains both payload and hdr */ - skb = virtio_vsock_alloc_linear_skb(len, GFP_KERNEL); + skb = virtio_vsock_alloc_skb(len, GFP_KERNEL); if (!skb) return NULL; @@ -378,10 +378,8 @@ vhost_vsock_alloc_skb(struct vhost_virtqueue *vq, virtio_vsock_skb_rx_put(skb, payload_len); - nbytes = copy_from_iter(skb->data, payload_len, &iov_iter); - if (nbytes != payload_len) { - vq_err(vq, "Expected %zu byte payload, got %zu bytes\n", - payload_len, nbytes); + if (skb_copy_datagram_from_iter(skb, 0, &iov_iter, payload_len)) { + vq_err(vq, "Failed to copy %zu byte payload\n", payload_len); kfree_skb(skb); return NULL; } diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h index 4b240a4d6fe60..6189bdf401d33 100644 --- a/include/linux/virtio_vsock.h +++ b/include/linux/virtio_vsock.h @@ -49,22 +49,48 @@ static inline void virtio_vsock_skb_clear_tap_delivered(struct sk_buff *skb) static inline void virtio_vsock_skb_rx_put(struct sk_buff *skb, u32 len) { - skb_put(skb, len); + DEBUG_NET_WARN_ON_ONCE(skb->len); + + if (skb_is_nonlinear(skb)) + skb->len = len; + else + skb_put(skb, len); } static inline struct sk_buff * -virtio_vsock_alloc_linear_skb(unsigned int size, gfp_t mask) +__virtio_vsock_alloc_skb_with_frags(unsigned int header_len, + unsigned int data_len, + gfp_t mask) { struct sk_buff *skb; + int err; - skb = alloc_skb(size, mask); + skb = alloc_skb_with_frags(header_len, data_len, + PAGE_ALLOC_COSTLY_ORDER, &err, mask); if (!skb) return NULL; skb_reserve(skb, VIRTIO_VSOCK_SKB_HEADROOM); + skb->data_len = data_len; return skb; } +static inline struct sk_buff * +virtio_vsock_alloc_linear_skb(unsigned int size, gfp_t mask) +{ + return __virtio_vsock_alloc_skb_with_frags(size, 0, mask); +} + +static inline struct sk_buff *virtio_vsock_alloc_skb(unsigned int size, gfp_t mask) +{ + if (size <= SKB_WITH_OVERHEAD(PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) + return virtio_vsock_alloc_linear_skb(size, mask); + + size -= VIRTIO_VSOCK_SKB_HEADROOM; + return __virtio_vsock_alloc_skb_with_frags(VIRTIO_VSOCK_SKB_HEADROOM, + size, mask); +} + static inline void virtio_vsock_skb_queue_head(struct sk_buff_head *list, struct sk_buff *skb) { -- GitLab From 1a8128b33ecf0cf8ec8beca473b9e5b763e6914d Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Thu, 17 Jul 2025 10:01:15 +0100 Subject: [PATCH 2135/2211] FROMGIT: vsock/virtio: Rename virtio_vsock_skb_rx_put() In preparation for using virtio_vsock_skb_rx_put() when populating SKBs on the vsock TX path, rename virtio_vsock_skb_rx_put() to virtio_vsock_skb_put(). No functional change. Reviewed-by: Stefano Garzarella Signed-off-by: Will Deacon Message-Id: <20250717090116.11987-9-will@kernel.org> Signed-off-by: Michael S. Tsirkin (cherry picked from commit 8a5c2992b0bda3ef65fdd3835210c2301603c53e git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git vhost) Bug: 421244320 Signed-off-by: Will Deacon Change-Id: I4455bdbd484e54fdcf75f9169c71c835bfac1e16 --- drivers/vhost/vsock.c | 2 +- include/linux/virtio_vsock.h | 2 +- net/vmw_vsock/virtio_transport.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c index 0679a706ebc07..ae01457ea2cdb 100644 --- a/drivers/vhost/vsock.c +++ b/drivers/vhost/vsock.c @@ -376,7 +376,7 @@ vhost_vsock_alloc_skb(struct vhost_virtqueue *vq, return NULL; } - virtio_vsock_skb_rx_put(skb, payload_len); + virtio_vsock_skb_put(skb, payload_len); if (skb_copy_datagram_from_iter(skb, 0, &iov_iter, payload_len)) { vq_err(vq, "Failed to copy %zu byte payload\n", payload_len); diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h index 6189bdf401d33..0e14ae97726e1 100644 --- a/include/linux/virtio_vsock.h +++ b/include/linux/virtio_vsock.h @@ -47,7 +47,7 @@ static inline void virtio_vsock_skb_clear_tap_delivered(struct sk_buff *skb) VIRTIO_VSOCK_SKB_CB(skb)->tap_delivered = false; } -static inline void virtio_vsock_skb_rx_put(struct sk_buff *skb, u32 len) +static inline void virtio_vsock_skb_put(struct sk_buff *skb, u32 len) { DEBUG_NET_WARN_ON_ONCE(skb->len); diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c index 80dcf6ac1e720..b6569b0ca2bb7 100644 --- a/net/vmw_vsock/virtio_transport.c +++ b/net/vmw_vsock/virtio_transport.c @@ -657,7 +657,7 @@ static void virtio_transport_rx_work(struct work_struct *work) } if (payload_len) - virtio_vsock_skb_rx_put(skb, payload_len); + virtio_vsock_skb_put(skb, payload_len); virtio_transport_deliver_tap_pkt(skb); virtio_transport_recv_pkt(&virtio_transport, skb); -- GitLab From 5505947f4b7c5ce21044524e5a984634e9b68f8f Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Thu, 17 Jul 2025 10:01:16 +0100 Subject: [PATCH 2136/2211] FROMGIT: vsock/virtio: Allocate nonlinear SKBs for handling large transmit buffers When transmitting a vsock packet, virtio_transport_send_pkt_info() calls virtio_transport_alloc_linear_skb() to allocate and fill SKBs with the transmit data. Unfortunately, these are always linear allocations and can therefore result in significant pressure on kmalloc() considering that the maximum packet size (VIRTIO_VSOCK_MAX_PKT_BUF_SIZE + VIRTIO_VSOCK_SKB_HEADROOM) is a little over 64KiB, resulting in a 128KiB allocation for each packet. Rework the vsock SKB allocation so that, for sizes with page order greater than PAGE_ALLOC_COSTLY_ORDER, a nonlinear SKB is allocated instead with the packet header in the SKB and the transmit data in the fragments. Note that this affects both the vhost and virtio transports. Reviewed-by: Stefano Garzarella Signed-off-by: Will Deacon Message-Id: <20250717090116.11987-10-will@kernel.org> Signed-off-by: Michael S. Tsirkin (cherry picked from commit c7991b44d7b44f9270dec63acd0b2965d29aab43 git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git vhost) Bug: 421244320 Signed-off-by: Will Deacon Change-Id: Icf2d6179ca7ac36383604ba6e0fd96a7f5a9c767 --- net/vmw_vsock/virtio_transport_common.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index 4e08d3016cdce..23c41e3a006b6 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -114,7 +114,8 @@ static int virtio_transport_fill_skb(struct sk_buff *skb, &info->msg->msg_iter, len); - return memcpy_from_msg(skb_put(skb, len), info->msg, len); + virtio_vsock_skb_put(skb, len); + return skb_copy_datagram_from_iter(skb, 0, &info->msg->msg_iter, len); } static void virtio_transport_init_hdr(struct sk_buff *skb, @@ -266,7 +267,7 @@ static struct sk_buff *virtio_transport_alloc_skb(struct virtio_vsock_pkt_info * if (!zcopy) skb_len += payload_len; - skb = virtio_vsock_alloc_linear_skb(skb_len, GFP_KERNEL); + skb = virtio_vsock_alloc_skb(skb_len, GFP_KERNEL); if (!skb) return NULL; -- GitLab From 703bdf030095628593f2e8e370983ed2a2020726 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Tue, 22 Jul 2025 13:11:25 +0100 Subject: [PATCH 2137/2211] ANDROID: vsock/virtio: Limit size of TX buffers Prior to I4212a8daf9f19b5bbffc06ce93338c823de7bb19 ("FROMGIT: vhost/vsock: Allocate nonlinear SKBs for handling large receive buffers"), vhost would allocate a linear SKB of up to 128KiB in size, limited by VIRTIO_VSOCK_MAX_PKT_BUF_SIZE and the length of the incoming packet. As such large allocations are prone to failure, an Android-specific command-line option to reduce VIRTIO_VSOCK_MAX_PKT_BUF_SIZE was added in Ia4f9180025b64d61d9e2b882daa84460b8f08fd2 ("ANDROID: Make vsock virtio packet buff size configurable"). Since then, Cuttlefish has been specifying this as 16Kib for its guest kernel images, resulting in a maximum RX buffer allocation of 32KiB (which correlates with PAGE_ALLOC_COSTLY_ORDER for architectures using 4KiB pages) on the host. Now that both the vhost and virtio backends for vsock support non-linear SKB allocations on the transmit and receive paths, we are guaranteed not to allocate above PAGE_ALLOC_COSTLY_ORDER and so the Android-specific command-line tunable can be removed. Well, almost. The fly in the ointment is that we are unable to update both the guest and host kernels atomically and, in the case of Cuttlefish, the host kernel may be of a sufficient vintage that backporting the support for non-linear SKBs in vsock is non-trivial and impractical. In an effort to phase out the command-line option but preserve existing behaviour with older hosts, limit the TX buffer size to ~28KiB. This means that the unpatched host will continue to allocate 32KiB RX buffers but will achieve better utilisation, whilst having a page of wiggle room in case the size of an SKB increases before it learns about non-linear allocations. This additionally saves vsock users in AVF from having to worry about whether or not they need to configure the buffer size manually. One day, when all supported hosts are running kernels later than android16-6.12, we'll be able to revert this. In the meantime, it's a bit of a mess. Bug: 421244320 Bug: 149494272 Signed-off-by: Will Deacon Change-Id: Iae8075ce39b3de6471f875e06869e4899f6eed5a --- net/vmw_vsock/virtio_transport_common.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index 23c41e3a006b6..6945e77df9dfe 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -333,7 +333,24 @@ out: static int virtio_transport_send_pkt_info(struct vsock_sock *vsk, struct virtio_vsock_pkt_info *info) { - u32 max_skb_len = VIRTIO_VSOCK_MAX_PKT_BUF_SIZE; + /* ANDROID: + * + * Older host kernels (including the 5.10-based images used by + * Cuttlefish) only support linear SKBs on the RX path. + * Consequently, if we transmit a VIRTIO_VSOCK_MAX_PKT_BUF_SIZE + * packet, the host allocation can fail and the packet will be + * silently dropped. + * + * As a nasty workaround, limit the entire SKB to ~28KiB, which + * allows for 4KiB of SKB wiggle room whilst keeping the + * allocation below PAGE_ALLOC_COSTLY_ORDER. + * + * This can be removed when all supported host kernels have + * support for non-linear RX buffers introduced by Change-Id + * I4212a8daf9f19b5bbffc06ce93338c823de7bb19. + */ + u32 max_skb_len = min_t(u32, VIRTIO_VSOCK_MAX_PKT_BUF_SIZE, + SKB_WITH_OVERHEAD(SZ_32K - VIRTIO_VSOCK_SKB_HEADROOM) - SZ_4K); u32 src_cid, src_port, dst_cid, dst_port; const struct virtio_transport *t_ops; struct virtio_vsock_sock *vvs; @@ -378,7 +395,7 @@ static int virtio_transport_send_pkt_info(struct vsock_sock *vsk, can_zcopy = virtio_transport_can_zcopy(t_ops, info, pkt_len); if (can_zcopy) - max_skb_len = min_t(u32, VIRTIO_VSOCK_MAX_PKT_BUF_SIZE, + max_skb_len = min_t(u32, max_skb_len, (MAX_SKB_FRAGS * PAGE_SIZE)); } -- GitLab From 38b01aaeaa7cb0c40fc738dbc153cf5c0ba77c2d Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Mon, 21 Jul 2025 20:44:42 +0100 Subject: [PATCH 2138/2211] Revert "ANDROID: Make vsock virtio packet buff size configurable" This reverts commit f465fb7e1af29c5f6da1cd77b44f5d02e0ad5eeb. Now that vsock is more careful with its page allocations, overriding this option doesn't achieve an awful lot. Bug: 421244320 Bug: 149494272 Signed-off-by: Will Deacon Change-Id: I3ff4e92407f97f547528da459c1dad3519eb8b04 --- include/linux/virtio_vsock.h | 3 +-- net/vmw_vsock/virtio_transport_common.c | 4 ---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h index 0e14ae97726e1..f60241e9e3cb7 100644 --- a/include/linux/virtio_vsock.h +++ b/include/linux/virtio_vsock.h @@ -137,8 +137,7 @@ static inline size_t virtio_vsock_skb_len(struct sk_buff *skb) */ #define VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE SKB_WITH_OVERHEAD(1024 * 4) #define VIRTIO_VSOCK_MAX_BUF_SIZE 0xFFFFFFFFUL -#define VIRTIO_VSOCK_MAX_PKT_BUF_SIZE virtio_transport_max_vsock_pkt_buf_size -extern uint virtio_transport_max_vsock_pkt_buf_size; +#define VIRTIO_VSOCK_MAX_PKT_BUF_SIZE (1024 * 64) enum { VSOCK_VQ_RX = 0, /* for host to guest data */ diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index 6945e77df9dfe..3907ee451bba0 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -29,10 +29,6 @@ static void virtio_transport_cancel_close_work(struct vsock_sock *vsk, bool cancel_timeout); -uint virtio_transport_max_vsock_pkt_buf_size = 64 * 1024; -module_param(virtio_transport_max_vsock_pkt_buf_size, uint, 0444); -EXPORT_SYMBOL_GPL(virtio_transport_max_vsock_pkt_buf_size); - static const struct virtio_transport * virtio_transport_get_ops(struct vsock_sock *vsk) { -- GitLab From fc2476d0896aba70cb0c24902d9715b0aec0e451 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Tue, 22 Jul 2025 22:40:08 +0000 Subject: [PATCH 2139/2211] ANDROID: Enable support for LZ4 compression for microdroid LZ4 is supposed to be faster in the context of swapping, so enable support for it on microdroid. Bug: 433579841 Signed-off-by: Isaac J. Manjarres (cherry picked from https://android-review.googlesource.com/q/commit:8a97a95ea028660a1bf5f840bdb20984107d2a45) Merged-In: I06d8df54a22c5c2c63953ef7d2843c5296f42bb0 Change-Id: I06d8df54a22c5c2c63953ef7d2843c5296f42bb0 --- arch/arm64/configs/microdroid_defconfig | 1 + arch/x86/configs/microdroid_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index c8cab229b5319..f957963b87e70 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -150,6 +150,7 @@ CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y CONFIG_BUG_ON_DATA_CORRUPTION=y CONFIG_CRYPTO_HCTR2=y CONFIG_CRYPTO_LZO=y +CONFIG_CRYPTO_LZ4=y CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA2_ARM64_CE=y CONFIG_CRYPTO_POLYVAL_ARM64_CE=y diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index 7958a074a20f8..6aff816c8afbe 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -204,6 +204,7 @@ CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y CONFIG_BUG_ON_DATA_CORRUPTION=y CONFIG_CRYPTO_HCTR2=y CONFIG_CRYPTO_LZO=y +CONFIG_CRYPTO_LZ4=y CONFIG_CRYPTO_AES_NI_INTEL=y CONFIG_CRYPTO_POLYVAL_CLMUL_NI=y CONFIG_CRYPTO_SHA1_SSSE3=y -- GitLab From 15178d63ac5e12f88da687fd2195ae6091d7cbf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= Date: Fri, 31 Jan 2025 17:29:13 +0200 Subject: [PATCH 2140/2211] UPSTREAM: PCI/ASPM: Fix L1SS saving MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit 1db806ec06b7 ("PCI/ASPM: Save parent L1SS config in pci_save_aspm_l1ss_state()") aimed to perform L1SS config save for both the Upstream Port and its upstream bridge when handling an Upstream Port, which matches what the L1SS restore side does. However, parent->state_saved can be set true at an earlier time when the upstream bridge saved other parts of its state. Then later when attempting to save the L1SS config while handling the Upstream Port, parent->state_saved is true in pci_save_aspm_l1ss_state() resulting in early return and skipping saving bridge's L1SS config because it is assumed to be already saved. Later on restore, junk is written into L1SS config which causes issues with some devices. Remove parent->state_saved check and unconditionally save L1SS config also for the upstream bridge from an Upstream Port which ought to be harmless from correctness point of view. With the Upstream Port check now present, saving the L1SS config more than once for the bridge is no longer a problem (unlike when the parent->state_saved check got introduced into the fix during its development). Link: https://lore.kernel.org/r/20250131152913.2507-1-ilpo.jarvinen@linux.intel.com Fixes: 1db806ec06b7 ("PCI/ASPM: Save parent L1SS config in pci_save_aspm_l1ss_state()") Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219731 Reported-by: Niklāvs Koļesņikovs Reported by: Rafael J. Wysocki Closes: https://lore.kernel.org/r/CAJZ5v0iKmynOQ5vKSQbg1J_FmavwZE-nRONovOZ0mpMVauheWg@mail.gmail.com Reported-by: Paul Menzel Closes: https://lore.kernel.org/r/d7246feb-4f3f-4d0c-bb64-89566b170671@molgen.mpg.de Signed-off-by: Ilpo Järvinen Signed-off-by: Bjorn Helgaas Tested-by: Niklāvs Koļesņikovs Tested-by: Paul Menzel # Dell XPS 13 9360 Bug: 411259121 (cherry picked from commit 7507eb3e7bfac7c3baef8dd377fdf5871eefd42b) Change-Id: I532dc1e5a8ea06345b899d6303e533398f67ac3f Signed-off-by: Xiao-wei Zhang (cherry picked from commit ced9dc167c958230050ed63fd74fec98135743ac) Signed-off-by: Ajay Agarwal --- drivers/pci/pcie/aspm.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index bdc32eb5f23a7..e79a13e56139a 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -108,9 +108,6 @@ void pci_save_aspm_l1ss_state(struct pci_dev *pdev) pci_read_config_dword(pdev, pdev->l1ss + PCI_L1SS_CTL2, cap++); pci_read_config_dword(pdev, pdev->l1ss + PCI_L1SS_CTL1, cap++); - if (parent->state_saved) - return; - /* * Save parent's L1 substate configuration so we have it for * pci_restore_aspm_l1ss_state(pdev) to restore. -- GitLab From 24df9fca84ada7ce22326e43ee9e9a2a1b79d168 Mon Sep 17 00:00:00 2001 From: Ajay Agarwal Date: Mon, 7 Oct 2024 08:59:17 +0530 Subject: [PATCH 2141/2211] UPSTREAM: PCI/ASPM: Disable L1 before disabling L1 PM Substates PCIe r6.2, sec 5.5.4, requires that: If setting either or both of the enable bits for ASPM L1 PM Substates, both ports must be configured as described in this section while ASPM L1 is disabled. Previously, pcie_config_aspm_l1ss() assumed that "setting enable bits" meant "setting them to 1", and it configured L1SS as follows: - Clear L1SS enable bits - Disable L1 - Configure L1SS enable bits as required - Enable L1 if required With this sequence, when disabling L1SS on an ARM A-core with a Synopsys DesignWare PCIe core, the CPU occasionally hangs when reading PCI_L1SS_CTL1, leading to a reboot when the CPU watchdog expires. Move the L1 disable to the caller (pcie_config_aspm_link(), where L1 was already enabled) so L1 is always disabled while updating the L1SS bits: - Disable L1 - Clear L1SS enable bits - Configure L1SS enable bits as required - Enable L1 if required Change pcie_aspm_cap_init() similarly. Link: https://lore.kernel.org/r/20241007032917.872262-1-ajayagarwal@google.com Signed-off-by: Ajay Agarwal [bhelgaas: comments, commit log, compute L1SS setting before config access] Signed-off-by: Bjorn Helgaas Bug: 348582432 Test: Compilation (cherry picked from commit 7447990137bf06b2aeecad9c6081e01a9f47f2aa) Change-Id: I802812153ef6d880b02a5736681693ddef173904 Signed-off-by: Ajay Agarwal --- drivers/pci/pcie/aspm.c | 92 ++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 42 deletions(-) diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index e79a13e56139a..b8289b6c395bc 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -825,6 +825,15 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) pcie_capability_read_word(parent, PCI_EXP_LNKCTL, &parent_lnkctl); pcie_capability_read_word(child, PCI_EXP_LNKCTL, &child_lnkctl); + /* Disable L0s/L1 before updating L1SS config */ + if (FIELD_GET(PCI_EXP_LNKCTL_ASPMC, child_lnkctl) || + FIELD_GET(PCI_EXP_LNKCTL_ASPMC, parent_lnkctl)) { + pcie_capability_write_word(child, PCI_EXP_LNKCTL, + child_lnkctl & ~PCI_EXP_LNKCTL_ASPMC); + pcie_capability_write_word(parent, PCI_EXP_LNKCTL, + parent_lnkctl & ~PCI_EXP_LNKCTL_ASPMC); + } + /* * Setup L0s state * @@ -849,6 +858,13 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) aspm_l1ss_init(link); + /* Restore L0s/L1 if they were enabled */ + if (FIELD_GET(PCI_EXP_LNKCTL_ASPMC, child_lnkctl) || + FIELD_GET(PCI_EXP_LNKCTL_ASPMC, parent_lnkctl)) { + pcie_capability_write_word(parent, PCI_EXP_LNKCTL, parent_lnkctl); + pcie_capability_write_word(child, PCI_EXP_LNKCTL, child_lnkctl); + } + /* Save default state */ link->aspm_default = link->aspm_enabled; @@ -865,25 +881,28 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) } } -/* Configure the ASPM L1 substates */ +/* Configure the ASPM L1 substates. Caller must disable L1 first. */ static void pcie_config_aspm_l1ss(struct pcie_link_state *link, u32 state) { - u32 val, enable_req; + u32 val; struct pci_dev *child = link->downstream, *parent = link->pdev; - enable_req = (link->aspm_enabled ^ state) & state; + val = 0; + if (state & PCIE_LINK_STATE_L1_1) + val |= PCI_L1SS_CTL1_ASPM_L1_1; + if (state & PCIE_LINK_STATE_L1_2) + val |= PCI_L1SS_CTL1_ASPM_L1_2; + if (state & PCIE_LINK_STATE_L1_1_PCIPM) + val |= PCI_L1SS_CTL1_PCIPM_L1_1; + if (state & PCIE_LINK_STATE_L1_2_PCIPM) + val |= PCI_L1SS_CTL1_PCIPM_L1_2; /* - * Here are the rules specified in the PCIe spec for enabling L1SS: - * - When enabling L1.x, enable bit at parent first, then at child - * - When disabling L1.x, disable bit at child first, then at parent - * - When enabling ASPM L1.x, need to disable L1 - * (at child followed by parent). - * - The ASPM/PCIPM L1.2 must be disabled while programming timing + * PCIe r6.2, sec 5.5.4, rules for enabling L1 PM Substates: + * - Clear L1.x enable bits at child first, then at parent + * - Set L1.x enable bits at parent first, then at child + * - ASPM/PCIPM L1.2 must be disabled while programming timing * parameters - * - * To keep it simple, disable all L1SS bits first, and later enable - * what is needed. */ /* Disable all L1 substates */ @@ -891,26 +910,6 @@ static void pcie_config_aspm_l1ss(struct pcie_link_state *link, u32 state) PCI_L1SS_CTL1_L1SS_MASK, 0); pci_clear_and_set_config_dword(parent, parent->l1ss + PCI_L1SS_CTL1, PCI_L1SS_CTL1_L1SS_MASK, 0); - /* - * If needed, disable L1, and it gets enabled later - * in pcie_config_aspm_link(). - */ - if (enable_req & (PCIE_LINK_STATE_L1_1 | PCIE_LINK_STATE_L1_2)) { - pcie_capability_clear_word(child, PCI_EXP_LNKCTL, - PCI_EXP_LNKCTL_ASPM_L1); - pcie_capability_clear_word(parent, PCI_EXP_LNKCTL, - PCI_EXP_LNKCTL_ASPM_L1); - } - - val = 0; - if (state & PCIE_LINK_STATE_L1_1) - val |= PCI_L1SS_CTL1_ASPM_L1_1; - if (state & PCIE_LINK_STATE_L1_2) - val |= PCI_L1SS_CTL1_ASPM_L1_2; - if (state & PCIE_LINK_STATE_L1_1_PCIPM) - val |= PCI_L1SS_CTL1_PCIPM_L1_1; - if (state & PCIE_LINK_STATE_L1_2_PCIPM) - val |= PCI_L1SS_CTL1_PCIPM_L1_2; /* Enable what we need to enable */ pci_clear_and_set_config_dword(parent, parent->l1ss + PCI_L1SS_CTL1, @@ -957,21 +956,30 @@ static void pcie_config_aspm_link(struct pcie_link_state *link, u32 state) dwstream |= PCI_EXP_LNKCTL_ASPM_L1; } + /* + * Per PCIe r6.2, sec 5.5.4, setting either or both of the enable + * bits for ASPM L1 PM Substates must be done while ASPM L1 is + * disabled. Disable L1 here and apply new configuration after L1SS + * configuration has been completed. + * + * Per sec 7.5.3.7, when disabling ASPM L1, software must disable + * it in the Downstream component prior to disabling it in the + * Upstream component, and ASPM L1 must be enabled in the Upstream + * component prior to enabling it in the Downstream component. + * + * Sec 7.5.3.7 also recommends programming the same ASPM Control + * value for all functions of a multi-function device. + */ + list_for_each_entry(child, &linkbus->devices, bus_list) + pcie_config_aspm_dev(child, 0); + pcie_config_aspm_dev(parent, 0); + if (link->aspm_capable & PCIE_LINK_STATE_L1SS) pcie_config_aspm_l1ss(link, state); - /* - * Spec 2.0 suggests all functions should be configured the - * same setting for ASPM. Enabling ASPM L1 should be done in - * upstream component first and then downstream, and vice - * versa for disabling ASPM L1. Spec doesn't mention L0S. - */ - if (state & PCIE_LINK_STATE_L1) - pcie_config_aspm_dev(parent, upstream); + pcie_config_aspm_dev(parent, upstream); list_for_each_entry(child, &linkbus->devices, bus_list) pcie_config_aspm_dev(child, dwstream); - if (!(state & PCIE_LINK_STATE_L1)) - pcie_config_aspm_dev(parent, upstream); link->aspm_enabled = state; -- GitLab From dd000ef9d6a5f31a21584a76f8f793a57be05b4e Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Thu, 17 Jul 2025 10:55:40 -0700 Subject: [PATCH 2142/2211] ANDROID: Update AutoFDO profile for 6.12.30 Bug: 322399357 Test: run benchmarks Change-Id: Ib9aad55cec96b3cc4c03d8ea3c9e233f58046521 Signed-off-by: Yabin Cui --- gki/aarch64/afdo/README.md | 26 +++++++++++++------------- gki/aarch64/afdo/kernel.afdo | Bin 4286367 -> 4512136 bytes 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/gki/aarch64/afdo/README.md b/gki/aarch64/afdo/README.md index e77bd6e42bca8..a0c6c7c6d558b 100644 --- a/gki/aarch64/afdo/README.md +++ b/gki/aarch64/afdo/README.md @@ -6,22 +6,22 @@ optimize kernel builds for specific architectures and kernel versions. ## kernel.afdo -kernel.afdo is an AArch64 kernel profile collected on kernel version 6.12.18 ( -SHA fbd1fef4d7283d210845f8609599efd53c0905a4, build server ID 13287522) using Pixel 6. +kernel.afdo is an AArch64 kernel profile collected on kernel version 6.12.30 ( +SHA 21ed84930c160ed721c131a67e5ae6181ac40e1e, build server ID 13771236) using Pixel 6. ### Performance improvements -| Benchmark | Improvement | -| --------------------- | ----------- | -| Boot time | 2.6% | -| Cold App launch time | 3.7% | -| Binder-rpc | 9.4% | -| Binder-addints | 31.9% | -| Hwbinder | 16.5% | -| Bionic (syscall_mmap) | 7.1% | -| Bionic (pthread) | 3.3% | -| Bionic (stdio) | 3.7% | -| Bionic (all) | 3.4% | +| Benchmark | Improvement | +| --------------------- | ---------------------------------------------------------------------- | +| Boot time | 2.2% | +| Cold App launch time | 3.3% (Only for two apps, most app launch tests are broken b/432087996) | +| Binder-rpc | 8.3% | +| Binder-addints | 15.2% | +| Hwbinder | 17.8% | +| Bionic (syscall_mmap) | 6.6% | +| Bionic (pthread) | 2.8% | +| Bionic (stdio) | 1.2% | +| Bionic (all) | 1.4% | Benchmark results were tested on Pixel 6. diff --git a/gki/aarch64/afdo/kernel.afdo b/gki/aarch64/afdo/kernel.afdo index b18c17c044d2bf188d048dd68e9459a81b1f0ba3..e158d88dc71c86b73d51e8387325c54444c89038 100644 GIT binary patch literal 4512136 zcmZp9a$)0_lT%g%r?WFa03(C~lPnAj44=R(28KmYnh8q7s3}klrMo%6LTq3XL2&Mc zh(nbzfXqb5GBD&nb_R1Lzkw+R1qcNvxuE(})vUo{%wQ5h!1TjJSYZq(-Eq?e%7ReG zpZ{y$B-Y%0;S1~9V}EY2{#hvbH&9@LU-!lBH&|I0^s=?Q+4zvj?!YXbk58|bwKF|f zE_8J5W$($X4O=CeCqB}d&9&f=T*t|;iVp=3oLAZO`hw&I=?8bT_Fnuh_)w$amBH%e z>p3WPG)Ual9my)AAFncbaXVs?2=J zzOBV}Da+IkocmjB?dCn^etMbF$;CA+-jl(}CEnA|-^G=|$HYSIVUx-C?GLC)iEzW&$S{sr?fb; zEEORfP?TAgSb`)Flv|?NO z09-7{F+4svG{7|oVgk&z;1I_U2Dczr*LY6`kS(EpprCMdiT8A2@bq&HiFbAOi%-eV zE2+rMEJ2857RTr1m&B(gBZ)y(c!tD#_;?0~#DiVo>E{^|59WHfI)aQu=Ees(hcb8u z$Gbq32FJSw1%ddW;PDTN_Y3v$0dc`T@eBx!cMOj7b4C&I@b~i%iuVr)jSmm<3~@z~ z^YeFhboM|M3k~rE8wm+O&v;NWVepAEiBHZisI&mHQc{!ia|?=6i;LsaQ}a@bGLzAT zixbmQ!D2r(?-Jx6 z5by390`jq+TfB$Azc&Mvj(7I=b7AoFjrU{#g$rDJfQu_bfQxIqpKAz1Ku8cMu;TrL z;-g%H{25>=70y5;S&)=dX-Y~ZSk5^=w;;bXF9pnT$t)^?2z#U^LWDd@(^J86p2hh& zi6yBJQJS1u$*!j1?3Z?!*x6;p++tD+nFz z#1QNm67R_n3>Ncu_I3sH{GGj_B|&g%3CKFsd<_+Zn;hcm7@v_?oDrXwn48J~;+240 zm6l(W%Mc&r=~w3KSK?f3oNrX(UR>%?nO_=jlAK?ZYFu1Wlxm!wTH@(f0)kGa@y7WD z#im7xdFiR=I43(l{gv4oB6{yAg4PQr=&%NyI8nX zl{l8in`NgK<)!AB6j$aY8z&YeTZZOk7M7+u79}HvRc>mop;2yPWm0N}kG)yec$W6_SFDflAF*Jg4K;di(4sBOgSL58o0>2U` zqr`X%ztnQDsGqZ6nQw8tlTmU!NG3Vn%n@viWkF_Md}&@mW}bm7ND>-H#Rl=%V>>Ok z#IMB3EZ!0pF~w$ispauyhTd65@!na6@vhFrIGsxk!?6S~sQXpyU<~Dzb`9%Ry8YF%CD3heQY#J4|vii%USU3`!Sf@#a36#U+kK$q@B8Lj-FC z8W|KMW){V#73Jr~L!t+iY`iNC<6WJ?VY#T-INq-ePgonqgCg22-q0vMK0YKPH6Sz3 zC9x#YG&3(RwFu%WjJ#}~oS#>gT2x|a;F*_}n3I#4l#>cgs@PLDIK3Lg$H!;pm82Hs zCFU3!dgf)8IOpUSmlmZ$(i|uy`IR^s2F8Okf=Nz(ayBT8jQrzGK!vMciIYXVp&=wW zdcs`iWaJ-jnp;|uT48A93!XeA)P>@rx=>wG);9xS0j|YVmMkInX;`Sp( zP+DLQNz>wz#FA8q^GQhxPRa2mgd!ePT@;&uQebktX-Q>4YB9(o#{Qu4GO@4}YHPZA zc4c^WrFpqiVZ23BW?o8WUV5>i5sVdIlvoZ)1FjZnX_@gLOZ}W-smjR$95@z`RODo6 z8t-K26Aw-w2F39Pt_DuVQSnYjS)e3hXbum0aJhyh)RD>v(|DvZA}BR6CAG)|)b8;s z0hgh8G94(LTVNKgmXO39keTP|WQa(vS$IklP#Qp#CKxpbwu+brHHo1ysQdwidwh9j zNd_pbI2jto<0&Vc5(y^`P$-(jI~fLn(uZLXqLKn9D^TV(42X9!3IoSn2sGyKr+HIo zJy@Jkl$n>ET4ZPesvhH$^Gowe;`5WTQj<$SrN2qMp%El5eDhOEb5dQMOpuJn$OMK4 znRz8enR&&T$;F12p!RZnUVdJFS!z)Zq$!v|xdC`m6Qo`Pd7K=VVJ)%o7-^iGTVR}< znFp!}vE&Z|I?ZwuE8>$Xv;4{;vp@}ucw_&f6p)dGt5vKX1Zg$P&CH{xnI!r;H#OHJ zr6|7uTthmU#DnsRaX==hVF=17Si|2mF()TK*(5tDzrxrlzXIfSoCP_wg$6RqDJb3& ztTVABzsTG>7tD5bb#*cjQChJ{T4qkFiCbn) zsw=q>h+;R$qga9$-e{trxdd((xjGqU5g!t`Tmvd}!45w*uiYERAH}X zU7ZZmDRvrKx&bFSzY-@GNSg{&QCNVw6`3N_&JAuj(R64;NpG-(?K}nIJF{reS&&-QQ@h>flT|+~x>D|@I&<$_!;C8J^ za%xVFp+RU~abjAkb81cw-gJRd$bgD_SUVP^3!_nBjN4k&L;)@$Kt^Co$FP1Z1w}GA z;RcWyLL@j9l;uEWA4c;Slp1N!9CmeeGAgIJw_s&`S!%LzSZXq~)oqSFCF053_*!hl zrW8=-#$yF)QHxxB7@AQfoCw$tDK{;HK?7ot#)=bp7GrH2fmpTueh3 zCxNmPPP_4>3+kmtSi=W8I09{@I{D%1)&`f85&jMtX;mo+J_fl7Pb{FO zC}R-wCCGU=Qxs}1*@>!V zLsP3O8K&ZQGs?_8%m?7HB3CDG65|k*&+(*P)Ffl#Sd^MbV>_Vb4{bey=x$Qm9!SDP z>Q)lA06akmuCb^$1P7bz2PGt|B{bMlP~<~uLQ==y3Q8dJn#2sgK^95CJV@CnRwSY1 zjcOU{fDp*LM5lE`5^;5kAi-8V{ckh>0+J@M4NZ$u(;)MZ#U(|h$t7e@s1%eym#Tnc z0TK>G)h;HGfoRZTi_{dSN{CL}r73F3WB^`11YMWmWatQ*K}D-_oQVrr0`_8NIww-h z#TF8vp-iL&7PiVnfrs)QXb$_=5b*Jop+vvv|mQJ(J9m z)FKnllGLIMS63&*kRMj#!Ob4C#FG5n%w$6Y2pyl8k^-7=#+e#n5ktI*#idD9GSLv~ z#+>}blnk;%6~)`gMpDU@Mo?E4m*f|vl5Zv?LQOOCQc^1*i!Jl=OOwFMEurb&EZ!JW z!@w715{z;bL(S7uOX71&OXA@MlOL$a1{+y`49-tWD^4wm&q>WA*^UVCYDbVSu`H_r zCvl6!l*EFP)S_bJ+(giPzmr+Ku`ief(&dzlB|G>zd-|36l|>YT)(kpX#G9pM=9Hus zftEoTI>wv1fq4Z5t{?;aN}Lko%}Rzfjt8y2g~%HjCubxUL07zhS8*ri#3v^fry96|R(2Z4o22FEq-24e6;bRB zT6$w-9&ehMoLrgl6|nrmEKn(O2j57LtiEq)`4jY6R-l`vW%kaz%x5y)re z@zBBmFOD^I}dS3q7jiwCV@ zfwo7mWFF8IFP?P>P>rB9V;G~mo=%|UVW46kXWf9>uYvYCT){cY$pYKx4cI=AZJ-rx zhDM%w0icO<@G4;N+Cf7D@KRvNLPPMfR0BuQdL36#l?>5r>>O`MV8Lr*LqG5ePpBz|2DzEV$tkI2naQb!2ELia$u3~FNq#|U9xP~$ zD?veP=m!s4bMlflD9vD|P>@SNL5NW*5=izSeRy&z_GAsxL`Mc=M>E392oCpVh##&qYScx92BBBvph6Wk{cL?Mxf9j zm>vy72!shZJqE`+1%i{4Q(`>9)EF2K8aZ}#bqajjgR;-~rQZv># zAGtgMEtx{<(j;Q((l|vzTDOpmEZ{hRwZ=gqg(a?0!wIPil!zG$sYHhYQV%Gd$Utxc zFTn*n8PfT|=U`}O1yS%?AO{pkr&BWSf;SaQ$bl_}g%xNE2vSfOnWKdTs8lDR6PQY5 z5V*P;IHf}JC#<^w@(R|{2s~y1FEA|0DlaVY7Z*-pP`8v3?zoua?6)|97etciA9J$& zV~)o^PT=!$59BGASo1pGrmF!R?E(c4Bs=5X*J_@TSR9|6SP)-aSsb63lADT;FnU{|+0c&bX zH8cW`41%^-CZ`q?RBe`791qrz1UfV!v8a-e4pWe7eC9$134=2XO~G5}z%v`*?f!U@ zE*?u^#(^6bkPUpe4kv(49fC>{BT%y%G*$-fbYRU3Sl5d9VjD_wHA^gxFG@`#&kHnk zmqlW6d`c=+T?Q$taON%4f)_F6YEqJzo$BNRu0tT%6C-_M3kNc7Gb_z2FG?(+x_yw6 z15s$eBAyNwW#$#97M0N6BJ<4R_~QIrGU6)B6&mc+%LZAlAm`-e=cSUKwIO=JUI8zK z##t;Br52awfMzqDjN;9Lz?>jRy2H{S0aeK+&cUE*SSRmzLo*Q58FEkpcnp)mFu>*( z@cwwnRC94j5oEyBGPESk0%D;hB(2Bi7m*q6SnSLM`5$6sUTH4GN<-6-qDr@-{9Mnx z6583EMU>5?Bs46M2=NfO0RS0!HZ%a&L#ahY$TcVyofgHZh4G;6uwc#R!KsCyohF8c z$%#2R@dZVhc_nGE$_ndP0chR5IcVCmprptjOtjO;@lJ+uacL4I zfr%6}8D@}~W^#>#G%?I_5-amdK}YEr#hdwn*@i|1i7D|V`SFRM{gZf;6mByt3KCO5 zr)b3IrKYB&ro^Y^7a^O3C3zd==9-jc7D1g7mYW!qnr57umqLa%(=_nOSn)yd$i!kF zJo!KxWfUbML!;#UypqJsywsxj{4{7M9MseRrEx5FL&6QQlOCL-4Gn`*!LyofrFqFF zpj?gcIu3KdegF@TKo{^r{9w=tQ=e&{pw+O@?k{g9atd90F7E>UEq~h*c)3ViN)FALdGN{u{hh%FuAm-C^fGHbl?<<3$UbU6I8wC zP_0PXK-my8yBCxcS>)yC#pjjg~EwI^!Yt@01WjtmHLWQFPp~D(Z zM!C>_J2(_c^%BHCL@!tc4Wi-6%M^qy$RQxdV+mT+Q*NOCrj08yT)}N{$oO}eFFZ)G zxC-14fQ^2eQgVzScssKNxRXZESX%euhPC@923R?(Z zcLXRFiEK`x?We@+BFKCR8NmYCFNx1=;?okAP=GX5NvO2VQ!7eR^HLzEMiMu=T5OmK zorb|EuD~r^=vr;ashNh3;Dy_vpiByG_#@OI5M!|T1$nX(l>1EM4b4DnKOyTt!$Lr@0`dXQ$bim*5dgI4DS-mO3H$g7 z(i(p!Bgn!t{Nan$tDs;ZRE!bn2zYRtfom$v@PVA_4jOz4$S*DlfQ%tShMu4$GDIh~ zv;o>=35g(bkIHg2G$<%7&Hy!C^Gck2VSNPJT4@BCU5y8yhfXI;jSQh>1w+f z#B%!h72NwYG)gWlD$WNVWlyh|g<4Gi*o9bZ3JGNRf%tR`?Ey_)VBdo~MRfGBWkG%c zdZ_{0;e%x*GHBH~xDjmWmS2>cSW=Q&1etIHWySQOL|7A;cJXz3fH%{PVT0tlB6WBaz0=w40&=9oU8nhrHJ`v(bwefx;z7$ck`t3NU`rv1wjR9A9DF$vBnJ}fY_LAi zuo*Pd6Ri*ATXO6J=_A8F#8p5rhk^JH ze89@kC@8TUUSAs*1aE z-Fsk4#mx_pIbnuym1DzMT> z(Pjd&s2FtWb9`EU0VGn1vCh0KHxcBq_{6;Yyvp2sXp@KttwzQmM?%)zgKn@&NiB#^ z&PgmL+HMPweo!F6gA{9-W?WPX+0OuS6IK;S-Ey32KvfR-)DXC3SPC;kGtdHvcu-9d z4;hj)G>nf2FJk};lBgGS&luQ1#QHUm`-rm`uDLiPGpz)l%_bl_3=Kde(n>iTHbGW> zT9)L;Lsq=vGZ->(Xc-^x>F*pL>>1^XS21|uC-NdtNMi<4PGH6x=E+K>C21CreHP`J zDJ2YR~SR18uI!cJy{PSF9?th6&85|4Pzhm0{pj*kk?fDXlij!6RD1qwb?%G48dv=msz z$ul0~eo%;3JWVNN>#@W=c*`Qn(JY{Lno&HK8wnxxFDOt!yQGsDoKnY7CHH5fdUjX z#RRc7tT5OPBkkuF|27Jjec%z+#3uwEYZ)u4omWp$(mq2HAvlwIcG&GxAACC{x(bXfPx&xL^t!#Ub4`lxb_4TL+%1 zroAno>1mqV0%=*&+#2XKG~6Cgvc-}e!KF7S`kl<Nl7h&+7FfodmMU{2yhFeJO+kyKnAsH0@oJctFFUmew8gSCuOvP{ zDJwO(1Tsn-Q4F#cl@xuHd7Zb42wXq7Ffi;)|jo1bE6!Q z7)b@(XoZF}u7MJG(!uFaQj!i?_OF04Et`Je|hN}q+PBM`08mK@vjW-D{Ni8rmPs=YV zPb^A7jI==W9Oxh6vE2HavDfR^fnW+z`jkK>{5k?_idAP#@z8Iphu#VxHCloIoH2mj!sn z%eNGCJepsLlQ-s6Eh!Cds=EWZcj8KhOR#0r%)HDJjHzQ2^r>S{(E2=3FVM*XIx7Y$ z7Y$QD2TPK4B^+dy)zu;`EfYM5=I0DL5EgU{GANdvEFgQE;QdJ>53Fb zz@}gXiD5EXL1LJUJ4isM&l;A1t;14M5EULJSi-~51J-SW8ckVvfRZ1cq61^R*f1Gw zgKcrV0q89MDyz+;YU?3s}))0vfRka`K9I zH39AL$5To`6C2J&)Wo_76jWFf0H`UA*4iY_IoM6ZeRLAU1)#H#AU6|YPR4@dl5-0z zq0KPYLZj3|#JDyn2q?7^kv2iD!EawO1%m|GC+|SrGYimAfM-c+uAxC$W@>pn@(2K} zZ8R?^N-an%N(CKU3E5WwO zs3@`0F(b>+zyNe>6*yMRks7$vS%?U>9^_;!UWC*D@LTdsk#ETx)LYj?ksNhI=Zy0pY5|;9xV0uUE&|z77OG-D2uq%?V<~kg%AiFyUaR-+80*{&o zf!al;@l+Vw1jRH)Vgk3uphH&X$@w`ssmUdv`y@;9L1Sc~hMi?*UP(S^z_!QfTut3ca%s~ifF`9?FnFXu(K@&cP76m0m@t_l%Ky`mSWCQ{f2A1*W&@;SqAT!J$ zd8pZ--XE3(Wd_+R0n%*>I~^U|_yErZfsV6=A7ltS!Y~-JLI!IU1t|&X2@!eNgm?nzI~Ub8cw)2Pr$B;hNeTJ{p#ctkK$nHa9AWLrx2>( zK;c4?BjJa6Dj9+$;2Gkh3=MKqbCWZQ;xqHg0=&yYjZ6y?i;Lq^ zD)SO^Gn1hU$H1F*4Ki~<>Wx9W)KlV%ONxq<3n~MW@#ruN@Wv|*HqRtGH#Ik-k& zzn~~Tjer|+vp{Yziw9k&Qj(cg335kHY90ZLKzc0F@{7PaK>jVLj8D$U&IN%CbV<Wm@+t^$V)SZQtn0j0qP@pwYa02Cx<#U(|_i6sPs7UVpTQVL^%AwCLp z=1UGSR^oBGA;{?JzWHUKvuPRPog4^AZa(Shs(L{a9PtGZ z3o!)a^KvsmW}-=y7H41=g{v<~EdZYbQ(go*PAoMU9MDCHC8;@?(6n2WTUeS}nhJ6V z$O$0xigOZ^K*xvWCxdyFpcD!ZMzm0b9>5Mx&532;fI}84E(H}ZiHSwY8D=K&nR&%| z@!&Z_hWPlz(68h`y3|s2#9F z4MCYUF*&(3w=^fQBsIPuHK!!LI5j;tH4n5bJ3cYFB(n@80lL!!WJF4QUMlDadvNwm zOi77P$t)_Vj0Yck1C|Hv`pS<_%_{+23ky2dF1`S=z6mM|I_M&`s3G$kdzJTbE*9vml7H3$KS zgW^jPGjp)WRV3$>7DI}W#FUhxB?5Z6|l8H|$ zO-oBH0(%3l14#^0WaQ)|B_@Mo9<)LL6o@66>G8Rl>7cZUW+3Puqs(;hc|G8G2J6U6 zEP;du+z!x5ImMueOic#W3b_S|;M5LYjR4UMlPpS2&PfEdDxfZg=mh0kXfp}T%sg=0 z2~Ds#C%?QP5p6o=1_67zBrzQ!4=OZJrOQC2QeshRBHY08{Gx1lQUVzP$^2` zm4hyMEQ4w-ht+y15S8G72VLs}&LW_iGA#w96jdk_k`F+FpaZBtxwEJ&F(7 zu@bcVH9jq~s2Eg|;;;*>2DC{IxBoyT9k{~BVMK9h5;)L`Q$a;1vN_OsXpm4rK~5#8 z4h5xOM4l;1&WMLx9sxOCFdk$=Jh-LyEBa$ZRRBo~29 z%_s*|X(iy+2-r}l0JwdDEC4!D2x3@8at5eQ084_{@rlWxb^wB(3(h1(xn?HdgpmlT zg25Gru~B?laYu#sJsQ~j4zd%}34$02 z+NF{mUzSpw9}g;S;Tn*{i}F%X<%;rBir@-C9MCC_&~N~?xKlrA^PBQ=&^~=UYuHj&C)zje+|XB zVl9FJl7As>dP8h7CE$h`JUk)l3qWZDRdrcvUP)RCqBsKi z2Xyriq)tHSuYj~rQ3T>)y(5G}(?DsXxELu%gA7bdOexDOPBk-$M=Dbw6415)ilfq! zGjj96wL087h!DE5$r<_Oh%5*;5G;hDE)Oj@(m;6uv{wYx-t^Rxio_DodMBjRo(AfT zU=z+q%9>!ii?M146~pM>28kt>U=vLPH*gUC#&jgCl0kKPX-O)$6@$Q(^E^5 z3rbORgM`Xa13W#oBn8xIL33kzYDp?&`~wl^ATh`o28tLKW#IIJ>cRBXl7iIKqP)ah z)La1)$6`VOc&r4)o&s!QMVa|U=!Fod=1R;<$p?4p;Nb)kMXk?3aS0MFEly0wa1>}% z1)F0*;`s%rC0079M8F7EP$7|@mXe5CLZ+vdU&51*owD>Jh>Qmym1$-J^t(fU+}lP|KSftXT<^lTuML zEaWC16vI&43ZU4?!J4yjA*Bk6-rUsOq{O14Oi2F{9?7|>xoIhgArORDax?Ri^NUbp zIX62cvk0vS$<5BoPeB(0)hMX8=O&_79=V{S+fbDthCh&8QIv|I6C>m2!VcC$Dw}dk z^UyWIYbq3L;iA||guK*paQhZj2UHNv(|M`or5NcS)QAK3tx!w=iK6K)NG(c>2dA@m zkSvPwg3Oe(6kNifmJ+DlmIt~w0x19rG7C~sD=%=f5!K+LWVGTRy@3r%W1tovXfPrd zde0M@5&7UTqO#n0P}>~bIfW;#g5p%rax~D;C?ZM=K*NHl=?bIG4zjkeG`}Pf-F+ZC zQ0xZ@fEF2}1t&-t)h(cgFG`~rWCutv7r8kM7X%MTA{^;EyCi;Tr6b>dQTGMmXdUg3LTWcim=t7 z5Q&u3oYWFjH$fz@^@_kU*z04M6h3WGIkY|;NGEFJr3BLx(D50RP%gzNpi1+wgi~o= zaYiCqO93>3m6lkVQvw--gs1*ekYn=DdqHqfY;`cGXNKCN28p1hGVq`eisQi|h$^5I zatm!)ab+=R?G{KWs2u^Hw*t=z#i!)wCPIq1l9I&ajCk-x#wB1mkPe7oZXUQX3*nUH z#}{PA=a=V!%c-Qq9Pru_kQJcOb5O7+r5YQ7h5(Zbz+Km*3~)us5FekEnGYK12M>J1 zx!|=aFdnE2h|GpeBE}aKm4f@uAOn&!5;ODSLF3w>Vg@V%I&uQ4E4iq$pd=oA`~->! zcwjoY1e6OvS~By?!0W>y^+94f=sp^-^Pn|8*ok1jfSSDpIhiFO4}l8`h-gWCaY1HY zJiHy2lvx5A=mw8*f-MGfA%hf9x#H3!6n;5);1Z&^IKBW9oH>cvsYb=%oyi~>P%9Z6 zWJ%x&47gBAY7TTx11yvs5B7IH*bAV+SX9yEwDkDm(gOIjc~TBs12|lYQVUB{!Gp(0 zGN4(b%zV)4>7aHjsswn%D76wgNs200P+Ah7jUtzp1G-?aAg2^G>IzZ}va~7{GM@yR zW-0Q-7U zzagUe$?+*gnPsU(AZc_Ntmfo{PE`hnMR9x*v_}PX0;p01m1{5u#Dhl5!NnX@0q96( zoNi3X2YIUiWF#a5BAf%dHyr91tb(99NqG1a#v=j~Hf0C39~7uC#~};?#S}EzLqZEA zP?89XiQGc))HY6cXBHQirb4HvazJezsAZr?#um2Vwg$qhP=6ss7DNHG8HsRaacL4{ zLKIsBgCaMnv>3^HkVs|;4(KpDK$Ma4|MAw*v$OoY={={(u?>s=nNZJ z185=*+-uKFEdpKRkeL^cGzkix{RdrAT1s)4z8t8R6^$sL1G0(`RU+UVW`<)KEiM? z7qVmmt{PfyB5MF&rUG741J(e#^`bbjEHyqEG`j-Q2wSsKlv)g3%K{Pw^`LSQwio5b z=jOu8!=lt2NXV3?flDSxEet6fL4|Q<9%$?s!3V`fa(*skSph^CRJelXmOxG|P0P%W z&r1bODJPX?=A^_!=11Y|_{5_8Qg9z5sVp@)K0UDjR1FjqrGlzi@cNec)Ur(QWE6x4 z2_y&`bdWm4N``o7JqDl1gQx(ls{_rq7NvsMOn?Pb;){~Nv%ZjK6m(Gm%mlbB#3W?d zoaFeF)SME~JZo}dPI7!%F8Bue_@qqmEIvpKvJe5B5aS`^S)gh=z9_jAoYcXSAaIeq z{N$wg^2BUV(g6z=7bSy+3X?(geNH@R78mTQyyR2}FCLn!lGBPIWn5_vbk$WdxIu3S zx_d6U7?L+YTEU{A;te!15}#ZEZWQ5^h);v|RUoE;6BZ~WENB?U^iIOIU-EHMQ!56o>KUnVbzOiXqy{6H8KyK-D%(0l0q~p8^^J1T}{8N(pI zpv7+S1ts9-9K<}(*it;Ww1e=AGZIts%i+s3AcEka1m}y?lz2!s09yiT)WglL%rDJL z2URR3l^`o{iGwP;4}7<3VdoVDg~#sGxn_ zc_s0QX^{0X$+?N3h7Nf3Q*thB@&?L^PX;YA19yT@M8N%Z6cNy}x#Zje(5yGe{ScO+ z5t6W>kwrXs{u`MGn*&!IcbU_<{pyf`8Yyy=kN-fXKO97=5B=sn&O5#gXQggub4axa=#ihBaphBr6 zH3u}@390-*E1L>RQX%_U^TDG-$U>!gX)r<9jgioXH^yoXRDt-+yu_0H+)U8=J+KUT z-4U3TTbvGyg@Q^@yWT<9)U?f*NZ?B7+6PkQhY{g zVhXrh1-1p$5ic%D%msC4AOi3;Cg4&O*7pTh!{7h}oudkBV#ViWra+tm5&^9bPlt?L zBLrbfzcL|354c7v%SBREP#T|+SR7xJ2WonQ)>lFopvHp+F*6aOCHV!=juEVeEhtSZ zN-acmWs0DUjDk{76Bu01fXst5$3gBc01sn8*V{nm_mZJvpppeHQc#o$O7EcYzvO~a zkW^KEUMeX0Q8Ki2hOy(JjZ?^kGpMbf3_A5KITvgW$P{S(1j+;PMfu=$ zw8^$AeUWwSrdKf-a&< z1Vuy&*fa5od6mdQMX8_$40vr|Nn&0}CS;*iN<3uEE7%kW6Vwbs_?Ckqz{l;R0s-ukUYpLREg9)?Bbw~7i5kr1yuv6JVP}GB!aLv zIX=A%)U-@Vj!&WFXg?2RKx$HHI=J~#9G{;CTG){S5=kqDju*y*#*ty_ z(u%=ca96qvoZ>*8XmINnynGDQ6avQ{=zRD56lhrm)|~?>3KGi_Ga=`*LPf#)z$p)$ zaY5rJ5E*cp2QK>(laov0lX9{_BReID;IRjUIAlpUwCxQxrx>(M5>_Upq=HP0F9NUg zgfyR0zzcHYq3t~=4;JsBffY~(ItP?;Vd}xt9hd^BhC&p9ZVv}fbETvfmlWk!!pbO6 z7=itTA_`iaha?J4WMDpcXfGwR7%8Wwq=E%e$NNCthHns@6mabe(pHcgUzlGEUeONfkQE_~ULZ+l zWTvDd(qU>@JX9N49JI1JFS#-vJTeEh11b+1?9WY&hpK?d6+!m^fGq&8`UkNffn5RV zCV~V&gF9uZ@dc12S0E8kt}Utn9RLhTk!9eD6Lg1ZJV+X(7utJF0d)yeLA7>#N@^Np zL3Tk=eiCSCBe59Vx&$c!E%pYD&7!Y_PDw2T4LQeyM(g4WGAfH9EKuNr%6f=L5Gp|B z2gojncu{IGxcp9rjo_waf=dukaRO3-;Kk?VL;GtmC1puDiQw*YN@j5ZsBsPNyr$&9 zqA&+qMuS`V-~uTp9@KUKnVl04?#36zCqf2_p+$cRT)emhyptd$2dNgw1r1|Dh8fdR zAxjuiU}B&tO_0I4@zB%{;bi863uRDi2`&ICHxLzRN-ijJib~=^?t<8r#h{V0 zRLELem;iW|5p|(0R0_Jv7RCcFv4wHK>uaGL_~KdwA2LY=<3pF#!nokUBk*E2@FG2I z!mxx3DkacX%tC?_iv&vQLdZj>cTu##;t{F}JRA&jMm}u$EK~rpb{4?_Eu4k&AUPk> zi2*H-Llp)u5<(Gz4Y|MsK?~#{i)CRV6{*SKm9lU?c$q8`557hgDu%p37A}OcIuaG?_D8dqciEJEOw3ve}+dC=?x_7JQdLGlx5VJjLJBPoGaw1OA8 zLX8FS!7E%5d{C<$UOj;9N=I6Rf>4IEIu%I}vd{!c0I?REa?CEP|~w zMW_M|YJ=K-2w$eBmVg8yBi#svppqK4mJ}h17E`dLpU6u_p^9NrpjAys83HDZv{)3T z0d=J)LKMCS87>4_)CT3kdPTjgpf-U%=Mg5g(!bpiUZc2!X^v6NhjO$z`As24qdiWzfZ$ zNNV5>JCMD|%Q9hVFdBJag7c>|+zdphhs@-I zMgt0<1s-%gB~&9edGJajba|w8jTlmpWt8Z`;NB+|mw>H=u5?7vQ=D3Y%NCFn7F$4b zh0qQD;JzEAutF@3gc*;#G7?D)CC)&}9K0qHt^j>OBtinEGC^JniBJMv2Z#f>mEC@ULbg5WibNUj9)p=%mp zYS7xeke(Zoo{~iHA}*M6q;-sNA=q{}r~rHgBaEM!3tD^uI|Bhl6f*FKunv^&i$KFG zAO@N+mdXR9swfRSV*_GhYJfIqk(%FtT?OKThbr@PK*MjKRn}lD z!0v(R1#{3Wfrx?HCCIiwL{Y6tFG@^Fg|A>p0o4M~@wQ^n!37{oz+%u-Iv@(bBhjex zphi|^VoqiicrX#HrKBh^uQ&}nU6oPA|(2*sn$tC$k#HlVS0WC3sj5y;l6s(L0 z+Y53M^N4e2K@sGnjQpf5{4NE%3buAAr6?Da8bBK=^NZp^E7pn=(_jIS400u8We~D@ z&`@ql5@?DJq#ML5D}WCfLyn=yO#~g%kp^0P3R07vnhSCl=zIsrk|>a1E@-j>aswl5 z#i6bG9CO5WhPFVH+BOcRP=d|rNL zUT!L=h5+lxNX$#g0k3l{sf^D}ElC6og}`)XLgw4S3SlF>U`|$kX;EGxC=nKy7NvqF zI8z{N?NDSv7K2kRc>Jyyl(A9dVdILJg7L+m6=!JT;GuYAv7A)UAs|>By z9gnMsZjXoeHgf`kYqp@@LimlUVQ zgICF?WrBEBsh}xq#3E;KCIGFrtc)*61MPbR3qaBYsBsMrCeR5XkQr`JK8#OJ1#bfd zs|0xwoa0~$;R5lXlc`{$nV>F9YCJfT!^HARGQewolE8!JVAG&NdHE%vHKNE0krWlB zmVwuW##f~lfwsRu(okMXd{I$+PHG}(0SeeKTb> z9%w0AYHk5&J5)(#T4pME1~x4dt^$;Y3W`#(DJd=iFCIuOiO)&RO9!9G1wNn&k{H4H z5@K6%NqkvmG3bgvFu$U-0JOadl$}%Io2=4u^2D%6Hi$kD2i*98>w}bDpfO;OP<{?*Sr;U0g3mUDSNz~? z0?w}BPO?#d&H=7ZM$ zK#nzph=Lm~sNn_{0+sVAkclv;!qnVkaE%NqSwYL+lhdJ99o#9f1N?Fm3ko31GoV`Y zL1!96N>H%w{G==-vmm`Wh*D_DjFNaj#WE=6!R-MFfV_`SfD%+JdurTBxuPRq)mVl`rw`uc$r#!W*%f|7R2BZP{TbJegZC3Frz5H zqy#ifQl3}RgbR2VP7J zJLS0ud@eA=K=4_SkP;5MTr~}}kq5LS5i-4<20ES(oRzlHo)O2v!2~8~EK?caAWm-`p_-MgI(8UXgC;@f#pxs~S-WqV*71~|} zIUb|}(#?ZSxPVoprNDD0NCouBT8I?{fLf*b$?%zcxG=)IB4xKc=t411iIe? zIx7PgE=wzhWD+DZ%2GiG7eSiCr3LUFTUs$x0$ehKrslv-FHcMYk1MAYmnSBH=fu)V zi&NuMAY&BJk!O%fuxMrxXvhi_CNLpTV-1?aKq^37#JXOvQK00FCIqeW;`8#s6#~pG zsH%9-)CWuqvbhpzktf(pur_e#0J^#{4K$~ZXmx;j(BcJbQb}qB>>O8!QcymM2h|QB z>2lB@SV=0RQ;949&Gs;PP;(D43Y?yrSC9fb&KGpbXeoGg3#u?;YAii9uP8AkvjR49 z2h=&48X$wj%K<|f#l5?C1u*<(-P_pXw^{w-i{4YlABtR2yUiA6@UvDBu{|GKfoOo=r%}@ z9`HD6acX)VXk-^I0I5U3hsG9_g3t5%*2eKq2zSP(#J}ET^e6BG_T~TUbaXffkJ5n%%My`=P1f7Tk3N{jsS8TsVN{w2KK3{@B_2{M!WDyBYpE&m(368fR+Q$I7N@4fry+JjfJKW_i@+fR zs+~{;K*N98;HDE;9CWNTQW}7aNJBPIf@fVoipp}qHiG*EP^Xk9XC#99!s)3cNjZ>= z4PwB0w4lT3Ku7vOwmf1SAP>qJ1!=jd&=remIf>u~14tOO*#=}sQDPFPrUh+z0uAB9 zgy2;)X!;Q>m|t2DpA6o<1lc(YU3i^dS`eR;pO+5Wh>7qrbVw7lO9V2I3vcH@WpZ=j zODaJdlc0l5psJlA9@N>4FNLfe2Q@4qA{p_r^E`=$F047@m%2Y-1sTBp8pr!4gr81e| z^UD)cvPz2~mq27d6@lUpoQc8y1=)%u0oREn4s$A08Hfv67z$1fFk=x$!gfBvWQtNj z8`~krIl;wB^B{E>C^^Ce!9%=|0it;DT@D!~iAnLGktIlDB|bGL6*LwN7KX$VShf^0 zx(Aaj2ens=Ktw!v>qQ1s0J4Y?m;~OWl9^HgYWL@-r9oN`(3ybDocwg7ct{xr zWrLernYrLS8=3i#RlvyH_|l|O&{$Mvo*AfV4sGfn@!~-xJotnSm|$KCsQH{*3{nfN zOkq-x-Uf)5nU)A`9L z9|?*8sMrD*xR|2gQ7f>%)Dp9J=n~}2JP-%6TO4$HTv85fgDq4BblOWXV$KI53f?Z4 z1}b+Ue0btS=Eh?)526w@unBbuc-{qEb%XTACxMD7BhW}%S`Oss24rDqmMeyi;X|Y# zCl-U*xcm{HTnyUEU09qA$^PJZG?)WGO(>9ouv!>wQc7lGdVESLxI9M{00k^~TN+px zH6%bKGiaIyECuoj$RnUBZkSz}c^RNy19;OALJV>*LK!&A#YvTr^9B$iIp85XC?B#JsvIc1CB1Oez z@vt=_5Ou|=$)(`_Ur}mVVooM>*b6FGngl-D1ytT<=7GW*))9m6;eiMvF4+KOdB|CD zkdhxZnHvw;xeFCU9eIEXA{w%pdBr85bt#~BZf0UmJgAih8B+txfVM*+_G)G3!Q366 zlo6j(1l}x%BnX~~$jk%pcL(i+gB&Oc+Lj5K|AK7U$jpx~1)UTF>uhD_gDTFH%>4Kw z(CG>gE+_cfJU|Fz2GcXg2LQv}fQoIzHfvP;v^hbVa3A9oHiGe2wK&F9?D@rR$%mr_1 z&nz$lU6vCM*9+N)oDbeb36jiB%mz;=L97QAcsWU+BvJxi-jP{gmJ7MS0XC48S%Bea zP$C7n3DgVD1WlCYp}7uv`~eonfttRFIq@*(#G|+dbca(`er6sd+Q1Hs&o2NC%@xO| zCTD=Ue3{S%G4Y_SoDda7`Jg*NAYlVNgDDeqbrI-@*Z9noRPewKNCY&q3X1#^@a$@4 zK_<9)0qYWH7L=J_ziBD6pv(-E;)>!^GQpdrQ3W8a3b>jqP3~VX_BnpZcm}8(W1os%grze6HfX4hm2k9i{C8k4Ky+wuK(+1*8GN40vAa$V0 zG-w?M&YK{^KnK|+XG7K!KnD~ui$N2rpi&fEK0{QcLegJxd@AI=Dp2b)9Xulr8fAp4 zsVD*UQo&tCgjs1t`FSPi7C_cgL9{{G@g=Dhpc#Qo&=>`HPkUxDsA~&Z@eE-@))|A? za2D8!;G!%Zv9uzy7<>y3r1S>0{vm-5vv6czhB(9}dp>@pMc{KtV2+2n5XObJYqCH~0l_5$Xw4dQnFGjhgm@{q zW62O7pPg8om=_P88i1@cM2JB~EYSIAsz5{i@Hz})7+452EdbXF7AYu71xE}>G_@!% z9@OmvpCbWE9T@#ekYH*Kc!eNTLmFuRBlJQ-kSxZD5>UZR&_T$cW)YMR8tMb}Y!Jpk zLJh$$h991somvUX&|oRhnF4vBTn-Wh?c|7uwH)9A;FJ-clUbGutsKx~K!jFC+!YK%EL=f)=MhmYbC2W~Rhv79_^!fe-KjNkY|udbFT+ z4rseK07*iPE3PaqN==6x69)DgIOw2(3RaVx zQJR+xYEXkZRLByL70F*VQt7gI+-h*8yT6f*4{fXc-zv9BdPa0Wtw16%Uy#M>Za` zn-NmjLuT1Q8o)Y1*b3*DC+1{>78$_o1+5POFU8Esi7!r$2hD4M4h4i9MTj8= zIgt=m7;>s0cp?d#1i0^nO#*Z$>4A{vWlYA94yHq9^x&~ zX#)5afI}87y+Ac%cpEN`%UKXhA)$aREaNea#0qWW)8Oi@xFj(hd@~VP2#E(e$~!3oG!P5wO~+?~D-!Sl-$@zqkYlAl zVTLM#P*wulu>zgZhp0vBi-Niqu&d_b?08Vi5T+D7O^-N{7pw@>Tm;u}pzXP!lM53; z=VC)nXalbWFV8H=fGXK+OiN)B;aCpbA3v6QHRCSFNQ55Yb|= z0eR`5b&Jq(om|kt`CwttvVPE%M=|IyM}!FK*>bcYU< zm6BQj-nj!BDhEvjLe_AAmYPD=;=(soq6>j*N3bD9pj82&EeT1W_2=MrHCQodaG*3V zI}dVcExJ&AW^O@IYH}uc@ibVn7}gC&vJ*Uf4p~+NwyOek-X&y98Ri^$ZfY*H$^qRw z0y$q2NenW>7@t~^oSK>faVA0oXyt!$Mq&|YA!<2zNC8P_X&yuh> zsOJpc(}N@lJ--}$4mn710qEj-C=cXUPpgbXpuodd;xfCZ!U~moS9Yv9|`ffhXi3%Md_^Z-KAW0q+#e&4nJsk(&#d-UiL^!v^f)6N{2F;*r-Q zq=JsyPb{j8FUd&)C)wQ6c(`iFCMn1;BKRr@uuqW`AejVSoD3c4N3jw^4cPtYCcy?6 zLE?EO@sJs_l>9vK`mo&m6wq17m=O7`xrnSWzf5op0WXk#gOsWNoD5n>|95KK|noqiBCkZCgTRtqHOg2p&OivZwGK%9>Q z(FWzCy9y=@?R=uD%`XB^fg<}Erar$2z6%zj2Qr@y>%^jnfjU_z-h>1-DF1->-ZI3; z=Oq?oLZ>?+Q)plT=n->ZHtY;Bm|_?oG&clsU|v#kejc6vCxh1K zgU`+`g041!OXL@ThjNR+GuxP=u$5qtRS@tAF9;XBz8Sp21f&skiy(Aa9vT zT#|t{d_lMciAA}^(8Z$=5lDsx8v;6@EElx=54=1v4|D;18D#1Jy2cMG1TMZ{D`xUi zOES|yvk0l6DN$(nqKn0YY9ojpsEWZ|Yyz?c(1j@&Hi3qg(e=V&4q+K+`7=Z-hFnPn zxb%RlEvZ0^%jcz*fXCyJq5&cRTD=J>J;5uYV5%T3DTqN}ZIDhsl0Y8l_$JsU8kjcF zPAPbhff_`Rf*}Wd1_*c!I&>o=mR-2C{n@WC)B4TCfdu1L#ho zf<%~$z&wbXKx?x>wKvL;52y+UZM%vuD2mT3%>{A6A(@{7x&{Dz#}-%&5lCPeaPKQG zAJUY8uBC?tNPbanVh;F%Y>?OTOH$+03qbt^&}bY;qzJSgzBm=OrXjBklu|)`8PL2M zNC8{`JfFr84>}tQqzAU6D?cqBb{|$oIV1rT6y=v?Lhk9wPXjFg1Z`Z+MBM|0A_2KT z2~@Lz%ufS%?m$TzylV#(0Qpcc&>r8^q7qQL%TEK(fP;E*pfm|y@C6kEXQ4l zP%%`Upg;uGBGA$&KMfLN@dcooIwv(AJRk~PdH}jDDigeb2YeJ)ets@^&pY_;JIJgc zNT>+3AqL!L$pvM&{Gyc9BJlPS@P;htibK#PMIaxR=cN{bdz2u*fv%)TEr~DAONlQ7 zT_FKWEuf|mbln8Bxy%p`UIY~n+KCJbp8RCcy*TNhHT7V{U~$MGV^J#Tzz~>*g3LUS zji4oLAcat2@GvguTo6!nB8h|B>cx;fj|It@;C&e2G9x(=d?FdRcmPR&1tEbA?n7dT z#g~AO-3Ez+md=3I4CEGPf(lr0^At_I0!0GUF3C+ShHQodsRRiW%wp(q2V%6O2e zkP|u!Kx+#iGx5+nd%z-~;uTabfqFF{?}Jn!#7etRyFmNaVf)v>6RxoHxX|=~ z&-euGr32q-fhJj83QB-bLHHCo!hE<8?1V)$DM*Myn`;O;P@6R#wgMk&dVUe6zd+?i zydh|BAyg4q06f5pEPxzLU=^TYXt;tjP?Z6y9FRnc%QH)oGeE^9sB?rVQIZdB!XeyT zl$sU~)dsrc8g?!KOfP6d0%jmU{EzHlhzQKZY2bbhs3BOAT2vel*|!F<6I2z#n;qce zlR?*HK^nL)6{%@ypwhMsarY5eA*2ZiTI>wUrI{)5#fiBE;9C@tq!W|DsRq#*fEx-r zydE~~genN>^q`7?))l4}#Y2)9ENQ1f?luDrU4Y6iP)0!21u4YP#L7~OKpTBgML`jY zDFRwqfkhP4B9L~_QiM`yM8jMLE?&V6J;=&Aq>w?9f~*$@%YoA@BxDP6L06*Yf%>H| zH-I-d1PxliMZn<>b`s3gk^*QrmVk!WO2GYC zm>i@%4nCj?T=J(DrR5jpf*RP+WjY0Ed7#1vOo22(xQObxARW@|0bQ32X~7j_#-~7v zd{FZebZ2oHsJ;i^zgCb5K0hS`)cuFD!L5HN8{B+@upztQK&#wKiXh{S5Oy9irzja_ z60{oz-L6^yI$;vr9|JAhfgIKd7Rv#xSc4p|2=WX_8Mw9pMHYrYd|F~A#G%RA@t~WA z&vIu;L3F27Ff}$i) zzo0BLzZ5Z$13N695ef zLiB)YPEdvcZw5mW0-f&(Ii&%l2Xwj-bQl40_A96)0;*n67NH&% z+z?^VIXmFG7;H7@A~H~3E-fm~%+G_>;|M9xhEPzV1`obKt%Qg{w&Q}Y6e}(PU7Vhm zQk0*W5?_`9GB3X<1yb=s*Q$ZXPr&h7l%EV*a35a+ZV?w0B}JLw)&-0W zt}Q^SOCZ-wf|k00?iz&@Q=k>w;C;6UA<(fj5Mjh>K2%xw!eNjwkQV2OL48(#gECo&cK;4B9fQ<+gl%y7bXNaKbIvzIs3zmS!JV*^_ zIVLETf*k-c4zyjU1k`s0T}l8NI0KjDAjO~tYI#vXQGQ7(c*+257$|*%&%py5fn-rp zJa`Wr^wL(a*-#lG-2N*q ziN`pK10-FLSX7dk2tNJ}%mp1A2#Nr31p~jK4r(~Y;Tj+<#ia$1oLCB}q~nWAib^37 zS6UJeKbrz%M0p`%)dqAucp)g3kOrWk{37s_4}?=x3hJ4GhqFP;X%Z_DtGXeAP@^Cx z&w!SxfKHr+j3yw7!H*9@5(6Jg11VOKMB(F7NMZ#=sh~wl4Dsf zg2hq&iY$a?D8v&`mxI+oM6fDDw;if9v#1a?1R#AD(6j*5V1xj|TqH3>1fmKe`3fR| z>Me*E#1SYKL4?q)f{LPBh7iW$30ORWt%5})m;;MRFb5o!NzkFKc-ZJq5$Kpz&|T_@ zrQq|Hz>`UE!Q}iL@X%RN5@OsF&W=aZ0vaKKANy966b~N{gskTWiR6PeM1X5#P{Smz z1XMK?C6}URB^V##X;7enML=56R}5JW51BQOhn#H;zC|++ ze2O_pybOGvG@4lPVAfi~cwgN2~A3!uH7prKB% zFTnHlu*IXGS|J&9f-|C@9J-1LwX}u-n0> zT!I#UAS!vNPEdm$$*17^9HHY#kmfdgavF4uS2noQ2DS#W(G$FU7LorzEs#v`rd3c6 zptv*>wlf~KPdKe86uJsC#Mz17Zt*KonT{2i@}Fp#zSv&PR_{(9gzjkKxoo% zarn$bQ6aoFUzA#wT2!1G4>`db#w!J#ECsfz3{>?ag&Zi1!S00?hOjAF@bT;r2}BD6 zp%@yF(0O1a#YhsM**uV)871*arODZ;pbIacJ9dgPO5!11wW3^bvk0UP!iooeagPQz#;8h7w0qC8j zNIdA;G^j{saWQzz3(C!f-Wm+$mOzhq1^E+V0jO0ES{PMSVg@}(339F$sE-5^gB%?a z4_j;v5(1CegBFE>&q{zE9|XES13oMXJ>jjWBpxys51OR}j}(IJg$Y6qYD83FFmX_o zf~*e2N30xxn+clO2T36-g^7XNVUT(nW-4S-8q&W-*M`&{fhk9J7UHNCP)-9?EucZg zqLREE#B^{`XxhIL1uN31;FJDcq|!|{Xx}YDrAiV zC>lW3YJ6f&NpT6}=JDbr&?+KG(ZUcPUz`NWu0t}p><2OR(ex|7+gLlAKZ&8PDZ|` z9K-`%*NjNbAQ8|cKiGx2nV@z`T6|7wS!xa}5R*Y$+`&y2uo~zMGGKNEbU|M{XaEKz zk_s}oAh85gx5s0T+qR#7?A;z zfJ`o;X#n4f13LFTAJoyuCW&-gBQ|MJ;R3#d5nQr>r<_ogfsz+CtBX-?<3rN}zl$4H z9MsYQodXK$@1xv34HLj}_cT-rdhi>J2flk6#wh}4@l9dFb8K zFlkU(4$3Q_aDW6m=rTIU71PiwsbPVFkbvKXimn4LffAYsjm4=Y7#4x=o<=waQi4Do zn-9Bt8Y&ODdm6z3-8~KEK~g$oIT7fpT~uN4Bshu?Ql0?04?IN$xqBL>40iW4oDV)W z1c?Vf_y{V7eD^e52<7f+xF~4ZG-Q|wCIp))K;gqO5Xgn_yQdKW9 zF|_Xp6GFOs8YTp4x4|y%fQvzTi!d(IT{>_f*xl2}0?@msk%hol*T4lJ$GF3|uyPZT ziok6eG%iL`0^KzYzIz&K4u}uFdm6z{NzE&P7l)w0L%w?&p$zHnX(U0&;WOnIu;i+egxyAW5icUVIQlr})sH)xs%>F#N`QjEK&VKRujr(q(XZW_3~3aMBMP#RPqdqCHPCZZ&3 zkV_Em1o1#CPmx0iBnG;Y6>15nk%DNwfD8qRK<}PLQUh;IK$L(AgTxYO;}9%_(WpU) zf`S7&&IdCQtQy>LfZjcgB7v9-M-c`UF5qSl!iV6tH>fE9UaAN_Br_L0DG$|%O&)xD z61qInv1=GokXxbAg<*G3ql<&Bg!N1yF$Wd`jql>Jr5Jwl6pCq}OPE1@6*SXQlR*m~ zkpcnv?rE3-sd*_VaRy4};A=AA3P4M{Q^1RoAj=UE5-61k^4-%2CD6O4kpwU*oMNQA zrxEHvYahT%hmeF|bKwY~V))(D2ra0otHt%7v-G)xV8YZsIxK_-Kz2w{pqo7+pE zcTdB_KsV+h7lPeA4HbajJq_cd-aU;X3ZJ<{5yfbRg0chX zj%i5q5#c(RI8F^v3FIa+NDpW{0%jv>^@!Q#f!#d~RS%i&MJ{Ga;df8Nl%U)_4HE>} z3%z?9T?nJvK=VUQno|KFu{tTCx_;wf<}wL zBB1N^;Fl#QWr7b71!dZJ@B}_&e+f)sG32&IP?ZlJ@dB#@Z@B`^E|q{5`NEW(xM{J zoC$b99~vPg;0--UM^%CpLeHFl*Lk4*$Q6(!C?ILboCWlT6No@5v};)s52|uOXFr1$ zL4f2yn;9T;ZLsUnz@p$CAc@7KuAH7wl+rkUV(p9crK;3&lgnKcMRw>`A(?K~cKRF&e%K>s%I%pyp(!fYZ zq_uSL^bfKs$fPjnNK(+k6NpZP7|o+OQZdRsz1(ARoL@ zr#J(&{{no*DAhrhnq$7r=nT zz-J1_gXT$c^1-965CQ1)V{vwTBIMk3&``6XY%I8Lsry)hTB2&tKcYsN~FT3vtTMyLCduup_~Z0 z`2;EhOUn>zA@`?%I@zF*fKJ&IXUC(7gO=%`OQHlALK4(%j4uM;LjbX&2$aN7Z7r&R zOpAh=yAVa7HGf5^po^qncOifl(n4+l$Sj7;V1SY#R5e5*H#IlEs1lrSz~V{qiA6<; zm7uL_(6zH5Vwvx#sv?OgSMKXDFc~T2HCiVraTWM44EB6*8`t4 z1vSI5846bbI)ociAAlA}=0H~Ffh_{x@&sam#=F30vxC-VL2XJ&O)i31T@1R?7&M-k zT3nn6p56xQ0oAPF89yXmJSZYz27s>7$OkXf2B`qm3D7-6ATDT&Pkdf#2`KVFM^i&J zp$o_7lM2#6OKBm?)?r40BvLYqK`YR)2*oF6U==L_k0@j( z#e=p6fK~~D^n-3&O-zAgbu^jeG|-|_u=9{Cj884bYEC+24h-FR&^0jFTmw3+9fvq* zmkNfhIYuP~W#F-0bQ^LD!0Qb$bb#77;8GP`LrF4<2S8;wirS*Y^mxdb=U_8IT+kWP zpab1O0_ny1@rb1rAQ8|49MJ7ppu?-dix-guk=nW0Nb8wEDnQF>5{n@F{y}_D{6kju zgL$Rk3!foO@J=WQ6H-tnL5qRJG{{ygkQ}6XNJ>qEPDf_L6oK4_D4b!U1*Nc36-5NJ zEUFmNbbuQGKSdH@4N`Uh4QYUzW1x%%jZ?5#X$mZ$LCp+MKK?>mayH$Epb zDZT=7KRIaoVnK2)sI~yjXoL6n!Ne*cD`AWCazS@dfbKR2b;O}VsuJP$M!0SOyWTLx62!Q{b7Cpotme1dk5AJ zQUSLNobW*UN-Ds8augSo!_o_ALr`KtJk*+kOz=4exuBM0E~xHG2Zu{RW_$tY@Oenn zHMJ-nRSq`jT#yMmOFFMO4WS}FFCScbfZSY=2|2_D$+FTs&?O#NtbP<=2iINO3| z-a+SOgCh}|n-g;qL3h`H&LIZ1;lO@}NFkM|1v!}|;H7?`kxkG*ZxW=n3>F8suL~e4 z14RI-&xjBQ-yRGqSL2bjl!2GJ7lSu@#1~iQCgp<`uok1Q2}Ko%&&$mO?F#{U6|NG# zrUjuEB809Q93|im52!Xz$^^H?OA?c_zr>mF9w$Q>B1(fII|I3KatnGJ)EV;3Ndv7yyoBusYCzi6;2xJ(DlL8wqf(d{QZO%*u zt%8A+bs$9`F+@8WRRru-c>0;pRCE^aD8_nUxEKLCyVf>tAd*Reu|e?gLv6$zEapeTgi zod!|~y2}!DDKe-(4Yde#yC-N*cOv-ceUPH`)Dlox2^y9`r~!#U=R_-u!3UW@<`Cf= zR0n{{Z%|7BY5<4}n|i4P-Hwu61}#r3K}Wp7NA#gQXjp@!N}xmbV40Gl)M9i#bnqM^ zkLpU$fB|G66(pNcS_0bX4RsN0P#x@Sm>77(9EF3}fC35`knx}q8SuVLVKpo^HXz-pa+6sl?H9tgG+#Rw?ew+kj@Bv)jgaGx*0V! zB@?oU0X)bAS|<+OaKsP~-hvcgkeLEXUoS2-IuM1-EodlG7j~p3t3#AU>#D02)04 z4L^W~oJx`lOyZFm|KRioGB&xu42O6;sDKBxx4<1`h+62@bWoEZzPK24nhdycUy=;j z`<7Q)5MKmoD?o(u!9$cFc4~4Sq}v(~9@zj1ftL5igEmn@2K!(_pr%%Qaz3cN1iDBz zJ~^`>1KcqIDFAsaHx)FX4yt~^B1QS-@#UF$Dd281NF*Z#y5Sha$t@`bRa&{=kv@<> zetvm8Xp<#u9X-@z;GJgBmCK;hFd)~Nfix7Qg6ls}H32z$2P6m`wMVfR)RY1R8q`Ek zL#YUy55XEhtt5~TXuu^W5j1WM7A^p7ngiu?kRPBrvDjB;0zS(L5`<7?&kUL>u z;^5{jY||s?q7ujn5%6OgK|+vit>8i=H7_|o1vEzi9h(M8rze5}C_Xp06l7=)Xs;1? z8w2>@M(`OhV9#NdfVE0M=0M#CiX<$;u)%JKN>Dg}PdNlx2|Csi6khOck0^pEsh~xV z(AlJt{CMaEHXt?mIiM3-z^qcxVI6sp`3`sjF9PKt$Y>v=?*v{O0ljPsTsnitXp6vC z3P9u_t3XmRiy>Q0^K)~-OW`1r;4w?s86V*C8)P@wmg3Yx*iZySZAnpPdOGO%n0(MV zoSEP=0zvIPuqkKeA*_eljSH!jBzAl7sH` zE-K522amDDr$9yp!Ic=yHxLJ4C{4|Sq&85+gj*?Sy&tH5lnqvlTODM89&%tqJZRTw zd}0}>`+(iCL^%_>jfGegMlxF!)_#G zHyrFhfW*uaP~)NiI(m&=3$z%31S;W(h3*cH2e(N;K@93Og2t7wn-0l>(5Y8^O7c?6 zL5tnvlOTO_oB;tg5Ol;SWCRR{k*VOBcd+w{3JJI{H77H#v?4yS40O{Y=)wWqc7wLj zr4@kB*@Msf;c`Jqd}cmqgb%N2pw1Y^Hc6Z&!u*aWxKm5uia?Y4pj}GXjRTEQmgGZj zl`JiYFD^|^hAa@mp}eFVd_)dfk%(00Kqgi}IRsP>3g9_^Mq7u+p1+1WioXV63-eiVDTS;b4 zd|GA+>@qq`RiHWmdd3qtWtU`vyQ$a}=76T1!6$NoI|!h$9IPQxmI0nsO$D9FS{x6% z=oz%>B|Z~0uz{oe0%B92SFkDt4FG^POo1?{HH6a};3gS(4hFK% zxfs+RDM&7ePpT|Pgmg==`5wG<9G=q(K?fLSLONU6RKu=g1dY?<3IXV)AfO3caH|iO zI*^Y_!RZRJvlOfMK@)_K+eyGR7H9;Hkh!1r4;hjn8OMqJbaAn3w`7 z(D7OT+SFc@0^LIi%4VQKr3khI1#9p_wG@>=HeQmZ3A_Q33@xDg32DC~UWbA001qW1 zHaKF}09Kitm=_O@iTph9nMK$uHP9hPVCC?LOUndZ5{@gDAtfGMG5$yZ8w~OyY$qkC zrI3TW#Df?P_98SB<5r8PhD$QRr=(yF3Q)hQxHLV#40@UuXuT6IuN6ZU@1!M`=9I)I zf;S}NR$2tQr5H3o0UC!&2G1~IbwDZTV%_}Qf*epoF*gxBjEYkscpCfrnW@!-WLw1*B9h*FO>k6oLBxy*w z4eBQoFbAXrG~I?+4S?YpWMk73GeH+!LN84rRuiZk2QS*fZ#JkYhnC#1_zawcOY)%$ zA@G_AJx>I+g^I;U(7_=kpgADOU=zM@g(`)t!oX`ew9!X6s6br;@T5PeiG?k?AjJ!2 zasrp$pvfz6cM(-5Tn@Iu2g$8qxy*b>1%s*$w5A8-eNay!uLQJJ6QK{*B7k)JLG4Wx zy-?|t)Z&t&{7UeVjM(HMhtR{%21AV-s2SMO6-+8O1w6fgaCMFnPM1yTYoCK5p_k1-s8 zkizW-kQ$IJST%zraBD5igZdCdFI)zP=G;VhkyH#ibg%@xs0}F=;R>+S=E-nLECG@W zI({9t>;cKZ{Ji3P@V0&wu@cazMt&artX8a&sc5ATtb2j#>*AF7w9-8AN$BuHXpoFU zkw)*9Bp0VZSAd|88l|L`few8EExrLSqX$nWfU+cbNDp*;Ipm&rXg))65<(W5fFb(@ zaHzp(zaq3l^r1CnK+>S@1E_6_VI)YR7;H8_j{&jf(S!!c}uNTK;4wIZ`59=f9v5wockB_`k%t)PWIXf;Nf zQCcxxImlsFDAt4ZfPD$-cEV1wM%afWkJ=9fpNRlkL6w7AP^V=knL!qvBd!HOGA#SL-}I9^jr;;~7C>k%*kTWOAD3+U>gGLUZ2tV=xf zvH?_omllKWg(@rs4Y;Cbxin-+P-_oGYkEOuKInic(8<_nZ6UB!Sz-=&nJmIR=>?^r zc5i%1ehJ!$3-lzHcq}9MFe!|jl4+C-T8)TWc|imVz;`quEQW{{m*${0kwL=XdL6}I zpf#!BxjDKx!^E>G@sBN zRhA1nK?zzEf)0NM9Sn~>31e4^B@sduf?WhYn+`k!kL*|^70}`V>@6bHW#-{k2|75c zv>-kkG}4BaadYFLwt`Dd$Y?8CXuvKVgmxd$41ioi2ie|(l=dLPNR!Lpb{6Pjm6X&n zNE;2s8kkH4(zG&63+jDV=-NQCpq*R@%fWr2%+wqfTuD_ zPzSKV;-GVRv56O_#$yPB?+<|thC`+aQJf4Bf}}gpl37qI7}WpArUi9Ri&h;%O#n-R4L}VEh&wW% zhcROeKtOfFNzj!=@x>+i1)$}lSR4dX0vc?K2dzQ?xehbk zp_&I)3?5|zuZzKAEVTUtb|MyO&|(cpaRDk!P>XGdRRyW=#Z&N^ZO~W+_^Jj(5dv2X zThmgU16`PgF(3z53UM3u5GzQ9OtpY+H-oCnL+!@Hje*`w1yzOCiGZrg1a(J2L)cit z0368R0KyxGkOk#f^g{5)22e1^gSwQU({izj zk%-Sr1#LAzj}Q2H14t6EMI@yunUKx8$Z{p|@L-IG?7Byig&gvblA4oQ23Z>mFDW47 zGN6^Spo5=L+gruZL;1lA|4}^vlR+Paf@uNoK}OY5kO^8FUs9BxlLNY#4ssX+k{dzW zejxjMFiZ7fBuQ|jV;BwH{u2+`X@M$TSqvIYL-#mH6y5otCoOn*!NSh( zMA8X45e75}1KMhXE&(~A7ZfCD9eaqGFlh|`fKA01xPWNFjFb{kas5f3`K~;ve-vUtxy#f+6FacQr49~4tH`xn0H!JqF;J5oi(o2hZUU(UM?b34{36JL zRY4eR~GIfVA5#(?jM&u+`Rf0kehcsw&D8#W4hvQHNDJDS{mVkFTA<_y+4B~M} z$bh#;Vv{Zg?KlVDMGKw`LmR9`7z5o%3~q?xa1F8&yy1c+BH{4_Y7*cuA5`(jgQ5yl zBA`tSAsh;3LBbA~IUvg*D)2fJWD+7=vl06MiV`8`^MkKGf|L@K@!$=KXm>Y2N6Ui&i4m z3_!;2i}Le9=P{I&R6@3^fHo%Ofj9nwgwnv>U8v5C#JqIy!Qdbn$aq(LT23bDo>=g9 zPxxBElFIlT&>DX5cra8mLLfdb6?z>2$Q+0`q|Xjj3OWxGbX6kwieso4$lu@tCXzv} z098w+kn5{pJ;eBo^7w*8(Amr|2}rLGQyg@vA#^t?Ole6;Qjr17B!>8SRB?zwVBw;Y zc+jB^@z7i3lM72T!EK4sL{u5*C>DyIQcz-t=!A*GQZ;n3Ei^L0jo{qOy!ax}UE8qn z%u?`4<{+IZ1t#F#_$jHmrJx%~p^KbLVd9X30g$=zsd>rZTYE7DklkmcDFxt;7&ur!+bN;SK?f&*cj|%8g#mS` zK?6rnIY$_@qkcCR?x!w6uW8fep>9fZbk*DhSHxi76@I^~<0GXCOyxfDcjw z>jNE)8ea<884Hyw1D&o0nF9t*TSK-vg4Xq7xm5>TewBjuWP?{2#22T6NZ=D>wPoAwblrL5 z2oi$~l%We2fsX}1){9ui0}}=9s0Q5w37H82iKY}nvH^$R7|&mJp-9SfNF(^z$e>5dLcp}E1+sX!2n(|f@B9Moo6H#$ET$xmOwh+ zWvNA(X_fKt<9eWcuuF;|$A*E-gQ!9ljZcQ0LsXUqo^pnrCkx^t9UhO&1-C-LQ>!SV zdHDsY;A8m8GE-9X<5TkE!OKEHw&o<}fv2-UN2lc{gOBkjLl;BrAq7iil!KZhIneRh zl0?uj9Et>Z8*^q}aVB`t30MkRC}!s6r543QwdBU9=H-{BXMo}hvKpW)7qT}AbQwCx zak=ri;Ia2x{IYfwy~>fvN=X zJ{FKMa1LyUBNK8F8bTGMHiD~#%xA&5;94muzceoed>{gNTmhmtGcO(@4%;0I7lu~& zpz&Vl+C-RCacWTsL>JrwL^TUh1R6~!OT|zG+6)2n0wg(t;}Iip;28+Clo~uz3l{-p zGf=q#Ife-=3|bBc4m2blIPw|d!6g#ts8q-@RwMzCIiUT}u&x$?g3k$of;3Wd~+eiCQKUQ zQ-rf2%Cd9v(?RpVFjb(LMsUEP3V;r(K{6b28zYhcXmu7E7ex!~jAN*p(gMh_y`Ve^ z-cep0pOlgbmdwe9>@Ek@Kjn!z+2GU-i9fJ>Q69J<3fkZgE&-uC^Fb4ph&8$3$;FiX z^mx#Ybda_r$bKsLnGNMh(4%|+K<%LNBuIYEFD-$Ea#9Iw_!cy%0*W4x zagaO*K4mo?R4;(Uz`a*+8x(x&F04-p>aBv}yr=}$Ercru=Wx(i0ZatciH3B5i$NDz z<$;Fx!1|FT%0V>>LKM{D$pIa*0XYZ&eqS;d;_kq z;i6#Y$3xG!MiYgoh8hXkP?G{a)C;Z-RQq62g>D=uiGh3!a|(zL+3QzST2KNic)&*@ zfzHOjPzGvXp-aHJ>Tq|!JGyX@a!|H4;d zIT$Qa9G{n;3vMx2Bo>2jf(Hwilt53ugd`Asd~#xOYP=!n+(nRu5H9%CBm@_H zY7&AA8oWgC5|az#(G=t+#iN;!n*>#pR+I}J!2qrO$jdLt&&dSeI9h>_K^IL)1)awb zUz}PDy2TyjZjf4tPKaSf4Dpct!Jw8Qs0xNJUI9-QAhxK0cc-9F{7(l~&Ch_1i znL(%B<%3QrN=qz(9D@gLnt-!6I7NU?%LccA(8STj(D_xVMfs2_7OXKlwUPm}p)Cbe z%|QbbCILF76%?9aKByQ$(g!L;!0tep4;Dh>qS=;TP!JD3$PsKLhzD&=q4J@}FM;as z^whip&;|45psk2$X$+vQ6ha^m#xF`uEd!n7om!NZUz7`)VgvW`QbF=1@o38M3?Wc}AQ=U}S`@AjRw|(hpjrS?1S+wS z%t8pluQ&%80^S~ra59_=HxVHMcQT3)!pUG^=n-ci%h6;|JOfq>6+yKM;!cRe!Kxqv z*c5>*!BmKR6Fta>;HDqA*o3G>@Zn}63Bf&yDu(b2L>%gLWD_Co#1uiZ1)>b$bclHf zQAF&3E^aK-b?vn(m-hKq+WU4pic# zAj^YiHbAv%0jP+>Sl)-C6tr~&e3}!QD6G^%=*AQQMFB(8tuq?!EY*Hy$rJ&g@8J{GwPLL-dT{y6#k@cZT6(Jdkkiudgh9pR5KIpX5 zB2XqOVE_#bfoiFO{5;U&<08-)5yXd}+zFKj52C@PKxV=?+3~2SEQ8ii!6#K9i5t}H z0||pp&;~6-Oo1#Vg*TN!i{|4&4O7s-BLk%R1kVG4FE$6y!h@P-Mfsp}HOeyL!TZWU zXMRE#onoqhHesN9fIxYU0dzofGWd8`usNW^7*dn-i&8+Bs+U4fnF0?DLI&PZ%`D3R zwUy$_a^pd6Ey&CRj|xH5fYWJw0cb}UXnQUJzCKD-UXF# zrI~rfd7y)f@u-J(31KB5s#eJPeepP~g34mo3OZ{XG_X-zngr61YA&*5aYklZ33yd* zI;Nte%#yTBQ11i9k09+yMTvRI8Q6`6$`z$zF%cA=@lXYsxw)8Df)2ws#3EdrgeeG~ z70Lm1xe{}5$bvSxrDAs`ST{r-e6<^fA9M24Gm{f@K)SI-H7FQhO7MmvsAMh&4aB3^ zPyo8sG`<9Muw`C8c+e0<8d9qzCgm5EKu>K0jrbRXMn^#RR-qo~29?UsW`MD<%0n)= zEXYjBD~2fq4IY=I#+T)S1VA@{f;Wp46@u2yg0p2J^vo#8`eN7tf^gMPVc2RUxau;{ zazGdlH2w>!+QGJhEde!tAnkv+NuVV&1>jZI7Su45$l^Dh@p+ z8Zuo0w*oE-S^)_&0<W3VT{ldh=t7GxHr zf;#tUsYM9m3UW(9W0>GB5ZpviCj)dWJjiCaAo$cKn8RQzZXu^xVTdC8p|~V9F$dKp z(9p`vOG$+s$&auEOE_YLAgBP3hnDFeoh9)w2P7Ai!V(7PAenT?WNKn^atUv(lK$-D*unAHS z4blmd03BzWn4Apbf(Ez~Q{tgF6(=TxI?|Af$3Se*WLzeA7!ES<#sFU230epU9!E({ zfsTfPJW-Mf+Jy%?n+~*xxGWX4I3XQL0#uA8LluD*4MWTV-TYUYR{|c3fr)^N9OxN^ z;1Md&<^z~yZfb6FI*bDf;`rQRsO}WdRXpGmN11`GagO z$;>N-Y#jrs17BJLW#pBBm6xQ0i*3;TiHYf;lgq)_VrXWhiG_y?Tx(~QQP~W+rC^ZeVZVNS3(m^Bk`FUx`)@7!F`X&eiGt)9t;>~jM%Rx&t z;bwwG6N{4bQo*?f;!?06IFQk_XQrm68X8-gpbO`L*3E#XO3@_>%u4cd&;*M!k*&%D zT?tcKk`GE1p!PvZ3d9Xr`I&j~iFuWvrF;kja#9n^K)old!jQN|QVcq=4K#pMi4e=p zPr(w2AW_Un1P>)6=>^q~iQwKTDEJU&!r~;k44W9pV<3!_I$#=5BN5X9MJ149ND#&r zgU=sEjp*Xa;^dMXuoa*T04gt#G7MBU1(L{+OoHe_tkFYAf$CY%95;Aq8%embAQdC= zLKY2y6@glAWzhUv3>wXb3{ydmW6w>@OH7BJyACPE8K5%YBSj!-9kj-e0d}HFW(jDx zDwP3z`FCnOsK)^Alrtn|=7UEHz>7GMIq^m1V97K{*C8_>)RT_~9n=X@Rgj;P1C|D@ zc!4PeB@eJ5hykhIi_!V<;30325ulzySt@9iQW8W_Ib`}DBnP?o=i830}G0~Ie#11;@^RJx#JU7)=o$TTWM4Rk^l z)CmQvNY2S-fXd|Om1L%a^Ac$8AH1>)MFuh`otKXy18)DpoSqEYKAQ@@vmS0}S!z*g z3b-Mam7T|mg6@ji;0 ze9({<*w-kspaG?L6v^Uj@Y*hfEPR?NrL&H3$H;9NRSbrF^lB%qJsEj&@w7eNe*=>NTQ%9KPeT7 z4+>j|VIbMEg4FmNBUrmD2Xa3yxQr=+UMLOnS2?I805Oums|-OS*0}{>L(1cG!ILJr zkVz1z7`QzE8ZH8j*e8NclFtKIr}3agamk>AcQUh6b1E6INrARlKqbo)D~mz17O5qv z@hPA_ew`lLWqKD`1lmiK9J1h__EZz6wrAdi6x0}ZQvAvDv_TD zSwjZut%5=%J+%Z>Vl#kO3xkVMP_qhD?&rakVo{Tun4KD5oSIx(1X?=*T7HNy0CdP7 zcy9_=2wWy4m8O9j8Q|3!V9_$zp_LGeL0s@^4oFK8T@aM|(ZxXVjwA*t6F_bTo0Xqi zkO*E*h@=Fxbq8*FT7FSBLJrje@Zbz+X$*My0l_hW zMD&3|6U0N07_eAsA*vS0Iy`t7gVlh}ltL8&ZK6OGDM~FZPDL06YQlqNaN&xeD-=)O1X^H{0veYCjl#i&64O&L#Bwo} zm0+qWMO6hJdCpHu16Lbh<3V8zjwi?lPlz+%MIof<0}bS4r=~#NSY8M^`MelB{+w4@ zfG!HT)(L73R4K>;GP&ZI`cv8NXQ0S)BuD?SLB0^Rs%1%MAMF8UNNZ2f)X5{SysrAH^_R?!w1BN z#ss=Ds4%uDM$!fHHhKg@eFqw4ElSP7C5sWDP;IDwg9~DH2PB*zUd0Hfcr=sH!U%MF z3)GJ&UWb?lp2WxIdQ@pdj3+1NfbKj4?^FVf`W8bBg$aW;QXvcHq$YwhEmReZ3tb}$ z6$MS{rGkc4OX8FBN6ZPG6u+XyA!N==>ch!63xI zvv(k&l+psovB6+XAYMUsY9-V|ATGGo0&9w|1TouGjL(5fp~^AY3@ z@Mt_}#S+Y7hz^7>boCY3fe2A}?*`QjNEZho2I3=o1awSvd{G`W*?Lx zhYwm(4Ymrh{uUJDpt+sYqLNC8!@w(F!N%kyR_2#N69G8o#6z44HN2n*G+qiCWs6TP zDarx0W}zk&rGi#}fhMww%M%M=f}m^eGgIQBy(H)cN@(~OfLGr@R6^25W>so@5~$?} z@+;)@L{P?o^m!p-kOdaG#hIYcg&I_xnhaWA556xdJ~y)@6EbH7(g5Bv4qna-KQA40 z<}m0G1&GC16hOPmnFX0JC7_GEp>8t!UB!(f_DwTjx>ij6m)?$XahP(6f(^VF&ciyD*WzMG;vTr z5wyr2Yz$mAR21B@f@%Oy8-mKLg4}r61Odp2;316o)UuM|lA>J5ewd zh@l+haa5<~B!LT2aLo&955tSm5||9QxP{sY6NBEc13vQ^Dh0h2G`XM@lz_owj7WK? zG!HbW0lJkg6J!;%*#b`z(B?153ve+|2>~%1)Jldf_5sb+WR`%|w1Z<5Bm?Sez||GR z7o>wUf?E0Mu;wACy#r~(f{uU4OHGIL(LtLT7(kn1VEqcvz2}JDV^J=s^$KnvCl$nl z*3+ayhULK$;F>NTbWL|kQaVE-SS&5SC^Bz2xp6Lo%APYKq1GI!3q5~v6oC=y80+-Gp z2Z8tBKn~!8+E|>OSpW$E&=6N<9;8ACowJx&lp7CPAp{wm*O*igS~b zlj9BJ4Z*g67SEM}rZI{j%b-9hCKsePC9@c^oDAwfkQl@~P~wJer${UUtA&V{f=`Em^#6Z!6l4tKSVK#0}8+~TL7xtA&07zfbJ^*7X$^+F+7IEqJsETQ0V|W z&lw~DYAYs|#OI}Erf0w#eg&Wb&D_M2_yP>^@|5@j(5VSv(?BQEz!_Hl>kd;rssjjx{E+npvI@Yv$)GiMU=?|(C7^{A zut+Tcwe7(t;DB5YIvof^gBw37#SrgEcv#0>F5(HdOfKJN-wJ%EY z;SJD&c<_1TAoD;B(0(n@g_4lT6v%o(aBY>B4=RWmAmX4cCD3Ug$edJBQDP;?@vxyf zh-h&xaP#Y0LDSm}*4dc*+f$APM6&`PvaP@fu`7-9?o zra2k9LmO@YQ~*QVfJ zB!U^bfP;6Dghm9LRJhapi%kgzJ%z7jQ2nXmmnGtDJ341 zPS8>uSS%?uC%+u#aFC+B{E~Rkwqay3)CdHrf_e`CAi??A0~M0IkqSD9ddxBmLmaC+kn~~oAeuZzoPdf+Sjqu+fI!!a zfX80IO;?yyenDy;oLvNCfkFqFjqXCo%v*d~5=;?NsDWC#Xz3m)3_+oUp3OmGs4~~&*?5>5kOXMR7{&(;EPUbo>i%N4+;m$2if-Dt;8Hj8+hz)O(K@0>5!S#aHN@qeY4S;LUk4G$+ zDFGdkUIHE$ft*eYQUzLe1={8S9)vFf%{oGrL1$$_hvdWNU%_n1S~Lg~viuCZT7e-E zSqL(x4Hf~7Jth_6)U|vdTZf+%LkQlNU3oMpeQ2@GS7-C{tN<3u47+4Cj zUI4}f??ixbKqu)zG=K&*Ks&|qz)MBIvLGSoIWVC0LI|;vM9|_27#}i@1L0+Ymayf5 zcH<&k4ql=F^(dGPIgcGh1Ux(h-s%Ds&dE=Y2ZdRDT5@7RF_IvN3tAfuwhyEVaoDNdGQ&k6-b)$K&y1XLu^P&O7lvJ zKx>Usic26XQW0`#$!Y0G+M%6MxIAv1W$5nB1VspBVI){Pct9Pr*aOTfNX*MjhFSz0 z`UXot?mY$FiU^ejPuL?xRdH$&cn1ksHK?$IZN!HJ9jK=Q+E$pCmJc-mNhBV$h&d6o zdKaQQKRFw+0vo~whXy!tf|fFZ8AbUyFk>o=Bp+JTgO5prjoLFLmR6L-L#hrC z3sPNxwwZuNiXr=RL3aoymL-E*(-ojp3R>@zoC!V~2`mm;-V_h&K{0^2AjczEpmu2q z=q$4w$fh!oK_C^NO*`0xLHpk`LFapb%mR5IbeT(H8Q4JZ={?w-kdm603F?QIC4*Nl zfloaL;&Q-_`H0O zKCprU&~A~+_~O*UynL`gVJYZ16`Vlpa%8&v?@%0W_&h-=VdU&t_18HfoAR8WVIArZ_) z4Qh}ABoXilI1Hdn02*2bEzbu{{D9WMAd7)l$CVeNr~@rMf~f(moCK}=$pg(0zyv{c z8zd8>h=4LPKnp6s+j=1)sb!#D53m#Gz!A=n1RBl+tAT9& z1&`bo7emBB4Pwy2pXo)3d8Ijt;3ZOE4WJ24@YE}KX*@)zC?DjG)UtTc#j~0DAcIOE z#-x^ICYL}~a6$yY2^O5Xp#0KA2m{pKf-D69o0*#*69uWpMKCcK>A7p7AxblXd zEC`BRkSXBm8LSJm!aOe@VjifXfNYJ1@WHt~KQE^e#)XW}fc1eIH=sESh!lv2Za+8- zLAyOcJH(;NN)k&dAWYEM6gag)xTSgE1Op4v(mZgH2(}5FsGwU-kpz(98lnO;?vo0d z3q%T8uuL)Rsx*jIm7sGiu%t{##KYqyGd?9XsWd$vY42E43P`XFa&{k>lV6?(HK{x) z9&#rc%)n%m6((G7+?k9CX|qia=3nYE>%eJezE|Fu08f*@6Vk zbD%kfB1j7XwqCO|4OKn3kpm8Yh)yiBCHc^uOIYN<6&(%*;OT$Rb|csT2h2lYho-XrOa)-AkSU5{&~d<+DnRuLrf6AiBB~&`2LzdQ zEJBq5t&#zq@s8phs3170fif*}&_kEgf)*HooQG-}nj{VbK*#lg9A1p78C1+*xE!?V zAvq_%I2EoIyhF@#qB!lc&7$4GBLUJTr0xgHZ#fwtYia|>WKqUgq8z9O2q^#8B5@Zor z&I8#SkCxFuIzaMRgi%8Xq!1#49_3(}iaf9nkgWv=TTy;4xZVeya}7SL8Kwf%KmjEn zbUwQ2pxGOc!(r-R{CM=D2QGnH^q>i2GalrBP|1XD4M-dO1s!0+kEk32D?+0v5)S z{|ib%17s=i;DqtxlXFvGu0wMelnYw2ky!*gmkUiTxKKujL2ju7g%(<&f=~ik(G1_& z1NAKQv{LN(61;9FEin^R1cAonDq*I9nljKdg;qL&WH9Y00TnUe>L)S>b0}LVvsbUd=r3Ii{=Rghuj}gKQg!&ECut1G6s065M zfTk8218Ab)BnlTpoEd~g2$l=c4MJ#&2MyzZCZnMdfs}MGDrT@8Xs{K0+e<1uY!KpU z@K8V&iw7@)LUA706x0S(Nkty$ED-Rv3-rVe>D|PG$}v#+hN=9pc_lu;hAuhWX-!CP*@omqrJ=tKmn zZcsxf9y0m{YBYck-+`WO0XixT+|kU>$;=1c7nGO@Dg+@)pk+IVQwAEKV}Pgzv!R2Z zps}bFgg`u`R)8o3b@vb~@Bs*^pr$}RtY?~-oB`U{TwGF=4+=F@@q(h#JWxpo7X@$V z1-k%bFnC}Rd{)!B!kB0Kt4iI z4v|BI1#~JFG)fAcu?0H{Dx6l751+LKi6`Y`C#T25Oopr~0Et7+R!z+ZWww0C0esLy zKfnVeU^hb46y-xW;5}QAktWbV7GN$YHG_L>`Jmy3ywrG*|Kby&?gy={2HOP+x_I#V z>y%tjlRU9Brv$VJ6Jl_FZUOjg9k9}($^y`JH{d9RNP|TnP5}@0L53wkPJqaO3`bU3 zQh_v^4VvmglLSpXLAPQfY)mex0EIIw=&)$Z1#L)0nfZ{ZAdtGu{4!9R3aLZ^iGU0Sbqyi9^UJ^m2Dohp@&TkA0;wy5UiJrWtU?qQ zL+*o$2cP4Ca6vI-^cEDnd5~rbn-+>w(;?o+@7!IN2eW=>9gdSU_CDdqX4IVq6o z6jjBJxEY!&b9rDePl#`g84GJhwde2GB zPBkh9iGgTv{aOS%DJKac0T%$BZ4a$p%feg7(FOvOnm4RR%QG&{17f zh2YX2)Zj%|4Uqtqyr5eK(2N344?%Q*_Ah|1=LA&@a3Rq4haw0MvWORw@4<$GvUNP@ zpj}Wt1-S;73Q)LbgN_gZWgw6nA;kjJSjcKbkgZsRi&6`bL_vjECTN|G>keCHsnotM{25^H1bdy&;Xr7}0q8HR01RXgEI(IX^7&a1s zPc9yEyc1}C7-S8^0C4#NTE&}Ql$Zocjm0_nCCH|L6@X4UKo}Pi zCWzycN|UowOTe98(9U^qz(AalQ4SjX0cVbENK-dI9wY{?91yOB8XOPmTvi~v5>)v^ zC6R@p9Zis*AY}k(hz*p%Q4|$|6BuZ!3r!e@Uy2IBi_EauR|smkr{;mf0$hl|eN$8j zZnj|81j_l)MaU>oUR+t6R*W*Ioddc6E2%U+4Sd*UepxEm$*^S_p!5aGV-P{m)y3eQ zxlnFiYCQC;dWZn%n1-T4@U%X}R?vyL#Tnps9#{pq*Z>!Fpsp8a2^z9+DQE>lA(99v zLn3jZ%WJ?3#9##pxc>sJnL*d4f>Hx$0t0%0G$=)Y0v(|OHv9`x1U4Jgu7Pdt2Pp@g znG9)(gQY?BJ7@_Lbg@-Vc06QRM`kf7;1W|HioiG0LXRtixepQqxrLx^3up&6wAl(W zp%6z&lnY5YCHXKjV5TQ0=7Gm>;C#>`)c92JDXDNLB!ka8iZ6oZ^4vm1NQ0W*@t|`O zKt4p4K+bSj#N#1HPr|K5DoRRIi$Q1n=jN9{k_@tL@USP6b)b<$&{%L8xDW#Aga;1f z+8S`6gWXb^3T`&QY=lS`mF9tRFCrFm3qdEuC02qr=4F&aVjE#5Y*%y!sDlm9o*+#y z8Bo$fwFo8yy6r5p7*b>*>i`Xt!CeKu9SXAZ8r*M$L~06>FnD_)Og*Tp4E7zuTyQZ6 zE+BoYuWdNOLT2Klz7?PndJOj=ZU{R#R02V}d1yZ344?d8> zs#Hjrf?K{Y+dw%fsWb&dfm{ySSP4x}AR(lH0CC}4(;+&L%}6QAECXG8oS2R*3XZH2 z&<;%`LqXFJP&dQf2QnR0=R;gllAjG){{o2tkW_JDJjf_yqmf(+8Gr>H%?>)%Bfqo= zG=>Jz4AK=3Y9CaBj_}G&EY60R0hR#`48RVBfVvPY4lWO{Nq`&Rpta7(szH0E!2=~w zJE3V8w4)ZAFgW9a4sC~;0UD6Nk&~b$8#J_FPDd4mhasp5laUCTpf5=T_1__`!I=#~ zr65Y~1A7{D@+YX51hWh5SWt5fR7rr=5JF6agac^h7ldDsnwkw+&;_~`3q0`xGXb1t zA>$jUB@d`F1+AWg*9O`Mgro^eIgVVmBRpT42cDk;ZMTM| zd~ksZs!Q`h=aPc92cbxSn$e)v3cNCcs0R(Zg4!AwDGeeGFQlMB3wHoS8kFTh6B@9% zg@}UFKBzI0SX6>i)Ig*`xd7Cd0tYp!PN*hSLC~HuXfDO#0gx=JFsQyLgr=5wl+q7u zBYM>V9iT~q_K3{W-(9ax6K2m2tks0@)-K*~UsU}*s;7LXJ}yTgznOGttN zWgyT(ZS))iDjYzk?jr{($cKTn1-tZRhA$}frfR!i;>|nkc5;{1iDukl*=I2 zKx~K3FXd!IPuT!P0a8=A2z+;TR%Tincm)+m8KhAQD#5|-0ae}Lo0CB%g94-!zK$89 zIvLy%Ky;yt3c&;D=uSlu29Fa%!lbAWQ3yfVNbPx$2xeRsLA&_z`H(uls4zaSC>}g~ z2pxlln_ZAt3El?Ev|Cxhg4{kk)8&dVFqTWl}0=GC#kh1a!hacy1T02~8%s zvNPL0qhY9866sM+w%M6enP!WY!i71$Rz#)aA11tg>SqEpqbWq)$4;ov}PKT}u0%=W; zPf3L?NXW^Cb3ke#vY;*@gaw{m1*yq_Y*7SHy+hb2=7FcyK;Z}mmRH#%XXcQ2_1|1j(+PV&1vklT&l$w_aQXCK7pbffH7c{8{RSuH_ zuR=nRO9D^Rq=6d|;QfRJX`qecnRz8?;1OfcspKH1B$cFrO$VL(8J|=c4_ZW3kQNUP z15i!^vB7r+#)FQjj|c4`j!#Ji9gzTb0(4v(w5|?xHYaEWM`n5+ObT>@RellZym3hC zgBXSo1;rhvTF6E{h&XtVEGe-#Gr1UCv4cziizVlP4uncZQU$tO54?F8Nvt%nC_Nr5 z0cvqUB=U0$z}tuOQsP1T1LHxBUPuZ984i^N3l`)<=FFh_^2$<+K(}&(u0;R~!P<17 zRe(jMplLwp+W&$yP?HMW(M>Ii&&w}}2kotf=mC$gCYHl|13ldin-OU#khN=|fd%Mp zQ^=(j5i(&ZU4=mBeR(?;Oi5$b=?a&^>kWX_-mL z`4DuCU`l3gu9*qMlw#1~)&)iR>0mC%grv+o&{PlTmK#vn2`Xm`(!gdT%Yf(eGC}Ku zVUjtSd7v{MK>M)rKwSnDanNPb2pd33L4^_|>LI}kvKn+5Vmjyov6S4@T)1*j_ZQ|R zkSb6_fKn5v=~)C<1@Z%Y7y^8`EnKQJ57S`qrC#8C4{FvGq(L$_$Y`{30CHY3Ecl^Q zsUY>BD-hw)06WZ?N8)gYvz5mf?`ZozH`pX>v=SQRv*4l=kn7rOKld1W$0DVh{$ z?KfmyB2H;gnng$!q#?6G84iUH3SA_DqFm^@H}IBE@GfYW`wBpE;6Z%Q#oWn7sVR_* zmIHDjk|ZepvB`oofG5KsTLV#yg~)-n0-!h^xu^zNlbl!puC1YZp$CJ2aurw>G+>B` zmEv4bm7fAi3dO0((7X;;2kP*_DhiMwXd8WTNn&0JXh|YGKtQg68T~SO{u`50o1L+1 z{)9=J39F>=t#F3?$5$R#Z(rvVF4>A(mQ{204fVQnq1}Kq)2)5E{U} z7K8@yx#6JoIH0RX!7DuAa)qV&C5hn8N6@f>7Ac@)51x&K3m3*in!IV1@oAtl6Jee% zPJ*}(qyx3=ElvW>u%?2#>rhib=Yb`b#DhX6zW~}w0da~!%RGwm;&UMbn+Vky0-)rS zn^yu_l#i&`ij%;7A&_8ZKCD4eoEr}kFG(y(LsFTI)3Mp0J|$>50(wjrXM>x4Sp1ib zS#1@Aj-^d6N(8MXgLwne76lz0T~GoKc#uNS@OCC>;UB8XXeJ^xxhxknOpdApv;Y9Ba0y5s7K@8BN=s0(BS>9p3AmjfUzA)H54v^_ zEr=jWz$dc7Wh#qvpzU!`(gY0@K++66vQE_TX5%_Ev z3St`y742w z2vX>Q#>&8lE0iVXltQW&kPv9$2dEnfS*r+kBuF?d7gTYA?!$&ujvz5mV*suH022na z;~||akO*iB9E+JC;d0Own5E#Ikp*d>hB#>TRDN0-XuuxYECQJTT^bMFP7hU?4O{C8 z<%3opK*uvcdZ4C23q?d%8YBl=stxxWXbca<2_OMXhe3;KxHd@N1$rd{C^>@+1_vf| zq#EihaP0tFX#_ge6{Z$N0(7n_SRyqyIUU@)h9qam-L0vhIuvwZAy`R%3g{GT@OT}_ z4p4U`KB+V>B?ok+A!zOzE(*TH8sg#-XeXx35XOggCa8gg^%@suIB+&mhq4!Ban;?-DCyc7Kj*UgNlOJB!Y4Q*mz_?NbEv{q4)2k zWx|Joz(EdfbVF6-Lx*WWLkFPSmO%LeT`DghJOK|09*7CxquJ5T0Sh7=RRl5{ECvc< zBtzk1@x?i*sRfW#e+8iNKDZ9(SUpS-d;u+}2MAu=k1C34IHc}?teAvH57^BquwiGI zcF;0*?A}H-5|$XireG;M;Ntm^W+t2unzlj;G>}%vq9d3KU?TCLh8-e+U|9-m5U8-p z%`7fX1@+Fr*HEJFTCD0lTXp)DN!*GS*9S-ryNvLWIGV|i0 z7mk677`STikSVfa=;mqAkQBlMs37z(JtT41m>JkS(6CZ!e0~w=f*G`|RGtXB5)v`Q z3%Q0HF^mfJKZa)Tu|(h{g|OB$Xu(E)Q7Y;%FX&uS&`qw8^_F1w!Gyr`2#^{PCRCJ~ z9AA(QieeO%AiIh{t8EL?;t@(Ao&vA6DN2QmPs1c3>o_20fYLB*PP-s29u#1?NbMX5 zAD&+zTyV!F7uvBx5&~HX8f4D{AF}{9A0i9sqk(EsOhK%gN>G9hb^9&ImD%y2sTWYI z4Pqc@1wm(8$L7$8GD4OhFJ)y@##= zRBMAyV+EyOBsoN&B3ub8ijb7$Kqto_-iA3Gyn7o}2sXY7bsK2BIWYxttQ%-V7JN4o zs$52DPC;r>yrCHm;rP6K$Ql={^2SE^(KCvj>04xb)Y>XZEh=Du2w{xZ7J+V9NlgY98AZ9E7Ft&*UJ>XRiM*0Dh9t-qlhnlI3=kW%9RNgw7P&!&+o2L* z0hla!Ss6ITm!!pm+Loa4@erHF?d`36q&3`r0n*zO}ZzZA3}4k8DM6Yv&$$bKczHh!2w@Dh7C2Xq)I zi~}m{Qed3SeAvk&5Hquq;8IyhDPXf|SJ14*@3ySh#*5np|*0Y0`=N2&}l@^0WIiXn{%!M^tN{c~D6OuqnfIvs> zg5{tao}h<*gEW`qgQh);D?#B<4B0~qif=Ht5;R>}5D%N`1ug#qnF19CalvcVN{cH& zTHyCCfYv^O1)vQx2JkNWM92vnP!8zy3nXTIdRhU53reIAR(fIqXf;|vQEC}P0F)Ku zQH((rfuGs|+7p}&>TZK)6CqkbOaCA&P{9dZd;(Gk;zAM_mbXQ3Tnl24jOx zyn-spODqBHc`K@f@j(aX=0G{1W)4ITxM7o*5)WGH29*Slo`WI)nGdZ1A(|jPe+auQ z7gSKjXQos@l|!-&l75H)vH_s>cxqxEWI<1SL4GMjE2=Q4X9$(cNsdn}OD|>sU+kQc znp2V(4?eaS%umnBPf7$GbDEd}QGg^6Uy_-ejUt+tpHT%B01fNK7lXDvKuv~)WlnN@ zjzKYaki7sjiF%J9OynukPh&H^hn1I zAjBYNRU!CkV7nm3Ky+n*?&^b7O9*9|xzHo3!A^uI1g*CNt&~KG6^K+`eo<~>4rrNV zYH>z>4#e*eDbTIDCzSsyv zfn1XVS}9@znFGp9EdqN5EM^ADki^J<8PCmYHORMHf!v;`1`FDF>JAC@zWz zUGajcG$#i%`3JQcG%f{gjY0Q;LOofUmkin<4lOvrE5X2<3c>n7vtW< z15y>Am!F&j*8{!;qZq#Z9;~N03B2MDvUvuy#~30Cw*i!Aia;x(!Qzl!0C?yf+K!CR zD+2Y3!FT0?m4FI4(C9a`8wXygflUHbt$~OAut|b8{X(3LW*qopYX;D6QShNfkQq)8 z7uv-D71E$4Ne*b!7m|2ENh-Ku2p;u=h^HoJ7neeEeSUI2s2<6S2OTk#nFCsbke&*v z$w4Yp@QzSx_>pLEFQF( zx-2<Th*0i$a?pWiY|abkJ$|;D~~#%1_BmtBi-s!@2Rfi791ZCE%G9kV9ejSb#4$ z236spe3}R9a>nNu6=Z;R*d`X0fbMSrsRr%SgWOgEtx@vgi^~&116w5-pt?H`WGQ6f zdVFFUXfPe53v?)3F4*NskmI^h1;NKupbCMzDj!kCGKqXHex)^wU zJxp;yQGN+%wRCX~Xs#$3bW~XmWYZLA6+TE+KFD{O1@Wo*X$;AU1@VcwNtvm6pmX!f z5{ohuK{K%+YYISXJ0VMXpxsmOq&G+hY z*bfo}G2+uerzDhsEl$mal)Rud0-!!CNDZj3Sds`jv>dcn5UeaSF9S4TlMFh%0F+ih zx2b|Aia^t8u!&ueR>*P*)HN0eagZh8^$8H6l2q`yB@hdWp~r!Mq(B80s3}|omICwO z{svFVA^Zcm1qj?eC@zK+jbKfX{d`CsElx~JjfbYV0&p?~9pndEJPGqQc<2FaJlF&< z7dGDqaurMfT!?_@??9s9k$2EZZn=r+naN2IB2oOX`K`Cf|A6ORLa0OWcX?TP8 zFn}e%7ko1$r^Y9O2H}&EwVWFfe!wBq=r#JrU9%#@N0 z&?zq|43In9K#L5Lv*Qa=b4p+$pdEtXo_i`>Q6|_KpnMEdlvxZeNnl*?elN(35V%tY z7Y8-yKzG1FZOhHfi-%@z(CG|?;CO?uic0hHz>$ok9JDtLv?B!WkkXRO9O%t1U@MAK z<57gbE3*wD$r%)}i1>rbfKFsBh7{BckhR)|;GPU<^bWjM111Pcw5SR}c?Gl{1k`i_ z)sayB=)%z1IEXo*Bmx>?N`)&ma5>D=`!y z@Phq}%+w;#rBjvgJ_l4oeqISuLV(OO!c8xRM{II2xH1Bza)h&>VxSH&vW=iM3u#69 zRjGOL$$9V)f=*O|j|&6kb%^~iQP4?zFl#}LB=CI|Fo9IiL71S4YVeT)(BOq^gM-)u zS6G&sR|36U3Z@KnU=0!*9DLxe9K-=>iDmgk@hO#gx%nw@--4i}H`0^Usqa|2jeQ9Nvg19Bb)*D#Rq0<}88@c}anBmf?30r?+UFbA|? z7iu`Dlm{6I4`EPW8e(8(3iQemm|l z%)ETKL7T-UqEb>N+LcRa;jcDau8<2&(?!!gZLACU^zSy=A_RTOL1#>&Br0fh!_-2#pkg_`xF{K$Feo0;#X-HWQcx2J60k5+AjcP>D~7IX zk54Iv7Y;BDWvL}7!r;}yQ2&Cj{z0}pKQBHdEeB?LK_aAS191U(=>b$Dh#j9-j8^i1 z*W@7=Tad~cv~3-3WKn)HXd6Fdt^{TpSP(Qhi>eGd*aWp6tOzBbA;yD+K-=0fi!)I5 zLu3$jDmGbkI|?B8OQO~0C>Kv6rGtXvOt_)NndlV|xSa@bJ+z|-Q;b$HL0c4XS@5!F zXyAZKAyDeejn7VlD*%snf{t;4DFO?ChMiEApw!ewU`1ddw1|VqfU-KOcJNJX$r+hB zDMg614^a$hE5b7`iXh|=BdF6L>nl*}#NyOKP|*e*iH3v_Obj_0z{S8j1Yrh3HG_J? zFz13ap|t=ZtwK;jg)4%t)kWe%rtM({L)PWOrBPc9#l@K^=n-68ngniKKvN59i37@4 zpol|CE+8RLp8xw;OvnDItUXY1j!kY8S&)OqT-Wam@1+>UE85{&f zpxq20S

LkQrUjMiD404>HjR=}>_}J~cTTbdo6~K0vcu;Kig22<5O!D>uIk)La11 zSRre~Dj%O;1RB5tohE@W33^W*C}*Ztl)$V2FDOhb0?p!p+we*G>5#cc(EetqBGAM< zc>OZWV#q8kOcr!Zhy|1bnS6qreFYZ+ZMQ_>fS1m|M3Un3%RnRlVC$11JaBRYwQnGT z@a{CElL`?8?GA=^oKs+CA;dtZ4nX`4Sp))Fl?LS(l!AuF5p&~i)pcx9#p^gPlcJ4QUqDS08s|J5(+jB0JRW& z(E?ZMDP$Sqx z6u&??;FJK>4_Y?`9$AF)3t&sn;QaJd(AtN5=(ThZzk#nu2QBX`Pb`83U_ok8Wr(t41pR|lnOd;FCKi5b$m(=Od*Oecxec#deGc;X#sRf7-CaV zello-6gaEFLL5A~0Fj2w%)o8~ftUu$R-o-um=Ro*3Yy4IE+_?$a)V8P2!YOcfmVp1 zgn*K7ixYEG(C$m{732_$!E2Ae)gWZcKU5Sv^9<^`fC|WX$bF6| zQlQO*iJ-Y?u#3PGUZ~lp7&KQ=2@OS1;sn)fpyg?x`4fny%Hrgb98jf_mJ*+r59;{9 zl!LdwH0Ir~<61I#1Y)5HcN@@{ku{c>aO5nxG43Q{oeg!PPM+9>9q>9yPT=i!-PjKoc{_ zB^G$EA=Cq4eW24IL2Jc8JuT2cc~TCj!H`~506J>{+$@iW4$J04E`MZz2ur9A2c=wT0;zxh3cvM+ROjsd*$5i|}B>I)~PfExgi25M0$_~aO@3c$LN zBDoLrYO&d3FS0KCQT%47C;JDNG~Ei&JyKqp8^98zG59BY3C)r%s40 zhE_Z&3@(LR6DTAw!wIetB#l=yj*vn&0IUSl5KzLwVlzk>LovAQ1E(iU9SAw>+KQl& zhC?Sz8dEcTjV+{zh6FzjM<7XJ7=$DT3QkOSpeaB%0KB*+F&@;H0dJB6ZTHHHPXg6( zNg1FzH?f!jA_ksA0oCMC0Z4Zpbcr8$qB;el3|$noy9iRp=cFd)L1aM{3Z#>R5JNgr zH4ViABnj}U5M*nRmZs-3*ysrN>f1x(IN!EOGh(7Q*0ndl@@>< z4mv^tv}QLIt`6D2RIJpu`8MAmC!)&J5%iKW z7Qh?cpuM!9<(Xi$MIaWuNePoG2HiCT(gzw+N=X47#|qbt5rB01kTrpJ1)wM?N-fLJ2DSK*RUy{< zqo{?i`bQCkul+|6g=7i%b_a+Y=pZfd$+n;Y7-*n_!wK#HC=YUo97IzJsD}wkMqRt zxzNQr;9$uEZQp^)fcE`^#|u!Ll$W0eDlx&i6s{07oSIq;S}O+HvWM(U@RH8T_~Oj; zyu=)+dL(Cqm=NPZbM2sGRUu9Wi-Y^GCEy_iB%PpLHf5l-O^M*kd$7rX2Fb9ArzeB^ z2VkF~*pLbGHzZpYLA(sJyC^j+wJ0?&8ATFwv^D6|0H|9*XT3tRW>Gw7Obc}2RwnpZ zKF~-hq%1?ofMyv$Wivb}6yz6YR)BgO;0#<0UX%xOKD5CG>fwO8oS;)8U{WQipnMGF zfv*+^Cq=jbs6(F$3VFyn04B0mW8N>%ITZHZig!r#GGaWMO z1XfxCN|VqYo2_7GS+5sADiqFqWPK{3k4O>AvtzcaU8SrQg zSgbO?G%p>R4hu>^Lv%Tr1&{-7L9qwAejo?5Iioxtw4M}{1))OF`4om^&>caLp?;7G z2p_Z)7}O&MpK*;4N=XHs0GgSX8V{C;hwh{W8v)V+J?RliLuN539f2E|n4+b5&>3cg z6l_)pA0~bs<2tuoohjoO)Z4R23Q@s2O$xKRSJ}wu}WZx7q}3@N63*4Wyiynf!zm* zJR~MUGeinelY`GF0;`0@2$+*m4n1`tJ{dHso|7G4kPBL64k~UykqTCXBm|xt2dRP_ zJpqx1u%WZ8C_aP)pkiD zNF*;6bQEl6K9mg}=La3H2X3{+=Yfiu{Jd0Nl|8U387k%}tDl+^+_^RuQ`L1Y#0Ha&AfvsFDD!qygK_kepi(pIQ+Q-G2P3F zT88BOoSejh;#4pLw2J_G)eJbPf_517r`ZJqfiIWLOcj=aZkC3pu$RG=2>YIFJ~$aRfdu z6;u#`myAPspxyHfAoZCgkUbhO4(K>%I6E^JvWo?x3ADNdER~-Jj{~BL9dHnX3Im8B*sIX;9HtW@23{eLtO(q` z$j34oywoDlg}5bfK}gXK3e{53 zKIf!-(Ee1YiJ-|YxIz#o9?pv@Vebemg{SQ4LDlnctkpeY=Pni5cb8V{Yy1?3j7GEi+?oSB|hl$Z+_ z%Sg9*Y* zncM=fF%Uku4+&FJ23k`Ixv?9R0Kv*2yJ27|z-PIEdNYtzlamTgYv41QKsvyq1fZ%b zKeqtPMx;W}$?>UaX{q2_RX{CT(ApU2nenN4sYU6KG!9Y*?v$luf-ZptdlV#=nGd`0 z6qI5hwu8irA)D`@27#8&K~5}#?6%GXO(22~5QZBBE;+#~Wk802j~)ll;l(GGF(l_B z@hdloe~Jj>!2MDDPRH6wFvQ`|!XvV-)m87GqDuLfgfzVk3s=+hUKxG-!^pf=WG9!?J;>?uPqIg)71F;|`Kd(4H zCpA75bYnTVsx3+d9mWCH0+N8N*96Z@LX|>9^7G=ss~+GAGmGO(!F@Qm2&mZrE_YEy zAmuAUEFZKx9cnhX2@D>40gW%fIt!q6CE!_q6iwjC9MCROc!M2k2&hX1x@`rtKfwo63|^#@t}bZOwj`Hl?0%< zOVH+KB=ser8&W~-D9}h1c=8dngsvpDs0>K}WG2{c;K^1{$&#N8y0;if3{>2MM#e$H zpyRlZq#(r$$mONUB_Mh5L@ua53|3SMS`w0!1?rkWBOW9II?EIkPoUm1sLc=FJ(>^B zqw&eP1t6WEdIH?)17&c~6gon%08~mq6oVX91nK}lHA8v;P!41;8Eyz9Z-dQ+%79Mt z0N+*)HyhqKgcuJ}09s=KF%Yz|0lg8KR|48O3~ri3_ZsIzgdk0Bq`^ZJam?Wvm^9=h zDX@b;CWAsAoFTxYI+(^4l%y7bYG}9ym;g8{LROVRjRwnrsy)zIzQx6eYytKHNCGlY z1XT`d(WQaU4L}ko&BGxCN|cbT!%)@bMbIG$=-4U5U-6)|IH?sSsd>CUmF` z>?&|s3RVv3y}{0NfU1WK%0oHD*-4-cZs3KxFd^`H&7d|7$TkM>^2o#_ke>=F!Cp@T zpWFxUsz6jgSA>IG#08+0MBpY?W|x@@N;AGB8!)OsqY zg!G+2E&+9kAnMXmpj}C*gVIvK3$CD&nK__Q!u*0t$nsXm&?$Jm2W(gxAy<+QxnT+H zL9i2(3evz!cEM^umn=X8K&Spe8tou+LE@lMaHWw{nucUp zQEEE)$|G3Ff!qmdzM=XVDuU^0q&NWS1aZ*=5H1#<47&6V60$Jsia~2Lz>7b@jw}W* z-h#vsNFUUpP+^p0fS6PP=>!eBKxiy!E3+UOY9FYVo>&Ar7yx22X!HTPcp9V|&W#6k zj-g7Dk>+o}iju*J5nVJFsywd*Jm>>f3En0PUzvyyDu$KK1(l#BlPH~hh%t~IeIOkm z7I?uR)C-^!c3~L`JnaK*92Zo^=jDUOm%(#8;PsIp?fLn+@!(cud}2x##B9(_gOJ7B zU%A8ZV$&js2MfN&Q~1UwZ0Q3GBt3N@=F6?_vXXzUs+iCCcz<|5YTgSbVh z>7d#IobM6I4=Re1`ie^Oav+!EfC^q{)D)*CgSrV2n~O8kL2Y$72N6x6fs(wmd`QTF ztT6_)Yzx3MZy;3&iTK1kP>TRbsw5wDtP1E{`5bgzDDH!Ff1s9wQyci6u+$u6A(*ov z%_B5lgNBB{djUWJ1Lc709q_uK>Rh@ufB0BIM2 zOo0@*NX24FKGdnGC0t29_{4a4xrE@Olu9U}0OiCZk}OOFls=(uEdq^ff;rpry7Tg`g{L!6R6p{pR2iwW3s*n?bEG22igpzBn@}Co?a-75GGLC1lM|{d7xo3&{5%F>3Gmmb+9hb@!08*$`q6i(9{*9 zD+G@WqAAaf2cHL%ngSjM1rO>%j0TZ#LrXG17rP~b8XzD`@{_VaH(!DV`C&?mipxNq zN{}pcb`w;v!DNfe3qU0n=uixhCaC{#aElp|3*td*=|R~NnQdkQ;(p(7{>AxeC7@MUU=>N_;AQJb8$Uo}Y2{!!=u81f4%Fj`FHQsvJ0PT>0`cIj zXHa3t*m(iyh<$MCFDL~ax&t|A3c`l8(ZL}P5~u`^UKEtZgU(O}k3>KQuL?>*?c(^< zoV56ia?pJ$Apd}x({K?Zu$7=u@5J0vI6I>}J~0i-18v1kO@xfw6_mzjR2IY+rGgrb z5P2{c+`Iv8asize57`us%!^MhDarvW2OWY@oDVuaEd|U6vGS5D;|ud42NHtT$b&A0 z1i2GM4s^H!h7RziAq-LI-ZflCLB)}y71<`pvSrZBW+~hu-~-+YO5?#>K0whAKK2MK zke->Gm;+h|1a?MlChRCk@NwQ?G0-G`aeNA>>k8(BhC~ZWXj?KwupqY-a#&U+%ruY)czg~b zkY5Zce^MbFNF51g7p3MTLUI6fq91XpbC5)!`>K#c(lU!6VFuBXo>~H#Jpq*~ zrQqTHBFJ6EkdzKlRg6s)xJU;dCRR`yUz(hgm|GB^13gJ4z7$*>m4Xj#0ox8rDWF{l zD4clkHKYh3&@LK~VW7ibzyotI4rpW_#zsoXiOI<&ppG1 z>*hmcpcCxaYyg>B3fjCD5AGJm!?wLZb%Kgc&|rRXDJ1Se%0Y)!WrB8tTV67z~7x5I-oD&!D8s0#27YS08L+CqYc@S#o6E-gOs$O#=#|EH4eHs^j-sadlMSEB^jB;pv715pt)s8 zLW74FgbUA6&_+jUJhb8f?@Ix#F#`3cb8^7>8C3Uz=Eflj6~TinJ^+~v76YXZP}P+J zPJ1ZAu-z8Wb0gD1Tb%Opi(q9csKSA(2b%?}!NHuo{F3;@vc$|B$ix-Y5Kv7E4mY^Y zqSQ1>TT+yn1m5Qj)dd~|gewH|KoNrw$p?*PLKTBH0)p!) zuqEIffpCS;J^WCWU>?X$xIB2oxHvT#k_*8GfQI+s@*ob1hCI;Taj0?mMR0WmnV=KY zQ$ghqsKN(zVxWpZl@$042m~KIO#tJTCP5oQV9UWJ4`SRBStDEu-9)eivdVJM1};Q6 zL%1+s6clBGj^O~8hcGs1nRXs{Jg%S=BnEX+F?4$+XjdC#XL3PlaeM~opcQDl5XuAJ zOAD$_N z!IfZf0oWYq90PdgC8*;BI$0f5Ql^$bdC-G^APPV^JP~|m7uYGFt1uJuU<#p=C6O0oQHCaFN`Cl1juXd58|sOekDM zMrnF#Ja~UGL=t*f63l?yRL~^}C7@HZU_zj79%zKP5?KJ$U55>qK@7?(E-1>cfGaA< z%!71XAhHFS1@OgL5D`$or^1Yct>J=5m4ToH@*n6vmxizft;L|4w~an1tk}d9H>Q}3c8yYHZN9Gk_-(Fx^#>mWyg+Nm_0^Y)&89U`VS3t`-`cC?SX>2Aa_W?+1n&fso2f z&w~_NXfl`~57Ps>=Li-)FfsVam}sWJkHXWjwA*Oro^0d z(Dou!55Xib`~#DKG`>($0!RwUm!M_xkOo&V=u9*4s0l-IF=SUToB_FM1SAZr*FeQ8 zbfOA81PVGSiUD-0Af#0TF4jOt!-6w7SOUC+u?Up$!N(^SgASH10n31zin-uH+hR}! z3p$4aH01!J%;$nnG_@xY>5Cm6bputy|DCn>xNS6^s5BSg}6cJE3fSrIa0wjb( zKgjK9s-XvxfebCG1fLQJXTnEmii_jRGNHpH#U-E)I&@7i=yYuGj%_dlylMtzP7X9% z%>bIs0=3z|cLgHG>>=XdbPU>bkIV(1>XyfudCKsVOE9>xwhLi)TO*a63zq3rbT!o7=#r41=VgB6;};=afQc z!An4md2k;Ee3&IeGLiszpsECX>@BSG1mnS^iVBfrU>wleqGHe?1tlO>JY=*R!3GIJ zrJ?hfaI2B|u)Y~+MMhCxY7X2Sn4${A+P9MUywu_n@F;3Yd|oc-U^(!}E0hCuEl2`M z9cZ&&IcNbZR3EqohzDH}2wG|jUFKE-T7r}ay6OjXnPw3K=zwC-nac12wxl>7#D^EG zB^98W8L}m)qyln=O?+k^Lo%EL9!e{z0QdaB7t4Uo$%OGCc@C@^+=7GfVGWTI@T$7v z_*~FAhcHgDVL@gpNC#-eU2%M|VL?6;w>h|OE(Vn(p!Nk!0vxgo$)!c{ z$p!Jrpd%e2O!)C0rA45CfVIm@iy(0iZKjtNflgJ7PfpJ(j>jy%VX`@(>#K4=^DyA7 z3hIf0Yy@jfM_#uH)sR^npABk>g64-(;3`3)pvCJbBE^|`>7YA(GC;i>Q2B^30#r4C z#~Q(rUJ7bIK_x*qxj@eCfC_-FkAgTKZX0BV1QNw?LD+&%XfFz?8{AZcvOx(0uDle| zT7XJ{+yj>?F9cT>AV*augVs^x6*HuOi>efG-y|8t1Kr6J4?0dC&H)|RmR|(tf}3Pe z4WK15i8(o`IdECXwTvKcUUDjE_ZUM;Jm}yQ&}uly7RMCu7!G8pnE`bA1!y@YoBhKAbC(j0q#Q3 zhN^tf5M&w1k(r=IKsrQGab+%eff}gMlb>B$zyM=F#>rE__b`BJHV6x}3?0JCgv{T7 z)EAY;7iWMjmWc;78yHgJ!Cee+t0)C>6FlUI8W0EU0C2?&szyO2CTK1YoV!4W+k!YH zpb!I(=T(9{gcQ&SLC~(s640T%De*6XAKVccCK1P=!UQ@z@LibvsKSN=?+UH} zbVeRBCq6kpF(!6|kV}pI8A~x0#Sd5|b!NP+C)icd@~EX^!Rh4hR-S9XKe_Q7Q#owB6N61WIt;wJ^phlC~6u=Jw* za<~kL6Q2j(I|j21+*E;app9s_dPre{#)TOG9{Y+1IVUf^02Dx|0;LQo5CQN(P@w&N z$O7OYd#D0%#zZy(6eyrxX9{RlV?K0~Q%VYG7#@6fAZS;8etcqjDyXysUtd(rfGiE2 z3kQiowi1DQ#o&4G6mS&=uKq!?pus0l(*Rr_f>(g1fGeleq7q~+kgN$40ow(hqX(S| z2`b%FAWlSe4QTOtVi9Qi1?)nQb>J3J3Wx=DAw(aB07OY4Xom>s#4M0}Nj}KYpk_h= z$i`II;-i#Q@TsAoj0+k}ge>r6KoSLwzNV(c7nc^K79op+&gnzpV<;$3EQl}8$p!D$u6CgziBJm;u~x=%?>gg6{JGlnn%v~v;`o(zzUln7r#1yU=L zQwzY0Q6Swjh%zKmP_GJIFekMP)HqB9Spdm#U?%9UD9ClE;1OGJu>dNW!IF9TkaH4I zMM1qY&^aC8vp7I4N{F*SckY76XCN&nkO2rGP|8481`>-e1)pAsE(N;63x`yxu@PJ~ zXs8ET;6bee`3$<|8mzdYEEh{^n^!{V=}=r+LfRq z`$|9?9wCZgqTp_EDnu+7stug2lH)#*}bz@|WKgD^q+wox4pZj(aK=>@wKtPmm!P6SB4f{2287f6EOc>%EZA-&#|)Z|3a z-KmKwAd?a+;|r1tz-tddT+p#Epe}hzD)<1&;?!c$o&pn?6qIiU<3lQIh}yC|& zVF=K5O^|j#VhN}O1f69JyUhvQUt&;?&e^1{fFI;s-}Hc+EK| zsg{7Qj*Cx8FG|csC@ac`2p5+Wr6P%g4s`{O$AStDkm}ST(EJ9deO>|&q@4I9(8)Y` zB}J7Cpu!Sd4uYr0p>5|>P-{9bC9@dhF3=XDbntx=xu8J;=mohTeV{l8mGwE`p_C%X z#cJRqe8B5dK*elbkGZ^XhX8Dya2q4AJtH(Ad-oo>j*&yRDjI_aX{C>fXW_-QQ-DV8fY0I zcz6w_suXhJaY`y=L?AT>bl+AyR1{KY!S$DcLJib304E8sLU4lyoCZL{;Sf_GqqCq; zhn$uZp9C7<1DTRq0!>4p5QIp=gh4qN#0D=$Dgd3422O|I%>yZ^pcCthVC<4a$T&(o z=rmjg(EKuZXb93&PR-2+S(2ZVnGZIA0a6zjLH6N5dEm`q5D9Q{h6#h3XrP^%Fh1xW zMR;EwT&I9f?Ewt|fNB&_)36Lw5`uCOWNSUtP*8^iW(bHKUzAu5<3qM1AUgrlKZZ5v zA@+d8ic3IxDj_#CfR>hl)+D5)7UY-2r=^0H-$6Dnr+~VZpmWx8K;yufC7=uqX_%zu zm1LHHPO5<^0Sh4HL2ENW_X9J)!aCT*0az;^pUVdpY=o|ykF<3Au6k9+XP_G75%s>nUixh!E2g=Vc z098~)g$$s{oOtlPaNtE4ki(Btq2l2F7g!vk4$Lot_s3F;lVMG{%p8acQ0D-_0u6>i zcX<`V%q&U;^)A3x!W0J<5IAmczC$ehF^aC58}Jp2bbsTHEI6mm{8s$;=YMVU#d zu=A)v9zx=SMh-#YP@Ie`2u=r}gjifslwTR24%(2PpO*(Zs~Z#(5K(Z=2{Iq72HZx6 zoI?ab85|tQ5S^gSnI$Ea@sJ5Z2FTs)@!$zIuwkH+v!H^Iv<6yc z84r$_63|_7P(h@G2NupuLuwv?MZhCYATNP=;L~0}=aoRs1{W^SlgMC>D98jA@L=VT z?W<6=pu_@G17f4O2qXlz2V9cD6ob4Du7%4WYg54Eg{ftrD2Oje1gCK@rwDXK7z5}i zN6>AV@dd@8mQopL^-K|D^c*e)8kXoLUARGfb)kw_8!fQi{qzV={1!5X;R#4MT_~$m9UXbs&o}(;#EPP!n?# zlR*gu+QWcoD9ETRjt4D}fV3LX1>xxdWE@x-aS5slQIr(NXXfYTmO=~w?dJuV zoSBxKpO*#}%S?m2KQpa36EsGXS{4ssB05uLkcIB?ps`_yw!Cyu7(teKV~W7X@IYqe zCqvT+*d_7#1&~Mw-4mLd7@wS<0XmQnR4bIlXM>w6;H|ZJp!yC?1auY?X!;Z62ZU14 z$*x7Ii7*LJAq93(PJVs?sP~Hqog8pHfFc;80K$dV7GQKna zWOxvOgup$)Oz8CxAXnvrlMh4-=sH7)YtTSC3KENoQ$efFQ=n-9SpeSg09yhcrH5p2a1R3%THv7Z6r$5L@gVbcwsTR`Xl zS_ElG!wms7o`@1&MJUz zkU^0Jot_PyNdP$uRBeOTPJ)Jzp~JZl^+lO^CE4KPHX!^`NGb3G<_3Q&B43ui<+ zMQ}ms0j#$ObOAJ|hZ_$YCn|#`Q>ZjV52T?6k^+wp7ssc7PVz$B%>=RxJoSK-b3v^g z6 zz-`3%-0Zx3Z~#IzKtw?uqfGGF2*_q|#)0P`cv3>Ovrhq*GWrEvd zU>z_4$dTaCNn8{e@J2$o2xxIMs8EB%7f3gB;Vo!b6XXXZA?OGsnkZ-!Dk$o~T|1Z@ zc-9nr>NU6tl9E~mOQ|69KtT)2a-b$9Ob18|d@oLMMkY9rKngSSGC>DsKn9$^7ldbm zhU7{>%LG8Zzx+IycF5E<`1}D#VF%I5sOJJ>=j5lum`J_=se*Dra}EdeMf8E~3Q+z5anSh? z{owu7pq&$-b1k8#$bt&9c+liVa%y~Pej3OW(5M7x^dK{@490~jNCaP01zxQK9{DXQ z%>#Efz@rnHpu!k5j2sW%2M0Rb45G3)H9Z%+7Y3CJ3a)Yn=#E;@f`R13q7*nk6Ex}t zDT6?(ZDD({Vah>+bKoW-cDxgp-&ITQ{jK&A|T;jp=X5|GrrRm`H z^cj#Hybx0$HFPFu#sYjvCAdt1ng>d<5Y33aX`q=S@C}R*?Vy~FFdiZXO~WW06n7Pa zHlpR{m4VGJ2CYm1k8gk+0Xhs1bksGnGZ4iwI0J(&901+C06nJ++!%#A80?a~e2C3p z4zjO{!HucR;sVe)(V!JWAa$T!k@-cS<@E8n1v$m>ImM|+!llKj#qpps>{2qzK-1Ql zWo9Peedj4K7N}{$kdj#zUkn;V;Qgs0?^XH;)2xV%tWv< z=%6fUJ1zLO!4$Z<0>~{3AhST5@p21tGLu1reL0ZzLeSePQ$W*$pw&u{Rih~&Z$a&r1eeXqOpaBZd z4tNj?G9a4@vIsod4qmJbD!Jeaz!z=9b%M?f1RrUR5P=T$!Zkp;5J)CM1RyK#L5d+# zB`CoO8axJxgJ@_hB&LCu0f90qWC{henY0+R4-|5nEp%c96a%S=MLC(Et@W@qB5;!+ zu?jX6WOET%0(8nxQfgX0XdPcJc=i@NXIqd8y0s=BI@*^DDi<>ILDfQjGQ6S7kOC72 zmHUaM6=FpoMED{HeGH! zVu^oBE^JvF$f?lN7~`QEstStoL1jEd2HXq=HHN@k@a%MMd}=OudkwglhzH%10~$Gi z&Q#}u7EI+9N&<(mN5NUA90y<^~%FoP$45z^g zMTjcU%p|HvZVKcmeyBFca0++{7uW%yW2$nXE44~fK~4e<1cFCMK|4snL)E$QpeRgE zE&)k{?*4-hmVsqJYb`*98@Sd0i-3lrLD$-(fO(Lj3T#_uKDfk6Eh++ymO*79hdF@F zE-o%jjZe?XPfE;zl)NC(Y|!p)@Iobs1Cas-%7mZQo{|f0uY)RF$OsBZKPWkYSGj@b zgTW&Vx$(J$kmY+AS3adcP9;Yq6Z8}fZqVg|7p|a&HmFX4bot>S4he1C2?!z&spIoO zZiUxDpex@XvY<5!pw%zA;GoM*0Ud&sk_&EPlzBjx7iIG9PpxNls!qSYu{B z_zV(gGB3%@2bH0D`9-;)N-Q@XBminJfU*KeJ#^y*hzYLXLCakr=LmtCg5X#Ii-Ybc z0;dEp57hPnm8}e*u@}$<@{k2%Xk1WZ5M+BwWnN-#W-?qhDK$Ma4^%zFC+k7CDU_zg zqf0;rXTT0m1eMtE9xPNn)L>B09<*^E<`~fV#Gtb=AT1iWwWz`vW!iQ}91+V@=H5A%!hWZOMRf860us$+W z1!yt^66T;lhC3Qn7&-t2YB0dGfg6TM97q!$yruvu3Mob)&PC*U2p^PiK$Qw;jJF7G zDY&DS2Dw=r76p)u3mTOJAJGBr0zj>RNJ7qqLe)@`npl*QU!I3ByRsO(G7&Y1LFa%M zKw}-n|L78!AyArEkclw93^_bN983*mU^C$kf^bolf%nRTdiS}B;Gr2%{sG4^SQoVa z1&SKbd_1~XF(}(6!X}Bqmo*osgR2GbYCDjTnMI(A16c|*z>*9}l2GFzvXI?hY5Abt zYo*9Gp-W>L0QM%hi;AodA_{e58t5J~aElwXOb;~G2UZFd2JOxQb-zHP1R%P&q%;Xx z9yHbgX>ehPCMSUx;$ez|k6{Lt-QeY7(AqgM9%>`lM93gBhF0h-8)RJ#qy>Pg4}7W% zhBnB+V=k&v(4uAxmB@Jm**%~wn~V$d}xsa=7G*r z168nTsYOUx6iGBK1zjA}tU>4nSqz?L%uNJMlYYGv=tS)0uy|<6G$*KFB5E1QED-0AxI{u6$aG+KDPkeOhQrtI*}W^>=kALSQWT{ zL#?PF27;7>QWGvY(5~LZq7q!vpt1;y9B2Rtw6GGiP#WeAuo%2h0^1Ji^dOuL@8m+g zS6ZByo*G|Nj!*$g=ioKdpsnbjBo3*`P-{qJF{GLeDh!Sqlo}O70!b4nL1k1zVhvLJ zp(Ox_AW9N|34v__yB#V5sgL2wAgMGhtvEgfQWk(n__@gpU_sDKd|7THsERFONXd_n z2Q9!!0qti5ukVj9N(HY&&j+`g3ravrz@2SSbqgL&PE7$HB?1})$_JSO=`Dg+8$$Tt z^@3o1dHH#jxu7+rAn$=iz@d^0O7ft=i$u_LJxDw$F(n>!YZ-){1KNQBA2BHg3l?RA zyBuH+WaD! zl98BDKf^^pX)Zq=q^>kCB{dB!4jr(`1(iMd@sOZ^HF)5B&}uIj2OdrkwXjeF57K}- zE})aTQOU`Bi*_%ch7>a^sH-24=%qU4PH z@;n$j58@_J-v_+l8$3D-){>c102YCAKxI)f>8T|J>7b>wU}^9T0bqULi@PBs2Kmr~ zvEw}hJVA09<>0v#5EHc51x$mMpMlx}U{7K$Ajt=)bP8#Df%u>;$?@Qmyi!2i zlGLK2(gM(V8jw>zK!RX5f#V$P*31Gk$h~6Vg@O6;U_Pjw3g?5`2*vry+4+z{1$1|9 zY6*$}ngJ!?K_9sOGBXSl%FIAYkj(%^AgE+1gG`W>fdU{azqBYX5wwS<1R{zQ#Mz~J z<(Z%%%6xFU3fy4^7jGbqpn3#0djpaOEp1OtOhGmqwjL3rJU20=EE6=Eo)0-Wpg1QH zk_mDX3yR?h5_FzhBKS_al>GSI)ZF57kaIvM)q>5)%mbaF4rXSjWEMdZJ9rfklnHVa zSQ^}|%tyE{7nCHyg*k`;Rsz4T1w0*+AD;`ZGC)#!iFx_pr4e9GYB|Cf&=f1U1dmTk z21{nbuT4wI2i?_?gcuisOz(qL|QMEJy{H=%9KDERdg*1Mwzw8VEGl0UD^xk1v4K zAz)QS`N{Dq`I&hoWuV1pAUPxf(4-VNKY+$e;mYE3GxKs2D{x5`$3yR~MORP&IzAAj z5!}2@&Ie8J!YwStZ~{~W-4vKGc1OTu!HERwYM59#+{2*k4q6Za6#&-<8KA?9Q}W{r zpeM$Hn4k+WK#S(`(m^Ug*VrdQ%NEem&~%it2qaRBDN+DF?gX^mARn}i2z)PCJoJ(< zkfC60AVsh?Cqx-Il^|MJNr^>8nULlaNCUboXy6iN7@8co0S-13qcAK=EXODfK_LT8 z!{A#Cz@~y0x`G!7K*wS7!9@n5#RAp@t|j2gi&G2H+J+!SpfHEz6%Y@cvOt6Ad1;yH zrA4Wrjj<2|lFM>)L4!LWi(uUz5IYTYacog)3FuZdcv}wCmj+$%kOEQxYP}|wfHMO8 zgaVLwA-I?ZjSYcD4)WuRa>1ttp#$Gv7kO9=(tj_u_e$uL7<%6M9}5N5Hm{RONx_0dsx6FSaE6zD3GC2WoZb9l)xJU z#h`;}QxMSyo#=zCLC6Pf<^r|eK`Rd-9N0CRAj>mB2g!p?&rAn35K>@GIgoC6I|5X_ zqSd@$A=LZ2ib(9q4<)r38N1*fLL0crjia|#sfa(D-2Xf*NBnN;>^LWf|4QPR08gerbBmk>$ zU~Fg#2XSG=J%|m85OB*1%t2~O7FQO-6GCM%cv(_@d`Tkc1k_~Ex`9fN>%bG%pvi1F z2Q&x=<|Km$PC!uzZHa*nJVT94kljV_{T}&{ni`aeKoVd>GILXl(m=h&61Wg(wH8>e zC=s;$2Xti#xR3<55y4lbLDt!TPwLLbtrB#*H7LI%L+&Sm_eUYRA*O-KO$ZC28Z_4r zI;AQf)D*|!0)$HN{u=xafR6#;G!1ltU>;~&H)KW$w{e*Tnej!5(1sy)Pvqvtm*s-) zG6o-01>fe1%WlxJN6;GPlGI$#qFZpb!EP{2C1?>kZWlsIL+H7~;Pn|$wRy#9kQ@O% z`acJ}a0F4*loTa`POMAJ0S&K#Tn=q@ASZaxm4hYdT_(_m+PrK?&M5_@A8W3_&6+BMn&R*!WcBt2VN+X54w;E z+RrIX%1MQExRMgVqdg2M`3SL$Bp9~B>klDnl2XA(gTcoKplU$Jg=Lh3=BX2Np{7AqLeDWm(G4y*L3=NdbVK@MNCG8A znd#}EVgn|YS)2@62?;j~G^qo=Fd8mWlnU$efpkF@%fV*2Ks8q?L?vWgDjs&443Z4^ zWHHF;8?e{+FoRl6i^|ISGJ_!1@vTFe3qZKxPZ;DQE_V4eac2T&^wVgi^4 zp40$Y4C*?87Ri7_p^;orRGJ4`EDS#F4WtIt@GeWm7P6pqxzKU|)tSf=$WARP%>xzc zp!Py(K|ClSW+di8+=U?p+D8Ja2*6H2*H;8C1Tm%3pb-gbUMHnOb3M3Cha{1PA(0Cj z$Vh`O@CI!SfzJCwmTE&ntF#0(J`S2wU`QzhodyIt5)3j_PzdQYK^xfM4iQ62A$b0? zFuf=-i6Nyh2UZ#vg0@V8=2QxEKqC^VB@8KrU<*JbsJdiGDFh|n;&|{jF(?~!)-HHZ z7qKuN)J+AodBJByLO9@~%JNe{E0W;?#RZ9=X($LEG)c|?H3!6otUAUN0i6~ET4#+_ zCM^+k@B+d>&>$h`bWbD^3`?QsR^{b`>kAZP!D_+x8p4fD&PmM7MR6NM1f~?(5a^lx z5Kn;)`GGj67-|Pt1gsAxfaI@~BG4*%u)9H>HSjIc#88!hbyEvm(Gl01S|AP>A75`1v{vDMh)^TU)_1Scz$AsmY+jqM#L3K4>lkhmwMv#5_>m zLzPa=1D#k^6rWTCIyw~O6SxHsAU>;z>eXmElP zC$h~TIfRF>OM}fW0oOSQ_kc8}R%C)tQ;!Eb4y$Ik5^(Z>)kUbrfJWBwxep{yz>Q!f zINb@7g{_PN9j}emrTIB2c>ICK`FKsvNX-GS6$U5&_>@x6APy)sVmJY+5S%oy#W0FI z#5F02xu9E*k&*!xMffcO8-$W8VMgSnCgznE#N$?wp9@;~3vDbyPm@N(E6f;(D$ogv zpwtN&^T%o*L?PtlI$XxU%So&zfTAC=);6;$HNFabU?zr1X`q{KAh-4)X9K8n!M=s& z`4nvOkmfk% z6o8e0Y(m$K)m5M}3RG)?4t7EK9h?Io9bptxz^Y;A8G_Pr5pHQ{O94{>sA+;J3U1P( zy8x6TAxEkekp*=zz!%QIh7WPbf(MCk$bmeI<`Bq|1r+tLNCM3(L#lF6 z+KGp4ONAN$KJX+pIU6Pp5eAhtkX!}|0}L^^(O`9ub7;Z28le)*1!;z!QwBcV37a&i z%Lv+nj;;VaI}h>@$PUo>K6pc61;PkWw1ZD>D@)1&83J8E3DW}IQJr3icsN-->NfyxqCYYCc2A@zKIHrN7~ z7{cQ)5xC#s0;t{x_nJVV44bJc$^}or!8+dH!BdbJXah(Ibh-?c59wOOXF#rh1O*4A z;}2F0l`PLp0ZrGVY0L$k4-C5C80-mTUEmTGmyr-jBqNIwb5oN_)4+>Qi$OE(5c80P zK}92YJP70hBymuG4nr|4Cex4H>Q=Z|8fXaycx@O$2-HmlPfWp1-7EramIIvyP+FDr0qSx?#UcFwP+G^|% zp%XVrIr&NG=0SIBVv~a0UJNR_!DfKD@p<|2$)MZ?iF~jGD0yX+fu@YXJ7Qq&hbK|6 zBIsEmFi9{s-Z%w3zJz2JL_86+KfWZs2sCho@DfB0Y&*IjXx|}*DJ7Y?nR)3*!k`{9 zXoCTy0S;Pb33Co2$00=%R1hBNps0e1L6Qt;moDTqA~bX02?I$>QEEE)^e2SVp=KeP zj0mZsT;wPQ@zCQ9EC$Mj;G>^m_QN_SkmUj}QE@iY$Q=;UEdnI4n3bBH{of4BDfU57}{pWIQNQ!Ce4S1`+_} zo_Ns3m#|a_l7LL$fz?7PeNX~~3>koOc|kE!E`%rmwY(q=2_#*JW)VaYyio+x)mXr~CA&q{Jb*S1v zl`_~qRAHExa`GXC7Th4{0xv9DKts&&nUF*S-lPcbxMhHrX+xSK2*EOR!5q*k7&8qMT!Gj^7B#|Qb4TyytGWv`Fo)56jY?3G9EPhpP5_?6)4RsflMxf zHI&0-K}T|eZ!!lN1UiNod`=SRoNDM{M&LbA#o*KAi!x!yVIlEB#VhDWZm>1bK?E=x zboCXS0lg5Q7}V|r4G}^aFjs)pfo~iGvp|6aUKatrEUUN#stha#@fGME-CWSF2)HD; zDgi|bLIixWKN7d31la^|=NK+q9A8jUgd|-ISzmz=Ehz=d=7GXE9$IV_XD5LLAs3;6 znefg*aS3R`J3h6dAhQTGky2a|4_a7PTAZ334@wxtC7|_$@p<`0pnW&RCGiz$MY#+q zCE#_IpdEi8c2R0>YHm_$QG7~iZf+%PfDCjg6;wPQd^2b&OnnJxt3d&Hfjj6-z07om zloHSqaFD^tpkomr=ZP>ti~~g-sLlc(djz%svM#I?v>X$>LMlG7G$peHdL#`<7<`;P zNP7XuG0EBSIb}HvDWwJRper)t%W@M@IMA`1(t`Lja5W8Lq<~d`b_;?Txw%jZwALQf zMM#D6LC0v6LN8)2E-3={7)lF3VFuo44vjCU2zVVnXr&k`A2cFe0J%K_O#(8V4H5*c zjATeDht{a^xy6~FRZ1Wc5Hm438^$e2&WumWFDc2-1ziUVQc#ebnHryxlo?+HTIvN_ z?~g?^H4iQbZe4;m?q}wJZ)PZu2OE)@SW*f~ETFX=P$6&*05xYoy$3J{TBBf-FD?Mx zbe{s10y!Jf*n$dxmN0=*11OPz<`UuV0Sz#qa6q0x5y-(1DMt|jkNd-QfO+wt<`2|n z@WcgN8q7n{4i-VR11toyB-t3WEI2v7q$sI4J|{J;gdwFIBnFx^h4el_#VR{sRH+=A$Pri+Ycx%g$ESs>L_gHz-I7~@)2HTps~54eDJC9 z*sX*cn3oSK#1c~~aj8oJwbOH;Ibd}H+ z5V|n9MGNZWVMHc)K{aUAF?hW!YPrB*TM z)FC)Knl(Uct)K^)=76t30=o^xbg&ZeN<$n9ilN69VRr^(Pa3-QXlfw~3{opf ziV{JE4a9!v!n}C!;210%VS?amPhe#ROb}E~q3Q*Rpu`ev?HxE@B1$h*Vd!Dhpl}D3 z(K!$^iy)`fLqZNB1nvxg2CBiQ?B(RdrxwH~gHDwKX$4C{RHKSR!wVt>F$i=ec_Qe} zOX${4sAy3V_;7hhs~RE(F5_|-QYt`QLs0h&w0;G`feutdIH04`V5*=ig)8DSK=mm| z2DA|ceEtElSZN+;ARg3)tAKO?;QHXLD$p?#B?wzVH6+|t5C^IQa*z>h*E^I4Iv@>x zIvVJNze>K)Jq zY4CxP4Dba#pi8*&QMmafsmY+_W(=S$=P8L0Dk&XIXF|A$oC#7>T$T)$EG|n16g$Y4PB5KS9F)ppCmA8kE%; zKn(DRTxLlnbgv%hiaBiJkRd888o(0ZsWhD0Kq()$WN`^7aMB<{KnRCG%q_0W#jO*x z0VFd&58^{Ke-x)CXQUM2l7ig5hF!L#s3b87)zZ|A6p$M;(=$O^2a+>Dx7w%XK)Ik9 z$kZJ0Jx`!K4O_RHn_85f$^eo8oj3>P#ph>(1wi9}sYUQc1xQV1K4c#ZXzx)u=-@f% zExjPQoWv5y&T>d~1rh=q2Q~}Lf*A$!P#HugqA3DWUz7w|Y6#WyI%p^WHzbrlzjcaBC6-Y?|UCC7z zp9vEIpJ@Ts3*FF%5Xj8K5Xw$Y0~rlE#2Xyt;1LZ_6j#PW_@E`z5I*R*Ye+Yp0d@vy zCMX8d;oRc#f(Qhs5_GRZIs>#N4w=r+&Ckm$0WJQ7ih|CKhBC`ii$GmCC=WE$4%M0h z+KOF{;FN$iyFg~rK}943l$loqUE>PngO;$uryZ5}>`dkXwvEGN5CD zOF;LkfjH1MZ!tq^URr)pGHB%$Bp5(C!R=bm9fgpSiy5Fd;DA;^K*9^6Afu=Rv}F)3 z4Jr)5*B!#tV_bKLApxq0;QA5Q9m3S1NP{@>DLHWEV18O+W)Z4LQ3)y^yq5)TAc})a z^5a46V9<6;xB}355G9}+^-}YSL0g_7X#`pj=Ya|g@Ol-&c0-e+eWrA*P z1*s^i1P!-&kAOX;HRAydwD%kGKl2p*q#rcq7Vz4ww1Y{A2 z13LTz)|@N=MP+7MB}g2!x1=PoGCmO$3Sfc!oE#Vp8sW$RB_+53=)^F%O7Ivkq&x=2 zeKJT@Q4(ke3ba-O3qTi%fQmzKuz`+ig-C!yA7mmD7d)B`&W9jDa5n)QV8sw_38Z-k z@>P6ZVnHV8j-%89&;S)I4vidp9VQT2;`Yka72SLeLiGQ z4TuSv$OYMnRP%sr1-TC-4AF;()QC>c1Wl2&_Hn=h_EoJ~8JOEl`0WQ`- z=U2v;q=VZzMMcG_ptIjWGYF{=PH`e=j0L0zBn280Pc14gNX&zUNm@QbYH@O60q7#S z3K%o56qI}+!uiQ1i8(L{(5y~LMp1rgdIn6W7`zh+Y6d92K?mEX78k{*6@v$)!3#Kw z!Iz$a2XPsY7dMm)IP2%=LH zK^NqK`pr=$kb%KnMo4p_>$C; zj6Bfc{w1K5f6#Od5rUj_1D$&*W=Jgqseqi+3!3r8*iB8?sX?lk-8D2<#+GiTE-jsD30l&|M)YCgp;L9-$3)WP?CG zW~??KNubz}4l2~ZCO{?@A+~_oh^`}89Rs)+3odboK2Xbt3PBt`Mg5^O%NWop22i~3tPC`hv5BPuv(8yzAQ7Qve z60|)VTCanpA?>_)*jaiIRp9lYpkfiK3wmxEctH+Ks5B4S?*|(LZis^e19S-pq??tQ z2UQE=6^Y3p zKO|>Enb4F~kqp|z4BmyC5}%h?Qp^B4Pq7#rDkY#>gV9AmgPg_SX=$iJ&~+N11+m4c z>0r${rNx-!DEfGatf8E=o-SX~--A z#~6$WrNQ@7>fs4_z4wYILW<#XzM14iV6`TA&jK7*Z<=K>d=u)EsErv7#U`F9jqFnq~v- z!7ooN0tYonJU%T2+#rX^gNi;-Fo5MiQv#4iTWS%s1p+oK9=jl@KMl4M)VBby5`eVz zpye$@1Rik(nMIY577Az@A9mph$Q}7bpq?ct8Nqet7nP(H$3q4X;?pug-YGGOPfX5% z*uaol0p)`GqoC`cph77r;9*tJ%wjw^se#m`q`;caU~MTW@p<{6p&6(i@RstFM982# zC@?^Jz=Gh?0-_3hBuadKQA%o2YD#2XT zP>%#^I+9|D6sYSB>U@D*4Bj6Gw-Y>kf~*Z|WqfHt3Frt@P(lT%0}t1LPSFM5E(Ts10k#!f zvVl+Q1+6543V}|sEdgD420BOqJkkh_UC>pisNo9PQ<(&63_|<}?ioNFo}7_gTnZ`( zN=)LDGfMNaL3u2%7$p)R+wVd3T|B4|ECH=@g17>FL_SjNg4&g!BoCUg04=tK+JR68 z?wdgUo19Y$ox%mJJ%I`4Lypb`9Xy^{Qj&`BCgc(jh`r#&g;2wb@{2(ucA#_*5lKk| z)$mZCg0pamNqh?AC~`;=08P`u)q+-EfrX)QlL9&p8eB|6jxB&I1T8u%DoaHZg-((} z+Z&mn#UI(lpv%d?E=@^ z&}qStnJcsh${Kvp z1;m0(&`EosDZ&y^zZs?q65QaF1`9{f{ex&J88on%0Uon}+(ryFu?RYv1ThRW`kox0 zlM1TvK{1zE1dbkXeujDpSqPE)Q&5DFb3XW31XPcK?h%9@01KLM1_d$9aLDC-1x2Z# z5r4>i?=U~*!}c~ICHfT5qMyu?RB-G;%>b?ILsn7&>c^o3b_J-WLn%;GD!``*fsQN$ zhYPgWhE7JqBMvn33c7CyswM?mHiGp+Y)=I>k&`o0p+yFgU>^uXeJY@7%0AxRDlN6Kv%~lR;I#CN0&{l0F`VAQP629 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%0A>jNDItLM4V}l3J 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Ôu5H&4mfgAMTYmh{K5vW-PN(rD#U^0^{!Gh2-1CnA2@^hf# z;MPk#=&BRAT`-~I46qQmltA3|7!PU`K?b=>Ky2vwoRF3wSR_9U+zu=Om9GV$Iy=5N z6MfRld1;wRW}xM+X_@H^MQ|ZB5y<(_Ao=3-__Rz=Jr1heGSd>FVxU8w)ACU` z@kynbIVq4mvn3GK;I<367l^8|7`()}1ez~EZQ1-hcwv~AS_0nN2)YTHp{NAL1=qUZ zmBmPcFtcHbKs~YC)RLl1&@dugD|k~cG7q%G4P;6N_<~LFBt}Udgab-7pvpY8q6DHM zKO02n#3!b~4#+Pm$;$zCC6hsG=|ODJg52c%+$2zo7FN~ffeyt2uhWHS2dM#-m#Fe! zkAi2opzQ{bHc*uY9-ao94dTH=8!8R6I5iJ+DH!P3%)-)C&{5i;!AX!VaC0>=rzAcz z4b=SxdnyOgh)qc?gWC#m8dz~kK~4^+%Y!6@Y%5p|SYKiqk`k~;W*T_00o-1&U|woT z9_W$>aA1LT7Zl|efctew`az4G@}b>ExPH)5G-MZpcA|kKLBR(y8=@b?1Fg6P4SpmR zK(lck=;}tuso$x2kO~MaR0g?hIKDV1u?#fJ15UbmIiM;YR3w87m%JRv23wG0Ay$Aa z1NZwA)1Ze7f}8;tMMN1w2yQ-j;0|3EI6t774_fsA9#esvjc_D5#-MHi50Qe@fU;Iv zVs2&*s2Iu10i|WoJV$(XW?l+JZC*b3_7ZT=L)hRpF3gt&8K8?ILDQj`DM&UTgh5FL zT>`SmEFM({$P9#cAn6!%^C!9(c#;O>c6b^<3K>wI1vf-Np#$*%s5&jqhV0}AX#?@g z(&8a&C7}YKFo&o{RB?GZh`Ks2Cm!7Vgf!P7X&Ewq2{NDzbYfajNimW)%hEs&Kyp|` zN&%8IhzHtW8J|*A2C)||l2MK(0O|SU<-~)OK=(C4TDSS&o!Ov9EJIOAemwZLhs>fv z@N@}ywJ=y1T+AU3UMR^24fPh4z&!`Ll`OR)vlz6l3B(5VM;VGrb5e^zXGep^qZmLZ z3n!+7moJy*#V6;cfJHzDy@Tcqz#Q1Y5~X>dHd$g0xc&gGk1mC*HikChL2I}`H9tr+ zzc{l3w5Yr|H5bJejD^aO#l1+Tz*T@(6qm=Br51tu ze2^6x7HVa)2Jg>w6_AiPausDWJ(E3i$k~_qW zk`SFJeH*ZgAR?f_Y|wJ`@;p#U1d#ysU%>u>G;E-Dr=&ure?iF(tPUcOor>yF&~PJo z!6j&!NjYeA1ExQ}JP*1o3)IF&lSwa1OaYmcoeEVB+M^8GAqzhG7vhIZ$i82=LqRvO zfmZ-PwSX@B$;~V-$xH^HvH}w=&r2-=uXQX&5dqa`Fv~!pfXLcl-xYyF5wyk%y!aZb z6_fz;^7BA)&{cY1#UNp5R|C!mnTZy%AZ_Ro14^aw`Op>!STm^00Et{svWHrXDi~i1 z*{}#pOQ6_-Dun2S6~CZc)Z&Yak{Q4ZkZ%%GAeT6TL<(|JLA5O?zk!C?ixcxwQ=Ekd1A>2y%P+$q@WD#)Hfhq%Dc!eqiZbhf%=Ys|z z!G^+2DNap~2UVX8#fio7#l_IbgL1&j78pPy$?;$&WPTg8XB0kT4wVGYKZB;DA*vzE z3BYn-CU_v0p*RV2i(EYTxa4@yKuBr|NDMqW3EA)jo*Bq5Dgg_F&hd>0`vsDg!7~@d zN%1L#po$8lBsC9o;bI9m9$X}UNY<(&?p@KbyB$uBEy7Umm z49MgPlJd;rc+f_@)H2XjuAuwHL8IpJ(AiOtU62wHv``AP7@#;Q9-Jewgbvb0&BaOa zMJf4tIh7y-Aa!bH9wM|LA}HYn5rT&p5*MCji<2@-Kofq6d6l4(ph3Mp2ACMQoC8NH zL=AjzI#>d(3{@Cp3S0^tM@gBW1OPDtCIC9$0kruFStTg$K;70AwNy+%y4S?FlmuItW~xR0vr~09&&Q zs+JLgFdoSN@u1oK;$-k1nu5$c(DD+b$t?&IJQfXMf*Nn|ZaqW@JU9yN=tD$6K1oi@ z0nLiT@9P1LW)_yF<|Su>E=YnJv)i!SR8ho|b3kWK6(=Xc zRV5cy7L?>ehcJ;Pz;j^80%>XGDJX`4dWOgfK)DS?0Z0JD7?2>SSB|U`oEI62lQZH| zGK)atofV)36Cgh1beH(lbkN#5unMS1W*%H9H6=c=xH1;@e0m>yUS z=vWBQ4p^v2Nl6j(O2m9{@eefuI`a^p0>0516w(=>n~I<}QGjzTXowqhgbBnTmCoj>MEhBRs+R)QKNu*qj6k(5->0(Gc0 zU^TEQ2_!|(`37WFkiiD12>4!ahjY~M22PUs52cu++I8Vx`Zgm&%0 zVxaj97$Y8>Ga$x;#us2~r$OowqLA$l`Jij(z?;F~y3r({oqxDACNvm~JQ=Su5z=DR8-w8()x_k_I{}DY*=65a=9AI0Lky zIX(^IB#;Ei(-mM@@Bll=B2Xd*c?u$00@}Hs0?`1^hv_K4@4m5NL5r>$Y z2VP2;#!#FLInDu8RD$-nr-I@OycsN|GA}VV6Cw_puLT#uAP*FSk_dPqD@ZeJVzfB9 zI1|*I%ukLlhTOyoilO36$P8P2c}8j;Xs!!%jWwt-mReKfd2I#_=q*8>5U`3Ef0NViOLrzqJxdSW&?gW7R0X3sE56P6wVo$O-%+ZcYwwUSQKi1YGMjh6jUpN zvVAVxV<3^t#GK5kRCw|LU&#tiA)qaaV8?(C&dVu_i<_EVQLuTSAVjkd+K8xtwHF|jbV__OXroU~3PW)Ur~m@h#gM_M zc+e;xSQMO_p(B0qd8N5YsYM`hP?ZN>%nIH*m01FAe1L|lGC>S839F+=Md<}6BEMerse3zOD-t!KfUIF(7Q&KZQBP}_Zd8HMg39h_+hGLKy zsC+EWMpaoBU!0L&4&G0b15yR$7p0aV@yb&3Qu09|o|zAip=3~eK@TH{PfkuQVu0i< zNTjBM@*lV&1qnm@aiC=lpx6Zo!3IrI6LX-c85~Fq#i@x!$rggBTFWPf}b0E196e zIr-^u^Kug_u?9V8(GSEIm7pWSU|xU)62#eXQ((g24Qgm|povY05W=;f@+=p$P6i?Y zHwP{bUEK+@7Ciz$vrwSg8oY46I5inGVH6LYV1;qP696ESi&9H+Q*%MB8}R;Z(3Uk& zjs{hViFsf*fno_HR9Xz$@ea~cl3xT`Mg_Wc5p>NbNC3m|D=PMI2Hk$>39zVJbn~67U(KNFv}9>I+c?kQHT?fQGZdTfV`& z?;xoKq8?oiv^xp3ItQHjlS@GhmOzC9Xz@H)FGwCd*;)+p6bOu)OiIUX^<9Btq2`5K-CM8 zEXoI6$PMZ+!erqsJ|qEfQwxa??&iSx`MCw9C8_a=WeCSZVj3g{&d`_=;KnMt3E%|` zi6yDvP{q_!0h;S526Y)Si@}XUg#J9x0bro3*+J3qa8CV^vMPQ-K{A3JeU@=hZy8zT*hlLziIb`$^MJN~4!Urv~h9_yTN=Q=$MI|Us zGK*2;1FRO@KEt8`bTk}j(*~-^NF_KV1%u5fDFUs-1~n1kc7jf($jvK>&j(N7!G()K zEBe5R0CFx+L1Iy2E>h?fgVG^_pPrhRRveF#P|`sQSo1;C0HE3&n$0soORhk>VBRB<+FG$;=#aX_Z*#(Ei~^JrGi$Qp?kh47mFWpI0-uDif#m`0|s>;7AdT5 zEUwJO=0xae6$pnHgSUpKf=>5HEJmtipiNY8IDq^MT0Mr8(xK8gWYR!a&u5l^c6Ea@ zJi^hS;wUu*vPu%}2=K;N$bti?FXO>Npke}{6_i^GQd5hHGeO-c@PP{`k|6KKLk0_B zrhr#UpcDk))=(Z~O(EQVa9ej(ES5iagho>4-fA7 z;-vW0#FF@&;#{<1w>T*t6wA=FN0HS-P9sGY0VQY5g1a~g(&+;&Fv^ECC*ckQ4cVq4 zrMF^GdogIcXL?a$8nW9#VnxYi;I-(8 zAO~H`QUX5jq5w^CY6-agisU4ST2MuYQt5+i1Lb?PiU}$Vsxebji%<(RRJr2R7W#_;4TGt z;1ks912qPb+7zXEnHBM%t~@Bh5oUpfA&C>zy39k#8nC_!(kv1}Cs-0}Wju6bAq_l@ z2MfZo-1yYI{L=J{_}tXo{G!VETu@szH9H=>?gczH!BCu<4!*uEJ_TCsLAk|684x+p zWqI*%9@t9I&R(bpXk9V*uAzdQQt&Nd44_+jGV}651t@r-FR}orbp+;vD^;kQLFI2L zsQk?V?X}2EgWrq}GAS>$Br^>(TLEf@!4!ZN3W26IQ(*$oWCG*nrIvtZaln-;==wm2 zMWC1fs{q%-r+~IpfZBQxLqTH&W+>v2Ls(FRAW@Dm3sf|NR>Z;-fh%5Q3%~-X z27!f;41)2&i*CUNfvR~}yds4WxS@jxSui&>57sx#fvntx2Q;`z04|-uO{yH&_$|C* zf{VZkU(lx4c*rp^AZLKq1SORg$Ad;85vM#t_Qry)69XxSsY}fRuW14uw+9+Gf(sXy zWafg>Ok#3!X;ES_sGbCAi%(0;$pJ0D1kcKVciVz0y?F3)dYER=;3{}}2)x4!YA-~v zpcF+BYy&h@O8=m-&l4;>(a34n%kAfr7bGY5^0@1f9E?Sp^>afQf8&H1g&5;N6NR-t&}={&;Xu}aGKPVs z1w}3%bOtDz0#NG{*4aij6gG;1Dh3(EKo-N2ejvdCZod{I#$=E+fvOrTAqXF9KvA0u z8EQZl19idlmXco_#gwaAUNQ_C-o#J79aw)0CXT8cx47G zu@%IFf&+5;0z3sG38H6e(1nuVyaT=B3sQT7r)XhD7RMJSfs35@+&oZs3F0nL?>03D zQgwrh5xAqE5|HX2x)vE~6i5oo=mx|90+Zh-Z%A@Z<2 z!O%7=R1kbB2jnn2xZ6<&I3Nl^qb4~?If&()P|qL+F%a58OQTSSLSSYTr9o~$jYlaM z5oSOdIS7;TLEGEGtCDld6Dy1JQcEDq)nJyx`Q z;F1v`oeqh8sQ!3pngq9P(Nsbz1@LK6$vOFu^{g1q$xAH(1sE2O?H$0~Ns-`+3NH{R9yY84br{m94tjY8Ql5%5wu8`t7}`M*LyYWT6OM;$ zJw-SfJXQf({|R0^4o&`0OF_*I#HbI7aZoAbK_6W5kZv`)jiA8GPtJx8`Jn3sIRG-^ zgCYZ}a=`;WD59VW0*4PkYeyl&Iw(3o1t(TvaLIzjVx+MiRD+OW4&8?!KctpGhk;OZ zfkzvV1|cvdAz_9z6aiIIT967~VgeO{4J<*p;C>RgZ3cG^SO^qfkZ~9!b)Yyv8g4<7 zfpzA=84PRyVt5Bh8Dew?RS-V7gDPB%-7=)19jJQH$PT0fhE|QBkESqyViI&>MGkn2 zIe2+OW&vbv5;nQw%skND+2Ezop!Jxb3qK)=3Us6b*s$Eh%9KP<_c#xLp=K&Qup$0dsV17m`Qv%m&JWIz-0 zU~XCpcsB&7(u43bbHL|!pm0F@_(20rU_np|KdBV7ilPv_7Zc4F8KC%qoGnn0S_BzK zD2#`Qf_F}VYAu*>PH}2#HrQ0S13(P8U0@DqP7+eu6~-4Nf+`XaT>=_wgD~PjCy0Vg zL5dX6+R~KN?pzQfp987qV^yb6H0bb_L)y<)Ahj zc)0;2smFuv<^XvqF*yf577VHx!6&NarsgJtGAmpFy5kFENJ%`X`v%&93|`lR%#BY2 zMFQx2hSWsZ_B+UcQb~MLYH^d05RcoJa|bBSO~Ngv9zEhA9VIM z1IVeM3wj_C4qxgE+PaRkBoVY6J|(3xKEEgh>Nsd#2d^K77k?mS;Ioq1ywxx z;QK%!stQWui&G#=p5r0=5J28Q76pyB!qh_clz^@X1#KPx?V5n7Mu>y<;9;r;ZvX}< z1ua`DP0laP0~b9dpl!KDpd$ys%U7YX06lC3Qj9N;vS znN$k8qyj8hk{S=XZx^fq)K`GqKmn4?SRK{tkg#$Lfk=zxZ>%uJv%C7?wF@Jbh?87u;6i$c^Cfj9Vq zuH6A06Au~lDgke$gO|(sd60wuK#eBQL?mc+U1|{`o#z*2rXvzDXa^)DGp6Mifp7W( zTLj+N2rfMkTtwXgmIZUcEo6j}+>+GzlEn0MXletigPivQiWLMGeiKVkYGN_8a0AOC zS~(@)aX8QshM-N)(4!9!HbE7FPb$L{h1|o8DPEMCmRbZVdJs~u!;X-g3@##JP6Q=* zi0U-(PETkRUXYdtQ3lG$#o(P15LM|Zi6x+*2NnOIW%7_yalqcsh1A9cxhe7BWt%0S zfzQkecwJXel$s1%3|j))1Owhh3SJ0TlnU-yL98gs2cMZ*4B3XBS^~Ot3$#=pA`8D^ z3~VPXn-!EoEC+XC;*;|;z~KOD`Ip3lu2e({F%TErK25Cv9Z~}}wI~ICIwUlppdzIu znV=nC5W_*s%!|rWLB|zP+xD?2`E6(%f8FLj!c?1nBUtf^>+tASoKOpP&d)RDsJ1P~8l60E7pgDuos`pq;Ux zUOKo6haH^>iW0C==-ma7<^aM3@SG{sfTBX!^e9vSau^S&yP2Dq4%$|lS`rVQWy^>7 z8kE`+Q{q#LAx&A-E3hGUjZTbw-p6U|vCfeh#?g1fK$f;&W8_?9|i( zEYjtm%?BmW{0~|=0qIhJ^rjX;Zs-PkxgxD77u4d2FHI=`^(zt!;z8$k7DFaqpj)b; z9K=K_cxDE)a;`Kd1$>Wkd@*Do2a7~$W(u-gSsIGcvNX_OHOMJxpuTDeC=uqOUT+0j zfCE|X1dh()c+g3UARVOzpj#iop$rbkQt$zSsUUBFj!*$DH^@!}7Z_lfqT-VHf2RBn7uVkLP0J=pf* zoWvv)=M)#@WPSIhuc0NpeOQxE1sj;;Zfx~RgSlhR?ag-a&BI2C-q z8rX(nP(uQ&1H?_v0PhP=hZqkzI4B*wV;ppxRcSG}xC0*`1Q7+b96|jStm4JxnfWC- zNg#7Ud(J`o0gJNHRfC%75Wj=eA$SlMKs=b43q5Kk1*8VloCcqj1*&w@Aq{Tuib^OO z96n%$#SlY4>}-(9U`8&e{7nWi!Hx%=+gqFt?GUEJ0|FEUu-(4t@t}i5K{_BM1}LK8 zJeav)sm#2T)C!OksB8m|ZKZ=2^}$Vr1_8v*)DrL@L`I^KsTt_>M9?|MpaD?O710dE z5Ml7e<0<)|MOffH)ac@nt&S+7pp#LGGf;#;AqEowb+9tiQ$c&tAyy=(f=maU=Y-0S z&rL$olbH(|1VR!3PkkXf6=sR4p%FIUfP}I623Z{88@MRKH((*qsts@{4jVVgNCb(e zWrD6TDTZ(mrht08pcWT+BoQ*~1zKqaE~?|f%Zm|Q(8gDW;*89+6432Q(1^?cZHohS zaG^aqhGK*Wq|dZ;Pj^ti1g3rxP1(i(TY!C7mXv7a(n}Mx|E@gqT z!An>mZ14~%mDwt~u8a5R8(LS`Op$Pgxp6xhWX`Jk2*=$76@P??vXlbH{-9#k}d zwmoEmw&W{0WhKPXcG%z1jlETwgKIm4FqRcV|Xz(ZJ=j0?7 z6oU#AaC9W+=appUm4dGKh1}Z)RR=yX1Jaa-X-x$k5|x<;Ju5F6bX+i0F}O&IPXyn+ z22-7pm{SI~B?EL96!=!G%DiNlip;#U9Po4yBw>IiLUKXJlz@&OgsFk`$Us}6D-nX= zo+XS6Sx5q!ZvnMdAcld(K-m>VQFdZ+Vjk#%QSj&nl1hj~Xr0Jk( zR**7CDFr%bBC!B8(+6suLzICgYRYmGVVt7u_%z7)FH{6HG7fSEgbP|l1!bj!@)C6P z2h{0-FGc~`2fo7(C9sNDa}x`S}FYDBfV!WafdE z5P!8#zL$`El78#M8q3{JyfX;4EZ z5i|t^9yN_m1y?3u8BmuIW;}=u(FhX(jSj%rRrz_K<0Zj%q!vNCgHSopq1)g+JTS>j za1#^OE(KWxy2%DK{Q%v^otlEs3Z4{2HxD8Rxq%Cz6ujsXW=Tw(TQo69M+jyTSQ#kKFcfE$rlsYif>M4eG~^-sr{LEZ6+sRpVkpi8 zU4{qR+yff?1)YhNp9>oK0ZD+`DDZ=3p#qSMnhCA?)AAXLGn2q4(!%?T48@tC1Gym~ z0iNA2h6#Zx9?<*%?9c#+!jydYQE(6eNMZyjf?UK6H4t*-8@RI#tuGPz4YcWJotN9W-`b36%lg00h$uzW5swPava^xbfhY1$3+ioY_DMK&5tk zatUa9I1@aN0w1;kaWhMbQ%f@Q%0MbJi*r*UCpcxMgPZ}{Is!Vz93+<)4<5}<0Zq1K zg4gz>q~>InrGn?CAOfJV8F0fGg$pijQ^7_g=71VI@u0~cSP2bL3hvd!gARm)sRK{q zfeLJh0w@>7th5yHcpx-sgPfF>5)VIO6s#{T1$yiZ)Y!BX(B)D&2p*_tf-WNgMIT9OownGc{ww^xB#RCzN{k?bZ8rBVgkPE4k`jVQ5dwu zhM^cq0OSlb0qBAjh$7JN7$`Czy+Mdr3TUnmrU}xE0kxvyLDSU`74RGeb_=wBmIyil z5+V;3fgg5>A__7KW;#?MtUQFM12@S*DHv=zT@)2Z&4zl_JW)ysH7Ua@H za8?H!09&R5>M=l!fDZb?bb{(=B*~JZypnv-Iw7cHFdw|a2rf{PUkZw9u<^wuMIbJm z4<3_&W?1kpABZkwVUQPKmZOTJ#0|0(B)ftwge~cZm?`rQqxj;TV+~8^L9akY$XKWlWGc*{PNBnZ@y-<_H6*$^#9C zLKxr*0y3rz5dhcU@t}=t5PmK=GOJQSi=xev_1IP*vuU8SWPy}8ps3(c(50AJt8R7vq7tNK%>8?0_ny1 zAZsC0FyJGivmxiHfLr=tsr=mB{JeO0yk>*e*%X(6iVl#U<3UGuW<$2nf=XhL7SQD? zU`InTd^TvrucQdP5(307iwD;|@j1rD$@!qwjoI-jnTeol;XrvW8$8@u{Hn2b%ZH237K@MW7ZU zXp1m-!BA;YDo8o_AlG=vO-mp?>>RLc(4q>^@(-l&fXKy{6lH=g1TR1+2VIDo0UE;q z3+0p+XTTx|EC4#wCA2vLs!Z}ZefJP9au+cPEIj+ z0em*71qogt52`o7DH1e3R+O8XYXDLS;*=wCK)S$dvB6h$Kxfgj!D~bllcCKm2p76u z1v%V6K?}(nnR&_ix!`_RK`HbMNRVxyBmrv9)+pE_Q2RF-9+e;-sN+)%Ha;~Mbi4uh*8AdYaCE|kEz&Z3|K#bAj6L%g^&3FH!#ESCq0f6#Hv;9>^c2!<6OAg9Nt z6(y#FG{HHbJG3$(84z?cdOW0p1}jNT&4zO0lRzuDvO%c{E(E@zAsciGGUOb;WU!v1 ze9&^g)Wo8AuuI@#utW>$Hh}{x2Yk~DNFIE^256NItQ;vyE(14+5Tz?PJA)VL6oGZ5 zg0B0@jxVVIr8|g7X>lrOt^|5(cX4(+D4|1h6Ex$1MZkkd;4{jz0UsM6<9zhnvf~|mwK$8hv1!TAmqy#iB3N1`QOjvlrq(C_glGH)62*-mO zh>&SusLIj;(Ee|50s(Dufh^1cyAZ4ZG(ZJrfOnHXmWCyRQV-|^H|!GNi%GJ<=`OVd zSqG?P5|3zcWkXujpur4qNW*qU)vI0rGq__lp84bt?@crN*PlIm? z2bYMTdIPE&v}6x7whpa^k|0$psQLuoZJPo*TpFS@Kd-nnHx;zJ1j+}u7D1{CD#6o_ z$snI5fmdFE>;>H|g31G>2hbTlklqcXM+Q>~m%||p-cSWo3~up)7H1_ELFZ}H(jdhY z)H$FbGtf{3Oati3NYJ4SdHLXBL#PMJVKjIQ62bxbA)_3$_A5Uz1u1So;-#SMms(s5 zUaXa!1hKj_uP8MQtQR_)0Gbp8AFd1)1Sex;Hn@=s5y%Jk!yyJCyDbGYrUn(;MuZ*-0#%n;91j|7fx4x*1X{g7l!8iNge+(w7rf#FU84x<+-HLB zeE>TPdOa>mvPdl|0(&IBptL9*)OJh)jcR~uUWk^863D@?a317zlx&DH@E8%44Js-? z4WOj>G)RhstVquWU8|M@K5_-r@JLB52Gy`oL2&hr5CZM=PsuDU2A$oJ2s+geToxt8 zgN`Hv9p(&{0CTcaD?tS`E~)sW#A48LHjw2=hUOQ=!;Tw=$$*-V;Dd5Xk~6`61RD>o z)gjy>Xwx2A6oEPeP!GUm(0lkO(3ktsk5ia`wxSVI@2 zA~hA9JPV~^BGEnynv^W8*9~3#DDhY)HP7Rr6 zsA5HlkW3HK0opSGs`(LRC59;IAh~Ra-Fa!CCGJoTBrCwDv!SA}CKB9AOw-{aNG8K7 zV2HM2&{enK?dzZwRN$L6K*ks6$LD9mRlwI)L8ZWP0} z!+M~*$1hiEN-T(mYxB^wZ@OFPvJX{D? z3Bd(m!44OI)w$4aCfGZmHRGTqagec$B$=Y zUIc1fK};=xI|jxtN=>dz2JKh^nFKum6f`l4XsZ?!=j-CP+2}l7CG9F?O$R5~Q ze2_^XK9aqli=n zW%_V;Kt(~9XQ4X>BnI|MQ4(lP7E;5gC^b31Csl$uxysAVFBTfs6v} zErL`x5Cf2u7NtU#!5|5NJPle~0&goqjKEsX7L}MmcjJLv1YW}gF$vb;goG2c?FKsR z0kRY#I|)?tfzBNSD+f6mv!8=1T3L`9pHvB|Q4 z-l%|aAYB*mU@*v)SOX8F7T#I_alm^T;vw}3f?u2+U!0f*iBp6qq95cq!Xid0ts`8kIyb{mYsxDKSA10pdD?Xd61-da2pVmJ-|kkIXQV(9DOdoq^$4K=!jI1_%_)KOfXXw|GUF4Ivr|(b=7E)hYX}4jsa*k<0iVVV zxkx@YF)tCkTQ55)9wG-CG)K~ksQ}dELQ(*0en51C5_w*JX<`v*z&8n8^MGqBaJWHq zr55Fbg+OBru;YZYlQRo4K(ix>1<(LN5&&Pz4pRY|9E?wc)Id-*&|~jFWq5vad|rM* zQ9h_^h9(Q%r^iqXGY6&#)X%{b1$hIs><~1ShC>##CkDGzNg8N43Ti!QFD!Ir0L*Hz z5cr~0gnqCXc!4sCDv)o{6v2FeCR~;Y+N7GDSpeE82}&B71&~#PsVRsVk<0?<)?LuL zw){NEVpaz53P#ZJN}w7P!UGMxWafd^4JU&RTmh9BnFXMcFHjQ_bW##nG`=XcEVT%< z!V_dKd|xTN%*rf)jDLc(mqSkeCFu>!aV2OBmvk{~L5}z&6eo_`_NCxT^=w>yL642hJ{4~%kL_X*^ z1CUTbVhSv%z+BJ*TF^jBGLq{+2@yQkg5pV#D01T!q#fZJ@crVLn!v*7x*$_|5Vu3i zCs05^x+WlF%MmZ6z#6emZKu7b&Czd70Czhswns4BtoYZ3Q#8x(F z_ZKLXKy_(ODRiGzJUq!T6oUjoJ%8{r(!?Ur0hJ8k<&f!#C7_Z4)buI_ixh+A#v!W! z!Am1S&3=$jX)gG>cBmTACR^}|E*QTAw37{d)(u2gNossXKB&Ep!UfI3WrNo3z(t{J zw84DHDop532V@awGm@b=H#s>uzN9EG9n`i>VJOZ`1<#1W4q7P70Skc^f^CS08@epG0<`} zu;UAobHR(_L90yiQsNO@a3Tloq(D;!@(<)XP;?0-2Z4=&-1!K~1mL-Cgz~aP&_&`< z+aOC6L3LniaWU9ZxI$DZq@o98d~#w=GH4hSbQT`esN}?g63`eEcmX!t6qqQAmqBMA zPK#&E%leMSb)IC_OD?IG-BB2-z> zmTG7*1`1KANszV}s!HgoY*4}U)DqAv1l)b;pgTWMqYfd2l7t|_XfcT_h*dRsatUg8 zMmea$FD?OH3=V4BAxaOB7f@y4g&?LBD38G1kE#nK1zKr|)xzA&JXlW0G!!iZpc-3T zngj`8NHu_=8?=cMv^W)X#T+)PLCd~CEmMRXcLku1lu62eH3`(bT0kY%8gz~P|+;y}lqp$4K9xgZX>Z4B1{7Qrk`L3eC} zod{QmT84so;Nk|Qv?xd|%FIuRPX+JWOhM>H5srrpc0m_3fjV^vg*l0ppdk}T7aCI- zGAjY~SpiIO26T@hrh1U?5Tc;|G5pXJm?0oR)S|wiC>5>70E2fCf!q zMuA0;>IihZK_E-~i&W+%gAS&O2X%@NYD*H4!T=nSnCSx2 zMTJ=mZi;|TxdETLl7?gycvT)~voTVY2=OD>ObnHvqm?s@AdN(@Ga*K!Rc=rdAfhPg z6+;GeG)z8dRW;15u)-B#HB1DxqyXp20?^^PFrA>#Lh(1KzAl3A$AKz?2o|Ll=jW7y z#>C+Epi6*@6406*n8u>a^mNd!JLtj(m@q0AIwS+CBaqyNB5DA)5-N-u^A%~SMWFq4 ziMgr8$ZfU!@>K9fGEgRf)t6u~cuN7s11~EBEhU6l1QtegybHj5xHN276`sam0{Ng( z9Iy$+`N`lU2wJ`ppOl#hy3eW%bU6&@jAiU{pv9sk2+g2lIrBhgS%NmefF|K!IuR1! z_ypZs47vLdLjiPYCx$rqmhhC+WYB0=Q3<371UndRbZ&kMsFnn;h{4bfl?1P}!jOcQ zW~c^&h7Pd!4RmlbxHp{%?b@O00_A9Ifd_XdNI`LBaWZK96T>Ocj03*+0gK(xlmuBg z2-TdD2%2Yrr*V*LU_wYy01`^cOwTMy%!$t}g(fVRTF~$UBAdhQ1?d4vm1m|Phbl-o zqZ~YBi=q^i89?^|LuzoC*_p+lvqp0(QIvwh0DPP;k{>`~XyF2~2_#&Sk_);Q43W~n z67V|!kqrTrnxJ7q6ftn|hn6P6MnH-+@O%%7`#=_g+RC6YLhKT-?kd!qpzFbsK~*kj zg+f^-=+g4EoJ`QsBS_i{a^pd^f`&&xofgm$@R+io0EgZqkeY&B8F*zQwj7$0Sda^H za(rrDX>NQiP|33VoZ@m+i?cynaf|YE;z1^$O66u&q!vMED&oO~3aUJ4 zQ3DneLD7aK8-UCQors#6m>Z9p$dP5>#XBT)3v%P3`yXM$^2lC-=82TVOoYQgi8(11 zyha%!jVhI#m=~V}T2q$_YHL7S7GS$T8lke_P6bk0MwWuKSyIqU1+8*MDz@PUf}#|) zDF~N>H5AZX364L|co^t>{u0olaj1_$bvVfB@VpkEmRW(6-of(dnG+_6<|D8$a$5@I zDzG5p$^~R=!EF$9yGkI{B|Id+p#(4M;Db;gqfw>6#}nhwhVB7Wop8V7(2ZzcW7-O8 z$K%jekQ)z+4dl`e)ovt3$aM*tqI_^W6qh}a#DhZ?TX=#B4b0#IiK53I$Q>YYbW>m+ z1C@c$(J)ZhAPa*IbA`JJCXtc~(t%Y9w5=J`pw9)}!wOwt4^1sF-Jmi6}T5Je9{2(HwF<~>Jcu~Bf(F$& zxdmpRj#&;kUxIRTZUMN21Wjjw54L6~&O;XhkC4C);s-T+@<9y`kWV1vXJDb+f_!jO z2h>W4&jX!V09x#bA_b2HkZ3_ExbTOY05T3)0l55wjGrT#NBPO%5*ais1lrpY4_N{P z69pN8+F*dmU@Np?av%pYfMOqPBX<4Z5mrbm1Evj9LP5s^K!TvOmX-?7GZ1;O!5QW8 z;LcVhthmlkhRp1M&XWPF0GBezz6TkWSWu8t8J`O}h9o~3GFl53DXz@TO$AR7LWMz7 z%z0pQK-!YQu>&dFV5K2UA*>)O1}%O9jqPAcKpKBganP_6`2n{9{^bZe2+^(G3b07P$v>RF%7;89&&9qNDOp;XGuO} z8#buP1nQH5#38qjK^I4*Kn#V7fzHqd&xawY19u9M_#h8L7FMC^1&O2T2VF@3H6F6B z8PpPk?YRS+2oZ+gV1y)wygd&h3^@fbFEukg17;{_OA17?pc34j1(%QD3(LX6(7R?q z?3C0r$o4t-K4X|DD4#+mm0=>~iP@>3`WMbe-pPhVFuokr)Py(+dVU4SE<{X#cU&hG zS8XpR|jl06dQupPZkcoe51BU^C%IKY(2YG6^aI8J$2f z0JMf4CI=ee1Z~(YMv@055X9jraO1#-_agJ+!CRo8K8AeP|>3NT%??o zo(ekK1rdTEKDcoK(gkWef~qv|akyZCBJi#BASNj6Ah+9rdHFfegr5mIvkzibW<2;} za*#Z@T!9Sqp>UB^loWvyNM1fvGw4V<$ZS7EM`M?z#E%l)CT zm}fm@AWb)_W`lfdgPK_QCBau6Z#E@#lXU+5|OAYDbtWjXofpeao#4;<|fgFs~g z^f(!?WNKmxda45zR`JQX#h~M{AZkEMs*Caqpn(mR2kmlznV4LL%?Nll0;vaGmX()Z z3_6?(VkCGCHp~DpCms~cMa3DJ1u$Vyd5cKvMTl?(@3=6$BkP z04-HP=g))3VdIOS8@<6!DkzQz=XGR3P#uKkbW}%yc%Ui)auW#19FPb&ykSuX6F@2w zic?D-Davq1Qj{z+rh3W&>QXtPF zg(X-KsN4msNzR3C9{}%R2RjXNjWOgRY=|i6z6VgJ0d|8Vq@e)T4?dGHAGDS&Co??* zlKIk#*d|AU-Go z$0KV4mtvqa0N0WST5(l?q6<3L0QMSO9eCUcwATzgas*lvl%G}-51IN*tw;v1waiZ| z0iCM|-aQLi=L6cg0-6_qibJZhc<5Q6sDj`_yYkaY%0bK3^FY@Jz>&_&MnE02klub z$OIka4L&9uey>w5Xiqd~f}tQ2((^1%FUZUX1sdouk{m=2svs9^K4_#HNeQS{1Q*KS zs}(Eap~gXHH=%;y_4J_4`j7<fl8RCjvmq`hDXIini^73B4=M?A6GQ=|k&MiS ztA$9RD+Tf4^LxH z3Y+-MJkYLLWMNR_8Ke$Y=s{J(g~7!hx*%k|K139(8O>B=F6iF5QqUGIh^s+2R-}Sv zuG2vWg@Vtd1|NM2TF4Av5|1jJnFik22~HTGt195?LD2vgg`8{+y(R04-4mU9$+6gEYMuAQ=Lpttb<8u^0H%HilyG2o~rP?xg%2P$q?KwE>H# zF%%aim&PZilz}4(IyVUtN=hs$0#9uraX<@2LB|6_G=aw=!HvfvhyZA+1ImKz)JZP@ zjkkfS4Ui$AJ`7k7L`^#A29^{!8$7Ix%8N$|K#&2Md1d+8pyB+S9MCF;VuKtnX3#fl&aNV6O42+*ubeo=NjD7%5Az-?<##6V1ibK~=J zGa*~h;Hn_$A4wfV08=Gsb2fP7G!>y3Ar_yRQUMzpgP9GI1vvsFhpGo^2e=&vQH?m~ z1;mH(;**n#*KSK&O{w7J-h} zhKPa2Zotbuz}%F~B2ZNcH7X?smMg%L;B!u(BPL*hjG~fEP^jfV)q~POKIk@K=&AHz zMbJC^z)dIEaq(aY*gdDl4|fdm zLzi-j_w_^<^mC2C?g>ACzYxb@?|5g&07qxf5OhBVcshGy^?ZPjqqA$gi>srHkEfq& zyr-XMh^HgEDpT z_=tCb#IduFKSm^nJH|VCItHUTJlrwf)5Qlp4TU?#hr4>Zd%)cQI#U$dV=qYrC1Q{O zXeJ1B%OiN(0FrPfcoY$45lAIua1c`jRF4*eih58(0AT_s!)1b67zm-X#2nC^1+qXf zXk9R9FJ%dA&ru4p4WM}yRAX~NJq?5j;JsiepaC5;G4Ppim|{2_3)*7~wzn8j5EMfX zPz7&9h8_|LS`7i}$AXJR2FM=e)I89PO%aG!02*Qd9drrdfZBQxR(WP|Drg5(BB%va zl3##me;{$<^YTH%6bzu%0w@+0fr|G0f_T(2GQThhq!d*7ftR*|6@hw?NjZt2%hF1U zj6fUO!CiX<8+7k*9ymzh(x79?GSi`gpb@J0;?gwm>HH-{kWE0~{sRN(MDUV)P!Ad8 z*`nmc;?!i&7V?s!ksI?#(vWp*jOHE!rv=a`}Ur-5= z1C4for(ci-A;YXCMR_Tu1#nO2fzEn?$rL0NWrG}CoLT^;Kr81;ii%5$K!b;nbCf|_ z%rjF#R}+*b#pe})=D{F~D@&6=ZI@K=DSFAEqZdHOQG)~v>V==467iP&|0*6($Q2 zO3Kd%ohE{;3OxJ@Q&m(5ZP|cTz%Dz64BJ7~zyv`V6eK_$?s3ZUzS(iz}OxbpLg!TWnli$SNALC=yaW+*O8jZaG}0&Qjo zk0q6X=bGTdXrOJmWuQu-A|A>tNJ}dM>jHOPp#x%Nsi1L$w1VPH(51d*so;_bR#$>m zgGwXlm?1+kD3szs7i{L_fJbdoQxIaHI6~%wt9+OS(8-XHqp(043gVM8^NS%vw@`j1 z_=4YZ&_zF>>*zokKOTIE3Pc{VZyj1RfK@@RrUF+W;7d)Q>Y&2#{v2p%Hn9loOwhm& zIK6@OgLYnnx>(@5oS^b4sb!!gx)7sMN%S1E|4K3F%;fGE*u<5!i{~g9P%6 zpd#S&KS4S`c`-f@Dh%#dfeIGT(m{wyaE}Bu_MMyoH4SAvD;#ZYRGT| zWJdz1zymL5Mud4md_f85-Xw5m6QmVf;eZ(6jo+}mjt~I34q`I63lH`PIzJw?NftJV z0oDqdNdqf|NI?b=(PTik1E2|2r55GGJq5O}G_N2BbOr)QA?WfaXv-1Ah0k1oIG}KY zI14l(1G?e|q#Y^7!9t1g<)EPpkOnXxbQCt|1Q>`;@PKDL=#+er0tgSZXbH>%Pq!eu z2HY9}jUYiagA{abO4m^eu z59;;jg08qu1hwWNV!62>Q%jOFAk!A$Yyp~20p$(Qz)NZhq@|UXm!SbLXHt>?EawrQ_Di(m2eU}$NhYdjHf{zY?#0ZQTUjRB4zq|l^r4M-7 z7DF+V2TRfgAj66hQ!*>y;adQ`->Mu`%7Yrnpv%ueXUeAK7bRt;q@?CC6l2PPOP0!9 z=(bewuqCLy3LccG%mp`1D|11Oa)#o{+>%7lnNo>GpiwE%9uRP~mXcb=0FD+I58f#N zDS>Qy1y>IcRgg=N<8wf#*Cv*wLj@~9mlT7lVaPcvAf2fwV(}UIC6L?=lLIvwpr^-x zguvt1;I&Q=Bf)%FTL`Wo4YG_L&IgsAX^>0rQN%#00m&TbdRDj+Fh3rw5gI>eQn{(% zLuk=NK^{y=O-uou6oX_sx?<3p2PA3e#3e$cxUv|$AQ@_U4u(TADht5fy&}+%8z{wr zRDuM{(le8h#WEpTJ~1aVu^80x1*rqCCyUQbElGr|RDp{X$Ai`dg1DeDPf+wgZuLPI ziHEd~K=n4VRB>t!s96KL%MRidm?=mSkgE=%ty&zKA?G_Ft0~O`k1ZF2dSlR`b0kk@ z6y@iEE;NMf15T{~?Q*RIb-p0N;PFf(K6r@>62B<96zp7>F;G{hreuPz2S8N`y15G? zgYHVK+Ci=a9rcgX5J+DKuQc@P1SB<}Sp^g)g9H#RV*u^&01d%{(mpgVgKpsi4?u&i zIWGmBY*&n;47#2Qa;Z4D9R+HGAaRRQK{t$pj@bg8nE;gl9SH-PEPxvYO8;0@LPnfZ zK{GyZ#ZWOwd_f!t76LD}gs$}jD=q;|Go&Vi4zC0+%BU;`jiy5;_P~ew#U~aOfwtL0 zB)~HeknSc#AT1wsLUTN5;09(MsGbMaOqrnLBO$85Lg__`Nia2;pal(}LKPwpzAQGr z0457*=R>5x4M$KB2oBUV@SQ5)#b@!L_C0vky0RE53@X(?r9W5zQhddOMz}#!+sI;| z;tgaM=yqJtcsS_#>YP-BSx~LuM31TtECh22R2j_gpcNabplxCB&;W_#$74~3A{YpW zF2mG-8$?hA-~tr3t`V#NJPTC`l?M0n!NSm^R8l}SIIrwkVJ*N>afW-6SSu=46&+rWS)zEO_BV3QV>b($OqN=*N(O&Y#97mX>5-NG5?! z(u24FZd5X8CJRk0EfLiAMHei{Ey6Gn)-6O+n+{rZnh81|3yUj2OX)%F$dpXbF@QM+ z7>4G8>o`!Q2)Z2`)K@N!FUU{DP*dX==gZ>;z3Zy2qsXJ zT9%f_0GhW0C(*Lh_=3z7P$qx~flA5L6wvO^3lF@&`?ZbG3W|gh<3<|6@*P7enm+KjO2X0qD1hVoo^B~Ot z@U=-0K}6{TJ+}+o2Lxa31GWY#3K^vabq^6zpi3>lYVuM`K#P?@3qT3Nx; zGr9A@tA9~MK5ZSCaxfnD}1iE9msI&mo>HjzN94KuYQ9x8~aG(ak01qy_XQlLPmU5a55 zU!0i|pP!TkH82yJSc)^#QK~e=nVAre7NjP}7Z)eNN8(XMAv@Yrpp)pRa(VgSwYCsJ z&>|nCY7nw6sVp}>u_zTbeJd%2CV23IA4Jsv=7I`Ts1=~)Kt<5{3pBM2 zFIFM)$Z4@O57gKKH^0H|0MBC-rKW?UEHkwns-q+mT5o_R{NhuKp@x?ggO0udYb*yH z4Gtb?g%>g9`Pr#?@hMQ95FX4~piUupjT1yOsH#JWX|Q}zDWvU|lUf39zU8BHVM~!f zhJX}7nmpi~0(Lk^49o-F#s^aboeP62Kne~}+=7}5nGpX$xZtRO48wtpKoSIbm!TvX zJbD0L-45d9=BI#exrOt=o=8rE6#SrmUOZ zK`TY`(o^G;!Pn-2m1CEMc^52;qBRpVC z6&GiwgSN@!rKc8yHmQK;Ym4$hd8i;hDZex?CBCR6A8Z$dSCSu}k(iSfU!Dg_0|oI( z1!?g~kdg>#(=y0xkW6wSc-?t%d}?wY#E=5e>Qd0eHB1RCXp<8`nG>?@3M2>RgW9X0 zURg5eWa)Uw2`x}*(53=}$;pY}m0v}vh4IN5nK=;GftLG&oCvlX#)&rqT{-|UBqs+X z9dC>f0fj~m_*grrro8yn#G;%^$OWemU7%eU1&NtOklj;YF;F6kPbr3lKV-ZW+`Ry~ z94re?dXSk2h|yrtqSU%#t_Nk$8K}&a01@a3Z{G3Ga!m<3M zR0Gh29JoCIYH@>vq$cKpE}+fFnqt9PK!?qN z7R@262krky=9lKc+zh%57*rb;r9$#XMrK|~G1NaGInbu0d~h{c02zXchpI$U0~Lt} z>jfRs2|kn_W?xZ!1!$2MC?twtCWH1X<|1?8Hh^T{4ghhWg%{);GKiV^#h_z?Kno|p z{Cr4yjn7ZZhZH3cr@@4wu7e8Zf-lBSO#zpN*_p|Z(h`&uN=rZ^W;vNL231v{=@5v%RPb&9&{?<;MPM#CJt5131>ke(V3kM* z9Y9oq1xj-vi64A20;s}HEUiFDg9N~9Lf|HVnn|z>16u6^i7}{-VsOa=Nly?VSm_R$ z4~++JxPwfXfz8V=&x7121GxnTd_@dc0;L@Ry4wX51mOD(Aw@a3Y>h8YO@&k>FfOEC zPAM$_DbGkPEy^q|$xMditW?mpfV@>r<2SAn_3o z8q-KF0M%U3d|zA%u^Oxdk`|FuIY>AcH0oSjnFp%|Kw_Bb6(kC77sMwc*$S%MK{Bby z8ITGW!~qE++Y99*n-AJt4tF|;6OXI`6#gkiiRB2ZKeLP1b^1?fUj1RE;AW&lJER1Tooi);dPSOY%h zfMQTe3Ov!mZHBB?08fS>tAz-I=Ri<|p#$xp%j8fz068lKo5P?o>Ch~Puo!&0N<8RT z5OCWB9*kh`Ky~GU7h<8>1j#gr<{8{X@S0*!+Y?kbpc)75!Nx;wNkWwa6;;V4kg^MI zRvu`nIr#7r6w9F*4%FsCH3X7fk=kV-lc05Gd}0oy|62f>p$6?n0-Ko$DG1Us^T665 z=4Iw(7H6RPA-^a&6`Y)4ZH8RX=m02IiW1X7>k1$`p&ZzyrC=+-*HR~f7Ak}H{6hLR zX`nkE5zRV~_aU1Xz~+Fs@PZr0iBATtwa5ppt$?;FKr*1?t6-%hTC+X9D8C$@*1#O3 zCK>W&ryys7M&m&zLqHBv0E?tR%F&FJB3Mep=$s%6fKD08NraZQXcDkAj3Nx{=VhjV z)=s5W#)C@!)DlF|l?f`-vyr+AnR)Tx${)3U&&&h2K{69_Kqq;YBkK9gym-uVFEbCU z3KWds@sNUe(4sy>7cesq(mevN4FiQkW?nMr&RR%S4vrqs*hYL(X&QJ}JiKWR7EQ+9 znuW;0dRlN^Ji13ROX86u6s#~WKMztOW+x$R2h|RsS)XK(^D|2j-50PHaQin6S-vzc z1yU7(<;x+xLNFV>MGF$l1kbj|gQ_T4ODr=Fl5jKg3c-zIs8c|LO7X~D-$d|EKS;P? zNG7GGflg`$%Yx4Jff!N@iB#}7I7aMObEWd=aef z1hG@|p#B3L+5&9~gI2O6CTD}EV?axIpbcNp@KGYDaSYD#kVKx75+4-e54qe7(hvb( zR05h@$}g$}?V%|yE-iwzqjOTzN+9!q$pw(MC#W}<9}nukLER5IZVEIW0`?+$V*+$m z4tUN7DqEBd%BP@&53w6859{QCi(jxjXp;cU&$)@9mOW@#0F)!3=2U{tX@`UZNWK)j ztpl{&7dE~DIiCS^`5R~|7O9t;o0Q#G z$<53w&H#1B5Y-A?2;wY=lk-zjAsbs^JBG5rv(1DfQ5~K<-x11N=iYSypkZ%3sM8>;KMrS zAU?Mgb(jqfCe@|>tRwM@e1OCE~F?)Ey_y-onVp- zvm_5R$evsf4{HA)s)fANa?o%^Dk!mnr>;RNKvP7BQU=t{L$8za@=HL?r+CPjPatQZ z_9yf6^W#x2!UQYHF9%-Yjaj@Y~0mR51w8{YsK>Z960!34N8sy9$kog6PMa8M{i8WICjzH~nh(=HvHi%CGE&m29gz(EVprs@z9jAg_3n}KHgF>K^1{y+;QKI;g z9Pp4R)X>trRHXhdXmT1NQCge4;1~LY$t|&Dh>=js10T+bTt6%}pP4}SwGm0um(gD>U z@ZnC-p_!1B0UAp{N%deUSX&v)0T~Lt3K^P8;KHDs25~mzHfs1pO98krMd~R*R3(>z z+mYau0%@?q#q%mkpu^N~p`sE{ivV0UV-t&qwgf>nHApGMpKz7nk_5U)21&5A2sDrm z&SHts(JGJupgFBnP(cVEHw24T=7GEjYA=oB z0v3YRY#QWS0BSHu4WhjT6$CfdK*0;TQxSARY$;?+2i9?cl+=)cL1ZnU zkw|#Pf(&_rgh1g9$?V`m@xWt*u$BvGz&0f{rz9~RIur>K0NuI<_5!Gq1JCC{Y$+)L zP4Q;tCYIzw%_}L1FDV8cR0h{w0p3}K)cz}mggVp&*nQ)WE8-xQpooE%3_^CaAmRx& zN(`O@Lo*0`g*=)V=w@j&A?Q`is1`y5!48H_*%rhXfrd{&l^ba80Bi^-X}}qvnPqSQ zLXMe*wY@-UKsUaEjspVO0p>%RR>`otrQzbB8XZ*q!lDYS7?MH}_JETMoC}(aPby9Y zuVIIo0}_J`$AOFh@j>l46iuKTg;51S>zDx=8{>1T?%0ZNh{4Ik3?iq(B1QA)gFtU#5cQR^jmi5{6dgpg}08)p;rL zkWobhKMmUN2OAGs0gsTv@CE1=Kxo?!tQ=gY8XzmLL&2cMLkU0b~St zX-0A$q?L*y2zDBBP5@1afs!UD!Dr@`fL4hm7l6kxzy^VK-l3ZVuI51j32WPd+cyw@ zfQDfp3#MV65=dy5f|hCIlq5n_fe)xct=OTb)PtAyfbsxTA^2Vw@W4W13S?y_$aRpz zGcrL(S;0yWh)`~7E@+$pUa^1*1>|Nwq@@S#8bF#JP$5vW4b=OF*bAO;K<=@F!T~-V z23mOpTFnGn=L=R33Jg#Il3NfDor6RYfwm37BB0HismY)dtq}Uao3KDx6r=*wqXHGr zaA}YLY9kz^45SB=mg4hKI*f3AU=^56$&&nh(5Wkx@sLg*BnZGwA5fzORyo22Kz2cl zEXvG9v;-h+A?Qh0O~|R^D9)SI61#4H7Or- z+5yP7FwyKJXh{mHyOCWB9WjOVTuO`5A)8!4n#)WeIRdO6#L3SC&7mP?&7oqj-g}uz zJZvfiR7AqGrR0M;j4&Q_r3(0Lc&H_*pbZDf1)y_j(?IJip`D;I6L4D$G*1uH49du$ zt!1cu@B(y*ey{@2^0Blum>ST9iJkrKkn99bjE0NMQg=$q*i7 zj0n+3L>5JK_>e{64MB(?C=I}x1PBpGrxl5hQa(b&K}W7Y+g1<(P(vA<-YOE~3qa?V zgKoUe1kFjoOKg}7=&IfvNEHCm1?l;~g8?jrQX@b`;8h&h+Yq}z;SH();?wgXl}auo z4MVDSkeXc3$S{OaP+SQblZT&P16@p#8;>rL2U*mJkjTsft^WXDv<4aPLNyS2=1fU) z0YXaw=+0~uk+S@plEie-Qg`rdEkY?=0#edqO2FMyTnaj=6103gxd1f8Uy_a}K`X$$ zJ@6QJ3Mgg6&VeXNhO*)zE2HD{@(YSU`%U2Dki$a}>cD)^00Tq=1Ck8ra0mo9vlwhA zI0M5hfm8@!J-L~AnT7G7gY7_CAUx2Kb|4;PS$74v#hRIy4mzEPp(HgmJ}aqSQ3d$pQ=@Hl&*j zVS>7Q@%hbg>cxsPPUS`+x{R4^;*oK?hm( zkE)|26LwfD_}qTDW>AAY2{iK!Qw|jXkI^CQ0Et2dCy>?QGqj{Q8`DP6*5I5}h_Mi7 zLnmERGK)$ov503SrQnh(N(G(sn*z}UISL}PG%vHT6ly+bBTI2S^ng^TGVoq^u-^-c zQbFYtcnK_MjsY~}0Wk_|K!W^_=~N_9aD@p98x%2+3&9J~AV!1QHlRUuusZPJdl2!G zL~zjz62=y!pr8azG@-f^B#PCoAPLYq=B~|h1px#U#sPhjKhYG}lPW_8dF3K-11~sx_ zvfv$ypk)q_$yxCBLZ}?b|HT>kIiQ;b@=_qHr4zyD1c7d_1vv+<0)8?sP8sm>V$k#| z18yZniJ72bPlSr1%mNG-SAh-!ODclwpMfkqf@=WFK@JH5Z@|MU0ZLq;sUmPC5A`at zMp)s2ECpIqf)d(b4VlHDMhs{k0M(+RRA@s5*$9xepeQItRSOaVU4jk^6|lizLAX0W z=inEVg3psnPAp&mAF>JBAe@;8+B=?^j1b8#hFnOI0ud^LY_y999ePrdQ2?4e10_Z9 zK8cKS29OZQW8fo{3P58k;5}U#kU2>d(fG1lP>~06JM^5QV%Qmd;N_7J3DCh=pb>*| zkS+0O5~v!$mV?xz3WLl6Eg%K$^aWi}k(>?6FASh`mY4!!g6enh#@r0BGLZ9OTXzv6 zpivVj51hQ=dj+uwLg#_NSps4tSPQ6JtAyJN7RpIYOaUz(K{fI8BusIdi8UYrX( z?G6+TU^5}R=3ry6kd`CFn5sl{wN)jc_6=z4GovWKq$DR5bRY<5eO^&&a!z7qF31+J zcuIUmW@-^=I2`Oys8~)?JZR-U19;yX;x;i*>Pt*Z1NCq!vB^Q}WYF$7aN3PWXicps zfb0-QNap9I7H8y_ASr?+N{HE@)R|HV&R`%-DftMM5Ctju(4n;Wtjx5u%+z8t6Nm)# zdKC-{AhMu~S->kak+`4}W5Axx%g?9+t#$>SO#m75gG36*1z3e`1WuOr1X*x8`U4|MH4$c6F9BG8TfAaNv@V|O$p7l3?= zq!jE4Y+`6eg1F$F%mtu42=@TgtI*^DF&DI5E;A2&*eXPzpeR4R2!63K#3WE71k`s0 zMLsmvz|}Cg9tV#bV~T>;>VT|9QVD9|Kx}~sLec@U2-pVDD1I_%z9=&#J}m`0`~hJX zrGlF+;Pvwm5vZrY4K0R}Oi+nd2%$?DKwJ1w8z`B%sb(gi>s z@u2s&BRd(g!55n&K!;_PfR5&c>IM&&KsV$=gwj&t6LS)aazV>y;3CPO+f8!7Svfbg zC@m#E4ZMIGa-&w!)?yk-Gn6I>L! zJr!yZn1{%l5T}&n7NNKmdLt{$vEZQx$kZ3e6bKi*0TsbbPb~q3ImA|o3Q(Pj&WDc8 zBlLkh1nP*QYX;vE1~w-JVn#7&6@Gjk^q6;W5Wt1NgE3%bpbNgtOyF)saA7$JNd$bQ z3dkU+7-%b0B52WOW^O7}D7CN@G{S-qC@xJxwx=W?R!^gef^#667__*68VxQ2Au7O& z5KD?m^O7M&Vt#Tu=(GxklFa<%bnpQ>AVzs+UU3yztT?#@)Su1FPcDY4D@cydNGXa3 z-AtIBTFFq74Q(TW(hP_PO7G>M^_8GS8~LEMui3D62H2(0nOwMFPHH0L@PJg1?g~&K zF@O$!0w1y(59$$tNAZxvARS`x9&@lLXbiV3HxbMRwXTXY;&XFLA>5o&&|=G+BVh2(!WFfrUzPlJfIFo0s9*K(`)&58y=@3O=Y8L##9fdSDgE2M`m%r$B){gQOWG zSPbT;CxUt%AbZic@t}qHxw#Ng(Ax9VGEfzllLT&pgL?+?#gG|ZR59?82RTWQatUEE zWMM~qK}kw#aWdFcs0es#Gll>nV33tT*4TlL<$|nP0_z2rWf(F!NuUN1q^p{f1Zqzg zmBhoM38D`iKwz68{LDOXN(HCPoFrJP0rgOz9iJR%XRio!+BJ1lh#~*(?m&Dg<7$1yT>P4B`l|Z{b2nch5r{3TnoK7V3cVMG?$- z1)x>IsRiH?1gsTQ!-3DEfvSMiaiC&8A5;s1)u4!h?8l}S5h9s+kh`3aMKViZC(eLP z1h0iJK^$fcH4xpoa6ZB)P!SB8r3ZCtAV#K^!J-B%2lfmOF{s93sCD3t6p*NZihy>^ zWfpfK~G7@hn$;Rk{=Jfl?sRE1)5re1?+zbkO2*us1AZQF7JhKcl2CNQLP!>YF zgZU+iIiO?TL1S!?qxnm~Lg1s(!3W}l>n;X}C@4$E=R$9g0SkfpQAjG_Tu|}EP?BGo zoB=ukJ{}Ydpmu9%L3}xA2V6=%Xw4Nw8e}L`DI`FloZP$;@EL{RScHn@<$}&LD@o2s z0d1ZH>&Id=R52DANdJ_f1hk&G6f}m-LI*8# z1NEGtg2kYvJ4K1fphfM8MY$j!6~UX4=;CRhB7^~S>=^z_AV$3An+F&9st|#N-T6-JMxd2|gz; z9&~6pG=!0if-La>b@PkC{r$?!RM3eS7=fFVS(2Lw+S>>kzXnYWfD3rY*;N>dlN0lx zC$gpD3Pi{Wg`gujlT%@37gP`EHc?E6LaJ`qL~g3@@9 zG-Q4Qd_xUZb3nUS;*+7%ci2n;HO)b%He!i&$V?>oh;L9%#ME7q0~!M@0d4I9wJ0zY zz_JHu!z8H3KtKVgFP~V6)w?j0aAY)OX^lEoQJjC#Fj9(Xe3K!6)Nl zD9BArDFf{a1yyXIC7h7!+c8TrbamhbI#^6AfV8r}4OP%&7Zz{krsjhE2O4q0RW5>h zGN4f*aKcT&l_Wrk4V3*rQ3zVSis2sccwuHrD$ZSL1XhxF~}vDvF03$ArVkqEx85_>}xy$jOb^ zRe}$!#3>b@RGN;>Igq_JX^D^CUFUwi9Nnj zb29TvE8-K&V1*}kAHWsCj;X|E8(a~%D-W5aAYdF=B{W}PRaydz==j9E{5()!Dizi} zz@Z*=@e8a#2Hj2!3R7Z~f>st1qpkon<%PxjCGqKL1@Yij6wrY?tcoDlFygQXG?WLv z9}H|3WF;6@Qy>>cLPle7m<94TsI<++D-Svr8mkSU!H;;*sna;L!{xzi&9Jsj?A&8Cdp)Lckxf@-_?jMDT}`1%e^cY{@f8ZzLU$#9y7vGfCrN%`fV zbECoI99YZ&Edd8@+bhP{UxZ;4SSe&TEe?aA*&4D_45ymB6!1niO!Gn0$KV_OuxTxV zUbP86Nx2x5tZ=9*$p?4*z(azVb`({{BNW6JmnK8@Bx5QpDTj=SV6mk%8FX|6s2vO% z%*Uo61vG{R-gk^c7PJijdnlBq6qK2PN(RubW$e14Yq@dghwOp?pG^X~kqvYi8)hpF zlHouN_;^?s7n@xWvyclS+^Rsg5rFUM!f6}$6kzPl9H@I>Dj>%hgSH8#;bAHw~Rv!4@na6^Kh7Fia=|4`4%1V#T7p478~)A9PQ5N-FMV zCTL6rbonT(MU7?<(r6sG*amgMuqa7MiO)%_s>JOekU8KhIO4Nm?!s0Vfs}!V#6X8j zW~M`C@8Ussog+r6QNjVPAwM-2d|GxYXkj#HdlD8`f=veXcR=UhgKj27P1$g>AWG5_ zGjmFda0DHiTIfPF?7@tt7PJ|&Ah85Arib2r$E6b6@F83+=-OT^9w|vJicf>I#=*0; z;FGg4!w#ej(r7273er`=qY6Be5)U3Zj|cA^z>EUWnck^I;A#`JQllJnI2QJ5x-0`0 zoseER1}OlK;>BlzW(Y7EBM9e%R3kf{pa#edjF`P~gpshQ0y_YwGjsCuLAN`D#+>jt z4^%wh3l0LI2@VJFh8EB)Cg{u?9KnjN5VYw5bO#+q0*6K=sD)mM({G@qeECJ7!$>mo zi!w3BK@mX(ZRj9J04Vfu8Vnk`1@&z48(NT9o(I~F1KqHI+q8nzWKg07m9RJ!K^Odj z8sfOs6oHRv!4bAd;g78+iwF&5h0xPlu#{BL7(i2;51K8+;Q;V@skHneTnREKJ3be* zfhGrZWLarmd`3BJHzc!KolWCo?}D z)YXlLcn5nK1+g#}GS36r7=z(tuyuKfdHIkfz69I_%Ke~95sS0HcYr~v22j#WEdt+A zg(bN_))GQgf>&+fR+*a!ts#<1iz}hi~DcI%N=gWIINvfLD5h<`XmX zz?ZTVrKVw-2LYw&f>OweaOkRS43psU;3d;oq`@=xpld{-Em&N2esV!6SZPseaehu& zDz=U*#64hDkgNHy_`9GKJi1m;oSca(XiAGq@^e8q-9mD6dRhUdIVs7Yz8L5LDy(v# zeq4NVegT%qPRT4n+H(+(ZM?iJ12ij#tO{%W3>xSMO>-rdloWx-!LiIFgN({e1h%5vE=mL)Z<_-;1u{Lg7-ttFrL+Jt z{t7vr0n?JyvP{safap0HRLsDZYhjfGEqcT%0lG&7qib815f7fB#5!{Zlf+Zcfi-7> z7Ept3-z>t_ZUZX=Ul5Bvod~m|2y{6Jt{NSzop9?AgR>S4fm$P*u2$0v(V|L_Z(gH3Myl1bGl=egUfjsVI)m&n8Ay0dztR>wpU= zdO*&D7zk4eSqG1vdB8T8<`t!;K@t^sM@d0)0e(k7G=R(}pspBWOdI65V#tNi&~t1s zoCMn109uL(n&Zb>aik%u0M(LMQUrLk0otI1Tp5FD4`_N2+z-HE3tS#oA^=+g9<>5( zu*2mFh=QWTvQ*G%tOeLRbKnXIHn<#L2yLZd8VSmi;D9d&opXdK4_*v_tH6Uug6_5j ztwjb8c3?9hKP44(XD`U1pv5@Yl)zSF!QXwwKqO_>AEHxRl7M6et(8=96YESgVB}J(v zrA2x1;5$SxZG@=?t=|Qm#h;jy9S_I1iGXJasvls-ym*PpcDyi@MBSunGRm~V!7C^?) zaP>k^6=6+kxw#;3qxMz6w_Tv8CoBrFb_sKHA%z4e(_---sMS)GnvS_96ckgr;0p*b zY=+#8Sqxf*3YriA-!_Gzs30*Hw9o{LmEfuZq`9~tGY@prAQK~n}j!wp@9edRcoOA2B2emv4kbc;n~kUs4L%r3+qv0g6>jlMySnz)3x)s1#=cf{v_%7n))- zC>eBsIHbe?Hw(b27Szzfski`fG zQo)Bcfe-KoH=wcQGSIPippA&2n}ZTTo1hLDt{x^V%D_c9u7Vjw5jYuO@dkL+ zD-ks#Bz8ar666LyaJLGl&0tfp*8&iO2v(zL%J4cLl)OM==HN658sf*AD!^_6E5#pb zXzK9V3uEKLEQhX_8r3v{Crdb$Tqm_e2cLM#W3b7QeD z6?B2I45>iefU6n<K41YuK}vyHd}&^0a$<1_=!|yA z=6Wou;$fRaVeJvzDv2@K&zD@L$6rI+)F{K@^cGvK%SMTn?M6?eZgrLXch`&5pLIj zRg`8X<5vY%NSAZiqmZcTPr-ADu=)p(mZZ1zO%7Zo-z-b?J6&-l*C}y0LCzgPY(=Ez| zl<%Mu-7ri`0u3004k5_Q&BW%Xa>&`Lr3K&v(P4HJ6(xcX{y^bF$BvNZFTlzWqrmWe zZ=eI5!7C$RX%f2Z5Zu6t2aT^FMz=AfkgI1DNl?QBX}}Ou4vS9Iv2YupkG%vlSu$ z+Rg*2rBdOiV!*{ATkuhAE-H-AEG`C}><&rEV0RW3#$$RE+`B>13pxJ>i+4)%kX==f z77tmw4k_|rMwEi@1cy%XfJ&B3&?%7czHl<=#J;2gSPFwqLMB4af&ujkpypsopd}-y z0@yV&Mfvb!1)wsZVyX((phXeGZc=V`N@fvuDd-B5w4(ef(5;hERd58nxBTAH;By-AT1y>kz587!lt}559)3t^>8sv z4WL1rocv_?N=?L~b@1|fmW80|xv(@fFB!Hd977yaALzKl9MCat;3NQApq-YQmz)YZ zA+V$^LlLqV+93y|qPYzsh;Us|ZhTo%PGVj*%9L(O zd9pFIaSC0b2y+%l0+!F?ONwAix4{}x3n0;otQLCGJ0wa#nn48RiCkBuPs6={ZSt_Uzg{%jfC(+#jYQMvdsRBC;Jccvmw1HP5K@9{C zL&X=R7UUO!CMjV~0J|U7s)jTgU>eF&^GaYcpyC;Hr%P%P=%ymDZ&7qYJF+NRq3I9Q zb%#vMVv{XN2OZFt3YwTkkp_iTep(vn*aTeSplg${HH07zLoy&9QP^ME{auL85Japfu^f`I@J9wh8NsN)rW8v=U{i(}4XCQH zMFNtF{Jav-u}1lMC^ZSXKe5LY!kFCL__AE^pdn}=0lLK;C1??9VNr!OPBE2X#3(`u zc+3xeR3d2f6xGU9SaA*U4)_FI6cwN`Q&5&cir|XO67aH8n7WD*6KI*4k_b6`0XBY; z3YP+{vIX~!uuGv7NFYt%9Z!%mPEu3i5vP_zN*Iue6nKju9(u4Tnp`ocOu{M$E*4QE z6KWzv2GKGAdmtqdGJ}LNG=xP4a{D@Llo6sJvp6}iC7utunIH0z*hAQqy@fi{ko7C`lZR=>d4b-`>vQ-SFO*qLJ3dKF50ZclLzc>i?TCcQfW{`EtDuo%EG-#aS!Y9% zB8p6Y5%~5BM8*a;q9CDwq7bwl2BQo?oGFj8XdLXEto+iVyu=*PnSMnjn8^iIx)|2l zL)My;ni5Zh4IpKpM3IU#1PnF?oD?wJj1UD~kce0m0oDTA5dv{5WON)k2y&C48o+1o zq05w}q*UUO2Q8NcFJFu=fE^hLu`mf-HbF{vR5KwGp!mQh4lC7=3zGpm1KDbDhXk}~4Kw#4NugytSiOX)2O)!| z1$zH9MzIVNM^g?-I^fz6*|lI{P!9*Cgh7acn&gNhX~8=XK?jk5!xvGzVThykEm7sc ztteb7z*ZwAaky5v1b&^k4NnF2xK_P&XJ_B*&M4?^y*G zDG+JMR%=gxlt@IELPQHhCLh`)0EH^pVJJ4D*W6$|;61UB?2D`zbR=RvIR27q^QMWJ|s~hDa39RM!X^_L}WujMHzDD2KyS;Uj|#11Yd8BA_oa=G)a&K z#Gox$JxBVPDgmAN12zUZv|v>Z=-fDL;%Ej!rw7rC z1LT=Pu)Cn@!07_gc!cDC425O6;F2>wHyfN#kevV)KwnW)gPcoK)yG9ndWfi7DU<{o>1$K+9O*S|JyWA`f(pZ%#>SQECd(APcy^1|I4{9H^QG%G%(q2dI?=XlXBGXFJ%(NMnMaRv2i_ zHRO_u_`H1R?MjgP1hicg*6cwFI%Hwc(h#T@Kz;o*&~*;5fJ@KGPfCQ{0062yU_(*q z1)!-@aP5iMXa^Q7OU!}Kb3%_mhitZl+5x&RFg^n`?}#i=oC`Z}1A0Ly>ct;0LFg@i z$Yb#6Qiy~LlL7VjV0IOOR<(gn?gL-E2@a!-$^w+K0?bF4l4%4w$OV1?K7?BUx*rOx z8^SL}w6{P4;5dR>nVAf_S{)Jg;BDH)*`S1zUj!X`g((FM{eYJTg3=Ija6<}_wEUvf z%=EnYj7-obCD_hXclbH7$SqzVnGPRrxb(k0zokwq%gj?C>hbs0S%%d$1IqS6cK2np&)5c z+C`dNKo&x4aw1D1ohl4kh6_ohpt)wms(2J}BsV~k4du{5J4{Fcw^AOLS9K`I($1gxXwU6N{6sQv`9zYos8U(LX`pEp9<fZHyD3SdV=!{P~L8#ri0 zxCBy~Bqo=Dt8iFa2W`uSc27Vn=|Oi(fSL>7cD$U zFtvkfDl|XBOa_^bCIuRF2dzpgLoBAv%>}QfgA8IK3e4PGc=AIt0~&4+FN5+WeDEt5 z>I38~g(3#(L8TQX!baOs<-o_KgR&EH^n>gMrx}FL;X?7?-F+CU!Fw`OKxa51^gs&> z@Ky|zWQr_-+~+{dQ{Xv-45uO#D{#(tAhd&`1?m!T?7$iqSXIF8B}DiRY6EB^R%tmDTT}qol%G^R4$0N-a!4#tkWu}3aNP>>7L#jpcQb9LlLzgvz#6b-_668ujn0N9^GSk4~rFl>x@CgCQpyO8)Q?j6=i%==h zS=-?2vr1r<4Ok>4CmvNGqZ~~DRR5zY0nHtt7*d>ytOtC_OCosVBV_M9+yxjipt~(# z?JS5|XcCG~&M3`;^-!QPpb8nfYaeD}ZhT=r03AC5I*=!|0<@q2s<;p|2m!O06gWEfva3%>joRl46idI=Iv*NG;0Dhnt>U3OYR-bpAIE zSscQdd1d+8sqv5oA9$NMs85CF9GD`|@}g91?#;$2lb4^I1U>@<$q%r*^pF;Yf;?SV znweUh3|bfh?z5nFYCsB#Q`3{dR{_Htx?oYzee&_3y#twfu(}Z>4ql6p4$EsG5y)yk z&}~1U>-j))!imMOd;*pSU!n(|MMZKg_>N2@qf?W?S1N+np@DBHfvE*;BreV@OGSw? zxFE!GxY~43`yvrMCIuRt1}$PnE`p0vu_*u-zSxX_R8Lr>!7&ONMnTmD76xlV70)OK zALN0>B`_H*c4U;p2C@+gIv^WvIF21O^7}TPK7ii_VxtaO#;M=~C zlK_%1N@zmFF;yZf0&mSv&P_qOXag(+8h?U1yf`TyvX2j3)I*X6Qh8FG6pu6q2{s#9 z7Ie)GWHdAtw96u~7=HLVWEl#0JQXg5)=`5f0p+LC63}F6YEgP6qIQMK7Jy1z=&hRY zx)~w|SqlU`mK1!E6rxEFQ31W|I38&g45kEVmm@4N!2W^h0-sU|y3-5dJXqn4Y66NP z3C4+qDg?yp2jDU3Cl517ZgEsfUZ!(Y7}S}3yK6dmcXG9581hk?r2a(hNWtB zoh2{{tce+{6XmKah$E52aqBB8%>#7>Fl~fN;MNI_T1#wCWMQ|>fzB*} z_u-3E3t?+&5mNymLC|F#psb$;x)l{32dRa~*D8S2p)AY<4Iaa@An2F{nBAG_pj9s^ zsX3Wt@Yy8D;_mo#&=swSUTkr8Ja`feRHwkYd7!HeKnIqCWzs=+lxOB64h1a+oqV02 z9G{e#SR9{|T9%rF5@eXND4_zCPDv~PjW&T#5I_VDvLw<5MVO6XO-SpqP{eWCQVu%P z5tnJ@nUH1K;Kj~FDZ*_J#3sTIkosVSgXk4N4q3zjQNE`yZQX{GSNUx-9% za#?&%YF;|{QXkOv6L^{cZN31HhU1Vk}E`?nR2s&~hIX^EQ+yF}jRZ%b_lM7(G zD3Fg%1F0`4%1?r|0YQAwSrm{3b||O0fTdEC!GkHt9ae}qcuOp3`n@ajWI&pFgD6B!5G9~O3Y4}$ z2ZqEaXMpZc0o~@B2dmZ56cm&~w>H5d2%^8B6w>^G`yDQfw5y&_*yJWV}hTtI*hX8`S%hHO?rJ2Rp*tvDk&B_6b^EIqLVQ4PYx^K+4o zK0p;jtHPm@1x5Lw;dq=T!sIhDlTwTFETBGvYQ{WA0aF6IwWS4_rD$dqWR{|<%|lE% zmKG<)rxrk#IHK*(fl7hL-%!WPpfcbh8fIH@Qasw09W>+0Omd9kQwkBg-oXOM{3IiA zZGcqWltG1%Z32m*7?Wfak8DbAJb1HHL262TVo@q=K_{dc6knWQT9l0FEkGTQDw&cB z9*ak`1;E27Df#K~pnJFBT1t{LKw`-GxjZQu(rE-0RxpK0C7{)1NIX#c7loS&E1b%c zN>Fkps6PevIwWg>x;G#pnCASVY=|tV=YZNT11Uq5LvbfuCqxZMHOx@ZUUpEg7P3|f zW!?bZa>G*#$#v) zMOQI6=1Sn(sS(;CVFX_rhL9*uf-F%19VZ7?gkf+oWS<^5Fz`x(>R$MC8j=l2XZs^W zK@EKj(?DrB9u#q)A~z3KK_Y1a1uewAn0gU%I2-~p2Oc(Q#nAEs$zN&3@t{Eu*unV_ zE7Bmd=cvlkQ%exX52h7^hW0@_P2v5{v|`XXT;=ik1)$xg(2^apumCix3fhJWF&!dS z0BVWEgO0l{hM%d8O$O<9VPt90T@T39D-bzQWdyoEsWcC|CrOwhgrxHia6MR4yD zd}be{$BEPn1{s8*C>z@Bf=Gf-GQnmz#4wa71nGbXqeT!{0+cI2eNxa+9%!;IA9@oW zLK31E&3)jKCLT22hp8zaya5%vf%ygTILym0KsPS0I1@At0INYjO-)Ff6e^KY3O#!s zw15d52YJPrpoAU|x<&;&1q2H8ykgL1#(2<%U(hmwj7o4mfQlAmRDv%uNy!D*ZctJ1 zT0W3o@I@SOMm+dBCy@3`_yWF^l=#$~R8adr6LiKU^aLP=lA_F1XbOVMgPT*JYwJr( zK>Nf&7*xoBHnV_S4{2_Jo6kk5;KRotEo88LV7)1odEhoTWEV3;J#3b&C^a2?P#HwD zs3IQP{bDF7Dorg0UoQr}$ri-V11%B<56|Y67Qm~eQiyO0Xmuw-6?8c-c<2Ju%>|Cg5b&kVHT1gXy+JsZ$FA5VD<1-vS?C}wWnbBAdG~ZLIqWc>T(bd z$(bOtVar0G>S60y!J`u(d4#zzDKtYsn}svM2ai<7Cl#e8W`hR*!8;!-A*U-try)Vp z+6V4|yVUr^qTDiz_>|NFP;w{%4`Ecs z!z7an3{B&c5{rs5!J{t-iQFQPrxE<()Dp;23M8R&P%8<1z7?pIn3f9F0$K+H3txzA zZfb6E4*2jD2p`l7232dxpb0aGP${_906RRrC@~415GvylT=2;qU?sVk#YOq0C7>No z;L~#|<8vYFA|P81D#0sa;&V$tqt@x^kj_ITXo4sQv{o@OB?Z*e0trA$Kyp4TeBh}DxKMsB=nf08 zDWoqC6(kuigHk+6f~#;xyTQEMLakR zL6beOpeO+yJf9q&o0%71oC=yM2P*?jBbMfs7K3Ip^T8b$no5;NAj49^|St&`nxc zgdpu+R0+t$A=o5v6RZ@HOhIil$iWYgGm;?9o65{Q=q=%SMUXZ4`KFDw| z7kt-raeQ%Va#1R1iymmCA9P-Aeo;2KRRPN63?;?cpy>$E`VY{?&&*tglH&Y$&`PUZ z@Tn*z<)!f{`4F4Hfe94=xfJA35Et5Vg)>3p5h)BM2tG(L=&~e;7-(=C)UAf_AblB- zS`aHWJ{MHxGL)25f-XXc2lap<9PqLb1Q#^+3swOt#ULucLg1?!L2A*&Kz&d&A#mOU z*#p;DP+FXUrU<-k8?Fd+{~nS8$RtS#s1O7n5d~hm0+xqF1#|&6bdCz44w^d91Td9> zcUmD-K}LcQeCP-liU7D_1L=(+#6jsCIzoyhSODG>QwCnJTmmYNL8qmHE70V`BCsz& zg>`X!W*)S-go>pmXUD^iRxPOnRRxG>N=Yrt0}Ts;#EU>f`FYSX8!VYz zk^`2>%1=rzDawflA6W<%0f#0mguxtG(B?o^8Rg^`r-D^N_$jHdJOJUtv_g2GBX+^% zKxI5c02ByFxBw9 z@c0niI8?`jQWvOTMKT1sI~GXGcvSuUs4Gk(1I=Lf^&=V^K-#gfYrfWTABxS4dmP!hLX}e*g!eBC&o}x z9$!$DUjpla!TFFBQV!1UMbMKViWo}DK@+H;t;eOwCHYW(9%%LeBmr7@3l1s}2Q+n* zS5X4(cruh!KySOK0F493L$@$7lvIFjGy#`hU>3OWs3-)DzvLBzn=A+eV4{%W8V1l2 z)Sw&Xi!zfygQQ8IyXlML6U!hHpi>?gO3h3_J%keQqEaMYW?nK94>T8y#0B}FG%-0D zwB9o%vl!GU0u3^iW#*)&r=~E#q#(-&u*sB^Bo!IJrYYd+A)*jn45f)hC7?83gj|t> z1;H5-Qo1Afpu!7uNhB!0K=gu@fl5(?B4~=tEGmRv%L`FiQUMyQC@26sy{H6|dLUAe zqykPk(1W>?N|Uoe&C(PGs6c938mLr4=0f(tLFK`XEhrl_D+O9cmRbT+4i-UCpIICa z>KVWkfLDScn*nJ(K@BV_1dpJh@IcpOAp}4P2f+hJYjRFvZb3ZgT++N`RK=Oakohl! zhTOyo&{^cAsWA5x6@m(77_S&IYYJ6g0$LmhYBVIn{Rc^jkSh{Fy`Un{iga+P3^M{g za9WyDU;>_ElJM@wPQ*_ zC#R#CViu1OfSOXA9bZ%d+O`JqC`c1%{Xf;(!_q<1YstCAAipP1k$L5c2GgRrQFnFuo6&XF)trddzr-- zRbUY;K?s5e+`xq*SY1Y9aYh=%*&rr(2m)jqi~|nW_>2^Y_d&%b!tapw9Y{4O9>C+r z#igKyAi0pkGT}1d)*XxoaxN%;gRKW?OiwKV1yp`P30w%(9+09Oke2vNP{$jtswfrY zN;nrZVw9hpjciV79$W>ubpdiiK~XBGb zND(yQ6s0DYfyT%{s)|xeiy?>efd>CUz5`oT1lq?3ZCW4%z@xOKIjIm4hy~!BpHcum z)fzm)1u_-1!~kXksM!GC9+F%H?z}?eQ3A3!J04tXfU3y&)IzZF82JNaI5^G6mx7k> zq!t$^7F9x(CSgdxaurw?Ea~S%(grA>rIh4@u9Ha4hNfbW7-%gN=ypGFRR!@RNI0`N z9yD&9h|mnpq+qjQL#bewfJXOnL8Bz#-g*w`>IIN@OF%Bpf!vr|RDsA^P;pQ?!y=rQ znGBf+f*1`k10)FQfuW1#rItXtVbJyklC>Z$@WFpHaYSPYY+z|#YDGb6GH56+y*M8# zgn9=A$bd2v$dy|0DXF=okPKU90xmT`X&| zGBa>>fvg=Zcb1vK+H=WepiwlK^H9X0IkC(Plv_d01hEjgvCIsdji5OP%tPc8@Is7u zP}44{C_ga;d@)B!Vmi1fgiWqA4;Zgz$2~cU^$Qkol1I4pbx`w#fmk9lY)xS-!jgI+72% z8l$+fI1Mznn+V#&R-6o4dy|;U09}d!Dvm&Bc!E}3fLfu+AQyobk$`0&3q~*{Qc`mg zD`6MRrsSrArm>KXEG$hes*J~ODAKYJRD;142B@OTFDix^23g1sDyu;y2x55)=sG0C zJQ?WVPlS%_c$h4-!Ga>458B2LS{4d&9b6M=coUqSk_+J>09wYLUko~ew+z{TNW!^^ zd0j47xDrOzTz$FjH}Kd%_cu!2fZvICiySOSV^a407iRThB9yHgX3;=$LOKqCe! z0Zt0Y;-E4f6k#A&K<`U|>Hx`r90W}`VB=w8@WcTTg*Nju^Gb?fPKP!9Gm8q*h02Oj z(~-m=YiYr;m{IWb;4^B*66%=-gbWN76z4L(oVV%u-Ov z4N7F733pHf7FoO~wJ^S@xBywGq$oZ=8J>bbnxT#bwbnrgJizQp1$EbQlM$&6x`-<` zxiCJt5K_d$%>h+gutF3x7lV*UN{k1237n@h3gB5Q16e!=NjyIX9&Dh2^x{JBJ*6-o zfQnW~8bXL5qA9aDKC!eUKRyGp;0lsk;0nJvMfF=u_Q4ENf)Su0i`nJJO=6YfTjk(y-LuCG>UP>r5KqCG+$8+ zPi3G807Wdwqvi1QSOD2D3CYwjCxD6uI2*bJA*U#*ARdx|(4|18rlb}pLt3zq@&vRS zFtG?Ug$(L|LF8~~FD)sE&&w}B$@DPoAUR062eJgYbU{`DUUUx1z{m<9+Cc6q$}9ji znZSG7U~UJu070iWgDy6Lrd?1c9#q?+73Uz~O7MgYG|9uvfHyKBUWRhxVXi?a1GOXJ zDFH5AkPB`qfOg9vi-AUyki}pv*Z9;7$V39vwJ>YIO}um}_L-_^pe1VWbTo45{0~#-=>Oq3=91R+)g*h8V z0<$&`ZfqIl4-I$UiYM!^ZmD)FghCE&AW;3^?Qa3I5>-APEQD9bM>h7=3&;BDKL zFb!Y{P(hksT2fq+n3n>odXo#`5doHmc>s%6NSvTX9%uv{oKiuh2e|alOaZNq1q}?w zg9lMTw_zn0l!65y<6D_2;C@SHN<63=2W@Y`c#tC?7(lwfvXFTfFh4UNVIt^Sn2h{# zusCQ~8q|kC$ihXygGFFPkmF0h!(`yo%)zZKxC0@!z=oMJQ$PtSDZ2!$6FeHiPzo7! zO-uq!gO-#Qzyu)oVuC6^(C8^t6}S(T51P;_LlG?l)h-CVkiI{3IcqV@L}>pTVjq|T zAIXFo4|O(p7#Laxz%)Y*g9R#B3D^Um+Bh+(7?dR#O2Nx;AVUizvXrl&&J4ZykSiJ-Of;L+S7kRtFcsi384rFqHuc`4u}NucT~FC`zg=pMX)0M-_P+l>V3%P42Ed|Ce zEy)M@93qR#f?I@;j87^~f$|E{pcg5E%3OHw2;_jIVo1t|C`^V7qkts9gZjxs3YI+6KxG}sVz2&A#DbPQus&>LI_j^fjfvGAy5Fs7ng#^$U%b}ATjWvZ?N7xpU?V{4AXdT^Ak5FqD+KL9g2+G$Pf#KRcfLVm+8_&|!mzxFY!-APne)MEsO_kyaJyF02w3#IS^j#A#sqBKU5kV3J^=6 zB|IqaA^RUHj4V`~oC_-c!NU(A)1h$zuCpNg!h%Hbj04DZ@Z?pT3KK?2b)c3Q)C7n_ zKy_ezS_-5f2Ah{rT9T4qo(GlAPC~>dXhaR<9MCWySSe_}7nWIJX&B`8_{_YF)S^t# zJS6A}ba1qQ#8XQ^Q?yW%!8h5aEK4x$dU)(o;w0?lNo z1jqu2Lm;Ez7+ypXM)o2sM}S%y5EEcS%OEGg+FdE>u$&7ONiRw)fL1Jsx)rpt4jiEH zCJ`u=LreuVLqJn<2wp1mHU#LwpNV<-d7xt>K?OAUhEP!M0trBlmjb112B=arnY7G2 zaMg%S7pN18LmQ}t1RinC18XcxgsCe_j88002d~%ySy)^G%jlpsdpyjY@!%WfAVCRR zYy#ya=ahmMzoT;F^NZp^M?yizbMwHarGdQ*O4HDpRq)<7kV`;f;6@4x2i#tSiGWVm zg_XZx)4&V%ptge8pcBQ)QjppooDFlEo?k9svdI>H-@GZ=-=s1&yqO##F(w(ETU~!M0QH^yZqXM!eAp!Z#YS2vY`%d+B<(zGWHSyd6}R_DZ&_(X)$zc!3wlmFA*N;;KNBFJAw*8)AkStf<-~&CfTW}1)yFx zR2Z}pJ})x`ltDnt@u7BsqcuJ`5ppCC%$4aSu+bQpNJb|3((m}9;$n26vRt@GIXFQe z$3A#j3^cib$AIENhxfrWKx7L_L6bIlD1xA?dBF(@Cgo>TL4pP*0`88&;|K0gP+=cmk_cM#k_J->5(5_-@x`G1Z&2ew z4O37T4X!FPIU8JfAY27HTMKgPO+0iQ2)tYe;*Ek_P$in0R|Gczdejdn1Q6~igCvvm zl6-jVfELXrmw*Nair}dPTK<>7HNsL1%ybwZCBeZ3LCq@+l_0_RT<|Or#K}b^pw(62 z$VW;%kO>j+A~%>3;K6Um2sJ{eB&R4IsW>Z6iO+!@pa%`oV$f0Y$=UHqrNx<`9g#3$ zc*$Fw3T{-#qok7JbWDTNp`#$EabBDWJ52*-GE4wG`Uy99D520X8WHVt9XR+dtnkJ6|p12v@+bKpT<4&LyQnG4Ea z=|zbtso-l6!A(2!9j17vF*WMCPTf=fWk!F#m9L#^;mZ~<5>B{i=S)KLR> zsG&lo1z>|=CV}G}O$Z4ML4rKKN%tnI&~v6 zJr9KwpPN{jl!_3_$p_uNP*@5s-ylbIfc*~dDMQ4-6P;jPxX$1J`2i{i=@o*_1aCt~ zEko7`4m;S<9SHeU@Yw=6`RULUSIhwF8YE@rgK5w{<;?ut+)^kHDh%#JfDS5y48#O`ph__llvqKXM(Ap4Xb&4C0@`d0>STlV_Je9b$P5asAD3DJ zt~*L|KutA}a@b-FXh*lWBo!1{sYUUrpb<~-{5&Z1;R0!(Os4iX1tnoLj{0Urbn?n7ZHMG}CWJPY;`WQQp@EyKbGR40IjfIz;0 z?QJN@kIzmm0v*^36EOt49AtHTVp2Y+v@1?60xwsN2amnNcxfr|i3OQp#b8+wzbF?p zDS@N{vJeS828tSmPkR3m{42}r_8OM#r~0UL!!Hlz}?>MRH3ihOWi6G;wI z8exq?h!kl00>z<-VH*@-(4Y>g0BRtY7sNx4G)D7cc>!o60{Gxp(3W%LR0kSjP6cg> z0gp=|xwH*XyCDtlbQ-$UkIxiOVTXjlM{&_#WQojXHG&}k_@1x2Uq~w>_Z4ZnkW!{T4qTxsJ9E|WmZ8Bpe`*b22EZu zl!As<(?Nq5AVy{}XqO`>Xdn`x9TK2y1Cj%6KrhZrVJHI~eL(ryauysX-@wutF zMk$%a*sh@D65}1Za2-A_FO}z~W#gxO@W* z06?Wd8>Djbi@+m=pk;s{uY-J=Ssb68mtUR--CqhZpg6v;G%>FPO&z#N13G&LO}sKW zDH(KeP%^SOXtEMwHK^8wvWh@=FlD4BXCw2$6Y*esLC508=O$J_WMQRMnMn@x%rFoO zGQAm}o0^iD2tCRRq&z-7KDj6#97iB#Nl^||6m*L(XrT`{8sgLA({f9oGKjNoLFN`@ zR)D&6xrw0LkxP>^z>2_Uih*RoYs``pA?6pQg2W*P79*@JhAb!oDF>|-ECF+2s$kZF zma*i37H{O|fo&*G1XU?jpiLC8*g+Lf%P-1Jgg6;8e+N3M2W$s;mJVc0A}HPDCo_~K z#wX`w7Jz7&u0-&l3PTxabpvSX0x}TH0G>XJPX=kp0WBN?oelxIKsmh_Dh0Zq473IW z%FRmzuQma-M_?kL9j@S&5>SDH{G80>N+<_5-TBRDJ`)aVF-R;gClR3| zFDDT+!Uw(p&e#Yc4l2uGYqlX1`^a)diMdDyLS}E^c0&CQ9fe0|E6qy;oelyz4ji;` zA0Yv{j0C(kA8rIpBp$R{08L?8PGTNISt4k3Cp#5%??N)@EFp$6$hmo-ZU|@>B{DxV z4^*FlMIbkZfR0;81WgJ+N;l9s?D?RPa)c7dX?q|u!8$-~X6OVY7R8VppJWsdRtw53 z2!p`g6!1m`bTN2-hiQc8GnfEU20#af z0O1&T48k1+i8s)`28hXEyP<+PIr-(qkShqr` z2`*Zbj6hq`QxicmR-mu~jS_%Qrill&xr)I%Qp=KHMQ#%0f~vBloW#6rP#Xi(vx`s5 zV<-b1lLcmr5n$Zp z{EXD1)VyTSK^mZSEM=)hAXT8-ukuQufdmms%LE-bgwPB+btDJ8`yv&xt`$7$4RTyj zW=SRJe&6`ae6Tg3Q#w+UK?@`^i!;y!L1_eC2y_}UC@fRpy201OAt?i|9sxPEq!Qdv zj!!IsoVg9t0a5^}(;<#R5zS44aWnHFnu}5k;X=ir8D#K+f{fA<(7ahZc>Wt|7ijVa z!33So16t(_6#?B91S)f)-hUj0Tl!pt&bd(-b0? znUe|@08JEuRe;hqL<+2aqRtIW?Lss*El;vipWEO$NbF=fHVFYO_gU-QBEGkZohcFUz!Kw;Sgy1b+h#H7u zXfFz6Iz)AG61eLP(Vw3K2_I0(tcXuc2Cv#jI22k}fd{Z48bCMAgKlC1A5sVwf_oXn z05z%LqGeDPxUUCtKv6Etd!Vuj7B^6Kd?x51Gtjyc(4t|G^5WEz0#H{Ebl@kL84s(Y zAtDHOA}=}v>nuquNh=0h4@xQ(2v$63=ncZH%!RuabYLcUoEj_xyT2OD0WG-7gTxhh zy*$KJa48Iy2eZIFO^2+ZFH0*1u|S)e(u$$Wb3iI#f@ngSdGU~0;sTf=aJvq~0d;)Q zjLA$%%?GV(2QBtvD1-4blT+hC)05EB7%U9h)(lYqO6{N)G*msf184-}fO?{k<4sdj zpkko0Gl)*mCKM!{;Jp{%V<$nI3Lr{A(x7obhO$i1^>6u*iXP5`9J~jU1Mf`+wUy!W z1)$0hsuOf-B|@SE(s+l;f$nDn%Vp-rgNoiUV zuY^<_;5B%~a1|+~1#mW~>jdY3TRx!cU*RI4yc3^a1UjauEH^%>C>vaqgN*`h>dGvE z-jq?63vOMdgT^Fs7bF92S>=Lf{^ASL!L9M!_*`(;31n~{XecBHx~i}&Hy+9d83U3A?Z3)P zO-+HE;++ahrMdA1=^&SaYPifaaI8T*SCCqi3l3LE{{R}2pvnXk%lV~w;NSqSo&`;7 zf~)}V&OwfUu-oFHz6EnYwHx@%`Lf(Z&=?-5Hf2C!gJKQJ&jL*dfJ@x?j8agB0OpI8h&d@d2ZT?SOPfV4owAYECgSTbmDHEc8*Y#n633&hXN%>5Mu>6~K`rih@aFsS%#w`!(h}&txuR4^3VUVg_8K|=_nD>*+e zEi)bBO%OjdF9pGYRtHespx{KvW#)k!itr=}(hRE55Gp{413I+?cR4}~UR6L%hsdOY zW{?p^6cnXGmNCH%C@4xTLpKys_Cw79pIaV};zx*3UTQhQV2BXt;x15>g6fgP_?*Pz z5_r*`2s*PS8>|7;Oo#T7audPLbVQbi&Q5`x2R_RlrSJobpcH-J#s%mSMK(~;?!XKg%w4nh>QGN=fl1PNs7x3yARRG!!2N?_20Z|4n)W9BsR7CI+2Nd!U zanQIqD7+y7RgjnhIu;aknt2X*mFUyVx-{J)w zKLY7T7KZt?AUhRQ^(7)&f*_SesbyeSfnyx9rWO>;MX71vp?&ZiJ4gW3%0?|6Kq8?2 zJXkx3gX(ICNO~%`;RIKM2xiE+)({Esfw!>gJ`t2xL8}H+6Cs%dQaOVFk`HR`fL5P^JXfBWS5h3Go0tb`wHAQp-oaO4loo&& zIDy>=Q35s*-mCycBIqDz&@Db7Mc|4%uLx0@f(1Z3mUIV4-R&aX$A2GCZKaE^C0bl0MAC`m=phH5Mp{l&SUg=FBg4bg~dJm`!nP!SLE3dBN$NGT`|Q*%L! zxj;QrhO*o=aLt93veQ7vHiIvEhBS=9Y9O2SL8{Y=L5FeV7lDN#6?Z(imztXvkKn?R zZd!bPQD!%+fYpJk9*|3*3P9)Zq?V*&=!9Og1tLS;eu4}2h9I+6fnEfrJ%+^B~P z6~MaPV3Q!?sTCzfpb{H0B!DCVHnboovjoK$xM)10y9{099-o?%nVt!5pA{$Pfqj+6 zP*#j!f%fKs*2Wc-FqDDT4TC!ukTdC!1wdzRA@dIuXrgO(S7O@d}9=$22YM$lMkY95r6 zTbvGB5dx|!K^+ZHA_41!&;CGp;Hg{i0SHiykR~u_I}+&lK~Q2qRtaK56(XHO%TQKa zoSc}K#!yz0X$ER>faXfl@4;nWPEvQW_kuF_&{oM za^kZ=11Kq=7|Kos1twyF0@%p3(vnorEhG>#^750D;?oOIIH0m09HH5%kVa5iX&z*S z1K0pi8v=Ue1ejk4Dia$#l9HTM*uf{D zILQXxj07s8z`h18d4qbZv;gEYh(^$vN}0vUpe4i*W8uP}L8SOR(6%DbJxE{|l@`E_ zf-B2R1B=1=**W>?2;0Ft@Od!cfP||8^}X2FK$q^2h(SAw^tCS~S;mSU6^ zgED7P9;l<60-BPBn3tCi+qD4JSCkC8C>FHQ0>K5HoCfBB4kF7;0nfjrffm=q=Vn%b zlVMRFXu$+%Z3;MBf=vdks?RJgE(I%q+>^=xzeE*OKb3*p1CfCB&JhYAt2`0>jPiKU z_9#eI2Gs-_VgZ+g;E;d|R+PkpHtr^Z?srER06J*_!2_+_Eds65fx8IO@4zq)>Yt?e zq{O_G^2`*_mE*-FnYo~4gWxd;2GC&;>97+EGIK%OSjv+ivsvKnGN6Q>mjXFQ7^E0- zPHTQn3V5Ftx;WTOP-+4xP02?ZMlVl_Psz_s%!CfDg9gpP`7sH!q$VXEHuPDZ1ey>7 z=?2Z2K?)XRNzh0YzLcd{Y=)3uqKEJ_)k%s5k?p z9yEnro&*}90;T9mkPvu=0lLMaJSn~ycEAsa4eE-;C#7V9n-E|N!9GEbB5+)Trz}7k zKpj*>aDa>lHB4bNbN~UOumm(z2$uovJ1$QGH&!7@48kr3FChm>6jg#I?#q*44K8@n z0vQ2Khj1})icHHxk^(yuksd)ZkU|;30<9NMtOVt}BqaS{jZpt3gZgZsDX#crPy#K8 zhg_lty1W=Nyb8|crI52wz)6DvNiGdEYXmk9)}&2Jj)x4wA_;(o9zmKw?W}mvE-?_N zBp*EI3S~mf08dpifG$3U3}}D?Iu*@)C|f@ zNzDVTTLhPonJJ*mpP2{Fp$z4jIXUr3smb}dsqy(m1sREXsVVW`3$Q>F0r};ivCz~K z1}F!T02#_b4X@lpP)j2o(j@}jLB~*@3F?&>7suy;Mz8Wf2Va41T!RZk+mO&TQ{|Z@ z8JT&Y+yOd}AB6{A8q9zy1WG7qLb<8A@!-9c<=}ySP-DNC0o;!PZ`TI5fkDgd7(k2M zK)b*zA*|&5octnCm_gGD=*B!yE&|agR}+Hufkv(3!CD}?^V8A_Q$Vo^>7;@*L4;t{ z5<&ztCIlJ#N7h=J2NH*fK<+n+FDNer^HYmp>ytr4!}<9+Fwx|kA|!)AyAwfYnL_&l z`9;~OMe#YQiDjuMA_e*RIiN{l&?S?ZDKMizqwffh!`s+k>C8Ovow+74`9;}Km5@{gZm57&L;9A` zt6o8emw`tm;8&7E+Lg#n$b3-7OexJRU??vDkM4pmg@6qFLRKJ^7l3EcALtSJkY5|prOTbQ2!A;M-Qr(zyX%ZP+kbTycC@F zKz#6(w*~p&^H)I!B!R`i7t5gP1694?y48doJ&d*b233YTcBr@!ek(YJZKCHlzJIp z!l{L&pe8X?J811LTnZGpkW!#16EfumntF8U%R}|zX=ar=9CFc}DRTktXBbcdWAf5@yQvbdD)PSNnkZ#K~Rka&B!1ZfyFZOK$9@(pcxe;?ciuCjxSEa zCKjIu4OEB$;GPWJJfuN4gji-?I;buO&B7rW2)&67R1Fs=g2uey8bFKPz|IC0Di9se zM3EB@IxH33B?74ikA6ZKpd0Qp^HU(o3sKd9E|3Rb{|b=>r8v-frBu*bL(rT{Iq1%i zyj0Nn)C}e2@rlWWrI|&LofIHG_@-NMM-+)y3?7&S6$a&yt8l@5gaT01!%Rv+6Nb-` zKn8-54FH`dT#irLx+g*;OQhmb8FP0WV(#1rEeeaEqh@v@8dH#wVBuT7(5M5p*R$5!gEL z=J1l#BG4fgASIxUt|?&mfL5qvCgp&NN{B>RVooVo2E3G`A`!f=7(BZNHVNF&0Zs8k zWgsre&4vunL(R|42G<`TH{^n{65RaUY|ti5i20x-4cVSj0h*%%T`URG09pu|SArCD z;H#MtZZFA)n_ZG0UyN{jNj}1CaI+Y0cvWgqKBVaj<1jmx1}vEuJ7_Aal|XRteb2U{fHyYLGB!-3M5x zC>5F*L477j;sdilM>&BMLatN*v0##*yq^kA`=BkYC7@G3!6t#kL4gJ5Ah`!5hX^VV z57M}SsLd$K%*%!_;c2cIQcZv@26y2hqh(-zVQFG<2H5+Mum*SNA^J=5i$FOHbkaxx zSOikWAOaf6Uhsq{1GvQiZb>9V+2Di#D{e|kKuge5L56~vpo{FldmbSAK$otiCYORX z>_Bxxx`;*KrYdN*6Do}8`N0H0M}vT38DwlxYH@x}8T2Ara7ma~1eyK-wMWqfAmbjSOig-U{M6E6V`a3I?b=_$vT z7AF~F8VK?Gr7*{Umw193CuxbvsSFh$XMhKX zDsu8cYrjD^K~*M$PD=&vmIjR$Rpb{zZ?^@FtAN{3pj#6_8#x&&ia~W~NoHDRY7v+N zy=wuqSfru^8hqgV4;oqrU5Cg37lw2~Ah8Czn-vrU5T&```vWUb1tCRXF-Sjnyazg8 z30DOgHGwQBgbP7z03B?Lq^%^e2sCsEQj}j%37Jy^9Y_KeC+c^XX$ z=6Q%BNYw%|7ZN?lE(P}!K*J%$sfExpqbs1d>cT`p?V8HWRM4mE3PL>1e-V`%{L{p0L3&6D?C?$XdGV_W{K%HRdYBlf#QEF;RY6@66 zg(wX^O=|*Fk|rGgIR8ib1_G(4|zVP>t|;Hn0-VCrODr{lmp_-q`s4GCU80by5`q=Ls&z&uclL;M9AW+-L=3xZA*N-cr1 z!NZ)H`4C=iB50x-)X)Yi1ScIhE4~3-4CaDH2|x=3 z!JOR0yu@_S2r5Dz9A=RE1gr$X2QNlI7c0(7EGW*%FM-%ql$xBAn3)S2Y6N$bp-w0+ zNX#pSu9r^BgD8cF!CeBf5j408-5&zB27JgYsQm>wA016BKO15YLREe?WPt=oAt(of z#=y(Lir_rZijX{rV?iw$$TD}xa$}G#uo#E|)&=LqXQoszFnpM_IpLGY%D3xoonzK# zWO%y%cLD=D!-?bF#thsH2M+yCU=UzV(c{1|f!LlRKjsq`)c} zk4$4+H)n^T9!uxS<;Dz#4Ba5g2uv|fIK}w5dy%m*!}9~nj2TQJlm)}o{r~hC?3lrV z_7FiwhF!}}2{O1cE}DBsk-@c*Y1N0VvJ4&!OLspMXYgj2yK{mugFnNPhyBJ3fehQ< z^cyn-G3@@x$Pmo1#F?=tWTA5i12aPy!|5W1NQMjF`;8gm8IE4;F=j}HQVk6a3JeS> z4DIvhF*9VcfvIeUE)cJUk>Tjq`OFOMj10?XFJNYTJ%RD-OqLEthIO-hjTt%^85g!r zkzwd$WB}8>j12Q{J&tGSXJmLbnVVq}m|{G#o^e4d#}r0}V|~mFvl$sS?s}`wFq@Ha zf5%&WhB=H3JPeB%85S&_Wy~Niz;G&V&5V=XoQy0Chd2ICU|7!N;dyvEAJ%5ZOfn+XFO*bv4&6Btj=yvocV z!}wZh#f=507#Ud^x~82lVqlPA`NenS1T!NC!^9#61~JAb>lqt5SDa#GU}RwU4`(wm zyjB7WGqN%)XgX!Yz#zu_bUovd2?&)?Hb^Cy$;iquu?3`3oS`rI*Nju_%uEc&4n{Ce zNuIQmm8pSg=TaXAW`>oVwQJ8o@+apkH)ddF08=ciV2Xi-;n6I{9qV^*<=|jt zI0aI`2BA2h6bo38gLM@n0|(D4M#jUk@f8{ ztc*+y?^>UVGfuO<^#6f4BQwK$wueXBHZij@G3;)5E5yLeuzy7q11rPP#}lYzz}s9&SC%$-v0W@L>uggvrWq3&vz(Sg8aSWM*Kvt=Qk9#K_9f-=f68 zz`%G=V9rz~Mh1pnaRvqkrZ4>4=FI10WMG(l)|r8Uo#DRKiw7$inOGU-JXU02W0=Rp zxQau95tI~nKC;V!YnE z{|qBD0}~SigA4-$!)zu723BxJ`qQ!>l(a!^0y7y|8RmmZH3kNW24MzfCT0c(W(EcZ z7FGrZ1_r64(wfX*J_j=c11CsG`H-0k$o@6vAd2xytO_GL0}}%SgIc370}C@V0|Of? z0|P$;0|P$`0|SFU!>ew_&8Mea_5o>nA_QiNvM~I(`CFKQm0>B!YBmUu143~#EIad4 zn1P3(@BU9=1_6i?0mhc~d-NFun81`UL(77z8jP>I8SkFIq#?qv@cs`C29XA)3IG1f zGDtE^dh&yd@m)9LxliA?lo`4YE#_iSW`t0UOqNirydieoTKg<;O+S;`Em4Exvr zVq(x_c)MhQ0)rOAj^zs!7+BdEUMo!j1tcTXr3_LGcP263Tz@c$k%i$!>klpl21SOq zeTTlx}2N_4)w|gA7C8uHPICGK_62e{nD{@i4qr zS}^a8CL=3E2ZJ=z&L+kc%l5ovVrF6h>tKOUY!Hfxh2gc*jkQg}jI0dXPCsB_U|?f- zt#sicSYXQ)kbpACh!5-cT;ykFVgP%M1wyewD6kP{wsxj4vO)yFMxY32gFH9&(}F-o z7KZ(on>iU60vJBdV%+ig-wb9(CMj^O#}EWckn3J8FlJ(9IRBB6ft3+d4Kgw@Oq<6D zRsl|sAQmGlq@rYqWVm;T@%ueUf@DBXkOx2#pv3W73Cv_J!Jf6vq>_KXY+ z)8CwCW?+b6m}IBcjRj7$uxR`wV(FeEWN+RZrS*rqd#jG$}4gqmm!mZk0F!siCZWndLGW11NQYB zB@l~|l>tOCFtjl;tgLDNIC~8vD-)z8!VIC`KZsx$^fDm7`ho5{v2XlcW>i-DP{(y3;i6h#4@-4lRmTndolgkenv=G zfSHV}48M+k1O=`{gYc0bxy($=x2JG2Ff)Ki7FH0+z#w%@`tzKg|ANd6U`Ym!J@@|U zGca%-dhj@&fdQ0;4(wP2Hg%0Tl*M=@7Q|v?X8^kcl$;*jnY@mTg_(I-&nJBbHdZjj z&j6uVz)oc7V`RL2h_UAmD1Cv;TL=?W+=5t)tPIW9YZw@&Ff!aa#5n6fGBX3ymQSEU znhm*-zITEj;=_9<_!(KjjXH34@L*&sm5qU)felhl&tPO|HJy2<{dXFd7{lHd z^NkoJ8E&lFCe9!Qq2w9%e|agzpuy0(bT2!DCd1urN%X$2j}&qh;ny>QT-Y^HnSqVzBA8<4U|{3oU|?%t5(QZ-%D}+K@NO34=7(F~u`x42bTcy? zKR8jDfdxV_uri$LVtjt~U?VdlAH!5;#1iWFx=;6U@H~SbN>bY1T>ctt} zyY1NhxSy4Qk&R*MDMm1xiIZW`>#gDpysTh~k(FWRCdQ7n*JD8~!0j+56T=-vkRT%~ zL^Xpn!?oJ0-#I{vu0j}03=>tLA|IwOf?42pBbWthHi8)7nqaaGBP+vX8&EB9Pyp14 z0o6%NU-%F0=3r!Cm}$enAkT2N`rE$)-#}R!oVmD|_fMN4z`)B2&SQ+647*f5+I2rD5e<{Vl z&9H`(ftU3Oh|LTRvLi=UWP_ZueG?;u2?{b03)IO1>15z$Sbdgp!fa+nCXi-ECWZ&g z7&oXgGJ|*w+>GCqH>iRPI6DO-3Rc6Q$#Ac{XYGn?Ms^l(sls5&aJi51(8Zs#*g#3> z>nsSHiJ9Ti;{`?xEDXO^zS3e~n8(QQbr$3Dy*Jl^8m-^oztIP!l}HAL`HT!(*j8O? zTFVAXa8o2++SQfkBLkfkCVh zOt3I8NHZ`n$TBc6fO;!Rj0_A)pd6zFl2&D4V9;Oy^)(Llz4ILl!FoLl#IXtD%9BfgzWH zfuR6|85tM~85kH!K$ww%p_GAvp@M;dp$3E*85n9nZen1lWn^HeV_;xtWMp7q=wM_5 z5g>PUFgCI=fJRCf7`i}GU7+OM2V(VuSQA04i4YdZFB2IX*?1TxGJ>5jk+BgxL<6QB z7#Jpl6wd$=GeN`xM#h`#7#Wr@GW7muVpz_|2%(s6OkQ`8m0>w!Bh$81?jV|F&TNp# z3Py$}r`8^1WmwI~u(JasvWAi2!YUABJtM=qV<5&RMutOQ-5GW=GMoZajAy`91Jl(H z`V2c68=2;Q1knvF3?Lp01H&H12Bs}P+!^*UGJvQ9j0}IjyE7bQWN7%|&Txp4Vbc$H zh9is&>z3&=9ARVxQAZgW)-Ka$IL^p0r$d6_I3qKJ0!77f#%3l4hEoukQ;Z;?^Nb8@ zIwTmMq|ND&xWw4N#K&-zkwK8*DkGx^!!;0bosmJ5;T9tU$bt75nQnDRFx+EoWcl#b z9YnK%`1ctZ_IF4yJYZzl45k>jbVx8BSkAb)L*fx5!;KCJhR2MI*R>g*LexD4MaNUd zMy3}X5{#eLGQQ}LcnXRT9){2qK@h{ebZ&PEKf4F8iDKovQtxAu1(xCCTiU{D2V0QDId4oqic zU}Oe$Vyzk4*TdwUkl2X~-;)@aK)q?ECXl*RhJSE#(itYCpczxm@NF&B7)B~8P?u*}61QjWu>Vxq(q9*yl z53N*M85ug(GlJSk3=B-5SY!ev7>0?Aj1$*^%PX)Upiub&bw@A69TP=BJzNF`s5>}V z7#Mh%7#Mg#RTdM&1dv-;7~VtOvJt~AX9XBQE;xa3(jSCUE|tzwK!OxM?d(m%rvMo=(*I{h3JvZubfGoF___0=8h35Gq4py+vU zYd(0iBcvA28K(F3_qqbHXm5c1@c$F2#nPQX0fp{tnQFtU}szgB0)Kw zhhbia1OpEfh~#Bh)GopJcRJ(CRtZo$b2{UWy$8UNwMzxUVrG~<6)ece#BjY`f`NgZ z@t8{6@q;X&p{`|989_`&P6lx8^mq#6g<~KYc7~Je5EcXTSul%{foW-n1Zec+w&Jo5 z2~bn1Ljn}IO9WUz5e(`M-sGP&_arkT0|Q7U!yRx`etoYGPK)4hU}|9b`d**$n%vFz z`V6;b&XGH9vf=94jeD5bm>6ChSSZK9&hV>el{Etg!<;j>H5oXV!4wz6q(%Me415e- z=cZ{gFf%j!cfC1%-|T0MTx?9+Hczf&5M`L(wIGT?w1KI=Yo!Q-7{kpiwT#n_F+P9K zB*uJb?G_OR8CEc*#L&3Evw-o~2FAk=k4GpogLSJh`~=yl#tgQam5uR7@PV6eZ%Hz< zF@WVc84kUDJ(-b#3raI`F>dF+abnUV(5PMa%0)4t{>me>dta`v3KM2x?E#4}GlMC1 z2*m-R1R21Bf{ZJsJcwoxV)@-Qjgvu`aa}`eFoSR-)1|{ZMHoaF?yhd-Wsqe4xpz?v zgDC@;GGjQp@4X0vIm4SL-`yF^8LzZ_aAPoMUb6F)D}x2g?D-oR8LXK5&;5yFuw|YA zqBsQ^uWe#naIxV%Xj~g?9fJ_#xy_7kR^L!zWMTr_%peR>w54&%8IYp2AXk8f$~QB9 zSvS>$k%E&+8eVeDC}SYGE<7ZGf>seL%1C&StP>__d4i$HSBBxfz*Qz;0&{VrX=m z{B+ehH*Qu|un0c`n37{y-}NqvL5>+rsW6_}{eX=@kD;k+eiVZ~gfe3W^DH1dSBA$g zCWJD$GlMBkK89yz2X=gV4RQ_GKn6L6MP@%PeYggSNU)&{a_sYuG45Hp<24f_GYdpW zg<;k)MlcgR76f83vO=7~pu+faHsh4%zl)fd7~br7!p6V^aTS9e!*jEa6@OlU>;gN9 zL7(9%nur<0{9}v|Ma(P^MJ^0y<}%JW*0z$Bi3#F(W(dU~$~fy7>d3B&>o z6@Ua7WLOs+W9-;=F_4jo0i4VkxEOZ0t^cuYrw$7bL)XWZ)(o=D;4CBu$w^)eKi{oW zV_=kH*y%Rq()6XuoXia8U-qgout4NF8NsSKnXbOwIgOElvk}VRVmR{t;4Vf6Zib^^ znup=QneA!}Jd7JJ)-f>fFx)xB_~735?My5TOtV(+2F;vY{d}B}al7>VMR5!=oBqZ# z?(AcnHc^OSHq)1Fj?fX1C8zh!2m9)^5}3)z%J6d2dv#EGaw_h{nzx{t9f)b5G2IKh z{z))1F@wxyU}gYQEUaJ(Jnqr)V38rH5M5&qWieif1+f^}8K7pUH3~mE_kxdwnfcU( zOa?Yq5XsK~CRsp^VqjRmka5Y)^Jiu-sW37eop(%tfeA`6_FX#2!ob7?rdSy6f#ldB z6eon@W?1(2DGLKH!-U4mEDQn+GxpvTU=RS+jK>8S#2LPKo)ln^V)*=Jp8$gt;|3-M zX@(6<406nGKJ61=kZWd|?!}#y{%%_vh7%*y{|wv=&vr9{L_pQ&|MgHNsB{1cGO|Jf zhJlyi90=A80uv#K;5|26ebEp$hOZJl)N>@yaVF zMh2!vVaC&vyFfD*|JO4<`0~^V6xXknKrBX9NN6)iFua`3_+dwPGb-Z~U}ORflgTi$gQA5&j`895kU zgCdAQj^$T=%a^~7j7-c^y+AfM%wybe`nMy9`C19YVq|3i$0dV2!^z++&pzMY%;?0_ z%yj!;zW@VMGt1=Hv-la9n%PN9E0Z|Q1n;Ki$8N`{lUH-(*Ai)5pWEggVcrq;A|9>zt$gs77DfZcWix^}X)=jNq zkYi}vTg3Qc6XW|mMe1xH&h)S|XfQ%3=B20F*%>q%S>BugO%#Ag1BRzxTi6*)8P7f1 zCdOdO1g7j57Wdo~WpIE{?hG9bi$xi{n2vW|m1OW{c{$~@G=nb#nDU2EK@4|aO_gSd zXI%U8I4eUI^VTPM4B22ZzkzA;?Nw|HMJ)3_Y-VC8VE|JVj8kuRFfmjz{GYLnk)g7I zXB7{q<6iVJ2e()BLx0zzmjGZI^gK)5ovx?*!2e zOmC)?Gc03d0L2O8X_F_vukx&9WcWIJ1uw%!Muwf8zjzonGBz;n`Ed};V3{<(jg4V1 zBg4hHjqISV%ibNo*%li4?!8OSYRZyB$1ts}e#~62f{lpGRNN-u}b}8CM6X0~zsJ3B&?rJy5!05CLVqf3G|G7#Z0Z zJ{@_&&-hH{>g7-D;JkNa@+5mkCP*q{U}d(x_TF6*Rxl7j6a2+y~<-yXZyu> zVDly!Mh*sW@?+3o`ahR(#iczKj7$vRl*pjLy2czN0Lg?P79%@UN+0BbLp^Kl8QB;> z*?{qx%$?885ci*Gog%}?1QrGbR2%nv{J2r&pUfGJ_di~qWW7(^J}ZhpWIYCQk$6=E=B_z9w{n8B1Sgkl4? zjF0?U?ZL>z1l9y;2BV0GfMROP`9^z2CMK|n&{pvK?H-_74%7$+GeNc7llR*_Kuutf zRp2HtSb&KMY$>F9dt=`DO`sr!2!%21)Ss~b{z4{3CKiZDJg9{UW`fHF5DRW%I;fF& zW#VpTMrIaJQOb}35?HbL8yid@k73Pe#sklGPvGTdXZSt0Pl$n=VQN1=gCN6$-&2Jc z0vS5~t!85gf>6N>ogiKbGnguc@Jg9BeYa*PZD6|AH4#)2PXd+FtgH+>^}ihJ`wenA z*jNTmhM9X9cb)we!N|b$?`R0)ZOIecTp>lzo9{b3AVm*|#mEYA2!k-lXJBW5eFkDN zvO?U&pao8C7w3b99$CO{WGG{p9d}{*T_I)`R*;KWIKU(~h-3n##1nVlGcq!PUCY42 z^WE&mjPtCFOl%-|&}7{|*GWGwH0rRjGtGWHTZw^-0Zj2S+y+&@yvz`a4NNh!GyVu( z-Lmo_DAj_MaWYI<^dF=NOo3DFgRPtQgHr9CZQsNpeZ1~@bM}bxFtLI~n3=(pAOnPA z{CaJxFoO_F^ZCP|{#)OMZ{iH*3=oR3d)X#l2J=RyjVG?KGgz=J{W^!8!HW6dl(QlX zw#>&G*KjhhgA?YJ+t+*|}iiWdWgF8UDVz%+BD>45nB>y{(o@TY?yw zn813#U7{In8&nyYn83QhJt7nVaPQ~E_j$HVOc1k}Ar!-IMo_KtX6a*44e(^gO?Jkg z!f#uzurnM5OYB+g&dA09B7X}1pTNbS%Fu9uan6MHODrr*468xSX=Vt;!Uk?!vq9R} zj4W)w_|`maaAM?uNHeH1t}#C`ZCwwvU;;B4*%`o1aRv=gUAX4=NdeGg0Eqe_eCyT~ z4hDUO|8p7ttlBTl$ix6{cQfcSt}*{{^`9A}Dg&_?*`ZSI467G1ZaaHsj-f6O!&E;8 zK86De&TxRnD!$A+!@m3CW4PRViIqW)@zIPsjEpu{^uUQ!k8=2Ogf5XgR#IR}- z3xhGkW)B7v=7p{dRtztn&t+qOcsWC_N(nrco^c_nV$DN;bBN%08@Dk zS0}MEI?JR)ebXfAh|8fF@ziZD#!N{hVRt6@P$DrtAWMb)^$Jn#^gcu_e16YJXg5jz1 z^vmr$3{0#bXRmqo0zBsXS_#BrWMw!#^A{5X0~e@}fBi;|o1I~sJOekwVRi;VhMQ^( zfeZ^d7=l1VFo-B&UdX{v3SyNqyOn#PoAbHzNZR3piauLTS&IwJeNG3}6uk1%{`}XAaDRh0={@`@sXLua!V7MplMv zKmDPB^yTI~PHuLFo~axR+zbp1f?!r4!>&K<3_)Nr7)+KhgG5Tf>{6y_=U733HSr7^ zLnQ+!+kk7o`Tx&@B5?5!4hAL`kb#gIaL)$?Mh2!D#@muLknq}YMFA8vua!1jQD9^R zTL=jw!H{rU@&BQp5Hikl_V1rL+j&a(1JWrer7NNt#SQv+mMlo z36!H5OqhT1wM+$dNfx>?FqkqtRlfCcGe0!_otp(}crm zXV8NNsvbii0|NtSVl5anxy1~b+$v>a00kohLnT8Ks0aavViOM&6O$1G6N?@+#XVzU zWME=rye$dsw(Nk~xC3ON9yGP-fkO0+k{%-~Xl4%_Xbg-@pfz})MgjvfXhk0j2Ll5O zHv=SzL8nAO%>o9{q%i}7Jt%p7UU)~FiHYg?zXPD;1ul9Z$!o>OW;W0=B~W3+;J~oP z{LA|;PDqIjVllFV3nm6fhNsFKmt1y+2G5bD|DXvE#A0M+*myD?8bWXXU2))MXLtr` ze}U$io`Kq4)A<;J7^d?v1cQhY=IMM4r65)*lLRQBPBAi6GJwlXa7Z26YRkmL)OCuR zfr;gr5Hz&jdxI7dFy5Agj(W`S28GOPr5WCgtRTx6z-_E&LLkvMO3#F#qTmo~=>^s0 z)A=BovjNntkzioqkYHfpmVks>0wWWX1Oqr>Ens3~Vv}HCaAtU|w08YN(6Wrq#R;G_ zk5A_^UYR$+7-Yk1B@l~|l>uB9Gej}0T*x^2#rLn0!tBha3>es(nRFT0n^}%F?+{|( zU^r>Oz|C;V093s#*XCi^`R^(Vh&}7qRTe(RuYazxFz_*bIng4;z}Lv~?CM)V2EN9Y z28I5UXF#Rfj^lfz7^kRCyRuG7knvDYrzC@51Ji;Jdn6bH8<`e@XmN%sje-o~py9Qa zJ&PC_R2X*btOiYlo!|tGoORr1X5eIJ{>68q1+)+jzG6aLk zQV7Y^a+3>`ny)VAWvB#42{<)Rn06qaiHQXijSNgJOkjf`1?bG5XIU8;m{=KaOR_>s z&>v^PD~DezZTNAP6;xD$?1Ch1utrEJx^FY6hyV*fYM&LW?|@SHu|`2i5}(l8$jr>b z3UUw&2bkmrk>GN4!V@h5XyQ-|M2Le4#@7p_7{r;DZslSSZ)7?18$`7O!UZD02^dtIFhKIefdfxKxuRvM5#ubmZ%q;m;wb7@64^4*cg};AA+vlY@Z^OoC0+U}OT#DS$G=-siLFL1= z7C{D1hByB>A!Wq=)rUWW91o66PKN0(Izi3{Q(*TWIWQIEz$NDdAi*+idmJMN!@5sg zjI-qS7c*!x&ExsjEziWpa8rmuhyfJ;;2`;L%*@8HnG3w2oeMN03!0yVIusNZT^B?c zc^R4}urMx^yY-8S!Gz(6*zOjPZ~G+~r>GuaWn%om%)r#hqzS72dgd`6$YEk)0tvBv z0QH1G{yqR20sO$sz~Bk$iOpF2lAn={0ZjcAKKo}oC&RW4O&ss%G9KGI;l(tjBxZ)M zYnnJ1SQ$FjHi1?Ic7rHR=G7pIi(&bOCJqKZhFKt36?D@I~W-x znwTblXlaItKaMdnNH;L8otMHO-M}(^Sr>@g!1!zGY9=rQ;4GUzoi z{pVpYVA#Eqk-?B*%SuKDQ!v|%Vc$wd23v;b;taOTFT@#a*0r2~2@@ zV}ZCK481SUvM_`(+}*Fh5Xt)Z%2^hMXohD`&ayDXFfcF_Gwi;9mW81hw3ML?wEl;g zfuVv0)IwrlsA6DXs0Oe3Vfc6VEDJ*?BLjHRFo*!D?*Z{AK!^sW_m|GHFwA0PxOH_K zcvIAoE8CbE7Be!u|2z$}l80#zGs6-_=7;PIOBkD&?z1zjV`O-=?jMM5V4Bi)k&R&k zBg2*}x(u5b8Fo(o$IiH`fpNn1HugP?3@aYz=RSy2A*ntyiAoX1K@5Fyr4;CWe=c498!b=3#ir$hhnD9WKxcnVFAR z8Qw55fT*{O46A1`GkjxYI>yTIjgfhU7{fQlCZ=g(3_lndo_{>e!_dyeFs1!6h;Cr| zv}-R1Lk|4I2ahj7^j<`Y1nxH zT9Sg9j4TYhKna*Zg7LM|i-Vn@A`&7X&G2a{!bvo|nZ{SMlRv;x%d;$~P4q8PbBL(W$|f|g5Oo@K|tpuq5EF5~(O-_E^Y zRAgb;xO+7d13$x=m)lqvL>UgNGe|J3c4Uxb*yzY0*}$}plR=7k9SegL+fEh+sWzsm zoD6ad54{=m7@qNiGNk~66$2}S9RnMKD+3#Y4+9H>F9QohD8mN{$a200rdzTMp`hhV zVc_+AyHpq=8<5ea5H^-+IKvumU8>%nX{)`3GWxHVN@C z99q$>&cMs?XI(dFvC8%nVDCb94hb?G0&xWyTTgW`G6*q%DPe|XGZ!;5zCOvgbmn44 z35L7Zx-}UjKoyTfBO7Rid;{aJ1xyT*4C^~M8KfB6I>ABmaIz+YJj45mQ#2VA8K!-o zqRF7du;c3#O$KGgV<4Uu!+}ZLSQxY!rhT5l%%I1xc>XpP27U1G&XZ-^KqER$N4Bvr zm@zCo*TKkO&Inm4$-x7v(eEr;I|oz+T?hGufroL8`IU#S9znZBU?w9w!y}OY7{nOn zoMODUW7CnXjGCMb&--_&GjKEf?b@Zzz{~il^NK$MFVmARvosh48E(zJqQ)S^uygwr zH3ngZ$%n6~F^DjH=(?)LAkMI7`BgOrNrojLN~VEr_AX`yHHN8wuB$PqF}~gVUW4&e z%Gz1~RMi=JZd{UM&|%oO@*F3FKEvbnUqI#cq7z>j8H^bI2{M>4^hhw6F)}ciF+u!e z$-uy1%dlicvnGRW1Jjl{&6*7M41cGCs0OCjSDQ5%oEZLsDW-!jW-2f^F*7hYH85@a zF-w8Lg@J*=1(ZlU7#J8lKnyR2zQ%S<2CoLDe=EB|G|OsGTzNIH-JQh5;MKtKWC0U{ zAH&OkC~m}87Ks}82Wp!_%m=bOa@U5LJW`1exF_Ti5HZ=9zmEa z%*>xbp(M%tdEON@1}o+*^RK8e*fQVVc14YWNer|EXTr}5psqOsXbBFK4Qi%=nT)Iq zOF;S{W4L?z7jFekF6`KJMGe%OzF@Yc;}S?O6T>xqFq4sqq4y9-QikEMS^vzFS3yhT zZ!Np3#sJ!e!NdBaodvY-ZOLxNKXb3nLf*Oq=7SvmS_#Z#WM$Y7iaQ2QhK6~JZ{}Tv z*z;Nm%w%L`xDA%&VV!@B@y}TWMrM|^9V`qCye#vNF}B|iFfa%(JT`l<=sS2I z;1QU`!pyw7hlN3s`F;-zgBA0fUKR#h=CjjSprP?+6L_Is+XhB33ltK6HVH7YGJupr zg5k;eBt|BdY5gGM8P}XO0WyBJ=Di~$6U$wYk>I(I_J^vB3{0~d7#VL%f=KWd znG1IWAOUpY4#+`Mrn7(|Vb(Fmi!)h35^t0)&SYU^WdLy@y_gN_K+*M;8`6jQ;>66t zdY+Mih2s$;0}J;f(6|Nbt>isyj7&`D86h2#55kO0Z1=#)ea1XS(B1$B21ZVXMTVf^ zNyrLGCT50%W}x;d0|NsyJ%3GLZjkP)C|IiMDaJLCUVjE@&?TFA)4%y6TJ zgMo)(`SIBb3_Oes;5C;FUJOqX*ByD-Bf-wX@Z%6@DfrT>ZJG>R3~#@Ks0OA@TiP`l zco{BU22l-6XPY`S83Y&(e(%s^U}j->miX>><8&5QCWa57oX5&=>LqBS(9xI744e#~ z4lyxsF?>D5#K6GL@O}y7jzwEffW~jHU1`$<1@_a#S;ywj18tsdxzVA?z{>Eu5wyVZ zWg{mjoi1hv?a^7x&cGnSIP(+hP6p)$riDEm49X2GoskU64Qx|? zGBPMPaDWJ|*$qq#Y7A$mF@e{nTQIb;GT1XPG6XU_3}*;oXpdruWLOo)kjk+6G&@6T z1JmpVW`+`mZ-3bt${0>Ib1;-OFg@sIW@u()n0ADXp_!5KSPMHtGh+kOtJ7=@t&9v$ zFMy~9ru{AK3@joHJM}N!+Ze)>0W7Rx_UJFlJ$9=-tf@YLFZ} z&CbBaFsp%?ft_J`12Y52)Sde0p05Rse15yY1{yMGVP{}4W|+2w@z%^sCQM8WO~kmdIhQ@@JiMIq9nV1%W>Jt zKrB#sb!r<6Xxq!vLyX%@m_d638Kl6gm_aK{|F372S7(rWXn3zBX6R7*f@LCDF@|ca`=^;i2CYYtn;B1Sk1hmu)efuyj+pHNro@8A7 z@th?;AM=5m+gKO`nLjWw2(t9CF$giNW@iv(f5y%r#xRkC!JJ_=CxaEkdQJvwhO3+m zHVp4L8SEH-a56YDG;lFEF+Ac1jlOX+xUgC#!VO&LLztkF4#Z+)W!MI? zi$Q|n)^5f%t)MYg@CxSt>p?t7;DLl$L5(a1NrqqfD^@WvGBHm8)#jiudC>|T$$ZfY z8bRLW2x=WQtY&0j0qvM(2332Y+5l8AfVL*w)Z2bCRGFQj&6$C{f$6_A1A7C@1Q`bQ z2DT1$2KEMy4s`|&h7<-N@Qzp}23ZCs1`CE=&J30e(_I-X89${mSTTG`WpD=7tsu2%6ozgQh9ZVTdJIJk4NR*{K@@Y3G>Bs97GbCcE#q%w zWZ(tO_wq9IGBU6+OaT!~7#a9L{U08NC5#PBpbk+33lGC`&{+|TF%0{bF@Bz;$jiYn zC6a-I@sI-pH^W>L1|AT>2Oiu&gp=5M}6*W)Ncp5iC8@3=$x&B#4j!5e!O< zua*8DTO-EE$}qEU4+{f>8pGSUjQ3`)W|U`UXmDp>0}&h`f{P)9ftT^uLq-N(rgM#q z3_`5^aSYlF{c#LB4AbKn%o%>hGgvSz%4e`-xW&m}*}!y~3)1LtXSh(x;11gA<_=o= z?%u$5po+o0fny&tgFk~fgFh29LjVIaLjr>sLo$OHLp}ooLp~@FLAy*U85UJBR5RSK zVrXGxIKvFu4Euf8CE58NhA(A0I#~W&7h881xx->d*Pd!N|n&CZ2)8l3}O*w;N1MOiZ^p z8JJj3b1^Wufa;IM#f)qWi;FR94_}5oW>dhnU)G-jD!Ii$yR#P=wuAOHfObSPgGNja zn(;7#IFS0wo{5QxnSlwEIx`ran1Kow2GDR10}~6w(%qnwHJD%-05vajFg!A2U||%d>9xQe3(J=4-5>!3?R)B z%qzJW;u*etRbbq1{pG7d62sgd3Jh5gvVrMm8zVzG!?JllI2bCJ7#NxunU1nEG%+%- z;bCZEY+_o?!@w!Zc(t@=;V&IVCWgfz&oY=ZeBH#jWtA*w*2IK?g^A(xCdL_;K|%k_ z1QacoPcrsA5#(nEIhzGUu!9IL)~kFB+>9WCiGhI|)MMjiWnkcA05v|Y@-c|BfCy0d zgLX(rf{R2326iTfd$W*C2Q|<@c7Y9N;9wTtoYTTr`UC1?g~B{u^@0>iP=SMM7*8JQU7`~Xjqp6376_m`cS9UN&KV3Lak z6pf553}^Z0z4^$(A_P_|1Qr!)VFF2ljwfNLV0^6vnnq;;jhwwL?Vj-PBMYb$xXAxx z>5uhHAm%0hDXX`=U}R-wm^uFk2Ll^~;)PO-U_l`UCdSMBppoJW{1<*5bZ25>SOrqd z%mStum>G_hE`RmnAgEXZi!d@VoaX=krhOh0Gdsg}kWvl^#l-^VfnC1k%A1vpEJ6^Y zgdh?^Elj&X%E7L0Vq|=+)bL>%CnGCE!=0r}pxM(;vl!=XKc&FP!ti(X3MR(AQyC9m zXJTXq?F3zWyFrwRnPK9(6-*2)42Q3Sb}TYnS2?nGxfUxM!>fY|4D1XIhZGnmoMLP^ zq`=8=f3G70FGK531qK1|;2SF&=xm=|o6fRWE2Ajgk)(rq`-iyB;jPdTKeZ(E65~}jSSoj7fMgvehzNtUF2Uh`2hzc8h)L+ z!N$tU(DGA(feq{`h}(D>K`s6T1Qg03613m-2xz4CvQp3GZ91o zt~B4$G66Km&Tv)(#A0NI4CXQ{0i}&Iy+7qartc&pw1uD6{R0D z(?AZL%K>75tByZC#*9o1^B?noN~u{KATBe6%L+QkY5LzHh%_j&L8|sJGORIg*a|wy z0zBReo&kBVd?x6SBhdISXi4+_sfX8e7Y6}&C(pxKMtqKwSop=O3_ zjI52queZdrFf(sH$I8IQ3L^O#z$6Q3q?zFxC>&oLS!V<~>+0fZ9tMVO4LcSx{+P?S zas9!!JxpAT4Cl7YUBt-1!7%Fpm}Y7_0;0JX?zOirVFdMkfA3oUkBNbsVal?`|4a-# z4BJ4;x_^i> zF)`m=4N}g`^lJ-Z z)dEHaafY_ZZL zt+-jnz{;?<<7OG?UW?AW!_9yGD|@8-=i2Brp< zbx*-`LxaLukcU|q=6twW#=y?-`+L6@11EzA1A`{R%=!n-U{^DLY5+NrL5rcM;=#*b zo%~F!EURaNgxDDVF9gvH77ULnzi=}$G5lp>VCY%?L1ik-w+l?HJIGWxZ~NkU

{$p_;Y*qEms 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

YfkmN9~ujLZyEz;e6{Cs#4H%>D`Lz%wx{4uvx} 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𝔇S^h+<~wX^CUtVt4@Ja5HS5e~6!P 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%0Aq>n-EOWsWs0lB?a6xlN|08}T7KSz5Aq*@` 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

%(!eUtuwfOf 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 z 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�*ON%nVEn&7e(b47`l*wlc1{ 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

S^rxJ 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�HrSm5r(P$7bjc= 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%0D?FrgLz6QczW7x%VVYMe{P1b}t~=0 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%0D8W}-CO<=MGOtyl_DNqtpD@_CO7%v1* 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

nM%F&Kk(lrBoX#uz$hI_2e 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%0D8MZT{w7?izSTDSsz|6|P@c0xX0|OJ7WCoKg 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
  • fvp*R*MhAlzRVx1LS=ztI1W&m#;fr|4XmC70n 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%0AJ<>YJ@PX25~nsGVn3Z_2AnC;%o&G+dv)RZJ>_i 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�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

    X4o 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 z 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 X$qN<_%Nt=rKq!Yy?r# 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

    jttvD(c#Dljul6Y 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

    gH$Yj#S4Qq*fO3)G2YU}^z} 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

    j6lbfuDOn-;(y#pwo$8f}( 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

    xl|K|gEJjua z5Cu84>%i&N{LD-YJ3v}NLBia?1ZFcZGcM3P(9x>L#KdqKB+1mk^c-X}0}I22sNE-f zb(okLPVN5+^24UfRiHEc)IM+iF2Tsca1J!7Ru^7?5Fzl`tS4 zNXZXH5DT>R5M&p4F-*(9tL&hy8w|`1Ob0gOTA%=U33lSB+g?nHX3YKU{tV>VkG&dBwyy zUlzn;YhdAHoG;7A&hY2=1kf$DOy6EMF)|1+eCYYg#K6kIFkQKe3Dg_;*vklFfcO1_ z7@%GMU7!IPhUW^Pfo1TpGRkpte?a5Qe4zf#WB9r$E{0vZ81FH$Ffj2U3QzP*DEz)FS}?ML_hn!?3sL#8$qI0fWIgs}D%=c!c9W`KJi#N}l82Btu5XV9qZ^w&8Id<^T_6dCv! z-+*rMdc(^g$nb`j@f`0PUNMHvUCaz(4NS9N=P-zY#+pD1C0IfCh=L}P7#LtHG?ZD} z-cDd-P+^$zZUQ5N2E&|p6Brq9xPmBl9)_)v+vXhvouu<Ti7~+8JR#1_$vE`mq8LF0t!0tIs?QiH5G=&f)!g1gDxoR0$I$U z%FvUta4riA6T@3J#=e5LY|QL$*%+8P->@+-cQCyL9bd_EK06PByL@_-4RyWmg%k@8-nRpo)ezevzFfsgYt!H3oYHq7%U}w9t z{5vD#N7?4KdiEx!gRBf33?LB(ZV1K0@MU`tgCN7}_e&TVL>igit_flgX>4jxn7=NF zL5$(gt{?^}h8xSjGcquXFs{g3@#H_aU)ej65ym_(3}c-Fv)EW6hOsj)o%fxQfxVGw z`???o9)>gbmw>vQV2YRF_mg}3yc;nwP(0mfZeq{&?yjTUq1g+cvxeB~Xq_Mx- z4Aebc-p2@HGIBDknEjm*wAk@UFXPOaw^TsOO%Ag|SfHH&AQmG7(_@ec;PxuWHJ~l_ zAV)DUFy80y_%aE!pZVarAW)4ok^jN*Jraxz3}77$;tYqlE;RS+GBYu3JQ&2l$#8vt z5Ca#(%e_IM26X2{#>4kEgRi|gD-2^@1hWvmY>++<7LY#Jeg{xDO8L`_v)mw`eCTC_ zFhTuSFbnL=jR%7mS;2OK=QhB@kSH4k4qpESIu#aVIs+%eih}F=gBY2>&ST&LU7oP% zVG}1K6WFDo&09T;uRgs4%>;m)&LF|?Y#HNGX+|c-gRG1{WDl}3?CH49_{{P8&(E7d zC&mBkx(>?HV2XudZufQ2-uT7c*BKeNJAx=dhDU#|gVu$81yM{~3~L;J?D{Ux%*1e^ z=Q^mSdNboXBjXCkOFh>?J6UF4XJlOIIBVv0Mh0Gn=Z3#Ql}f+_Yt+dzWtOb@`^_9n(7 zR}Ql=Ffy>WiC#LlzZ5i+bea>yVq#&K4pPI;05XU1L>`D@_}2Z1`|vcz6)P`o1Pz}q z?|sD0z|3&4_YpVak!g$|nqlIiDU92tr{B51fk}jgp<~e$P|ZCFL~$@o0aJ{Bo`5=_ zpzCNj8Lr)KXJp`GeEf`sfv=Hik2?b&NSvPmbYMStnv6k+ft^8^ft^8);RZ;pTm#b^ z5G~JeA4DlYC`E?XAf7723a}L%j0^bQ?tWwls(2QISv<@P&zJQxf-2BgAexl{LNS7> z&X*t&P!w=6fSKG3KS53eb?!j*0v|J|>kqn1fpH1np_!n&*O?g>gIPSx3{Rf1fJ_BZ ztY8i(SFtlZeFoYW1}gkPEN+H9?%?@76!SzFt_pu(W(6JZz{k4U}OR<8fK&J>4)qLfAe>M+e@ANpm6{uhA#dLR*;)O zhvD)vurPp*GZX@i4YD$H@GCGeF|a@`ZewPUHDCf=k_NuUjRRDXKpgy4mW4rvVYhVm zj5aA2W=JftGCTmq5(mSviK+~o3@0Y4g6g-M%NRj1%g6+dV8(Z{ARdD}Lu0{-yL&kp znV4>YG%+YJ%q+Ni=Bo>+-`>gpX#aEY^j#PKv_~t&Sy&lvf)w#GJO)#Y_dpcfy=U(3 z1#N)`D`94V7{|i!J^yo0pDH60!)=gaMka=4{`PtA6`0u>o`D277+!!VE|ymyiV<|K z?eYtgL|BC&o)BVr4iXn?VS>^uZ$W&}qDls3P%wbFj7$t*>Z>e>V)(gf6Z1C5OP`z8 zfttlXHf;jMJcMds+6>AlO`A6{GjKEf0!cBmfTACyhmi@amGPY{h{wRr@XoP+-LYCw zjlDb%#_E~K2xFcThOth9SuE@f9Uz0jgNoZ1Z34~Abb4E1L6gj{Hf{p7m6I9` z1r5e-1=ZAB85y>nU(2^~6XT4QeQTMR*w}WQU(3h9&H$zu+1U2;9r*pGh>-&#z_9S% zYW6)_89RhKwMC>5342?b0K`WuVK@=wgnBsy^yby|?VHfDm z3n7NRpi3|Ig@7nwhJ~P8%EcMh&7KAt=IDFh#>n{J8$`)4Zd$|7Aj9-}mlT6cBg>mz zQVg;TYp?S&C@}1q%fz70aP%4vgF55nZ(Ix-46kM|F=#S_NNtAu4JwQqy{84N&#HN)-?%8VPlc7IT|0WleD8E(y2VQ^u1xKfJ2o#FWZ1&oY`LO_%!!>!lT z7#X}7_Pv<~YC9DR-^2L#+D_0)pT=)o49pCZ zzHu=yXfSp+Fy4A&#>4^+DpnB5*ww%Y3Ndqri-o7ZG=PS7+dn9S+KBTT7~4N6gK_}_ zXwfet=)Osi6nN7_`v+yv!P6go!Gl>#s}{%fKRnuFZ=nV4Kow-^DmqXEDW!| za5Atm{Fw>5w1(kt;NOXz%*;#-pTBTImLY*UkZ-23jS4lCj zFnn4i#lXtY%gew3T6X;D({@h87Lm5?pw*zWH;98$%>TeUvnFzYSns$+>R~f8Z5CWh zE+?r@R)Mm??V0mIdxD>UDdtCDiUq=JVcK$Y9>}{a z&qQu6Ja-brWLV7!X7aKyya1_XWq1anxWPQeqrM*K+ z52nNzZoCa)5NEszB3Yk-$VR5SZ$lWQ7(ToWVUT6Gcw-(T1DiP0Dd`W}E;BK*Fx+_? z!oVQT@@5a?flt$R?t3|X&hh{6BEO94zP(#U^U=1J77LDgb!M3^kv#*@ZOlI z93U1WGvnQ-AjfjN-ow~(>aYaVu^YC7RDqWkL6{)Nf>?~K3~xZbV_`TgePz-IQC0|_ z4J^vR2$JIhliXkt@Y13O@8He^vB1s*o5ciH19m2u&kW&%mKM!e2yy^uX%UFU$jrFx z1<0A4ulIlw029NcRiHJdU7Yyrk^#Gefe|vZ4{`%o)l?1!CT5Us@TCC^;v&!G{w$s+$jr`g`)vpV z2LmWoa58|B12br$+8#&>I1dUV@Iti{;5cGpJrfCHF|va-Fn|}TeF3Ru2J2;zVL0JC zbLulbCMJfLptQ%#u<*n@M#kCPV2Xv|xNrB9b?i(`40kWi1NBq8Ud>@-ToDYS81C4;ILHC>7+A$y0oO}VII2c~;n9s=AJcAKLb21!TJ0CPacYN)9M#g9MAWEQt zY1iF(paa^zwa#Z`5M}rQqQn@UgD7!^&bIlW=D?c!^B5WA7}}qK?3QGh9Qyvx>MT&k z-wkH5a4~>Y@G?X&@HQ~*-8+MkL6>306HtECWq2R@d-nbSc2z{#{xx#z-D@F{TpeT*>Xxn3|6)a(bj zgh7g7ywG~p!;`)p zOn+J!TTb0u4rSAP2W!TW)#mK-a2wHIKd0Vq|!LehE44iCh9)DnD;A~{u38HxzPM>=R zny@_zqJ$VOo_oj0_|5@Di7*@iiHR_RDRBm{3eXAxNk#?+NoEEH1;+M?8Vm|dw-*I4 zD6s8V9KfK^$aWhf)X1@OaR7rd!>g$jq=1qzb$S?a7i4pb(u25?~Nw zc;+zU{Q-~)uoke28?(VGzJbhOn1633^9JMAWt*2VaWgagyD*cPftTU)`I*cNA`GiQ zlq|!g!!wx~RGEw!R6!R8sDb&6kA;ju+xT=C7(jPEG8lr+^W$N--Nkt4TSEXd3&bQA zCa{6*4BDU^{7~q|90P}Fzvph?-&{H%YY~@hMOQUu7(E29a|SLGhUYgQ8J7@ z59YBlFtISc=wY1l;HL=a(2V`c5EghC6~qKB{oFARJea;rZAr^_E-p5PX9xHhU-U6P zJHXGz`04;Z0~^!N`~8fJzxx*xP!4%`7x9kjD47YZ$GjKB;o6N>| zU*_0kHeRp*Z$ks)l%|z6?wZehiyCxflW%)^&0*1cKQ? zV0H+@{7x>0ForFiTnv#6_u5z(qQGP{n2dvvEFkf?2BvchiWuTrm@X_VVu)t|kqKZj z5lp5sPV3}iNMm4P$Y7Y#$;FTX8kt~X$YeOs#=>}F1LJ`B&tS212|V#{GT z-o(a`%W%1gjiDH{8<6q)D#qSUt_p_kPA-ND5R-9VU2i8>6+>Sq7br0LI=QOA!uMu@ zs5+2B#)q>QyF0n+!CtR#VCwGVV!R6$YG4G5H83_XH9-WMI=LDlf{ly~Og}roDt~rx zH8C;-Gc++aF#UoE{p#Rq1_?Ez2(>UWeDC05yf=&Sdk0r5Bf}dA=S>G!8#1Szk>NE& z=5+^G2P4Bv2+}gKHuq z!!-!!S_ju8Muv+J&czO{$&3tlI=C1nGcrG($N}>C=KNop!1!w0)k)F^!Sw{X`CiX^fz} z12XqV2iJ5)hW8y@4AUW+r!%s=hdAne2iFWnhPM#T+YYXoj12D}oOc~u^B5T?cY!r@xbH0kX_OM#d=+nJJxIs~8z(K{&HIxz;c;OoMQyb#kp`1Qih=_srpgc6EXxAIxS1 zvG2_SQCk=pc7P>zbaHKBWCXGA&H_=}z&aSVGcv511P=T)lQ?!TGAxF07Ej{X$;dDZ z!kIORV;3XCBnW5HB#zyT4BZe;_au%zj11EuoavJ|_A)X|g>a@$;y4KAFdPIQDb)X+ zk>L;{s4xKea(*Y*F-C@Eom`;&wXBotI3u_WJOQ!teEFT1Sit;?C2n3(!Hxj@%$fJ#+HCZ?GZ$EK|V9XAc)vm=$b z0*oLLMq!4V0W(eofUXMw>1zNR%Am^7y_@mkdO_%L2dE+f&0mANRJ{{HGNAhYyzs^K z;K{;MAO;&N=#qBOybGv91-j`8Hb2M&J}wX3lcVu@Xv_?gR)dG2K*c@dVc5-k47v&?w5F4bfx&>`dBGXb@^n^)HJx0H$N52`ri>q|pMXw{3}#@kVAvboa5{jI z30zAsSTgJ}I=EwP59na*_H|zv8CaOW6dPEYoe@-(us1T@z1ae4;amk%4G<*^P7JN9 z8J90u4H`4w-pR!{O#)PTI5W(_BI?5MVHM+abhT~_H}*45|J4Lq83U?S7@0xSo&VPv zF)}f329?#aAW=Vt3lkWB-%Vj;Vb}_aN>+w*6Bu`0iDF`61l3bap!qi@CdSXA9j61B z7+5xf!U42Klz|CxP$N6z0bw3S7B(ivkFrb*v7r9Qy*5zW7DVn4231Rm3};p`ZfQIT z8dqGqpooDX8Pq#D)W!n3mamP4ai{R1HWr3d#=TWLE=4gifig7%BNOAL35*L)27p)( z>=v91U}R#R+{p!M2%WIKvP6TCnQ1D>J!uTL?1ez0S0*qDfs)v>WsE|MOpHv7KV+F0 z@<3Lf=>l!>1l3{;B@9njF)mo5!N|nW0n%N;(7BOu){%*9Ob`JUP&Ee{^Vl1;;Y0u< z3qu=76$``Rjf{`}E@Nh92FtU7Nlq}yP|fgY7UR3Uml+w^8QVI!7~jqUQ4BQP5!-*bF25yF?D#p&}rYc^rB2XLh*dz|d zr##0daR`AdXS@S3t`=m=wS8b)x*)c6b%F|h#<|gZcC>(odLK^&oyiC$nHZ)=|L6rx z4KsaiV*JtT$jHomdm;yDRCapwls=fmls=HeBaj3O!}RDGaETdU36N0?>lqo=uVOp{ z3Nj{8_%m!`WLRr?Vx18a6R21Ot&3-1*v|-Z-v1X0jO>j4-x)z+04lAHfQ6$N*%?_u zLaYo2|L_keCCxDTS31*i1xVP>2u1fp0NR(I_IO-;@IyN8*9 z;mnH-ti8^&Zk<`gB*n;Z>cs|D23Ce!Ac~D)*2@j7450B}&|YHjlqw@+idF!8Gc)8~ z8%b8k5+P}ZAB>FibAK>`4mnX|U|;|pbfU}%xsDlh%84du;71$WcVS@AV*ni=%D`aE zFy-|IRt9!a)f>%#d86+B*Rvu$!kY_mFm%;#wa}_X46+|*#4?5nL zV#aW_FNMLJ;rCO}4k!=_I)T>?%(nwIkMFEVVsHR+9bjBHh8uk;4DJj|7#Z&eEMfEp zbA3Q0{>iLJY>p(hDWC%)Z#Jc{Fx+TL0d=*S ziXU`M0F}fbK7%^Lp1|$xU7%q`P!Epja$gFl4E-E9f6`0P=;DRG6vVFdExRUw*N|-u zg0etor0tpjI_ThRUkd2(kk9cmzAj*66k!3G!(atEc!deH(*!gvJXns#a$}fX`~d2c z{mKv)c!&VR1g$&(c_oP9Z{VT(Gt`)v7_QAv0vB>%_rKY{O%)VC@4FenOvs!~-}^aA zAkkiB2n#%C17U*aY#>bVoDGBtnzI43z;iaM`%)NL!3l+dfw5ZvbWgo7sDqB}2*&9T zb|^A3FuYoS40I9|=pe?nd6Pi1@z>rkGF}k`k)TPN8~-}Mg7cFY7(y7g9s~`JGchd7 z2Dhj-q=6jEz`&5nFhA|e?+#FE03}L>Vutm8%})fGm>AAJ1`R5odkh}+JolK9VMhNC zrgK6oo_$*gD!5no{9s~WVuw(iXO~|9@0bPAOdU)wE~qmwGsG}}j}Y8&v=Ox76|9n( z0Zg&5f+_Gqz%?5mfVKyK1sIsv_w#`TI3Nlcn0TKH&TTuA#mK;L@!Jg0@I2o^p{|MB z)LEFBC;j;j+VBdd_!%G+3&?7Qn|HMq=5P6TZXswD;PRJR4AKm1pE5E?gR<|H<%|sS z3^zd}h`W)ML7Cz5a?r3Uh*V_-k(!_@6U`X*Z{5wv;LO0v;KIPl;KtZ=XAdI-n>52Z z`6DOR-eDAAXPCQlA7~%OzjgZ<8GEu1PT$AK&G73J=oS)IFvSny@iU(Lyc0B_4swJb z$X1Xe6j&J;KoP0JaN{dzXJ*Se&=C2uExQ>R^ccXD0hD4~4iaQzV_2NG>eNypR#xU! zFSQuh7*@U1VtgmN|Ah`)1Jg=z2DS#4lkIyM8Q2=wwt+^%nC>f{ICTv?wKI(a%mUA| zELaL|Rjzoc1-kWOGRF!KpBZEr0|P7bem*dt1HuFl?CJhc2HO{ zt}Xz%SBPOr-q{jHCdQTGj6Y;oiZf_3e#!4yZNbRI0Fnlcr}O{$WXQ}8=5l~ZE*7v9 zXbH`kQ*taqU_l|Upim1FNDjPgMxS9~%!&CEeV92|z=6RD2@EaM>BrGcYjz;h%HyEodzlNF208at&;ok1WH_DU9DvdvY-|eA)F zD2mw`Kx__%SZMPk7JQ8YFT+Mw#%b}fd<+{|L0d)6Dj&b01S*(U_A!E4+zd}yzzhcF z$+E|9C^0fHyuQo?+C#Ko`3rdc^qfA%FQ5VcSkOw5Q$37FK?}uVK_?4?taw-P1#}u? zET|Qm4{9xc>}3SAz(D|JfkFVp00+S3<)C%)pxglV z{sNHaL5Dywt>J&UGLDgfp?NJE1A`{RgqQ;|jBLy^7(t6pr%hmd01EgSj0~(SGZ;aq ztFIJUdM%5Ch2hCA&>U0?h-3k?8<>0;*cevqWn_HD%*_sBfLh4AKzojS7+6>s7Uf-- zF3ZTq1X9ez#IRp^!fRHLyXW*VPIwJk_Y0C>U}M^^yx*1A5h4NFjz4x$@_g^BRdllBPb&={*di! z-^<9<$g~Z#K6E21!`=;-L_P&f@7T4FiH(`z(}qhT3~UUGH(nB9;APltqnri6AB;6T`W6mqb8= zF&J4G9`!PUS=_gpu_UCU8EnwnjWLWv3j)9e7 z6^LwLy8X3|fsJ9|hdKs!hR%Dn3>*yG@6|G{TFyBCUM(lX#QU|3-5fja)p9dToy5q% z4XVB;-LGZfW%&9kmqD1}!N)qrevStp>qHnfeXe5=XPEx2jzNOq`uki4NrulnDe z3wKw20Bsuqk?&+d_VO@1HlMJ*M~R!A;mWIA22O^vhea8<710LWRPMwUdSK?vVY}OMFu&r{h-Yt47?22;@);N3$ZbQ#h6(^E@J_+Sy^`r zGO)2;c$Le*&I+=Kfsga1-IG;!d6}3QuD{AB=P%4OhY=zg8c zz{JG(qKEO#>g~*ssW=D=+|C9u8JQq@xf!m8uGj!J@yDxN23Cg7*SQP~q72Jj&i~yf z!@|r03T$T16%T6}m|K`Y6f48(hqa8?WmZ3|We{U{yo~YAS5Vl3$gi?@zJfyk@iN96 z?{h&-`S-buUuAE+&t;ggp_}Q_D#laO_by-(U}RXZp&PV$2~2T9c)SctL4v}}E5Q`Y zza@+e!Yxc7N`wJKiZiV3?qXt)V_pMNpvbTmM5!>W2U879J3%yP&PWZ)R%h4+5@O+G zIKPUq;ow@({w%PC48lx%moqLoxRwLd$iD?+f|~6hK}J>vuoD-ZTM{y+N4x7mB)+dK1_IGGqe zKKjbXz``(p>Pt2THimbvF0nCiGEQ41#=r@>>Ve_Gj{AHJJPi$?%?b?-EYnwsfp{$n z;Hy&H7BpVBW?*DsITHzDF|sqPc<_}Ew8(6I17qLcXK_pn3|%0D8CW|&6f*;Z+n>uz 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 b85tO)nLvGi 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

    E|Tl5G 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

    0)fS zdzG1q39N#tfeBKfBLo+BNNC~jPGPm-?n04WtdR@@8eH!O)*Cq!eVCl*2@TE zu7@!}TWi6B;ClAZZ7a~-8Mi^VJu$xE-!pAL=-zpdrx=hH5Q{J@Z)0ryyj_func>74 zuw&N?^*($8I&<_4g#U3igk-9?3lnHij$ywODAj@%2nk^``}jw# zZ^syyo_G)}&CGD*qZR`@!_kjg47?1-Kx6|Gh!SR)^HGaIl;PS(Eyl?K$3AL_GhF|u z1wP_OiUG7&8`Ks6iO4d5Zp~$2kYi?G0BzU>txHk@X=6}kxb#trK?OoGU;C)Vpvv$N zY}~bvTHw|^DEl)ofUY((W$62)#bC~OdyhJUB}30AEd~~0hW(w4OWve}A;s0B(=TaPkA!VWa14?e^R9E#w(d^tb`5V&W@#IULy9JIZl^)`&G zpi`SbR)EED9x9;D@ckI$|NqTwpx*dL&~a1`KWZ_sF+2r_IcRy}vyWN~!r&$#sDHr# zYTQ4T*}d}?J3FXb!p`vgBjhA0kRt>^JjS2L7@vRC5@zWAqy@eRh++HU$kRQHH<#TA zW@Tb%ULMK7#c*z(E2M1QHpi8Lhhf?TX2xdWX%maHet0 z0I|SFk@U=Y3Ywn)83I0w1k7g!8_K{1x|sZRTbnSbhWMulVS%qEhcKBLj`cFam>VGS z;Bu>Zc_bq%#0&<;ulzfHO#uyAgPaJyp8UtFCO$?6h6PI_K?4oD4fju5CdR_VuxFhI z11rP2d9DnsOkj2s6Ntme#js=!(UmtViH2eUCTti0L4$iTw*V{UGx?ZkCkZ+ zh+<=Czuf>@>K++7XOxNP>A6O&G#>8+2B*4tt1Xc*q#>#qj zD?8{MN07nntUo{$11ocn=AI`_;FZD+U>2wq3)0NM%CaMF!qX8>8+#}Dx&2V>*Jh+M#Vz{?Qo_SD5Ml?D+{;01 z9x%zb62umqyNj7YNEl3tFfa&-gISVbQfduIh3sk&DF-GM!6K>*3_|K_I)oWlgstfi z7SfPq5Yn6nGDe$$K}d&zK}e5*K}es0K?rm#k`V)gkO>2WkQD=ikQ)PokUIl|P&*UY zHK5ybg?d1@bIfD{8$1g_%>@a8?h6xI2x2V-5i6NCwF@%{tpTyuf{1k>Vm*l103zC1 z7#M`QK|~LTm<1w0_frVX1F;r@h@~K64Tx9^BG!S3^&nych-e4xx|#(d7J`U1AYv_; z-~uhDJ+y^~L58t=0S|*L1Bfll*tLL%L4lcpL4gG{7YN!40NTXCz@P;xW3(EY8Waw1 z;b8#X(`*196ay6n3=GzcAW>V!TPt`NY?(mjfv!|{W?*1&W@KRSU^u#4o`I8@;a${~ z>pwwR_wpWjP_gtW>d2>B(8+FlVhsBI0;@f zzzVv%5L_xR!B{+iv_%TO;Yx_%8PvEr5aYgqjbSFy7*U1?nhibjjI1DUGcX9be2fCc z1K1&-piBluhPG&kD1!<^a|Ebq02#gqg)M_2rjQN8^02<$!U4<-FSr@Fzyu?R#RMW) z7#O(N7#O(N85p>@8Ne%2xcC?txC9v(xP%!PxI`EjxWpM4xFi`ExTF{uxMUd^xa1fZ zxD*)}xKtS!xYQXKxHK3TxHK6UxU?A)BtSWk3zP%7 zKsk^LlmodyIgksK1GzvskPDOpxj;FP3zP%7Ksk^LlmodyIgksK1GzvskPDOpxj;FP z3zP%7Ksk^LlmodyIgksK1GzvskZUa$XwCi$ZU#wEh)IJ8IS?TaA{0P`B8X4|5z3(O zQ~?oc49B<`)EO8UxzWw@2Z&^x zwt}(ini)64ww=+8lQg&OjOK1&+PyQHfsvD8mS*#jcVaBe40CoxGq5tu-xbZk#yD?R zG~@hZAPQ7&Ff7}&f$7sp#;dze1amSo{Jz!)s&*T$_ko)EAI^(0a5KzeV&G<6&&0sT zaFT^VfMGoogCK|yX7~?M%*@L0@d)FG+q*y&@gI-~0|�lZ;)L#2A?vx-N-<#wxdU zG2Y1KWCs}lUQqxVOF7BHz|ROGAk9`#vrU+pfdSMUmIDo+voqZ8V%%!Y%mUKI!gLaJ zBoR1eJQO;i!pH;?VBiPYy+nwK38V%#@Gix0sf&>TG|>uKM!*239KhS${$@c-3^~Rh zvq8IJ*ccuPLDx^QF>W@7YGVQo|1&Uv!dVQwWBZvn1L%m6o>h>t@`VBeBd8Q-;AChQ z13RiyjDZn!@HNBv{qs4OE@!;CXLc|XGsDIG^EnwfArvDM!=%-WNB;d)0aYa+35E%m z`x)=DH!k}T#IL~6cqo%Wp@Heg6FUZFhVv6`7*rXqPPAcAW0=mupw__jccKl0I>WDt zHVhgJzbD!-XhBFukhng>yeE7N#*8fs*ceP1T4o3{*f30d!^pVS`0FG_TgJ9MWegk& z4Aaa1^q*m4VB}z!24*obf$d~aVOTG_VAdgaW+rBkwJZ#mC)$9nvYKeaz@WzPIq=!$ zo1jtk*I?1<;KtJSpfkrlfX808!dQ%FB0*w|>|pH-h77BWe@w7uWCA;l!Gz(V(1HUq z85x$BGsCypj7WTQhBaM`2O3g9@(Uo_oVpk% zG)OYCFo3+vV9l_ni}AET zVOV@Ph=GBHeLvp{5T66Aih+gqh2Z+v8$h?kf*i-d!go;U@V8%FEX>UF4hJ!?vCcmn z#K6x0CRutxCa{4H-@hTw%)|_G9Ww)nWMKu73~cQC`CfctXXF42GO+Qz5S(;Xl92(* zmh5*J3bY*z#QqeEz3t zLj&WMC7cYV4Go}mqzw(MAbA!RhBGaU9Um`%3OpEy! z9VEuUFoo~mg-bykOboNQ8JHOsax<_ooV=3CzyT&X!6X;M)hnr>-O3<}m*Mf%RM5=O z+RUG?LEc!%%{ZNJA!x<_=FEdXC$WQ$qrZ~MIFk=#3^&7UzB^}*sIW4F%wRl{dG$&v zJHr={ag3L)rZRq%{cpq05U1s#lE7fJ~-H!hN55M=KKk=z|eO&A2* znZTTOmU&WPkOQRyB`_0|P*fQh7&I7WE|y}@ z2b~HFD&*%ZmSQkw=vyqsV8XC`BQJv)m~9O@2bQsau@r+R!}&G54D137{l=?zT?H@U z>RZkTVX`tD76-9FXNoM6Vmu_?z6f-_d7tr~{!5IE9L( z!<-`~kQKL#plPAGM@$%G89Ek8F)+$9JvMo=vKL&Iy)}ih7|%q4Sd8poPcW!6v>0#O zzFn4|iJ@ze6ax!bl#}82LMaArhVP4{7#DRg_Aip+W7zeLhd~fbg4R!nfmvb=Odw&< zl&lf^u5UbyXN7islut0 zdW?^5I>OAt&9LVi4+9^FWPB&P=Nk_{!`^S8b4K@m<6-+KafuY-Y-jr4rc0RD%ML;CuJK2}tctn{&-Vg(OMjS*kewBUwjYks1 zWRPd&V_@O~8NcK<)OauhZ2XejAmc$n!Jy7C!T1n3!Y3?eJjBGr%)rO6Sq#)9Wn^PG zD*gwQWB3@4i1RTxvfWes(3uVjh^ZVOI@6h$80LNCVPIwikqp)hSL+Y2E@5P1IR6cN z9{tk>#vQkyHiH>pn|Is-*?jIB52z&B30jE(>V`3LV4h6k$S}e9Ldzi*&}id?<%}RE z6Enkv#ZnAUKv&L!UDvVa4aj{H7E3W65eG@RGfXfBw>Bm$X9SNmGQ1W8t=Is01sb7u zUfgDU(#?2h=k_30CWhxPZi8A~Ad0c0hY>`xF&uk&8+5+fiI=w-L4qKfhv7d+kYUT! z)cq$I7vFmx$jZpD^=c{u6NF^kdNq}CY2ntZsVt1!uBI|BD%^H8m6c(~)l`uC*9zab zIt?`Zx9w^w1H;Yzy^Pyzt~J~ZWana-1Ue&?i?Qj-EG7mXhFNoZ85wvQm>$mRWdzL{ zgD4?}=WBZz8H7Oj7%a}j&G1*P;W2@K)u; zhb^Fz7;G}bj;HO6@1`+!oW35&&B(CrX*(kWE7PvW;M+Vwatxp{my?NsffLjr106cf z2KP}N{g_eD#&CIhJp%{Bjp_BE+eN0=GjK7yo?g$u%`jm` zJp;p{$vupxlGn~{4rF2mb3ijdlY77;t#2%L+}!|9pY6LCK}==_CRqjs8E#OEhMQqF z6KJ0u!;R&P9cMwxK+FF?EJjv{LEr^|C5$W#pn+$J140KtE0F~lm>C2ZSXc!Z7#O7b zq-QcSGcXGYGjzEh}FwJ--@(2qfJJ<}hgFepn^Wz{&7^l{o1B?p5LpJPc227#~GFs^MjLQp3Q{ z2qGGpz$D9>Z%hmV3?NbvypQBb4TA(ol|%#6lN!cZLQiUB7`oSqf!(gm@NShjgK`7Y zM=-?#vIn$vK&62R#8hPfks4r9n{m})0S0ZR7o7?W+Ko&vI~5po7(k>h0|NtSXM-sN zNP%es(~;+F3}#@CSp&<_=WO5&VU~;x43?k@)3Skufx(gC(JNNQ1OAU*u{tw!9}r~h zvg}2aFOTVralffCXlTREMStAq33`g18XDGq6TFK zHim@_$_(rvJq!#g43}*;Tq|K>2CD;&l`-ft{DcnpfaZ637}!C3Q9&}Ggb13lV+Hvc zGOQ|`v_Git&YaQ(9RIUD1m5D*D+^wEp^8QGb@0n7p>Ss5PIFt9R$LY%dc z>0u268%Tg194!nU4AV|9Zh60knT?476f>+~VK#8gurn-p&IX?U0Qa~5|0rEKow51p zlmHH9hTY#w8CV#;e=lWVW%vssnRAtM4u`8Yv=Maa5DVjVBD+ri-Y0! zOO3yC7(Z{nTRG z@ejUUxq<0urzV3A1DI@Jy3E3$2Wm8fS9UTm7(qAR+cNy>)MWfKhw%!F9mD@lO$JAX zZ=ITq3+6I@>(q1ti-3l*L6<4`GcYjtGcqs)Ff%X&GC=m{hcPfPgoF1JfR>lEc4;!M znakMPr5VT2(WS}Q9oW&OnZ&@!cs+a&d}eTSOb7%w2q%IlCdO;rp!O>R1A{EX zE)xc3CQb&>d2kF&U7&F%Cd>^5Oq}~+8w!~CUkF0i1TqO=-B2LMu*C%Ig-I0*%%H-O zm5YIal?Svp0n=nwF1X380&tUA1+kh;OlT^DLgmZ%KkQ7b4AWn0Fo4QDNbuZQvzQSn zltElj68NqNVu2zZowPY+*%C>R<$BaucE=2Ry<9stiHv14xM{Q=*J#ASv$6K?kaWBON*z3aTi< zt8u|8VrvkHVmuSczy!)`(4klcb4Emp0kzc_U@3+b)NEy8#Yi^DekLgeS%BOJx}b^y zm%|uA4r8#On~R(o{6R6#0NRO+IQKXhwD=xWnS##?V_;wiWmq^DI;IRNp+Kpcg&D4u zjbXb3#1zmDX($tPx-Hhl`dkdV=Yo?PxJWp61jc4!SPx?}Bs2UCd<9xk4Z05!6lo0q z13_o*GcmmHW_$=f;%ajP<6f}VUS$x?!tlHoEWpa}62jnSSkwm=VP-g}xR(($@cCQ; zw7eeVdd6;nEufu*oS?#_U0?#J1Y~Fsm;e!DU|`w~+Yijfu)Kj$1w7o%$i(nn5ya$V zV3@hev04Aej=la|91L?;IWq7tJYVU^zz-&c7(O1bVi0OzdRWaM0%nUcd^rGGA_gL* z7#>zLNHZ>8<;cL!!_ZhTV|gnRBNNlJm5!j9o}H^0=YR#6LFO@tFw88N+PGd3)Q|4u zpFZy>KPXzd_}iy{=lI+lA{KtU_QNLSS=*T9`n_ z3AKQEpn9A^l%cWULh~!o2scO{c#+`Y*NULA!)j3CXy)JlN0yl#? zr!Ipa!?vBe;H$Mn8P4z21zoSZh>1at;lUy%#&bRo7BR^)yjjG=0NSvl0%9?K^Lev~ zNu6QFBG3t*kj@XN^J$UOauXImMW*cndk)MbE`dI}7m zy&0I<7#SGY8o@0xP|3r>#^}Jnz{J3?UKX;c4^&Qp%?540L@hSiScJh1ZVaVNjJ%)- z2WMMBI7KK@o z^Y?+4QwcFJ=rH(vda3~`Y}U*E-vn|+FW43Riv45+x;_`7>@qsV_;@jaEp(D9ZU)_EWE|X zAj+`h79V&kET}Y)Wcc37#2^W>ZSxh-z6=mo2E^TRg@-|&Va+W*Xx3z4PyvlCfU=@q z0~1JGA3_;0Prb*)V8{R>tr^zNmS(VKWMHrXUCqY8z+le+I0st`P)#=-d>B}dGz0kHMbHj+ zhQ*8wC;#$+4hI2ID?l1nf(X#eFT-jOYYnI_Tnl2Y0}<;%#0C(t1EO^Y*iZ(Boe=I$ zM#iHL*cf&(GJvSP5WxeC4FCV~F&qbJy9^?(fQb8ytj+)U7#=Y)wEW{^cm}2z|E^_h z`N#K?k)h`wAHz$Kt6zZ}06heZ5hVJ7k)i(|AH!z|^^K8n?j#ue~4^-N?(4kJ4#O)-F-(A5sM zV%`QuC~G#1#d;>PtDO<5HkaY@QpPtO77UC`tY;$MbXYL5GxRmGGcXh~Tw2O_dp#o~ zHv{N8CoYz!EKfj1_lXE$l?o77am-o zfY$edF0=#9<1sL3g2pvr0}`Nn#z7;PObiT`py4;rB6=%Oap4AvJP^Yjbo2=;1A{NP zWzE14z`(!|$O+ls0xB+GgAs8I3=E*d0YO*VWiT)>fDZo4VT2s|2RhxVjDdlnoPhy+ z#$PQH?2JD~28Iq$hUo+m+)@nFz!&a;YnSKxpoJO?42*mX6AVD@E3jL4EntLnh9S$n zK?Ng&8^gH;;BaF&y8xUj7(mXw24@E|{I7znOae6kn3x#;R)NwM=x9`iKQLwp!v(m8 z2!`kD85wv$szIBzc$gSK7x;h(Hqas%1_oXx(83qU(qve$i-SUonFDl28`N|zhG**; z8Ti3tn@kK0te`<7(D)|k_)*X}2|H-u1%yE%&k2&{g3gg}fz09p34@jcG6;jtD}ovt z&+r@SWYB4`P$ok*165Z2Tom#u?v1^G7qj^Fah(g3e@udf`1I!?N{^XI4#SWnpIM z{l~|^!qoGRk8yWh&p$p6hQ5D%44^q9Mh=F*3mBKY0FB3hHgtiRpk_YE{-2Bto7XTd zXCHhjOw#Kz2Ul9hpl;Up`__>-)xATAq-Ut96fkgrxSSw@p_7T>=W52r4I7!*SsB*e;A3EAy!C^L zft49dvVcj@7*7Keh{?h5eLK&K!qUdXuRA!x@8NFM_$bGzz`N1(kwAe9Ug zm>62tF*5LiQY_cY?3a-n&Z!)OFk&HRahtMn)EfqdPS~s|m08 zJ$QATm5qhr|4z_60f=O0*t~;@frH_%Gy@mIwmG1w_tjvp%hw;tV^?7HkJA__tL9RB^7D$++Tv z8%P02fI*z`iRP&rdpSAT8Fuc{0M9zX!X4C<;9~@df`;wEB?oA|12;pzHfSCO9Js%e zAKf{_#Kgg{eU}CUA4B(UCdOqd-Mg8XxEXesUD%+`$jZ>Vn+a;~o+Gl1Okh3(55xYM zj8Enm!uS)e@xI`C`1GNl1QSEwHD1sO(ARhwI2ijuWFyPrz3dDejV%odSN6Iw@GxB1 z!?o|Aqb9!mWCPDx@-u)~LJT{c7=)NWL=%VvwE~!!86LUaxF^rZ1lGd9%!tAj zW4Pxw<03N?E6Ck!Ac8@H;ep$R&rIwf9%Exa<76v#hAE)EhpY@d3?dA?3?dBt3?hto z`WQt77(^H^xPf}9XWaG(a4<8-Gq5qpLR}=wAjBZaAjBleAk@Sp3GQQp9aF=|#2^nE zhk4`%W%4pybpy}X+;t0JWCHD!;$yhu1}ae*Ks(pYxvgth1e!(!1tl{Bh-8puIOFzu z)iZGp2%nANL$?{k-Ug%<1 zFVFDM?a)ULb~aF4G5+pjT;9&e&akYVk%5~b3v>pHD+4dXA6Eu`hQF?$Ao%Ml!0^YF z@q*hQS7vU8Gj8pzS{%#_XT2EM7@FK64gxWR7@oN?2r+?(CJ+gC%a&Cjr=0bIxCFri z1<41{m;w{SUAGU@L5lvkf<`d!xJfXAhZuAio^qYI54uoLpW&k0pQUd(IhetzhZRh6 zfJsg;$qi0tJPbFdfG#??It8>q3zYI$xfrgy^*3H*VrORPImXPu3MM%ix{on4a5OM= z9AjqS1ar6;x{fh3a5I2J*q9l(H_QNS$Oma*U}b150CSnZTn>ht%NVK-i{X3z$u(V|(gS2HsQJXda7qmeJJ@^O9AZ6eMm7g78yFuhvS&(LK2JR=93>cZfo@d}@{LsWW zb5|}XZM_1sATppMeL$fjz`*?gtQr(N3<4n4J#f`MyK)(sKtTyo4N_pl@S~5hcJ1rtmPZfHE!v8<=Exe&qz?Mz)7D?)kAWGQ7Wd0yI6nF>^FtJ^Uft6ulyAlH@!{T-&2404x?Mk34UE7ry-+M1@R}yB} z)vm-K+`zQEU5P=QVQPmGV?X!qb|ncgbGO&j4kamuMIA~E(hSSraWN<}{GKV!pu+HT zrZ{M&cQNC8uVQtE&ojgsbQr#XNXEH`*%)*gc1#loUCFk#SDZnQVew%$#)~0~53_;S zS28j%m@;%ehC{SVe>^=LTps1DFdgwSb5C z*UP?WEMaD1289d@!=IVrkPZQ8By-1w381E}Bxo29mgY8*3sR|GL77#KinAHXdKMkWT>2(UH7{Oycq&a>l+ zg)`^bK_2|Bc;-AiBP+w_&!A*T)i`iqP&{(B0hG}}X@$XoW&U=?{|^@6Ocx+Ih?77p zMpkg*0xu$?Ub=7tg$e_%FoA|DWH_11HlLh-p6OS>ymhDim>3yO%|8z+#y74!&%}6v z`znaX@RDQS;q87Ltc=q@_2_ze(8*A}SQFYgEp8vvzfDe9y1d=!^#u}4udIrk0pg9PT(?QKg1`=;hp4TF}Wj^DpUkm-pnHc7@h%(MH z`MDmn!>L7-0W=874r=~`Mql_D=C+732rN4GK+v?7Dgy(9Ci7}p23_WtYz&4B+~AE2whW+!dY9HPF}O0UJHgK2 z$zaLg&9Kyv!JB!pAp>Z^O)zMI4KwKCi~Y-(7-E@0BxqbKm4SgFivcpG1v;p`hLM4x zmRW$Ij#+@A1$5O!7l`Nw5wk%Y9eGJIdp z0y-_7fnhU9*%lB1J|=w|BPay6F@lD;wu3~$S5oW)vB39I90IWpfkrBifLKRC#3>MQ znUO)3apQbO*(;zk)vtqy8zABqNb)v_xDQfsH&*rmh(6QJDEk5=`U>Q3@M!c~5cda& z_yh7r0~15*DkjF;GZ?R|WNKkzKE9C=bl(I618B1&XzYQ3VG3wV>~s(T+V;o*+VRK$ z+VRM+2sB>30z`mzH!^GmDcJ!c_AxQUFdSxL1`%vA3@1Ti=RoQ%fQU;Ff|-HgHb??A zj19W?VFw$-3nqpgY>ZczGVWk|15)%6M0^1eKS3)0fmomoDhw^4)Y$>rJ=O~%rZY1v zUd6{SgPGyBA;U}vXC`w4%bHbu4D*>8&bNp%Xo)afH~#f@5qL%H4KRy|8JzA|1;J~b zZW{kT{uFcy_WTx6#*4C`6e){2c%q0Yq>3qIi7Dg>8k24V4};$`WMBl1NuLpBU<3_G zp8?$}^@Ndu!JFkN%jqAWsX6A!vZsH5F20@&ih6%c<6=NUXULBycNr7t zo)(PJom7xoP=SmX14;u6K`T0ha28k?VkY!rhb-`D5sFGs(q+iQR9b{7R0GzHVqgm+ z^Yx{m8#x(3Cx?Ir)j@?AXyYDZTOxRJ@>3?ru?+A=Oc%*IrZXaLrkIVyUcv}!R{vek z0vcXj&%*dl7LZf+}{?)zw2387(iK>6-;t~NhS`4#UVHTD={*I zxeS~P3z50Y7(wmk-(bT*J-k>`W zW|}}%A7*5Lvu`7@{~-COg9$Uxd$5R2z#=vai`WV*VjHlCU1mbK?F|tDn^Qk{8JDu3`oYV<#&Ah?>&ymzCRT_icE_b6&0~7ntM*i!iY;-B)}7b1aAfb}YysCa?mqV?kVI2$zTTp5m27P{&?b z1aj=v6?~vp&>iOIw=9{B!Nt3ALj&V&Lk1HG1_p*XprmwfG`T5&~WI z4r=7iHrdp*RR}b&bx9V)Vq#@Dc1wtXo$2T;A;!BbM{fy%Q^fy`&p;^xB*npS^cLs} zQ;;FdpcFCXl^1Aa@Rkq*Bt@*bG8Hrf1v(D)%2d!KBuG62C&RvZj1yjYF+!||B!Wr* z|AE)QOj^Y_eZt;RQ(sUtV}IGBeHvc?gsYko*Tu2D>J1 zA=c5Sr57!K$-)Zp1RK~Y4zNSHz$78*uc1Ap&96$@Wz6U)|;T!Vv81@Pzw`? z0(Djy1R3UTVw^esIzKBDST{46WC1&u4a{Z(JDNd|ao$G8mhX@QD?i79Sd2_eApbCY zUU8GL@gU>er#*h$j0_W3-UJ;80H#2r?82Z^onaHl3=9ks%nS^mqh~?8_hlL9fK;>a zFx;99O4Xpj0v^Uk&?#C59;W?}^~rBdL6tFRH7aD$rzFE1(DEbj;cejMM(e@Lk3h$^ zfh#qnJJ7KmJ+fupQpV#xJ>P%$a zW@fw-wc%JlXi*|~Y3Uh|E*6G=Q6N*m3uBoYn7~GXEIo3pAAAeUvMdM-bmIny#mL^k z1ack2?>lDuConGW{ou>Z#4zWs83QxJ+`DF=%ZfoH(|iyKzL5mf-Qs9yXi)fl$BcoS z;nopt##3Imj%f2R{5Yb`ASgKht{LM@q4{^sL>a!$;0B!$DRAT5YtRPlFL%s91)=DJ z&$mFM1V8SWfo3zVCr@7k8t?_VfPooIGBGhc^t$kTD|qM0vMeZz<4h!o#mLU^3#5~o z;a?Q8Nt_JVlAmlj394!r%>ZAa#t))F2P71N7)(qI^BWi!&EN)gC_shpr)-cgXogD> zA`0R%FfmS&0L2S5C+g9!zYv1ftD(QWME4b2jxn`FQ<=k zfx>gW?2#Kc8JU@wKZE@O3KP%(1OsTKZo}u-9863M%7~G=-p{W&KDU~6P~z5hHj13Lql;$Ya`&CI~Xu%(-sfr%B=Cpg;; z8c+d|?_@#RIY4ds?O;I=`BfIA;pmP@jQc_k{5$W<&ctwN$0X2d?IR$HjrBB`VtaLd zB4{ogOmQ;&2JyHVW?ukZ#KXq=DEH2+JFJYn3}<#sVr0C=2cj4l&ILC8+3PFK#IUx- zf`OBH6^LvGopZ#nrp1DR3p7H&17`AoN(Kf70p^)477T(6t6D4=pWCl$u@D56S%M&S zV$921EWpPVDlvdqpdJ386+xPe4B$hyOc@wJCp>`0l*~b=X)%M=a4|4=GcYiCLktJq z5E{*}qQ!!NmjkqQcWsLW6WC>pJA~J@SU~zHJPbDjU+$RzDp?tBfLWj;1Y0aXCnszV z+A#3}xIWnmV=^XgmASNRdIJ6jWTW`QH6XYTmhR@*2j+Nmdlz!982-;V~z`zAs)62?$a4{F-QjqIG zyQCO-7#@Mub2D6E2la57&#*(bGJ*32sBH$SeHou1R=7@sF-;k6f`WvJ;YJ{+U}b=W zF*qL}_K84hW>CO_Yh)xx;0#bR&{k?t>zDzws1y;nwhT>*pq$UZz~IWz2V;8EYRz#V z!j4Fgi+uy}Wth6gpMjMbL~?-H989y;_=8SI0+C=gA4mg(5X0X6+6=-BKS3np_x;+8 zC!N3V*Op>9zF(U`n&IVsZ3a0I$#~NF<$i5thKXzZ8NZcvuJKoA__f-fLA{}Y5o8HN z>#K!A%Y|;fZ181gVfgoIA*h4#z6G;42)c$9q#{TOyXr^V*K_qiSdUlNd2rC2G3O|-Tmsr%*1eV zhXDf{!|NFaj4xDA%`o6(csIiURBkPi-F2o}iiMfs<_-hKt*R@x7_c&&oMXVi+Q9T^ z21v^#h`O807*Eat&E0{>ce3;67%;FiERy|pZ7DYsGsCJGAkC|07_c&|nPC7*jW?Gu zu9*Q+4|`6LF89ikc+oJ;Q2X`vGd$j9~nl5tq*t@IGK+; z=V9PvI|?G%w?5!uY`5I{fQN@++XEiPx%%54@bH1uG5(g_`hZ7(Vb=p521$lPk9irS zAS4s$e$VfW4AP8742ldajGOIPlo+P4gD){rV_*Qy<6XSP%h(`y3= zYa5u}|KVZ$J(02bHjgG)?)OB-Y3%w8i!U-UaDq$Kn_K}9Wyiz3MO zqMs2Y$OcxqQ~3CE(CPLs`WZofX9I`8PT_42KvU7}-Hh8db~7_GG46c8!@$A_3WpVp zEi9l5HRb~E08YR|;P0OB(ut+z6L}^E zX$B5vX$D?UJTv}o19_8=VK+Dg=5J0OX!~D&lwGSXtiec_rE(R&k2{_<= zob%R#ZiMA!P-NKqfQNCG{N4vVIt(WtfYy$HNIfuHA50p6NkcGc1SXBaqzRZb1C!=p z(w^bb10KdV0goQ=I50eUz{B7SA{ke)KY768%CKZJ6N4+Lay_w{i@}Y7mGMmgt2@K0 z%}k7Mb~CQp%*4ygaB2f%4kO5O3|ye52>7rJX~uW5(hPD8y*1yNKQV4Kn3%3 z!G}!DObomXOw7CtOzd2st(2QqF|KGyV`64F3W|L&$)L@!>ICD*cl$sKx>;Ao86oNRpZ1jQxbpGvMew3uQ4g+_VFUF)@RE$-)c@AqG8$GpiVv zG=WZL0rQO+ZlUl^7;dBRO&M;iVr&2@WnyMnzKZd}+CS{9P!qxCvVuuAFv$)kK{v0h zV%#wM2@5l(LIw+lchUzxH*j$=ffa*QFt%Hre89uPaQy*j%_k@+v|G*J%*4j9a5EEQ zyVb(YOzaGcz|2LPnK&7iZDs;pOu3nfftwA)=4E&Y3O7!MhJq{G^B9@I3K*FfI{AAp zfH&lH@!#2M$I1#8X9JVG5Rwt39khH6ypL_eEMX=lumm#;NCMQj&TqNY$OsB`iVb6C zkp0nUz{CVL8fpPI+kUV23|&xTDT`Bw52gIfu)&QKoSg=3~Ns?Hod(8_Qg5-1wEi-!pv~X z4#Z+&Vg@N<25Vqo2AApJv<1o%Uu8jZjv&D=kL?+mz}e!fEGUb(Fq|^{e7XfZ8FL)Y z>W8wJ8ICDJWSJTM^fJPj+Yro^5P5JR@(f&vJbM5d@nC$*zhD+7r`uE z=#=NJ^`KowEDVsM^8PwT26oU9xD98y7}y(H8WfJRGjOm>VrSrJVPaw6XkjsA;9)p< zk%<(QBqSOdvC(z&7v_dG%y_k9Z?GEK`<~dZQ-A^V>f8FZ9hn$fvNK>7Xw2B z%e`kT3=Bukggm!>@bR<{Gb6*XGa(Ed3|G&DFs@g+dM1R6;l`N|P@`m;OYiGzsw^xF z@85DWurx4%D0Z-FZiY`FAr^+7tSjpma56E0MOncl0|&ztmzzJ%fja27?sl#iGd-X z;UMTRqx=S@LlBzfID}?nV90Oa01;duf)7LpfCwQFAp#=AK!gN{kOC1hpnWY23=NEo zXFx`PFAD+R9Nxs(z;pq0C{n|8MiAZ1$gmuwqM4ELGKlU1&Gmv#@P=%xS`6ZXw)HS< z0QJB(FoO0bY+!8UU;s@=fpxHQFnpfIxCV3;&@CR&29qtIL(M?m2Tg6afeusvb2czC zyqpHkL!f>Y0|Us!3DX%FxIsHtSU};$0!l+Hpi9nKK)z*Z-~vtDK-Q{*Mj}CBr3g~U zD9JE;I=KD;O_Md-HU>YszT8KQiQ#m!Edv{vY#F!C zVm#hzD+6LP$T95fvSmc4{ff2@>4QH~Ri3ABUvV%=$kYzYBkC6d1y?PX65X_y7EDW_*~rAm#JID|mhp!y$ahbci>(x!czc15029NyE;4Rof&D59b8dpz|1hS z5@ZT^-R#E6j2+8CW0j9qiZL+AfShv%%>NALvu~Wtcmd4+0_JmXoXmIy%>N4J^KP8X z_yo-V3FZrKoXq$F%>M=E3xk3K%>M)Ci*KCFIAsOMzSdPB`y|o$vS@szjguKSfYpOS zn?YxJ@b3@*yjd9;CV~#*6=9qyB*MY4@`Nn|H^b=@wv2~YF`hnQE6BL~><&iI!rJy# zj1$52@Nx8t@=RwG(qP~BTnc&vVjqFZY(Rq zQ3!*H;TVX)$jk&flbfNF=d~a+8>24+JA*F+2a_*o&A`;)qd)rfd6}3yPS`TAGF&9$UqD1R)1vGBPoNY-f;W=v&2j1uFMK0mNct1v`U51{8irKwHpR&qN*( zU}Oimi$Rv*!V1Q-YD`RwOIbh%EPysaoL>P-?w~OzP!-O{c-(N~*45xx?1!>IZ77Hs zxD5qkZtG=)F;^;rS>Wcv%99{}tvqQ9+7a-Ue?jjzP~EWNFo@4IpZ~-~5VwsFbOqC? zZpP_HY#EsuK;*H4e1?ZzoLeN`E&c25!^H5si<5z$5lk{a>EdJ%WVqc0I_n9<76OY1 zv4PkkV3pzwcUQ15NHCZ(NHg4D!NNFu0ptA@EHVst_p>lSH#f?GIdY&56zJ+vkcr*FswIbuwr<z? z27^e(Eejd%F60bnxbv2iAp%TBGwU(LF&Hw$GdMCNFgP+Kf-tiqLlT1_Lo$OiLo%~7 zLmGnjErxOure%RIoIOUoLBNNl(E>6%Mo$Cu3JDP7XGBGne z>*8c!1xF-<1jD=qjNdPdGBJT7l7X4Q6qHhTEnxfunt?F|t;*l8dpvQ1x4dcGacbEl)86G_4U=U$=ag2pQlo3oa zgGe#3h&Y(kVYvU4gFzQe8Z-1UGnjw~3lL$$aP<)fgAFJV^)WNpF@R1=WnchZD#0kq z_-GyDpD&oRS!s82TnMu4q>U)eHNT z!3^*@r7PN18JQSfE#zci@M4&^j`2wXBNHgqF@!K&Sjc$h_FRx}@4n?^U?ApqB<(Mi9c)cxXDjl}w z7IJ_0m1E!(@?G)DF;zxZu$LGZsJa?lk@bL(12Ypd3j^qudKOktxzD^eN`R3CbYPPr z&wf4uMh-Aj^o5`aBWNa=K~e0WkP8c_qr}DvI!cd)fuDtifx(jXfRF$)6EkQgi;;na z6_nnX_eO#4(*f-q=ibl9!pH%doU;^pA;=4AwK6bRvmOwd0BQt)PCepeU||K_BFwxu zN`;XHbdZ=e_kKPVMh-Aj_=VsrP|YC(+8(}d4dc`wdOWP)uxAII+s_DESOYnl4!kKE zv_lQli{}O1euA_ikd=c8p6WOmq#3}A$v_n!sGq^a%y2sq)RY4q6AYdh*)SjE4bYSd z3rGsOc98)g%nM4cpll4b=iX{YP}hEtkh0-qHW>I#hC6+t)0b22c@W@I?IhVjwO z&m0^q47WCNGO%)e-N4Df$^$0(_HW<>RVF{zbF%h=kIZ*t;9v-3To=#A!!Tj9w)ebYdZ4bs8P03umfK_vKeu`7pF8Ck%B46Ix)moi>C3{Lx}CV*Is%uFDK46Ho+ z`9KOepbAA^2zGt?3`!Q89ttrqu!;$}jI9$HSsC~k=C5JAaAF%HE5t(_44e0{GjKAT;Ah|l5xfkq*Rg}k@`!}Gl1=YoT;2N2k zjp4>x#vNN?7?~JAa*Rw23)V6|cm{G1NCyKu!`;=4E9U1ju`s-w2AY6=JB=B%OlWe_ z#*I=;EDRryfi_KVKgP%as^ssiW8AWtpOJ|PWCN(4Z&y75F7rY4J;M@4)&oK>Ud#f8 z_OWZA%ys-4D0_iOaA?oCrN+p@0FnZ=3SKT{oO4SJl!{MH0I?XEnLsK*ErtDjH*Tph zaxj2e3=B&cMeeL)1PL%PK?Ou#2;O>L%gDg+=o%*j!xBcZgFBi$0|m~T?-hO%r9ePVgL)QW@Na%j&TiG1*o;cuo|r53RneLU^64b z+0|ebpnT5A% zPQDanSh<#kfr*#lsWm9n7(gdH%q;k|Z4DEstVQ^a-_qm575^V;obxdFF*T3nN3%jfbF=)PLh4Bjbu-5XHtY z7sQ#L3!>N=CV~_&?7EuT5PR_dV{ax#hCMUV8JHQ4%}59N_IJ$Z9h*&9*ccAaNN3<= z2A$LmV)26bjC)Qn9-fiT%*wFG_|T4nd~8e%`(~tr#ydf)pIAWsWl-4&YLJ1;*T(3c zeS5h;htAJPXS~bDdu>)0ri0V+7+Bb5^yV>sl+{M#V@qLxF9=gYfi>;uK&aU(lKu z5C!VBbqhRbvSegnIC_E^RAILZoOz%HVl;plj0_CzCqOkO({}!wJ0BY`GBE7C_mh!< z;rgj1Ovg4eKAgARn~j0t;;AJ};Dgn`7yN+QHA)Y`LZB^0kmk*aRg*yVJ;QfJ5Q~wO z;SyK@bz3+LlUFjnIWYkgk6oKjF*2|*fGKvy$5)sb?;HS80t_qe9S1cY7b`IcF)mhO z5M=-nj9Ymb#2B{nGM=8qxRqCep$Dv;jbYC!#uaB)vVkr;0*NrNGhCX?xcaygBP+w> zE8w%o?kfHMCCaUC--K)Pcf(~d< zWVm$Dp7EvV`MvgBpvBW4Rb~rn$GG*(3I!gBI15ADC0hm-#zmKG8CaP>Bpc(#OQ4Y*FxkNL z_MRRCH^c5rwhY`2OiPyYF$gjoxMa%!UJ(U4Jb*y}G_wwJC=8+cX1c#QH@)*vrWBpo`+yTm^X)WG;gY$fwN?GV#p__ITdflZXL#hU?iXd|c! z1y@cC67Vgu5{#|X9J7{TSQ>QX{aetIJdpbtnHatXuG#khG;s&wgPQ|P4BLb5JdFfp ztF2H5^ngNr;N>IufJ?(W#SRsxl@dBrqIrvVj>Ltc8W3H3jmR93@>u` zT=)yhojZ4mfy}vBc;nS#5Fca-WX52hWnskU}m@zHRJPnkZZPr z!h@OdU(_5VzAVFM?}aB0GJ#Gif7i_jW->7`te1UwMTeP*dF^*le;!1FDj3kZg1`fx zr+}7rfCl2huKypn?=$FjU+~$(U?ybI?l!1suQG%MUbG8gf*TnSCb*FSVS*YNU>3NM zvFo1^{L^s~MfSOS&W-@lHeF$oy z_P%!k?J`_6i}BBQP-Bq+EU@@d-68)a%WiowGcqiARL8)?u=G(KETu{ZbpVB+tV1B*p_ckV_;@jxjl`6jp6wAGzKn)tvn2T41KH97zDti z5W~+^X$->5GK|OD8D)fO26F^DisTAjwg!o+w$=*E|4JfPd>z~+EVV_^l6;J)32 zyE8%i$U!zSFtP3Dn*-u=Fo5J4I2c-#w|xQ6_TTGe1hbeKwkv`d;5ga}^7>X#*N5>h zKWKd^1Jd!XYxx^rfMNwCFU)aJXvXc+ye!PjAeXYS_ODK3;AfZsB3XW~N@HM{K0)K3 zT!vnFVOI&&bhfoaJE&=E(=KqTX{381rqK7dHZ{)rk4e4rU*A%<@)8Vo{= zKUy>x#29|IXfQ}IG`4CmNHKP`YB0z%Eazd6Z)o5Laag$-nw=Ww%~0oJW;i+lbSuO0 z2^tKn3@0am&RjYLvXJ5I1kir{^AkV=AvZv_GTfh_!NAS%c!CB44+F>r4Ezj@PP_kY z=454O_yN+>!1Noe3B=)OVCtI)a`Bf58lW88Bx!$pd%SUZe{p;EO^;&#`QlJda*Jxd^{G+z{K$DSTF+%!h z44e$Vj|DUEGBmykW?7 zabJbbFYW^w2)Z4J0eqR~{5ubs7+4vt7}y#19bdu-TIc&)VZ}y9CNYNTj11BYcR3h8 zhD5N+5Gr`3Hhy_k+m#6Lp^*KNkq|b4J zg^_{50@TlF7kB|K85#t@=}jI~kZ$Lnz4j+)RsX?hpbhS948Il3m_UsnX$EG-Pr1wx z-|&FS<&DZbpax)nA0wDP*UJc6qQ(sI2uJ~F{}Mw#Y(?^hPN6%tD}J5w)L~=T+zHyY zx1m#rL6`wViZE>I6k?DDvt<}Ib_y}bfkiYKp7pUZXflFiH5*y(uX1D1VK}zRjX{^; z#40xiJ%;P6+!*v3Zme=+Fk-m1%8kL4;pQqg1~V|*oZ6&W%i`fAKIlH?kc)D#qa4*wml^5_V@ea#W1L6HJCMJbBN< z5CWQzxIL4VA&lW;11m!~n2crE(<#Id&#=E!h#?J3rZXJq6k^C=IM^w~kO?NUm_INx zj_^3Q8&mHrX;TFmZlY+%V-eGb3vQQ_s^X z1_ma9?}{yt9%OViTz7j-oEPJNHz}3P8rrKFnJW~NR{$Hvy2r(RdsSdi6=D{k)UkhJ>D#^Zw z>Y&k#|GnV0#m!}meGfr1EgAj(7Rpn~AKQtzQo zb{1BKbs*C~M({AK-{lRuuFVp3f6`jz3zPSAgK}SYA0vdx%y6m~%4B8OieMgsFqt?Q zx^Am6a50{~tp-|Ub*`83%F9{c_QWkU(Ds9?y^O~mJmO&FW$<8N(96uzvg?gF*8gCjc$MlCJ@oU1R7EOKl36h16xA_ zNC>>h;?MIVpcXY)oZ-ke(HHhTi|2Z>GcxR4%geyZ`2YG#M#hh_Eo*q$7#eQ8WMp86 zP#g@?cRpcc;A8{|GX9YLc$Co?0%lc}IXpBjEoVPaen z45HW>n*M>>MJx>S{O@l*&&AHdaC@2(18DMti(%hvB?fMW^=+&SybuzUBe%53Gw?H9 z`>M=1tq?@AFlUOdD-8`2xFe>1v5dzK~t3&7^dCU*p_nt-vm(dopKvgolU(B zs(?;*fKHm6d|QJ-fMFhpWL&kBiLp0j)lw!ghPk&j7{ow!g62XQ7(iWCIj|~DHinPM z4L6T6f!dv)llQz?1d8hZ+Zv!Y=%?f(5dK6EpOaxx%9J^u#Xu_0n(sKYR)mF#0c0Nw zh-CbcH~F>(E5n0Z8lY_fAQynP9&cn^xa}t&4-;6Nnc*==mf;bIuY&mh7k&zi9 zzylIEvGOMqGc&{Yts0`xFZUd;0BGTK?iF<$4ugKusFlJWN;VYLo&2lVP<#_V@iUY395%ccj__B zPXUb#gXhl}7#MzO?Qd)HWMp9YJnJkU1H;ru%NRcwy!`yzgO`z^^U*R;;{WmxM6q{) zc^qrO6z6xaAa^4(0}DSp1B>_`Fu#F`oq?qrd>lO=gFgd51E_$R%Fe*dB7T^?f7U!9 z21W*!6A%_S!|s2$3{;+iC{We=fd7FABj^MbP(3?||HI<%pyNU|++N1Wz`z4qM!p?1 zMzx)d@ty1%HU=TkBHUY`{|(sM`GW^5Bg2<7(F{xsf6hch19MTI z9s@rE7Xup;!_C08bMEtl!s!N>#mK_&1Eh|HVSCV;=Xbz8$gMCIb8 zMMV3RL3~hf&go+WF+m-9kQDBnR;&!~13&(H!OhIX@c&FSkfL&8EosR&X4n!mWy?EI8wj-JY|A^)NE}EJ10TcEz;kD! z85kKD`whVi(Bd2@<4-Rml(h}cTB!&U0>}EUGtrE!47)&q#=!WNA9Q9CsJqQHA2fRo zn&Mo0{1nUcWsG+}J@sH=WY~B76l7kSsiA@K{NDde3``9TjS3$+PlLU@OMKbB8LBKy z5OpjNN`L_@EexR;{%o$h?$>_h5y-f&o9h@@8UAjrW9(1)wYiRsVbYd51}=sLTk1d= zW1ruh^FKks{e5#C=xmG?+$|?IiZZb=oI0(*__qA;X$1~2^MCoN(+W(?4Ey}1tZM?5 zV@FRbFfgz)Y)zTJ=9mCz8SrTZaMELBVK^6gwS6HUD-*-f(+Z5+QjVThU}ZRcT7iL$ z;n-;f(18AF1qM!r^QRRUrwE)st-#RK?7Q9W>%99O?2HWE&Atpw486_149p;saaJQ^ zZ?i88!`eh86$Z7_T2@JoeX(li_ElFQ_8@q`dOwKNfIrA5_LLGBZ4fi5&dv z#sFG7&d9{@Soy{4?V!~V`~JFtQqkV14_{}41}^sebpv^2Q6uB!2Y*3JnpggFW1Q}= z@}C?nGc(v8RXzfF_7R zu4P&VOX~Uz|MG84yeQ7Z%mQ*E3nz#KZ*ut8bWRXd|8?;{o72X_$_n-f8^eJW)(pI0 zHZLQH4WGN4aO4(fb3aHw#4Lt=6a2bucdkCEX)j>FDfyx zfJs&`$p$7F1Q>qJV*I?an-^5*epH09`ugC4XM3ScCWg%rd9VYvUQ}Xa1$&c$f$=9l zsLuv2XIAphy72;3>TH_e2O3wLyNwa+Nps*n+;>ILNCa3PBB5eAfl}%Lr3cK3FvvE1 z^<-jV0mTF}m}EHgLU`VO#!KIJ4EzjRUkEb@f=MBU zZ7+lwgjqqPD8u#_!VF>zdtL}LNQ2eOF`RxO%y?bq^b27HhVw6k859}rpA=?LV%RxT zfI+E&Y5z^DNj z46lV4Oc)p#tQhXT5N5Dum^GJ`aZw}VthuZ{%(MT9GWaquGq&$%WcFiN@<)_`j{|gq z(wc?fo6k;7U|h4%pOKjfE7vFI#f}yqSO2d`1wHkqxYenTcV&*uOoSK;`$*7s4R@JLWTXECO5CvH-^V z6xXrHpOFa^xS*!zIB4-*9mx^y)*aO~1(>jq6#yleoVllIW z6+u_PaWFi3F3dP-BBLv4#k}&om7BoJcs}$pLYScaFkluqeNTHK3_64cWCv&y%#j8D zpfQVPfg=k*7jRAli!*J3l{732kC!o;FfuWiFn*OaVc=w#zn}5T%RErE1PUsK&2kLP zOq=BxSV1gSMi7gM;Zxicuy;X$z`)FOa~b1i&;ZP4ImUOgo8=f-7}km{o(~PX#q*h1 zn82D@H_I`wfmrOU+n5;`SQ#H9^nC^CV`sQ9pYcp3BUm}4X?F}9%OLWdEGUWdGQ3&J z*!5^3D>D3S7 z1l1Q^JGmLx&1VErObne98QTtk7P&JqoE3(#E`nLC>QB&_#`NeA3h11u4U{H=s2hVN#h*{ zL03U6ngANZXWGJlb-`rNpk3<%c?Je^h84N*AzN40ff%5*u0o6-<}vU}t1%Vk!d_Xy45?ezIj{ zV_*ZVBj|k33>pn#1aTS~6+m2eh7F&Y829LJ_zb#Q;H%l08Gjg=SQ)n7<^`Sq$~di4 z5R~Zunk{XWV`gPoxEeI70y38Y)EoJm|9blm@Y!vh{LSkxLw9;kUilQX({s-~(1Cc5 z@AES7GJx2;j372VHGgQ$V`5^s_kfpynFT~LFf+)$=vd0g#02I-1^F1hm@Vts1M)0L z5fjL>A6oMmnV3LauxB4E;sp5?6qukpE6mQ{@@HjZIB5d%@P@4{U=M?N4UGyQK0Cv? zJIsuG^v~U4W{_q6p1=FYIZ;L?a0r7JO&y=SS(t^LVZl$(azqfx31)M#fY^*I46Xdf z{~zXJ6#|P2v4CPmsD)|XPd5gk7O)!7RxbvI6F&1_O!E+BWN7@a#J~h5Ss1qd2OS4K z_rDTo)6##?=+Bn_N(?*<+y5&u@PTCo7t?$mdAmXJ%C2wL30QU;IoB6!}{`!ptacy;2Z2f z$BnBqFfib{i$e|MLQqY^z`)RR$o$s{#-BeYdB`y`^d2$?b=D4lCkMOXlE?byn{{*pt6gTq2r(v122eV{CR@04A`af2h7tWdNyC1CttzAU5bA{gaGaI_`mjl3_K1 z*$!bcGJ)O6z{l|K1ml5@d!Ug9kQ*SUyGYiAl_@@)@u`@9<^n>_}6X#no-Y)`?%nZNcfBd)zY8y_N zZv`64c^<#MAFQ+qth9Z;72~}k5D8K`1)>yWDg!IykHd^dr}Tg}q2HZn#lW!OD$7d0 zo;A%L!b~7G==kibEDRjXOFjpJE=QO*- zoI!w@fkBF4>rQb7d4`oBlJVCS76y5yOXpb_;sXEufIqz@G;!^4?1vZ{w)OtLGaAlyjuzk;*7ns+6*g#DRP>+rscI_8zkt!2-R|!}h#-T^-jHi{s3lx@vP7(rT zTSg9sC*YHW*clE(P7*qf^&}zCkR7Pa#K6Eb5!R+P1ht=jUtwWn0|gJ`PGL}}F?^O^ zeCLllCnLj@PwEUT4AVd)C{wXBoc#oveVKnvih+w^!gVPIK86dQ)ENXoB;&Qz3!l^l z86JLC2Mwe*6*OFEV_{}unf^(gftle9hy;zLurmCXzuA04oP~+u%|~?xRwj@PE8F=` z>Wm*{&wNs6ZDKnANu7a-jp0xJx3k^6Ow0@*J`0$H^y_z=0iRyh#oxB1mxGlREW-vS zc_AbtNC&)1`!QudXuby|#>@gDK{Kw)7`yi#XJljoDP{a23lipF*ys1>MiwIz1IT}% zmE*ZRe|C#9vNPPiCdI(W!LWZStcCf=JGd*Q7uT={H`J;_P7Rzb?hV&&b}ii<&_p@9)3#ss>~dCrTIpqr^d zd{9Te>cN^m@VNA!4UAwW6BEPUs5R4$gG$2FPXj^QM9xHR0rA-x&Vu-VcG)dS-2LUM zJ3kXc%WgXc4n{D^wAqV+qmgB^7Xv3l>ux&+&IYC@-|ZN<7!K^VW8i9FI<(u4frnw2 zCj%dd;AiOLWe{O_=*b|%u;q$4WdGvxS!xXO4D0wASUH*IDc?D`h7Htw|Iy0`VKOsp zL@<{sf(5}1-zVSgK$lv42W?eje98agf>c#V(H@rrMitV8$dJv>%c49H^nr8mXEFjRZ9#_%BS=}uDR382x4$E z+=DPcOG{4agT`Z@E35-`4Z-)Pf>xG*4h{fCIm+siIeLr?40o77eYNf$M#N+d8}xW@ zCRT7NJc)!iP3z53{7o<3}Ot; zZGwzX$zCXvm0>-M2|9lkEDufsk6Q&9Ss5O;f?BkUFTk@VpmfAEi+_91Dp1xr50YYM z*r*InZvB0XVESAyqYNYH5^DwthF$v^5A0sZ!ps8p6C0T10Fw-w3|Eqme7^!ZhUsss zAOkZ4h-3ki4B8BR`xz%*d<`0!0|f&M!<@SU49rZR_C3h^OdvlpzLN#XF*AIWo_~A` zJ0mm0zg9s|y6>CMxc&cg@FC2%mNH(t)&XjPf#sM$Cve@`cLY3sbWRw?Itga6u!92_ zIxxn`aJf~Gfs+YDg13g=+d7jGWcuq~Mi_IKBA5jZtbgFZ0@=a%Cb1`x^0YRSOH3i2>Jm}CHtqs_Ss z8U+H8UuEYqGUzgVT*|oZ_iQ21@_Ghl_FE4X8JIb*gGlbvt%9I>^mMBrb2}4QsEY}- zPL$<1IPddX8z}b zC%$h3Mf!_}pe!hGQ0UB=yP(ZZuUZ8e*jQh;3Nr9ByaACc5)2GR3`;@zmze>y>H!pL zyTJ`ER)$Mpnu%cx$Pfkwq;rmcffn5{F(4gxyb6|&@2yt)Sv-5mBzIvRh8wGu724RL%R~0}N-D)KUNug^XQW```FAjhzRJp>wC zDF)3rgSH%jYZF*m$G`yUtTJ#htSmztPHoGwlgxYGM)laYz%uq6sT1W8YcwJREaWzwq-Cdh=LmVpspt9EOF3S1Ss%8 zYdb(2YUCit_b_bPE45)Yvy)gpiyzh!{j2KxNZi5D0u+50IN;7~iwgoluK^c>Qfz&IP#2CKqWPD{0 zO0A%+-#3;szOsi{{K}q@6%_dl4A?AgBidpKhOavr*BsBp=E*h3Ga;6(IiAVL%J6z4 zDCV$PN3lPpK>mF5D-+41Z+<~72MM!+6E~%Pm1Wqnnz8fDD{f{c=Dnw-7+9FUpORu= zWoSMv1xi#PikYF`@ZZIWoS-`5m?Dhzr zSRnF$UP<27d9?e7+ax9?hM%t_8JHMvOyUKV2~1a)@-Q$pf~qd2h6d(GvpGPbETHP9 zffY=${a6ZKF2fGyaezrqFv$fbTNOTS1?5qYvCJTIm_dh|F*mRsI?lqt+`!Q^g^__7 zH0a0-8gyg^pXkrr08$8wJ@CRcR*(+X2DXjIK!f`n3=FIdTp&YPK{{9)_&@@n%?GRy zZJ?rj%2m+3)$Q}F47?1#Ur91ZF#G|L4NM>kRMLPp-^qb5?**kA#HcLjel*Yl8KBWw z(B>{J2FM}cdJG+G40;VrV3LJ_K@W5~n;vMy)Bq%7$j<;B!De8vWME*hW?*0d^`sm? zr>2N7FgOY`FgPz>p3;Lj-g%9_Yjz28KEY1_tm^c8%a0(Hg-wqBVmW>#ZQ714Q(I2+)`s z!$h#6DIop~5V44n;q6T(#)&R(Z!#?h2`mRISOH?L1kDMp1oKxif@);YnNtjFKvHW# z#3l#ysJwGBP~mV%W>b{E&sePI4UMutrw z2W(7=d?p4^x|`3`zyhT?HXP$+I0P1EJT15J81FGAhTjty8SXMM+?m47aF?lp z>6-<^Jtl@{x49VZGckO#V7Sl32qqgrG7msw+mArvj1yhHSv+Q9_-es;Lhh@@3y{PM z(4wlBAQt#8x3?e`_%64vAl6R^!N|bylL-_%Kbb(C>^~q;@HKCppi-k3MD&A*i6CMU zh?ou{<}owO)L>Z1%s4@bVKqo#4Tx9^BGy9)a5$Y{X85?3nc*Zz=nQiM6NqyT#JLP2 zt}-)#GT&9^1|}%Y!oY9?B6tHTcoU@XHbm?$h1~E5+h)oazB)AED^5RyIz;+O^14Qfv5&J>J0T6K%L>vbZCqTqm5OE$vTmTV| zLBtaf@f>W;OAzxNgaFy_4s63mkicgU@dZTu1QEYM#2*mR2rBuSK|~9P=mZhnAfg9E z%mNX!LBw1TF%Lv61QE+21QP?pa#m&#!NI_=hLz#(D@g`T8HPovGm4p+KxGv(m;e`L z46=+9Tp$BVpwS*suz?I=kjE~pfL&M-yRaH|VReSDpv!UC7|uk3PIF{nV9)?5gj^5< z%9mOYE;uPNHG&Fuh6IQZXwfc6MG`8vnGwWi0c8RdU%Uc~BMg3n#-Gi^IKk!cV$glN zw-+!nFfqQ$W?-1h#Bf;i!=~R%Of2Ax&&2>L1sMK-)M5##e_(O&(K;}@85S@ze0Di7 z6SP)t0%%?R1SJNBHOvezwHX*eY8Xy3L);5W58zx3t`}KBT!!n+3|q3k%mN*f0m@xW zkW9w#6eP?5@d{YoXRrWx1dE}Og<(q;vSb$v!(91Wn*(_`!C94;0aQoxGJ?qlCJ4m> zqCoSOpe^dK?v?@r1A`(H1H;3gkcyaL84GTwZb7$p54yk+umHr7XTWSEA6x(%%>|A>R3$H{{wL_vCt&k1Q^5yxi+`XCG_Zog58})YFdNC4J*=P* zKz8OtR))FqWIJ;fD@OWf_-=Be^Pw9XC~1QdF(?~?$^ll!t4B5{Gq5okVrKYzK81mWVd(|%;``;*@kf)sNwOjP`RbtgL$E5qvFnGCGVAO|oAFzke1s3pj-9nN0deVuW; z<6J0Xk28^??P93|tKjj0-nZfW{7fe~b<7Xye4WZ3>e zfFX=w`xgO*Xa;76I0j~hB!<0T1Q-N48O~2&Y@M>48MN^19E8cl#0c^&QzO%MHU=gp z#?PV`{!e9QVgUP^p#>z$z{K?4biQW&oY#b8{Kv`lBJB zqm{mZmgFt|BETTY@W}kYXw z2_nDBf`Z8zG}H~^GJ(Q~@f}#ujbU%qyV+ulU@=hTacKhMhx@`H)&si__k|gmm_d3O znHf&l{&>&H$jk)dGI)dLtQQ?%WMl({E#ppMNC@w(y8U@NXy^wN)Qn7wmnJYSX>JG4 z7Co>7u^5?{w|o!)^~_J$UODK@$jr3$g8&0VFvz&K4-^^M7`A;7VB9IZ4IEXEmoaYt z0ve+RkzZv&F&EBo(|*?%(B1@4*N z0%k@w24=>c!psblRxV@wWAtIeR5vbGhM6muF@m;WL1~uRAU+4foR!NM8BeN!C=SNy zU@=g07*utD#yvqx+;|z6gTxu$-kZsI*!JkbiEf;1jI-{~1fAtM4@@;Mtpd^93?Pc} zg$;<}Vc-Qp#-=o0&;lROD4_tu_epaZL3;|8Zex7&=NSv?P!1ad=+1DEI4E6xR|K&@ zy?c<+gpM$jdO_)uZcc_JwjcgHgI>c9V{JId2x2laG0XuwW6m1?dGi=MuC=?VGcwFu zu<0@^GQR7|&BBn$z{-%xz{Zftz|H`w#2|$;INBL9!Hbq)?FB{whEHWL6nI#f zKy^(f0~=!|0~=E&<8kLqHc*lQ>E~k1WZ+`TWZ-7ZWZ;I#@i1gEfEpkS-VEF0Kv@Dj zcJv#(U?1$>>v0U=sTfdunT?f!fn6Fp3JDSjXV@Nhf{l@x0aRHs{N`B#O6-{o4B?E| zR_{Bu%`kr^Bsj4TYzQ4DOLp=;2<87MU%@-TQJ{f-qxBgjb*76Zs5 zP$mzx1;D)!0nlzR(7sCe*^>+ms$dyahzw}Nh(U#+C2H2`+n~Lg zpf(reJ_Ln*=hZ-Ks}AtI*m{^K`ZGC*xU4ls*@5fnwd3|)E*yo_5H zsxj~~F))Cf4|WS=wEPcgz*m3U6p~!G%8xw;f<0MW7P{vXMiD`qiX)~VQ z#>8O606ORa#Igj7+JcR@1GC*3mOWu&@ME5Th>5|UVg4Z|#^rAF4>1KY%sRxx0J>8! zoS|KbA)Kj0i6OiJOg1$%D9k>@#1O@BSHE`B*w2645-dfeKSl+67G(f-(bWX#!~78Yne_;srF63kr7?21wQf4cTfl zGBB_TGVFGSWC#W^hAp5wGT1=-f7uw`dN6QvGBALz9t4>R%4WRGkgNtW9aN-(W*$Lf z^HQMLWRPZ9tHS{4;X{gAke3;h81B0>2!Pxn4Ctz0%?V36I})d23%%G-Np7%)kZm2*?MZZ~?8n z;Q>`+JRmE;{sFleTxNh6jQk)Im_fS1gACxocZNuYwZ|Bne)EH_k$(bOxv|=W@q)~1 z6Gmo+<2oG^xj~z#&qQ`i5s)xDNDV_K!tz{(?%9k#J_#~1 zusnLq#J~h{Lq|Wz4InN91M9C@jC~E@M$$(`D5I|rCUmwJ!UFB>14)7>oW5BwvVw+g z89*ERW*i4O?6U=E0BR*{@+l9Lt{!&WwP9pqxc`_56gY1^KHlDK!^;Wgb1{NMxf+?~ zu3pK=z{@aU+A2l{UZ!baih1tDRg4UL3{&o{WMrJ-0ipy!nU(P?*M|j+A|NJ%1jB|^ zD;XK27&d_@83wR9vJi@)lwqyTv(<`B%nZMNF*5#U>pa8=j$u%qU8~b*#KZ*3z|0KS z1Q>s_T@zqncrugm%Dp45EG!I5JAbh;fKm|`!)*`~)cs@tbw1CSgHDfvEFl0NBLy93 zU}9MTS_=ajn_&3Mx1g-y^k!FXR))WP4BTJ>Tov*%yn15J07-cb4GJI*C_jO6D=1Td zy5|aDC7c`#2VI}Gf!2Nh?v6WHKn>a)211ybsEmpw0Wt z%*^}wzF0GYB^X2)Z$?2gx(HKa0RzZb&{B*mvFBS(i3>A>bc0oLfh=b{;`*0Q0K{St zU<5f)fC)@CKq(f`R5_?I1rk+YU|>)HpWRC*amkQuHCIv{f4=Qy)RX^wkL(t9J zQ8U_Sfks_Gni+T*zvnNz^B>eh0`b9nH2$4fz|YJMww?n_ad~126ew2Njs?pfF_zhbcQGG?`c!PPjq} zT2QeMvW^k7=@H!WM%>QIL6oXnC)KWOWc)R4ohuU)!|ju53_=XoPO3353NYN<$awY8 zQ%6QNurL!B!?lf!OXt3`WMX3In9j!_#PEF@9|JQB!{d#NXD+S)?KJ=iGcqwe+Q_)( z>wC~xK>KvioFl`-jf@wb^)j+DgEg{2NRZ#yKz;+&2n<3D=eYkqT4lh<&hUH+A1IHV z=YH7#N#BGWYz+qk$S6**P9cV_>3j?l3@@hfF-S7BOy^^e29q*OZ>I4v$S{NM(78N2 zia~~rfk8(08i=Ko!60K<#vo&NdrlOCj6DN`j1vQcj4K0!Oe_O~OaTLf3}{YJW*Q>{ zgA8akPG%Q~wHHL}0})M3V2z8I7#L(g(5)WN+2&37Tf_9wxD2U5MlTduoHAlIcR{Am4S_c6|^FY zfrEjSfti)zkCF(e6L7AVQG}5Rl$O~USAm3>7+xrdFoLu&a57vhmt+E+6%0z#jLZyu zsdO&3egFMI*NXSjZJu-WvdM2*|EdcyB4V0Q0XK!G9016!@)-#b0Zd)+2 zGyDKabRCk|r21v+T2~21hTn%I7?{8$E5pA-5{z3_{~eNGXZUkSf`J1hz`(_D?63p_ zH^ZT$5)3>H`#Oaf@ANS~JjTS!@T@}v#D3DD!OyV#m;{3W!}((p41x@k`5CvXPUaV3 zcz8^Lal7iJV-lhuCW9oyr(+Tf@(c@~i7_aF*~$#|j9XRhRT=CV)EVp<52@N~Gi*5~ z!JrLll-=0F%Amt=^d2+gA=QJ6m<$=V|7T?2;9}Ti(a@I!+BbAq0@T6SX)$Tlbx;oj z>-h#Ykb-Rp=1N7dAh?-u=%@rE zD_A)L=%f+&pznPC9gAjwdUw6|wLwSQFOmK5r-_G|8RU7!t*T3pNw9*L3~UU0j!A%` z6ioq3z%eNV))OquI(Ko3lqb|V-gIktRRvNEXU4z zbrB0_$J$caz0;d{SeO}}gH(V>#;vN)k4dmIyf_Am$@d^Pg6=Bb{Sxe)Q()(u0y*a_ z#5s?bF`flG2Sk3A1&M<1Dt-_46NvmO3o=E6VWQg86_-Fm1x(YGAuMKwkG+f#CM&~j z7?X)%n<7{c9L}KCSfF7D#y_y;7X#B8{$(pJfz~Uub#gH<=rT-H>+AOhH2|h7gBf6R z!7Q+`U>3+!5Cd%J|J|S!YX5hGCSDl-@K4}kWMIevwei;QpFavZvuMp67SO23M70wa zOCbh>8DN9KEU>{~7RX=_18nfLZfVfI`EF2mk?{}zk(r>*&s*?{2BtOq&we^EGBDg) z$jrdde#HGwL2KItR{?n&&-x1(I2kwg7BFx! z{pl}Y5MVq$U4}uPVb^w@G@>IKeB`u)cG)F*nBo0l=S9B|68_!i;aol?(_oC@*dDt z8mtV9-!n6?GA?@0%)rjDeLW-N*6EDf*E4c6EPT(*xT$>Md(iae=JI=Q|8g+1GQ2wC z&iLH^!AEGBCM%a;{=pgZPv3e1=c-b@Fs#BVHT1aU!y{&z(Xi;R{KE{p%j3A1M zVTZtl#g^c12_q9|aQ4DtONdb*VOEe@28P`)Y!A<4Jp8fS6?6d53tI*zhJ7z=8JHOw zWEj{OzMZiJwQQP$AD>`jWCDqS8rne(XIL1y7#n0jUOQ^o@BlP)(I5kAP3?_p=m8a` zARa5j-yj=^5>SR_2FW)Bt1yC2$7BS}-|;YlE}>yyW!OKD@!6TvO03)r^LE)X@PO`r z;A7a>Qq3U1@Ts|)L6Bi$gAHR-H{<93)~p;12Mr%jTF1r!-kCFD;dhXAOJ0D^31mEO zc=_Wt7LXtNp)Al@Nf0scMP@MOwq8aUbEP7f1x~L^UVt`#fDHqcVja)Eg0j`2ouENL zruqDf_kxB(n~Olb=5zBHdv-o#Wny6J*k#MWz}ycac^Ed#WBkF-%mnfQ3z%R6Ega%y zSTLLM`@tz3jLZzDci1xi76t7d+cJ;w#*x>c)BjKJuw`K2XWTlKaRW0GGlL2P3xf&+ z!_PUK|5q|Txzp{c!N~A?4krT>L+f17t%*%@IT`pE8s>5`o~&$`%PGq6e-0;uIEZ9C zU-^FyrxL@f<$_Fm+8JLg7kmpQmDv8z;bh#?&iHQ*rxJVD84kva$z5kSl(;ruN%~v^;__kf*U|bfk?Ggv5Rj<;(v}Q5Lnl+0#H5gYd23>*l>7x|Lq)#8E z%otkE2{M3sgP^ru4h>8ot|P;Pvx49SUM>wx&F2IezfWLnJ}2nP@bsJ@gFD0SbAk+B zj9Lu73=9l`413NAGK7Fg#`BeX&IyKsr9&H-j-3-^2xB;XPLT0r<&krO5g;Z*Bm)CO z9GDdkCKJG9GQ+GToQ&ryXD#7OVVJpulW~6T%q5&@4D*+8GB9(nKFXbWX@iGlvt@HQL+G_~v#V6AQ!NIiTA|8s>5`FoZJ9Hn}^@lU6a#*yRSQnkPV6pvK#bU2dQw zfk3)h7|uwayV1?c#>EVBA1~M`{9sam5hNlECPly^Oq@*j6*qug#mX>^1I%J#VwlbW zGLQ+Zgn@-&GMLK@;fk`}Q#`T54OAIVphG= zu64s)Jpt}&Fbm{rke^u@z@eEZ4eg+UJz%Z{xlyS>^#(6EGf{dG& zFfxcRfJqiG30mRJ!@wXSyb&Y=YRHPTFflNQOa`CdC&2&`mSMQDQj9^Cc^?ylEXyS( z23giCpZFML*{*@eHl|yj`533M-}=m_#PH~>4g)g}!*%0BFB-)`McoZBi;0=x;tDa) zfFEeE;->M({jb68ql>a277HiCxfNmz!b}%dh%w$_Iln?o6s#OHBEibZ@LcZn{3D=L zdUk~v0|&#U6=I-KU{Dx~#ikqJ41$bXX3keGFnTvNM2mF>o^Mo5#3h zQ6wWX!^st5pjm=9dlyB(GDEnaMB1|;5|T)J7DO^K zGd6==$#_Z{qzvjmVNe?Vcw;BHcA2z_@d(_}U>3;HM;1jgvVsGT0hC79ZhOGW3gNSX zML8Hj@xTQpxxpgfG}>_#6lfslf>~haf{bDUD*-zf#D&Bn11OC)%z-+$VGhW-4a>zq zt2FL1GcbWhdX+)LK(b8V7584qXJlo#3A+4MmieIG92F)u)NBu2tegef(GDUx z7?#co1YHaU-blj-mf>q)I&w*oL5QJqts;XML*HF921X%<`^-D1tzly1XPCQIk@308 z+_j1fJ=4`&dKss^J>$Z~#Lzt*v?YAvbae(U1~AFECXRuN2}FQ8#C!~srmKS%Zh)FI z6Q`>)wh2$1t}enbZLKH$#6fWB-O@JS@!2ARC#RLAy5?`lqWifCpWe*%`We8F$>70~#Rfo30MJD;&Jp z^pwk<+jBq-nfKGwK}GPd+LkHTK=XPaJ|h#u&pC`IcI*Vr-gQn_2i4YHy^IH@wu4lF zoWUT(aLVP!yTvS^H4eW)E02X4T6-DyY}zc!#LTcB=VGW0YuzSuJ#)T;t11@+rjxIEZ27gSX-?1%%g z7+DzBToYzs*u2Ybx!B|OPtN>I3@3KkF$gff2a#+bQjp>9Zac;$iGOz42{HWHWyc`G z@NTyqgE+%`5Xrd7lR<*@({4M)x4EBo+kxg8WE+@n?6G42tw&d6xV6WQK?zK%GCbR3 z$H2x9T10YkmmMP$1Bl!qd=g|6NboFJ5Jc_}J_`~A-Ny2MmmMP;1Bl!y404SyXmth1 zL2O`W?G(NXcEzt%j1x|?FflW2@?>CU+2jdY1}}Tz>1SppCKiwrn875&)XO{{Y;T-; z=d8oXFy%5211mF#S1`Ll@FfkZ{NXBie86T}+ zvSv7YhllZv>)AUzHVkL(@G!o0J#&Z0mf_MJ9tJyxtLvE{-@wZhf+JdD3wufFHWWtee~har#S&um79e303U-(6?j<0$|$|A3gqAQg;r z?PuKM5dw7@E}Su9WC6zk11sYL#S3SQK)Gf*2S}U=BF@gRepewuXg9RsF=3)FU3yN!g zh7~6N_jNIga)Xit0}sQr%RCIcV3H3^@-s}o%)=nS@DMb4`j82osofIFDnCsG()fQ z7aLFu;dw73hygyfAH)D3+7DuYj_m(p1KGj{M!4x$K`SLB4hTW^IDsbKSU_Xtq;7kY zV(3-wTXGJ3=;-raMi7&c6`V5}!2#3vA2b*W4jKp(6gXfOxVzYM6?9@HC_6JSFm?+Z zxeGe@^21W_+-|!-%Q0zCkTrl9j0_B~mxAVvn6~rpJF^`$*>ijg7pSb6nRVtEc#q%g z)r@D388I?}iv$KuhK+L=yN=f~u`;|`3YwY!Tmx!7&5WM%KZS`2Tn;cXgJeKQUq$cO z>B+>z@N6mQJ{K^_#4tU2#X2F-Sk31q#ue*?7@3(tDV~9uVS4lixWopq1V{%13oZ#g zhBwMrPIEIcF+5lSG9SD)=7a0{UEg`RnHV-*;$dK6+TU*chWV!!B>-%kG+gw7IbvAnu0WCU}|7G zeFeO1>gF;=Q${8RQ^t3)rVQeYcNF)W1{YzIIrf}3Vq^w~7lRbzL6;>H9)V|5?;cI++V;(O9u^5>cPG8|+{3;6)m1Wpc-hW~*=Rb=L_jQ2hN*mv*J7vg$%0H%01@o042=bQz8f(zF@bDl z;AB|qKWWh>Mjo&$7-z3ye1DgR4eSI?FbP@$0-7ubO}m47N}vgI5pdTVG=&SAlLS@A zOgs!r{XvINLH5alu5|!cBa#f?PBJnu{$K_v21N$4-MkEU{rBADV`pOkt(Cf=#Q&;Fst79I+6r1gJsU;P@}4jGpqdn%j+^;GH=Qtm4};+X&7Xtj-x*jyVJ5`F zz#s$~r2x;jD=;i9_}>UxCv#hifdv#H%*+gp1#eb?PHY9al!c*>f6g^FR#uQ4JBZ)_ z5nLdG8$>X$GRPijU}0hcr2=LU!63+Ras%U$Y5ky%7%0s%gOfND6T_(uj1BKoK}*l? z@_^b0Z3S}BGXp3~fVE5jn+D=CC^LM?Z#lG&nUM*cBfyIjdj3vfW?^S&-N?nj0VX-YBo_-v z1bl$xiWNs0S%knkgjnWoEzqK)U$% zEq%hs!phLTk&A(sp%X+ho>{{MIxUigv73Jv3j-@d2mkSju}n-1=htvCFtdP2(7~EN zo&+&5fq77|bcT1`j3?fJZCEe+A%dBS`LQ4a3&RsZ&}=Yhp#5*)jmgZ+Odt^^P~Hax zBskLl2YzV;2h#g)Mi7gMm0@!O*xu&{!93JiH1`}y9y2i+_Gdp08j z!`nXHN4o6`o;foyGR&T)%fQ5N4RWhvKl{-wXLMMY8RkyYWncr5j1P}9&Yh;q!La#h zBm+Nd$Ky!Qxs%V1Gj4tw$;1Q}T@PxXGw?DjnZvkx>s>x(PG*o=E(VZV4Q3F@$i=XD z4&(gx6>LmQtRTrnpoS_F6U&*%GgF^~4zmXdGB7i4R$kEa96SOuv5yhPywD3~GBPoO z%wphYy{CBW%w6z$h^ZVP785gAhK1qE(?|w}lbxZTst;~`>deB(aH2DmfdwSO___LI zXDBPf_RdfSc80Z`p$v>{3^P+U9DT0|YIApnGB7hd>HsO;4Pt|LdTi?qWn^Lik?&-; zfkYX;Zf)xw4rV5XEB&SnOiWi<7?@bDvVg`cj!$G< zJ^2SeI}_LzRtU-X?z#yB2bj&x0J4M!Y$G4T#c9S2jQk9nCNf^%%fiY6+Jy(+xeDH> z$^qhXg9s)ThEo$6ud=X$mH@Fcg8T#;U;!fn?ytB+=}8K6XL?*!U$^z4vj`)@@|hkCEMSt2VZ~e<26l$2Q@I(~MZl!!)T!Kz zGliy3<>mkhGoDwUI+dG~VZl^x1}-qk%dly#4R}R2WK#)fxDV7dWMB{$-Zs~UL0Dwx zTpQ4Rt8;CH8<;lFwP6rpI5gLWL6q_IOb-TzsoYn%X3RS8%*@EJpND~oVLuP!UFZEg z%nZG|53(~bY?`R@mFwAwGtL4W45uclFz_-w1(D3JCaN&-GrXRt!XU`-7DO_GND+n) z6IH++b1_zsoLDQ<#%^T>DTZ$oRTx0a-V_-a7(hoL=rMessKU@E#0WBnjf-JY)``V) z*;$zxPES-}U}kxCh>3xPara$D29`#qC!njt7i-i4r2^Y%m)P``ou&9Mofx*Eh~U}d-h>cN9n?1GkUK(=P` zGVgPnyYdPv6D!zntc)ABD1mOax$XXA(PU85VLixhLFRpK7k7MRXJH2WmlZ-XZr-BA zzz$|JvNGOwfAVDxsO|%aGKewnbGv={8^~NxSgL*m!pSG*j_2%L zv?dioLFyz{P~L%TNbA_ZxOw+AMbOy9KSc-&eD)872|oJ=#@qmr2iHF!(->JHW`l3P z`0}v}bi^=79JGW1e*edhiKm%P>}KrQxd`Oiwn<>OOqq0=iSbteh+<|qF!wYQ1H;^V zu21>4o@{jHU}2bl&y|6lVctDg27WLpz`)3OFON|IEFlRdr9dR(cKP}DT%{Rz-*aVP z5@oobx9i^;E;bgh9ySQc1TuxK2|__U&jwn?4nCr_vEav#X`o{$L5di}8NTE%zC9mQ zI)nJ&M#<)v9|f4%L3S~4fJrVEkmJD3k^TSHaDkd5_goo-SU@_2T9`nR;6nQ4VY%7K zlXm}h;$~vFcNlc(0ElE`Xg(*%z`@W9B0;XX{gsD-li}s{#FJ-)N zM2-W*X5eIac?4_#h+<{fzlCwnq$(Eh8A-?kM38fm_DrgRl!|*MRWY)H%_USQlGvO3 z_Kjz$z~y7VoSc{#TE6ozFfoJ42Br%uxEYw5nIJrtZ`U~)n3`F@f(>j}+Bq1Qn%N*c zj#;32rDhJWk_N8sH!KWH&0G*3Pt#mx2Bu~nu!aV{`{x-Mn40;(yk-H2J|PGt0?{W1 zp(G&sq#%?GM4udpVrBr@%G|&NvVggP1!NX;0~^Q?<^~RsZsrCqkT&K99(^WoPdi(7^4g?lqtT?|<~HVPfEASOB5~7=Qfb zVGw9!nZ8VyL68AN3WG@zFe%3H=PwWFc(m2R2iEUl;vg%07`PbL3cuK}fs>J$VHU_z z20@0^!gpqD1&xbW@~^+Er$C&;tV=qwlSD(!UR%j z!SJ9*oWYU>L|QSt=n-ddWPa5n&fvoEp+}tI(l=(t)8|A$D^YjNXZ&<(K07ND!>)58 z49sAXg<5Fr$FLN47(OGKKQ%@eB|0MF%XN9i2@Tr5JA)V@(hNMHi$>0Dj$vd1hZqAN=w^~9v!*gJGBJaKlaYyG zP2`N{J3x!tKzz`pRLVa##efW&*T?u{Qw$>$BgnT5HVn__GcMU2!^q6?vPYbO!HJ=N zBIAb5F`%O4kTRIT%rLJHB*e(X_y(lJnE{6c!)oKHbDleacd4*4yu8H?Y6NaEp0l}u znFZ7`7#KJiHyb}ZuEoU60OB%( z1sPcw?y+BBWM*d&fXrWVgDN$4hUw*?E66z*rj<8rzahx|paDpR zRmOALLDvF+EM?$l*lfJFr61JRlwx3Jk^)t=_t*Mt2weaT3P^!QVb`-y z*gxNniIw5otH+=jX)wje!thAw)t@=442;Z-k69or29^o3AQmG7!@I?wnHU&8y-M0V zg>mYPhfYk44FA7^Hn?q`IuSep*)Fnf=|XizUWT2MKrL-fhBlF7M=nb;vod^noeH}3 zqCw%eGpKnzcLF2h-YJaJK$94UrZBF&dWsj+;@TV4adSFoiQS@asi5PWmrY?@_-7Lr z10xH|F?I-xf#o!W1#V&-`j!e>+X_<6!1$Q|$lA4_1+Aa1rh=kkD*x(c(B_@r&I}B^ z3}?46?l^md1+$idOk;rLKymY35yS#rjXoKCG8N@xpA7$Fx30MEB*n2{3|GK{h)!a4egm%OC(c zl1u<}z!<3aF3A8AlVMmsMVCR1VZ{_(aN}5qVdWHE#@4u%Q*`whL6+$;flfl*J5`tQ ztL)yXy2cFqrs^_qvN3GT+_d%w3kL_-E-nb!z_f=MatI|O=p;tapcey!9LR0V91K@7 z_k5lUno$Qii-Ct>G5DxH2GAwAGc!TS7d&&nq6D&A0(^uDXfBA6jbUX8I4fL-X%Jwz znmOg-7EoRRnEO`rB<#--MG9Lqx%}fpNY#A6Cm|uzf{kKV;kpUELj0_Cx zIYC@)PKHZwZ5enOu7b!0rW-Oh(7p)p_7!=^_7zZ< z3Dhxwj4MMkfsUv$04?ht~G)MNYEcpG_7IZhlTU*fG2ybl}&c1g!HiPm0?3qrij0`8eGariiRruIf_;-gg%n5`0~6#qAxodd1Xp3J&?%M?(O_|_=Qz`z71nZaZ;)7&OuP?ESU^7+*nV^EiJ0Vjwh z%FOVmQJ8@bOoF=J{7eksn+Etf7#R4uL0xc=yadDFN1TjDeE&Y;lxSdTm=9t%%;%J3 zXnM@aAlbmuG@p|}hOzlECxaqGSCcSf!wkl*CSfIpuYZIX)EK`15n@nhI50(sL6hO< zA0Y-UhD}Ti+91M&VMdcM0~Gj0aP2DWp@L8*)3 ze89VfM@89KK-Ms@GIWBpgW2q0k^?Nl31%}fF|-waI(LR2RK>T0Sxn3f-y4M)*cjWI zgc(oswlxW}Ffqt{`1%F32DhO}7?km48z#(PWMX0gahbs+0}F#}2eM!jNF^(S>*%=!P4uEArRx@xgeu~=z;xhDuJZ;2q-1p4Ee9%HQkf#|w?iXTQ5&Ut#5W}y< zvl)L(WBf65q7y3a-8)*i%CZ@BEG7Ovy*ZwFo@Gw07qs$-xCIuOGp5$bZ1GD8BUOZQ3Pyn+P!Q#pw zHsktvjF0~)tAf}J8Vs+WD>Ildd|J)QV9v0korA#~R4Q38>}=;?uwVw0EMT&MY26bJ z28$LJ5CvN8Y|j94k9|V}q>$N1ueCF4ig=O--r8kx?Ww`34tcyYp#K^RPm zGQ2xs$soq??1Uxby}V~9EF~DvowsECA$#t;r6l96^Og)u!VHZC3l={EHIYI37(^KU z=HK}I5xo7hlmEqFD zTbWrvBxte-A_(R}1sQHu@A`MiQH_b=!(~us4McJQkvd?uF2l;1!VG#08@U;b7{1OF zW-wv+K2w;%jA8qB9tI1Bo!faBEE#rf=V7p7*u9;H!ItIsOkoClmR~c48JrkEq%)Xw z0h6u_%U-fFxP#b?cNQ@InknqbJbRWfgD1+MYpulFBIa3(aCSAIK@zlCwpn1_% zGldzKEMQzUQ<%Y$;cWGXO{+lTSs1xQN{)UamoV%V?T(#r~}i{|t(w)BFUCLp&n1TkEj#<*$4JT_3* zaE-{KmI-XU%nS==2{W*;oH!uFz`_b5S;1`97A6pf9W2emawC#~kKtw{13$y{NCrU= zAXEpT5SiaRT&uASguFHPc{H$c2Hr&$i{Le^3F5R6xsDi zP-vZ>#`vrOblK(gNRVCEBbh<|UdHI}$_%^=$_)Gr%8ZB9lm!@+ z83Y-W8H5;=8Ka+m#s@I@kDr zEBiC!ydxJ2L*E*I26l#7Yy27il=ZFg=VDl}#-Ble;oW|11_9=``?VQ_7@q9cW)Nn2 z4I)|Z@7HDkjeLtYG%(Ism@|m;>a%bwbI1N;jw}oeZ$1k%Fo8+Xq7ngyGhc*3C#O7SI^}S|PWS9gpnwQ}#Q}Z23&`j}v z#^yVcjEoGEUo$e!6q@`Rv;_PN^Nt&!D^=S;YWW%ZnYJ7eU}Oe4mGLLjl-HoB-oa+ST#)lX{$UVis5>$jH1`7HF)}cK&fsQbU;uSt7#SEqXD~A| zF)U#Mjkz!^WnutLdVw3c49pB0n8EWPPnj4%nGLiRmw;x7GHe<_11gLR3=6?)96%X> z;V2UWXut-%G6FRE0c%u)Izenq4E^8|1AKY}Xb}Xcd&R)a06I>aiG|@lBh*E#4AVev zWMnuCI{A{B0n~A2WMoKW0LdqT2=IX0UCSJh!g^|#lR#pBSSya{6C;2IiK5@7=JQ> zNLGejOh*=RF)}iIX#-91F)U-6u?u_(;ugjky95|n7#6oPffDdCrZq6}HDGa&@eCXc zhnP0>ax*eAd;@Jd0NHS3D#(dH=7OB~V=n0M!h=kZ5g=AvQ3yIJ2OOJh3^&2W76T{? zp$9VuLp)^o2$UQ^3&R+=8BQ{tJaS4(keA`i1#SirhPxNI8Kl7^=)5aMFiVNy>{4#V zhfHUda;r1kzrf9)1tzr_9$WwkKe)iH&v54gH-iDg!waCs5r{Nlc(#k1aUs*QUEJ0T zzeO1rG5r>`VfZV`0NT;*0lJcxogr=N!55&*x{hApX5eQydV!m9qwLWO+@cJpFK{!+ zfE~mjz;KPJ_XucdG84l-Mi7gUh2ho(ZcsD)0OPBx8K8jq$OL9EGMr}yGZ+{yK%^KM z&Vv|?GyX7xG%+?zWxREPo3VwFVG-ksLwby245uz|gNAQEF+IF>l#!8(;o=2u#y3nC zFK{!kFq~ipDP{!e1PvKXVR|W>B~> z{$v7$rYOTyrYlhC&5R%xBMT_xKr7?=nKoa`U}OdbC*x11`xm$wL8 zr5PSG9%+q*ab*}{<}EK_VgVV?zzQZAv>0|X{b-G4;sBY#u;CBbGzJDQ2GFQEXeft~ zfuSFiRT&sS_X998Fsx!`V1hSQ_!&UMhYXDbHFEySTYQY|ubp7t?~*x{NGfE(1S9 z$%gFBBa7-6h=%n%mH9S{}^!&4>@i;)qejd8Nbi(T9dUJMf%SAnAhR0e`rj7$vA zE^sscVtRG~Bt3(1#q|u3W2e9vlVFTR%qy;EFfuW`0EIFy!x1J1(4mCj8COvA7gTnF z8cD2-3|CWU-CO}J323Ceipc0aaVJrA@Ztw^#s9s^ed~6E`YB6iYceo1tOk)xlUMLEFf)Tm76t}p);TM9K?4m7 zG(kNh5Xl4*VPl@Vf|r4fg@J*Mb>RwL26l$6%QP7{89^i$!_pO+47?1>SMV}6c`skV zE5Pt#IWOZ&`xnc31sa$huHa=5V)(qAmqC=_D+hxpBZy#PU=U^g%E2JPuzw>jvG7QT%@iJa2SiXr@o?-naUIuwaFbNvEVg|7kz@mx_e>fNv z89@XS1A`*-9}Wf;utGJ4hbwp)I}b2ET*0f(cwwz311~ef8onuSmw=i;ApbKkvxtDI zcF_IEtm1bTfEJBUU%?A%Ipo^+tR?0I3 z?l}o^8pzKK@=S1XW^p8OMY#Bpsn=LeRKDM{%@MSXVfr-|(8~C)Aexbh;fcV%XY0fn znHauJy#~Ikexq{7#T!Blpv!Ce7-7tFyYRl;FF#KrBushRbtR8CV#ufJnxLFGLyGn9t8uWng2wI#-qP zx82pbs_YCG=c+PrGHu_=54yN>^HzQaZmM%0Rw2KIEc#(;es~dKDcZP>bFegcyQU4k(u$w7Jdc>&`$9iS8W+t7`B1Dzz*7k z`+UPLn3M0ooeXAyoO}oDWKi^gH{o{Q{=>}5$^hcCfk_TV5St53a)U*{n{ao)91CKA z9Sbsu39JC@SP+*P!Ub)?y>J%l*b8Stj@`1EpMjx$LBIsZZO>;qaxpU8o*w{O4hne6PU%w#PDn10!9Xgrunk(#iz}C;$XnY@Oz#t=uo10 zvY<1F=E*W}GqlW?WdL8%&ePD;pwK#BmO+rAb-pa)ZT?^e28J*O2JoQ{ zG0+QtK$rc1CRH;TAm`8IGcYg|F)%QcGB7YyFfcIGFfcIGGcYhTfm(H-4gv#cpDpM> z&LazC8JJlaZff3`|CWuN4HPg8oL~~v*oXAl7#M^=qobhR0F1n#n_3t_l^FvM!x`gu zN2juZirTYa7Be$A=vW#4&65SqCxgmP7KWR~pH?-44!~-gFUxpQ7DO^JJl9_`y`6~x zd@uxv1->0!mT@UNDD3$eE^lU>@TUZ`FAZ6ub6X-*?bpWY~C1gn@}FO5F2*+vtPEUCOPLsW z8KyEZ2r}Ne&Cl2!z5O=75W~lt{0zcepsfv`Zt^ooG%#Ji&d(sp@Sd4*Ma_F=X@*nG z3<@AZ4HUc@Tnr2vJPZsP-AoJ&dJJE#@iQ23F)$c_xMmGZ&DZ%EtQb}>GT1Y$WMpvS zTE)oV#IuGGbZ_SxMyGDjX(^zyv7JF{(wG=rxEL5*co-O5K)SscUM}Tl@M8SP#NgG~ z(4cVi1T%vV0~doI!{0~T3_%Qk9tbeVvNN2oxw7X6sLQ(P7Pu~Ywt(@-%OFrc>6QrS z;FcRTYnnk4EN3FuG>b5@GrR`f;3dc~V&Rl7igfS@p9WMY`Mka5GAJ)kliB)}ld ziayc-zC9Gw)Mj8{5axp4Z7nSH9J~M?Br1$`V~`5Ntx1e~w>**LWoP($jh}%JLNb26 z#?N@6=Ib?nesH*nGn~D~&mh6@?HWJhY{75W_@x+rT;pd@VVG~hxHx&fg&M;=3kD4k zp~vw38b5;}^NDUA1`~!$-8>8|d>{{P3)qSBil&X*0a5`2(>LLG=>FqUs zP!_nika5bS&n%!3nrr+FEDRuF1`WIcu7L<}4Mc!zU=MIzhVwN)w$(DSGJJqo_-p~= zj@x#O%na{9t~bDIlL5je1B6Wm*ljXpSXr}e=`U7cHgKG>H87pO#?Qdkz_Md4Hv?M( z+nY5YieuVJ76vxZ(h9Z)9yJEG20joW03txcwhbbnJvk58a5HYJdANp~n_=2Y7RDVl z(^j(ZG59d9uJHj~hrF&v4b)o&&Dn$I>OoWPOl%AfYp&e3V`O3iMLB~e!=cFiOpF{1 z+@R5`F!lHpO!+N0q6g!LH@)%??EWMb@` z$hiF~xaK)43}svdF<99d8Vn#KpvxH*gMh?(l#J|e$W+e{4Ag|nOra;oxueW(=NjBOza|pH4}R?bZlVk-_#B6 z<@{5Gu)r&pAx!X!Wf*e}z_b*Gs@D}PRdhKE77l`1hZFnk0J@h~mppL(PnG_ut? zksWjoz@wT6#?a%tKr!*a7!H9mo6UE*k?o!{57X zptkJ#V~pF@bFhNk%EaDQ&cFmZ6rY~~G>-<_H?Uga^7~!lb`+r?L>SU&%neCQUK~=FtRb63I+u~ce z^8P1S^gUSg{XZE78HVd|vyMDsVPgh+oE1#6v4TQ}UHaWW83qmp5Xs3p%^Y-X{NrVe zAiYcsAo8m$$OJitnJFDB?|_z7gLE;2{mQ}s3QT73=AL)|K-Z3g$ak_JvzQsa9eDLmhViTHtA8>KIv`Pyb>PK5KP?$RcLagY z_=imegJ#D-Z7$Gs5H~1fL5(v;7Do7S#fA*)kAWJ@ph5t2ktT9%AKGd4;~3-L+Z!D? zm>7=jv;qyc@3dlI1+%#rj_6eRt(I%4EsA7_v}Bx z0=gn*rxj@Mb!9n76(bWv_f$qOit|qNSOprFWn$=^3TgndGW1P_4SMh~ zoatnIJAVliBMZaHomQYu+}5LvAX7mDj0~WXZ!I6>k~ENaIY3_J1eJG8*vtg482tb) z4VV}rzxn7u^{0xs}j&3->#l{ZyD#%=rk%Ax|$udX%g|oB z;A1x@C|Q431hE)d8NlW;@H1QvJo-fd)UAFL_%xT1iD4lRi1Q@yhyf!D!$i>5RYtf$ ztc-I@PweMo!BZL01n>Nv~D$N>^zWMOD8 zJ(33T-H|lV0a}uvyz-}k@dT*c4FauS?k!pZT1Kx4YNgLDUCIfr-S`+Z8Tc7A8N?Vg z!P9!+a00C-2kjVL0&2Zzf@*>n{fy^(7BexjF@UL^!XS!)p^t6ZZ~pi|!^85o$J z%#>tcXl9u@M-ntLbV~H)uc_b_a{XK&7BdsW`Cm7KSMxwX6)? z_S@dA)MR88TsK3Kfl-xVw#mLN>!mP%MIufB>;TgClz$rhwuMq#87yGrxHWI~x}>$a%bA zH}Hc=0Y;FBFqjkpi-5;-Kz4%$Xr^(1S>Qnukbz8KCE!645SJOk1&!!TxSs;jFqLD% z{S-!K#wXK3u4FtVeE{sg4IpQLM|9r(SqwW1ZU@Mz;Bza$ERdr?p}`6X4bZV_+h*?v z?Is6>4jWjMgAv5$0+ZZe5%7r42XLT)#-G3}uya91F@cqUoeSbJL%5(ZorarG=Qi8~ zId{P{&_vxgtuq^@f=;77aqShTQo1B~@=&V-3uv4HRQrR5!PyvQJuw26@!K01@9)`T z14_$Bl_4w^hJ}4lK~{!EFeYf9G*}*-kw9StDi_gC(qROPF)*NG{!!feCar0cZf8k%i?9?84B?%ME82KKk&}o|%#1+Hyk%W`@7Z4H;M&Cay39O=&e0 zcHRFi#mdcaW4R%?>BGl-6~tl%ldVjDmK%Z&6#5jmXKxp%DhDZJ;0HBh9xpd!WMTl3 z?_?h@H)IfCcoMhr-5$`1(ceJ!Ffn|JyE6YMr~&kKxgluq_&?A4wnkPKCWh}I7qEgz zHZYr=^#e!+3xmuDkOpQ3kgW`Yptizauq`0+t1QUj%nX0?KW(@p$iT$J(8<5(LJxSk zei#3z{w6L~R0uN!&?LaVHFlo=IU^DF|LOD)8}$|}Ub#vsJN4r(&7Fvxf? zGJ|gM0)-4{)etCL+Q8>$cJaRhjd%((urYw#D9pgiC=5~wN-iDzpjE95!VJtTkY%nQ zE(?^)&oHO(FxU-@*JVJv{}w47;!Ef%ncTFfuS`Ff%ZK?l|*h z1RdSVz>vnkz>o%N4uNj+&R}3*01fqJgKzQX16}1U1euRx04+da=m8xK(96iczyN9u zF-&CSWMBY|dNQm7iEU(LIDTD^fuE0IZ`6WMuRxtakb@Zn8SW|l-ux02gR`&efpXnS zNIR|@+K%g)3T>8r0~y1Jr_GhbaPAXP zXlqaa-#qcL0@8M3kYhxwQ_p6&1amh-8R)<;P+7&mz);Pwm4yM^nF1v*NTCKwu?!51 zTnu0G!HqPc&je{=1f4ntHMy0M;rc;F27Yj1$-n@<{siQF@QtLP6B0n1siAj>urM%y z77i(ck^yMc0(7-J=%zI@1_lOBK8AZrkk9}*k&%@FOXPvKLF0=z0fsXz(0F5zWLOMq zKr%5gfV=CU#w18PsOt`5GcYmEgQ;PVX4udMYVR{KtOtvM6eu&S0kc8rMU&xF7tCy9 zhTC0?49p-;gYMe}r3OYOhKJx|w-^{0Oc+jdL6aKv2o6Rj#s^uDAY)`=_zPl!%(P&* z2Hm=a*muyy$nX)e--!XVTJZJ}h@(~?Wdxmu3F;d&fTpIP(Z|kkRu~+87lj$X%_ivL zG>kz3aOdO$G=c8JxULo3cmQbX47AvsVM{rvr2)2P2Y4+9n0aG4#AV+VL3xb13#D) z0Fz?OAQ3T^XS@tz%`DGBB-<-q25GRQG$Tk-x`FAyRAvV0MwU)b23ZCW8?<8El97P{ zbRnZH0|Ux!ei;mtgc&j#m?nZq@G`@UhK2?Q28KL_d7=#YAfgaVG%(E*1z33UMMmy-_1BpaWf-x z`%NZ>&5SH}&hRp9W^9JhY!hxUG3;Pu_VqZs4F0cfI5f_*Fdbhj0~5rGcnwQQ1>C! zLkRT*v?%8pBg3WZObpK$87JKYQH@O849^%FShyKJGcruL$;2Qm!>~Q*$7)GXF4ziX zFrJD0v09Rmonik}W(EdX#sfj$UxSuDg45U6!0)g5!F^;=>@AkXmhFc*V9!|KCa4CV|g4s$WsGMr>$Z~zhR z4C|N}{6IuJ!(AqZ1O_I?{eetb4F8N7vOxNugVOR#Q-*qmP7~0oA5iOpfq|igk#UtV zD1$OFF4)b;)XB&&)eV$6pSd##a5Dblo^u1VmlfnT2404?pgA|dsb^CIBb2pY8O&g2 zn9~OmVq^mQgMpu6K_F-mA7j5Ec>LxVWTC|$Xyk8$(kn3%!CP3&Gce7EF$EabQqM3U zP+7|aDu}^J3DklF@ABy4XCNxZg&8)LF|dJ#o8ZG(pzW@pK_E~*VCG^t268MD!%0w9 zK*~N`jGqIMYH}uq?H~nA4CwimkKr#=9mtWO`EZDN@4G=;-&jG1Q-QN`FQ{<^K9~x; zRP!Y`NWq6vfkXTtM$i&Cu@qXZu`w(MtqB7qen!xc0<;p7W4Ic0u5~78cm!>3|0(h183+nGlNn*ylhwp zUUYRes6`QU7k1|cMi2w!$`(aNHfE44xFDJ*3aYq|_cB5l8x`k?LS_Qifo1~Mftoms z-}pZWF*1Nm2d$uiB}H3?JwZ#j7#KnEx&*W``6Lqqg9F1kOu;OMt3f|!fM(G_;RR-a z9P)Dp8zUR@7gK0po$Y3UIt9wws0dYz*nDsh?F8KzDGkIXWF zw@!doi!*RB?C*xQAfcIqM!8@B>Vw&g3|qB;4Dca#AO^U& z05L#AGu@yih73rH-Ut*J-I|OHpqhsPN0CtkYA-C<&&bBgFagvr2S+pL22b$jI>^Kv zGpNZhK^U4_K@3nPnIO!_#thEWVv!REPp|RjY2qP1y70obr&wqFdbf(2(4^T2{=HL4qbOPQr4+ai~YaR?-EH^zsV>hk* zEC2Jb3NbG8U=U(i?g2XNaXpA++3x`!k!G09$nZUXb&Dh;6Q~gnKCbEUJ`rYihBi+I z4iLe`(%}g)slSt#RfzE>$fR2!Gnn3jNR|dqh)KH{8MX&4SQ8F%&Q>Uc@l51`HQ|ix z44|ev!)`{#13@5ZaGm%ST62Q(4DOck9!7@Gflp4GF*AYN`_N1Tt?{-8&AFxxGH@%D z0V?gTX*01i9RJG20PRLH9AISFTy}896ge&)hNEA(7z7yd7=#&~d;zu5wtwPc><--i ziA#ZD$0sfZMFu6ttA$F+V2(P&(=S|%*MpvZ;WA?oX0Tw8V7wkA!N?`P`+{0hFKo0HXUv}&`^hC|RSsxgg zdBN&=89@OAYJ5T>drdeK69Y&KGYg0W&DT`yUo@MGpA)Q{i($rRF2-AdGd^?iFiii< z#lXj~=>W)M8xC-RZk#>9#h?PJ4Yfgp4#Qd|1|6ogObjLr2M=&Dn1a3T!m#}l7lSLq z+5KD$9w0X3y@2hXxVTstesS+u6VAv4wuph3VPo0$_xy~^j8Bain3x&Q1x+~(TJ*qp zCUVMYMn-mqr$(T}xLjc0M_v{%kBi}{5#z(ar$*ciPmCD&Km;Q@LmNaN6T_wkMz9G? z4EvSA3~*HhGK&dp79T@%@s9@3wjh=>kv|$hO^A61xIo9!F7buTz+5);OobgQL z7EVTXu%Ic!FYXmTn?Ow;P{w4iVOSD)B?Q!V>o)|^psUaz^q*cv2xA+Ju~P9$2&754 z7StqM3yOM1l)lOGAkbZXETE%TrcPo!dRl^+iQy;cbiALg41x?lT^W~5X8h^OpuzBb zHsh4b+KkXT`nw{C!wM<}7#Q>z{sumt+X)(`2d(A-hvxslM{_&D&8_#{j9@0@K-!gy zFM&tQdzB$9aAgi*f~#`~6I`J~n4l^h%mOziLB$T#R?yM>pqU&{o?~c-EO`apx~HMplMw3E1@0HHFtUPr3?>YJ@~=%{X95k&gH9`D z1a+u(K`uG!;-55$ot2g0ff4w=R$hk3Mhv`+tPDa7_ly|3`7arP3nmRF(2cFkpuP3x zpyu65Ch*_}G`xD1SAthgJ?~`%F(6)LVqk=L6x`fDsJIez%rV1r1<=vEpmrkKloH6D zC?1>v@*Y0}gC)bJvJ)rvv$Jt9Jo~~0S^@g}3l{??!>&(U44jO+K5;QluGsa7iwi8k z!*KTt7X!F|_u!;9sNg*r1ZIE=iU%jP8QH-lJOikox93L=6BAe$sAK`xL|~<$-X4U( zcqS4_52(-A)A0ec)A%095(Xy558R+hiT{C1CO-uaufFeQ1T!J2Va2n(DV zAWU!&L73n`f-pg;0n7rYhC5$Cov=Hg2nMBw3#ZqC=CMImgRir=@uLZxI2r^%EJg;f z&lwn)w!^wX;1=JHOWL3b2~bFUSA=jtCNMZLe97;UV`O3g@1||$za+)X&XC8z!H~zm z#gYf9_g4w92r=X_2(jdWnh$x9+TNLArN9AcMiz!V&?L#$G6oh<7XdV%Fk(9eo(x;c zKz%UKG!`f`GJuNhzkv)`TmRtlV_=5~UNJJP5Qt!6Vc=%q0PSUc4eIOtW@BMv;AY@t z;AY@q;AXrY#LdgV4LWIkfIE2KSs~5lZ_vimJSJ9F25ttBTR{%wW#mT8AVx4Tf!xf( z4QiTv&u;{EbGboDznT9kXhRCbzg#Tbko0|#kyVI+n?Z<$8eM zA?O5skO(VSgok0-LoEi-2!Ig7iicVZ!XT1y+FZsJ54A)Y=Ks`U5NBBUQ;R`@VH${R zV4C_4p!MimG%3?ed31Ts_gWbdM z{IJ~j35*jD{k4-|VmNwOj)9rs6!`GhOxNmGhvu>RF1(!aL!RV#+gEMj>?$|&IL2)9+k6Y zm~~W+!49n68BBUJFffFJH<8ReD#wrjmQP{;v6*BU?lFI9>Sbo+0G(dTI9&*IhOH^X z9p;I*W-u}tgB6*87BsaSQ)ozex%rJ9J0ru-MWzfaV3L*L$s*7p<{gVo8Q2*nFE(Z1 zV3@Jkl!2RJ4@iWWL1yW(EudpDel9X)oFxR&D0^qxD$xC5Ag#w^vh6BFYB zp%<^ei!(DZUxCQK1yL-l??4oIGsK!-e?jx`r$GV?ER1h^7~j16A;QeU@OJNhMg|tp z;MZzK26l!OjEwJk7%LfB7)~i)TC-CaRER9=V}vky7#{aRncNJ=*dc-p%%>nMaDD!M z-+s`_FAxPFhR;H4F?)Q~1||mVmDYO<7I$di(IU9ca($x~Gf`Obk~* z6br+vbx#=?_d9?n(7Y`dgEj**GlS@y-BUpeXP<)ni)hY zGVER?!k`2umBFM6m{f<54NPs#@(dabV3P6N3~mNZ)}60}8FX0No8=kw89JKfLF@V- z_cQ+Ju3=ylV`!NGVKFoGf?15rOdw}7@G$gEU~E|O1=NNHxt)QZVM;$Eq(RBnzycY3 z1g&~!WMVkd51O!NW_S#y!DfPo9D65#PU!{p`~(?3>|k6mGX&ShwG}f%Kuv+~iYsP@ zFtUP!gUTD%q!^}5VB7=o4=79-6hTgU(;3JL-i;30^a5H{qRPO)0Jv^53y5T5X4o4AasUfhj)9qRTi)!C zb3jYuK=W>3B@l(IAU1<8!_I!j-_Pf9urf1%BApeqgB>*G+`t5ieNfp1+WkC%aZXPS zBNG!y3B$x6rN`$m-g>mwj+2#f(vMQm4GbW%foa;0QU*?j^V578xEO9t^JTm`hw;`l zUjc^I4>cG>8TLQaV4NYg|DlEi!=y(V4AKnuf0Tj_D!DiZdSeBs@4@i?cS73%#u+P? z*|9M(y!)NNzzPy#;Aj5wJApxf`P=UV$c;x04J;rwBL_qC0mj9PPpY%BF)VxQ!obBa zYlaMi9K*~RG7R!yQjOvB?*z~mq-Dz)H{N<7#LUd_;dcUP%>U!>1O_&yrEgt83tCzZ zF!rrk$ic+IIBkXu14|=In+s?_YT0teUw6K;Ff%jExg!J8H1CcK0~-^_5(b7PD;QU9 z>amjmWoA%VaWU+lrNubUbjA`z;Rcr3UA_!r49AigPgb@wN-*qAVvuCm$;fy(Zat$c z0}BJ_ka`6M76#A?B+xEaP~!u%0m*;?bXFMXj6D_x&^A^Z2GFF}Co#rVD;T$nIWkx? zxHFu1%Fj5f42!>TFmNzjNM+z; zypYPk$iliS|LZNtp%{;HK`bUthNa&)7%%euVB}(6`i%p0zT?UjjK805;pJxrX%qz! z5{#3X7$g}dGci8q`^_lDD8YC=k6V_3mqCtY;miQW$FisTn3WhH%c@iu7Ed-{e4aOL zpM)xN<5h9S$Fi^Yifb}3Kzzvv8iiqCV3uH(ogv7?#4?$Qff+x4hF9FI! z`}`X~O?J>)a|s3pZH6`Ah3O2S(Vq<~7>|79VF9%eLETkQpo3tb+WShs@l%Ng)~nkQdn80Y8C+|0}H;Xcn7pTB?Z*;+9&JiE`sz`_I~*%&_G=V9#h z{d}K?o#E?!9>&MB8Nc4=;beG!pNH|U*ZccCybN#d^Dyv%Nq#UX044<)-rnb75CWOY zAj0tDJ`aNk@=z&|ugZ$e_jW;Se{2Hp9pJJPbM@ z2Q%n0e7n!Xpa&-P!MY5=q!E}j0h<7t8U-zqvjFof7(u35g4s3hbm91POj z4E#54cY}xHE*64VpvA%W!Mh#iH!yy=54sBxys+$3_LuwM6!1e4A`0R%FfmS&IPfo( znTg@aeI8Kj0F;SA(ZRsa@I8LRf6%3uV6FheOJuGH!#eK+|3TOJF)Yi1FgVUc9{3Ns z*YCr99?&UK%d!@LwmS{7+>P0SB!J%Xg4sDTY6@8K-QU z!ot|GYTSE!E6S3hTpRp8~P8iiZX#c&H^S`8Ft*~VPIo$111e zkAVXmZycZ&79RsALzf=|7sJ;VOiD> zn6@APjhNWM=@~qE!v~t0Mm3d*9qe4NbeA6k0}sQptSd0>SHRlefxHTG7&`+4AExCD z5X-@C6JS`D)zARin#ge`vZ2A4i5;9|!KO1XfGX}}kWV1t%AmyX8JVlh@C})(!tfrM ztIF^RnXAU|6`5A|aFg8Cx%7viZ%*e#>LlGhh;(~MGjQ^?Nr9jLLOrJq{ zf|+rF=92&aK)rqtpQ(WfRHiVnFkFaQ)9@5@IwZ)8Y+#?UFf*u4dax99$O%Z0k%>X5 z?SVbS86XD48BNH}fU5hU2oVKw!Om!DForn;Y#$rrov6MCMT|^fix}7$gup|47Yjix zCXnYKi*i6`OJ##)ekejjz@~u)wHQD}3g~z*#`*Q2DPhnE2zbrvs(O$M89yJX(~($iT1(BGYCCcK&)<$R))f)u32qU}D@72pQu9cZeCl%RQJ`kS3g%K$R*i z1FC*{9?szd*V`W-@I4Tl#$(=Sy_A7r!qHPKPxZI1IBUzo%rNWdDHaB1#?}{;K@FS5pv9;yhfaawzfJDi z+r75TObkvD>K4=b;fsp`tQP-h5qSD7|wM-d;xiHVF0`u^~BcV|WT88<@gCrxtvE0XoPPL~=5Gc@fFL&CvBS64b4{ zwT$uUYhOktkZQ*FvLHR|4DXgQ&RP5%)CYb3B9eiDgW)LuQB77BhA;+phA_r=?Tleu z3}K+l%)@vXLK*lOLK&9@gtD+O?2Xz08a4_8bpoC&V+>ZbB`8O-9H5w*uf+h!=#@A4BQM;ehM%MGQ4~t0BQnW;bjnFoOqQN zbWY5_E4-k=%B#E#k__LjfYz6Pdn~{p!_a5dj9L2BvL`1sI$e{vQ!waA9Cza0TH8rp}`RjAxE8b{-XQV`w=lz}TSJ za#X;bVf9`C1`jal1tJ+I9%Wp;SHPR$#ySDU{|YzO3HUM0Tq?l0x0!L~Qh^|b6EFA~ z!WjB@3ovl=Gpszy`0CIM(7^Akp8||8if8>4V31_!I?8x%g$w8)tt-5Yw~8S?Xg@!O%@piKbX z_dtPup@W}srwoW>VOYzz{@@(Y8Hda734rgO{ZIgW1&Iv9m3sn=zh*FAxhKHP&TzWq`2RmF zJWLFa9)kRJ5JWOEFo1eJpdJqgcqMRWV zyVV)k8Nnnom}K1x5@}=tak#)LSFU6{(5=qT(9*5Wz{<{aO8U>*IiQ9KNCg8s%bPun zpHChF_fICRVg$*7QpyAv6SUnFBnY}Tuv;B8!F5LZ`|M@hY+PXbc)>2<2a^I|cL;+? z5wHkklkDvsOrRFXG>#u27I@bw*hD6<8t}GLFrOL12W^wRv0x4(NY7Lb5Q~wSaaxBu z0|Pt9>phI8=Pcs}RdB>P_O$f*cb%XOks#l)fi2(wJCF-Za)U*fSeWiBf*r>Q+8hgJ z5p*VKd+eHpFlT~TjLeLy!OrA-y$3WB%>=r29z0q&0leQI6qF30n@Ye3?VgrqU}Xhu ziD3f~9H2T3au)%J3w9BB>Gm`ZaKmUi2LmJc${uiVF))IcfHHvG09G}XgMkTr|27Lq zHv_xKbGiOiKR~BgfKm(x*q59PTR^FYgJEyf7f1>KB^Aha>V`X@IAUTw6A5B5vV#&1 zsDjxykMROXEi+gz!q)EIT&s2Mx=d1Gx!wSXs=1k7q%LvVtsTI-W?*CcdDe!36U^pf z_);Py0$tk34Dzlh(79a$oKaej9+EHzt><8VAxvvZ{1`TMix*KVVp1U z?Y#zQD^Tf;{foiD_gxXhVq^tLgT{7VuV6f|^az(2s1v}$$jHFc$h4b>ftO(u4+B3# zK6tyVAVVF42rFn%i-AEDJaaXji9w3tB@=@zBLjnMBU8_8T?Sdu`5kYV7~~jstYcx2 zXV|%pg+YPg{(2S$MTYL#x(vz;kKSuA9x;6MUPF`R)_V;GZB{l07G8#a!#RJzJ1>qY z&iMnH`QHQ@h}*&g^5CCd#+I32Nzere5Y|dXkPx`Hy9G3^um!XtiSaG}3w=fghQFY0 zEYp1c7k5B=H0CNWFo-eimak)EV_;`|)XK=t!~)7!pjZL*$U)5lWkx0jcE+!=>{-S5U?+GF#tQ|IFe}(!3|b6xl<&XS0J-j4FC&z-9?Ak8PXZDGyYBXT z(23}`K{=g)@dZC*ogV`O(=6E1ErySpEi3zN+1MC1f0)3?xKkKJu{AJl|1g1(ftz_P zh~fduF@ToR2{Wz(i7>G;e9+u;@G$7Wp!FaD22RlVF(6H#)omb?b_j!b3=FGQGwx_< zwdG)9_&#SD_+WMhW`@SO%NQA08193X`rT&&HyODgf?S|cwI+}>D-*-(Rg8B&&j2kS z0PAI7W|*^qvE|DQ@cx#02v!{eK*4DuiiN?-w{2Bs%BSs9cX zSU{8tgB^nkD+B0=sGF<|Mhq8kvVyO6Ghw`Nla=vw<%OH9R&0-NvNC>@eSDME7HpU; z$S?;6$S^kO08!960s#yl;{q5#wgoUv*`>k|(8zRzjUk|s1;hyiO9wLkn5@MR*uVs) z8kw%LF$6ZSfP4_lu1`e zSs6e_k%G=9$YEe$$ORom%ErJ@3_6aK4Rj3Y<(sSw&5R5OZ?ZD9GBO?lQ%sN}!$JEC z85p`4*%%l=o7h163&E#e@4v~)c)oJ~P1fm*4CimMGR$UVdUZyZVGbk1n=`tMvxMH9 z(VfT0aOx&2!$JtPl#$``3pU16O^lacuz~iNGHhT3143CLyaiPFORtfKv#ACc|lPz<{?5f;vB-bOI_9ctEW}R)!a)pcnxUIf9~*6%>}B zf#r)$&}$As>KQp1-kE~B6AZ`HL0KEzj=UTX5@C7-o(*DPUq}7}yvx7g!ptWon zkY#MK440c2*Y$g`urNHk$qMe}g8G5%ps|)@2E>AbY{ZV@8j$e1elJEQ#%DKK8Gp!v zG`2D_zVJWS?ZwE;aOfs0;|WRf0Gq-s_o_`Mo@zQ)QADK zT*1rN_p5^zVSw+NxY5K2TKNU?6$1k(YlAW|XpcFI^vl$s5 z`X9ad8q|sdrAJPN?aPcAxWFVM7vp^HA5Y(a26Y~u(Pdzm!^pUoI=@1_r4;Qr}LqGBbe0!D9uWgv6ly*kr~NC6Fm^O(6`%Gm$f% zC^51#fGuQD!+K=nVn&9GO^g%H+yI?Z1@gh{(la+%Il)c10B40 z<|ghG6d!-nd!9_7Fdx3lj*7p{iX%HLJarkZzF>$^4SMmAG z_M2a9*ccg>{VHbQ29ts;Ahrm@$9p9V(hPs^moO+WY)xTc;$b+XJmckgW>9XO*T)EA zGBPoO)G|mjbSN*M2_8~^)XNBFaWh!k0I3ol2*nW@27915|olnZeG$%5ZiDI|IY?*P@G9p1gZ)BgF(_Gq5pCd@Tx@v;z$kw!ao- z-~~&7_O%N#PJb=RAlS&%Bg`Ptz;gPnD1$^p3+Ox*$bw2n2GCjn&;g{N^#Gu?045B( z--oYj=)rbgjvCUX5eC2S$=DJE+}twPh|wNz$Y8tnx4zV#4zc# zD8ppXVJqMvv=box%nbc~j8N9OUJ#2BqK<)!ao;?~IcvfhnHfMK$iT}m?I`22U$a32 zL6csKGVZRN^jeguf$7X!Q3fVZ+kioo;YdvD;s$mOR)*Gpq70l2ZU00Wc)(sh9y9&5 zC?5kTv_X9xA%>H0MZxPxB*0=!f*`~HEC!vUcjhg~Y>=tK4DUeA7EmXN5fuH9Oalrg zP+NsT3Zw_*Q}B`FFLPh~IR##^c(D+~0v+TCav6Af?8IA9$l`q#hELg`7zEc<5K#~p zJdcPWcmlNF8r-P+AK0<_5*NtL@4FenOvna@n@^sC4;k!L zhOodJ93V{aVmJsByciC`1TBUGv%s0`7T9~Y-hxg9X6zOa0ncrL_cnk|B|tq~?DenD&BzLJK7%{Mmhu+Rh`R}6#{ovr zsbD(&BM9pPAY=BbT5Bg2Ymd<;ws>!$HBurjQl z#>c=7CPB>xJ!jC=T@ zEQSL@AQm$dGbjX@88%GgV_;zgk>EDgo|_hoEZ|^a5N2p!#5jM`G0;x&jnnuTIG9gQ z1+6c*HbofFs}U6&ny73 zg%j)mPR5g<3jTyKgCN66V+LUmAr2xWK!hYC=o%hKwXFyeK%QOF1PQP*fr4QLBp5*c zV&G)_y^!(59MBBeNn_BE#-D|Z4Ld>iU7P?{slOI7E;t8DHz$liUEH4w82|3#0JYuT zi`{&~#=;CTl?6nAT2-JLf`OUg_X5Tx=RhG3GEstIl?1|kF@`_u8Fzr}hlD7D1jBd5 z12-)gS;78ekYxB$GX*q0!F*#mBZvVy+F=T4Ynv;`Z=Y+xH^qP(6riDd(DHjR1_lPu zXeG0xlQWVq|1m$4{1_p7^<P(Ow3*k%naTPEDXL3>07+66qG*Eg4t#{#P z2E{f50~ax< zU{GgRTK(liHX{=os3-&{n?Jvl89BfuBZCIR!fFQ4?xz>>jK6{=B!K%cA(85b_{F`F$|mxDGXc;X`r!$O$!)5fRb?xC^{8d$^g|7*Y`JtQb%}XjVQ0w()K+BZ$Gy@BqSKX4t8Ch7;7neXbD0$jSh^^n>v~ ze*-A9r-0VkGzokF?NbDaGp&b3sRhHn9gOQQ?_gqKVA5q^kTPQ2C}qR|X6XO^kt!ac2)Bn+!wSI}XObQyEvh z;*eqdbf1Gkj$sxnW0UYKRt<)2ybPdKntIHjrI3&l${bl47+e?`7+jbb7+ji}AQ#<& zdPM;Y44~}I5Xs8G5Y5T}4$Bx&HjZV0oU@n+K1q;)0d&k_Cg_+&(5MpwLly%AgB%OP z${t2Y3Ib2RK$>ox3`=?#&;8P2W?=?-jt%TBaQBv*VgG8z8^4tqnZaTVe2f$8etdFg zWMbL~O2GUKJ9-!&ua0D8X1MZ!1GEl@k%75^rSlzVL)=#u25yMe%*+fAmN8!b06Iey zM1GdN`~jq*V*}#{2T&*SpCX6`AD|CnfRE3IFgAc>z|EW=poKR-K=A1q^h&dCV6Nb<8RBZDx*#JVqc-58meK+(b=&9JD4@ywnrtW3-d zhhA|oFf*Nb&B4IL%(S2H#X3-~yY(8hwuE_;&YG>KSeRHDKzvrl>xK->%#5pKr$6rl z-`x0Y596=J`@st$=O{y1%naXpp@QH-1|kY7uD~p?^N+p;-86d?WCduj5|rpc;|EN$ z__yxZ21@&%?tu^2f3}Bl?qSeO4Z|E|FavBjl(oJWCb>irBm_43*ej69$6kT@j*Kt( z7hG}!^{c>Krdj;kL3vCMG%C2dhY{pYCa}L4SQ#1?GA`KN3#wy59%Teq>pOa~7@-Pe z879_E`0vWd!~{yL3h1zsiD?bAv7b-mc8Z&H&QDz|XKc5?T+aFr2qq*TKQW#?T?bz|L?=9JKB8 z(GJEHahO{WSim`cMI0oE;2MvC zX&L_k@R3n_L_y7x2g?|<8JQTe89&QrGl(#(iv*Rv;Ca}cJ&g1IGO{r-tm0*01`(Xh zt9Ti>Sy%CbHyR>hXcee5U&YJ#RTd=Aawc+xDI+^b19IeOG3;9nZEiB?Gr;RP8-^9& zs}qsVBep{t_jf>IJ0gxOc4BB01~vO2K4NfTS__(E0yijJK|u^!IRTLaPX~k6J3$K& zMCgKI9y|cn0U8ozWMTLRI&BRcrr;sPW6-L81ICeHUt!e>C@i7bPY6^lL5)NTMIVO6 zVDB+AY|;TWf*8PeA%aT*2GG>qC`UrsVW4~r zIS3Zi&*fxhVBltj>=9xD=Uk{dP=;k-1Xlu44Ck#tJ2*gV-@u!)AMF55aDXBXwiyRB z+6Bp+;7o^iw2Q=?88fJoMjTR5CXpVLsYu#0kn&a*l6WA)Q>!Nr(ixf9TEUY+Z2S49 zJP={zU;uF$A{cwXhh#H=PT2>=)lKk*Hc(v>&G6i6!ND3vCN@yV7~Gtk1J(%QGQ=`G zvwG4P%*ezB>h^+VH-Ke(X0S3a#548^GJtkjgSKOUs^rITW0P@96*9c+XM`3##SBxd zpxLT~VHK=JTnSjVWy8wC@c&K#0}Es0-2l+~&^rMP91Kl&0~mN1|ANGs7zE}#2j3*|=}rJB^hK|H zJ_H&z`FbY+G*rJVtKrKbP}=~s9{$TA(1rI6cLP8J_^S=q>;VlaGcoo@JGRBA3 zKv#N#$ak_JQP2j28E{{LSd8po0~t6OcFtye(bNE{AsBznf-*t7ULk_uU9T|a*+gZN2S1_nXK$IBSce4GqwQ}j&p zX8bDKJZgNUPcy%rOXTrtjrG-Z@l^fUfVUD1H@uvVgQ-O zz{Pk#=*pVSjLb~T?LYY#m>EDM3oD3Z;AXt5IOmBqs4X*vW6l$6(0J)jJ_ZI}#yg5n z4o_qQNlfMdu^5>dz)oS{V?HFb=JXaJW+rB^092fX70hGcXWUZ-QV)upKN}dKOvW>j zAQmG#)R0r#CBBzEezDv}kBi~-b_wtjMhP$rlt4hIHEA)N*)GBObvfhd?GoCIXSPc) zfQGdV8P9E(U@&2r{oa7VjNv>)#rf?L<{;G!77Wuia5GqgR5LDI38HKmK;#YPx{f46Y1^pUN_LFg${YKb)%R$?#;VCIe`j zz8~Y$shS{zpH9{E2dfTZd^lB;@q+WishYtI52tD}gfM`NjR2F;jF8?ZDLBgOSqqL!c@yd1y z1|~U%rSm|E6;xU(F?=dx-~nyxW@Tnz0JW0Ym>3w?K+Cj1wH_BE0|OTm1NhK?ZYI!t zCMZ%F7(lMP;QVR&GSDFBy{VcEY>aDvyD_ja&2La=U}Ij`pw7U~03taUuFT>DukHYC z6b22~fGSJySz4g+7SPIV=%MJKD=k68Y)YVB9O#fOZHBJj@(g;cUBBfS-{yAxme*%! z_$|+1#PI)@JcB7i({FhObB31R@(kdktwDV(5XXw)-6;_UYlioyL>O!trf%S7uw$6A zft$ez9GEPe4CkGXb?#(hWn#E6i<5zs5#&5JhKsW}8Q7RE&Ef9#Rl4!%EZ9%3Y0q;_!;*3gWBl~3=GB$=bfi?{AUG?dH<4UU}I?fEziKl z1ac(9cJ0m`^^`U=U-t03uoT-IHVxYXRMz%rO6< z27?j(!zpq)j#?@5BrMLXKg_@?hAGb0ld z$n^}$%2GVVK`9#J~e08Rx3Z?-$}_czjWiL6iwZiZMR9 zD99kz$n>0vL4xhgMM1`ovQI7wN-?~-D99ki0w!781sJ4Sn7|~<4}Q?j;s=5Z(u_AQ z2r|ep9J(&ZAj<$^%YjJ)hMN}z84MZL&gNn~pt5#0ml4DI*<1`347V=`GFUV){ant$ zV9~$=q1YH0EI_MGEI^~477aX4S8y^|H1L5$1we!lL_h>YSuue0SVPDLrYr`?#$5*J z4oC(DPX-1CAMg&KhD(ABtilW{RCYXm0IIt|K4s8jSg&&CUOOA;UbPE?3@l)GvI>G+ z%izy2M`g?3U97CE3{O{ZGVWG+x`LC9;p+-c1`dXAD>xY!t9)C*$;t3z1t)05;0jLA zfwy1sU(7fLG94reJ{Pj%>jKc}IUqgAp$gI-pt3y z#Q21Q;((VEnM*7N~8>_`nXtVq{_lxeIiyoh?`?GZTo&W@I>fMu>rx;rtmP#*>xj z&j_(LFkSd2%fP{~?~D-WK)e1v0|s7(3ulBFcpI2z_8BmUu-x5X&LF|?6GSr4-e}Gs z!7_EDIfEp_f{o@3QVd7l$S}w-d{_nA#QpAw6oWDYh*V|xa72nhhvD)!S;q5~m%qvC zG4!4lVqoQE*spxzRTpSx33LKHh{?nRwwtMeX-b~~Xjj(B-HhKStzc$j1)Iv+z%*qw z4+AUc3ht#1pu=w_uI6FjVBlk%pUcF_@NE?jXmsJ2@{60GFbkZ+ zKCA*Q!vr}KeA>y6bw@!1o|9MefbxC2z?!BhApW~mV19$ZmusNL()(4Qc^Jeoc3ccA z3N~((U}R!A)WFENvfxkyXaoD(35=7wAMmrVG2A{P#lXq%@`w}z7sIO~QViS-{W~QX zX9@N1lwe|FxS)Sy=@n2n0i=w9o#AKzDAvJe0xU1Qv*swL024#gYbFLJW-!SHB3T&0 zWFu4aGkFG<#-;{^J8zg7cv+5IQf3fhI0GV?Z-YpdYnPN6gc(3=35FYQm>Fciq&%2Z zVgTtTl#~_Pvhz7%+s%vwrK+gKJff2%DJQI0sZWSXt!=#-O z3=E8iY=2$-V9mkGxK5CPjp3CbsN1;^bXMClZU)dY10II0pe4C~?oMW8xbq)+&^j|4 z!xGyEpdl7!hN&>dhJ%a`dO*SPN)XiRdv3Gm{X0qU`Z(4Gmi_z;tf0v>R!|cL)b#_e z>^^AQ=*`H&(8&*KLOk6C?u#&h`eO{>{eGb46=(pL160C+dcvU1cs9+AKX{l~8RiIp zt|AAmQek805M=zV*dfTo%y7^ayjKEb78|I51vOrZUtyLHU~|5}%;9BNvW@Y;_j4@F;PYD`^EaRwCD7~*NE{Sr z-xWbD&?U{F&?j_si_~+_RehlGD^Qq$gNwvbC5C2}<2Pn7~~q5c5eky;M;IO9Z6`{1Z0Lf1BldMoViU8bRyB|IgDFY zeFm+~2k8Wlnlmha&(yq|@xjF%pio=>o{52-;o~k222O^{8$eS&M^CddaI+pg&B}O5 z`sis^UWPUAnLtCTEz22?bZubbVg(t%z|IWT$p#`h!E7#urSF*-xS2sD517pdCIvWt zy<=h!WCoE8>+z29BL2OP2 zFv-|<-I;-jjq#!Xo}Rfp%xnxGJ}1MsiJ(j7K_qxBWXF!Vpn4yqn}L&YqjJZcK5%W& z-^U1Jp6dlOLEG7{J2NnNGfY~}IBUyS2^Ll+kTy2v|JR%u*jPbq4#sAXrL2q({o5dx zg7};apTU-bNU)`Uwu3Eg02#-@xKX(UVJVDxu9p$SWMpChnajZN!1uwwY1ZP53~N59 zGcYks_@d6h!Z7ipIs+@i+>h!E91OcYse>xajk9?fI2l&X=4E`Hw{kWw7sIOApu-?H z%;sf$mA7FwFCSQduYu{{k_C}W4A1qaKL$-p@G(p< z0I?WZ7*@~bWn9X>8mxIf_^wd~(B6y7uAst&0n|2pwv4g$$Z^m?c#U7w8Gp!voF>I^ z&-dZ!Yb>lx4F5laf~Vn&I(S(gXas7(uHj89<9grC6AmnHbnuK{shJF@P^=+uE-1jpxa^ zHfuIEhVAVNpw+(Z3gGp4QlJI9pwS6ghOQO`23Br{*F3F_%@Vp?V1I>+4Ax-M229#BY+o$M-~uK=T{b@k$UqQih8r{hlngNjv}y}976h8v z2CdZxt<%qEWMC*_U|=X_WMC)(U)2R#&&9w{#lXN&!@$4*y0EK(kzvPTL52oK#?Jjr z4DE~zAgYg%sjWqUp^veNsl7#kflY{EQ~8w53QVjFE&G`mpV_zU2UmmO^_m@jIFZ(C zcKiXa-utcy5@uy++7B8=V%RS5<2SOZAHSihK*FrxAY_nWSXn;#)nxF9RQFUy2ot^LFIz{CWaZCzN# z$j-3+ge<7`_%)01P(Qds_fZkb=<9 z@R@~?f#HA*C`Nw7f^q<;z5?Y{#*Mxp$AU*X`as7oGBPpD1JBYiG0cY0tY=`?mvS&3 z0FA_f@);95Ze^Sd1Wig}*i;T`MuS@vpsHl20BHUKJR68{KOGyxc096ej0{`KFK!nD zwUG8RffhY>?gw?@cL*%`!wK4A0rKCC<%~;UF%A-D1t%W{K8E9^V6X2lg#-$yb;1am zXMnhdL4e^k4}%V}o#89>)XK$1Chj*^+- z*DOYGoPPvO2!m%Hz}&Oo31Lvu2IT|fD_>BOHK;2EE@g&gng*2};E=|5ccUc3HGKwV zP_hNBs{uEvr5TPv67{}P$ZivG8xOo_2)tVobOhrj#&!Nz?=)MhGBM2F#K`zvmWdg} zU|_dX{BKg-N-j12tjAhrMlh?Hhr@{*lFff1xdffY=$9XVjapwP+$p;#Wh zF=k*9Ww@w!e8whF(;s94595gjW(FS6=FSt#L3^;iZ)9R%;$hsZzhOcQ3k$=96)X&_ z3?MZeV3L;sq>PD)pAZu7y z!DKTNh+>du_+)nFNH7yS*h3s(l0kuCN8FnepgB>H+ZhxY9vLm%{YpWImtoHj69yrM z-tQ(1q6`oElo-UpYz2m&<_v0JqJinveMSa#5L>;01;o~5cs!knL5uOXIfE|ai~EcW zMhq|SGcp*1NmE7;+YZdO2c-}vhWE=ELA$2!Ghf&;Q;3ltY$bybLzn)G9m_#0i$Rt% z2r=x6n!X$~3;5d{R2KJ4WL$k5JZ^tZ7|J*aVz97-427Pe1WL)Ed1de=y_dg(H?+L& zWrVVJDS{Z_D(|;BBP&QB0|R4|z?=J^L6zU;3=9lR8(j>ybt{X2vv!o2o{J$0^GqZy%XW#&nTr6NI7KT>-TRTmeg}^=#Y5@BU zJZ7!L&_9uJ$whXM+Yc#&8O#jx`anXAOpH^jK&MHfdsme~b_X~Brh@_i6n1JDBI+0- z8WA@j2~pDS20*IyvyJJZXzo? zDWd$o?1CzWE5^O6x0v{ZeV`2hJFtdQ1!vMOkbIQe5&@dH< z51xZqvaXC7=1!0x7g#BH3gXI94_1hag}{PBEnqhawSalxNEK%Io=;s9MH#w50RVM4 ztWFVQc&Yb(Wi=xc!^vOZAo!%W>ZV;D&ncN_y0FB?mPv)ue6~V#A0UW0x4kUIq{2;@l-qGiC>^A#X%=5Kj~*Y`3n?EAaaK= zNEI8y3E_$71(^hxK|BetGZ@%e4+y>42RZ^BB*+XFWMKud8Q8h@^MPE*0TyIn7k(kQ zbth;m1w>ZlpwQZ#k}S;3Cw_r0l?9Rf3}6zJX*n4vTBgp;@S>lQk&%r7w85Q`!IrVH zV8=yvMkXdu>UU!JWcKC1CKEd-Rf3ZygEPa9xHH|tj4U7_24|*gamPNYu`z*o%&gO^ z7{KDJtk;7X*g#x%5W(QV^gVywjWwXgFsLpCr=@>$zcaG1gX>lfFv$rfxmds|Kt)5_ znL=hEaJ4H076d0EFNPOpGfzh`F@aS>qa1X9ZWH6}Y2c;Y4b31HGdtI2(3m;TrUr0? zZE8S@u+0si2m_Hjgh8r65q7$nlSzOX#FKzr914oCCoMe8OkhD~upkR7NC7y)&NQ+x za)1TF5jMRQR31WPMGgv0Z{=lS25V#kYvBj01oxk*8)3enI^_nqV3`4`Qf5>!gfe{B zJM#im>rJi#9a(sxn~{MTRE_blL00N9@_~l`pj%JlKqV6>H!y%&Gi2Y<%kWQfLvy1w zD+9w>(17C)b_NEHW;q51&V6l*Kx>LRxk+F4*(fikp#P#?cT4RtVX^^zU#8 z18W0I>){XvUgk?jLKt|PnM4_Qn^{0-r;CCHjz9#9D1#_N$Dt4ghQqh`T0-y4K4T@% z!f@yo=vt&~c;pQRgPJDh3?>Zbj6D+>%}p7m+~i|0W0-c6kMT?Xw3~e93{!9NG1xUQF*4YL~S&=O282G9!2mm%9*CV)=l1j*k4uYzUZWOx&@{a+#I_QG3i z4Cf(&@(iy+mTaBQ1X{WRT6PZ#0Okf32-O6dDOe9y2)aQwWX};#MrLrpFeo!@nZvlb zyIVk>g<=0KJ_c5>Fek&oTYQWkLJr*G;{q`mco~k~;$z$!a_|-(ABYKF#sWG{A9U6> zY$*$9p%G{~3uq+^D0o#EKpR{b81%r`cz_IeVt@1&p8+Udj2O<`;$yI7xN?h+@qfta zTYPpPCW9k5oE$+aKnE3r*9d`x7~4ay-r@^wU;^m^Z3+R6{4iQDObFdPZ2=1l#MN93 zr*DDw6+%LhiJM`238bIHz|FX=1ezgqSuV0~c`%=afsujbJcI>q>utEj2ih-o3$$5; z@i~7B4%l#W=85m4KOPQzK2P`a=Ht=7E1*OQTn zVe(Br#;>xIZ}Kr*dmy}1{>y=5pp5bOp)dnG!;^=?4BQMK9ttx^GF+P{%^<^YeV#M} zD9Av=>YyM~Vr5{^V!Sy|n(>G1&3V$=jJM}WGqAEV%-hJ=(+=JQ@Hwuh-Jg+(31lJz zFT;wM-c7$am|0mtrn0jA1=|238AKRf6r5XqiHnt&dHN$^27U$*Dad$Xo-}B#;*qcr z!-aX$44}=SOactcW8NNJ1=^su^pP+qpjO1(+;f|im5Jf#BVh(sR*)zw8<^e71fsaX z5)5Jt@TqE5hQ8oQ%O0{aGBJTX#mL0e!gFgwI|~~-*pqw=D;q%P>OH&2&mhQfSPztI z^%%NA+Y}iz7*?cSn6Z(Kg^A$?$h)8kj|Qe2^Q0M9>)x0r%?1)>-0cFA+rM4n>vYE1 z&kk5AFf$z8E&)1La=Qcr511{$aBRB-|O{ zpfOEQQU!&%5?F-_m{ez&eMX#dd*19b;u;K-&xkYVGPiG+V9;lnxLtz5fZ@<~3C4yM zjEA;M7%|-3F2P{bz_j`dXs0SGrR*c-))!hWcajQf`MIxVc$%~E3=j|F*36p-!1_<8|6tq|L-+`Ik=|`)=;($OsE&uOv$bbfYz*m)!@BCA_BUG?hOQ|xpj#L_vwzNBB*4W3Qq3U1aC4#z_`nWHhFcRscL$sY zkxU@A5`+YeJE?&s)xZJ_+>EbzPH$Kwpvwg|SP)Et8p0?eY9Kq+7(k|JgA_2n;<-Ih z20FmjF-3*}v=ts>Kzaa&*xIMafQO$!ZUYZLQ*oGW!wtx!Libcg2opTY3}P}eG2EF5 zI^lw0qwbVV_FP5=NiYd23Kc+7jBhjV%w<#r-(;W! zwpbZVf{qf_0E=oeFfnK`FflGwWzuDkV*t$%>odqP7%<2&7&6E)m@vpOo~)EJ1* z0o{mT%KEMO2NQ#73)8}uA508p3}-=<4a2s%jEv_ix6Ng=1u+?H8<@K0GBVgPfJg@r z$=JS>v1=})JHw2*jEo;Gdgd~EF!ao2Wbg!&z6?j^GBWrvOrOih5C~S%zLassT*e5H z2;&;H>2nz)K}?1yFc}Rd6POto(ijfUWn|#vWY`1`LSD$i&byk@3|g zaZo9HP8iBK31YCYGaQ}E2stJnJjOGZk%5!x=3MYR&qU>xE^bh&c-_kgW$jV~F~H3d zkZr7>*a02F*Ca6I8>k@yG7NbXN`zs1)aylH({_LuOw8bf06LG0k&R(R^c?VcN^_J! zGfQpe8CP5WvI1j7*HLvp}K1z`&pZ3Y5+*&_IDQP6~H!5ocj%0EGZMq-o9x zPBffMphN>6mz&WI3lu18mm-J(4wM^nLGz#>rQngd2jD<~a1lduIt&xkZvN6|0Cjwo z!3<`GkG+gw7AwPTD2s_4a90m>3f>3I2ak0J`iPKVLSvP8(9`?YX+Tz*9W558IC*v9Sn2qfhYqv1Bm2hIPpLf zH0N-edFcaDMs|>1#@Rw36IdB~8X0eNtpv4+z=kleF|2UuX#$^(vm>sj33O!6;Rm7& z42PI6TdzFVWW~hDZ~}BH(3u;lpjFqWIj(-#F3HTq@ChWi@kS~G2g8;dsUX|dWG*@a z8bA2N&N!X#6FX?vDaW%Jdj*-87&e1cfJnxrnIJX?!=}uZU4KA*@hvw}8E5i=j9_6n zxRUYBtK*AX1Fsn*xIvBzwp+tdM0;V%Vg@_)d0{ ziVnjj6$Tx~<+2Pq4NS{r8SEKm$ufXW$8!QPd>CfQGS2H^oF(fAVttjJB^$&r19alz z4E9jg8SD(aY)tnRPaHkL463!Jae!Iiu!8=-E%ncBEa8`T15OjU@ z^M#;B8sk^~8_l4>^>3h_BhxbeeY56(in&LPDxgz1o`80gf%XcbsuSDI*g| zH-k3A)fljP!WtbIPEBpl8W4Ftf}8Pyfp*$jHFQ0HGLP&naf$V|w_Ioq>;e<2iN)eg+UJ z044<)AHL>f5aI!o0w7Y1bH-ODQ1SU+|Kd{zMrM|~zd*;VGCffI^2!+GpfYWjs?Z@iG36JN1i) znPEDZIsFnJ3&Z=1e2nd8?=SK(a4_Bl&3>~oOyK~ZoVR)$UIK+88! zYtAF46=-O6%QP;0{MFi$ALpujLZxdF7Pohurci5p7r`7yC4(8g>#_& zbXU%SPB{XRybM>)@iDI9ZrR4i$FO8JJA)v@s`tzcf(=Y+48jaIt}!!+Gi<%a%peIS zK~u_dpa!lyBLjmxXzoj$kpZ$#NQ0Syfn5+Zc(dv~sPG1n?_@z{2{9ZDd~gdipaU|F zL7d@)&Yqimpz)zIk$Z0PF|sqPzs3ye?97hZxdXH=n~7n%GK2*V8VC~{G!P~zXuvFR z&}_NJ%*e{H1!M$TqoVcESy0e4G;@Pa>{-zOeEdcs}lb;FDS4wKng&89^+_F=7i2*nt`ty~(N0Yx2&KhE2wh>;ehlra4__#KJRYgFyUw5VBlxu0G)yk%8w$%Z+(WMXDHd5xK2+ka-(1)$Wz%=AEU$t^xmCY;W(1f1?c@(k>ZcN7&sqLVok z7@0w*VevEEDs%v)p#91YpweSbAEN^!6Ih1nipifRR?JKcORh09{*L2dhBB61V`gDk zbd8y@-E7e{W(EO_;zxveKVQ#HK1L33U@%A^DPV#W;tZe}^4U=r?^uAWo~{gLfHNAH z1(}s4Z2%pj4c@jW$9Pw9$8|1{ zN2hS?xX#7M3{fV}uvX{S6b;aAy;s3&cz?4s>{n%CVraPrS}l3+Dih;VnR{1318Vz~ z8*YHl_M6kk*l+`M-g3h=CQxoX*v+_(mywCt5)@iJ%BR3Rm}k9=AO?856o>)ZEOm+- z(%k}`PXyYsiFKRQM9?L*mY|0B+D(iTXBUAk8D?U<9SELuyRnsV>cK1)2BxQ1nIXfP zpp|)uuEi4Q;=(1IjI0bRLBW8%ckyJiCn%WTnnD<$UB#O{8QB@Y#)6iMGO&PF0I{)x zc0DmbmWv*}!}uWn`>KPM%!~}z?=mt-Fuebh#5jfb`Ku%uhCBa~7??yDCi7l{VC4fJQ*bA~Z-q7!6T`o|piTz^sC9m{9aQOncRe!gjRG|%85kHqX%)Pu z0en3KXp=50JGR|b>nsj%Tg&uCWf2;k{B2m z4sT%G(R>ip0{=Qcje(hA+T1h-MrOwEZH%*eCd)IkGyR>P#`wF1@$dXJ4umD1 zB6kW;n3KjZ|4S?5KmD$S`z^T`85VqLWn|!lP+Sa$9<_j)C-){YG6*t&$p$761=?f` zI>rt(z9S1!%p}GzWj7;uj|pgg98}e?fYL3f1_qyAcPNvA1GHKMGzlUMUL+0KKnF@& zuxSbwHim{c@CeqeOlX+PGJFD`zymr^is4!uWKS!o4+>g50@?)wN3h~e^$P*4kSpWm9#S3%vH*Ly-i-JTWhGoG&oFURKI z0g-qIl3-#y6ZrtdXJ_~U;tPx}Z13$wqw~kdz?5qrDn87Q?LA$L$U1U%k zNHUyZX8e$PhFON;G&2Jm8^gvFXwY#obf?S!tz zZfBUmhO#y=onZ!F;?2m!u+MJ;sKs)InSp_qVGGPODTXa6r$Mco)6Agx$kU*mQ|tYn znldqg>}6&+&CIxF6XR)ShPEkuAC58}=-Oea$IS3!G9LpAL(>${>>r3^1G709X7++w zVa-$c7=+laOy*+{5(J5;GMwq=V^Cu{)6K{D`zYgzwY-`P{hfRax)8E~Y2rL)1_Oo} z9efPNVA6!4VFELQSp(D54n778hL#}41MQ3-0xcOPnK3T!V4PrP%`nl7!4^c=G3=6N zuxHpM&A7RpahJ3s!*wafP3?@=qyiZ3UgTxm-_H2s3r`5czi5U~hJVo@zF-u?{;xbB zb7p?!i3YJ5Vi=eiVg#8PX9_XKG93BJ!w?516ToC5m`nnb$zU=?ux~RHLpsCJuRIJH z3}+NU7M@nj0`s#P8W?|F<^j3p%VnM%hO1wB7;?d6KI5LBybOg5d)xUKc!ikmD=t}3 z2&z-2aex?1ObpXGCS0&!WMXKU0xI$tCUZ==V8O`D&)mD|tbK6Gz(_f6OmrWMTs8Wn^O78};No=$z1>llegV#rE?( zk!0jx*vSSuo?t)UpXH{E91I|>3_?8j6gPvnmrdo^%+JKkc$<-dh2b{%#<=4JCwIFs zGJ)clv40xl(bc>RvJCS&7<-?cXJ%mnM=>kIy>8I`rbpI-Hieu7-3`oeU<>29Efy>c zOkxZSQY;J%GAy8_Gb{|VnOH#Q#N1fUxM3Z*-u|w*VVwmdE7&0Lf!+qppu=Q9ci^#r zYX#-UCOg1w*SDr%n(<8J4rWGn@YU&R2ZdZ%n3-7^*jQN@_!(Fj_(AIyIT((Dj`vu= z$jHP5auWjw%coV0OICvpCwaMwmw`c#aY+Z`_sufgY>Z85kb@i88d(?_*c#aw8F(3Y zh%oSix&*wS8ySTdZU!<4foAW88dw+^gc{f;q=Dwv7IrZHIl;@$#5f_1fvJ({W*`F- z$OxuJHUS2vMh*rBrbaH%&Gw+_VRMFk?Tia1urjeQv;;A*f(Ql|hJ{-gw_JyA&A=S; z+j1RL%`tpe+;SZ>h6y^14BG+VByL{w2f5@$Z!QxHD4#H}f=PxTh9A2aSDcq;W&`CI z4iLc$A{atI%0Ju(Is6}Jx8J{L28JAl1zQ-eTrg(|4##(oNWKHELT2dDEvS!XK8gVXs;Obnom#SG3~ z3=DUcGfv&O%#xFl;WQ%y8^dWv#+DAo(~KMp=NK7JR-R+zWH`sjz{vt48kl~(V`kuN zVfy(FR7#!)O)#8i-b6 z>HIrp(02WI%#3$tG5&bR%+2r%!v6J+nIFu4(Z>j4Gk$-^%)rmI`i&Fg?>@%WZ=CoW zS(dzUVh~_h{l`|~?y2@sn>5=_c6 ze0#^t_@a;T+dF1i#;@;~8DyC*{cT|cSplMD8(9wgZDC}PV>l0@6d0aEjCuZ!S(V`> zMC;3U%&Lsf-!U_&GHv?s7OWLSt2VMs|L_)c-Sl!0rOB`wL}@`NU50ZIgU-EU)(5i} zs-AntYyf87nZSaZ8O#{3z5^HO7d|jDm^HG1D02o7Y0YpM zV%p_*%(e`d-Z6tB?9w}Cb`FL`sjm2qY z{}eMbGrR&Td08B74FbIPfBG8i%G#LK!flsqH1~E)PgejP4 zVEW6)V8sX`8d+XFF=w!5_{+z*pzJT74Fia44Wc=$ zwr0kC>)9C?xfq`Hfmp0;j6Y>z#c)%D!e7w&)gS`2+=`K%;VaLM=S-lc@YZI=9nYCq zSU`?p13QMTf#ok~0oY$Y1_lkrzdWaUL6yf}KG0a+Ur;jzB%uScvHJuI)W+@;EG*zd zdm2IB0WFT>1e*f3>GA{cK@VG-881IzgxZ9#4zve{L5J}#&tE=>91Ca+3Dj=^HHH~X z7#jI!{bgncJCL3EFQ`%k5g>awKx+{=K}KzO%nVwx&%nUQ&b*)Ri!~z$NR+{pVRAF$ z%|nb#OdyTzpcWw`6S4vehP478y+EyH23AlUutH5?V^|}=zyop`7bw6$%}G$R95i4q z#>l`R28vZsbp~2PDGjRAK^#y+otcl}Wizyq4JwyG{$LPe0*QgU*kHaa!^;(n3`{JH z44_*+85kJs8MZew?z`N^4NCe?%o#Yr@yrD#895pL^fBI>)DPNs`Ra)|s7L})ER0`y zx=zlA1ucll#KO?_19a;bh-7dC`2l=aEs7s#;eKa^)dB}*{p1CAGg!e%6|@$Pm5Tv% z=ote8>qM{^mmnw+GjcPm5jfM_%f=1yAe!qyN~j&aw?6YtW8b#E-%^r=;mc<}1~!Io zpFxAtV6uT}*-w7Z@H1#%>cXG=46+QjR*ErRH(vIWUzy>~N-+ja2+4Q{EPQ9Bm=-5U z*qCA0GBL&<6B&0c6SH7Av`mb_lHu?&F$OCJ1_mooA_naZvu0voux4gpu;yT3aA{yV zxJ-<}m63tL4J7XcK0Nr=GBE}=R)$SW884i-W@G|8kb#?FZ`6l(n?TnIf*i~s#ISf7 z#qE+ z1qz@(&!gO~1qzJ349E5|F<#?4wwH;)fZ<8OngxqMU9cZ3#TcIz{8%Z*V90Ps`_|z; zK3-0S&nv|kc)%nth-6$>_IafkKWpbQF$N)qBOsCmOtvuXT_(mL%rIk_7=t9kP7n$5 zA*c-|&#-@)7~_Vr{maA@Kq1D!$_MJme^@C7x*2e#7~>A%4=cqO1R1_-KiRMebRi7L zbT)Cvp?0?Ul>_;Vtl$u3 zkY#wQ{bOb%BQwK3P!Pz0#w7MF6Julp@fmjtgG2)vmMvqPxN|A!X86m?#28o^?j2%g zoS%E|5HrJvRnZr_8UH_5-XE$l2{Iab!cAq;FFRqU*-;8U|@ zKq{F*A`D^-fAUYA&1Yf;r&Ja&369D`YoZvKm>9bFcXhk6vVz6gz$7n(WCW#ecuaOI z6lG!pOE9y5BpAeLWUd55xBig}T%h$eSC~LUqqFrtT?7x}y*K-GF_V#r;pG|dXUWL2xSC`y8}R86qokP-yRS5f)~!MmDe( zey~dLRtydXTBal>M$j!(JB67TWEsAhEdXU|P?^LahkJ7!X!sL69*A#)UE4m*hPjN} zdYUbzS(xAK*JNO2{<2?_fsNrSh-5r}K$8J~=V20_Lx$21wl7=FYs z$TB>8slg!I!1DK{27@Xy1A`{xf>#<0nxGb;76W7>xefyZ1Lz7X6NbI7G#E^o85qnN z9=y_EuwZ6juwrX}tpQ%CY~9en{3C|Jx}kxU0Yri&*m)TCY+zi`H3M`|J~L={!IcA= zpsUWe9c7%-eujyWli}k5O$J6zmNStTnwNpr348%5;AfaSm+{BizY?G!fJI^;7C#5W zl!KZK91Sd>uJ*=*nhacQ&klloH}Q}r10TZ%5ZSN=XlVJ1OtNz zXgFGs@xu|uCucr^`iGzZWYAzZ1sTr19RMDIz6CqUN}J(xJOd+GlOaP(4JbE&$E0y6 zKfc)Hj@^V$?=6Ix7)~q(UFHQM*%@{%Heujm*uU6>ftR6AoI!x0Pn_|dU!S-jhzBYI zKm+ZNiEHqHIBeGhD8dXuiW~j=#Elp_#lh>7tr+$$HetLSxOcIM4Z}{5(VPsg{N~;M z0lHCU-(nNSHQf6an=o**b{4}I0HY!uc8a9Kv$ghiG!xEI*MnU1BDTY$HdTC`~hrQpEzhD{7lfE_g9#ixEZ$e zm@x3LZ0G@DC>F))Ev z2=TChtVi6{XAE*S6KFCH)GuRXVi*+eU429STkyPZ4=n^48Rp#pod&c9L^7_OqRzm< zG#^AVubHCGz{#)*M1tDXoDD1>5pD*M8g8&kZl-lp)EW30K%^MM4nM}`m5e+5BpJ5( zF-SHrfmF*fG`N678(icWmfTQhU;*`$dmhdM-5U}j`^F)@&ViQ)CcK*lzw*AoMo8U7zW#>BvIp^bUEM%SGS795NW z_uD~ZRv?m-;b%KD11ICRc4h`H2GH=-iGxfG!VEh+7$g|FHqHZI3o`b;WnvIw`2B&2L5Stg2ar*{Z znfAP85@7%_znJ#EWs(3f86+B*ZtP_OT~v7VAQNaFZ*SC-kbdl8QlB%9xMc1IRxUdF{~)q;laqnu)~9KWx);)1`gJPLf5-5 zfv)L!zm|uAjTJ=lGk{4JkiiTL=RJ>1I%C1Z$Z+_A6azc!{|i!#uXF!jkm6wIx+ujU zz}Rw8ib0U^-vucKAqEgB%+P;Pia~@CM2a$fy&%OP#yIJs6oVwg)QeIKG7K{>N-=P8 zGi*-ox+ulS0y2cLAq8X&6#0?SWAl^0_? z!n>>qtRG2!%0(&0)4Wr_o)?|ceic-u{=6W?!0@O?e8POj2aEPua5FL7>k(&QWq8{o z&Uk%3=tL>WCD?( zcCzxVkLSTn;@7>5Fy<~rFbmuryww95(!SLL8iiwQ5;(9ahLM5c0+@?fiY~UoBk&x-sYxn9p}m=+mk-Of1aIAiLODL8AO% zKk~CI1K%b8YANFeP-KdMa{uxZj1i2?QevR~K>tL>2$0wzC2s1=(*!35$murfYb#du`%VbGNeZ$KJYK|R|q zJ)qloK;#bLFFoQ6Yz*61F|K&FgOQ1u`3XoB$1{-IIY0v*KYGL&*%(0NPT?P*RL-<{ zDdP!{4J@BPiWC@{7BHRxd6)&{B8KKaVvFhyJy>sH&BXBMw-^I6m}FsS_#?)^&hYQI z7y~Cm(;qPgeulIG0eWs%Am|}g_%JOB*}Qzyy=ga23WNwnABqEeIdr6 z!|*|v@z_Sj55l?(eJ{iqbV2LFKL|7EF?@V3#$W)KHDdT6%wPnP1gSD+n6ihJao!BZ zDSKE=Kx_sxFli1Z9T{Hj7i4g3V4AXrmBA6D2gGm%+v*Atb!T8;@L&KPTL^N#H>mFS zWq@2g7RbQB5CT>k&G7%X7(+DUv^SuO+@`-_Wr%0^`&*15o^k0{W`+a?5Sb2Elg{|E zUyvaS%+6xG(}7~`TDj4gk}Iv5#x z|A;ZLb27B0w0wvLrS2J18KJC=%3ucg)>|kGbadi}Xwb=tf5bpzH`hv@cYR}IV`Tuv z85_f`CLRVpFq@wtl0k?el5tW>B&Y??pv3S$>&+d|fFdYH8Dbdz9A^AHM;3If!W&k` zr6HhjNnrSXm~rPR(8i;sUzr(~gn)u3gW+rZ)1JjlOw0@~`UM%7L1DyrzvyMZAR{xw zulPOxIzV|96mSgL4A0|#d^`+Ndb3TKff*EpjQ5J}v8Ns0u4;Pf568$-dx7m@f)-N3q-z??f9L> zz|OFEH6v8|@iGt#bQt%aG{Akh;KWPX}7_f4_jXJk13Kn8s1EEDrd5R3KP0~rQp zhO-Z37&sU&Jdk1hD0}XK3`Zl=wFfc`oD3Hp$S`n$N$~UwYX(zuB1C z87_mI4JNr*Kx{_P85>L1EMj350*eZR6%_+7!!Hw1oPh?rz=bf4 zdPst-2Zd&=e$LFo%sl6j3N;x*oK$8FYtF zLj%+LDGQlEeZ0L5_X9=0w7X=3`(!ua;pE;d$HhUe`InHX3Zw|)hk`F!K6AOkzY&mV#e z91KhUfX?B2=+X7A$0CA};oC#d+QhAljKA5oGO~lYoL~|(kR#N z+Px3DszaUO7!!jA0|WT}MqS2ZOboh>Oj{Wl^cWgI%c4LB2sAJ=n1OiaAi{#7fthiN zM+37ZLo+k@jsiOd1_nnE#|cC@g9sN8;l}WYiNO=Z@?vOaW?bgh%lqjrniv`1FflYSGJ(lPradzl8JZZInEp*?WN2mtnb-_g(ahKY zmTP8g1k1HBGJKxN$k58j&@qdV@hjKonT((wIRoepHHLn$D8obuHHnd-a~31RWJZRr zS&R(RAiSBNa~D9T_c6={u@-=cg&<-jhya}=$*=~*S_>jJfrxF43?Rqt1hIEAGL|#! zWNZM1`c6j3(Dp&lIXH(xY!5OvFfC$YJQOm6=?Ejk!AFb?B5Vx%{BE>^vKJ`E8F(1J zh5Y*=#>51UYfwL(L4ctpYterf&~e(JV{;#YdYGUyE~h*Ktx4&B#K^$R!f?j@&IHhq ze-G&LX9foDH60)$yB~os-){9>Fp-auffb~Kk%8k(0BWri?*@OF|%qBuGkz;RZ8R_Ez3oXTUoeoPUnFy;Q*cH>IcqH zJj@LH{MP&f9Yg{0B?CLdJ@;)3ni*MG7|-2jWME}jmB+vaatS+#U}j-z$(q^c&B_E0 z6BY;w4seieHZUI?H8=k7GBSXIs%)1?d0>ImmiQAcLa@RLsDO$yQI$ zU=RoV&{9^0$8C%su8XiTfn3JKxGE2H#bO?4DI5bENQjY{@oDCTPi&ypbXy{r!NBkd zEW!jj3UtLz&{E-5dEjzw1LKOFpe_pQnMja0JIDYAHijo{jQ_v!Fhi|a4YdMn@(q~D zUbuAO_g%BmdYKSr|a-8JHMnZ(uy~4|L=n>zPQ91Up26kKt7?18DCk_%J%q+AtQ- z?G`L8Yzz!6EgTHs8x%p?g+LPt41%D51Py3_0s<1;put+u@(ZwIz~gjniJ;JD_>>7c zT$Ta8NF3}0P%Xv^j~5|Opn)n6gmL5;BgL>?cfmepPF7I!oEJL!py+O zc!QaNAC#+vKvJMapcsh9!osl6?*eFb?iKLr+^umFJXx7QN|+e0Ff%ZNSP;)$0UbTa z_%w3?c*|W|B8UbB^a9YHJBGbc7x)-iK&m03e1VUFk%{$8}&_SU_dL%Ra`{c`Pie^B4%kBsVByG8i%Jb*DV|tr@oKE}wWqk(U)*u&{$kP;%j5 z1g(0Wbwd$!ug9DliVS>=8?Goa@H0%lp~xV>01^>on0rH!K?uwi2E~dP!}=?V46LBI zdGeqQl&p0IKz{2ud?- zasy>e#(qO^Mm+{v#1Fp15X{{M9(QMEScx&t{uVa2&%iVv#*}Bc>HZB={~iO~ybH?L z46U9UL>L)ZkAbGzInG4FD@6mwjlK>1j7*?*6zE=@)r<{1Aa~B&0A7-t25mWhJ)raxk0>}p_q#KaKIa80KJbcqVf znaB>1{w8JyhE#^`*^Fz17#Ucazz41)Ninegn#H&Xl&Kj$DnjVKKB&OiUN8f6?(iaz zy$sJ4#28t@O-R)9w0l5@Er>BNWHY=<-T)5v$te(e3Y7k%1mc4;>;`T|CQv(!p^Ral z8{~Kx&{i8pR>s@zppal-05z>nSif2-54x)Z)TWxo$Z#pDuTO=U3Ec8xYG492z*xZ~ z!+J)B6V}i{n@u2v&|D1a_=DR&I~f_zST6&2__m~623>wo4%%r@&cMvj4dXwtFK0N! z$go!D92XN)1Jg86Jl+7cqi--W%$hQZX{zr1HC+~5tjw#XOkx7nlOT$h;fMr-Aj3pC z24N-;!8}opL6i|hfVkqU6Xh7>7~lV%$i%?T!>~~I>@_Y%R*(!c6T=eSj*p-WJy8y{ z9)6?pkqS`7)!)YmVVvt_JW>G~%aa4$>bF~Y$y4xd^;vz4U=}mO&0YwLo8c)7ScrjT zitLi7ptW&FBp4X@C_9c(fMKI@$4BrOVt*ealm)sK0`6vErn$OzPO~wyfPBviA~-+< zg9sybaZ$#(x-%}bVyKs8n6CTrCJPTMDD2okMu1iif+nIs3kL<585jgW4Szu<1_mJ} z1_lvU(EaacSsCOR&ayJF@G{^$VOxM{zAgi3lh)P%(D|5R7!gLWgNhf@vSU^=Z-T2!$R&qa~M}Fzilqd#K6hG%y3AEfra6s5NHkUGGPXm29{qU3@o5~iC7vq zc8D>sfbP^|Y2djI8n$O-02Rml4NM0oXfg;hWHN{_%%7mi*mRO{#sp0XhUpVD86+6b zvVjE7vdJ*an4rnH94sfxuw;TJgKPuS+3o6}6$uOs3JeD(Xfh~*No9tU6EqoA7>`fT zWSn@C@$dvqHHI@2G#S(ym_BV+XHaWk;bZ_!H0m-Oo}kGfz{2n~aKawY(FIpPZU@%| z+k-B6fdY9egl0SwdBKa3o#BcQ0|N`=*T8*;8JU*D`DmdJzoK0HztwM7{`SWCsTq0}J!lz zObtA3q6|z8Jq-#BkT3*Yybv@a1fma2GoFc@5yHgYz}6feC3+ieX3(~M^#-^4Mp zGu#Hv^fR;seOV9Q`?;Zk5z1;*1~ZsJhu(l$pq;ZI26zTzzXT&I!+y|e3e=7JTc>j} zGBE7+WMB|rI3ENWfMI0(%?(P$?WN%JguW}XFtUOg2*RNAMza{17_t~Y$YwFfGW8B%&;<9V7?~Kh2hBOS1T4E1#$r4Z2@+#u2diUHWO%uS@xZ0CIQQRxMoS+Fhqj-WQ<9At5N>>8~#hsRupgehcf+pxVq|TsHkp0^l z7{T-r_*0$8&@$gF)@S8V_{gamm5?T zwrpg4G`pFXjhW%^6%7VXhJRNyz@rwRiUTxYA()kDqP=HJce8<$_pDoDBW{`4}(q_5bJNVg?z+z{&7db>WgeO-T-hbs!@d zH~r^h-~yApjGO=SfwrA}Xya$#1+DB~$j`tJ7UXYa+x5bPfxoe>LE-a8cLouLb+c+1 z#2CJ8bZ1au__&IRK@CJQe(GbqwSZBb;q4932A&5u7#TDf-rQhh&<2a>g4z0DwgCf3 z){x=l4Mqkdu!t#`G-G&o19X1e*IEk@i-D6Dbou3(T{fVR{{6~e2KegBGrMe58= z2cN>ckRP;+=auS$FQ8RDi})EBlo=+do$LhPTFx|G8Nvc@&4)0-d-EYoP!R)WfyBf(}z`{(OVG71_}kx zmA|u;8&-hM_Ge-E(#r^8ax>h6F_{^*D}n{V7Ov?OU}R-j(+NsdjDPuCK<8|Tfy$}| z0nnKhpk@oxTK)@jw}Wo#QoW6XTu_ii}L)Faxz0v(_BrWn^M_eS;Bn#HZ|w zW4ugEETCv$29pe?447gT411%tJZ58L0h_|W#jsd*&BjTfv*#!7=V#oidTu*EBX}QA zb33Tx0wTZ4Hn;OLFiZ@eJ#U?PFe5|5aUljKFv-TybXAfU;>AfU~_AfUs*AfU^@AfU&< zAfV5{AYj12AYjD6AYjbEAYj74AYj43AYjG7AmFg)njquk@IBWA1>6`I1l$=I1iTm+ z1iTqQXFfA92(&YSUD(aUz#z~AB4#pyoimFG?2@@4p?M%;Arsg+psV);Rx<6rCdeSL z1|+@~M63f5>p{c@5Yf)Uz#z~KB6>i?ED$jlM9c#b3qizE5U~bCtOXJ4K*V|wu>nN1 zvw@rgB4&Yzg&<-Lh*%3II2afN)^dSXzujwQWRPV5k#ZoCu_5AKGovCy$1NcScF^!b z%N#Gz^x<(KP&@frc*h)2dxh~#WXBv(Lj@G03nc-a&L^s$m5GDgR!+h{GBLnEB zca)W*9rL-~TOH|IZ7#~h@O~a>?bnBSTnsD>pXYHgursvJ=VIUhlOP*;7&_*2G4M1n zb%CiSQ0tEuEGEFvGoOn=km37$F7WwWGN6-+7=Fy>Vo+lEJ)aAFy}260zxiAY8VvvE zb1`T#fKCGjvDo++-dfGv+z;A105TSO*CvB7!&@s*bq_vXaK<*q2mdudv3O%Sgaule z_~5?=BP-Yv23dyb+dvarps)cgp9LKm!o~o)c@vy^zAHl07J=0pQgj2!TREnBm=gE(S4hcu0du8HUf_L5r{(elRh} zF*N>QVo(CBR|3T@=(fh_8~+0tnZPE2CcCYkzWB<=%)$r?VU|Xwzi;9hSQ&oyWP#4K zd~J1O+fP0g7DkX&EKFzH5(*p)lqWZ(NG<}6GM|4!#JFf(+X z$z^%-~6+KiJ28@66oe&Mo>icm2a6j4b-}v{#XfgQp|!j#tm27xIpc%g>8&` zp5EX9F;})RKDcofeD%sQ2$PW+4kjj6hJ|1sgUhzQ@|Iq( zc_1-{w(sj07v!IxJ=vUU2$b)f6Y*X-NG$k>xT;p#d@W(EVs9fuhWSQ(l@g7b4h z6dS{iy`X8n-mcg^?Tl;Q9Wi5OV))Y;%fQUg-xbUFQ1(D;EOP_XkxtNT=L)a?3wE1v zFfttaY{tOC(DB8Lft}&O7c<6<-W^}exEZc~F=OC`kc`*9m@)Qv{rhaj+rY#Qy3pv0 z8R+nmeSRJ1Zi74wGJ=7HL14<9?Vz>LATA>lgJ=&#_V8yjP^a^?=Yn&$!R_piSuhq4 zh{4FjZ~~-+i($QAN6%6gCMJ+O7??qB0-eJFavC4Q&e@DpzrO*s-Wh+*f-;#IJ}N>4 z!S|NIm}h&T@}N;fupqdx1M&qc!?iDFpaZvl@~bd1fG_7|TFF1VX&a~$_v(ciXyegq zpZ!NBff5TlXvmJ8Vag)GCutLpZZHdBWO%nw5WFsenc?$7K?YWaFCdcn>q0>W9tJSU z2sr=<)Sv=SFmf|62=X#82=X&92+A`s2r4iz2r4l!2=*~CFbIO?+$BL-QHtU1LO}*; zhHtky7^E3jvNIl?&$yCZnhCU`Y$Yq>n~IgJvJ5LBXU@tqtYl@Jy?}8gs|v#^Rt7Z? zp$U=%ZDG*jW?<0bVPMeWV_?vdV_?vdXJF7$WMI(hWny5^0xb+MWLU}0V8{d_ct8Z- z3U&rVSrAJe#L@t!ZA zm|lQLo>w4}4|3#%gDjXQ58e;M=%BF^Bxkf6M4FsA!U0;{cjgF(gY#rY1_##w5I4Y~ zm+2fxejd|p5Ve`<42U|y33sg9ig6<4*xbPXF2kNgdfQsxFpd&#+JqQK~hJP6s`ntf`Z`wje5EC?s0Xp9370A<4 z3^y|7fc?w_N{I}r42G|_Ff*|>Fs)`~U}Lz-#kk4pDi5|pOPE+hSyr(!XuwmR z9>Z!@#ve7SSXsE4Z!BkAAqonu?}{r#8CgMUKs(q#E&nU?_1w=uJ2?Q!^+NF*krnmR1nSU?>Yw1{Py5)PaFm0A!GUK#--_uGcvHWg4hfW&inb!urP8oKzP0{1fTZgGcquI1-sGjpwRhw6G6-Jk00e=U}FW5 z{0v}{)vtb%h)hYM2Yw#j*pe3rz7hK&Td$Q(#qLF9e^7F)}o;J!52Ga0ovrw3Lg5xtT2h z6f1!Y{0(e@4E!x@&I}ArpcTTP)nuHEJA^qIoEbW%Fut7S%figC@GJ)d3&Zcj91N@s zH#ori`50Un`uTo-*bS<=878rSSiGFf*UoS-@G>->{dp78VAOk*r{n z4QvTJn9az-ur2P)GZ)atidWMJ?D6+zIl(;K7QVem#2Hs06@ z8wPKr0>&Frz<6UXV7!qE7;oGKj1R-Q+>UtAIn3;gALcWzU}p$m*s+vx$!&L5CWaMf zL3v_lIs+>Mh+x^7&cMdHE*;dCeXxLW&Q>KxCUA|(z|L^E>fHuG7ABB7W`-T<3~bCh z(;3)V??o{%1Tx&Hdj4ku2MY(|qL1thoXjiFaxic)gV?;x9WkISU>B=iJvq$A#lbuu zq<~?;M|K7QhJ_#58H5BuBF zNFx(yyCoA7<7d%^E_)^h7LXVNxbk9Rf?ty(!0=}QdNZm5HHex;g_h^Q7sZU2Bu4t26L3PMogJc*Jtz zbaj5FNo&;^SXmi*W427a25P>86fkfwEXX=@XAYiMWGy_W` z%clv_ptB5Cn=)`Pe4HT7zzHUK7!G8B7Qakc#kgemRW?RuuG_0k85o(l&qQ9iy9%_N z0>o!vXPCB%@yU(vtW3;cZOmLCBS1%YM&7wNkA;~DA_^v189-Js@G$J0%-FC9KHTM9a^g$2R}Eu?DXcm@^+opQqPVloc{YXcKV zmbHQ9>0}`k^%?8otul9nAsUXeD($=kk#xBEFiTE>LTgGmvv z2oopMeZ?DZE;50JD5i0MS>PiP!6q_+)qpP;0P~q4d{NeWig!M*01smImcw|oPsVrH1IiV?yDITplXWCe!@0}I1x>4V2+@vuVpY+z9iMo`Fb zfk|$#2onp_eZ?1WXM$N^XM)XQ0;>T#6U=9Z@OfD8DRw~hOyvNvn3x$4&edXIVE~Z~ z?3}MbBd1JE43kzdf|ox{0Mj5hGBAP@G1z?!tY9{H83YHY=HLPm;Oq%@7kKDo8V7i( z<8%%N&@>kV=y=k}po82&S%CrM60oYN91Kj%Al=|&s~Fftp37b6TFB1K&TtBxMnEJd zIFOk*m}YNaJOg$noyfb@fgq!9z)4d7at0X+N+ zTD2+y?o%@`K(B^kU;tg}2-?e_3`%FJ;JpleD?=F@{QFjhYB4On8VXu5I6rO4LGban zAPX6I8P4TGmi&NvKA^gVk)7e6A3_M^346DkIJ#PaCQ}0wp2$Pke55i<*V)%9(bj}0A zM&%3hFM*qL{e6ru=DA)l6ExOz+=PLFlVR&o#;-lypdC#=z)tEvX2Q5r21K$jtmV6Q z>@VoL$FIjtU~QD|$4wYG89*c>6T_BFWh9yz`(?^VkTqD`_rHfD@XwY6JyV6#;LcDaWS$o zpWb8(%6m`x8SibfWn^LikvoL%ZL(!xW!qu4X7x4DeI55V*@6oA6*Cz(Ja_=wSbG;_ zE*q#zaDS66BO3#V+$juFcC+2@$3(_sEw?~P?OwYd0}}(7Y+zc@;m5$t@VDKMfrVjX zFB9W6;f=jaYz)&n{2167=501);AWW9;m5$;z!bs2!w|uET_%E$VP}UQ=Y8$;S-oIwb&cv{%QH_BaOtLd{w#74WGi;s7$avOk z>r6%-hRz!-44`61g5h{uJm_fdWBxxUzXMI!A8k})JlVi_v{8+LozZ9Sqi;f>qHDeE zjVpISCtodj8_U4Lu>5T-11rPQx3QqLEoXwB_ReHy;$~R?HkN^hWzu@k{37F-$OT)! zgLWaW0IA|+`0PDp;vXgkMoxxz-Hc!+6BEOF*~hyCnVFb>?E@W={Cgkhln4e;bM9~8 z#%r%Yw+=wcOz@#0AQ4b;^S+xA%!C|u0%n3XJ}N_4EDX3ON^=BV5BP+w7ec(Mv1P(yiI{i6lzxmWH5};~#c>}o72CAMI;PZ$43_iP?1Rx>y zBN_Jz65h%)|f^0xx0#1>4(3M#h^# zAd-n;XV8{*76wKJ#xs#y+Cf%;RKlzfX7IV*4~^!>?H~)@HGnL5-+<)kFYTPn+zcNY z7#ZM>{s;;I&|$|1nn6Z_NiK%# z|D_pt7;gNRW?1Bj4!OLhMOwckKFbkX}{!dn8WM%k2Sq;<|{|oJaGcqtBorbfP|M};g?2HT$Re}tw zcYy*7)C&V0ya=0NhMW?BnnDOvk0c&}&CM{e4O}UKEtw8k1o08P=m9*~02bbcu>%3+ zmOoHmi-CdRz>n#Se;iM*+-l0q!LaYgbkKIY{UC~q0ZcKmGW>O1@a&#AsP*+7%wl9= z*b7p@z|PR;^k>O@K1OYbPKHLMje1Ren@xF{7&?_0m>Ig17E$Ly25BD9RVg4AHwVM*WsLhygUawOCB_f3T}lj`pux;_YdIL180KzbWZWSg z92uMSXRdPOV_3S%kwJj*@LEO&0g#WU{IF*bW&ruEMSsF3MrJOMS9a_X2A!S1iIMSx zEGPs77<+3Tw=DoU6Qq%;feEAy?99VAZh@S6eJRM9V3Hjq#~=t=kh$nE$VHPjF*1Ia zodgOp#`{|tmz)MKTfMOy!U8RjSaO;bR7ip*nWZ^;K$k{>QalsGyBttC%fP@O&3kVv zHI_~6m1F?#{s1?7I6;j864SXf-?L?)*)CA`sAbAZ)&o9!<}5JfU}f0-Zv`s@2g4@N zo{~+hjI+}=v5JFu;@~4cKrPm{KUc6a$TT!CZenF%;b2&owjhj=38aL9gK>w~qa93K zEDW1i8Fz$iVr2sfgAL;YvG^L8Zm}>3ftW&I<2JE^uhW(QRqE_a3<49hAtr%l$4`ht z*bHn8Jz*2HK>;`=Y=Slu*fAl6k^!!4Yx&-VTU(3bAy&@Fft)FXG$}?gP6;TWUe^FlX#e886+4!t1y77 zlea1$SAr|0%aD7K85kHgPE7e%@NnZyQzk}+-4jz7m>7;tOaZAo#s8>xwjiq{Ge}gD zW%&VgUD!LA^5Y(a0tNcJW&9gBuF~D31G6Xb6 z$nZD+4;#qpPX0SAAi9hH3^OY$18D2M5CboR5Cbox5V#);b|fgc7=##@S-^(NE?{C} zVu5ls7#_o8;H#_57nsBSyXH!tl8Xp$4JjYeAIAF)$@| z7)(jbGG!2IkeUu6Wx!-ZgTm>f%nZT|(@hyfK!hm6Oj8CihD(pw8N|V)1ela$*matd zL5kt$2TlfQhJ8Ev7-YbtESQvISlqzRAkVO}fuDhsi{Uv>!^})ZX0SgPcu=|W3>zjh z_B7fsGJ*9l$TOnxnb7#m8zwU@0IOfoz|X)S&$3}M;}S3*WE+D#D;l2-m4EV|KwH4| zT^~&(m>5p}6JTIw1(BQ#$Nvd{Zkqikz`(aG3lPcl=Ys-+bR(FOVE}PJS0l+Xf;!W$uJAFaGJr@mhKpx-7~29a zp5f7A*!fR@aenU3e*!uTd;SS9uraef%Dwq~0TUxH$aRd@_&~1XX4pD`aov<=PF5y{ zBmV>#SitUL0lSNFmeBEk0;~*MK)M+=`~xSlyUdS&gfJW{K7(jbUrgbne2r`2Bf=o+~@-hfEvVbTdhW%&x8AKYuVqy%FI+z&5 zL3dLzf=W>kPYx`m2qGEh=T7QiVgZHb!;?acydcvVuknG*JgoPVBrZ^FXJ@cv8)12e;`Ga-y; z3SONFVPUv(CWP^s?UgejYz*^Gg@B5)11^i7p9T%?GCbr0u^8DH-=7I#oK*=T*%ZiID|t6ay8LuK#Cap_qH&8jA>Z^#Dtp> z%wb?`I)MN|8P8Q8&WE-=XhCWS!i z8H5=B?iFSbVrtwc%m5mi6a$NjF@pGF%pg)6B*M5Vt#O~Q1c=EX$*^s&FoP7svc19# z(hSS@3WMsQy}}GEq6|lpFMpT^+MWl}$O2Z)$jY!UYV(Hm;FGrZMm7BKWn^J!*e49? zzCYvHydx1bBD7DKffcNpn?Z?zhe3&fnU~?&Dp0EnlKRg~VFV=^1_lOR#^-QxCWfal zHUlpc=sF=#SDHbFVRGodWt+e|d3S?ZEL>n`@-kfc#0T2J&cL9{ux_s~1EVg(`_TTb zMeOXX4D0s_gXZ%3W(hEGFkJe?2kp{b{=~;10@BC0lIO}NK2XkJVrF<{zT>MeBNNyV z23Cf@p|fW%0=xDPn8nBjHjasz;a}*UufB}TOd!)4IGHvoZ+HQ|*|EQm5z0E(3t}-c zG4#w50L^)?mtXPlC8*)DbFVN1gFNHv#Fock{%H_@Vi)_7)r{{RZ88aFWa#Z;2Ti1P zfo|8H*u~Dk1{Pt5kPS?Gt}rohF!gn@GjKA3lyWnG*gRm87fkXofV2rQ^mnl{2!q*T zV76ET(=t54=i`+oWu8MqlHFfwQ}K3>D9J(ZC`i(xA01fDBQ3^N!RK;b-t zv4LrsEW>OtkMRiD#5s%%yRR@Y%!N?%z!c->wT!#3Fo6%)S-=Q#DMWGy4x21bUhf0-FJfYmZFY-D5z06EWZ2WW#0`1GCKppMC25U~$L z9Aaenf02zrRgB?uJL8cRpbMQrk<1{?(5|`%%mu|ZgCaw_DyW$VUhLkkdIl^5ia7>- z1{AIp!<@B@6E1>oR-4qt&cI;B_-75{yl&9d-?KVFDNlrf!J6U5TE;1Jj)9Ub$P7j% zh6QUGk<4^t>|Mur9%C~Yx#F}zyGIN_23 zGZQ$iv4Tl8YvcLW{{<9tRRvfEX5D1&cj#_2z|K2!_36|Je7f&;dv?p3+wY#2C(gOri0Ft zc%I6@5C*b*&UEk?`KbwvAPHtBumtyhJ`j%sq>~{`_=Vu^)u0(Uu$;(2p_Qw-SeTig zrZTXxK22rdX8;kPeW4Kyr&co_nKy-no0Xxlm6d@VOmZ;nI?cks#cL`X4gb!L!eXy#>*VQA)M{I`zrFf%(V!}m3eJ$r0G0rP7ih{ebZHjROc zVbxm3S6jkaSQ!4aurjbRoSDS}x-{K}fsOH`H3Jh1L%ZsS$s(Y=mMyHH&A08U8(s-8 zGJ(}G@PMNB!8;*FCa_Z&L>bPlVO)5Hhn0nSk23=c%Qw&+7=OhW*cg6-4t)G3#=ykJ zuwVH}G^oQhr;qUosK@(L3{+{JU&DBII%u@!Blrx?WfDgpFf*|+d=z6~V+IMaF|Fe{ z0=j78qZk8&IK#d5j1OjmE@$8444O52wvMswI12|8!y_FAHf9jP0%~>1Fo4G4IKjil zpmB2s(1F`8moj#223H2BCV*Is%uJ7TKxOEwb&NMo6)-b_%P&?i$qptN;y~fI;I1b$ z{1)8xWMl@HWejnQyVo%O{%p;}1m=Sl`ZJ_3Oj^Tu>NXoQGs8a6UWa{346F=`l^7VZ zK&kuA9!(||h7V_1z}LVslrU^r!+7v%0xJ`^6aM?LIEYo8UVOXXII?igTo(RkKD@+U` zEi6q_KsV5Ulu0vyNEwFLsths>Ok0^5G#IW;Wo7^!Ij_aQ%An1_!=S@>YAQ2>9>cDw z%nbTq(g;kNFfcHfG%$gLEg6IvtQZeZWoEEt*f5ou@y%Ms4O5vN7_LucW^iO+WpDw$3<(SkQ3EezHMV-C}se$iyN4Be`RDSVc7MRk)f1f{#QnZItU3W>hH@k)HO6T zIP7y|sAmua1+XBf4mxm!iSguW#$8vKS{NA)Tw!8pV`MmZg^8hqk)dTfh+<@5=wM`G zVCVvs@4XPwX^fz=b{H8xZ3EXZe2i~aGxE)c@E5=+PLS*ZMjjBgh>>xhEW;v379oa3 zjEzh}42wY~tbx>eYZ<{_TnC{xK&XunY7@9lW7q~!xgADj4!T&#wJ0ji@}JYUG)N(yJadfXtQa%Dw3=fzb~!93}%K`AO<7Ee1-^y6RR1&J?3X;WBNB4w4IuP z0aT)MgBPel<}~?0l_w{|t_9$d23!KcD|Bu|-5$^IYYpRq9vvnYa9U?&xH^#;)RO+W zhVjpNP-uX107Du>r|ONxpix9ngM}drWc~ELjBIR7uT{at1Q%#s0uQM9%>Y_o2wGl( z-Rc5{FY6d5OqK=RGPsS2fuRt@pMl`lgZSX(zbCHXY6`TdZGyWoskg^W@k;mWx#J8p(it$Wj3L~h=!hqwR z?G8ppcp&yNGR$7fIAe+|$WBmlm;&+?C_^&zF*0I$*`j1a6lzH85?w0&0qZ8sMPN-nD?S1!Orl1L(lY z^XnMT^s6v2fl5clZR;3Ywlgs^Tv^A&*tm}I$~q>7nT!kz<}>ctA*DyZV_W?AX2}`hbAl!WSQ*4PSs6elh|B{; zGZQbvOKb4rv{%-k#tC?U<>fj?T~KeI0aPnDg2s~=co|o$WjxRu%FMw4at;UBQJhR5 zHX|n!sQC%W1fb^UMJ`bD6LhZ-KSTE##v8i|L2E9yf)3Pb*b3Sd#;|lf#rC34&#l2L%+#X80-7eSX8 zZ3S7jfRW+ldd3r1nK)R$T^|-kHU?1NlY@bgampG-Mh-?s#CYNV_foDo{Bj`3~P^%KuSOYI~ zd$<;+ON3$4Iz}%>Rt6?eadQo%7Bq(nYLJ7@p<-ZVoS)>x1R5jf1MSn>2lh31hn4O%XP%4D!NLFpbeaIw<-_U|<&N}y2*kk3H!;AOvz3=9IGE%YF73xMhb z0nmH{X#N=Fc~C+S0UZ|wk`@8Uh%|s!kb%ZUL5JQdLTXCTdNB=#w^z*>G?*SNE@RMW zfKW{ks-c1L?9a7~44MoeNo}w~9R@}Q9VSKw9ndw*I!$0!10xfIE(0TjK3D~tAj6Ml z&{dYOk_6-p(CwKF;QOZ-MDa_DGwfQ$$iNDkJ_qG4P|63Tfk==kEQr1HY7D2E8Tr^i zVGXK9K}td42}uT^1ft3Cvzc+v!HJ;jsz5$u20M-gOoA`-+;aUM=oS-@9D^=MG168# zkYz|t?mK0>e-7jOtE)^nc^S@~wq@XDJafhtKE^4@3|a0DTAvlcFhi0dqM?E3&jwot zK30bIRg7JyY(cU4T%qffEh8%fhzmNxejej*8&E!8CidHgjg^57Jck2{JXuhqQ-R?S zGlL?-VP?>dhh<`rP4u8KYtXsH47`kcqt7U=Zz zGqwzD3~eiI!NYR03=>Y-GAJOVFzCc7Q2z#e#SeyWJsH|oG2S^0a}$Wg$ja~?5#re7OC z5d@mF01cG?-T;ao5UI!jNp7b-`=n4XL>brs%cL+m7zpP?x-8zez zjfvrAR}cd;14sv`fB+3uurx5Sg3eC^t;c4&6}|LJvjB9@X+wj;?XDnD#Pm#LJoR!T zKgd7lgkh|cU=|BILt9r6shPk>fpz3Bw;nKtm>1o0$6mCTEN##x{>8nYM~cM4BsWa#RB z%J@L#=9%}#%!~|8eNRCl-`e+-k@2Alh+<~g@&|N~%BB73zm76C&3|Xi#>nt-UpfN| zm}F=8_)VDc_ff_zpM*IXo^*&X@GvaNVBlrA&?Uma(7y2j>xO^{yB-@eGBHfp_yCl7 zu2>)Gyk*P;8Z~2PSh)gx&ERQ{TWjx%gBuyF3^P|`f_CGq$OKi3YcfIC53({&=K~G> zoZ?tA>i|C!6Icy1!{#+Ej7u{&uW^yiKhGN3f}h7-i%Vr97eN11^Wte6MP=3%_^T$zEN z`T8Ga27b01f0P-2+1>b~EWq&bk1}|!S(xF?A7ut%#w{l~8JKt&ZyNtNd=a!-?#6Rv z#*4Byo`d9On_OM6jT5xZ?vgBs#l*_6>m(-wJJZgSoQ!u_cAn&9VP$wOcjN01MrL-f z6bG2(1e465gJ_>DRbymf*m;tZfdR5m|FjR}+}JaxeHhsx65wUuFP5q?GK2Lours{b z!#M9?2Qz3sY0@gj7faPZ>2Cs*1=@B1QVnqo189~0w%L!E*tnQMj^hQJ!4D<{7(pV! zU{VAu0$#L#0ptc&hG`rZPWynYn9cz*jtQ&)yg35Ig}Mc_fPc?oHBgghD#xD1YK+W` z?@w?tFt9V8l1B0yJM-&3j2~t`Vgi{rX%*uIxRb#wkdrSg1uZ-S1vhxJ#DXuonOIpF zKzueZ$pMZEE-=Xr76GsJUjTC~hymWp0WydQtN`p-5SJOk1+DzY=GdA4xx1Zvw>KF} zFf#mF1RB!oS_~S~oBf}gal>xL+5fpY7#98KX5a>qj29Fa{paRknDn2UL5$(zKW@hF zau@$`OEBF3$IbX;8sq(c+>#7O{&6!XGaUHG&7jM0^1V2NKA1FM*!P==@Sn<7TjDSo)8f!2wKqgGnETwg0#oLcp?#U^0ne=Ra}C4@0(_jo{}(KrJuLh0F*0!Wur-2xrvO>r2pV#=WDsP?V-R7;XPhOJFUIia zI2+@`(m%)9K+{jE3}y_ftmce+WX!b~u5Dvw&;^lEu3%;WahMyx92Qm(hou$FVc_K6&$s2G4-*Gi2?s<81E=s~ zmIu8*89|$*Cdh(VObiU${&O=hG%%f-%Fe*RDRNM#r)dKd2Q%};|J)4B%}o2IvNN!; zf?|oS70lrWM;SlZ%lr)xp%x~P&l&g``f@<)7{EQ$Pubvt>xW_{BP&BD1A`z#Yt9bv zsQ12kj5|Qfg!32}EErmIPTT@5VFK-;IdMyrk(uGrHdfHqm;Q;22Y!LqlO0k9Gr+qI z4*b$*WMaJVkDGx(gW-hXnu&iwEgyzcaMp1+s~^f@W;mt@QOC^irPp8+Dykj?N5ydi*rf#LSQq$5)pw>=wos`&TlvGBEv+XJCL0CV{rrfHsjpR>yu=xDcGMzAJ)QjI0cMR)DfN)842D^^7bG zAdL*z2bCWD1Mj?jYYJg7o{4<$kA;yPqD2ks5DE)JkI39plR-mMkl+anQoXB#poEQUx zXoCcZkOEDvEZob%Aj1H%#sqA!DVS{uCLI_S%w=J4VgMQH3?{w6q&JuhWLP$rg&_z` zhA}Lk%ffgwWBFW`aIj4Z!<7}CnVhFU`=%$Z&SK7HIf?9w;INSkFZ6xDUDt5)|kRG7MKUzPzhr zWCsTVg9$?$--3S7MdM&u2ZrgHt8Ztrvw$7S##9?9hJEx3+m0|kaG6n{QWm>C_J~m=xU|9BLG8Y5G@!y9T+jcPaKRIN? z#=x-TH)yT^)DMMaVx_}iAw)i&@wOjy9R|a9MG%XTm0=lJ0d<$V&%MDvTX4m^Lq;4- z4DC1g8Q2;A&*x|0Vc0p3pMeLIR_Yn}SWeI5XAoeR!UUQjo5Rl_&2Y~ev>UFCW&WS9 zV%$6ox32Ru@UYCk0n)-$z`)bORKOs>@L>TzgDk@?a|T(EIVTwzlj(t7!=YM6CT5Uo@F@ok5A7J4nLu0yE{2a27%%LtWn==olYyV% zUCo8|?Vy3zcMJGIE6A?b{OAPnnLsXP5M(%4bD)!vnTa8VfsHu@yug};iJ^BQ;}2y} z^>AJoLZ1@;q0Gk0kix*un8Lsgaybt}3Ih*Q3b?RgVq)l<$T$I95bsw8(cqI&Cx8Z! zQ$Q`*)5;HoKo#ZkKE?+^jG$D>$ieWWmk}h&&TyC=L^CiSXMZ5X$iS2WIm|bO5o8|& z1LJ)}O+1nR4d}X{6wqw&tC}UeOdxlII&aKO4A*Nma56G6rGOSCU9ACS2^RR(Cd>@i z&_p;HZqOo|26^y9FC&P-%&A~z$hMc%@{!;_JL z;Ra|BfZ=A%f(1W#nYb7l7JyPEh-Btscw2Mj!BbH40mNrwW>_rv~A#CaL+)ig9zfr91K1jdGjD$u#YAS>iBW-b`y zxWH!&f!a@ULeF8xS;+}wtyg(K32x=ay{sUk&kMs?r@$;Wh_~1o|IO!zCB40%Y|FH7 zK0gC5Lp`Xe&^M9s2iV07`<1~Aa02}CAGCHBqz`lefb!c9Z^5e;m-jJ(n2ekZO^l#1 z(I>r(x1WQgKuHn80wqQei;;op(mZ}hME;x4&&bLEHVu?0e}L8vfG+%En#e!*=t58` z1Sw?@V7OVcZs}_-CN73Iph?ayCeRrUZ)+Yrf5pYf%&=n~Kj>0`#e%=)faByM$oK}P zyYu)NSQz%q1I<8ena2<6jsC7__zH@X3-kCvd)OBV-rIDEg@u`6HAKf@u#O{O9dAJ6 zd5)M#e0H@Y_HFE?(p$uAnBFM zx6O!~iQ(n~JqA{W+aQwh|6W}NHZYr$p<$mc0~f>VhXM>dj382gL71`EM_8EQ_g-Db zEr!4M>WVPlO=1uMZB3cGPZxA@g}{Z@PoU|fTMP6+_KCh|+6gL!KwJhk#-%~;m!1a= zNPui%WMcRl_sEF`kJ8u|T_|_v(UX5Vi#U0jmM+ zOarkP*%?44FmN-pT7oh%Qx9ZM(=+IvrUl>wUYQsUVC-q?0_9E6apCZ0|29~;!wWJD z!enJw&(KFu@LhFhLFgv%n4jjbngvJyy#>$`~0K z&g@qN?b5`woQsi)(YETO;TFSv8`l`IFfyz@X~+PY=HX~$5@g_H5CJX3-ex$pWg-U? z6T_O5h78OMYfl=2O7J!-@b-@NvXI#bP+9~H%rP)AZV7~Jp*cg@vf+eVNyAKD$-#}0)2bmcLjp>5SW@2~`x*!m;j};V83^clsl8piD zW>sc}ordc_{sirK={#u&nqccUe80H`oKTM`!dQQL8DY$A2F*7qU&p&C%z{0Tjq#<}Z z0~|+lX8vSkW?{I0%#Z;dQQ*4<4+j01bqqB80V+gh9b;r-XSjFF5Hh070P3nP4_p8$ zZWtK*4Z#f1-~p8JrR0IiueJ}wutT_SP14kJ)n6L>vYQO_(uKW#L2?hVt}_HgBajV$RGx23-UT}Q{}k= zBjh#-2F7lI3`WqZH%11Ab^#txA=V%O>PUhX<}hvNcVz_CA)sX0zzDi*8tjJeiXf&q zNM^g?>BfU1;PXnE7#R8ue>5Bv0cH4OiZIrnUPc&m8-lqKA`cFR`Nu#JIsX_a;uzoZ zgYp}wc43;&e{oko$m|=ZrhuHoIGV>m!2s&tZ-><}IPw@P!w$nenT((|88})RG9i%y zq5t$ULKxd%jFpNFnUL1X1tvyTh6|wZM;*%AkjBWsumDt~jYb0~mw@UjCPLA`#<10J z7pT3*4Jqb+gD;OerU;?`^fE#i+hB~9AQ^C;P-J9f08RL#M#3%74GLi4(X2phR^VU( z?Kc4(`hZb0^FrD#j7$vRwk^19!)#n|u(i$s&4Dv9{F()#LFYw-hbQ~MjY4LIv*1P| z=$L45MT>OW|4&#pWnfwfW3D@NgQdso#e?NWJd6xWZ#gnBG3>kL$iU37|CS@;cDenx z9GM%~Y8jXt8WA$VIWjPOc`Cftc zF`VPRFnJN^Ams_yc^J=gpV4AxXjsDo8W`*n+dr#;hl!o>%~D~|lJsw)pp_KQ#DC14 z&&0|ER>jo7v{Q$Hnc)u;<8$#c9){EBI2rgD?w;Xf+)#PzG$$huL(eM41#1jJ7Qawf zum)7gbgbq9HUHbiCVfB2!py<&`kN>NC&T5V>jIV3L#Z(wPv( z-3LJwH^ZefA)tdBBIEKCenGj}Yz z09peEmStdJSXlyf3me0JupB6e?}Ay3P@@^RL8`!=0gy8pnHa8v=XOBF=Iai|E1exi zoJ#B%)rU8V~Q{XFT?S*+zh;+w(#Yr>|lliXpxK(g8;)3MurFfnB^E4 zSU4E=`OR1|6OjJuxQC{ zJ_c?un}^}_Iz9$IFk1*rN-)=sP^ts<1wjkaKr@dL3=9mCpraW; z7&J004H_qw1|6~tT0O-i$nc1nftimPdK#S^NEyRy6L6pCxjq9EXek(I+>4QqVS)ju zzXWbNUy=naz+(XQsz3`@(NAJy0nO7x6@%yKK_xWyL)o|)7O;R$`2o#*f+p#~7Ss3q zJkZ2D)Un`6cS25}@=<#346{vcEWZxEE%dqm$195&8Nh)JVllEXoP5g8xRm|mQ_ynF zOR~=|ZRTKNWw`m2oq?U{-cxqQyDWE}vV+%5>}l)-oh}MWfE=Ji$G{0z#te>t18eOd zizE)LwPR!lOGC~wd@xO(kr~1VMa7A=c8m~xkTnw>5AMMhAbgl64{D1}Sj7ltffgWq zm?qE2%5di?JE%u-Mta7{{h&1yAU-cxlpjnAFoHyc!K4US1hQu0NGzx{n#OVANGzz6 zH=P4y91~apcp1WjwRVim5H4uV#F?q`AoWu@&Pamx)Q=wU?BrQt80#XK#R`gc@EF61$-)dAEFc{`OpifjEU5R)#4t^H?&BNaQO*y& zj1VShFdEDPH%LEB7G`7x+lOO7dhPk6ps~!mlZ6==9&U?%u!8aV&;N$ZObidUMT5@A z*%r;f#qe}nG$@W{u4KIS?>`@iIcFu~l-qAX)hkGjfr;_U3dTc=C-E>bF+AHA&A`e6 zA{jUsmezONcq_)r#`t<$Gy`}Jgsl;L(+>yOP>9hC?+&Q7_@CbX)R2pj;rjtK1|~4c z!ub1u8UriCzXNIv>m+XFJ}aCK~?W}MG%XT6>JiNG{eIaj5Fph z2Zbrf5Jo132PYWMoSzJG7D#}B8&n5uKL~O>i2N!G@-Q#M3%{>>Uh}fBGOPtV2;>Y< zmB7ic?VuV1Gbh9Lpes#&X5eD@960y*0q~e7cxVMY91AM78McDP zyFjOQF))G*W#DG`7r6IPKWH2cbYCi1O;^yCNBy9&XNK(!j4HdSDl}!5&f{)PZ7SI6S;0PYs01XX+#?=@a1VBtiNGJO2f|sD)*(R`t z-39Yo9~mxUWMueq9<)CSL`s0!(qK{+Oe%s&O@?3R85uMg!6XxyY-9mZIt*XtGlLdc zgD6Xe-{%<_EE|~qoM&XPWB7NTk--s6Izh+=CXkRbDE+xJTs_ao;NHM=_dFwm7sG-J zjEpDi@1AG$1~cd9F1Wzx%dqeQBSQ#?Wc+@dap48VaE8Sf7#UK*bJ;5{FfwE@GB9K@ zT|X?$kk!Znp&A+#Kr-13AZ{)Lh@IQO1fpueoCZcP)eNCJz!c-&f)y7SyTEMF)@P9F z35<*os*z>pVgZJUj0_-Z0cdO50!HSQ7Z@3v8W~q!U|ht=u<`;UXs1;$N` z3|p=;GHhpL*mRYVVK*Z)h}r|;?O|+S+HjSTVJ{;C8^eA^hP7828Mn=0Tzi%AFeAhI ztBeeX8JX5!Wn^61%eWpS#thWn?&em672hBO`=rWSQS8!f=U^;mlP=hD(f$ z5MBe*wCijPHy9aOTSXXdfO=FQlI7PmHip}b48Ort0~3gTz{v3P8XLm{#s;Pz*Vq`I zL%1&?#=m52WC2;z#RRgHarq{YrQKi-Ll1SPP-nfhop^if6Af zZeRkt?;vP^) zRP+ZE!_@0+48I^IG%ZH333R zgiuqN8D3mvWSGXxur(9#)j>O&tl03l7F!dVfh@q+17!N_%KW8ycy~cPH!ug~)^%~) zW)miXh-n~V28fu&0(PdD1jBvi2Y=NV`N8E9g9^jmf|)Z~8QHkOd;u^i2qs0rq$HRG ztxIPTVSSW)rB9TR7bL`ZjSp1dNiw{1o_J50nFTDiEa%I4MplNO=NUm$a|{f&tdDZf z^n-N#InT&=jSp0=IWoL+ZU^i5cb<`PSGG63c zbb*nJdC>(%28LLWzU5lXETBS+aaqpd3yiGbvIwlNfsx@p^MZqHjQn6RQ0cKZ>daL( zMiz$6S3#TW85xfo9%%rt`R<1>K;!OU5%8KlC~I3UBb2pL5ySvj6I-r=hQC3D5(8+# z-ifQAVKq>x#K3@Ou7wqK9%1EOzCN6r|C7<&G31J2;OpG%+*J-oS`WrkNRJ&JCEJ8(=-t zuCp;Pw18!>=~)AoS+Ef_pv8J7a=}JkMs`pxVqnHYbRf0 zWME)soUS})4|w_V$6iJ-3w(4Vm<75f0>l7^7AQBeLQG>oy|udI8R+`69*}Xnz%D@b z{WoT|PpiOF6AYlF&Nyi`R3RR#{wz{*WV1}=twOpGnU|Csn0zJ2Xv zWME-qy06$Xuag<96u zFW?4^)a^F>@nRwm3ll^8H&q5!hDl#l8CaRX>?S4!T`z1~Z6cAg$i~QU zXLm3I6PRRW>}|ARU}XY@)uo@-j5oM1{j}y}e03xkbX4H!pbziPg0@65o{0pp7}>#^ z7+4ve6t1`%%fQIO^j&eq-B{4=XWPXY7+4t}7H<6cQGkt&VbykV22Oqk22KIc@@obL zUS^O*ysRLSm6_o};Dueg8JU=vLF!n*szK+Q1%gdwVmKKDW`LGHfQ)B{DBzU5zz%94 zvz%o|AH{wO8@gs-nhs-fGh7b5-oFsM5#muGs1pJn?syUiN)4c$(2Q5=7(na8Kn|Z< z3R21n+Xo36TLNA7BhIjTTQF!3M|&wam&1=U=4E|VxTWO-DCvQ`#K6k53ewm>3wu z*g*4~kYOwthU0zO46+PYF0(QyFznt1YJaja%-Y7-uyPF}wnOJZ;vipsR|K&bSs4~| zX@mL@@SSzoRtrnrrSt$&c811+o=Z1CCx|TqS;)?MCi2FOsi2fQZJR1+puE!-)Qbi! zUIUNNJzEAUa6#Q0d4``h@0b5!Vq#)^(WA}4#QJ%+D&xZZ`5X)v&%I-O=P-B1TtjwN zhD+z(fsWk$-8Kib=;#-S;$^sSiiL5x(}hzkd<HZYz8sbykgc;>LB zW1|EkGs7p4azX#$-wSO9Dw!__G!57Z}oY&PU(WjHp) zgn^CW`Vl%y^`HUg#aEAX>NSs1!CfAoUo_JQPB7<)7)^qmF;Btrw3#mK~P z1SG@Fct-=gv5f&#euK6_g8Q=k*oALTv3{!8`rw-Z7ZbzXDb@@eV3MEZ++QmOe%Ae$ zEf@q?_FT4L5M%(cB^e$+1KqOw_!$%9ZvDs4nB+hL5T**_yT4WpZ2T-|B3C><%*x2l z05XF?faOf&hqI4BsR3jTgA~Jiy)S1$x2o@d#ss=O`>fvPEh@}R3?MEum|O@dTN#vD z&O}a_&CSTp@C2k#nf0;W7i}1L87|r|UOUEk z(T16o;dw#JTuDY&kb1`B{2)WP7>>+iJoa0J5p*dN6XVf&j3Au?3^(>OHq4h~WM*i1 z4n7Ou*)qn4=b)i_5cxwEB>Hg8M}xbH`@g?8U}R@lylkTZsDz!uG3O#^+-~_5P;s$r zF5~()PYqZY8Sb`&ro%uJ+i%+)83Y;Lw>yHOeV^Z#c`cw350E?q8^ea_jCYQn1m6PN z?g+k?g8_6i?33=voJ>p%4?vngBZ&4dEbZc7;khC65Oa4uBZ)p*{3k%?i_**lyJ3_U9j8JtmE zu;P#bXmWnVAp-`6$?rECoK?K=aWhB=L@_Wh>^;gjy>*3w029L&PS9-;oD2dCn|T=o zm}YQaa~Nb84o}Wu01f3UF&v$o!vNZKuEM~; zpvJIyat?z!!-dH?3@pM7t2QzISOZ>@vQZh#U}os=g9tG*oa+U#7?~LE2!Tr9b1|o1 zaxyYA+?Hf~%X3?jL5A_zQN|1F&a#8Tat`A@nJr-3CmdsBU;~ZWfU+8B zfg5N|Iydx|O-2^RqwS!K3R!T5D2=&K=3r%*c(aR<@zzvE5DlJ$V{KqryahZ)0Wyt~VcybC zMh4LQ2q?0^Cu=h>uyBITpPB+{Ab?kqKAEx4H=cY+#mf(-qj)rBk! zFTu@R@cJBZv-cpz>Ouln13(ud2r=B93JN3!P%D!G)VKh72eyt0)Bs^(Vz@dLJS7Mk zVh1nyN1DtAPt$?QNk;Gu$Y8gSHmS|Z1Yfqx!7yF<=SBrk3;JU(BbWtl$b(s+js=JT zZU`>h0_uh>+XAYsP&*cv|H?5kFf0VgNP+@x@fJ|Q4I-aSWn^WLWc&yZ%ngrh*CBqu}vF!v4-39`T44wNm7}y#5_G>V3vVuuA1_sVHrcL`bKoia& zikEfmehmg*HUNs5rxD9FPM0;t^1nQYU< zckKM7@5jv0ITLhtQu|Cc24OH;1VS=`>Ox2hT@EZF2kNmhFvv47FsOh9v>_x!SdZb^ z3^oP>hTk*T7^f^@{5^xs6vSpQW&S;bjlm4ewq^J~gN?zK(T>56;bIVjJ%b&C1A`r7 z-x5YUcSZ&V_r?as&KMBIw0j8~h-L;0vJ^0QG5l+1XYgj|oxsN6&3HD5!H3~&5Q8rR z1495L!NJJ}c_8Mbw@F~l$|X=G=JWnR?C&JYJ?$AifPhGmWH z3|SzOaoQ5bWsU6F3@aMh8FCpW#4zMGFfCll#!$$xu8|$&qjin!#S9&d>$fLjgk%sOarsY+yS3pN*l1v4LgVBsPX#DBZ`%uzeC67fXIdh1v!R^j112w zu`zJ-F)V0eeDJxN4Uz_!8<;>zfejq1piwwBaBmqT#$d=Ww~2Ae!F*OGhF>$-K&#y$ z6btCqN)8YKY6+M#EL_5P^NKkm6T`*nY>bPRFkYO_#^B1ZZZYH8PftND!iJe_pwX{i ziy1de{{ottT7Qg{ftdkBGO#jiTFf|i69+RBC~+`@2v9y{2xFLajPcUHn|!j&44o6$ z7+An0Hy?=2Ed(NYKxu&ShzT+2 z&p^%fBQwDZs`^&Lln_*`1B#j#8xDY$C4qv3iJ9ToV#Yfw9)PwEto+Iax&Zwv_=?p{ ziy7}<6JTayn7stFY8ga=BPWevw(_M#4;Vp14PSd1K};qNP=;dQVw~N`4q8$&r;l+$ zE9m@NP$p#HVqDtCxMBK2P`$&=z{tb!sF(5VG*C6h&2WJo!eU@P17|2aW1I zSD4)hy0{BuBm)EE6MhBAT4)BQY5dD3)-f_LfD|(1Fzi^&IAJdv6Ei3WgB@4^5?X)W zf{B@7@lsIYVPIe=V(3xs>I0un`mC1`%mVL)0JE4F4k&^c;ARmh@3VsQHvm%yE# z5Kz$n;lI-p0y+({ksUPd0N-R%3d$vaCbWXiUS9+9d;^m<15*Rb)&_P4rUte@|3Nti zv_hSr`#t)#oL%;)?zZNq-P-J3a$YEe+$YEf(wO99l`HXAd^_iI%8m5^uFoQ`J zhUfSAKux)S;*6)-8O519m}WhYV_;!sIUw|)V;UF`xnR&qj zIR-Y?g%9Ky_!+~=vi+<#A!@ty4cdy--dNA5{7h&3>QC`m9!229F=Nzn2r zP}>1CC#?o*Kd6D`d(}Xtr5gBbFLee61|0?l1_K5L24jX3_aqs=%AU9`-Xc!PYf_Mw01l05aDFYSoU`xUM83tDHqA}1GAaEtYb`p3lhSoU%%FVhbu241%PAf6O&6Vpj124MzE28PCu z>~|J1p8Ir8U!H}b=_BZ1Nf0T=(EX8}L6Ko1h=jCJ)EFjzWM|M|nDLRFK^si!Fi-x^ z!eGd>#TSSU@6f46`rt zFa$8n{SVpze{420Lm0!-kL(O#jL(0vGK4YZGsH1m_{h!>*T8i3BRfMp)0O)?3`xwJ zZu2lCv4F@lhA&^)8N^u`_C|Fak!OVXfI)=evB`%gv%x+2x28}QXmI+;Y|w>z%^%qr z7~~j^wlm)7uxDgq0{N6dk@2nRlr8R{d6F}cQ?|G>vNK%&$;!Z>%JA59&CA)K>KEjF zMka>6{!<>@0WI|f@!7$F!l2IZ%=F2jJ)rTc<7ZevN#LIUhI`XNNA?^!!@|JDaN-OL z12>pt&|%)scjk{UBL@R0^cZv*Zkf*csSYZd7OT(ssm{p4Fy%iB1A`vJSN4W)pd%_6 zS4TE{107K@4J2;BaM$$44;@fRdQ$zy4;@BUhB+W{L&k^xE6!bHW@cjm#Rn(D`RjrV zTnrbk3o8;o5)T6t3rLWOje&uQ<0yy^+MvzU0Uozt z+YcUkXFk9V?a(_hOxecx;gk_GXsr(e>b-6sP8orG@m=x5DI?ITxl5qtH=5PGVav9{+N-O;re4n238Qs_(AddV^HVz`*y}VeeA4Y|G_r* zgF05Ajt=CYkvo0t5P#n31J%MHBdBrENHD|tS&T1^nlUjk+?WMAuJ^_)X2$o5Ad-pU z=XS;iuXu1Bee&QH=(R6x)7+_q9#h#yH`LIJU$x;R*O8neU1q{j3oESZ6A3 zQkqy;7$$FHyo22pcVMo#^F$o9We?;Ftgg64sVkyE_nL!j1Fe|^*~ZK`9b{WP<3si2=lCV%d9}hk=Rh(|kS# zCJwMj3)6%pd<;w-OpQzU7#Nw@_Om~2Tm_oRV?F?8F)}dxoX^L=aN@~q#`iuS_w3eZ zVPrV^8r!J4E;}LGcx}40Z}Xr6CTe74dSkvz_@J+W6!g-`b>-rcUMjT zjRY)SH32+!w>PR~`9aXh^bbMe3`~ssrZIjzH&vL8iD5oS2{Yİrn#;}Z$vF8Ni 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

    X#?dp!4H@vVjivzPXlh+1F=`>@45}!v-cfAS5#= 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
    J(q7{leI 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

    !tSCCCH;(Ase^5W&RC@K_C! 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 z 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

    !B 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

    1-NTYhOkgvZSU~C-ZW}$7zCWjwkCEZA5d#y$ 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ℜ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

    JCoTkiqJz8?86gE-T2eFiCJ5W%us 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�a@AV^=TZ0njN*A3$^43=6X09C3y|1yJ*W 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�)w}n~fop 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.+N9-r2xw+<(ku+{wel%&?J>fdxb`aNH2u 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 G4;TS Date: Mon, 21 Jul 2025 15:16:35 -0700 Subject: [PATCH 2143/2211] ANDROID: Disable CONFIG_SHADOW_CALL_STACK for TV GKI This changes enables about 8MB saving in kernel memory consumption during 4K playback. Bug: 416070040 Change-Id: I763279c11131e1db3d4f476ac87d754be1c19dbf Signed-off-by: Kensuke Miyagi --- arch/arm64/configs/tv_gki.fragment | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/configs/tv_gki.fragment b/arch/arm64/configs/tv_gki.fragment index e929795ba8b01..75003d5b6f828 100644 --- a/arch/arm64/configs/tv_gki.fragment +++ b/arch/arm64/configs/tv_gki.fragment @@ -7,3 +7,4 @@ # CONFIG_PAGE_PINNER is not set # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_INFO_BTF is not set +# CONFIG_SHADOW_CALL_STACK is not set -- GitLab From 4f0fccc35a9fb82f2e25badcb24bca171512444d Mon Sep 17 00:00:00 2001 From: xieliujie Date: Thu, 28 Mar 2024 18:36:46 +0800 Subject: [PATCH 2144/2211] ANDROID: vendor_hook: Add hooks to support reader optimistic spin in rwsem Since upstream commit 617f3ef95177 ("locking/rwsem: Remove reader optimistic spinning"), vendors have seen increased contention and blocking on rwsems. There are attempts to actively fix this upstream: https://lore.kernel.org/lkml/20240406081126.8030-1-bongkyu7.kim@samsung.com/ But in the meantime, provide vendorhooks so that vendors can implement their own optimistic spin routine. In doing so, vendors see improvements in cold launch times on important apps. Bug: 433638448 Bug: 331742151 Change-Id: I7466413de9ee1293e86f73880931235d7a9142ac Signed-off-by: xieliujie [jstultz: Rewrote commit message] Signed-off-by: John Stultz (cherry picked from commit abe0af2abe51fae4fb072c8d7124aaa37f1da574) --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/rwsem.h | 6 ++++++ kernel/locking/osq_lock.c | 2 ++ kernel/locking/rwsem.c | 14 ++++++++++++-- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 590fc921b89f6..1d2a6f9a13e9b 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -106,6 +106,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_write_wait_finish); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_opt_spin_start); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_opt_spin_finish); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_can_spin_on_owner); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_direct_rsteal); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_optimistic_rspin); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpu_idle_enter); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpu_idle_exit); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mpam_set); diff --git a/include/trace/hooks/rwsem.h b/include/trace/hooks/rwsem.h index 3eed572080e57..bd3030f12ba17 100644 --- a/include/trace/hooks/rwsem.h +++ b/include/trace/hooks/rwsem.h @@ -47,6 +47,12 @@ DECLARE_HOOK(android_vh_clear_rwsem_writer_owned, DECLARE_HOOK(android_vh_rwsem_read_trylock_failed, TP_PROTO(struct rw_semaphore *sem, long *cntp, int *ret), TP_ARGS(sem, cntp, ret)); +DECLARE_HOOK(android_vh_rwsem_direct_rsteal, + TP_PROTO(struct rw_semaphore *sem, bool *steal), + TP_ARGS(sem, steal)); +DECLARE_HOOK(android_vh_rwsem_optimistic_rspin, + TP_PROTO(struct rw_semaphore *sem, long *adjustment, bool *rspin), + TP_ARGS(sem, adjustment, rspin)); #endif /* _TRACE_HOOK_RWSEM_H */ /* This part must be outside protection */ #include diff --git a/kernel/locking/osq_lock.c b/kernel/locking/osq_lock.c index 75a6f6133866d..c7db041981783 100644 --- a/kernel/locking/osq_lock.c +++ b/kernel/locking/osq_lock.c @@ -206,6 +206,7 @@ bool osq_lock(struct optimistic_spin_queue *lock) return false; } +EXPORT_SYMBOL_GPL(osq_lock); void osq_unlock(struct optimistic_spin_queue *lock) { @@ -233,3 +234,4 @@ void osq_unlock(struct optimistic_spin_queue *lock) if (next) WRITE_ONCE(next->locked, 1); } +EXPORT_SYMBOL_GPL(osq_unlock); diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c index 8efb11b8b6d2b..b65d9ce469ac7 100644 --- a/kernel/locking/rwsem.c +++ b/kernel/locking/rwsem.c @@ -1032,6 +1032,8 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, long count, unsigned int stat struct rwsem_waiter waiter; DEFINE_WAKE_Q(wake_q); bool already_on_list = false; + bool steal = true; + bool rspin = false; /* * To prevent a constant stream of readers from starving a sleeping @@ -1045,7 +1047,8 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, long count, unsigned int stat /* * Reader optimistic lock stealing. */ - if (!(count & (RWSEM_WRITER_LOCKED | RWSEM_FLAG_HANDOFF))) { + trace_android_vh_rwsem_direct_rsteal(sem, &steal); + if (steal && !(count & (RWSEM_WRITER_LOCKED | RWSEM_FLAG_HANDOFF))) { rwsem_set_reader_owned(sem); lockevent_inc(rwsem_rlock_steal); @@ -1053,7 +1056,8 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, long count, unsigned int stat * Wake up other readers in the wait queue if it is * the first reader. */ - if ((rcnt == 1) && (count & RWSEM_FLAG_WAITERS)) { +wake_readers: + if ((rcnt == 1 || rspin) && (count & RWSEM_FLAG_WAITERS)) { raw_spin_lock_irq(&sem->wait_lock); if (!list_empty(&sem->wait_list)) rwsem_mark_wake(sem, RWSEM_WAKE_READ_OWNED, @@ -1064,6 +1068,12 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, long count, unsigned int stat trace_android_vh_record_rwsem_lock_starttime(sem, jiffies); return sem; } + /* + * Reader optimistic spinning and stealing. + */ + trace_android_vh_rwsem_optimistic_rspin(sem, &adjustment, &rspin); + if (rspin) + goto wake_readers; queue: waiter.task = current; -- GitLab From f29b86d677d2f399487f05fa172310f8bbd797a1 Mon Sep 17 00:00:00 2001 From: jingyiming Date: Wed, 23 Jul 2025 19:34:05 +0800 Subject: [PATCH 2145/2211] ANDROID: GKI: Update symbols to symbol list Update symbols for vendor hooks of reader optimistic spin. 4 function symbol(s) added 'int __traceiter_android_vh_rwsem_direct_rsteal(void*, struct rw_semaphore*, bool*)' 'int __traceiter_android_vh_rwsem_optimistic_rspin(void*, struct rw_semaphore*, long*, bool*)' 'bool osq_lock(struct optimistic_spin_queue*)' 'void osq_unlock(struct optimistic_spin_queue*)' 2 variable symbol(s) added 'struct tracepoint __tracepoint_android_vh_rwsem_direct_rsteal' 'struct tracepoint __tracepoint_android_vh_rwsem_optimistic_rspin' Bug: 433638448 Change-Id: Iabcbed85c7b738faa21ada80745b96aa767f2760 Signed-off-by: jingyiming --- gki/aarch64/abi.stg | 83 ++++++++++++++++++++++++++++++++++++++ gki/aarch64/symbols/xiaomi | 8 ++++ 2 files changed, 91 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 0f45f7c84353e..8559c5e92c5ec 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -14978,6 +14978,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x54a91269 } +pointer_reference { + id: 0x1fbeff3e + kind: POINTER + pointee_type_id: 0x54bb1a65 +} pointer_reference { id: 0x1fc1dca8 kind: POINTER @@ -378713,6 +378718,11 @@ function { return_type_id: 0x48b5725f parameter_id: 0x1fba7d3d } +function { + id: 0x1777ee5c + return_type_id: 0x48b5725f + parameter_id: 0x1fbeff3e +} function { id: 0x177c5cdf return_type_id: 0x48b5725f @@ -410771,6 +410781,14 @@ function { parameter_id: 0x18150d9f parameter_id: 0x06b96242 } +function { + id: 0x9ba060b9 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x00be4281 + parameter_id: 0x3593bec8 + parameter_id: 0x11cfee5a +} function { id: 0x9ba0658b return_type_id: 0x6720d32f @@ -425735,6 +425753,11 @@ function { parameter_id: 0x18019702 parameter_id: 0x6720d32f } +function { + id: 0xf94be4cb + return_type_id: 0x6d7f5ff6 + parameter_id: 0x1fbeff3e +} function { id: 0xf9525760 return_type_id: 0x6d7f5ff6 @@ -434529,6 +434552,15 @@ elf_symbol { type_id: 0x9ba93092 full_name: "__traceiter_android_vh_rwsem_can_spin_on_owner" } +elf_symbol { + id: 0xaa42999f + name: "__traceiter_android_vh_rwsem_direct_rsteal" + is_defined: true + symbol_type: FUNCTION + crc: 0x991a987a + type_id: 0x9ba93092 + full_name: "__traceiter_android_vh_rwsem_direct_rsteal" +} elf_symbol { id: 0xbef2021a name: "__traceiter_android_vh_rwsem_downgrade_wake_finish" @@ -434565,6 +434597,15 @@ elf_symbol { type_id: 0x9ba966ad full_name: "__traceiter_android_vh_rwsem_opt_spin_start" } +elf_symbol { + id: 0x66c7c5f3 + name: "__traceiter_android_vh_rwsem_optimistic_rspin" + is_defined: true + symbol_type: FUNCTION + crc: 0x0f9432e7 + type_id: 0x9ba060b9 + full_name: "__traceiter_android_vh_rwsem_optimistic_rspin" +} elf_symbol { id: 0xc710ea63 name: "__traceiter_android_vh_rwsem_read_trylock_failed" @@ -440811,6 +440852,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_rwsem_can_spin_on_owner" } +elf_symbol { + id: 0x403cf0dd + name: "__tracepoint_android_vh_rwsem_direct_rsteal" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_rwsem_direct_rsteal" +} elf_symbol { id: 0x74f587f0 name: "__tracepoint_android_vh_rwsem_downgrade_wake_finish" @@ -440847,6 +440897,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_rwsem_opt_spin_start" } +elf_symbol { + id: 0x8866a3b9 + name: "__tracepoint_android_vh_rwsem_optimistic_rspin" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_rwsem_optimistic_rspin" +} elf_symbol { id: 0xf58571d5 name: "__tracepoint_android_vh_rwsem_read_trylock_failed" @@ -479976,6 +480035,24 @@ elf_symbol { type_id: 0x10985193 full_name: "orderly_reboot" } +elf_symbol { + id: 0x33abdf76 + name: "osq_lock" + is_defined: true + symbol_type: FUNCTION + crc: 0x5c4c07ba + type_id: 0xf94be4cb + full_name: "osq_lock" +} +elf_symbol { + id: 0x2ffaca4e + name: "osq_unlock" + is_defined: true + symbol_type: FUNCTION + crc: 0xaa9b9f7d + type_id: 0x1777ee5c + full_name: "osq_unlock" +} elf_symbol { id: 0x57ecab02 name: "out_of_line_wait_on_bit" @@ -509764,10 +509841,12 @@ interface { symbol_id: 0x91384eff symbol_id: 0xfb1b8d64 symbol_id: 0x5858f827 + symbol_id: 0xaa42999f symbol_id: 0xbef2021a symbol_id: 0xb1847a6f symbol_id: 0x958d8cdb symbol_id: 0xfde8086a + symbol_id: 0x66c7c5f3 symbol_id: 0xc710ea63 symbol_id: 0xbffefc2b symbol_id: 0x3d83999a @@ -510462,10 +510541,12 @@ interface { symbol_id: 0x3fc5ffc9 symbol_id: 0xf01f02ea symbol_id: 0xe471b8d5 + symbol_id: 0x403cf0dd symbol_id: 0x74f587f0 symbol_id: 0x84628825 symbol_id: 0x8d0ce77d symbol_id: 0x50ab483c + symbol_id: 0x8866a3b9 symbol_id: 0xf58571d5 symbol_id: 0xe7ef7059 symbol_id: 0xf2d006c8 @@ -514810,6 +514891,8 @@ interface { symbol_id: 0x224cb6b2 symbol_id: 0x67bce5b1 symbol_id: 0xfbd23728 + symbol_id: 0x33abdf76 + symbol_id: 0x2ffaca4e symbol_id: 0x57ecab02 symbol_id: 0xc31e86d2 symbol_id: 0x27d0c7b6 diff --git a/gki/aarch64/symbols/xiaomi b/gki/aarch64/symbols/xiaomi index 2f4204f9e64b9..1f8a2b2e3d868 100644 --- a/gki/aarch64/symbols/xiaomi +++ b/gki/aarch64/symbols/xiaomi @@ -121,6 +121,9 @@ __traceiter_android_vh_mutex_wait_start __traceiter_android_vh_alter_mutex_list_add __traceiter_android_rvh_cpuset_fork + __traceiter_android_vh_mutex_init + __traceiter_android_vh_rwsem_direct_rsteal + __traceiter_android_vh_rwsem_optimistic_rspin __traceiter_android_vh_sched_setaffinity_early __traceiter_android_rvh_set_cpus_allowed_comm __traceiter_android_rvh_dequeue_task @@ -129,12 +132,17 @@ __tracepoint_android_vh_mutex_wait_start __tracepoint_android_vh_alter_mutex_list_add __tracepoint_android_rvh_cpuset_fork + __tracepoint_android_vh_mutex_init + __tracepoint_android_vh_rwsem_direct_rsteal + __tracepoint_android_vh_rwsem_optimistic_rspin __tracepoint_android_vh_sched_setaffinity_early __tracepoint_android_rvh_set_cpus_allowed_comm __tracepoint_android_rvh_dequeue_task cpuset_cpus_allowed cpufreq_update_policy cgroup_threadgroup_rwsem + osq_lock + osq_unlock #required by millet.ko __traceiter_android_rvh_refrigerator -- GitLab From 0e59ec369e96bb30cfc23a8ee936ffccd8976287 Mon Sep 17 00:00:00 2001 From: Vijayanand Jitta Date: Fri, 4 Mar 2022 19:49:08 +0530 Subject: [PATCH 2146/2211] ANDROID: mm/slub: Fix Kasan issue with get_each_kmemcache_object In get_each_kmemcache_object we go through meta data of the slab object in function(fn), and as a result false postive out-of-bound access is reported by kasan. Fix this by wrapping that function call with metadata_access_enable/disable. Bug: 222651868 Fixes: I8b920f6bd770 ("ANDROID: mm: Add helper function to iterate over slab objects") Change-Id: Ifb4241a9c3e397a52759d467aa267d1297e297dd Signed-off-by: Vijayanand Jitta Signed-off-by: Oreoluwa Babatunde --- mm/slub.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mm/slub.c b/mm/slub.c index 2deae75891a21..e925976914498 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -940,7 +940,9 @@ unsigned long get_each_kmemcache_object(struct kmem_cache *s, spin_lock_irqsave(&n->list_lock, flags); list_for_each_entry(slab, &n->partial, slab_list) { for_each_object(p, s, slab_address(slab), slab->objects) { + metadata_access_enable(); ret = fn(s, p, private); + metadata_access_disable(); if (ret) { spin_unlock_irqrestore(&n->list_lock, flags); return ret; @@ -950,7 +952,9 @@ unsigned long get_each_kmemcache_object(struct kmem_cache *s, #ifdef CONFIG_SLUB_DEBUG list_for_each_entry(slab, &n->full, slab_list) { for_each_object(p, s, slab_address(slab), slab->objects) { + metadata_access_enable(); ret = fn(s, p, private); + metadata_access_disable(); if (ret) { spin_unlock_irqrestore(&n->list_lock, flags); return ret; -- GitLab From 8ca57d2ffdcb9d787fc32ef6b44083150ea6b008 Mon Sep 17 00:00:00 2001 From: Tomasz Michalec Date: Tue, 22 Jul 2025 15:28:26 +0200 Subject: [PATCH 2147/2211] FROMGIT: platform/chrome: cros_ec_typec: Check ec platform device pointer It is possible that parent device for cros_ec_typec device is already available, but ec pointer in parent driver data isn't populated yet. It may happen when cros_typec_probe is running in parallel with cros_ec_register. This leads to NULL pointer dereference when cros_typec_probe tries to get driver data from typec->ec->ec->dev. Check if typec->ec->ec is set before using it in cros_typec_probe. Signed-off-by: Tomasz Michalec Link: https://lore.kernel.org/r/20250722132826.707087-1-tmichalec@google.com Signed-off-by: Tzung-Bi Shih Bug: 433230660 (cherry picked from commit 731a4702b668ef28730e7d2414672b7085e757d6 https://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux.git for-next) Change-Id: Ib0403453623f8174d30e7e448dc9e1ad20b11047 Signed-off-by: Tomasz Michalec --- drivers/platform/chrome/cros_ec_typec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/platform/chrome/cros_ec_typec.c b/drivers/platform/chrome/cros_ec_typec.c index ca665b901010e..f811c5bc8a262 100644 --- a/drivers/platform/chrome/cros_ec_typec.c +++ b/drivers/platform/chrome/cros_ec_typec.c @@ -1225,7 +1225,7 @@ static int cros_typec_probe(struct platform_device *pdev) typec->dev = dev; typec->ec = dev_get_drvdata(pdev->dev.parent); - if (!typec->ec) { + if (!typec->ec || !typec->ec->ec) { dev_warn(dev, "couldn't find parent EC device\n"); return -EPROBE_DEFER; } -- GitLab From 437e1d666d1da25565a576e40737f771189ad707 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Mon, 30 Sep 2024 11:48:24 -0700 Subject: [PATCH 2148/2211] UPSTREAM: printk: Improve memory usage logging during boot When the initial printk ring buffer size is updated, setup_log_buf() allocates a new ring buffer, as well as a set of meta-data structures for the new ring buffer. The function also emits the new size of the ring buffer, but not the size of the meta-data structures. This makes it difficult to assess how changing the log buffer size impacts memory usage during boot. For instance, increasing the ring buffer size from 512 KB to 1 MB through the command line yields an increase of 2304 KB in reserved memory at boot, while the only obvious change is the 512 KB difference in the ring buffer sizes: log_buf_len=512K: printk: log_buf_len: 524288 bytes Memory: ... (... 733252K reserved ...) log_buf_len=1M: printk: log_buf_len: 1048576 bytes Memory: ... (... 735556K reserved ...) This is because of how the size of the meta-data structures scale with the size of the ring buffer. Even when there aren't changes to the printk ring buffer size (i.e. the initial size == 1 << CONFIG_LOG_BUF_SHIFT), it is impossible to tell how much memory is consumed by the printk ring buffer during boot. Therefore, unconditionally log the sizes of the printk ring buffer and its meta-data structures, so that it's easier to understand how changing the log buffer size (either through the command line or by changing CONFIG_LOG_BUF_SHIFT) affects boot time memory usage. With the new logs, it is much easier to see exactly why the memory increased by 2304 KB: log_buf_len=512K: printk: log buffer data + meta data: 524288 + 1835008 = 2359296 bytes Memory: ... (... 733252K reserved ...) log_buf_len=1M: printk: log buffer data + meta data: 1048576 + 3670016 = 4718592 bytes Memory: ... (... 735556K reserved ...) Signed-off-by: Isaac J. Manjarres Reviewed-by: Petr Mladek Tested-by: Petr Mladek Link: https://lore.kernel.org/r/20240930184826.3595221-1-isaacmanjarres@google.com [pmladek@suse.com: Updated the examples in the commit message, simplified comment for default buffer.] Signed-off-by: Petr Mladek (cherry picked from commit a961ec4e2860af4933e8c1763fe4f038c2d6ac80) Change-Id: I3841b1682a6e9a1efd8c02523a438f36204c7932 Bug: 434059872 Signed-off-by: Isaac J. Manjarres --- kernel/printk/printk.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 452363dc020a4..158d1a48bb2da 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -1163,6 +1163,17 @@ static unsigned int __init add_to_rb(struct printk_ringbuffer *rb, static char setup_text_buf[PRINTKRB_RECORD_MAX] __initdata; +static void print_log_buf_usage_stats(void) +{ + unsigned int descs_count = log_buf_len >> PRB_AVGBITS; + size_t meta_data_size; + + meta_data_size = descs_count * (sizeof(struct prb_desc) + sizeof(struct printk_info)); + + pr_info("log buffer data + meta data: %u + %zu = %zu bytes\n", + log_buf_len, meta_data_size, log_buf_len + meta_data_size); +} + void __init setup_log_buf(int early) { struct printk_info *new_infos; @@ -1192,20 +1203,25 @@ void __init setup_log_buf(int early) if (!early && !new_log_buf_len) log_buf_add_cpu(); - if (!new_log_buf_len) + if (!new_log_buf_len) { + /* Show the memory stats only once. */ + if (!early) + goto out; + return; + } new_descs_count = new_log_buf_len >> PRB_AVGBITS; if (new_descs_count == 0) { pr_err("new_log_buf_len: %lu too small\n", new_log_buf_len); - return; + goto out; } new_log_buf = memblock_alloc(new_log_buf_len, LOG_ALIGN); if (unlikely(!new_log_buf)) { pr_err("log_buf_len: %lu text bytes not available\n", new_log_buf_len); - return; + goto out; } new_descs_size = new_descs_count * sizeof(struct prb_desc); @@ -1268,7 +1284,7 @@ void __init setup_log_buf(int early) prb_next_seq(&printk_rb_static) - seq); } - pr_info("log_buf_len: %u bytes\n", log_buf_len); + print_log_buf_usage_stats(); pr_info("early log buf free: %u(%u%%)\n", free, (free * 100) / __LOG_BUF_LEN); return; @@ -1277,6 +1293,8 @@ err_free_descs: memblock_free(new_descs, new_descs_size); err_free_log_buf: memblock_free(new_log_buf, new_log_buf_len); +out: + print_log_buf_usage_stats(); } static bool __read_mostly ignore_loglevel; -- GitLab From b200d023c5d144b0f9e9a213afe9fde16ccb5616 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Fri, 25 Jul 2025 17:28:52 +0000 Subject: [PATCH 2149/2211] ANDROID: Remove CONFIG_DM_USER from microdroid kernels DM_USER support is not required for microdroid, so remove it. Bug: 434202459 Signed-off-by: Isaac J. Manjarres (cherry picked from https://android-review.googlesource.com/q/commit:e59ac868d7aac64dda2c809ebf9dbba601bb932e) Merged-In: Iad81f11e5d3f0e74c75591eadb6df5dd01c1195e Change-Id: Iad81f11e5d3f0e74c75591eadb6df5dd01c1195e --- arch/arm64/configs/microdroid_defconfig | 1 + arch/x86/configs/microdroid_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index f957963b87e70..f438df80a7690 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -92,6 +92,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y CONFIG_DM_VERITY_FEC=y +# CONFIG_DM_USER is not set # CONFIG_INPUT_KEYBOARD is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_LEGACY_PTYS is not set diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index 6aff816c8afbe..3ea85d42c2b03 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -92,6 +92,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y CONFIG_DM_VERITY_FEC=y +# CONFIG_DM_USER is not set # CONFIG_INPUT_KEYBOARD is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_LEGACY_PTYS is not set -- GitLab From e9bbc29c066a63a4c4dd6e328c43e04f61be700e Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Fri, 25 Jul 2025 21:56:52 +0000 Subject: [PATCH 2150/2211] ANDROID: Remove unneeded block and MD features Microdroid doesn't need these configs so remove them. Bug: 434202459 Signed-off-by: Isaac J. Manjarres (cherry picked from https://android-review.googlesource.com/q/commit:3bb9d12a987a62494f5881bd3508334be09b6934) Merged-In: I647f3162cea0c15cb64bbf8cfc5aaf1579588957 Change-Id: I647f3162cea0c15cb64bbf8cfc5aaf1579588957 --- arch/arm64/configs/microdroid_defconfig | 3 +-- arch/x86/configs/microdroid_defconfig | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index f438df80a7690..b84a06731421d 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -81,12 +81,11 @@ CONFIG_ARM_SCMI_PROTOCOL=y CONFIG_ZRAM=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=8192 CONFIG_VIRTIO_BLK=y CONFIG_OPEN_DICE=y CONFIG_VCPU_STALL_DETECTOR=y CONFIG_MD=y +# CONFIG_MD_BITMAP_FILE is not set CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_UEVENT=y diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index 3ea85d42c2b03..b9edfcfb473cd 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -83,10 +83,9 @@ CONFIG_OF=y CONFIG_ZRAM=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=8192 CONFIG_VIRTIO_BLK=y CONFIG_MD=y +# CONFIG_MD_BITMAP_FILE is not set CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_UEVENT=y -- GitLab From d64d8b7dab32e1356e13ee75a26a6bd386d7cbc1 Mon Sep 17 00:00:00 2001 From: Tze-nan Wu Date: Thu, 17 Jul 2025 13:53:38 +0800 Subject: [PATCH 2151/2211] FROMGIT: rcu: Fix delayed execution of hurry callbacks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We observed a regression in our customer’s environment after enabling CONFIG_LAZY_RCU. In the Android Update Engine scenario, where ioctl() is used heavily, we found that callbacks queued via call_rcu_hurry (such as percpu_ref_switch_to_atomic_rcu) can sometimes be delayed by up to 5 seconds before execution. This occurs because the new grace period does not start immediately after the previous one completes. The root cause is that the wake_nocb_gp_defer() function now checks "rdp->nocb_defer_wakeup" instead of "rdp_gp->nocb_defer_wakeup". On CPUs that are not rcuog, "rdp->nocb_defer_wakeup" may always be RCU_NOCB_WAKE_NOT. This can cause "rdp_gp->nocb_defer_wakeup" to be downgraded and the "rdp_gp->nocb_timer" to be postponed by up to 10 seconds, delaying the execution of hurry RCU callbacks. The trace log of one scenario we encountered is as follow: // previous GP ends at this point rcu_preempt [000] d..1. 137.240210: rcu_grace_period: rcu_preempt 8369 end rcu_preempt [000] ..... 137.240212: rcu_grace_period: rcu_preempt 8372 reqwait // call_rcu_hurry enqueues "percpu_ref_switch_to_atomic_rcu", the callback waited on by UpdateEngine update_engine [002] d..1. 137.301593: __call_rcu_common: wyy: unlikely p_ref = 00000000********. lazy = 0 // FirstQ on cpu 2 rdp_gp->nocb_timer is set to fire after 1 jiffy (4ms) // and the rdp_gp->nocb_defer_wakeup is set to RCU_NOCB_WAKE update_engine [002] d..2. 137.301595: rcu_nocb_wake: rcu_preempt 2 FirstQ on cpu2 with rdp_gp (cpu0). // FirstBQ event on cpu2 during the 1 jiffy, make the timer postpond 10 seconds later. // also, the rdp_gp->nocb_defer_wakeup is overwrite to RCU_NOCB_WAKE_LAZY update_engine [002] d..1. 137.301601: rcu_nocb_wake: rcu_preempt 2 WakeEmptyIsDeferred ... ... ... // before the 10 seconds timeout, cpu0 received another call_rcu_hurry // reset the timer to jiffies+1 and set the waketype = RCU_NOCB_WAKE. kworker/u32:0 [000] d..2. 142.557564: rcu_nocb_wake: rcu_preempt 0 FirstQ kworker/u32:0 [000] d..1. 142.557576: rcu_nocb_wake: rcu_preempt 0 WakeEmptyIsDeferred kworker/u32:0 [000] d..1. 142.558296: rcu_nocb_wake: rcu_preempt 0 WakeNot kworker/u32:0 [000] d..1. 142.558562: rcu_nocb_wake: rcu_preempt 0 WakeNot // idle(do_nocb_deferred_wakeup) wake rcuog due to waketype == RCU_NOCB_WAKE [000] d..1. 142.558786: rcu_nocb_wake: rcu_preempt 0 DoWake [000] dN.1. 142.558839: rcu_nocb_wake: rcu_preempt 0 DeferredWake rcuog/0 [000] ..... 142.558871: rcu_nocb_wake: rcu_preempt 0 EndSleep rcuog/0 [000] ..... 142.558877: rcu_nocb_wake: rcu_preempt 0 Check // finally rcuog request a new GP at this point (5 seconds after the FirstQ event) rcuog/0 [000] d..2. 142.558886: rcu_grace_period: rcu_preempt 8372 newreq rcu_preempt [001] d..1. 142.559458: rcu_grace_period: rcu_preempt 8373 start ... rcu_preempt [000] d..1. 142.564258: rcu_grace_period: rcu_preempt 8373 end rcuop/2 [000] D..1. 142.566337: rcu_batch_start: rcu_preempt CBs=219 bl=10 // the hurry CB is invoked at this point rcuop/2 [000] b.... 142.566352: blk_queue_usage_counter_release: wyy: wakeup. p_ref = 00000000********. This patch changes the condition to check "rdp_gp->nocb_defer_wakeup" in the lazy path. This prevents an already scheduled "rdp_gp->nocb_timer" from being postponed and avoids overwriting "rdp_gp->nocb_defer_wakeup" when it is not RCU_NOCB_WAKE_NOT. Fixes: 3cb278e73be5 ("rcu: Make call_rcu() lazy to save power") Co-developed-by: Cheng-jui Wang Signed-off-by: Cheng-jui Wang Co-developed-by: Lorry.Luo@mediatek.com Signed-off-by: Lorry.Luo@mediatek.com Tested-by: weiyangyang@vivo.com Signed-off-by: weiyangyang@vivo.com Signed-off-by: Tze-nan Wu Reviewed-by: Frederic Weisbecker Signed-off-by: Neeraj Upadhyay (AMD) Bug: 433659824 (cherry picked from commit 463d46044f04013306a4893242f65788b8a16b2e https://git.kernel.org/pub/scm/linux/kernel/git/neeraj.upadhyay/linux-rcu.git rcu.merge.22.07.2025) Change-Id: I4a0cedfd3fe35f609262ba204f5fea2be2d5f9de Signed-off-by: Tze-nan Wu --- kernel/rcu/tree_nocb.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h index 2605dd234a13c..2ad3a88623a7c 100644 --- a/kernel/rcu/tree_nocb.h +++ b/kernel/rcu/tree_nocb.h @@ -276,7 +276,7 @@ static void wake_nocb_gp_defer(struct rcu_data *rdp, int waketype, * callback storms, no need to wake up too early. */ if (waketype == RCU_NOCB_WAKE_LAZY && - rdp->nocb_defer_wakeup == RCU_NOCB_WAKE_NOT) { + rdp_gp->nocb_defer_wakeup == RCU_NOCB_WAKE_NOT) { mod_timer(&rdp_gp->nocb_timer, jiffies + rcu_get_jiffies_lazy_flush()); WRITE_ONCE(rdp_gp->nocb_defer_wakeup, waketype); } else if (waketype == RCU_NOCB_WAKE_BYPASS) { -- GitLab From 47365056686efccb3d927cbe35a73cfa0d2e0122 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 28 Jul 2025 06:41:19 +0000 Subject: [PATCH 2152/2211] ANDROID: KVM: arm64: poison/account relinquished pages after unmap If the page is poisoned and accounted before the unmap: 1. The guest has a window to access and dirty the page after the poison and related CMOs 2. If the unmap fails, the hypercall has visible side effect (poisoning) and leaves an incorrect PSCI MEM_PROTECT count. Bug: 357781595 Bug: 433953177 Change-Id: Id67f2dda632bca686e2509f1c64d08743deef199 Signed-off-by: Keir Fraser --- arch/arm64/kvm/hyp/nvhe/mem_protect.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c index 1d36fd64d42bb..bec0ebf25e804 100644 --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c @@ -431,14 +431,14 @@ int __pkvm_guest_relinquish_to_host(struct pkvm_hyp_vcpu *vcpu, goto end; } - hyp_poison_page(phys, PAGE_SIZE); - psci_mem_protect_dec(1); - /* Zap the guest stage2 pte and return ownership to the host */ ret = kvm_pgtable_stage2_unmap(&vm->pgt, ipa, PAGE_SIZE); if (ret) goto end; + hyp_poison_page(phys, PAGE_SIZE); + psci_mem_protect_dec(1); + WARN_ON(host_stage2_set_owner_locked(phys, PAGE_SIZE, PKVM_ID_HOST)); end: guest_unlock_component(vm); -- GitLab From 83d3e71648b1ce5744809dd71610064cdd7a7a18 Mon Sep 17 00:00:00 2001 From: "qinglin.li" Date: Fri, 25 Jul 2025 14:03:26 +0800 Subject: [PATCH 2153/2211] ANDROID: GKI: Update symbol list for Amlogic 3 function symbol(s) added 'int LZ4_compress_HC(const char*, char*, int, int, int, void*)' 'int zstd_max_clevel()' 'int zstd_min_clevel()' Bug: 434080279 Change-Id: Ia67af34ff22379de284c55e04c8110bb31075c74 Signed-off-by: qinglin.li --- gki/aarch64/abi.stg | 30 ++++++++++++++++++++++++++++++ gki/aarch64/symbols/amlogic | 8 ++++++++ 2 files changed, 38 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 8559c5e92c5ec..98111c2d80d19 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -426495,6 +426495,15 @@ elf_symbol { type_id: 0x2dfa71ba full_name: "I_BDEV" } +elf_symbol { + id: 0x26c56443 + name: "LZ4_compress_HC" + is_defined: true + symbol_type: FUNCTION + crc: 0x2cf136fa + type_id: 0x920e8cef + full_name: "LZ4_compress_HC" +} elf_symbol { id: 0x6ea63025 name: "LZ4_compress_default" @@ -508940,11 +508949,30 @@ elf_symbol { type_id: 0xf3d624ec full_name: "zstd_is_error" } +elf_symbol { + id: 0x0b36a725 + name: "zstd_max_clevel" + is_defined: true + symbol_type: FUNCTION + crc: 0x7851be11 + type_id: 0x9d80e32f + full_name: "zstd_max_clevel" +} +elf_symbol { + id: 0x3b5116ed + name: "zstd_min_clevel" + is_defined: true + symbol_type: FUNCTION + crc: 0x7851be11 + type_id: 0x9d80e32f + full_name: "zstd_min_clevel" +} interface { id: 0x84ea5130 symbol_id: 0x698a526c symbol_id: 0x4203f861 symbol_id: 0x2dddbe52 + symbol_id: 0x26c56443 symbol_id: 0x6ea63025 symbol_id: 0x7c322a62 symbol_id: 0x38116da8 @@ -518101,4 +518129,6 @@ interface { symbol_id: 0xae02eaa9 symbol_id: 0x0d8da27c symbol_id: 0x19c14ad0 + symbol_id: 0x0b36a725 + symbol_id: 0x3b5116ed } diff --git a/gki/aarch64/symbols/amlogic b/gki/aarch64/symbols/amlogic index 09b5668579c84..31e1a55e2debf 100644 --- a/gki/aarch64/symbols/amlogic +++ b/gki/aarch64/symbols/amlogic @@ -573,6 +573,7 @@ down downgrade_write down_interruptible + down_killable down_read down_read_trylock down_timeout @@ -786,6 +787,7 @@ drop_reasons_register_subsys drop_reasons_unregister_subsys d_splice_alias + dump_backtrace dump_stack dw_pcie_find_capability dw_pcie_host_deinit @@ -1005,6 +1007,7 @@ handle_fasteoi_irq handle_simple_irq handle_sysrq + hci_cmd_sync hdmi_audio_infoframe_init hdmi_audio_infoframe_pack hdmi_avi_infoframe_init @@ -1317,8 +1320,10 @@ log_write_mmio lookup_bdev loops_per_jiffy + LZ4_compress_default LZ4_compress_fast LZ4_compress_fast_continue + LZ4_compress_HC LZ4_decompress_safe LZ4_decompress_safe_continue LZ4_decompress_safe_partial @@ -2118,6 +2123,7 @@ skb_queue_tail skb_realloc_headroom skb_scrub_packet + skb_split skb_trim skb_tstamp_tx skb_unlink @@ -2822,4 +2828,6 @@ zs_malloc zs_map_object zs_pool_stats + zstd_max_clevel + zstd_min_clevel zs_unmap_object -- GitLab From 6aa695ed1b93e6047ee4222558799c78da27aeac Mon Sep 17 00:00:00 2001 From: yipeng xiang Date: Mon, 28 Jul 2025 17:07:35 +0800 Subject: [PATCH 2154/2211] ANDROID: GKI: Update honor symbol list 1 function symbol(s) added 'int __traceiter_android_vh_page_cache_ra_order_bypass(void*, struct readahead_control*, struct file_ra_state*, int, gfp_t*, bool*)' 1 variable symbol(s) added 'struct tracepoint __tracepoint_android_vh_page_cache_ra_order_bypass' Bug: 434605348 Bug: 434600944 Change-Id: Ied330a24b8c4afd59f93012275744243858e2018 Signed-off-by: yipeng xiang --- gki/aarch64/symbols/honor | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gki/aarch64/symbols/honor b/gki/aarch64/symbols/honor index b5ce711e6d073..705830088dfa6 100644 --- a/gki/aarch64/symbols/honor +++ b/gki/aarch64/symbols/honor @@ -45,6 +45,8 @@ __pmd_trans_huge_lock __pte_offset_map_lock __show_mem + __traceiter_android_vh_page_cache_ra_order_bypass + __tracepoint_android_vh_page_cache_ra_order_bypass __traceiter_android_vh_slab_alloc_node __tracepoint_android_vh_slab_alloc_node __traceiter_android_vh_slab_free -- GitLab From ee117211e482e1ed39390468ea91c7f2d05d2cca Mon Sep 17 00:00:00 2001 From: Dongdong zhang Date: Thu, 24 Jul 2025 20:07:06 +0800 Subject: [PATCH 2155/2211] ANDROID: mm: add vendor hook to trace swap bio charge Add a vendor hook `android_vh_swap_bio_charge` in swap read path to allow vendors to monitor behavior when a swap bio is submitted. Bug: 433890875 Change-Id: I742978c7cb5c7d678d585b49e3466920f99e4fba Signed-off-by: Dongdong zhang --- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/mm.h | 3 +++ mm/page_io.c | 1 + 3 files changed, 5 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 1d2a6f9a13e9b..c78e6abd094fb 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -587,3 +587,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gzvm_handle_demand_page_post); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gzvm_destroy_vm_post_process); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_usb_dev_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_swap_bio_charge); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 4cc08294d9b0b..9612397bcf388 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -540,6 +540,9 @@ DECLARE_HOOK(android_vh_filemap_add_folio, DECLARE_HOOK(android_vh_gcma_cc_store_page_bypass, TP_PROTO(bool *bypass), TP_ARGS(bypass)); +DECLARE_HOOK(android_vh_swap_bio_charge, + TP_PROTO(struct bio *bio), + TP_ARGS(bio)); #endif /* _TRACE_HOOK_MM_H */ /* This part must be outside protection */ diff --git a/mm/page_io.c b/mm/page_io.c index fce30cc031231..dbc50cab094da 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -594,6 +594,7 @@ static void swap_read_folio_bdev_sync(struct folio *folio, get_task_struct(current); count_vm_events(PSWPIN, folio_nr_pages(folio)); submit_bio_wait(&bio); + trace_android_vh_swap_bio_charge(&bio); __end_swap_bio_read(&bio); put_task_struct(current); } -- GitLab From 1897bee52a43aff2b05b1f659b931b186e53cadd Mon Sep 17 00:00:00 2001 From: Dongdong zhang Date: Thu, 24 Jul 2025 20:39:13 +0800 Subject: [PATCH 2156/2211] ANDROID: GKI: update symbol list for xiaomi 1 function symbol(s) added 'int __traceiter_android_vh_swap_bio_charge(void*, struct bio*)' 1 variable symbol(s) added 'struct tracepoint __tracepoint_android_vh_swap_bio_charge' Bug: 433890875 Change-Id: I6e484325b6c1ae65b9f0f087ce54a63ef74e4630 Signed-off-by: Dongdong zhang --- gki/aarch64/abi.stg | 20 ++++++++++++++++++++ gki/aarch64/symbols/xiaomi | 2 ++ 2 files changed, 22 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 98111c2d80d19..39df72c7369ed 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -435137,6 +435137,15 @@ elf_symbol { type_id: 0x9be885da full_name: "__traceiter_android_vh_split_large_folio_bypass" } +elf_symbol { + id: 0x149a3dd1 + name: "__traceiter_android_vh_swap_bio_charge" + is_defined: true + symbol_type: FUNCTION + crc: 0x34c3293c + type_id: 0x9bf93663 + full_name: "__traceiter_android_vh_swap_bio_charge" +} elf_symbol { id: 0xb993d4e0 name: "__traceiter_android_vh_swap_writepage" @@ -441437,6 +441446,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_split_large_folio_bypass" } +elf_symbol { + id: 0xc0e19d2f + name: "__tracepoint_android_vh_swap_bio_charge" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_swap_bio_charge" +} elf_symbol { id: 0xd5f8f162 name: "__tracepoint_android_vh_swap_writepage" @@ -509933,6 +509951,7 @@ interface { symbol_id: 0x08f4cbb0 symbol_id: 0x57cb67b6 symbol_id: 0x7068c1fb + symbol_id: 0x149a3dd1 symbol_id: 0xb993d4e0 symbol_id: 0x445e3749 symbol_id: 0x3f14ea30 @@ -510633,6 +510652,7 @@ interface { symbol_id: 0x547e3912 symbol_id: 0xb11763a0 symbol_id: 0x02bb68bd + symbol_id: 0xc0e19d2f symbol_id: 0xd5f8f162 symbol_id: 0x052557d7 symbol_id: 0x6fb8113a diff --git a/gki/aarch64/symbols/xiaomi b/gki/aarch64/symbols/xiaomi index 1f8a2b2e3d868..052afda93c42f 100644 --- a/gki/aarch64/symbols/xiaomi +++ b/gki/aarch64/symbols/xiaomi @@ -437,6 +437,8 @@ __tracepoint_android_vh_mem_cgroup_charge __tracepoint_android_vh_filemap_add_folio __tracepoint_android_vh_shrink_node + __traceiter_android_vh_swap_bio_charge + __tracepoint_android_vh_swap_bio_charge #required by mem_reclaim_ctl.ko __traceiter_android_vh_page_should_be_protected -- GitLab From c05e52aa04db165bd16b39fcd14e1503c61047eb Mon Sep 17 00:00:00 2001 From: davidwang Date: Sat, 19 Jul 2025 19:31:04 +0800 Subject: [PATCH 2157/2211] ANDROID: vendor_hooks: Add hooks in filemap_get_folio Add hooks for page allocation by fgp_flags and gfp_mask type. Bug: 434052615 Change-Id: I1c70fb6ad6a83a2b688898d186d9bed97ccfe563 Signed-off-by: davidwang --- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/mm.h | 3 +++ mm/filemap.c | 3 +++ 3 files changed, 7 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index c78e6abd094fb..b3b8f473193e8 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -506,6 +506,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_show_stack_hash); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_exit_check); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rmqueue); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_get_folio); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_get_folio_gfp); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_f2fs_file_open); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_compaction_begin); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_compaction_end); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 9612397bcf388..b348f20eaf0be 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -149,6 +149,9 @@ DECLARE_HOOK(android_vh_filemap_get_folio, TP_PROTO(struct address_space *mapping, pgoff_t index, int fgp_flags, gfp_t gfp_mask, struct folio *folio), TP_ARGS(mapping, index, fgp_flags, gfp_mask, folio)); +DECLARE_HOOK(android_vh_filemap_get_folio_gfp, + TP_PROTO(struct address_space *mapping, int fgp_flags, gfp_t *gfp_mask), + TP_ARGS(mapping, fgp_flags, gfp_mask)); DECLARE_RESTRICTED_HOOK(android_rvh_madvise_pageout_begin, TP_PROTO(void **private), TP_ARGS(private), 1); diff --git a/mm/filemap.c b/mm/filemap.c index 65dc8d2889db4..3781360641037 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1963,6 +1963,9 @@ no_page: gfp &= ~GFP_KERNEL; gfp |= GFP_NOWAIT | __GFP_NOWARN; } + + trace_android_vh_filemap_get_folio_gfp(mapping, fgp_flags, &gfp); + if (WARN_ON_ONCE(!(fgp_flags & (FGP_LOCK | FGP_FOR_MMAP)))) fgp_flags |= FGP_LOCK; -- GitLab From 616c12b4d68491fbe8465541ccfb98c0275e1594 Mon Sep 17 00:00:00 2001 From: davidwang Date: Fri, 25 Jul 2025 14:13:32 +0800 Subject: [PATCH 2158/2211] ANDROID: GKI: Update symbol list for rtktv 1 function symbol(s) added 'int __traceiter_android_vh_filemap_get_folio_gfp(void*, struct address_space*, int, gfp_t*)' 1 variable symbol(s) added 'struct tracepoint __tracepoint_android_vh_filemap_get_folio_gfp' Bug: 434052615 Change-Id: Ibb4d543df45b4755b3475bbed97010944a842ea1 Signed-off-by: davidwang --- gki/aarch64/abi.stg | 28 ++++++++++++++++++++++++++++ gki/aarch64/symbols/rtktv | 2 ++ 2 files changed, 30 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 39df72c7369ed..00de3eaa8f0f6 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -413000,6 +413000,14 @@ function { parameter_id: 0x18bd6530 parameter_id: 0x1d633c7d } +function { + id: 0x9be0a31d + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x1582ab06 + parameter_id: 0x6720d32f + parameter_id: 0x36f98e5c +} function { id: 0x9be186c4 return_type_id: 0x6720d32f @@ -433166,6 +433174,15 @@ elf_symbol { type_id: 0x9bf4cdf9 full_name: "__traceiter_android_vh_filemap_get_folio" } +elf_symbol { + id: 0x5893591b + name: "__traceiter_android_vh_filemap_get_folio_gfp" + is_defined: true + symbol_type: FUNCTION + crc: 0xa6aa9a8d + type_id: 0x9be0a31d + full_name: "__traceiter_android_vh_filemap_get_folio_gfp" +} elf_symbol { id: 0xb7d91f76 name: "__traceiter_android_vh_filemap_map_pages" @@ -439475,6 +439492,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_filemap_get_folio" } +elf_symbol { + id: 0x85c23431 + name: "__tracepoint_android_vh_filemap_get_folio_gfp" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_filemap_get_folio_gfp" +} elf_symbol { id: 0xb34d9200 name: "__tracepoint_android_vh_filemap_map_pages" @@ -509732,6 +509758,7 @@ interface { symbol_id: 0x19fc04e0 symbol_id: 0x734973d4 symbol_id: 0x49c69e22 + symbol_id: 0x5893591b symbol_id: 0xb7d91f76 symbol_id: 0x158bf9d3 symbol_id: 0x0e217a5e @@ -510433,6 +510460,7 @@ interface { symbol_id: 0x197d6be2 symbol_id: 0xdac9a862 symbol_id: 0x6d970e8c + symbol_id: 0x85c23431 symbol_id: 0xb34d9200 symbol_id: 0xf61927fd symbol_id: 0xa8c30e54 diff --git a/gki/aarch64/symbols/rtktv b/gki/aarch64/symbols/rtktv index bebf6913ab4a3..3494e78d70af0 100644 --- a/gki/aarch64/symbols/rtktv +++ b/gki/aarch64/symbols/rtktv @@ -27,4 +27,6 @@ remove_memory_subsection send_sig_mceerr smpboot_unregister_percpu_thread + __traceiter_android_vh_filemap_get_folio_gfp + __tracepoint_android_vh_filemap_get_folio_gfp vmap_pfn -- GitLab From d12def49bbdb0887ccda3729104ae113966a5b2d Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Wed, 9 Jul 2025 10:38:29 -0700 Subject: [PATCH 2159/2211] UPSTREAM: eventpoll: don't decrement ep refcount while still holding the ep mutex commit 8c2e52ebbe885c7eeaabd3b7ddcdc1246fc400d2 upstream. Jann Horn points out that epoll is decrementing the ep refcount and then doing a mutex_unlock(&ep->mtx); afterwards. That's very wrong, because it can lead to a use-after-free. That pattern is actually fine for the very last reference, because the code in question will delay the actual call to "ep_free(ep)" until after it has unlocked the mutex. But it's wrong for the much subtler "next to last" case when somebody *else* may also be dropping their reference and free the ep while we're still using the mutex. Note that this is true even if that other user is also using the same ep mutex: mutexes, unlike spinlocks, can not be used for object ownership, even if they guarantee mutual exclusion. A mutex "unlock" operation is not atomic, and as one user is still accessing the mutex as part of unlocking it, another user can come in and get the now released mutex and free the data structure while the first user is still cleaning up. See our mutex documentation in Documentation/locking/mutex-design.rst, in particular the section [1] about semantics: "mutex_unlock() may access the mutex structure even after it has internally released the lock already - so it's not safe for another context to acquire the mutex and assume that the mutex_unlock() context is not using the structure anymore" So if we drop our ep ref before the mutex unlock, but we weren't the last one, we may then unlock the mutex, another user comes in, drops _their_ reference and releases the 'ep' as it now has no users - all while the mutex_unlock() is still accessing it. Fix this by simply moving the ep refcount dropping to outside the mutex: the refcount itself is atomic, and doesn't need mutex protection (that's the whole _point_ of refcounts: unlike mutexes, they are inherently about object lifetimes). Bug: 432751421 Reported-by: Jann Horn Link: https://docs.kernel.org/locking/mutex-design.html#semantics [1] Cc: Alexander Viro Cc: Christian Brauner Cc: Jan Kara Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman (cherry picked from commit 6dee745bd0aec9d399df674256e7b1ecdb615444) Signed-off-by: Lee Jones Change-Id: If3ca29987319bd31d794f621cdae863923b65c00 --- fs/eventpoll.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 1a06e462b6efb..99eed91d03ebe 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -854,7 +854,7 @@ static bool __ep_remove(struct eventpoll *ep, struct epitem *epi, bool force) kfree_rcu(epi, rcu); percpu_counter_dec(&ep->user->epoll_watches); - return ep_refcount_dec_and_test(ep); + return true; } /* @@ -862,14 +862,14 @@ static bool __ep_remove(struct eventpoll *ep, struct epitem *epi, bool force) */ static void ep_remove_safe(struct eventpoll *ep, struct epitem *epi) { - WARN_ON_ONCE(__ep_remove(ep, epi, false)); + if (__ep_remove(ep, epi, false)) + WARN_ON_ONCE(ep_refcount_dec_and_test(ep)); } static void ep_clear_and_put(struct eventpoll *ep) { struct rb_node *rbp, *next; struct epitem *epi; - bool dispose; /* We need to release all tasks waiting for these file */ if (waitqueue_active(&ep->poll_wait)) @@ -902,10 +902,8 @@ static void ep_clear_and_put(struct eventpoll *ep) cond_resched(); } - dispose = ep_refcount_dec_and_test(ep); mutex_unlock(&ep->mtx); - - if (dispose) + if (ep_refcount_dec_and_test(ep)) ep_free(ep); } @@ -1108,7 +1106,7 @@ again: dispose = __ep_remove(ep, epi, true); mutex_unlock(&ep->mtx); - if (dispose) + if (dispose && ep_refcount_dec_and_test(ep)) ep_free(ep); goto again; } -- GitLab From 136094c34618398904af99d25610ff5cb274c086 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Mon, 28 Jul 2025 21:01:06 +0000 Subject: [PATCH 2160/2211] ANDROID: Remove IPV6 support from microdroid kernels This feature is not needed, so remove it. Bug: 434256355 Signed-off-by: Isaac J. Manjarres (cherry picked from https://android-review.googlesource.com/q/commit:88bce7c8dcf5bef3b6ba4933eec86b5de10d5898) Merged-In: Ia125e1b6326badaef1278d94850c74cfcc2faa82 Change-Id: Ia125e1b6326badaef1278d94850c74cfcc2faa82 --- arch/arm64/configs/microdroid_defconfig | 1 + arch/x86/configs/microdroid_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index b84a06731421d..3c7760d370c16 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -65,6 +65,7 @@ CONFIG_LRU_GEN=y CONFIG_NET=y CONFIG_UNIX=y CONFIG_INET=y +# CONFIG_IPV6 is not set CONFIG_VSOCKETS=y CONFIG_VIRTIO_VSOCKETS=y # CONFIG_WIRELESS is not set diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index b9edfcfb473cd..df694017ac134 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -68,6 +68,7 @@ CONFIG_DAMON_RECLAIM=y CONFIG_NET=y CONFIG_UNIX=y CONFIG_INET=y +# CONFIG_IPV6 is not set CONFIG_VSOCKETS=y CONFIG_VIRTIO_VSOCKETS=y # CONFIG_WIRELESS is not set -- GitLab From 90f9bd8552edecb27cd215fe6488a51400694a64 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Mon, 28 Jul 2025 22:09:46 +0000 Subject: [PATCH 2161/2211] ANDROID: Remove CONFIG_INET_DIAG from microdroid kernels This feature is not needed in microdroid, so remove it. Bug: 434256355 Signed-off-by: Isaac J. Manjarres (cherry picked from https://android-review.googlesource.com/q/commit:9ee492fee3ab8ebb364254bfad4e67e08873b597) Merged-In: I5ec0baaf722461532b76f629cb639051c8bd1a0d Change-Id: I5ec0baaf722461532b76f629cb639051c8bd1a0d --- arch/arm64/configs/microdroid_defconfig | 1 + arch/x86/configs/microdroid_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index 3c7760d370c16..12719503284a7 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -65,6 +65,7 @@ CONFIG_LRU_GEN=y CONFIG_NET=y CONFIG_UNIX=y CONFIG_INET=y +# CONFIG_INET_DIAG is not set # CONFIG_IPV6 is not set CONFIG_VSOCKETS=y CONFIG_VIRTIO_VSOCKETS=y diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index df694017ac134..87765c07d7c5c 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -68,6 +68,7 @@ CONFIG_DAMON_RECLAIM=y CONFIG_NET=y CONFIG_UNIX=y CONFIG_INET=y +# CONFIG_INET_DIAG is not set # CONFIG_IPV6 is not set CONFIG_VSOCKETS=y CONFIG_VIRTIO_VSOCKETS=y -- GitLab From e79536388fb65d52859abdf9b7e23a8ffb637d0a Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Mon, 28 Jul 2025 23:24:10 +0000 Subject: [PATCH 2162/2211] ANDROID: Remove CONFIG_ETHTOOL_NETLINK from microdroid kernels This feature is not needed for microdroid, so remove it. Bug: 434256355 Signed-off-by: Isaac J. Manjarres (cherry picked from https://android-review.googlesource.com/q/commit:5381fab07cd76ba794706a9fe7e2f3e44da19a1b) Merged-In: I2649a3daf9b498cf6fc04523ee4427d0541948bc Change-Id: I2649a3daf9b498cf6fc04523ee4427d0541948bc --- arch/arm64/configs/microdroid_defconfig | 1 + arch/x86/configs/microdroid_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index 12719503284a7..ec61318c7492a 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -70,6 +70,7 @@ CONFIG_INET=y CONFIG_VSOCKETS=y CONFIG_VIRTIO_VSOCKETS=y # CONFIG_WIRELESS is not set +# CONFIG_ETHTOOL_NETLINK is not set CONFIG_PCI=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index 87765c07d7c5c..baafc6ace4c7a 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -73,6 +73,7 @@ CONFIG_INET=y CONFIG_VSOCKETS=y CONFIG_VIRTIO_VSOCKETS=y # CONFIG_WIRELESS is not set +# CONFIG_ETHTOOL_NETLINK is not set CONFIG_PCI=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y -- GitLab From a650639daca2edee6a6127d22e47eb567f4e78d4 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Tue, 29 Jul 2025 01:35:34 +0000 Subject: [PATCH 2163/2211] ANDROID: Remove additional TCP congestion configs from microdroid These features aren't needed in microdroid so remove them. Bug: 434256355 Signed-off-by: Isaac J. Manjarres (cherry picked from https://android-review.googlesource.com/q/commit:c4165adf75728678ae0504a73e76e73ef03c651a) Merged-In: I1d2d50cdb59b88189ce113c18304fce265f34525 Change-Id: I1d2d50cdb59b88189ce113c18304fce265f34525 --- arch/arm64/configs/microdroid_defconfig | 5 +++++ arch/x86/configs/microdroid_defconfig | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index ec61318c7492a..df18097b7af88 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -66,6 +66,11 @@ CONFIG_NET=y CONFIG_UNIX=y CONFIG_INET=y # CONFIG_INET_DIAG is not set +CONFIG_TCP_CONG_ADVANCED=y +# CONFIG_TCP_CONG_BIC is not set +# CONFIG_TCP_CONG_CUBIC is not set +# CONFIG_TCP_CONG_WESTWOOD is not set +# CONFIG_TCP_CONG_HTCP is not set # CONFIG_IPV6 is not set CONFIG_VSOCKETS=y CONFIG_VIRTIO_VSOCKETS=y diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index baafc6ace4c7a..52e47e4dbc3c6 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -69,6 +69,11 @@ CONFIG_NET=y CONFIG_UNIX=y CONFIG_INET=y # CONFIG_INET_DIAG is not set +CONFIG_TCP_CONG_ADVANCED=y +# CONFIG_TCP_CONG_BIC is not set +# CONFIG_TCP_CONG_CUBIC is not set +# CONFIG_TCP_CONG_WESTWOOD is not set +# CONFIG_TCP_CONG_HTCP is not set # CONFIG_IPV6 is not set CONFIG_VSOCKETS=y CONFIG_VIRTIO_VSOCKETS=y -- GitLab From 7f13e3e2368ee8d0ce92a72b3280fbec07c0abdf Mon Sep 17 00:00:00 2001 From: Sebastian Ene Date: Wed, 23 Jul 2025 10:53:26 +0000 Subject: [PATCH 2164/2211] ANDROID: KVM: arm64: Don't copy pvmfw pages more than once If a pvmfw page is relinquished from the guest back to the host, disable subsequent re-faulting of the pvmfw image for the pVM if a new page is donated back to the same IPA region. Bug: 432439762 Change-Id: Ibe7ba22bc19cad0a7c31dedae64c29e10537b669 Signed-off-by: Sebastian Ene --- arch/arm64/kvm/hyp/nvhe/mem_protect.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c index bec0ebf25e804..745c52300a95e 100644 --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c @@ -440,6 +440,10 @@ int __pkvm_guest_relinquish_to_host(struct pkvm_hyp_vcpu *vcpu, psci_mem_protect_dec(1); WARN_ON(host_stage2_set_owner_locked(phys, PAGE_SIZE, PKVM_ID_HOST)); + + if (pkvm_ipa_range_has_pvmfw(vm, ipa, ipa + PAGE_SIZE)) + vm->kvm.arch.pkvm.pvmfw_load_addr = PVMFW_INVALID_LOAD_ADDR; + end: guest_unlock_component(vm); host_unlock_component(); -- GitLab From d6ad6516b8165956d410341f12ac198cb0797681 Mon Sep 17 00:00:00 2001 From: "guo88.liu" Date: Mon, 28 Jul 2025 18:07:28 +0800 Subject: [PATCH 2165/2211] ANDROID: GKI: update exynos symbol list 1 function symbol(s) added 'int of_irq_to_resource(struct device_node*, int, struct resource*)' Bug: 434614646 Signed-off-by: guo88.liu Change-Id: I9583a5ff8d7f6b592a58738c62a3bdcdbe4f6b6c --- gki/aarch64/symbols/exynos | 1 + 1 file changed, 1 insertion(+) diff --git a/gki/aarch64/symbols/exynos b/gki/aarch64/symbols/exynos index 8781a3df83fbb..4035015e87cb4 100644 --- a/gki/aarch64/symbols/exynos +++ b/gki/aarch64/symbols/exynos @@ -2147,6 +2147,7 @@ irq_get_irqchip_state kthread_park kthread_unpark + of_irq_to_resource of_property_read_variable_u16_array pcim_enable_device pcim_iomap_regions -- GitLab From 196f030712e556453deb0a30ed7465ea9ac8f4f4 Mon Sep 17 00:00:00 2001 From: renchenghan Date: Tue, 29 Jul 2025 19:45:01 +0800 Subject: [PATCH 2166/2211] ANDROID: GKI: add fair task core selection logic vendor hooks. The hook we added allows prioritization of task selection from our own queue, reducing the overhead of task selection while optimizing the logic for load balancing and selecting important tasks. Bug: 434879809 Signed-off-by: renchenghan Change-Id: Iec0292d0c991c69d48771ee4568ca8393b96cca8 --- include/trace/hooks/sched.h | 9 +++++++++ kernel/sched/fair.c | 10 +++++++--- kernel/sched/vendor_hooks.c | 4 ++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index faf0d91160db4..f0d0f15c535ac 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -387,6 +387,15 @@ DECLARE_RESTRICTED_HOOK(android_rvh_remove_entity_load_avg, TP_PROTO(struct cfs_rq *cfs_rq, struct sched_entity *se), TP_ARGS(cfs_rq, se), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_before_pick_task_fair, + TP_PROTO(struct rq *rq, struct task_struct **p, + struct task_struct *prev, struct rq_flags *rf), + TP_ARGS(rq, p, prev, rf), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_balance_fair, + TP_PROTO(struct rq *rq, struct task_struct *prev, struct rq_flags *rf), + TP_ARGS(rq, prev, rf), 1); + struct affinity_context; DECLARE_RESTRICTED_HOOK(android_rvh_set_cpus_allowed_ptr, TP_PROTO(struct task_struct *p, struct affinity_context *ctx, bool *skip_user_ptr), diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 1d091b3e200cf..03f211423017a 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -8961,6 +8961,7 @@ static void set_cpus_allowed_fair(struct task_struct *p, struct affinity_context static int balance_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) { + trace_android_rvh_balance_fair(rq, prev, rf); if (sched_fair_runnable(rq)) return 1; @@ -9120,12 +9121,15 @@ struct task_struct * pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) { struct sched_entity *se; - struct task_struct *p; + struct task_struct *p = NULL; int new_tasks; again: - p = pick_task_fair(rq); - trace_android_rvh_replace_next_task_fair(rq, &p, prev); + trace_android_rvh_before_pick_task_fair(rq, &p, prev, rf); + if (!p) { + p = pick_task_fair(rq); + trace_android_rvh_replace_next_task_fair(rq, &p, prev); + } if (!p) goto idle; diff --git a/kernel/sched/vendor_hooks.c b/kernel/sched/vendor_hooks.c index 7a14bff676550..cb1d6f57cf85f 100644 --- a/kernel/sched/vendor_hooks.c +++ b/kernel/sched/vendor_hooks.c @@ -134,5 +134,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_sugov_sched_attr); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_iowait); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_uclamp_validate); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_util_fits_cpu); - - +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_before_pick_task_fair); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_balance_fair); -- GitLab From e24b0a3d324b3d8cf5abed53f562423e200dcad9 Mon Sep 17 00:00:00 2001 From: renchenghan Date: Tue, 29 Jul 2025 20:16:22 +0800 Subject: [PATCH 2167/2211] ANDROID: GKI: update symbol list for vivo 2 function symbol(s) added 'int __traceiter_android_rvh_balance_fair(void*, struct rq*, struct task_struct*, struct rq_flags*)' 'int __traceiter_android_rvh_before_pick_task_fair(void*, struct rq*, struct task_struct**, struct task_struct*, struct rq_flags*)' 2 variable symbol(s) added 'struct tracepoint __tracepoint_android_rvh_balance_fair' 'struct tracepoint __tracepoint_android_rvh_before_pick_task_fair' Bug: 434879809 Signed-off-by: renchenghan Change-Id: If8bcd0f24e164dbb96318526d00fc2876d590b71 --- gki/aarch64/abi.stg | 57 ++++++++++++++++++++++++++++++++++++++++ gki/aarch64/symbols/vivo | 4 +++ 2 files changed, 61 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 00de3eaa8f0f6..6cacaeecaaa11 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -408107,6 +408107,14 @@ function { parameter_id: 0xf435685e parameter_id: 0x15afc3b7 } +function { + id: 0x9b1007fb + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x2e029f76 + parameter_id: 0x1d19a9d5 + parameter_id: 0x3c63caea +} function { id: 0x9b10b4a6 return_type_id: 0x6720d32f @@ -408213,6 +408221,15 @@ function { parameter_id: 0x0dd653d2 parameter_id: 0x1d19a9d5 } +function { + id: 0x9b14bef4 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x2e029f76 + parameter_id: 0x0dd653d2 + parameter_id: 0x1d19a9d5 + parameter_id: 0x3c63caea +} function { id: 0x9b153afe return_type_id: 0x6720d32f @@ -430420,6 +430437,15 @@ elf_symbol { type_id: 0x9b96d02c full_name: "__traceiter_android_rvh_attach_entity_load_avg" } +elf_symbol { + id: 0x965ea17d + name: "__traceiter_android_rvh_balance_fair" + is_defined: true + symbol_type: FUNCTION + crc: 0x08a8df2b + type_id: 0x9b1007fb + full_name: "__traceiter_android_rvh_balance_fair" +} elf_symbol { id: 0x144db0a1 name: "__traceiter_android_rvh_before_do_sched_yield" @@ -430429,6 +430455,15 @@ elf_symbol { type_id: 0x9b79f498 full_name: "__traceiter_android_rvh_before_do_sched_yield" } +elf_symbol { + id: 0x166cd967 + name: "__traceiter_android_rvh_before_pick_task_fair" + is_defined: true + symbol_type: FUNCTION + crc: 0x634c1996 + type_id: 0x9b14bef4 + full_name: "__traceiter_android_rvh_before_pick_task_fair" +} elf_symbol { id: 0x45d9286c name: "__traceiter_android_rvh_bitmap_find_best_next_area" @@ -436738,6 +436773,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_rvh_attach_entity_load_avg" } +elf_symbol { + id: 0x06c757e7 + name: "__tracepoint_android_rvh_balance_fair" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_rvh_balance_fair" +} elf_symbol { id: 0xd7757253 name: "__tracepoint_android_rvh_before_do_sched_yield" @@ -436747,6 +436791,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_rvh_before_do_sched_yield" } +elf_symbol { + id: 0xd4910655 + name: "__tracepoint_android_rvh_before_pick_task_fair" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_rvh_before_pick_task_fair" +} elf_symbol { id: 0xf3e9287e name: "__tracepoint_android_rvh_bitmap_find_best_next_area" @@ -509452,7 +509505,9 @@ interface { symbol_id: 0xef79dd4d symbol_id: 0x0b48afa1 symbol_id: 0x6d4cc1a2 + symbol_id: 0x965ea17d symbol_id: 0x144db0a1 + symbol_id: 0x166cd967 symbol_id: 0x45d9286c symbol_id: 0x7b2cd91d symbol_id: 0x192bbbd5 @@ -510154,7 +510209,9 @@ interface { symbol_id: 0x0b219d2b symbol_id: 0x748c1fd7 symbol_id: 0xc9400cec + symbol_id: 0x06c757e7 symbol_id: 0xd7757253 + symbol_id: 0xd4910655 symbol_id: 0xf3e9287e symbol_id: 0x1bc75987 symbol_id: 0x1e8a7e23 diff --git a/gki/aarch64/symbols/vivo b/gki/aarch64/symbols/vivo index 672dfc8528883..db2ab3732fd94 100644 --- a/gki/aarch64/symbols/vivo +++ b/gki/aarch64/symbols/vivo @@ -79,6 +79,8 @@ __traceiter_android_rvh_alloc_pages_reclaim_cycle_end __traceiter_android_rvh_alloc_pages_reclaim_start __traceiter_android_rvh_bpf_skb_load_bytes + __traceiter_android_rvh_balance_fair + __traceiter_android_rvh_before_pick_task_fair __traceiter_android_vh_throttle_direct_reclaim_bypass __traceiter_android_vh_count_workingset_refault __traceiter_android_rvh_cpufreq_transition @@ -192,6 +194,8 @@ __tracepoint_android_rvh_alloc_pages_reclaim_cycle_end __tracepoint_android_rvh_alloc_pages_reclaim_start __tracepoint_android_rvh_bpf_skb_load_bytes + __tracepoint_android_rvh_balance_fair + __tracepoint_android_rvh_before_pick_task_fair __tracepoint_android_vh_throttle_direct_reclaim_bypass __tracepoint_android_vh_count_workingset_refault __tracepoint_android_rvh_cpufreq_transition -- GitLab From cab1c944469e49a7c1a4b40080cfbb67130b2d11 Mon Sep 17 00:00:00 2001 From: John Stultz Date: Tue, 29 Jul 2025 23:21:23 +0000 Subject: [PATCH 2168/2211] ANDROID: sched: Remove set_blocked_on_waking_nested() warning In e740e8d9eab4 ("ANDROID: Sync proxy-exec logic to v19 (from v18)"), I consolidated logic in both __ww_mutex_wound() and __ww_mutex_die() to use a new set_blocked_on_waking_nested() helper. This helper included a WARN_ON() used in __ww_mutex_die(), but this assertion isn't generally true in the __ww_mutex_wound() case, but adding the helper caused it to be used in both. So drop the warning from the set_blocked_on_waking_nested() helper. This was already addressed in the v20 series of the proxy-exec patch set, along with other cleanups, but I missed that I should port it to andorid16-6.12. Since the v20 change is a little more complex, and vendors are hitting this right now, this patch simply drops the incorrect warning. Bug: 434841783 Fixes: e740e8d9eab4 ("ANDROID: Sync proxy-exec logic to v19 (from v18)") Change-Id: I8f611b60b855cdf81af84ad9c575117340431848 Signed-off-by: John Stultz --- include/linux/sched.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index 88c1d6286af30..94213abdebe41 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2249,7 +2249,6 @@ static inline struct mutex *__get_task_blocked_on(struct task_struct *p) static inline void set_blocked_on_waking_nested(struct task_struct *p, struct mutex *m) { raw_spin_lock_nested(&p->blocked_lock, SINGLE_DEPTH_NESTING); - WARN_ON_ONCE(__get_task_blocked_on(p) != m); __set_blocked_on_waking(p); raw_spin_unlock(&p->blocked_lock); } -- GitLab From b85940e9fff9236534a5800d849e906fa99ee2d7 Mon Sep 17 00:00:00 2001 From: Sooyong Suk Date: Thu, 24 Jul 2025 08:54:46 +0900 Subject: [PATCH 2169/2211] ANDROID: mm: add vendor hook to allow nonworkingset for gcma Gcma put page is only allowing workingset pages by default to increase cleancache hit ratio. On my device, the utilization ratio of the gcma area as cached pages is really low like almost zero. So I'd like to add a vendor hook to allow non-workingset pages when gcma usage is low. Bug: 433652944 Change-Id: I43a3900db416b2af6758d8b8905299eba0e38f39 Signed-off-by: Sooyong Suk --- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/mm.h | 3 +++ mm/gcma.c | 8 +++++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index b3b8f473193e8..8ab75d4316e20 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -581,6 +581,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shrink_node); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpuset_fork); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_uid); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_user); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gcma_cc_allow_nonworkingset); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gcma_cc_store_page_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gzvm_vcpu_exit_reason); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gzvm_handle_demand_page_pre); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index b348f20eaf0be..d5515ab486fcd 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -540,6 +540,9 @@ DECLARE_HOOK(android_vh_filemap_add_folio, TP_PROTO(struct address_space *mapping, struct folio *folio, pgoff_t index), TP_ARGS(mapping, folio, index)); +DECLARE_HOOK(android_vh_gcma_cc_allow_nonworkingset, + TP_PROTO(bool *allow_nonworkingset), + TP_ARGS(allow_nonworkingset)); DECLARE_HOOK(android_vh_gcma_cc_store_page_bypass, TP_PROTO(bool *bypass), TP_ARGS(bypass)); diff --git a/mm/gcma.c b/mm/gcma.c index 6a2eef774f80f..2542071165d1a 100644 --- a/mm/gcma.c +++ b/mm/gcma.c @@ -752,6 +752,7 @@ static void gcma_cc_store_page(int hash_id, struct cleancache_filekey key, bool is_new = false; bool workingset = PageWorkingset(page); bool bypass = false; + bool allow_nonworkingset = false; trace_android_vh_gcma_cc_store_page_bypass(&bypass); if (bypass) @@ -767,10 +768,11 @@ static void gcma_cc_store_page(int hash_id, struct cleancache_filekey key, if (!gcma_fs) return; + trace_android_vh_gcma_cc_allow_nonworkingset(&allow_nonworkingset); find_inode: inode = find_and_get_gcma_inode(gcma_fs, &key); if (!inode) { - if (!workingset) + if (!workingset && !allow_nonworkingset) return; inode = add_gcma_inode(gcma_fs, &key); if (!IS_ERR(inode)) @@ -789,14 +791,14 @@ load_page: xa_lock(&inode->pages); g_page = xa_load(&inode->pages, offset); if (g_page) { - if (!workingset) { + if (!workingset && !allow_nonworkingset) { gcma_erase_page(inode, offset, g_page, true); goto out_unlock; } goto copy; } - if (!workingset) + if (!workingset && !allow_nonworkingset) goto out_unlock; g_page = gcma_alloc_page(); -- GitLab From f4ada86fbba535ce7b269d47ff5e790096ccb330 Mon Sep 17 00:00:00 2001 From: Sooyong Suk Date: Thu, 24 Jul 2025 10:04:32 +0900 Subject: [PATCH 2170/2211] ANDROID: GKI: update symbol list for galaxy 1 function symbol(s) added 'int __traceiter_android_vh_gcma_cc_allow_nonworkingset(void*, bool*)' 1 variable symbol(s) added 'struct tracepoint __tracepoint_android_vh_gcma_cc_allow_nonworkingset' Bug: 433652944 Change-Id: I891818c3ed176090bb6dded8586375c02a5ab038 Signed-off-by: Sooyong Suk --- gki/aarch64/abi.stg | 20 ++++++++++++++++++++ gki/aarch64/symbols/galaxy | 2 ++ 2 files changed, 22 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 6cacaeecaaa11..a8e9c69759eb5 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -433479,6 +433479,15 @@ elf_symbol { type_id: 0x9a2af11b full_name: "__traceiter_android_vh_futex_wake_up_q_finish" } +elf_symbol { + id: 0x92441782 + name: "__traceiter_android_vh_gcma_cc_allow_nonworkingset" + is_defined: true + symbol_type: FUNCTION + crc: 0x81bcf130 + type_id: 0x9be885da + full_name: "__traceiter_android_vh_gcma_cc_allow_nonworkingset" +} elf_symbol { id: 0x8eab4d2c name: "__traceiter_android_vh_gcma_cc_store_page_bypass" @@ -439815,6 +439824,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_futex_wake_up_q_finish" } +elf_symbol { + id: 0x0b5a1838 + name: "__tracepoint_android_vh_gcma_cc_allow_nonworkingset" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_gcma_cc_allow_nonworkingset" +} elf_symbol { id: 0xf4cbea52 name: "__tracepoint_android_vh_gcma_cc_store_page_bypass" @@ -509843,6 +509861,7 @@ interface { symbol_id: 0xff623c2f symbol_id: 0x7fef736f symbol_id: 0x9fe60f0c + symbol_id: 0x92441782 symbol_id: 0x8eab4d2c symbol_id: 0x83b45f32 symbol_id: 0x88586647 @@ -510547,6 +510566,7 @@ interface { symbol_id: 0x0c310ebd symbol_id: 0x9b384a49 symbol_id: 0x828646be + symbol_id: 0x0b5a1838 symbol_id: 0xf4cbea52 symbol_id: 0x4756cfec symbol_id: 0xf18e312d diff --git a/gki/aarch64/symbols/galaxy b/gki/aarch64/symbols/galaxy index 0270d25119e14..e7c53734cf917 100644 --- a/gki/aarch64/symbols/galaxy +++ b/gki/aarch64/symbols/galaxy @@ -54,6 +54,7 @@ __traceiter_android_vh_filemap_read __traceiter_android_vh_free_pages_ok_bypass __traceiter_android_vh_free_pages_prepare_bypass + __traceiter_android_vh_gcma_cc_allow_nonworkingset __traceiter_android_vh_gcma_cc_store_page_bypass __traceiter_android_vh_is_fpsimd_save __traceiter_android_vh_logbuf @@ -101,6 +102,7 @@ __tracepoint_android_vh_filemap_read __tracepoint_android_vh_free_pages_ok_bypass __tracepoint_android_vh_free_pages_prepare_bypass + __tracepoint_android_vh_gcma_cc_allow_nonworkingset __tracepoint_android_vh_gcma_cc_store_page_bypass __tracepoint_android_vh_is_fpsimd_save __tracepoint_android_vh_logbuf -- GitLab From daadcbc8a27cc647259e7864f00b038c5705a2ef Mon Sep 17 00:00:00 2001 From: Sooyong Suk Date: Wed, 23 Jul 2025 13:06:46 +0900 Subject: [PATCH 2171/2211] ANDROID: mm: add vendor hook in free_unref_folios and free_unref_page A vendor hook to bypass free_one_page() via __free_pages_ok() was added via https://android-review.googlesource.com/c/kernel/common/+/3458032 for vendor modules to hook pages on certain conditions to use later instead of freeing pages directly. In kernel v6.12, for same purpose, free_unref_folios() and free_unref_page() path also needs same vendor hook to bypass free_one_page(). Bug: 410432482 Change-Id: I1863eb497eee796903b483a3a9f8808ab372b475 Signed-off-by: Sooyong Suk --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/mm.h | 6 ++++++ mm/page_alloc.c | 10 ++++++++++ 3 files changed, 18 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 8ab75d4316e20..bd180cdeab90e 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -454,6 +454,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_pageout_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_cold_or_pageout_abort); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_pages_prepare_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_pages_ok_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_page_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_folio_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_split_large_folio_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_should_be_protected); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_referenced_check_bypass); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index d5515ab486fcd..dfd69fa48a3cc 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -346,6 +346,12 @@ DECLARE_HOOK(android_vh_free_pages_ok_bypass, TP_PROTO(struct page *page, unsigned int order, int __bitwise flags, bool *skip_free_pages_ok), TP_ARGS(page, order, flags, skip_free_pages_ok)); +DECLARE_HOOK(android_vh_free_page_bypass, + TP_PROTO(struct page *page, unsigned int order, bool *skip_free_page), + TP_ARGS(page, order, skip_free_page)); +DECLARE_HOOK(android_vh_free_folio_bypass, + TP_PROTO(struct folio *folio, unsigned int order, bool *skip_free_folio), + TP_ARGS(folio, order, skip_free_folio)); DECLARE_HOOK(android_vh_free_pages_prepare_init, TP_PROTO(struct page *page, int nr_pages, bool *init), TP_ARGS(page, nr_pages, init)); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a996c6fb107c4..d395554b7f70e 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2797,6 +2797,7 @@ void free_unref_page(struct page *page, unsigned int order) unsigned long pfn = page_to_pfn(page); int migratetype; bool skip_free_unref_page = false; + bool skip_free_page = false; if (!pcp_allowed_order(order)) { __free_pages_ok(page, order, FPI_NONE); @@ -2806,6 +2807,9 @@ void free_unref_page(struct page *page, unsigned int order) if (!free_pages_prepare(page, order)) return; + trace_android_vh_free_page_bypass(page, order, &skip_free_page); + if (skip_free_page) + return; /* * We only track unmovable, reclaimable, movable and if restrict cma * fallback flag is set, CMA on pcp lists. @@ -2857,9 +2861,15 @@ void free_unref_folios(struct folio_batch *folios) struct folio *folio = folios->folios[i]; unsigned long pfn = folio_pfn(folio); unsigned int order = folio_order(folio); + bool skip_free_folio = false; if (!free_pages_prepare(&folio->page, order)) continue; + + trace_android_vh_free_folio_bypass(folio, order, + &skip_free_folio); + if (skip_free_folio) + continue; /* * Free orders not handled on the PCP directly to the * allocator. -- GitLab From e06733ed385198e74964bdbf4fa9fdc4c2e74929 Mon Sep 17 00:00:00 2001 From: Sooyong Suk Date: Mon, 28 Jul 2025 12:59:50 +0900 Subject: [PATCH 2172/2211] ANDROID: GKI: update symbol list for galaxy 2 function symbol(s) added 'int __traceiter_android_vh_free_folio_bypass(void*, struct folio*, unsigned int, bool*)' 'int __traceiter_android_vh_free_page_bypass(void*, struct page*, unsigned int, bool*)' 2 variable symbol(s) added 'struct tracepoint __tracepoint_android_vh_free_folio_bypass' 'struct tracepoint __tracepoint_android_vh_free_page_bypass' Bug: 410432482 Change-Id: I9df2bd65c4d9e0be27f36a5f7742b705b48f5ae2 Signed-off-by: Sooyong Suk --- gki/aarch64/abi.stg | 48 ++++++++++++++++++++++++++++++++++++++ gki/aarch64/symbols/galaxy | 4 ++++ 2 files changed, 52 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index a8e9c69759eb5..86c5a403c9eee 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -408769,6 +408769,14 @@ function { return_type_id: 0x6720d32f parameter_id: 0x1aeeade4 } +function { + id: 0x9b3b5f44 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x2170d06d + parameter_id: 0x4585663f + parameter_id: 0x11cfee5a +} function { id: 0x9b3c0938 return_type_id: 0x6720d32f @@ -433245,6 +433253,15 @@ elf_symbol { type_id: 0x9bf18f52 full_name: "__traceiter_android_vh_filemap_update_page" } +elf_symbol { + id: 0xe78b407f + name: "__traceiter_android_vh_free_folio_bypass" + is_defined: true + symbol_type: FUNCTION + crc: 0xdde62b34 + type_id: 0x9b3b5f44 + full_name: "__traceiter_android_vh_free_folio_bypass" +} elf_symbol { id: 0x9e91661b name: "__traceiter_android_vh_free_oem_binder_struct" @@ -433263,6 +433280,15 @@ elf_symbol { type_id: 0x9bb6ab04 full_name: "__traceiter_android_vh_free_one_page_bypass" } +elf_symbol { + id: 0xc7eb4ba6 + name: "__traceiter_android_vh_free_page_bypass" + is_defined: true + symbol_type: FUNCTION + crc: 0xf71eed72 + type_id: 0x9ba4917f + full_name: "__traceiter_android_vh_free_page_bypass" +} elf_symbol { id: 0xcbee3d67 name: "__traceiter_android_vh_free_pages_ok_bypass" @@ -439590,6 +439616,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_filemap_update_page" } +elf_symbol { + id: 0x63048a89 + name: "__tracepoint_android_vh_free_folio_bypass" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_free_folio_bypass" +} elf_symbol { id: 0x901d0e89 name: "__tracepoint_android_vh_free_oem_binder_struct" @@ -439608,6 +439643,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_free_one_page_bypass" } +elf_symbol { + id: 0x73c6d79c + name: "__tracepoint_android_vh_free_page_bypass" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_free_page_bypass" +} elf_symbol { id: 0x770fd919 name: "__tracepoint_android_vh_free_pages_ok_bypass" @@ -509835,8 +509879,10 @@ interface { symbol_id: 0xb7d91f76 symbol_id: 0x158bf9d3 symbol_id: 0x0e217a5e + symbol_id: 0xe78b407f symbol_id: 0x9e91661b symbol_id: 0xc189c2a7 + symbol_id: 0xc7eb4ba6 symbol_id: 0xcbee3d67 symbol_id: 0x26a07b7d symbol_id: 0x02fa90e7 @@ -510540,8 +510586,10 @@ interface { symbol_id: 0xb34d9200 symbol_id: 0xf61927fd symbol_id: 0xa8c30e54 + symbol_id: 0x63048a89 symbol_id: 0x901d0e89 symbol_id: 0x04a824b5 + symbol_id: 0x73c6d79c symbol_id: 0x770fd919 symbol_id: 0x9afee12f symbol_id: 0x55b68bc5 diff --git a/gki/aarch64/symbols/galaxy b/gki/aarch64/symbols/galaxy index e7c53734cf917..3af170c1285b8 100644 --- a/gki/aarch64/symbols/galaxy +++ b/gki/aarch64/symbols/galaxy @@ -53,6 +53,8 @@ __traceiter_android_vh_filemap_map_pages __traceiter_android_vh_filemap_read __traceiter_android_vh_free_pages_ok_bypass + __traceiter_android_vh_free_page_bypass + __traceiter_android_vh_free_folio_bypass __traceiter_android_vh_free_pages_prepare_bypass __traceiter_android_vh_gcma_cc_allow_nonworkingset __traceiter_android_vh_gcma_cc_store_page_bypass @@ -101,6 +103,8 @@ __tracepoint_android_vh_filemap_map_pages __tracepoint_android_vh_filemap_read __tracepoint_android_vh_free_pages_ok_bypass + __tracepoint_android_vh_free_page_bypass + __tracepoint_android_vh_free_folio_bypass __tracepoint_android_vh_free_pages_prepare_bypass __tracepoint_android_vh_gcma_cc_allow_nonworkingset __tracepoint_android_vh_gcma_cc_store_page_bypass -- GitLab From c98acaeb71d41c3b6b25b1afa7c7911985ef019d Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Mon, 28 Jul 2025 21:37:26 +0000 Subject: [PATCH 2173/2211] FROMGIT: f2fs: drop inode from the donation list when the last file is closed Let's drop the inode from the donation list when there is no other open file. Bug: 434260110 (cherry picked from commit 078cad8212ce4f4ebbafcc0936475b8215e1ca2a https: //git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git dev) Link: https://lore.kernel.org/linux-f2fs-devel/20250729204719.1253285-1-jaegeuk@kernel.org/ Change-Id: Ic853b8529d4da0020d10b39f08b5d0619b66b870 Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim --- fs/f2fs/f2fs.h | 2 ++ fs/f2fs/file.c | 8 +++++++- fs/f2fs/inode.c | 2 +- fs/f2fs/super.c | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index fd22fc03651d2..f10d202a66f70 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -864,6 +864,7 @@ struct f2fs_inode_info { /* linked in global inode list for cache donation */ struct list_head gdonate_list; pgoff_t donate_start, donate_end; /* inclusive */ + atomic_t open_count; /* # of open files */ struct task_struct *atomic_write_task; /* store atomic write task */ struct extent_tree *extent_tree[NR_EXTENT_CACHES]; @@ -3646,6 +3647,7 @@ int f2fs_try_to_free_nats(struct f2fs_sb_info *sbi, int nr_shrink); void f2fs_update_inode(struct inode *inode, struct page *node_page); void f2fs_update_inode_page(struct inode *inode); int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc); +void f2fs_remove_donate_inode(struct inode *inode); void f2fs_evict_inode(struct inode *inode); void f2fs_handle_failed_inode(struct inode *inode); diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 0af6ec5181667..87ea9ecb9d50f 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -633,7 +633,10 @@ static int f2fs_file_open(struct inode *inode, struct file *filp) if (err) return err; - return finish_preallocate_blocks(inode); + err = finish_preallocate_blocks(inode); + if (!err) + atomic_inc(&F2FS_I(inode)->open_count); + return err; } void f2fs_truncate_data_blocks_range(struct dnode_of_data *dn, int count) @@ -2031,6 +2034,9 @@ out: static int f2fs_release_file(struct inode *inode, struct file *filp) { + if (atomic_dec_and_test(&F2FS_I(inode)->open_count)) + f2fs_remove_donate_inode(inode); + /* * f2fs_release_file is called at every close calls. So we should * not drop any inmemory pages by close called by other process. diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index f5991e8751b9b..2d71ff200ddbb 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -821,7 +821,7 @@ int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc) return 0; } -static void f2fs_remove_donate_inode(struct inode *inode) +void f2fs_remove_donate_inode(struct inode *inode) { struct f2fs_sb_info *sbi = F2FS_I_SB(inode); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 3a541ebdd5222..a5ece59379ed3 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1443,6 +1443,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb) /* Initialize f2fs-specific inode info */ atomic_set(&fi->dirty_pages, 0); atomic_set(&fi->i_compr_blocks, 0); + atomic_set(&fi->open_count, 0); init_f2fs_rwsem(&fi->i_sem); spin_lock_init(&fi->i_size_lock); INIT_LIST_HEAD(&fi->dirty_list); -- GitLab From d403a094053f17c4351acb90576429bf412e0391 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Tue, 1 Jul 2025 18:35:42 +0000 Subject: [PATCH 2174/2211] ANDROID: KVM: arm64: use hyp_trace_raw_fops for trace_pipe_raw The trace_pipe_raw interface is expected to return binary trace format, while hyp_trace_pipe_fops returns the text trace format. This patch change trace_pipe_raw fops hyp_trace_raw_fops which provides the binary output. Bug: 428904926 Test: presubmit Change-Id: Id72d2c7df366934f00b17674078c94c2b2d288be Signed-off-by: Nikita Ioffe (cherry picked from commit 6d27de405aaf6127f4b7184a8377813eb2a030a5) --- arch/arm64/kvm/hyp_trace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp_trace.c b/arch/arm64/kvm/hyp_trace.c index 5ae756241dc76..100927f9a3a55 100644 --- a/arch/arm64/kvm/hyp_trace.c +++ b/arch/arm64/kvm/hyp_trace.c @@ -1039,7 +1039,7 @@ int hyp_trace_init_tracefs(void) (void *)cpu, &hyp_trace_pipe_fops); tracefs_create_file("trace_pipe_raw", TRACEFS_MODE_READ, per_cpu_dir, - (void *)cpu, &hyp_trace_pipe_fops); + (void *)cpu, &hyp_trace_raw_fops); tracefs_create_file("trace", TRACEFS_MODE_READ, per_cpu_dir, (void *)cpu, &hyp_trace_fops); -- GitLab From ce2b0625808657adedd177fc008f9d4ebaf471a4 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Fri, 18 Jul 2025 13:43:34 +0000 Subject: [PATCH 2175/2211] ANDROID: KVM: arm64: use ring_buffer_page_data in hyp_trace_raw_read In 6.12 kernel version the `struct buffer_data_read_page` changed and now in order to access the data of the page one should call the newly added `ring_buffer_read_page_data` function. Bug: 428904926 Test: presubmit Test: boot qemu & check reading trace_pipe_raw doesn't cause panic Change-Id: Ia7d1b5fff35c0ed8f4aeb9ffc5a7c01efaacfac7 Signed-off-by: Nikita Ioffe --- arch/arm64/kvm/hyp_trace.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp_trace.c b/arch/arm64/kvm/hyp_trace.c index 100927f9a3a55..d41c2a8ef3128 100644 --- a/arch/arm64/kvm/hyp_trace.c +++ b/arch/arm64/kvm/hyp_trace.c @@ -758,6 +758,7 @@ hyp_trace_raw_read(struct file *file, char __user *ubuf, struct ht_iterator *iter = (struct ht_iterator *)file->private_data; size_t size; int ret; + void *page_data; if (iter->copy_leftover) goto read; @@ -786,7 +787,9 @@ read: if (size > cnt) size = cnt; - ret = copy_to_user(ubuf, iter->spare + PAGE_SIZE - size, size); + page_data = ring_buffer_read_page_data( + (struct buffer_data_read_page *)iter->spare); + ret = copy_to_user(ubuf, page_data + PAGE_SIZE - size, size); if (ret == size) return -EFAULT; -- GitLab From b362680d4fa9007385dba830eff04fc841d830a5 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Fri, 18 Jul 2025 13:49:24 +0000 Subject: [PATCH 2176/2211] ANDROID: KVM: arm64: make per-cpu trace file read-write Userspace tools use the per-cpu trace file to clear the per-cpu trace buffer, hence the should be able to open it for writing. Bug: 428904926 Test: presubmit Change-Id: Ie19fdf0a235745bff04b3a904b04950964b3497a Signed-off-by: Nikita Ioffe --- arch/arm64/kvm/hyp_trace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp_trace.c b/arch/arm64/kvm/hyp_trace.c index d41c2a8ef3128..915bfdf57bca4 100644 --- a/arch/arm64/kvm/hyp_trace.c +++ b/arch/arm64/kvm/hyp_trace.c @@ -1044,7 +1044,7 @@ int hyp_trace_init_tracefs(void) tracefs_create_file("trace_pipe_raw", TRACEFS_MODE_READ, per_cpu_dir, (void *)cpu, &hyp_trace_raw_fops); - tracefs_create_file("trace", TRACEFS_MODE_READ, per_cpu_dir, + tracefs_create_file("trace", TRACEFS_MODE_WRITE, per_cpu_dir, (void *)cpu, &hyp_trace_fops); } -- GitLab From 1195471b193fbc088f191169070ac7ab2768a883 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Fri, 18 Jul 2025 13:53:06 +0000 Subject: [PATCH 2177/2211] ANDROID: KVM: arm64: allow trace file to be open for read Userspace tools might want to open trace files for read (e.g. to check if they have access to the tracing interface), so instead of returning -EPERM we make this a no-op. Bug: 428904926 Test: presubmit Change-Id: I32b1b6db543f462dc986578cebd803d8312fe6bb Signed-off-by: Nikita Ioffe --- arch/arm64/kvm/hyp_trace.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/arch/arm64/kvm/hyp_trace.c b/arch/arm64/kvm/hyp_trace.c index 915bfdf57bca4..9d6d77cd912a5 100644 --- a/arch/arm64/kvm/hyp_trace.c +++ b/arch/arm64/kvm/hyp_trace.c @@ -858,13 +858,10 @@ static int hyp_trace_open(struct inode *inode, struct file *file) { int cpu = (s64)inode->i_private; - if (file->f_mode & FMODE_WRITE) { + if (file->f_mode & FMODE_WRITE) hyp_trace_reset(cpu); - return 0; - } - - return -EPERM; + return 0; } static ssize_t hyp_trace_write(struct file *filp, const char __user *ubuf, -- GitLab From e3489f30ee7b813b09cc8c960f17a0ce0371ade9 Mon Sep 17 00:00:00 2001 From: Pengfei Li Date: Mon, 7 Jul 2025 15:10:58 +0800 Subject: [PATCH 2178/2211] ANDROID: mm: Added early_param pcp_thp_order Added early param "pcp_thp_order", which specifies the order of pcp used by THP. This allows vendors to customize the order different from HPAGE_PMD_ORDER for THP to use. Bug: 431672372 Change-Id: Id2c8f3b03b74added54827ffbc33fd4e4bdf619e Signed-off-by: Pengfei Li --- .../admin-guide/kernel-parameters.txt | 5 ++++ mm/page_alloc.c | 27 ++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index ab4c049faba92..97a787ca1ebfe 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -4759,6 +4759,11 @@ pcmv= [HW,PCMCIA] BadgePAD 4 + pcp_thp_order= [MM] + Specify the order of the pcp used by THP. + The specified value must be no greater than HPAGE_PMD_ORDER + (default) and greater than 3 (PAGE_ALLOC_COSTLY_ORDER). + pd_ignore_unused [PM] Keep all power-domains already enabled by bootloader on, diff --git a/mm/page_alloc.c b/mm/page_alloc.c index d395554b7f70e..da3ab3c781f99 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -599,6 +599,27 @@ out: add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE); } +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +static unsigned int pcp_thp_order __read_mostly = HPAGE_PMD_ORDER; + +static int __init parse_pcp_thp_order(char *s) +{ + int err; + unsigned int order; + + err = kstrtouint(s, 0, &order); + if (err) + return err; + + if (order <= PAGE_ALLOC_COSTLY_ORDER || order > HPAGE_PMD_ORDER) + return -EINVAL; + + pcp_thp_order = order; + return 0; +} +early_param("pcp_thp_order", parse_pcp_thp_order); +#endif + static inline unsigned int order_to_pindex(int migratetype, int order) { bool __maybe_unused movable; @@ -614,7 +635,7 @@ static inline unsigned int order_to_pindex(int migratetype, int order) #ifdef CONFIG_TRANSPARENT_HUGEPAGE if (order > PAGE_ALLOC_COSTLY_ORDER) { - VM_BUG_ON(order != HPAGE_PMD_ORDER); + VM_BUG_ON(order != pcp_thp_order); movable = migratetype == MIGRATE_MOVABLE; #ifdef CONFIG_CMA @@ -636,7 +657,7 @@ static inline int pindex_to_order(unsigned int pindex) #ifdef CONFIG_TRANSPARENT_HUGEPAGE if (pindex >= NR_LOWORDER_PCP_LISTS) - order = HPAGE_PMD_ORDER; + order = pcp_thp_order; #else VM_BUG_ON(order > PAGE_ALLOC_COSTLY_ORDER); #endif @@ -649,7 +670,7 @@ static inline bool pcp_allowed_order(unsigned int order) if (order <= PAGE_ALLOC_COSTLY_ORDER) return true; #ifdef CONFIG_TRANSPARENT_HUGEPAGE - if (order == HPAGE_PMD_ORDER) + if (order == pcp_thp_order) return true; #endif return false; -- GitLab From 97187b040e11b2a8a194ed29791de9b06e92e264 Mon Sep 17 00:00:00 2001 From: Pengfei Li Date: Mon, 14 Jul 2025 10:28:21 +0800 Subject: [PATCH 2179/2211] ANDROID: mm: Added zone_pageset_high_and_batch_update Added a new function zone_pageset_high_and_batch_update, which is like zone_pcp_update but with new high_min, high_max and batch values provided directly by the caller (rather than returned by zone_highsize). This gives vendors an interface to directly tune the pageset to suit varying loads. Bug: 431672372 Change-Id: Icd1e297f4cfb2309b36caa7f7c61b1c7c7cd9f24 Signed-off-by: Pengfei Li --- include/linux/mm.h | 3 +++ mm/page_alloc.c | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/linux/mm.h b/include/linux/mm.h index f767c5f1b7849..62b8f04034982 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4291,6 +4291,9 @@ void vma_pgtable_walk_end(struct vm_area_struct *vma); int reserve_mem_find_by_name(const char *name, phys_addr_t *start, phys_addr_t *size); +void zone_pageset_high_and_batch_update(struct zone *zone, int new_high_min, + int new_high_max, int new_batch); + #ifdef CONFIG_64BIT int do_mseal(unsigned long start, size_t len_in, unsigned long flags); #else diff --git a/mm/page_alloc.c b/mm/page_alloc.c index da3ab3c781f99..01e7586a7e11c 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -6217,6 +6217,22 @@ static void zone_pcp_update(struct zone *zone, int cpu_online) mutex_unlock(&pcp_batch_high_lock); } +void zone_pageset_high_and_batch_update(struct zone *zone, int new_high_min, + int new_high_max, int new_batch) +{ + mutex_lock(&pcp_batch_high_lock); + + zone->pageset_high_min = new_high_min; + zone->pageset_high_max = new_high_max; + zone->pageset_batch = new_batch; + + __zone_set_pageset_high_and_batch(zone, new_high_min, new_high_max, + new_batch); + + mutex_unlock(&pcp_batch_high_lock); +} +EXPORT_SYMBOL_GPL(zone_pageset_high_and_batch_update); + static void zone_pcp_update_cacheinfo(struct zone *zone, unsigned int cpu) { struct per_cpu_pages *pcp; -- GitLab From c04583979e3215e4df6025701502a3e638d25999 Mon Sep 17 00:00:00 2001 From: Pengfei Li Date: Mon, 21 Jul 2025 14:41:56 +0800 Subject: [PATCH 2180/2211] ANDROID: mm: Added memcg1_charge_batch Added a new function memcg1_charge_batch, which is called by the vendor's ko. It is similar to memcg1_commit_charge, but charges a batch of folios at a time. The reason for introducing it is that for a batch of folios, each call to memcg1_commit_charge will turn off and on interrupts, which will cause a large performance degradation. Bug: 431672372 Change-Id: I91712d02b7f119b7f35d33503c172d9753a9a69e Signed-off-by: Pengfei Li --- mm/memcontrol-v1.c | 11 +++++++++++ mm/memcontrol-v1.h | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/mm/memcontrol-v1.c b/mm/memcontrol-v1.c index ee63b827670d4..0497c3e428698 100644 --- a/mm/memcontrol-v1.c +++ b/mm/memcontrol-v1.c @@ -1562,6 +1562,17 @@ void memcg1_swapout(struct folio *folio, struct mem_cgroup *memcg) memcg1_check_events(memcg, folio_nid(folio)); } +void memcg1_charge_batch(struct mem_cgroup *memcg, unsigned long nr_memory, int nid) +{ + unsigned long flags; + + local_irq_save(flags); + memcg1_charge_statistics(memcg, nr_memory); + memcg1_check_events(memcg, nid); + local_irq_restore(flags); +} +EXPORT_SYMBOL_GPL(memcg1_charge_batch); + void memcg1_uncharge_batch(struct mem_cgroup *memcg, unsigned long pgpgout, unsigned long nr_memory, int nid) { diff --git a/mm/memcontrol-v1.h b/mm/memcontrol-v1.h index 6fbc78e0e440c..c4e8c4d903f8d 100644 --- a/mm/memcontrol-v1.h +++ b/mm/memcontrol-v1.h @@ -102,6 +102,7 @@ void memcg1_oom_recover(struct mem_cgroup *memcg); void memcg1_commit_charge(struct folio *folio, struct mem_cgroup *memcg); void memcg1_swapout(struct folio *folio, struct mem_cgroup *memcg); +void memcg1_charge_batch(struct mem_cgroup *memcg, unsigned long nr_memory, int nid); void memcg1_uncharge_batch(struct mem_cgroup *memcg, unsigned long pgpgout, unsigned long nr_memory, int nid); @@ -142,6 +143,9 @@ static inline void memcg1_commit_charge(struct folio *folio, static inline void memcg1_swapout(struct folio *folio, struct mem_cgroup *memcg) {} +static inline void memcg1_charge_batch(struct mem_cgroup *memcg, unsigned long nr_memory, + int nid) {} + static inline void memcg1_uncharge_batch(struct mem_cgroup *memcg, unsigned long pgpgout, unsigned long nr_memory, int nid) {} -- GitLab From 73c426b11f28690a937e5293fad0b22bd042733c Mon Sep 17 00:00:00 2001 From: Pengfei Li Date: Mon, 14 Jul 2025 16:02:10 +0800 Subject: [PATCH 2181/2211] ANDROID: vendor_hook: Added hook for memory allocation tuning The following hooks are added for memory allocation tuning: android_vh_mm_customize_alloc_anon_thp - When allocating anonymous folios, this hook will set different orders based on the importance of the processes. In particular, some critical processes will allocate folios directly in this hook to speed up memory allocation. android_vh_mm_customize_ac - In __alloc_pages_noprof, this hook provides the ability to modify alloc_context and alloc_flags to accommodate processes of different importance. android_vh_mm_customize_rmqueue - In rmqueue, this hook provides the ability to modify alloc_flags and migratetype, which will be used by vendors to customize alloc_flags and migratetype to speed up memory allocation. android_vh_mm_customize_suitable_zone - For some specific gfp_mask and order requests, this hook is used to skip zones that should not be allocated, and for some critical processes, the wmark limit is skipped and jumps to try_this_zone for allocation to prevent it from being stuck. android_vh_mm_customize_wmark_ok - Vendors use this hook to customize the return value of wmark_ok based on different payloads. android_vh_mm_customize_zone_max_order - This hook is used to limit the maximum order allowed for special zone. It reduces a lot of unnecessary repeated merges and splits (because large orders are rarely allocated). android_vh_mm_customize_zone_pageset - This hook allows vendors to customize the high and batch of pagesets. Bug: 431730501 Bug: 431672372 Change-Id: I65d6b2cd63688291e6360597bc2a4157fa228df7 Signed-off-by: Pengfei Li --- drivers/android/vendor_hooks.c | 7 +++++++ include/trace/hooks/mm.h | 26 +++++++++++++++++++++++ mm/memory.c | 8 ++++++- mm/page_alloc.c | 38 +++++++++++++++++++++++++++++++++- 4 files changed, 77 insertions(+), 2 deletions(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index bd180cdeab90e..8472847cbeddf 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -592,3 +592,10 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gzvm_destroy_vm_post_process); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_usb_dev_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_swap_bio_charge); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_alloc_anon_thp); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_ac); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_rmqueue); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_suitable_zone); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_wmark_ok); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_zone_max_order); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_zone_pageset); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index dfd69fa48a3cc..db37abab2da81 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -555,6 +555,32 @@ DECLARE_HOOK(android_vh_gcma_cc_store_page_bypass, DECLARE_HOOK(android_vh_swap_bio_charge, TP_PROTO(struct bio *bio), TP_ARGS(bio)); +DECLARE_HOOK(android_vh_mm_customize_alloc_anon_thp, + TP_PROTO(gfp_t *gfp_mask, unsigned long *orders, int *order, struct folio **folio), + TP_ARGS(gfp_mask, orders, order, folio)); +DECLARE_HOOK(android_vh_mm_customize_ac, + TP_PROTO(gfp_t gfp, unsigned int order, struct zonelist **zonelist, + struct zoneref **preferred_zoneref, enum zone_type *highest_zoneidx, + unsigned int *alloc_flags), + TP_ARGS(gfp, order, zonelist, preferred_zoneref, highest_zoneidx, alloc_flags)); +DECLARE_HOOK(android_vh_mm_customize_rmqueue, + TP_PROTO(struct zone *zone, unsigned int order, unsigned int *alloc_flags, + int *migratetype), + TP_ARGS(zone, order, alloc_flags, migratetype)); +DECLARE_HOOK(android_vh_mm_customize_suitable_zone, + TP_PROTO(struct zone *zone, gfp_t gfp, int order, enum zone_type highest_zoneidx, + bool *use_this_zone, bool *suitable), + TP_ARGS(zone, gfp, order, highest_zoneidx, use_this_zone, suitable)); +DECLARE_HOOK(android_vh_mm_customize_wmark_ok, + TP_PROTO(struct zone *zone, unsigned int order, enum zone_type highest_zoneidx, + bool *wmark_ok, bool *customized), + TP_ARGS(zone, order, highest_zoneidx, wmark_ok, customized)); +DECLARE_HOOK(android_vh_mm_customize_zone_max_order, + TP_PROTO(struct zone *zone, int *max_order), + TP_ARGS(zone, max_order)); +DECLARE_HOOK(android_vh_mm_customize_zone_pageset, + TP_PROTO(struct zone *zone, int *new_high_min, int *new_high_max, int *new_batch), + TP_ARGS(zone, new_high_min, new_high_max, new_batch)); #endif /* _TRACE_HOOK_MM_H */ /* This part must be outside protection */ diff --git a/mm/memory.c b/mm/memory.c index caf01a4201972..5ed0097a6128b 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4690,7 +4690,7 @@ static struct folio *alloc_anon_folio(struct vm_fault *vmf) struct vm_area_struct *vma = vmf->vma; #ifdef CONFIG_TRANSPARENT_HUGEPAGE unsigned long orders; - struct folio *folio; + struct folio *folio = NULL; unsigned long addr; pte_t *pte; gfp_t gfp; @@ -4739,10 +4739,16 @@ static struct folio *alloc_anon_folio(struct vm_fault *vmf) /* Try allocating the highest of the remaining orders. */ gfp = vma_thp_gfp_mask(vma); + + trace_android_vh_mm_customize_alloc_anon_thp(&gfp, &orders, &order, &folio); + if (folio) + goto allocated; + while (orders) { addr = ALIGN_DOWN(vmf->address, PAGE_SIZE << order); folio = vma_alloc_folio(gfp, order, vma, addr, true); if (folio) { +allocated: if (mem_cgroup_charge(folio, vma->vm_mm, gfp)) { count_mthp_stat(order, MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE); folio_put(folio); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 01e7586a7e11c..18e78a14626e9 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -871,6 +871,14 @@ buddy_merge_likely(unsigned long pfn, unsigned long buddy_pfn, NULL) != NULL; } +static int zone_max_order(struct zone *zone) +{ + int max_order = MAX_PAGE_ORDER; + + trace_android_vh_mm_customize_zone_max_order(zone, &max_order); + return max_order; +} + /* * Freeing function for a buddy system allocator. * @@ -906,6 +914,7 @@ static inline void __free_one_page(struct page *page, struct page *buddy; bool to_tail; bool bypass = false; + int max_order = zone_max_order(zone); trace_android_vh_free_one_page_bypass(page, zone, order, migratetype, (int)fpi_flags, &bypass); @@ -922,7 +931,7 @@ static inline void __free_one_page(struct page *page, account_freepages(zone, 1 << order, migratetype); - while (order < MAX_PAGE_ORDER) { + while (order < max_order) { int buddy_mt = migratetype; if (compaction_capture(capc, page, order, migratetype)) { @@ -980,6 +989,8 @@ done_merging: to_tail = true; else if (is_shuffle_order(order)) to_tail = shuffle_pick_tail(); + else if (max_order != MAX_PAGE_ORDER) + to_tail = false; else to_tail = buddy_merge_likely(pfn, buddy_pfn, page, order); @@ -3305,6 +3316,8 @@ struct page *rmqueue(struct zone *preferred_zone, { struct page *page; + trace_android_vh_mm_customize_rmqueue(zone, order, &alloc_flags, &migratetype); + if (likely(pcp_allowed_order(order))) { page = rmqueue_pcplist(preferred_zone, zone, order, migratetype, alloc_flags); @@ -3507,6 +3520,13 @@ bool __zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark, { long min = mark; int o; + bool customized = false; + bool wmark_ok = false; + + trace_android_vh_mm_customize_wmark_ok(z, order, highest_zoneidx, + &wmark_ok, &customized); + if (customized) + return wmark_ok; /* free_pages may go negative - that's OK */ free_pages -= __zone_watermark_unusable_free(z, order, alloc_flags); @@ -3756,9 +3776,19 @@ retry: z = ac->preferred_zoneref; for_next_zone_zonelist_nodemask(zone, z, ac->highest_zoneidx, ac->nodemask) { + bool use_this_zone = false; + bool suitable = true; struct page *page; unsigned long mark; + trace_android_vh_mm_customize_suitable_zone(zone, gfp_mask, order, ac->highest_zoneidx, + &use_this_zone, &suitable); + if (!suitable) + continue; + + if (use_this_zone) + goto try_this_zone; + if (cpusets_enabled() && (alloc_flags & ALLOC_CPUSET) && !__cpuset_zone_allowed(zone, gfp_mask)) @@ -5209,6 +5239,9 @@ struct page *__alloc_pages_noprof(gfp_t gfp, unsigned int order, &alloc_gfp, &alloc_flags)) return NULL; + trace_android_vh_mm_customize_ac(gfp, order, &ac.zonelist, &ac.preferred_zoneref, + &ac.highest_zoneidx, &alloc_flags); + trace_android_rvh_try_alloc_pages_gfp(&page, order, gfp, gfp_zone(gfp)); if (page) goto out; @@ -6177,6 +6210,9 @@ static void zone_set_pageset_high_and_batch(struct zone *zone, int cpu_online) zone->pageset_batch == new_batch) return; + trace_android_vh_mm_customize_zone_pageset(zone, &new_high_min, + &new_high_max, &new_batch); + zone->pageset_high_min = new_high_min; zone->pageset_high_max = new_high_max; zone->pageset_batch = new_batch; -- GitLab From 6c25b93a26385e5ab85750db953d2fedf5754e0e Mon Sep 17 00:00:00 2001 From: Pengfei Li Date: Mon, 14 Jul 2025 16:05:00 +0800 Subject: [PATCH 2182/2211] ANDROID: vendor_hook: Added hook for memory reclaim tuning The following hooks are added for memory reclaim tuning: android_vh_mm_isolate_priv_lru - This hook is used to properly handle certain folios when they are reclaimed. android_vh_mm_customize_file_is_tiny - For a specific process, we want only anonymous pages to be reclaimed. This hook allows vendors to modify the value of file_is_tiny to affect the reclaim behavior. android_vh_mm_customize_pgdat_balanced - When there are multiple zones, it is not always reasonable to perform indirect reclaim only when all zones do not meet the watermark. This hook allows vendors to customize pgdat_balanced to use their own strategy to determine whether to perform and stop indirect collection. android_vh_mm_customize_reclaim_idx - When there are multiple zones, vendors use this hook to customize which zones can be reclaimed. android_vh_mm_customize_zone_can_compact - When there are multiple zones, vendors use this hook to customize which zones can be compacted. Bug: 431672372 Change-Id: I860c2665088753a5c3b6d6dfeeb25a82aeefc8af Signed-off-by: Pengfei Li --- drivers/android/vendor_hooks.c | 5 +++++ include/trace/hooks/compaction.h | 3 +++ include/trace/hooks/vmscan.h | 14 +++++++++++++ mm/compaction.c | 27 +++++++++++++++++++++++++ mm/vmscan.c | 34 ++++++++++++++++++++++++++++++-- 5 files changed, 81 insertions(+), 2 deletions(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 8472847cbeddf..82af4b9162346 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -599,3 +599,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_suitable_zone); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_wmark_ok); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_zone_max_order); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_zone_pageset); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_isolate_priv_lru); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_file_is_tiny); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_pgdat_balanced); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_reclaim_idx); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_zone_can_compact); diff --git a/include/trace/hooks/compaction.h b/include/trace/hooks/compaction.h index c22b22386be81..2b546e63965fe 100644 --- a/include/trace/hooks/compaction.h +++ b/include/trace/hooks/compaction.h @@ -19,6 +19,9 @@ enum compact_result; DECLARE_HOOK(android_vh_compaction_try_to_compact_exit, TP_PROTO(enum compact_result *compact_result), TP_ARGS(compact_result)); +DECLARE_HOOK(android_vh_mm_customize_zone_can_compact, + TP_PROTO(struct zone *zone, bool *can_compact), + TP_ARGS(zone, can_compact)); #endif /* _TRACE_HOOK_COMPACTION_H */ /* This part must be outside protection */ #include diff --git a/include/trace/hooks/vmscan.h b/include/trace/hooks/vmscan.h index e47dd8e036196..bd545f8444df1 100644 --- a/include/trace/hooks/vmscan.h +++ b/include/trace/hooks/vmscan.h @@ -111,6 +111,20 @@ DECLARE_HOOK(android_vh_shrink_node, DECLARE_HOOK(android_vh_shrink_node_memcgs, TP_PROTO(struct mem_cgroup *memcg, bool *skip), TP_ARGS(memcg, skip)); +DECLARE_HOOK(android_vh_mm_isolate_priv_lru, + TP_PROTO(unsigned long nr_to_scan, struct lruvec *lruvec, enum lru_list lru, + struct list_head *dst, int reclaim_idx, bool may_unmap, + unsigned long *nr_scanned, unsigned long *nr_taken), + TP_ARGS(nr_to_scan, lruvec, lru, dst, reclaim_idx, may_unmap, nr_scanned, nr_taken)); +DECLARE_HOOK(android_vh_mm_customize_file_is_tiny, + TP_PROTO(unsigned int may_swap, int order, int highest_zoneidx, bool *file_is_tiny), + TP_ARGS(may_swap, order, highest_zoneidx, file_is_tiny)); +DECLARE_HOOK(android_vh_mm_customize_pgdat_balanced, + TP_PROTO(int order, int highest_zoneidx, bool *balanced, bool *customized), + TP_ARGS(order, highest_zoneidx, balanced, customized)); +DECLARE_HOOK(android_vh_mm_customize_reclaim_idx, + TP_PROTO(int order, gfp_t gfp, s8 *reclaim_idx, enum zone_type *highest_zoneidx), + TP_ARGS(order, gfp, reclaim_idx, highest_zoneidx)); #endif /* _TRACE_HOOK_VMSCAN_H */ /* This part must be outside protection */ #include diff --git a/mm/compaction.c b/mm/compaction.c index 182d7c99f820c..ca7dab51554e5 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -2854,6 +2854,11 @@ enum compact_result try_to_compact_pages(gfp_t gfp_mask, unsigned int order, for_each_zone_zonelist_nodemask(zone, z, ac->zonelist, ac->highest_zoneidx, ac->nodemask) { enum compact_result status; + bool can_compact = true; + + trace_android_vh_mm_customize_zone_can_compact(zone, &can_compact); + if (!can_compact) + continue; if (cpusets_enabled() && (alloc_flags & ALLOC_CPUSET) && @@ -2921,10 +2926,16 @@ void compact_node_async(int nid) }; for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) { + bool can_compact = true; + zone = &pgdat->node_zones[zoneid]; if (!populated_zone(zone)) continue; + trace_android_vh_mm_customize_zone_can_compact(zone, &can_compact); + if (!can_compact) + continue; + if (fatal_signal_pending(current)) break; @@ -2960,10 +2971,16 @@ static int compact_node(pg_data_t *pgdat, bool proactive) }; for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) { + bool can_compact = true; + zone = &pgdat->node_zones[zoneid]; if (!populated_zone(zone)) continue; + trace_android_vh_mm_customize_zone_can_compact(zone, &can_compact); + if (!can_compact) + continue; + if (fatal_signal_pending(current)) return -EINTR; @@ -3090,11 +3107,16 @@ static bool kcompactd_node_suitable(pg_data_t *pgdat) enum compact_result ret; for (zoneid = 0; zoneid <= highest_zoneidx; zoneid++) { + bool can_compact = true; zone = &pgdat->node_zones[zoneid]; if (!populated_zone(zone)) continue; + trace_android_vh_mm_customize_zone_can_compact(zone, &can_compact); + if (!can_compact) + continue; + ret = compaction_suit_allocation_order(zone, pgdat->kcompactd_max_order, highest_zoneidx, ALLOC_WMARK_MIN); @@ -3129,11 +3151,16 @@ static void kcompactd_do_work(pg_data_t *pgdat) for (zoneid = 0; zoneid <= cc.highest_zoneidx; zoneid++) { int status; + bool can_compact = true; zone = &pgdat->node_zones[zoneid]; if (!populated_zone(zone)) continue; + trace_android_vh_mm_customize_zone_can_compact(zone, &can_compact); + if (!can_compact) + continue; + if (compaction_deferred(zone, cc.order)) continue; diff --git a/mm/vmscan.c b/mm/vmscan.c index f78cfe059f144..2526acf3278f1 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1738,6 +1738,12 @@ static unsigned long isolate_lru_folios(unsigned long nr_to_scan, unsigned long skipped = 0; unsigned long scan, total_scan, nr_pages; LIST_HEAD(folios_skipped); + unsigned long nr_scanned_before = *nr_scanned; + + trace_android_vh_mm_isolate_priv_lru(nr_to_scan, lruvec, lru, dst, sc->reclaim_idx, + sc->may_unmap, nr_scanned, &nr_taken); + if (*nr_scanned != nr_scanned_before) + return nr_taken; total_scan = 0; scan = 0; @@ -1996,7 +2002,7 @@ static unsigned long shrink_inactive_list(unsigned long nr_to_scan, enum lru_list lru) { LIST_HEAD(folio_list); - unsigned long nr_scanned; + unsigned long nr_scanned = 0; unsigned int nr_reclaimed = 0; unsigned long nr_taken; struct reclaim_stat stat; @@ -2117,7 +2123,7 @@ static void shrink_active_list(unsigned long nr_to_scan, enum lru_list lru) { unsigned long nr_taken; - unsigned long nr_scanned; + unsigned long nr_scanned = 0; unsigned long vm_flags; LIST_HEAD(l_hold); /* The folios which were snipped off */ LIST_HEAD(l_active); @@ -2352,6 +2358,15 @@ static bool inactive_is_low(struct lruvec *lruvec, enum lru_list inactive_lru) return inactive * inactive_ratio < active; } +static void customize_sc_file_is_tiny(struct scan_control *sc) +{ + bool file_is_tiny = sc->file_is_tiny; + + trace_android_vh_mm_customize_file_is_tiny(sc->may_swap, sc->order, + sc->reclaim_idx, &file_is_tiny); + sc->file_is_tiny = file_is_tiny; +} + enum scan_balance { SCAN_EQUAL, SCAN_FRACT, @@ -2465,6 +2480,8 @@ static void prepare_scan_control(pg_data_t *pgdat, struct scan_control *sc) !(sc->may_deactivate & DEACTIVATE_ANON) && anon >> sc->priority; } + + customize_sc_file_is_tiny(sc); } /* @@ -6309,6 +6326,9 @@ static void shrink_zones(struct zonelist *zonelist, struct scan_control *sc) sc->reclaim_idx = gfp_zone(sc->gfp_mask); } + trace_android_vh_mm_customize_reclaim_idx(sc->order, sc->gfp_mask, + &sc->reclaim_idx, NULL); + for_each_zone_zonelist_nodemask(zone, z, zonelist, sc->reclaim_idx, sc->nodemask) { /* @@ -6860,8 +6880,15 @@ static bool pgdat_balanced(pg_data_t *pgdat, int order, int highest_zoneidx) { int i; unsigned long mark = -1; + bool customized = false; + bool balanced = false; struct zone *zone; + trace_android_vh_mm_customize_pgdat_balanced(order, highest_zoneidx, + &balanced, &customized); + if (customized) + return balanced; + /* * Check watermarks bottom-up as lower zones are more likely to * meet watermarks. @@ -7469,6 +7496,9 @@ void wakeup_kswapd(struct zone *zone, gfp_t gfp_flags, int order, if (!cpuset_zone_allowed(zone, gfp_flags)) return; + trace_android_vh_mm_customize_reclaim_idx(order, gfp_flags, NULL, + &highest_zoneidx); + pgdat = zone->zone_pgdat; curr_idx = READ_ONCE(pgdat->kswapd_highest_zoneidx); -- GitLab From 792718bb234ac19db3efdbc3215485e874c41584 Mon Sep 17 00:00:00 2001 From: Pengfei Li Date: Thu, 17 Jul 2025 10:04:42 +0800 Subject: [PATCH 2183/2211] ANDROID: vendor_hook: Added hook to tune reclaimed huge page android_vh_mm_customize_longterm_pinnable - This hook allows vendors to customize some special folios that are not migrated. They should not be migrated to avoid application lags. android_vh_mm_do_madvise_bypass - This hook allows vendors to customize some madvise behaviors so that some madvise requests can be completed quickly in certain scenarios. android_vh_mm_migrate_one_page - This hook allows vendors to track certain folios that are being migrated. android_vh_mm_remove_migration_pte_bypass - This hook is used to properly handle the migration of the aforementioned special folio. android_vh_mm_split_huge_page_bypass - This hook is used in certain scenarios where large folios should not be split to avoid the overhead caused by splitting. android_vh_mm_try_split_folio_bypass - This hook is used to skip splitting large folios during migration in certain scenarios. Bug: 431672372 Change-Id: I3c3580651e330dc8cfa6fa6f7a4f85fba1ba9807 Signed-off-by: Pengfei Li --- drivers/android/vendor_hooks.c | 6 ++++++ include/linux/mm.h | 9 +++++++++ include/trace/hooks/madvise.h | 4 ++++ include/trace/hooks/mm.h | 16 ++++++++++++++++ mm/gup.c | 11 +++++++++++ mm/huge_memory.c | 5 +++++ mm/madvise.c | 6 ++++++ mm/migrate.c | 11 +++++++++++ mm/rmap.c | 1 + 9 files changed, 69 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 82af4b9162346..a9f7a2c5fa1e6 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -604,3 +604,9 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_file_is_tiny); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_pgdat_balanced); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_reclaim_idx); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_zone_can_compact); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_customize_longterm_pinnable); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_do_madvise_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_migrate_one_page); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_remove_migration_pte_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_split_huge_page_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_try_split_folio_bypass); diff --git a/include/linux/mm.h b/include/linux/mm.h index 62b8f04034982..354d337ab05ef 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2099,8 +2099,17 @@ static inline bool is_zero_folio(const struct folio *folio) /* MIGRATE_CMA and ZONE_MOVABLE do not allow pin folios */ #ifdef CONFIG_MIGRATION +extern void _trace_android_vh_mm_customize_longterm_pinnable(struct folio *folio, + bool *is_longterm_pinnable); + static inline bool folio_is_longterm_pinnable(struct folio *folio) { + bool is_longterm_pinnable = false; + + _trace_android_vh_mm_customize_longterm_pinnable(folio, &is_longterm_pinnable); + if (is_longterm_pinnable) + return true; + #ifdef CONFIG_CMA int mt = folio_migratetype(folio); diff --git a/include/trace/hooks/madvise.h b/include/trace/hooks/madvise.h index 0dbf30712a9df..3dace49e37537 100644 --- a/include/trace/hooks/madvise.h +++ b/include/trace/hooks/madvise.h @@ -20,6 +20,10 @@ DECLARE_HOOK(android_vh_process_madvise_return_error, DECLARE_HOOK(android_vh_madvise_pageout_bypass, TP_PROTO(struct mm_struct *mm, bool pageout, int *ret), TP_ARGS(mm, pageout, ret)); +DECLARE_HOOK(android_vh_mm_do_madvise_bypass, + TP_PROTO(struct mm_struct *mm, unsigned long start, size_t len, + int behavior, int *error, bool *bypass), + TP_ARGS(mm, start, len, behavior, error, bypass)); #endif diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index db37abab2da81..8edee8a675b12 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -581,6 +581,22 @@ DECLARE_HOOK(android_vh_mm_customize_zone_max_order, DECLARE_HOOK(android_vh_mm_customize_zone_pageset, TP_PROTO(struct zone *zone, int *new_high_min, int *new_high_max, int *new_batch), TP_ARGS(zone, new_high_min, new_high_max, new_batch)); +DECLARE_HOOK(android_vh_mm_customize_longterm_pinnable, + TP_PROTO(struct folio *folio, bool *is_longterm_pinnable), + TP_ARGS(folio, is_longterm_pinnable)); +DECLARE_HOOK(android_vh_mm_migrate_one_page, + TP_PROTO(struct page *page, const vm_flags_t vm_flags), + TP_ARGS(page, vm_flags)); +DECLARE_HOOK(android_vh_mm_remove_migration_pte_bypass, + TP_PROTO(struct folio *dst, struct vm_area_struct *vma, unsigned long addr, + struct folio *src, bool *bypass), + TP_ARGS(dst, vma, addr, src, bypass)); +DECLARE_HOOK(android_vh_mm_split_huge_page_bypass, + TP_PROTO(struct page *page, struct list_head *list, int *ret, bool *bypass), + TP_ARGS(page, list, ret, bypass)); +DECLARE_HOOK(android_vh_mm_try_split_folio_bypass, + TP_PROTO(struct folio *folio, bool *bypass), + TP_ARGS(folio, bypass)); #endif /* _TRACE_HOOK_MM_H */ /* This part must be outside protection */ diff --git a/mm/gup.c b/mm/gup.c index e323843cc5dd8..bcd81fdda84b5 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -471,6 +471,17 @@ void unpin_folios(struct folio **folios, unsigned long nfolios) } EXPORT_SYMBOL_GPL(unpin_folios); +/* + * trace_android_vh_mm_customize_longterm_pinnable is called in include/linux/mm.h + * by including include/trace/hooks/mm.h, which will result to build-err. + * So we create func: _trace_android_vh_mm_customize_longterm_pinnable. + */ +void _trace_android_vh_mm_customize_longterm_pinnable(struct folio *folio, + bool *is_longterm_pinnable) +{ + trace_android_vh_mm_customize_longterm_pinnable(folio, is_longterm_pinnable); +} + /* * Set the MMF_HAS_PINNED if not set yet; after set it'll be there for the mm's * lifecycle. Avoid setting the bit unless necessary, or it might cause write diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 04fd908a074c3..2113225974dc8 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3380,6 +3380,7 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, int extra_pins, ret; pgoff_t end; bool is_hzp; + bool bypass = false; VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio); VM_BUG_ON_FOLIO(!folio_test_large(folio), folio); @@ -3493,6 +3494,10 @@ int split_huge_page_to_list_to_order(struct page *page, struct list_head *list, end = shmem_fallocend(mapping->host, end); } + trace_android_vh_mm_split_huge_page_bypass(page, list, &ret, &bypass); + if (bypass) + goto out_unlock; + /* * Racy check if we can split the page, before unmap_folio() will * split PMDs diff --git a/mm/madvise.c b/mm/madvise.c index 26ccf76a6355f..a1b236d256d62 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -1687,6 +1687,7 @@ int do_madvise(struct mm_struct *mm, unsigned long start, size_t len_in, int beh int write; size_t len; struct blk_plug plug; + bool bypass = false; if (!madvise_behavior_valid(behavior)) return -EINVAL; @@ -1711,6 +1712,11 @@ int do_madvise(struct mm_struct *mm, unsigned long start, size_t len_in, int beh return madvise_inject_error(behavior, start, start + len_in); #endif + trace_android_vh_mm_do_madvise_bypass(mm, start, len, behavior, + &error, &bypass); + if (bypass) + return error; + write = madvise_need_mmap_write(behavior); if (write) { if (mmap_write_lock_killable(mm)) diff --git a/mm/migrate.c b/mm/migrate.c index 972ee53353cb4..8fd84722cb67b 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -254,6 +254,12 @@ static bool remove_migration_pte(struct folio *folio, { struct rmap_walk_arg *rmap_walk_arg = arg; DEFINE_FOLIO_VMA_WALK(pvmw, rmap_walk_arg->folio, vma, addr, PVMW_SYNC | PVMW_MIGRATION); + bool bypass = false; + + trace_android_vh_mm_remove_migration_pte_bypass(folio, vma, addr, + rmap_walk_arg->folio, &bypass); + if (bypass) + return true; while (page_vma_mapped_walk(&pvmw)) { rmap_t rmap_flags = RMAP_NONE; @@ -1568,6 +1574,11 @@ static inline int try_split_folio(struct folio *folio, struct list_head *split_f enum migrate_mode mode) { int rc; + bool bypass = false; + + trace_android_vh_mm_try_split_folio_bypass(folio, &bypass); + if (bypass) + return -EBUSY; if (mode == MIGRATE_ASYNC) { if (!folio_trylock(folio)) diff --git a/mm/rmap.c b/mm/rmap.c index 0c4ffc1853268..40cf0a1a82963 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -2306,6 +2306,7 @@ static bool try_to_migrate_one(struct folio *folio, struct vm_area_struct *vma, set_pte_at(mm, address, pvmw.pte, swp_pte); trace_set_migration_pte(address, pte_val(swp_pte), folio_order(folio)); + trace_android_vh_mm_migrate_one_page(subpage, vma->vm_flags); /* * No need to invalidate here it will synchronize on * against the special swap migration pte. -- GitLab From 8a9183c5070d253367df1933eb6e6b30da7d91ba Mon Sep 17 00:00:00 2001 From: Pengfei Li Date: Tue, 22 Jul 2025 11:19:29 +0800 Subject: [PATCH 2184/2211] ANDROID: mm: Export several symbols Exports several symbols which are used in the vendor ko. mte_sync_tags - It is used by the macro set_pte_at. mthp_stats - It is used by mod_mthp_stat(). swapper_spaces - It is used by macro swap_address_space. swap_migration_ad_supported - It is used by make_migration_entry_young(). __mmu_notifier_invalidate_range_start __mmu_notifier_arch_invalidate_secondary_tlbs __mmu_notifier_invalidate_range_end - These three functions are used in vendors ko to invalidate and refresh the tlb. Bug: 431672372 Change-Id: I5f61af22ed9c11cd5c5a79eaa49a62c5153693b9 Signed-off-by: Pengfei Li --- arch/arm64/kernel/mte.c | 1 + mm/huge_memory.c | 1 + mm/mmu_notifier.c | 3 +++ mm/swap_state.c | 1 + mm/swapfile.c | 1 + 5 files changed, 7 insertions(+) diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c index 6174671be7c18..a7e0db7ae89ab 100644 --- a/arch/arm64/kernel/mte.c +++ b/arch/arm64/kernel/mte.c @@ -51,6 +51,7 @@ void mte_sync_tags(pte_t pte, unsigned int nr_pages) /* ensure the tags are visible before the PTE is set */ smp_wmb(); } +EXPORT_SYMBOL_GPL(mte_sync_tags); int memcmp_pages(struct page *page1, struct page *page2) { diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 2113225974dc8..caf8abfe10720 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -576,6 +576,7 @@ static const struct kobj_type thpsize_ktype = { }; DEFINE_PER_CPU(struct mthp_stat, mthp_stats) = {{{0}}}; +EXPORT_SYMBOL_GPL(mthp_stats); static unsigned long sum_mthp_stat(int order, enum mthp_stat_item item) { diff --git a/mm/mmu_notifier.c b/mm/mmu_notifier.c index fc18fe2745050..d4cbf45ef768e 100644 --- a/mm/mmu_notifier.c +++ b/mm/mmu_notifier.c @@ -533,6 +533,7 @@ int __mmu_notifier_invalidate_range_start(struct mmu_notifier_range *range) return mn_hlist_invalidate_range_start(subscriptions, range); return 0; } +EXPORT_SYMBOL_GPL(__mmu_notifier_invalidate_range_start); static void mn_hlist_invalidate_end(struct mmu_notifier_subscriptions *subscriptions, @@ -569,6 +570,7 @@ void __mmu_notifier_invalidate_range_end(struct mmu_notifier_range *range) mn_hlist_invalidate_end(subscriptions, range); lock_map_release(&__mmu_notifier_invalidate_range_start_map); } +EXPORT_SYMBOL_GPL(__mmu_notifier_invalidate_range_end); void __mmu_notifier_arch_invalidate_secondary_tlbs(struct mm_struct *mm, unsigned long start, unsigned long end) @@ -587,6 +589,7 @@ void __mmu_notifier_arch_invalidate_secondary_tlbs(struct mm_struct *mm, } srcu_read_unlock(&srcu, id); } +EXPORT_SYMBOL_GPL(__mmu_notifier_arch_invalidate_secondary_tlbs); /* * Same as mmu_notifier_register but here the caller must hold the mmap_lock in diff --git a/mm/swap_state.c b/mm/swap_state.c index d210f07aff764..33f7c75db4532 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c @@ -39,6 +39,7 @@ static const struct address_space_operations swap_aops = { }; struct address_space *swapper_spaces[MAX_SWAPFILES] __read_mostly; +EXPORT_SYMBOL_GPL(swapper_spaces); static unsigned int nr_swapper_spaces[MAX_SWAPFILES] __read_mostly; static bool enable_vma_readahead __read_mostly = true; diff --git a/mm/swapfile.c b/mm/swapfile.c index a7975908a8b55..90afacf225f36 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -81,6 +81,7 @@ static int least_priority = -1; unsigned long swapfile_maximum_size; #ifdef CONFIG_MIGRATION bool swap_migration_ad_supported; +EXPORT_SYMBOL_GPL(swap_migration_ad_supported); #endif /* CONFIG_MIGRATION */ static const char Bad_file[] = "Bad swap file entry "; -- GitLab From bf0fb8bb181b86adf67dcc60b8269d60814de5a1 Mon Sep 17 00:00:00 2001 From: Pengfei Li Date: Mon, 21 Jul 2025 20:24:46 +0800 Subject: [PATCH 2185/2211] ANDROID: GKI: Update vivo symbol list 28 function symbol(s) added 'void __contpte_try_fold(struct mm_struct*, unsigned long, pte_t*, pte_t)' 'void __mmu_notifier_arch_invalidate_secondary_tlbs(struct mm_struct*, unsigned long, unsigned long)' 'void __mmu_notifier_invalidate_range_end(struct mmu_notifier_range*)' 'int __mmu_notifier_invalidate_range_start(struct mmu_notifier_range*)' 'void __sync_icache_dcache(pte_t)' 'int __traceiter_android_vh_mm_customize_ac(void*, gfp_t, unsigned int, struct zonelist**, struct zoneref**, enum zone_type*, unsigned int*)' 'int __traceiter_android_vh_mm_customize_alloc_anon_thp(void*, gfp_t*, unsigned long*, int*, struct folio**)' 'int __traceiter_android_vh_mm_customize_file_is_tiny(void*, unsigned int, int, int, bool*)' 'int __traceiter_android_vh_mm_customize_longterm_pinnable(void*, struct folio*, bool*)' 'int __traceiter_android_vh_mm_customize_pgdat_balanced(void*, int, int, bool*, bool*)' 'int __traceiter_android_vh_mm_customize_reclaim_idx(void*, int, gfp_t, s8*, enum zone_type*)' 'int __traceiter_android_vh_mm_customize_rmqueue(void*, struct zone*, unsigned int, unsigned int*, int*)' 'int __traceiter_android_vh_mm_customize_suitable_zone(void*, struct zone*, gfp_t, int, enum zone_type, bool*, bool*)' 'int __traceiter_android_vh_mm_customize_wmark_ok(void*, struct zone*, unsigned int, enum zone_type, bool*, bool*)' 'int __traceiter_android_vh_mm_customize_zone_can_compact(void*, struct zone*, bool*)' 'int __traceiter_android_vh_mm_customize_zone_max_order(void*, struct zone*, int*)' 'int __traceiter_android_vh_mm_customize_zone_pageset(void*, struct zone*, int*, int*, int*)' 'int __traceiter_android_vh_mm_do_madvise_bypass(void*, struct mm_struct*, unsigned long, size_t, int, int*, bool*)' 'int __traceiter_android_vh_mm_isolate_priv_lru(void*, unsigned long, struct lruvec*, enum lru_list, struct list_head*, int, bool, unsigned long*, unsigned long*)' 'int __traceiter_android_vh_mm_migrate_one_page(void*, struct page*, vm_flags_t)' 'int __traceiter_android_vh_mm_remove_migration_pte_bypass(void*, struct folio*, struct vm_area_struct*, unsigned long, struct folio*, bool*)' 'int __traceiter_android_vh_mm_split_huge_page_bypass(void*, struct page*, struct list_head*, int*, bool*)' 'int __traceiter_android_vh_mm_try_split_folio_bypass(void*, struct folio*, bool*)' 'pte_t contpte_ptep_get(pte_t*, pte_t)' 'void memcg1_charge_batch(struct mem_cgroup*, unsigned long, int)' 'void mm_trace_rss_stat(struct mm_struct*, int)' 'void mte_sync_tags(pte_t, unsigned int)' 'void zone_pageset_high_and_batch_update(struct zone*, int, int, int)' 21 variable symbol(s) added 'struct tracepoint __tracepoint_android_vh_mm_customize_ac' 'struct tracepoint __tracepoint_android_vh_mm_customize_alloc_anon_thp' 'struct tracepoint __tracepoint_android_vh_mm_customize_file_is_tiny' 'struct tracepoint __tracepoint_android_vh_mm_customize_longterm_pinnable' 'struct tracepoint __tracepoint_android_vh_mm_customize_pgdat_balanced' 'struct tracepoint __tracepoint_android_vh_mm_customize_reclaim_idx' 'struct tracepoint __tracepoint_android_vh_mm_customize_rmqueue' 'struct tracepoint __tracepoint_android_vh_mm_customize_suitable_zone' 'struct tracepoint __tracepoint_android_vh_mm_customize_wmark_ok' 'struct tracepoint __tracepoint_android_vh_mm_customize_zone_can_compact' 'struct tracepoint __tracepoint_android_vh_mm_customize_zone_max_order' 'struct tracepoint __tracepoint_android_vh_mm_customize_zone_pageset' 'struct tracepoint __tracepoint_android_vh_mm_do_madvise_bypass' 'struct tracepoint __tracepoint_android_vh_mm_isolate_priv_lru' 'struct tracepoint __tracepoint_android_vh_mm_migrate_one_page' 'struct tracepoint __tracepoint_android_vh_mm_remove_migration_pte_bypass' 'struct tracepoint __tracepoint_android_vh_mm_split_huge_page_bypass' 'struct tracepoint __tracepoint_android_vh_mm_try_split_folio_bypass' 'struct mthp_stat mthp_stats' 'bool swap_migration_ad_supported' 'struct address_space* swapper_spaces[28]' Bug: 431672372 Change-Id: Id596b84fa723f75fd5c3f969650f6d360084d298 Signed-off-by: Pengfei Li --- gki/aarch64/abi.stg | 815 +++++++++++++++++++++++++++++++++++++++ gki/aarch64/symbols/vivo | 49 +++ 2 files changed, 864 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 86c5a403c9eee..050c504d81dd4 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -2398,6 +2398,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x30ae0fb9 } +pointer_reference { + id: 0x06cbb7fd + kind: POINTER + pointee_type_id: 0x316e396a +} pointer_reference { id: 0x06d00549 kind: POINTER @@ -2908,6 +2913,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x0b7b35bf } +pointer_reference { + id: 0x0850608e + kind: POINTER + pointee_type_id: 0x0b0164a7 +} pointer_reference { id: 0x0853345e kind: POINTER @@ -5733,6 +5743,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x1e840f82 } +pointer_reference { + id: 0x0d3144be + kind: POINTER + pointee_type_id: 0x1e85f467 +} pointer_reference { id: 0x0d322879 kind: POINTER @@ -16008,6 +16023,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0xa6f7f2e2 } +pointer_reference { + id: 0x23335f1c + kind: POINTER + pointee_type_id: 0xa68d9aed +} pointer_reference { id: 0x233d687c kind: POINTER @@ -28798,6 +28818,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0xeff3c532 } +pointer_reference { + id: 0x316e396a + kind: POINTER + pointee_type_id: 0xeff80337 +} pointer_reference { id: 0x3176a085 kind: POINTER @@ -44184,6 +44209,11 @@ array { number_of_elements: 3 element_type_id: 0x322e26bf } +array { + id: 0x1e6e5d77 + number_of_elements: 28 + element_type_id: 0x1582ab06 +} array { id: 0x1e937ceb number_of_elements: 3 @@ -45459,6 +45489,11 @@ array { number_of_elements: 2 element_type_id: 0x2637f572 } +array { + id: 0x655639df + number_of_elements: 10 + element_type_id: 0x4af075c4 +} array { id: 0x659b07f0 number_of_elements: 16 @@ -105745,6 +105780,12 @@ member { type_id: 0x3ee7bddd offset: 64 } +member { + id: 0x823c27da + name: "end" + type_id: 0x33756485 + offset: 128 +} member { id: 0x823c2af9 name: "end" @@ -107757,6 +107798,12 @@ member { type_id: 0x87fc16b0 offset: 128 } +member { + id: 0x0ad767d6 + name: "event" + type_id: 0x98849204 + offset: 224 +} member { id: 0x0add8422 name: "event" @@ -229893,6 +229940,11 @@ member { type_id: 0x7bd19a3a offset: 1024 } +member { + id: 0xb9103837 + name: "stats" + type_id: 0x655639df +} member { id: 0xb920e064 name: "stats" @@ -318688,6 +318740,20 @@ struct_union { member_id: 0xc5916613 } } +struct_union { + id: 0xa68d9aed + kind: STRUCT + name: "mmu_notifier_range" + definition { + bytesize: 40 + member_id: 0x3025d5eb + member_id: 0x462842d5 + member_id: 0x823c27da + member_id: 0x2d2d09f1 + member_id: 0x0ad767d6 + member_id: 0x4a85c842 + } +} struct_union { id: 0x6ab7f110 kind: STRUCT @@ -319204,6 +319270,15 @@ struct_union { kind: STRUCT name: "mtd_info" } +struct_union { + id: 0x06deb287 + kind: STRUCT + name: "mthp_stat" + definition { + bytesize: 1040 + member_id: 0xb9103837 + } +} struct_union { id: 0xa7c362b0 kind: STRUCT @@ -361046,6 +361121,44 @@ enumeration { } } } +enumeration { + id: 0x98849204 + name: "mmu_notifier_event" + definition { + underlying_type_id: 0x4585663f + enumerator { + name: "MMU_NOTIFY_UNMAP" + } + enumerator { + name: "MMU_NOTIFY_CLEAR" + value: 1 + } + enumerator { + name: "MMU_NOTIFY_PROTECTION_VMA" + value: 2 + } + enumerator { + name: "MMU_NOTIFY_PROTECTION_PAGE" + value: 3 + } + enumerator { + name: "MMU_NOTIFY_SOFT_DIRTY" + value: 4 + } + enumerator { + name: "MMU_NOTIFY_RELEASE" + value: 5 + } + enumerator { + name: "MMU_NOTIFY_MIGRATE" + value: 6 + } + enumerator { + name: "MMU_NOTIFY_EXCLUSIVE" + value: 7 + } + } +} enumeration { id: 0x73b81062 name: "mode_set_atomic" @@ -375496,6 +375609,14 @@ function { parameter_id: 0x08326638 parameter_id: 0x4585663f } +function { + id: 0x1384480b + return_type_id: 0x48b5725f + parameter_id: 0x0a63398f + parameter_id: 0x6720d32f + parameter_id: 0x6720d32f + parameter_id: 0x6720d32f +} function { id: 0x1389ce9e return_type_id: 0x48b5725f @@ -377962,6 +378083,13 @@ function { parameter_id: 0x3e10b518 parameter_id: 0xf435685e } +function { + id: 0x1694e8b0 + return_type_id: 0x48b5725f + parameter_id: 0x1b36c7a2 + parameter_id: 0x33756485 + parameter_id: 0x33756485 +} function { id: 0x169718bc return_type_id: 0x48b5725f @@ -378427,6 +378555,13 @@ function { parameter_id: 0x1d44326e parameter_id: 0x34d3469d } +function { + id: 0x171aa7bf + return_type_id: 0x48b5725f + parameter_id: 0x1d5bae2a + parameter_id: 0x33756485 + parameter_id: 0x6720d32f +} function { id: 0x171b3ed6 return_type_id: 0x48b5725f @@ -379004,6 +379139,12 @@ function { return_type_id: 0x48b5725f parameter_id: 0x1d44326e } +function { + id: 0x17c96337 + return_type_id: 0x48b5725f + parameter_id: 0x1b36c7a2 + parameter_id: 0x6720d32f +} function { id: 0x17cb3906 return_type_id: 0x48b5725f @@ -379319,6 +379460,11 @@ function { parameter_id: 0x2fb647c0 parameter_id: 0xc9082b19 } +function { + id: 0x18548654 + return_type_id: 0x48b5725f + parameter_id: 0x23335f1c +} function { id: 0x18571a9d return_type_id: 0x48b5725f @@ -385740,6 +385886,11 @@ function { return_type_id: 0x18456730 parameter_id: 0x0355dc72 } +function { + id: 0x28b688ad + return_type_id: 0x48b5725f + parameter_id: 0xe0bb64fa +} function { id: 0x28bd3c4e return_type_id: 0x37e3ffd7 @@ -385784,6 +385935,12 @@ function { parameter_id: 0x3e10b518 parameter_id: 0x25e45be7 } +function { + id: 0x29a09d35 + return_type_id: 0x48b5725f + parameter_id: 0xe0bb64fa + parameter_id: 0x4585663f +} function { id: 0x29d41b8a return_type_id: 0x48b5725f @@ -394081,6 +394238,12 @@ function { parameter_id: 0x3411dbb1 parameter_id: 0x2e0f9112 } +function { + id: 0x903d767c + return_type_id: 0xe0bb64fa + parameter_id: 0x32bee099 + parameter_id: 0xe0bb64fa +} function { id: 0x903e8010 return_type_id: 0x6720d32f @@ -401338,6 +401501,11 @@ function { parameter_id: 0x4585663f parameter_id: 0x18bd6530 } +function { + id: 0x954c34e8 + return_type_id: 0x6720d32f + parameter_id: 0x23335f1c +} function { id: 0x954d9028 return_type_id: 0x6720d32f @@ -404203,6 +404371,17 @@ function { parameter_id: 0x27a7c613 parameter_id: 0x27a7c613 } +function { + id: 0x98787515 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0xf1a6dfed + parameter_id: 0x4585663f + parameter_id: 0x0d3144be + parameter_id: 0x06cbb7fd + parameter_id: 0x0850608e + parameter_id: 0x1bf16028 +} function { id: 0x98789491 return_type_id: 0x6720d32f @@ -406382,6 +406561,15 @@ function { parameter_id: 0x6720d32f parameter_id: 0xf1a6dfed } +function { + id: 0x9a0f517b + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x6720d32f + parameter_id: 0xf1a6dfed + parameter_id: 0x00fde7ff + parameter_id: 0x0850608e +} function { id: 0x9a101a10 return_type_id: 0x6720d32f @@ -406615,6 +406803,15 @@ function { parameter_id: 0x1d19a9d5 parameter_id: 0x13580d6c } +function { + id: 0x9a2ab257 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x6720d32f + parameter_id: 0x6720d32f + parameter_id: 0x11cfee5a + parameter_id: 0x11cfee5a +} function { id: 0x9a2ab624 return_type_id: 0x6720d32f @@ -407364,6 +407561,15 @@ function { parameter_id: 0x4585663f parameter_id: 0x33756485 } +function { + id: 0x9aa1ff3f + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x4585663f + parameter_id: 0x6720d32f + parameter_id: 0x6720d32f + parameter_id: 0x11cfee5a +} function { id: 0x9aa28a8b return_type_id: 0x6720d32f @@ -408509,6 +408715,16 @@ function { parameter_id: 0x18bd6530 parameter_id: 0x6d7f5ff6 } +function { + id: 0x9b28383c + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x2170d06d + parameter_id: 0x0a134144 + parameter_id: 0x33756485 + parameter_id: 0x2170d06d + parameter_id: 0x11cfee5a +} function { id: 0x9b2899c2 return_type_id: 0x6720d32f @@ -408567,6 +408783,13 @@ function { parameter_id: 0x27a7c613 parameter_id: 0x27a7c613 } +function { + id: 0x9b2e0ad9 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x2170d06d + parameter_id: 0x11cfee5a +} function { id: 0x9b2eaf21 return_type_id: 0x6720d32f @@ -409840,6 +410063,19 @@ function { parameter_id: 0x3e10b518 parameter_id: 0xf435685e } +function { + id: 0x9b6c13bd + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x33756485 + parameter_id: 0x39182992 + parameter_id: 0x0d164218 + parameter_id: 0x3e6239e1 + parameter_id: 0x6720d32f + parameter_id: 0x6d7f5ff6 + parameter_id: 0x064d6086 + parameter_id: 0x064d6086 +} function { id: 0x9b6c2834 return_type_id: 0x6720d32f @@ -410145,6 +410381,15 @@ function { parameter_id: 0x188b9e81 parameter_id: 0x35d37abd } +function { + id: 0x9b7582d1 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x36f98e5c + parameter_id: 0x064d6086 + parameter_id: 0x13580d6c + parameter_id: 0x02cc0dbc +} function { id: 0x9b76121f return_type_id: 0x6720d32f @@ -410307,6 +410552,29 @@ function { parameter_id: 0x6720d32f parameter_id: 0x6720d32f } +function { + id: 0x9b82457e + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x0a63398f + parameter_id: 0x11cfee5a +} +function { + id: 0x9b82a930 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x0a63398f + parameter_id: 0x13580d6c + parameter_id: 0x13580d6c + parameter_id: 0x13580d6c +} +function { + id: 0x9b82e086 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x0a63398f + parameter_id: 0x13580d6c +} function { id: 0x9b83293d return_type_id: 0x6720d32f @@ -410676,6 +410944,15 @@ function { parameter_id: 0x0ed82db2 parameter_id: 0x082be49e } +function { + id: 0x9b973ccf + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x0a63398f + parameter_id: 0x4585663f + parameter_id: 0x1bf16028 + parameter_id: 0x13580d6c +} function { id: 0x9b974729 return_type_id: 0x6720d32f @@ -410700,6 +410977,16 @@ function { parameter_id: 0x00be4281 parameter_id: 0x11cfee5a } +function { + id: 0x9b977fed + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x0a63398f + parameter_id: 0x4585663f + parameter_id: 0x0b0164a7 + parameter_id: 0x11cfee5a + parameter_id: 0x11cfee5a +} function { id: 0x9b97aefc return_type_id: 0x6720d32f @@ -411527,6 +411814,15 @@ function { parameter_id: 0x0622699d parameter_id: 0x3593bec8 } +function { + id: 0x9bba6684 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x06835e9c + parameter_id: 0x3e6239e1 + parameter_id: 0x13580d6c + parameter_id: 0x11cfee5a +} function { id: 0x9bba7997 return_type_id: 0x6720d32f @@ -411551,12 +411847,30 @@ function { parameter_id: 0x064d6086 parameter_id: 0x6d7f5ff6 } +function { + id: 0x9bbb71e7 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x06835e9c + parameter_id: 0x3b1bfa21 +} function { id: 0x9bbb9163 return_type_id: 0x6720d32f parameter_id: 0x11cffa09 parameter_id: 0x92233392 } +function { + id: 0x9bbbc132 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x0a63398f + parameter_id: 0xf1a6dfed + parameter_id: 0x6720d32f + parameter_id: 0x0b0164a7 + parameter_id: 0x11cfee5a + parameter_id: 0x11cfee5a +} function { id: 0x9bbc66c0 return_type_id: 0x6720d32f @@ -412117,6 +412431,17 @@ function { parameter_id: 0x18bd6530 parameter_id: 0x18ea6ae3 } +function { + id: 0x9bcc7570 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x1b36c7a2 + parameter_id: 0x33756485 + parameter_id: 0xf435685e + parameter_id: 0x6720d32f + parameter_id: 0x13580d6c + parameter_id: 0x11cfee5a +} function { id: 0x9bcd4bf2 return_type_id: 0x6720d32f @@ -427122,6 +427447,15 @@ elf_symbol { type_id: 0x1c4508b2 full_name: "__const_udelay" } +elf_symbol { + id: 0x53e1f306 + name: "__contpte_try_fold" + is_defined: true + symbol_type: FUNCTION + crc: 0x56614805 + type_id: 0x169718bc + full_name: "__contpte_try_fold" +} elf_symbol { id: 0xc266357d name: "__contpte_try_unfold" @@ -429004,6 +429338,33 @@ elf_symbol { type_id: 0x1655e07b full_name: "__mmdrop" } +elf_symbol { + id: 0x249b7a28 + name: "__mmu_notifier_arch_invalidate_secondary_tlbs" + is_defined: true + symbol_type: FUNCTION + crc: 0xf2b1d573 + type_id: 0x1694e8b0 + full_name: "__mmu_notifier_arch_invalidate_secondary_tlbs" +} +elf_symbol { + id: 0xbbe3e68b + name: "__mmu_notifier_invalidate_range_end" + is_defined: true + symbol_type: FUNCTION + crc: 0x7d3578b5 + type_id: 0x18548654 + full_name: "__mmu_notifier_invalidate_range_end" +} +elf_symbol { + id: 0xf21b462a + name: "__mmu_notifier_invalidate_range_start" + is_defined: true + symbol_type: FUNCTION + crc: 0x85fa6f3e + type_id: 0x954c34e8 + full_name: "__mmu_notifier_invalidate_range_start" +} elf_symbol { id: 0x68d1b187 name: "__mod_lruvec_state" @@ -430283,6 +430644,15 @@ elf_symbol { type_id: 0x9a308be1 full_name: "__sync_dirty_buffer" } +elf_symbol { + id: 0x91982179 + name: "__sync_icache_dcache" + is_defined: true + symbol_type: FUNCTION + crc: 0xa46f73d9 + type_id: 0x28b688ad + full_name: "__sync_icache_dcache" +} elf_symbol { id: 0x04e4f57e name: "__sysfs_match_string" @@ -434027,6 +434397,114 @@ elf_symbol { type_id: 0x9b883042 full_name: "__traceiter_android_vh_mm_compaction_end" } +elf_symbol { + id: 0x28fd3694 + name: "__traceiter_android_vh_mm_customize_ac" + is_defined: true + symbol_type: FUNCTION + crc: 0xad78ec2a + type_id: 0x98787515 + full_name: "__traceiter_android_vh_mm_customize_ac" +} +elf_symbol { + id: 0x7ae1ceca + name: "__traceiter_android_vh_mm_customize_alloc_anon_thp" + is_defined: true + symbol_type: FUNCTION + crc: 0x5d1fcfc0 + type_id: 0x9b7582d1 + full_name: "__traceiter_android_vh_mm_customize_alloc_anon_thp" +} +elf_symbol { + id: 0x7a520c7e + name: "__traceiter_android_vh_mm_customize_file_is_tiny" + is_defined: true + symbol_type: FUNCTION + crc: 0x1e60c212 + type_id: 0x9aa1ff3f + full_name: "__traceiter_android_vh_mm_customize_file_is_tiny" +} +elf_symbol { + id: 0xf50e3b1c + name: "__traceiter_android_vh_mm_customize_longterm_pinnable" + is_defined: true + symbol_type: FUNCTION + crc: 0x5ad01975 + type_id: 0x9b2e0ad9 + full_name: "__traceiter_android_vh_mm_customize_longterm_pinnable" +} +elf_symbol { + id: 0x7637ee8f + name: "__traceiter_android_vh_mm_customize_pgdat_balanced" + is_defined: true + symbol_type: FUNCTION + crc: 0x36e44184 + type_id: 0x9a2ab257 + full_name: "__traceiter_android_vh_mm_customize_pgdat_balanced" +} +elf_symbol { + id: 0x5581ff5d + name: "__traceiter_android_vh_mm_customize_reclaim_idx" + is_defined: true + symbol_type: FUNCTION + crc: 0xc8158c86 + type_id: 0x9a0f517b + full_name: "__traceiter_android_vh_mm_customize_reclaim_idx" +} +elf_symbol { + id: 0x46918874 + name: "__traceiter_android_vh_mm_customize_rmqueue" + is_defined: true + symbol_type: FUNCTION + crc: 0xb8fa6e3c + type_id: 0x9b973ccf + full_name: "__traceiter_android_vh_mm_customize_rmqueue" +} +elf_symbol { + id: 0x0b6a1d80 + name: "__traceiter_android_vh_mm_customize_suitable_zone" + is_defined: true + symbol_type: FUNCTION + crc: 0x998dda60 + type_id: 0x9bbbc132 + full_name: "__traceiter_android_vh_mm_customize_suitable_zone" +} +elf_symbol { + id: 0xe3aae346 + name: "__traceiter_android_vh_mm_customize_wmark_ok" + is_defined: true + symbol_type: FUNCTION + crc: 0x6548ff88 + type_id: 0x9b977fed + full_name: "__traceiter_android_vh_mm_customize_wmark_ok" +} +elf_symbol { + id: 0xcbb71c7c + name: "__traceiter_android_vh_mm_customize_zone_can_compact" + is_defined: true + symbol_type: FUNCTION + crc: 0x9b4d5112 + type_id: 0x9b82457e + full_name: "__traceiter_android_vh_mm_customize_zone_can_compact" +} +elf_symbol { + id: 0x2be8352c + name: "__traceiter_android_vh_mm_customize_zone_max_order" + is_defined: true + symbol_type: FUNCTION + crc: 0x9804e6a7 + type_id: 0x9b82e086 + full_name: "__traceiter_android_vh_mm_customize_zone_max_order" +} +elf_symbol { + id: 0xa792d107 + name: "__traceiter_android_vh_mm_customize_zone_pageset" + is_defined: true + symbol_type: FUNCTION + crc: 0x8aa5235e + type_id: 0x9b82a930 + full_name: "__traceiter_android_vh_mm_customize_zone_pageset" +} elf_symbol { id: 0x9f58159a name: "__traceiter_android_vh_mm_direct_reclaim_enter" @@ -434045,6 +434523,15 @@ elf_symbol { type_id: 0x9b7ba7c5 full_name: "__traceiter_android_vh_mm_direct_reclaim_exit" } +elf_symbol { + id: 0x4df97812 + name: "__traceiter_android_vh_mm_do_madvise_bypass" + is_defined: true + symbol_type: FUNCTION + crc: 0x8285b7a9 + type_id: 0x9bcc7570 + full_name: "__traceiter_android_vh_mm_do_madvise_bypass" +} elf_symbol { id: 0x3fe16974 name: "__traceiter_android_vh_mm_free_page" @@ -434054,6 +434541,15 @@ elf_symbol { type_id: 0x9bb5b719 full_name: "__traceiter_android_vh_mm_free_page" } +elf_symbol { + id: 0x945dd126 + name: "__traceiter_android_vh_mm_isolate_priv_lru" + is_defined: true + symbol_type: FUNCTION + crc: 0x181f0281 + type_id: 0x9b6c13bd + full_name: "__traceiter_android_vh_mm_isolate_priv_lru" +} elf_symbol { id: 0x6f5c8275 name: "__traceiter_android_vh_mm_kcompactd_cpu_online" @@ -434072,6 +434568,42 @@ elf_symbol { type_id: 0x9b52c397 full_name: "__traceiter_android_vh_mm_may_oom_exit" } +elf_symbol { + id: 0xe4f0b2cf + name: "__traceiter_android_vh_mm_migrate_one_page" + is_defined: true + symbol_type: FUNCTION + crc: 0x965ae812 + type_id: 0x9bbb71e7 + full_name: "__traceiter_android_vh_mm_migrate_one_page" +} +elf_symbol { + id: 0xe8aea3fa + name: "__traceiter_android_vh_mm_remove_migration_pte_bypass" + is_defined: true + symbol_type: FUNCTION + crc: 0x9ff89bc4 + type_id: 0x9b28383c + full_name: "__traceiter_android_vh_mm_remove_migration_pte_bypass" +} +elf_symbol { + id: 0x1239ea28 + name: "__traceiter_android_vh_mm_split_huge_page_bypass" + is_defined: true + symbol_type: FUNCTION + crc: 0xe65f629a + type_id: 0x9bba6684 + full_name: "__traceiter_android_vh_mm_split_huge_page_bypass" +} +elf_symbol { + id: 0x5ab6c4f4 + name: "__traceiter_android_vh_mm_try_split_folio_bypass" + is_defined: true + symbol_type: FUNCTION + crc: 0x729850bb + type_id: 0x9b2e0ad9 + full_name: "__traceiter_android_vh_mm_try_split_folio_bypass" +} elf_symbol { id: 0xe44dacb1 name: "__traceiter_android_vh_mmap_region" @@ -440390,6 +440922,114 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_mm_compaction_end" } +elf_symbol { + id: 0xd947b2e6 + name: "__tracepoint_android_vh_mm_customize_ac" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_customize_ac" +} +elf_symbol { + id: 0xca5762cc + name: "__tracepoint_android_vh_mm_customize_alloc_anon_thp" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_customize_alloc_anon_thp" +} +elf_symbol { + id: 0x2e4d22dc + name: "__tracepoint_android_vh_mm_customize_file_is_tiny" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_customize_file_is_tiny" +} +elf_symbol { + id: 0xa567d3d6 + name: "__tracepoint_android_vh_mm_customize_longterm_pinnable" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_customize_longterm_pinnable" +} +elf_symbol { + id: 0x9ba36d51 + name: "__tracepoint_android_vh_mm_customize_pgdat_balanced" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_customize_pgdat_balanced" +} +elf_symbol { + id: 0x13a076a3 + name: "__tracepoint_android_vh_mm_customize_reclaim_idx" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_customize_reclaim_idx" +} +elf_symbol { + id: 0x19f24652 + name: "__tracepoint_android_vh_mm_customize_rmqueue" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_customize_rmqueue" +} +elf_symbol { + id: 0x94940652 + name: "__tracepoint_android_vh_mm_customize_suitable_zone" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_customize_suitable_zone" +} +elf_symbol { + id: 0x5aa8da08 + name: "__tracepoint_android_vh_mm_customize_wmark_ok" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_customize_wmark_ok" +} +elf_symbol { + id: 0x329b593e + name: "__tracepoint_android_vh_mm_customize_zone_can_compact" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_customize_zone_can_compact" +} +elf_symbol { + id: 0x4c4316c6 + name: "__tracepoint_android_vh_mm_customize_zone_max_order" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_customize_zone_max_order" +} +elf_symbol { + id: 0xc25513c9 + name: "__tracepoint_android_vh_mm_customize_zone_pageset" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_customize_zone_pageset" +} elf_symbol { id: 0xd333a65c name: "__tracepoint_android_vh_mm_direct_reclaim_enter" @@ -440408,6 +441048,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_mm_direct_reclaim_exit" } +elf_symbol { + id: 0x56c6a2a4 + name: "__tracepoint_android_vh_mm_do_madvise_bypass" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_do_madvise_bypass" +} elf_symbol { id: 0x533ca98e name: "__tracepoint_android_vh_mm_free_page" @@ -440417,6 +441066,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_mm_free_page" } +elf_symbol { + id: 0xba9e92f8 + name: "__tracepoint_android_vh_mm_isolate_priv_lru" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_isolate_priv_lru" +} elf_symbol { id: 0x0f593caf name: "__tracepoint_android_vh_mm_kcompactd_cpu_online" @@ -440435,6 +441093,42 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_mm_may_oom_exit" } +elf_symbol { + id: 0x1c2aa835 + name: "__tracepoint_android_vh_mm_migrate_one_page" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_migrate_one_page" +} +elf_symbol { + id: 0x806568cc + name: "__tracepoint_android_vh_mm_remove_migration_pte_bypass" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_remove_migration_pte_bypass" +} +elf_symbol { + id: 0x17727af2 + name: "__tracepoint_android_vh_mm_split_huge_page_bypass" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_split_huge_page_bypass" +} +elf_symbol { + id: 0x3a8ae6f6 + name: "__tracepoint_android_vh_mm_try_split_folio_bypass" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_mm_try_split_folio_bypass" +} elf_symbol { id: 0xb6da564f name: "__tracepoint_android_vh_mmap_region" @@ -449078,6 +449772,15 @@ elf_symbol { type_id: 0x264eeece full_name: "contig_page_data" } +elf_symbol { + id: 0xed93031e + name: "contpte_ptep_get" + is_defined: true + symbol_type: FUNCTION + crc: 0x153ee50a + type_id: 0x903d767c + full_name: "contpte_ptep_get" +} elf_symbol { id: 0xfda11a25 name: "contpte_ptep_test_and_clear_young" @@ -475136,6 +475839,15 @@ elf_symbol { type_id: 0x1567dd7e full_name: "memblock_free" } +elf_symbol { + id: 0x74ff0875 + name: "memcg1_charge_batch" + is_defined: true + symbol_type: FUNCTION + crc: 0xdf21ea2e + type_id: 0x171aa7bf + full_name: "memcg1_charge_batch" +} elf_symbol { id: 0x73553ac1 name: "memcg_kmem_online_key" @@ -475952,6 +476664,15 @@ elf_symbol { type_id: 0x370ec98c full_name: "mm_get_unmapped_area" } +elf_symbol { + id: 0x77577e05 + name: "mm_trace_rss_stat" + is_defined: true + symbol_type: FUNCTION + crc: 0xdfb03736 + type_id: 0x17c96337 + full_name: "mm_trace_rss_stat" +} elf_symbol { id: 0xd328c906 name: "mmc_add_host" @@ -476665,6 +477386,24 @@ elf_symbol { type_id: 0x5e30cdcf full_name: "mt_find_after" } +elf_symbol { + id: 0x250d34b3 + name: "mte_sync_tags" + is_defined: true + symbol_type: FUNCTION + crc: 0xb89ff97d + type_id: 0x29a09d35 + full_name: "mte_sync_tags" +} +elf_symbol { + id: 0x3edb325c + name: "mthp_stats" + is_defined: true + symbol_type: OBJECT + crc: 0xd1307ecf + type_id: 0x06deb287 + full_name: "mthp_stats" +} elf_symbol { id: 0xf51250a8 name: "mtree_destroy" @@ -497149,6 +497888,15 @@ elf_symbol { type_id: 0x1d20fb22 full_name: "suspend_set_ops" } +elf_symbol { + id: 0xf85d5428 + name: "swap_migration_ad_supported" + is_defined: true + symbol_type: OBJECT + crc: 0x3239fbdb + type_id: 0x6d7f5ff6 + full_name: "swap_migration_ad_supported" +} elf_symbol { id: 0x2906b2b1 name: "swapcache_mapping" @@ -497158,6 +497906,15 @@ elf_symbol { type_id: 0x637004ab full_name: "swapcache_mapping" } +elf_symbol { + id: 0x4f8cf52d + name: "swapper_spaces" + is_defined: true + symbol_type: OBJECT + crc: 0x912821da + type_id: 0x1e6e5d77 + full_name: "swapper_spaces" +} elf_symbol { id: 0x89128868 name: "swp_swapcount" @@ -508946,6 +509703,15 @@ elf_symbol { type_id: 0x9d80e32f full_name: "zlib_inflate_workspacesize" } +elf_symbol { + id: 0x81ebc916 + name: "zone_pageset_high_and_batch_update" + is_defined: true + symbol_type: FUNCTION + crc: 0x2771bc69 + type_id: 0x1384480b + full_name: "zone_pageset_high_and_batch_update" +} elf_symbol { id: 0xb59d09c8 name: "zs_compact" @@ -509198,6 +509964,7 @@ interface { symbol_id: 0x9339caba symbol_id: 0xc7d06fb9 symbol_id: 0xac1ff1ce + symbol_id: 0x53e1f306 symbol_id: 0xc266357d symbol_id: 0xba429af2 symbol_id: 0xe495eb53 @@ -509407,6 +510174,9 @@ interface { symbol_id: 0x49293097 symbol_id: 0x0ba13d85 symbol_id: 0x603dcc7d + symbol_id: 0x249b7a28 + symbol_id: 0xbbe3e68b + symbol_id: 0xf21b462a symbol_id: 0x68d1b187 symbol_id: 0x9de4c040 symbol_id: 0x89d01efd @@ -509549,6 +510319,7 @@ interface { symbol_id: 0x243936f1 symbol_id: 0x9337f371 symbol_id: 0xd8a7d75e + symbol_id: 0x91982179 symbol_id: 0x04e4f57e symbol_id: 0xb04d8b58 symbol_id: 0xd7d29ff4 @@ -509965,11 +510736,29 @@ interface { symbol_id: 0xf8413699 symbol_id: 0x22de652b symbol_id: 0xf928bf8a + symbol_id: 0x28fd3694 + symbol_id: 0x7ae1ceca + symbol_id: 0x7a520c7e + symbol_id: 0xf50e3b1c + symbol_id: 0x7637ee8f + symbol_id: 0x5581ff5d + symbol_id: 0x46918874 + symbol_id: 0x0b6a1d80 + symbol_id: 0xe3aae346 + symbol_id: 0xcbb71c7c + symbol_id: 0x2be8352c + symbol_id: 0xa792d107 symbol_id: 0x9f58159a symbol_id: 0x29c67d40 + symbol_id: 0x4df97812 symbol_id: 0x3fe16974 + symbol_id: 0x945dd126 symbol_id: 0x6f5c8275 symbol_id: 0xf182fb15 + symbol_id: 0xe4f0b2cf + symbol_id: 0xe8aea3fa + symbol_id: 0x1239ea28 + symbol_id: 0x5ab6c4f4 symbol_id: 0xe44dacb1 symbol_id: 0x5612c9d1 symbol_id: 0xa77effd1 @@ -510672,11 +511461,29 @@ interface { symbol_id: 0xb32b3b17 symbol_id: 0xa3d5f70d symbol_id: 0x72c79d80 + symbol_id: 0xd947b2e6 + symbol_id: 0xca5762cc + symbol_id: 0x2e4d22dc + symbol_id: 0xa567d3d6 + symbol_id: 0x9ba36d51 + symbol_id: 0x13a076a3 + symbol_id: 0x19f24652 + symbol_id: 0x94940652 + symbol_id: 0x5aa8da08 + symbol_id: 0x329b593e + symbol_id: 0x4c4316c6 + symbol_id: 0xc25513c9 symbol_id: 0xd333a65c symbol_id: 0xddcff44a + symbol_id: 0x56c6a2a4 symbol_id: 0x533ca98e + symbol_id: 0xba9e92f8 symbol_id: 0x0f593caf symbol_id: 0x47bcd15f + symbol_id: 0x1c2aa835 + symbol_id: 0x806568cc + symbol_id: 0x17727af2 + symbol_id: 0x3a8ae6f6 symbol_id: 0xb6da564f symbol_id: 0x41c8d09b symbol_id: 0xe2ad11db @@ -511638,6 +512445,7 @@ interface { symbol_id: 0xca337eb1 symbol_id: 0x2a36ed7a symbol_id: 0x9e7d8d76 + symbol_id: 0xed93031e symbol_id: 0xfda11a25 symbol_id: 0x467808dd symbol_id: 0x610edc84 @@ -514529,6 +515337,7 @@ interface { symbol_id: 0x01e78001 symbol_id: 0x746374fa symbol_id: 0x4fb91c54 + symbol_id: 0x74ff0875 symbol_id: 0x73553ac1 symbol_id: 0x79d24533 symbol_id: 0xbf158d63 @@ -514620,6 +515429,7 @@ interface { symbol_id: 0x44d7532c symbol_id: 0x11b2685a symbol_id: 0x5b9fb8b8 + symbol_id: 0x77577e05 symbol_id: 0xd328c906 symbol_id: 0x9a282ce3 symbol_id: 0x6d94d2a1 @@ -514699,6 +515509,8 @@ interface { symbol_id: 0x1a083689 symbol_id: 0x93025e57 symbol_id: 0xd8fe8d53 + symbol_id: 0x250d34b3 + symbol_id: 0x3edb325c symbol_id: 0xf51250a8 symbol_id: 0xac3def84 symbol_id: 0x92a79c22 @@ -516974,7 +517786,9 @@ interface { symbol_id: 0xfb52ace2 symbol_id: 0xdf289104 symbol_id: 0x44e002a2 + symbol_id: 0xf85d5428 symbol_id: 0x2906b2b1 + symbol_id: 0x4f8cf52d symbol_id: 0x89128868 symbol_id: 0xa24d2a51 symbol_id: 0x1fe11014 @@ -518284,6 +519098,7 @@ interface { symbol_id: 0xd7745fba symbol_id: 0xd9789392 symbol_id: 0x74942776 + symbol_id: 0x81ebc916 symbol_id: 0xb59d09c8 symbol_id: 0x2242c82d symbol_id: 0xc25d24ef diff --git a/gki/aarch64/symbols/vivo b/gki/aarch64/symbols/vivo index db2ab3732fd94..e9998d8c46068 100644 --- a/gki/aarch64/symbols/vivo +++ b/gki/aarch64/symbols/vivo @@ -10,7 +10,9 @@ blk_stat_disable_accounting blk_stat_enable_accounting __brelse + __contpte_try_fold class_find_device + contpte_ptep_get elevator_alloc elv_register elv_unregister @@ -23,9 +25,16 @@ kblockd_mod_delayed_work_on kern_path __lock_buffer + __mmu_notifier_arch_invalidate_secondary_tlbs + __mmu_notifier_invalidate_range_end + __mmu_notifier_invalidate_range_start + memcg1_charge_batch mempool_kfree mempool_kmalloc mipi_dsi_dcs_write + mm_trace_rss_stat + mte_sync_tags + mthp_stats __neigh_create netdev_is_rx_handler_busy noop_qdisc @@ -63,13 +72,17 @@ seq_read_iter set_blocksize __set_task_comm + __sync_icache_dcache set_task_ioprio skb_orphan_partial submit_bh + swap_migration_ad_supported + swapper_spaces tcf_block_get tcf_block_put tcf_classify timer_reduce + zone_pageset_high_and_batch_update cpufreq_unregister_notifier jiffies64_to_nsecs profile_event_unregister @@ -138,7 +151,25 @@ __traceiter_android_vh_lruvec_add_folio __traceiter_android_vh_lruvec_del_folio __traceiter_android_vh_mglru_aging_bypass + __traceiter_android_vh_mm_customize_ac + __traceiter_android_vh_mm_customize_alloc_anon_thp + __traceiter_android_vh_mm_customize_file_is_tiny + __traceiter_android_vh_mm_customize_longterm_pinnable + __traceiter_android_vh_mm_customize_pgdat_balanced + __traceiter_android_vh_mm_customize_reclaim_idx + __traceiter_android_vh_mm_customize_rmqueue + __traceiter_android_vh_mm_customize_suitable_zone + __traceiter_android_vh_mm_customize_wmark_ok + __traceiter_android_vh_mm_customize_zone_can_compact + __traceiter_android_vh_mm_customize_zone_max_order + __traceiter_android_vh_mm_customize_zone_pageset + __traceiter_android_vh_mm_do_madvise_bypass __traceiter_android_vh_mm_free_page + __traceiter_android_vh_mm_isolate_priv_lru + __traceiter_android_vh_mm_migrate_one_page + __traceiter_android_vh_mm_remove_migration_pte_bypass + __traceiter_android_vh_mm_split_huge_page_bypass + __traceiter_android_vh_mm_try_split_folio_bypass __traceiter_android_vh_mmap_region __traceiter_android_vh_mutex_unlock_slowpath __traceiter_android_vh_mutex_unlock_slowpath_before_wakeq @@ -253,7 +284,25 @@ __tracepoint_android_vh_lruvec_add_folio __tracepoint_android_vh_lruvec_del_folio __tracepoint_android_vh_mglru_aging_bypass + __tracepoint_android_vh_mm_customize_ac + __tracepoint_android_vh_mm_customize_alloc_anon_thp + __tracepoint_android_vh_mm_customize_file_is_tiny + __tracepoint_android_vh_mm_customize_longterm_pinnable + __tracepoint_android_vh_mm_customize_pgdat_balanced + __tracepoint_android_vh_mm_customize_reclaim_idx + __tracepoint_android_vh_mm_customize_rmqueue + __tracepoint_android_vh_mm_customize_suitable_zone + __tracepoint_android_vh_mm_customize_wmark_ok + __tracepoint_android_vh_mm_customize_zone_can_compact + __tracepoint_android_vh_mm_customize_zone_max_order + __tracepoint_android_vh_mm_customize_zone_pageset + __tracepoint_android_vh_mm_do_madvise_bypass __tracepoint_android_vh_mm_free_page + __tracepoint_android_vh_mm_isolate_priv_lru + __tracepoint_android_vh_mm_migrate_one_page + __tracepoint_android_vh_mm_remove_migration_pte_bypass + __tracepoint_android_vh_mm_split_huge_page_bypass + __tracepoint_android_vh_mm_try_split_folio_bypass __tracepoint_android_vh_mmap_region __tracepoint_android_vh_mutex_unlock_slowpath __tracepoint_android_vh_mutex_unlock_slowpath_before_wakeq -- GitLab From 1ccd114e35d885f2014330261fc413658ce056ca Mon Sep 17 00:00:00 2001 From: Roy Luo Date: Wed, 12 Mar 2025 22:34:34 +0000 Subject: [PATCH 2186/2211] UPSTREAM: usb: dwc3: core: Avoid redundant system suspend/resume callbacks dwc3 device suspend/resume callbacks were being triggered during system suspend and resume even if the device was already runtime-suspended. This is redundant for device mode because the suspend and resume routines are essentially identical for system PM and runtime PM. To prevent these unnecessary callbacks, indicate to the PM core that it can safely leave the device in runtime suspend if it's already runtime-suspended in device mode by returning a positive value in prepare() callback. This optimization only applies to devices without pinctrl, as pinctrl has distinct logic tied to system suspend/resume. Signed-off-by: Roy Luo Acked-by: Thinh Nguyen Link: https://lore.kernel.org/r/20250312223434.3071598-1-royluo@google.com Signed-off-by: Greg Kroah-Hartman Bug: 394262559 Change-Id: If119cf8569105fe2f0d7613e932bd0db24ef4e07 (cherry picked from commit 850e634006f453d57fffe86ca07da15713dea3b8) Signed-off-by: Roy Luo --- drivers/usb/dwc3/core.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index a30643bd46f2d..4e3845ec13bfc 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -2651,14 +2652,31 @@ static void dwc3_complete(struct device *dev) dwc3_writel(dwc->regs, DWC3_GUCTL3, reg); } } + +static int dwc3_prepare(struct device *dev) +{ + struct dwc3 *dwc = dev_get_drvdata(dev); + + /* + * Indicate to the PM core that it may safely leave the device in + * runtime suspend if runtime-suspended already in device mode. + */ + if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_DEVICE && + pm_runtime_suspended(dev) && + !dev_pinctrl(dev)) + return 1; + + return 0; +} #else #define dwc3_complete NULL +#define dwc3_prepare NULL #endif /* CONFIG_PM_SLEEP */ static const struct dev_pm_ops dwc3_dev_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS(dwc3_suspend, dwc3_resume) .complete = dwc3_complete, - + .prepare = dwc3_prepare, /* * Runtime suspend halts the controller on disconnection. It relies on * platforms with custom connection notification to start the controller -- GitLab From ba125a42ce6eb0ed447f9939fef5b04385ec42b5 Mon Sep 17 00:00:00 2001 From: Huan Tang Date: Fri, 23 May 2025 14:46:04 +0800 Subject: [PATCH 2187/2211] BACKPORT: FROMGIT: scsi: ufs: core: Add HID support Follow JESD220G, support HID(Host Initiated Defragmentation) through sysfs, the relevant sysfs nodes are as follows: 1. analysis_trigger 2. defrag_trigger 3. fragmented_size 4. defrag_size 5. progress_ratio 6. state The detailed definition of the six nodes can be found in the sysfs documentation. HID's execution policy is given to user-space. Signed-off-by: Huan Tang Signed-off-by: Wenxing Cheng Link: https://lore.kernel.org/r/20250523064604.800-1-tanghuan@vivo.com Suggested-by: Bart Van Assche Reviewed-by: Peter Wang Reviewed-by: Bean Huo Reviewed-by: Bart Van Assche Reviewed-by: Yangtao Li Signed-off-by: Martin K. Petersen Bug: 435744113 Change-Id: Ib2348157694d3b57dab2da9f8b47be5b0bccf42d (cherry picked from commit ae7795a8c2582b5fb7971132753810a3f158e7b2 https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next) [ bvanassche: introduced struct ufs_hba_priv ] Signed-off-by: Bart Van Assche --- Documentation/ABI/testing/sysfs-driver-ufs | 83 +++++++++ drivers/ufs/core/ufs-sysfs.c | 190 +++++++++++++++++++++ drivers/ufs/core/ufshcd-priv.h | 10 ++ drivers/ufs/core/ufshcd.c | 6 +- include/ufs/ufs.h | 28 +++ 5 files changed, 316 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-driver-ufs b/Documentation/ABI/testing/sysfs-driver-ufs index 0397664e869a0..5bfccd6343f7e 100644 --- a/Documentation/ABI/testing/sysfs-driver-ufs +++ b/Documentation/ABI/testing/sysfs-driver-ufs @@ -1636,3 +1636,86 @@ Description: attribute value. The attribute is read only. + +What: /sys/bus/platform/drivers/ufshcd/*/hid/analysis_trigger +What: /sys/bus/platform/devices/*.ufs/hid/analysis_trigger +Date: May 2025 +Contact: Huan Tang +Description: + The host can enable or disable HID analysis operation. + + ======= ========================================= + disable disable HID analysis operation + enable enable HID analysis operation + ======= ========================================= + + The file is write only. + +What: /sys/bus/platform/drivers/ufshcd/*/hid/defrag_trigger +What: /sys/bus/platform/devices/*.ufs/hid/defrag_trigger +Date: May 2025 +Contact: Huan Tang +Description: + The host can enable or disable HID defragmentation operation. + + ======= ========================================= + disable disable HID defragmentation operation + enable enable HID defragmentation operation + ======= ========================================= + + The attribute is write only. + +What: /sys/bus/platform/drivers/ufshcd/*/hid/fragmented_size +What: /sys/bus/platform/devices/*.ufs/hid/fragmented_size +Date: May 2025 +Contact: Huan Tang +Description: + The total fragmented size in the device is reported through + this attribute. + + The attribute is read only. + +What: /sys/bus/platform/drivers/ufshcd/*/hid/defrag_size +What: /sys/bus/platform/devices/*.ufs/hid/defrag_size +Date: May 2025 +Contact: Huan Tang +Description: + The host sets the size to be defragmented by an HID + defragmentation operation. + + The attribute is read/write. + +What: /sys/bus/platform/drivers/ufshcd/*/hid/progress_ratio +What: /sys/bus/platform/devices/*.ufs/hid/progress_ratio +Date: May 2025 +Contact: Huan Tang +Description: + Defragmentation progress is reported by this attribute, + indicates the ratio of the completed defragmentation size + over the requested defragmentation size. + + ==== ============================================ + 1 1% + ... + 100 100% + ==== ============================================ + + The attribute is read only. + +What: /sys/bus/platform/drivers/ufshcd/*/hid/state +What: /sys/bus/platform/devices/*.ufs/hid/state +Date: May 2025 +Contact: Huan Tang +Description: + The HID state is reported by this attribute. + + ==================== =========================== + idle Idle (analysis required) + analysis_in_progress Analysis in progress + defrag_required Defrag required + defrag_in_progress Defrag in progress + defrag_completed Defrag completed + defrag_not_required Defrag is not required + ==================== =========================== + + The attribute is read only. diff --git a/drivers/ufs/core/ufs-sysfs.c b/drivers/ufs/core/ufs-sysfs.c index 964983bceb8fc..354e825123579 100644 --- a/drivers/ufs/core/ufs-sysfs.c +++ b/drivers/ufs/core/ufs-sysfs.c @@ -57,6 +57,23 @@ static const char *ufs_hs_gear_to_string(enum ufs_hs_gear_tag gear) } } +static const char * const ufs_hid_states[] = { + [HID_IDLE] = "idle", + [ANALYSIS_IN_PROGRESS] = "analysis_in_progress", + [DEFRAG_REQUIRED] = "defrag_required", + [DEFRAG_IN_PROGRESS] = "defrag_in_progress", + [DEFRAG_COMPLETED] = "defrag_completed", + [DEFRAG_NOT_REQUIRED] = "defrag_not_required", +}; + +static const char *ufs_hid_state_to_string(enum ufs_hid_state state) +{ + if (state < NUM_UFS_HID_STATES) + return ufs_hid_states[state]; + + return "unknown"; +} + static const char *ufshcd_uic_link_state_to_string( enum uic_link_state state) { @@ -1627,6 +1644,178 @@ static const struct attribute_group ufs_sysfs_attributes_group = { .attrs = ufs_sysfs_attributes, }; +static int hid_query_attr(struct ufs_hba *hba, enum query_opcode opcode, + enum attr_idn idn, u32 *attr_val) +{ + int ret; + + down(&hba->host_sem); + if (!ufshcd_is_user_access_allowed(hba)) { + up(&hba->host_sem); + return -EBUSY; + } + + ufshcd_rpm_get_sync(hba); + ret = ufshcd_query_attr(hba, opcode, idn, 0, 0, attr_val); + ufshcd_rpm_put_sync(hba); + + up(&hba->host_sem); + return ret; +} + +static ssize_t analysis_trigger_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct ufs_hba *hba = dev_get_drvdata(dev); + int mode; + int ret; + + if (sysfs_streq(buf, "enable")) + mode = HID_ANALYSIS_ENABLE; + else if (sysfs_streq(buf, "disable")) + mode = HID_ANALYSIS_AND_DEFRAG_DISABLE; + else + return -EINVAL; + + ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, + QUERY_ATTR_IDN_HID_DEFRAG_OPERATION, &mode); + + return ret < 0 ? ret : count; +} + +static DEVICE_ATTR_WO(analysis_trigger); + +static ssize_t defrag_trigger_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct ufs_hba *hba = dev_get_drvdata(dev); + int mode; + int ret; + + if (sysfs_streq(buf, "enable")) + mode = HID_ANALYSIS_AND_DEFRAG_ENABLE; + else if (sysfs_streq(buf, "disable")) + mode = HID_ANALYSIS_AND_DEFRAG_DISABLE; + else + return -EINVAL; + + ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, + QUERY_ATTR_IDN_HID_DEFRAG_OPERATION, &mode); + + return ret < 0 ? ret : count; +} + +static DEVICE_ATTR_WO(defrag_trigger); + +static ssize_t fragmented_size_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ufs_hba *hba = dev_get_drvdata(dev); + u32 value; + int ret; + + ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, + QUERY_ATTR_IDN_HID_AVAILABLE_SIZE, &value); + if (ret) + return ret; + + return sysfs_emit(buf, "%u\n", value); +} + +static DEVICE_ATTR_RO(fragmented_size); + +static ssize_t defrag_size_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ufs_hba *hba = dev_get_drvdata(dev); + u32 value; + int ret; + + ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, + QUERY_ATTR_IDN_HID_SIZE, &value); + if (ret) + return ret; + + return sysfs_emit(buf, "%u\n", value); +} + +static ssize_t defrag_size_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct ufs_hba *hba = dev_get_drvdata(dev); + u32 value; + int ret; + + if (kstrtou32(buf, 0, &value)) + return -EINVAL; + + ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, + QUERY_ATTR_IDN_HID_SIZE, &value); + + return ret < 0 ? ret : count; +} + +static DEVICE_ATTR_RW(defrag_size); + +static ssize_t progress_ratio_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ufs_hba *hba = dev_get_drvdata(dev); + u32 value; + int ret; + + ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, + QUERY_ATTR_IDN_HID_PROGRESS_RATIO, &value); + if (ret) + return ret; + + return sysfs_emit(buf, "%u\n", value); +} + +static DEVICE_ATTR_RO(progress_ratio); + +static ssize_t state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ufs_hba *hba = dev_get_drvdata(dev); + u32 value; + int ret; + + ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, + QUERY_ATTR_IDN_HID_STATE, &value); + if (ret) + return ret; + + return sysfs_emit(buf, "%s\n", ufs_hid_state_to_string(value)); +} + +static DEVICE_ATTR_RO(state); + +static struct attribute *ufs_sysfs_hid[] = { + &dev_attr_analysis_trigger.attr, + &dev_attr_defrag_trigger.attr, + &dev_attr_fragmented_size.attr, + &dev_attr_defrag_size.attr, + &dev_attr_progress_ratio.attr, + &dev_attr_state.attr, + NULL, +}; + +static umode_t ufs_sysfs_hid_is_visible(struct kobject *kobj, + struct attribute *attr, int n) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct ufs_hba *hba = dev_get_drvdata(dev); + + return to_hba_priv(hba)->hid_sup ? attr->mode : 0; +} + +static const struct attribute_group ufs_sysfs_hid_group = { + .name = "hid", + .attrs = ufs_sysfs_hid, + .is_visible = ufs_sysfs_hid_is_visible, +}; + static const struct attribute_group *ufs_sysfs_groups[] = { &ufs_sysfs_default_group, &ufs_sysfs_capabilities_group, @@ -1641,6 +1830,7 @@ static const struct attribute_group *ufs_sysfs_groups[] = { &ufs_sysfs_string_descriptors_group, &ufs_sysfs_flags_group, &ufs_sysfs_attributes_group, + &ufs_sysfs_hid_group, NULL, }; diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h index 95dd7ebde98e2..d169ec9e5711f 100644 --- a/drivers/ufs/core/ufshcd-priv.h +++ b/drivers/ufs/core/ufshcd-priv.h @@ -6,6 +6,16 @@ #include #include +struct ufs_hba_priv { + struct ufs_hba hba; + bool hid_sup; +}; + +static inline struct ufs_hba_priv *to_hba_priv(struct ufs_hba *hba) +{ + return container_of(hba, struct ufs_hba_priv, hba); +} + static inline bool ufshcd_is_user_access_allowed(struct ufs_hba *hba) { return !hba->shutting_down; diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index 1a782409a30a3..0e6a198e19e9b 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -8533,6 +8533,10 @@ static int ufs_get_device_desc(struct ufs_hba *hba) dev_info->rtt_cap = desc_buf[DEVICE_DESC_PARAM_RTT_CAP]; + to_hba_priv(hba)->hid_sup = get_unaligned_be32(desc_buf + + DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP) & + UFS_DEV_HID_SUPPORT; + model_index = desc_buf[DEVICE_DESC_PARAM_PRDCT_NAME]; err = ufshcd_read_string_desc(hba, model_index, @@ -10607,7 +10611,7 @@ int ufshcd_alloc_host(struct device *dev, struct ufs_hba **hba_handle) } host = scsi_host_alloc(&ufshcd_driver_template, - sizeof(struct ufs_hba)); + sizeof(struct ufs_hba_priv)); if (!host) { dev_err(dev, "scsi_host_alloc failed\n"); err = -ENOMEM; diff --git a/include/ufs/ufs.h b/include/ufs/ufs.h index f923463595acf..9ec9863412491 100644 --- a/include/ufs/ufs.h +++ b/include/ufs/ufs.h @@ -187,6 +187,15 @@ enum attr_idn { QUERY_ATTR_IDN_DEV_LVL_EXCEPTION_ID = 0x34, }; +/* The constants below are not in enum attr_idn to preseve the GKI ABI. */ +enum { + QUERY_ATTR_IDN_HID_DEFRAG_OPERATION = 0x35, + QUERY_ATTR_IDN_HID_AVAILABLE_SIZE = 0x36, + QUERY_ATTR_IDN_HID_SIZE = 0x37, + QUERY_ATTR_IDN_HID_PROGRESS_RATIO = 0x38, + QUERY_ATTR_IDN_HID_STATE = 0x39, +}; + /* Descriptor idn for Query requests */ enum desc_idn { QUERY_DESC_IDN_DEVICE = 0x0, @@ -396,6 +405,7 @@ enum { UFS_DEV_WRITE_BOOSTER_SUP = BIT(8), UFS_DEV_EXT_IID_SUP = BIT(16), UFS_DEV_LVL_EXCEPTION_SUP = BIT(12), + UFS_DEV_HID_SUPPORT = BIT(13), }; #define UFS_DEV_HPB_SUPPORT_VERSION 0x310 @@ -461,6 +471,24 @@ enum ufs_ref_clk_freq { REF_CLK_FREQ_INVAL = -1, }; +/* bDefragOperation attribute values */ +enum ufs_hid_defrag_operation { + HID_ANALYSIS_AND_DEFRAG_DISABLE = 0, + HID_ANALYSIS_ENABLE = 1, + HID_ANALYSIS_AND_DEFRAG_ENABLE = 2, +}; + +/* bHIDState attribute values */ +enum ufs_hid_state { + HID_IDLE = 0, + ANALYSIS_IN_PROGRESS = 1, + DEFRAG_REQUIRED = 2, + DEFRAG_IN_PROGRESS = 3, + DEFRAG_COMPLETED = 4, + DEFRAG_NOT_REQUIRED = 5, + NUM_UFS_HID_STATES = 6, +}; + /* Query response result code */ enum { QUERY_RESULT_SUCCESS = 0x00, -- GitLab From 3140a70d8775d521faf6840d22b8381c99ec1f18 Mon Sep 17 00:00:00 2001 From: "qiwu.chen" Date: Mon, 4 Aug 2025 16:58:03 +0800 Subject: [PATCH 2188/2211] ANDROID: Export memcg functions to allow module to add new files Export cgroup_add_dfl_cftypes to allow vendor module to expose additional files in the memory cgroup-v2 hierarchy. Bug: 435593286 Change-Id: I103b983fbb46ff7a45cfc57f5657142a1bbd3d68 Signed-off-by: qiwu.chen --- kernel/cgroup/cgroup.c | 1 + 1 file changed, 1 insertion(+) diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index 4898181ba50e9..f6fba6f531a42 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -4530,6 +4530,7 @@ int cgroup_add_dfl_cftypes(struct cgroup_subsys *ss, struct cftype *cfts) cft->flags |= __CFTYPE_ONLY_ON_DFL; return cgroup_add_cftypes(ss, cfts); } +EXPORT_SYMBOL_GPL(cgroup_add_dfl_cftypes); /** * cgroup_add_legacy_cftypes - add an array of cftypes for legacy hierarchies -- GitLab From 82154090df0272b481f065f702795332753fb7ac Mon Sep 17 00:00:00 2001 From: "qiwu.chen" Date: Fri, 1 Aug 2025 15:55:40 +0800 Subject: [PATCH 2189/2211] ANDROID: GKI: Update transsion symbol list 1. Create transsion symbol list and add it into additional_kmi_symbol_lists 2. Since memcg version has changed from v1 to v2, it's necessry to export symbol cgroup_add_dfl_cftypes for developing features. 1 function symbol(s) added 'int cgroup_add_dfl_cftypes(struct cgroup_subsys*, struct cftype*)' Bug: 435593286 Change-Id: Ic41d9cc4af4715db75f9038257d8cbf1d1745db9 Signed-off-by: qiwu.chen --- BUILD.bazel | 1 + gki/aarch64/abi.stg | 10 ++++++++++ gki/aarch64/symbols/transsion | 2 ++ 3 files changed, 13 insertions(+) create mode 100644 gki/aarch64/symbols/transsion diff --git a/BUILD.bazel b/BUILD.bazel index ec7863ea9a192..bd0a6e7a58e4a 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -202,6 +202,7 @@ filegroup( "gki/aarch64/symbols/qcom", "gki/aarch64/symbols/rtkstb", "gki/aarch64/symbols/rtktv", + "gki/aarch64/symbols/transsion", "gki/aarch64/symbols/trusty", "gki/aarch64/symbols/tuxera", "gki/aarch64/symbols/type_visibility", diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 050c504d81dd4..f66fdf658164a 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -448226,6 +448226,15 @@ elf_symbol { type_id: 0x1e99dfd1 full_name: "cec_unregister_adapter" } +elf_symbol { + id: 0x4d06ba53 + name: "cgroup_add_dfl_cftypes" + is_defined: true + symbol_type: FUNCTION + crc: 0x0317d731 + type_id: 0x9f4f3809 + full_name: "cgroup_add_dfl_cftypes" +} elf_symbol { id: 0x3c85cae0 name: "cgroup_add_legacy_cftypes" @@ -512273,6 +512282,7 @@ interface { symbol_id: 0xc4e53e95 symbol_id: 0xba1a33c8 symbol_id: 0xe2dc88d9 + symbol_id: 0x4d06ba53 symbol_id: 0x3c85cae0 symbol_id: 0x4ce62869 symbol_id: 0xd7e100b7 diff --git a/gki/aarch64/symbols/transsion b/gki/aarch64/symbols/transsion new file mode 100644 index 0000000000000..899c6061ca530 --- /dev/null +++ b/gki/aarch64/symbols/transsion @@ -0,0 +1,2 @@ +[abi_symbol_list] + cgroup_add_dfl_cftypes -- GitLab From 78c6c49396da8818a53f8955132f7d6cbc822a26 Mon Sep 17 00:00:00 2001 From: Louis Chauvet Date: Tue, 29 Apr 2025 10:36:23 +0200 Subject: [PATCH 2190/2211] UPSTREAM: drm: writeback: Fix drm_writeback_connector_cleanup signature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The drm_writeback_connector_cleanup have the signature: static void drm_writeback_connector_cleanup( struct drm_device *dev, struct drm_writeback_connector *wb_connector) But it is stored and used as a drmres_release_t typedef void (*drmres_release_t)(struct drm_device *dev, void *res); While the current code is valid and does not produce any warning, the CFI runtime check (CONFIG_CFI_CLANG) can fail because the function signature is not the same as drmres_release_t. In order to fix this, change the function signature to match what is expected by drmres_release_t. Fixes: 1914ba2b91ea ("drm: writeback: Create drmm variants for drm_writeback_connector initialization") Suggested-by: Mark Yacoub Reviewed-by: Maíra Canal Link: https://lore.kernel.org/r/20250429-drm-fix-writeback-cleanup-v2-1-548ff3a4e284@bootlin.com Signed-off-by: Louis Chauvet (cherry picked from commit fb721b2c35b1829b8ecf62e3adb41cf30260316a) Bug: 412666164 Test: Disabling VKMS while in-use should not crash Change-Id: Id1770ae460fb20f972fbc60c701483b30f913c19 Signed-off-by: Michael Pobega --- drivers/gpu/drm/drm_writeback.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c index 5b098891deb42..d9b74956d6992 100644 --- a/drivers/gpu/drm/drm_writeback.c +++ b/drivers/gpu/drm/drm_writeback.c @@ -349,17 +349,18 @@ EXPORT_SYMBOL(drm_writeback_connector_init_with_encoder); /** * drm_writeback_connector_cleanup - Cleanup the writeback connector * @dev: DRM device - * @wb_connector: Pointer to the writeback connector to clean up + * @data: Pointer to the writeback connector to clean up * * This will decrement the reference counter of blobs and destroy properties. It * will also clean the remaining jobs in this writeback connector. Caution: This helper will not * clean up the attached encoder and the drm_connector. */ static void drm_writeback_connector_cleanup(struct drm_device *dev, - struct drm_writeback_connector *wb_connector) + void *data) { unsigned long flags; struct drm_writeback_job *pos, *n; + struct drm_writeback_connector *wb_connector = data; delete_writeback_properties(dev); drm_property_blob_put(wb_connector->pixel_formats_blob_ptr); @@ -411,7 +412,7 @@ int drmm_writeback_connector_init(struct drm_device *dev, if (ret) return ret; - ret = drmm_add_action_or_reset(dev, (void *)drm_writeback_connector_cleanup, + ret = drmm_add_action_or_reset(dev, drm_writeback_connector_cleanup, wb_connector); if (ret) return ret; -- GitLab From 052da8f4d40816c8c7522def8c32ccf4dcca35e6 Mon Sep 17 00:00:00 2001 From: Tiffany Yang Date: Tue, 5 Aug 2025 13:42:19 -0700 Subject: [PATCH 2191/2211] ANDROID: Fix implicit enum conversion in ufs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A backport for HID support declared new attribute idns as part of a new anonymous enum instead of enum attr_idn to preserve the android16-6.12 ABI. These were not cast to the correct enum when used, causing the kernelci build errors like the following: drivers/ufs/core/ufs-sysfs.c: In function ‘analysis_trigger_store’: drivers/ufs/core/ufs-sysfs.c:1681:25: error: implicit conversion from ‘enum ’ to ‘enum attr_idn’ [-Werror=enum-conversion] 1681 | QUERY_ATTR_IDN_HID_DEFRAG_OPERATION, &mode); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Cast QUERY_ATTR_IDN_HID_* to enum attr_idn. Fixes: ba125a42ce6e ("BACKPORT: FROMGIT: scsi: ufs: core: Add HID support") Change-Id: I9c690b3feb17f64d54cb218acba92ce4b128e4de Signed-off-by: Tiffany Yang --- drivers/ufs/core/ufs-sysfs.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/ufs/core/ufs-sysfs.c b/drivers/ufs/core/ufs-sysfs.c index 354e825123579..ff7f26b3e6116 100644 --- a/drivers/ufs/core/ufs-sysfs.c +++ b/drivers/ufs/core/ufs-sysfs.c @@ -1678,7 +1678,7 @@ static ssize_t analysis_trigger_store(struct device *dev, return -EINVAL; ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, - QUERY_ATTR_IDN_HID_DEFRAG_OPERATION, &mode); + (enum attr_idn)QUERY_ATTR_IDN_HID_DEFRAG_OPERATION, &mode); return ret < 0 ? ret : count; } @@ -1700,7 +1700,7 @@ static ssize_t defrag_trigger_store(struct device *dev, return -EINVAL; ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, - QUERY_ATTR_IDN_HID_DEFRAG_OPERATION, &mode); + (enum attr_idn)QUERY_ATTR_IDN_HID_DEFRAG_OPERATION, &mode); return ret < 0 ? ret : count; } @@ -1715,7 +1715,7 @@ static ssize_t fragmented_size_show(struct device *dev, int ret; ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, - QUERY_ATTR_IDN_HID_AVAILABLE_SIZE, &value); + (enum attr_idn)QUERY_ATTR_IDN_HID_AVAILABLE_SIZE, &value); if (ret) return ret; @@ -1732,7 +1732,7 @@ static ssize_t defrag_size_show(struct device *dev, int ret; ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, - QUERY_ATTR_IDN_HID_SIZE, &value); + (enum attr_idn)QUERY_ATTR_IDN_HID_SIZE, &value); if (ret) return ret; @@ -1750,7 +1750,7 @@ static ssize_t defrag_size_store(struct device *dev, return -EINVAL; ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, - QUERY_ATTR_IDN_HID_SIZE, &value); + (enum attr_idn)QUERY_ATTR_IDN_HID_SIZE, &value); return ret < 0 ? ret : count; } @@ -1765,7 +1765,7 @@ static ssize_t progress_ratio_show(struct device *dev, int ret; ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, - QUERY_ATTR_IDN_HID_PROGRESS_RATIO, &value); + (enum attr_idn)QUERY_ATTR_IDN_HID_PROGRESS_RATIO, &value); if (ret) return ret; @@ -1782,7 +1782,7 @@ static ssize_t state_show(struct device *dev, int ret; ret = hid_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, - QUERY_ATTR_IDN_HID_STATE, &value); + (enum attr_idn)QUERY_ATTR_IDN_HID_STATE, &value); if (ret) return ret; -- GitLab From a475a3d8e54fc94b672f67bd25552e027370c805 Mon Sep 17 00:00:00 2001 From: Shaleen Agrawal Date: Mon, 4 Aug 2025 14:14:40 -0700 Subject: [PATCH 2192/2211] ANDROID: scmi_cpufreq: Add restricted vendor hook for scmi_limit_notify_cb Include a restricted vendor hook to allow vendor modules to modify thermal updates under scmi notifications. Bug: 436290872 Change-Id: I57e33ea44b66986058008ac83737524a8c31aec0 Signed-off-by: Shaleen Agrawal --- drivers/android/vendor_hooks.c | 1 + drivers/cpufreq/scmi-cpufreq.c | 9 +++++++-- include/trace/hooks/cpufreq.h | 5 +++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index a9f7a2c5fa1e6..0ee9ff2360ec5 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -610,3 +610,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_migrate_one_page); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_remove_migration_pte_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_split_huge_page_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_try_split_folio_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_scmi_limit_notify_cb); diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c index 141389dcf4f7b..e5a9d68088b29 100644 --- a/drivers/cpufreq/scmi-cpufreq.c +++ b/drivers/cpufreq/scmi-cpufreq.c @@ -21,6 +21,7 @@ #include #include #include +#include struct scmi_data { int domain_id; @@ -188,11 +189,15 @@ static int scmi_limit_notify_cb(struct notifier_block *nb, unsigned long event, struct scmi_data *priv = container_of(nb, struct scmi_data, limit_notify_nb); struct scmi_perf_limits_report *limit_notify = data; unsigned int limit_freq_khz; - int ret; + int ret = 0; + bool done; limit_freq_khz = limit_notify->range_max_freq / HZ_PER_KHZ; - ret = freq_qos_update_request(&priv->limits_freq_req, limit_freq_khz); + trace_android_rvh_scmi_limit_notify_cb(&done, priv->cpu_dev, limit_freq_khz); + if (done) + return NOTIFY_OK; + if (ret < 0) pr_warn("failed to update freq constraint: %d\n", ret); diff --git a/include/trace/hooks/cpufreq.h b/include/trace/hooks/cpufreq.h index 4b3f63eef7c08..5414e1b022093 100644 --- a/include/trace/hooks/cpufreq.h +++ b/include/trace/hooks/cpufreq.h @@ -10,6 +10,7 @@ #include struct cpufreq_policy; +struct device; DECLARE_RESTRICTED_HOOK(android_rvh_show_max_freq, TP_PROTO(struct cpufreq_policy *policy, unsigned int *max_freq), @@ -42,6 +43,10 @@ DECLARE_RESTRICTED_HOOK(android_rvh_cpufreq_transition, TP_PROTO(struct cpufreq_policy *policy), TP_ARGS(policy), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_scmi_limit_notify_cb, + TP_PROTO(bool *done, struct device *cpu_dev, unsigned int limit_freq_khz), + TP_ARGS(done, cpu_dev, limit_freq_khz), 1); + #endif /* _TRACE_HOOK_CPUFREQ_H */ /* This part must be outside protection */ #include -- GitLab From 886d2f37b79982531259490548bc83b9216ca685 Mon Sep 17 00:00:00 2001 From: Shaleen Agrawal Date: Mon, 4 Aug 2025 15:15:52 -0700 Subject: [PATCH 2193/2211] ANDROID: qcom: Update the ABI symbol list Add the following symbols to assist with debug: __traceiter_android_rvh_scmi_limit_notify_cb __tracepoint_android_rvh_scmi_limit_notify_cb Bug: 436290872 Change-Id: I041a71cb7fba96fba7e7cef08f11457ef4145d4d Signed-off-by: Shaleen Agrawal --- gki/aarch64/abi.stg | 28 ++++++++++++++++++++++++++++ gki/aarch64/symbols/qcom | 2 ++ 2 files changed, 30 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index f66fdf658164a..8dc0b8c9886e3 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -413489,6 +413489,14 @@ function { parameter_id: 0x18bd6530 parameter_id: 0x11cfee5a } +function { + id: 0x9be905f1 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x11cfee5a + parameter_id: 0x0258f96e + parameter_id: 0x4585663f +} function { id: 0x9be96fa7 return_type_id: 0x6720d32f @@ -431823,6 +431831,15 @@ elf_symbol { type_id: 0x9bcd4ff7 full_name: "__traceiter_android_rvh_schedule_bug" } +elf_symbol { + id: 0xf27119bc + name: "__traceiter_android_rvh_scmi_limit_notify_cb" + is_defined: true + symbol_type: FUNCTION + crc: 0x3b12531c + type_id: 0x9be905f1 + full_name: "__traceiter_android_rvh_scmi_limit_notify_cb" +} elf_symbol { id: 0x0f807f10 name: "__traceiter_android_rvh_select_fallback_rq" @@ -438348,6 +438365,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_rvh_schedule_bug" } +elf_symbol { + id: 0x16e6a696 + name: "__tracepoint_android_rvh_scmi_limit_notify_cb" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_rvh_scmi_limit_notify_cb" +} elf_symbol { id: 0x0daed96e name: "__tracepoint_android_rvh_select_fallback_rq" @@ -510459,6 +510485,7 @@ interface { symbol_id: 0xd7ca6cc8 symbol_id: 0x2bb177b4 symbol_id: 0x40bb3f78 + symbol_id: 0xf27119bc symbol_id: 0x0f807f10 symbol_id: 0xe48752ef symbol_id: 0x4c24a4be @@ -511184,6 +511211,7 @@ interface { symbol_id: 0x43527efa symbol_id: 0x51af6212 symbol_id: 0xa5be18ba + symbol_id: 0x16e6a696 symbol_id: 0x0daed96e symbol_id: 0x3bb904a5 symbol_id: 0xec4d6758 diff --git a/gki/aarch64/symbols/qcom b/gki/aarch64/symbols/qcom index 162fee8f44e42..dfa762423a61b 100644 --- a/gki/aarch64/symbols/qcom +++ b/gki/aarch64/symbols/qcom @@ -3371,6 +3371,7 @@ __traceiter_android_rvh_sched_rebalance_domains __traceiter_android_rvh_sched_setaffinity __traceiter_android_rvh_schedule + __traceiter_android_rvh_scmi_limit_notify_cb __traceiter_android_rvh_select_fallback_rq __traceiter_android_rvh_select_task_rq_fair __traceiter_android_rvh_select_task_rq_rt @@ -3513,6 +3514,7 @@ __tracepoint_android_rvh_sched_rebalance_domains __tracepoint_android_rvh_sched_setaffinity __tracepoint_android_rvh_schedule + __tracepoint_android_rvh_scmi_limit_notify_cb __tracepoint_android_rvh_select_fallback_rq __tracepoint_android_rvh_select_task_rq_fair __tracepoint_android_rvh_select_task_rq_rt -- GitLab From e5a17398e40d988ce7e9c79259eb8b08b5377b43 Mon Sep 17 00:00:00 2001 From: Mukesh Pilaniya Date: Wed, 6 Aug 2025 16:15:32 +0530 Subject: [PATCH 2194/2211] ANDROID: gunyah: Fix use-after-free in gunyah_vm_clean_resources() The gunyah_vm_clean_resources() function was freeing resources without removing them from the ghvm->resources list, leaving dangling pointers that could lead to use-after-free. Fix this by removing each resource from the list before freeing it to ensure lists are empty after cleanup. Bug: 436769530 Change-Id: I16bb2a73dae66cdef9e62f65b93d1487e32a92ce Signed-off-by: Mukesh Pilaniya --- drivers/virt/gunyah/vm_mgr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/virt/gunyah/vm_mgr.c b/drivers/virt/gunyah/vm_mgr.c index 2843385560ba7..7b0bacb512d7f 100644 --- a/drivers/virt/gunyah/vm_mgr.c +++ b/drivers/virt/gunyah/vm_mgr.c @@ -458,6 +458,7 @@ static void gunyah_vm_clean_resources(struct gunyah_vm *ghvm) } list_for_each_entry_safe(ghrsc, riter, &ghvm->resources, list) { + list_del(&ghrsc->list); gunyah_rm_free_resource(ghrsc); } mutex_unlock(&ghvm->resources_lock); -- GitLab From 67ff14c5d0b13db11844f4932e656df1ec078545 Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Fri, 21 Feb 2025 09:56:31 +0000 Subject: [PATCH 2195/2211] UPSTREAM: firmware: arm_ffa: Explicitly cast return value from FFA_VERSION before comparison The return value ver.a0 is unsigned long type and FFA_RET_NOT_SUPPORTED is a negative value. Since the return value from the firmware can be just 32-bit even on 64-bit systems as FFA specification mentions it as int32 error code in w0 register, explicitly casting to s32 ensures correct sign interpretation when comparing against a signed error code FFA_RET_NOT_SUPPORTED. Without casting, comparison between unsigned long and a negative constant could lead to unintended results due to type promotions. Fixes: 3bbfe9871005 ("firmware: arm_ffa: Add initial Arm FFA driver support") Reported-by: Andrei Homescu Message-Id: <20250221095633.506678-1-sudeep.holla@arm.com> Change-Id: I383762ec971bce54f3d8aef564ebfca3b3ab2a0e Signed-off-by: Sudeep Holla (cherry picked from commit cecf6a504137aa238d768ae440a1f6488cb2f436) Signed-off-by: Andrei Homescu Bug: 435501117 --- drivers/firmware/arm_ffa/driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index 846c4948fcfd4..da2703c044746 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -121,7 +121,7 @@ static int ffa_version_check(u32 *version) .a0 = FFA_VERSION, .a1 = FFA_DRIVER_VERSION, }, &ver); - if (ver.a0 == FFA_RET_NOT_SUPPORTED) { + if ((s32)ver.a0 == FFA_RET_NOT_SUPPORTED) { pr_info("FFA_VERSION returned not supported\n"); return -EOPNOTSUPP; } -- GitLab From aac0851fed196dd6f83751371428219b20574873 Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Sun, 23 Feb 2025 21:39:09 +0000 Subject: [PATCH 2196/2211] UPSTREAM: firmware: arm_ffa: Skip the first/partition ID when parsing vCPU list The FF-A notification id list received in response to the call FFA_NOTIFICATION_INFO_GET is encoded as: partition ID followed by 0 or more vCPU ID. The count includes all of them. Fix the issue by skipping the first/partition ID so that only the list of vCPU IDs are processed correctly for a given partition ID. The first/ partition ID is read before the start of the loop. Fixes: 3522be48d82b ("firmware: arm_ffa: Implement the NOTIFICATION_INFO_GET interface") Reported-by: Andrei Homescu Message-Id: <20250223213909.1197786-1-sudeep.holla@arm.com> Change-Id: Ie0a5c851898e0eeeefd7e9d5dc620196d4e6eb20 Signed-off-by: Sudeep Holla (cherry picked from commit c67c2332f8c80b03990914dfb66950c8d2fb87d8) Signed-off-by: Andrei Homescu Bug: 435501117 --- drivers/firmware/arm_ffa/driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index da2703c044746..da5f1bfabf254 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -918,7 +918,7 @@ static void ffa_notification_info_get(void) } /* Per vCPU Notification */ - for (idx = 0; idx < ids_count[list]; idx++) { + for (idx = 1; idx < ids_count[list]; idx++) { if (ids_processed >= max_ids - 1) break; -- GitLab From 4b68bb0be33cbc61f91a08251f64d1c13c834c42 Mon Sep 17 00:00:00 2001 From: Sudeep Holla Date: Fri, 21 Feb 2025 09:56:32 +0000 Subject: [PATCH 2197/2211] UPSTREAM: firmware: arm_ffa: Explicitly cast return value from NOTIFICATION_INFO_GET The return value ret.a2 is of type unsigned long and FFA_RET_NO_DATA is a negative value. Since the return value from the firmware can be just 32-bit even on 64-bit systems as FFA specification mentions it as int32 error code in w0 register, explicitly casting to s32 ensures correct sign interpretation when comparing against a signed error code FFA_RET_NO_DATA. Without casting, comparison between unsigned long and a negative constant could lead to unintended results due to type promotions. Fixes: 3522be48d82b ("firmware: arm_ffa: Implement the NOTIFICATION_INFO_GET interface") Reported-by: Andrei Homescu Message-Id: <20250221095633.506678-2-sudeep.holla@arm.com> Change-Id: I11f218090699f0a19d8fed7b0568cd1004575687 Signed-off-by: Sudeep Holla (cherry picked from commit 3e282f41585c4dd49b688bd6395fd6f21a57c9f7) Signed-off-by: Andrei Homescu Bug: 435501117 --- drivers/firmware/arm_ffa/driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index da5f1bfabf254..c8b7389445fa4 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -882,7 +882,7 @@ static void ffa_notification_info_get(void) }, &ret); if (ret.a0 != FFA_FN_NATIVE(SUCCESS) && ret.a0 != FFA_SUCCESS) { - if (ret.a2 != FFA_RET_NO_DATA) + if ((s32)ret.a2 != FFA_RET_NO_DATA) pr_err("Notification Info fetch failed: 0x%lx (0x%lx)", ret.a0, ret.a2); return; -- GitLab From 209015b548fb36223e01bbeb84c88f375ddd2829 Mon Sep 17 00:00:00 2001 From: Cixi Geng Date: Thu, 7 Aug 2025 11:44:19 +0800 Subject: [PATCH 2198/2211] ANDROID: GKI: Add batman-adv symbols for unisoc 10 function symbol(s) added 'bool br_multicast_has_querier_adjacent(struct net_device*, int)' 'bool br_multicast_has_querier_anywhere(struct net_device*, int)' 'bool br_multicast_has_router_adjacent(struct net_device*, int)' 'int br_multicast_list_adjacent(struct net_device*, struct list_head*)' 'int dev_get_iflink(const struct net_device*)' 'int ip_mc_check_igmp(struct sk_buff*)' 'int ipv6_mc_check_mld(struct sk_buff*)' 'struct net_device* netdev_master_upper_dev_get_rcu(struct net_device*)' 'void skb_prepare_seq_read(struct sk_buff*, unsigned int, unsigned int, struct skb_seq_state*)' 'unsigned int skb_seq_read(unsigned int, const u8**, struct skb_seq_state*)' Bug: 436963046 Change-Id: I03df41c2b0343be14c7de555dd6496c582dd2a2e Signed-off-by: Cixi Geng --- gki/aarch64/abi.stg | 200 +++++++++++++++++++++++++++++++++++++ gki/aarch64/symbols/unisoc | 12 +++ 2 files changed, 212 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 8dc0b8c9886e3..ad8d26fbd240a 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -1953,6 +1953,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x3f7d42f7 } +pointer_reference { + id: 0x055058dc + kind: POINTER + pointee_type_id: 0x3f0185ef +} pointer_reference { id: 0x05579319 kind: POINTER @@ -11413,6 +11418,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x7f579575 } +pointer_reference { + id: 0x1546e269 + kind: POINTER + pointee_type_id: 0x7f5b6f38 +} pointer_reference { id: 0x1549bcfb kind: POINTER @@ -89301,6 +89311,12 @@ member { name: "cur_seq" type_id: 0x92233392 } +member { + id: 0x4b9932ca + name: "cur_skb" + type_id: 0x054f691a + offset: 192 +} member { id: 0x8b31830e name: "cur_stack" @@ -117943,18 +117959,36 @@ member { type_id: 0x431824e8 offset: 2368 } +member { + id: 0x112cf737 + name: "frag_data" + type_id: 0x2669d715 + offset: 256 +} member { id: 0xd70f7af3 name: "frag_expire" type_id: 0x0d554dfb offset: 192 } +member { + id: 0x2b89a33d + name: "frag_idx" + type_id: 0xe62ebf07 + offset: 64 +} member { id: 0xce6a9610 name: "frag_max_size" type_id: 0xe8034002 offset: 160 } +member { + id: 0x9f4c65f3 + name: "frag_off" + type_id: 0xe62ebf07 + offset: 320 +} member { id: 0x9fdfc4ad name: "frag_off" @@ -151760,6 +151794,11 @@ member { type_id: 0xc9082b19 offset: 288 } +member { + id: 0x0cb3d91f + name: "lower_offset" + type_id: 0xe62ebf07 +} member { id: 0xcb44b3e4 name: "lowest_bit" @@ -209725,6 +209764,12 @@ member { type_id: 0x4dd3f4f7 offset: 32 } +member { + id: 0xd0e8aedd + name: "root_skb" + type_id: 0x054f691a + offset: 128 +} member { id: 0x3537a868 name: "rootid" @@ -230644,6 +230689,12 @@ member { type_id: 0xe62ebf07 offset: 64 } +member { + id: 0x775a5c73 + name: "stepped_offset" + type_id: 0xe62ebf07 + offset: 96 +} member { id: 0xa0be1302 name: "steps_left" @@ -248744,6 +248795,12 @@ member { type_id: 0xe62ebf07 offset: 896 } +member { + id: 0x854ab867 + name: "upper_offset" + type_id: 0xe62ebf07 + offset: 32 +} member { id: 0xb970f80e name: "uprobe" @@ -332507,6 +332564,22 @@ struct_union { member_id: 0xff580adc } } +struct_union { + id: 0x7f5b6f38 + kind: STRUCT + name: "skb_seq_state" + definition { + bytesize: 48 + member_id: 0x0cb3d91f + member_id: 0x854ab867 + member_id: 0x2b89a33d + member_id: 0x775a5c73 + member_id: 0xd0e8aedd + member_id: 0x4b9932ca + member_id: 0x112cf737 + member_id: 0x9f4c65f3 + } +} struct_union { id: 0x326f872a kind: STRUCT @@ -373377,6 +373450,14 @@ function { parameter_id: 0xf435685e parameter_id: 0x4585663f } +function { + id: 0x10ccaa0f + return_type_id: 0x48b5725f + parameter_id: 0x054f691a + parameter_id: 0x4585663f + parameter_id: 0x4585663f + parameter_id: 0x1546e269 +} function { id: 0x10ce1a6e return_type_id: 0xd5cc9c9a @@ -396999,6 +397080,12 @@ function { parameter_id: 0xf435685e parameter_id: 0x11cfee5a } +function { + id: 0x91d0e33d + return_type_id: 0x6720d32f + parameter_id: 0x32a623d7 + parameter_id: 0x3e6239e1 +} function { id: 0x91d0f233 return_type_id: 0x6720d32f @@ -424185,6 +424272,13 @@ function { parameter_id: 0x030b9acf parameter_id: 0x0b7d7682 } +function { + id: 0xdfaa37af + return_type_id: 0x4585663f + parameter_id: 0x4585663f + parameter_id: 0x055058dc + parameter_id: 0x1546e269 +} function { id: 0xdfba2774 return_type_id: 0x4585663f @@ -425482,6 +425576,12 @@ function { parameter_id: 0x0327ccee parameter_id: 0x33756485 } +function { + id: 0xf39150bd + return_type_id: 0x6d7f5ff6 + parameter_id: 0x32a623d7 + parameter_id: 0x6720d32f +} function { id: 0xf3944fac return_type_id: 0x3a800090 @@ -447156,6 +447256,42 @@ elf_symbol { type_id: 0x1ccd91f4 full_name: "bpf_warn_invalid_xdp_action" } +elf_symbol { + id: 0xc87d828c + name: "br_multicast_has_querier_adjacent" + is_defined: true + symbol_type: FUNCTION + crc: 0x51824b29 + type_id: 0xf39150bd + full_name: "br_multicast_has_querier_adjacent" +} +elf_symbol { + id: 0xb6c35eb5 + name: "br_multicast_has_querier_anywhere" + is_defined: true + symbol_type: FUNCTION + crc: 0x51824b29 + type_id: 0xf39150bd + full_name: "br_multicast_has_querier_anywhere" +} +elf_symbol { + id: 0xd5345538 + name: "br_multicast_has_router_adjacent" + is_defined: true + symbol_type: FUNCTION + crc: 0x51824b29 + type_id: 0xf39150bd + full_name: "br_multicast_has_router_adjacent" +} +elf_symbol { + id: 0x95b464b4 + name: "br_multicast_list_adjacent" + is_defined: true + symbol_type: FUNCTION + crc: 0xda0c235d + type_id: 0x91d0e33d + full_name: "br_multicast_list_adjacent" +} elf_symbol { id: 0x324980b6 name: "brcmstb_get_family_id" @@ -452526,6 +452662,15 @@ elf_symbol { type_id: 0xc23d0fef full_name: "dev_get_flags" } +elf_symbol { + id: 0x7bc57d22 + name: "dev_get_iflink" + is_defined: true + symbol_type: FUNCTION + crc: 0xcc3e9dad + type_id: 0x9166923b + full_name: "dev_get_iflink" +} elf_symbol { id: 0x7921841c name: "dev_get_regmap" @@ -471426,6 +471571,15 @@ elf_symbol { type_id: 0x9edc3d1c full_name: "ip_local_out" } +elf_symbol { + id: 0xe26f4fc3 + name: "ip_mc_check_igmp" + is_defined: true + symbol_type: FUNCTION + crc: 0x777d928c + type_id: 0x9cd33969 + full_name: "ip_mc_check_igmp" +} elf_symbol { id: 0xaed020d7 name: "ip_mc_join_group" @@ -471552,6 +471706,15 @@ elf_symbol { type_id: 0x17c44cca full_name: "ipv6_icmp_error" } +elf_symbol { + id: 0xd47856af + name: "ipv6_mc_check_mld" + is_defined: true + symbol_type: FUNCTION + crc: 0x979023c3 + type_id: 0x9cd33969 + full_name: "ipv6_mc_check_mld" +} elf_symbol { id: 0xd70b3ff0 name: "ipv6_select_ident" @@ -477952,6 +478115,15 @@ elf_symbol { type_id: 0x1c532cf2 full_name: "netdev_lower_state_changed" } +elf_symbol { + id: 0xad3cf10d + name: "netdev_master_upper_dev_get_rcu" + is_defined: true + symbol_type: FUNCTION + crc: 0x7ae34cd3 + type_id: 0xf0da0508 + full_name: "netdev_master_upper_dev_get_rcu" +} elf_symbol { id: 0x178677d3 name: "netdev_master_upper_dev_link" @@ -493852,6 +494024,15 @@ elf_symbol { type_id: 0xfd96e4d2 full_name: "skb_partial_csum_set" } +elf_symbol { + id: 0xe36c6b1d + name: "skb_prepare_seq_read" + is_defined: true + symbol_type: FUNCTION + crc: 0xba7b8b14 + type_id: 0x10ccaa0f + full_name: "skb_prepare_seq_read" +} elf_symbol { id: 0x90d072a5 name: "skb_pull" @@ -493951,6 +494132,15 @@ elf_symbol { type_id: 0x107e76aa full_name: "skb_scrub_packet" } +elf_symbol { + id: 0xa5842a36 + name: "skb_seq_read" + is_defined: true + symbol_type: FUNCTION + crc: 0x4e376918 + type_id: 0xdfaa37af + full_name: "skb_seq_read" +} elf_symbol { id: 0xd1b9e255 name: "skb_set_owner_w" @@ -512188,6 +512378,10 @@ interface { symbol_id: 0x28d17942 symbol_id: 0xef91c650 symbol_id: 0xac82dbbd + symbol_id: 0xc87d828c + symbol_id: 0xb6c35eb5 + symbol_id: 0xd5345538 + symbol_id: 0x95b464b4 symbol_id: 0x324980b6 symbol_id: 0x8b16f0da symbol_id: 0xae106411 @@ -512785,6 +512979,7 @@ interface { symbol_id: 0x5240d831 symbol_id: 0xe509c61f symbol_id: 0xfd30a35a + symbol_id: 0x7bc57d22 symbol_id: 0x7921841c symbol_id: 0x0b0c0190 symbol_id: 0x34feac51 @@ -514881,6 +515076,7 @@ interface { symbol_id: 0x6889ef9e symbol_id: 0x333700e4 symbol_id: 0x5234b1b5 + symbol_id: 0xe26f4fc3 symbol_id: 0xaed020d7 symbol_id: 0xc1d5ac06 symbol_id: 0xc86b3dec @@ -514895,6 +515091,7 @@ interface { symbol_id: 0x8b22b24d symbol_id: 0xe57e6161 symbol_id: 0x208550bb + symbol_id: 0xd47856af symbol_id: 0xd70b3ff0 symbol_id: 0x16d5ad48 symbol_id: 0x1f294d29 @@ -515606,6 +515803,7 @@ interface { symbol_id: 0x06bf2dbd symbol_id: 0x5635039f symbol_id: 0x5a4e487e + symbol_id: 0xad3cf10d symbol_id: 0x178677d3 symbol_id: 0xb4ca02f0 symbol_id: 0x9b8c6a7d @@ -517371,6 +517569,7 @@ interface { symbol_id: 0xf49fd863 symbol_id: 0x778992cc symbol_id: 0x0e0dc50e + symbol_id: 0xe36c6b1d symbol_id: 0x90d072a5 symbol_id: 0x859796a9 symbol_id: 0x3f4150a5 @@ -517382,6 +517581,7 @@ interface { symbol_id: 0xa393d439 symbol_id: 0x3c015632 symbol_id: 0xea81e880 + symbol_id: 0xa5842a36 symbol_id: 0xd1b9e255 symbol_id: 0xc6357c0a symbol_id: 0x24587583 diff --git a/gki/aarch64/symbols/unisoc b/gki/aarch64/symbols/unisoc index 4a7848f44849f..6eed44b9f6c62 100644 --- a/gki/aarch64/symbols/unisoc +++ b/gki/aarch64/symbols/unisoc @@ -247,6 +247,18 @@ # required audio_platform.ko snd_pcm_rate_bit_to_rate +# batman-adv.ko + dev_get_iflink + skb_prepare_seq_read + skb_seq_read + ip_mc_check_igmp + ipv6_mc_check_mld + br_multicast_has_router_adjacent + br_multicast_has_querier_anywhere + br_multicast_has_querier_adjacent + br_multicast_list_adjacent + netdev_master_upper_dev_get_rcu + # required haptic.ko devm_led_classdev_unregister -- GitLab From c60bcaaf930b0724313267a7a237f726b3fa3ecc Mon Sep 17 00:00:00 2001 From: Mostafa Saleh Date: Fri, 1 Aug 2025 09:34:20 +0000 Subject: [PATCH 2199/2211] ANDROID: iommu/arm-smmu-v3-kvm: Don't detach pasid if doesn't exist Check before clearing CD entries as they might not be attached. Bug: 357781595 Change-Id: I54d26657d38ae4447038adbbdc386c9c4e4f32f4 Signed-off-by: Mostafa Saleh --- drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c index f415754a2216e..108037cbb4896 100644 --- a/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c @@ -1403,6 +1403,11 @@ static int smmu_detach_dev(struct kvm_hyp_iommu *iommu, struct kvm_hyp_iommu_dom smmu_free_cd(cd_table, pasid_bits); } else { cd = smmu_get_cd_ptr(cd_table, pasid); + if (!(cd[0] & CTXDESC_CD_0_V)) { + /* The device is not actually attached! */ + ret = -ENOENT; + goto out_unlock; + } cd[0] = 0; smmu_sync_cd(smmu, sid, pasid); cd[1] = 0; -- GitLab From c8f99e425b3a221ba37139a97f96fa28d1d41df5 Mon Sep 17 00:00:00 2001 From: Mostafa Saleh Date: Fri, 1 Aug 2025 09:49:34 +0000 Subject: [PATCH 2200/2211] ANDROID: iommu/arm-smmu-v3-kvm: Put SMMU ref on detach The driver takes a reference on the smmu for each attached device, we should do the same at detach, which is ignored at the moment for pasids. Bug: 357781595 Change-Id: I93380fad288c7fe06c462d7568dc1f4f53ecb640 Signed-off-by: Mostafa Saleh --- drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c index 108037cbb4896..c6b569ae6e613 100644 --- a/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c @@ -1414,6 +1414,7 @@ static int smmu_detach_dev(struct kvm_hyp_iommu *iommu, struct kvm_hyp_iommu_dom cd[2] = 0; cd[3] = 0; ret = smmu_sync_cd(smmu, sid, pasid); + smmu_put_ref_domain(smmu, smmu_domain); goto out_unlock; } } -- GitLab From 02ac8f6d19c7598a631de33544166501cb46510c Mon Sep 17 00:00:00 2001 From: Mostafa Saleh Date: Fri, 1 Aug 2025 09:56:20 +0000 Subject: [PATCH 2201/2211] ANDROID: iommu/arm-smmu-v3-kvm: Don't leak SMMU ref in error path During attach, if error happens after taking the ref of the SMMUv3, it must be put back. Also, add an assertion during free domain that there are no dangling SMMU refs. Bug: 357781595 Change-Id: Ic717c5b2a958e58e00e188b68dda754c38014b76 Signed-off-by: Mostafa Saleh --- .../iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c index c6b569ae6e613..ed293c7bc9275 100644 --- a/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c @@ -725,6 +725,8 @@ static void smmu_free_domain(struct kvm_hyp_iommu_domain *domain) if (smmu_domain->pgtable) kvm_arm_io_pgtable_free(smmu_domain->pgtable); + /* Assert devices are detached at this point, otherwise we leak memory. */ + WARN_ON(!list_empty(&smmu_domain->iommu_list)); hyp_free(smmu_domain); } @@ -1299,7 +1301,7 @@ static int smmu_attach_dev(struct kvm_hyp_iommu *iommu, struct kvm_hyp_iommu_dom if (!smmu_domain->pgtable) { ret = smmu_domain_finalise(smmu, domain); if (ret) - goto out_unlock; + goto out_unlock_ref; if (domain->domain_id == KVM_IOMMU_DOMAIN_IDMAP_ID) init_idmap = true; } @@ -1308,7 +1310,7 @@ static int smmu_attach_dev(struct kvm_hyp_iommu *iommu, struct kvm_hyp_iommu_dom /* Device already attached or pasid for s2. */ if (dst->data[0] || pasid) { ret = -EBUSY; - goto out_unlock; + goto out_unlock_ref; } ret = smmu_domain_config_s2(domain, &ste); } else { @@ -1321,7 +1323,7 @@ static int smmu_attach_dev(struct kvm_hyp_iommu *iommu, struct kvm_hyp_iommu_dom } /* We don't update STEs for pasid domains. */ if (ret || pasid) - goto out_unlock; + goto out_unlock_ref; /* * The SMMU may cache a disabled STE. @@ -1332,17 +1334,20 @@ static int smmu_attach_dev(struct kvm_hyp_iommu *iommu, struct kvm_hyp_iommu_dom ret = smmu_sync_ste(smmu, sid); if (ret) - goto out_unlock; + goto out_unlock_ref; WRITE_ONCE(dst->data[0], ste.data[0]); ret = smmu_sync_ste(smmu, sid); WARN_ON(ret); -out_unlock: + +out_unlock_ref: if (iommu_node && ret) hyp_free(iommu_node); else if (iommu_node) list_add_tail(&iommu_node->list, &smmu_domain->iommu_list); - + else if (ret) + smmu_put_ref_domain(smmu, smmu_domain); +out_unlock: kvm_iommu_unlock(iommu); hyp_write_unlock(&smmu_domain->list_lock); -- GitLab From e89030944dcdbe6d03e28ef6fc2ee2ecb84bfd22 Mon Sep 17 00:00:00 2001 From: Mostafa Saleh Date: Fri, 1 Aug 2025 14:31:20 +0000 Subject: [PATCH 2202/2211] ANDROID: KVM: arm64: pviommu: Mark allocated domain as busy pkvm_guest_iommu_alloc_id will find the first available domain from the bitmap and return it. However, never actually mark it as set. So we always get the same domain id. Bug: 429049173 Change-Id: I1a48ba2f6b44cc0d81d36848a9963f2703b11653 Signed-off-by: Mostafa Saleh --- arch/arm64/kvm/hyp/nvhe/iommu/pviommu.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/iommu/pviommu.c b/arch/arm64/kvm/hyp/nvhe/iommu/pviommu.c index d634171fb61a8..d05c2e096d8cf 100644 --- a/arch/arm64/kvm/hyp/nvhe/iommu/pviommu.c +++ b/arch/arm64/kvm/hyp/nvhe/iommu/pviommu.c @@ -35,9 +35,13 @@ static int pkvm_guest_iommu_alloc_id(void) int i; for (i = 0 ; i < ARRAY_SIZE(guest_domains) ; ++i) { - if (guest_domains[i] != ~0UL) - return ffz(guest_domains[i]) + i * BITS_PER_LONG + + if (guest_domains[i] != ~0UL) { + int domain_off = ffz(guest_domains[i]); + + guest_domains[i] |= (1UL << domain_off); + return domain_off + i * BITS_PER_LONG + (KVM_IOMMU_MAX_DOMAINS >> 1); + } } return -EBUSY; -- GitLab From 05c9d941604796b7e2c6d4c84d7f332d193f8d8c Mon Sep 17 00:00:00 2001 From: Kyriakos Ispoglou Date: Thu, 24 Jul 2025 15:51:01 +0200 Subject: [PATCH 2203/2211] ANDROID: KVM: add pkvm_el2_mod_call_smccc() macro This macro returns the whole arm_smccc_res object instead of res.a1, so we can have up to 3 return values from a hypervisor call. Bug: 433716010 Test: None Change-Id: I5dc5e07c80eeb5c7b47df93b0ef13c627d6115fb Signed-off-by: Kyriakos Ispoglou --- arch/arm64/include/asm/kvm_pkvm_module.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/arch/arm64/include/asm/kvm_pkvm_module.h b/arch/arm64/include/asm/kvm_pkvm_module.h index 974a60486aa29..96a82856c9088 100644 --- a/arch/arm64/include/asm/kvm_pkvm_module.h +++ b/arch/arm64/include/asm/kvm_pkvm_module.h @@ -377,5 +377,16 @@ static inline int pkvm_register_el2_mod_call(dyn_hcall_t hfn, \ res.a1; \ }) + +#define pkvm_el2_mod_call_smccc(id, ...) \ + ({ \ + struct arm_smccc_res res; \ + \ + arm_smccc_1_1_hvc(KVM_HOST_SMCCC_ID(id), \ + ##__VA_ARGS__, &res); \ + WARN_ON(res.a0 != SMCCC_RET_SUCCESS); \ + \ + res; \ + }) #endif #endif -- GitLab From e76cff4952af4ac4652dc74ffbd134ff57c47895 Mon Sep 17 00:00:00 2001 From: Sebastian Ene Date: Thu, 7 Aug 2025 10:25:50 +0000 Subject: [PATCH 2204/2211] ANDROID: KVM: Enforce hyp requests alignment Prevent the host from sharing an unaligned hypervisor request buffer to avoid spilling into the adjacent page. Bug: 436580278 Change-Id: I62283dba1d5907718dbf6d549817a94cc18fca19 Signed-off-by: Sebastian Ene --- arch/arm64/kvm/hyp/nvhe/pkvm.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp/nvhe/pkvm.c b/arch/arm64/kvm/hyp/nvhe/pkvm.c index 41222f0a76f91..89e70cb906a76 100644 --- a/arch/arm64/kvm/hyp/nvhe/pkvm.c +++ b/arch/arm64/kvm/hyp/nvhe/pkvm.c @@ -670,11 +670,18 @@ static int init_pkvm_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu, { int ret = 0; u32 mp_state; + struct kvm_hyp_req *hyp_reqs; if (hyp_pin_shared_mem(host_vcpu, host_vcpu + 1)) return -EBUSY; - hyp_vcpu->vcpu.arch.hyp_reqs = kern_hyp_va(host_vcpu->arch.hyp_reqs); + hyp_reqs = READ_ONCE(host_vcpu->arch.hyp_reqs); + if (!PAGE_ALIGNED(hyp_reqs)) { + hyp_unpin_shared_mem(host_vcpu, host_vcpu + 1); + return -EINVAL; + } + + hyp_vcpu->vcpu.arch.hyp_reqs = kern_hyp_va(hyp_reqs); if (hyp_pin_shared_mem(hyp_vcpu->vcpu.arch.hyp_reqs, hyp_vcpu->vcpu.arch.hyp_reqs + 1)) { hyp_unpin_shared_mem(host_vcpu, host_vcpu + 1); -- GitLab From 47cca682008eb27f897472f4ace70e1874e6fe44 Mon Sep 17 00:00:00 2001 From: kuyo chang Date: Fri, 8 Aug 2025 11:30:31 +0800 Subject: [PATCH 2205/2211] ANDROID: sched: Add trace hook for DL server Create a trace hook when the DL server is activated. This allows vendors to debug RT/Fair contention issues by dumping the following information: 1.The task served by the DL server 2.The status of the DL server Bug: 436885337 Change-Id: I2157bd22b7d7c80d7ec1eeeba3ec6fb88efa4abd Signed-off-by: kuyo chang Signed-off-by: kuyo chang --- include/trace/hooks/sched.h | 5 +++++ kernel/sched/deadline.c | 1 + kernel/sched/vendor_hooks.c | 1 + 3 files changed, 7 insertions(+) diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index f0d0f15c535ac..b272a089a1c4f 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -531,6 +531,11 @@ DECLARE_RESTRICTED_HOOK(android_rvh_util_fits_cpu, int cpu, bool *fits, bool *done), TP_ARGS(util, uclamp_min, uclamp_max, cpu, fits, done), 1); +struct sched_dl_entity; +DECLARE_HOOK(android_vh_dump_dl_server, + TP_PROTO(struct sched_dl_entity *dl_se, struct task_struct *p), + TP_ARGS(dl_se, p)); + /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_SCHED_H */ diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index 9f98aaca7e6c3..60144c27f8efa 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c @@ -2462,6 +2462,7 @@ again: goto again; } rq->dl_server = dl_se; + trace_android_vh_dump_dl_server(dl_se, p); } else { p = dl_task_of(dl_se); } diff --git a/kernel/sched/vendor_hooks.c b/kernel/sched/vendor_hooks.c index cb1d6f57cf85f..97155e1a2285e 100644 --- a/kernel/sched/vendor_hooks.c +++ b/kernel/sched/vendor_hooks.c @@ -136,3 +136,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_uclamp_validate); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_util_fits_cpu); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_before_pick_task_fair); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_balance_fair); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_dump_dl_server); -- GitLab From 7356f4dbc5bd40c574df94e4a0d2af0f10120d31 Mon Sep 17 00:00:00 2001 From: Tangquan Zheng Date: Thu, 7 Aug 2025 19:23:05 +0800 Subject: [PATCH 2206/2211] ANDROID: mm: Add vendor hook to trace wp_page_reuse Add a hook for custom vendor modules to trace wp_page_reuse behavior, This allows for monitoring of page reuse events and custom handling. Bug: 437042547 Change-Id: I0faf068acdff2f964884d3081c35d85abd5a19fa Signed-off-by: Tangquan Zheng --- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/mm.h | 3 +++ mm/memory.c | 1 + 3 files changed, 5 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 0ee9ff2360ec5..5f19d226e631f 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -460,6 +460,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_split_large_folio_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_should_be_protected); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_referenced_check_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_read_fault); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_wp_page_reuse); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_read); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_map_pages); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_try_alloc_pages_gfp); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 8edee8a675b12..9bf35e210937d 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -371,6 +371,9 @@ DECLARE_HOOK(android_vh_page_should_be_protected, DECLARE_HOOK(android_vh_do_read_fault, TP_PROTO(struct vm_fault *vmf, unsigned long fault_around_bytes), TP_ARGS(vmf, fault_around_bytes)); +DECLARE_HOOK(android_vh_wp_page_reuse, + TP_PROTO(struct vm_fault *vmf, struct folio *folio), + TP_ARGS(vmf, folio)); DECLARE_HOOK(android_vh_filemap_read, TP_PROTO(struct file *file, loff_t pos, size_t size), TP_ARGS(file, pos, size)); diff --git a/mm/memory.c b/mm/memory.c index 5ed0097a6128b..bcee414a7fba6 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3284,6 +3284,7 @@ static inline void wp_page_reuse(struct vm_fault *vmf, struct folio *folio) flush_cache_page(vma, vmf->address, pte_pfn(vmf->orig_pte)); entry = pte_mkyoung(vmf->orig_pte); entry = maybe_mkwrite(pte_mkdirty(entry), vma); + trace_android_vh_wp_page_reuse(vmf, folio); if (ptep_set_access_flags(vma, vmf->address, vmf->pte, entry, 1)) update_mmu_cache_range(vmf, vma, vmf->address, vmf->pte, 1); pte_unmap_unlock(vmf->pte, vmf->ptl); -- GitLab From aeb6d834d26411e55768b0f53fc842aa4c5fcd83 Mon Sep 17 00:00:00 2001 From: Tangquan Zheng Date: Thu, 7 Aug 2025 19:28:51 +0800 Subject: [PATCH 2207/2211] ANDROID: GKI: Update oplus symbol list 1 function symbol(s) added 'int __traceiter_android_vh_wp_page_reuse(void*, struct vm_fault*, struct folio*)' Bug: 437042547 Change-Id: I49ae2727bed1cbb9ef6a88dd2e599d63e7da86fe Signed-off-by: Tangquan Zheng --- gki/aarch64/abi.stg | 27 +++++++++++++++++++++++++++ gki/aarch64/symbols/oplus | 2 ++ 2 files changed, 29 insertions(+) diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index ad8d26fbd240a..2ed1939ab69d4 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -410113,6 +410113,13 @@ function { parameter_id: 0x18bd6530 parameter_id: 0x3176a085 } +function { + id: 0x9b6a6528 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x3360dff4 + parameter_id: 0x2170d06d +} function { id: 0x9b6a728b return_type_id: 0x6720d32f @@ -436521,6 +436528,15 @@ elf_symbol { type_id: 0x9bb49c5c full_name: "__traceiter_android_vh_wb_dirty_limits" } +elf_symbol { + id: 0x20e7f214 + name: "__traceiter_android_vh_wp_page_reuse" + is_defined: true + symbol_type: FUNCTION + crc: 0xe1237009 + type_id: 0x9b6a6528 + full_name: "__traceiter_android_vh_wp_page_reuse" +} elf_symbol { id: 0xae5e5469 name: "__traceiter_android_vh_wq_lockup_pool" @@ -443055,6 +443071,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_wb_dirty_limits" } +elf_symbol { + id: 0xf1bbc512 + name: "__tracepoint_android_vh_wp_page_reuse" + is_defined: true + symbol_type: OBJECT + crc: 0x7c5aa8a7 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_wp_page_reuse" +} elf_symbol { id: 0xa13f65ff name: "__tracepoint_android_vh_wq_lockup_pool" @@ -511185,6 +511210,7 @@ interface { symbol_id: 0xd0d675d3 symbol_id: 0x807c8f9a symbol_id: 0x892f6a60 + symbol_id: 0x20e7f214 symbol_id: 0xae5e5469 symbol_id: 0x18619e65 symbol_id: 0xc4d6f652 @@ -511911,6 +511937,7 @@ interface { symbol_id: 0x4196f765 symbol_id: 0x0164dfc8 symbol_id: 0x449c21a2 + symbol_id: 0xf1bbc512 symbol_id: 0xa13f65ff symbol_id: 0x85ad7f9f symbol_id: 0x93f06708 diff --git a/gki/aarch64/symbols/oplus b/gki/aarch64/symbols/oplus index 8ce4ada78bf9f..5f0222343535d 100644 --- a/gki/aarch64/symbols/oplus +++ b/gki/aarch64/symbols/oplus @@ -354,6 +354,7 @@ __traceiter_task_rename __traceiter_android_vh_binder_alloc_new_buf_locked __traceiter_android_vh_copy_process + __traceiter_android_vh_wp_page_reuse __tracepoint_android_vh_account_task_time __tracepoint_android_rvh_alloc_workqueue __tracepoint_android_rvh_check_preempt_wakeup_fair @@ -494,6 +495,7 @@ __tracepoint_task_rename __tracepoint_android_vh_binder_alloc_new_buf_locked __tracepoint_android_vh_copy_process + __tracepoint_android_vh_wp_page_reuse __trace_puts truncate_inode_pages try_to_del_timer_sync -- GitLab From 1489ec023ca5c195a6f0e3404d11cb09195d7b87 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Wed, 6 Aug 2025 22:45:02 +0000 Subject: [PATCH 2208/2211] ANDROID: Remove byte queue limit and RPS support from microdroid's kernels These features are not needed for microdroid, since it doesn't support networking servers, so remove them. Bug: 434256355 Signed-off-by: Isaac J. Manjarres (cherry picked from https://android-review.googlesource.com/q/commit:830484fca097b9d6734defd9eca3f91a6a101ee8) Merged-In: Ie4dc23a980854d4c8300e3324f799b1dd6c6a797 Change-Id: Ie4dc23a980854d4c8300e3324f799b1dd6c6a797 --- arch/arm64/configs/microdroid_defconfig | 2 ++ arch/x86/configs/microdroid_defconfig | 2 ++ 2 files changed, 4 insertions(+) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index df18097b7af88..76fb31cd27b0e 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -74,6 +74,8 @@ CONFIG_TCP_CONG_ADVANCED=y # CONFIG_IPV6 is not set CONFIG_VSOCKETS=y CONFIG_VIRTIO_VSOCKETS=y +# CONFIG_RPS is not set +# CONFIG_BQL is not set # CONFIG_WIRELESS is not set # CONFIG_ETHTOOL_NETLINK is not set CONFIG_PCI=y diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index 52e47e4dbc3c6..20b6140fd2734 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -77,6 +77,8 @@ CONFIG_TCP_CONG_ADVANCED=y # CONFIG_IPV6 is not set CONFIG_VSOCKETS=y CONFIG_VIRTIO_VSOCKETS=y +# CONFIG_RPS is not set +# CONFIG_BQL is not set # CONFIG_WIRELESS is not set # CONFIG_ETHTOOL_NETLINK is not set CONFIG_PCI=y -- GitLab From b56240a1483fa1d752068a66e90317c8f6280efe Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Thu, 7 Aug 2025 17:10:49 +0000 Subject: [PATCH 2209/2211] ANDROID: Reduce perturb table size for microdroid kernels The current configuration for the perturb table size results in a 256 KB allocation being made at boot. This memory is not used by microdroid, since there is no requirement to support a networking stack. Therefore, reduce it to be as small as possible, which drives down the allocation size to just 4 KB. Bug: 434256355 Signed-off-by: Isaac J. Manjarres (cherry picked from https://android-review.googlesource.com/q/commit:a545398b32fca888b30d5e404f5377db1728f703) Merged-In: I2df5300a31982480333d6e2fca628ba1d3b92d60 Change-Id: I2df5300a31982480333d6e2fca628ba1d3b92d60 --- arch/arm64/configs/microdroid_defconfig | 1 + arch/x86/configs/microdroid_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index 76fb31cd27b0e..f5b6a7ce4feb9 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -65,6 +65,7 @@ CONFIG_LRU_GEN=y CONFIG_NET=y CONFIG_UNIX=y CONFIG_INET=y +CONFIG_INET_TABLE_PERTURB_ORDER=0 # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index 20b6140fd2734..04cc6e79cf75d 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -68,6 +68,7 @@ CONFIG_DAMON_RECLAIM=y CONFIG_NET=y CONFIG_UNIX=y CONFIG_INET=y +CONFIG_INET_TABLE_PERTURB_ORDER=0 # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set -- GitLab From 62f8e0b7c3e85db685cca18a5dee268d1d579fb6 Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Thu, 7 Aug 2025 21:04:09 +0000 Subject: [PATCH 2210/2211] ANDROID: Use small core data structures for microdroid kernels CONFIG_BASE_SMALL governs the size of several data structures in the system, such as futex queue hash table size, UDP hash tables size, and the max number of PIDs in the system. When it is enabled, the kernel allocates smaller data structures, such as a smaller futex queue hash table. Microdroid is meant to host a small number of processes, so enable CONFIG_BASE_SMALL to save memory. Bug: 434256355 [isaacmanjarres: enabled CONFIG_BASE_SMALL instead of removing CONFIG_BASE_FULL, since the latter no longer exists on 6.12+ kernels and reworded commit message accordingly.] Signed-off-by: Isaac J. Manjarres (cherry picked from https://android-review.googlesource.com/q/commit:492960152688486251f4dc35e7af9f046c778a77) Merged-In: Id8d9957ad16377334aa321a77568e97d7e433330 Change-Id: Id8d9957ad16377334aa321a77568e97d7e433330 --- arch/arm64/configs/microdroid_defconfig | 2 ++ arch/x86/configs/microdroid_defconfig | 2 ++ 2 files changed, 4 insertions(+) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index f5b6a7ce4feb9..2d96a90315406 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -9,6 +9,7 @@ CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_CGROUPS=y CONFIG_MEMCG=y CONFIG_NAMESPACES=y @@ -24,6 +25,7 @@ CONFIG_NAMESPACES=y # CONFIG_RD_ZSTD is not set CONFIG_BOOT_CONFIG=y CONFIG_EXPERT=y +CONFIG_BASE_SMALL=y CONFIG_PROFILING=y CONFIG_KEXEC_FILE=y CONFIG_ARM64_VA_BITS_39=y diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index 04cc6e79cf75d..fd7f025e4260a 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -11,6 +11,7 @@ CONFIG_PSI=y CONFIG_RCU_EXPERT=y CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_UCLAMP_TASK=y CONFIG_UCLAMP_BUCKETS_COUNT=20 CONFIG_CGROUPS=y @@ -26,6 +27,7 @@ CONFIG_NAMESPACES=y # CONFIG_RD_LZO is not set CONFIG_BOOT_CONFIG=y CONFIG_EXPERT=y +CONFIG_BASE_SMALL=y CONFIG_PROFILING=y CONFIG_KEXEC_FILE=y CONFIG_SMP=y -- GitLab From d0c633175c044580300c730fd0ae862f7061135e Mon Sep 17 00:00:00 2001 From: "Isaac J. Manjarres" Date: Fri, 8 Aug 2025 00:35:02 +0000 Subject: [PATCH 2211/2211] ANDROID: Disable miscellaneous features from microdroid kernels These features are not needed for microdroid kernels, so remove them. Bug: 432329937 Change-Id: Iabc7a8ad3eef66f702ee5292ef49ce4d56751242 [isaacmanjarres: resolved merge conflicts] Signed-off-by: Isaac J. Manjarres --- arch/arm64/configs/microdroid_defconfig | 5 ++++- arch/x86/configs/microdroid_defconfig | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/arch/arm64/configs/microdroid_defconfig b/arch/arm64/configs/microdroid_defconfig index 2d96a90315406..f94d2a5eb5297 100644 --- a/arch/arm64/configs/microdroid_defconfig +++ b/arch/arm64/configs/microdroid_defconfig @@ -43,6 +43,7 @@ CONFIG_CMDLINE_EXTEND=y # CONFIG_SUSPEND is not set CONFIG_VIRTUALIZATION=y CONFIG_JUMP_LABEL=y +# CONFIG_SECCOMP is not set CONFIG_SHADOW_CALL_STACK=y CONFIG_CFI_CLANG=y CONFIG_BLK_DEV_ZONED=y @@ -110,9 +111,11 @@ CONFIG_DM_VERITY_FEC=y # CONFIG_LEGACY_PTYS is not set CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set +# CONFIG_SERIAL_8250_16550A_VARIANTS is not set CONFIG_SERIAL_8250_CONSOLE=y # CONFIG_SERIAL_8250_PCI is not set CONFIG_SERIAL_8250_RUNTIME_UARTS=0 +# CONFIG_SERIAL_8250_PERICOM is not set CONFIG_SERIAL_OF_PLATFORM=y CONFIG_NULL_TTY=y CONFIG_VIRTIO_CONSOLE=y @@ -172,7 +175,6 @@ CONFIG_TRACE_MMIO_ACCESS=y CONFIG_DMA_RESTRICTED_POOL=y CONFIG_PRINTK_TIME=y CONFIG_PRINTK_CALLER=y -CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_DEBUG_INFO_DWARF5=y CONFIG_DEBUG_INFO_REDUCED=y CONFIG_HEADERS_INSTALL=y @@ -192,6 +194,7 @@ CONFIG_PANIC_TIMEOUT=-1 CONFIG_SOFTLOCKUP_DETECTOR=y CONFIG_WQ_WATCHDOG=y CONFIG_SCHEDSTATS=y +# CONFIG_UPROBE_EVENTS is not set CONFIG_HIST_TRIGGERS=y CONFIG_PID_IN_CONTEXTIDR=y # CONFIG_RUNTIME_TESTING_MENU is not set diff --git a/arch/x86/configs/microdroid_defconfig b/arch/x86/configs/microdroid_defconfig index fd7f025e4260a..bba4a31492715 100644 --- a/arch/x86/configs/microdroid_defconfig +++ b/arch/x86/configs/microdroid_defconfig @@ -46,6 +46,7 @@ CONFIG_CPU_FREQ_TIMES=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y CONFIG_JUMP_LABEL=y +# CONFIG_SECCOMP is not set CONFIG_BLK_DEV_ZONED=y CONFIG_PARTITION_ADVANCED=y # CONFIG_MSDOS_PARTITION is not set @@ -110,9 +111,13 @@ CONFIG_DM_VERITY_FEC=y # CONFIG_LEGACY_PTYS is not set CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set +# CONFIG_SERIAL_8250_PNP is not set CONFIG_SERIAL_8250_CONSOLE=y # CONFIG_SERIAL_8250_PCI is not set CONFIG_SERIAL_8250_RUNTIME_UARTS=0 +# CONFIG_SERIAL_8250_LPSS is not set +# CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set CONFIG_SERIAL_OF_PLATFORM=y CONFIG_NULL_TTY=y CONFIG_VIRTIO_CONSOLE=y @@ -224,7 +229,6 @@ CONFIG_CRYPTO_SHA1_SSSE3=y CONFIG_CRYPTO_SHA256_SSSE3=y CONFIG_CRYPTO_SHA512_SSSE3=y CONFIG_PRINTK_TIME=y -CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_DEBUG_INFO_DWARF5=y CONFIG_DEBUG_INFO_REDUCED=y CONFIG_HEADERS_INSTALL=y @@ -245,5 +249,6 @@ CONFIG_PANIC_TIMEOUT=-1 CONFIG_SOFTLOCKUP_DETECTOR=y CONFIG_WQ_WATCHDOG=y CONFIG_SCHEDSTATS=y +# CONFIG_UPROBE_EVENTS is not set CONFIG_HIST_TRIGGERS=y CONFIG_UNWINDER_FRAME_POINTER=y -- GitLab

    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

    oMZn3i@>eV*#ib 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%0Dn za*&yarWq=TuCpYgD6u#L)N4*faT`J$Lq~Bocq9qQVW889K;;{fP9O)FF1RA45kpzVxL=q+p%ElmeCTKpk0CX-N zIE{g~1*N2d?mmHR5dt5h0vY*;2c7xL0Gb&G59UDHu&KHEAQyl)je#2F43G-J2(pO| z%8LhW(}YOC!XK0wz+-fvJ;^X-IYp(grPVMY$Z}#xz<}C^WuW2^tQoup25Km%;{ekE zVuKewLghe9SMt)4odD^_#=|lj*ffw>aS6x_=uO|C6`-JX7%8a*`6cmbsU^u7pz*b2 zP+UOTA}OF7z)C<&VW_|#i!(e%X&-+ zXo7<1F9Kiri)>>NcoY`NQIIvgaC1O=XJM9sN|=nI{Jeb7@(#$p8kiJ{Eg(*ON)Fr% zFduxMFS2s*kT$9sP)`)pH7*4m>{0-#&x#5eKodLh;EU(LD^S4abrq*V#lbx(usB2= zm|q0%S)~>y!&-cqAomm}Lr!1;n+aJ+k_kF5pbFFyhM8HE3Q8GZDWj4TMg z#ub!Qi%W{~E1{)(3MkVd1k*taZ1VH+K&O#|QWZogELB2y;PySN2!IHc=9LzM{0nW^ zLj*y+9dH@}ITw7~a6IVDZpaKG1LPbd(AtQ2aLoi0fNqF}UXKKFSxI7Y24toVY$@n4 zIjH8;JWx^xEw+va$0}GQR1hg$gM~BGkeVQ15%3Tc+ycf?`n13d(`>$WviF(7E9Zpp&*i z7oCGzR$vZv-#MsQ1n*P>DFAPj0=0IEs7);0t|01xiVAdPVJ= z@`b6M&4frovT$e1{^IoSy+Y{ICRcPJBMNkpfYhQd9;SvH<%F zWFTZf9cFxH8e}*XVsK^}q^(sJpI(pxS!DxKm;pL|4%D%M#sioSu0`YFo&$B)QIr(N zXXfYTmV)gC-y01wDKibU#0V^wnFjI#lv$h!8gxi4i_c60F%i9qGDvWMYMBg(+Wcf_ zaDi^h%uS4k`5Ph&y2vLPv{)Z>as}LR+2BeTyyH6$RFap)qlkbCB+xt^$b|?A&^ft9 zsfjQNQ2qehk&~Za09xyc@Ousf06S0!e z<5^&u^9u?fE5X4tSjnlG(A&tt{o*pvt{+qtX*v1%pmG(L6eMy{b%O_;Q{g(mNfxwe z0=)VeLuq_jeohH!LoGO*KqoO3fVynR4hD@_f}90jX$F%3?ehYa3*ZAWz?Z&)%V1<_ z(5d1@si33(VC#ZWWI@M&Lr0z=t_2wh9r1u|)q^?;Bm=FNpb8)+6=mj?WP^`Uf$&Q~ zZI`n6LeN#`@vx0JATz+V0wTR3xS&)6)>{O+?ikeTiiZtnltBh%N>f4Q9#jo@Sh6@i z1#}u1dv8f)Fmr2Te#7fI22+pf+l8IjDvO8&nG3DT>5|og4ykF+>uw zum;QrU9y@UUtFGE^R*zOQH4Mk z9E072CJdTGPf0CvDRAo`J~ulrAM9zU28bxC25>fm=Ky%jq6$NH zr>CTXdK!h$c}3(sA21ovAw9Xdsd*`>plKy=B?>kO6xAh=T{bYK(8LOg!ctJJ3^5ui zicp&gx;Z%o>n!nqf=@U-k@L-w7HF z0|ht8K&TLO+zL$;w3`_eTd=__up!`yF^GAfa7;-pgQYHzd0?U3M6j!2rh&xr%R#4) zWn_W_38XL+eo!q;Ste*8rvx-HTms(Wgd`5zng}VZK-$56kB8hy4cU7D+V`9dn%7JO z&18bx{$Te)RDzqukog*zxey7+x?j+sBQ|j~9iX!{p|<6MdXu1oDZwQS$Vm_pq*?|d zSP8Bf5Rm{1Eu_tg}{j%W;L=Hy1`geFDPr`@N98u0ce3Jc;Xc_(hswvBp(#b@!9!FSui2g zWKo(2OP?@#NVbcI^bybnp=TU}f*90VfgB;1l3JDxI?oYw0vJdGn3I!JoSF*i13~1# zNfjiS8xQK8ftDSV#3zDonnM~DuD?Ul;l>#gN7~;0+rB} z6{%$)D?p3eL5q1n^(T0L9%Kz9lnd(2z%R5)Ni8c%1@A=%83tm4+ORNoPCjV-0jvVa z7a&zoE@&PUrWlg!7*f)5Kw}`_9rVSJ{Ko*9;s<#(1yZPhn4pt^^GX;}GE+dyI6?b< zK&z8L0|S|x@@X7%2=oNTgJv9@wPzt271hh*t2h^H{E;)y8oQ((1iNxpT=Vg}U7lAB? zw5>rcw8Wwm2AHx;P&rk>Qki9DCh^5)CJZTHRw*(IR7-%wVe%jvE(TQ@UutFo5z7J9 zA>c7K@MIx$$b%sz2XycSXg31r#0wa=0Mv2;%YYI?4tPyOdMbF^d1e*(yaSL*aNh{D zDy|sZ6G%+~51K)DfkQUHfDT=N?F&b@7dm#52|C?AH90de2V^Ex5VR*cEeAAt4;y2I zWham#(B|V@(0U!vI)EI=Qh|chqD)Ym5PD=E)X6CzI0H8lm)D#?j2P6i#B4_OclIhZ*mC%!nf zs0`G_hq2(@7`Onq(+@Hqq7<}Du>gq+vZe@$4{0%C2!Mwj!6V=hsS=cc1`P#)#6dKq zn2JwK1072P$`FttR?r5!V$j|=$TgkNfmhIStJK7zoJ`OjK-few+$2aU02>N-CWsNA zl$w?gT91>1yveN?HKudHvp?XeoPt!)l`Q$t(UDxxfLtc13sVxGSXzN53Mo@zY6?L2 zQ-Fq`LFW|2XXZl|HNa%SZ9W__&}ssv6tb!VHZ=tkg;n#pph5uD%7XOYa^q8T!OP?! z#Xw>K=#+1Ulw5ED0h%L#Y_x}oK>C*8B^1RVG0@>qIjP{bR%&S~M5H(aJU|25HkOiF z0TRp12PMlAC=)cX1eqGijn4$NN0JdkiC_`X7!>HrlN2xyQf`24%ghItDyc<9pm77J zEaWr-klERp;OiT~ZUphs;{sHOp?V3d6nqj4=)RH^(7jj?ApvA2NeL<+TdOFU|EDHXgn9pD@_6&i<$&A8_oljV2K4F72t6Q z$S?}5E0qh018|fSXI6oO8KMkSR3oVZo%olNm<|oQlFWQin$OEG$_14?x$z)@V$dOA zIf>~YtI8ouUqMW8Sq_@QgiOYOszq>gfyF`hq~ya@fhr1U7$kz)5&6l`O$Di-5l_e{ zBLip*A+fj^bXqoS1P(s(2s*pGG!4{#2JQU>sZ4@%b3y0&gNE)Z^AdA2lfmYIWWgsy zfM$_F2?;!B12qL*0@CFI`!^Ak`QYtVsQMI$!RWSw4tE9Z28SN`2y+ywFoxNX`*`7w zgmA(0wVvTVZfP@Sqmdf$6E>t6AW3keyyw428C}q1v#78LY(( zRRP)|4q31P3S_wXsKU^zq(HR*OdEL27l{)O-mVS00tgmL;HEQF1-jQj=?zrUfJR%2 z;Ff~hvT2YjaABr^DyL#lycA`EwxNR>mE{Nx;L&!-5kIIJN>USxQu5355K6&^(xbZr zbntNj$n?bI3>5#POJIgTXlWs za2$hmL8k^lQ3IMcK^H3q<=#Zlav^XNwlXg{zBnDc5Dv7d0c<3s(F>Xmgh_$AXvvTy z2{j%f3t6@gy5Hyn2B0-XVm#DFu!)dyA`Gq2v2ReJl?ZA1 z=c4KZpIm^U4KjLwrWCZm4MQbznnZRFD39QGF~m*KTnW*doB=wk8MK-@F*6T~OnG8X zHj)cK3PCr7gEoLeidBd)kZvQ~^{|o%A_=Nqz!MP2^57XQQ0p0sAh_a3aSU4MWP-Mw z7bR9AxeRo+3CJ&KLiu?mAdf-H42W|wi@`(fXhK-R2GrmN&wi&uhR;x31S_o|W@5$( zq(6+bNDuB$h)qcDga}}I8Y&KIKZ1AGVQPU(VbNStngp)uLB%GLPPi5%vC_QqqD0W7 zOA%;c1KgodVYEaDTF?*H3yM}qZjJ|?{0o^pUG1FaE27!8YduomQ42Om}nIy9vSG`NtP7@wUB&LrR~&x*m`g_fHz z3CJQDB$c2>8E9WcIxHiCN^VFg3w8jA3o6J#^$%#6AU6?o*dC~4PAn-w5db&q;Ci5? zFNz}2HJG3?HNh?5#Q0p0*=e9tT|w0dtgQtx0VI`|p9jkNndznZ&^!y)0dftfNe#N^ z1>AkW(S|EZEiQwUosi=}!3IMFGxIVLJa{$-%YnAn#)DgCNGd?9JHZRCz?aJumqB*T zg3DCYx)EUnC;{V=1ML7yEGoez4J!Vy$brTvKx=qFGvF|HfW_eDAlPxkh&GMQbrboWIwQxP+@S)qg3J;5=fdr={2Jg z5`&Nm7ZjsN=?fxQoQ_2ZY!k?8P);q5Pl1#(AQH5FHnj-cv;%WN`y@g0A1NtC3@Q2X z@t~RT6wuZd@H$e^O{So51b6OI3ravrz*E$qsvJDL2U^XR2uchnQlL&YSRf?@Ha3+X z587N;nG0IC1o8-28ti{?Y6W$E6G5|bAn~Nc6wt9Hi4b-U=%N~UVObyJ`Vr4qr;hwx#SQGpbI7V74MCKy1MsDO{72Mtic zMT#@i6LU(yOM$?~Lr;%~TtW#d8X=;P({dr~@_6XzXg=hm@DxxN7__<^z7QRx4zzX| zx|kT$ZG|lH1$z&+%n;O|f~W+qZiAF|AhWMghk zC_UxJgVdGgrKF~T#i4@(xu8-iKRy+-A`re=2hImAxqxvBKzRYI6|5G{D+VPy@I^oI zpjGN%uYf0TL7k&~@E{Xt0T+yw2wGd43pzC-1tgRSj-E6~_Y4wO@K6LZ;uFDl_<<}= zOU}s6Pk|~*&d4v%gR%1<4h8qYK;Z=*#Q|%{%qf6e)0C1AU0@CFj)3KgQd6r^i$HUx z1zX~tgVu(CS_j}viaAl74_XFU0=l9Z zQc8pP;C(XSJEKxS+>+FyqS6A;u4&LUG!S#ZP6o#iIIc1a%pkW2ffv~1$7g~o=i>b2 z?0iVp2i>%pT7n{grlHIX)QCV)QDz1j(LojhRTH56UKS4ytul}gv+|R`cYhUuhDh?` zv+_$pg%rpzh$8r)0Q`7v$TqS3G;ku$F3l?koxzoo51v=2M3XhIU?sNBSqvP{qrYCdF#XmL&=Bmsj@*99dnu&UHt=w(zX`JfSy z;&PBe_CRiHW?aW8GFBeo!f*lBAfR(^6-~bP= z=f~%QD*=#HUSeK8c&-!7Ni9bh1Dd4*PY}eXC4(h1;TJolwmE63~)vux%nguKXE?Gc^ zgL%2x;1mhwCuf4Tv_aPOg4YkgM4_EXSXG@LUyz&|pHU7gGeE~VflFgh;Rx1~pOXXe zQ33SI;NlF>)nzI9@dc3bAFQeR?q@FP?Uj+ zK2TpeKfWjzbcPHlxJu$n(u*_G!NcaDt`tZ!__}Lw!45k8qcjIJYm^T?0HiWAH3wYd z!S0zz0S)SdPr?MV@=`!INW{a90u8|y7o;XL-oLhmBg16CxhD?Q01BMda^jR1YY45XC#8Q^uV(_bOr@7k(v*352#(64^9JU zEj~zBA8a~!#33!k1j+%~lmcu1fQ*7y+@R_XRC$4DXyplFf&&aupF)rB2b-3kRsve8 znO~j<8hrt+2g;9!%Ev?YtLGMg8^Msq3s?_m_AnK}0yRd#Yuod|QyR&sPyx^^9;hz~ z7Y5Ic!+B{%`MF4jfYKV6Tas9kRve#~2sx)9ALOi(3W!WmUNY>wAn=hupqMBr%F9X3 zgAM}c$AdPjfE9yws)7nvFb8sY10+#{3QS1n7Gx#7@ef)DlZM>x0ttZ1a)<%N;6@xY z)q zBk0a9$eIN3QM1`#+loN@Ss@04%2@~tbRjHcumm&%3pyMGmzfBa(3vrO3gN>uI2C~| zV9NvT(t`~%;8K}dln>ssnwSFHU`<#hC_#dg1SAk3UPX91wW7o%9<*m4G`<2^_l?WU z%;aQHu8vOv*M!)O%Pz}}Pb|s>t4k?LO$RNCz-1n?TFBi!xZ?)29t$)kRFawtT6_mC z3b4BXrV_Mb6}NeiLLGX>C3I>Zmpf6_g7#=2-%gN%Ut2*c^uSc`>SO$BLAfoSun!^b zfn0Hb+lOVj;5#$HdpHt{Qo-#&@bT+ukO~aU&H*nDK~&htg%Riqy%OlDlkh|Y+IE(g z4Jp-1K{*_pv>>c_NYf9>fvgS7k1tCD?T&!9d&+V%Aw!Eu&3TX*qHzzaV?Z=y01156 zF36u?q0GFJBG9rUxIh7<%L$eQ9Z&_@$eSNuUI1^BK-xGUAAt1~WtM;sG=a1hpyPV^ z7;Pv}D=8jymKdao05JsKc!4&Q&_ux}Mr4BaWWj9$Sqly#uu@RNCKoi*0a=^{-crku zl8+<=8o2`>ih?W%TcH3E12=(^(!nP$fD0+Gc2L~_n#_b-0a=d%suxQtA?NBdfUcMY zuh~PC(s|&pfVIVtc%U!_jY@)-i{$5(z&lx`Nja(DMrwRgB6z%tAtfInmXQSG78Qa9 zq>{72Cv6l#*P9?oLi>VXt&rv{x`9wpu#uoCQBZ>cJY5Uw-DiR)96>^$DwP2=X$ot6 zX6At7tUM1Q0IFg@eH$b-h$eM;UOWm198D0FU}k(;BEmR`2#R^>MTse?ki^4~0_q)s z)>?p)ele5_KEI~8GB+2}+yyB~0v+rMUd;wklavZR$Ob+b0#yS#+$N(OG))h>(G+Yr zR3-FC4;0{zg;;bNdGUy((?B`>%&05K4%5G5QDVvs9eQB*>jS|BGvm7xSIRIE6ov;>s8P;{b% zHdG->;DQFuV4eac2T%(cVgi^4p1%QE4C-Tomf?Uzp-HBos5B3>z7%{m5l9Vm4iCIM z6E$Q(D?6e29Mze~5|Ar*AeI-E=79=rQ1x6|5D!X-8Hsr~q(JN5K?Ob73F!KY;IWHp zWEwOgK|PqHRA{aTx2KUL(l8`)LE|)O&?UeHFdoF?3@MP%DlGwRnE}mjFr*a5L(js2 zjD!?II-$^>4!C4zNGSwQ{}$#z?k`|SDFhn>B0=3MhLl23;w_F(0gXXG+2Cz0pnf{+ zSR)4Tz%!^<0Y1SDA_YF1CqD(WiWM$U3_2kNrW&*o0GSP04vZ-RI#eRF2(;7>Vh%_j zL@oG6KF}6oBnfCg8c77hQt0t5dHLY_1;s+JT2y0`a}qOiA@)I)LPTInkqt@C&joMo z1ltZeBoj0YiwFX+2v{G~B6Za~yBR3egBwM~P(Em=4>XUF3gzeIgRWJBwpc*-p`oY-i-XryLY0G;3xQge z;GNe{K~U=$JbJre4%|R_`YP&5^wO@a~w(vauV}E z`3_Y&H4k(wOHq7M5$Gs8koVvgK!iZ6i$RyYfRETkvK~biGH?fq;rO&%&|n_I61cil z&}apQctKHqL1H?1qOcTpGc}Se;1Ma%A;y)+UWbT+w1QlhmyYT!XtkVQ1X&e~q7hPK zLl>ok3`hl+AqZzBgU*l#n~$OoB$^5i?98&%oJx49hNcm;daD>b%mh048QC8o13(2k zHakI?2O3P^q={@ZNDkp4?9yPf!58Hq*$C2@T9FAp_%|NxE3BH~O2EkjR@)%F1u_OS zHGt23AbA3A1S`SmPLM2Y=@;nWSFA40&q=}K4?NDtYjQ?v4tRAiIQfH4^ar2efZ+f% zWu>4oHBh3(r4XEguq6bjK@fR}qf-)d!8?-?fsREHev7~cp=4f|5uh-KEd0%^N{z1q zAIXMc5m-AkE2SW(KBy_swp~0}9X4yg>oLLeKA`zo4D&&we3(fKYB;#}30igtUWbLv zbhwH#@ck1gO7imaz_kTvksqw0Mc9wq=U}g377!3&Tp1N44$ev-=fYDwa)6NfNVn7jji|qCk;>y1v(o6;dh8Is5?-EVhX6B08Qm3mgbZ| zI+(bnq17#>0#N;qDGF{SqPqZ;<{&5X6y-vz8CVqtZRvoI13^k3(6S~Gd{cdV3Ouuc zGBTzz$ofZ6IR#ll1knw49E1r<*qM3Y%m}*I1vKV?a0y5scy$p(EwVO{R6$W{8Pw5W zspQ0*WXPr%2p3+TfE&z3p!4Lwz0>?6P_HE(x^4?v$)ah2?g>QElvx~)*mw!*ilfMa z8t{Dh@FhROCRi zA}9)0!=|-lLmFjK)YI@+xtOY0GSF|O9^84w8bUED#%XdJ4o$xK4120d2(qZ}xy101IP~ z9^^cnl384klUNDK3!p_^nJKCHAcsSYD*~T|09t#WpPQKsRt0OvK$9?}2F}k0tA~jp zf(0f54;i=s=)gZj;G`Cp7(_r_F=z)JJWg4Z3n~?J6HA~| zf~b5*i$6XCawQws0MK?9h+?Q@d1eY|VE~%O+|0cAg3OZS42V;Zbb-rgTt-49k&G-# z%uP)yO-oBHiid1?ftZIR3@VGkLo*;3Ac=!|RTzq4(Vm8+5MJsc3&Kw3Ml%$a1dx@2 zhWp}+QX#Xw7&gL&42nQ|zH&h$kj1I6V~3z(X`s~{;ALfC-RY^h;JHl5{2c5UIH=n6 zg3_`?==OQ25Hwpshr1x>JEBU#&dP&|f)0s8a~47fJdz46BS9|7Ps##qgMe(l0qxL) z?nHqHFOni`Vz3ZLQU-M}Hq}rm@S40lP!AN-B}g%YWF{dNN`U&tP;p3u9aLz6R&C|PrzL?7o+wQ&0lNo0$eov%6OWwk zAqfs54>=dA2()Jqw3G~TsR}|W9(=M2)U4w8WauRlNCgvUn*xd`aykUxL68SJR4O?q zGc^xl4rE<*26(wcQEohh3qCspY%j!YSli>q#X|qro@z#v?L>l!Ju*&!bi&55LJ-o7I+aoLM?b9Y+4eM0CZ(*DM%Bt zZ~>%?4ibjWktF5hC!yN{ZSrB0f*y_z@(ak7ph`SGB^MHeU{gWqDx(avehj>+8Kw}P zHo=OZCpy3+!Q6Ob=!F*u_d>)IK?_Ps;)@bXK>ILJ^(2EbHM$1Sj#NlGL|6uO5Rx#c z4-0lasJRY4xE5wKBC8?A4^$8y+aTXV#UN<~bQ%=o1QRrK;3)!03*y)gG{uO9CBj!l zxyW$~;-NQ%7EVf`G)!U&i};0hkpElx@-1})OT5QjA95Z0F!rKT07 zf@b2NNU(UM<5%KB~T(9Bmr8E1YY8aWD01k6r3{=@d8o`+B%dEzS#%n7mz4Q zRKo;7St%ZL0UNSP$iy1h2apy3C{aRs@bSqxnFYm2SrVcE)MkUt2NdN(`p~fBF5rB4 zg9)Ms(su*p6(pM=g2hG25HWBq0GcubZHtAJmPiuF)dNzLLh24sAr3OUC?Aq%A)=7# z3cObq!#GGKj72W5Bn@h7egSAK4b;>E?^?nl3QMh^Tme=KU6T(^HlXG{svZjNT4gvT6GQejdfDK0omZ1yg zfL1|+4^Kd-1Q&2f#vwIU!6p^ugZkzO^$YU$$OwR8VH>Q ziN(cGr$d#(l2Tc2B4`!^Qe~Dy%!Ubprb8e#4_sAID(J3qxH3p<7qneJAGF#VWFdHw z6eK%&gKwn@ol7q5-9_`~vU_cPKLtv__NxTp|`h)+&L|{RZg;A36(>Dy}RBwTPh88pS1` z@((nm1im#2JbDje<>cq3GNgc5`FUxXpyRzjT`s6dL1jE>vOY7p7%EVjR|1(O1ZyaV z$%2mZ1K<1$G6;T14(P_-%wq6KHsI}3#o!~5i$F`0!DnV7@j<0-8hBNAG5oM1u$7P_ zM2kz}K@8|A*2SP+AZTC`%7D27tO0zT4VVRSIT90ezhiDO#48XCei3NbPH{mj>E30n(kDnwykb6rWO> zn_CGRP(u>WFG5jY0@~M50A5WGI+Zmuogt+Jv^K;|NGLuU(a~Z&V(Bv3`6%TC}gH%FyQ^A?>Ib}HvDWwJR zpgm&oWx0tc9OxKOX+eA%xY7nOQot%88_!A$;&VY(f+)~}e^Bos6)X?hS_Wo-7jYJY zk5mTpL913lXH7ukt+W8VZWX*b7_?psl@A*JE`S_of+hi42Lmw=WC4hklL=~~gW{1P zr5xJ7i_b021g#tbiGY}i$=NV&L2_n%QhrHEelF-%LXd)jEGqI!;vZ4X5A5>O=guqMx!5nB61Jwc+0=1Dq-H_sf zR8V$+N`agWX`Dd?Kx>RZX$HK@H3_uu6erZ1KN=SG7%vOZn%J&`l*<5pz;njNeyc} zqUwgu93u&WZf5~qE|{E}lLNk?0DR37ij%-fzzcHF6@dHEpv7Vk^^l3p)QXa#L{N}G z1Yy%c;J!X+D*?!Im>~GvZ&(Px1VN#Rsuv^zs;W{Giy#u9#E=7Ff}16X@JY^1frytB zC4tYTg;c>1F>vJNFr-v~+L55P9B8%~!hx=7fp9<<+<{bOfU*~e16tG%-mP5`j}R-( z11;wVrEJjErQl8&1MI*U$TnHf0aBIVfm%>G0vfc0h~(y{K*q}%QWHz!L5JeO?x|-; zh2GQ!x*!40hMaCtjF2p-gtK8ybeLjLA^_b72IGUA4_6G%cQ6^yAU|k7Kqh!K8eA0A zOH9rIol8{$*9Shi6WwI6ASjO`TZh31t&T#rr64UnD-%>_gO&`YFr=pDmBkmNfK~-m zLK=TC5m3odT9TOqQ35IykrlzF*+C^Q_#8F{_{=+KrYN5wH7ygggATd~1T;pOo0^Lu zS^&C9wYUT{2m{*5nv%!>rjpXZbS8w0Nai5P;<9A0WN}$Cs5A#{VuK2UxCMzN5ZTIN zFb&xoo0?-#5^rn-DypFcc@an!EC$}Y0O?CX12$ zxwDlQU9^a7jTf z3c)U0QdE+dglcJOMhYkbGt)s!XQ6kfrshDopxKGk9Pr%&p!^P7UYDC%l%C1}k^mj2 z1?I))XM+Vm!vU$FTa+OsGDuBkK4fV+XcI*_=u|D}y>cMAoWv4Pe+^bOfP}!tfz1N5 zU{wmpLuC-1@SE(ws)~|8>xE!U&}qjYQ;L$n=ZnFFu{f(J33Sp5y6r`UprQw1B7_S! z6~YBIIUpuO_(iFZ>rC_W7*cb=c{?>PwJ5z3#4CUt`RwGk}F)b55W#1Y8Xw3xl#b zL1au@TsJ8`TgQi`t<->oV+sTG@OsddIFQpY;UZ|DyT{-P@?rPpq~;ZawrWBW8MG+P17$kUraRbCx}Z@|2Jk#F zQeja3rDvSe4 zj0~`5Fqlya$}iwnDCl%)@JU{vHJu~ykBmf#w&dkeB1>2oj0-h4hhYaa}r9mPfi$EOEu>r8=VF73Y zJTt8lBo11(U6NQCp9l&Cut0uJ4vYqML~=lh2QC0QcL=T$JYEADODatT#db1CRZ$XX zaW}Lk0t-MVeL;gU;9vva_?}t-9lwGMlpwg^ktcA*0%-=f!@&Vo4B?hQnrk3m#pfj! zWP+wRQVYPHMra%$pX&#b0XG$4VPBG%of@AEx>z+o4RVqQ$TOwjhz4cze8_Tj5EC>% z1F{n_cL6@66XZUSFhn0Bjx*!aAn}u#lb>Fi8V~IuKu#;k1)aHON2!Q8q!Tw@M zg)Fg!?n3~lLx$9%#Nt%w89@*>=;RqtW&&>|EY2v(%*%!hIWnXc73JlF5`R)oHn^fH zEe45!7Mhk6fs59nBGB5q)S@Er<<6jPBuD{>Q=FJvkdq4MrIs+H7AGebq{e5YR=}8f zrJ(cx5zbF8Nz8#sfQC0qGK%s`(=%W~;Pu%E4&=Py)Z(J}v|{jZ4S0sL7<>r`cqoGb zNeuQxj7_p$TU~TA&P|+m0Y14cfp{oC+2I9cckR#ni&UDBc(>1iGiEAiD%|qz_0F zSfDf~Cq6eZ8LR?4fDiT(f?JjYDga6{z^7@0nlMEmInbhwloZe<_rF0TzQT^?;}VPojdR-ZMcZ5kx_LZb4~DDrgV^ zv|^+fbebzvF=R~{1B3@TZ6DQe(10nbqI~ES4@3_*Nf$#6fZS#W?ht~-VZueJsZb^; zc5@Spv(dQm$$2F(p(0R&80>CHCk52Z0-fERoSycSu-(*@%uASRS(bAT==s>OAmXCWvwn6E&hh z84R>+uoTph0&52qdr+O=A`;Y)f?W*;6^B%GVAb&I1 zz{S9)6o8Mcf+&X0CxKcspjITr$g~vD#A`h0SP4iprRJ4D#nM1yX(*~degv2LAd8@? zz^wu(A2hB8*8t*x%!Ug&hLi~%>cAu2$2fd+k36G5dK$a%;ju*k_w2IafVWYDYyc&ik6vq?N?{X1lRSusOu zd2V8S0jP8ZEd_$O8Z>?dKC}tk*N-m+U6u$shcLb>6|~19g&`H8q7-uU6zKRsurx@n z1a$sWaUMfzMPhOZw3-Anp(&&y8MN6Byjv^bXrz?VrD*skzACT0@9FK0uEgm6G~@-j&I8=Nv$Y>sD>O00+q}K zxht~-)m>nIVgW=sQ z1agl7cq#;bU=&y(XKgK{+}Sio|i!DL8#3wkp+Oci!PP`?!H22i8Cq97A|`6i;c zgouEem!OUeh*t?|dVtzAnR%ciUdlio1zntzS_Ga~f*e8(Sy~9Xlsz#I)RG2`r>22I z8l(~`4C%+m;}XsU2S|Pq=+G3HQY>PbdHH50@oCs)Qc@wtmzcySCg;FfprFGjKwNO2 zF(ngJ0)d56K)b_0EzAnL3;4tU$e~9N13)VYphspvbt8#@&p`xr zBXCK9ddQ$26UbxWZ6Ba3=OK3|AsJr+J-h|H2M^gOa8V3BC zXenD_5}yQO#zSsihG;5EP0WtZNvzB-ErA9mq@<27EhqtqtpE*Q7lSq%gNOM*X{W>lG^Z1f>Nv=Dq9jmj6yit7%?J>) zGqQ_IL1h_8XGUpWHmD59D@KWW$mUf@-I!AfT7wPs2B;ld1lcVL*+B_05`4BcIHf>J zIYffzSCbZ} z=Eg%uNk(8;OHTxei}E*(nD$xP1!pYje-nF%`VDlrAThXUeekSdUC zQz6}QsJ9WKh&TcbjDebmFnyr$+vND1R8Wlx@>gaNBt<5}LpudoC>}ZOf;YWFf)#FD zNhRz&L(ps;$ipxx$dZVHqEv9U1+7)ggSj&wwoM!y8Bh(NDdEhLRB%{Ag(^U`LJF)i z3(7tzpqZ`26wv8i;IM%fM(Cjk8U_SiQUO(y0?oVN;~^ksr-Isf$r-88$VL*(Lr=IM zrQj0}A*Mktj)$>911(T9;vshx!eu~>21s6jn+}@pf~rOp0}Xs2iGW6FFw}u|uID6H zf@_BollatPP{9wnb)^V&NO!U5wHRS-1N*WfovFu1%CzT;Mbxe(2{=e6cecb1r7m_1Z43aXy0f~YGN9~_LS6; z)S}$Xyj1AeSA0f3XlMnd53&R*H4U15Ku!ZEyYzfew-lxdEQG2N)JKN2nGtqD#7asN za}cEf$i(!b{BrOdeL)FQa6$XPpcC0MOOVP&gn3|JVk!GTW|}}1*9C9xX+%S%&B4ez;z45{u;dHs?}0nxPyx`bJ$dP%dyQbWfjal#1Ojew!L36T zMzq5qsSX+ppy~~!E=x-WEk6PcmqT-IS~7Uo4|4UEmJAApRA`SDVqqF+aSdn{22xo8 z7elH5;9~I8y};f8^$$S9P>|U^kXOMX;I&)`1&9h8EDLV9A*yt+7^s9#MQRbGW#;67 z_U56uKQk`{r9=l85wOF(6H7n~NkQ#csLwLyV+XF|c?t zv~3xmm@~=OVlSTGWPQ0H`>_?Hq7(0W>`Y(UA_C$IeWKG+N`xrHTPdl<$>?I>-4^h7fTrN09* zC8T}2IoVJN@R8;q&momP z5TC#W5fKKFfbQ!CWw7`>(7;ZKNjyXbEL2cZ1T(t;JmUi@GQmj@A`Gp0Art1HlnmaH zkqW-x6f%+zQ&$Yz;2fWvSe%-cp93w?kTrn10pOY%Qxl||gk}U}J!zoq4qAAGZhLx4 z2~sd1Ysn~0PX!kQnAV^KG_sx?(CyqfG=b&djeTTY@U#vp*)eS^D9Q(ItHhK5osKx%YkOEXg{P#WDJK13CA<0KQ586ce~a2|rV z4V+-GH0{8SLe5xV0oVy~Acw&8gNB-*6HQqt27@FZ3k#8zg8c)Uwg8VHm6$*(Gf4RZ zO`u>?pdyGI2N6Xi1q2_P8kB|rL@B7)1Z6c)SeHOcHHZv2dlZ8;pI=mvk(h@fnIB&azOfOi7RCj)dthRqRyerzi!1;+w*lhse2|J% z@CYf$C7}Hv`6Y=+`8N|XD+o%eU?x%w6c?9*&TR&d3_#5X3!$|AGQl2=FUIOz2=>ZW5%i z0+H8cE;;QxysQ!Z0 zKX6fS+YY>=wKOFK7Ehr4jd`h{V;mtXv5-P8JwHDM%{GKkd|o~%MIa0Zw}n8vZ8Bkl z6uC*@G6XUm0apmB6(Id~&liMW9dsjn{xT3V^ad$VAXk zA94mQfC_-dYBLc=mX^dLrLdyZ^wONfBFI*f#FBhy+c!4}HnEJ6L_k}X6G6-Hky9{e zn;1BkrsbEys-WB?&^#X``662hQVXd$k=y|iL_`!k6{MDcHi#sm%`c$dQ3Fi}pgkqv z1_Z2`04`d<%LpN!2hA#h?j?-R1(}Lm2BONKwmLy_pvVI)AwugMLThsH@>WnJK>6^| zTPPpY%|?vzA`2o^mZcU!Y6jT61}NGgEjiHPTA+1JAR9oUXk8<4yBT~bIp`Q>aPe3K zEy|JWXwWh9;6R6j1$g8l2|At#<$(HU&~6n>BrhLPnM1@txePjJk8Bc>a6E=4qzOBa zA&^TKATCWsnlb>%fvS4w5!p}$;6)Rl)*s9|hyW;1QAHr31rr00=OM>&Q7UK?Zc$k( zED~WVAt!u-!v@mlhDbn`(Zz!|BY|%(fu+gfBuMZgH-|xDAm>B1CV>VV6H~w*1s(mK zUj`b_f=YtNy%8P)wJsC$3!sS@!~-qL1}|#?nFv{20*ZT(6!c)McyRX%sc8q2gZKb+ zq6Ew$==d0TrVYt_h(gdT0JIDS>&}md588q?AQ=K`St7XLz(7@k=$jX3xxnmp@aNTVQ51La-j@3>Y)<(MWEwPK-~bS6CgH#%8L|OW`QaN=OEC^ zR#a2U zZW#mRB=FWAXeLJP>tc$>7l6tq@G_th6G(=Kj$=Zshv!@dKD&V;1E0}?h-T)& zCeXoraC;D`0EHS2-Xa1TswgPRPcH)9O%Ki%paL0-+rh%%Wd@0vIpCEFpe8HmplGPB zoNS0FO78-k6p&XiKm@>z5NO(mh=9Wo;xLE+^r-%L$X!PeJ3!q#=%uC@;^2ZE9B~lG zBbyGA!{En*R`ejv3xll%tBfxNtuqHLw**Bd*Z~kTATw z2J_={6N?KGf{0~AaDCuB4(EXue1ldQ!3Cgs7`$!_Dp*(wT6+a;K|zuvL?$IAJ_Y2t zN~nb?De-CGq5@nlpvgdo3PGZv>L?puGb~P=aoq2VWsl0=)_BTM$3Ov}YDWc5_2T!Dsrz&ap+x zeV|3!pt2v*KLa}puA=}fkz7&%>Re!x0@dkQ#8XosEk}r3q35qb6F*X>N-hAc=glvI z+EFqMx-FbLFHa%K1?_VM^=ZN{Rpm=p~(m;0`)3V&V=ra2i2JHK!q6( zKAsX<>BobI&>_x*t^GoA3``I_Ck$5yj!*C`A>7sQ#f;cgLI#6DGwe_!ib^WMOR0wo}5^{`!_@KbehRCCZKZFZS&7iqBu-l-;C)k+yWXNJos6;Y&QXjPV z84*^gd0 z_T;6+mw={yL2XXZmRz_vXax$`-|(V44HRb34QH?#7pfezv;!dnEA+tC5o{(r6}0Ii zHx;S@G+3UJ32pp<)qw&PQGXyc=0HgoS}uT6C+JFaaIk?m;6ejDj0J1{fJ9-19JI=Y zSP7AUY}SD5hup4=WO@p?WXVrMN{=9o;LMDy4181-bm0ZuG;o&=Es8+8!9_I48wi)c zh2kOizroD_jcj8v0_-gC@(qMa(9A8WsbEzgA<*5^aD|{5cvw3UAdA0z-NEkGyMCKqKEfX1L< zW`c4C+$cnHNQd3A3sF~;m;~+mfjkRU4-$k2E0P%4yYNH|nI}YU=s-n4CdH@1k}g!R zxFodzyip?;+)RL&3R;$sng`l38();4pNk|2>Se_vyZ}-N%ZiDxx)NCsDeEE$gL{<- zQ;Q+9u;6kIngl_;MsSl35keW|p!PDzulad7(B@A@Ire6ECNyJ!3t4E6%!HKIFqu;D zAPmG2pzcCJNd~Iw^knepQfW~tBw@gf0o5L8LIt2M6}V)C83^hLqMBC$YLz3a0gaRu zgI40C6@!^jt)Ol;I1yy##g~I_I|ZkC&?0K60#FwLUPgfG=lH~Q*xGWW<{VfCYuN;m z$%n)^cr+GjALwWz@P-O>W57`Zo@4;!DkOJ+q64!f3AO+>K7ddSj&^7SLrjEJ=HPKe zs1rb09x4jTLut^6hA0QMH9#vBkko?OU$BxfGY`^20|zov`Gz!u4K7aMPJoY9!OK%n z9w~+{u7}zJSA^8qL^2V4J`(6SZE)8L>e+noU^2`e=zZR$IjP_gJ9wueGatOM6_f;u z%HuOK^GaaalOe|&Vd*_(<|l)jve1SLXsrn7Pzs1!^C5>aWtQO32=^waDni(W)DJNKZxy=lo<)3j&fy zLE9)%VhUXnGRlo)ZYrpDF9XelCl-Ut4OBVQ&;k$LmcnBPVlk4Ey!^amSZ;^fj3kR( zCxZQv3OdjW+~fqs21GhOwF0LL3d)NUbC9AMR9`@6LD1Y(keP?+nKaM^>8Uv=#>1BQ zz>@)Nq8UA!z;j5DrNeNw1x2agvdm(F@ASS}^4nfLl#gJtt zU?afoZCI&?ECFg>f({da83PX=(DYDh9_Y}f#1tfr(DEI0^&MnUF*Jxki(4T@KT59! zbZ9?l_cmyu1>A~)`1I1mqQtxs&>5C6QBY3;IawB?47tH=Dag#rL+OKMLMALgv+u>3 zkYndyMuN-O_@o@9L6gj4=;Q=c6tv(RW;SSP7kZ#)=YqRM5GC2UpaZlLL3^(7h{7(c z1iK=;3Q1)SXm}CaXool9bJ8H!)#1+f9d%gc`k_dyUMkXbeuzbG5h zcLvQTmsEm|j(}Dgpi>`^>s9csd&q16)UlQDej&Uunwy9aL~4wJ$L+w4c;K+k$hVa3G0ud+z?Q=;1U9b!@5m^N4xuV3B z%nEQ58#b{Ac5zW+UP^v0=n}$Y&?aQ4fvJfp;3R-NPzuS#c`5MmRImUnhr-i7iYP25 zz=DuD5|Bq>P6Am2y^9SbjIbQM;se2jX9JKqAeGRiEf621Cg&HWK)RlAgTX?X`Jg2L zFk_NItB;^#+=#RU9XQ0^1cXVVM?Fj&QJca=@^fH)U6>H&ycV>P0_s?R$_aSBfQo~< zb>RF4b2+%hgPviaim{oFNIFHSAU1Tq0d#^r+E_AlYyy%CVAeqv^1zD%aQ=n|EJPBN zgTdmcdf>vy!!Iy9;F2)2auLxAI;I0O=?)4|kc*+lLi#75u1axgI=I^clPCrqr3z|P zx?%H%5MxkeFcLE8t^<@*Rh$GqcOfY!yDA@a zG%+~!K?Px5UZ}wkm9QYp%+Es+hjdUN{RR{XXaf^f3~lrSY9VOv3i#AhsJoF`15g!^ z1Ow^TqL>Jk03Y3mB9W61I<+6X@DSN=(B^79xZFX}02TpNoG7B8Oo|vSfw~5{IshMw zUzC}P)Sd&iUyxHFs67oIZUAvWi@Ctv9mLQ9L>Stq0dZjAjne9YNFWVRf&@VMAGPHN z5`_kTY6{3pDbT_hBmoIAr127vAfh!^oLYhyodUJ_a}v`*X)_meQZXbXQ%gYS-e=~3 z^CL90PzK+iORq}714QxAK?SHn=t?b!6s%T6l`95qJAh8*fexQSlxL8R3^dPyr7%Sx z@rWjlbc`Ov580WZ1JyxeB@kCaT>##o3(CAj`8heDOUFRR$3W%4y_h7>mYn=F@TDGb z@e)|i3sgj>6~otoL98kPU7rCuj1Sy9focM8?SP%4n^{nbJkkZ7>I1j1QV2+Z`U23l z6jU3yN`a4MA`61jGK%$JrAT!zR53^$qEQDG1S>-lg-rH9jRPGE3o7oAxzJdG&m5G2 z4yFT#2#OGR7dy184_?^@I=BZi-wrw$9HIfd)ITo;G|UBBX9}?ftQw&vGdDFJR4YOy zk>?P>ha$xnm4owWJa~sE#N499ykgMNcvwmW*aA7IaoDCHVM-va3vd;JGV%qN&j1|| z0JX6+4}2{Hw4?)PMl>tHVvzC!7KSj}!DH7Dc~IP;OM}Zzq@)R2tp_{*0BRw;nu4v> zg7u+Fk>(U3-HCX(6m)47*axKr$SD$%d2sZ$a7ZE#T0xay7GW?6q_zWG2$Yh*BT&#% z4JHBFl!DyIgNlRCseuL+R0te|kYGm^0e5Fmg^^laP?g{~0EIq^LTGaxBnk2iiX1pU zVRk5?=3&TU2_MioQcxoybM#3$*~Oq`fW@iM6)2?;aZqIrsteF1!PNkkF-^#@0d$}t zu_zTfSr4k<(kj7+xPop-gKjhj$3IA_1k}<4m2!|Jh{)ow005oY4{>oBWU41VHyd1p zzyuSaeRuF0Md*4RMDYR^&4+G?gCsc6APqz_4oT#2gDC;^Qoykaoo>K11Qe4P7JwHm zB8@qLT@LA$LrjA@1gs9+7=xxSh(b^bz*GlXf(H&Nh$7H{6Rdd+5rJhHV5RtOPoYK_z;zZDNE@&ZgVo7QWc%x(`LmKG5?X(ma4Hr#MEdgET0vh;*T+su% zH-jM!RO-XTLF-ua^7G=e6N?k`;~F z0acorhb{s+oG>2YD$wG?Ja7tTNK4Ku$pMdxz-M=0B01SmSy1a0Rkk>_1SFdhpIB4` zx`#RuG(8KtG$}qcCpDKLEhRpqBoVa3tN?6uK}ivc7-)>B7`mAYB$1g{T#}fR17;RO z&Kd_D)Cpek&j2|o6ih-&JkZIZkb%||aLNIZ5Si3u@L&Vz^e0FZ$0sL&&N579fLuim zy0QhrD#?f3TL(E-H?g1~rxMiaNy`M??g|kEFVq0l3ZR42N}!i_;Fba(!CjKd08s(i zQC^f-j>3mrSAj(cJllXS4my(z*|g%4qMXz`EJ`bLu^9{&1)Bj{Wei@}3R$Mfkd{^) z4_TO5oDMnI5+nk;F$A1eL7Uq^0;vU{_9i$)(~9GvJaAPCSy+P*1Xl&A1z>}r>LA4^ zTp=hI#Uojdbci>|D)1?kUOF&$fd#nuRBX5cBz z^kirVWhR+{+F%eFP*DbI@n%D~;OYs98J`L|jS@7V0MZ3&X@kzt107%qcB>ia%C-W~ z!bFH3@cn6^>H~=jUTpy3rzeAo1vnd329iLNlc3V6pq(`N*_ohfAuSalh@=U$d?g-q zVIQc#fw~7Q20G&va)Nvs$k|}AybRDHWr#Uo0q7_dl1OQBD(E1#GN=$}0V;Th4%m5W<7r#0ReAK-T4DfPyz3bQmpk*AUo%ybN#&l3I~mP?8s)RGOTfS^_a3 z4|JYHCX55>W^kKS21KU zEnEX~QiCYLoz#j-^Ws7C&LGXjsi12hp?xTb0O%ASq~rsRP53}ENJ)7js62+TKt0xy z%)C-)0su*-7J;tkf~Hrf0IWZfnFJYI0v$}73chADEi)-Tr8v0&w3#3qbRlITXoD+Q z6m*RrC?$Y`8Iq1cy!f=d46tqB*aEu`tN<*RmjNoY;E4o$bVqz%MlzBL@M5Ks41@@{ zWX}X`qfUb#j+mE`91jm69OdlfKHK(&&-2PU}q*F ziGsyIjV*{3pu!94c(4F8=2KF^Ed^vDkVn9LaL|Io9f^xbnvm&8(8M70!VGW`4mt7; zTps0su58Ey-@d>AmIIev;BH7_N?BrFa%y~e5@;9`Dht|y0Ofb#{E1+M%Meg&~Ii$SNcK+GyA$OolxkmAx3 zNS_NOq>2(Dy?XHR1Q0FIVzHnovka;gSp?bn(5<<}Na+K76bQr~h-oGH@vz`40WG}& zd8nkM5?M(pWMC3hb3ycgYk%l?0Z2WVkBC5MeCMS=?$-t9A+SbJqZ%~cl!N3*gjfZv ze#=P(3xZm)(78FVZcqvUHT|J0rZRI5?CxgFTbEDKMk%Jl2c$q9Z>bqlRdy1 z;3^?AHK<~+EDf;+%!@Bdg_v1T0=n!K)J=h!ng;4Gf?8E@BjF;jE;x!xa3{Gu2~?s& z%?EW{Q5^uvI*6>9n+R!|W2ym*6vu-%-ast@Y0b<_&M!)Zjr|}=KzmWL4E)S3|jDm z#KAkI4X|iHbuvh4L2e4%8E8FWX!zw7#g}9hfa*#_WP;2=jO{=bg0lgnG)M$ZzOfYR`0&~sCAc95D(sc01^eA{Ft1Pn3)ITWEK^I>K4$IQ<|4q2pR{2ixm_UF|=8i2ig)_ zoD802jxWwk$^j3Rfz&|n075bw#Uk+L21r<>6hUaviInM;@re5rlM6~=GT@!DAY&mH zeU#-ULS-tFQ^6f57&kQ;G6f1zn^{}}y15U2~g!AUVKtzd>P!z zOz6-!M0;jld`@Z^XhkbXKdi9=THON4YoJT)!7j~C%*iRP%q<2TftQpI4NJ(mA>hND zAjW}@H-U!`XmqnEzNio?m!F&sPN;Ctf-58}igNPHLDP098WEuY)&=%gZZ6DZ6!oxv zOCI!&Sx~|N=W~z%=-N|IffEnEr5)_O-24>K5^>NVNoIZ?G^RjHH8OKRV-R^M;B%so zvj(WIg_=H)MdHhgK+_bUK!pkC<%13?2Nkzq)4*qxqw(T%K*bS~G`ca#8JRiI@&asZ za!zS(fdwQKzyjbd49tLh$X&`{4}xV;6Dx`k!fMb618A@nvWFSugZv`M=s2j+4z80y z7i@wq7)S>#B`u0Cg{42xP4GqeAb)~Zc!RVSBo~yzOSJ;1(+e_F;$dN2keQcUQUpy; zkSkcrQX!kupn0I6D77p;4Rl5U*dw3@J*WsQN(D7x^HM;QNy*?v>y?OnRZx^)Q3)NQ z2RQ?-xF|IZob4e&R+O3!8K?oT;04`%1!}wIgSLNzbrr>fjsSZTtO8YC3O(KsHbVdtE&z3-Q&T_({FdZ{%+E^)_k+MY<%+XGc@;T$!08+% z|AP7#dByQ%Wr>h&O0xAy+;vv&` zU{SRC3Uu@u_@>8HaLorZsyMX>+~kKi0@T3)bK_IXpeY+61g=r@QsT=J!6PiI;|VDML0e$zXUWM0NOsCxyj z7s0cWnMDvG&{|YbDGwU4F99bG>=N-wrJ#&nR9q6DRF;|?Uz`fv6q5-O0^cGFaxA#T z0v5@~RFw}}p^zG1ke&i=?t+vRB!Y%qL02O{@*ha7I47|Tl(RwX5^$LYVu2>ci{n8g zWFJ^&1!#gRzZ`tm6DXNifD%#xXpSVaqO<_q8c!^VPXk3eLmF5pB^7k_B|ujq*^1&*=eE48_ zju~{pGiczQ0W>fHiY@SU&|pqpK~a7(cUJXqEJifvJjt{Uh(3-Tov>eby zb`U}EN_&tds3MTv`Nf$i=7Y}~0<~4*lR=$b(4-3b04zuhG!zT!y=K5u7OE&T!jS~a zQsZ+>Ko*y0g3dwCEQtp#Z7VH-2|;^_$bx3z(P+@bPEKMHsO^>mioRk{w!1_JAXkVe!u2Or-98x0l9 zC>8UB8nYAKNXAx8ufDMLq@F1KV(1b(| zOiNA@X#%+f14$-3wFq=m9db~XrRKqBd>-~)(2Oi)%zE6rm_12qdlS4pO1rlm1} zj<^SBCJ-w#ACw|MM@50J*9NaV2946dMM0yJ;9+X0Xh~)n_?!k5ZhT4+xNi>;Oi2MZ zA>xamC3rE+BG7?Ppdnjq5;;YsNXl}GN(LLJ>44T?C#j2UX+{gTV(fgUtesS|N#nO@^5VRs|LTt=$E$ z4nR^0U8<9UqB=LRpddA+Bp-A@F^WV%ViD-JsGQ1ph!RxEBII-laWH705;_oxWGS>@ zL(vWQF{)EQi2)QkXg&l9gUe(TGfMN2hTV|tLyVsy3Bnr=5HZkkZ{Qju9=xmp+Vp_P zfyWy`4S+OoO9L#Jk_sLGLu5qgXc21SOo6Tnhi62ndojde@eHbVK!FBT2jarpu5hsu zQ1di5u>d)dqx(Fyq98RHw7#q;6|@o?>}JpiDtKfJY7%&n2Pi0^eDEOwV3nZZ8E{rd zWIm8kUVa{Eyb0M1kT9yB!IOI^X#sku8Q5e{ZbA!6#M}VX9iU4IK!p?{b7n$nf6ygk z@t~ENpn(pAVo(z{J{Nj;EF==4={g=^1Y}4DE!1)nOY=aNp+hv~WM-$r(>8pP0qkr@ zBMQ!hl&+w@8B%0{)Wqk5h7Z7FeGtV(rSa*hc~G~4%2Y@T6fTJrJvl|CpxbevZUJ+^ z&ARwZ(0~z42dEPOwkfly5VVB_VKhjlC>17$OB_iLT412$X%GiI5(>5#d^8hcRvIA& zE?A&effeN>R#k%16|xvw{sZ?(K_l;AFTxd8CZ)!wFN2?*80PBEEE5Ve&Ry=~5>u6#~v6Y(*D&k-< zn+vid9(3*rOa~-6#)D2QhQuhiz5!<{r1}#w@skYNBb{Fa@;+2ML>#rIL8_ZTOxP{~ zus=X!aG)rI2V5Rx5CvAQz__RdH+UutY9n~C9BfuWdOoC$l9>;h`G(0u@4-ZHlQWAU z17{#Zk;@|3C=Tf5acL5gTybdaLO zCl-*!FvpcAf~MyZ(_wiOBnP%1JY0bsLFM2E8B`xA9ig@aAtHI8b(CQHz!SW)gbVf9XK|Jts6=Z`zqh*lnR#XXTEF#N-MoM6^ptb?RQVn=*5DnZ2#WJ(rnGK>ovm<8`dMHS7?%mE)pjI0@CH#~m8`XM6m z*c3xfP(#*^o(@1JfZYpMl%0y~z|4{i#Dp8fbr2y$x1s`c4-crN1sV?l*YJow7O47% zEeQeZ1`EK)$uWdrkq7DzKwSi4f=-bK*X4zAoXBo zJgfl-8s|(bEy;(@jOFKm1XA)#Qu4u(h2X_Q+nNxOa&UVQ#0Fn92wq+U(F@_1f-6vv ze1Qq5EGW(f`2)-c9mfVbtOP{>JU9W=EfKokg&_@m>LjQU1l_$= zl!!$v6?!cPRH`@=)b0iuRGgU(o818$1m}ZBuR+r=2p!P%FmPqy#l0O@=pZ~ z!9!HTH_$-1#g)a$;9V>EMY)Nfb@!0d6F~NW_@F}|K%2rLvY=spP_5Rad-|akIiLZ2^5!s zMM{fP;UnM>>!Bm=_}vW+5!lQmL}y8Ud@*Pk55j}agP{8Y)Hee4gL1&v!>1L3H`_6Q zXz)0BW_}510Y_ncS}ABFR$+V*Xf+79Ljh%jIur2TQc+?$co98A8i)m*tbs5=TbiK< z@|H%3gVMNjTF#% z4aE>u$)L>@U|HB9WnfNzUP)#;tU`f^fQA;pEYNC>5{Pd2GAEEkY5~Ho)G~140v4_) z0WIAJ?brZu)4-E_rO8ke(#qpOZ8nH;={fmHi8+w67Ie5ySt8Vx8K5n9ko|WcGr((< z;`8$Jz%>R~Bp+fzW`0>Bf(5>?6N#G(+Q0`=4r%AYk1PWT<>r-u7o>pLdBxzxBM_a4 z!>vJ5pvne1p91EB>Kf3Q1EAIv#NiNK;BpW=(FRwRSsb4PTImND01eN9W^G{tP|t$2 z7K1Y+HbaZ!!K>mBwt!aorGhq)LxqwHAO<9r!lD+m<_2sBwEP6K(?QEM^FT{^AY5=0 z8|DJg#5Y(tvjDWq0JM_?%*{pB1Ulscv~;Z!YBgy50CYY9jGLbhWtF5Nr=@~YRAWku zKoe)+U9nIH6eU59X9C{@4l$z$d^dY>322T0Dv}RsM1UswAbe2alLDHW1)T>5+6I`G z1`A!t0)>=(kYcD65FzkIeK3*KWYDA@jF*`Xs&0!*ir{G#(u@ZM1c((6TBw>@Q36vB z>Z5{E0;FG>R|ItwNEj@H#4pYPwSB+_RThITgoaHXdiAAX}VNjC=qzhWn zAY2A3J4+Iiv!RMX2U>t;(!lCL)3aa(=s-6lAAwhGfh0=vK+|8~W88Nvs(eZZ}L@Y-NVAc97<mYSE0A_l%L6nyh3*bb1k{L+%*%#>76iUc2~S(KVul?qx(oS&DHSX3DgT7U;u z3=+*rOoFnDK+{~1^il;L1O({=)s4lFW;AF~T2X3Yd|`fZJa`{5NFRg?YS17`b(mNo zc)1E})C8s#T5CfW`#{V9mp0%f46rIRKiABpBp-AkNKt-nd^Tv^c5Z22I;aZ<7AORl zNgyfE;x%Ncvb5rKm}FU6F*r?w*LQ%fAq9Cc9@_ONj!y$Ej|a8%Qa}ubG|*g0es*a= zJb3$gF{n|TmlvDQGJnsL(-{1b5*;EB7H$3Go-W{(x-5i-)v_5L!TOC{RxW zyf3b_xCl)K>N4!2sVR_~;b5@}u?Liuv0DQTScGAqk_oFvKoTI&gIot!4n9o-G$Ne> zS|0(8PPkxZ8InTqIn0^Kp!F4SbtRyc7`c_8ospTzm8gnK^WvfHO(f+|zk~W*ppGbt z4siTIyQ@fAV5a~h2|;i4fa``VxQR~z%|E6hi57#h0%+9;$UfxQ15b~p7UgD^fM#c* zSpZohXqz->sd8RvZW5@fhgzPIostIHr=FOX0#^;1Ood!fj3!i)3QD=)BM!CdUyz9GNJw~qcZ!3Glf=qY&`Rmb0?@t-sC$r8D929Ke@Y$*nN1ePD+hJdSz_{@CxnNU#mIr-_J4K(o(x5Q`W z79e~No_B;E?Fv<%n^*zbkO*4xlLs2ODu!E-3tvwUJ~s@eJ{vSll>y(^4ihd;hiin) z+=1gYuLL<2AgL$^Z}MyV_D@xFD+C+zGfC{6Ox6o7rU*?IX7PCTvX#h0@ zQb1>$qUnGQ7@-Ll!_Ei96h{kIs4LM65l}xLSMdar%S|jsuLMwqq4PoD-2hNWfLbP? zbt1^w8oFN{*(&4=0_sJhox=z<3_~U!G(U(WiJlTb8VXX2Aek#QFBufY@Q5!4pO%R1 ziabzf3}GB})eK5?0nwCM23iXnpOci69dB%e#ndt*h@B|j2Hj)}o;OGVUqFMf8R4W- zXuXbJpMVa9$S(pF)n$fwRAYmr zL2IgEQpt%q$E1D$z6RRHoyF=+iZngbz|lW{oOH%Rxtjq=N1M$jnJ80xeBKHX9NTux2o*rw7_YiKzm`JK*(k2)aC`z%5A_W(8 zMIR!0f)DjVPoPj$XeNRWXGgLD)JZ_snVOac8k_;0_MV;x+N%$WSA-t0kK!TC2~hd~ z&1=Ad3DlTIs7wRTec)48Odv)Ha|oVVK`U}HH5$xA*%qj{LwQLSP?W7 zv6Tp5dC1acWTT2fp@;4VPy+?59xW+>jugWt1X{v|WGF~GB$Z=RTnsv!4mmY~O@%gR zAlr|?J86)^31lLu8Gn~cLzeZxbwO@`fOA1-&>-a`&^j)Jo1x7is3Sn(hZa;&8OYci;^JJG z>5%dV)H}#Ssyv{g$Ym~62%5VP4uB3_K&^qq7D5)n2Nzi26R1Grx-hE?Qd6@b=Odyg zT~Ip~oR5$UDlGvu@=`z>GSg6nL7|K)g0B>S1O(^+WYCr(gg(&KL>Ns6NHWLnNT?jx zJZO$Ym{yz=kDjlJlfX;3P}G3?{Y9Di;M>h1K?~ZZ0}CPOG3r<)K#d<1vp~Usl+^Ks z0VoF$Xcj;=$|5W%%>y@OAaQ_XO)2CYAXt|Mnhc<#nJ6VTR1oekWS_#b7<#CIR+E5J zH0U%Ha6JtgCxrzN_y|>owBlmWbO28sK1rr80V_<_oP{CB_dK?fptrDEE8PZ?|fofss&Q`b(sP2Qt7f4S@ zC8!4gDj48bHo}yGYBlh{WMU3z^Z-dUs(!E<=qG8Y6Bgwz5^2jLbZ7J)ZF z!WHBvmw<+7p=A)%#$52=1(XBp0fQ}o&Vs|V!{iX%U8p8d8bft6NFuEgHkJW8c@cD% zAZUkpF+&=J3vPQrD-nnYgapSgOc6u~H1h%#F3rh_&j8KHfEb_x5j-BlkXD)pyE+Wa z22FW^M|wc(@!`j_l@_N$ufPK}4H(kE{AAD`dt`PzXk8gN0U_i;lkbT+;AKHbf}jA0 z4ZnefQ&K?td{XmDKwTB^a1PYql&sQX(2A4X0?13Fs(BmllM z3N&V(4mvv#Ap)*mp(cX+Q=oI`!L=3a2ppK&@_5*C0?7-Bh05!`t&fy@+8b_AWpi>wiJZ+t4GDnk|q9ngkq z9;ALjRs&vr1r`7`%TNq2NQ+O*%!h25D=k3GHG)+`B@x;S(&CFi!^|+*V$jGSsDc5{ z?m(OYjxg|9yx?`lw_c$m}Jm`280~A{S8k!Xp-nDC>h*; z1<$KxCP6k7f?SLt44#+-t@lNe1$T_V%aFi#K|*9wle1yD5G;_Bng}ZTuqGVv#;3$0 z(0XLB+Wdmb_>_ETFn~B|nV_X6a5>0+eI$91Z;-g)Me1AjL2u zEkI9f0|}r7G(sg>{zTRSaujkVO@V|HYD7S+hDyQeC6HU8LLfs>)IirGp^23x=47UT zw}c_-Elw=~9c_W46j=b=szAx@u$~-Jeosj)i%)^vBM&nOEC5cJ2odOki4fb%;=x>4 zpdsgJka4Jzpx{L_2c!YC&j4l`Hiwo$x<&Eu5(Q*3s6a!QRSvrD4YY;;w$K%39;(|j zlT%SF%*+Q5B0x8W((| zB1+20EJ7*?Q!+t2xxkw%;2KktLEBUkQ;T?mBYyb@564n7nFDwq#y z3?Pzv3hZ1Au$S^dLpUgsp!&B0sueVV0BRt?E2h+3a5Y$*3O;(M5)?d{dEmwDAk)Cx z0U<3ohymcX3StKrNDV{?RFNPl0T+UxWlD$>J>hD>hYBF61@mFa3t1d|{3l!+yqW-8 zn2GFZmVPE-uL^0$nzZ$!^%&$NU!zIiwOn%6H)Pn$SoC4=+I*7sx_r zP5~>!Z~#~oRM0|?@<28KBn+*6!1h6oI|WryFj4SIEz5Sl~5V(1P9^#j0HVS!8nb4p5z;^CL?!bFn_(m)4?q(dwRsRL(K=m0oO6?j!8 zi~}!}L8_sr?t!uqs9Ob9gNTT9$Rrl3FJOYG{(y;M@d;>k9@J=PhYgvBVK`U~TICJ9 zv>u~;h7O^jqz9N7O5kL|OB@gj)zVDlrZUI_C`~D_0C?sPK9&sQSSUgIqEVaXe_m54l9k%!eFdkB|kQ z5r*I*7aq_h!VpPty9S(_VJ-uUfEI5gg0d18QP2$%NSYx^ONx+^D`ML>qz1z<1lCYX z2Axz6HY-2A0Cbl~D(H}3umE)NDTocaY5~!B1rO0diYHJ6Ld*uOJ_DyXG%hTB(S=b{ zJzO_N!ps4UZNZwxpbUmw@q+o_;{@VC%d5anh2G7JV57MJERU8gAn6utH`JXFRiJ1` zt}~$OKz(DVI?&yFNK7=lK(gpofyK}b1|KE_Uh4~TcP?b)63#?56)cNpDntz3)I8AX zCpi%3K}M92+3=AykUbFTcyPKwPBJLs;7o&JL_t0*YM=^17gmB6(IA;wlv+}hnF?By zk0c1*T>vo((HH=+Q2h!P0VOi5!jSb{2vfijh#X&#Ls!9NIYbq5mW7}HfGGvC7E=`7 z(7+~z)Q&*51d>e8OSz*6YJ z0v5!yybv~?2R?`xJUD|q>H|$j$T0y?gBYBGDFK-cb1*~=B;A23U(kdDtOP(V4N!{# z7!TPtc)bTQ2HqDdN(D97K${B65i6Q}wb*NZD z4rnw1l*cdx(0m3_iImhq`)!j`A^ia~wIzv&+bO`FC`kkl^nwBmY7g`VESN0l-loK4 z(7^!6@@P2`)XPr;T}}v#D1_Py&^R)Z@u1t!pcxmc2qXe_J+zwwYK?(3Wo4$NfsZ2w zIR&(R88rTiRJOq8d_d9=HmYZ#VyHM6u6%ug-KOsk9sxBQ@& zLxF_B!G`Q=hyc_{2shw`974iyBi?S-NtRCcVhO}~Uw;Q}-1GF0^H4n7E4I&8IJ`0&Cgx$#p5eK;) z)JB16hVenW*TC0$A}LF)03BZs+O&+Kx+DW?8L}v3l>|%#I(z{xTp$KQMZhyx5D}=m z(v!inTWa8`VBVjlD|yp*E+0wf9W+WzDchV zlIZ#pQ&K=jeio;KJds+InH-;-8J_~q@1VVkFcZLn-~tdy1XB3G1R&E#(25035Ztzg z+W?9*GtK4J zGN7wRQc{bP;ZBFT5Ry#cqL8Dk5!}?GwEUu6NZSlqG#Au2%}3Z@0NUW2RGJ2_&S2KV zB|t5r;*!+F9E35Dr3RpdN}x5U7~=WasVL&bsU@h9S)5T?0t$ur;!@Co^)M?jkJp97 zVmzXc3R4PBo5*PyCJ>*PTv(b}gh-muHVUYEfjbn^dI6vM6c64VQ;batyC8Hi8_XdP zqdyN|)g41h{~Q2Q8M0^~r-;`G$K9MDdz0!X<4V}qB`KuQ>h8K65eGePUR z((=JI1w=G0F*h@(64W40iBGD`1Q%90@lesC1 zi(v98`7r0AnG10yL=PyTgU-YT+YjY{!vRG)zBm_js0fN8q(B0#NCJ%DGD4so-pr1LA^489>TF zZ14?^$)Jl>FhoF}%Y%3yMI}TW?E0pW<^%Dv-H(sl}k}9thC_ z@R9hSGZE8M^9oYpp?q+8Q;-r5YG{F0Z{xC~s5B3hQ9! z7idr;JvFZ=F(tDCl7Ye3Re@Xx5lcxeD9MN~2A^*SR|pz^K~o17DoO?QGQhru=my`S zQj#AJHU(iQOc>NqV*uqfL$jpJ5>R6+ITL(aB1jA}eGOjd3s#euTv7@;S)-sdJ~^=< zF*&oO5+V+o(+0(JGGx0RL=bcj6u1Ea$}6CAz(DD-Bp$R{Cmwtn3D^qQiPKy!`USB2bzriBBvkE(YDH4&J{HQCgOm2|kPqvR@Hi-j>8C zmZj!_RwjY$O9IvRpu2SP(sE1SE1JMEpz;9JqXq4MhqyZlbR7-o%pP#5Spqqx1AHtJ z*hX+q8q5WsKm{@cDwLE5TJ{JLKngTi2!f8d0u`)<5Mw~YGXH@z zj8mu>==2uwUQ*B<1W>J|c_ok|yyA26^C0m8Zs&te5d&*0COp{e+wn-kpatC!2NaaX7lU?Lp(=r_Oag821e*@w zg0_-DHu*rbLJGVR&=o|WT~m3G#0#2pMnoC(nli8{B{}h#;LblJnIwaYtrFNuKZu#o zqmVK|_o?Nh2<4`fLxTXSCNB}xYe`2HEP{n0R8di0dVF3!DD|Nj2D&N~J_&h^!9}*IKpu@}Kiy&bDI#w8T+X`48DEWhSycI#Tfw`aq3?SV6 zT+rAJ=)4GMzJeU80M=QW3ptt*!~tChQyCAr0}jm31I-{otOie9f{jas+%^Q>5DQiX zIzcENavczY4{9Gkl!K)~`5eNnC;=Tf1Xfs4Qj{2<2{$M$1=?090ac!mI0U!#lM@Rd zjsWvOM+t$ngE)|0IM`rt(VSA4lmlvilt3a4y!Zijg(_GN^t=wZ4)EO+p#EnnL<^J; zxq=+5qd2~x98`&y#HSTQZp4KOgNt`ipRAxf1)jK}YLNMGuY(tCfx1B{P``mj>_EfC zpqK$~83UUP5(Tg2Md87l;3e_kHNGi`2m$lK%iAH|0vQ12qUZsQn1D8rf=o@%DNO~f z>IJI@mxc%yxRnd$LOM2(Bn2->z%r1dKtLveT6s{RG{{suL=-d_mk8^ffttvmqka%Z zLwDChh9N;WLqg&gJedGG1rKT@Xtuu?bY~Oj90};z0TA;`Knrj|3*sOu5hWUgUsM2zZEK`EI4_!DvDJvOLx8&x6dPATHf>@FZ zsmh_bA~zRwsTLwf=H|v{WR@p_+H*z4kZ8-zg$zN1os=67Ik6m`pmTFUYkZPRGD~tG z={`3%9-%W4(vFW$PAp0VHDVwY2K0 zo#6dSptA_!oHWq-BsecK50VPN>T*EWV#B3Cmte!95iAXIei2F!8szAT67UEaX!rt> z%s{uWfDM5)c)(>nv|Ije{#I&C3B@eF!@6 z6>KL+5xAiVIt>DJ)HzHgB*36MT_A#>CITqNpc=tfmLRiX{gjgUg49&d+0!YhMTpv} zAT_5XJ|(j(6BaN9X?f5k^kC!D@*wU2<(gv1awZgU=rz&s5)O8o8N>z9#0R=e zR1kbqB&eAR3AU8fGVstd*j&gpk_gHCG$i+f2D;!m9z41QPJ0kz!8d&+gK{E_51RE! zOaWgn3pN{ci5bEfFdiuXLv)m+#)GZ}0ILPvZ-r1>4(T2gCFZ5%=RyzL0VzWk03Uk_ zHV7)3oS2tb1SzzjBJegllwWFShO7Z}KoydyrN%~}5&kkr(FoIGY!siAnv)M2Ferf! zG8-GkXXYhC7Kfvl2(7wcnk^ubDe<6Pf}lf5!GjRcaDra33lHF;)MW79p3K}-NU|$R zP0lX@UDTNg+VTUM27ouvARS-O;Xlaz4A9YYpn=bLaFZHtS7C8{BCLl9aZqYWBIrI_ z@D4AiUEo1I=<#IWKq)8&b!Q;zi_0JxzNn-mAF94IFAvmMN-ih`l>m^Y3F>KrV6EVj z*T7vS2sb4@DKQ5;Py!yIgjM~;smahaS0KBKQhxLp_2TfV({o}Nh+ix zTny^{XO>ig_MC#wErZyQnvP-;xR)HC3vwhxJ|i&&bRPzI5DRh8AlQz~^fb_kq7Zf9 zvkYNO(11u{Q95YI7$O8Z5e}>;C%*)A8X>HxEY43W0p$tM6mCXQYB8iURa}x-3|dj0 zf@ms2W}rZ$pczH^d6`wI@P;Z@8Q92RNqjNn@>HN&c+vou{Yjb7cmnev z-5ZF*L0$$GcaUf-uFOr!&q473Ll9lOg@I)RcJe z(0K`X5*DR(16BmD`oX-^id0afLvkQk1lnW*vq5(;gS-vqfZF^ByU?tLo0Bo!Q#4bYeL1r#!%(S2sU8p1@6PyoF#X%JwG^>LQDlSRPEr2+t2y~hx*j^9| zl%JsDsj1+C6*L@L5?@kM8J_|=Sq_qKN~%CdcjiIz80^wnkRebuXqzGUVq~xww2&_a zt&K?sUDlVB3N6==g`o8@LMR7QRZc1vRZxGG=7Ema0u4vzgT`Y^;-M?NOG*o%jYpJO z8n7=>MB?GKE2M1#y6hfYt3i~48};#^L$gajL-NTb`H--H-1rVr13DBr5j09x0+j;^ zfCi=D10nc z#3&7z2RRWNWD=MQ%C(@|LczyL!qWy=sua#GDlJZg3?qU2s0`_81@YkCK^kaVW-(~1 zO29N?!{RKKx6OHe3hW&1**Eh+oxf|Aa|sJHnD)lo->m{38MsB6e06K6Xc1-V2e{S zi$N1T$)(_v08%oGLFT1Er1HTxAb?i5#ut?rfW=btK=Sd$py|KN zR*GUUXp$791T0gKpPdTlfTxdPP6ZvDTwH?bBk(H4;`B_gc5uCo9DtxAsyG{NA|$ng z7E6Lc9KuU4DoD*U1Z#%~6sKnz79sP&fdx7?85D*opp6!w(*e>;7(i4`2?O*@ZpfG+ zxP&N15d#N#Zfb5msJRL`zZ=?LOizUc6INl^03<{blp4VzFg^MCDWEH3A=}>5^UJ^! zm7tM4@I4dh1)vShpqK!~N?Bq~X(|IkETbI6h6q5~3*dQE6amme5|AoTcLB5n5@Zf2 zYS9&e4`wvjLj<+h(lXN_N^a(*6)EQB9lo>`I+pIDS$ z3OXJhp%*V=DagzN>jya=bb%gtT>-=#OmR>*6H^qtY6~-kCjDTLL3JOoKeiXT4&>atu=s}SL&xwE?1DeYN zg;FW#ns7+DRgjqv5-rUufvSM)9tHIhpw}RSEQ1^(06w-GdS!Av=vFh(=ox6%8f*yY z^aQ9GASU==bz~2xfYS!(NHfUdCuFtI9U|b&W+*F42qSR#QKu}SBd>-gJlpN@oCHV9# zSoaV-mWLt&sw5a7qp6^kX`ppwc`!a`u)h$-$w@3O21giJJ7|dnZ1xeVBC{B!Lk?C3 zSt{Qh69WPO793ZXn|TWs2vBg zqd2}eHL)l;114RZUsM8Pm*hi-H;VGhLF*mCSHq@*IG`Qy&_TMQ(xiCUrCjO7`SEF~ zi6x~);KTR8Yd?zfFA=lsksnQ(6uo6@u~SK4C$cd^Pr`D#qntc&@q0{$(rC58c+tPq5vI|54t@lCp9sR zAsr@>mY9=jL73x8^9nNaz%d1u0|ik5WHb-loNV8)cBqFM;Kln3S!$WlA-F>g=}pwS=D#kp`5w~M1UelYeBCLCmz-D-pPQH*pO}&hwgTKk zO-#zn0gbuk~f+C&aoHvraLT2u@kiUXaJ5MNx72u>r#p!@Q2GC>!f zfD3)lx;3y7sd->^pyCpA!Zs*oK&M+H1dCIXA%YoY8KCe2T|)r6T@ijNDcBg$MYYIA z!FA=~bUZZYK{F!64$uHPV)r3bth6`-+;C6H0gq*&iGq6m5TWACc#wY3d^Bh=GAJ-W zCp?1Ivu5QdLDfJm3j@z6fgKL&mlS}9&Oz!yXQY*ZEdy075G^ooSEUx^gS2FT2_w)z z9caa{u~B?M2`HkAGvbYnz;f|sCa}gWgr8IyUtE+7VS^@JAhU2F-Jk|JbWKcAVmU-b zN@@;-0qT%LSfG1-!1EIjF3iF-Py#H@0PT^6E++?>3A%p>TEk@|mZiq0g9gF#@{2&Z z9Jb0ZBeeoNydMu9Sw-Q+mll9lx@Leb=_t+wFR6$xNlXXL&=fO(L<=%gjEX^C&P*)= z)uWY=%A*+6>q$(`V93Z!&xi-#DFrQ@K?148&;>mV8K90bIB!51;KQDZAmYUt`Q;E+ zNl|8cdTJ45Oc`|VQeFwFL_rZ~cpfyL4>l2|9wH1H-$oI}G#GsJ7$_!EVWxuy3qbyj zPfAS#E&T&6v&cXa%*f13VL%rE4<920LCr8EH6SjU3eeIPB%!1nu$3T%P<==usOrFr zQxJ;4EBDd3s2V^6;s^zxHYu7OxDcwo(mYT)N`-kgDF?Qt2I5a}0tJUl3aFmQ1C>T7 zTqM&#DiGm_?1RkWcu+xJnv+-rX{da!cP06%COMruVt zW>IP}HZjoT0LV6wQqbfExT~HA>IuSCgRXc4wOc{wy@4jckR-q>mtoqIL33O=kkP3k z$XpphX%eVw1#W^M#6Wo@GX*pj39=b34s|VP=s7VH#X=03_(bqIfS~LG^*y8sR|Hxn zmR^*Y3pX?^AAG4KIv=#i6fOqpVneOKCKg{(W@dsS0bV)*ZpNVq7w4yyU^53v9Mvq) ztQmT|f$|F6R1gQW3KU#$qKbmM&Z&^(0g6PhQm7y{EhVYoE2R*I6vtz=9x9BSM#07x zLsl22zzxVt%*zMchbaPDpTAMM4`!5smVqN{E-KA~*o{cY zAR$nwW)>B~?En?5=%J4!2Aa@LPeo4l$dV{g4E7b|lFFhI&`mKYnFyQ_5w?Q-iCqmA z8%s06V@0r)F|aUzTxto*5TGc5n+@7q0~(|N=P$S@B-=wq#$g6P#jvDHs0=i)z!?#d zW>?^96K$B6$5G1N=5caMlGkeBcT|VFnigHQ!Rf%PB#ciy;~_iy@6_kQUJ1 z#8mL5tY9-i+@e(Q`~yTSs33sd00UM5>OezxeSwUGr~(OsvMAVh;Km2YY>+6Z%0#Gv zj>e&C1T8>=%&NdGfCdRd9kdGtG7(d*v;;Jp2Od9ySOs16pH!Nhom#?>0iKmk$t(i5 z6+ux55?}ydLJaAeg1Tm4KB#>g4;?R0%qdT-EXELq=epALRIqYT*B&95mmUwAYzHl) z0v$lhkWmIY?E_SOGh~#9ClJHMzT9(PP6T!5z-EBb6X>X0(DAki(ab#PUg-FWwA7+_(DV>kH8h<< zjD+3|0vaU)OM-0!^*r;7z+MW9(E28b+*IJkGskO_`2NZ>+Mf+7$i zfT9Gp1squw)WKMUU|K;^;Po(|iwhYt!3V-Z_@M1Knc$&Oupk4J4bup^!Vl&@P`@%0 zbXE>{%CQ)B1RX>OWCH_)3HKjJGu$B1EP7rsLndh7B`9;Iffx*#Nk-tMS(!-?3cQ~K zdK?nyV(fzaQie>ZAZU;?GZEBmX2?uVjt5n9~ z7I$WHZh;xNNPx16OTc}(WCjR7Bc%w+%FIlIvLHzN-$s5!9aqs|T%c1V<}GO+hyJEDy-y39tgtz2otqmU|^c1!$)nSOVFV5GjOL zi}OL{E2wD5EK7xiNj&I&QBZdmthpjLvjm(}Av(caNSXu-l$pRhhwyHh38c(I5vc$z zYyigrBuvW8K!FPyB`8ZRDuI{<7Rm>eLy+(;GlLB!ft&*3fv&^^HNjx&(^E@87evFk z=pkQbh8%`vW*81LgWU!KwE-ho%gn$Ry2rx?b-?SnAaPb^77q(!5ECgaz}y25=Q6W+ zaL9qmBA6st068el;!y%AB|b6H%p^BAt;irgH?tx&B|bGTB@?uRKF5Fo(y#~3@iJtl zB!a^=8NrGNEgyl4$Abpj5Io2jHi!=z8)E>k{s;A;U<`QM5h4IOxI8Tnq6}1?gJ-ZH zT*y^v5H_gEf+PjKvo96AH?Y_UWE4alXjBWr0xcOyEdsZdKrK~}5=a-TBpuq)O93l{ z3qn^ulo_H5gUn&bOeul~0+bb>T$!Ac2?`aM0BCt8NFnsRVz4IAY$Sw{UlgATPWCC_ zi7L=OrD9NJ1LZ;k3nB+9bV?j|Ws4)Om0%e0@ z6U+xK9x6+PGQs_BFdG!0puLD7CxGv@15NyaPGbNq%>b>^VgMZ$X$sDpsVQJid|F~= z4vY;-YG5{~B!o;kC8nf6MIhU{K!Xo30dR?!o?8%~nU)M)Z=DI_LYffZcwm4Fg1OL$ zf`}GFi>LJ5f-+-BUmUz-s~9X@W(+E2K)5J1872Y>zT%=}(5Nv?C@-}fJah-LsLU8t zpn;k^Fz1yS$AdCed~y*?J%|g{0KSwcB_|$yd;@ru1Owz&8n}nRDl!s_Qjlc9V-TQ? zf}qQ#KW3hI|9W|lBy<|bx=(pN5Yjuf>25QWacHq8r0wxS$uL{30M%i4Fi-u!P6xmA0)@8CZ>P~p+H*UvkxE+sJjN) zA_O)eGcO;sQUP}55?Bnhr3iG11E{%>mmCk?&Xbs%iev-mWB@cvL1SJZ-z0-a&XH^Y zH48FJKnW-wx;7PT2~-$G2(-OAGan)iVaFHef+8+CzNiE`g97pc=w5i}G668RvN$;n z;&ssCP)K-zSfJ2M28SW|Kpi9xl;kAEL(W--R{LN}A&!ACL5nd_Jq=z+1L;yAc@H8A z-sFHG3aY)41ko2?W#*-pn1K^HEV+UBps~F8;?zP0h;$NYs zpaY{I3Lv)(Ks6>8XU9VthL9#8k}#-Y0_B2^mjF8fnV*)Kgv`xMgJw05wW*-N0#I`S z?0C@8+3}faiO>QbMJxr>$VC=`6nMxYIf-VVsTXjW0WutFTrP%j1x2Z#GmaqMOiwKV zB|fMVLGD3ff*PEl%NwCWprQw~7_vA6w89L0*&M_WkOU;{!&QRZ2X8HcoeAzcKv>{` z0;tyF_^i_0qQT0XOlW8|UAjG14&~!~+PJVJ?4pc*F zNj^M-frkR&IWIm55~ZMU1uY&1rK>d1VhM;&bXkyM=uj5OuQ1)P6&5I(AnR!mF$Pl% z>3YYbOF%OlL{(ZII9@=mf|>~{AL2nCF@g>QLc$1iQ zLt4Wa!e|!59EEN#OdP{nm;|~xXu+A82R(fN667E*G)03i`c46-4`@jWTFn-pmk)`3 zu&*KEmz)Edp)Sn_L>I_r=m>FkYHC4Z4rnPOn*GpdL1fr?kS<7%4>Yk?ke`4V!sp!N|=BX~#yd>bEHEJIoj zp#9JY>r3*%N3w#>9fAwO(m81S8R1E2Nd{Wk1+Lo=GT_5YkaqAwWKvR-K{*37P!yjG zT4M+{A2hR_nU)Au0;+96ir|%dd`c#0ZAWrEWK|JF3seYnfDMWOtXu%=0UcSIT9KFx ztzN)lph^g86UYn@7jm8$!WghvW-^LVU@@dr1U3tj((_W|(G-JIdQpB!esVrEDT0;5 zR$hUQ_CnYO69s7kwM>v42g>*G(|8a%Kt&g5T(%fAsD^9-NCLE2J3kLy27DkHQWFdk zrjRi!G#iS+hlGFze^ZK+q1glMdsu4`(r1Iz;}FM!+ltV#99bkY4|HKGvIxjWP%|N# zAdM%`a&cI2L&Wp)A$b%@Gpv4uHXadGBWU0dGR6$bmY{G<&d)6yY40A(GgSSCJeH+lmZMZ%VC%z2SQ%nVSd?0)?sC;G`s2YQEib0zj zz#C2>0-z!R!9q>%pe8F)jR8EA(VXfZK3H9=dm$n6;vAy_9Q9x4inEQqKngP5p89Z|a)(K*P&h&s-ixe*4&`wW=h=VyOqpqNE02vBuYJ$!% zECx3Q;)_#@z-Rk_%?2L<0xpR_!&9J@GN2KF)Dlo?0w)xR;qZnxsDX$slv-E{Yi5EP zwGfg8(?B=d!Gu6<4A2Q;P%A)ZsuY(XHE}>Q91wFM z=gNa_V}+>&jWQy&DB)oWs&|meeAF=&@WFq1pnc@2paDsUS;$?7c-Y~RP^oMr*T5QF z#o6dyDb5C+yH%bEo4y0N8Qk*#MLGEHLeNMcIH$qQ1xFS1Uo$3TL5m{*jFMF*--X-)yStqsZ2 z5QC9j4{aMD#S!SpBWQmrKM$N6A-W))HgFvSD>h(h3u`k1oYz6ce|$1{)F`zCECPyb zuxJ^m1WwD3Pf96-tk3{etB~_l7{JU-6bZ<3Owf2NXr&&wY)Z?AEVu+60|*(90L=kF zMvx)%oEe#*qnsgSFJy-agbf*(L|)s*0FeM4TL)=ofhPCCoe_{*pt6wNI}nwS=6xo3 ztP!L(A9^GmL}?1>APDd<6qFCX_5pMNAy{`x4(JGY$c`nHk;Tjs(0C!bP-Y z85(F96?7Wfq2 zbCN*YHA-M=Gt&`cm6;{r>50rlP_%*$6N2a|N-m9ujJQDd6=H~j+i)-gL02_oXXYn^ z2KzE0**rTm#}G zk_)()0FU@XWWoHhMCj6Ngc$gweaL!kbV1N?K3oPgqz(>QQ0)ooM}Y;vo6NC@Ko*|l z<$>lvlMCWAQi>qGw)}Y5kvZV}3epK)(GCh_(4lFdC8s$>r3_Hnl9I&ajQDa;EP-S} zr;vjD0d_M~O>%m9Qao&Z6GR(W2(+XL)M8Hrn*r{if{Xxlw;(%>L5rhc)`CPqkqsZQ zhA2g~Jq0vnmYSXk>V1Ocp?A1JECtCzMq3effi6Y`Pep;VD#+T*)Rg$dH1IkLh*&-> zZXs7UxhoDL59i0{6@wgEYlKzJ)1-Hi{uapc9NUb5r4(p?px-f~!ZEs-()2R9GqoHT%Fh5J?x94_fyD zI*|=Syd*y!#WdJ3FwAtcJOQ!*CWI8WAYpI@Mlv7FM|Cauh~E4>$ZlxJxTy`+$EC@%tyK!aw2KzhOR*r2+zBtJeAJogBh+6Em51i$MB zHs1{u1Pvm<^`=42s)Q*4kK%zXLZ|@UA_8u-q6$G;_nrBBFui!vLcWh;6}m(z^fJ@@dEZUWC=_PINl*^jZpj#vJbN17{#|B4k$?` z7J+68Ax_LqElLOHGO)Rz#x~eza2J3?$`ebHK}#bbIzWwDxHM=X3lax%9RB830;CplSUHLrP=BLB~iVvq7g4733F#(i+$R zkUV%DGm0YEkp_@ZOG`tV!UySsEZ{(KAt;Z5RzreE+CXYR4LB4PV1dkH(6(;SqIIZ! zAW=}_hOUMJ2Qo+uRG5K_E~q+ab_FFjuwPMyu?T^0xPrtTT3X30j?XQLPprs<#Q{VB zvO@ymWALCRXc7~2=s2bj==xr$DCoTNV$kY__~IPU7Jaxd$P*|=f{t?r^&U}`f&5-l zlnq*+4EB32=)g(v&>P4+P*<%47FW3?;NyXi4TYRd13nNP8X%zCTtVrp6kHvHA_7!U zq!vM@8sf_`i!+mQU?xHaT9PtLKnEp2Tn-U}Wl)%*;BB)oLCCINY|25~D!>&v*xpi5 z*g%JNK>|go>6yi#%@8Qb0xk-PVW^Fux*QbO;GG<>cmfHg6qSKbnuk~q5&_3OmZT4o zLr+EE`J(v5(vp0XYy{f!jVTIRtc}gZNa84N233=#1>jSgK?6{!i7B9)2Qu>tL8Efu z!6Q%$9I^)jJXOp9nT`Q>azQsVB5^@&Y_Mu@zDj{Co`b1}5B`8vfGbKw%>)($^(H}~ z2IhdenlP;(HfXC%KIqm9G)LVl zK?fut?85k@#G;~1a3`cV546@3bSVtDP6U};0@|wpKfDk;*aI0v0reKZ8-XA?ONvUt z+h5|LVxWA$0NTl2TnJj=4q6GFlbQ&cN=eQy00mu1Y7yw54se?UbXp`xF+>Qm5&|;v zgIyF9ZqU7kpvfK3g2j07=@t;>ple-0JEUO#1~(BwdlkS7!$D5Lq5|e945@;m{DQ=E zNFyAwy9s>qPCO)((QE|Wt_Zq1uNYMPBddng@Mx-wp$CpaxAlYX%FaxIo_JD}nwDAw zI@CD@G|tBWlZ2dD3<~|ST+s9{xQh^ivkyV1~oTLos5Fc0-LIf0m=t7{QYGAg2 zRDxD_fZEj%=YZyT;5s1b8I(|qaf-vI3*owQ6AQp|hG2cjHi6FdE{;zHH4DIX9k^W; zpP2%7CFsC9(9m6Sei5ilEJNnUL(i%Q83qyuRlcC@nwfcEWuRq_pxd4@^Fhfv7u0?O z4cIb3_@zal24@=R6noIg^U0721CS(m-#k_D>Xkevs0TV@XE^dZn{l^l>+P*Kq7 zU!djAVE2QE9U;4;88Y*eL8AqUmCzCV{N#A>nv=}rLa-c+Qw-uIAsP(%$)E+FiRn;r z&|m_nX9ZCOp5p+iD9Mj6Du>NZfmZy*r)4IAYb7Wr6`7Nh8V_DQ1TqA4A}Q#$JFoyO zT|hPEq{gSDrj!<>qKW4x!khrsou3B@ykros7*yg`rNWFZPERcX4>Q6AiqQp1G7`(7 zvY<*otr)b{I1O~GWeF&jK&FB=(}2%?1J4748q8_M;M)%&e8k`o*x|*gCD0ylKB(9Q zjqQOp{3ORioCy<4f{XyhgCibU5L8YuWWx1=)a4hTn+VH+ND5&>kdsaj20*W!KrNE3mb4x*OAkc^|r2P?JkXQ_{A-6OhbS(@dj5G7g5U%@v>&334Lj21ckIV8Q%c(7EEE!8-8vIjw*4P2ls5!CN0$fyKmc~G!JvM!W`aCJdCXt)ik z4U}TQ=O-Z=>tGjwy#-YRW7DX@SF~s&w}h*0(Z~BbGe}N zjxzJXGSIFp_~4&B9Fou!3)NK#I^w?oviXJ~Grt(h&n%9IE;v9I0-gPVst7#(onHpJ zlA;JH0mB4xGC>=U;*-D=Sa4+^QSbqpnHWN7N>Md}c$k(zHxa>%0`GiJhTPTwiYlm6 zV8Y-TA82(7(*iyU4RlEiXvqr$+)sG;EfEtoC>9p(t~BWO$oW=Cc* zn%6*8MrLtxVo?f`>BaHcC_#nF%LBUxp}Z(HwW1&~56OU{R8%j3i!Z2SOJFB`!955W z>4LcsvOg!k4752gGd&MvO(N(PyZn;)0?_(JkW5Ny0f<{#45|Xk5+P@BLbpbNJ1a~PXptAl zJ+OryAa((0VHb!|1esa~@2EoJL);EA0dn~tBznOkOrT`LkXc{?o~=V&I*2R?9Yg`0 zc@0)vToRv=UjPlD0uxa8BQq~u54065GchN#Dm6vVkRh|cEIzRSG#Lvv9i1PaTT%)U zD=o=S%gHZ?96Jiq1*+PLQj3dIK?m`H+BRTyAW=}$9k#}}z$`u)boe&ZaZoiy+0d0G zDWHZoNDX)yGH7QEcr_JhJ9J`6BAQ>#z)l1Ug4X9l${VnWpi&hq4ss%B%m`YZBAWwR zs08X+H|xHLnaM$N;Rf5c>E6%v`Ef?opAtKX$>(DdKX(_N?C4kF^W)L z0k}Vm2tdfvLy!{@`@Nw&@VNyL-Keo>2Hu&F39eqCYGDi0P`Kc=NpJ%oN+7qnfuar+ zdbuT~@sP88R#mZ0?>Zuyv*VZ=rOrq(;zKusE84!P<(oEK6X*iU`{!x=K#Jl z6j@Dib`pdO+Aj^>Itj8mC%+srZVBZe!VNN121>Hv4gu)O3P?zU*GQ%&=YdTFZPsgh8j%L6svMmzxZ_I=d_tp%}8BIUls6q`(ZG zL%|osf&&<|Bno!I9N0L};uEk;jxi{6Ktc<&-vBhTP+%6Hmztgk-bo3%^Ex>d?CCtv zfgSKoKp;gKP#$bUN`V>Zm}$_7hF}fQGnPRXf_Av3mc)aH{J?Sr`8kmNTd2HvgfHPL zpq8L1L^d3{=or*>0!>*#Cf5pZ?0hdUi!Vw94>}Zq)+vLy$z`A-3F1r8sz*qg23v^W zA}N8cD^E?%j?c@0C_@nfP2gtcWh2ReDsSkTFpz~{)d;Ubq7TeR_AEpg$)m^uuznoe zIEXrka6D+Ea2mvZ=-IY#PJTfpqAV;b0ritWZC`kx6+y>PVFfV~KOS-;GR&v~(9ILj zdKBag@B&h}Behnvm&B*! zBXT4pf+1%QKx9E_5yFp8hKS@Qf_p*W5s(5i=-qD6g+&Es;4NsN3+O;SrHp*g%spf; zG_?J|kXeA%V2Fn-U?@BI;0x38WOaM5X=YN$Q_@X3{85F-ASN&7c2={ z)(_%9HVA^ZO%x!MfFcI6N()&KRNh1SJIJE2W*3TB0cZ>zS)?Gl1X`LS*;15Rl8>Ph zHi?hwOwdJ8naBo~fZGh921Ws>{R7$gQ4kLrJq0a_0&NQg@rtq$i=+!cMOb`VUIwTv z0_RG|6lnpd>kYaEG!Z%sTmbSvI2*_3rj`_CCWA_Fuo$*lJU+D~0~F5SK4Jm5a|d4j z4e|h_tOM0-;Bg|*?dM2UJg7p4R)bI_(E1!E2+6RhyN%;vhl~`!wq1e>8BpASEKE-= z0qv25R94WAXnbxW=-Rlvc<3?znc($gAl0yCWd-q>Nl0GEOi9fv0bLLRTG$Q_EX?{m zKC>XbC>2=~=rS2Z2tqbSq@;p2hZTYBLJ@#^5Frl99gqXWp}x)qjn*Z@#<>eXR)Mxd zfmcVTf|Go1GH5X+Xg&tKd<3in6s4fJ1sM&NM+$GK7^uERVuF$jl$({GnTKK_cuXGJ z5&$^>QVl>=7pH-H=b(ZKBnKbJMFcY_xqwzvfI5c-@sKJWG+Y5L%%J@Aaubkw5Xtm% zGY|)IokTGtry~nM4j(FjrWTM4THOzty8-VJ0;P4N>KgkwH3iVEY0y#?wd#hPUsC|0 zV6`)t4N21=yD_V8umY&-!75Ud%V4_~K&Q4B8wF}~*g3w|WT(Q7Ppt%w(Q<|3vwhVfp6i9bo z3aCmcPR=g?7Z}AT!9@l;I-Fqji8Y_h{9x0=!4cAi#EOTbHW3o_#2%uHy>3o7_B<8wj%txWI;BP=69c}0b=>2dIN zm!QcLhRgz#CI%$3AuS5999jbd)a*xUU!XNFu(d8qL1ibX{g{~t+GJEvW&&!jLyzN5 zNrl!VD59VxyQu2Gr8z?;NDw|40PCGYTMlJN11K;lXvZBSh2C=qi#_ z2vP*)frr$gGfFU3xnQe6F$(bmsP+LJm7X0B$pE0SHR#3}$dCn0S!rGg*b30_95e!O z<_gf6NU%HxVwZuEJM7>FkV{aSlc1CEDoQ}>{~>mPn>Ua_8_PpI}Sh{rqt3*(1Ak`F_e5`2DTBhEec{PT0Vj($jL#31V}+qYI8(#oACoZ+3BqIgfE{BT3F4_ib15F@iD2k4L(xD^KyJ8#4)jY)jL!ovFN7EXI$tIgQcZxDJb|^Kwp>BFisN%ZXL^BT!JCc1 zNB4nvkkkr}T*yXEh+r}35_eGWK(>p41;L32+=2wR8X@*$6cJ{iA|x%d0=awu-O+?- zDT9s+OfG|H2eq)E0Sws^3bF~@Z-aI8%gjKv5U9R`wE02&?976ANN7V$0m;TECWB_2 zLCfYqW`Ko2=fmWHSJEL1fg0IJ`f`)wL7sw&fR-JBn%AIm8X^R13xH01K*^z?>KoJ) z%mppP1P{a}$dy5lsP*2U3fZ!L9^dvj$ZS6#*~IKvn{?4x$Wlvm%6@n+UzK9DE-bbgmnu z6|^C|Bp&8(uwux%ODGf6RRTAEiwYr2A7C7Cv62Y7s{*#Wrl=6?PS93S(5b(mUJTd} zP)Pt5L=i!8D@aLhaVDtDPKN6NpMwbVV{T$4=tO(4Bxqe7*ubRHV#v~PRAD5sqSWI2 zoU&9!P%H3PIj88v8&Q%gWAj6r)#z}H@au8T;ls)Xr*$bs6L;HyiMQXvwc!^%q` z2@f=ln;M^-Qv_LbrsWW- z5D}3AT2}=cXe@&zIC_g#1xEQPhE(y{Ovj&thi{p)rK>HFC3o;o%lj%v&OZq@-g1|SR zKn?+i40eGUHpSph4OlI>08UMb&joF70Pp>WrU&qe(V*oBU}bs9si4tl2s=LybO8Y< zZ6>Bb_D+DrLF*?{i_(fgbsKoabTQ<#KJd(6G3bQNOwirepkxeE4y~&a(^Em)RiRlI zqzrVvSy5^t=qe%5P2Tyr1&Jl#(+9!2pj>cS0uulw9#Czang`jGSPbrsr6!kv&h#yS zr~>c)PX##_R9b>o0wSw|jwQf_OEU9H6Cn%KLCVSzwcJ6K^qirBYI98ffeeY(+{wsK;B9l3xNgp#rp556a2}twsf{ zgN5ucD2|60KRK0p69elW0G3<11$U>K5XiFs? z9DES>g6~iOT>%Es4>A-XRFInj5&#{J4I1MEjnRPlDLJX|B%hfAZ9(UPnsCLC%|*q~ zp&p3#T+r>_pf$>1&3W-DcP4(6t<((~ir*YkO$P7XA#0$Ztz&`^>HDrrGJ0GHI6d5|@3@WL8uCv-nwDtH+jM0Gm&xaQn^@bz>E zA<+76L~UFQbu>s6I`K~DYv>qvpcJ!ro}2`HgM;}2pk=-}dfP)DIS9(u+x=*$r4lCt9X zqI_^h1gixt)XRa^5ygqQsjz9Q;`rjk+=3j?QXS}2KyiF=5@fCgR!)K!@PiL5iie-& z4Z0o}bS@x>E{RVD9W4VYT8lxJLAL6GmM?+#)k1_y)6#NM<-s}hJSb@4b5MFs=5$J+zNc~w{017R5W`}Y?2Q-6iC@3w;%rAvh;^4EBKwEu5 z$IvB~=73uYkbRNy;B!g9I!cqkCuJ8y5<9ed0w??e&=xe1IApOeYL*D z;tJ4UCur4sUUEG2Sd-%TlGNOS)FSXD$B2p=WD%%MTm(8qI-?4{#l09*t{227LIwiC zs!EcI4B$mO=;l?>9*X$HTdqLzWyVPC#GK5Oc+dsG ziAA8<8qls&kO=4$8Bo)-2&^F!wC)CcrZ}jq2VK&gSqv(IL0eGa&M3=^&rCt&Fwg-R znR)Rg86c&JAY(u=3{I+O#UxBF6;U>Tl%|4@bu0(3Y%PXtNJmQgs4WLD4^*~+%z|)0 z%QTB24JYs&jiA-1@J3Z)PGV6mLuPSGW;*CN`r>>z1JvvS7qB4HKuHv|4LlVg0%^N5 zK(>b?i-Y?JaB!cHvPd}KWGYu46cF=169Bfbs!eBiHsxwZiOQF zRjKh=8Q?w=L=5C^aNz|S2FTBY2tvF0P&a{&kIF15hDbr%tB_2FVjEm0B?az5P!WNu z51goqL46l+8bg(Y?1PFgN(F8ILX`rI-WKJ9;tM1Py5~K=CiGDl|Fx z=oC0{qM8fpF~gjI8D7O1MVWco&|`~GOa<+zg_x9+pAI=bCmz&3hlu4SR)E{Spi(~% zv``~04YXAjYyv37#)IeZz+7Zc#ith~=7GAwAg_R`#`vTRjMxN?BZ8*0F{Cn#k}?>w zz|((V(g?zdH!RODN`bPCK)HlR(2AC7{Kkut)+8 zPk`neAbmMVltDXou$#Xj8HfRimfsz!(y)DaL)Jm^9a(A*G2KU5HO9zlLm z7Q#xXII>kxA&}QmO)P`>4k}obn3s~D3ko@y0Qjl}$TfAKoyefQrVz_PBe9^7zI3R{ zV$dDr;BbovFMNck0$B)}s?Se`Da%Pr0=HX``2|IgHVaG)d}>~DeohW(VkDq!kZ3ha7AO=+r(C2XeT4 zW?o5I4tSKC0U-z;O({ka0GGR|If(_usVV5fpb>Hg(5Ov3Xkk8r6%VPAzyhf`pc&G< zR2T<3zyQ9lJ0}&igQfr`1<7{UWWZSp8o;SVpj(;pQb8w^g3rAJIUqGB9xRfY2XZ7> zMLu|l8x&07p+l%D@WBzFbq3imTOlIQ2{EWDP!|d&4`PD~SGW)00-%OZF4*hf^-Fo6 zU;|rSl3J9TnGZf@2DI%d9>zC>nF+bZ6vhJ`uw;VF0hMMA5{=^vII+d7!z1%py?tD=!^Y zC@mkfq7l4<32shi5oC0zARiL+P~FH}ur63j2ClIvF*6T^191(gdjK~Hni`?83OYfv zEHfFj(E!v`f_fgL0o)po2X!xCCPL3&`v7#hFQ{yk?BdL-RG6;(q%25l6g-UyH5Srl zgse7zDTEHIqj4ca3{Y)Fkft$Y=maWOk{_R405T~#8>Y1sv|<8Oi8ExUWv1mrHtc|^ zI54j?4>T^y0Pcf8NbqgXP$uY#f~Fgp!$6b%v^6zULtIiM-iqIe{o`PrZ{3N+>gQITI% zkdX+QJ}O8rDu4)~vY_3k%$yw10pnPB;3I;dI*am?kyI4t=cblqfTltqT`-UtV5h`G zmxzLg`eBWJ&}rtNdv_sYfD8~h=&@3uu}V;M6k`$2FD?N!G(jgGg4-xiC7@Lk&;d74 zWd$}JBnCeu2x0+vj1t94up!_vTu_smAsdv|K;!q2{p1iX_}ZnS)I3Oe0#*SR0@pbZ zA<#BT(25phWpFWcb>L-=Wl;M-2YQ2c7=ljWg;bsG^7T*W=UEK)WWhN{dV2 z>cDoP=|$s$I_*WEniXmasB8pn0?JD%Er6Q?>a)W+kXi$DT25j~er{$mNTL8#=_lqu zmq=uTBq5XcpcKQ94Vq_%Oy+`{g5UxT;iuGG$S5l)7!r+4;k%d5|8#*8CC1gR+I2366GQ6-ugaIO+;SL3b zIz%`4z7FtE6i5T8c7kNw+|=BZQqW<2MTwPQl^`CHkHOs19ENPr9wbnwmmwP*SfHzH zp-fQm1Y?3yC6o=yk>Kz|kK(HZm>%|$F1#sP<-V&twgruxA zF9)=uuPU`DAFdD_+ps&bVJ-v}0&o=|4!A@^_5)ZDw!jOn6w;=J+6dx6P78+_3obCA zvhbt?<%41YqyroXkf;HL74!^Sm}9+)k(vXg^6(QGQ|yXeB>GHh6pq+{A&d z|ALBuE;a!VPZfbKo+}0Qh>DUSQ>dUc4;mV0$VL`{4cI^jN#R8sqyU47!jdy+zyTaN zPzGo=01@OMK~TUkWP@1X(10@H!Cf4PI3x>z!UJp)hyhj#$!YK*xXhx$;&{;B?`*J8 zW?phpJXj1o9}HTUiX>5-pH_lZvZ%0_0jdsU9;hdW%r7l2f^y*|KusqZA z1}z5wueF6oBj^~cl+prYhHMZk4Rj_)ajKa~yqO711k|Pmk70ooBxmH8=Ru^P;~ya5 zTu`xJkPf=w5Nr;3Z3E1R0&txU<3VGm61>y`bbuRJLunp(nFYjPuzCjA@r_VAKC!qs zKRFZB7D>vC1Y-l{FaReD;gf=9g9LTXVkVZO&P%6SPpi5TZmO;*S z0*?@26N@iS%mdv`1fE7gD1gkDf>R~brrdnc1+Y2rF>Scog2bY1I0v#?9mR>opo`uh zE3n|opnX{Igd!{;kisw$eCL!Ji z*_4}~myg90C_VyRc!AIXvI5Cs5EqL9U}02KQWJAPm&>4e6|4}=#o)~?rQo%EC`Mog z6q?3T$ZjOa8W7N`q;e#eVg>-%^Ch5_WR*~LFcFZeU_zkP5IH4@P%dccHzY8?Grdqz z(47~Vxv9{F7@+7xNWha)Dcq#eyiCy4Z(a&`@-qdr87058C^?lO8zBP<1SBy~WWnZq zOHx7g16V0Y7)>Q;bPY`i+B`tF2c`<_3h0?h5Ep>*ZdzhyPH7R?P353Fp&@l`X&#&d zsY{X*b8GDC8b56?UgB@4FPbqkQ=kg z6G5X7Wr@YGNjNw&9y%sc25Farsd$j<;z3)xvLSrXun6oFYh)qtmSk_<|D1V0Cg)esOUL3a;8IvrLu>GO@D>`7sURcDN=lN7Ai7FZLAT0- zuWAIzf|hhc%!XDpWx0^^Mv5SpVuCg0m1U%Y?(GC!CYhX;30jR0Ne^YYVE2O$piC`_ z2M?ow)|`S&1|^(=Tu}QWH4kDp$Vs41cYG?S^;4D$b|ct;qEt|28=snE0JaaTu%svv z8hW74IanOr0Eka6C@G3h%`pNAK{}6Ey2WMC-ceFP8b~>;9a#m@0Odk=$%B@*LneB` zo515Ub3vC&f~L?IauN$bRZS*nNDh1%IA{TEP9k^*eqvsFYJ6@nq!R=Y%S{2VCIxfS zz+Qr^ZOs9t3&;uJpcx|uFduYgVJhg*%|y_xmEaaKvN+hY43MkYAl(F5iwi0SIszBG z#W^RjsuFZj2e?^Y%mC(sQa8#FUrtJKYHmE}+&R#gTnYmkKOS~}4U#z21z?S(pxL`b zn6}aa=->=QHF#5CPO2ezpFC)wjRCaTAs@Q@gdrz2F)bdHTfx~6+y{iRz*B6ng=dfj zVxUb4xyf)ba9&^l34+p7QW0pYLmsH*pO;^di(MSN;Snqay&EtdG#!(TDFTYC(gGB5 zn00BOW42bYaGnMt7Qfs9Pe;z6qoKqqdcfexzxja*}qgH(VF z=rYiAYCtO}K^LZE7RRR-Xg41N z=&HU%&^EyWBqpd{2MshsB|(Ed@tJuksTD9aCHdfF3gTwRCl`a8`w$N3Y8A-hqGE^u zD0sl>2FfijgfPkyVRSs~k^)e13~IbFz!;$83e&(BCl-NpfeyD!Nr9xgOem)$F*66D z9>fC;S!IK|@@T@KS_5owa%o9?QfeCLRCzcbe(?!d1T>leV?f6APrIq3m@Tebbu`=lPI)r@?g^8eb^9VuMI1xewwfqA`JIFCmQBZk=P>Q(w z10e=d0bXBJpkeUr)equ^|Vp)1TXv1b|GN|v%kdvR7 z0vcXO%Pon|%`8ra2&CqufdmtaDiM6}KwbfYUjRPq1FRpU5k-A&KIragh}z<0&^A#B zyEHEma+EfBpJD;14$e9fG(alGXb5uQIVXH&Hx^12Q6$Zszen7t*nKv z;DRUu2|!lLK>6VHuE^~8y!_0(;*uhmSOMrp+6b3d7cH%B5F+w$iYO5mfwi?jp zbEpEaTuCZu4yvRQk(xm(h{4l#plfX*)h$Q}Qtg2BWWzU-ff{5m4rnw2G)4xQMgz-$ z7gd9H|0Jb?4-<|Djdejx03Bur9$5z~1hv0GBZ;NO5ZR0(h=W0uI7B3~7&M%jpPUWh z=H`N%d!U9QXsIDoFs}sMeuVNs+wPE;YcL0b5?#Lq~V3&A;jR5uAKyw11egi}ax{pfA^FbjGzM}zj0}@1Ac|PbQqLj=c zRPoZx6o@IHss5zO_@wL-2p<$jrFki-MUZ+M6j7kbKX5G#R*{lg02=;FEh+&uIzg2l zsKu6_3_6Dfyrc=Vvb#J99GqY$z)}r(oES8Q0}=%d6@wxv547Vt6`a44VG2NVqTqZ7 zwhyEdeEA=E3I(PY)XN6xtpW}IBMasiA)E@*3Q`E^(Sl6_ZO6|6&2GU09<)^+bii+N zNdCHO@%}Wx*S+N)L^JVAR&;uV4~og;6P1ZP-7%NIU95UW@;)T zAdvVVr-JtegUo(34;b3khR14;5H5{Bp}fZyU8463~13e__ivrhoH`b4uz)Y zNOKmq~oRa7~!5vaOALP%Z(b3sk8cu=Z@Dg_Hd9D^hZZZd$~0dp^;Ne>Pm@NULL zaDkd#3_F+=w3`!jKnB!USoZ?7%N=9|NFCTvAGFCe z4b&?DWmT~KC~}~sM5$P%pk)}ml1c}!g@ZH#a&y6TJyZx%jl;!2V>a<{9%zmlR2&qi zri14d89*CYP<130WtL>*W+sDn7?gsKF#z}W^YgP4L7OB%-C2;Y^0SNMb2772;}heH zVcRhw0hON(4hs+knz@E7cY-oXg;llWNpqt>KoU}x6J_B0`VuP=w0j=TKQ9&3HY6?=}>OmD4XlE%*4txwLR5Q2^P6pp*1D7sOEQp5)fzC36DFpBE2ajfg z6hg0ei3e{Q21iH%cz;1W`0N(QYyd7{@S#AU)=z!`bn96>XeTe|d_d5-vY9V81fAL0s7iz7K5tUL|uVbCF=CCD~_)Iy~|=Q75F51|F!Nl*^1ctC*z za%eed6c4l&8FsK!PCi&DGY{k@$k{tN`Q@Mm10XG+t}%E771RL&ueSuv+<`eMDGX2= zTunkQe=Cj$4|~F8u<#&xwWt(iG(1iWh%RU2rLEl3J13QpLd;~793ZZJh4ZhwFbi@3AM^%16p`FqI2W>n5VY#9Bo!f;lbTo*UzD0w3>O0T zSn_i~#Y#~r=y)B_E)LMt5h##AHbI;PaVUfjT8Rce?E!8G*lpml18N3%2p3IFMJA{> zmYbXo*9K`)7N-^>L_l}@A`4{ZL8ske&Vj6*M)ClpdMqjh-J*j~gkcw08B+LULU$z~ z0tb|n;uDMVOY;z(g>LLc4v!+p!ESIT!zLKOeRQ}eXz>oT0t&98`xwMZr_0Fvo+Y zI6zx3L0g(&V$eDPJaZ2hgG}*(xZnj?h(&5(SAa%E!P5aC1>mX^)RP8F<>i-v3N27U zT2u;Z@j-Z?gaO`F57Gg@SP`rPQqzK&5GSV=feW9a()f~0(8MAr-r)WP-IWbXQe~;& zL;s-5q9EP}XCX-B!`uW?hLRLP0-!hp*$HBU+ywJJhz}2L5C@#)L46KzY@&*Qno@~5 zFk=eRQxd_s2&4$41K}2!60j&}>KE)n6j9LC>QK?*Tu`;21giG(lNoY~b3uEEQjoad zh7x%69V`o~l)!@*petEQz(SB#6G91i)e2}%t_0NiEY1a=agJmnc+n!bQH3N3?wdf( zC@%qB%M9(aRhh)6q=LHrpmGpA1X;|GQ;4k(p^ zdpx;`@#%>L#UL@zaki<6X;3Dp8UZmu`)$(`!KUS=mL!6OQcDtHrh>#kCV<2XGRr{M z80RK}7f$CUg6jWxkOGh-=t^RcHA$dJvSjcE`x1uS#3ay)iTGrY`AMMD#6U+FfwLw^ zDlb1C)B-?K49eq4P`g1x)tPA}@!;`#hTKGOq6dX9>;i{e$cmEqq|}VWvdsJ<&^FIZ zP*|jtWfp_-Uk)k<)B^`4>-^FZ@D;a^`5Krh$@w`c;5dbzHUJY($>03% zLM#S%v@zsCL!~*XD01NB4t4=#6bz;Z9BH8AR8SoT7RF)>*ioPn1ITC-+-XoRqVuu& ztsuVud?*B5EwoUAxd;>;;GqssK7uQPmYij|pwt2hYfv{EQz1wc7CCU;;33hn+(b}f zfoLwz%*g?Hh5>x_5IEz-r&c5;gVIkn=o}2#=5(-pQchxWc1C^nuzW#Leilp# zq?!XAKLK%63TS&jL~TJX)a{_f{}7=v@U{gw8#J5&Iae?~KR<~9$^;#o0@}w23OUf3 zgWxtGXmdP79&%0^NO3wiaKML`gXTY=LXhoTpw(1K84O^m6tuS<)S&^VNU#{>f*6o& zN@{W@=!`b7Ftno%>PA5Md6kf47Y{ml4J-yKor~i^%Majt?Lg*0gh6FBcxM4f2*d$( zUcpED!vsKUy$Vu`azVZ;01cJqf(D+!Z9I??P*b9`0K737Y#Zp{8IU-*PX_9 z&M(SOhZs-_S-b&vG3cBjP!=u(>jv`*Qj0*PVL?G^3S`>|ND9J%L;&R4VDQi>bOH)= z<{D_(J1CKsg98BOK=7eppsQlQ{XtN>8*Ca#aY`yQuu#;3(;r+7xVZT(H((VorHt zCBhg`Sp?Yw1G5q=QjrNd4i@eekQkDy;bl1_s6et9!37dT3LR7%A!lNOV>%U8rZf*6 zXDDF?G76IL5Do&LgMq3Fe9k7inI(zopdCvv&w&n$g_ba&eilp^o2}s0%wXeCtN|Sp z4T{xNQ0RiT+9TW#5>8CY0nPY>Qa=N@UkJKzJq2`D7pPDyse}vWCxbRI!4}Vhl|sh4 zg>#Xh#m|>zze@&1z-{A(D(cl=&(9O2c+2sRsp`v0V0|UO5;VKbE?x* zLE|Z)L*PL*I_T=563D7t@UR)A2rSBuFG+`J1PvmUf{sC}D1jXWElLFy8&Do7G$3k0%3vEfAtJ@ekk(jnd?Kix z0}CdV=78=>f*lA3a!GQ2E@&D&2{H!?5hD`bVo>D-K9U1++#9I+0*$|e zT$x%?0y+|;xF9hv4^*;&T5n)|pos=J1A2ZaNCQY5)J!Y|H2@*QwqRx8ZU{&LWWW?6 z2Jb$CC5k~uU&18vKoi4IVbEA7_)at^zo4WDrVP}mg$>X^WkGI@FNdoD?+St`2Tu&Z zjRMc2gGx6@bGR5X{SV60&^9jU@W&)bTNc8E?d1enm77=sN(!JD0UM8OP%b2~<(9-} zfG#5hC2P=`hM@Cf5pfQhGzGaItQ%B2!Wqz$^gyZ>LrezcLCC~BSQ5?!ZTUf{$S(p-xIofGUOs3G9Y{6ks*b!8XvYA2T4E|_a;dTa zqOc&b6q<|*@(U2|1ufl%WVpl}Ncx0{K#Dj}{he9{w!5GxwG2gL8IniAlHjXv5NeS< z3X#vrhXgd}N?UMG38ENuaw{m~LV2Lw{E%5OkiUvjk@FI4-W{$Sw5YlS+@gr z1?YAJh&~W29;x629Zr!7PqGjmEL9=tfak1|{DMr-nbmbPl6j;UIZ$@;|nq&=^4a@6rS)hvmA7CML9?nOgBh# zJlG2;A_(h?KzCd~VjGeC%MqfmY*bzZ9uh${3se$5VLDLr?|D+aydOZ*^Xb^)>wqyX`k_j1`hA=^mm4c$ww9E>q9O!K0WY8_BsC>{3 ze-Iszb2}M8RS(iCNAP4FNDR~y1C6jHXM?;|0gteX_{@B$`(Vs?=&2l_lRQ&E%TYl3 zp*NYOfeNPz@Pq?=>1u9bMP_bkZalcJ1UjXc0dx}us9Tm=Q35$@IldT_cfhM-A(G&| zE=Ww!>Z9V4%;aoP(-U;~ENGG$ET0NGtUNvq(EJx@hc8$Obio5iycl|p z2b2w-M}jyETzY}~A36c)@zh;PFb3nMtYOVN%e3ZLs#FRH!q+CZvLj z@5-dq_}pwzTOCxZf_RV(Z{TGj;7K}giyI^XnkSA=DoBIO+$4fK(O~h+f>h8_JW$U! z72Hrt0Y(bOOt8B^Y;aGo7<6_=Dr`wvZc;pW0s*Q6 zS~-ALPoV@OLvB)j1^Cz^@Ki%)S!xQjXaI?WulLJMEiO(>Pi4qWPK1s(gIJ(NB)KWY z$)IVZ#1sYy6B_L)CCQKh)xY7YN5ORuvOrQQIQ!+7V+w*BE}*^0;5-8M z1$eL#ltw|*`Jl-yB%_lvz$fD&i+~eNF37LBu<2RQYF`XTq(JWQNkMi4q|5+q9e~bu zAsGxBSV2(>nn%N~6tYG&^;LFlHl7A;Bz-fHh|VrfliJtOD&4e$V|^b)`)5`=+I;Ez2Y90}Ux3hCTITZ{-BAah{Ira^{ZQ&EKS%Thtv6LdBQl7lgQ3*HM9pPvuf!I1}E zT!f??G-eAuDGgZ^HFThDNyu;;vKv6fEeaoeu1G#g5--jMm)0oC@^U$wd-8X7hjqO$#CF=hGJKFVga~Gfe2oZH3gZVEfdHJK|4B& zGx9-`EC{8LTm3+*+cVSiU;|0W(xBT#Kp7pw-jbq9a6yQo7+kJFhZ7MJFt;PS1||ma zFiK{HOM(1>st2?%uo$%14|G6$YH=}WhZ<5)LW@T%4uB>D)GQAvLcxp9(IdJ%3AV}t zWIVX)0yU{XV;SHIAvHH1vga8j4IKdmITc*iK~}Va_S=D4=IFxUHL$s<(33Xu^3y;) zPH?jxp%N^Lt}qj{3>rfr=%ClcGH}j;SPr^d9-Q(p9e|KRH5-(`V5@cEE&~aoDl19_ zjdFt8E+CgeH`0M86u?a!WI<4=2w9z91ipa>9KkRh(4}~(6$Pm&nV>^}b5nC+a=E$S z5k>I*u+V)Mpk_c3_zn^zbp=J4ptW+K<|U>f5SvqrVCx&P+5}gG*Qnz1%#!2`(CP;y z%b^Jewj(n)7wmO#;s@RPkyrpbcpjt&CY+ZKI`aZ9Qk)9fF9_CHng$t^g>gXbBM>_| z-4I#;f)}xXuMY$VBt!zVZWO$E2_XgX2I}itf%mVql1QvJ*0nlJg zVh+?ybYa*v+~}qd5RV7#8OAgcNwf&maDuKN2e;0W)8j#>{(vjE_>BB~SOkFuLFW@f z{Ei|8+Gh%yVF&dOK`w`;POwK&Bd;VszAU!@v_t?}jwh$bm*s-o02&-kO#xltR9Xyf z7lBsL!HQ(aRv3`yGm1bb5QDvxTL6wzh-Kg<(csOTAXNpGkiE*_c_y%8mV~6 zP*)3leFWG)X({n($$2H<G{`PXxFYb34r1>}ZfY** zh9gj)8Dt-b4PH45Zu3GWi$LO_Gti(BoR<$iqy=_pHKe8ig#*|PND4tI1Fjde6as~V zh$FBTkUThn!4+kKu5BqP1+~$^39vY|#Lx^RTbx>AYy@S1O#!h%1tq8k$jM9w^+-Vz z&opNhmwN2ppVcplMUc&?ZPBXmttbKs&fFd}ATR1n`N?p!<$Nvk9ORyupJS zki!KSz+y%D<)C@*^wP{6(DYks3HT-e&^Q+;U_dkfV0GZhA!v;OO53RnxoMyS*q}Q! zkU8K(08ymDx3+<1`oQz&NcuqQQBYNaR-%B9kdsi=qltn?n?UUw@E8LF z_hM*Z(B?Xf9}lS|8DPSYavsiwW<01FU|xI*c!mf?2vj4X>WMGS zOUVaacaKfDxF{Jz7+k|b4b92VO9!3e9ABDOkeQbUnrnq*)nd3dP@tgkpgY}QJ^`x$ zw@Bccic{kYQgce;a}v`LV&$MESx}2XJ;Zp>Ewnjsd6-aIVrCIk5VX_;+I<3*mZhmk z;*cR6=!JQpiBJqVNFxkvA;=(z29RKUejcdq01xzoCi06Qr;8SWjL(ZND=N(^$po!u z$wYAClRse`PAOy}G&ivVWC}=}XHP8X0%mRpMAZ=iwcv$%hmjSI? z0N<9ESDXeKXoN`=B!ccr0}UgACNn|H1@rSjNfK%zhIDZTXd5bc6C$MK&jgJrm!uXI zl@@^KB~$WqA)Us|3h+Uh;JX)!8FI5>_X8$_Qh5$&*>zEJD(I&0c+h+Scwi_eB|bAP z8P>dk@(@F;47nhoy!bLh&@uU`Xxw^ z2I{85OCCtuAQwEQh9VeWmJ8Z<0X7(P#$O)jFz!t7G8WL~fywbm7K0Y&gSb$OA@K%M zm01GbrJM_8Cl{1L7J)(e`Q>>KkAZZ=mx9mS1K)HE>Kx>P+8L>7nIPwbc8(T9l!8-j zacUtrSmKkwH!I}kg7QgrJX{#O6a`%nWC_TyT<{?!kilXQzaSmF)~Ohl^K;`-MW9XZ z-1q{}L>XuU0Vob3y&TYS8L;K4xu7M-@t|XQ<3Y^~NWBZP06tWb3oax?d@m^|C_#fm;5K40cn=|@G)9&HZ{G#4;Dx5T!~$@DfJ2-C zECDKo!Iv>YxFFr2xC7^vycC!XpwTFZ0&ue%qza82586x&YO)}S!;WhKTLjh!8SjEA zNe36iARj=So|0dlmtK?zT49b5MA!vU1mdGvh9m(G^hD_CFR)$9xw*;l$%U!$pcRxU zpuJHrfz0CK(p1Q9JD3pkWGB#isglgJOmNzT=ms@KQb4^{29R1%W&~g13gUoLXnZPU zc~fq3Jesk&kbBz^dUJ~kLDRwo47s_Gb^w@ytayWp#e=qkfD#WnKOWrFhl#>Cpe^p8 zB@a1?pcSgQX`o4>#GGVU)?~=d1vfH4BxwH#IGuw8ixQKd6tacjNj6Z`0e2F3*9kZ{ z;z0vJppGo)c0yBg4nBk05(vRfe43RnV~l96nKNP=P+)doZXfutC8={ERy1kl+>u+bq@ zeW*$x=H|s`fX8T%Tn+X$7IBDkpgzuv&ny8QQ=XYu1}-lca*;*AiXefAA_0v(hTJ^x z0s-h%YA_yX?O8EI4pd~uLnhfk!%iUOU?DgMl(#G6%Q8W0q*B3pK-C#ITNXjg0Htx* zm|N5MeGzGgvv) zDc~YJ5wZX&uOuEc!2od?R33csHP}or3sk#8czMaF>OjNbi7AklAn4SR#B9(3WGEt) z@x|bk-gzaUV}}z^Z^BZUNLAnK>-fXWENF|RD;W*yplZdc6yKiXkk5Qf-A2CTXK?{J;b%4bX8uF8}K*Nxb4rhJ}I0%ZsnnBe^Q9Qg60Fncxa?nmKusozk8V_C+ zQw$aX&&7h;^hn+Si@~i+jfZwEK zieQVvpz2D~!RtVvgXSfPnRz8(uYr`Oq=MT`;0`-PIkee|!~vaRlm`xbkPc90h74(e z*L6S^I6+i{icsk3-{1qjz>N#26lgO%Xvzt~g&iygc1%3@)C!mfpaYFyXQ7FKn&B`Z za59A$25QoPu13lO4d{V|K;WWO5m24=9NI$pjB_6t?ppe zpfU?`_5$pZTTuB0p6>?5N*Q?3P!XuN1c@*P&=?muvO!{?F<*#CYDGb25%{9Q{1i}+ z1vK>y?uvphBm;L@!9qo;so)w7vW^Eu2)vCHY& zlnPo43_2$Pym&i59z5C!)&LsX2NfS+*Fl{P@&RbIYCPQSAQAAf7H}2dv>OjTIvL(E z2O9`=GR(Xp@O5*rq7i!b7I?K3+=im~+_YrSR4r(wNf|?KQG8KJZanBBgQEOWP$#ws zk{G~347o+AAWxR$!&soa0NyR12DxDgvX~H}3Rw;m3JkemBh5fPE68d9hFow)0UyoF z0KS10l)s=CwK9M%LjVo+gVr`e)`t|QLmUsf)(b2RD(%1w$YK(Z%A|bIy0+qUX!J4U zg2wzxiomy%f|_c@nV^#}@j-DWsBHvV!w9|hpwN)yP; zDpUe=*a*^o3Gga?s2C_{AuA$4#=*u6pls0SY*85~P)g!+v%v)?NCve08|(sz45$W0 zcmTAR9i#|EBNTzw3V~+COVWx#N5vX4=`4L-WG7;G5m1SpsbQ$cYLo}&gu2)I`P)&V}_5EhuAJyXS?>L$JVDk2U`G2P)L`xg1m;* z`+<86JWK)FTV9e1%0!^x25ZmFOo6VahF0Sxpe3#GaCvak4AM#{0hREOW0zO)$B8UzI`Xp{jYQkj>Gun)8Z3fi~;l~hGwBcOt?DXfxIP!`Sw zb(hFmZYyqOEe zh75Cn#X$!JLWLo1L0Dn}nF{Hpf>!i1M5t!))uIq3pb8!;T9lfcnpu_#noTmo6oNHk zVcOto!RI<*5d|IJ54s5eRSLA22E)mqED4%-&CD-`S`6+jGl0${0H5;)-ua!9Uy_nv z0ucmHF@vQ`@<9m$EDD-A0f~XHy#W{VU||Rs8oPOkdHLX~5Ik`XS_KKYYAzpiPH0Ig z0}2n)XoCvn6_@6w#)Gc60}H?=VnL+`Xg2^@5M1DbmW&re3<9l90F5`4=A@=TL?A&A zy4|jz06bU#sz9Jp;L~H`lS+##AshL@MuGv zR#3YLw+wXr18PDls2L4vi$GigUEqyu2dJ_F-4v9X3tEtoms|-xauOW=U>ia5DUh>< z;tPs0^PvVquMR1W2kje%ib2op2HOeVbO0K3E=qyQf{O`ALoKx!Dh9fzGc6xQPZ5$Nrm@t_l5p`zfCL2x<+tAd;-P?`)nZyTZl zvL+-Yr3k7SY8?2YS%?Y{6IA?x4aiIb_i&3VK~)xL30_`$DpU(}W+}g*1S$ZU<4G-q za&kc}-2x~F9K@iaIX@3s1k_MRXa^0+K{gFR+>u{U3>wYK0o6}vt_4Yf_D_KW0i4C5 z#)2dun-U?m6(fs-H(SLQC6|Fr1mPkiSxC(c7XXjR7J*y+=witBVY90!5nQt)JXVxk z1~sE7HMuN4FA>HAb##hAGyln;g*25=VenRxJebSDydo4HB6^GSAxoJc0R~zC0$Lpx z4=RM>!D3J&Q9K787)(hmC`yIw{D;IXLtbhkXiaZ?Mq*J)IcNzH{BCfV4Cs7r(5Vj4 zn`h&pd+r#(V&F+d(57+FT~`pHlzd3-2^q-*tAd;a04nyN6KoKbnRx}EO_wNQkV$v& zR6axzc!UO452mK3#Dlg}7pJB}Wb@O~Ky9J;?4o3dKtXarDd;k|)QS?QKxs}+d{GHx z+yLyFqEv8^3Xv{OEd(!EhVV*Y+s0t~wZIx+;Rv!Fym|(-vnIQ!ya23C{IG=lJoP@GK+E%yu8$8kn=LrGeBhmh?feUr2-e;VB7Wn9AmVq`) z<`#qdgAgBOB*qu#B^DHCfNEs03qWNCXdJs7YElODW&)`C4A7(0zhWaM}R8wryKU67grx=amp3R-S)JZ!80Y9fj>cnUi+uLQJe2uU8E zctAl5>U4psi{uP&T7g;vuMxq43c7J8rz{mU?218s7I>Ng$2#=P$s(vBDE2@&(Ec>U zF;JoOWbi_06ix9N8L$KfRRtQ-1{YJP>R_<~9!^6s7QEO27OZ87kW)k<^TN;posxV| z+(O4981hn~EYL}csYRKfv{wRY2Z2w^1l1U+CGp86IpD*5Q$YtNgH9m@YXpgc4i(BQ z1|4MtaympMsKEoS#K9Lcf~-hMMHCs^gU261ql$2mvdp5A z(nLso2Nnb^YXxsTgYXI*2ECx+1e66CzLnE~la4SDcz$lnNSV z$pjTQkn=>r9tJf*!0Jm-)R$Dm7v-gZdOuE( zK)SS`st6{MoLCTFQUM;Ug$sd>o(47B5dxsKf1s0nHzR&iIAegf0#(MZqS6Hj=<>ga#(aabQ=)rxfPILpFs% zO)5$SE$Rl98Q|0fQdyJ=8r=cS-@w$A=Eaxfr{u#-h0Hxy^!4goh_~PtL@aaQ&sU?|dpjr`> zb(6E>lQKZ&z=R-OGlXDrVo?$3e9Zi8s4B>n*`Pj8F=*pG#IzL9WI`S|DQBjE$3fGJ z^T8J!6@xCjfhfu>j!()5ji={;Hax+_a*RQT7M6f|(_oi@h8~PT%gW0@^&-fvpt`;| zKD`(mj+tqoUE@WdGpr#-z`DxdW*FE6BoR=56mq*PR54@)Dbz1T;540?7GDHiN|~3K z1C;{x+mI7jW?DQvu8K?YVIc|X0mLUJg98V~jxWh61FtO1OD%zjfm$5#;Ek1#J}Z)V zIjDmM@~26N}QpE2-elOwP{(wVe=r zSn~)HAStP!`%gf_p5UqnY!;FjbiFEEH)s|Dg##T6fCd{#8dTyGfzuz@u=Lat(9A+o zCFsJoOmGH;h!^FT7J!l)BEmomARr+DS`i2f16WB5)&)H^2_~0WjP5}2kQjKb4DL*L zqY2_;P%#agyo8wp>R>_VGhsrYen(Mh9^4dA=Lk7HfcTJZGt}>(XaenTff;~ku|VvF zu7-d~gK8vXw<(VYoiqzNP%X6#ECaf| z2c#l3FB!CY0CZ$Lhzr>s4psr~Wg%Gc1;weQ;7Xw!Jiq{|D9d3LNja$G0|iq#cqRc! z7&H_P9<2bI1nR3pC)~h%@IDyuVl4)6?;f(NFCKEhBv>RVCmY;9&rbtaj1Xm@HWeuK zgT~y8K($Oo38>!yZthor+9#mBdSLCKivSXfkR?H9&4Z=#^7G=sz3`GmkjpDdK#RXY zC(A(2Dh8_opAiAEvmg~*NL7@;2D{>uN9yKB*G#Y zO+^`K5*(}yn?zA6sNhDG0nKEBnigoHMX9N%BH&grvbR8)KBELx5hQoUXM%^RkrhKF zAfxr@dWth3kpSA(l?tkEkadF0f~;OavkN3qW&%2250pC5wUn9Rk-_GS%sfi3`qnf@o*vV5GJZRP?Cm;R1~BpgO@BK1Tw*$8?aMBenc^~0x7$ffEJa2 zcAN!lc8%3Q(ywAFyDak5;y`8 zGLW#&rIA_g8W2Gy@%gFv$)kOhKJ+d!LuASOX?ZU+r6f|Y{u zGN@AzTD6N%Rgznf1Mb&D^@AfYKD7`LvS1NVa~YJ!lED=TRBb8fhM;UDpMg>u=xz~c zKtUVn;KpVeWDj~CgpN;z+=qh71&^PAI)yMrpd}$-eW2+Ps9_$Ks9ea>W$|eMbC^yHKCxQ-M1s!Y-E(jo!nI)NtIhj?Eya^TpL0srRHk7Zjz&gO-Oub2~^J7G|Y+nT4RuDX_W>BnLVd4wkn;d_+itc;HhT zA-757rNx6pK#NTw1r{tw5F$uf2URI(W&@-gwAu+Ypow6Ef*#!b0A(~#Pckv33^Y#z z4lmGv3sOo3bx1*zWUxXXl;NPQ4Wyz5B#K)4B!kYe%_(5WOG_>R`2oTxPAyDK$wFp> zD*;G7n3od|G6P;F<>f%e))1MmFfRu@^Olzb-Se53R+@t$23pBhk{@3L9rVmhiHCO{ za=;4#At@e|3X3y~OTgnnIgooY81ixwL9Mm;q*OyQBo1g+0V)Go4pW?&o(D=yD1xPV zXu`!vh7=>2QEX-cH@w&a!OR2=MnR1%MbcY}q_-4FZz)1=DNHZu3`vkLKuh2YD#2!h z2F^iiW|C8L5PZ<`F_1d2BxHy$FCQ|$pOXmLfdY~SjiBWuf+mMy27~JbkWgt!yqO8; zygQIO&<2I1RH!>aoXkAP24=905CQP;9h{$+pOI1o=fQ#pq!P5uJue+D1@k>f3beuq z)lz5}fKqu8sF=+G9e7uqT2z*bS({kN^bpJhRjtXPyCh?fi8xGcm*_#0@VdcCLr5E@s^lZTn?(=!DhhvNnj32)PR&j z##q2|&=D1eyxdIC&0gTUhM|R5ZYKQdcId8FWLe1F-;k*yhP-^x8Y~9Tk~$+$R~j_l z0Ul@oMJFg8K(j3c<%M7spn=8wWGFKabohNyHiQSNyg;{*!}ySs=%IxS$V`X;D8s;c z;3bxj{Rj|4Ky6IW>G-I;Vh9&BY6)qp7bTWM3QdqnAoU<;K@@>`pjD_)O&~s;Spm5M z9pqKe{^0ziET~i-=&;|!Bq$F&bq;AifQw#`E#R|JKns@35+N3W1wfO+FaglO8OSz> zG>iu|5@Z@Ee?yn?fn5L=18w|)4o!fp0gHj=Ga#mbmX?A87QqGggh5I{a^N-{n3E41 z?1A#YuF9x_tsel%f(A!YKt0BMWbum367cnV40%YxMe(2oaS);8;*|Kb(mYV4XH*p4fR5E}EnLsxOf)C4pbHPIh&=Ujl z^7BAzbmEH=GmAkx)m=fVic?dw!HEa57B4@)0CG+qJa|EaIK`D1Ok}|T80G~i!B8& zJb~oZ-R;p2nSLeL)hR0 zHbEQni}FF&H$q$iJ^OcHmZpGa;t)c`so)Vp z@J>9)O_X`Xpe7IKuFyQl76ni@FDD*!c@?PtR|e`}f+ava(8<%FHbrr2GUPrr`5D)3i#V2Q!=4FEg zN zT-Y&jU?re~J|PVqkP7h9R?uKL^mJd)k^fL;W-(|jb8$&xayCd~YH|s<>j#>3&WBDR zfKz^E3PXNcd~#X|n99ip$8JVBDi2a?CFf*=5)(|SxF{L4T>~6eU~huQ*}%hl=>?hj z(B&i`!$F(g;tQbNit@~o4A9(MG1#19Fa-@?&^`{(5yzmC5hRNc2F;r!mVlRa=Yw}$ zfjR-uk_04>n+O_?NzTtm1@9gJ2^B$4=twHcOi51#83*d)#DkoM!hvm$Nve#m0FTw= zr$LVP0I7_Jp85?F1J`>=l`zl14Fa8Nlv-3$i6H=LSeB-OvMace1~R7{YzWkEpaw%q zZX#&ZuL!IeA`21**P;jwFd@(+H|RWgR2j(D2qY80i3l?54KgSN?C}&tq=1bB4d8+A z!U1W7i-6pNFb^(_Dul)>$}fQV9~^Grm40AT;YlIBur#wM8yw$YB@kz!Dg-M5t!)O~ zp$ra9uu@QCq#!>BEEo?8est@KGeN7f5fKQ{Rgf8<3@J8IY)Q_@1WmVsj^G4GMPgnG zLT5%IXqzGQPP~-(6mY)COiqpmZBqhe4v?q7+8~Sm!Cfk72Q(g>J3;<}D*}ZcG^)Y9 z5|~QxlBs;K;rV$W)sTiaQWk>&ron576ic1El@~wg2KlOU;q_ z(D{0(ip)Gv3mjBTq=7O7=zQm#(qhmW6_|pORM2WLkWnyGKmiDv3x=uywYQ;6(42A! z+%Qn(2yVxME+_#dORyE7!!$wDvkagEg`r880o2Sunr#Mgk!G1eTyS?8RIY;5rWVDQ zWF+P>v)%)P4Z(RR(DRw+x^= z8bPhd5~$h5nc($KplUA1`OJ2mYxcU0SF(oehaiC9dc4D zY=e4yUJ(OKBqP6^AwLgtz!5kTGUVq&=Yc^-g(s$Dfzu`fh?A6<0zUW*#0Cupf)>?+ zT8Usu=x_$4i3nP415#BCUc-iB2to+j*2vF|FUL+;Lk$6I08JXl=cebDfRur|ZQ$cW7(hJ|@cGLS7U)zWP(vZH48jN9>keJM zRtymVtx-(OP0fVWEd?dubw;33MNlsxnE^b@4!VH?)Chs{K&cO!p^6J3J8|-%49KD# z5Dz+w3u1yA@Q_g}NaGH)#RGInd178>G6PtsI38SdgI61*rZ9jmc+F1(EoA`RA(RQ4 z{RdwUfkPbX1n`<*(7uqol57Uhx)jt5r^DWD7r zuFznjrA45|6KL8iHx;HgwW6dbF}^G(F%J}};I0rTxk9yo4km++u)s8A<|P-Uf{&8` zpC~j{vozAV<9;$(DiUfM9&kMqM<&!PYfFm4MbMfz~a-xOpis z2N&n1#Dfe2Es8IOhb3sN9h^zv%0TB3f*KH@#gi~W(DF!zg2WWi0&xa#B>}Efz(Jpk zECB9_f)yksf^J+*EY8n^$b;h-awt@MQ6jP!boLmm3!(}l0v)SB5(m}w@wu7B#mL$V zKv&6t&OLyw)IibzmxCp8WI51PY3PO(B|?i%B!!@DF?ry#RZ>BLnGQM(40Ih07BfM` z8k+AQLaB)<;C+u!hl3Um7boU{VgY0vC~LrEAgBF-n>!FUfFx6)SFoUnfa+UtZy!Yz z-ZKM>g2vK7O-blwZeTIcA@Rv2sVSg3s08W+P`fEPF((H!2?ucrNCeb_f@%S+Z~|AM z2w6~T9xMx5V-XTHUhNx2YkN{j0fH+2dYmXnlp>z z3({aG_CtiS6N?i;m1#N}7jzpyY6-d^sF49SJ2$Za-0%kV%@FqIW`lBI9;ojK(Fxk~ z488djtPRpYfyjXm@+*o@OU%pxow%8j3c580MG7?h4AKS_%+JpOSqCm1i&E2&L_rE6 z4Rr819cVIn=z>M5Y4I3>pb8C57 zdElK+;L;?!(vh24k(vUt57Zzn05wa&cNG-n zLsou3L_qzN4N9CDNl z=$>?tkD!9ZxdoslnrWa@JPH^J5{nXZ!2?Plei102f&?JL70~_I5H+A$4K%L|=7IJN zf%_*=9^_O4=%KBsVxXiAu?Bn^L0(>J4yc(>l$cu#JvkaC3)wOU8L)(!0TF_$2X$Cs zs*6jL(m;DQK#@|E2-@isUt9t@B_J6zLJd*{8Xtg+JjEx2jQ}m!OwB9FEUAP_gD%e~ zO9d5u;KnRy^)zH~79?K`xq-+OAOPl*}Sf_Xoi%$SEyG5=qSg zU$zGt`2yXJ3~A6J34+~JoEo2zSzH32&IBEy1G5p7qhNtqoEo2-pO>GLS(1^N481N9 zJRuA*7PPb)G$ox@1Znmb6{p67cFv`wrh!cZH5%g6ax&91z@b+HN@Sp=U5P26oC)#* zR0x`7ia;x7z=bd5kY>cR3#e)-N(J8-4LQXWbmTMWd0%ak4A73AJeYb& zqJ#5Ni$JYe&|m@BmVy#c9F$~$&TD`eTAW$}byIR?d}3-5^n@f(KfAP;0d$xXNDwp+ z3~CI44&+NLfk~7U!)k#Puu8}XHt4Ka&Ml2 z+DMg}S^yWw1bY}MEkMq?0$-4tnU)Fb5635h@;pcmdg2jeU=?CaK4j272^xr?jenry z+#z8N872aa$NQ8s^1vUWO7eg@;EP~4n&;?s5py@`02@oNu2B>gF zX#r>mATv1?B2b!_3@RGq4ZvLJc2-zgfHVS$%RmKKawe$NUXYv#aSU{L9JIw3tQ@>+ zAL0p67J?`O9ghZy5=a6D@jg2xa+5tLh;Spm(C@N^40NCz$lI(-W= z(h3&>do#W)71VTr9J>RO%FB;WF-$Q6+XQktJj}ryP@@7Ol~GxomIqDo5{n>t z115k`E}%((_vxTG1*!uq0c)T_+zz__4!mm`)1^7!lTATeU6EY_N&}c`!BK=&xB^^t zqWTjOmYB*hMaq(qw1ZMCxb#P;g9u>>Qm_Q755Pib4uy#!yAmvhW(BG{QcECnQ;?*E zq%^f89&~vtHgTj<8IvKRs0UU*3{}<#!QU_?I0BCItk_@OM00j>$ zcSE|#$(i5+1Jp)~&&kV9F3AC96Lc|f5rhydD#1`!oP#O`yJH3H07ONERxZLq6Kr&1 z61Wb7D#0oRE{EVTgQ5#8g+o(%Jb3yR)ba+k!=QeK*#`=9tQsK^iXsJS4W&av2;5kL zLS{t3-+&J~01JU;SU@K_LPWruy}_4}An}p4fEB=c?;vx*9c9qU9?(cg zep(vH{!++FtoWi-$c~W=aPJYJ8WIl3Dj_2AAcdfQNPaRdNl^b9iyY`&Yltu;OF>)( zG7ctMnwJf$tP4sZOOU{P&{cOu$r;GXK;5mROi)`L3;~2;_b|q&Nk4yFq8HL)WT8P9g$Z3f(zX1i57uIRrs=f$}gS4T5gx z1UnIAJ9xAnh`JOv(=gOssI0;%BJ8&T9igkbYvsA|Eh z&p-odsKP0rfdX_P$i_=#+f$3+=lX(|{-Mc%$7)ec0WUgF1z*^S?nY2GicJiZ+%rqS zjSy6`z|o5)1ey#$7s^F9wHUO?JHHsap`ew?P=A0bM98WKbOBH?0~xr3SO!)JjZlaP zC@IAkl^3VNZO_e50SUq!1Dd-?1)Zl1H54jURwTN-AJxK~o90VOEN=Z#BO^0XzuT_tS9|KMj zL7?K0^)z5BAtoaE6)KRQ3r=w`-Jo?R5QC8I0*fL=9zrkFiKvPp*9C$r4bY{t$oA(W z%Yi3yK;Z#1uM{*df+SE<0UpamF&!!fK3)~nYDZO$9Lf+=VaMTuMu#9%r3f9+&K79N z7kKm)Nd|+TSprTP$Zi3Z5MV*nWC*c0EfKUV09kojeo;0GA9M^hD4ie+f)_(U?*Bmw zH>hY@Cb+&rI1?%kskRWppd~P=Me*QD6g=ICkODWPkSzq2S=ihU7DsnoW-(|ZEo6Eb zVJ7GjH)JD0e9S}y7R5+JU{UCqh)5m=jY5G3VNlXGraFiSXo#;Ivh&a=&ItOw*q5`LqZfo7@NPqrb8sqvNBkv zBr_Q$y@Lws_=5cGR4gt64H1K-uvib8FGmCdXm1IM>oRjwH;AEsUr~lJkXL>SUm-5YJdbvD)LZOl;y)x zE$EV$#G+K_f3r9}|!P$l421gMzC6b1FYP(&eh zQb~S3G)F>>C`wHS?P&td>VaY%Srn8FP>g^K5+>&4Ahn&K8o*K@hk~4hqNxQ&gx9i!VOUPKyoT*EhKm(0a-st5OUWMx+tW; zLly-u07jUXlA41on_2`~cn_}nAbV`Vxf5b_YDI|&xVaA*b^$GJ1`RfVX3CI_NG~Xj z2aTG5_hBPTfcCV2!Z)cLSu`6w+yl8tH>D^w-Pj0OHa9oEEEhB+2ijr)IvEHy+yE|i z5XaphITNQA&<$Ad^Kp|-LP83n1(N*O%AkFF6`K0ww9pvyvUd_nRL#5zdfh!#Snd7xqur9_10Q&6%+ z%BJh0R-KpQB-UJ(t|96 zNSBzR@u|tl*wsUeQalP^Wf!uk@Bsh}LC7&z1!miT2TvIa(m)*OftU~ubTl0*1!*QiIpAg3;8W#FlS`mt;JZaY)7IbvL>Lh3Utxts zS{`hDV_F`lx&mc2=*Itov^>ZRC8&9t30{g(l9|o`5{B+5fk;3^;Oilg%qvC+f+86_ zzLl02Ujm9_&?PeP;wzooBNDv{Ib$LZ#yP#``)4?l%KqK$zkfBS4 zf^^WCDc~JGpgYUK2O`4u#HWB{6G4~irGS<}LV4LBC#FCJWxvrG!O|smy!WZ96W4;suWb|K>C9qanPI_Xbcph z5yHy@alm7@DY=Qr?D*2W)V$=P%7PM*lQSy8YCt&?tO&e+1GEzWbV(oR#w*ZXp@Pi# z{4|DwOi+uiBo#Ij3f}#}0N&}4np&0uQjnYt+NqKa5d`%jL3^cO>)JqDBEVu80-!N` z$mC@XxJ8MiA1(zdN|3~hKv4@>F9$alO$mq#T5(+j(FW$GaG8Nr{J!SC=Pdr-J37`w&tf2PuGbfUZq|j+11jfZ`am zat^E(wA2J-I+&B2SOB?16U+l8{mc~5;TUs3!l?G}gmga)ZDh4e!gWNp=sztzyR=`7}(3=4nK%%g7 zOF?WnW%skL|D0r%}60~Bc1iYjjDhlpY6{nV< z2!e`6&~`#JVNhEGWE7}qglY$!Jph?x1!Wviu7XOyq6{*{l$i&*=n8yTLMCJpBPetr zf+^6u0zuIV@&Z_83b^D1PftPhf*cB$260fl0=j?^8gyX&poSx4IT(1?G^BKgYX`|f zx^$3ZQS(800pc3aK2Ol7D8hYU5u{jvm=D?$jTRmtH-P4zLF0yStDxJapuJG2U%*2* z*c=90T#%XrYL>w+I6~EkkcZrFg(h2C0=E~`;;aPq8L?Rdn)m|kIt4{eL1rGP-wkyc zywZj8A>jkLD;ZJ*!fk*`VRtB064ia6trzK_^SnUor3&B{r=(VZstNEOLy+m|pj$jZ zd#*qO4xsT;@V>mf6!1nZkQgZX3i82)R9-r$SOInFAUZ)?r9lg|K*~UD$c!0?2hN6| zh66+)BwiqF@D4MO8u;!o5C?S4PJR)%rT}qE^FZc7G?badg9>NZ5wwu~YM{a@FFn4@ z1bib4)Ulw>KC~Z41YL0es*VakGa#V;7|06HP-{HsmMpMpXfpvM0lI-I540mEGbc4YH3eMmLCgUS z#6Vd2$;qV!iQuI=AT7|+y8t$E2@(Tk2~brF(SS(lU`3#AetZ$6WGqMp#R|0X4$=v0 zB7xbEY6g6-GT5P@)-b|Y5D!##6r`pV$ESeCUKt>F9>Hqgq&Xly1^+Elpnwo|DfZb3cxIIPZP`nha5C`!2*y04lomZ&;ha> zSOAn87$C-gQwC^4KQ|scZ4#fGT3ig83I|p23;l9yS^9 zZ8o6ImAUbttGnQbFBRm*7v_Wa$ATKz5J!LnKv9J%0xD~vYc3#qP_Dm)4zFR6fw(Ci zv?c+ZI3P-(Z3V~(1IWQesX2)i5Jn+*6cN%QLNriegIh=-%`AePh>6sw zg`5lrD<#0DLz}xPsbKR!JIp}M-y&o=NV$-LECkMY2%ACWUtT`MXK2deAuVHsT2MnP zFCTnz6lk|%F|v9{B0#9kEC!ACfv;ahRt7pzEFP4iKx=s`k!8TGbA*0S%RCVgDrhR> z^YYOH6{G>(!7#CSXxJi~0$Ni6T2F(p5}J$SL4|crCTKwwvK(lH098LIfr6)q(Sj6| zyr33>8Zih%unK~PCP3yEmn2rkCqf#)xiANVFBvL|2h~DwG4S@${338iC^x>ivbZEQ z7kp14Xe1oQ0f?5q#T@GrKf|qsV z!h4Z07H9(}e7_f55HvWI%>dfd1unx8toS6*8j#!+==#Bo()3iYB&do4GoUkKxu7*C z#U+WLf;|`3<%BW{Km(+?De-xri_G(3n<`)i!}g8lLarSL9cq~Z${bK`8EB>!Y!kd6 z3JKB_c!v}s3tf{0yXXPrmx2;d`x+u$0;)H_Q+i-NsHt0C06L$p2$Z~2KofI$#qn_e zl@ujHxzO%&Zb|_(48W%}#8>8*=B0y-0-vk}XMk0M<_{nuAoD=26>$242W@R&Qd`; zS0EK%er9ogUVL^gcsLY#uS`*D3TSgBNDs0kns9MWViNRt2!?`u&?&K?ySu=v8$kTb zLa;Rhp6n8=#KQECx4V z5E7t$U7#8lw1zx25xjB`Y*I=Rr2UUgJU=HDMK~uuB|o(|J}3jeaJ`vg3O1s??4N#GK({y3L$+2P@#pY6ckY4Dj=gMKQFT?H6FY?1#Aj7DQG&wE?*4S z3$g=Jpn+7v{R%2z7{F&xf)Wg9O)L2LHn2!;Vr5EVCAcVrcqBguG)hwl+lrH40Irf! zLG3e8_XBi#Vp2LoL4E-&*b7QQbvEb-7tq=*XfGL-uR+UPK*MH`cm-(#t4;ymqrp&+ z54!5z0KCSryg0rfJGBxjRsj=(4E=)D!Now04s>`2S3hzD;`19z-JD;eSH!F%n%a!7W9QYsP`w8ai`qaKnVv_eG^DXA<#wiK4< zV2%J=0&BCv?T3hh8lXrfK?Ff9ZKxo4YzUM=Kx^W`dch0+z@;;|f`*Ghk|1ob7)=!$95{SIg(cLRU_Nw&3T!e$0G1m;u?-e20i6n%4_b`?S6K`yk<)TOXADE^ z1}Q8C-`ojeK`j9fnSzePf%3t*1}q2_0M~R#8sK~k^Fe-sF8>5O0>V!Mb(dgffg%mu z4nk4@X{I0vfaf7VJ90rc|3I7$F$z?$LIxgC%!3R8fNNufSr8pXsfnQVhM=u~pu#X2 zx-1#Q2hGugECKEIhMd9(8lwXl3>qiQgbn7#mzHFLt^x!Vf}p*|B}t&W=)m^|fl^Xp zQGO|?0|g%8F3QhIg|-U8d~oZx614KQB(pOl)B2s*L{v?{s?)DuOv6?EG>iWK3dG6q|4c%$r3?pxx5oHhMg0cQZ1-ya=ise26?U8?=iC)Kg_B zC<5IX3raz`Ddnk9E+~BzrzV5i6G$RupgE$V)cE3Ja7(2q6*O1^tI&{npg|#q0;mYA zt%e~04opy8jHVFOwZ>GOmk;V~fgG3$UJM0N0cOO5mc@e?oq~p4L1Udo5EbCTX?P1B zDp(HImstTi?g>1&4CaFtMHa&jG%J8~o=!pk6%U~;|pi)Vhc?F;{7{)C~iw8Lc+|Gm{%gs+I1?~HSi57t~A(RJdGR7yP2!V1~Y7STs?rQKN^y18P zP;n0z1XXL$K|i<{_%anZ54DNVaoEMl{zXP(i4GOT>?=RpIVWeQ(6q(l>k*=T9jG>xicH)F3?T$$gV<< z9q^*GqEyg|GSIF`Q0|3t@(U`#HiA}?fO>9l4rI3;tSm_@$c2=1piADthm3+Qk4P&h z&IAocKo&xSw1Ufn_=5aYP>Te#MiL=dT!tc82AeDgsVD=DI;W);fe!D3C(AO>Vk%G} z3oe7e%0MTTK*xi?O{(}@(BUqi^^!%Ixrs%UkRSxF5-tK=LILXS=7T0NA-t57qSRtg zyQnz1D6;^v>K`lvI{d8wG*buRfksh^Ky?jdA2KLIfJ_73*9z{eCxW)Wft5m5PBK7F zlmT_VpaUMD8*-tdDVb?$pqoV!K|>p0O`r?~KI;U+D=Nwd?`}bJQ(7YAJ`QLC1UUeF zu@+I-UluhCy?&pz~BAPAaY}&H=3k2D_vr5ws&K1!@kI2d$?- zCV>{&!Wt+L4Vj?h2_eiP&?(#yLqR2WHYB}+wG}01=72^X!3sfbHP9^wd1?6&i?YE5 z5J(7WGw4qHoJ3H%&&(@<9M+wjpH~cO(t)dJ=sIeUX%N|*)H2YTGK2uQN`;Qn!z{^3 zO;1d&1a~{j<00n~K}J>~+8`&;6cnX`&YcE(BO7!M7N`>giYxFcG`N$%r(~hnS`5|# zvkR0fKxa;sq=L6OfrRrx89NU&IRjZ)P?U)f0asp``JfRXa7zND9<)CeG^CLNItL&T zECQX}DF>f}1G++@G&2Qs+a|cI0WW}qHWc!cQsG?aTu>263|u863P6MqXrKbrn=Z;v z1_w|wY&srU05m5L=9iQdf!4-BPn%&V00}~ySD*$WR3Ilcu_(R-bY>A)zB~oG`UAuR z?T>@r_W;(Nk{@4M3TnH7B|(F3WvR*WxtV#npg9LDf}lz{F(nr?s)s6D91lC#A8Igo z1}ZlZwkHRo8gg(l#G#-DH>jThUXK8hPOV5qa%vhVQRXMdr=@`Ijsq1>pqdzbJ}5{r zWVr-n)drNGnO9trm{*bsUXB41gPd9nu`vxfC_qapkWSixs0Za<&{db{=0Ls)d zk5qt-09~~QK8p=%C1^7TX#X5&SUDcN$u=_`G(!TF&M7Ujt%pz*jne0}<3n zgm!*GvLG&K79XM&%*zK2?tFEznF3bd7v*dbiqQB+w!PAqC1Ppd+KfE(8g~ zM|D8kpt2PJyHKOjnIsd{z1yX<@CCJUMLhw(rrKwJq@3F3i|!ABO#NlgTeX25hH zB@^&{Kk2C@phO1Mk)Mz3JFo)epa2ViY=K7&bVWaOTrVEdb%7XGoCF@EfpU^FK=Xqc z`Q^|RfFSo2gASoXO?{y5E4;=5aUkPJ5Yc< zvNH=HcWuM86y$&}=*R<~tp-`&0Jf0*7g2D4jypsN zPLKdn*@;|af~1f`7Q{!-Cm=CIxOI?{ z1#10OfTtoLNd+VfT3P^UXoIg&f{ua2Lq;+(^NJxg3P>fW#R(bq2M_Q=Z32mc%q;@- zrD2f)Ql6Tekq@mzKwK;aB81|T@=HqcA!Qs$ac*KtS!OYO^s)#(v;=WuE@;*~CmS}< z0TBe(WSQXBJVXFAO$}<(gM$cUDrDys8W*yG11<7Y5Y@9*S4w#b*J>#(mB3FyxICyI1>&T~gXVug zht7lUkOFPXgb09GAo<+<_;T>t5>WpSY;i$iI;bH9St=EuoK_6F5CSwHiy{u%9}}Ng zmJTulsv{RXyps>(ferzOE>woCsd<2Oe{U z_GiIobEH5{=0*_*_2x@KXG(xYK?@Q=*QJ2gJpb7yT7vTL! zV3R@D^MQsDp(?<#pu5dLrFnc(DQH3o+K&b0^3?c@{L(pFOs)w`z5PWE52N3`- z;sLEE0hNfzLOH34pwrTdGvkX&K+P_2K?im*5+AAwl2jo}9>Ge$0-$vcNNOPx;2jsm znULxc)FK6~FoN-sOelfw>w`@QgOospz}tfIE5YW$l!06b5hy7yMG0$|Z?lu)lM_L= z(-suNn4nd?kRpr$NiZ|77<4NLXvHPidvMiIi9Epm;y<`c%T*n_(}+nU|wnos3MAoNkTLtG=Xnr1-lf)iZ4nA-5-v| zj|bmRju3=gea%n+Ira}W371Gh9d89ofQD@=pe#tffohA-1l>1~ngUu_Sdt2E zZxn!5!Igk^?-yl*$DKior=iNhMu6(Y)FMzz6Pb&m0&+AyL^>NZa{y(6FS&)X^YTG^ zKT4py{G1dh3$z#@GcgCsLp2s0O;8yyJ3cQTJVyp{Z#HzP8;A|v5e8J zP+eeCp-m{zzOg)zHn?@=MWB{PDroa!Nh-=(LXbWb0oam1kh*lxO&w4Mco_mX*g`9h9-r#i7R%fP_J{WMVStTzS~yEs!X9 zbq2ydSh4`w1f4K}EV6{8^xO()=d%QIz7c4E6SM>tbix~GHUnL_C>1PP1YVI3YKjz> zf`;NtpaP&7T2Kmtatn&`Q%XT+AeR(@;sZ3&3SmJkhwKQ4_@FG8p#W6urh*2B5<%l$ z5FX@c!o-piB(aoK6dvTnYMAyEP|_;_Z;6DMkOG-7gULgCoe()N2f88&lm)>qf(U|# zv>>WLB}-K*Xz^(>xTpZD0!3?aWie=`2RdW`QH(AQs-(dMC01SWkOn#qt?)TZ6zmy%0IB_8RhZdMJLsUa}@x_ps1k0zUW`pKGAp@ZhRiG0Wz!?JUC}=wf+;o810hzJP12^emdO+=T zQ1SzXD3ZGTq7s-WYEVL^q7ZW6m18i&zZU51wpbygARNNZ4wAIvX> z9JUWji=g#b#c+x2)Jo8xY-S0fL@r7M=|D(8hMY=JgrSvPF{nLMQXF5Jmsw$H0UrVd z9e$dVnwSUnP$g_@7f2L5&JCFd05yC{D&ryZUrD8DX<)M|LG>T3;D>MuvP*Ko1E?jH zuo4BlrxBqF6z<5XKzz`i=FEJMM=L>z2)x{@q!Q**@Zb&91yILBHy?8oVWy zkhKR41u#~8Q9fwQp%l6*o}mE70I3IKvd=dCmh0+qx zTzV>GavdTMnm9`-Oafi(1d>JSPM4N|lRISY4K$tu){vP7O3AQL&&(?YjkcGT#DgY> zVXHPkTu>Lf2-GGuGlA#>3xF;`2PK4@l>7onVu92s&{+nEP;OpHJT!X2Bh}!QQD8&B zHvyKGfEPJ|%FS$uXmJ5(Yy`}PyA#BS2eoLbQj7B8QpMomDhL<4{~yXpfzkz_`5e$h ze`yKmHo`Jc%>lk60>%dwKH!Ehq+WyxWAdPz^^p~T$2=ewf$rV|>4^tTrGwOf_7*^B z=*|LY>cMgtPbsMP1)AspjUlCgQUxU7ic$-U;}a1JAwlXu^PHvNd;nS%SX=^62*srZ zpb{A*2Ri5iwn_rVhwd;bg_KF4aT?G9VFVX$4%ibAb3t1ZptJWNh2W#dAT9$%K2l;R zDUL75E`ew1l9I}J@WNei(3FBthlS`X1uc$B&r3~-Pf9g3gGeI@fzH7xEr~}~1x;=U zp`28>D)3#LpvhT~9`G6jh>69Zr5tHRpaqg3nUZ2y@`Lo1V2zy864019XbBvs?uBg+ zKobR}JFwd!69Z+?f$@@j&}ER2u|v>Kl*}~nh;$ifCnmTm%S#0>RRS;aFG>X+1fR-K zPzJp%y(}?4H7^-7+y(AnGZd5;#)DQOL6=+<6@v;Rus|wUE~&J*63hSZjk`r^1!FxJDkq;U}hN?}094HeH8W91ln<}X&gv*q{SVj2-P$uXWlG409&}tos z8^CojgqfRInUo6M#|4@QNlk%jD#!+{+Ra1dL3%Y1orO86Fxf(gpFoifI{poGpfFSo zss!kaU=#_^2q{io$dXuff?NQ;Iu653unbl`;7v!Rsh}oaGSqKS*QX!?40Npr=n6iF zxkaTge}d0+N=?s1=7ZMtLDWH_4wUgrisKVOwHG9dVwZ&ugfkRoro^Wff+RKU&x2Q{fcX#%P-B{e6p5_FX!=(JOaS;#`5!FH%>x3|i|}R8(3}0^{ey8D)tuW^sIOA(RcysKsE%gEstujtc>;$^1_MX8CP zN(o|AQF19{2pY;w1=V<|;Qg(jDRZbObT45k%sWu`K#sQnt&oJM1DyzjE(RKUg<1|` z#^-^0ArR$YetsTAHU&EA399))3tmCBZens_X=YI>OaVBdLCPUe3Idh&iI82g;Ne;D z(pRv_P??gVN(|MI{e*B6%Rvf2B{OIo5OQ55)P!QtxiO$6-Jtds_#R6%36M@u$p>)? zSUE@tW;9#?!);(0G`E4pP~8T}F~~+DL@>;RNTC@D5kxW-6sF*G26lI5Y6<8_JJ7^6 zsCAQQ1iFix0n7yTAHfU+7gQ>zmLd2RC<3`9Mo=m6(kZabPytwJ0E+E2P-N$qB!UY( z@E9O?o(8HCwC)nrb%Jm~`w+m6MR1dIQ{waUKsN;xf%0t*X#HJ&PG&wsQ6hLK9Ws(! zlnBxa$`O!eLQ!H$CitKf#CRiA2vqEWuNZ*jJ0wxakxUF2BA}Hpxv0X$$)MsKNo8t9 z37QD_3JY*^HYu|NSvP3p3Y;T~kwu}Wxgi+|I$!`a83<}!f-?}Z9OzVY&=?Ym5g}Wfp?xG7@RTuVg$}YI&?OZ}${;O*0?1YfWTjwFgM%1D6nw%A zk{KX>fnq;D8AT~*K`ZF$F$_Ua*kK5QiZgTxEY5-off|FzMigfhftIWxISLdgpuyv! zM9_kW;{3D{(6O#4Jkb6WNRrIW2c6LYofCp&fuclAK}h2rCIeO%pAEXLDI=wbp(rsg zB|jIG|3H1BBG8Q~X|M~kp>mKh7AOaz9d!OKR4ZunGAP|6aUtiQf=0t2qxhM5@t}bN z2q!-cRM>;kUtT(BM|W~=0Z1#D4L-OBbW16?jstDufsSM&iGk;cp~z%Y#SXO5pO^w_vge?sdn8GS3CQL`@?;`<5dqbM zl3(Cr*g^|pPH`z{+bnwC2KSDU0tJ*yK~uMA1uIAysM8G|#6@-^NIhnVfJ7nw!J6nm zOTR(s0NEgz7+wunk|JCm#1+{5kFEr>V2Fn+fw&seVHlAB)&Wgy7|NmI*wQChA8LID zu^p6(u!THK18AuTmRb#>84|^)6&RWf$T8?S0&F%^FLoayOA;^v6zN#7LWFciVrCv_u^{-o zSTwC*ImBtQU|De5DNZc}hXUxl$K(u9O;S_|mMsPyXkMBJ+Rau58gmBKhM=>^^S}cc zv0)OgTYx)8&QlFLA|G%)eh!Ny0pTf-C}=`H6C4Ae6aqTZ3Uv2g zK4dNmWH3k=vf2)n7Y`0cuvkfA5qzC!Q4-j{5LY6i5tQ9PYt_Mt4$J}9*h%25g~*u@ z4G0%P`MIejiSRIm?A0%3C`tm)<`sjl6^EU22g=XMrJ&6hsX3{j!8`C}U!cKK(6l>3 z2(c&vESCaVI1aiP42=)E?F@8%0azG3Zl6(F1gbJXwt)HInwbG1554pNp$t5>51Nt4 zERIhv0IN(+0&jeRPE{id!Dc=|=0R0K*1TbnfDA?^m&QXC=D|G+S*%)EnweUh3@S0e zQy36yKm)Cysf*O&VyFP98UY!S4?5x~6Czkp8V|jL2h4{ZP!3uJmX}-^Us{l#7hec5 zASEAktXOgeL?M(D4{-q~rorN=6$SC>1)!re;!{BTtU%sF5(7^oB$t9tNrov)%}W6- z??F>ooR4wC(s;1npn{Ob8bU4TdTa186A*cX1SEfB z7fne`ODzJG?T}Irp$X&(1P|ogc${iM9R+mb(On1OgVG&i3N@`JYd@{5| zg`K*VTvAa2UHt`iC{!CfY@me}OgWM`v{eHsIk3rR78N3g4MIslNd~0RlUxc~& z1W9m6rbGM)bq%;D0^YWWMHsYv9O88F*+GfL+2CRkTy%kzL%mQ0I$|1hxjbkscPdy0 zB$Nr>VhWnhgeGOMW$@$z=fx*MN^FDxc+(xkoK)Cy1JJTasM#PfNGd_7f$&j`f(oG- z1`{nvO$O~M0{IVYF;pC@HIOyy@t}o%2tDA%`Jlodv;Zo%G^YgW7`S**3Z!g?uF3}~ zg%#IOp~B*LG({j0XpxSjrWnPb(mZg|i$_rlUfmxLt`$o_GN9Fq5C`QIz%K6sua5?K z7#t*M<$Q5!I<)*jv`@eWAW5X8fExQ)M2l0?LCeg*W+Tjjv}MqggVH3V+(H%Gigakvfe^&u8c<5D#NtX&X@D(Yi&N9F3zvY_H(>@6Xp|k)7)XaSs6YiN z=mbj8Dzy|?ixDhXS_Em}CzqnOq(G9OW>tJ@MPf1}M}UN2ttu!R)|>)y^HR%^O$Igc z5p6_}0(e6U%mKCVp)pYiY6HPrN#Ifm)c61$6bovPKnoo#;-FQ3phg449MIYS@!6m& z#Gp+9sNX?0L5`S&#ZF~jGGu)pIGuxdDJ7r|9Vie$JVZGPZjOWZF~OBWhNECgLG2lc z^&pL)wI(T`v9DyvMf8yCwo^g*I4LI^lJZK5lHoH@;7S%+_=2iq(5^GEs-o01(C`Sz zWGEA{Y^f-@6eI?-8N>z;&On4gi`PLLZow?h7>W>=i-7L@1G%;YbZAR*Mk+`Sd)FdnUMsgE$DH4Z08%$(G#IT*zH(pi}0-HqNO-7FS8`GI5j0c4YX%5H61FPT8QNMVkj>jbTcjJNNupG=%S!T z8|YGCxCx-j9(*h(Tm;GE#i@nRN*8o+CtL-R7|1+O(FPu01UbC8G#7HtEc6;5h^CUv zc*yoXSkVPiS`OL?o>&r}2=3T}6()j5hQNcaNPNhK0FZwm^66;>@!*Sz5kk-rt<=Pn zB(O$Ma}SdKA-zkmU=D;t49TZLP6q?;KLpE_gUFnC@ZJv)vmidD64V<9Ez?Ua0!KP{ zQzvMt5Qvvl3ck7!ylW^WKQ}Qm4~HmdnR+oOtU+a7Di&?=sd=eI>6HvcSS8VQrht2) zX`u848jp-m$^ezLC7>J$<`-wCgX$-6S11)tB)$YR`kR`Znpp<9qN@nXPD^2cGK;{y zKJbMb;DberQj;@5;{c#_N||MuDPVhGBB0%*V1b;(%v|vFIAjADc!O7BQEDP6NRq*l zpxwlI;EY%d>AZnPHb9nwWx>%5*(C$JMi?X?pPrMS1RD5D1sjrD1iJbGJR$@+O90aG z2A{(LJzb!ntu;N_rjLqJ2);ItHu(q?4aV2p(qu> zL7Iw$iGpW1|;g=kpymatXeM|m9I6;- z84q}52Id^_$U71Ti}OKw6=4b_{-6#6wJ6{->@ZV6lVpeqH<&2saNzjj#FA3bcpb>N z6wtN6pbZD0!$@;-;^B9zf~yjc3eZ>%+V&)f22THu9$2np~Kb5M&2T*eh=JC004T~ql>k%}IzkC*GJ{X{ zE6E4#Z3mU~m&8g2#X$V<4XAe|^-1Xm57uLEso%P9qoIF=+PXM>D}2p5A2EQo!e9o3+6 z0nssso|XiX0Ihs3u0rSoby`xvTl+wV^?;6!$;&T+Y>O&NO$Y5uO$0X&VGV1LPK0P? zF}S}26HF@2$%c+rL-c|L;2r?!OHKq`2we^vCx<8l4=h4%oQW?1bzfixg0AjMEQvQX zi%$ZTQ(*T%#f*(G#Vla@KuHI3!Uaqu(`;rHUhPwAprpDkY|GCWFd}=hm1Ob3q`Og zkVA$I&EoT*%UvPbAi^ji0TF@+1caNJ2b z7XaPf2b%j&O$SY=f!5W4j?*gzr*}|rfzmR(!V89V!Ez zaR9jiRRol}K)aa{N>lR^q1R%T6oHz9Fe6gIBM3+)Km;%iK#VqE%7OAmdce}lL~F`fkkpN(?QiN_>3gbeGib1I`mXC(8kyTP;vq#i`-Pm zASNXBFhDDF=t^Q}{svu|0FwaSQwp*WJpB#bU6lfwx2yzrI^#hj3dI?q_2W>Dwv-Jsxh$e-%G3fI7c+em;_!vgW*%*++0$^%Dn^)pf3c(2kO{^50NWf-i z6oDH0pf(kl3vQ`{Mm;iMS~By?5@BrUr~sS`PU@hO96?tnK-~aI|4>0t(g2$asp!B= zu&2RY69^Y{crA(}LE|zoE6Q@?LA@aa7w#7D=nHrw9YYalh75ejN<3)PBQFIs)0mkK zDic9`$mDu_PAX_Zg8{mg34ZDYIPbtkAzO)33vyCHrw_)b<*Lzioi}nI_m~xH;4<`AOy~_3`MDh@#%>L z@t}RE@wur*phXiyb@%wRM1fl1x4Udox*rXAS;7Ni!&g9JgNWk}rzh#;ibQ3z@Y=jJ9urhei?16fp@9S=zjpmV;V#uR7AgNNr*3yZU%W+kS8&SisW1xF~vOsEME5$JF)k}l9% zI3#C4l!1qSkrYAFB#KE8Ay9N7TmU_-2jT=!egGW-3*M_;3_5`Ww2}w3=N-%`f|Z|; zsR_i00fY}umWg@A<)8sWkfzd9&^9ITCSu5;svy^Zc6!FAfx47%9ysSAc=>Qf%W}C`48Nk16>VUoCzxDU@DVK zi;BS`a$q%JPJCKsDx?nx5`(3ilpNSV0a!FQJ|nX{5xgT2w7Mb{BnYaJ;vpxqf*cM$ z#Iyu#8?shVtb&6hKc@_Iwkc>?R6J-XKeZSv0;+Prxi3BqwAH&P6?VmMW)-NF0ppc` zuW5zLf-h!-4&}us=9Iug418{5Qe{ah*vDWV$_+X&J!l8qz=T1EQDlNvp@BjltQ+}8 z9hfT6v~^Bu8mK^lo(h>*20F$(GaWk6heZ@L=?h+&k_wf~OiwFH%mw=qY!T>|9vrR$ zg%Nn=59s_H&~81D>q>J|!P^i)y~0%R2pdCDD(GgHcu3m>%qs%5O~FSmr@-&x1`U~l zF7*Xn{hOK$3McR-zqy$u#o)2clz2!k1Wm4|f?81^H-cNepbiDZ52eMRmNL97XDCW7 zErt}ipfx4Q8S&5-2}~5UoFX|t4?N(AAqJUZhMNG=3R`*zIp70)j~l$IE(0xc zlv~gLnJ;8yowH8A?ScFkYhoYup;S!l!P!nC7|URndy0; z1Ogrj&j4lUAC1r_4U~YO*etCRi5~#UiXkdUYWNwNs0=kI> zWD|Ha8{`GhNNon_AT-FiV;~{0p6pccaih z5800!pOl)DUmkA^aSfzR&j8BNu%Zh*DFQ7vKttG&bI?HTA;`)6D2hQA$AgL-(4n=+ zrhqn#Lrel+w2Ca12fo;*q!L`(7NZyk8IlE;W}qMd)gMSs09Tqwd{B7?YEI-9#3v@9 z8U*ndyr+Pq2{eognybppOHTq#FM*C80{b=|G|~eV1+{c@K?Gh8t8K`hP`0}n&$ni=rwUDC%QF!s7 z!90)|pac!0K{F7@Y=|ogAx(ZzWe1YXPlJ%4{t0Lad|`Zk8t8yOD7y&M0RkU3TT}?T z)D4=S3gbZs_<&L!xLW|>f>t$v39hae46(79ppiA6=A8w`sIp{p^$f+?w>&LGHoB$e?%88mF1 zUj$MDDb^4ySV%#{K|E-?2%-exjuNwYP~~g`o&80~IL-3qeQl zO3WZtJ!o-QCg_kskaDnGd>*K_2djk~!v{fNzEZSqHxA1x+U?v1WpnQN$;g z7MJAbf?Xe8u$WaJEV%NnQ+ z59U{tWPrNAAa(}0K+gp&Yz6Dj%ZLXbZ=MQ^dPoq0N3XyNpiLpTJXS$iWE6ug0D*)v zSY2^y4(J$ZP{4uuBcRxah(n{x2poH0q0&5PhX_>jfF`pTK-(=+QsPl0K!RX(kkeQZ zTv$9pHdlZ~e=}3SvY^9O;z9GTpb;UE2q+ms$AU}1X)+mn**&P&h;&XVD65ymr>EwD zE~x>fQqcX9Anm9^peTl_LRA2|eiEb{G`?F=0L>(zR0ZB31rH*S2;|Ndgb;WH9(27; zX>mz>K_ql(@Ij4 zLEBFfQy@hcOdGsRLK8r7IeaM*Oc7K7MG?5u4{u|`RDyCZXz~)&K|r_()LQ|KCxB~3 zm{L&Y1r6|2RDz3jQ0oFk3e^a(YKR#Kb5Z>U?K;B@0dqme7lKaLDuRiEP6>yU+@RZe zQG_AoFT(T!(3~S^aR;hO(2<`Q{stHODC$5t2#7-R}k%pg1fk^mi9SsaheGEk#D zz7SRzKzxW0gSH!Bc7i2J3*rkwrh}GPLdrbQ`X$)ezeOcTJkUiYnaPzP)v)3Ll41(- zbD-jo!9(bp?s)LY#;`O5ZcE35j~WIEflAGI#KnX0pvoLF3{V1MLl1g{G*ZAK`DyW> zCP_(radLhEsGf>125nb_#AR`6d{I$+UQs;gJ{<6(n-Xw^kK`+GVkk>3f|Y6@M}WKn zqT|y*0|m*61&PU^^IoBcF+)WQO2NwVi;Y0OD}pM3#sjFLjZZBsg`@&xK}ega1a#>y zs9H(}k3*Q5fQCLxav6$BlH*Hq!JN$8R8XIw1QJ`InM1^tLPaHcsU_eYYv4Kuywsin zAqZ;G=BAbuWrBu0;7Y-JHj#Ot)i5AkIgpwQbl751Ngjj;+As@ZgGvpMMG$qFkZls+ z=*`Ok7Y+~!(1B2CiMg3Mpk$Dj12P#jZWW)M2^!c08I%W_$%o2<+y}0FKuraR0q}&L z57|ry-V*}4iUD-WbY@W@c+>~H@QI-aG@1ihVhTMn4Dim+Dik<3duR3y)Z@P z#i_X{8sTf8V2hO?3zCpbfvW(oIVz7YOD)PwtAtLiKu#_MExrX$G%dK5`o_Jk&;?~MGidFg-aYmCurdZT8;wSk5bV?L_l>mxI~0x zVyG13e@Fwye7)FSX&hhh{F&?+gI zWuV0kpmPa8$pWgV2pm|T*;McXnRPp)Hwk$-X2znGhDAQ&`Ee6${;0Ol`#+T-SD-l?d0mT+nAw&_Z zRxM6UOO4M+ECO8%n;j1sZf5{p))HS_lnh~jyqK5*xnT<=Qjn7hYFUEv3}|?vI596Z zJ}m_@LJA(2fGh#7N{xpO?B^t=7c;;FQy?cbg1ME@o*sOb1Tq?{OK@5TE z!lF12eAXc7j09Ar#i{9#yTywWi{p!np^**cfQAxF7(g9<@Tg)5xHv%_Z-+|4N5LVg z!LtsKp42B`%#fuWws1kVhlf>SftQ%G|8iJ&P& z6f+=$Oi0Qzi{nAN4pPfNH|BwEe+7+h#6!=;1=$52?f_4`gC-t|lj6bI7E9=^P^iY_QFagl6SJ3iuWR;+}0~M|avHYU=)I`wC zN-8J`K^y@Zr-YdXiv8jYaHfQ7DuCPq18O><7zP^DhUo(r6W~efBDg+?7&a3jGDYBJ z+Mwk;kP;cXPa4%oP>}-~gG4hGEL>Uu7X_7!$e{u*?vMo_1A5>l2lxUrm@Sa0ABN(j zLdfh0Yyl6bsznIGcp(3SW+oVlljA{4X$vy*KvP-Z_2A$k6$S_s)U1LxZXrUTGXP-C zU62T9U>|;aKztf_zB(^CGqo6U;b1YSB29+Ot%4hLAd~Yz>Qdvu9e&WlHn5_+M9`#Z zdMZQ#$W@@*zd+SuNij&Qq$ITnG-@B82;KTtoSX<3OU?nE@qr>zR9R4x5ACNTOMu1~ zQOrwAD^EcY0IfSi)&a^nC<;IV7{-7EK{NlzI>FhDp*T4sJ|(jV)TyrkEt>-IA^X?k zQ`157;b0X|k<2`}P-;qiVsT|INEXTj#d~sM0qkggaK{y_2DBj+v^57J0y{<=wyyzI z6r9sQLo=WjG!7~7btzDbVWz?Lfh9ps!KR?NC>d5cg1X=EwSQpUAjzUaG;MjQ<)Gy% zXrdU(V5?bBU0edW?Ga5gG?#$Oe^Ahsr4}Wor-G6Z=!R|B1)QKMc8F=<`xc;PfZ0gC zgYfh6LAL`Hp{N1PM8O0==PiILHaNd16+C}{WKc?KQfWF=J|zb{PzD~zhd3c62iye( z_gkSN;9V)8DZf0ZF33g`*qu$Nf}n{Rh`!W{)MTg}XqFe$Kx5$0&OOACBJgF5p!zkn2(<7WDq4ab%pgCeWv1oFgXU@=ii%T95>W#aBvMiW zOI5|GC18c6IjPu$K*tV%rnI1r1zo<0#Domdfc3|Nt{cN}PiazaW(l~H4AoVVnVbz{ zg04e_Eh2)L0nI|tA|9#^DhTZXgB60t&0vgpq$Cbnn~!`+0mKB5C}go8xOD?cdniKC zm5y)&;c6ig&~7ta8kCw427^jqum|JQplK0gHhcp=`LEUx~M?nQZ zcR7I0DhFMmkO?|O4Q@Lq7~uMg;xh{}8H$s0q0L;#nhX#>CAGMuC?Ax6K=-zQ*`V9a zK@I^4fbJHIPfGz6PPy@E1>jvsU~@n%%i`2z@FXzE9MFV5OdaSv3UDsZjW5VdNdp~} zkX#1VRg{Xv056AuIX7BA_Azw5|r!769*qFHVN+(gc-5p#5U0pjsWgGCHL)FEKY0A`Tj` zhc%>=i$PTwXptlXNHc6?yf_(j$1?bW*J8*OXrOQ^&IB)&fYi328albT$us9S_)1Pyxt=!l2***$dWJnunw+vlx_}K{jO;7l3A+;*)bhQ4bQy zO$0Tjpn7u?;~^K4LQDs(iiNWv1siCUGFS-I(E>N=ic27xL3IIWn^k^pZekwPbkIu6 zc+}_trHGuQM2H>`rzjP4i6hudXhR2FlE)V%<`#hNIE2Wch9o#(!84ekPC**v<{^Z_ zl*}~vm4*mWkY%8SrVy*aMu4_@q=GjFLPH%a3bj8qF$F3Lo}~aCjRp4@NF*~cC$lOQ zbpJfq4)Bd-;1rMvi`dNK`0|`mXe{Rzg8Gx76(8X42q-?GLPdp8(fE@5>{NtuP^FVp znu4qxRCnM~UYZAT6(VZ$@*xQv9@nsL4w68ANqlj7Jb1ezBv_z+hbC#z*e65;ym<%_r?OHflQ*sX}jElw>dErQWj1t)jt08V^f zX>JmzvP}W?dg8%rGr%idGfO~o0mabkuAy{1JaK>)or3(CSOUKD2jWwhAmpGQR54JN zhdKmJqTJ9R9#sg^4F@fW2HjH+4n)w@EF{`t`3@X4km@fLsj5$fuG2#ig7pnk6LX-I z6W9ud;?%^VPYE(WjupbiBUYM|k${5;5wYH;-+39#YdaYTe`AkhY@ z%0ab1)D*}Vad8P~93sCQZbnXiI-Cu@p0^lu|14_IgQmkk`&2;V^_eMf<*-14cm+ck zyi^xW4pi7cgb=O;l_8+pT+xFME)HE{0Si|22mp=1gC-Us-Ko@M&|o>}rsHDJ$N`iK z9oI}vE=nx{t=WU^A}LNy2F-|qkBCjo1G@8})0hNObd0Eq`JS%`=1)F{YE%}p&z%z>!|tzW<)Rgw%oOb@0K z#4Q0I{DdR|J~OotRRCF0W(jEg4!j)&ytEmTjv(sM432@^F-30J1!NihOaL{7vsQ``e7RRTgCTA9d8yg7yd7v{B;z5_$ zfo3`(84?m(;CsI+NUi*q0=Q$LQbnMCB*I3}^cJWBOiV^fBoL*b zaVzk^3WjQ!nTWuF>j2M8p^Jl?UAQ!%NJ18o!<5EDjK$^;Q1ch7UAfsQnJBRV@?mav zUOu?Sg+x8XSkOFqe0F9|4rqNhx|6Y`QHVD12pA;X<4bZ2K#2}RGbkN{Dqbw13f2xE zvqBA8m>gD*fttVALZT=Yv{oG52}QYBf&qtMly6MHKC0N~9T$zi_iO^kn zh-fVaZ|6xZi3cx)K$s3~(1ODO4}uH?LBk5Nw+P&ztVAdUH(O9@ z6Ii-gr4L+U&Hdzer(IJ@vkpz>uNC5+$SWQMQ=b?ooXj@WpNd>|L&>m87po3bW zu(lpJxZ;bG&?^wo{4w|jScHDiL~>$Dd`@vLbQT!qZqN)dO4(AJ6c36o=xI{$UHH@jCxTGi* zxuQm>0I_fx50V4j#DVT%P(=b7NrDF<#1G&i2!}^Nqrjl+7toCY6$9ACOK{mvlW5HXuvl7V1!$>3I&!-aMWQIbv;ZmdAj_3v zYC_4@V6~v=!ZaP!ScT3;Al1NN4WMck;YYAgK@m!U1r{q#Edg&YgNH0kv;fn#;?xqz z{xmdmLDd!xSCr&KS`x;*!inG7mu!2+OBNbo>BcnLJrQixzdDa<%9zc@1~2RyC{-m3x{ zd`$#jr~#T%f++;&8qjnxL=BW1p8`r!VC!Hapt)@{O`yFo#i==&d8HNLQa`l_l4RjS z9+*;~5e@i=2X<*_qY5es9`As&p~D?8KGq=&OiAPs3}jiz7zJo;6L<J!8W1w<`; zfCA2ij88zh`FVMud=Cm5a6o|CXeb=e1O=>P4%Gwdu0z{&aHZ&-b%@fG)RNR9@D4Ue zk0K{ADHR+wV7pL)3dDi5%0MkSaIp_J94rUx-a||V3&Fbb=t78|JdzBkX^d(jQa>I^ z9kd&dB!bdILJ~)G)}ex+bBT}|cTiDKOA9h$0y(g(0NVS8NT-84+n|mqv=jgb4XD~F zg16-$DiQr@)b2LAETXrKEQ8e9h6!ha&iTo#0{7WrVxS!~uuK7oGjO$w87B})c)I~f ze>`fZ97P5cLa-_i9vKj$KtTZMMI!4!bj{I3ahn3`uOVwd>3XACj3O7Gml?rYnLll75K0zE* zk`G(F4pI)PJmQNp(@ToLt(v?PP!$c{XbC+f9&~F;5^QZ`DrkXM8l=a=0G26Di-(@w z1U?`QCI;FPk(LSSKSOjtH_brxgBBSfNrD>DNu{7kc8Fros!-Tk2e2O?!k{KE+)_}p z0l_KC%qv0YFDM01Btmq7ifNc(a1F(v1<6pylp%R889WeM2rB2myBJan01fXK#zUB(aUZbRP%g~)v=s3AZBX3}mIl{@pgT1{rXc$oi;puvQ4iS$ zT##A>-p7zy7!MHz@3{a~s4(H2;?&e^uoZB-K#X|M)EQ(nr7*rA5j4dHqDw$SP!L8u z=#V6^Mx;;xE!P80$>)O75vb=|2s%mIb z)Pw?^UITRusCN(#x}_BC251`tnT_HF&`NDcxMRd>acT*|e#pA<)I#L>39zBaaSa}B zVkk~60=1aHBUsQ&K|q@VOTkScOeyH;M<8vW)v2IfGGwU)=1PVl>a()U_Nm6EBS}rJSg60k2G-w}OX+cST3M9RN<%%IO2wx5f+ItT=L;$qrkOAag z@T$1f6p(m%Vm73o0$M1Xl2REDxnmcssx%EW1_fSu2`@82%D}>qwP>K7UJwsKixcqO z6c9@w+CfbnPzr`?%t}J%V(0;_fC85wa7~~KSdmT5O9c&B!lgl{7$8fdh6uzV;62@$ zsK$a5Q+#GV=$h$#&{%W{WNBVXJf!am;^rk5fr{>u_~h(@64;JZ&^%2}esL-&2%((^ z(6no5G3e|~(2_K;Ym#$8+jT)nA9Ot}=oU!GkOzpDTaXCd!CDMGj}jE-pw(I6)5AbV z+(FF9&n*D$!~#{^ptUuqf_bUsNGT6g^<;w9jzhhIxSS7cc0p-;aSG^Ayb{nIEudB5 zAa5Xxg2qB278I01*2#lzGXj>pd0-W zi*!M@Lv9pj};~lPoEG0@EP2x-~&A}i$T{7K*A^&e4`X>B}7SlZf-ni3nxTR9_T>KM9`UL zAg6+dNWcjZoCF|V$}LHaPX-WqVM`09tFG0x40z zTK-y-4dxKkVXW!r4629Ko)@KJg^C1HSny95CUytM==Mq`wHSJ@N{HJ zJm_9CPy?g{GT8wgD}wS;lG5S12y%@tX#5s@Y6$2`OfwURQJ@9Hm59n0q`3q%s}5<= zLevz2?-c@_rw!Vf2&-`N^Ps2Qfcy^QfZ9i(c{tE1J(=lY57I*ptJtL zMuT@&feRS~7g3*pWx-tVX$uG?py(?}Oa~o439=ll4sz}TDi`U1?!;nf83}yCq09~1a6h0s>xP=KhQvz&5Q3`llDyWQr1`AZAv?LR>4F+O3Xeo6O=!|F7 z!UlBkA?S+uv^rMbDV_5^4nIp{E*f^>-EA?Xpkyc7t^}uyEd`EmLR2F*9Dx@8NFabQV2~$!C zx*ZA9hyYs#IY9%|@ytz32knsq83vkd%ZHSPkSz!Csl`w|C^z##?8r%qFHK5@oY)6H z;~EsC;2})#SU0G?L1aRZIHYVUDbB`Bav(vdwV?D4wgl8GhBF{X>Vj+l34<PX>iZ4wm z03A=4SP&07G^-dg;{x5g3FROrRKe3Rp#D~APD(uZ@Y!O>kPa4!(##ZOxw14ArDbWL z(QuGc(m?&p640K|T-5XELGwKM$=Ue@psFl2r8pjRVi!n9X+b>bP7hE)2M)*50&v9) z@&;@H0O)LP$PO-WjS8A%0G}O>5Q8MfO7=SE{N7w`_Hi|1jJy@`>NfsU7f>MSaWha3+NaYr%iw0Kl*d`@B|cmprk z_TrqxB-nmrh(JM3Ca9MPuEwC1V`%~CIv4Qv(lT&$2${$N4e>A(gZ45MWkVZ$pflt^ z2kV0tXQzYneKKsv5(*b`-~_1fL=^^~%moelblC1D5T60GISz70PdY?1Tnx_W(5|zz26gRD;Ef%QN#!a*|+bK|4K*ve8w8+Pnz& zBX|%OK%AeM3qAQE1!NXzfC+pS4X7SW2hXN}b{E5?pqsnWL5CqF!~ByCG8v>K8*)hv zhzWKi=+5Heba3MfBnArz5DnX>m>yq{QCSR@1!rzhEWvp&bHVu@v|*(JBn2vlz++|U zpe1DB@&qId4FZUrsU_gPe@3E_sabqtQ7-6UJN=WVkMJt$x>~*jJs67U?1~kZv97AwEL6Sk(g6qC2u=%-i)#^c z>|hyCUW-oy4QqlI|3G~K7DaXkmX3=W!1=h@CI9$GhhJ)iU`Od_)w34Mz)JV^Hfki==$*F z5@_ELY#ijIE0n|vYMX&>=>dBVsu5HSgQEeQdouH2<9=W>piL#1(u{min+SFt7FZWT zsvNO=9-c#KBwtA&qdD5V$akPXyoG029l|&&w|YpZs5$mkbkxoGw|F8V@?$3nmEf%|h%2 zUr_))m;uz{KoSGxDVQFxqU^-t#Ju=|{7mrh0Fp|GL}?zHR1T<_51I=F74I;UK!-w> zwQgfjU(8d>#^$;#(iVvC|WfEocl6B_I=Q1Jk2 zZskDgvix%J=o;uu5wHwIJ!H5CWM^4oPJA|~6_#HfUzS#!n^yu+0bwKgs4O=TdSw!5 z%qA_ff&nr#0h^lwO;W;yQXn%qpi#9_@K7h31nA@&uti0gdD+nURLF(uP&2{F4@CrA zFo5$lq+JAxAegC{d7xSNvQ!iep!@(+fb6!MqS7+ZVL};TyK@usDq*T1L#hyQ5F0Yx z1`2(!Qbd8tL99Fz|#LO?n} z$IybeZ-DIw9bFD?1j1U5P$i%w2|Di_bY^~P3e?!tB8V;M=H;g5Ca1?k?pZ)61+P$q zSpvVI8xro|CFJ0%pAhOx^FSR*Py-W94Aj6u6M~lZrD#Dr8@Y55Grkd^fD@ID$taVF@{S%`~@85u$2Cig5El$t@40-7=6LV6_K+P4< zW_oDF1kn#$y@<>M_Y^_5k3x-voEic%3BrT!L4#<63W2RgQwA0TZ9o9+NrS4+OfdrO zg9mTfM->7`Yi2rRnJB2&ieSfQri0GSNnt3?Oh;jZ$KjA9LAfYD547X~G?AE?lnK(2 zn34isai5uqm4PLTb5kLw+CZi}!SR<^mI{)~iwBSP zrhujuGSl-Cb3oTZW|pObXJH@$@MGXmxZsi%VnkvNs38G4WDYba2=+3_C~(sibX5*q z9sGDxh*?lBidktX;88P>kH8L0%t=d$huw4mncYYO%@&qqrd1*ofF?K)JW$~So(w}4 z0$<{b5CGQ%u<8&L!zIv&$S;D$LP1e}GAybf1L)wM7|09=7m~j-(~Ap0V({e-nV|Ea zK!f@4{W(yPl9D3mkpM^nAjdKkqX@v93N{Bc_ymeFNCyp~E(J9A1=9p>YJ;;?JZLEo zL7gQZ6{lH9z3c<=qh&phi7!=Q7vmoc1ffE#%5AqSX z2!pP6f*A$hi3BNeL6epcmLN%%6y=rVgVxKyWI=rJN*lO9 zNq%V#%--UXA`lnO2M?M+b26ly06QC57~}<*c2secxIvbJBpgwrLHt~B6oR@88K6csNT?(~zAP~w)L;gi0a{m4RGbXj z<(v)bVW$?9fbT2;Rs0Bn%;NYoaOyw^L6UO{Lvc39J>W|%!P`-x+{`>s5tEV%lLxhR zklElH96@>^m3}tN0Lb7!cytwX5l(&qNE2vzALv*<&;^-rf%M{hupIcTbMS%A*`Ouy zd8y#mI#?<{H#a{I)QSdOc@7cDD+ZtB0`g5fXudidvSSid{(=;Mt`q<{6LSo}_25Dx8*)7p=nN~cOfhKj40r?# z#s#Ndh_dwJd~nYM6umHM&^SN|j04UZ+3~5M!~~iR%m($=A#F0y4p8t)8}Mq3Y{<|+ zd=dD%RFHPa(NG9hd`VFz=w3f?K!O*Pz``D^26Pfl3b@Gxo+bq!Mw$(3A(ST;fySnC z@{>Uk4poaJ2=xvmmu7=oX3%?qAkhNWQJRxe3|;}A4capYULg)D;=#!XG?-MBo0@9? zQVHUeBXK~wz>AT=$I3$|iL=3H%q1p6n@kWcbg2b$kbpuBlAts5lJj%HeWrp^=)rCv z+d#!Ns7aCwYCLAggEv`##X)67DmWHEx8S5Era+pI*`P6bL1sK?NkcYx9v~jdkI&BoHOJ5dp-CV&8J-J319iz6ps^dU ziK)5Z@%dsH2RdPj#sv+MgX)cJkPAWglOY=buARZBallLg`2j4NSON(_Xz;?tV2J@k zytp(8WHqFG&4w)00EIJH5R?u;4JCvytUv(wywZvi(?ROs9ME!uOi+E54N5cF@sK(d ztRyuR#*I$`9XpPqA|8Aac{aE^18WUJd60R{JdjJk<`m_F=EOkf;XoCDf){+{DL5<& zKq(Nc5X1nbUIYi+F3yezD}f%T2yU2yRDh3G0L?1FikPD0GH}}mQKW)%I=Ba21lEyS zk^$Lt za3FxKfQdkp8C*pvcx()$1T+WZvZK%2;l^Yg%yxL^gKfhI5myd49wDk>S2`amm!u}gpt;RoF=0@}TetOL{tiAOZ9 zvLQ`u(26o}NW-=k27y`chmBtx!tyKqVixl98|2MCS9-yI8&s+iW9I9Qfh{tMgvN@pdJzfDCHy; z6(v@JvNq^gafnDsd`WUV{J{V0B+xJ(C@aQ82VTLWA0T1SNMccbelA!WsC|)~pO}+c z3=YDic#r^iVhthF*+p=zNVP;~)4wm2Jl5leAtE?hLe6x5AH(GK2kgen4UL?Rmi z7DAM7Nzf(RDXBT2PGu#yn1C1pZuo#^&~ri64oD$*^ax}a=u$|~1V8j#Shx^q3>#X5 zLDhq5-Xzc(-4xL2v=D>y^FUYef)->z`305W8Np{IoRC5-g-B0Ew4^GFWPHF?eNDb`r#@(!8S7G_YPont_ejgVdyg6Dm{zm>mx} z_8cUc5AJ$H3_^ArXjUQ>vZNQH6EtrP(f}@_!L9EkaDx$4P{UM!T3yft3A$V&vp60! z!~%6&aS60Sf#?I3xd>U%iYIs#3Aya2AU_jy<~rEy)I3n$2Ct2Wr-sy`B8X=SN{c{O zhGZv!1~x!-G(<~93FQ1wI1h4Y2UHoP283t<6%L>#Q&M~y_;ymzN{LFaHpqRrkkdjT zD}u5?HwoqBfEzC0No|Na(0O$!nZ?DR1u%)A)9b*cPf|SSh$_%2#9#?9Cp#6iq5)(K zvL3ipd{SaDXx$f@g8ZU**g?oJ8Bl{WGdZ^)z9cyl;Rta358)O;+xhW%=pKN}fSW4_ zkAcKNkp^06oL`18B@c@Lq##WKXIfBdN2tzEOM@1Q2w89{Lnr~+i^@Y&087!Jb``W! z3-UL}fuJr2s`+3MNHYLxBSZw;o`Z@YG6~2?&|TW_rZGrGYAQGjfXV`>yHY`8wcth_ zR30?44VHuS8^D)FfpY+KvnF~C630f%&YS}=9Kv4>v=71^!T}6EA5u_Igsc)bn$Yl~l2z(STs4RmwJCnd=IV@B_s^HajMmePRgSZ@gDK+GD z8gL+hl!C^nvy(ubwbY^_NCOV+{>}7Iw-gR zbPjPM=!%c*q#`WG8_G5>$-Bh7^*({WnN!40IP+GRP^Q zD1*muZelXnV5sX6TzJGG36+CxoCCMJA%-Cp`;b0nehFx^52)`6b|`2^5~wbQv@1}B zQlPaGTn#MP;R3K?0oqdqYX_a23E$?QodjO;S{#oW2(Xlg6e*}eaIe9Hk^BJ@0v#!v zpPUaGX-SIDgJswJqJj+2O*z>~@en3BVM5XbvOs)M1=zVzG3cTVh)`K-QG7vS9<-(a zCundcC`tuYSzt9_K}4|!;=)1))DwcJ0d9bWME_iRMdpdc+b6}Ds#v^O5k1vOwx z;NB|8FNjCPF2vOQ;u7%ny+xn~7?MzNMm&;G0odQ5jxt0EXvJr8Win{r4#+;}Rc)Z@ zQbfxZd{a91JcAP0AnPHff;tkgCGQ|(L3|`ffO1F`c)T5QI{;WoF{IpvwGlw8Vn8Vn zYG4U;9b0x1B!k9-+Ut<^0;JFd^TC69;Cp;QB??3Wl$a2?3L*w7c@m+?7$O3TB{&b8 zQHVwlL>ZV5?V5t!2@x(X$jO8re1RznY6YS@2P6hoS(F5t7K{g*3lT_7&M!&<^=H6F z!^Fx^D^BR3GpM@+RRJD72P;Am0EY#1@*Ui%E>0~1%_l(FCGn8r5u^;fy&Eo$me|0J zH*gAsg&RZ!mIomQK&=K9)J4e6T8LVZr$H-A;O$MQFlbRIdeK}|Vg}t!4ssEAnGwWr zSU0r@98S>oUvY9#X;OSaBB-AaRt7pE60&e2I|-!>1vw3~&x9&kS&$l^R0*n=lC#01 za3CW}a5h3fn$a58AR$oa80wZ1a3clM`vDIwLkz?cb|8)L5)8xv?;nVV)IbP+adtfD z0#&&25LJ*C4oDTKG>k5Scu1+hgQWO@=* zS7zpd&f9`^M8T~E*tsvDc*%h5Ndq%8L3`doEbx$NK~ZX2Y6<8p1c)EAGeHe-$U(s1 z=}C}ENT!2#H9?sW(!T(+;xqG#LDvHzrA&x;UOsXy3cem5JhTb1sU$N8wD}ow*AOBL zVuT1t0N&z&aX{O~;Q0%5(>BC%cqN81W#yS^nem|Pp8_!ttQ1_~AXrE(8?X%cr04V^(Dlx_iFt|O zy>r<~@en!ah%}6gsQ}dILoyrI0D|ZS<&3=i(!?UrXmt{}A_G@`h=2vn+JS{Y!yd5H zY_pRy3o<~nH;Dz%06`J}--`@W0cuRdr$H(-s2b?eb)YICAC#gBit<520%)?JK{8Mq z2wfO50EQ+C@&;%ZGUS?InB6doz_OtIEDXiiq)O6217lDVL3>f5>lI*X!9w8M5fS>q zV&Ln6QB;9^i>3%>C7N(qCTNo=sI*8d$pT%%Pau(!aLB|n*gbETrXq!c8I+>Qo|f%{n?7Wigg zOif^6bX}!+2)9EEDp0tA!U*D_^29t)n<*3Ac>=o*i#SLN1L!o{_{6g0_{7o_&{k6L zI8b#)TAqB z04>!l22IaHRwRNKX@YtnAfeJ+@I}c`HJ}}_;6+_9en~25su&dZ5M3py@frD`P5}xR z)F;gbE%}6tLYHTQ`9=Al^`Ov&H^?H;<|#vQZgO&Rd`VFrXel7*td(5Q98XRT{3IfV zVsw#s$f`)J!l1FA6f9amvov6*qnRELkpSJ>3tBD>GP5Wjbo3nfWQAPNjX$7siAq4L z333aP^7BD^pNq1=n~EW>MHd4Fc?n_-b8bm|8EEu1uQ;~^v{?~+UUpt$L2*WY38=@F zSegS`IFtvv+q4LLPa6E_F_;)=Qwd~*07V3{jDn#UCJ3!mLEMs@_@vUzoRs*?{IoQP zijti8WY9D`WNjBz5ooywxD5?HRspUMEDTD}*o47z@W}c>Gi9h+K_XbRB0IPw2fWq< zI?a!&9W>RDibV*`$lQVw&?fxE6iDX}t^qW<3{9v|XM#mQ&2(gbUTH3p5GW&|1Qtvn zGo=DRW=YFTO?G?}G==hwjHI@lfH zv3<}oYw%LzJkUwQCE(k1Atf!i3yrEUC9@1w0E-$>>OoZmUQmQ=d~Rt@N@iI$hN^4~ z^Yg&7Q^JMV8tLF zXch{5HwH`#BE&#z1dvTyPcu?chLD7N3`&2f6AIT>{BLU}GRR z6oN7Vc+wrA95jOq=Rr?#0v!!mTnx4phZL;hhq^L3F((-`I14)E4lYzs0vg6jM6n<_ z5h9A>Wzbm$`FXJALQwtS4cqaM<)v_;93%@;Qo$D#V|od+5gFn*8&v5IlA%v2IAi`)di7bd! zHFypTYIjCCsQfK10o`j1YUUwI50GWS6D+{`>!PRBG9 zEd!t$TU?q13E*Pv_JX!jf)>bvHq~RZ8nm7b)JR3hfoC}5L2FY`j07LRj#QvP-3bwf zmnbNrh;jj07}HeHTtR+5QgY5H2X$%^bHP`v6(M^JshoqFSp>Rf9K661;RUc5G~{YKvBoz_;Q((6g6sit5DhG_NItAB0pjIkCZUy9a1qcs1$lX?umK}z=pv-kGSfi2 zU667$LJqa$L5PDK3SQp`H4Su(H{AOm4s;wFNg6By8j?jyA1Gxmhyz-0izr>dBABHq zXeBP9-3IbKY9R{dfy*0|;sSDLPJC)kVnH!dv4$!f4_Pw>U1|mD;K99Bkds&m8b^V2 zr!j@$4GFM|V2U%!aj6IS4q*zYuM9s01sZJNGk;Ob`hucVv?>EE0+|Csm{ybu+BgCl zNr4#!7D1{P(Cq>xU`P`PwJ`(o3_`9rF)y!5s`b z3=+J18)^(_JOI=|Mx+I>NM&9!=xiHsR|&2cHGsf8%*cnV*@u}9Zg4=ld!SApl2PC_ zeV~oSNGSwcVn7l@Nn}uQv?>fm6t{Yi4CsiLe9-B8Ft@^rP=q64BB10$M->HNT`NGd&%&=MTCH115~hg^t01 zY68$%xllzYq6Tm)p~9#!Uy+tt1lsnOn44ORT*l>>rxt;h$bwQjtX2ez!P^5c9(au# zXyqluBCs$xxKLFhdgujUC2$?E@lsF^9c%JU^jyf<2dqC$EgL~DP&^{fi zE>I@N7I<(Uf)s!bKLU+`VmJkw%fOv!EOtW^7i6{xsyQVQH0c0O_8`~5gpi^DB$Sew zo>`KZ6Q2t{a}!BBc!VK27j$kU__{hYsq)Me!IM8I?gLo}Y9xd5CUyx}KNadt&`n&)psE(MV4^G&G%b~ulLj;o$c=|?zJv@Ip*jGXCsGnK5#pd4KPeTwQW_$SDg|0WodjC*mkMfQKwA`G zyFePDvf$nXQd&lqg0xjq&`bp_zD6p^;Rb@D6tyt{mx3L$jpj;l{DDTyKu7MEfR?dC zBN0@s$0w!6!}D5vT4n`OdI!s+XHJ+PnvcN3$ZaT)tH6SYTNIG31vg93?Sj^z@Q?t9 z61=PfO)lb)0v|ApLk`^osD{G*jzc%1T@CUOs$NjL9*4Gq+;~`QAeVNi`jHeN*Cl9* zV5^y-p@$|5Njx}Qfh{~ig$8DDfke?`4`dTa9NiR{$3SHubQla2Hps%Db5`MQf=Q&L zf^=Y&0_~{=HRN+acY;C}{zLr>(+w&EK(0Y9>EZbRwC(`8A_tctpv91&)4o&l;ZCW@ z0WA&%70AUo`6b}yJy;IX=F2Dtt#&|e_CdtK6*Q#Ife3&{t`iGD>vusmmp~U)) zO4Cx|xeX!@HaMd^9^5^vgcbDp$)L5G*`RHqpoThF5lDMtK|xMsd~R_Pnn-bFZf{Dd|C1b)kj^d`&adN>~ns zsE2C@2_uIsa%uyGKGa*tfepQ~31kG63CcXF$b9fY2FL>7Yg`J7L5J^vuIB+yWXFRA z;bNe>I!p2)JI6uID^Qmfq!x0g8F>8;c=`-k4Ae(M;)6T`y2=2d4ziyOtOT+N8`Khm z?E*v+hF?mAB!;|U5F!lTHXWY_I$|B-IY^}kku0bL_i(|54EXYFuy9c-__#k1J0&#@ zvY`*YDHKRXi|*I+Z@=T3lK1u_XL0vWJCG5~bj z3rr3)vI*LPT#O_Sigd)`1#siQr|=^4;=xO|wI|>8YSoW)PtU;)5F$ zAlpFgMNq8;KHU~9Pz1ge9mE8M7wGmlh%p)YIVliUCg_+x7!!OkHb^zNe1Ht

  • !v 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