diff options
Diffstat (limited to 'SOURCES/cachy-fixes.patch')
-rw-r--r-- | SOURCES/cachy-fixes.patch | 573 |
1 files changed, 0 insertions, 573 deletions
diff --git a/SOURCES/cachy-fixes.patch b/SOURCES/cachy-fixes.patch deleted file mode 100644 index 1c632df..0000000 --- a/SOURCES/cachy-fixes.patch +++ /dev/null @@ -1,573 +0,0 @@ -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 371531b2a3d0..ddc064b4fc32 100644 ---- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -@@ -8327,6 +8327,122 @@ static inline uint32_t get_mem_type(struct drm_framebuffer *fb) - return abo->tbo.resource ? abo->tbo.resource->mem_type : 0; - } - -+/* TODO remove duplicate */ -+static int amdgpu_dm_plane_get_cursor_position(struct drm_plane *plane, struct drm_crtc *crtc, -+ struct dc_cursor_position *position) -+{ -+ struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); -+ int x, y; -+ int xorigin = 0, yorigin = 0; -+ -+ if (!crtc || !plane->state->fb) -+ return 0; -+ -+ if ((plane->state->crtc_w > amdgpu_crtc->max_cursor_width) || -+ (plane->state->crtc_h > amdgpu_crtc->max_cursor_height)) { -+ DRM_ERROR("%s: bad cursor width or height %d x %d\n", -+ __func__, -+ plane->state->crtc_w, -+ plane->state->crtc_h); -+ return -EINVAL; -+ } -+ -+ x = plane->state->crtc_x; -+ y = plane->state->crtc_y; -+ -+ if (x <= -amdgpu_crtc->max_cursor_width || -+ y <= -amdgpu_crtc->max_cursor_height) -+ return 0; -+ -+ if (x < 0) { -+ xorigin = min(-x, amdgpu_crtc->max_cursor_width - 1); -+ x = 0; -+ } -+ if (y < 0) { -+ yorigin = min(-y, amdgpu_crtc->max_cursor_height - 1); -+ y = 0; -+ } -+ position->enable = true; -+ position->translate_by_source = true; -+ position->x = x; -+ position->y = y; -+ position->x_hotspot = xorigin; -+ position->y_hotspot = yorigin; -+ -+ return 0; -+} -+ -+static void amdgpu_dm_update_cursor(struct drm_plane *plane, -+ struct drm_plane_state *old_plane_state, -+ struct dc_stream_update *update) -+{ -+ struct amdgpu_device *adev = drm_to_adev(plane->dev); -+ struct amdgpu_framebuffer *afb = to_amdgpu_framebuffer(plane->state->fb); -+ struct drm_crtc *crtc = afb ? plane->state->crtc : old_plane_state->crtc; -+ struct dm_crtc_state *crtc_state = crtc ? to_dm_crtc_state(crtc->state) : NULL; -+ struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); -+ uint64_t address = afb ? afb->address : 0; -+ struct dc_cursor_position position = {0}; -+ struct dc_cursor_attributes attributes; -+ int ret; -+ -+ if (!plane->state->fb && !old_plane_state->fb) -+ return; -+ -+ drm_dbg_atomic(plane->dev, "crtc_id=%d with size %d to %d\n", -+ amdgpu_crtc->crtc_id, plane->state->crtc_w, -+ plane->state->crtc_h); -+ -+ ret = amdgpu_dm_plane_get_cursor_position(plane, crtc, &position); -+ if (ret) -+ return; -+ -+ if (!position.enable) { -+ /* turn off cursor */ -+ if (crtc_state && crtc_state->stream) { -+ dc_stream_set_cursor_position(crtc_state->stream, -+ &position); -+ update->cursor_position = &crtc_state->stream->cursor_position; -+ } -+ return; -+ } -+ -+ amdgpu_crtc->cursor_width = plane->state->crtc_w; -+ amdgpu_crtc->cursor_height = plane->state->crtc_h; -+ -+ memset(&attributes, 0, sizeof(attributes)); -+ attributes.address.high_part = upper_32_bits(address); -+ attributes.address.low_part = lower_32_bits(address); -+ attributes.width = plane->state->crtc_w; -+ attributes.height = plane->state->crtc_h; -+ attributes.color_format = CURSOR_MODE_COLOR_PRE_MULTIPLIED_ALPHA; -+ attributes.rotation_angle = 0; -+ attributes.attribute_flags.value = 0; -+ -+ /* Enable cursor degamma ROM on DCN3+ for implicit sRGB degamma in DRM -+ * legacy gamma setup. -+ */ -+ if (crtc_state->cm_is_degamma_srgb && -+ adev->dm.dc->caps.color.dpp.gamma_corr) -+ attributes.attribute_flags.bits.ENABLE_CURSOR_DEGAMMA = 1; -+ -+ attributes.pitch = afb->base.pitches[0] / afb->base.format->cpp[0]; -+ -+ if (crtc_state->stream) { -+ if (!dc_stream_set_cursor_attributes(crtc_state->stream, -+ &attributes)) -+ DRM_ERROR("DC failed to set cursor attributes\n"); -+ -+ update->cursor_attributes = &crtc_state->stream->cursor_attributes; -+ -+ if (!dc_stream_set_cursor_position(crtc_state->stream, -+ &position)) -+ DRM_ERROR("DC failed to set cursor position\n"); -+ -+ update->cursor_position = &crtc_state->stream->cursor_position; -+ } -+} -+ - static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, - struct drm_device *dev, - struct amdgpu_display_manager *dm, -@@ -8350,6 +8466,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, - bool cursor_update = false; - bool pflip_present = false; - bool dirty_rects_changed = false; -+ bool updated_planes_and_streams = false; - struct { - struct dc_surface_update surface_updates[MAX_SURFACES]; - struct dc_plane_info plane_infos[MAX_SURFACES]; -@@ -8386,8 +8503,10 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, - /* Cursor plane is handled after stream updates */ - if (plane->type == DRM_PLANE_TYPE_CURSOR) { - if ((fb && crtc == pcrtc) || -- (old_plane_state->fb && old_plane_state->crtc == pcrtc)) -+ (old_plane_state->fb && old_plane_state->crtc == pcrtc)) { - cursor_update = true; -+ amdgpu_dm_update_cursor(plane, old_plane_state, &bundle->stream_update); -+ } - - continue; - } -@@ -8660,6 +8779,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, - acrtc_state->stream, - &bundle->stream_update, - bundle->surface_updates); -+ updated_planes_and_streams = true; - - /** - * Enable or disable the interrupts on the backend. -@@ -8737,7 +8857,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, - * This avoids redundant programming in the case where we're going - * to be disabling a single plane - those pipes are being disabled. - */ -- if (acrtc_state->active_planes) -+ if (acrtc_state->active_planes && !updated_planes_and_streams) - amdgpu_dm_commit_cursors(state); - - cleanup: -@@ -8925,7 +9045,7 @@ static void amdgpu_dm_commit_streams(struct drm_atomic_state *state, - - memset(&position, 0, sizeof(position)); - mutex_lock(&dm->dc_lock); -- dc_stream_set_cursor_position(dm_old_crtc_state->stream, &position); -+ dc_stream_program_cursor_position(dm_old_crtc_state->stream, &position); - mutex_unlock(&dm->dc_lock); - } - -diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c -index 779880c64575..8c8d0d209d7a 100644 ---- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c -+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c -@@ -1254,7 +1254,7 @@ void amdgpu_dm_plane_handle_cursor_update(struct drm_plane *plane, - /* turn off cursor */ - if (crtc_state && crtc_state->stream) { - mutex_lock(&adev->dm.dc_lock); -- dc_stream_set_cursor_position(crtc_state->stream, -+ dc_stream_program_cursor_position(crtc_state->stream, - &position); - mutex_unlock(&adev->dm.dc_lock); - } -@@ -1284,11 +1284,11 @@ void amdgpu_dm_plane_handle_cursor_update(struct drm_plane *plane, - - if (crtc_state->stream) { - mutex_lock(&adev->dm.dc_lock); -- if (!dc_stream_set_cursor_attributes(crtc_state->stream, -+ if (!dc_stream_program_cursor_attributes(crtc_state->stream, - &attributes)) - DRM_ERROR("DC failed to set cursor attributes\n"); - -- if (!dc_stream_set_cursor_position(crtc_state->stream, -+ if (!dc_stream_program_cursor_position(crtc_state->stream, - &position)) - DRM_ERROR("DC failed to set cursor position\n"); - mutex_unlock(&adev->dm.dc_lock); -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c -index d68c83e40d4d..575290784c61 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c -@@ -3188,6 +3188,83 @@ static bool update_planes_and_stream_state(struct dc *dc, - - } - -+static void program_cursor_attributes( -+ struct dc *dc, -+ struct dc_stream_state *stream) -+{ -+ int i; -+ struct resource_context *res_ctx; -+ struct pipe_ctx *pipe_to_program = NULL; -+ -+ if (!stream) -+ return; -+ -+ res_ctx = &dc->current_state->res_ctx; -+ -+ for (i = 0; i < MAX_PIPES; i++) { -+ struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i]; -+ -+ if (pipe_ctx->stream != stream) -+ continue; -+ -+ if (!pipe_to_program) { -+ pipe_to_program = pipe_ctx; -+ dc->hwss.cursor_lock(dc, pipe_to_program, true); -+ if (pipe_to_program->next_odm_pipe) -+ dc->hwss.cursor_lock(dc, pipe_to_program->next_odm_pipe, true); -+ } -+ -+ dc->hwss.set_cursor_attribute(pipe_ctx); -+ if (dc->ctx->dmub_srv) -+ dc_send_update_cursor_info_to_dmu(pipe_ctx, i); -+ if (dc->hwss.set_cursor_sdr_white_level) -+ dc->hwss.set_cursor_sdr_white_level(pipe_ctx); -+ } -+ -+ if (pipe_to_program) { -+ dc->hwss.cursor_lock(dc, pipe_to_program, false); -+ if (pipe_to_program->next_odm_pipe) -+ dc->hwss.cursor_lock(dc, pipe_to_program->next_odm_pipe, false); -+ } -+} -+ -+static void program_cursor_position( -+ struct dc *dc, -+ struct dc_stream_state *stream) -+{ -+ int i; -+ struct resource_context *res_ctx; -+ struct pipe_ctx *pipe_to_program = NULL; -+ -+ if (!stream) -+ return; -+ -+ res_ctx = &dc->current_state->res_ctx; -+ -+ for (i = 0; i < MAX_PIPES; i++) { -+ struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i]; -+ -+ if (pipe_ctx->stream != stream || -+ (!pipe_ctx->plane_res.mi && !pipe_ctx->plane_res.hubp) || -+ !pipe_ctx->plane_state || -+ (!pipe_ctx->plane_res.xfm && !pipe_ctx->plane_res.dpp) || -+ (!pipe_ctx->plane_res.ipp && !pipe_ctx->plane_res.dpp)) -+ continue; -+ -+ if (!pipe_to_program) { -+ pipe_to_program = pipe_ctx; -+ dc->hwss.cursor_lock(dc, pipe_to_program, true); -+ } -+ -+ dc->hwss.set_cursor_position(pipe_ctx); -+ if (dc->ctx->dmub_srv) -+ dc_send_update_cursor_info_to_dmu(pipe_ctx, i); -+ } -+ -+ if (pipe_to_program) -+ dc->hwss.cursor_lock(dc, pipe_to_program, false); -+} -+ - static void commit_planes_do_stream_update(struct dc *dc, - struct dc_stream_state *stream, - struct dc_stream_update *stream_update, -@@ -3248,6 +3325,13 @@ static void commit_planes_do_stream_update(struct dc *dc, - } - } - -+ if (stream_update->cursor_attributes) { -+ program_cursor_attributes(dc, stream); -+ } -+ -+ if (stream_update->cursor_position) { -+ program_cursor_position(dc, stream); -+ } - - /* Full fe update*/ - if (update_type == UPDATE_TYPE_FAST) -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c -index 51a970fcb5d0..5601ee8a8d41 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c -@@ -278,7 +278,6 @@ bool dc_stream_set_cursor_attributes( - const struct dc_cursor_attributes *attributes) - { - struct dc *dc; -- bool reset_idle_optimizations = false; - - if (NULL == stream) { - dm_error("DC: dc_stream is NULL!\n"); -@@ -309,20 +308,36 @@ bool dc_stream_set_cursor_attributes( - - stream->cursor_attributes = *attributes; - -- dc_z10_restore(dc); -- /* disable idle optimizations while updating cursor */ -- if (dc->idle_optimizations_allowed) { -- dc_allow_idle_optimizations(dc, false); -- reset_idle_optimizations = true; -- } -+ return true; -+} - -- program_cursor_attributes(dc, stream, attributes); -+bool dc_stream_program_cursor_attributes( -+ struct dc_stream_state *stream, -+ const struct dc_cursor_attributes *attributes) -+{ -+ struct dc *dc; -+ bool reset_idle_optimizations = false; - -- /* re-enable idle optimizations if necessary */ -- if (reset_idle_optimizations) -- dc_allow_idle_optimizations(dc, true); -+ dc = stream ? stream->ctx->dc : NULL; - -- return true; -+ if (dc_stream_set_cursor_attributes(stream, attributes)) { -+ dc_z10_restore(dc); -+ /* disable idle optimizations while updating cursor */ -+ if (dc->idle_optimizations_allowed) { -+ dc_allow_idle_optimizations(dc, false); -+ reset_idle_optimizations = true; -+ } -+ -+ program_cursor_attributes(dc, stream, attributes); -+ -+ /* re-enable idle optimizations if necessary */ -+ if (reset_idle_optimizations) -+ dc_allow_idle_optimizations(dc, true); -+ -+ return true; -+ } -+ -+ return false; - } - - static void program_cursor_position( -@@ -367,9 +382,6 @@ bool dc_stream_set_cursor_position( - struct dc_stream_state *stream, - const struct dc_cursor_position *position) - { -- struct dc *dc; -- bool reset_idle_optimizations = false; -- - if (NULL == stream) { - dm_error("DC: dc_stream is NULL!\n"); - return false; -@@ -380,24 +392,43 @@ bool dc_stream_set_cursor_position( - return false; - } - -+ stream->cursor_position = *position; -+ -+ return true; -+} -+ -+bool dc_stream_program_cursor_position( -+ struct dc_stream_state *stream, -+ const struct dc_cursor_position *position) -+{ -+ struct dc *dc; -+ bool reset_idle_optimizations = false; -+ const struct dc_cursor_position *old_position; -+ -+ old_position = stream ? &stream->cursor_position : NULL; - dc = stream->ctx->dc; -- dc_z10_restore(dc); - -- /* disable idle optimizations if enabling cursor */ -- if (dc->idle_optimizations_allowed && (!stream->cursor_position.enable || dc->debug.exit_idle_opt_for_cursor_updates) -- && position->enable) { -- dc_allow_idle_optimizations(dc, false); -- reset_idle_optimizations = true; -- } -+ if (dc_stream_set_cursor_position(stream, position)) { -+ dc_z10_restore(dc); - -- stream->cursor_position = *position; -+ /* disable idle optimizations if enabling cursor */ -+ if (dc->idle_optimizations_allowed && -+ (!old_position->enable || dc->debug.exit_idle_opt_for_cursor_updates) && -+ position->enable) { -+ dc_allow_idle_optimizations(dc, false); -+ reset_idle_optimizations = true; -+ } - -- program_cursor_position(dc, stream, position); -- /* re-enable idle optimizations if necessary */ -- if (reset_idle_optimizations) -- dc_allow_idle_optimizations(dc, true); - -- return true; -+ program_cursor_position(dc, stream, position); -+ /* re-enable idle optimizations if necessary */ -+ if (reset_idle_optimizations) -+ dc_allow_idle_optimizations(dc, true); -+ -+ return true; -+ } -+ -+ return false; - } - - bool dc_stream_add_writeback(struct dc *dc, -diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h -index ee10941caa59..df86668f560f 100644 ---- a/drivers/gpu/drm/amd/display/dc/dc_stream.h -+++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h -@@ -327,6 +327,9 @@ struct dc_stream_update { - - struct test_pattern *pending_test_pattern; - struct dc_crtc_timing_adjust *crtc_timing_adjust; -+ -+ struct dc_cursor_attributes *cursor_attributes; -+ struct dc_cursor_position *cursor_position; - }; - - bool dc_is_stream_unchanged( -@@ -478,10 +481,17 @@ bool dc_stream_set_cursor_attributes( - struct dc_stream_state *stream, - const struct dc_cursor_attributes *attributes); - -+bool dc_stream_program_cursor_attributes( -+ struct dc_stream_state *stream, -+ const struct dc_cursor_attributes *attributes); -+ - bool dc_stream_set_cursor_position( - struct dc_stream_state *stream, - const struct dc_cursor_position *position); - -+bool dc_stream_program_cursor_position( -+ struct dc_stream_state *stream, -+ const struct dc_cursor_position *position); - - bool dc_stream_adjust_vmin_vmax(struct dc *dc, - struct dc_stream_state *stream, -diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c -index 8bc3d01537bb..f91169c80f7f 100644 ---- a/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c -+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c -@@ -1042,7 +1042,7 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable) - - /* Use copied cursor, and it's okay to not switch back */ - cursor_attr.address.quad_part = cmd.mall.cursor_copy_dst.quad_part; -- dc_stream_set_cursor_attributes(stream, &cursor_attr); -+ dc_stream_program_cursor_attributes(stream, &cursor_attr); - } - - /* Enable MALL */ -diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c -index 1e020620748d..082f87834503 100644 ---- a/fs/btrfs/extent_io.c -+++ b/fs/btrfs/extent_io.c -@@ -4269,6 +4269,13 @@ void set_extent_buffer_uptodate(struct extent_buffer *eb) - } - } - -+static void clear_extent_buffer_reading(struct extent_buffer *eb) -+{ -+ clear_bit(EXTENT_BUFFER_READING, &eb->bflags); -+ smp_mb__after_atomic(); -+ wake_up_bit(&eb->bflags, EXTENT_BUFFER_READING); -+} -+ - static void end_bbio_meta_read(struct btrfs_bio *bbio) - { - struct extent_buffer *eb = bbio->private; -@@ -4277,6 +4284,13 @@ static void end_bbio_meta_read(struct btrfs_bio *bbio) - struct folio_iter fi; - u32 bio_offset = 0; - -+ /* -+ * If the extent buffer is marked UPTODATE before the read operation -+ * completes, other calls to read_extent_buffer_pages() will return -+ * early without waiting for the read to finish, causing data races. -+ */ -+ WARN_ON(test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags)); -+ - eb->read_mirror = bbio->mirror_num; - - if (uptodate && -@@ -4303,9 +4317,7 @@ static void end_bbio_meta_read(struct btrfs_bio *bbio) - bio_offset += len; - } - -- clear_bit(EXTENT_BUFFER_READING, &eb->bflags); -- smp_mb__after_atomic(); -- wake_up_bit(&eb->bflags, EXTENT_BUFFER_READING); -+ clear_extent_buffer_reading(eb); - free_extent_buffer(eb); - - bio_put(&bbio->bio); -@@ -4339,9 +4351,7 @@ int read_extent_buffer_pages(struct extent_buffer *eb, int wait, int mirror_num, - * will now be set, and we shouldn't read it in again. - */ - if (unlikely(test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))) { -- clear_bit(EXTENT_BUFFER_READING, &eb->bflags); -- smp_mb__after_atomic(); -- wake_up_bit(&eb->bflags, EXTENT_BUFFER_READING); -+ clear_extent_buffer_reading(eb); - return 0; - } - -diff --git a/include/linux/filter.h b/include/linux/filter.h -index cf12bfa2a78c..2acf8634008d 100644 ---- a/include/linux/filter.h -+++ b/include/linux/filter.h -@@ -644,14 +644,16 @@ static __always_inline u32 __bpf_prog_run(const struct bpf_prog *prog, - cant_migrate(); - if (static_branch_unlikely(&bpf_stats_enabled_key)) { - struct bpf_prog_stats *stats; -- u64 start = sched_clock(); -+ u64 duration, start = sched_clock(); - unsigned long flags; - - ret = dfunc(ctx, prog->insnsi, prog->bpf_func); -+ -+ duration = sched_clock() - start; - stats = this_cpu_ptr(prog->stats); - flags = u64_stats_update_begin_irqsave(&stats->syncp); - u64_stats_inc(&stats->cnt); -- u64_stats_add(&stats->nsecs, sched_clock() - start); -+ u64_stats_add(&stats->nsecs, duration); - u64_stats_update_end_irqrestore(&stats->syncp, flags); - } else { - ret = dfunc(ctx, prog->insnsi, prog->bpf_func); -diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c -index db7599c59c78..146de96e99b8 100644 ---- a/kernel/bpf/trampoline.c -+++ b/kernel/bpf/trampoline.c -@@ -883,12 +883,13 @@ static void notrace update_prog_stats(struct bpf_prog *prog, - * Hence check that 'start' is valid. - */ - start > NO_START_TIME) { -+ u64 duration = sched_clock() - start; - unsigned long flags; - - stats = this_cpu_ptr(prog->stats); - flags = u64_stats_update_begin_irqsave(&stats->syncp); - u64_stats_inc(&stats->cnt); -- u64_stats_add(&stats->nsecs, sched_clock() - start); -+ u64_stats_add(&stats->nsecs, duration); - u64_stats_update_end_irqrestore(&stats->syncp, flags); - } - } --- -2.45.2 - |