From: Thomas Zimmermann <tzimmermann@suse.de>
To: Jani Nikula <jani.nikula@intel.com>, dri-devel@lists.freedesktop.org
Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org,
ville.syrjala@linux.intel.com
Subject: Re: [PATCH 24/24] drm/vblank: clean up debug logging
Date: Thu, 13 Nov 2025 15:05:59 +0100 [thread overview]
Message-ID: <fcf78f4b-e45d-43c2-8fb6-2366e016ed28@suse.de> (raw)
In-Reply-To: <ac70a7318a7b9d5e25f47e97df4b0fdb8b335e74.1762791343.git.jani.nikula@intel.com>
Hi
Am 10.11.25 um 17:17 schrieb Jani Nikula:
> Use the usual [CRTC:%d:%s] when crtc is available. Start using a new
> uniform [VBLANK:%u] prefix with the pipe when crtc is not
> available. Remove extra line breaks. Use string choice helpers here and
> there. Use %pe to decode error returns.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Given Ville's comment on decoupling pipes and CRTCs, would it make sense
to prefer [VBLANK] over [CRTC]? This seems to be possible with some of
these changes.
Best regards
Thomas
> ---
> drivers/gpu/drm/drm_vblank.c | 109 ++++++++++++++++-------------------
> 1 file changed, 50 insertions(+), 59 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
> index 7829e64e42b4..5ee132b3a6b5 100644
> --- a/drivers/gpu/drm/drm_vblank.c
> +++ b/drivers/gpu/drm/drm_vblank.c
> @@ -27,6 +27,7 @@
> #include <linux/export.h>
> #include <linux/kthread.h>
> #include <linux/moduleparam.h>
> +#include <linux/string_choices.h>
>
> #include <drm/drm_crtc.h>
> #include <drm/drm_drv.h>
> @@ -347,14 +348,13 @@ static void drm_update_vblank_count(struct drm_vblank_crtc *vblank,
> * frame/field duration.
> */
>
> - drm_dbg_vbl(dev, "crtc %u: Calculating number of vblanks."
> - " diff_ns = %lld, framedur_ns = %d)\n",
> + drm_dbg_vbl(dev, "[VBLANK:%u] Calculating number of vblanks. diff_ns = %lld, framedur_ns = %d)\n",
> pipe, (long long)diff_ns, framedur_ns);
>
> diff = DIV_ROUND_CLOSEST_ULL(diff_ns, framedur_ns);
>
> if (diff == 0 && in_vblank_irq)
> - drm_dbg_vbl(dev, "crtc %u: Redundant vblirq ignored\n",
> + drm_dbg_vbl(dev, "[VBLANK:%u] Redundant vblirq ignored\n",
> pipe);
> } else {
> /* some kind of default for drivers w/o accurate vbl timestamping */
> @@ -372,13 +372,12 @@ static void drm_update_vblank_count(struct drm_vblank_crtc *vblank,
> */
> if (diff > 1 && (vblank->inmodeset & 0x2)) {
> drm_dbg_vbl(dev,
> - "clamping vblank bump to 1 on crtc %u: diffr=%u"
> - " due to pre-modeset.\n", pipe, diff);
> + "[VBLANK:%u] clamping vblank bump to 1: diffr=%u due to pre-modeset.\n",
> + pipe, diff);
> diff = 1;
> }
>
> - drm_dbg_vbl(dev, "updating vblank count on crtc %u:"
> - " current=%llu, diff=%u, hw=%u hw_last=%u\n",
> + drm_dbg_vbl(dev, "[VBLANK:%u] updating vblank count: current=%llu, diff=%u, hw=%u hw_last=%u\n",
> pipe, (unsigned long long)atomic64_read(&vblank->count),
> diff, cur_vblank, vblank->last);
>
> @@ -517,7 +516,7 @@ static void vblank_disable_fn(struct timer_list *t)
>
> spin_lock_irqsave(&dev->vbl_lock, irqflags);
> if (atomic_read(&vblank->refcount) == 0 && vblank->enabled) {
> - drm_dbg_core(dev, "disabling vblank on crtc %u\n", pipe);
> + drm_dbg_core(dev, "[VBLANK:%u] disabling vblank\n", pipe);
> drm_vblank_disable_and_save(vblank);
> }
> spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
> @@ -665,8 +664,8 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc,
> if (mode->flags & DRM_MODE_FLAG_INTERLACE)
> framedur_ns /= 2;
> } else {
> - drm_err(dev, "crtc %u: Can't calculate constants, dotclock = 0!\n",
> - crtc->base.id);
> + drm_err(dev, "[CRTC:%d:%s] Can't calculate constants, dotclock = 0!\n",
> + crtc->base.id, crtc->name);
> }
>
> vblank->linedur_ns = linedur_ns;
> @@ -674,11 +673,11 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc,
> drm_mode_copy(&vblank->hwmode, mode);
>
> drm_dbg_core(dev,
> - "crtc %u: hwmode: htotal %d, vtotal %d, vdisplay %d\n",
> - crtc->base.id, mode->crtc_htotal,
> + "[CRTC:%d:%s] hwmode: htotal %d, vtotal %d, vdisplay %d\n",
> + crtc->base.id, crtc->name, mode->crtc_htotal,
> mode->crtc_vtotal, mode->crtc_vdisplay);
> - drm_dbg_core(dev, "crtc %u: clock %d kHz framedur %d linedur %d\n",
> - crtc->base.id, dotclock, framedur_ns, linedur_ns);
> + drm_dbg_core(dev, "[CRTC:%d:%s] clock %d kHz framedur %d linedur %d\n",
> + crtc->base.id, crtc->name, dotclock, framedur_ns, linedur_ns);
> }
> EXPORT_SYMBOL(drm_calc_timestamping_constants);
>
> @@ -731,7 +730,8 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
>
> /* Scanout position query not supported? Should not happen. */
> if (!get_scanout_position) {
> - drm_err(dev, "Called from CRTC w/o get_scanout_position()!?\n");
> + drm_err(dev, "[CRTC:%d:%s] Called from CRTC w/o get_scanout_position()!?\n",
> + crtc->base.id, crtc->name);
> return false;
> }
>
> @@ -744,7 +744,7 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
> * Happens during initial modesetting of a crtc.
> */
> if (mode->crtc_clock == 0) {
> - drm_dbg_core(dev, "crtc %u: Noop due to uninitialized mode.\n",
> + drm_dbg_core(dev, "[VBLANK:%u] Noop due to uninitialized mode.\n",
> pipe);
> drm_WARN_ON_ONCE(dev, drm_drv_uses_atomic_modeset(dev));
> return false;
> @@ -769,9 +769,8 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
>
> /* Return as no-op if scanout query unsupported or failed. */
> if (!vbl_status) {
> - drm_dbg_core(dev,
> - "crtc %u : scanoutpos query failed.\n",
> - pipe);
> + drm_dbg_core(dev, "[CRTC:%d:%s] scanoutpos query failed.\n",
> + crtc->base.id, crtc->name);
> return false;
> }
>
> @@ -785,9 +784,8 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
>
> /* Noisy system timing? */
> if (i == DRM_TIMESTAMP_MAXRETRIES) {
> - drm_dbg_core(dev,
> - "crtc %u: Noisy timestamp %d us > %d us [%d reps].\n",
> - pipe, duration_ns / 1000, *max_error / 1000, i);
> + drm_dbg_core(dev, "[CRTC:%d:%s] Noisy timestamp %d us > %d us [%d reps].\n",
> + crtc->base.id, crtc->name, duration_ns / 1000, *max_error / 1000, i);
> }
>
> /* Return upper bound of timestamp precision error. */
> @@ -811,9 +809,8 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
> ts_etime = ktime_to_timespec64(etime);
> ts_vblank_time = ktime_to_timespec64(*vblank_time);
>
> - drm_dbg_vbl(dev,
> - "crtc %u : v p(%d,%d)@ %lld.%06ld -> %lld.%06ld [e %d us, %d rep]\n",
> - pipe, hpos, vpos,
> + drm_dbg_vbl(dev, "[CRTC:%d:%s] v p(%d,%d)@ %lld.%06ld -> %lld.%06ld [e %d us, %d rep]\n",
> + crtc->base.id, crtc->name, hpos, vpos,
> (u64)ts_etime.tv_sec, ts_etime.tv_nsec / 1000,
> (u64)ts_vblank_time.tv_sec, ts_vblank_time.tv_nsec / 1000,
> duration_ns / 1000, i);
> @@ -1188,7 +1185,7 @@ static int drm_vblank_enable(struct drm_vblank_crtc *vblank)
> * prevent double-accounting of same vblank interval.
> */
> ret = __enable_vblank(vblank);
> - drm_dbg_core(dev, "enabling vblank on crtc %u, ret: %d\n",
> + drm_dbg_core(dev, "[VBLANK:%u] enabling vblank, ret: %d\n",
> pipe, ret);
> if (ret) {
> atomic_dec(&vblank->refcount);
> @@ -1346,8 +1343,9 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
> spin_lock_irq(&dev->event_lock);
>
> spin_lock(&dev->vbl_lock);
> - drm_dbg_vbl(dev, "crtc %d, vblank enabled %d, inmodeset %d\n",
> - pipe, vblank->enabled, vblank->inmodeset);
> + drm_dbg_vbl(dev, "[CRTC:%d:%s] vblank %s, inmodeset: %s\n",
> + crtc->base.id, crtc->name, str_enabled_disabled(vblank->enabled),
> + str_yes_no(vblank->inmodeset));
>
> /* Avoid redundant vblank disables without previous
> * drm_crtc_vblank_on(). */
> @@ -1372,9 +1370,8 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
> list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
> if (e->pipe != pipe)
> continue;
> - drm_dbg_core(dev, "Sending premature vblank event on disable: "
> - "wanted %llu, current %llu\n",
> - e->sequence, seq);
> + drm_dbg_core(dev, "[CRTC:%d:%s] Sending premature vblank event on disable: wanted %llu, current %llu\n",
> + crtc->base.id, crtc->name, e->sequence, seq);
> list_del(&e->base.link);
> drm_vblank_put(vblank);
> send_vblank_event(dev, e, seq, now);
> @@ -1474,12 +1471,12 @@ void drm_crtc_vblank_on_config(struct drm_crtc *crtc,
> const struct drm_vblank_crtc_config *config)
> {
> struct drm_device *dev = crtc->dev;
> - unsigned int pipe = drm_crtc_index(crtc);
> struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
>
> spin_lock_irq(&dev->vbl_lock);
> - drm_dbg_vbl(dev, "crtc %d, vblank enabled %d, inmodeset %d\n",
> - pipe, vblank->enabled, vblank->inmodeset);
> + drm_dbg_vbl(dev, "[CRTC:%d:%s] vblank %s, inmodeset: %s\n",
> + crtc->base.id, crtc->name, str_enabled_disabled(vblank->enabled),
> + str_yes_no(vblank->inmodeset));
>
> vblank->config = *config;
>
> @@ -1573,8 +1570,8 @@ void drm_crtc_vblank_restore(struct drm_crtc *crtc)
> diff = DIV_ROUND_CLOSEST_ULL(diff_ns, framedur_ns);
>
>
> - drm_dbg_vbl(dev,
> - "missed %d vblanks in %lld ns, frame duration=%d ns, hw_diff=%d\n",
> + drm_dbg_vbl(dev, "[CRTC:%d:%s] missed %d vblanks in %lld ns, frame duration=%d ns, hw_diff=%d\n",
> + crtc->base.id, crtc->name,
> diff, diff_ns, framedur_ns, cur_vblank - vblank->last);
> vblank->last = (cur_vblank - diff) & max_vblank_count;
> }
> @@ -1631,8 +1628,8 @@ static int drm_queue_vblank_event(struct drm_vblank_crtc *vblank,
>
> seq = drm_vblank_count_and_time(vblank, &now);
>
> - drm_dbg_core(dev, "event on vblank count %llu, current %llu, crtc %u\n",
> - req_seq, seq, pipe);
> + drm_dbg_core(dev, "[VBLANK:%u] event on vblank count %llu, current %llu\n",
> + pipe, req_seq, seq);
>
> trace_drm_vblank_event_queued(file_priv, pipe, req_seq);
>
> @@ -1728,8 +1725,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
> if (vblwait->request.type &
> ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
> _DRM_VBLANK_HIGH_CRTC_MASK)) {
> - drm_dbg_core(dev,
> - "Unsupported type value 0x%x, supported mask 0x%x\n",
> + drm_dbg_core(dev, "Unsupported type value 0x%x, supported mask 0x%x\n",
> vblwait->request.type,
> (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
> _DRM_VBLANK_HIGH_CRTC_MASK));
> @@ -1774,9 +1770,8 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
>
> ret = drm_vblank_get(vblank);
> if (ret) {
> - drm_dbg_core(dev,
> - "crtc %d failed to acquire vblank counter, %d\n",
> - pipe, ret);
> + drm_dbg_core(dev, "[VBLANK:%u] failed to acquire vblank counter %pe\n",
> + pipe, ERR_PTR(ret));
> return ret;
> }
> seq = drm_vblank_count(vblank);
> @@ -1812,8 +1807,8 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
> if (req_seq != seq) {
> int wait;
>
> - drm_dbg_core(dev, "waiting on vblank count %llu, crtc %u\n",
> - req_seq, pipe);
> + drm_dbg_core(dev, "[VBLANK:%d] waiting on vblank count %llu\n",
> + pipe, req_seq);
> wait = wait_event_interruptible_timeout(vblank->queue,
> drm_vblank_passed(drm_vblank_count(vblank), req_seq) ||
> !READ_ONCE(vblank->enabled),
> @@ -1837,10 +1832,10 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
> if (ret != -EINTR) {
> drm_wait_vblank_reply(vblank, &vblwait->reply);
>
> - drm_dbg_core(dev, "crtc %d returning %u to client\n",
> + drm_dbg_core(dev, "[VBLANK:%u] returning %u to client\n",
> pipe, vblwait->reply.sequence);
> } else {
> - drm_dbg_core(dev, "crtc %d vblank wait interrupted by signal\n",
> + drm_dbg_core(dev, "[VBLANK:%u] vblank wait interrupted by signal\n",
> pipe);
> }
>
> @@ -1869,8 +1864,8 @@ static void drm_handle_vblank_events(struct drm_vblank_crtc *vblank)
> if (!drm_vblank_passed(seq, e->sequence))
> continue;
>
> - drm_dbg_core(dev, "vblank event on %llu, current %llu\n",
> - e->sequence, seq);
> + drm_dbg_core(dev, "[VBLANK:%u] vblank event on %llu, current %llu\n",
> + pipe, e->sequence, seq);
>
> list_del(&e->base.link);
> drm_vblank_put(vblank);
> @@ -1987,7 +1982,6 @@ int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data,
> {
> struct drm_crtc *crtc;
> struct drm_vblank_crtc *vblank;
> - int pipe;
> struct drm_crtc_get_sequence *get_seq = data;
> ktime_t now;
> bool vblank_enabled;
> @@ -2003,8 +1997,6 @@ int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data,
> if (!crtc)
> return -ENOENT;
>
> - pipe = drm_crtc_index(crtc);
> -
> vblank = drm_crtc_vblank_crtc(crtc);
> vblank_enabled = READ_ONCE(vblank->config.disable_immediate) &&
> READ_ONCE(vblank->enabled);
> @@ -2012,9 +2004,8 @@ int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data,
> if (!vblank_enabled) {
> ret = drm_crtc_vblank_get(crtc);
> if (ret) {
> - drm_dbg_core(dev,
> - "crtc %d failed to acquire vblank counter, %d\n",
> - pipe, ret);
> + drm_dbg_core(dev, "[CRTC:%d:%s] failed to acquire vblank counter %pe\n",
> + crtc->base.id, crtc->name, ERR_PTR(ret));
> return ret;
> }
> }
> @@ -2079,9 +2070,8 @@ int drm_crtc_queue_sequence_ioctl(struct drm_device *dev, void *data,
>
> ret = drm_crtc_vblank_get(crtc);
> if (ret) {
> - drm_dbg_core(dev,
> - "crtc %d failed to acquire vblank counter, %d\n",
> - pipe, ret);
> + drm_dbg_core(dev, "[CRTC:%d:%s] failed to acquire vblank counter %pe\n",
> + crtc->base.id, crtc->name, ERR_PTR(ret));
> goto err_free;
> }
>
> @@ -2166,7 +2156,8 @@ static enum hrtimer_restart drm_vblank_timer_function(struct hrtimer *timer)
>
> ret_overrun = hrtimer_forward_now(&vtimer->timer, interval);
> if (ret_overrun != 1)
> - drm_dbg_vbl(dev, "vblank timer overrun\n");
> + drm_dbg_vbl(dev, "[CRTC:%d:%s] vblank timer overrun\n",
> + crtc->base.id, crtc->name);
>
> if (crtc_funcs->handle_vblank_timeout)
> succ = crtc_funcs->handle_vblank_timeout(crtc);
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)
prev parent reply other threads:[~2025-11-13 14:06 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-10 16:17 [PATCH 00/24] drm/vblank: refactoring and cleanups Jani Nikula
2025-11-10 16:17 ` [PATCH 01/24] drm/vblank: Unexport drm_wait_one_vblank() Jani Nikula
2025-11-11 8:14 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 02/24] drm/vblank: remove drm_wait_one_vblank() completely Jani Nikula
2025-11-11 8:17 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 03/24] drm/vblank: remove superfluous pipe check Jani Nikula
2025-11-11 8:18 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 04/24] drm/vblank: add return value to drm_crtc_wait_one_vblank() Jani Nikula
2025-11-10 16:17 ` [PATCH 05/24] drm/vblank: use the drm_vblank_crtc() and drm_crtc_vblank_crtc() helpers more Jani Nikula
2025-11-11 8:23 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 06/24] drm/vblank: prefer drm_crtc_vblank_crtc() over drm_vblank_crtc() Jani Nikula
2025-11-11 8:26 ` Thomas Zimmermann
2025-11-11 8:43 ` Jani Nikula
2025-11-11 16:00 ` Ville Syrjälä
2025-11-12 8:26 ` Jani Nikula
2025-11-12 11:56 ` Ville Syrjälä
2025-11-12 15:50 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 07/24] drm/vblank: pass vlank to drm_vblank_get()/_put()/_count() Jani Nikula
2025-11-11 8:32 ` Thomas Zimmermann
2025-11-11 8:53 ` Jani Nikula
2025-11-11 9:04 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 08/24] drm/vblank: pass vblank to drm_update_vblank_count() Jani Nikula
2025-11-12 15:54 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 09/24] drm/vblank: pass vblank to drm_handle_vblank_events() Jani Nikula
2025-11-12 15:56 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 10/24] drm/vblank: use the vblank based interfaces more Jani Nikula
2025-11-12 15:56 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 11/24] drm/vblank: pass vblank to drm_queue_vblank_event() Jani Nikula
2025-11-12 15:57 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 12/24] drm/vblank: pass vblank to drm_wait_vblank_reply() Jani Nikula
2025-11-12 16:01 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 13/24] drm/vblank: pass vblank to drm_vblank_count_and_time() Jani Nikula
2025-11-11 6:52 ` kernel test robot
2025-11-12 16:03 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 14/24] drm/vblank: pass vblank to drm_reset_vblank_timestamp() Jani Nikula
2025-11-12 16:07 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 15/24] drm/vblank: pass vblank to store_vblank() Jani Nikula
2025-11-12 16:08 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 16/24] drm/vblank: pass vblank to drm_vblank_enable() Jani Nikula
2025-11-12 16:08 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 17/24] drm/vblank: merge drm_vblank_restore() into drm_crtc_vblank_restore() Jani Nikula
2025-11-12 16:10 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 18/24] drm/vblank: add drm_crtc_from_vblank() helper Jani Nikula
2025-11-12 16:38 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 19/24] drm/vblank: pass vblank to __get_vblank_counter() and drm_max_vblank_count() Jani Nikula
2025-11-12 16:40 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 20/24] drm/vblank: pass vblank to __{enable,disable}_vblank() Jani Nikula
2025-11-12 16:41 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 21/24] drm/vblank: pass vblank to drm_get_last_vbltimestamp() Jani Nikula
2025-11-12 16:44 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 22/24] drm/vblank: pass vblank to drm_vblank_disable_and_save(), make static Jani Nikula
2025-11-12 16:46 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 23/24] drm/vblank: reduce pipe checks Jani Nikula
2025-11-10 17:45 ` Ville Syrjälä
2025-11-11 8:56 ` Jani Nikula
2025-11-12 16:54 ` Thomas Zimmermann
2025-11-10 16:17 ` [PATCH 24/24] drm/vblank: clean up debug logging Jani Nikula
2025-11-13 14:05 ` Thomas Zimmermann [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fcf78f4b-e45d-43c2-8fb6-2366e016ed28@suse.de \
--to=tzimmermann@suse.de \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jani.nikula@intel.com \
--cc=ville.syrjala@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox