From: Matthew Brost <matthew.brost@intel.com>
To: "Michał Winiarski" <michal.winiarski@intel.com>
Cc: "Alex Williamson" <alex@shazbot.org>,
"Lucas De Marchi" <lucas.demarchi@intel.com>,
"Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"Jason Gunthorpe" <jgg@ziepe.ca>,
"Yishai Hadas" <yishaih@nvidia.com>,
"Kevin Tian" <kevin.tian@intel.com>,
"Shameer Kolothum" <skolothumtho@nvidia.com>,
intel-xe@lists.freedesktop.org, linux-kernel@vger.kernel.org,
kvm@vger.kernel.org,
"Michal Wajdeczko" <michal.wajdeczko@intel.com>,
dri-devel@lists.freedesktop.org,
"Jani Nikula" <jani.nikula@linux.intel.com>,
"Joonas Lahtinen" <joonas.lahtinen@linux.intel.com>,
"Tvrtko Ursulin" <tursulin@ursulin.net>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Lukasz Laguna" <lukasz.laguna@intel.com>,
"Christoph Hellwig" <hch@infradead.org>
Subject: Re: [PATCH v3 22/28] drm/xe/pf: Handle VRAM migration data as part of PF control
Date: Mon, 3 Nov 2025 14:37:29 -0800 [thread overview]
Message-ID: <aQkuqa8u6nFVo26k@lstrano-desk.jf.intel.com> (raw)
In-Reply-To: <20251030203135.337696-23-michal.winiarski@intel.com>
On Thu, Oct 30, 2025 at 09:31:29PM +0100, Michał Winiarski wrote:
> Connect the helpers to allow save and restore of VRAM migration data in
> stop_copy / resume device state.
>
> Co-developed-by: Lukasz Laguna <lukasz.laguna@intel.com>
> Signed-off-by: Lukasz Laguna <lukasz.laguna@intel.com>
> Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
> ---
> drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c | 15 ++
> drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c | 213 ++++++++++++++++++
> drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h | 5 +
> .../drm/xe/xe_gt_sriov_pf_migration_types.h | 2 +
> drivers/gpu/drm/xe/xe_sriov_pf_control.c | 3 +
> 5 files changed, 238 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> index 7cd7cae950bc7..de0f63610e780 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
> @@ -880,6 +880,18 @@ static int pf_handle_vf_save_data(struct xe_gt *gt, unsigned int vfid)
> return -EAGAIN;
> }
>
> + if (xe_gt_sriov_pf_migration_save_test(gt, vfid, XE_SRIOV_MIGRATION_DATA_TYPE_VRAM)) {
> + ret = xe_gt_sriov_pf_migration_vram_save(gt, vfid);
> + if (ret == -EAGAIN)
> + return -EAGAIN;
> + else if (ret)
> + return ret;
> +
> + xe_gt_sriov_pf_migration_save_clear(gt, vfid, XE_SRIOV_MIGRATION_DATA_TYPE_VRAM);
> +
> + return -EAGAIN;
> + }
> +
> return 0;
> }
>
> @@ -1095,6 +1107,9 @@ static int pf_handle_vf_restore_data(struct xe_gt *gt, unsigned int vfid)
> case XE_SRIOV_MIGRATION_DATA_TYPE_GUC:
> ret = xe_gt_sriov_pf_migration_guc_restore(gt, vfid, data);
> break;
> + case XE_SRIOV_MIGRATION_DATA_TYPE_VRAM:
> + ret = xe_gt_sriov_pf_migration_vram_restore(gt, vfid, data);
> + break;
> default:
> xe_gt_sriov_notice(gt, "Skipping VF%u unknown data type: %d\n", vfid, data->type);
> break;
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c
> index 5e90aeafeeb41..7ccd43545fdac 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c
> @@ -19,6 +19,7 @@
> #include "xe_gt_sriov_printk.h"
> #include "xe_guc_buf.h"
> #include "xe_guc_ct.h"
> +#include "xe_migrate.h"
> #include "xe_mmio.h"
> #include "xe_sriov.h"
> #include "xe_sriov_migration_data.h"
> @@ -505,6 +506,207 @@ int xe_gt_sriov_pf_migration_mmio_restore(struct xe_gt *gt, unsigned int vfid,
> return pf_restore_vf_mmio_mig_data(gt, vfid, data);
> }
>
> +static ssize_t pf_migration_vram_size(struct xe_gt *gt, unsigned int vfid)
> +{
> + if (!xe_gt_is_main_type(gt))
> + return 0;
> +
> + return xe_gt_sriov_pf_config_get_lmem(gt, vfid);
> +}
> +
> +static struct dma_fence *__pf_save_restore_vram(struct xe_gt *gt, unsigned int vfid,
> + struct xe_bo *vram, u64 vram_offset,
> + struct xe_bo *sysmem, u64 sysmem_offset,
> + size_t size, bool save)
> +{
> + struct dma_fence *ret = NULL;
> + struct drm_exec exec;
> + int err;
> +
> + drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT, 0);
It is a bit incongruent that the dma-resv lock is interruptible here.
> + drm_exec_until_all_locked(&exec) {
> + err = drm_exec_lock_obj(&exec, &vram->ttm.base);
> + drm_exec_retry_on_contention(&exec);
> + if (err) {
> + ret = ERR_PTR(err);
> + goto err;
> + }
> +
> + err = drm_exec_lock_obj(&exec, &sysmem->ttm.base);
> + drm_exec_retry_on_contention(&exec);
> + if (err) {
> + ret = ERR_PTR(err);
> + goto err;
> + }
> + }
> +
> + ret = xe_migrate_vram_copy_chunk(vram, vram_offset, sysmem, sysmem_offset, size,
> + save ? XE_MIGRATE_COPY_TO_SRAM : XE_MIGRATE_COPY_TO_VRAM);
> +
> +err:
> + drm_exec_fini(&exec);
> +
> + return ret;
> +}
> +
> +#define PF_VRAM_SAVE_RESTORE_TIMEOUT (5 * HZ)
> +static int pf_save_vram_chunk(struct xe_gt *gt, unsigned int vfid,
> + struct xe_bo *src_vram, u64 src_vram_offset,
> + size_t size)
> +{
> + struct xe_sriov_migration_data *data;
> + struct dma_fence *fence;
> + int ret;
> +
> + data = xe_sriov_migration_data_alloc(gt_to_xe(gt));
> + if (!data)
> + return -ENOMEM;
> +
> + ret = xe_sriov_migration_data_init(data, gt->tile->id, gt->info.id,
> + XE_SRIOV_MIGRATION_DATA_TYPE_VRAM,
> + src_vram_offset, size);
> + if (ret)
> + goto fail;
> +
> + fence = __pf_save_restore_vram(gt, vfid,
> + src_vram, src_vram_offset,
> + data->bo, 0, size, true);
> +
> + ret = dma_fence_wait_timeout(fence, false, PF_VRAM_SAVE_RESTORE_TIMEOUT);
Then here the dma-fence wait is non-interruptible.
> + dma_fence_put(fence);
> + if (!ret) {
> + ret = -ETIME;
> + goto fail;
> + }
> +
> + xe_gt_sriov_dbg_verbose(gt, "VF%u VRAM data save (%zu bytes)\n", vfid, size);
> + pf_dump_mig_data(gt, vfid, data);
> +
> + ret = xe_gt_sriov_pf_migration_save_produce(gt, vfid, data);
> + if (ret)
> + goto fail;
> +
> + return 0;
> +
> +fail:
> + xe_sriov_migration_data_free(data);
> + return ret;
> +}
> +
> +#define VF_VRAM_STATE_CHUNK_MAX_SIZE SZ_512M
> +static int pf_save_vf_vram_mig_data(struct xe_gt *gt, unsigned int vfid)
> +{
> + struct xe_gt_sriov_migration_data *migration = pf_pick_gt_migration(gt, vfid);
> + loff_t *offset = &migration->save.vram_offset;
> + struct xe_bo *vram;
> + size_t vram_size, chunk_size;
> + int ret;
> +
> + vram = xe_gt_sriov_pf_config_get_lmem_obj(gt, vfid);
> + if (!vram)
> + return -ENXIO;
> +
> + vram_size = xe_bo_size(vram);
> +
> + xe_gt_assert(gt, *offset < vram_size);
> +
> + chunk_size = min(vram_size - *offset, VF_VRAM_STATE_CHUNK_MAX_SIZE);
> +
> + ret = pf_save_vram_chunk(gt, vfid, vram, *offset, chunk_size);
> + if (ret)
> + goto fail;
> +
> + *offset += chunk_size;
> +
> + xe_bo_put(vram);
> +
> + if (*offset < vram_size)
> + return -EAGAIN;
> +
> + return 0;
> +
> +fail:
> + xe_bo_put(vram);
> + xe_gt_sriov_err(gt, "Failed to save VF%u VRAM data (%pe)\n", vfid, ERR_PTR(ret));
> + return ret;
> +}
> +
> +static int pf_restore_vf_vram_mig_data(struct xe_gt *gt, unsigned int vfid,
> + struct xe_sriov_migration_data *data)
> +{
> + u64 end = data->hdr.offset + data->hdr.size;
> + struct dma_fence *fence;
> + struct xe_bo *vram;
> + size_t size;
> + int ret = 0;
> +
> + vram = xe_gt_sriov_pf_config_get_lmem_obj(gt, vfid);
> + if (!vram)
> + return -ENXIO;
> +
> + size = xe_bo_size(vram);
> +
> + if (end > size || end < data->hdr.size) {
> + ret = -EINVAL;
> + goto err;
> + }
> +
> + xe_gt_sriov_dbg_verbose(gt, "VF%u VRAM data restore (%llu bytes)\n", vfid, data->size);
> + pf_dump_mig_data(gt, vfid, data);
> +
> + fence = __pf_save_restore_vram(gt, vfid, vram, data->hdr.offset,
> + data->bo, 0, data->hdr.size, false);
> + ret = dma_fence_wait_timeout(fence, false, PF_VRAM_SAVE_RESTORE_TIMEOUT);
And also here the dma-fence wait is non-interruptible.
Aside from the incongruence, the usage of drm-exec, dma-fences looks correct.
Matt
> + dma_fence_put(fence);
> + if (!ret) {
> + ret = -ETIME;
> + goto err;
> + }
> +
> + return 0;
> +err:
> + xe_bo_put(vram);
> + xe_gt_sriov_err(gt, "Failed to restore VF%u VRAM data (%pe)\n", vfid, ERR_PTR(ret));
> + return ret;
> +}
> +
> +/**
> + * xe_gt_sriov_pf_migration_vram_save() - Save VF VRAM migration data.
> + * @gt: the &xe_gt
> + * @vfid: the VF identifier (can't be 0)
> + *
> + * This function is for PF only.
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int xe_gt_sriov_pf_migration_vram_save(struct xe_gt *gt, unsigned int vfid)
> +{
> + xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
> + xe_gt_assert(gt, vfid != PFID);
> + xe_gt_assert(gt, vfid <= xe_sriov_pf_get_totalvfs(gt_to_xe(gt)));
> +
> + return pf_save_vf_vram_mig_data(gt, vfid);
> +}
> +
> +/**
> + * xe_gt_sriov_pf_migration_vram_restore() - Restore VF VRAM migration data.
> + * @gt: the &xe_gt
> + * @vfid: the VF identifier (can't be 0)
> + *
> + * This function is for PF only.
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int xe_gt_sriov_pf_migration_vram_restore(struct xe_gt *gt, unsigned int vfid,
> + struct xe_sriov_migration_data *data)
> +{
> + xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
> + xe_gt_assert(gt, vfid != PFID);
> + xe_gt_assert(gt, vfid <= xe_sriov_pf_get_totalvfs(gt_to_xe(gt)));
> +
> + return pf_restore_vf_vram_mig_data(gt, vfid, data);
> +}
> +
> /**
> * xe_gt_sriov_pf_migration_size() - Total size of migration data from all components within a GT.
> * @gt: the &xe_gt
> @@ -544,6 +746,13 @@ ssize_t xe_gt_sriov_pf_migration_size(struct xe_gt *gt, unsigned int vfid)
> size += sizeof(struct xe_sriov_pf_migration_hdr);
> total += size;
>
> + size = pf_migration_vram_size(gt, vfid);
> + if (size < 0)
> + return size;
> + if (size > 0)
> + size += sizeof(struct xe_sriov_pf_migration_hdr);
> + total += size;
> +
> return total;
> }
>
> @@ -602,6 +811,7 @@ void xe_gt_sriov_pf_migration_save_init(struct xe_gt *gt, unsigned int vfid)
> struct xe_gt_sriov_migration_data *migration = pf_pick_gt_migration(gt, vfid);
>
> migration->save.data_remaining = 0;
> + migration->save.vram_offset = 0;
>
> xe_gt_assert(gt, pf_migration_guc_size(gt, vfid) > 0);
> set_bit(XE_SRIOV_MIGRATION_DATA_TYPE_GUC, &migration->save.data_remaining);
> @@ -611,6 +821,9 @@ void xe_gt_sriov_pf_migration_save_init(struct xe_gt *gt, unsigned int vfid)
>
> xe_gt_assert(gt, pf_migration_mmio_size(gt, vfid) > 0);
> set_bit(XE_SRIOV_MIGRATION_DATA_TYPE_MMIO, &migration->save.data_remaining);
> +
> + if (pf_migration_vram_size(gt, vfid) > 0)
> + set_bit(XE_SRIOV_MIGRATION_DATA_TYPE_VRAM, &migration->save.data_remaining);
> }
>
> /**
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h
> index b0eec94fea3a6..85b43b2cceb73 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h
> @@ -25,6 +25,11 @@ int xe_gt_sriov_pf_migration_ggtt_restore(struct xe_gt *gt, unsigned int vfid,
> int xe_gt_sriov_pf_migration_mmio_save(struct xe_gt *gt, unsigned int vfid);
> int xe_gt_sriov_pf_migration_mmio_restore(struct xe_gt *gt, unsigned int vfid,
> struct xe_sriov_migration_data *data);
> +int xe_gt_sriov_pf_migration_vram_save(struct xe_gt *gt, unsigned int vfid);
> +int xe_gt_sriov_pf_migration_vram_restore(struct xe_gt *gt, unsigned int vfid,
> + struct xe_sriov_migration_data *data);
> +
> +void xe_gt_sriov_pf_migration_save_init(struct xe_gt *gt, unsigned int vfid);
>
> ssize_t xe_gt_sriov_pf_migration_size(struct xe_gt *gt, unsigned int vfid);
>
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration_types.h
> index 9f24878690d9c..f50c64241e9c0 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration_types.h
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_migration_types.h
> @@ -20,6 +20,8 @@ struct xe_gt_sriov_migration_data {
> struct {
> /** @save.data_remaining: bitmap of migration types that need to be saved */
> unsigned long data_remaining;
> + /** @save.vram_offset: last saved offset within VRAM, used for chunked VRAM save */
> + loff_t vram_offset;
> } save;
> };
>
> diff --git a/drivers/gpu/drm/xe/xe_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_sriov_pf_control.c
> index c2768848daba1..aac8ecb861545 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_pf_control.c
> +++ b/drivers/gpu/drm/xe/xe_sriov_pf_control.c
> @@ -5,6 +5,7 @@
>
> #include "xe_device.h"
> #include "xe_gt_sriov_pf_control.h"
> +#include "xe_gt_sriov_pf_migration.h"
> #include "xe_sriov_migration_data.h"
> #include "xe_sriov_pf_control.h"
> #include "xe_sriov_printk.h"
> @@ -171,6 +172,8 @@ int xe_sriov_pf_control_trigger_save_vf(struct xe_device *xe, unsigned int vfid)
> return ret;
>
> for_each_gt(gt, xe, id) {
> + xe_gt_sriov_pf_migration_save_init(gt, vfid);
> +
> ret = xe_gt_sriov_pf_control_trigger_save_vf(gt, vfid);
> if (ret)
> return ret;
> --
> 2.50.1
>
next prev parent reply other threads:[~2025-11-03 22:37 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-30 20:31 [PATCH v3 00/28] vfio/xe: Add driver variant for Xe VF migration Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 01/28] drm/xe/pf: Remove GuC version check for migration support Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 02/28] drm/xe: Move migration support to device-level struct Michał Winiarski
2025-11-03 18:55 ` Michal Wajdeczko
2025-10-30 20:31 ` [PATCH v3 03/28] drm/xe/pf: Convert control state to bitmap Michał Winiarski
2025-10-30 22:57 ` Michal Wajdeczko
2025-10-31 7:50 ` Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 04/28] drm/xe/pf: Add save/restore control state stubs and connect to debugfs Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 05/28] drm/xe/pf: Add data structures and handlers for migration rings Michał Winiarski
2025-10-31 16:17 ` Michal Wajdeczko
2025-11-04 10:25 ` Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 06/28] drm/xe/pf: Add helpers for migration data allocation / free Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 07/28] drm/xe/pf: Add support for encap/decap of bitstream to/from packet Michał Winiarski
2025-10-31 16:31 ` Michal Wajdeczko
2025-11-04 11:16 ` Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 08/28] drm/xe/pf: Add minimalistic migration descriptor Michał Winiarski
2025-10-31 16:41 ` Michal Wajdeczko
2025-10-30 20:31 ` [PATCH v3 09/28] drm/xe/pf: Expose VF migration data size over debugfs Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 10/28] drm/xe: Add sa/guc_buf_cache sync interface Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 11/28] drm/xe: Allow the caller to pass guc_buf_cache size Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 12/28] drm/xe/pf: Increase PF GuC Buffer Cache size and use it for VF migration Michał Winiarski
2025-10-31 16:48 ` Michal Wajdeczko
2025-10-30 20:31 ` [PATCH v3 13/28] drm/xe/pf: Remove GuC migration data save/restore from GT debugfs Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 14/28] drm/xe/pf: Don't save GuC VF migration data on pause Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 15/28] drm/xe/pf: Switch VF migration GuC save/restore to struct migration data Michał Winiarski
2025-11-03 18:30 ` Michal Wajdeczko
2025-10-30 20:31 ` [PATCH v3 16/28] drm/xe/pf: Handle GuC migration data as part of PF control Michał Winiarski
2025-10-31 18:15 ` Michal Wajdeczko
2025-11-04 11:55 ` Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 17/28] drm/xe/pf: Add helpers for VF GGTT migration data handling Michał Winiarski
2025-10-31 16:59 ` Michal Wajdeczko
2025-10-30 20:31 ` [PATCH v3 18/28] drm/xe/pf: Handle GGTT migration data as part of PF control Michał Winiarski
2025-10-31 18:26 ` Michal Wajdeczko
2025-11-04 12:12 ` Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 19/28] drm/xe/pf: Handle MMIO " Michał Winiarski
2025-10-31 18:39 ` Michal Wajdeczko
2025-11-04 12:29 ` Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 20/28] drm/xe/pf: Add helper to retrieve VF's LMEM object Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 21/28] drm/xe/migrate: Add function to copy of VRAM data in chunks Michał Winiarski
2025-11-03 22:29 ` Matthew Brost
2025-10-30 20:31 ` [PATCH v3 22/28] drm/xe/pf: Handle VRAM migration data as part of PF control Michał Winiarski
2025-11-03 22:37 ` Matthew Brost [this message]
2025-11-04 12:39 ` Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 23/28] drm/xe/pf: Add wait helper for VF FLR Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 24/28] drm/xe/pf: Enable SR-IOV VF migration Michał Winiarski
2025-10-31 17:06 ` Michal Wajdeczko
2025-10-30 20:31 ` [PATCH v3 25/28] drm/xe/pci: Introduce a helper to allow VF access to PF xe_device Michał Winiarski
2025-10-31 17:39 ` Michal Wajdeczko
2025-10-30 20:31 ` [PATCH v3 26/28] drm/xe/pf: Export helpers for VFIO Michał Winiarski
2025-10-30 20:31 ` [PATCH v3 27/28] drm/intel/pciids: Add match with VFIO override Michał Winiarski
2025-11-03 21:30 ` Lucas De Marchi
2025-11-04 12:59 ` Michał Winiarski
2025-11-04 17:41 ` Lucas De Marchi
2025-11-04 19:27 ` Jason Gunthorpe
2025-11-05 15:20 ` Michał Winiarski
2025-11-05 17:15 ` Jason Gunthorpe
2025-11-05 17:42 ` Lucas De Marchi
2025-10-30 20:31 ` [PATCH v3 28/28] vfio/xe: Add device specific vfio_pci driver variant for Intel graphics Michał Winiarski
2025-11-07 9:38 ` Muqthyar Ahmed, Syed Abdul
2025-11-07 9:54 ` Winiarski, Michal
2025-10-30 22:34 ` ✗ CI.checkpatch: warning for vfio/xe: Add driver variant for Xe VF migration (rev3) Patchwork
2025-10-30 22:35 ` ✓ CI.KUnit: success " Patchwork
2025-10-30 23:57 ` ✓ Xe.CI.BAT: " Patchwork
2025-10-31 7:50 ` ✗ Xe.CI.Full: failure " Patchwork
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=aQkuqa8u6nFVo26k@lstrano-desk.jf.intel.com \
--to=matthew.brost@intel.com \
--cc=airlied@gmail.com \
--cc=alex@shazbot.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=hch@infradead.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jani.nikula@linux.intel.com \
--cc=jgg@ziepe.ca \
--cc=joonas.lahtinen@linux.intel.com \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lucas.demarchi@intel.com \
--cc=lukasz.laguna@intel.com \
--cc=michal.wajdeczko@intel.com \
--cc=michal.winiarski@intel.com \
--cc=rodrigo.vivi@intel.com \
--cc=simona@ffwll.ch \
--cc=skolothumtho@nvidia.com \
--cc=thomas.hellstrom@linux.intel.com \
--cc=tursulin@ursulin.net \
--cc=yishaih@nvidia.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 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.