]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 6.8
authorSasha Levin <sashal@kernel.org>
Wed, 17 Apr 2024 17:16:39 +0000 (13:16 -0400)
committerSasha Levin <sashal@kernel.org>
Wed, 17 Apr 2024 17:16:39 +0000 (13:16 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-6.8/drm-i915-cdclk-fix-voltage_level-programming-edge-ca.patch [new file with mode: 0644]
queue-6.8/io_uring-fix-io_cqring_wait-not-restoring-sigmask-on.patch [new file with mode: 0644]
queue-6.8/series [new file with mode: 0644]

diff --git a/queue-6.8/drm-i915-cdclk-fix-voltage_level-programming-edge-ca.patch b/queue-6.8/drm-i915-cdclk-fix-voltage_level-programming-edge-ca.patch
new file mode 100644 (file)
index 0000000..1c97d43
--- /dev/null
@@ -0,0 +1,127 @@
+From 773f71bd7681c63fd60e7d7da39284ebff27c813 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Apr 2024 18:50:04 +0300
+Subject: drm/i915/cdclk: Fix voltage_level programming edge case
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ville Syrjälä <ville.syrjala@linux.intel.com>
+
+[ Upstream commit 6154cc9177ccea00c89ce0bf93352e474b819ff2 ]
+
+Currently we only consider the relationship of the
+old and new CDCLK frequencies when determining whether
+to do the repgramming from intel_set_cdclk_pre_plane_update()
+or intel_set_cdclk_post_plane_update().
+
+It is technically possible to have a situation where the
+CDCLK frequency is decreasing, but the voltage_level is
+increasing due a DDI port. In this case we should bump
+the voltage level already in intel_set_cdclk_pre_plane_update()
+(so that the voltage_level will have been increased by the
+time the port gets enabled), while leaving the CDCLK frequency
+unchanged (as active planes/etc. may still depend on it).
+We can then reduce the CDCLK frequency to its final value
+from intel_set_cdclk_post_plane_update().
+
+In order to handle that correctly we shall construct a
+suitable amalgam of the old and new cdclk states in
+intel_set_cdclk_pre_plane_update().
+
+And we can simply call intel_set_cdclk() unconditionally
+in both places as it will not do anything if nothing actually
+changes vs. the current hw state.
+
+v2: Handle cdclk_state->disable_pipes
+v3: Only synchronize the cd2x update against the pipe's vblank
+    when the cdclk frequency is changing during the current
+    commit phase (Gustavo)
+
+Cc: stable@vger.kernel.org
+Cc: Gustavo Sousa <gustavo.sousa@intel.com>
+Reviewed-by: Uma Shankar <uma.shankar@intel.com>
+Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20240402155016.13733-3-ville.syrjala@linux.intel.com
+(cherry picked from commit 34d127e2bdef73a923aa0dcd95cbc3257ad5af52)
+Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/i915/display/intel_cdclk.c | 37 ++++++++++++++++------
+ 1 file changed, 27 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/display/intel_cdclk.c b/drivers/gpu/drm/i915/display/intel_cdclk.c
+index 6e36a15284537..7ba30d26f620c 100644
+--- a/drivers/gpu/drm/i915/display/intel_cdclk.c
++++ b/drivers/gpu/drm/i915/display/intel_cdclk.c
+@@ -2512,7 +2512,8 @@ intel_set_cdclk_pre_plane_update(struct intel_atomic_state *state)
+               intel_atomic_get_old_cdclk_state(state);
+       const struct intel_cdclk_state *new_cdclk_state =
+               intel_atomic_get_new_cdclk_state(state);
+-      enum pipe pipe = new_cdclk_state->pipe;
++      struct intel_cdclk_config cdclk_config;
++      enum pipe pipe;
+       if (!intel_cdclk_changed(&old_cdclk_state->actual,
+                                &new_cdclk_state->actual))
+@@ -2521,12 +2522,25 @@ intel_set_cdclk_pre_plane_update(struct intel_atomic_state *state)
+       if (IS_DG2(i915))
+               intel_cdclk_pcode_pre_notify(state);
+-      if (new_cdclk_state->disable_pipes ||
+-          old_cdclk_state->actual.cdclk <= new_cdclk_state->actual.cdclk) {
+-              drm_WARN_ON(&i915->drm, !new_cdclk_state->base.changed);
++      if (new_cdclk_state->disable_pipes) {
++              cdclk_config = new_cdclk_state->actual;
++              pipe = INVALID_PIPE;
++      } else {
++              if (new_cdclk_state->actual.cdclk >= old_cdclk_state->actual.cdclk) {
++                      cdclk_config = new_cdclk_state->actual;
++                      pipe = new_cdclk_state->pipe;
++              } else {
++                      cdclk_config = old_cdclk_state->actual;
++                      pipe = INVALID_PIPE;
++              }
+-              intel_set_cdclk(i915, &new_cdclk_state->actual, pipe);
++              cdclk_config.voltage_level = max(new_cdclk_state->actual.voltage_level,
++                                               old_cdclk_state->actual.voltage_level);
+       }
++
++      drm_WARN_ON(&i915->drm, !new_cdclk_state->base.changed);
++
++      intel_set_cdclk(i915, &cdclk_config, pipe);
+ }
+ /**
+@@ -2544,7 +2558,7 @@ intel_set_cdclk_post_plane_update(struct intel_atomic_state *state)
+               intel_atomic_get_old_cdclk_state(state);
+       const struct intel_cdclk_state *new_cdclk_state =
+               intel_atomic_get_new_cdclk_state(state);
+-      enum pipe pipe = new_cdclk_state->pipe;
++      enum pipe pipe;
+       if (!intel_cdclk_changed(&old_cdclk_state->actual,
+                                &new_cdclk_state->actual))
+@@ -2554,11 +2568,14 @@ intel_set_cdclk_post_plane_update(struct intel_atomic_state *state)
+               intel_cdclk_pcode_post_notify(state);
+       if (!new_cdclk_state->disable_pipes &&
+-          old_cdclk_state->actual.cdclk > new_cdclk_state->actual.cdclk) {
+-              drm_WARN_ON(&i915->drm, !new_cdclk_state->base.changed);
++          new_cdclk_state->actual.cdclk < old_cdclk_state->actual.cdclk)
++              pipe = new_cdclk_state->pipe;
++      else
++              pipe = INVALID_PIPE;
+-              intel_set_cdclk(i915, &new_cdclk_state->actual, pipe);
+-      }
++      drm_WARN_ON(&i915->drm, !new_cdclk_state->base.changed);
++
++      intel_set_cdclk(i915, &new_cdclk_state->actual, pipe);
+ }
+ static int intel_pixel_rate_to_cdclk(const struct intel_crtc_state *crtc_state)
+-- 
+2.43.0
+
diff --git a/queue-6.8/io_uring-fix-io_cqring_wait-not-restoring-sigmask-on.patch b/queue-6.8/io_uring-fix-io_cqring_wait-not-restoring-sigmask-on.patch
new file mode 100644 (file)
index 0000000..0dafcbb
--- /dev/null
@@ -0,0 +1,73 @@
+From 80eb4b220963a07c2d5f7a5f96a722e906c933e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Apr 2024 15:55:51 +0300
+Subject: io_uring: Fix io_cqring_wait() not restoring sigmask on
+ get_timespec64() failure
+
+From: Alexey Izbyshev <izbyshev@ispras.ru>
+
+[ Upstream commit 978e5c19dfefc271e5550efba92fcef0d3f62864 ]
+
+This bug was introduced in commit 950e79dd7313 ("io_uring: minor
+io_cqring_wait() optimization"), which was made in preparation for
+adc8682ec690 ("io_uring: Add support for napi_busy_poll"). The latter
+got reverted in cb3182167325 ("Revert "io_uring: Add support for
+napi_busy_poll""), so simply undo the former as well.
+
+Cc: stable@vger.kernel.org
+Fixes: 950e79dd7313 ("io_uring: minor io_cqring_wait() optimization")
+Signed-off-by: Alexey Izbyshev <izbyshev@ispras.ru>
+Link: https://lore.kernel.org/r/20240405125551.237142-1-izbyshev@ispras.ru
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ io_uring/io_uring.c | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
+index 3fc792dfc6ae7..dc0235ff472d3 100644
+--- a/io_uring/io_uring.c
++++ b/io_uring/io_uring.c
+@@ -2610,19 +2610,6 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events,
+       if (__io_cqring_events_user(ctx) >= min_events)
+               return 0;
+-      if (sig) {
+-#ifdef CONFIG_COMPAT
+-              if (in_compat_syscall())
+-                      ret = set_compat_user_sigmask((const compat_sigset_t __user *)sig,
+-                                                    sigsz);
+-              else
+-#endif
+-                      ret = set_user_sigmask(sig, sigsz);
+-
+-              if (ret)
+-                      return ret;
+-      }
+-
+       init_waitqueue_func_entry(&iowq.wq, io_wake_function);
+       iowq.wq.private = current;
+       INIT_LIST_HEAD(&iowq.wq.entry);
+@@ -2639,6 +2626,19 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events,
+               iowq.timeout = ktime_add_ns(timespec64_to_ktime(ts), ktime_get_ns());
+       }
++      if (sig) {
++#ifdef CONFIG_COMPAT
++              if (in_compat_syscall())
++                      ret = set_compat_user_sigmask((const compat_sigset_t __user *)sig,
++                                                    sigsz);
++              else
++#endif
++                      ret = set_user_sigmask(sig, sigsz);
++
++              if (ret)
++                      return ret;
++      }
++
+       trace_io_uring_cqring_wait(ctx, min_events);
+       do {
+               int nr_wait = (int) iowq.cq_tail - READ_ONCE(ctx->rings->cq.tail);
+-- 
+2.43.0
+
diff --git a/queue-6.8/series b/queue-6.8/series
new file mode 100644 (file)
index 0000000..c76a125
--- /dev/null
@@ -0,0 +1,2 @@
+io_uring-fix-io_cqring_wait-not-restoring-sigmask-on.patch
+drm-i915-cdclk-fix-voltage_level-programming-edge-ca.patch