* [PATCH] drm/i915: replace fetch_and_zero() with kernel xchg()
@ 2026-04-27 12:13 Sebastian Brzezinka
2026-04-27 12:26 ` Jani Nikula
0 siblings, 1 reply; 7+ messages in thread
From: Sebastian Brzezinka @ 2026-04-27 12:13 UTC (permalink / raw)
To: intel-gfx; +Cc: Sebastian Brzezinka, andi.shyti, krzysztof.karas
The i915 local fetch_and_zero() macro is a non-atomic
fetch-and-zero operation defined in i915_utils.h and duplicated in
display/intel_display_utils.h. Its functionality is equivalent to the
kernel-provided xchg().
Replace fetch_and_zero() with the kernel provided xchg(), and
remove the now unused macro definitions from both i915_utils.h and
display/intel_display_utils.h.
Reviewed-by: Krzysztof Karas <krzysztof.karas@intel.com>
Signed-off-by: Sebastian Brzezinka <sebastian.brzezinka@intel.com>
---
drivers/gpu/drm/i915/display/icl_dsi.c | 2 +-
drivers/gpu/drm/i915/display/intel_ddi.c | 6 ++---
drivers/gpu/drm/i915/display/intel_display.c | 4 ++--
.../drm/i915/display/intel_display_power.c | 22 +++++++++----------
.../drm/i915/display/intel_display_reset.c | 2 +-
.../drm/i915/display/intel_display_utils.h | 5 -----
drivers/gpu/drm/i915/display/intel_dmc.c | 2 +-
drivers/gpu/drm/i915/display/intel_pps.c | 4 ++--
drivers/gpu/drm/i915/display/intel_tc.c | 12 +++++-----
drivers/gpu/drm/i915/gem/i915_gem_pages.c | 4 ++--
drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 2 +-
drivers/gpu/drm/i915/gem/i915_gem_ttm.c | 4 ++--
.../drm/i915/gem/selftests/i915_gem_context.c | 4 ++--
drivers/gpu/drm/i915/gt/intel_engine_cs.c | 2 +-
.../drm/i915/gt/intel_execlists_submission.c | 4 ++--
drivers/gpu/drm/i915/gt/intel_ggtt.c | 4 ++--
drivers/gpu/drm/i915/gt/intel_gsc.c | 2 +-
drivers/gpu/drm/i915/gt/intel_gt.c | 4 ++--
drivers/gpu/drm/i915/gt/intel_gt_pm.c | 2 +-
drivers/gpu/drm/i915/gt/intel_lrc.c | 6 ++---
drivers/gpu/drm/i915/gt/intel_migrate.c | 2 +-
drivers/gpu/drm/i915/gt/intel_rc6.c | 2 +-
drivers/gpu/drm/i915/gt/intel_rps.c | 2 +-
drivers/gpu/drm/i915/gt/selftest_context.c | 2 +-
.../drm/i915/gt/selftest_ring_submission.c | 2 +-
drivers/gpu/drm/i915/gt/selftest_timeline.c | 2 +-
drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.c | 2 +-
drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.c | 4 ++--
drivers/gpu/drm/i915/gt/uc/intel_uc.c | 2 +-
drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c | 2 +-
drivers/gpu/drm/i915/gvt/kvmgt.c | 2 +-
drivers/gpu/drm/i915/gvt/scheduler.c | 4 ++--
drivers/gpu/drm/i915/i915_drm_client.c | 2 +-
drivers/gpu/drm/i915/i915_fb_pin.c | 6 ++---
drivers/gpu/drm/i915/i915_overlay.c | 2 +-
drivers/gpu/drm/i915/i915_perf.c | 2 +-
drivers/gpu/drm/i915/i915_query.c | 2 +-
drivers/gpu/drm/i915/i915_request.c | 4 ++--
drivers/gpu/drm/i915/i915_utils.h | 5 -----
drivers/gpu/drm/i915/i915_vma.c | 2 +-
drivers/gpu/drm/i915/intel_memory_region.c | 2 +-
drivers/gpu/drm/i915/intel_uncore.c | 4 ++--
drivers/gpu/drm/i915/pxp/intel_pxp.c | 2 +-
drivers/gpu/drm/i915/pxp/intel_pxp_session.c | 4 ++--
drivers/gpu/drm/i915/pxp/intel_pxp_tee.c | 2 +-
45 files changed, 77 insertions(+), 87 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
index afbaa0465842..cb56d38c7188 100644
--- a/drivers/gpu/drm/i915/display/icl_dsi.c
+++ b/drivers/gpu/drm/i915/display/icl_dsi.c
@@ -1419,7 +1419,7 @@ static void gen11_dsi_disable_io_power(struct intel_encoder *encoder)
for_each_dsi_port(port, intel_dsi->ports) {
struct ref_tracker *wakeref;
- wakeref = fetch_and_zero(&intel_dsi->io_wakeref[port]);
+ wakeref = xchg(&intel_dsi->io_wakeref[port], NULL);
intel_display_power_put(display,
port == PORT_A ?
POWER_DOMAIN_PORT_DDI_IO_A :
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
index 2681940a5cfe..1227472e077c 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -1004,7 +1004,7 @@ main_link_aux_power_domain_put(struct intel_digital_port *dig_port,
intel_ddi_main_link_aux_domain(dig_port, crtc_state);
struct ref_tracker *wf;
- wf = fetch_and_zero(&dig_port->aux_wakeref);
+ wf = xchg(&dig_port->aux_wakeref, NULL);
if (!wf)
return;
@@ -3174,7 +3174,7 @@ static void intel_ddi_post_disable_dp(struct intel_atomic_state *state,
intel_pps_vdd_on(intel_dp);
intel_pps_off(intel_dp);
- wakeref = fetch_and_zero(&dig_port->ddi_io_wakeref);
+ wakeref = xchg(&dig_port->ddi_io_wakeref, NULL);
if (wakeref)
intel_display_power_put(display,
@@ -3210,7 +3210,7 @@ static void intel_ddi_post_disable_hdmi(struct intel_atomic_state *state,
if (DISPLAY_VER(display) >= 12)
intel_ddi_disable_transcoder_clock(old_crtc_state);
- wakeref = fetch_and_zero(&dig_port->ddi_io_wakeref);
+ wakeref = xchg(&dig_port->ddi_io_wakeref, NULL);
if (wakeref)
intel_display_power_put(display,
dig_port->ddi_io_power_domain,
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 674a4ece6d0f..34b40a6bed5f 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7594,8 +7594,8 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
*
* FIXME get rid of this funny new->old swapping
*/
- old_crtc_state->dsb_color = fetch_and_zero(&new_crtc_state->dsb_color);
- old_crtc_state->dsb_commit = fetch_and_zero(&new_crtc_state->dsb_commit);
+ old_crtc_state->dsb_color = xchg(&new_crtc_state->dsb_color, NULL);
+ old_crtc_state->dsb_commit = xchg(&new_crtc_state->dsb_commit, NULL);
}
/* Underruns don't always raise interrupts, so check manually */
diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c
index 80ecf373fb19..43f35daa65b7 100644
--- a/drivers/gpu/drm/i915/display/intel_display_power.c
+++ b/drivers/gpu/drm/i915/display/intel_display_power.c
@@ -509,7 +509,7 @@ intel_display_power_grab_async_put_ref(struct intel_display *display,
cancel_async_put_work(power_domains, false);
intel_display_rpm_put_raw(display,
- fetch_and_zero(&power_domains->async_put_wakeref));
+ xchg(&power_domains->async_put_wakeref, NULL));
out_verify:
verify_async_put_domains_state(power_domains);
@@ -688,7 +688,7 @@ intel_display_power_put_async_work(struct work_struct *work)
* Bail out if all the domain refs pending to be released were grabbed
* by subsequent gets or a flush_work.
*/
- old_work_wakeref = fetch_and_zero(&power_domains->async_put_wakeref);
+ old_work_wakeref = xchg(&power_domains->async_put_wakeref, NULL);
if (!old_work_wakeref)
goto out_verify;
@@ -709,7 +709,7 @@ intel_display_power_put_async_work(struct work_struct *work)
bitmap_zero(power_domains->async_put_domains[1].bits,
POWER_DOMAIN_NUM);
queue_async_put_domains_work(power_domains,
- fetch_and_zero(&new_work_wakeref),
+ xchg(&new_work_wakeref, NULL),
power_domains->async_put_next_delay);
power_domains->async_put_next_delay = 0;
}
@@ -768,7 +768,7 @@ void __intel_display_power_put_async(struct intel_display *display,
} else {
set_bit(domain, power_domains->async_put_domains[0].bits);
queue_async_put_domains_work(power_domains,
- fetch_and_zero(&work_wakeref),
+ xchg(&work_wakeref, NULL),
delay_ms);
}
@@ -803,7 +803,7 @@ void intel_display_power_flush_work(struct intel_display *display)
mutex_lock(&power_domains->lock);
- work_wakeref = fetch_and_zero(&power_domains->async_put_wakeref);
+ work_wakeref = xchg(&power_domains->async_put_wakeref, NULL);
if (!work_wakeref)
goto out_verify;
@@ -931,7 +931,7 @@ intel_display_power_put_mask_in_set(struct intel_display *display,
struct ref_tracker *__maybe_unused wf = INTEL_WAKEREF_DEF;
#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
- wf = fetch_and_zero(&power_domain_set->wakerefs[domain]);
+ wf = xchg(&power_domain_set->wakerefs[domain], NULL);
#endif
intel_display_power_put(display, domain, wf);
clear_bit(domain, power_domain_set->mask.bits);
@@ -1998,12 +1998,12 @@ void intel_power_domains_init_hw(struct intel_display *display, bool resume)
void intel_power_domains_driver_remove(struct intel_display *display)
{
struct ref_tracker *wakeref __maybe_unused =
- fetch_and_zero(&display->power.domains.init_wakeref);
+ xchg(&display->power.domains.init_wakeref, NULL);
/* Remove the refcount we took to keep power well support disabled. */
if (!display->params.disable_power_well)
intel_display_power_put(display, POWER_DOMAIN_INIT,
- fetch_and_zero(&display->power.domains.disable_wakeref));
+ xchg(&display->power.domains.disable_wakeref, NULL));
intel_display_power_flush_work_sync(display);
@@ -2059,7 +2059,7 @@ void intel_power_domains_sanitize_state(struct intel_display *display)
void intel_power_domains_enable(struct intel_display *display)
{
struct ref_tracker *wakeref __maybe_unused =
- fetch_and_zero(&display->power.domains.init_wakeref);
+ xchg(&display->power.domains.init_wakeref, NULL);
intel_display_power_put(display, POWER_DOMAIN_INIT, wakeref);
intel_power_domains_verify_state(display);
@@ -2098,7 +2098,7 @@ void intel_power_domains_suspend(struct intel_display *display, bool s2idle)
{
struct i915_power_domains *power_domains = &display->power.domains;
struct ref_tracker *wakeref __maybe_unused =
- fetch_and_zero(&power_domains->init_wakeref);
+ xchg(&power_domains->init_wakeref, NULL);
intel_display_power_put(display, POWER_DOMAIN_INIT, wakeref);
@@ -2122,7 +2122,7 @@ void intel_power_domains_suspend(struct intel_display *display, bool s2idle)
*/
if (!display->params.disable_power_well)
intel_display_power_put(display, POWER_DOMAIN_INIT,
- fetch_and_zero(&display->power.domains.disable_wakeref));
+ xchg(&display->power.domains.disable_wakeref, NULL));
intel_display_power_flush_work(display);
intel_power_domains_verify_state(display);
diff --git a/drivers/gpu/drm/i915/display/intel_display_reset.c b/drivers/gpu/drm/i915/display/intel_display_reset.c
index fb3ac52a0acf..e10f85985ae7 100644
--- a/drivers/gpu/drm/i915/display/intel_display_reset.c
+++ b/drivers/gpu/drm/i915/display/intel_display_reset.c
@@ -79,7 +79,7 @@ void intel_display_reset_finish(struct intel_display *display, bool test_only)
struct drm_atomic_state *state;
int ret;
- state = fetch_and_zero(&display->restore.modeset_state);
+ state = xchg(&display->restore.modeset_state, NULL);
if (!state)
goto unlock;
diff --git a/drivers/gpu/drm/i915/display/intel_display_utils.h b/drivers/gpu/drm/i915/display/intel_display_utils.h
index affa3179f52c..55e9b7ed3738 100644
--- a/drivers/gpu/drm/i915/display/intel_display_utils.h
+++ b/drivers/gpu/drm/i915/display/intel_display_utils.h
@@ -12,11 +12,6 @@ struct intel_display;
#define MISSING_CASE(x) WARN(1, "Missing case (%s == %ld)\n", \
__stringify(x), (long)(x))
-#define fetch_and_zero(ptr) ({ \
- typeof(*ptr) __T = *(ptr); \
- *(ptr) = (typeof(*ptr))0; \
- __T; \
-})
#define KHz(x) (1000 * (x))
#define MHz(x) KHz(1000 * (x))
diff --git a/drivers/gpu/drm/i915/display/intel_dmc.c b/drivers/gpu/drm/i915/display/intel_dmc.c
index 0df4f42ba3e3..a1eab309eca1 100644
--- a/drivers/gpu/drm/i915/display/intel_dmc.c
+++ b/drivers/gpu/drm/i915/display/intel_dmc.c
@@ -1335,7 +1335,7 @@ static void intel_dmc_runtime_pm_get(struct intel_display *display)
static void intel_dmc_runtime_pm_put(struct intel_display *display)
{
struct ref_tracker *wakeref __maybe_unused =
- fetch_and_zero(&display->dmc.wakeref);
+ xchg(&display->dmc.wakeref, NULL);
intel_display_power_put(display, POWER_DOMAIN_INIT, wakeref);
}
diff --git a/drivers/gpu/drm/i915/display/intel_pps.c b/drivers/gpu/drm/i915/display/intel_pps.c
index 2d799af73bb7..fb54477f83d6 100644
--- a/drivers/gpu/drm/i915/display/intel_pps.c
+++ b/drivers/gpu/drm/i915/display/intel_pps.c
@@ -863,7 +863,7 @@ static void intel_pps_vdd_off_sync_unlocked(struct intel_dp *intel_dp)
intel_display_power_put(display,
intel_aux_power_domain(dig_port),
- fetch_and_zero(&intel_dp->pps.vdd_wakeref));
+ xchg(&intel_dp->pps.vdd_wakeref, NULL));
}
void intel_pps_vdd_off_sync(struct intel_dp *intel_dp)
@@ -1065,7 +1065,7 @@ void intel_pps_off_unlocked(struct intel_dp *intel_dp)
/* We got a reference when we enabled the VDD. */
intel_display_power_put(display,
intel_aux_power_domain(dig_port),
- fetch_and_zero(&intel_dp->pps.vdd_wakeref));
+ xchg(&intel_dp->pps.vdd_wakeref, NULL));
}
void intel_pps_off(struct intel_dp *intel_dp)
diff --git a/drivers/gpu/drm/i915/display/intel_tc.c b/drivers/gpu/drm/i915/display/intel_tc.c
index a21dd4e3fe4c..2e3bc8c57114 100644
--- a/drivers/gpu/drm/i915/display/intel_tc.c
+++ b/drivers/gpu/drm/i915/display/intel_tc.c
@@ -717,7 +717,7 @@ static bool icl_tc_phy_connect(struct intel_tc_port *tc,
out_release_phy:
icl_tc_phy_take_ownership(tc, false);
out_unblock_tc_cold:
- tc_cold_unblock(tc, fetch_and_zero(&tc->lock_wakeref));
+ tc_cold_unblock(tc, xchg(&tc->lock_wakeref, NULL));
return false;
}
@@ -734,7 +734,7 @@ static void icl_tc_phy_disconnect(struct intel_tc_port *tc)
icl_tc_phy_take_ownership(tc, false);
fallthrough;
case TC_PORT_TBT_ALT:
- tc_cold_unblock(tc, fetch_and_zero(&tc->lock_wakeref));
+ tc_cold_unblock(tc, xchg(&tc->lock_wakeref, NULL));
break;
default:
MISSING_CASE(tc->mode);
@@ -948,7 +948,7 @@ static bool adlp_tc_phy_connect(struct intel_tc_port *tc, int required_lanes)
return true;
out_unblock_tc_cold:
- tc_cold_unblock(tc, fetch_and_zero(&tc->lock_wakeref));
+ tc_cold_unblock(tc, xchg(&tc->lock_wakeref, NULL));
out_release_phy:
adlp_tc_phy_take_ownership(tc, false);
out_put_port_power:
@@ -966,7 +966,7 @@ static void adlp_tc_phy_disconnect(struct intel_tc_port *tc)
port_wakeref = intel_display_power_get(display, port_power_domain);
- tc_cold_unblock(tc, fetch_and_zero(&tc->lock_wakeref));
+ tc_cold_unblock(tc, xchg(&tc->lock_wakeref, NULL));
switch (tc->mode) {
case TC_PORT_LEGACY:
@@ -1220,7 +1220,7 @@ static bool xelpdp_tc_phy_connect(struct intel_tc_port *tc, int required_lanes)
xelpdp_tc_phy_wait_for_tcss_power(tc, false);
out_unblock_tccold:
- tc_cold_unblock(tc, fetch_and_zero(&tc->lock_wakeref));
+ tc_cold_unblock(tc, xchg(&tc->lock_wakeref, NULL));
return false;
}
@@ -1234,7 +1234,7 @@ static void xelpdp_tc_phy_disconnect(struct intel_tc_port *tc)
xelpdp_tc_phy_enable_tcss_power(tc, false);
fallthrough;
case TC_PORT_TBT_ALT:
- tc_cold_unblock(tc, fetch_and_zero(&tc->lock_wakeref));
+ tc_cold_unblock(tc, xchg(&tc->lock_wakeref, NULL));
break;
default:
MISSING_CASE(tc->mode);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
index df35bdb755e4..83c419f8a664 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
@@ -217,7 +217,7 @@ __i915_gem_object_unset_pages(struct drm_i915_gem_object *obj)
assert_object_held_shared(obj);
- pages = fetch_and_zero(&obj->mm.pages);
+ pages = xchg(&obj->mm.pages, NULL);
if (IS_ERR_OR_NULL(pages))
return pages;
@@ -636,7 +636,7 @@ void __i915_gem_object_release_map(struct drm_i915_gem_object *obj)
* Furthermore, since this is an unsafe operation reserved only
* for construction time manipulation, we ignore locking prudence.
*/
- unmap_object(obj, page_mask_bits(fetch_and_zero(&obj->mm.mapping)));
+ unmap_object(obj, page_mask_bits(xchg(&obj->mm.mapping, NULL)));
i915_gem_object_unpin_map(obj);
}
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
index 1cfdcf5c1118..7c86ddca9902 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
@@ -706,7 +706,7 @@ static void
i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
{
struct drm_i915_private *i915 = to_i915(obj->base.dev);
- struct drm_mm_node *stolen = fetch_and_zero(&obj->stolen);
+ struct drm_mm_node *stolen = xchg(&obj->stolen, NULL);
GEM_BUG_ON(!stolen);
__i915_gem_stolen_remove_node(i915, stolen);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
index de70517b4ef2..81cb693f773c 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
@@ -444,7 +444,7 @@ int i915_ttm_purge(struct drm_i915_gem_object *obj)
*/
shmem_truncate_range(file_inode(i915_tt->filp),
0, (loff_t)-1);
- fput(fetch_and_zero(&i915_tt->filp));
+ fput(xchg(&i915_tt->filp, NULL));
}
obj->write_domain = 0;
@@ -916,7 +916,7 @@ static void i915_ttm_put_pages(struct drm_i915_gem_object *obj,
*/
if (obj->mm.rsgt)
- i915_refct_sgt_put(fetch_and_zero(&obj->mm.rsgt));
+ i915_refct_sgt_put(xchg(&obj->mm.rsgt, NULL));
}
/**
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
index 9d405098f9e7..979722756aeb 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
@@ -625,7 +625,7 @@ static void throttle_release(struct i915_request **q, int count)
if (IS_ERR_OR_NULL(q[i]))
continue;
- i915_request_put(fetch_and_zero(&q[i]));
+ i915_request_put(xchg(&q[i], NULL));
}
}
@@ -1083,7 +1083,7 @@ __sseu_prepare(const char *name,
err_fini:
igt_spinner_fini(*spin);
err_free:
- kfree(fetch_and_zero(spin));
+ kfree(xchg(spin, NULL));
return ret;
}
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
index c0fd349a4600..49f9f7242bc4 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
@@ -1026,7 +1026,7 @@ static void cleanup_status_page(struct intel_engine_cs *engine)
/* Prevent writes into HWSP after returning the page to the system */
intel_engine_set_hwsp_writemask(engine, ~0u);
- vma = fetch_and_zero(&engine->status_page.vma);
+ vma = xchg(&engine->status_page.vma, NULL);
if (!vma)
return;
diff --git a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c
index 1359fc9cb88e..8951e2d69be8 100644
--- a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c
+++ b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c
@@ -3203,7 +3203,7 @@ static void execlists_reset_cancel(struct intel_engine_cs *engine)
RB_CLEAR_NODE(rb);
spin_lock(&ve->base.sched_engine->lock);
- rq = fetch_and_zero(&ve->request);
+ rq = xchg(&ve->request, NULL);
if (rq) {
if (i915_request_mark_eio(rq)) {
rq->engine = engine;
@@ -3609,7 +3609,7 @@ static void rcu_virtual_context_destroy(struct work_struct *wrk)
spin_lock_irq(&ve->base.sched_engine->lock);
- old = fetch_and_zero(&ve->request);
+ old = xchg(&ve->request, NULL);
if (old) {
GEM_BUG_ON(!__i915_request_is_complete(old));
__i915_request_submit(old);
diff --git a/drivers/gpu/drm/i915/gt/intel_ggtt.c b/drivers/gpu/drm/i915/gt/intel_ggtt.c
index 64ca5bbc53c6..26ab52b3fa15 100644
--- a/drivers/gpu/drm/i915/gt/intel_ggtt.c
+++ b/drivers/gpu/drm/i915/gt/intel_ggtt.c
@@ -1048,7 +1048,7 @@ static void fini_aliasing_ppgtt(struct i915_ggtt *ggtt)
{
struct i915_ppgtt *ppgtt;
- ppgtt = fetch_and_zero(&ggtt->alias);
+ ppgtt = xchg(&ggtt->alias, NULL);
if (!ppgtt)
return;
@@ -1648,7 +1648,7 @@ bool i915_ggtt_resume_vm(struct i915_address_space *vm, bool all_evicted)
was_bound);
if (obj) { /* only used during resume => exclusive access */
- write_domain_objs |= fetch_and_zero(&obj->write_domain);
+ write_domain_objs |= xchg(&obj->write_domain, 0);
obj->read_domains |= I915_GEM_DOMAIN_GTT;
}
}
diff --git a/drivers/gpu/drm/i915/gt/intel_gsc.c b/drivers/gpu/drm/i915/gt/intel_gsc.c
index 050d909fb4f8..89660993ae07 100644
--- a/drivers/gpu/drm/i915/gt/intel_gsc.c
+++ b/drivers/gpu/drm/i915/gt/intel_gsc.c
@@ -71,7 +71,7 @@ gsc_ext_om_alloc(struct intel_gsc *gsc, struct intel_gsc_intf *intf, size_t size
static void gsc_ext_om_destroy(struct intel_gsc_intf *intf)
{
- struct drm_i915_gem_object *obj = fetch_and_zero(&intf->gem_obj);
+ struct drm_i915_gem_object *obj = xchg(&intf->gem_obj, NULL);
if (!obj)
return;
diff --git a/drivers/gpu/drm/i915/gt/intel_gt.c b/drivers/gpu/drm/i915/gt/intel_gt.c
index 5c7f862f7100..fad0a5b672a9 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt.c
@@ -749,7 +749,7 @@ int intel_gt_init(struct intel_gt *gt)
intel_uc_fini(>->uc);
err_engines:
intel_engines_release(gt);
- i915_vm_put(fetch_and_zero(>->vm));
+ i915_vm_put(xchg(>->vm, NULL));
err_pm:
intel_gt_pm_fini(gt);
intel_gt_fini_scratch(gt);
@@ -820,7 +820,7 @@ void intel_gt_driver_release(struct intel_gt *gt)
{
struct i915_address_space *vm;
- vm = fetch_and_zero(>->vm);
+ vm = xchg(>->vm, NULL);
if (vm) /* FIXME being called twice on error paths :( */
i915_vm_put(vm);
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_pm.c b/drivers/gpu/drm/i915/gt/intel_gt_pm.c
index c7f59d60fac6..09031b337aa7 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_pm.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt_pm.c
@@ -104,7 +104,7 @@ static int __gt_unpark(struct intel_wakeref *wf)
static int __gt_park(struct intel_wakeref *wf)
{
struct intel_gt *gt = container_of(wf, typeof(*gt), wakeref);
- intel_wakeref_t wakeref = fetch_and_zero(>->awake);
+ intel_wakeref_t wakeref = xchg(>->awake, NULL);
struct drm_i915_private *i915 = gt->i915;
struct intel_display *display = i915->display;
diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index 147d22907960..a296cd937203 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -1121,7 +1121,7 @@ __lrc_alloc_state(struct intel_context *ce, struct intel_engine_cs *engine)
static struct intel_timeline *
pinned_timeline(struct intel_context *ce, struct intel_engine_cs *engine)
{
- struct intel_timeline *tl = fetch_and_zero(&ce->timeline);
+ struct intel_timeline *tl = xchg(&ce->timeline, NULL);
return intel_timeline_create_from_engine(engine, page_unmask_bits(tl));
}
@@ -1241,8 +1241,8 @@ void lrc_fini(struct intel_context *ce)
if (!ce->state)
return;
- intel_ring_put(fetch_and_zero(&ce->ring));
- i915_vma_put(fetch_and_zero(&ce->state));
+ intel_ring_put(xchg(&ce->ring, NULL));
+ i915_vma_put(xchg(&ce->state, NULL));
}
void lrc_destroy(struct kref *kref)
diff --git a/drivers/gpu/drm/i915/gt/intel_migrate.c b/drivers/gpu/drm/i915/gt/intel_migrate.c
index aff5aca591e6..8b2224035eb1 100644
--- a/drivers/gpu/drm/i915/gt/intel_migrate.c
+++ b/drivers/gpu/drm/i915/gt/intel_migrate.c
@@ -1152,7 +1152,7 @@ void intel_migrate_fini(struct intel_migrate *m)
{
struct intel_context *ce;
- ce = fetch_and_zero(&m->context);
+ ce = xchg(&m->context, NULL);
if (!ce)
return;
diff --git a/drivers/gpu/drm/i915/gt/intel_rc6.c b/drivers/gpu/drm/i915/gt/intel_rc6.c
index e91e5cdca26c..fbfd671db5a8 100644
--- a/drivers/gpu/drm/i915/gt/intel_rc6.c
+++ b/drivers/gpu/drm/i915/gt/intel_rc6.c
@@ -733,7 +733,7 @@ void intel_rc6_fini(struct intel_rc6 *rc6)
if (IS_METEORLAKE(rc6_to_i915(rc6)) && rc6->bios_state_captured)
intel_uncore_write_fw(uncore, GEN6_RC_STATE, rc6->bios_rc_state);
- pctx = fetch_and_zero(&rc6->pctx);
+ pctx = xchg(&rc6->pctx, NULL);
if (pctx)
i915_gem_object_put(pctx);
diff --git a/drivers/gpu/drm/i915/gt/intel_rps.c b/drivers/gpu/drm/i915/gt/intel_rps.c
index a33b19c04737..b99ad7acdacf 100644
--- a/drivers/gpu/drm/i915/gt/intel_rps.c
+++ b/drivers/gpu/drm/i915/gt/intel_rps.c
@@ -1828,7 +1828,7 @@ static void rps_work(struct work_struct *work)
u32 pm_iir = 0;
spin_lock_irq(gt->irq_lock);
- pm_iir = fetch_and_zero(&rps->pm_iir) & rps->pm_events;
+ pm_iir = xchg(&rps->pm_iir, 0) & rps->pm_events;
client_boost = atomic_read(&rps->num_waiters);
spin_unlock_irq(gt->irq_lock);
diff --git a/drivers/gpu/drm/i915/gt/selftest_context.c b/drivers/gpu/drm/i915/gt/selftest_context.c
index ab76703f6e8b..24e4cb4fdd48 100644
--- a/drivers/gpu/drm/i915/gt/selftest_context.c
+++ b/drivers/gpu/drm/i915/gt/selftest_context.c
@@ -174,7 +174,7 @@ static int live_context_size(void *arg)
* active state is sufficient, we are only checking that we
* don't use more than we planned.
*/
- saved = fetch_and_zero(&engine->default_state);
+ saved = xchg(&engine->default_state, NULL);
/* Overlaps with the execlists redzone */
engine->context_size += I915_GTT_PAGE_SIZE;
diff --git a/drivers/gpu/drm/i915/gt/selftest_ring_submission.c b/drivers/gpu/drm/i915/gt/selftest_ring_submission.c
index 600333ae6c8c..0e74bdcf54d5 100644
--- a/drivers/gpu/drm/i915/gt/selftest_ring_submission.c
+++ b/drivers/gpu/drm/i915/gt/selftest_ring_submission.c
@@ -270,7 +270,7 @@ static int live_ctx_switch_wa(void *arg)
if (IS_GRAPHICS_VER(gt->i915, 4, 5))
continue; /* MI_STORE_DWORD is privileged! */
- saved_wa = fetch_and_zero(&engine->wa_ctx.vma);
+ saved_wa = xchg(&engine->wa_ctx.vma, NULL);
intel_engine_pm_get(engine);
err = __live_ctx_switch_wa(engine);
diff --git a/drivers/gpu/drm/i915/gt/selftest_timeline.c b/drivers/gpu/drm/i915/gt/selftest_timeline.c
index 29d860a5c9c8..3bce20fbdc7d 100644
--- a/drivers/gpu/drm/i915/gt/selftest_timeline.c
+++ b/drivers/gpu/drm/i915/gt/selftest_timeline.c
@@ -892,7 +892,7 @@ static int create_watcher(struct hwsp_watcher *w,
static int check_watcher(struct hwsp_watcher *w, const char *name,
bool (*op)(u32 hwsp, u32 seqno))
{
- struct i915_request *rq = fetch_and_zero(&w->rq);
+ struct i915_request *rq = xchg(&w->rq, NULL);
u32 offset, end;
int err;
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.c b/drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.c
index e7444ebc373e..bff110c747b8 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.c
@@ -388,7 +388,7 @@ void intel_gsc_proxy_fini(struct intel_gsc_uc *gsc)
struct intel_gt *gt = gsc_uc_to_gt(gsc);
struct drm_i915_private *i915 = gt->i915;
- if (fetch_and_zero(&gsc->proxy.component_added))
+ if (xchg(&gsc->proxy.component_added, false))
component_del(i915->drm.dev, &i915_gsc_proxy_component_ops);
proxy_channel_free(gsc);
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.c b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.c
index 3d3191deb0ab..26afa6ca14dd 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.c
@@ -197,7 +197,7 @@ static int gsc_allocate_and_map_vma(struct intel_gsc_uc *gsc, u32 size)
static void gsc_unmap_and_free_vma(struct intel_gsc_uc *gsc)
{
- struct i915_vma *vma = fetch_and_zero(&gsc->local);
+ struct i915_vma *vma = xchg(&gsc->local, NULL);
if (!vma)
return;
@@ -264,7 +264,7 @@ void intel_gsc_uc_fini(struct intel_gsc_uc *gsc)
intel_gsc_proxy_fini(gsc);
if (gsc->ce)
- intel_engine_destroy_pinned_context(fetch_and_zero(&gsc->ce));
+ intel_engine_destroy_pinned_context(xchg(&gsc->ce, NULL));
gsc_unmap_and_free_vma(gsc);
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_uc.c b/drivers/gpu/drm/i915/gt/uc/intel_uc.c
index bd07c72a66fc..70c21f8587c2 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_uc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_uc.c
@@ -157,7 +157,7 @@ static void __uc_capture_load_err_log(struct intel_uc *uc)
static void __uc_free_load_err_log(struct intel_uc *uc)
{
- struct drm_i915_gem_object *log = fetch_and_zero(&uc->load_err_log);
+ struct drm_i915_gem_object *log = xchg(&uc->load_err_log, NULL);
if (log)
i915_gem_object_put(log);
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
index 7fac97fe30a6..6bf58240ebed 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c
@@ -1260,7 +1260,7 @@ void intel_uc_fw_cleanup_fetch(struct intel_uc_fw *uc_fw)
if (!intel_uc_fw_is_available(uc_fw))
return;
- i915_gem_object_put(fetch_and_zero(&uc_fw->obj));
+ i915_gem_object_put(xchg(&uc_fw->obj, NULL));
intel_uc_fw_change_status(uc_fw, INTEL_UC_FIRMWARE_SELECTED);
}
diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
index ec62db5cc367..598ac074e53f 100644
--- a/drivers/gpu/drm/i915/gvt/kvmgt.c
+++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
@@ -1787,7 +1787,7 @@ static int init_service_thread(struct intel_gvt *gvt)
*/
static void intel_gvt_clean_device(struct drm_i915_private *i915)
{
- struct intel_gvt *gvt = fetch_and_zero(&i915->gvt);
+ struct intel_gvt *gvt = xchg(&i915->gvt, NULL);
if (drm_WARN_ON(&i915->drm, !gvt))
return;
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
index 15fdd514ca83..4bc0f81def10 100644
--- a/drivers/gpu/drm/i915/gvt/scheduler.c
+++ b/drivers/gpu/drm/i915/gvt/scheduler.c
@@ -836,7 +836,7 @@ static int dispatch_workload(struct intel_vgpu_workload *workload)
/* We might still need to add request with
* clean ctx to retire it properly..
*/
- rq = fetch_and_zero(&workload->req);
+ rq = xchg(&workload->req, NULL);
i915_request_put(rq);
}
@@ -1114,7 +1114,7 @@ static void complete_current_workload(struct intel_gvt *gvt, int ring_id)
intel_vgpu_trigger_virtual_event(vgpu, event);
}
- i915_request_put(fetch_and_zero(&workload->req));
+ i915_request_put(xchg(&workload->req, NULL));
}
gvt_dbg_sched("ring id %d complete workload %p status %d\n",
diff --git a/drivers/gpu/drm/i915/i915_drm_client.c b/drivers/gpu/drm/i915/i915_drm_client.c
index 82cbb0528ff1..e493171fca80 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.c
+++ b/drivers/gpu/drm/i915/i915_drm_client.c
@@ -194,7 +194,7 @@ void i915_drm_client_add_object(struct i915_drm_client *client,
void i915_drm_client_remove_object(struct drm_i915_gem_object *obj)
{
- struct i915_drm_client *client = fetch_and_zero(&obj->client);
+ struct i915_drm_client *client = xchg(&obj->client, NULL);
unsigned long flags;
/* Object may not be associated with a client. */
diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
index b0e121462ca3..f2cee0be8657 100644
--- a/drivers/gpu/drm/i915/i915_fb_pin.c
+++ b/drivers/gpu/drm/i915/i915_fb_pin.c
@@ -336,17 +336,17 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
struct i915_vma *vma;
if (!intel_fb_uses_dpt(&fb->base)) {
- vma = fetch_and_zero(&old_plane_state->ggtt_vma);
+ vma = xchg(&old_plane_state->ggtt_vma, NULL);
if (vma) {
intel_fb_unpin_vma(vma, old_plane_state->fence_id);
old_plane_state->fence_id = -1;
}
} else {
- vma = fetch_and_zero(&old_plane_state->dpt_vma);
+ vma = xchg(&old_plane_state->dpt_vma, NULL);
if (vma)
intel_fb_unpin_vma(vma, -1);
- vma = fetch_and_zero(&old_plane_state->ggtt_vma);
+ vma = xchg(&old_plane_state->ggtt_vma, NULL);
if (vma)
i915_dpt_unpin_from_ggtt(fb->dpt);
}
diff --git a/drivers/gpu/drm/i915/i915_overlay.c b/drivers/gpu/drm/i915/i915_overlay.c
index 6de550a17756..10ef28becce7 100644
--- a/drivers/gpu/drm/i915/i915_overlay.c
+++ b/drivers/gpu/drm/i915/i915_overlay.c
@@ -201,7 +201,7 @@ static void i915_overlay_release_old_vma(struct i915_overlay *overlay)
struct intel_display *display = i915->display;
struct i915_vma *vma;
- vma = fetch_and_zero(&overlay->old_vma);
+ vma = xchg(&overlay->old_vma, NULL);
if (drm_WARN_ON(&i915->drm, !vma))
return;
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 19b82427aa41..b2d01e5c7d19 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -1617,7 +1617,7 @@ static void oa_put_render_ctx_id(struct i915_perf_stream *stream)
{
struct intel_context *ce;
- ce = fetch_and_zero(&stream->pinned_ctx);
+ ce = xchg(&stream->pinned_ctx, NULL);
if (ce) {
ce->tag = 0; /* recomputed on next submission after parking */
intel_context_unpin(ce);
diff --git a/drivers/gpu/drm/i915/i915_query.c b/drivers/gpu/drm/i915/i915_query.c
index 0c55fb6e9727..dbddaab88098 100644
--- a/drivers/gpu/drm/i915/i915_query.c
+++ b/drivers/gpu/drm/i915/i915_query.c
@@ -406,7 +406,7 @@ static int query_perf_config_list(struct drm_i915_private *i915,
if (!ids)
return -ENOMEM;
- alloc = fetch_and_zero(&n_configs);
+ alloc = xchg(&n_configs, 0);
ids[n_configs++] = 1ull; /* reserved for test_config */
rcu_read_lock();
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index d2c7b1090df0..755de69a33e0 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -118,7 +118,7 @@ static void i915_fence_release(struct dma_fence *fence)
GEM_BUG_ON(rq->guc_prio != GUC_PRIO_INIT &&
rq->guc_prio != GUC_PRIO_FINI);
- i915_request_free_capture_list(fetch_and_zero(&rq->capture_list));
+ i915_request_free_capture_list(xchg(&rq->capture_list, NULL));
if (rq->batch_res) {
i915_vma_resource_put(rq->batch_res);
rq->batch_res = NULL;
@@ -1956,7 +1956,7 @@ static void request_wait_wake(struct dma_fence *fence, struct dma_fence_cb *cb)
{
struct request_wait *wait = container_of(cb, typeof(*wait), cb);
- wake_up_process(fetch_and_zero(&wait->tsk));
+ wake_up_process(xchg(&wait->tsk, NULL));
}
/**
diff --git a/drivers/gpu/drm/i915/i915_utils.h b/drivers/gpu/drm/i915/i915_utils.h
index ecc20e0528f4..4e25dcc0302b 100644
--- a/drivers/gpu/drm/i915/i915_utils.h
+++ b/drivers/gpu/drm/i915/i915_utils.h
@@ -45,11 +45,6 @@ struct drm_i915_private;
drm_err(&(i915)->drm, fmt, ##__VA_ARGS__); \
})
-#define fetch_and_zero(ptr) ({ \
- typeof(*ptr) __T = *(ptr); \
- *(ptr) = (typeof(*ptr))0; \
- __T; \
-})
/*
* check_user_mbz: Check that a user value exists and is zero
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index afc192d9931b..662f9670420c 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -671,7 +671,7 @@ void i915_vma_unpin_and_release(struct i915_vma **p_vma, unsigned int flags)
struct i915_vma *vma;
struct drm_i915_gem_object *obj;
- vma = fetch_and_zero(p_vma);
+ vma = xchg(p_vma, NULL);
if (!vma)
return;
diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c
index 35f96ce7822f..dfed12c24af4 100644
--- a/drivers/gpu/drm/i915/intel_memory_region.c
+++ b/drivers/gpu/drm/i915/intel_memory_region.c
@@ -417,7 +417,7 @@ void intel_memory_regions_driver_release(struct drm_i915_private *i915)
for (i = 0; i < ARRAY_SIZE(i915->mm.regions); i++) {
struct intel_memory_region *region =
- fetch_and_zero(&i915->mm.regions[i]);
+ xchg(&i915->mm.regions[i], NULL);
if (region)
intel_memory_region_destroy(region);
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 170e83a8c9fc..c425ca781e86 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -660,7 +660,7 @@ void intel_uncore_resume_early(struct intel_uncore *uncore)
if (!intel_uncore_has_forcewake(uncore))
return;
- restore_forcewake = fetch_and_zero(&uncore->fw_domains_saved);
+ restore_forcewake = xchg(&uncore->fw_domains_saved, 0);
forcewake_early_sanitize(uncore, restore_forcewake);
iosf_mbi_register_pmic_bus_access_notifier(&uncore->pmic_bus_access_nb);
@@ -2138,7 +2138,7 @@ static void fw_domain_fini(struct intel_uncore *uncore,
GEM_BUG_ON(domain_id >= FW_DOMAIN_ID_COUNT);
- d = fetch_and_zero(&uncore->fw_domain[domain_id]);
+ d = xchg(&uncore->fw_domain[domain_id], NULL);
if (!d)
return;
diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp.c b/drivers/gpu/drm/i915/pxp/intel_pxp.c
index 3d7f045f662d..b4e0517a0e22 100644
--- a/drivers/gpu/drm/i915/pxp/intel_pxp.c
+++ b/drivers/gpu/drm/i915/pxp/intel_pxp.c
@@ -115,7 +115,7 @@ static int create_vcs_context(struct intel_pxp *pxp)
static void destroy_vcs_context(struct intel_pxp *pxp)
{
if (pxp->ce)
- intel_engine_destroy_pinned_context(fetch_and_zero(&pxp->ce));
+ intel_engine_destroy_pinned_context(xchg(&pxp->ce, NULL));
}
static void pxp_init_full(struct intel_pxp *pxp)
diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp_session.c b/drivers/gpu/drm/i915/pxp/intel_pxp_session.c
index 1e63261b620f..875f40e6ac17 100644
--- a/drivers/gpu/drm/i915/pxp/intel_pxp_session.c
+++ b/drivers/gpu/drm/i915/pxp/intel_pxp_session.c
@@ -139,7 +139,7 @@ void intel_pxp_terminate(struct intel_pxp *pxp, bool post_invalidation_needs_res
static void pxp_terminate_complete(struct intel_pxp *pxp)
{
/* Re-create the arb session after teardown handle complete */
- if (fetch_and_zero(&pxp->hw_state_invalidated)) {
+ if (xchg(&pxp->hw_state_invalidated, false)) {
drm_dbg(&pxp->ctrl_gt->i915->drm, "PXP: creating arb_session after invalidation");
pxp_create_arb_session(pxp);
}
@@ -155,7 +155,7 @@ static void pxp_session_work(struct work_struct *work)
u32 events = 0;
spin_lock_irq(gt->irq_lock);
- events = fetch_and_zero(&pxp->session_events);
+ events = xchg(&pxp->session_events, 0);
spin_unlock_irq(gt->irq_lock);
if (!events)
diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp_tee.c b/drivers/gpu/drm/i915/pxp/intel_pxp_tee.c
index 1784153f0cf8..1e441a9cd54c 100644
--- a/drivers/gpu/drm/i915/pxp/intel_pxp_tee.c
+++ b/drivers/gpu/drm/i915/pxp/intel_pxp_tee.c
@@ -278,7 +278,7 @@ static int alloc_streaming_command(struct intel_pxp *pxp)
static void free_streaming_command(struct intel_pxp *pxp)
{
- struct drm_i915_gem_object *obj = fetch_and_zero(&pxp->stream_cmd.obj);
+ struct drm_i915_gem_object *obj = xchg(&pxp->stream_cmd.obj, NULL);
if (!obj)
return;
--
2.53.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH] drm/i915: replace fetch_and_zero() with kernel xchg()
2026-04-27 12:13 [PATCH] drm/i915: replace fetch_and_zero() with kernel xchg() Sebastian Brzezinka
@ 2026-04-27 12:26 ` Jani Nikula
2026-04-27 12:37 ` Sebastian Brzezinka
2026-04-28 14:47 ` Andi Shyti
0 siblings, 2 replies; 7+ messages in thread
From: Jani Nikula @ 2026-04-27 12:26 UTC (permalink / raw)
To: Sebastian Brzezinka, intel-gfx
Cc: Sebastian Brzezinka, andi.shyti, krzysztof.karas
On Mon, 27 Apr 2026, Sebastian Brzezinka <sebastian.brzezinka@intel.com> wrote:
> The i915 local fetch_and_zero() macro is a non-atomic
> fetch-and-zero operation defined in i915_utils.h and duplicated in
> display/intel_display_utils.h. Its functionality is equivalent to the
> kernel-provided xchg().
While I dislike having the local fetch_and_zero() macro around, the
usage does not need to be atomic, and there's no need to switch to the
atomic xchg() at all.
Using atomic xchg() gives the wrong impression to the reader that the
atomicity matters when it doesn't.
So that's a no for this patch.
There's been a few attempts at fixing this in the past, one I found was
[1].
[1] https://lore.kernel.org/r/20221209154843.4162814-1-andrzej.hajda@intel.com
> Replace fetch_and_zero() with the kernel provided xchg(), and
> remove the now unused macro definitions from both i915_utils.h and
> display/intel_display_utils.h.
>
> Reviewed-by: Krzysztof Karas <krzysztof.karas@intel.com>
Where did this happen? Was there a v1? Is this v2?
BR,
Jani.
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] drm/i915: replace fetch_and_zero() with kernel xchg()
2026-04-27 12:26 ` Jani Nikula
@ 2026-04-27 12:37 ` Sebastian Brzezinka
2026-04-27 12:48 ` Jani Nikula
2026-04-28 14:47 ` Andi Shyti
1 sibling, 1 reply; 7+ messages in thread
From: Sebastian Brzezinka @ 2026-04-27 12:37 UTC (permalink / raw)
To: Jani Nikula, Sebastian Brzezinka, intel-gfx; +Cc: andi.shyti, krzysztof.karas
Hi Jani,
On Mon Apr 27, 2026 at 2:26 PM CEST, Jani Nikula wrote:
> On Mon, 27 Apr 2026, Sebastian Brzezinka <sebastian.brzezinka@intel.com> wrote:
>> The i915 local fetch_and_zero() macro is a non-atomic
>> fetch-and-zero operation defined in i915_utils.h and duplicated in
>> display/intel_display_utils.h. Its functionality is equivalent to the
>> kernel-provided xchg().
>
> While I dislike having the local fetch_and_zero() macro around, the
> usage does not need to be atomic, and there's no need to switch to the
> atomic xchg() at all.
>
> Using atomic xchg() gives the wrong impression to the reader that the
> atomicity matters when it doesn't.
>
> So that's a no for this patch.
>
> There's been a few attempts at fixing this in the past, one I found was
> [1].
>
> [1] https://lore.kernel.org/r/20221209154843.4162814-1-andrzej.hajda@intel.com
Thank you for the clarification. It’s good to know.
>> Replace fetch_and_zero() with the kernel provided xchg(), and
>> remove the now unused macro definitions from both i915_utils.h and
>> display/intel_display_utils.h.
>>
>> Reviewed-by: Krzysztof Karas <krzysztof.karas@intel.com>
>
> Where did this happen? Was there a v1? Is this v2?
This patch was initially sent to trybot and received Review-by: Krzysztof
there. So I’ve copied it here.
--
Best regards,
Sebastian
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] drm/i915: replace fetch_and_zero() with kernel xchg()
2026-04-27 12:37 ` Sebastian Brzezinka
@ 2026-04-27 12:48 ` Jani Nikula
2026-04-27 12:51 ` Sebastian Brzezinka
0 siblings, 1 reply; 7+ messages in thread
From: Jani Nikula @ 2026-04-27 12:48 UTC (permalink / raw)
To: Sebastian Brzezinka, Sebastian Brzezinka, intel-gfx
Cc: andi.shyti, krzysztof.karas
On Mon, 27 Apr 2026, Sebastian Brzezinka <sebastian.brzezinka@intel.com> wrote:
> This patch was initially sent to trybot and received Review-by: Krzysztof
> there. So I’ve copied it here.
In most cases, patches shouldn't be sent to trybot, and the trybot list
shouldn't be used for reviews.
Trybot is primarily for testing out an idea when you're not sure how
things would work on a bunch of real hardware. Or when the patch is not
intended for merging at all. It's not for a generic preliminary round of
testing. If trybot results pass, you'll still need to send the patch for
CI and review and merging on the actual list, and it just ends up
wasting a CI round.
BR,
Jani.
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] drm/i915: replace fetch_and_zero() with kernel xchg()
2026-04-27 12:48 ` Jani Nikula
@ 2026-04-27 12:51 ` Sebastian Brzezinka
2026-04-27 12:54 ` Jani Nikula
0 siblings, 1 reply; 7+ messages in thread
From: Sebastian Brzezinka @ 2026-04-27 12:51 UTC (permalink / raw)
To: Jani Nikula, Sebastian Brzezinka, intel-gfx; +Cc: andi.shyti, krzysztof.karas
On Mon Apr 27, 2026 at 2:48 PM CEST, Jani Nikula wrote:
> On Mon, 27 Apr 2026, Sebastian Brzezinka <sebastian.brzezinka@intel.com> wrote:
>> This patch was initially sent to trybot and received Review-by: Krzysztof
>> there. So I’ve copied it here.
>
> In most cases, patches shouldn't be sent to trybot, and the trybot list
> shouldn't be used for reviews.
>
> Trybot is primarily for testing out an idea when you're not sure how
> things would work on a bunch of real hardware. Or when the patch is not
> intended for merging at all. It's not for a generic preliminary round of
> testing. If trybot results pass, you'll still need to send the patch for
> CI and review and merging on the actual list, and it just ends up
> wasting a CI round.
>
>
> BR,
> Jani.
My bad, sorry for that.
--
Best regards,
Sebastian
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] drm/i915: replace fetch_and_zero() with kernel xchg()
2026-04-27 12:51 ` Sebastian Brzezinka
@ 2026-04-27 12:54 ` Jani Nikula
0 siblings, 0 replies; 7+ messages in thread
From: Jani Nikula @ 2026-04-27 12:54 UTC (permalink / raw)
To: Sebastian Brzezinka, Sebastian Brzezinka, intel-gfx
Cc: andi.shyti, krzysztof.karas
On Mon, 27 Apr 2026, Sebastian Brzezinka <sebastian.brzezinka@intel.com> wrote:
> My bad, sorry for that.
Hey, no apologies needed. I'm sure this is not properly documented
anywhere, and even if it were, there'd be so much documentation nobody
would read it anyway. ;)
BR,
Jani.
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] drm/i915: replace fetch_and_zero() with kernel xchg()
2026-04-27 12:26 ` Jani Nikula
2026-04-27 12:37 ` Sebastian Brzezinka
@ 2026-04-28 14:47 ` Andi Shyti
1 sibling, 0 replies; 7+ messages in thread
From: Andi Shyti @ 2026-04-28 14:47 UTC (permalink / raw)
To: Jani Nikula; +Cc: Sebastian Brzezinka, intel-gfx, andi.shyti, krzysztof.karas
Hi Jani,
On Mon, Apr 27, 2026 at 03:26:13PM +0300, Jani Nikula wrote:
> On Mon, 27 Apr 2026, Sebastian Brzezinka <sebastian.brzezinka@intel.com> wrote:
> > The i915 local fetch_and_zero() macro is a non-atomic
> > fetch-and-zero operation defined in i915_utils.h and duplicated in
> > display/intel_display_utils.h. Its functionality is equivalent to the
> > kernel-provided xchg().
>
> While I dislike having the local fetch_and_zero() macro around, the
> usage does not need to be atomic, and there's no need to switch to the
> atomic xchg() at all.
>
> Using atomic xchg() gives the wrong impression to the reader that the
> atomicity matters when it doesn't.
>
> So that's a no for this patch.
this change was suggested by me because in a previous patch we
switched from fetch_and_zero to xchg, but then there was a need
for atomic.
I still think the change is valid whenever we think there is a
need for an atomic version of fetch_and_zero().
This patch is intended not to change any behavior, while setting
a political atomic xchg to every fetch_and_zero is actually
changing the overall behavior.
Thanks,
Andi
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-04-28 14:47 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-27 12:13 [PATCH] drm/i915: replace fetch_and_zero() with kernel xchg() Sebastian Brzezinka
2026-04-27 12:26 ` Jani Nikula
2026-04-27 12:37 ` Sebastian Brzezinka
2026-04-27 12:48 ` Jani Nikula
2026-04-27 12:51 ` Sebastian Brzezinka
2026-04-27 12:54 ` Jani Nikula
2026-04-28 14:47 ` Andi Shyti
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.